From 5559e4c125daee36b88c634936bf06afe70fd018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 31 Jan 2025 08:31:56 +0100 Subject: [PATCH 1/3] Use common helper for nested breadcrumb element --- .../index_page_header_component.rb | 8 ++++--- .../index_page_header_component.rb | 8 ++++--- .../members/index_page_header_component.rb | 2 +- .../index_page_header_component.rb | 2 +- .../projects/index_page_header_component.rb | 2 +- app/helpers/breadcrumb_helper.rb | 8 +++++++ app/views/enumerations/edit.html.erb | 12 ++++++---- app/views/enumerations/new.html.erb | 11 +++++---- config/locales/en.yml | 2 -- .../bim/bcf/issues/perform_import.html.erb | 12 ++++++---- .../show_page_header_component.rb | 13 +++++----- .../synchronized_filters/edit.html.erb | 13 ++++++---- .../synchronized_groups/show.html.erb | 13 ++++++---- .../meetings/index_page_header_component.rb | 2 +- .../index_page_header_component.rb | 2 +- .../project_storage_members/index.html.erb | 24 ++++++++++--------- .../two_factor_devices/new.html.erb | 10 +++++--- 17 files changed, 88 insertions(+), 56 deletions(-) diff --git a/app/components/attribute_help_texts/index_page_header_component.rb b/app/components/attribute_help_texts/index_page_header_component.rb index 0e0637a472e1..c5500250f00b 100644 --- a/app/components/attribute_help_texts/index_page_header_component.rb +++ b/app/components/attribute_help_texts/index_page_header_component.rb @@ -39,9 +39,11 @@ def initialize(tabs: nil) end def breadcrumb_items - [{ href: admin_index_path, text: t("label_administration") }, - I18n.t("menus.breadcrumb.nested_element", section_header: t(:"attribute_help_texts.label_plural"), - title: I18n.t(currently_selected_tab[:label].to_s)).html_safe] + [ + { href: admin_index_path, text: t("label_administration") }, + helpers.nested_breadcrumb_element(t(:"attribute_help_texts.label_plural"), + title: I18n.t(currently_selected_tab[:label].to_s)) + ] end def currently_selected_tab diff --git a/app/components/custom_fields/index_page_header_component.rb b/app/components/custom_fields/index_page_header_component.rb index bfefb5b22ec2..ef481ffd2ec5 100644 --- a/app/components/custom_fields/index_page_header_component.rb +++ b/app/components/custom_fields/index_page_header_component.rb @@ -39,9 +39,11 @@ def initialize(tabs: nil) end def breadcrumb_items - [{ href: admin_index_path, text: t("label_administration") }, - I18n.t("menus.breadcrumb.nested_element", section_header: t(:label_custom_field_plural), - title: I18n.t(currently_selected_tab[:label].to_s)).html_safe] + [ + { href: admin_index_path, text: t("label_administration") }, + helpers.nested_breadcrumb_element(t(:label_custom_field_plural), + I18n.t(currently_selected_tab[:label].to_s)) + ] end def currently_selected_tab diff --git a/app/components/members/index_page_header_component.rb b/app/components/members/index_page_header_component.rb index c0df1b1bbd92..18bd0019258f 100644 --- a/app/components/members/index_page_header_component.rb +++ b/app/components/members/index_page_header_component.rb @@ -63,7 +63,7 @@ def current_breadcrumb_element if @query && query_name if menu_header.present? - I18n.t("menus.breadcrumb.nested_element", section_header: menu_header, title: query_name).html_safe + helpers.nested_breadcrumb_element(menu_header, query_name) else query_name end diff --git a/app/components/notifications/index_page_header_component.rb b/app/components/notifications/index_page_header_component.rb index d6bd58528936..dcb1f9fd0d8b 100644 --- a/app/components/notifications/index_page_header_component.rb +++ b/app/components/notifications/index_page_header_component.rb @@ -53,7 +53,7 @@ def breadcrumb_items def current_breadcrumb_element if current_section && current_section.header.present? - I18n.t("menus.breadcrumb.nested_element", section_header: current_section.header, title: page_title).html_safe + helpers.nested_breadcrumb_element(current_section.header, page_title) else page_title end diff --git a/app/components/projects/index_page_header_component.rb b/app/components/projects/index_page_header_component.rb index 0e5902d8185c..2e6fff5186a0 100644 --- a/app/components/projects/index_page_header_component.rb +++ b/app/components/projects/index_page_header_component.rb @@ -122,7 +122,7 @@ def current_breadcrumb_element return page_title if query.name.blank? if current_section && current_section.header.present? - I18n.t("menus.breadcrumb.nested_element", section_header: current_section.header, title: query.name).html_safe + helpers.nested_breadcrumb_element(current_section.header, query.name) else page_title end diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index 39b3cf28b130..1402a3b8f3d6 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -41,6 +41,14 @@ def full_breadcrumbs end end + def nested_breadcrumb_element(section_header, title) + output = ''.html_safe + output << "#{section_header}: " + output << content_tag(:strong, title) + + output + end + def breadcrumb_paths(*args) if args.empty? @breadcrumb_paths ||= [default_breadcrumb] diff --git a/app/views/enumerations/edit.html.erb b/app/views/enumerations/edit.html.erb index 92f9ba9635d3..341e498fa319 100644 --- a/app/views/enumerations/edit.html.erb +++ b/app/views/enumerations/edit.html.erb @@ -32,10 +32,14 @@ See COPYRIGHT and LICENSE files for more details. <%= render(Primer::OpenProject::PageHeader.new) do |header| header.with_title { h @enumeration.name } - header.with_breadcrumbs([{ href: admin_index_path, text: t(:label_administration) }, - { href: enumerations_path, text: t(:label_enumerations) }, - I18n.t("menus.breadcrumb.nested_element", section_header: t(@enumeration.option_name), title: h(@enumeration.name)).html_safe], - selected_item_font_weight: :normal) + header.with_breadcrumbs( + [ + { href: admin_index_path, text: t(:label_administration) }, + { href: enumerations_path, text: t(:label_enumerations) }, + nested_breadcrumb_element(t(@enumeration.option_name), @enumeration.name) + ], + selected_item_font_weight: :normal + ) end %> diff --git a/app/views/enumerations/new.html.erb b/app/views/enumerations/new.html.erb index c8d70fd03a92..599df6f2c6e2 100644 --- a/app/views/enumerations/new.html.erb +++ b/app/views/enumerations/new.html.erb @@ -32,10 +32,13 @@ See COPYRIGHT and LICENSE files for more details. <%= render(Primer::OpenProject::PageHeader.new) do |header| header.with_title { t(:label_enumeration_new) } - header.with_breadcrumbs([{ href: admin_index_path, text: t(:label_administration) }, - { href: enumerations_path, text: t(:label_enumerations) }, - I18n.t("menus.breadcrumb.nested_element", section_header: t(@enumeration.option_name), title: t(:label_enumeration_new)).html_safe], - selected_item_font_weight: :normal) + header.with_breadcrumbs( + [{ href: admin_index_path, text: t(:label_administration) }, + { href: enumerations_path, text: t(:label_enumerations) }, + nested_breadcrumb_element(t(@enumeration.option_name), t(:label_enumeration_new)) + ], + selected_item_font_weight: :normal + ) end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 51dda2724183..ce5e3be08b3a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2202,8 +2202,6 @@ en: api_and_webhooks: "API and webhooks" quick_add: label: "Open quick add menu" - breadcrumb: - nested_element: "%{section_header}: %{title}" my_account: access_tokens: diff --git a/modules/bim/app/views/bim/bcf/issues/perform_import.html.erb b/modules/bim/app/views/bim/bcf/issues/perform_import.html.erb index f04c750c7175..da834cc6221c 100644 --- a/modules/bim/app/views/bim/bcf/issues/perform_import.html.erb +++ b/modules/bim/app/views/bim/bcf/issues/perform_import.html.erb @@ -1,12 +1,14 @@ - + <%= render Primer::OpenProject::PageHeader.new do |header| header.with_title { t(:label_summary) } - header.with_breadcrumbs([{ href: project_overview_path(@project.id), text: @project.name }, - { href: defaults_bcf_project_ifc_models_path(@project.identifier), text: I18n.t(:"bcf.label_bcf") }, - I18n.t("menus.breadcrumb.nested_element", section_header: t("bcf.bcf_xml.import_title"), title: t(:label_summary)).html_safe], - selected_item_font_weight: :normal) + header.with_breadcrumbs( + [{ href: project_overview_path(@project.id), text: @project.name }, + { href: defaults_bcf_project_ifc_models_path(@project.identifier), text: I18n.t(:"bcf.label_bcf") }, + nested_breadcrumb_element(t("bcf.bcf_xml.import_title"), t(:label_summary)) + ], + selected_item_font_weight: :normal) end %> diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/show_page_header_component.rb b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/show_page_header_component.rb index 28b797694679..6c197e116527 100644 --- a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/show_page_header_component.rb +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/show_page_header_component.rb @@ -38,12 +38,13 @@ def initialize(filter:) end def breadcrumb_items - [{ href: admin_index_path, text: t(:label_administration) }, - { href: admin_settings_authentication_path, text: t(:label_authentication) }, - { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, - I18n.t("menus.breadcrumb.nested_element", - section_header: t("ldap_groups.synchronized_filters.singular"), - title: h(@filter.name)).html_safe] + [ + { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_authentication_path, text: t(:label_authentication) }, + { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, + helpers.nested_breadcrumb_element(t("ldap_groups.synchronized_filters.singular"), + h(@filter.name)) + ] end def blocked? diff --git a/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/edit.html.erb b/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/edit.html.erb index b3c8129aaf98..0d27bc4e3dae 100644 --- a/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/edit.html.erb +++ b/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/edit.html.erb @@ -3,11 +3,14 @@ <%= render Primer::OpenProject::PageHeader.new do |header| header.with_title { @filter.name } - header.with_breadcrumbs([{ href: admin_index_path, text: t(:label_administration) }, - { href: admin_settings_authentication_path, text: t(:label_authentication) }, - { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, - I18n.t("menus.breadcrumb.nested_element", section_header: t("ldap_groups.synchronized_filters.singular"), title: @filter.name).html_safe], - selected_item_font_weight: :normal) + header.with_breadcrumbs( + [ + { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_authentication_path, text: t(:label_authentication) }, + { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, + nested_breadcrumb_element(t("ldap_groups.synchronized_filters.singular"), @filter.name), + ], + selected_item_font_weight: :normal) end %> diff --git a/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/show.html.erb b/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/show.html.erb index 44c2a15f1c6b..789d2f504bcc 100644 --- a/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/show.html.erb +++ b/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/show.html.erb @@ -3,11 +3,14 @@ <%= render Primer::OpenProject::PageHeader.new do |header| header.with_title { h(@group.dn) } - header.with_breadcrumbs([{ href: admin_index_path, text: t(:label_administration) }, - { href: admin_settings_authentication_path, text: t(:label_authentication) }, - { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, - I18n.t("menus.breadcrumb.nested_element", section_header: t("ldap_groups.synchronized_groups.singular"), title: h(@group.dn)).html_safe], - selected_item_font_weight: :normal) + header.with_breadcrumbs( + [{ href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_authentication_path, text: t(:label_authentication) }, + { href: ldap_groups_synchronized_groups_path, text: I18n.t("ldap_groups.label_menu_item") }, + nested_breadcrumb_element(t("ldap_groups.synchronized_groups.singular"), @group.dn) + ], + selected_item_font_weight: :normal + ) end %> diff --git a/modules/meeting/app/components/meetings/index_page_header_component.rb b/modules/meeting/app/components/meetings/index_page_header_component.rb index aca17d620c40..a2aff11ecf45 100644 --- a/modules/meeting/app/components/meetings/index_page_header_component.rb +++ b/modules/meeting/app/components/meetings/index_page_header_component.rb @@ -62,7 +62,7 @@ def parent_element def current_breadcrumb_element if section_present? - I18n.t("menus.breadcrumb.nested_element", section_header: current_section.header, title: page_title).html_safe + helpers.nested_breadcrumb_element(current_section.header, page_title) else page_title end diff --git a/modules/reporting/app/components/cost_reports/index_page_header_component.rb b/modules/reporting/app/components/cost_reports/index_page_header_component.rb index 3b7cfe36e764..e9b137d3ff88 100644 --- a/modules/reporting/app/components/cost_reports/index_page_header_component.rb +++ b/modules/reporting/app/components/cost_reports/index_page_header_component.rb @@ -62,7 +62,7 @@ def current_breadcrumb_element return I18n.t(:label_new_report) unless @query.persisted? if current_section && current_section.header.present? - I18n.t("menus.breadcrumb.nested_element", section_header: current_section.header, title: @query.name).html_safe + helpers.nested_breadcrumb_element(current_section.header, @query.name) else I18n.t(:label_new_report) end diff --git a/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb b/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb index a10087e7a575..2e2a56a3e592 100644 --- a/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb +++ b/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb @@ -29,19 +29,21 @@ See COPYRIGHT and LICENSE files for more details. <% html_title t(:label_administration), t("project_module_storages"), @storage.name %> <%= - render Primer::OpenProject::PageHeader.new do |header| - header.with_title { t("storages.page_titles.project_storage_members.title") } - header.with_breadcrumbs([{ href: project_overview_path(@project.id), text: @project.name }, - { href: project_settings_general_path(@project.id), text: I18n.t("label_project_settings") }, - { href: external_file_storages_project_settings_project_storages_path(@project), text: t("project_module_storages") }, - I18n.t("menus.breadcrumb.nested_element", section_header: @storage.name, title: t("storages.page_titles.project_storage_members.title")).html_safe], - selected_item_font_weight: :normal) - end + render Primer::OpenProject::PageHeader.new do |header| + header.with_title { t("storages.page_titles.project_storage_members.title") } + header.with_breadcrumbs( + [{ href: project_overview_path(@project.id), text: @project.name }, + { href: project_settings_general_path(@project.id), text: I18n.t("label_project_settings") }, + { href: external_file_storages_project_settings_project_storages_path(@project), text: t("project_module_storages") }, + helpers.nested_breadcrumb_element(@storage.name, t("storages.page_titles.project_storage_members.title")) + ], + selected_item_font_weight: :normal) + end %> <%= content_tag(:p, - t("storages.page_titles.project_storage_members.subtitle", - storage_name_link: link_to(@storage.name, edit_admin_settings_storage_path(@storage))).html_safe -) %> + t("storages.page_titles.project_storage_members.subtitle", + storage_name_link: link_to(@storage.name, edit_admin_settings_storage_path(@storage))).html_safe + ) %> <%= render(::Storages::ProjectStorages::Members::TableComponent.new(rows: @project_users, storage: @storage)) %> diff --git a/modules/two_factor_authentication/app/views/two_factor_authentication/two_factor_devices/new.html.erb b/modules/two_factor_authentication/app/views/two_factor_authentication/two_factor_devices/new.html.erb index 3432a3c10dbe..c9c297cd589f 100644 --- a/modules/two_factor_authentication/app/views/two_factor_authentication/two_factor_devices/new.html.erb +++ b/modules/two_factor_authentication/app/views/two_factor_authentication/two_factor_devices/new.html.erb @@ -3,9 +3,13 @@ <%= render(Primer::OpenProject::PageHeader.new) do |header| header.with_title(test_selector: "two_factor_authentication_new_device_header_title") { t('two_factor_authentication.devices.add_new') } - header.with_breadcrumbs([{ href: my_account_path, text: t(:label_my_account) }, - { href: my_2fa_devices_path , text: t('two_factor_authentication.label_two_factor_authentication') }, - I18n.t("menus.breadcrumb.nested_element", section_header: t("two_factor_authentication.devices.#{@device_type}.title"), title: t("two_factor_authentication.devices.add_new")).html_safe], selected_item_font_weight: :normal) + header.with_breadcrumbs( + [ + { href: my_account_path, text: t(:label_my_account) }, + { href: my_2fa_devices_path, text: t('two_factor_authentication.label_two_factor_authentication') }, + nested_breadcrumb_element(t("two_factor_authentication.devices.#{@device_type}.title"), t("two_factor_authentication.devices.add_new")), + ], + selected_item_font_weight: :normal) end %> <%= labelled_tabular_form_for @device, From f270037b301e8d79e7a6e59015ae334aed3a66de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 31 Jan 2025 08:52:28 +0100 Subject: [PATCH 2/3] Update app/components/attribute_help_texts/index_page_header_component.rb Co-authored-by: Henriette Darge --- .../attribute_help_texts/index_page_header_component.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/attribute_help_texts/index_page_header_component.rb b/app/components/attribute_help_texts/index_page_header_component.rb index c5500250f00b..cec172d74a51 100644 --- a/app/components/attribute_help_texts/index_page_header_component.rb +++ b/app/components/attribute_help_texts/index_page_header_component.rb @@ -42,7 +42,7 @@ def breadcrumb_items [ { href: admin_index_path, text: t("label_administration") }, helpers.nested_breadcrumb_element(t(:"attribute_help_texts.label_plural"), - title: I18n.t(currently_selected_tab[:label].to_s)) + I18n.t(currently_selected_tab[:label].to_s)) ] end From 9e9ac761e4c521958b82e9f278fe2663b912ae09 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 31 Jan 2025 09:34:22 +0100 Subject: [PATCH 3/3] Fix rubocop and test --- .../attribute_help_texts/index_page_header_component.rb | 2 +- app/components/custom_fields/index_page_header_component.rb | 2 +- app/helpers/breadcrumb_helper.rb | 2 +- .../project_settings/project_storage_members/index.html.erb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/attribute_help_texts/index_page_header_component.rb b/app/components/attribute_help_texts/index_page_header_component.rb index cec172d74a51..5c1615f05e66 100644 --- a/app/components/attribute_help_texts/index_page_header_component.rb +++ b/app/components/attribute_help_texts/index_page_header_component.rb @@ -42,7 +42,7 @@ def breadcrumb_items [ { href: admin_index_path, text: t("label_administration") }, helpers.nested_breadcrumb_element(t(:"attribute_help_texts.label_plural"), - I18n.t(currently_selected_tab[:label].to_s)) + I18n.t(currently_selected_tab[:label].to_s)) ] end diff --git a/app/components/custom_fields/index_page_header_component.rb b/app/components/custom_fields/index_page_header_component.rb index ef481ffd2ec5..db2f7ebeb057 100644 --- a/app/components/custom_fields/index_page_header_component.rb +++ b/app/components/custom_fields/index_page_header_component.rb @@ -42,7 +42,7 @@ def breadcrumb_items [ { href: admin_index_path, text: t("label_administration") }, helpers.nested_breadcrumb_element(t(:label_custom_field_plural), - I18n.t(currently_selected_tab[:label].to_s)) + I18n.t(currently_selected_tab[:label].to_s)) ] end diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index 1402a3b8f3d6..48d65d53682e 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -42,7 +42,7 @@ def full_breadcrumbs end def nested_breadcrumb_element(section_header, title) - output = ''.html_safe + output = "".html_safe output << "#{section_header}: " output << content_tag(:strong, title) diff --git a/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb b/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb index 2e2a56a3e592..b2bcf9dcbc1e 100644 --- a/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb +++ b/modules/storages/app/views/storages/project_settings/project_storage_members/index.html.erb @@ -35,7 +35,7 @@ See COPYRIGHT and LICENSE files for more details. [{ href: project_overview_path(@project.id), text: @project.name }, { href: project_settings_general_path(@project.id), text: I18n.t("label_project_settings") }, { href: external_file_storages_project_settings_project_storages_path(@project), text: t("project_module_storages") }, - helpers.nested_breadcrumb_element(@storage.name, t("storages.page_titles.project_storage_members.title")) + nested_breadcrumb_element(@storage.name, t("storages.page_titles.project_storage_members.title")) ], selected_item_font_weight: :normal) end