From aef3f17b56d93b298feb76990f4f40d511352625 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 7 Jun 2024 11:31:46 +1000 Subject: [PATCH] DEV: A different approach to breadcrumbs (#27365) Really fully authored by Jarek, I only made the PR :) The `DBreadcrumbItem` and `DBreadcrumbContainer` components introduced in 1239178f496cba5d864adb7c118b17902b8b72dc have some limitations, mainly that the container has no awareness of its items, so nothing that requires positional knowledge can be used. This is needed to use `aria-current` on the last breadcrumb item, see https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/examples/breadcrumb/. We change `DBreadcrumbItem` to always be a link, removing the need for `LinkTo`. Then, we introduce a service to keep track of containers and items (since all items are rendered into all containers) and make the item itself responsible for registering to the service, and introduce the needed `aria-current` behaviour. --------- Co-authored-by: Jarek Radosz --- .../components/admin-plugin-config-page.gjs | 34 ++++--------- .../admin/addon/templates/plugins-index.hbs | 13 +---- .../addon/templates/plugins-show-settings.hbs | 14 ++--- .../components/d-breadcrumbs-container.gjs | 48 ++++++++++++----- .../app/components/d-breadcrumbs-item.gjs | 45 ++++++++++++---- .../d-breadcrumbs-container-modifier.js | 27 ---------- .../app/services/breadcrumbs-service.js | 40 --------------- .../discourse/app/services/breadcrumbs.js | 7 +++ ...dcrumbs-test.js => d-breadcrumbs-test.gjs} | 51 ++++++++----------- 9 files changed, 113 insertions(+), 166 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/modifiers/d-breadcrumbs-container-modifier.js delete mode 100644 app/assets/javascripts/discourse/app/services/breadcrumbs-service.js create mode 100644 app/assets/javascripts/discourse/app/services/breadcrumbs.js rename app/assets/javascripts/discourse/tests/integration/components/{d-breadcrumbs-test.js => d-breadcrumbs-test.gjs} (52%) diff --git a/app/assets/javascripts/admin/addon/components/admin-plugin-config-page.gjs b/app/assets/javascripts/admin/addon/components/admin-plugin-config-page.gjs index 29b75c48248..afffeb8d3b1 100644 --- a/app/assets/javascripts/admin/addon/components/admin-plugin-config-page.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-plugin-config-page.gjs @@ -1,6 +1,5 @@ import Component from "@glimmer/component"; -import { LinkTo } from "@ember/routing"; -import { inject as service } from "@ember/service"; +import { service } from "@ember/service"; import DBreadcrumbsContainer from "discourse/components/d-breadcrumbs-container"; import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item"; import i18n from "discourse-common/helpers/i18n"; @@ -28,27 +27,16 @@ export default class AdminPluginConfigPage extends Component {
- - - {{i18n "admin_title"}} - - - - - - {{i18n "admin.plugins.title"}} - - - - - - {{@plugin.nameTitleized}} - - + + + diff --git a/app/assets/javascripts/admin/addon/templates/plugins-index.hbs b/app/assets/javascripts/admin/addon/templates/plugins-index.hbs index ab19b70abda..7d5165b5ed7 100644 --- a/app/assets/javascripts/admin/addon/templates/plugins-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/plugins-index.hbs @@ -1,16 +1,7 @@ - - - {{i18n "admin_title"}} - - - - - - {{i18n "admin.plugins.title"}} - - + +
{{#if this.model.length}} diff --git a/app/assets/javascripts/admin/addon/templates/plugins-show-settings.hbs b/app/assets/javascripts/admin/addon/templates/plugins-show-settings.hbs index c26d05b09e3..a8c17447199 100644 --- a/app/assets/javascripts/admin/addon/templates/plugins-show-settings.hbs +++ b/app/assets/javascripts/admin/addon/templates/plugins-show-settings.hbs @@ -1,12 +1,8 @@ - - - {{i18n "admin.plugins.change_settings_short"}} - - +
-
    - {{yield}} -
-; +export default class DBreadcrumbsContainer extends Component { + @service breadcrumbs; -export default DBreadcrumbsContainer; + registerContainer = modifier((element) => { + const container = { element }; + + this.breadcrumbs.containers.add(container); + return () => this.breadcrumbs.containers.delete(container); + }); + + get lastItemIndex() { + return this.breadcrumbs.items.size - 1; + } + +