diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 705df6ba60..15154764fd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,7 @@ class ApplicationController < ActionController::Base include CurrentTheme include Pagy::Backend + extend RequiresFeature before_action :configure_permitted_parameters, if: :devise_controller? before_action :set_sentry_user, if: :current_user diff --git a/app/controllers/concerns/requires_feature.rb b/app/controllers/concerns/requires_feature.rb new file mode 100644 index 0000000000..e4659c29e1 --- /dev/null +++ b/app/controllers/concerns/requires_feature.rb @@ -0,0 +1,12 @@ +module RequiresFeature + def requires_feature(name, **) + before_action( + lambda do + return if Flipper.enabled?(name, current_user) + + redirect_to dashboard_path, notice: 'Feature not enabled' + end, + ** + ) + end +end diff --git a/app/controllers/interview_surveys_controller.rb b/app/controllers/interview_surveys_controller.rb index 67f332524d..7c33c8d0ac 100644 --- a/app/controllers/interview_surveys_controller.rb +++ b/app/controllers/interview_surveys_controller.rb @@ -1,12 +1,27 @@ class InterviewSurveysController < ApplicationController + before_action :authenticate_user! + requires_feature :survey_feature + def new - unless Feature.enabled?(:survey_feature, current_user) - redirect_to dashboard_path, notice: 'Feature not enabled' - end + @interview_survey = InterviewSurvey.new end def create - # puts params[:survey] - redirect_to dashboard_path, notice: 'Survey Submitted' + @interview_survey = current_user.interview_surveys.build(interview_survey_params) + + if @interview_survey.save + redirect_to dashboard_path, notice: 'Survey Submitted' + else + render :new, status: :unprocessable_entity + end + end + + private + + def interview_survey_params + params.require(:interview_survey).permit( + :interview_date, + interview_concept_names: [] + ) end end diff --git a/app/javascript/controllers/multi_select_controller.js b/app/javascript/controllers/multi_select_controller.js new file mode 100644 index 0000000000..5307a10960 --- /dev/null +++ b/app/javascript/controllers/multi_select_controller.js @@ -0,0 +1,18 @@ +import { Controller } from '@hotwired/stimulus' +import SlimSelect from 'slim-select' +import 'slim-select/styles' + +export default class MultiSelectController extends Controller { + connect () { + this.slimSelect = new SlimSelect({ + select: this.element, + events: { + addable: function (value) { return value } + } + }) + } + + disconnect () { + this.slimSelect.destroy() + } +} diff --git a/app/models/interview_concept.rb b/app/models/interview_concept.rb index d5ce87b348..54c28bfde8 100644 --- a/app/models/interview_concept.rb +++ b/app/models/interview_concept.rb @@ -1,5 +1,6 @@ class InterviewConcept < ApplicationRecord - has_many :interview_survey_concepts, dependent: :destroy + has_many :interview_survey_concepts, dependent: :destroy, inverse_of: :interview_concept + has_many :interview_surveys, through: :interview_survey_concepts, inverse_of: :interview_concepts validates :name, presence: true validates :name, length: { minimum: 2, maximum: 25 } diff --git a/app/models/interview_survey.rb b/app/models/interview_survey.rb index ce0a258272..d06044219d 100644 --- a/app/models/interview_survey.rb +++ b/app/models/interview_survey.rb @@ -1,10 +1,25 @@ class InterviewSurvey < ApplicationRecord belongs_to :user - has_many :interview_survey_concepts, dependent: :destroy + has_many :interview_survey_concepts, dependent: :destroy, inverse_of: :interview_survey + has_many :interview_concepts, + through: :interview_survey_concepts, + inverse_of: :interview_surveys validates :interview_date, presence: true validate :interview_date_must_be_in_the_past + def interview_concept_names + interview_concepts.pluck(:name) + end + + def interview_concept_names=(names) + self.interview_concepts = names.compact_blank.map do |name| + InterviewConcept.find_or_create_by(name:) + end + end + + private + def interview_date_must_be_in_the_past return if interview_date.present? && interview_date <= Time.zone.today diff --git a/app/models/user.rb b/app/models/user.rb index c9c7fdff8d..0dcbcf85d7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,6 +19,7 @@ class User < ApplicationRecord has_many :notifications, as: :recipient, dependent: :destroy has_many :announcements, dependent: nil has_many :likes, dependent: :destroy + has_many :interview_surveys, dependent: :destroy belongs_to :path, optional: true, counter_cache: true diff --git a/app/views/interview_surveys/new.html.erb b/app/views/interview_surveys/new.html.erb index ea1894ae8a..3e65144f67 100644 --- a/app/views/interview_surveys/new.html.erb +++ b/app/views/interview_surveys/new.html.erb @@ -4,8 +4,18 @@