From f313686b138a716f67c190ea1ecd3eade46c7817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Tue, 27 May 2025 14:59:10 +0400 Subject: [PATCH] Add settings for member statuses --- .../admin/settings/membership_controller.rb | 23 ++++++++ app/controllers/admin/users_controller.rb | 12 +++-- .../concerns/settings/member_settings.rb | 10 ---- .../concerns/settings/membership_settings.rb | 18 +++++++ app/models/setting.rb | 1 + .../admin/settings/membership/show.html.erb | 53 +++++++++++++++++++ app/views/admin/users/index.html.erb | 12 +++-- app/views/icons/_server.html.erb | 2 +- app/views/icons/_users.html.erb | 2 +- .../shared/_admin_sidenav_settings.html.erb | 6 ++- config/routes.rb | 1 + 11 files changed, 118 insertions(+), 22 deletions(-) create mode 100644 app/controllers/admin/settings/membership_controller.rb delete mode 100644 app/models/concerns/settings/member_settings.rb create mode 100644 app/models/concerns/settings/membership_settings.rb create mode 100644 app/views/admin/settings/membership/show.html.erb diff --git a/app/controllers/admin/settings/membership_controller.rb b/app/controllers/admin/settings/membership_controller.rb new file mode 100644 index 0000000..f01e958 --- /dev/null +++ b/app/controllers/admin/settings/membership_controller.rb @@ -0,0 +1,23 @@ +class Admin::Settings::MembershipController < Admin::SettingsController + def show + end + + def update + update_settings + + redirect_to admin_settings_membership_path, flash: { + success: "Settings saved" + } + end + + private + + def setting_params + params.require(:setting).permit([ + :member_status_contributor, + :member_status_sustainer, + :user_index_show_contributors, + :user_index_show_sustainers + ]) + end +end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 105241f..0baeed7 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -6,18 +6,20 @@ class Admin::UsersController < Admin::BaseController def index ldap = LdapService.new ou = Setting.primary_domain + @show_contributors = Setting.user_index_show_contributors + @show_sustainers = Setting.user_index_show_sustainers + @contributors = ldap.search_users(:memberStatus, :contributor, :cn) if @show_contributors + @sustainers = ldap.search_users(:memberStatus, :sustainer, :cn) if @show_sustainers @admins = ldap.search_users(:admin, true, :cn) - @contributors = ldap.search_users(:memberStatus, :contributor, :cn) - @sustainers = ldap.search_users(:memberStatus, :sustainer, :cn) @pagy, @users = pagy(User.where(ou: ou).order(cn: :asc)) @stats = { users_confirmed: User.where(ou: ou).confirmed.count, - users_pending: User.where(ou: ou).pending.count, - users_contributing: @contributors.size, - users_paying: @sustainers.size + users_pending: User.where(ou: ou).pending.count } + @stats[:users_contributing] = @contributors.size if @show_contributors + @stats[:users_paying] = @sustainers.size if @show_sustainers end # GET /admin/users/:username diff --git a/app/models/concerns/settings/member_settings.rb b/app/models/concerns/settings/member_settings.rb deleted file mode 100644 index 09c648b..0000000 --- a/app/models/concerns/settings/member_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Settings - module MemberSettings - extend ActiveSupport::Concern - - included do - field :member_default_status, type: :string, - default: ENV["MEMBER_DEFAULT_STATUS"].presence - end - end -end diff --git a/app/models/concerns/settings/membership_settings.rb b/app/models/concerns/settings/membership_settings.rb new file mode 100644 index 0000000..bf4712c --- /dev/null +++ b/app/models/concerns/settings/membership_settings.rb @@ -0,0 +1,18 @@ +module Settings + module MembershipSettings + extend ActiveSupport::Concern + + included do + field :member_status_contributor, type: :string, + default: "Contributor" + field :member_status_sustainer, type: :string, + default: "Sustainer" + + # Admin panel + field :user_index_show_contributors, type: :boolean, + default: false + field :user_index_show_sustainers, type: :boolean, + default: false + end + end +end diff --git a/app/models/setting.rb b/app/models/setting.rb index aa8072d..2c31ca8 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -16,6 +16,7 @@ class Setting < RailsSettings::Base include Settings::LightningNetworkSettings include Settings::MastodonSettings include Settings::MediaWikiSettings + include Settings::MembershipSettings include Settings::NostrSettings include Settings::OpenCollectiveSettings include Settings::RemoteStorageSettings diff --git a/app/views/admin/settings/membership/show.html.erb b/app/views/admin/settings/membership/show.html.erb new file mode 100644 index 0000000..5b403d6 --- /dev/null +++ b/app/views/admin/settings/membership/show.html.erb @@ -0,0 +1,53 @@ +<%= render HeaderComponent.new(title: "Settings") %> + +<%= render MainWithSidenavComponent.new(sidenav_partial: 'shared/admin_sidenav_settings') do %> + <%= form_for(Setting.new, url: admin_settings_membership_path, method: :put) do |f| %> +
+

Membership

+ + <% if @errors && @errors.any? %> + <%= render partial: "admin/settings/errors", locals: { errors: @errors } %> + <% end %> + + +
+ +
+

Admin panel

+ + +
+ +
+

+ <%= f.submit 'Save', class: "btn-md btn-blue w-full md:w-auto" %> +

+
+ <% end %> +<% end %> diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb index c2521e8..66bf6f6 100644 --- a/app/views/admin/users/index.html.erb +++ b/app/views/admin/users/index.html.erb @@ -13,16 +13,20 @@ title: 'Pending', value: @stats[:users_pending], ) %> + <% if @show_contributors %> <%= render QuickstatsItemComponent.new( type: :number, - title: 'Contributors', + title: Setting.member_status_contributor.pluralize, value: @stats[:users_contributing], ) %> + <% end %> + <% if @show_sustainers %> <%= render QuickstatsItemComponent.new( type: :number, - title: 'Sustainers', + title: Setting.member_status_sustainer.pluralize, value: @stats[:users_paying], ) %> + <% end %> <% end %> @@ -41,8 +45,8 @@ <%= link_to(user.cn, admin_user_path(user.cn), class: 'ks-text-link') %> <%= user.confirmed_at.nil? ? badge("pending", :yellow) : "" %> - <%= @contributors.include?(user.cn) ? badge("contributor", :green) : "" %> - <%= @sustainers.include?(user.cn) ? badge("sustainer", :green) : "" %> + <% if @show_contributors %><%= @contributors.include?(user.cn) ? badge("contributor", :green) : "" %><% end %> + <% if @show_sustainers %><%= @sustainers.include?(user.cn) ? badge("sustainer", :green) : "" %><% end %> <%= @admins.include?(user.cn) ? badge("admin", :red) : "" %> diff --git a/app/views/icons/_server.html.erb b/app/views/icons/_server.html.erb index 54ce094..f97725e 100644 --- a/app/views/icons/_server.html.erb +++ b/app/views/icons/_server.html.erb @@ -1 +1 @@ - \ No newline at end of file + diff --git a/app/views/icons/_users.html.erb b/app/views/icons/_users.html.erb index aacf6b0..81970a1 100644 --- a/app/views/icons/_users.html.erb +++ b/app/views/icons/_users.html.erb @@ -1 +1 @@ - \ No newline at end of file + diff --git a/app/views/shared/_admin_sidenav_settings.html.erb b/app/views/shared/_admin_sidenav_settings.html.erb index 48c5ced..14efb00 100644 --- a/app/views/shared/_admin_sidenav_settings.html.erb +++ b/app/views/shared/_admin_sidenav_settings.html.erb @@ -3,7 +3,11 @@ active: current_page?(admin_settings_registrations_path) ) %> <%= render SidenavLinkComponent.new( - name: "Services", path: admin_settings_services_path, icon: "grid", + name: "Membership", path: admin_settings_membership_path, icon: "users", + active: current_page?(admin_settings_membership_path) +) %> +<%= render SidenavLinkComponent.new( + name: "Services", path: admin_settings_services_path, icon: "server", active: controller_name == "services" ) %> <% if controller_name == "services" %> diff --git a/config/routes.rb b/config/routes.rb index 759abcc..115fadd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -109,6 +109,7 @@ Rails.application.routes.draw do namespace :settings do resource 'registrations', only: ['show', 'update'] + resource 'membership', only: ['show', 'update'], controller: 'membership' resources 'services', param: 'service', only: ['index', 'show', 'update'] end end