From b13ef308076a3fde61f2d9a82c25d48305af413d Mon Sep 17 00:00:00 2001 From: sto Date: Wed, 16 Jul 2025 10:22:47 +0200 Subject: [PATCH] Permit to modify contestants categories --- app/controllers/contestants_controller.rb | 13 +++++++++++++ app/views/contestants/_form.html.slim | 8 ++++++++ app/views/contests/show.html.slim | 10 +++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/controllers/contestants_controller.rb b/app/controllers/contestants_controller.rb index 82d2304..42971fa 100644 --- a/app/controllers/contestants_controller.rb +++ b/app/controllers/contestants_controller.rb @@ -24,6 +24,7 @@ class ContestantsController < ApplicationController @contestant = Contestant.new(contestant_params) @contestant.contest_id = @contest.id if @contestant.save + update_contestant_categories redirect_to contest_path(@contest), notice: t("contestants.new.notice") else @action_name = t("helpers.buttons.back") @@ -36,6 +37,7 @@ class ContestantsController < ApplicationController authorize @contest if @contestant.update(contestant_params) + update_contestant_categories redirect_to @contest, notice: t("contestants.edit.notice") else @action_name = t("helpers.buttons.back") @@ -126,4 +128,15 @@ class ContestantsController < ApplicationController def contestant_params params.expect(contestant: [ :email, :name ]) end + + def update_contestant_categories + @contestant.categories.clear + @contest.categories.each do |category| + logger.info(params[:contestant]["category_#{category.id}".to_sym] == "1") + if params[:contestant].key?("category_#{category.id}".to_sym) && params[:contestant]["category_#{category.id}".to_sym] == "1" + @contestant.categories << category + end + end + @contestant.save + end end diff --git a/app/views/contestants/_form.html.slim b/app/views/contestants/_form.html.slim index 0ab529b..19609a2 100644 --- a/app/views/contestants/_form.html.slim +++ b/app/views/contestants/_form.html.slim @@ -15,6 +15,14 @@ = form.label :email .form-text = t("activerecord.attributes.contestant.email_description") + - if @contest.categories + .row.mt-4 + .col + - @contest.categories.each do |category| + .form-check.form-switch + = form.check_box "category_#{category.id}".to_sym, class: "form-check-input", checked: @contestant.categories.where(id: category.id).any? + = form.label category.name + .row.mt-4 .col - if method == :patch diff --git a/app/views/contests/show.html.slim b/app/views/contests/show.html.slim index 5003dd9..98bec3f 100644 --- a/app/views/contests/show.html.slim +++ b/app/views/contests/show.html.slim @@ -54,13 +54,13 @@ javascript: option value=category.id = category.name javascript: - const select = document.getElementById('categories'); - const urlParams = new URLSearchParams(window.location.search); - const selectedCategory = urlParams.get('category'); - Array.from(select.children).forEach((option) => { + categorySelectEl = document.getElementById('categories'); + urlParams = new URLSearchParams(window.location.search); + selectedCategory = urlParams.get('category'); + Array.from(categorySelectEl.children).forEach((option) => { if (option.value == selectedCategory) option.selected = true; }); - select.addEventListener('change', (e) => { + categorySelectEl.addEventListener('change', (e) => { window.location.href = `#{contest_path(@contest)}?category=${e.target.value}` }) .d-flex.flex-column style="overflow-y: auto"