From b8a2e4b0b4c87a09c341c6c35d4bcbc68ef40c63 Mon Sep 17 00:00:00 2001 From: sto Date: Tue, 28 Jul 2026 13:45:27 +0200 Subject: [PATCH] Events: add edit/update actions --- app/controllers/events_controller.rb | 25 ++++++++++++++++++++++--- app/policies/event_policy.rb | 8 ++++++++ app/views/events/edit.html.slim | 1 + app/views/events/show.html.slim | 10 ++++++---- config/locales/en.yml | 8 ++++++-- config/locales/fr.yml | 8 ++++++-- 6 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 app/views/events/edit.html.slim diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index a63b7ab..613e6fe 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,5 +1,5 @@ class EventsController < ApplicationController - before_action :set_event, only: %i[ destroy show ] + before_action :set_event, only: %i[ destroy show edit update ] def index authorize :event @@ -20,7 +20,7 @@ class EventsController < ApplicationController def create authorize :event - @event = Event.new(new_event_params) + @event = Event.new(event_params) @event.lang = @current_user.lang @event.user_id = current_user.id if @event.save @@ -39,6 +39,25 @@ class EventsController < ApplicationController @title = @event.name end + def edit + authorize @event + + @title = I18n.t("events.edit.title") + @nonav = true + end + + def update + authorize @event + + if @event.update(event_params) + redirect_to event_path(@event), notice: t("events.edit.notice") + else + @title = I18n.t("events.edit.title") + @nonav = true + render :edit, status: :unprocessable_entity + end + end + def destroy authorize @event @@ -50,7 +69,7 @@ class EventsController < ApplicationController @event = Event.find(params[:id]) end - def new_event_params + def event_params params.expect(event: [ :name, :shared_scoreboard ]) end end diff --git a/app/policies/event_policy.rb b/app/policies/event_policy.rb index 9405b03..02e6553 100644 --- a/app/policies/event_policy.rb +++ b/app/policies/event_policy.rb @@ -22,4 +22,12 @@ class EventPolicy < ApplicationPolicy def show? owner_or_admin end + + def edit? + owner_or_admin + end + + def update? + owner_or_admin + end end diff --git a/app/views/events/edit.html.slim b/app/views/events/edit.html.slim new file mode 100644 index 0000000..76f3f80 --- /dev/null +++ b/app/views/events/edit.html.slim @@ -0,0 +1 @@ += render "form", event: @event, submit_text: t("helpers.buttons.save"), method: :patch, url: event_path(@event) \ No newline at end of file diff --git a/app/views/events/show.html.slim b/app/views/events/show.html.slim index ff27fa5..16d1c47 100644 --- a/app/views/events/show.html.slim +++ b/app/views/events/show.html.slim @@ -1,10 +1,12 @@ .row .col - h4.mb-3 - = t("events.index.manage_contests") + h4.mb-3 style="margin-top: -1rem;" + = t("events.show.manage_contests") + a.ms-3.mt-3.btn.btn-primary.mb-4 href=edit_event_path(@event) + = t("events.show.modify") .float-end - a.btn.btn-primary.mb-4 href=new_contest_path(event: @event.id) - = t("events.index.new_contest") + a.mt-3.btn.btn-primary.mb-4 href=new_contest_path(event: @event.id) + = t("events.show.new_contest") .row.row-cols-1.row-cols-md-3.g-4 - @contests.each do |contest| diff --git a/config/locales/en.yml b/config/locales/en.yml index 176497e..71865d2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -289,16 +289,16 @@ en: events: destroy: notice: Event deleted + edit: + notice: Event updated form: shared_scoreboard_message: As safety measure, for each tab, no information will be shown until the first finish, or if the stopwatch for that contest is started. index: contest: contest contests: contests - manage_contests: Contests in this event message: New feature! Events offer to groupe multiple contests in one management space. This also offers, if activated, to have a single scoreboard link for all contests of an event. my_contests_outside_events: My contests not linked to any event new: Create a new event - new_contest: Add a contest to this event other_contest: contest other_contests: contests subtitle: My events @@ -306,6 +306,10 @@ en: new: notice: Event added title: New event + show: + manage_contests: Contests in this event + modify: Settings + new_contest: Add a contest to this event helpers: badges: registration: "registration" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index df39aa4..7621b8b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -260,16 +260,16 @@ fr: events: destroy: notice: Événement supprimé + edit: + notice: Événement modifié form: shared_scoreboard_message: Par mesure de sécurité, chaque onglet restera vide jusqu'à ce que soit il y a des premières complétions, soit le chronomètre de l'épreuve a été démarré. index: contest: épreuve contests: épreuves - manage_contests: Épreuves de cet événement message: Nouvelle fonctionalité ! Les événements permettent de regrouper plusieurs concours/épreuves en un seul espace de gestion. Cela permet aussi, si souhaité, d'avoir un lien de classement commun à toutes les épreuces d'un même événement. my_contests_outside_events: Mes concours non associés à un événement new: Créer un nouvel événement - new_contest: Ajouter une épreuve à cet événement other_contest: concours other_contests: concours subtitle: Mes événements @@ -277,6 +277,10 @@ fr: new: notice: Événement ajouté title: Nouvel événement + show: + manage_contests: Épreuves de cet événement + modify: Paramètres + new_contest: Ajouter une épreuve à cet événement helpers: badges: registration: "auto-inscription"