@@ -79,21 +94,30 @@
data-test-popup-menu-trigger
/>
{{#if metadata.pathIsDirectory}}
-
+
{{else}}
-
+
{{#if metadata.canReadMetadata}}
{{/if}}
{{#if metadata.canCreateVersionData}}
+ \
{{/if}}
@@ -120,12 +144,12 @@
@confirmMessage="This will permanently delete this secret and all its versions."
/>
{{/if}}
- {{! Pagination }}
<:tabLinks>
- Secret
- Metadata
- Paths
+
+ Secret
+
+
+ Metadata
+
+
+ Paths
+
{{#if @secret.canReadMetadata}}
- Version History
+
+ Version History
+
{{/if}}
@@ -97,7 +113,14 @@
{{/if}}
{{#if @secret.canEditData}}
- Create new version
+
+ Create new version
+
{{/if}}
diff --git a/ui/lib/kv/addon/components/page/secret/metadata/details.hbs b/ui/lib/kv/addon/components/page/secret/metadata/details.hbs
index 0c07e6c942..41e993c51c 100644
--- a/ui/lib/kv/addon/components/page/secret/metadata/details.hbs
+++ b/ui/lib/kv/addon/components/page/secret/metadata/details.hbs
@@ -5,11 +5,27 @@
<:tabLinks>
- Secret
- Metadata
- Paths
+
+ Secret
+
+
+ Metadata
+
+
+ Paths
+
{{#if @secret.canReadMetadata}}
- Version History
+
+ Version History
+
{{/if}}
@@ -23,7 +39,9 @@
/>
{{/if}}
{{#if @secret.canUpdateMetadata}}
- Edit metadata
+
+ Edit metadata
+
{{/if}}
@@ -46,7 +64,7 @@
@icon="plus"
@text="Add metadata"
@route="secret.metadata.edit"
- @model={{@path}}
+ @models={{array @secret.backend @path}}
data-test-add-custom-metadata
/>
{{/if}}
diff --git a/ui/lib/kv/addon/components/page/secret/metadata/version-history.hbs b/ui/lib/kv/addon/components/page/secret/metadata/version-history.hbs
index ef4eacf1e8..ea9fbabadd 100644
--- a/ui/lib/kv/addon/components/page/secret/metadata/version-history.hbs
+++ b/ui/lib/kv/addon/components/page/secret/metadata/version-history.hbs
@@ -5,15 +5,32 @@
<:tabLinks>
- Secret
- Metadata
- Paths
- Version History
+
+ Secret
+
+
+ Metadata
+
+
+ Paths
+
+
+ Version History
+
<:toolbarActions>
{{#if @metadata.canReadMetadata}}
- Version diff
+ Version diff
{{/if}}
@@ -25,7 +42,7 @@
{{#each @metadata.sortedVersions as |versionData|}}
@@ -80,12 +97,14 @@
{{#if (and @metadata.canCreateVersionData (not versionData.destroyed) (not versionData.isSecretDeleted))}}
diff --git a/ui/lib/kv/addon/components/page/secret/paths.hbs b/ui/lib/kv/addon/components/page/secret/paths.hbs
index 2016674cc7..9edcd4765e 100644
--- a/ui/lib/kv/addon/components/page/secret/paths.hbs
+++ b/ui/lib/kv/addon/components/page/secret/paths.hbs
@@ -5,11 +5,33 @@
<:tabLinks>
- Secret
- Metadata
- Paths
+
+ Secret
+
+
+ Metadata
+
+
+ Paths
+
{{#if @canReadMetadata}}
- Version History
+
+ Version History
+
+
{{/if}}
diff --git a/ui/lib/kv/addon/routes/configuration.js b/ui/lib/kv/addon/routes/configuration.js
index edea51815e..30eac8ffeb 100644
--- a/ui/lib/kv/addon/routes/configuration.js
+++ b/ui/lib/kv/addon/routes/configuration.js
@@ -25,7 +25,7 @@ export default class KvConfigurationRoute extends Route {
super.setupController(controller, resolvedModel);
controller.breadcrumbs = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.mountConfig.id, route: 'list' },
+ { label: resolvedModel.mountConfig.id, route: 'list', model: resolvedModel.engineConfig.backend },
{ label: 'configuration' },
];
}
diff --git a/ui/lib/kv/addon/routes/create.js b/ui/lib/kv/addon/routes/create.js
index b81993e63c..c984063b96 100644
--- a/ui/lib/kv/addon/routes/create.js
+++ b/ui/lib/kv/addon/routes/create.js
@@ -32,8 +32,8 @@ export default class KvSecretsCreateRoute extends Route {
const crumbs = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'create' },
];
controller.breadcrumbs = crumbs;
diff --git a/ui/lib/kv/addon/routes/error.js b/ui/lib/kv/addon/routes/error.js
index 960fd73d30..d43d793e50 100644
--- a/ui/lib/kv/addon/routes/error.js
+++ b/ui/lib/kv/addon/routes/error.js
@@ -13,7 +13,7 @@ export default class KvErrorRoute extends Route {
super.setupController(...arguments);
controller.breadcrumbs = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: this.secretMountPath.currentPath, route: 'list' },
+ { label: this.secretMountPath.currentPath, route: 'list', model: this.secretMountPath.currentPath },
];
controller.mountName = this.secretMountPath.currentPath;
}
diff --git a/ui/lib/kv/addon/routes/list-directory.js b/ui/lib/kv/addon/routes/list-directory.js
index 4324c6e9a7..aa1faf4684 100644
--- a/ui/lib/kv/addon/routes/list-directory.js
+++ b/ui/lib/kv/addon/routes/list-directory.js
@@ -78,8 +78,8 @@ export default class KvSecretsListRoute extends Route {
} else {
breadcrumbsArray = [
...breadcrumbsArray,
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.pathToSecret, true),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.pathToSecret, true),
];
}
diff --git a/ui/lib/kv/addon/routes/secret/details/edit.js b/ui/lib/kv/addon/routes/secret/details/edit.js
index 5adc11c636..688219c5cf 100644
--- a/ui/lib/kv/addon/routes/secret/details/edit.js
+++ b/ui/lib/kv/addon/routes/secret/details/edit.js
@@ -36,8 +36,8 @@ export default class KvSecretDetailsEditRoute extends Route {
controller.breadcrumbs = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'edit' },
];
}
diff --git a/ui/lib/kv/addon/routes/secret/details/index.js b/ui/lib/kv/addon/routes/secret/details/index.js
index e99ba9e8dc..ff149b734a 100644
--- a/ui/lib/kv/addon/routes/secret/details/index.js
+++ b/ui/lib/kv/addon/routes/secret/details/index.js
@@ -12,8 +12,8 @@ export default class KvSecretDetailsIndexRoute extends Route {
const breadcrumbsArray = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path, true),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path, true),
];
controller.breadcrumbs = breadcrumbsArray;
}
diff --git a/ui/lib/kv/addon/routes/secret/metadata/diff.js b/ui/lib/kv/addon/routes/secret/metadata/diff.js
index 4a7f93687d..07ad5e36dc 100644
--- a/ui/lib/kv/addon/routes/secret/metadata/diff.js
+++ b/ui/lib/kv/addon/routes/secret/metadata/diff.js
@@ -13,8 +13,8 @@ export default class KvSecretMetadataDiffRoute extends Route {
super.setupController(controller, resolvedModel);
const breadcrumbsArray = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'version history', route: 'secret.metadata.versions' },
{ label: 'diff' },
];
diff --git a/ui/lib/kv/addon/routes/secret/metadata/edit.js b/ui/lib/kv/addon/routes/secret/metadata/edit.js
index a6da0ab27a..8e1ce8434a 100644
--- a/ui/lib/kv/addon/routes/secret/metadata/edit.js
+++ b/ui/lib/kv/addon/routes/secret/metadata/edit.js
@@ -14,8 +14,8 @@ export default class KvSecretMetadataEditRoute extends Route {
super.setupController(controller, resolvedModel);
const breadcrumbsArray = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'metadata', route: 'secret.metadata' },
{ label: 'edit' },
];
diff --git a/ui/lib/kv/addon/routes/secret/metadata/index.js b/ui/lib/kv/addon/routes/secret/metadata/index.js
index 2e661be7cf..36c347d768 100644
--- a/ui/lib/kv/addon/routes/secret/metadata/index.js
+++ b/ui/lib/kv/addon/routes/secret/metadata/index.js
@@ -14,8 +14,8 @@ export default class KvSecretMetadataIndexRoute extends Route {
super.setupController(controller, resolvedModel);
const breadcrumbsArray = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'metadata' },
];
diff --git a/ui/lib/kv/addon/routes/secret/metadata/versions.js b/ui/lib/kv/addon/routes/secret/metadata/versions.js
index 93ead65bda..4898ecd8f0 100644
--- a/ui/lib/kv/addon/routes/secret/metadata/versions.js
+++ b/ui/lib/kv/addon/routes/secret/metadata/versions.js
@@ -11,8 +11,8 @@ export default class KvSecretMetadataVersionsRoute extends Route {
super.setupController(controller, resolvedModel);
const breadcrumbsArray = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'version history' },
];
diff --git a/ui/lib/kv/addon/routes/secret/paths.js b/ui/lib/kv/addon/routes/secret/paths.js
index 7bfaf8da58..dbb88be6a1 100644
--- a/ui/lib/kv/addon/routes/secret/paths.js
+++ b/ui/lib/kv/addon/routes/secret/paths.js
@@ -12,8 +12,8 @@ export default class KvSecretPathsRoute extends Route {
controller.breadcrumbs = [
{ label: 'secrets', route: 'secrets', linkExternal: true },
- { label: resolvedModel.backend, route: 'list' },
- ...breadcrumbsForSecret(resolvedModel.path),
+ { label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
+ ...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
{ label: 'paths' },
];
}
diff --git a/ui/lib/kv/addon/templates/list-directory.hbs b/ui/lib/kv/addon/templates/list-directory.hbs
index a1b76f60e8..018c1c8d5a 100644
--- a/ui/lib/kv/addon/templates/list-directory.hbs
+++ b/ui/lib/kv/addon/templates/list-directory.hbs
@@ -11,4 +11,5 @@
@filterValue={{this.model.filterValue}}
@failedDirectoryQuery={{this.model.failedDirectoryQuery}}
@breadcrumbs={{this.breadcrumbs}}
+ @currentRouteParams={{array this.model.backend this.model.pathToSecret}}
/>
\ No newline at end of file
diff --git a/ui/lib/kv/addon/templates/list.hbs b/ui/lib/kv/addon/templates/list.hbs
index d6272f7afc..ff11a3d9d3 100644
--- a/ui/lib/kv/addon/templates/list.hbs
+++ b/ui/lib/kv/addon/templates/list.hbs
@@ -10,4 +10,5 @@
@filterValue={{this.model.filterValue}}
@failedDirectoryQuery={{this.model.failedDirectoryQuery}}
@breadcrumbs={{this.breadcrumbs}}
+ @currentRouteParams={{array this.model.backend}}
/>
\ No newline at end of file
diff --git a/ui/lib/kv/addon/templates/secret/metadata/versions.hbs b/ui/lib/kv/addon/templates/secret/metadata/versions.hbs
index 4fc1719107..889ff0ddd5 100644
--- a/ui/lib/kv/addon/templates/secret/metadata/versions.hbs
+++ b/ui/lib/kv/addon/templates/secret/metadata/versions.hbs
@@ -7,4 +7,5 @@
@metadata={{this.model.metadata}}
@path={{this.model.path}}
@breadcrumbs={{this.breadcrumbs}}
+ @backend={{this.model.backend}}
/>
\ No newline at end of file
diff --git a/ui/lib/kv/addon/utils/kv-breadcrumbs.js b/ui/lib/kv/addon/utils/kv-breadcrumbs.js
index 0ac5c56220..d6c1f56be9 100644
--- a/ui/lib/kv/addon/utils/kv-breadcrumbs.js
+++ b/ui/lib/kv/addon/utils/kv-breadcrumbs.js
@@ -32,8 +32,8 @@ function splitSegments(secretPath) {
* @param {boolean} lastItemCurrent
* @returns array of breadcrumbs specific to KV engine
*/
-export function breadcrumbsForSecret(secretPath, lastItemCurrent = false) {
- if (!secretPath) return [];
+export function breadcrumbsForSecret(backend, secretPath, lastItemCurrent = false) {
+ if (!backend || !secretPath) return [];
const isDir = pathIsDirectory(secretPath);
const segments = splitSegments(secretPath);
@@ -45,9 +45,9 @@ export function breadcrumbsForSecret(secretPath, lastItemCurrent = false) {
};
}
if (!isDir) {
- return { label: segment.label, route: 'secret.details', model: segment.model };
+ return { label: segment.label, route: 'secret.details', models: [backend, segment.model] };
}
}
- return { label: segment.label, route: 'list-directory', model: `${segment.model}/` };
+ return { label: segment.label, route: 'list-directory', models: [backend, `${segment.model}/`] };
});
}
diff --git a/ui/tests/unit/utils/kv-breadcrumbs-test.js b/ui/tests/unit/utils/kv-breadcrumbs-test.js
index 086c489099..85664c181e 100644
--- a/ui/tests/unit/utils/kv-breadcrumbs-test.js
+++ b/ui/tests/unit/utils/kv-breadcrumbs-test.js
@@ -41,60 +41,63 @@ module('Unit | Utility | kv-breadcrumbs', function () {
});
test('breadcrumbsForSecret works', function (assert) {
- let results = breadcrumbsForSecret('beep/bop/boop');
+ let results = breadcrumbsForSecret('kv-mount', 'beep/bop/boop');
assert.deepEqual(
results,
[
- { label: 'beep', route: 'list-directory', model: 'beep/' },
- { label: 'bop', route: 'list-directory', model: 'beep/bop/' },
- { label: 'boop', route: 'secret.details', model: 'beep/bop/boop' },
+ { label: 'beep', route: 'list-directory', models: ['kv-mount', 'beep/'] },
+ { label: 'bop', route: 'list-directory', models: ['kv-mount', 'beep/bop/'] },
+ { label: 'boop', route: 'secret.details', models: ['kv-mount', 'beep/bop/boop'] },
],
'correct when full nested path to secret'
);
- results = breadcrumbsForSecret('beep/bop/boop', true);
+ results = breadcrumbsForSecret('kv-mount', 'beep/bop/boop', true);
assert.deepEqual(
results,
[
- { label: 'beep', route: 'list-directory', model: 'beep/' },
- { label: 'bop', route: 'list-directory', model: 'beep/bop/' },
+ { label: 'beep', route: 'list-directory', models: ['kv-mount', 'beep/'] },
+ { label: 'bop', route: 'list-directory', models: ['kv-mount', 'beep/bop/'] },
{ label: 'boop' },
],
'correct when full nested path to secret and last item current'
);
- results = breadcrumbsForSecret('beep');
+ results = breadcrumbsForSecret('kv-mount', 'beep');
assert.deepEqual(
results,
- [{ label: 'beep', route: 'secret.details', model: 'beep' }],
+ [{ label: 'beep', route: 'secret.details', models: ['kv-mount', 'beep'] }],
'correct when non-nested secret path'
);
- results = breadcrumbsForSecret('beep', true);
+ results = breadcrumbsForSecret('kv-mount', 'beep', true);
assert.deepEqual(
results,
[{ label: 'beep' }],
'correct when non-nested secret path and last item current'
);
- results = breadcrumbsForSecret('beep/bop/');
+ results = breadcrumbsForSecret('kv-mount', 'beep/bop/');
assert.deepEqual(
results,
[
- { label: 'beep', route: 'list-directory', model: 'beep/' },
- { label: 'bop', route: 'list-directory', model: 'beep/bop/' },
+ { label: 'beep', route: 'list-directory', models: ['kv-mount', 'beep/'] },
+ { label: 'bop', route: 'list-directory', models: ['kv-mount', 'beep/bop/'] },
],
'correct when path is directory'
);
- results = breadcrumbsForSecret('beep/bop/', true);
+ results = breadcrumbsForSecret('kv-mount', 'beep/bop/', true);
assert.deepEqual(
results,
- [{ label: 'beep', route: 'list-directory', model: 'beep/' }, { label: 'bop' }],
+ [{ label: 'beep', route: 'list-directory', models: ['kv-mount', 'beep/'] }, { label: 'bop' }],
'correct when path is directory and last item current'
);
results = breadcrumbsForSecret();
+ assert.deepEqual(results, [], 'fails gracefully if backend is undefined');
+
+ results = breadcrumbsForSecret('backend-only');
assert.deepEqual(results, [], 'fails gracefully if secretPath is undefined');
});
});