From 6acc8c8051b0af268616c8efeb4727cc51c8aa0c Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 19 Dec 2024 16:58:36 +0100 Subject: [PATCH] Add an enterprise banner on top of automatic subject configuration We are making sure that users can revert back to manual subjects at any time and even keep using the feature if it's still enabled after their enterprise token expired. They will merely not be able to set new types to automatic and have to live with an enterprise banner being shown to them whenever they change the subject config. --- .../subject_configuration_component.html.erb | 4 + .../types/subject_configuration_form.rb | 1 + config/locales/en.yml | 2 + .../work-package-types/README.md | 4 + lib/open_project/static/links.rb | 3 + .../subject_configuration_component_spec.rb | 92 +++++++++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 spec/components/work_packages/types/subject_configuration_component_spec.rb diff --git a/app/components/work_packages/types/subject_configuration_component.html.erb b/app/components/work_packages/types/subject_configuration_component.html.erb index 95792457632a..6597b015094e 100644 --- a/app/components/work_packages/types/subject_configuration_component.html.erb +++ b/app/components/work_packages/types/subject_configuration_component.html.erb @@ -27,6 +27,10 @@ See COPYRIGHT and LICENSE files for more details. ++#%> +<%= + render(EnterpriseEdition::BannerComponent.new(:automatic_subject_generation, mb: 3)) +%> + <%= primer_form_with(**form_options) do |f| render(WorkPackages::Types::SubjectConfigurationForm.new(f)) diff --git a/app/forms/work_packages/types/subject_configuration_form.rb b/app/forms/work_packages/types/subject_configuration_form.rb index 799f7092b49a..bb2745b76334 100644 --- a/app/forms/work_packages/types/subject_configuration_form.rb +++ b/app/forms/work_packages/types/subject_configuration_form.rb @@ -45,6 +45,7 @@ class SubjectConfigurationForm < ApplicationForm checked: has_pattern?, label: I18n.t("types.edit.subject_configuration.automatically_generated_subjects.label"), caption: I18n.t("types.edit.subject_configuration.automatically_generated_subjects.caption"), + disabled: !EnterpriseToken.active? && !has_pattern?, data: { action: "admin--subject-configuration#showPatternInput" } ) end diff --git a/config/locales/en.yml b/config/locales/en.yml index a62b3d257f16..218ce6ae2465 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1909,6 +1909,8 @@ en: upsale: title: "Enterprise add-on" link_title: "More information" + automatic_subject_generation: + description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project stages and gates than the ones provided by PM2 project cycle planning." form_configuration: diff --git a/docs/system-admin-guide/manage-work-packages/work-package-types/README.md b/docs/system-admin-guide/manage-work-packages/work-package-types/README.md index 2980df8ee6d8..5f6cb90c6894 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-types/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-types/README.md @@ -104,3 +104,7 @@ The **Activated for new projects by default** setting in the Types will only act This can be also configured in the [project settings](../../../user-guide/projects/project-settings). ![activate projects for work package types](image-20200116150513323.png) + +## Work package subject configuration (Enterprise add-on) + +Under **Administration -> Work packages -> Types** on the tab **Subject configuration** you can choose whether work package subjects should be defined automatically. diff --git a/lib/open_project/static/links.rb b/lib/open_project/static/links.rb index 65b27bb9f650..2bc843f35eac 100644 --- a/lib/open_project/static/links.rb +++ b/lib/open_project/static/links.rb @@ -251,6 +251,9 @@ def static_links href: "https://www.openproject.org/docs/user-guide/time-and-costs/progress-tracking/" }, enterprise_docs: { + automatic_subject_generation: { + href: "https://www.openproject.org/docs/system-admin-guide/manage-work-packages/work-package-types/#work-package-subject-configuration-enterprise-add-on" + }, form_configuration: { href: "https://www.openproject.org/docs/system-admin-guide/manage-work-packages/work-package-types/#work-package-form-configuration-enterprise-add-on" }, diff --git a/spec/components/work_packages/types/subject_configuration_component_spec.rb b/spec/components/work_packages/types/subject_configuration_component_spec.rb new file mode 100644 index 000000000000..7ac73b1ec0be --- /dev/null +++ b/spec/components/work_packages/types/subject_configuration_component_spec.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2010-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +require "rails_helper" + +RSpec.describe WorkPackages::Types::SubjectConfigurationComponent, type: :component do + subject(:render_component) do + render_inline(described_class.new(type)) + end + + let(:type) { create(:type) } + + before do + allow(EnterpriseToken).to receive(:active?).and_return(true) + end + + it "shows no enterprise banner" do + render_component + + expect(page).not_to have_test_selector("op-ee-banner-automatic-subject-generation") + end + + it "enables mode selectors", :aggregate_failures do + render_component + + expect(page.find("input[type=radio][value=auto]")).not_to be_disabled + expect(page.find("input[type=radio][value=manual]")).not_to be_disabled + end + + context "when enterprise edition is not activated" do + before do + allow(EnterpriseToken).to receive(:active?).and_return(false) + end + + it "shows the enterprise banner" do + render_component + + expect(page).to have_test_selector("op-ee-banner-automatic-subject-generation") + end + + it "disables only automatic mode selector", :aggregate_failures do + render_component + + expect(page.find("input[type=radio][value=auto]")).to be_disabled + expect(page.find("input[type=radio][value=manual]")).not_to be_disabled + end + + context "and when the subject is already automatically generated" do + let(:type) { create(:type, patterns: { subject: { blueprint: "Hello world", enabled: true } }) } + + it "shows the enterprise banner" do + render_component + + expect(page).to have_test_selector("op-ee-banner-automatic-subject-generation") + end + + it "enables mode selectors", :aggregate_failures do + render_component + + expect(page.find("input[type=radio][value=auto]")).not_to be_disabled + expect(page.find("input[type=radio][value=manual]")).not_to be_disabled + end + end + end +end