Merge settings & core indexes into a single nav

This commit is contained in:
sto
2025-11-13 18:21:31 +01:00
parent 97ea17b7c2
commit cdf87e48f2
18 changed files with 32 additions and 116 deletions

View File

@@ -2,7 +2,7 @@ class ApplicationController < ActionController::Base
include Authentication include Authentication
include Pundit::Authorization include Pundit::Authorization
before_action :set_title, :set_current_user, :set_lang before_action :set_current_user, :set_lang
after_action :verify_authorized after_action :verify_authorized
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
@@ -12,13 +12,6 @@ class ApplicationController < ActionController::Base
private private
def set_title
t_action_name = action_name
t_action_name = "new" if action_name == "create"
t_action_name = "edit" if action_name == "update"
@title = I18n.t("#{controller_name}.#{t_action_name}.title")
end
def set_current_user def set_current_user
@current_user = current_user @current_user = current_user
end end

View File

@@ -8,21 +8,11 @@ class CompletionsController < ApplicationController
def edit def edit
authorize @contest authorize @contest
if @contestant
@action_name = t("helpers.buttons.back_to_contestant")
@action_path = edit_contest_contestant_path(@contest, @contestant)
end
end end
def new def new
authorize @contest authorize @contest
if @contestant
@action_name = t("helpers.buttons.back_to_contestant")
@action_path = edit_contest_contestant_path(@contest, @contestant)
end
@completion = Completion.new @completion = Completion.new
@completion.completed = true @completion.completed = true
if params[:contestant_id] if params[:contestant_id]
@@ -47,11 +37,6 @@ class CompletionsController < ApplicationController
else else
if params[:completion].key?(:message_id) if params[:completion].key?(:message_id)
@message = Message.find(params[:completion][:message_id]) @message = Message.find(params[:completion][:message_id])
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
elsif @contestant
@action_name = t("helpers.buttons.back_to_contestant")
@action_path = edit_contest_contestant_path(@contest, @contestant)
end end
render :new, status: :unprocessable_entity render :new, status: :unprocessable_entity
end end

View File

@@ -6,7 +6,6 @@ class ContestantsController < ApplicationController
def index def index
authorize @contest authorize @contest
@title = @contest.name
@contestants = @contest.contestants.sort_by { |contestant| [ @contestants = @contest.contestants.sort_by { |contestant| [
-contestant.completions.where(remaining_pieces: nil).size, -contestant.completions.where(remaining_pieces: nil).size,
(contestant.completions.where(remaining_pieces: nil).size == @contest.puzzles.length ? 1 : 0) * contestant.time_seconds, (contestant.completions.where(remaining_pieces: nil).size == @contest.puzzles.length ? 1 : 0) * contestant.time_seconds,
@@ -18,17 +17,11 @@ class ContestantsController < ApplicationController
def edit def edit
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = @contestant.name
end end
def new def new
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@contestant = Contestant.new @contestant = Contestant.new
end end
@@ -41,8 +34,6 @@ class ContestantsController < ApplicationController
update_contestant_categories update_contestant_categories
redirect_to contest_path(@contest), notice: t("contestants.new.notice") redirect_to contest_path(@contest), notice: t("contestants.new.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :new, status: :unprocessable_entity render :new, status: :unprocessable_entity
end end
end end
@@ -54,8 +45,6 @@ class ContestantsController < ApplicationController
update_contestant_categories update_contestant_categories
redirect_to @contest, notice: t("contestants.edit.notice") redirect_to @contest, notice: t("contestants.edit.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :edit, status: :unprocessable_entity render :edit, status: :unprocessable_entity
end end
end end
@@ -83,8 +72,6 @@ class ContestantsController < ApplicationController
if @csv_import.save if @csv_import.save
redirect_to "/contests/#{@contest.id}/import/#{@csv_import.id}" redirect_to "/contests/#{@contest.id}/import/#{@csv_import.id}"
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :import, status: :unprocessable_entity render :import, status: :unprocessable_entity
end end
end end
@@ -92,8 +79,6 @@ class ContestantsController < ApplicationController
def convert_csv def convert_csv
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@csv_import = CsvImport.find(params[:id]) @csv_import = CsvImport.find(params[:id])
@content = JSON.parse(@csv_import.content) @content = JSON.parse(@csv_import.content)
@form = Forms::CsvConversionForm.new @form = Forms::CsvConversionForm.new
@@ -119,8 +104,6 @@ class ContestantsController < ApplicationController
end end
redirect_to contest_path(@contest), notice: t("contestants.import.notice") redirect_to contest_path(@contest), notice: t("contestants.import.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :convert_csv, status: :unprocessable_entity render :convert_csv, status: :unprocessable_entity
end end
end end

View File

@@ -1,7 +1,7 @@
class ContestsController < ApplicationController class ContestsController < ApplicationController
include CompletionsConcern include CompletionsConcern
before_action :set_contest, only: %i[ destroy edit show update ] before_action :set_contest, only: %i[ destroy show update ]
before_action :set_settings_contest, only: %i[ settings_general_edit settings_general_update settings_offline_edit settings_offline_update settings_categories_edit ] before_action :set_settings_contest, only: %i[ settings_general_edit settings_general_update settings_offline_edit settings_offline_update settings_categories_edit ]
before_action :offline_setup, only: %i[ offline_new offline_create offline_edit offline_update offline_completed ] before_action :offline_setup, only: %i[ offline_new offline_create offline_edit offline_update offline_completed ]
skip_before_action :require_authentication, only: %i[ scoreboard offline_new offline_create offline_edit offline_update offline_completed ] skip_before_action :require_authentication, only: %i[ scoreboard offline_new offline_create offline_edit offline_update offline_completed ]
@@ -19,35 +19,16 @@ class ContestsController < ApplicationController
redirect_to contest_contestants_path(@contest) redirect_to contest_contestants_path(@contest)
end end
def edit
authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
end
def settings_general_edit def settings_general_edit
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = t("contests.edit.title")
end end
def settings_offline_edit def settings_offline_edit
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = t("contests.edit.title")
end end
def settings_categories_edit def settings_categories_edit
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = t("contests.edit.title")
end end
def settings_general_update def settings_general_update
@@ -56,9 +37,6 @@ class ContestsController < ApplicationController
if @contest.update(settings_general_params) if @contest.update(settings_general_params)
redirect_to "/contests/#{@contest.id}/settings/general", notice: t("contests.edit.notice") redirect_to "/contests/#{@contest.id}/settings/general", notice: t("contests.edit.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = t("contests.edit.title")
render :settings_general_edit, status: :unprocessable_entity render :settings_general_edit, status: :unprocessable_entity
end end
end end
@@ -69,9 +47,6 @@ class ContestsController < ApplicationController
if @contest.update(settings_offline_params) if @contest.update(settings_offline_params)
redirect_to "/contests/#{@contest.id}/settings/offline", notice: t("contests.edit.notice") redirect_to "/contests/#{@contest.id}/settings/offline", notice: t("contests.edit.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@title = t("contests.edit.title")
render :settings_offline_edit, status: :unprocessable_entity render :settings_offline_edit, status: :unprocessable_entity
end end
end end
@@ -100,8 +75,6 @@ class ContestsController < ApplicationController
if @contest.update(contest_params) if @contest.update(contest_params)
redirect_to @contest, notice: t("contests.edit.notice") redirect_to @contest, notice: t("contests.edit.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :edit, status: :unprocessable_entity render :edit, status: :unprocessable_entity
end end
end end
@@ -135,9 +108,12 @@ class ContestsController < ApplicationController
@contestants = @contestants.select { |contestant| !contestant.offline.present? } @contestants = @contestants.select { |contestant| !contestant.offline.present? }
end end
@puzzles = @contest.puzzles.order(:id) @puzzles = @contest.puzzles.order(:id)
@action_name = t("helpers.buttons.refresh") if params.key?(:hide_offline) && params.key?(:category)
if params.key?(:category) @action_path = "/public/#{@contest.friendly_id}?hide_offline=#{params[:hide_offline]}&category=#{params[:category]}"
elsif params.key?(:category)
@action_path = "/public/#{@contest.friendly_id}?category=#{params[:category]}" @action_path = "/public/#{@contest.friendly_id}?category=#{params[:category]}"
elsif params.key?(:hide_offline)
@action_path = "/public/#{@contest.friendly_id}?hide_offline=#{params[:hide_offline]}"
else else
@action_path = "/public/#{@contest.friendly_id}" @action_path = "/public/#{@contest.friendly_id}"
end end

View File

@@ -79,9 +79,6 @@ class MessagesController < ApplicationController
def convert def convert
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@completion = Completion.new() @completion = Completion.new()
@completion.display_time_from_start = @message.display_time @completion.display_time_from_start = @message.display_time
@completion.completed = true @completion.completed = true

View File

@@ -11,16 +11,11 @@ class PuzzlesController < ApplicationController
def edit def edit
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
end end
def new def new
authorize @contest authorize @contest
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
@puzzle = Puzzle.new @puzzle = Puzzle.new
end end
@@ -32,8 +27,6 @@ class PuzzlesController < ApplicationController
if @puzzle.save if @puzzle.save
redirect_to contest_path(@contest), notice: t("puzzles.new.notice") redirect_to contest_path(@contest), notice: t("puzzles.new.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :new, status: :unprocessable_entity render :new, status: :unprocessable_entity
end end
end end
@@ -44,8 +37,6 @@ class PuzzlesController < ApplicationController
if @puzzle.update(puzzle_params) if @puzzle.update(puzzle_params)
redirect_to @contest, notice: t("puzzles.edit.notice") redirect_to @contest, notice: t("puzzles.edit.notice")
else else
@action_name = t("helpers.buttons.back")
@action_path = contest_path(@contest)
render :edit, status: :unprocessable_entity render :edit, status: :unprocessable_entity
end end
end end

View File

@@ -4,11 +4,14 @@ class UsersController < ApplicationController
def index def index
authorize :user authorize :user
@title = t("users.index.title")
@users = User.all @users = User.all
end end
def edit def edit
authorize @user authorize @user
@title = t("users.edit.title")
end end
def update def update

View File

@@ -41,4 +41,13 @@ javascript:
= t("puzzles.plural").capitalize = t("puzzles.plural").capitalize
li.nav-item li.nav-item
a.nav-link class=active_page(contest_messages_path(@contest)) href=contest_messages_path(@contest) a.nav-link class=active_page(contest_messages_path(@contest)) href=contest_messages_path(@contest)
= t("messages.plural").capitalize = t("messages.plural").capitalize
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/general") href="/contests/#{@contest.id}/settings/general"
= t("contests.form.general")
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/offline") href="/contests/#{@contest.id}/settings/offline"
= t("contests.form.offline")
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/categories") href="/contests/#{@contest.id}/settings/categories"
= t("contests.form.categories")

View File

@@ -1,7 +1,3 @@
.row
.col
h3 Informations
= form_with model: contestant, url: url, method: method do |form| = form_with model: contestant, url: url, method: method do |form|
.row.mb-3 .row.mb-3
.col .col
@@ -15,7 +11,7 @@
= form.label :email = form.label :email
.form-text .form-text
= t("activerecord.attributes.contestant.email_description") = t("activerecord.attributes.contestant.email_description")
- if @contest.categories - if @contest.categories && method == :patch
.row.mt-4 .row.mt-4
.col .col
- @contest.categories.each do |category| - @contest.categories.each do |category|

View File

@@ -1,5 +1,3 @@
= render "contest_nav"
.row.mb-4 style="height: calc(100vh - 280px)" .row.mb-4 style="height: calc(100vh - 280px)"
.col.d-flex.flex-column style="height: 100%" .col.d-flex.flex-column style="height: 100%"
.row.mb-4 .row.mb-4

View File

@@ -1 +1,2 @@
h5.mb-3 = t("contestants.new.title")
= render "form", contest: @contest, contestant: @contestant, submit_text: t("helpers.buttons.add"), method: :post, url: "/contests/#{@contest.id}/contestants" = render "form", contest: @contest, contestant: @contestant, submit_text: t("helpers.buttons.add"), method: :post, url: "/contests/#{@contest.id}/contestants"

View File

@@ -1,12 +0,0 @@
.row
.col
ul.nav.nav-tabs.mb-4
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/general") href="/contests/#{@contest.id}/settings/general"
= t("contests.form.general")
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/offline") href="/contests/#{@contest.id}/settings/offline"
= t("contests.form.offline")
li.nav-item
a.nav-link class=active_page("/contests/#{@contest.id}/settings/categories") href="/contests/#{@contest.id}/settings/categories"
= t("contests.form.categories")

View File

@@ -1,5 +1,3 @@
= render "settings_nav"
= form_with model: Category, url: "/contests/#{@contest.id}/categories" do |form| = form_with model: Category, url: "/contests/#{@contest.id}/categories" do |form|
- if @contest.categories.size > 0 - if @contest.categories.size > 0
.row .row

View File

@@ -1,5 +1,3 @@
= render "settings_nav"
= form_with model: @contest, url: "/contests/#{@contest.id}/settings/general" do |form| = form_with model: @contest, url: "/contests/#{@contest.id}/settings/general" do |form|
.row.mt-2.mb-3 .row.mt-2.mb-3
.col .col

View File

@@ -1,5 +1,3 @@
= render "settings_nav"
- if @contest.puzzles.length > 1 - if @contest.puzzles.length > 1
.row .row
.col .col

View File

@@ -44,9 +44,15 @@ html
= msg = msg
h1.mb-4 h1.mb-4
= @title - if @contest
- if @action_path = @contest.name
a.ms-4.btn.btn-primary href=@action_path style="margin-top: -6px" - if active_page("/public") == "active" && @action_path
= @action_name a.ms-4.btn.btn-primary href=@action_path style="margin-top: -6px"
= t("helpers.buttons.refresh")
- else
= @title
- if @contest && active_page("/public") != "active"
= render "contest_nav"
= yield = yield

View File

@@ -1,5 +1,3 @@
= render "contest_nav"
.row.mb-4 style="height: calc(100vh - 280px)" .row.mb-4 style="height: calc(100vh - 280px)"
.col.d-flex.flex-column style="height: 100%" .col.d-flex.flex-column style="height: 100%"

View File

@@ -1,5 +1,3 @@
= render "contest_nav"
.row.mb-4 style="height: calc(100vh - 280px)" .row.mb-4 style="height: calc(100vh - 280px)"
.col.d-flex.flex-column style="height: 100%" .col.d-flex.flex-column style="height: 100%"