From b1b49edb3989965a1833e7578c1419b40c62ac7c Mon Sep 17 00:00:00 2001
From: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com>
Date: Wed, 25 Feb 2026 13:55:36 -0800
Subject: [PATCH] Refactor hds side nav to hds app side nav and header (#3032)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* refactor: 💡 use hds app header and app side nav
* style: 💄 fix dark-mode colors for side nav and app header
* style: 💄 cleanup
* style: 💄 simplify selector
* refactor: 💡 move util (param finder) to core addon
* refactor: 💡 move scope picker to core addon
* refactor: 💡 use hds header and app side nav in ui/desktop
* refactor: 💡 clean up ui/desktop files
* refactor: 💡 remove uneeded header components
* refactor: 💡 remove uneeded global layout
* Add missing copyright headers
* style: 💄 adjust foreground and background colors to fix contras
* style: 💄 remove uneeded stylelint disables
* style: 💄 fix dark mode styling in desktop ui
* refactor: 💡 readd user-select style
* test: 💍 fix tests + e2e tests for admin and desktop UIs
* refactor: 💡 clean up uneeded main elements and fix color link
* Add missing copyright headers
* fix: 🐛 e2e test selectors for ui/desktop
* style: 💄 revert link color change
* refactor: 💡 remove hds override
* fix: 🐛 scope dropdown for desktop
* fix: 🐛 max-height to desktop scope dropdown
* Add missing copyright headers
* chore: 🤖 update lockfile due to webpack update
---
.../core/addon}/utils/param-value-finder.js | 0
.../app/utils/param-value-finder.js} | 2 +-
.../unit/utils/param-value-finder-test.js | 55 ++++
.../components/rose/header/brand/index.hbs | 24 --
.../addon/components/rose/header/index.hbs | 14 -
.../components/rose/header/nav/index.hbs | 8 -
.../rose/header/utilities/index.hbs | 8 -
.../components/rose/layout/global/index.hbs | 16 -
addons/rose/addon/styles/hds/overrides.scss | 33 --
.../dark-mode/_color-tokens-tier-2.scss | 23 ++
.../styles/hds/themes/dark-mode/index.scss | 78 +++++
.../rose/app/components/rose/header/brand.js | 6 -
addons/rose/app/components/rose/header/nav.js | 6 -
.../app/components/rose/header/utilities.js | 6 -
.../rose/app/components/rose/layout/global.js | 6 -
.../app/styles/rose/components/_index.scss | 1 -
.../styles/rose/components/header/_brand.scss | 36 ---
.../rose/components/header/_dropdown.scss | 13 -
.../styles/rose/components/header/_index.scss | 47 ---
.../styles/rose/components/header/_nav.scss | 20 --
.../rose/components/header/_utilities.scss | 15 -
.../rose/components/layout/_global.scss | 15 -
.../styles/rose/components/layout/_index.scss | 1 -
.../styles/rose/components/layout/_page.scss | 1 +
.../components/rose/header-test.js | 56 ----
.../components/rose/header/brand-test.js | 25 --
.../components/rose/header/nav-test.js | 18 --
.../components/rose/header/utilities-test.js | 18 --
.../components/rose/layout/global-test.js | 45 ---
e2e-tests/admin/pages/auth-methods.js | 6 +-
e2e-tests/admin/pages/credential-stores.js | 6 +-
e2e-tests/admin/pages/groups.js | 2 +-
e2e-tests/admin/pages/host-catalogs.js | 2 +-
e2e-tests/admin/pages/login.js | 4 +-
e2e-tests/admin/pages/orgs.js | 2 +-
e2e-tests/admin/pages/projects.js | 2 +-
e2e-tests/admin/pages/roles.js | 2 +-
e2e-tests/admin/pages/sessions.js | 2 +-
e2e-tests/admin/pages/targets.js | 6 +-
e2e-tests/admin/pages/users.js | 2 +-
e2e-tests/admin/tests/alias-ent.spec.js | 4 +-
e2e-tests/admin/tests/alias.spec.js | 2 +-
.../admin/tests/auth-method-ldap.spec.js | 6 +-
.../tests/auth-method-oidc-vault.spec.js | 4 +-
.../admin/tests/auth-method-password.spec.js | 4 +-
.../dynamic-host-catalog-aws-ent.spec.js | 4 +-
.../tests/dynamic-host-catalog-aws.spec.js | 4 +-
e2e-tests/admin/tests/global-settings.spec.js | 2 +-
e2e-tests/admin/tests/pagination.spec.js | 2 +-
.../tests/session-recording-aws-ent.spec.js | 2 +-
.../tests/session-recording-minio-ent.spec.js | 2 +-
e2e-tests/admin/tests/target.spec.js | 2 +-
e2e-tests/admin/tests/worker-ent.spec.js | 2 +-
e2e-tests/admin/tests/worker-tags.spec.js | 4 +-
e2e-tests/admin/tests/worker.spec.js | 2 +-
e2e-tests/desktop/tests/scope.spec.js | 8 +-
pnpm-lock.yaml | 3 +
ui/admin/app/components/header-nav/index.hbs | 41 ---
ui/admin/app/components/header-nav/index.js | 14 -
.../app/components/scope-picker/index.hbs | 10 +-
ui/admin/app/components/scope-picker/index.js | 2 +-
ui/admin/app/controllers/application.js | 2 +-
.../scopes/scope/auth-methods/auth-method.js | 2 +-
.../credential-stores/credential-store.js | 2 +-
.../scope/host-catalogs/host-catalog.js | 2 +-
.../host-catalog/host-sets/host-set.js | 2 +-
.../session-recordings/session-recording.js | 2 +-
ui/admin/app/styles/app.scss | 34 +-
ui/admin/app/templates/application.hbs | 291 +++++++++---------
.../app/templates/authentication-complete.hbs | 14 +-
.../app/templates/authentication-error.hbs | 20 +-
ui/admin/app/templates/scopes/scope.hbs | 9 +-
.../accounts/change-password-test.js | 4 +-
.../tests/acceptance/authentication-test.js | 2 +-
ui/admin/tests/acceptance/scopes-test.js | 12 +-
ui/admin/tests/helpers/selectors.js | 21 +-
.../components/scope-picker/index-test.js | 14 +-
.../unit/utils/param-value-finder-test.js | 39 ---
ui/desktop/app/controllers/application.js | 54 ++++
ui/desktop/app/controllers/scopes/scope.js | 13 -
ui/desktop/app/routes/scopes/scope.js | 16 +-
ui/desktop/app/styles/app.scss | 155 +++-------
ui/desktop/app/templates/application.hbs | 159 +++++++---
ui/desktop/app/templates/cluster-url.hbs | 68 ++--
ui/desktop/app/templates/error.hbs | 24 +-
ui/desktop/app/templates/scopes/scope.hbs | 29 +-
.../templates/scopes/scope/authenticate.hbs | 134 ++++----
.../app/templates/scopes/scope/projects.hbs | 46 ++-
ui/desktop/package.json | 1 +
.../tests/acceptance/application-test.js | 4 +-
.../tests/acceptance/authentication-test.js | 3 +-
.../projects/sessions/index-test.js | 6 +-
.../acceptance/projects/targets/index-test.js | 6 +-
ui/desktop/tests/acceptance/scopes-test.js | 16 +-
94 files changed, 784 insertions(+), 1178 deletions(-)
rename {ui/admin/app => addons/core/addon}/utils/param-value-finder.js (100%)
rename addons/{rose/app/components/rose/header.js => core/app/utils/param-value-finder.js} (58%)
create mode 100644 addons/core/tests/unit/utils/param-value-finder-test.js
delete mode 100644 addons/rose/addon/components/rose/header/brand/index.hbs
delete mode 100644 addons/rose/addon/components/rose/header/index.hbs
delete mode 100644 addons/rose/addon/components/rose/header/nav/index.hbs
delete mode 100644 addons/rose/addon/components/rose/header/utilities/index.hbs
delete mode 100644 addons/rose/addon/components/rose/layout/global/index.hbs
delete mode 100644 addons/rose/app/components/rose/header/brand.js
delete mode 100644 addons/rose/app/components/rose/header/nav.js
delete mode 100644 addons/rose/app/components/rose/header/utilities.js
delete mode 100644 addons/rose/app/components/rose/layout/global.js
delete mode 100644 addons/rose/app/styles/rose/components/header/_brand.scss
delete mode 100644 addons/rose/app/styles/rose/components/header/_dropdown.scss
delete mode 100644 addons/rose/app/styles/rose/components/header/_index.scss
delete mode 100644 addons/rose/app/styles/rose/components/header/_nav.scss
delete mode 100644 addons/rose/app/styles/rose/components/header/_utilities.scss
delete mode 100644 addons/rose/app/styles/rose/components/layout/_global.scss
delete mode 100644 addons/rose/tests/integration/components/rose/header-test.js
delete mode 100644 addons/rose/tests/integration/components/rose/header/brand-test.js
delete mode 100644 addons/rose/tests/integration/components/rose/header/nav-test.js
delete mode 100644 addons/rose/tests/integration/components/rose/header/utilities-test.js
delete mode 100644 addons/rose/tests/integration/components/rose/layout/global-test.js
delete mode 100644 ui/admin/app/components/header-nav/index.hbs
delete mode 100644 ui/admin/app/components/header-nav/index.js
delete mode 100644 ui/admin/tests/unit/utils/param-value-finder-test.js
delete mode 100644 ui/desktop/app/controllers/scopes/scope.js
diff --git a/ui/admin/app/utils/param-value-finder.js b/addons/core/addon/utils/param-value-finder.js
similarity index 100%
rename from ui/admin/app/utils/param-value-finder.js
rename to addons/core/addon/utils/param-value-finder.js
diff --git a/addons/rose/app/components/rose/header.js b/addons/core/app/utils/param-value-finder.js
similarity index 58%
rename from addons/rose/app/components/rose/header.js
rename to addons/core/app/utils/param-value-finder.js
index 8a832c21d..32d925f60 100644
--- a/addons/rose/app/components/rose/header.js
+++ b/addons/core/app/utils/param-value-finder.js
@@ -3,4 +3,4 @@
* SPDX-License-Identifier: BUSL-1.1
*/
-export { default } from 'rose/components/rose/header';
+export { default } from 'core/utils/param-value-finder';
diff --git a/addons/core/tests/unit/utils/param-value-finder-test.js b/addons/core/tests/unit/utils/param-value-finder-test.js
new file mode 100644
index 000000000..cfdd13106
--- /dev/null
+++ b/addons/core/tests/unit/utils/param-value-finder-test.js
@@ -0,0 +1,55 @@
+/**
+ * Copyright IBM Corp. 2021, 2026
+ * SPDX-License-Identifier: BUSL-1.1
+ */
+
+import { module, test } from 'qunit';
+import { setupTest } from 'ember-qunit';
+import { paramValueFinder } from 'core/utils/param-value-finder';
+
+module('Unit | Utility | param-value-finder', function (hooks) {
+ setupTest(hooks);
+
+ test('returns empty array when null or empty routeInfo object is used', function (assert) {
+ let result = paramValueFinder('scopes', null);
+
+ assert.deepEqual(result, []);
+
+ result = paramValueFinder('scopes', {});
+
+ assert.deepEqual(result, []);
+ });
+
+ test('returns correct array when routeInfo object is used', function (assert) {
+ // Route being tested is '/scopes'
+ const application = { localName: 'application', params: {}, parent: null };
+ const scopes = { localName: 'scopes', params: {}, parent: application };
+ const scopesIndex = {
+ localName: 'index',
+ name: 'scopes.index',
+ parent: scopes,
+ };
+ let result = paramValueFinder('scopes', scopesIndex.parent);
+
+ assert.deepEqual(result, []);
+
+ // Route being tested is '/scopes/global/auth-methods'
+ const scope = {
+ localName: 'scope',
+ params: { scope_id: 'global' },
+ parent: scopes,
+ };
+ const authMethods = {
+ localName: 'auth-methods',
+ params: {},
+ parent: scope,
+ };
+ const authMethodsIndex = {
+ localName: 'index',
+ name: 'scopes.scope.auth-methods.index',
+ parent: authMethods,
+ };
+ result = paramValueFinder('scopes', authMethodsIndex.parent);
+ assert.deepEqual(result, ['global']);
+ });
+});
diff --git a/addons/rose/addon/components/rose/header/brand/index.hbs b/addons/rose/addon/components/rose/header/brand/index.hbs
deleted file mode 100644
index 6fb597932..000000000
--- a/addons/rose/addon/components/rose/header/brand/index.hbs
+++ /dev/null
@@ -1,24 +0,0 @@
-{{!
- Copyright IBM Corp. 2021, 2026
- SPDX-License-Identifier: BUSL-1.1
-}}
-
-