diff --git a/app/controllers/settings/flavours_controller.rb b/app/controllers/settings/flavours_controller.rb new file mode 100644 index 000000000..865d5a479 --- /dev/null +++ b/app/controllers/settings/flavours_controller.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class Settings::FlavoursController < Settings::BaseController + + def index + redirect_to action: 'show', flavour: current_flavour + end + + def show + unless Themes.instance.flavours.include?(params[:flavour]) or params[:flavour] == current_flavour + redirect_to action: 'show', flavour: current_flavour + end + + @listing = Themes.instance.flavours + @selected = params[:flavour] + end + + def update + user_settings.update(user_settings_params(params[:flavour]).to_h) + redirect_to action: 'show', flavour: params[:flavour] + end + + private + + def user_settings + UserSettingsDecorator.new(current_user) + end + + def user_settings_params(flavour) + params.require(:user).merge({ setting_flavour: flavour }).permit( + :setting_flavour, + :setting_skin + ) + end +end diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 9177d37da..7cd1abe0c 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -39,8 +39,6 @@ class Settings::PreferencesController < Settings::BaseController :setting_reduce_motion, :setting_system_font_ui, :setting_noindex, - :setting_flavour, - :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) ) diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index ada5fba2b..c9edcf197 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -37,7 +37,3 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); - -delegate(document, '#user_setting_flavour, #user_setting_skin', 'change', ({ target }) => { - target.form.submit(); -}); diff --git a/app/javascript/flavours/glitch/names.yml b/app/javascript/flavours/glitch/names.yml index b3d579cb2..ef82abed2 100644 --- a/app/javascript/flavours/glitch/names.yml +++ b/app/javascript/flavours/glitch/names.yml @@ -1,6 +1,8 @@ en: flavours: - glitch: Glitch Edition + glitch: + description: The default flavour for GlitchSoc instances. + name: Glitch Edition skins: glitch: default: Default diff --git a/app/javascript/flavours/vanilla/names.yml b/app/javascript/flavours/vanilla/names.yml index 8816fcb3a..94326f6ee 100644 --- a/app/javascript/flavours/vanilla/names.yml +++ b/app/javascript/flavours/vanilla/names.yml @@ -1,6 +1,8 @@ en: flavours: - vanilla: Vanilla Mastodon + vanilla: + description: The theme used by vanilla Mastodon instances. This theme might not support all of the features of GlitchSoc. + name: Vanilla Mastodon skins: vanilla: default: Default diff --git a/app/views/settings/flavours/show.html.haml b/app/views/settings/flavours/show.html.haml new file mode 100644 index 000000000..488fd2d15 --- /dev/null +++ b/app/views/settings/flavours/show.html.haml @@ -0,0 +1,16 @@ +- content_for :page_title do + = t "flavours.#{@selected}.name", default: @selected + += simple_form_for current_user, url: settings_flavour_path(@selected), html: { method: :put } do |f| + = render 'shared/error_messages', object: current_user + + .flavour-description + = t "flavours.#{@selected}.description", default: '' + + %hr/ + + .fields-group + = f.input :setting_skin, collection: Themes.instance.skins_for(@selected), label_method: lambda { |skin| I18n.t("skins.#{@selected}.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false + + .actions + = f.button :button, t('generic.use_this'), type: :submit diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 45a3b2eb0..d1459d93c 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -26,10 +26,6 @@ %h4= t 'preferences.web' .fields-group - - if Themes.instance.flavours.size > 1 - = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("flavours.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("skins.#{current_flavour}.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false - = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label = f.input :setting_favourite_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/en.yml b/config/locales/en.yml index c8acc237a..804f9b199 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -424,6 +424,7 @@ en: changes_saved_msg: Changes successfully saved! powered_by: powered by %{link} save_changes: Save changes + use_this: Use this validation_errors: one: Something isn't quite right yet! Please review the error below other: Something isn't quite right yet! Please review %{count} errors below @@ -587,6 +588,7 @@ en: development: Development edit_profile: Edit profile export: Data export + flavours: Flavours followers: Authorized followers import: Import keyword_mutes: Muted keywords diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 1722eea7b..aa6940e91 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -13,7 +13,6 @@ en: note: one: 1 character left other: %{count} characters left - setting_flavour: Affects how Mastodon looks when you're logged in from any device setting_noindex: Affects your public profile and status pages setting_skin: Reskins the selected Mastodon flavour imports: @@ -47,7 +46,6 @@ en: setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot setting_favourite_modal: Show confirmation dialog before favouriting - setting_flavour: Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_skin: Skin diff --git a/config/navigation.rb b/config/navigation.rb index 3f4c00dfa..b08b1769d 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -17,6 +17,12 @@ SimpleNavigation::Configuration.run do |navigation| settings.item :follower_domains, safe_join([fa_icon('users fw'), t('settings.followers')]), settings_follower_domains_url end + primary.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours| + Themes.instance.flavours.each do |flavour| + flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_url(flavour) + end + end + primary.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' } primary.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url do |development| diff --git a/config/routes.rb b/config/routes.rb index a41e76c2c..75b9c2d58 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -102,6 +102,8 @@ Rails.application.routes.draw do end end + resources :flavours, only: [:index, :show, :update], param: :flavour + resource :delete, only: [:show, :destroy] resource :migration, only: [:show, :update] @@ -240,7 +242,7 @@ Rails.application.routes.draw do resources :media, only: [:create, :update] resources :blocks, only: [:index] resources :mutes, only: [:index] do - collection do + collection do get 'details' end end