diff --git a/addons/rose/addon/components/rose/nav/breadcrumbs/index.hbs b/addons/rose/addon/components/rose/nav/breadcrumbs/index.hbs
index 287e2cba3..2e67e42df 100644
--- a/addons/rose/addon/components/rose/nav/breadcrumbs/index.hbs
+++ b/addons/rose/addon/components/rose/nav/breadcrumbs/index.hbs
@@ -1,5 +1,5 @@
diff --git a/addons/rose/addon/components/rose/nav/link/index.hbs b/addons/rose/addon/components/rose/nav/link/index.hbs
new file mode 100644
index 000000000..37df6a85b
--- /dev/null
+++ b/addons/rose/addon/components/rose/nav/link/index.hbs
@@ -0,0 +1,9 @@
+{{#if @model}}
+
+ {{yield}}
+
+{{else}}
+
+ {{yield}}
+
+{{/if}}
diff --git a/addons/rose/addon/components/rose/nav/link/index.stories.mdx b/addons/rose/addon/components/rose/nav/link/index.stories.mdx
new file mode 100644
index 000000000..198f434f4
--- /dev/null
+++ b/addons/rose/addon/components/rose/nav/link/index.stories.mdx
@@ -0,0 +1,23 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+import { hbs } from 'ember-cli-htmlbars';
+import { action } from '@storybook/addon-actions';
+import { text, boolean, select } from '@storybook/addon-knobs';
+
+
+
+# Generic Navigation Link
+
+Proxies the built-in `LinkTo` component, applying a class `rose-nav-link`.
+
+```html
+Text
+```
+
+
+ {{
+ template: hbs`
+ Text
+ `,
+ context: {},
+ }}
+
diff --git a/addons/rose/addon/components/rose/nav/sidebar/index.hbs b/addons/rose/addon/components/rose/nav/sidebar/index.hbs
index 28250c8d6..8d5dd5f9b 100644
--- a/addons/rose/addon/components/rose/nav/sidebar/index.hbs
+++ b/addons/rose/addon/components/rose/nav/sidebar/index.hbs
@@ -12,7 +12,7 @@
{{/if}}
{{yield (hash
- link=(component "link-to" class="rose-nav-link")
+ link=(component "rose/nav/link")
)}}
diff --git a/addons/rose/addon/components/rose/nav/tabs/index.hbs b/addons/rose/addon/components/rose/nav/tabs/index.hbs
index 18470f7d5..bef7428e2 100644
--- a/addons/rose/addon/components/rose/nav/tabs/index.hbs
+++ b/addons/rose/addon/components/rose/nav/tabs/index.hbs
@@ -3,7 +3,7 @@
class="rose-nav-tabs">
{{yield (hash
- link=(component "link-to" class="rose-nav-link")
+ link=(component "rose/nav/link")
)}}
diff --git a/addons/rose/addon/styles/rose/components/nav/_breadcrumbs.scss b/addons/rose/addon/styles/rose/components/nav/_breadcrumbs.scss
index e7ac5572e..f87fb9ae7 100644
--- a/addons/rose/addon/styles/rose/components/nav/_breadcrumbs.scss
+++ b/addons/rose/addon/styles/rose/components/nav/_breadcrumbs.scss
@@ -6,7 +6,7 @@
display: flex;
flex-wrap: wrap;
- .rose-nav-breadcrumbs-link {
+ .rose-nav-link {
--color: var(--ui-gray);
color: var(--color);
text-decoration: none;
diff --git a/addons/rose/app/components/rose/nav/link.js b/addons/rose/app/components/rose/nav/link.js
new file mode 100644
index 000000000..b4f6d844f
--- /dev/null
+++ b/addons/rose/app/components/rose/nav/link.js
@@ -0,0 +1 @@
+export { default } from 'rose/components/rose/nav/link';
diff --git a/addons/rose/package.json b/addons/rose/package.json
index fa13ad8c6..3254f48b0 100644
--- a/addons/rose/package.json
+++ b/addons/rose/package.json
@@ -34,7 +34,7 @@
"ember-cli-htmlbars": "^5.7.1",
"ember-focus-trap": "^0.7.0",
"ember-named-blocks-polyfill": "^0.2.5",
- "ember-radio-button": "^2.0.1",
+ "ember-radio-button": "github:yapplabs/ember-radio-button.git#b2ab65f",
"ember-uuid": "^2.1.0",
"emberx-select": "github:adopted-ember-addons/emberx-select#bc5f774"
},
diff --git a/addons/rose/tests/integration/components/rose/form/radio/group-test.js b/addons/rose/tests/integration/components/rose/form/radio/group-test.js
index 4354004e7..c1706fe5e 100644
--- a/addons/rose/tests/integration/components/rose/form/radio/group-test.js
+++ b/addons/rose/tests/integration/components/rose/form/radio/group-test.js
@@ -54,7 +54,10 @@ module('Integration | Component | rose/form/radio/group', function (hooks) {
test('it reflects active radiofield value in @selectedValue and triggers a @changed function', async function (assert) {
assert.expect(5);
- this.changed = (value) => assert.ok(value);
+ this.changed = (value) => {
+ this.selectedValue = value;
+ assert.ok(value);
+ };
await render(hbs`
`);
- assert.equal(findAll('.rose-nav-breadcrumbs-link').length, 2);
+ assert.equal(findAll('.rose-nav-link').length, 2);
});
});
diff --git a/addons/rose/tests/integration/components/rose/nav/link-test.js b/addons/rose/tests/integration/components/rose/nav/link-test.js
new file mode 100644
index 000000000..2887900bc
--- /dev/null
+++ b/addons/rose/tests/integration/components/rose/nav/link-test.js
@@ -0,0 +1,18 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'ember-qunit';
+import { render, find } from '@ember/test-helpers';
+import hbs from 'htmlbars-inline-precompile';
+
+module('Integration | Component | rose/nav/link', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ assert.expect(1);
+ await render(hbs`
+
+ Item Name
+
+ `);
+ assert.equal(find('.rose-nav-link').textContent.trim(), 'Item Name');
+ });
+});
diff --git a/ui/admin/app/components/bread-crumbs.js b/ui/admin/app/components/bread-crumbs.js
index 93f5a78a7..1f2ac7cea 100644
--- a/ui/admin/app/components/bread-crumbs.js
+++ b/ui/admin/app/components/bread-crumbs.js
@@ -1,9 +1,118 @@
-import BreadCrumbsComponent from 'ember-breadcrumbs/components/bread-crumbs';
+import Component from '@glimmer/component';
+import EmberObject, { computed, get } from '@ember/object';
import { inject as service } from '@ember/service';
+import { isBlank, isPresent } from '@ember/utils';
+import { A } from '@ember/array';
-export default class crumbs extends BreadCrumbsComponent {
+// This component copies and modifies source from ember-breadcrumbs 0.2.3,
+// updating it for Ember v4 compatibility.
+
+// The original copyright is below.
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2014-2019 Chris Farber
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+export default class BreadcrumbsComponent extends Component {
// =services
@service session;
@service scope;
+ @service router;
+
+ // =properties
+
+ /* eslint-disable-next-line ember/require-computed-property-dependencies */
+ @computed('router.currentRouteName')
+ get routeInfos() {
+ /* eslint-disable-next-line ember/no-private-routing-service */
+ return this.router._router._routerMicrolib.currentRouteInfos;
+ }
+
+ /*
+ For the pathNames and controllers properties, we must be careful not to NOT
+ specify the properties of the route in our dependent keys.
+
+ Observing the controller property of the route causes some serious problems:
+ https://github.com/chrisfarber/ember-breadcrumbs/issues/21
+ */
+
+ @computed('routeInfos.[]')
+ get pathNames() {
+ return this.routeInfos.map(function (routeInfo) {
+ return routeInfo.name;
+ });
+ }
+
+ @computed('routeInfos.[]')
+ get controllers() {
+ return this.routeInfos.map(function (routeInfo) {
+ var route = routeInfo.route || routeInfo.handler;
+ return route.controller;
+ });
+ }
+
+ @computed(
+ 'controllers.@each.{breadCrumbs,breadCrumb,breadCrumbPath,breadCrumbModel}',
+ 'pathNames.[]'
+ )
+ get breadCrumbs() {
+ var controllers = this.controllers;
+ var defaultPaths = this.pathNames;
+ var breadCrumbs = A([]);
+
+ controllers.forEach(function (controller, index) {
+ var crumbs = controller.breadCrumbs || A([]);
+ var singleCrumb = controller.breadCrumb;
+
+ if (!isBlank(singleCrumb)) {
+ crumbs.push({
+ label: singleCrumb,
+ path: controller.breadCrumbPath,
+ model: controller.breadCrumbModel,
+ });
+ }
+
+ crumbs.forEach(function (crumb) {
+ breadCrumbs.addObject(
+ EmberObject.create({
+ label: crumb.label,
+ path: crumb.path || defaultPaths[index],
+ model: crumb.model,
+ linkable: isPresent(crumb.linkable)
+ ? crumb.linkable
+ : crumb.path !== false,
+ isCurrent: false,
+ })
+ );
+ });
+ });
+
+ var deepestCrumb = get(breadCrumbs, 'lastObject');
+ if (deepestCrumb) {
+ deepestCrumb.isCurrent = true;
+ }
+
+ return breadCrumbs;
+ }
}
diff --git a/ui/admin/package.json b/ui/admin/package.json
index e25473b79..8455faaf3 100644
--- a/ui/admin/package.json
+++ b/ui/admin/package.json
@@ -49,7 +49,6 @@
"doctoc": "^2.1.0",
"ember-a11y-testing": "^4.2.0",
"ember-auto-import": "^1.12.0",
- "ember-breadcrumbs": "^0.2.3",
"ember-cli": "~4.1.0",
"ember-cli-app-version": "^5.0.0",
"ember-cli-babel": "^7.26.8",
diff --git a/ui/admin/tests/acceptance/auth-methods/oidc-test.js b/ui/admin/tests/acceptance/auth-methods/oidc-test.js
index 2ab3e56bd..a9a784cb8 100644
--- a/ui/admin/tests/acceptance/auth-methods/oidc-test.js
+++ b/ui/admin/tests/acceptance/auth-methods/oidc-test.js
@@ -64,7 +64,7 @@ module('Acceptance | auth methods | oidc', function (hooks) {
await visit(urls.authMethod);
await click('.rose-layout-page-actions .rose-dropdown-trigger');
assert.equal(
- find('.rose-dropdown[open] input[aria-checked=true]').value,
+ find('.rose-dropdown[open] input:checked').value,
instances.authMethod.attributes.state
);
});
diff --git a/yarn.lock b/yarn.lock
index 8d973cc1e..1edc8a96b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7867,7 +7867,7 @@ broccoli-output-wrapper@^3.2.5:
heimdalljs-logger "^0.1.10"
symlink-or-copy "^1.2.0"
-broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3:
+broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3:
version "1.4.6"
resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615"
integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw==
@@ -10524,13 +10524,6 @@ ember-autofocus-modifier@^2.0.0:
ember-cli-babel "^7.26.4"
ember-modifier "^2.1.1"
-ember-breadcrumbs@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/ember-breadcrumbs/-/ember-breadcrumbs-0.2.3.tgz#a95e02b73fdc2150f3d552e84a479d6dc96a8b31"
- integrity sha512-QUiPXwAlTeiXykF5RnyilEgcj9NSFGciAawktImv6V6Lq9sNfmJHZAYZXAg8U/wA1tw7CG0fQl991K+jtuBTKQ==
- dependencies:
- ember-cli-babel "^7.10.0"
-
ember-browser-services@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ember-browser-services/-/ember-browser-services-2.0.0.tgz#37481eccd3828e80b0ef3b97edd8ab0325cb6dc5"
@@ -10576,7 +10569,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em
resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879"
integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw==
-ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.9.2, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.26.8, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3:
+ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.26.8, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3:
version "7.26.11"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f"
integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA==
@@ -10651,17 +10644,6 @@ ember-cli-get-component-path-option@^1.0.0:
resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771"
integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=
-ember-cli-htmlbars@^1.1.1:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.5.tgz#65be9678b274b5e7861d7f75c188780af7ef9d13"
- integrity sha512-Qur/anb0Vk57qmIhGLkSzl8X1QIMoae6pLa14MRQ8+YD2N5fNs3qdhEFf0SDBquPOH1QxQtraiNQvji47QBJyg==
- dependencies:
- broccoli-persistent-filter "^1.0.3"
- ember-cli-version-checker "^1.0.2"
- hash-for-dep "^1.0.2"
- json-stable-stringify "^1.0.0"
- strip-bom "^2.0.0"
-
ember-cli-htmlbars@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.1.0.tgz#87806c2a0bca2ab52d4fb8af8e2215c1ca718a99"
@@ -10922,13 +10904,6 @@ ember-cli-typescript@^4.0.0, ember-cli-typescript@^4.1.0, ember-cli-typescript@^
stagehand "^1.0.0"
walk-sync "^2.2.0"
-ember-cli-version-checker@^1.0.2:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72"
- integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=
- dependencies:
- semver "^5.3.0"
-
ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3"
@@ -11449,13 +11424,12 @@ ember-qunit@^5.1.4:
silent-error "^1.1.1"
validate-peer-dependencies "^1.1.0"
-ember-radio-button@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/ember-radio-button/-/ember-radio-button-2.0.1.tgz#f081a44d581a4b1db88fef79ec5c47da712ab963"
- integrity sha512-cAAyFgNIM3PquowkWfa0lOSlq4PPst9vpkNiLi5yhd1LJ4lVtwgn6s+OpPXWKJLZdig2m31PWU8jxobcubge5w==
+"ember-radio-button@github:yapplabs/ember-radio-button.git#b2ab65f":
+ version "0.0.0"
+ resolved "https://codeload.github.com/yapplabs/ember-radio-button/tar.gz/b2ab65f81cae3b0f087cc99b8c01172b754cb181"
dependencies:
- ember-cli-babel "^6.9.2"
- ember-cli-htmlbars "^1.1.1"
+ ember-cli-babel "^7.26.3"
+ ember-cli-htmlbars "^5.7.1"
ember-resolver@^8.0.3:
version "8.0.3"