diff --git a/app/assets/stylesheets/admin/machine_learning/setting.scss b/app/assets/stylesheets/admin/machine_learning/setting.scss index f9afcc079..3bf902365 100644 --- a/app/assets/stylesheets/admin/machine_learning/setting.scss +++ b/app/assets/stylesheets/admin/machine_learning/setting.scss @@ -9,46 +9,6 @@ } } - [aria-pressed] { - @include regular-button; - border-radius: $line-height; - font-weight: bold; - min-width: rem-calc(100); - position: relative; - - &::after { - background: $white; - border-radius: 100%; - content: ""; - display: block; - height: 1.75em; - position: absolute; - transform: translateY(-50%); - top: 50%; - width: 1.75em; - } - - &[aria-pressed=true] { - background: $primary-color; - padding-right: 2.5em; - text-align: left; - - &::after { - right: 0.5em; - } - } - - &[aria-pressed=false] { - background: $dark-gray; - padding-left: 2.5em; - text-align: right; - - &::after { - left: 0.5em; - } - } - } - dl { @include callout-size(map-get($callout-sizes, small)); } diff --git a/app/assets/stylesheets/admin/settings/featured_settings_form.scss b/app/assets/stylesheets/admin/settings/featured_settings_form.scss new file mode 100644 index 000000000..c002824d5 --- /dev/null +++ b/app/assets/stylesheets/admin/settings/featured_settings_form.scss @@ -0,0 +1,6 @@ +.admin .featured-settings-form { + + [aria-pressed] { + @include switch; + } +} diff --git a/app/assets/stylesheets/admin/settings/featured_settings_table.scss b/app/assets/stylesheets/admin/settings/featured_settings_table.scss new file mode 100644 index 000000000..ef0df6709 --- /dev/null +++ b/app/assets/stylesheets/admin/settings/featured_settings_table.scss @@ -0,0 +1,6 @@ +.admin .featured-settings-table { + + td { + max-width: $global-width / 3; + } +} diff --git a/app/assets/stylesheets/mixins/buttons.scss b/app/assets/stylesheets/mixins/buttons.scss index ff69c30e8..b5e1aee6c 100644 --- a/app/assets/stylesheets/mixins/buttons.scss +++ b/app/assets/stylesheets/mixins/buttons.scss @@ -40,3 +40,43 @@ text-decoration: underline; } } + +@mixin switch { + @include regular-button; + border-radius: $line-height; + font-weight: bold; + min-width: rem-calc(100); + position: relative; + + &::after { + background: $white; + border-radius: 100%; + content: ""; + display: block; + height: 1.75em; + position: absolute; + transform: translateY(-50%); + top: 50%; + width: 1.75em; + } + + &[aria-pressed=true] { + background: $primary-color; + padding-right: 2.5em; + text-align: left; + + &::after { + right: 0.5em; + } + } + + &[aria-pressed=false] { + background: $dark-gray; + padding-left: 2.5em; + text-align: right; + + &::after { + left: 0.5em; + } + } +} diff --git a/app/components/admin/machine_learning/setting_component.html.erb b/app/components/admin/machine_learning/setting_component.html.erb index 5509c1040..c9ac35348 100644 --- a/app/components/admin/machine_learning/setting_component.html.erb +++ b/app/components/admin/machine_learning/setting_component.html.erb @@ -1,19 +1,12 @@
-

<%= t("admin.machine_learning.#{kind}") %>

+

<%= t("admin.machine_learning.#{kind}") %>

-

<%= t("admin.machine_learning.#{kind}_description") %>

+

<%= t("admin.machine_learning.#{kind}_description") %>

<% if ml_info.present? %> - <%= form_for(setting, url: admin_setting_path(setting), method: :put) do |f| %> - <%= f.hidden_field :tab, value: "#settings", id: "setting_tab_#{kind}" %> - <%= f.hidden_field :value, value: (setting.enabled? ? "" : "active"), id: "setting_value_#{kind}" %> - <%= f.button(t("shared.#{setting.enabled? ? "yes" : "no"}"), - "aria-labelledby": "machine_learning_#{kind}", - "aria-describedby": "machine_learning_#{kind}_description", - "aria-pressed": setting.enabled?) %> - <% end %> + <%= render Admin::Settings::FeaturedSettingsFormComponent.new(setting, tab: "#settings") %>
<%= t("admin.machine_learning.last_execution") %>
diff --git a/app/components/admin/settings/featured_settings_form_component.html.erb b/app/components/admin/settings/featured_settings_form_component.html.erb index e3b5c6f46..bb5ae5096 100644 --- a/app/components/admin/settings/featured_settings_form_component.html.erb +++ b/app/components/admin/settings/featured_settings_form_component.html.erb @@ -1,7 +1,5 @@ -<%= form_for([:admin, feature]) do |f| %> +<%= form_for([:admin, feature], html: { class: "featured-settings-form" }) do |f| %> <%= f.hidden_field :tab, id: dom_id(feature, :tab), value: tab if tab %> - <%= f.hidden_field :value, id: dom_id(feature, :value), value: (feature.enabled? ? "" : "active") %> - <%= f.submit(t("admin.settings.index.features.#{feature.enabled? ? "disable" : "enable"}"), - class: "button expanded #{feature.enabled? ? "hollow alert" : "success"}", - data: { confirm: t("admin.actions.confirm") }) %> + <%= f.hidden_field :value, id: dom_id(feature, :value), value: (enabled? ? "" : "active") %> + <%= f.button text, options %> <% end %> diff --git a/app/components/admin/settings/featured_settings_form_component.rb b/app/components/admin/settings/featured_settings_form_component.rb index db2382678..c5835bc09 100644 --- a/app/components/admin/settings/featured_settings_form_component.rb +++ b/app/components/admin/settings/featured_settings_form_component.rb @@ -1,8 +1,27 @@ class Admin::Settings::FeaturedSettingsFormComponent < ApplicationComponent attr_reader :feature, :tab + delegate :enabled?, to: :feature def initialize(feature, tab: nil) @feature = feature @tab = tab end + + private + + def text + if enabled? + t("shared.yes") + else + t("shared.no") + end + end + + def options + { + "aria-labelledby": dom_id(feature, :title), + "aria-describedby": dom_id(feature, :description), + "aria-pressed": enabled? + } + end end diff --git a/app/views/admin/settings/_featured_settings_table.html.erb b/app/views/admin/settings/_featured_settings_table.html.erb index 4bde70d30..649d43cec 100644 --- a/app/views/admin/settings/_featured_settings_table.html.erb +++ b/app/views/admin/settings/_featured_settings_table.html.erb @@ -1,37 +1,22 @@ - +
- - + <% features.each do |feature| %> - - - diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 3284f41f9..b797b26a4 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -1298,8 +1298,7 @@ en: images_and_documents: "Images and documents" feature_flags: Features features: - enabled: "Feature enabled" - disabled: "Feature disabled" + enabled: "Enabled" enable: "Enable" disable: "Disable" map: @@ -1322,9 +1321,7 @@ en: remote_census_request_name: Request Data remote_census_response_name: Response Data setting: Feature - setting_actions: Actions setting_name: Setting - setting_status: Status setting_value: Value no_description: "No description" shared: diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index be84208a3..da1b4b075 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -1297,8 +1297,7 @@ es: images_and_documents: "Imágenes y documentos" feature_flags: Funcionalidades features: - enabled: "Funcionalidad activada" - disabled: "Funcionalidad desactivada" + enabled: "Activada" enable: "Activar" disable: "Desactivar" map: @@ -1321,9 +1320,7 @@ es: remote_census_request_name: Datos Petición remote_census_response_name: Datos Respuesta setting: Funcionalidad - setting_actions: Acciones setting_name: Configuración - setting_status: Estado setting_value: Valor no_description: "Sin descripción" shared: diff --git a/spec/components/admin/settings/featured_settings_form_component_spec.rb b/spec/components/admin/settings/featured_settings_form_component_spec.rb new file mode 100644 index 000000000..f01455405 --- /dev/null +++ b/spec/components/admin/settings/featured_settings_form_component_spec.rb @@ -0,0 +1,55 @@ +require "rails_helper" + +describe Admin::Settings::FeaturedSettingsFormComponent do + let(:setting) { create(:setting, key: "feature.goodness") } + let(:component) { Admin::Settings::FeaturedSettingsFormComponent.new(setting) } + + it "includes an aria-labelledby attribute" do + render_inline component + + expect(page).to have_button count: 1 + expect(page).to have_css "button[aria-labelledby='title_setting_#{setting.id}']" + end + + it "includes an aria-describedby attribute" do + render_inline component + + expect(page).to have_css "button[aria-describedby='description_setting_#{setting.id}']" + end + + describe "aria-pressed attribute" do + it "is true when the setting is enabled" do + setting.update!(value: "active") + + render_inline component + + expect(page).to have_css "button[aria-pressed='true']" + end + + it "is false when the setting is disabled" do + setting.update!(value: "") + + render_inline component + + expect(page).to have_css "button[aria-pressed='false']" + end + end + + describe "button text" do + it "reflects the status when the setting is enabled" do + setting.update!(value: "active") + + render_inline component + + expect(page).to have_button "Yes" + end + + it "reflects the status when the setting is disabled" do + setting.update!(value: "") + + render_inline component + + expect(page).to have_button "No" + end + end +end diff --git a/spec/system/admin/feature_flags_spec.rb b/spec/system/admin/feature_flags_spec.rb index 5fd48a934..28e439e32 100644 --- a/spec/system/admin/feature_flags_spec.rb +++ b/spec/system/admin/feature_flags_spec.rb @@ -15,18 +15,12 @@ describe "Admin feature flags", :admin do end scenario "Disable a participatory process", :show_exceptions do - setting = Setting.find_by(key: "process.budgets") budget = create(:budget) visit admin_settings_path within("#settings-tabs") { click_link "Participation processes" } - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Disable" - expect(page).not_to have_button "Enable" - - accept_confirm { click_button "Disable" } - end + within("tr", text: "Participatory budgeting") { click_button "Yes" } expect(page).to have_content "Value updated" @@ -46,7 +40,6 @@ describe "Admin feature flags", :admin do scenario "Enable a disabled participatory process" do Setting["process.budgets"] = nil - setting = Setting.find_by(key: "process.budgets") visit admin_root_path @@ -56,13 +49,7 @@ describe "Admin feature flags", :admin do visit admin_settings_path within("#settings-tabs") { click_link "Participation processes" } - - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Enable" - expect(page).not_to have_button "Disable" - - accept_confirm { click_button "Enable" } - end + within("tr", text: "Participatory budgeting") { click_button "No" } expect(page).to have_content "Value updated" @@ -72,44 +59,30 @@ describe "Admin feature flags", :admin do end scenario "Disable a feature" do - setting = Setting.find_by(key: "feature.twitter_login") - visit admin_settings_path click_link "Features" - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Disable" - expect(page).not_to have_button "Enable" - - accept_confirm { click_button "Disable" } - end + within("tr", text: "Twitter login") { click_button "Yes" } expect(page).to have_content "Value updated" - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Enable" - expect(page).not_to have_button "Disable" + within("tr", text: "Twitter login") do + expect(page).to have_button "No" + expect(page).not_to have_button "Yes" end end scenario "Enable a disabled feature" do - setting = Setting.find_by(key: "feature.map") - visit admin_settings_path click_link "Features" - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Enable" - expect(page).not_to have_button "Disable" - - accept_confirm { click_button "Enable" } - end + within("tr", text: "Proposals and budget investments geolocation") { click_button "No" } expect(page).to have_content "Value updated" - within("#edit_setting_#{setting.id}") do - expect(page).to have_button "Disable" - expect(page).not_to have_button "Enable" + within("tr", text: "Proposals and budget investments geolocation") do + expect(page).to have_button "Yes" + expect(page).not_to have_button "No" end end end diff --git a/spec/system/admin/settings_spec.rb b/spec/system/admin/settings_spec.rb index 95f7831d3..4b29ec014 100644 --- a/spec/system/admin/settings_spec.rb +++ b/spec/system/admin/settings_spec.rb @@ -240,28 +240,22 @@ describe "Admin settings", :admin do end scenario "On #tab-participation-processes" do - process_setting = Setting.create!(key: "process.whatever") + Setting.create!(key: "process.whatever") visit admin_settings_path find("#participation-processes-tab").click - - accept_alert do - find("#edit_setting_#{process_setting.id} .button").click - end + within("tr", text: "Whatever") { click_button "No" } expect(page).to have_current_path(admin_settings_path) expect(page).to have_css("div#tab-participation-processes.is-active") end scenario "On #tab-feature-flags" do - feature_setting = Setting.create!(key: "feature.whatever") + Setting.create!(key: "feature.whatever") visit admin_settings_path find("#features-tab").click - - accept_alert do - find("#edit_setting_#{feature_setting.id} .button").click - end + within("tr", text: "Whatever") { click_button "No" } expect(page).to have_current_path(admin_settings_path) expect(page).to have_css("div#tab-feature-flags.is-active") @@ -274,11 +268,9 @@ describe "Admin settings", :admin do visit admin_settings_path click_link "SDG configuration" + within("tr", text: "Whatever") { click_button "No" } - accept_alert do - within("tr", text: "Whatever") { click_button "Enable" } - end - + expect(page).to have_content "Value updated" expect(page).to have_current_path(admin_settings_path) expect(page).to have_css("h2", exact_text: "SDG configuration") end @@ -287,32 +279,22 @@ describe "Admin settings", :admin do describe "Skip verification" do scenario "deactivate skip verification" do Setting["feature.user.skip_verification"] = "true" - setting = Setting.find_by(key: "feature.user.skip_verification") visit admin_settings_path find("#features-tab").click - - accept_alert do - find("#edit_setting_#{setting.id} .button").click - end + within("tr", text: "Skip user verification") { click_button "Yes" } expect(page).to have_content "Value updated" end scenario "activate skip verification" do Setting["feature.user.skip_verification"] = nil - setting = Setting.find_by(key: "feature.user.skip_verification") visit admin_settings_path find("#features-tab").click - - accept_alert do - find("#edit_setting_#{setting.id} .button").click - end + within("tr", text: "Skip user verification") { click_button "No" } expect(page).to have_content "Value updated" - - Setting["feature.user.skip_verification"] = nil end end