From 657c5ac47b9f68f6f08b1cf78f6b2b2918a64789 Mon Sep 17 00:00:00 2001 From: sto Date: Tue, 15 Jul 2025 18:23:26 +0200 Subject: [PATCH] Internal scoreboard: add category filter --- app/controllers/contests_controller.rb | 7 ++++++ app/views/contests/show.html.slim | 31 +++++++++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index 7ac922b..98a7215 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -16,6 +16,13 @@ class ContestsController < ApplicationController @action_name = t("helpers.buttons.edit") @action_path = edit_contest_path(@contest) @contestants = @contest.contestants.sort_by { |contestant| [ -contestant.completions.size, contestant.time_seconds ] } + if params.key?(:category) && params[:category] != "-1" + if params[:category] == "-2" + @contestants = @contestants.select { |contestant| contestant.categories.size == 0 } + else + @contestants = @contestants.select { |contestant| contestant.categories.where(id: params[:category]).any? } + end + end @puzzles = @contest.puzzles.order(:id) @messages = @contest.messages.order(:time_seconds) set_badges diff --git a/app/views/contests/show.html.slim b/app/views/contests/show.html.slim index 0b5a50e..5003dd9 100644 --- a/app/views/contests/show.html.slim +++ b/app/views/contests/show.html.slim @@ -42,17 +42,38 @@ javascript: | + #{t("helpers.buttons.add")} a.ms-2.btn-sm.btn.btn-primary href=contest_import_path(@contest) style="margin-top: -3px" | #{t("helpers.buttons.import")} + - if @contest.categories.size > 0 + .row + .col + select.mt-2.mb-2 id="categories" style="padding: 5px" + option value=-1 + | Tous.tes les participant.e.s + option value=-2 + | Participant.e.s sans catégorie + - @contest.categories.each do |category| + 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) => { + if (option.value == selectedCategory) option.selected = true; + }); + select.addEventListener('change', (e) => { + window.location.href = `#{contest_path(@contest)}?category=${e.target.value}` + }) .d-flex.flex-column style="overflow-y: auto" table.table.table-striped.table-hover thead tr - th scope="col" + th = t("helpers.rank") - th scope="col" + th = t("activerecord.attributes.contestant.name") - th scope="col" + th = t("activerecord.attributes.contestant.completions") - th scope="col" + th = t("activerecord.attributes.contestant.display_time") tbody - @contestants.each_with_index do |contestant, index| @@ -144,4 +165,4 @@ javascript: - else a.btn.btn-sm.btn-secondary.disabled href=contest_message_convert_path(@contest, message) style="white-space: nowrap;" = t("helpers.buttons.add_completion") - = link_to t("helpers.buttons.delete"), contest_message_path(@contest, message), data: { turbo_method: :delete }, class: "btn btn-sm btn-danger ms-2" + = link_to "x", contest_message_path(@contest, message), data: { turbo_method: :delete }, class: "btn btn-sm btn-danger ms-2"