From ae3f4aa689ee9bfff8a95f1b4bbd0880b62b8087 Mon Sep 17 00:00:00 2001 From: Tomas Hykel Date: Thu, 7 May 2026 23:37:05 +0200 Subject: [PATCH] fix: Adjust save button behaviour in identifier settings --- ...dentifier_settings_form_component.html.erb | 2 +- .../identifier_settings_form_component.rb | 3 ++- .../work-packages-identifier.controller.ts | 25 ++++++++++++++----- ...identifier_settings_form_component_spec.rb | 4 +-- .../settings/work_packages_identifier_spec.rb | 4 ++- .../problematic_identifiers_spec.rb | 2 +- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/components/work_packages/admin/settings/identifier_settings_form_component.html.erb b/app/components/work_packages/admin/settings/identifier_settings_form_component.html.erb index 52bb77982fc..b91182b3025 100644 --- a/app/components/work_packages/admin/settings/identifier_settings_form_component.html.erb +++ b/app/components/work_packages/admin/settings/identifier_settings_form_component.html.erb @@ -77,7 +77,7 @@ scheme: :primary, type: :submit, form: form_id, - hidden: show_autofix_section?, + hidden: true, data: { admin__work_packages_identifier_target: "saveButton" } ) ) { t("button_save") } %> diff --git a/app/components/work_packages/admin/settings/identifier_settings_form_component.rb b/app/components/work_packages/admin/settings/identifier_settings_form_component.rb index 446b0cf8651..9583ab3c5d9 100644 --- a/app/components/work_packages/admin/settings/identifier_settings_form_component.rb +++ b/app/components/work_packages/admin/settings/identifier_settings_form_component.rb @@ -101,7 +101,8 @@ module WorkPackages { data: { controller: "admin--work-packages-identifier", - admin__work_packages_identifier_has_problematic_projects_value: has_problematic_projects? + admin__work_packages_identifier_has_problematic_projects_value: has_problematic_projects?, + admin__work_packages_identifier_current_value_value: Setting[:work_packages_identifier] } } end diff --git a/frontend/src/stimulus/controllers/dynamic/admin/work-packages-identifier.controller.ts b/frontend/src/stimulus/controllers/dynamic/admin/work-packages-identifier.controller.ts index 2543efe5e87..513c508a07b 100644 --- a/frontend/src/stimulus/controllers/dynamic/admin/work-packages-identifier.controller.ts +++ b/frontend/src/stimulus/controllers/dynamic/admin/work-packages-identifier.controller.ts @@ -33,36 +33,49 @@ import { Controller } from '@hotwired/stimulus'; export default class WorkPackagesIdentifierController extends Controller { static values = { hasProblematicProjects: Boolean, + currentValue: String, }; static targets = ['autofixSection', 'saveButton', 'autofixButton']; declare readonly hasProblematicProjectsValue:boolean; + declare readonly currentValueValue:string; declare readonly autofixSectionTarget:HTMLElement; declare readonly saveButtonTarget:HTMLButtonElement; declare readonly autofixButtonTarget:HTMLButtonElement; + declare readonly hasSaveButtonTarget:boolean; + + private readonly resetBeforeCache = ():void => { + if (this.hasSaveButtonTarget) this.saveButtonTarget.hidden = true; + }; connect() { + document.addEventListener('turbo:before-cache', this.resetBeforeCache); this.updateVisibility(); } + disconnect() { + document.removeEventListener('turbo:before-cache', this.resetBeforeCache); + } + handleChange() { this.updateVisibility(); } private updateVisibility() { - const showAutofix = this.isSemanticSelected() && this.hasProblematicProjectsValue; + const selectedValue = this.selectedValue(); + const showAutofix = selectedValue === 'semantic' && this.hasProblematicProjectsValue; + const isDirty = selectedValue !== this.currentValueValue; this.autofixSectionTarget.hidden = !showAutofix; - this.saveButtonTarget.hidden = showAutofix; + this.saveButtonTarget.hidden = showAutofix || !isDirty; this.autofixButtonTarget.hidden = !showAutofix; } - private isSemanticSelected():boolean { - const checked = this.element.querySelector( + private selectedValue():string | undefined { + return this.element.querySelector( 'input[name="settings[work_packages_identifier]"]:checked', - ); - return checked?.value === 'semantic'; + )?.value; } } diff --git a/spec/components/work_packages/admin/settings/identifier_settings_form_component_spec.rb b/spec/components/work_packages/admin/settings/identifier_settings_form_component_spec.rb index 1ac81864f32..07f63ed26e4 100644 --- a/spec/components/work_packages/admin/settings/identifier_settings_form_component_spec.rb +++ b/spec/components/work_packages/admin/settings/identifier_settings_form_component_spec.rb @@ -130,9 +130,9 @@ RSpec.describe WorkPackages::Admin::Settings::IdentifierSettingsFormComponent, t expect(ProjectIdentifiers::IdentifierAutofix::PreviewQuery).to have_received(:new).once end - it "renders the save button" do + it "renders the save button (hidden until a change is made)" do render_component(component) - expect(page).to have_button("Save") + expect(page).to have_button("Save", visible: :all) end it "does not render in-progress or success content" do diff --git a/spec/features/admin/settings/work_packages_identifier_spec.rb b/spec/features/admin/settings/work_packages_identifier_spec.rb index 350c412a23c..fead614c3d3 100644 --- a/spec/features/admin/settings/work_packages_identifier_spec.rb +++ b/spec/features/admin/settings/work_packages_identifier_spec.rb @@ -49,6 +49,7 @@ RSpec.describe "Work packages identifier admin settings", :js do context "when no projects have problematic identifiers" do it "saves the setting without showing a dialog" do visit_settings + choose "Project-based semantic identifiers" click_button "Save" @@ -60,9 +61,10 @@ RSpec.describe "Work packages identifier admin settings", :js do context "when a project has a problematic identifier" do shared_let(:project) { create(:project, identifier: "bad-id", name: "Bad Project") } - context "when saving with the current classic setting" do + context "when switching from semantic to classic", with_settings: { work_packages_identifier: "semantic" } do it "saves without showing the confirmation dialog" do visit_settings + choose "Instance-wide numerical sequence (default)" # The autofix section is hidden when classic is selected expect(page).to have_css( diff --git a/spec/services/project_identifiers/identifier_autofix/problematic_identifiers_spec.rb b/spec/services/project_identifiers/identifier_autofix/problematic_identifiers_spec.rb index ac78ea39d20..99fd3d5b1e3 100644 --- a/spec/services/project_identifiers/identifier_autofix/problematic_identifiers_spec.rb +++ b/spec/services/project_identifiers/identifier_autofix/problematic_identifiers_spec.rb @@ -160,7 +160,7 @@ RSpec.describe ProjectIdentifiers::IdentifierAutofix::ProblematicIdentifiers do end end - describe "#reserved_identifiers_by_error_reasons" do + describe "#reserved_identifiers_for_admin_preview" do subject(:exclusion) { analysis.reserved_identifiers_for_admin_preview } let!(:valid_project) { create_project_with_raw_identifier(name: "Alpha", identifier: "ALPHA") }