From 805733939c226620b60854ee4e3679cf0689cc9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sun, 12 Mar 2023 12:55:21 +0700 Subject: [PATCH 01/10] Add toggle switch component, service configs, admin profile links --- .env.example | 9 ++- .../form_elements/toggle_component.html.erb | 12 ++++ .../form_elements/toggle_component.rb | 9 +++ app/models/setting.rb | 50 ++++++++++++++++ app/models/user.rb | 2 +- app/views/admin/users/show.html.erb | 60 ++++++++++++++++--- 6 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 app/components/form_elements/toggle_component.html.erb create mode 100644 app/components/form_elements/toggle_component.rb diff --git a/.env.example b/.env.example index 48b0fec..5550c06 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,16 @@ LDAP_HOST=localhost LDAP_PORT=389 LDAP_ADMIN_PASSWORD=passthebutter -LDAP_SUFFIX="dc=kosmos,dc=org" +LDAP_SUFFIX='dc=kosmos,dc=org' WEBHOOKS_ALLOWED_IPS='10.1.1.163' +DISCOURSE_PUBLIC_URL='https://community.kosmos.org' +GITEA_PUBLIC_URL='https://gitea.kosmos.org' +MASTODON_PUBLIC_URL='https://kosmos.social' +MEDIAWIKI_PUBLIC_URL='https://wiki.kosmos.org' + +EJABBERD_ADMIN_URL='https://xmpp.kosmos.org/admin' EJABBERD_API_URL='https://xmpp.kosmos.org/api' BTCPAY_API_URL='http://localhost:23001/api/v1' @@ -18,3 +24,4 @@ LNDHUB_PG_PORT=5432 LNDHUB_PG_DATABASE=lndhub LNDHUB_PG_USERNAME=lndhub LNDHUB_PG_PASSWORD='' + diff --git a/app/components/form_elements/toggle_component.html.erb b/app/components/form_elements/toggle_component.html.erb new file mode 100644 index 0000000..fabb81c --- /dev/null +++ b/app/components/form_elements/toggle_component.html.erb @@ -0,0 +1,12 @@ + diff --git a/app/components/form_elements/toggle_component.rb b/app/components/form_elements/toggle_component.rb new file mode 100644 index 0000000..a5d0400 --- /dev/null +++ b/app/components/form_elements/toggle_component.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module FormElements + class ToggleComponent < ViewComponent::Base + def initialize(enabled:) + @enabled = !!enabled + end + end +end diff --git a/app/models/setting.rb b/app/models/setting.rb index 0bca086..27f43a6 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -10,6 +10,56 @@ class Setting < RailsSettings::Base account accounts donations mail webmaster support ] + # + # Discourse + # + + field :discourse_public_url, type: :string, + default: ENV["DISCOURSE_PUBLIC_URL"].presence + + field :discourse_enabled, type: :boolean, + default: (ENV["DISCOURSE_PUBLIC_URL"].present?.to_s || false) + + # + # ejabberd + # + + field :ejabberd_enabled, type: :boolean, + default: (ENV["EJABBERD_API_URL"].present?.to_s || false) + + field :ejabberd_admin_url, type: :string, + default: ENV["EJABBERD_ADMIN_URL"].presence + + # + # Gitea + # + + field :gitea_public_url, type: :string, + default: ENV["GITEA_PUBLIC_URL"].presence + + field :gitea_enabled, type: :boolean, + default: (ENV["GITEA_PUBLIC_URL"].present?.to_s || false) + + # + # Mastodon + # + + field :mastodon_public_url, type: :string, + default: ENV["MASTODON_PUBLIC_URL"].presence + + field :mastodon_enabled, type: :boolean, + default: (ENV["MASTODON_PUBLIC_URL"].present?.to_s || false) + + # + # MediaWiki + # + + field :mediawiki_public_url, type: :string, + default: ENV["MEDIAWIKI_PUBLIC_URL"].presence + + field :mediawiki_enabled, type: :boolean, + default: (ENV["MEDIAWIKI_PUBLIC_URL"].present?.to_s || false) + # # Lightning Network # diff --git a/app/models/user.rb b/app/models/user.rb index 31599c4..5734369 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,7 +53,7 @@ class User < ApplicationRecord end def devise_after_confirmation - enable_service %w[discourse gitea wiki xmpp] + enable_service %w[discourse gitea mediawiki ejabberd] end def reset_password(new_password, new_password_confirmation) diff --git a/app/views/admin/users/show.html.erb b/app/views/admin/users/show.html.erb index 4679e6f..19da38f 100644 --- a/app/views/admin/users/show.html.erb +++ b/app/views/admin/users/show.html.erb @@ -65,28 +65,72 @@

Services

- +
+ + + + + + + + <% if Setting.discourse_enabled %> - + + + <% end %> + <% if Setting.gitea_enabled %> - + + + <% end %> + <% if Setting.mastodon_enabled %> - + + + <% end %> + <% if Setting.mediawiki_enabled %> - - + + + + <% end %> + <% if Setting.ejabberd_enabled %> - - + + + + <% end %>
NameEnabled
Discourse<%= check_box_tag 'service_discourse', 'enabled', @services_enabled.include?("discourse"), disabled: true %> + <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("discourse")) %> + + <%= link_to "Open profile", "#{Setting.discourse_public_url}/u/#{@user.cn}/summary", class: "btn-sm btn-gray" %> +
Gitea<%= check_box_tag 'service_gitea', 'enabled', @services_enabled.include?("gitea"), disabled: true %> + <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("gitea")) %> + + <%= link_to "Open profile", "#{Setting.gitea_public_url}/#{@user.cn}", class: "btn-sm btn-gray" %> +
Mastodon<%= check_box_tag 'service_mastodon', 'enabled', @services_enabled.include?("mastodon"), disabled: true %> + <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("mastodon")) %> + + <%= link_to "Open profile", "#{Setting.mastodon_public_url}/@#{@user.cn}", class: "btn-sm btn-gray" %> +
Wiki<%= check_box_tag 'service_wiki', 'enabled', @services_enabled.include?("wiki"), disabled: true %>MediaWiki + <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("mediawiki")) %> + + <%= link_to "Open profile", "#{Setting.mediawiki_public_url}/Special:Contributions/#{@user.cn}", class: "btn-sm btn-gray" %> +
XMPP<%= check_box_tag 'service_xmpp', 'enabled', @services_enabled.include?("xmpp"), disabled: true %>XMPP (ejabberd) + <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("ejabberd")) %> + + <% if Setting.ejabberd_admin_url.present? %> + <%= link_to "Open profile", "#{Setting.ejabberd_admin_url}/server/#{@user.ou}/user/#{@user.cn}/", class: "btn-sm btn-gray" %> + <% end %> +
From e758e258a8b83004ffd19fc4584ccdbb65a9d6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sun, 12 Mar 2023 13:41:36 +0700 Subject: [PATCH 02/10] Allow disabling toggles, add toggle fieldset component --- .../fieldset_toggle_component.html.erb | 9 ++++++ .../fieldset_toggle_component.rb | 14 ++++++++ .../form_elements/toggle_component.html.erb | 3 +- .../form_elements/toggle_component.rb | 3 +- .../admin/settings/services/index.html.erb | 32 ++++++++----------- 5 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 app/components/form_elements/fieldset_toggle_component.html.erb create mode 100644 app/components/form_elements/fieldset_toggle_component.rb diff --git a/app/components/form_elements/fieldset_toggle_component.html.erb b/app/components/form_elements/fieldset_toggle_component.html.erb new file mode 100644 index 0000000..28549bc --- /dev/null +++ b/app/components/form_elements/fieldset_toggle_component.html.erb @@ -0,0 +1,9 @@ +<%= tag.public_send(@tag, class: "flex items-center justify-between py-6") do %> +
+ +

<%= @descripton %>

+
+
+ <%= render FormElements::ToggleComponent.new(enabled: @enabled, input_enabled: @input_enabled) %> +
+<% end %> diff --git a/app/components/form_elements/fieldset_toggle_component.rb b/app/components/form_elements/fieldset_toggle_component.rb new file mode 100644 index 0000000..aa64535 --- /dev/null +++ b/app/components/form_elements/fieldset_toggle_component.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module FormElements + class FieldsetToggleComponent < ViewComponent::Base + def initialize(tag: "li", enabled: false, input_enabled: true, title:, description:) + @tag = tag + @enabled = enabled + @input_enabled = input_enabled + @title = title + @descripton = description + @button_text = @enabled ? "Switch off" : "Switch on" + end + end +end diff --git a/app/components/form_elements/toggle_component.html.erb b/app/components/form_elements/toggle_component.html.erb index fabb81c..9023b7f 100644 --- a/app/components/form_elements/toggle_component.html.erb +++ b/app/components/form_elements/toggle_component.html.erb @@ -1,10 +1,11 @@ +<% end %> diff --git a/app/components/form_elements/toggle_component.rb b/app/components/form_elements/toggle_component.rb index 9702dfb..d5ee036 100644 --- a/app/components/form_elements/toggle_component.rb +++ b/app/components/form_elements/toggle_component.rb @@ -2,9 +2,10 @@ module FormElements class ToggleComponent < ViewComponent::Base - def initialize(enabled:, input_enabled: true) + def initialize(enabled:, input_enabled: true, data: nil) @enabled = !!enabled @input_enabled = input_enabled + @data = data end end end diff --git a/app/javascript/controllers/settings/toggle_controller.js b/app/javascript/controllers/settings/toggle_controller.js new file mode 100644 index 0000000..5c9cff1 --- /dev/null +++ b/app/javascript/controllers/settings/toggle_controller.js @@ -0,0 +1,25 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = [ "button", "switch", "input" ] + static values = { switchEnabled: Boolean } + + toggleSwitch () { + this.switchEnabledValue = !this.switchEnabledValue + this.inputTarget.value = this.switchEnabledValue.toString() + + if (this.switchEnabledValue) { + this.buttonTarget.setAttribute("aria-checked", "true"); + this.buttonTarget.classList.remove("bg-gray-200") + this.buttonTarget.classList.add("bg-blue-600") + this.switchTarget.classList.remove("translate-x-0") + this.switchTarget.classList.add("translate-x-5") + } else { + this.buttonTarget.setAttribute("aria-checked", "false"); + this.buttonTarget.classList.remove("bg-blue-600") + this.buttonTarget.classList.add("bg-gray-200") + this.switchTarget.classList.remove("translate-x-5") + this.switchTarget.classList.add("translate-x-0") + } + } +} From b94748019040b2147ca98e2364f221721055cec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 11:38:23 +0700 Subject: [PATCH 04/10] Refactor sidenav link component, allow multiple levels --- app/components/sidenav_link_component.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/components/sidenav_link_component.rb b/app/components/sidenav_link_component.rb index 999871b..60e58ed 100644 --- a/app/components/sidenav_link_component.rb +++ b/app/components/sidenav_link_component.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true class SidenavLinkComponent < ViewComponent::Base - def initialize(name:, path:, icon:, active: false, disabled: false) + def initialize(name:, level: 1, path:, icon:, active: false, disabled: false) @name = name + @level = level @path = path @icon = icon @active = active @@ -12,12 +13,15 @@ class SidenavLinkComponent < ViewComponent::Base end def class_names_link(path) + px = @level == 1 ? "px-4" : "pl-8 pr-4" + base = "#{px} py-2 group border-l-4 flex items-center text-base font-medium" + if @active - "bg-teal-50 border-teal-500 text-teal-700 hover:bg-teal-50 hover:text-teal-700 group border-l-4 px-4 py-2 flex items-center text-base font-medium" + "#{base} bg-teal-50 border-teal-500 text-teal-700 hover:bg-teal-50 hover:text-teal-700" elsif @disabled - "border-transparent text-gray-400 hover:bg-gray-50 group border-l-4 px-4 py-2 flex items-center text-base font-medium" + "#{base} border-transparent text-gray-400 hover:bg-gray-50" else - "border-transparent text-gray-900 hover:bg-gray-50 hover:text-gray-900 group border-l-4 px-4 py-2 flex items-center text-base font-medium" + "#{base} border-transparent text-gray-900 hover:bg-gray-50 hover:text-gray-900" end end From e00390d1021201f9909f74822ef0de3233fb8fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 11:39:06 +0700 Subject: [PATCH 05/10] Add cached settings for all current services --- app/models/setting.rb | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/app/models/setting.rb b/app/models/setting.rb index 27f43a6..389c6e1 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -27,6 +27,9 @@ class Setting < RailsSettings::Base field :ejabberd_enabled, type: :boolean, default: (ENV["EJABBERD_API_URL"].present?.to_s || false) + field :ejabberd_api_url, type: :string, + default: ENV["EJABBERD_API_URL"].presence + field :ejabberd_admin_url, type: :string, default: ENV["EJABBERD_ADMIN_URL"].presence @@ -40,6 +43,25 @@ class Setting < RailsSettings::Base field :gitea_enabled, type: :boolean, default: (ENV["GITEA_PUBLIC_URL"].present?.to_s || false) + # + # Lightning Network + # + + field :lndhub_api_url, type: :string, + default: ENV["LNDHUB_API_URL"].presence + + field :lndhub_enabled, type: :boolean, + default: (ENV["LNDHUB_API_URL"].present?.to_s || false) + + field :lndhub_admin_enabled, type: :boolean, + default: (ENV["LNDHUB_ADMIN_UI"] || false) + + field :lndhub_public_key, type: :string, + default: (ENV["LNDHUB_PUBLIC_KEY"] || "") + + field :lndhub_keysend_enabled, type: :boolean, + default: -> { self.lndhub_public_key.present?.to_s || false } + # # Mastodon # @@ -61,18 +83,8 @@ class Setting < RailsSettings::Base default: (ENV["MEDIAWIKI_PUBLIC_URL"].present?.to_s || false) # - # Lightning Network + # Nostr # - field :lndhub_enabled, type: :boolean, - default: (ENV["LNDHUB_API_URL"].present?.to_s || false) - - field :lndhub_admin_enabled, type: :boolean, - default: (ENV["LNDHUB_ADMIN_UI"] || false) - - field :lndhub_public_key, type: :string, - default: (ENV["LNDHUB_PUBLIC_KEY"] || "") - - field :lndhub_keysend_enabled, type: :boolean, - default: -> { self.lndhub_public_key.present?.to_s || false } + field :nostr_enabled, type: :boolean, default: true end From 295d486761144b025201f47302fdbc33aeb13137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 11:39:45 +0700 Subject: [PATCH 06/10] Disable toggles on admin user page They are purely informational --- app/views/admin/users/show.html.erb | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/app/views/admin/users/show.html.erb b/app/views/admin/users/show.html.erb index 19da38f..5d89827 100644 --- a/app/views/admin/users/show.html.erb +++ b/app/views/admin/users/show.html.erb @@ -78,7 +78,10 @@ Discourse - <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("discourse")) %> + <%= render FormElements::ToggleComponent.new( + enabled: @services_enabled.include?("discourse"), + input_enabled: false + ) %> <%= link_to "Open profile", "#{Setting.discourse_public_url}/u/#{@user.cn}/summary", class: "btn-sm btn-gray" %> @@ -89,7 +92,10 @@ Gitea - <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("gitea")) %> + <%= render FormElements::ToggleComponent.new( + enabled: @services_enabled.include?("gitea"), + input_enabled: false + ) %> <%= link_to "Open profile", "#{Setting.gitea_public_url}/#{@user.cn}", class: "btn-sm btn-gray" %> @@ -100,7 +106,10 @@ Mastodon - <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("mastodon")) %> + <%= render FormElements::ToggleComponent.new( + enabled: @services_enabled.include?("mastodon"), + input_enabled: false + ) %> <%= link_to "Open profile", "#{Setting.mastodon_public_url}/@#{@user.cn}", class: "btn-sm btn-gray" %> @@ -111,7 +120,10 @@ MediaWiki - <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("mediawiki")) %> + <%= render FormElements::ToggleComponent.new( + enabled: @services_enabled.include?("mediawiki"), + input_enabled: false + ) %> <%= link_to "Open profile", "#{Setting.mediawiki_public_url}/Special:Contributions/#{@user.cn}", class: "btn-sm btn-gray" %> @@ -122,7 +134,10 @@ XMPP (ejabberd) - <%= render FormElements::ToggleComponent.new(enabled: @services_enabled.include?("ejabberd")) %> + <%= render FormElements::ToggleComponent.new( + enabled: @services_enabled.include?("ejabberd"), + input_enabled: false + ) %> <% if Setting.ejabberd_admin_url.present? %> From ca1221e9f37a6df13fdcb8744825a4657b289065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 11:40:47 +0700 Subject: [PATCH 07/10] Refactor admin settings, add all service settings --- .../form_elements/fieldset_component.html.erb | 13 +++++ .../form_elements/fieldset_component.rb | 11 +++++ .../settings/registrations_controller.rb | 20 +------- .../admin/settings/services_controller.rb | 28 ++++++++++- app/controllers/admin/settings_controller.rb | 24 +++++++++ app/views/admin/settings/_errors.html.erb | 7 +++ .../settings/registrations/index.html.erb | 11 ++--- .../settings/services/_discourse.html.erb | 17 +++++++ .../settings/services/_ejabberd.html.erb | 22 +++++++++ .../admin/settings/services/_gitea.html.erb | 17 +++++++ .../admin/settings/services/_lndhub.html.erb | 40 +++++++++++++++ .../settings/services/_mastodon.html.erb | 17 +++++++ .../settings/services/_mediawiki.html.erb | 17 +++++++ .../admin/settings/services/_nostr.html.erb | 10 ++++ .../admin/settings/services/index.html.erb | 46 +++++++---------- app/views/icons/_x.html.erb | 2 +- .../shared/_admin_sidenav_settings.html.erb | 3 ++ .../_admin_sidenav_settings_services.html.erb | 49 +++++++++++++++++++ 18 files changed, 296 insertions(+), 58 deletions(-) create mode 100644 app/components/form_elements/fieldset_component.html.erb create mode 100644 app/components/form_elements/fieldset_component.rb create mode 100644 app/views/admin/settings/_errors.html.erb create mode 100644 app/views/admin/settings/services/_discourse.html.erb create mode 100644 app/views/admin/settings/services/_ejabberd.html.erb create mode 100644 app/views/admin/settings/services/_gitea.html.erb create mode 100644 app/views/admin/settings/services/_lndhub.html.erb create mode 100644 app/views/admin/settings/services/_mastodon.html.erb create mode 100644 app/views/admin/settings/services/_mediawiki.html.erb create mode 100644 app/views/admin/settings/services/_nostr.html.erb create mode 100644 app/views/shared/_admin_sidenav_settings_services.html.erb diff --git a/app/components/form_elements/fieldset_component.html.erb b/app/components/form_elements/fieldset_component.html.erb new file mode 100644 index 0000000..4d82a56 --- /dev/null +++ b/app/components/form_elements/fieldset_component.html.erb @@ -0,0 +1,13 @@ +<%= tag.public_send(@tag, class: "mb-6 last:mb-0") do %> + +<% end %> diff --git a/app/components/form_elements/fieldset_component.rb b/app/components/form_elements/fieldset_component.rb new file mode 100644 index 0000000..04871cf --- /dev/null +++ b/app/components/form_elements/fieldset_component.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module FormElements + class FieldsetComponent < ViewComponent::Base + def initialize(tag: "div", title:, description: nil) + @tag = tag + @title = title + @descripton = description + end + end +end diff --git a/app/controllers/admin/settings/registrations_controller.rb b/app/controllers/admin/settings/registrations_controller.rb index 3f2019e..976a570 100644 --- a/app/controllers/admin/settings/registrations_controller.rb +++ b/app/controllers/admin/settings/registrations_controller.rb @@ -4,25 +4,7 @@ class Admin::Settings::RegistrationsController < Admin::SettingsController end def create - @errors = ActiveModel::Errors.new(Setting.new) - - setting_params.keys.each do |key| - next if setting_params[key].nil? - - setting = Setting.new(var: key) - setting.value = setting_params[key].strip - unless setting.valid? - @errors.merge!(setting.errors) - end - end - - if @errors.any? - render :index - end - - setting_params.keys.each do |key| - Setting.send("#{key}=", setting_params[key].strip) unless setting_params[key].nil? - end + update_settings redirect_to admin_settings_registrations_path, flash: { success: "Settings saved" diff --git a/app/controllers/admin/settings/services_controller.rb b/app/controllers/admin/settings/services_controller.rb index ebdad4e..85ea77d 100644 --- a/app/controllers/admin/settings/services_controller.rb +++ b/app/controllers/admin/settings/services_controller.rb @@ -1,9 +1,35 @@ class Admin::Settings::ServicesController < Admin::SettingsController def index + @service = params[:s] + + if @service.blank? + redirect_to admin_settings_services_path(params: { s: "discourse" }) + end end - def update + def create + service = params.require(:service) + + update_settings + + redirect_to admin_settings_services_path(params: { s: service }), flash: { + success: "Settings saved" + } + end + + def setting_params + params.require(:setting).permit( + :discourse_enabled, + :ejabberd_enabled, + :gitea_enabled, + :lndhub_enabled, + :lndhub_admin_enabled, + :lndhub_keysend_enabled, + :mastodon_enabled, + :mediawiki_enabled, + :nostr_enabled, + ) end end diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 8353f9b..9c08229 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -4,6 +4,30 @@ class Admin::SettingsController < Admin::BaseController def index end + def update_settings + @errors = ActiveModel::Errors.new(Setting.new) + changed_keys = [] + + setting_params.keys.each do |key| + next if setting_params[key].nil? || + (Setting.send(key).to_s == setting_params[key].strip) + changed_keys.push(key) + setting = Setting.new(var: key) + setting.value = setting_params[key].strip + unless setting.valid? + @errors.merge!(setting.errors) + end + end + + if @errors.any? + render :index and return + end + + changed_keys.each do |key| + Setting.send("#{key}=", setting_params[key].strip) + end + end + private def set_current_section diff --git a/app/views/admin/settings/_errors.html.erb b/app/views/admin/settings/_errors.html.erb new file mode 100644 index 0000000..84bd2a6 --- /dev/null +++ b/app/views/admin/settings/_errors.html.erb @@ -0,0 +1,7 @@ +
+
    + <% errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
diff --git a/app/views/admin/settings/registrations/index.html.erb b/app/views/admin/settings/registrations/index.html.erb index 68e1827..90b67af 100644 --- a/app/views/admin/settings/registrations/index.html.erb +++ b/app/views/admin/settings/registrations/index.html.erb @@ -4,14 +4,9 @@ <%= form_for(Setting.new, url: admin_settings_registrations_path) do |f| %>

Registrations

+ <% if @errors && @errors.any? %> -
-
    - <% @errors.full_messages.each do |msg| %> -
  • <%= msg %>
  • - <% end %> -
-
+ <%= render partial: "admin/settings/errors", locals: { errors: @errors } %> <% end %>
-

+

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

diff --git a/app/views/admin/settings/services/_discourse.html.erb b/app/views/admin/settings/services/_discourse.html.erb new file mode 100644 index 0000000..633fa7b --- /dev/null +++ b/app/views/admin/settings/services/_discourse.html.erb @@ -0,0 +1,17 @@ +

Discourse

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :discourse_enabled, + enabled: Setting.discourse_enabled?, + title: "Enable Discourse integration", + description: "Discourse configuration present and features enabled" + ) %> +
+<% if Setting.discourse_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :discourse_public_url, + value: Setting.discourse_public_url, + class: "w-full", disabled: true %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/services/_ejabberd.html.erb b/app/views/admin/settings/services/_ejabberd.html.erb new file mode 100644 index 0000000..93c5ff3 --- /dev/null +++ b/app/views/admin/settings/services/_ejabberd.html.erb @@ -0,0 +1,22 @@ +

ejabberd (XMPP)

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :ejabberd_enabled, + enabled: Setting.ejabberd_enabled?, + title: "Enable ejabberd integration", + description: "ejabberd configuration present and features enabled" + ) %> +
+<% if Setting.ejabberd_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "API URL") do %> + <%= f.text_field :ejabberd_api_url, + value: Setting.ejabberd_api_url, + class: "w-full", disabled: true %> + <% end %> + <%= render FormElements::FieldsetComponent.new(title: "Admin URL") do %> + <%= f.text_field :ejabberd_admin_url, + value: Setting.ejabberd_admin_url, + class: "w-full", disabled: true %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/services/_gitea.html.erb b/app/views/admin/settings/services/_gitea.html.erb new file mode 100644 index 0000000..964185e --- /dev/null +++ b/app/views/admin/settings/services/_gitea.html.erb @@ -0,0 +1,17 @@ +

Gitea

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :gitea_enabled, + enabled: Setting.gitea_enabled?, + title: "Enable Gitea integration", + description: "Gitea configuration present and features enabled" + ) %> +
+<% if Setting.gitea_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :gitea_public_url, + value: Setting.gitea_public_url, + class: "w-full", disabled: true %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/services/_lndhub.html.erb b/app/views/admin/settings/services/_lndhub.html.erb new file mode 100644 index 0000000..f65d0c3 --- /dev/null +++ b/app/views/admin/settings/services/_lndhub.html.erb @@ -0,0 +1,40 @@ +

Lightning Network

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :lndhub_enabled, + enabled: Setting.lndhub_enabled?, + title: "Enable LNDHub integration", + description: "LNDHub configuration present and wallet features enabled" + ) %> + <% if Setting.lndhub_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "API URL") do %> + <%= f.text_field :lndhub_api_url, + tag: "li", + value: Setting.lndhub_api_url, + class: "w-full", disabled: true %> + <% end %> + <% end %> + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :lndhub_admin_enabled, + enabled: Setting.lndhub_admin_enabled?, + title: "Enable LNDHub admin panel", + description: "LNDHub database configuration present and admin panel enabled" + ) %> + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :lndhub_keysend_enabled, + enabled: Setting.lndhub_keysend_enabled?, + title: "Enable keysend payments", + description: "Allow users to receive invoice-less payments to their Lightning Address" + ) %> + <% if Setting.lndhub_keysend_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public key", description: "The public key of the Lightning node used by LNDHub") do %> + <%= f.text_field :lndhub_public_key, + tag: "li", + value: Setting.lndhub_public_key, + class: "w-full", disabled: true %> + <% end %> + <% end %> +
diff --git a/app/views/admin/settings/services/_mastodon.html.erb b/app/views/admin/settings/services/_mastodon.html.erb new file mode 100644 index 0000000..d9dfdeb --- /dev/null +++ b/app/views/admin/settings/services/_mastodon.html.erb @@ -0,0 +1,17 @@ +

Mastodon

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :mastodon_enabled, + enabled: Setting.mastodon_enabled?, + title: "Enable Mastodon integration", + description: "Mastodon configuration present and features enabled" + ) %> +
+<% if Setting.mastodon_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :mastodon_public_url, + value: Setting.mastodon_public_url, + class: "w-full", disabled: true %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/services/_mediawiki.html.erb b/app/views/admin/settings/services/_mediawiki.html.erb new file mode 100644 index 0000000..cc032c1 --- /dev/null +++ b/app/views/admin/settings/services/_mediawiki.html.erb @@ -0,0 +1,17 @@ +

MediaWiki

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :mediawiki_enabled, + enabled: Setting.mediawiki_enabled?, + title: "Enable MediaWiki integration", + description: "MediaWiki configuration present and features enabled" + ) %> +
+<% if Setting.mediawiki_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :mediawiki_public_url, + value: Setting.mediawiki_public_url, + class: "w-full", disabled: true %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/services/_nostr.html.erb b/app/views/admin/settings/services/_nostr.html.erb new file mode 100644 index 0000000..664d089 --- /dev/null +++ b/app/views/admin/settings/services/_nostr.html.erb @@ -0,0 +1,10 @@ +

Nostr

+
    + <%= render FormElements::FieldsetToggleComponent.new( + form: f, + attribute: :nostr_enabled, + enabled: Setting.nostr_enabled?, + title: "Enable Nostr integration (experimental)", + description: "Allow adding nostr pubkeys and resolve user addresses via NIP-05" + ) %> +
diff --git a/app/views/admin/settings/services/index.html.erb b/app/views/admin/settings/services/index.html.erb index e512cce..58360dd 100644 --- a/app/views/admin/settings/services/index.html.erb +++ b/app/views/admin/settings/services/index.html.erb @@ -1,35 +1,23 @@ <%= render HeaderComponent.new(title: "Settings") %> <%= render MainWithSidenavComponent.new(sidenav_partial: 'shared/admin_sidenav_settings') do %> -
-

Lightning Network

- <%= form_for(Setting.new, url: admin_settings_services_path) do |f| %> - <% if @errors && @errors.any? %> -
-
    - <% @errors.full_messages.each do |msg| %> -
  • <%= msg %>
  • - <% end %> -
-
- <% end %> + <%= form_for(Setting.new, url: admin_settings_services_path) do |f| %> + <%= hidden_field_tag :service, @service %> -
    - <%= render FormElements::FieldsetToggleComponent.new( - tag: "li", - enabled: Setting.lndhub_enabled?, - input_enabled: false, - title: "Enable LNDHub integration", - description: "LNDHub configuration present and wallet features enabled" - ) %> - <%= render FormElements::FieldsetToggleComponent.new( - tag: "li", - enabled: Setting.lndhub_admin_enabled?, - input_enabled: false, - title: "Enable LNDHub admin panel", - description: "LNDHub database configuration present and admin panel enabled" - ) %> -
+ <% if @errors && @errors.any? %> +
+ <%= render partial: "admin/settings/errors", locals: { errors: @errors } %> +
<% end %> -
+ +
+ <%= render partial: @service, locals: { f: f } %> +
+ +
+

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

+
+ <% end %> <% end %> diff --git a/app/views/icons/_x.html.erb b/app/views/icons/_x.html.erb index 7d5875c..d85f208 100644 --- a/app/views/icons/_x.html.erb +++ b/app/views/icons/_x.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 d675242..387cd9b 100644 --- a/app/views/shared/_admin_sidenav_settings.html.erb +++ b/app/views/shared/_admin_sidenav_settings.html.erb @@ -6,6 +6,9 @@ name: "Services", path: admin_settings_services_path, icon: "grid", active: current_page?(admin_settings_services_path) ) %> +<% if current_page?(admin_settings_services_path) %> + <%= render partial: "shared/admin_sidenav_settings_services" %> +<% end %> <%= render SidenavLinkComponent.new( name: "Security", path: "#", icon: "shield", disabled: true ) %> diff --git a/app/views/shared/_admin_sidenav_settings_services.html.erb b/app/views/shared/_admin_sidenav_settings_services.html.erb new file mode 100644 index 0000000..c897b6d --- /dev/null +++ b/app/views/shared/_admin_sidenav_settings_services.html.erb @@ -0,0 +1,49 @@ +<%= render SidenavLinkComponent.new( + level: 2, + name: "Discourse", + path: admin_settings_services_path(params: { s: "discourse" }), + icon: Setting.discourse_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "discourse" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "ejabberd", + path: admin_settings_services_path(params: { s: "ejabberd" }), + icon: Setting.ejabberd_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "ejabberd" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "Gitea", + path: admin_settings_services_path(params: { s: "gitea" }), + icon: Setting.gitea_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "gitea" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "LNDHub", + path: admin_settings_services_path(params: { s: "lndhub" }), + icon: Setting.lndhub_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "lndhub" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "Mastodon", + path: admin_settings_services_path(params: { s: "mastodon" }), + icon: Setting.mastodon_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "mastodon" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "MediaWiki", + path: admin_settings_services_path(params: { s: "mediawiki" }), + icon: Setting.mediawiki_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "mediawiki" })), +) %> +<%= render SidenavLinkComponent.new( + level: 2, + name: "Nostr", + path: admin_settings_services_path(params: { s: "nostr" }), + icon: Setting.nostr_enabled? ? "check" : "x", + active: current_page?(admin_settings_services_path(params: { s: "nostr" })), +) %> From fa56d6b77207e83b677afa9c617854870578eb50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 14:04:12 +0700 Subject: [PATCH 08/10] Refactor toggles to work without JS, add specs --- .../form_elements/fieldset_component.rb | 2 +- .../fieldset_toggle_component.html.erb | 7 +++-- .../form_elements/toggle_component.html.erb | 4 +-- .../form_elements/toggle_component.rb | 3 +- .../controllers/settings/toggle_controller.js | 9 ++++-- .../settings/services/_discourse.html.erb | 14 ++++----- .../settings/services/_ejabberd.html.erb | 24 +++++++-------- .../admin/settings/services/_gitea.html.erb | 14 ++++----- .../admin/settings/services/_lndhub.html.erb | 2 -- .../settings/services/_mastodon.html.erb | 14 ++++----- .../settings/services/_mediawiki.html.erb | 14 ++++----- spec/features/admin/settings_spec.rb | 29 +++++++++++++++++++ 12 files changed, 86 insertions(+), 50 deletions(-) diff --git a/app/components/form_elements/fieldset_component.rb b/app/components/form_elements/fieldset_component.rb index 04871cf..8896137 100644 --- a/app/components/form_elements/fieldset_component.rb +++ b/app/components/form_elements/fieldset_component.rb @@ -2,7 +2,7 @@ module FormElements class FieldsetComponent < ViewComponent::Base - def initialize(tag: "div", title:, description: nil) + def initialize(tag: "li", title:, description: nil) @tag = tag @title = title @descripton = description diff --git a/app/components/form_elements/fieldset_toggle_component.html.erb b/app/components/form_elements/fieldset_toggle_component.html.erb index e120f9d..504a5b5 100644 --- a/app/components/form_elements/fieldset_toggle_component.html.erb +++ b/app/components/form_elements/fieldset_toggle_component.html.erb @@ -11,13 +11,16 @@ <%= render FormElements::ToggleComponent.new( enabled: @enabled, input_enabled: @input_enabled, + class_names: @form.present? ? "hidden" : nil, data: { :'settings--toggle-target' => "button", action: "settings--toggle#toggleSwitch" }) %> <% if @form.present? %> - <%= @form.hidden_field @attribute, value: @enabled.to_s, - data: { :'settings--toggle-target' => "input" } %> + <%= @form.check_box @attribute, { + checked: @enabled, + data: { :'settings--toggle-target' => "checkbox" } + }, "true", "false" %> <% end %> <% end %> diff --git a/app/components/form_elements/toggle_component.html.erb b/app/components/form_elements/toggle_component.html.erb index 14f0a81..41a6708 100644 --- a/app/components/form_elements/toggle_component.html.erb +++ b/app/components/form_elements/toggle_component.html.erb @@ -1,8 +1,8 @@ -<%= button_tag type: "button", - data: @data, +<%= button_tag type: "button", name: "toggle", data: @data, role: "switch", aria: { checked: @enabled.to_s }, disabled: !@input_enabled, class: "#{ @enabled ? 'bg-blue-600' : 'bg-gray-200' } + #{ @class_names.present? ? @class_names : '' } relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 diff --git a/app/components/form_elements/toggle_component.rb b/app/components/form_elements/toggle_component.rb index d5ee036..d2f5eae 100644 --- a/app/components/form_elements/toggle_component.rb +++ b/app/components/form_elements/toggle_component.rb @@ -2,10 +2,11 @@ module FormElements class ToggleComponent < ViewComponent::Base - def initialize(enabled:, input_enabled: true, data: nil) + def initialize(enabled:, input_enabled: true, data: nil, class_names: nil) @enabled = !!enabled @input_enabled = input_enabled @data = data + @class_names = class_names end end end diff --git a/app/javascript/controllers/settings/toggle_controller.js b/app/javascript/controllers/settings/toggle_controller.js index 5c9cff1..587a4e0 100644 --- a/app/javascript/controllers/settings/toggle_controller.js +++ b/app/javascript/controllers/settings/toggle_controller.js @@ -1,12 +1,17 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { - static targets = [ "button", "switch", "input" ] + static targets = [ "button", "switch", "checkbox" ] static values = { switchEnabled: Boolean } + connect () { + this.buttonTarget.classList.remove("hidden") + this.checkboxTarget.classList.add("hidden") + } + toggleSwitch () { this.switchEnabledValue = !this.switchEnabledValue - this.inputTarget.value = this.switchEnabledValue.toString() + this.checkboxTarget.checked = this.switchEnabledValue if (this.switchEnabledValue) { this.buttonTarget.setAttribute("aria-checked", "true"); diff --git a/app/views/admin/settings/services/_discourse.html.erb b/app/views/admin/settings/services/_discourse.html.erb index 633fa7b..498dd5f 100644 --- a/app/views/admin/settings/services/_discourse.html.erb +++ b/app/views/admin/settings/services/_discourse.html.erb @@ -7,11 +7,11 @@ title: "Enable Discourse integration", description: "Discourse configuration present and features enabled" ) %> - -<% if Setting.discourse_enabled? %> - <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> - <%= f.text_field :discourse_public_url, - value: Setting.discourse_public_url, - class: "w-full", disabled: true %> + <% if Setting.discourse_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :discourse_public_url, + value: Setting.discourse_public_url, + class: "w-full", disabled: true %> + <% end %> <% end %> -<% end %> + diff --git a/app/views/admin/settings/services/_ejabberd.html.erb b/app/views/admin/settings/services/_ejabberd.html.erb index 93c5ff3..16dfc58 100644 --- a/app/views/admin/settings/services/_ejabberd.html.erb +++ b/app/views/admin/settings/services/_ejabberd.html.erb @@ -7,16 +7,16 @@ title: "Enable ejabberd integration", description: "ejabberd configuration present and features enabled" ) %> + <% if Setting.ejabberd_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "API URL") do %> + <%= f.text_field :ejabberd_api_url, + value: Setting.ejabberd_api_url, + class: "w-full", disabled: true %> + <% end %> + <%= render FormElements::FieldsetComponent.new(title: "Admin URL") do %> + <%= f.text_field :ejabberd_admin_url, + value: Setting.ejabberd_admin_url, + class: "w-full", disabled: true %> + <% end %> + <% end %> -<% if Setting.ejabberd_enabled? %> - <%= render FormElements::FieldsetComponent.new(title: "API URL") do %> - <%= f.text_field :ejabberd_api_url, - value: Setting.ejabberd_api_url, - class: "w-full", disabled: true %> - <% end %> - <%= render FormElements::FieldsetComponent.new(title: "Admin URL") do %> - <%= f.text_field :ejabberd_admin_url, - value: Setting.ejabberd_admin_url, - class: "w-full", disabled: true %> - <% end %> -<% end %> diff --git a/app/views/admin/settings/services/_gitea.html.erb b/app/views/admin/settings/services/_gitea.html.erb index 964185e..7c0238d 100644 --- a/app/views/admin/settings/services/_gitea.html.erb +++ b/app/views/admin/settings/services/_gitea.html.erb @@ -7,11 +7,11 @@ title: "Enable Gitea integration", description: "Gitea configuration present and features enabled" ) %> - -<% if Setting.gitea_enabled? %> - <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> - <%= f.text_field :gitea_public_url, - value: Setting.gitea_public_url, - class: "w-full", disabled: true %> + <% if Setting.gitea_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :gitea_public_url, + value: Setting.gitea_public_url, + class: "w-full", disabled: true %> + <% end %> <% end %> -<% end %> + diff --git a/app/views/admin/settings/services/_lndhub.html.erb b/app/views/admin/settings/services/_lndhub.html.erb index f65d0c3..e9d3c2e 100644 --- a/app/views/admin/settings/services/_lndhub.html.erb +++ b/app/views/admin/settings/services/_lndhub.html.erb @@ -10,7 +10,6 @@ <% if Setting.lndhub_enabled? %> <%= render FormElements::FieldsetComponent.new(title: "API URL") do %> <%= f.text_field :lndhub_api_url, - tag: "li", value: Setting.lndhub_api_url, class: "w-full", disabled: true %> <% end %> @@ -32,7 +31,6 @@ <% if Setting.lndhub_keysend_enabled? %> <%= render FormElements::FieldsetComponent.new(title: "Public key", description: "The public key of the Lightning node used by LNDHub") do %> <%= f.text_field :lndhub_public_key, - tag: "li", value: Setting.lndhub_public_key, class: "w-full", disabled: true %> <% end %> diff --git a/app/views/admin/settings/services/_mastodon.html.erb b/app/views/admin/settings/services/_mastodon.html.erb index d9dfdeb..1270860 100644 --- a/app/views/admin/settings/services/_mastodon.html.erb +++ b/app/views/admin/settings/services/_mastodon.html.erb @@ -7,11 +7,11 @@ title: "Enable Mastodon integration", description: "Mastodon configuration present and features enabled" ) %> - -<% if Setting.mastodon_enabled? %> - <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> - <%= f.text_field :mastodon_public_url, - value: Setting.mastodon_public_url, - class: "w-full", disabled: true %> + <% if Setting.mastodon_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :mastodon_public_url, + value: Setting.mastodon_public_url, + class: "w-full", disabled: true %> + <% end %> <% end %> -<% end %> + diff --git a/app/views/admin/settings/services/_mediawiki.html.erb b/app/views/admin/settings/services/_mediawiki.html.erb index cc032c1..2456f20 100644 --- a/app/views/admin/settings/services/_mediawiki.html.erb +++ b/app/views/admin/settings/services/_mediawiki.html.erb @@ -7,11 +7,11 @@ title: "Enable MediaWiki integration", description: "MediaWiki configuration present and features enabled" ) %> - -<% if Setting.mediawiki_enabled? %> - <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> - <%= f.text_field :mediawiki_public_url, - value: Setting.mediawiki_public_url, - class: "w-full", disabled: true %> + <% if Setting.mediawiki_enabled? %> + <%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> + <%= f.text_field :mediawiki_public_url, + value: Setting.mediawiki_public_url, + class: "w-full", disabled: true %> + <% end %> <% end %> -<% end %> + diff --git a/spec/features/admin/settings_spec.rb b/spec/features/admin/settings_spec.rb index bd586c7..7a394ba 100644 --- a/spec/features/admin/settings_spec.rb +++ b/spec/features/admin/settings_spec.rb @@ -18,4 +18,33 @@ RSpec.describe 'Admin/global settings', type: :feature do click_button "Save" expect(Setting.reserved_usernames).to eq(['Kosmos', 'Kredits']) end + + describe "Service settings" do + scenario "Opening service settings shows page for first service" do + visit admin_settings_services_path + + expect(current_url).to eq(admin_settings_services_url(params: { s: "discourse" })) + end + + scenario "View ejabberd settings" do + visit admin_settings_services_path(params: { s: "ejabberd" }) + + expect(page).to have_content("Enable ejabberd integration") + expect(page).to have_field("API URL", + with: "http://xmpp.example.com/api", + disabled: true) + end + + scenario "Disable ejabberd integration" do + visit admin_settings_services_path(params: { s: "ejabberd" }) + expect(page).to have_checked_field("setting[ejabberd_enabled]") + + uncheck "setting[ejabberd_enabled]" + click_button "Save" + + expect(current_url).to eq(admin_settings_services_url(params: { s: "ejabberd" })) + expect(page).to_not have_checked_field("setting[ejabberd_enabled]") + expect(page).to_not have_field("API URL", disabled: true) + end + end end From 8da297811b8a857e9a1501dd6fa07f8a7911bc3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 15:47:24 +0700 Subject: [PATCH 09/10] Mark settings as readonly, allow params for editable ones --- .../settings/registrations_controller.rb | 8 -------- .../admin/settings/services_controller.rb | 16 ---------------- app/controllers/admin/settings_controller.rb | 10 +++++++--- app/models/setting.rb | 19 +++++++++++-------- 4 files changed, 18 insertions(+), 35 deletions(-) diff --git a/app/controllers/admin/settings/registrations_controller.rb b/app/controllers/admin/settings/registrations_controller.rb index 976a570..1d888a5 100644 --- a/app/controllers/admin/settings/registrations_controller.rb +++ b/app/controllers/admin/settings/registrations_controller.rb @@ -1,5 +1,4 @@ class Admin::Settings::RegistrationsController < Admin::SettingsController - def index end @@ -10,11 +9,4 @@ class Admin::Settings::RegistrationsController < Admin::SettingsController success: "Settings saved" } end - - private - - def setting_params - params.require(:setting).permit(:reserved_usernames) - end - end diff --git a/app/controllers/admin/settings/services_controller.rb b/app/controllers/admin/settings/services_controller.rb index 85ea77d..54384c6 100644 --- a/app/controllers/admin/settings/services_controller.rb +++ b/app/controllers/admin/settings/services_controller.rb @@ -1,5 +1,4 @@ class Admin::Settings::ServicesController < Admin::SettingsController - def index @service = params[:s] @@ -17,19 +16,4 @@ class Admin::Settings::ServicesController < Admin::SettingsController success: "Settings saved" } end - - def setting_params - params.require(:setting).permit( - :discourse_enabled, - :ejabberd_enabled, - :gitea_enabled, - :lndhub_enabled, - :lndhub_admin_enabled, - :lndhub_keysend_enabled, - :mastodon_enabled, - :mediawiki_enabled, - :nostr_enabled, - ) - end - end diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 9c08229..8a168b1 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -30,7 +30,11 @@ class Admin::SettingsController < Admin::BaseController private - def set_current_section - @current_section = :settings - end + def set_current_section + @current_section = :settings + end + + def setting_params + params.require(:setting).permit(Setting.editable_keys.map(&:to_sym)) + end end diff --git a/app/models/setting.rb b/app/models/setting.rb index 389c6e1..56aa785 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -14,7 +14,7 @@ class Setting < RailsSettings::Base # Discourse # - field :discourse_public_url, type: :string, + field :discourse_public_url, type: :string, readonly: true, default: ENV["DISCOURSE_PUBLIC_URL"].presence field :discourse_enabled, type: :boolean, @@ -27,17 +27,20 @@ class Setting < RailsSettings::Base field :ejabberd_enabled, type: :boolean, default: (ENV["EJABBERD_API_URL"].present?.to_s || false) - field :ejabberd_api_url, type: :string, + field :ejabberd_api_url, type: :string, readonly: true, default: ENV["EJABBERD_API_URL"].presence - field :ejabberd_admin_url, type: :string, + field :ejabberd_admin_url, type: :string, readonly: true, default: ENV["EJABBERD_ADMIN_URL"].presence + field :ejabberd_buddy_roster, type: :string, + default: "Buddies" + # # Gitea # - field :gitea_public_url, type: :string, + field :gitea_public_url, type: :string, readonly: true, default: ENV["GITEA_PUBLIC_URL"].presence field :gitea_enabled, type: :boolean, @@ -47,7 +50,7 @@ class Setting < RailsSettings::Base # Lightning Network # - field :lndhub_api_url, type: :string, + field :lndhub_api_url, type: :string, readonly: true, default: ENV["LNDHUB_API_URL"].presence field :lndhub_enabled, type: :boolean, @@ -56,7 +59,7 @@ class Setting < RailsSettings::Base field :lndhub_admin_enabled, type: :boolean, default: (ENV["LNDHUB_ADMIN_UI"] || false) - field :lndhub_public_key, type: :string, + field :lndhub_public_key, type: :string, readonly: true, default: (ENV["LNDHUB_PUBLIC_KEY"] || "") field :lndhub_keysend_enabled, type: :boolean, @@ -66,7 +69,7 @@ class Setting < RailsSettings::Base # Mastodon # - field :mastodon_public_url, type: :string, + field :mastodon_public_url, type: :string, readonly: true, default: ENV["MASTODON_PUBLIC_URL"].presence field :mastodon_enabled, type: :boolean, @@ -76,7 +79,7 @@ class Setting < RailsSettings::Base # MediaWiki # - field :mediawiki_public_url, type: :string, + field :mediawiki_public_url, type: :string, readonly: true, default: ENV["MEDIAWIKI_PUBLIC_URL"].presence field :mediawiki_enabled, type: :boolean, From 8d90847896f8354150178907969ff95525ccf683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 15 Mar 2023 15:48:27 +0700 Subject: [PATCH 10/10] Add setting for contact roster name And only exchange contacts when ejabberd integration is enabled --- app/jobs/xmpp_exchange_contacts_job.rb | 4 ++-- app/services/create_account.rb | 2 +- app/views/admin/settings/services/_ejabberd.html.erb | 8 ++++++++ spec/jobs/xmpp_exchange_contacts_job_spec.rb | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/jobs/xmpp_exchange_contacts_job.rb b/app/jobs/xmpp_exchange_contacts_job.rb index 01f64f1..50f6fa2 100644 --- a/app/jobs/xmpp_exchange_contacts_job.rb +++ b/app/jobs/xmpp_exchange_contacts_job.rb @@ -7,12 +7,12 @@ class XmppExchangeContactsJob < ApplicationJob ejabberd.add_rosteritem({ "localuser": username, "localhost": domain, "user": inviter.cn, "host": inviter.ou, - "nick": inviter.cn, "group": "Friends", "subs": "both" + "nick": inviter.cn, "group": Setting.ejabberd_buddy_roster, "subs": "both" }) ejabberd.add_rosteritem({ "localuser": inviter.cn, "localhost": inviter.ou, "user": username, "host": domain, - "nick": username, "group": "Friends", "subs": "both" + "nick": username, "group": Setting.ejabberd_buddy_roster, "subs": "both" }) end end diff --git a/app/services/create_account.rb b/app/services/create_account.rb index c5cb69a..bc05e50 100644 --- a/app/services/create_account.rb +++ b/app/services/create_account.rb @@ -15,7 +15,7 @@ class CreateAccount < ApplicationService if @invitation.present? update_invitation(user.id) - exchange_xmpp_contacts + exchange_xmpp_contacts if Setting.ejabberd_enabled end end diff --git a/app/views/admin/settings/services/_ejabberd.html.erb b/app/views/admin/settings/services/_ejabberd.html.erb index 16dfc58..46e3ca6 100644 --- a/app/views/admin/settings/services/_ejabberd.html.erb +++ b/app/views/admin/settings/services/_ejabberd.html.erb @@ -18,5 +18,13 @@ value: Setting.ejabberd_admin_url, class: "w-full", disabled: true %> <% end %> + <%= render FormElements::FieldsetComponent.new( + title: "Contact roster name", + description: "Used when exchanging contacts after signup from invitation" + ) do %> + <%= f.text_field :ejabberd_buddy_roster, + value: Setting.ejabberd_buddy_roster, + class: "w-full" %> + <% end %> <% end %> diff --git a/spec/jobs/xmpp_exchange_contacts_job_spec.rb b/spec/jobs/xmpp_exchange_contacts_job_spec.rb index 0064b69..f7732dc 100644 --- a/spec/jobs/xmpp_exchange_contacts_job_spec.rb +++ b/spec/jobs/xmpp_exchange_contacts_job_spec.rb @@ -17,9 +17,9 @@ RSpec.describe XmppExchangeContactsJob, type: :job do perform_enqueued_jobs { job } expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") - .with { |req| req.body == '{"localuser":"isaacnewton","localhost":"kosmos.org","user":"willherschel","host":"kosmos.org","nick":"willherschel","group":"Friends","subs":"both"}' } + .with { |req| req.body == '{"localuser":"isaacnewton","localhost":"kosmos.org","user":"willherschel","host":"kosmos.org","nick":"willherschel","group":"Buddies","subs":"both"}' } expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") - .with { |req| req.body == '{"localuser":"willherschel","localhost":"kosmos.org","user":"isaacnewton","host":"kosmos.org","nick":"isaacnewton","group":"Friends","subs":"both"}' } + .with { |req| req.body == '{"localuser":"willherschel","localhost":"kosmos.org","user":"isaacnewton","host":"kosmos.org","nick":"isaacnewton","group":"Buddies","subs":"both"}' } end after do