From 17cd9db43212fb090d044f2c026fbae75f0da5e9 Mon Sep 17 00:00:00 2001 From: Selase Krakani Date: Thu, 2 Jan 2025 20:58:26 +0000 Subject: [PATCH] FEATURE: Add option to lock leaderboard view to default period For some leaderboards, filtering by time period might be unsuitable. This change introduces the option to disable the period chooser in the UI. --- .../components/admin-edit-leaderboard.gjs | 9 +++++++ ...min_gamification_leaderboard_controller.rb | 1 + .../gamification_leaderboard.rb | 25 ++++++++++--------- app/serializers/leaderboard_serializer.rb | 3 ++- .../components/gamification-leaderboard.hbs | 1 + .../models/gamification-leaderboard.js | 2 ++ config/locales/client.en.yml | 1 + ..._period_filter_disabled_to_leaderboards.rb | 11 ++++++++ 8 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20250102185307_add_period_filter_disabled_to_leaderboards.rb diff --git a/admin/assets/javascripts/admin/components/admin-edit-leaderboard.gjs b/admin/assets/javascripts/admin/components/admin-edit-leaderboard.gjs index 84f89cde..adf89f95 100644 --- a/admin/assets/javascripts/admin/components/admin-edit-leaderboard.gjs +++ b/admin/assets/javascripts/admin/components/admin-edit-leaderboard.gjs @@ -29,6 +29,7 @@ export default class AdminEditLeaderboard extends Component { excluded_groups_ids: this.args.leaderboard.excludedGroupsIds, visible_to_groups_ids: this.args.leaderboard.visibleToGroupsIds, default_period: this.args.leaderboard.defaultPeriod, + period_filter_disabled: this.args.leaderboard.periodFilterDisabled, }; } @@ -159,6 +160,14 @@ export default class AdminEditLeaderboard extends Component { + + + diff --git a/app/controllers/discourse_gamification/admin_gamification_leaderboard_controller.rb b/app/controllers/discourse_gamification/admin_gamification_leaderboard_controller.rb index 0710ae26..bf829690 100644 --- a/app/controllers/discourse_gamification/admin_gamification_leaderboard_controller.rb +++ b/app/controllers/discourse_gamification/admin_gamification_leaderboard_controller.rb @@ -49,6 +49,7 @@ def update excluded_groups_ids: params[:excluded_groups_ids] || [], visible_to_groups_ids: params[:visible_to_groups_ids] || [], default_period: params[:default_period], + period_filter_disabled: params[:period_filter_disabled] || false, ) if leaderboard.save diff --git a/app/models/discourse_gamification/gamification_leaderboard.rb b/app/models/discourse_gamification/gamification_leaderboard.rb index e1a8601e..8e901718 100644 --- a/app/models/discourse_gamification/gamification_leaderboard.rb +++ b/app/models/discourse_gamification/gamification_leaderboard.rb @@ -45,18 +45,19 @@ def self.scores_for(leaderboard_id, page: 0, for_user_id: false, period: nil, us # # Table name: gamification_leaderboards # -# id :bigint not null, primary key -# name :string not null -# from_date :date -# to_date :date -# for_category_id :integer -# created_by_id :integer not null -# created_at :datetime not null -# updated_at :datetime not null -# visible_to_groups_ids :integer default([]), not null, is an Array -# included_groups_ids :integer default([]), not null, is an Array -# excluded_groups_ids :integer default([]), not null, is an Array -# default_period :integer default(0) +# id :bigint not null, primary key +# name :string not null +# from_date :date +# to_date :date +# for_category_id :integer +# created_by_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# visible_to_groups_ids :integer default([]), not null, is an Array +# included_groups_ids :integer default([]), not null, is an Array +# excluded_groups_ids :integer default([]), not null, is an Array +# default_period :integer default(0) +# period_filter_disabled :boolean default(FALSE), not null # # Indexes # diff --git a/app/serializers/leaderboard_serializer.rb b/app/serializers/leaderboard_serializer.rb index 351fda0d..71d9db7e 100644 --- a/app/serializers/leaderboard_serializer.rb +++ b/app/serializers/leaderboard_serializer.rb @@ -10,5 +10,6 @@ class LeaderboardSerializer < ApplicationSerializer :included_groups_ids, :excluded_groups_ids, :default_period, - :updated_at + :updated_at, + :period_filter_disabled end diff --git a/assets/javascripts/discourse/components/gamification-leaderboard.hbs b/assets/javascripts/discourse/components/gamification-leaderboard.hbs index 4176a638..b96076f5 100644 --- a/assets/javascripts/discourse/components/gamification-leaderboard.hbs +++ b/assets/javascripts/discourse/components/gamification-leaderboard.hbs @@ -14,6 +14,7 @@ @period={{this.period}} @action={{action "changePeriod"}} @fullDay={{false}} + @options={{hash disabled=this.model.leaderboard.period_filter_disabled}} class="leaderboard__period-chooser" /> {{#if this.currentUser.staff}} diff --git a/assets/javascripts/discourse/models/gamification-leaderboard.js b/assets/javascripts/discourse/models/gamification-leaderboard.js index c9f6b815..74c69b70 100644 --- a/assets/javascripts/discourse/models/gamification-leaderboard.js +++ b/assets/javascripts/discourse/models/gamification-leaderboard.js @@ -19,6 +19,7 @@ export default class GamificationLeaderboard { @tracked toDate; @tracked name; @tracked period; + @tracked periodFilterDisabled; constructor(args = {}) { this.id = args.id; @@ -33,6 +34,7 @@ export default class GamificationLeaderboard { this.toDate = args.to_date; this.name = args.name; this.period = args.period; + this.periodFilterDisabled = args.period_filter_disabled; if (Number.isInteger(args.default_period)) { this.defaultPeriod = I18n.t( diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index eceb3eca..3738d202 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -40,6 +40,7 @@ en: excluded_groups_help: "Remove users on those groups from being included in the leaderboard. Leave empty to list everyone." default_period: "Default period" default_period_help: "Set the default time period to display for this leaderboard." + period_filter_disabled: "Disable time period filter" period: all_time: "All Time" yearly: "Yearly" diff --git a/db/migrate/20250102185307_add_period_filter_disabled_to_leaderboards.rb b/db/migrate/20250102185307_add_period_filter_disabled_to_leaderboards.rb new file mode 100644 index 00000000..602070a2 --- /dev/null +++ b/db/migrate/20250102185307_add_period_filter_disabled_to_leaderboards.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddPeriodFilterDisabledToLeaderboards < ActiveRecord::Migration[7.2] + def change + add_column :gamification_leaderboards, + :period_filter_disabled, + :boolean, + default: false, + null: false + end +end