* fix: 🐛 add model hook to host route for dynamic host catalogs (#1659) * fix: 🐛 add model hook to host route for dynamic host catalogs ✅ Closes: ICU-8594 * refactor: 💡 remove page formatting for host route * [COMPLIANCE] Add Copyright and License Headers (#1660) Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com> Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com> * chore(deps-dev): bump webpack from 5.59.1 to 5.76.0 (#1654) Bumps [webpack](https://github.com/webpack/webpack) from 5.59.1 to 5.76.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.59.1...v5.76.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Randall Morey <randall@randallmorey.com> Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com> * Feature metadata (#1661) * feat: 🎸 load edition from controller-metadata.json * refactor: 💡 rename edition and add licensed features support * chore: 🤖 support dev toggling of licensed features * chore: 🤖 rename ent edition * Update ui/admin/app/services/feature-edition.js * Update ui/admin/app/instance-initializers/feature-edition.js Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com> * chore: 🤖 cleanup * chore: 🤖 feature edition disabled in tests / fix test cases * test: 💍 remove feature disable calls in tests * test: 💍 fix broken tests * fix: 🐛 fix config bug * fix: 🐛 fix broken test due to feature flags --------- Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com> * chore: 🤖 yarn.lock update * fix: 🐛 fix test features --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: lisbet-alvarez <107949262+lisbet-alvarez@users.noreply.github.com> Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com> Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com> Co-authored-by: github-team-secure-boundary <hc-github-team-secure-boundary@hashicorp.com> Co-authored-by: hc-github-team-secure-boundary <82989682+hc-github-team-secure-boundary@users.noreply.github.com>
146 lines
3.7 KiB
JavaScript
146 lines
3.7 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*/
|
|
|
|
import Route from '@ember/routing/route';
|
|
import { getOwner } from '@ember/application';
|
|
import { inject as service } from '@ember/service';
|
|
import { action } from '@ember/object';
|
|
import { loading } from 'ember-loading';
|
|
import { A } from '@ember/array';
|
|
|
|
/**
|
|
* Entry route for the application.
|
|
*/
|
|
export default class ApplicationRoute extends Route {
|
|
// =services
|
|
|
|
@service session;
|
|
@service confirm;
|
|
@service router;
|
|
@service intl;
|
|
@service features;
|
|
@service featureEdition;
|
|
|
|
// =attributes
|
|
|
|
routeIfUnauthenticated = 'index';
|
|
|
|
// =methods
|
|
|
|
constructor() {
|
|
super(...arguments);
|
|
/**
|
|
* If user attempts to navigate away from unsaved changes, the user is
|
|
* asked to confirm that they would like to discard the changes. If the
|
|
* user chooses discard, changes on the model are rolled back and the
|
|
* transition is retried. If the user cancels discard, the transition is
|
|
* aborted.
|
|
*/
|
|
this.router.on('routeWillChange', async (transition) => {
|
|
const fromName = transition?.from?.name;
|
|
const toName = transition?.to?.name;
|
|
const maybeModel = transition?.from?.attributes;
|
|
if (fromName !== toName && maybeModel?.hasDirtyAttributes) {
|
|
transition.abort();
|
|
try {
|
|
await this.confirm.confirm(this.intl.t('questions.abandon-confirm'), {
|
|
title: 'titles.abandon-confirm',
|
|
confirm: 'actions.discard',
|
|
});
|
|
maybeModel?.rollbackAttributes();
|
|
transition.retry();
|
|
} catch (e) {
|
|
// if user denies, do nothing
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
async beforeModel() {
|
|
this.intl.setLocale(['en-us']);
|
|
await this.session.setup();
|
|
const theme = this.session.get('data.theme');
|
|
this.toggleTheme(theme);
|
|
}
|
|
|
|
// =actions
|
|
|
|
/**
|
|
* Delegates invalidation to the session service.
|
|
*/
|
|
@action
|
|
invalidateSession() {
|
|
this.session.invalidate();
|
|
}
|
|
|
|
/**
|
|
* Hooks into ember-loading to kick off loading indicator in the
|
|
* application template.
|
|
* @return {boolean} always returns true
|
|
*/
|
|
@action
|
|
@loading
|
|
loading() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Invalidates the session if a 401 error occurs and returns false to
|
|
* prevent further error handling.
|
|
* Returns true in all other cases, allowing error handling to occur (such
|
|
* as displaying the `error.hbs` template, if one exists).
|
|
* @param {Error} e
|
|
*/
|
|
@action
|
|
error(e) {
|
|
const isUnauthenticated = A(e?.errors)?.firstObject?.isUnauthenticated;
|
|
if (isUnauthenticated) {
|
|
this.session.invalidate();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Applies the specified color theme to the root ember element.
|
|
* @param {string} theme - "light", "dark", or nullish (system default)
|
|
*/
|
|
@action
|
|
toggleTheme(theme) {
|
|
const rootElementSelector = getOwner(this).rootElement;
|
|
const rootEl = getOwner(this)
|
|
.lookup('service:-document')
|
|
.querySelector(rootElementSelector);
|
|
this.session.set('data.theme', theme);
|
|
switch (theme) {
|
|
case 'light':
|
|
rootEl.classList.add('rose-theme-light');
|
|
rootEl.classList.remove('rose-theme-dark');
|
|
break;
|
|
case 'dark':
|
|
rootEl.classList.add('rose-theme-dark');
|
|
rootEl.classList.remove('rose-theme-light');
|
|
break;
|
|
default:
|
|
rootEl.classList.remove('rose-theme-dark');
|
|
rootEl.classList.remove('rose-theme-light');
|
|
}
|
|
}
|
|
|
|
@action
|
|
toggleEdition(edition) {
|
|
this.featureEdition.setEdition(edition);
|
|
}
|
|
|
|
@action
|
|
toggleFeature(feature) {
|
|
if (this.features.isEnabled(feature)) {
|
|
this.features.disable(feature);
|
|
} else {
|
|
this.features.enable(feature);
|
|
}
|
|
}
|
|
}
|