diff --git a/.gitignore b/.gitignore index 80cb94003..95852e8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ testem.log yarn-error.log storybook-static **/.storybook/*.html +.watchman-cookie* # ember-try .node_modules.ember-try diff --git a/addons/api/mirage/config.js b/addons/api/mirage/config.js index 6e598b47d..4564352a6 100644 --- a/addons/api/mirage/config.js +++ b/addons/api/mirage/config.js @@ -464,6 +464,9 @@ export default function () { credentialStores.where({ scopeId }) ); + this.get('/credential-stores/:id'); + this.patch('/credential-stores/:id'); + // credential-libraries this.get( diff --git a/ui/admin/app/components/form/credential-store/index.hbs b/ui/admin/app/components/form/credential-store/index.hbs new file mode 100644 index 000000000..f972854c1 --- /dev/null +++ b/ui/admin/app/components/form/credential-store/index.hbs @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js b/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js new file mode 100644 index 000000000..67b0b2c33 --- /dev/null +++ b/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js @@ -0,0 +1,13 @@ +import Controller from '@ember/controller'; + +export default class ScopesScopeCredentialStoresCredentialStoreController extends Controller { + // =attributes + + /** + * A credential store breadcrumb + * @type {string} + */ + get breadCrumb() { + return this.model.displayName; + } +} diff --git a/ui/admin/app/router.js b/ui/admin/app/router.js index 4d723cab8..21a7859c7 100644 --- a/ui/admin/app/router.js +++ b/ui/admin/app/router.js @@ -87,7 +87,11 @@ Router.map(function () { }); }); this.route('credential-stores', function () { - this.route('credential-store', { path: ':credential_store_id' }); + this.route( + 'credential-store', + { path: ':credential_store_id' }, + function () {} + ); }); }); }); diff --git a/ui/admin/app/routes/scopes/scope/credential-stores.js b/ui/admin/app/routes/scopes/scope/credential-stores.js index 7f75dd4fa..4bac020b1 100644 --- a/ui/admin/app/routes/scopes/scope/credential-stores.js +++ b/ui/admin/app/routes/scopes/scope/credential-stores.js @@ -1,6 +1,11 @@ import Route from '@ember/routing/route'; +import { action } from '@ember/object'; +import loading from 'ember-loading/decorator'; +import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeCredentialStoresRoute extends Route { + // =methods + /** * Load all credential stores under current scope * @returns {Promise[CredentialStoreModel]} @@ -9,4 +14,34 @@ export default class ScopesScopeCredentialStoresRoute extends Route { const { id: scope_id } = this.modelFor('scopes.scope'); return this.store.query('credential-store', { scope_id }); } + + // =actions + + /** + * Handle save + * @param {CredentialStoreModel} credentialStore + */ + @action + @loading + @notifyError(({ message }) => message) + @notifySuccess('notifications.save-success') + async save(credentialStore) { + await credentialStore.save(); + await this.transitionTo( + 'scopes.scope.credential-stores.credential-store', + credentialStore + ); + this.refresh(); + } + + /** + * Rollback changes on credential stores. + * @param {CredentialStoreModel} credentialStore + */ + @action + cancel(credentialStore) { + const { isNew } = credentialStore; + credentialStore.rollbackAttributes(); + if (isNew) this.transitionTo('scopes.scope.credential-stores'); + } } diff --git a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js index 82fa9d62c..307c11079 100644 --- a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js +++ b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js @@ -6,6 +6,24 @@ export default class ScopesScopeCredentialStoresCredentialStoreRoute extends Rou * @return {Promise[CredentialStoreModel]} */ async model({ credential_store_id }) { - return this.route.findRecord('credential-store', credential_store_id); + return this.store.findRecord('credential-store', credential_store_id); + } + + /** + * Render credential store header and navigation page sections. + * @override + */ + renderTemplate() { + super.renderTemplate(...arguments); + + this.render('scopes/scope/credential-stores/credential-store/-header', { + into: 'scopes/scope/credential-stores/credential-store', + outlet: 'header', + }); + + this.render('scopes/scope/credential-stores/credential-store/-navigation', { + into: 'scopes/scope/credential-stores/credential-store', + outlet: 'navigation', + }); } } diff --git a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js new file mode 100644 index 000000000..7e61beb34 --- /dev/null +++ b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class ScopesScopeCredentialStoresCredentialStoreIndexRoute extends Route {} diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs index 637b45528..a6ecd7f81 100644 --- a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs @@ -1,2 +1,24 @@ -{{page-title 'CredentialStore'}} -{{outlet}} \ No newline at end of file +{{page-title @model.displayName}} + + + + + + + + + {{outlet 'header'}} + + + + {{outlet 'navigation'}} + + + + {{!-- {{outlet 'actions'}} --}} + + + + {{outlet}} + + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs new file mode 100644 index 000000000..0ff5c81bc --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs @@ -0,0 +1,9 @@ +

{{t 'resources.credential-store.title'}}

+

{{t 'resources.credential-store.description'}}

+ + {{@model.id}} + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs new file mode 100644 index 000000000..86b9cf585 --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs @@ -0,0 +1,5 @@ + + + {{t 'titles.details'}} + + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs new file mode 100644 index 000000000..aaa14a18c --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs index 585e076c2..0e2177ff1 100644 --- a/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs +++ b/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs @@ -6,8 +6,9 @@

{{t 'resources.credential-store.title_plural'}} +

- {{t 'resources.credential-store.description'}} +

{{t 'resources.credential-store.description'}}

{{!-- diff --git a/ui/admin/config/environment.js b/ui/admin/config/environment.js index 7464ea022..fca0dab92 100644 --- a/ui/admin/config/environment.js +++ b/ui/admin/config/environment.js @@ -55,6 +55,7 @@ module.exports = function (environment) { 'host-set': '/host-sets', 'host-set.new': '/host-sets/new', 'host-set.add-hosts': '/host-sets/add-hosts', + 'credential-stores': '/credential-stores', host: '/hosts', 'host.new': '/hosts/new', role: '/roles', diff --git a/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js b/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js new file mode 100644 index 000000000..5736858ff --- /dev/null +++ b/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js @@ -0,0 +1,17 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Controller | scopes/scope/credential-stores/credential-store', + function (hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function (assert) { + let controller = this.owner.lookup( + 'controller:scopes/scope/credential-stores/credential-store' + ); + assert.ok(controller); + }); + } +); diff --git a/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js new file mode 100644 index 000000000..a08a9fff6 --- /dev/null +++ b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js @@ -0,0 +1,16 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Route | scopes/scope/credential-stores/credential-store/index', + function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let route = this.owner.lookup( + 'route:scopes/scope/credential-stores/credential-store/index' + ); + assert.ok(route); + }); + } +);