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" })),
+) %>