From a19bdaa245331faccf42ff58a76b8575dc51566f Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Wed, 18 Nov 2020 13:19:46 -0500 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20port=20confirmation?= =?UTF-8?q?=20service=20and=20components=20into=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/core/README.md | 32 ++++++++++++++++++- .../pending-confirmations/index.hbs | 0 .../components/pending-confirmations/index.js | 0 .../core/addon}/decorators/confirm.js | 0 .../core/addon}/services/confirm.js | 4 +-- .../app/components/pending-confirmations.js | 1 + addons/core/app/decorators/confirm.js | 1 + addons/core/app/services/confirm.js | 1 + addons/core/package.json | 1 + .../components/pending-confirmations-test.js | 0 .../core}/tests/unit/services/confirm-test.js | 0 ui/admin/app/routes/scopes/scope.js | 2 +- .../app/routes/scopes/scope/auth-methods.js | 2 +- .../auth-methods/auth-method/accounts.js | 2 +- ui/admin/app/routes/scopes/scope/groups.js | 2 +- .../scopes/scope/groups/group/members.js | 2 +- .../app/routes/scopes/scope/host-catalogs.js | 2 +- .../host-catalogs/host-catalog/host-sets.js | 2 +- .../host-catalog/host-sets/host-set/hosts.js | 2 +- .../scope/host-catalogs/host-catalog/hosts.js | 2 +- ui/admin/app/routes/scopes/scope/roles.js | 2 +- .../scopes/scope/roles/role/principals.js | 2 +- ui/admin/app/routes/scopes/scope/targets.js | 2 +- .../scopes/scope/targets/target/host-sets.js | 2 +- ui/admin/app/routes/scopes/scope/users.js | 2 +- yarn.lock | 8 +++++ 26 files changed, 59 insertions(+), 17 deletions(-) rename {ui/admin/app => addons/core/addon}/components/pending-confirmations/index.hbs (100%) rename {ui/admin/app => addons/core/addon}/components/pending-confirmations/index.js (100%) rename {ui/admin/app => addons/core/addon}/decorators/confirm.js (100%) rename {ui/admin/app => addons/core/addon}/services/confirm.js (98%) create mode 100644 addons/core/app/components/pending-confirmations.js create mode 100644 addons/core/app/decorators/confirm.js create mode 100644 addons/core/app/services/confirm.js rename {ui/admin => addons/core}/tests/integration/components/pending-confirmations-test.js (100%) rename {ui/admin => addons/core}/tests/unit/services/confirm-test.js (100%) diff --git a/addons/core/README.md b/addons/core/README.md index 170ae6b67..98d3efe2f 100644 --- a/addons/core/README.md +++ b/addons/core/README.md @@ -31,10 +31,40 @@ See monorepo README for installation instructions. To use internationalization features, install `ember-intl` into your project: `ember install ember-intl`. -## Usage within a project +## I18n To access translations within a template, see `ember-intl` docs. +## Confirmations + +This addon exposes a service to request confirmations and the component +used to expose them to users. A decorator is exposed for convenience. + +To guard an action on a confirmation, decorate it with `@confirm`. In this +example, the confirmation looks up the translation under a +`questions.delete-confirm` key. + +```js +import { confirm } from 'core/decorators/confirm'; + +export default class ExampleRoute extends Route { + @confirm('questions.delete-confirm') + async myAction() { + // do something + } +} +``` + +In the application template, interate over confirmations, yielding the +confirmation instance as well as accept and deny functions which, when called, +update the confirmation status. + +```html + + {{!-- your confirmation dialog component here --}} +` diff --git a/ui/admin/app/components/pending-confirmations/index.hbs b/addons/core/addon/components/pending-confirmations/index.hbs similarity index 100% rename from ui/admin/app/components/pending-confirmations/index.hbs rename to addons/core/addon/components/pending-confirmations/index.hbs diff --git a/ui/admin/app/components/pending-confirmations/index.js b/addons/core/addon/components/pending-confirmations/index.js similarity index 100% rename from ui/admin/app/components/pending-confirmations/index.js rename to addons/core/addon/components/pending-confirmations/index.js diff --git a/ui/admin/app/decorators/confirm.js b/addons/core/addon/decorators/confirm.js similarity index 100% rename from ui/admin/app/decorators/confirm.js rename to addons/core/addon/decorators/confirm.js diff --git a/ui/admin/app/services/confirm.js b/addons/core/addon/services/confirm.js similarity index 98% rename from ui/admin/app/services/confirm.js rename to addons/core/addon/services/confirm.js index 071551558..df271f219 100644 --- a/ui/admin/app/services/confirm.js +++ b/addons/core/addon/services/confirm.js @@ -1,9 +1,9 @@ import Service from '@ember/service'; +import { filterBy } from '@ember/object/computed'; import { A } from '@ember/array'; import { tracked } from '@glimmer/tracking'; import { defer, resolve } from 'rsvp'; -import { filterBy } from '@ember/object/computed'; -import config from '../config/environment'; +import config from 'ember-get-config'; /** * A simple service that emits Confirmation instances and diff --git a/addons/core/app/components/pending-confirmations.js b/addons/core/app/components/pending-confirmations.js new file mode 100644 index 000000000..7e60dd82a --- /dev/null +++ b/addons/core/app/components/pending-confirmations.js @@ -0,0 +1 @@ +export { default } from 'core/components/pending-confirmations'; \ No newline at end of file diff --git a/addons/core/app/decorators/confirm.js b/addons/core/app/decorators/confirm.js new file mode 100644 index 000000000..8ec650df4 --- /dev/null +++ b/addons/core/app/decorators/confirm.js @@ -0,0 +1 @@ +export { default } from 'core/decorators/confirm'; diff --git a/addons/core/app/services/confirm.js b/addons/core/app/services/confirm.js new file mode 100644 index 000000000..c7d7fdbd8 --- /dev/null +++ b/addons/core/app/services/confirm.js @@ -0,0 +1 @@ +export { default } from 'core/services/confirm'; diff --git a/addons/core/package.json b/addons/core/package.json index 16239b965..0da7c1547 100644 --- a/addons/core/package.json +++ b/addons/core/package.json @@ -43,6 +43,7 @@ "ember-cli-uglify": "^3.0.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.1", + "ember-get-config": "^0.3.0", "ember-intl": "^5.5.0", "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", diff --git a/ui/admin/tests/integration/components/pending-confirmations-test.js b/addons/core/tests/integration/components/pending-confirmations-test.js similarity index 100% rename from ui/admin/tests/integration/components/pending-confirmations-test.js rename to addons/core/tests/integration/components/pending-confirmations-test.js diff --git a/ui/admin/tests/unit/services/confirm-test.js b/addons/core/tests/unit/services/confirm-test.js similarity index 100% rename from ui/admin/tests/unit/services/confirm-test.js rename to addons/core/tests/unit/services/confirm-test.js diff --git a/ui/admin/app/routes/scopes/scope.js b/ui/admin/app/routes/scopes/scope.js index 229d6611b..3dc171cb0 100644 --- a/ui/admin/app/routes/scopes/scope.js +++ b/ui/admin/app/routes/scopes/scope.js @@ -3,7 +3,7 @@ import { inject as service } from '@ember/service'; import { A } from '@ember/array'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../decorators/notify'; export default class ScopesScopeRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/auth-methods.js b/ui/admin/app/routes/scopes/scope/auth-methods.js index f65e40590..b0e9e32e3 100644 --- a/ui/admin/app/routes/scopes/scope/auth-methods.js +++ b/ui/admin/app/routes/scopes/scope/auth-methods.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeAuthMethodsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/auth-methods/auth-method/accounts.js b/ui/admin/app/routes/scopes/scope/auth-methods/auth-method/accounts.js index 2cd7293a9..b598ca278 100644 --- a/ui/admin/app/routes/scopes/scope/auth-methods/auth-method/accounts.js +++ b/ui/admin/app/routes/scopes/scope/auth-methods/auth-method/accounts.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeAuthMethodsAuthMethodAccountsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/groups.js b/ui/admin/app/routes/scopes/scope/groups.js index e0210641e..5e3628c15 100644 --- a/ui/admin/app/routes/scopes/scope/groups.js +++ b/ui/admin/app/routes/scopes/scope/groups.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeGroupsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/groups/group/members.js b/ui/admin/app/routes/scopes/scope/groups/group/members.js index be4f97343..97bd17a30 100644 --- a/ui/admin/app/routes/scopes/scope/groups/group/members.js +++ b/ui/admin/app/routes/scopes/scope/groups/group/members.js @@ -3,7 +3,7 @@ import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import { hash, all } from 'rsvp'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeGroupsGroupMembersRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/host-catalogs.js b/ui/admin/app/routes/scopes/scope/host-catalogs.js index 29b4e474b..ce7cf6353 100644 --- a/ui/admin/app/routes/scopes/scope/host-catalogs.js +++ b/ui/admin/app/routes/scopes/scope/host-catalogs.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeHostCatalogsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets.js b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets.js index 2105cde03..b2323fdaf 100644 --- a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets.js +++ b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeHostCatalogsHostCatalogHostSetsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/host-set/hosts.js b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/host-set/hosts.js index cb2eea11c..8bc4a25fa 100644 --- a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/host-set/hosts.js +++ b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/host-set/hosts.js @@ -3,7 +3,7 @@ import { hash, all } from 'rsvp'; import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError, diff --git a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/hosts.js b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/hosts.js index d9ac931e7..ee964d5f6 100644 --- a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/hosts.js +++ b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/hosts.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeHostCatalogsHostCatalogHostsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/roles.js b/ui/admin/app/routes/scopes/scope/roles.js index fd6974073..fb93bcaaa 100644 --- a/ui/admin/app/routes/scopes/scope/roles.js +++ b/ui/admin/app/routes/scopes/scope/roles.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeRolesRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/roles/role/principals.js b/ui/admin/app/routes/scopes/scope/roles/role/principals.js index 4b9654f79..910bee7f4 100644 --- a/ui/admin/app/routes/scopes/scope/roles/role/principals.js +++ b/ui/admin/app/routes/scopes/scope/roles/role/principals.js @@ -3,7 +3,7 @@ import { all, hash } from 'rsvp'; import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeRolesRolePrincipalsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/targets.js b/ui/admin/app/routes/scopes/scope/targets.js index bf86cd0d2..232d8f92e 100644 --- a/ui/admin/app/routes/scopes/scope/targets.js +++ b/ui/admin/app/routes/scopes/scope/targets.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeTargetsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/targets/target/host-sets.js b/ui/admin/app/routes/scopes/scope/targets/target/host-sets.js index fd48b3d5d..62468fca6 100644 --- a/ui/admin/app/routes/scopes/scope/targets/target/host-sets.js +++ b/ui/admin/app/routes/scopes/scope/targets/target/host-sets.js @@ -3,7 +3,7 @@ import { all, hash } from 'rsvp'; import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../../../decorators/notify'; export default class ScopesScopeTargetsTargetHostSetsRoute extends Route { diff --git a/ui/admin/app/routes/scopes/scope/users.js b/ui/admin/app/routes/scopes/scope/users.js index d2f71320f..de60dd833 100644 --- a/ui/admin/app/routes/scopes/scope/users.js +++ b/ui/admin/app/routes/scopes/scope/users.js @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import loading from 'ember-loading/decorator'; -import { confirm } from '../../../decorators/confirm'; +import { confirm } from 'core/decorators/confirm'; import { notifySuccess, notifyError } from '../../../decorators/notify'; export default class ScopesScopeUsersRoute extends Route { diff --git a/yarn.lock b/yarn.lock index 19cd67a62..da2d17406 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8905,6 +8905,14 @@ ember-get-config@0.2.4, ember-get-config@^0.2.2, ember-get-config@^0.2.4: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" +ember-get-config@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" + integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== + dependencies: + broccoli-file-creator "^1.1.1" + ember-cli-babel "^7.0.0" + "ember-getowner-polyfill@^1.1.0 || ^2.0.0", ember-getowner-polyfill@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2"