diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1d1389487..7306d504f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,7 +2,7 @@ class ApplicationController < ActionController::Base include RestoreLayoutPreferences, Onboardable, Localize, AutoSync, Authentication, Invitable, SelfHostable, StoreLocation, Impersonatable, Breadcrumbable, FeatureGuardable, Notifiable, SafePagination, AccountAuthorizable, - BetaGateable + PreviewGateable include Pundit::Authorization include Pagy::Backend diff --git a/app/controllers/concerns/beta_gateable.rb b/app/controllers/concerns/beta_gateable.rb deleted file mode 100644 index 4268baaa6..000000000 --- a/app/controllers/concerns/beta_gateable.rb +++ /dev/null @@ -1,20 +0,0 @@ -module BetaGateable - extend ActiveSupport::Concern - - included do - helper_method :beta_features_enabled? - end - - def beta_features_enabled? - Current.user&.beta_features_enabled? == true - end - - # Use as a `before_action` on controllers that gate a beta feature. - # Redirects non-beta users to the dashboard with a flash explaining the - # feature is opt-in. Self-served via Settings → Preferences. - def require_beta_features! - return if beta_features_enabled? - - redirect_to root_path, alert: I18n.t("beta.not_enabled") - end -end diff --git a/app/controllers/concerns/preview_gateable.rb b/app/controllers/concerns/preview_gateable.rb new file mode 100644 index 000000000..7ae25ce8f --- /dev/null +++ b/app/controllers/concerns/preview_gateable.rb @@ -0,0 +1,20 @@ +module PreviewGateable + extend ActiveSupport::Concern + + included do + helper_method :preview_features_enabled? + end + + def preview_features_enabled? + Current.user&.preview_features_enabled? == true + end + + # Use as a `before_action` on controllers that gate a preview feature. + # Redirects users without preview access to the dashboard with a flash + # explaining the feature is opt-in. Self-served via Settings → Preferences. + def require_preview_features! + return if preview_features_enabled? + + redirect_to root_path, alert: I18n.t("preview.not_enabled") + end +end diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index d5bf9d75a..5798c573e 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -11,11 +11,14 @@ class Settings::PreferencesController < ApplicationController # UsersController#update flow (which expects a full user form payload). def update @user = Current.user + user_params = params.permit(user: [ :preview_features_enabled ]).fetch(:user, {}) + @user.transaction do @user.lock! updated_prefs = (@user.preferences || {}).deep_dup - if params.dig(:user, :beta_features_enabled) - updated_prefs["beta_features_enabled"] = params.dig(:user, :beta_features_enabled) == "1" + if user_params.key?(:preview_features_enabled) + updated_prefs["preview_features_enabled"] = + ActiveModel::Type::Boolean.new.cast(user_params[:preview_features_enabled]) end @user.update!(preferences: updated_prefs) end diff --git a/app/models/user.rb b/app/models/user.rb index bcaa1446b..b1c40bb76 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -365,8 +365,8 @@ class User < ApplicationRecord preferences&.dig("dashboard_two_column") == true end - def beta_features_enabled? - preferences&.dig("beta_features_enabled") == true + def preview_features_enabled? + preferences&.dig("preview_features_enabled") == true end def update_transactions_preferences(prefs) diff --git a/app/views/settings/preferences/show.html.erb b/app/views/settings/preferences/show.html.erb index 6c5410fbf..67c04b44a 100644 --- a/app/views/settings/preferences/show.html.erb +++ b/app/views/settings/preferences/show.html.erb @@ -207,26 +207,26 @@ <% end %> <% end %> -<%# Beta features toggle — visible to all users, not just admins. Lives at the - bottom of Preferences as a standalone card (no section header) so the toggle - row is the entire surface. Posts directly to settings#preferences#update via - the Settings::PreferencesController, matching the auto-submit pattern used - on the Appearance page. %> +<%# Preview features toggle — visible to all users, not just admins. Lives at + the bottom of Preferences as a standalone card (no section header) so the + toggle row is the entire surface. Posts directly to + settings#preferences#update via the Settings::PreferencesController, + matching the auto-submit pattern used on the Appearance page. %>
<%= form_with url: settings_preferences_path, method: :patch, data: { controller: "auto-submit-form" } do |f| %> <%# Wrapping the row in