mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-21 22:29:38 +02:00
Update self host settings page styles (#677)
* Update page styles * Add new styles to self host settings page * Update self hosting page title
This commit is contained in:
parent
da5021b6b0
commit
8ea7b54fe8
10 changed files with 153 additions and 46 deletions
|
@ -48,6 +48,10 @@
|
||||||
@apply disabled:opacity-50;
|
@apply disabled:opacity-50;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-field__radio {
|
||||||
|
@apply text-gray-900;
|
||||||
|
}
|
||||||
|
|
||||||
.form-field__submit {
|
.form-field__submit {
|
||||||
@apply w-full p-3 text-center text-white bg-black rounded-lg hover:bg-gray-700;
|
@apply w-full p-3 text-center text-white bg-black rounded-lg hover:bg-gray-700;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Settings::HostingsController < ApplicationController
|
||||||
redirect_to settings_hosting_path, notice: t(".success")
|
redirect_to settings_hosting_path, notice: t(".success")
|
||||||
else
|
else
|
||||||
flash.now[:error] = @errors.first.message
|
flash.now[:error] = @errors.first.message
|
||||||
render :edit, status: :unprocessable_entity
|
render :show, status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ class Settings::HostingsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if hosting_params[:upgrades_mode] == "auto" && hosting_params[:render_deploy_hook].blank?
|
if hosting_params[:upgrades_mode] != "manual" && hosting_params[:render_deploy_hook].blank?
|
||||||
@errors.add(:render_deploy_hook, t("settings.hostings.update.render_deploy_hook_error"))
|
@errors.add(:render_deploy_hook, t("settings.hostings.update.render_deploy_hook_error"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,7 +37,13 @@ class Settings::HostingsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def hosting_params
|
def hosting_params
|
||||||
params.require(:setting).permit(:render_deploy_hook, :upgrades_mode, :upgrades_target)
|
permitted_params = params.require(:setting).permit(:render_deploy_hook, :upgrades_mode)
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
result[:upgrades_mode] = permitted_params[:upgrades_mode] == "manual" ? "manual" : "auto" if permitted_params.key?(:upgrades_mode)
|
||||||
|
result[:render_deploy_hook] = permitted_params[:render_deploy_hook] if permitted_params.key?(:render_deploy_hook)
|
||||||
|
result[:upgrades_target] = permitted_params[:upgrades_mode] unless permitted_params[:upgrades_mode] == "manual" if permitted_params.key?(:upgrades_mode)
|
||||||
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
def verify_hosting_mode
|
def verify_hosting_mode
|
||||||
|
|
|
@ -56,6 +56,11 @@ class ApplicationFormBuilder < ActionView::Helpers::FormBuilder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def radio_button(method, tag_value, options = {})
|
||||||
|
default_options = { class: "form-field__radio" }
|
||||||
|
merged_options = default_options.merge(options)
|
||||||
|
super(method, tag_value, merged_options)
|
||||||
|
end
|
||||||
|
|
||||||
def grouped_select(method, grouped_choices, options = {}, html_options = {})
|
def grouped_select(method, grouped_choices, options = {}, html_options = {})
|
||||||
default_options = { class: "form-field__input" }
|
default_options = { class: "form-field__input" }
|
||||||
|
|
|
@ -10,13 +10,17 @@ export default class extends Controller {
|
||||||
|
|
||||||
connect() {
|
connect() {
|
||||||
this.autoTargets.forEach((element) => {
|
this.autoTargets.forEach((element) => {
|
||||||
element.addEventListener(this.triggerEventValue, this.handleInput);
|
const event =
|
||||||
|
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
|
||||||
|
element.addEventListener(event, this.handleInput);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnect() {
|
disconnect() {
|
||||||
this.autoTargets.forEach((element) => {
|
this.autoTargets.forEach((element) => {
|
||||||
element.removeEventListener(this.triggerEventValue, this.handleInput);
|
const event =
|
||||||
|
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
|
||||||
|
element.removeEventListener(event, this.handleInput);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="flex justify-between gap-4">
|
<div class="flex justify-between gap-4">
|
||||||
<% if self_hosted? %>
|
<% if self_hosted? %>
|
||||||
<%= previous_setting("Self Hosting", settings_hosting_path) %>
|
<%= previous_setting("Self-Hosting", settings_hosting_path) %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= previous_setting("Billing", settings_billing_path) %>
|
<%= previous_setting("Billing", settings_billing_path) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<div class="flex justify-between gap-4">
|
<div class="flex justify-between gap-4">
|
||||||
<%= previous_setting("Security", settings_security_path) %>
|
<%= previous_setting("Security", settings_security_path) %>
|
||||||
<% if self_hosted? %>
|
<% if self_hosted? %>
|
||||||
<%= next_setting("Self Hosting", settings_hosting_path) %>
|
<%= next_setting("Self-Hosting", settings_hosting_path) %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= next_setting("Accounts", accounts_path) %>
|
<%= next_setting("Accounts", accounts_path) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -2,43 +2,78 @@
|
||||||
<%= render "settings/nav" %>
|
<%= render "settings/nav" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<h1 class="text-3xl font-semibold font-display">Self Hosting</h1>
|
<h1 class="text-gray-900 text-xl font-medium mb-4"><%= t(".page_title") %></h1>
|
||||||
<hr>
|
<%= settings_section title: t(".general_settings_title") do %>
|
||||||
<%= form_with model: Setting.new, url: settings_hosting_path, method: :patch, local: true, html: { class: "space-y-4" } do |form| %>
|
<%= form_with model: Setting.new, url: settings_hosting_path, method: :patch, local: true, html: { class: "space-y-6", data: { controller: "auto-submit-form", "auto-submit-form-trigger-event-value" => "blur" } } do |form| %>
|
||||||
<section class="space-y-3">
|
<div>
|
||||||
<h2 class="text-2xl font-semibold">Render Deploy Hook</h2>
|
<h2 class="font-medium mb-1"><%= t(".upgrades.title") %></h2>
|
||||||
<p class="text-gray-500">You must fill this in so your app can trigger upgrades when Maybe releases upgrades. Learn more about deploy hooks and how they work in the <%= link_to "Render documentation", "https://docs.render.com/docs/deploy-hooks", target: "_blank", rel: "noopener noreferrer", class: "text-blue-500 hover:underline" %>.</p>
|
<p class="text-gray-500 text-sm mb-4"><%= t(".upgrades.description") %></p>
|
||||||
<%= form.url_field :render_deploy_hook, label: "Render Deploy Hook", placeholder: "https://api.render.com/deploy/srv-xyz...", value: Setting.render_deploy_hook %>
|
<div class="space-y-4">
|
||||||
</section>
|
<div class="flex items-center gap-4">
|
||||||
<section class="space-y-3">
|
<%= form.radio_button :upgrades_mode, "manual", checked: Setting.upgrades_mode == "manual", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %>
|
||||||
<h2 class="text-2xl font-semibold">Auto Upgrades Setting</h2>
|
<%= form.label :upgrades_mode_manual, t(".upgrades.manual.title"), class: "text-gray-900 text-sm" do %>
|
||||||
<p class="text-gray-500">This setting controls how often your self hosted app will update and what method it uses to do so.</p>
|
<span class="font-medium"><%= t(".upgrades.manual.title") %></span>
|
||||||
<div class="space-y-2">
|
<br>
|
||||||
<div class="flex items-center gap-2">
|
<span class="text-gray-500">
|
||||||
<%= form.check_box :upgrades_mode, { checked: Setting.upgrades_mode == "auto", unchecked_value: "manual" }, "auto", "manual" %>
|
<%= t(".upgrades.manual.description") %>
|
||||||
<%= form.label :upgrades_mode, "Enable auto upgrades", class: "text-gray-900" %>
|
</span>
|
||||||
</div>
|
|
||||||
<% if Setting.upgrades_mode == "auto" %>
|
|
||||||
<div class="flex items-center gap-2">
|
|
||||||
<%= form.radio_button :upgrades_target, "release", checked: Setting.upgrades_target == "release" %>
|
|
||||||
<%= form.label :upgrades_target_release, class: Setting.upgrades_target == "release" ? "text-gray-900" : "text-gray-500" do %>
|
|
||||||
<span class="font-semibold">Latest Release (suggested)</span> - you will automatically be upgraded to the latest stable release of Maybe
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-4">
|
||||||
<%= form.radio_button :upgrades_target, "commit", checked: Setting.upgrades_target == "commit" %>
|
<%= form.radio_button :upgrades_mode, "release", checked: Setting.upgrades_mode == "auto" && Setting.upgrades_target == "release", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %>
|
||||||
<%= form.label :upgrades_target_commit, class: Setting.upgrades_target == "commit" ? "text-gray-900" : "text-gray-500" do %>
|
<%= form.label :upgrades_mode_release, t(".upgrades.latest_release.title"), class: "text-gray-900 text-sm" do %>
|
||||||
<span class="font-semibold">Latest Commit</span> - you will automatically be upgraded any time the Maybe repo is updated
|
<span class="font-medium"><%= t(".upgrades.latest_release.title") %></span>
|
||||||
|
<br>
|
||||||
|
<span class="text-gray-500">
|
||||||
|
<%= t(".upgrades.latest_release.description") %>
|
||||||
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<%= form.radio_button :upgrades_mode, "commit", checked: Setting.upgrades_mode == "auto" && Setting.upgrades_target == "commit", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %>
|
||||||
|
<%= form.label :upgrades_mode_commit, t(".upgrades.latest_commit.title"), class: "text-gray-900 text-sm" do %>
|
||||||
|
<span class="font-medium"><%= t(".upgrades.latest_commit.title") %></span>
|
||||||
|
<br>
|
||||||
|
<span class="text-gray-500">
|
||||||
|
<%= t(".upgrades.latest_commit.description") %>
|
||||||
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
|
||||||
<div class="fixed right-5 bottom-5">
|
|
||||||
<button type="submit" class="flex items-center justify-center w-12 h-12 mb-2 bg-black rounded-full shrink-0 grow-0 hover:bg-gray-600">
|
|
||||||
<%= inline_svg_tag("icn-check.svg", class: "text-white fill-current") %>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 class="font-medium mb-1"><%= t(".provider_settings.title") %></h2>
|
||||||
|
<p class="text-gray-500 text-sm mb-4"><%= t(".render_deploy_hook_description") %></p>
|
||||||
|
<%= form.url_field :render_deploy_hook, label: t(".render_deploy_hook_label"), placeholder: t(".render_deploy_hook_placeholder"), value: Setting.render_deploy_hook, data: { "auto-submit-form-target" => "auto" } %>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 class="font-medium mb-1"><%= t(".smtp_settings.title") %></h2>
|
||||||
|
<p class="text-gray-500 text-sm mb-4"><%= t(".smtp_settings.description") %></p>
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div class="space-y-3">
|
||||||
|
<%= form.text_field :smtp_domain, disabled: true, label: t(".smtp_settings.domain"), placeholder: t(".smtp_settings.domain_placeholder") %>
|
||||||
|
<%= form.text_field :smtp_host, disabled: true, label: t(".smtp_settings.host"), placeholder: t(".smtp_settings.host_placeholder") %>
|
||||||
|
<%= form.number_field :smtp_port, disabled: true, label: t(".smtp_settings.port"), placeholder: t(".smtp_settings.port_placeholder") %>
|
||||||
|
<%= form.text_field :smtp_username, disabled: true, label: t(".smtp_settings.username"), placeholder: t(".smtp_settings.username_placeholder") %>
|
||||||
|
<%= form.password_field :smtp_password, disabled: true, label: t(".smtp_settings.password"), placeholder: t(".smtp_settings.password_placeholder") %>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center justify-between bg-white border border-alpha-black-100 p-4 rounded-lg">
|
||||||
|
<div class="flex items-center gap-3">
|
||||||
|
<div class="w-10 h-10 rounded-full bg-gray-25 flex items-center justify-center">
|
||||||
|
<%= lucide_icon "mails", class: "w-6 h-6 text-gray-500" %>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="text-gray-900 font-medium text-sm"><%= t(".smtp_settings.send_test_email") %></p>
|
||||||
|
<p class="text-gray-500 text-sm"><%= t(".smtp_settings.send_test_email_description") %></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" class="bg-gray-50 text-gray-900 text-sm font-medium rounded-lg px-3 py-2 cursor-not-allowed" disabled><%= t(".smtp_settings.send_test_email_button") %></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="flex justify-between gap-4">
|
<div class="flex justify-between gap-4">
|
||||||
<%= previous_setting("Billing", settings_billing_path) %>
|
<%= previous_setting("Billing", settings_billing_path) %>
|
||||||
|
|
|
@ -2,6 +2,43 @@
|
||||||
en:
|
en:
|
||||||
settings:
|
settings:
|
||||||
hostings:
|
hostings:
|
||||||
|
show:
|
||||||
|
general_settings_title: General Settings
|
||||||
|
page_title: Self-Hosting
|
||||||
|
provider_settings:
|
||||||
|
title: Provider Settings
|
||||||
|
render_deploy_hook_description: Input the deploy hook URL provided by Render
|
||||||
|
render_deploy_hook_label: Render Deploy Hook URL
|
||||||
|
render_deploy_hook_placeholder: https://api.render.com/deploy/srv-xyz...
|
||||||
|
smtp_settings:
|
||||||
|
description: Configure outgoing mail server settings for notifications and
|
||||||
|
alerts
|
||||||
|
domain: App Domain
|
||||||
|
domain_placeholder: mydomain.com
|
||||||
|
host: SMTP Host
|
||||||
|
host_placeholder: smtp.gmail.com
|
||||||
|
password: Password
|
||||||
|
password_placeholder: "*******"
|
||||||
|
port: Port
|
||||||
|
port_placeholder: 587
|
||||||
|
send_test_email: Send Test Email
|
||||||
|
send_test_email_button: Send Test Email
|
||||||
|
send_test_email_description: Verify SMTP settings by sending a test email
|
||||||
|
title: SMTP Email Configuration (coming soon...)
|
||||||
|
username: Username
|
||||||
|
username_placeholder: username@gmail.com
|
||||||
|
upgrades:
|
||||||
|
description: Choose how your application receives updates
|
||||||
|
latest_commit:
|
||||||
|
description: Automatically update to the latest commit (unstable)
|
||||||
|
title: Latest Commit
|
||||||
|
latest_release:
|
||||||
|
description: Automatically update to the most recent release (stable)
|
||||||
|
title: Latest Release
|
||||||
|
manual:
|
||||||
|
description: You control when to download and install updates
|
||||||
|
title: Manual
|
||||||
|
title: Auto upgrade
|
||||||
update:
|
update:
|
||||||
render_deploy_hook_error: Render deploy hook must be provided to enable auto
|
render_deploy_hook_error: Render deploy hook must be provided to enable auto
|
||||||
upgrades
|
upgrades
|
||||||
|
@ -18,7 +55,7 @@ en:
|
||||||
profile_label: Account
|
profile_label: Account
|
||||||
rules_label: Rules
|
rules_label: Rules
|
||||||
security_label: Security
|
security_label: Security
|
||||||
self_hosting_label: Self Hosting
|
self_hosting_label: Self-Hosting
|
||||||
whats_new_label: What's New
|
whats_new_label: What's New
|
||||||
nav_link_large:
|
nav_link_large:
|
||||||
next: Next
|
next: Next
|
||||||
|
|
|
@ -28,4 +28,20 @@ class Settings::HostingsControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
|
||||||
assert_equal NEW_RENDER_DEPLOY_HOOK, Setting.render_deploy_hook
|
assert_equal NEW_RENDER_DEPLOY_HOOK, Setting.render_deploy_hook
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "cannot set auto upgrades mode without a deploy hook" do
|
||||||
|
patch settings_hosting_url, params: { setting: { upgrades_mode: "auto" } }
|
||||||
|
assert_response :unprocessable_entity
|
||||||
|
end
|
||||||
|
|
||||||
|
test "can choose auto upgrades mode with a deploy hook" do
|
||||||
|
NEW_RENDER_DEPLOY_HOOK = "https://api.render.com/deploy/srv-abc123"
|
||||||
|
assert_nil Setting.render_deploy_hook
|
||||||
|
|
||||||
|
patch settings_hosting_url, params: { setting: { render_deploy_hook: NEW_RENDER_DEPLOY_HOOK, upgrades_mode: "release" } }
|
||||||
|
|
||||||
|
assert_equal "auto", Setting.upgrades_mode
|
||||||
|
assert_equal "release", Setting.upgrades_target
|
||||||
|
assert_equal NEW_RENDER_DEPLOY_HOOK, Setting.render_deploy_hook
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -42,7 +42,7 @@ class SettingsTest < ApplicationSystemTestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
# Conditional nav items don't show by default
|
# Conditional nav items don't show by default
|
||||||
assert_no_text "Self Hosting"
|
assert_no_text "Self-Hosting"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "can see conditional nav items" do
|
test "can see conditional nav items" do
|
||||||
|
@ -50,8 +50,8 @@ class SettingsTest < ApplicationSystemTestCase
|
||||||
|
|
||||||
open_settings_from_sidebar
|
open_settings_from_sidebar
|
||||||
|
|
||||||
click_link "Self Hosting"
|
click_link "Self-Hosting"
|
||||||
assert_selector "h1", text: "Self Hosting"
|
assert_selector "h1", text: "Self-Hosting"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "clicking back or hitting escape key takes user back page they opened settings from" do
|
test "clicking back or hitting escape key takes user back page they opened settings from" do
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue