mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-30 02:02:43 +00:00
UI: Ember upgrade: Handle deprecation router service from host (#28603)
* use alias for router injection * update @router declarations in engine files * fix remaining pki router imports * dynamically set router based on owner * address replication routers * update markdown docs * use non-deprecated import for getOwner * revert out of scope changes * add transition-to test
This commit is contained in:
@@ -8,7 +8,6 @@ import Resolver from 'ember-resolver';
|
||||
import loadInitializers from 'ember-load-initializers';
|
||||
import config from 'vault/config/environment';
|
||||
|
||||
// TODO: DEPRECATION https://ember-engines.com/docs/deprecations#-use-alias-for-inject-router-service-from-host-application
|
||||
export default class App extends Application {
|
||||
modulePrefix = config.modulePrefix;
|
||||
podModulePrefix = config.podModulePrefix;
|
||||
@@ -16,12 +15,20 @@ export default class App extends Application {
|
||||
engines = {
|
||||
'config-ui': {
|
||||
dependencies: {
|
||||
services: ['auth', 'flash-messages', 'namespace', 'router', 'store', 'version', 'custom-messages'],
|
||||
services: [
|
||||
'auth',
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
{ 'app-router': 'router' },
|
||||
'store',
|
||||
'version',
|
||||
'custom-messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
'open-api-explorer': {
|
||||
dependencies: {
|
||||
services: ['auth', 'flash-messages', 'namespace', 'router', 'version'],
|
||||
services: ['auth', 'flash-messages', 'namespace', { 'app-router': 'router' }, 'version'],
|
||||
},
|
||||
},
|
||||
replication: {
|
||||
@@ -32,7 +39,7 @@ export default class App extends Application {
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'replication-mode',
|
||||
'router',
|
||||
{ 'app-router': 'router' },
|
||||
'store',
|
||||
'version',
|
||||
'-portal',
|
||||
@@ -51,7 +58,7 @@ export default class App extends Application {
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'path-help',
|
||||
'router',
|
||||
{ 'app-router': 'router' },
|
||||
'store',
|
||||
'version',
|
||||
'secret-mount-path',
|
||||
@@ -63,7 +70,7 @@ export default class App extends Application {
|
||||
},
|
||||
kubernetes: {
|
||||
dependencies: {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages'],
|
||||
services: [{ 'app-router': 'router' }, 'store', 'secret-mount-path', 'flash-messages'],
|
||||
externalRoutes: {
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
},
|
||||
@@ -71,7 +78,7 @@ export default class App extends Application {
|
||||
},
|
||||
ldap: {
|
||||
dependencies: {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages', 'auth'],
|
||||
services: [{ 'app-router': 'router' }, 'store', 'secret-mount-path', 'flash-messages', 'auth'],
|
||||
externalRoutes: {
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
},
|
||||
@@ -85,7 +92,7 @@ export default class App extends Application {
|
||||
'download',
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'router',
|
||||
{ 'app-router': 'router' },
|
||||
'secret-mount-path',
|
||||
'store',
|
||||
'version',
|
||||
@@ -104,7 +111,7 @@ export default class App extends Application {
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'path-help',
|
||||
'router',
|
||||
{ 'app-router': 'router' },
|
||||
'secret-mount-path',
|
||||
'store',
|
||||
'version',
|
||||
@@ -118,7 +125,7 @@ export default class App extends Application {
|
||||
},
|
||||
sync: {
|
||||
dependencies: {
|
||||
services: ['flash-messages', 'flags', 'router', 'store', 'version'],
|
||||
services: ['flash-messages', 'flags', { 'app-router': 'router' }, 'store', 'version'],
|
||||
externalRoutes: {
|
||||
kvSecretOverview: 'vault.cluster.secrets.backend.kv.secret.index',
|
||||
clientCountOverview: 'vault.cluster.clients',
|
||||
|
||||
@@ -96,7 +96,7 @@ export default class <EngineName>Engine extends Engine {
|
||||
modulePrefix = modulePrefix;
|
||||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages'],
|
||||
services: ['app-router', 'store', 'secret-mount-path', 'flash-messages'],
|
||||
externalRoutes: ['secrets'],
|
||||
};
|
||||
}
|
||||
@@ -128,7 +128,7 @@ The external route dependencies allow you to link to a route outside of your eng
|
||||
|
||||
## Register your engine with our main application:
|
||||
|
||||
In our `app/app.js` file in the engines object, add your engine’s name and dependencies.
|
||||
In our `app/app.js` file in the engines object, add your engine’s name and dependencies. The `router` service must be referenced via an alias within engines. The pattern is to use `app-router` as the alias, see example below.
|
||||
|
||||
```js
|
||||
/**
|
||||
@@ -146,7 +146,7 @@ export default class App extends Application {
|
||||
engines = {
|
||||
<engine-name>: {
|
||||
dependencies: {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages', <any-other-dependencies-you-have>],
|
||||
services: [{ 'app-router': 'router' }, 'store', 'secret-mount-path', 'flash-messages', <any-other-dependencies-you-have>],
|
||||
externalRoutes: {
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
},
|
||||
|
||||
@@ -23,7 +23,7 @@ import { isAfter } from 'date-fns';
|
||||
*/
|
||||
|
||||
export default class MessagesList extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
@service flashMessages;
|
||||
@service customMessages;
|
||||
|
||||
@@ -20,7 +20,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
|
||||
export default class MessageDetails extends Component {
|
||||
@service store;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service flashMessages;
|
||||
@service customMessages;
|
||||
@service namespace;
|
||||
|
||||
@@ -24,7 +24,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
|
||||
export default class MessagesList extends Component {
|
||||
@service store;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service flashMessages;
|
||||
@service namespace;
|
||||
@service customMessages;
|
||||
|
||||
@@ -16,7 +16,7 @@ export default class ConfigUiEngine extends Engine {
|
||||
modulePrefix = modulePrefix;
|
||||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['auth', 'store', 'flash-messages', 'namespace', 'router', 'version', 'custom-messages'],
|
||||
services: ['auth', 'store', 'flash-messages', 'namespace', 'app-router', 'version', 'custom-messages'],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
import Component from '@glimmer/component';
|
||||
import { service } from '@ember/service';
|
||||
import { getOwner } from '@ember/owner';
|
||||
import { action } from '@ember/object';
|
||||
import { encodePath } from 'vault/utils/path-encoding-helpers';
|
||||
|
||||
@@ -26,7 +26,14 @@ import { encodePath } from 'vault/utils/path-encoding-helpers';
|
||||
*/
|
||||
|
||||
export default class LinkedBlockComponent extends Component {
|
||||
@service router;
|
||||
// We don't import the router service here because Ember Engine's use the alias 'app-router'
|
||||
// Since this component is shared across engines, we look up the router dynamically using getOwner instead.
|
||||
// This way we avoid throwing an error by looking up a service that doesn't exist.
|
||||
// https://guides.emberjs.com/release/services/#toc_accessing-services
|
||||
get router() {
|
||||
const owner = getOwner(this);
|
||||
return owner.lookup('service:router') || owner.lookup('service:app-router');
|
||||
}
|
||||
|
||||
@action
|
||||
onClick(event) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import { action } from '@ember/object';
|
||||
import { service } from '@ember/service';
|
||||
import { task } from 'ember-concurrency';
|
||||
import { waitFor } from '@ember/test-waiters';
|
||||
import { getOwner } from '@ember/owner';
|
||||
|
||||
/**
|
||||
* @module ReplicationPage
|
||||
@@ -28,9 +29,14 @@ const MODE = {
|
||||
|
||||
export default class ReplicationPage extends Component {
|
||||
@service store;
|
||||
@service router;
|
||||
@tracked reindexingDetails = null;
|
||||
|
||||
// This component renders both within and outside the replication engine so we have to dynamically look up the router
|
||||
get router() {
|
||||
const owner = getOwner(this);
|
||||
return owner.lookup('service:router') || owner.lookup('service:app-router');
|
||||
}
|
||||
|
||||
@action onModeUpdate(evt, replicationMode) {
|
||||
// Called on did-insert and did-update
|
||||
this.getReplicationModeStatus.perform(replicationMode);
|
||||
|
||||
31
ui/lib/core/addon/helpers/transition-to.js
Normal file
31
ui/lib/core/addon/helpers/transition-to.js
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Copyright (c) HashiCorp, Inc.
|
||||
* SPDX-License-Identifier: BUSL-1.1
|
||||
*/
|
||||
|
||||
import Helper from '@ember/component/helper';
|
||||
import { getOwner } from '@ember/owner';
|
||||
|
||||
/*
|
||||
template helper that replaces ember-router-helpers https://github.com/rwjblue/ember-router-helpers
|
||||
example:
|
||||
<MyForm @onSave={{transition-to "vault.cluster.some.route.item" "item-id"}} />
|
||||
<MyForm @onSave={{transition-to "vault.cluster.some.external.route" external=true}} />
|
||||
*/
|
||||
export default class TransitionTo extends Helper {
|
||||
// We don't import the router service here because Ember Engine's use the alias 'app-router'
|
||||
// Since this helper is shared across engines, we look up the router dynamically using getOwner instead.
|
||||
// This way we avoid throwing an error by looking up a service that doesn't exist.
|
||||
// https://guides.emberjs.com/release/services/#toc_accessing-services
|
||||
get router() {
|
||||
const owner = getOwner(this);
|
||||
return owner.lookup('service:router') || owner.lookup('service:app-router');
|
||||
}
|
||||
|
||||
compute(routeParams, { external = false }) {
|
||||
if (external) {
|
||||
return () => this.router.transitionToExternal(...routeParams);
|
||||
}
|
||||
return () => this.router.transitionTo(...routeParams);
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import { task } from 'ember-concurrency';
|
||||
|
||||
export default Mixin.create({
|
||||
store: service(),
|
||||
router: service(),
|
||||
loading: or('save.isRunning', 'submitSuccess.isRunning'),
|
||||
onDisable() {},
|
||||
onPromote() {},
|
||||
|
||||
6
ui/lib/core/app/helpers/transition-to.js
Normal file
6
ui/lib/core/app/helpers/transition-to.js
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Copyright (c) HashiCorp, Inc.
|
||||
* SPDX-License-Identifier: BUSL-1.1
|
||||
*/
|
||||
|
||||
export { default } from 'core/helpers/transition-to';
|
||||
@@ -9,7 +9,7 @@ import { action } from '@ember/object';
|
||||
|
||||
export default class CredentialsShowController extends Controller {
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
@action
|
||||
async revokeCredentials() {
|
||||
|
||||
@@ -9,7 +9,7 @@ import { action } from '@ember/object';
|
||||
|
||||
export default class RoleController extends Controller {
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
@action
|
||||
async deleteRole() {
|
||||
|
||||
@@ -20,7 +20,7 @@ const Eng = Engine.extend({
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'path-help',
|
||||
'router',
|
||||
'app-router',
|
||||
'store',
|
||||
'version',
|
||||
'secret-mount-path',
|
||||
|
||||
@@ -18,7 +18,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
* @param {object} model - config model that contains kubernetes configuration
|
||||
*/
|
||||
export default class ConfigurePageComponent extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked inferredState;
|
||||
|
||||
@@ -23,7 +23,7 @@ import timestamp from 'vault/utils/timestamp';
|
||||
*/
|
||||
export default class CredentialsPageComponent extends Component {
|
||||
@service store;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
@tracked ttl = '';
|
||||
@tracked clusterRoleBinding = false;
|
||||
|
||||
@@ -19,7 +19,7 @@ import { action } from '@ember/object';
|
||||
*/
|
||||
|
||||
export default class OverviewPageComponent extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
@tracked selectedRole = null;
|
||||
@tracked roleOptions = [];
|
||||
|
||||
@@ -20,7 +20,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
*/
|
||||
|
||||
export default class CreateAndEditRolePageComponent extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service flashMessages;
|
||||
|
||||
@tracked roleRulesTemplates;
|
||||
|
||||
@@ -17,7 +17,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
*/
|
||||
|
||||
export default class RoleDetailsPageComponent extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service flashMessages;
|
||||
|
||||
get extraFields() {
|
||||
|
||||
@@ -23,7 +23,7 @@ import keys from 'core/utils/key-codes';
|
||||
*/
|
||||
export default class RolesPageComponent extends Component {
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@tracked query;
|
||||
@tracked roleToDelete = null;
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export default class KubernetesEngine extends Engine {
|
||||
modulePrefix = modulePrefix;
|
||||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages'],
|
||||
services: ['app-router', 'store', 'secret-mount-path', 'flash-messages'],
|
||||
externalRoutes: ['secrets'],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default class KubernetesRoute extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.kubernetes.overview');
|
||||
|
||||
@@ -7,7 +7,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default class KubernetesRoleRoute extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.kubernetes.roles.role.details');
|
||||
|
||||
@@ -31,7 +31,7 @@ import { task, timeout } from 'ember-concurrency';
|
||||
*/
|
||||
|
||||
export default class KvListFilterComponent extends Component {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@tracked query;
|
||||
|
||||
constructor() {
|
||||
|
||||
@@ -26,7 +26,7 @@ import { pathIsDirectory } from 'kv/utils/kv-breadcrumbs';
|
||||
|
||||
export default class KvListPageComponent extends Component {
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked secretPath;
|
||||
|
||||
@@ -41,7 +41,7 @@ import { isAdvancedSecret } from 'core/utils/advanced-secret';
|
||||
|
||||
export default class KvSecretDetails extends Component {
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked showJsonView = false;
|
||||
|
||||
@@ -31,7 +31,7 @@ import { isAdvancedSecret } from 'core/utils/advanced-secret';
|
||||
export default class KvSecretEdit extends Component {
|
||||
@service controlGroup;
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
@tracked showJsonView = false;
|
||||
@tracked showDiff = false;
|
||||
|
||||
@@ -37,7 +37,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
export default class KvSecretMetadataDetails extends Component {
|
||||
@service controlGroup;
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked error = null;
|
||||
|
||||
@@ -37,7 +37,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
export default class KvSecretPatch extends Component {
|
||||
@service controlGroup;
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked controlGroupError;
|
||||
|
||||
@@ -28,7 +28,7 @@ import errorMessage from 'vault/utils/error-message';
|
||||
export default class KvSecretCreate extends Component {
|
||||
@service controlGroup;
|
||||
@service flashMessages;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
@tracked showJsonView = false;
|
||||
|
||||
@@ -22,7 +22,7 @@ export default class KvEngine extends Engine {
|
||||
'download',
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'router',
|
||||
'app-router',
|
||||
'secret-mount-path',
|
||||
'store',
|
||||
'version',
|
||||
|
||||
@@ -7,7 +7,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default class KvRoute extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.kv.list');
|
||||
|
||||
@@ -12,7 +12,7 @@ import { pathIsDirectory } from 'kv/utils/kv-breadcrumbs';
|
||||
|
||||
export default class KvSecretsListRoute extends Route {
|
||||
@service store;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service secretMountPath;
|
||||
|
||||
queryParams = {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { service } from '@ember/service';
|
||||
import { breadcrumbsForSecret } from 'kv/utils/kv-breadcrumbs';
|
||||
|
||||
export default class SecretIndex extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
|
||||
@@ -8,7 +8,7 @@ import { breadcrumbsForSecret } from 'kv/utils/kv-breadcrumbs';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default class SecretPatch extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
|
||||
@@ -29,7 +29,7 @@ interface SchemaOption {
|
||||
|
||||
export default class LdapConfigurePageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked showRotatePrompt = false;
|
||||
@tracked modelValidations: ValidationMap | null = null;
|
||||
|
||||
@@ -23,7 +23,7 @@ interface Args {
|
||||
|
||||
export default class LdapCreateAndEditLibraryPageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked modelValidations: ValidationMap | null = null;
|
||||
@tracked invalidFormMessage = '';
|
||||
|
||||
@@ -20,7 +20,7 @@ interface Args {
|
||||
|
||||
export default class LdapLibraryDetailsPageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@action
|
||||
async delete() {
|
||||
|
||||
@@ -21,7 +21,7 @@ interface Args {
|
||||
|
||||
export default class LdapLibraryDetailsAccountsPageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked showCheckOutPrompt = false;
|
||||
@tracked checkOutTtl: string | null = null;
|
||||
|
||||
@@ -25,7 +25,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class LdapLibrariesPageComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked selectedRole: LdapRoleModel | undefined;
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ interface RoleTypeOption {
|
||||
|
||||
export default class LdapCreateAndEditRolePageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
|
||||
@tracked modelValidations: ValidationMap | null = null;
|
||||
|
||||
@@ -23,7 +23,7 @@ interface Args {
|
||||
|
||||
export default class LdapRoleDetailsPageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
|
||||
@action
|
||||
|
||||
@@ -27,7 +27,7 @@ interface Args {
|
||||
|
||||
export default class LdapRolesPageComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@tracked credsToRotate: LdapRoleModel | null = null;
|
||||
@tracked roleToDelete: LdapRoleModel | null = null;
|
||||
|
||||
@@ -14,7 +14,7 @@ export default class LdapEngine extends Engine {
|
||||
modulePrefix = modulePrefix;
|
||||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['router', 'store', 'secret-mount-path', 'flash-messages', 'auth'],
|
||||
services: ['app-router', 'store', 'secret-mount-path', 'flash-messages', 'auth'],
|
||||
externalRoutes: ['secrets'],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ interface LdapLibraryCheckOutController extends Controller {
|
||||
|
||||
export default class LdapLibraryCheckOutRoute extends Route {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
accountsRoute = 'vault.cluster.secrets.backend.ldap.libraries.library.details.accounts';
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import { service } from '@ember/service';
|
||||
import type RouterService from '@ember/routing/router-service';
|
||||
|
||||
export default class LdapLibraryRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.ldap.libraries.library.details.accounts');
|
||||
|
||||
@@ -9,7 +9,7 @@ import { service } from '@ember/service';
|
||||
import type RouterService from '@ember/routing/router-service';
|
||||
|
||||
export default class LdapLibraryRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.ldap.libraries.library.details');
|
||||
|
||||
@@ -9,7 +9,7 @@ import { service } from '@ember/service';
|
||||
import type RouterService from '@ember/routing/router-service';
|
||||
|
||||
export default class LdapRoleRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.ldap.roles.role.details');
|
||||
|
||||
@@ -14,7 +14,7 @@ const Eng = Engine.extend({
|
||||
modulePrefix,
|
||||
Resolver,
|
||||
dependencies: {
|
||||
services: ['auth', 'flash-messages', 'namespace', 'router', 'version'],
|
||||
services: ['auth', 'flash-messages', 'namespace', 'app-router', 'version'],
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ interface Args {
|
||||
|
||||
export default class PkiConfigurationDetails extends Component<Args> {
|
||||
@service declare readonly store: Store;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly version: VersionService;
|
||||
@tracked showDeleteAllIssuers = false;
|
||||
|
||||
@@ -44,7 +44,7 @@ interface ErrorObject {
|
||||
message: string;
|
||||
}
|
||||
export default class PkiConfigurationEditComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly version: VersionService;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import Component from '@glimmer/component';
|
||||
import { service } from '@ember/service';
|
||||
import { tracked } from '@glimmer/tracking';
|
||||
import type Store from '@ember-data/store';
|
||||
import type Router from '@ember/routing/router';
|
||||
import type RouterService from '@ember/routing/router';
|
||||
import type FlashMessageService from 'vault/services/flash-messages';
|
||||
import type PkiActionModel from 'vault/models/pki/action';
|
||||
import type { Breadcrumb } from 'vault/vault/app-types';
|
||||
@@ -26,9 +26,9 @@ interface Args {
|
||||
* and form submission and cancel actions.
|
||||
*/
|
||||
export default class PkiConfigureCreate extends Component<Args> {
|
||||
@service declare readonly store: Store;
|
||||
@service declare readonly router: Router;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly store: Store;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked title = 'Configure PKI';
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class PkiIssuerEditComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
@tracked usageValues: Array<string> = [];
|
||||
|
||||
@@ -11,7 +11,7 @@ import { waitFor } from '@ember/test-waiters';
|
||||
import { task } from 'ember-concurrency';
|
||||
import errorMessage from 'vault/utils/error-message';
|
||||
import type Store from '@ember-data/store';
|
||||
import type Router from '@ember/routing/router';
|
||||
import type RouterService from '@ember/routing/router';
|
||||
import type FlashMessageService from 'vault/services/flash-messages';
|
||||
import type SecretMountPath from 'vault/services/secret-mount-path';
|
||||
import type PkiIssuerModel from 'vault/models/pki/issuer';
|
||||
@@ -31,10 +31,10 @@ const RADIO_BUTTON_KEY = {
|
||||
};
|
||||
|
||||
export default class PagePkiIssuerRotateRootComponent extends Component<Args> {
|
||||
@service declare readonly store: Store;
|
||||
@service declare readonly router: Router;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly secretMountPath: SecretMountPath;
|
||||
@service declare readonly store: Store;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked displayedForm = RADIO_BUTTON_KEY.oldSettings;
|
||||
@tracked showOldSettings = false;
|
||||
|
||||
@@ -15,7 +15,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class PkiKeyDetails extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
@action
|
||||
|
||||
@@ -19,7 +19,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class PkiOverview extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: Store;
|
||||
|
||||
@tracked rolesValue = '';
|
||||
|
||||
@@ -17,7 +17,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class DetailsPage extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly secretMountPath: SecretMountPath;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ export default class PkiTidyStatusComponent extends Component<Args> {
|
||||
@service declare readonly secretMountPath: SecretMountPath;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly version: VersionService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked tidyOptionsModal = false;
|
||||
@tracked confirmCancelTidy = false;
|
||||
|
||||
@@ -51,7 +51,7 @@ interface Args {
|
||||
*/
|
||||
export default class PkiGenerateRootComponent extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked modelValidations: ValidationMap | null = null;
|
||||
@tracked errorBanner = '';
|
||||
|
||||
@@ -9,7 +9,7 @@ import { task } from 'ember-concurrency';
|
||||
import { service } from '@ember/service';
|
||||
import { tracked } from '@glimmer/tracking';
|
||||
import errorMessage from 'vault/utils/error-message';
|
||||
import type Router from '@ember/routing/router';
|
||||
import type RouterService from '@ember/routing/router';
|
||||
import type Store from '@ember-data/store';
|
||||
import type FlashMessageService from 'vault/services/flash-messages';
|
||||
import type DownloadService from 'vault/services/download';
|
||||
@@ -23,10 +23,10 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class PkiRoleGenerate extends Component<Args> {
|
||||
@service declare readonly router: Router;
|
||||
@service declare readonly store: Store;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly download: DownloadService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly store: Store;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked errorBanner = '';
|
||||
@tracked invalidFormAlert = '';
|
||||
|
||||
@@ -30,7 +30,7 @@ interface PkiTidyBooleans {
|
||||
}
|
||||
|
||||
export default class PkiTidyForm extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked errorBanner = '';
|
||||
@tracked invalidFormAlert = '';
|
||||
|
||||
@@ -22,7 +22,7 @@ export default class PkiEngine extends Engine {
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'path-help',
|
||||
'router',
|
||||
'app-router',
|
||||
'secret-mount-path',
|
||||
'store',
|
||||
'version',
|
||||
|
||||
@@ -7,7 +7,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default class PkiRoute extends Route {
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.secrets.backend.pki.overview');
|
||||
|
||||
@@ -29,7 +29,7 @@ export default Controller.extend(structuredClone(DEFAULTS), {
|
||||
isModalActive: false,
|
||||
isTokenCopied: false,
|
||||
expirationDate: null,
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
rm: service('replication-mode'),
|
||||
replicationMode: alias('rm.mode'),
|
||||
|
||||
@@ -9,7 +9,7 @@ import Controller from '@ember/controller';
|
||||
|
||||
export default Controller.extend({
|
||||
flashMessages: service(),
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
rm: service('replication-mode'),
|
||||
replicationMode: alias('rm.mode'),
|
||||
actions: {
|
||||
|
||||
@@ -11,7 +11,7 @@ import { action } from '@ember/object';
|
||||
|
||||
export default class ReplicationModeBaseController extends Controller {
|
||||
@service('replication-mode') rm;
|
||||
@service router;
|
||||
@service('app-router') router;
|
||||
@service store;
|
||||
|
||||
get replicationMode() {
|
||||
|
||||
@@ -20,7 +20,7 @@ const Eng = Engine.extend({
|
||||
'flash-messages',
|
||||
'namespace',
|
||||
'replication-mode',
|
||||
'router',
|
||||
'app-router',
|
||||
'store',
|
||||
'version',
|
||||
'-portal',
|
||||
|
||||
@@ -12,7 +12,7 @@ export default Route.extend(ClusterRoute, {
|
||||
version: service(),
|
||||
store: service(),
|
||||
auth: service(),
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
capabilities: service(),
|
||||
|
||||
async fetchCapabilities() {
|
||||
|
||||
@@ -12,7 +12,7 @@ const SUPPORTED_REPLICATION_MODES = ['dr', 'performance'];
|
||||
|
||||
export default Route.extend({
|
||||
replicationMode: service(),
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
beforeModel() {
|
||||
const replicationMode = this.paramsFor(this.routeName).replication_mode;
|
||||
|
||||
@@ -9,7 +9,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default Route.extend({
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
model() {
|
||||
const replicationMode = this.paramsFor('mode').replication_mode;
|
||||
|
||||
@@ -20,7 +20,7 @@ const pathForAction = (action, replicationMode, clusterMode) => {
|
||||
};
|
||||
|
||||
export default Route.extend({
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
model() {
|
||||
const store = this.store;
|
||||
|
||||
@@ -9,7 +9,7 @@ import Route from '@ember/routing/route';
|
||||
import { service } from '@ember/service';
|
||||
|
||||
export default Route.extend({
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
model() {
|
||||
const replicationMode = this.paramsFor('mode').replication_mode;
|
||||
|
||||
@@ -9,7 +9,7 @@ import Base from '../../replication-base';
|
||||
|
||||
export default Base.extend({
|
||||
flashMessages: service(),
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
|
||||
modelPath: 'model.config',
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import Route from '@ember/routing/route';
|
||||
import UnloadModelRouteMixin from 'vault/mixins/unload-model-route';
|
||||
|
||||
export default Route.extend(UnloadModelRouteMixin, {
|
||||
router: service(),
|
||||
router: service('app-router'),
|
||||
store: service(),
|
||||
version: service(),
|
||||
rm: service('replication-mode'),
|
||||
|
||||
@@ -18,7 +18,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class DestinationsTabsToolbar extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class SyncSecretsDestinationsPageComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ interface Args {
|
||||
|
||||
export default class DestinationsCreateForm extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
|
||||
@tracked modelValidations: ValidationMap | null = null;
|
||||
|
||||
@@ -23,7 +23,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class SyncSecretsDestinationsPageComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ interface Args {
|
||||
}
|
||||
|
||||
export default class DestinationSyncPageComponent extends Component<Args> {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ interface Args {
|
||||
export default class SyncActivationModal extends Component<Args> {
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
@tracked hasConfirmedDocs = false;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ export default class SyncEngine extends Engine {
|
||||
modulePrefix = modulePrefix;
|
||||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['flash-messages', 'flags', 'router', 'store', 'version'],
|
||||
services: ['flash-messages', 'flags', 'app-router', 'store', 'version'],
|
||||
externalRoutes: ['kvSecretOverview', 'clientCountOverview'],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import { service } from '@ember/service';
|
||||
import type RouterService from '@ember/routing/router-service';
|
||||
|
||||
export default class SyncIndexRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.sync.secrets.overview');
|
||||
|
||||
@@ -10,7 +10,7 @@ import type RouterService from '@ember/routing/router-service';
|
||||
import type FlagService from 'vault/services/flags';
|
||||
|
||||
export default class SyncSecretsRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flags: FlagService;
|
||||
|
||||
model() {
|
||||
|
||||
@@ -19,7 +19,7 @@ interface RouteParams {
|
||||
|
||||
export default class SyncSecretsDestinationsDestinationRoute extends Route {
|
||||
@service declare readonly store: Store;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly flashMessages: FlashMessageService;
|
||||
|
||||
model(params: RouteParams) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import { service } from '@ember/service';
|
||||
import type RouterService from '@ember/routing/router-service';
|
||||
|
||||
export default class SyncSecretsDestinationsDestinationIndexRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
redirect() {
|
||||
this.router.transitionTo('vault.cluster.sync.secrets.destinations.destination.details');
|
||||
|
||||
@@ -34,7 +34,7 @@ interface SyncSecretsDestinationsController extends Controller {
|
||||
|
||||
export default class SyncSecretsDestinationsIndexRoute extends Route {
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
|
||||
queryParams = {
|
||||
page: {
|
||||
|
||||
@@ -13,7 +13,7 @@ import type StoreService from 'vault/services/store';
|
||||
import type VersionService from 'vault/services/version';
|
||||
|
||||
export default class SyncSecretsOverviewRoute extends Route {
|
||||
@service declare readonly router: RouterService;
|
||||
@service('app-router') declare readonly router: RouterService;
|
||||
@service declare readonly store: StoreService;
|
||||
@service declare readonly flags: FlagsService;
|
||||
@service declare readonly version: VersionService;
|
||||
|
||||
@@ -136,7 +136,6 @@
|
||||
"ember-qunit": "^8.0.1",
|
||||
"ember-resolver": "^11.0.1",
|
||||
"ember-responsive": "5.0.0",
|
||||
"ember-router-helpers": "^0.4.0",
|
||||
"ember-service-worker": "meirish/ember-service-worker#configurable-scope",
|
||||
"ember-sinon-qunit": "^7.4.0",
|
||||
"ember-source": "~5.4.0",
|
||||
|
||||
77
ui/tests/integration/helpers/transition-to-test.js
Normal file
77
ui/tests/integration/helpers/transition-to-test.js
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* Copyright (c) HashiCorp, Inc.
|
||||
* SPDX-License-Identifier: BUSL-1.1
|
||||
*/
|
||||
|
||||
import { module, test } from 'qunit';
|
||||
import { setupRenderingTest } from 'vault/tests/helpers';
|
||||
import { setupEngine } from 'ember-engines/test-support';
|
||||
import { click, render } from '@ember/test-helpers';
|
||||
import { hbs } from 'ember-cli-htmlbars';
|
||||
import Sinon from 'sinon';
|
||||
|
||||
module('Integration | Helper | transition-to', function (hooks) {
|
||||
setupRenderingTest(hooks);
|
||||
// using 'kv' here for testing, but this could be any Ember engine in the app
|
||||
// sets this.engine, which we use to set context for the component testing service:app-router
|
||||
setupEngine(hooks, 'kv');
|
||||
|
||||
hooks.beforeEach(function () {
|
||||
this.router = this.owner.lookup('service:router');
|
||||
this.router.reopen({
|
||||
transitionTo: Sinon.stub(),
|
||||
transitionToExternal: Sinon.stub(),
|
||||
});
|
||||
});
|
||||
|
||||
test('it does not call transition on render', async function (assert) {
|
||||
await render(hbs`<button data-test-btn {{on "click" (transition-to "vault.cluster")}}>Click</button>`);
|
||||
|
||||
assert.true(this.router.transitionTo.notCalled, 'transitionTo not called on render');
|
||||
assert.true(this.router.transitionToExternal.notCalled, 'transitionToExternal not called on render');
|
||||
});
|
||||
|
||||
test('it calls transitionTo correctly', async function (assert) {
|
||||
await render(
|
||||
hbs`<button data-test-btn {{on "click" (transition-to "vault.cluster" "foobar" "baz")}}>Click</button>`
|
||||
);
|
||||
await click('[data-test-btn]');
|
||||
|
||||
assert.true(this.router.transitionTo.calledOnce, 'transitionTo called once on click');
|
||||
assert.deepEqual(
|
||||
this.router.transitionTo.args[0],
|
||||
['vault.cluster', 'foobar', 'baz'],
|
||||
'transitionTo called with positional params'
|
||||
);
|
||||
assert.true(this.router.transitionToExternal.notCalled, 'transitionToExternal not called');
|
||||
});
|
||||
|
||||
test('it calls transitionToExternal correctly', async function (assert) {
|
||||
await render(
|
||||
hbs`<button data-test-btn {{on "click" (transition-to "vault.cluster" "foobar" "baz" external=true)}}>Click</button>`
|
||||
);
|
||||
await click('[data-test-btn]');
|
||||
|
||||
assert.true(this.router.transitionToExternal.calledOnce, 'transitionToExternal called');
|
||||
assert.deepEqual(
|
||||
this.router.transitionToExternal.args[0],
|
||||
['vault.cluster', 'foobar', 'baz'],
|
||||
'transitionToExternal called with positional params'
|
||||
);
|
||||
assert.true(this.router.transitionTo.notCalled, 'transitionTo not called');
|
||||
});
|
||||
|
||||
// This test is confusing (and admittedly not ideal) because stubbing routers gets strange,
|
||||
// but if you go into the TransitionTo class and console.log owner.lookup('service:router') in get router()
|
||||
// you'll see the getter returns 'service:app-router' (because of the context setup)
|
||||
// so although we're asserting this.router, the TransitionTo helper is using "service:app-router" under the hood.
|
||||
// This test passing, indirectly means the helper works as expected. Failures might be something like "global failure: TypeError: this.router is undefined"
|
||||
test('it uses service:app-router when base router undefined', async function (assert) {
|
||||
await render(
|
||||
hbs`<button data-test-btn {{on "click" (transition-to "vault.cluster" "foobar" "baz" external=true)}}>Click</button>`,
|
||||
{ owner: this.engine }
|
||||
);
|
||||
await click('[data-test-btn]');
|
||||
assert.true(this.router.transitionToExternal.calledOnce, 'transitionToExternal called');
|
||||
});
|
||||
});
|
||||
12
ui/yarn.lock
12
ui/yarn.lock
@@ -7613,7 +7613,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ember-cli-babel@npm:^7.1.2, ember-cli-babel@npm:^7.1.3, ember-cli-babel@npm:^7.10.0, ember-cli-babel@npm:^7.13.0, ember-cli-babel@npm:^7.18.0, ember-cli-babel@npm:^7.20.0, ember-cli-babel@npm:^7.22.1, ember-cli-babel@npm:^7.23.0, ember-cli-babel@npm:^7.26.11, ember-cli-babel@npm:^7.26.3, ember-cli-babel@npm:^7.26.4, ember-cli-babel@npm:^7.26.5, ember-cli-babel@npm:^7.26.6, ember-cli-babel@npm:^7.26.8, ember-cli-babel@npm:^7.5.0, ember-cli-babel@npm:^7.7.3":
|
||||
"ember-cli-babel@npm:^7.1.2, ember-cli-babel@npm:^7.1.3, ember-cli-babel@npm:^7.10.0, ember-cli-babel@npm:^7.13.0, ember-cli-babel@npm:^7.18.0, ember-cli-babel@npm:^7.22.1, ember-cli-babel@npm:^7.23.0, ember-cli-babel@npm:^7.26.11, ember-cli-babel@npm:^7.26.3, ember-cli-babel@npm:^7.26.4, ember-cli-babel@npm:^7.26.5, ember-cli-babel@npm:^7.26.6, ember-cli-babel@npm:^7.26.8, ember-cli-babel@npm:^7.5.0, ember-cli-babel@npm:^7.7.3":
|
||||
version: 7.26.11
|
||||
resolution: "ember-cli-babel@npm:7.26.11"
|
||||
dependencies:
|
||||
@@ -8652,15 +8652,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ember-router-helpers@npm:^0.4.0":
|
||||
version: 0.4.0
|
||||
resolution: "ember-router-helpers@npm:0.4.0"
|
||||
dependencies:
|
||||
ember-cli-babel: ^7.20.0
|
||||
checksum: e847ceb1061f87416d6bb5d72ef539fda738a24086051bc94d740117c6353b3406c65247ac8190b8572df008a70d9f801e224d38489170129c5ca6c4ec7f206e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ember-service-worker@meirish/ember-service-worker#configurable-scope":
|
||||
version: 9.0.1
|
||||
resolution: "ember-service-worker@https://github.com/meirish/ember-service-worker.git#commit=dda14187aace0d73ecdb6a55beac2194a3aec01b"
|
||||
@@ -18829,7 +18820,6 @@ __metadata:
|
||||
ember-qunit: ^8.0.1
|
||||
ember-resolver: ^11.0.1
|
||||
ember-responsive: 5.0.0
|
||||
ember-router-helpers: ^0.4.0
|
||||
ember-service-worker: "meirish/ember-service-worker#configurable-scope"
|
||||
ember-sinon-qunit: ^7.4.0
|
||||
ember-source: ~5.4.0
|
||||
|
||||
Reference in New Issue
Block a user