Merge settings & core indexes into a single nav
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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")
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
= render "settings_nav"
|
|
||||||
|
|
||||||
- if @contest.puzzles.length > 1
|
- if @contest.puzzles.length > 1
|
||||||
.row
|
.row
|
||||||
.col
|
.col
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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%"
|
||||||
|
|
||||||
|
|||||||
@@ -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%"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user