diff --git a/ui/core/app/helpers/is-loading.js b/ui/core/app/helpers/is-loading.js new file mode 100644 index 000000000..ca34b363a --- /dev/null +++ b/ui/core/app/helpers/is-loading.js @@ -0,0 +1,24 @@ +import Helper from '@ember/component/helper'; +import { inject as service } from '@ember/service'; + +/** + * This helper returns true or false based on the state of the ember-loading + * service's `isLoading` attribute. + */ +export default class extends Helper { + + // =services + + @service loading; + + // =methods + + /** + * Returns true if "something" is loading according to ember-loading. + * @return {boolean} + */ + compute() { + return this.loading.isLoading; + } + +} diff --git a/ui/core/app/routes/application.js b/ui/core/app/routes/application.js index 0a6c58271..881f99f33 100644 --- a/ui/core/app/routes/application.js +++ b/ui/core/app/routes/application.js @@ -5,6 +5,7 @@ import { getOwner } from '@ember/application'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import { later } from '@ember/runloop'; +import loading from 'ember-loading/decorator'; /** * Entry route for the application. @@ -60,11 +61,24 @@ export default class ApplicationRoute extends Route.extend( this.session.invalidate(); } + /** + * Hooks into ember-loading to kick off loading indicator in the + * application template. + * @return {Transition} returns the transition on a passthrough basis, + * because it is a promise on which ember-loading can watch for resolution. + */ + @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) { diff --git a/ui/core/app/styles/app.scss b/ui/core/app/styles/app.scss index a17433ebf..df612afed 100644 --- a/ui/core/app/styles/app.scss +++ b/ui/core/app/styles/app.scss @@ -40,3 +40,28 @@ } } } + +.rose-header { + position: relative; + + &.loading { + &::after { + content: " "; + position: absolute; + top: 100%; + left: 0; + right: 0; + height: 3px; + + background: repeating-linear-gradient(to right, #fff, #fff, var(--info), #fff, #fff); + background-size: 200% auto; + background-position: 0 100%; + animation: gradient 1s linear infinite; + + @keyframes gradient { + 0% { background-position: 0 0; } + 100% { background-position: -200% 0; } + } + } + } +} diff --git a/ui/core/app/templates/application.hbs b/ui/core/app/templates/application.hbs index 06a6a4291..8e16b5615 100644 --- a/ui/core/app/templates/application.hbs +++ b/ui/core/app/templates/application.hbs @@ -4,9 +4,8 @@ - + - {{#if this.session.isAuthenticated}} {{/if}} - diff --git a/ui/core/package.json b/ui/core/package.json index 212ce3416..ee54d5c47 100644 --- a/ui/core/package.json +++ b/ui/core/package.json @@ -63,6 +63,7 @@ "ember-inline-svg": "^1.0.0", "ember-intl": "^5.1.1", "ember-load-initializers": "^2.1.1", + "ember-loading": "^0.4.0", "ember-maybe-import-regenerator": "^0.1.6", "ember-modifier": "^1.0.3", "ember-notify": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index 03ce48f88..02168b019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4410,7 +4410,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0, babel-core@^6.26.3: +babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -4743,6 +4743,11 @@ babel-plugin-htmlbars-inline-precompile@^3.0.1: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.1.0.tgz#85085b50385277f2b331ebd54e22fa91aadc24e8" integrity sha512-ar6c4YVX6OV7Dzpq7xRyllQrHwVEzJf41qysYULnD6tu6TS+y1FxT2VcEvMC6b9Rq9xoHMzvB79HO3av89JCGg== +babel-plugin-htmlbars-inline-precompile@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" + integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== + babel-plugin-istanbul@^5.1.0, babel-plugin-istanbul@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" @@ -8410,7 +8415,7 @@ ember-cli-babel@7.19.0: rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.9.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -8585,6 +8590,26 @@ ember-cli-htmlbars@^4.0.0, ember-cli-htmlbars@^4.2.2: strip-bom "^4.0.0" walk-sync "^2.0.2" +ember-cli-htmlbars@^4.2.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.4.0.tgz#7ca17d5ca8f7550984346d9e6e93da0c3323f8d9" + integrity sha512-ohgctqk7dXIZR4TgN0xRoUYltWhghFJgqmtuswQTpZ7p74RxI9PKx+E8WV/95mGcPzraesvMNBg5utQNvcqgNg== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-htmlbars-inline-precompile "^3.2.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^2.3.1" + broccoli-plugin "^3.1.0" + common-tags "^1.8.0" + ember-cli-babel-plugin-helpers "^1.1.0" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + semver "^6.3.0" + strip-bom "^4.0.0" + walk-sync "^2.0.2" + ember-cli-inject-live-reload@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" @@ -8725,7 +8750,7 @@ ember-cli-typescript@3.0.0: stagehand "^1.0.0" walk-sync "^2.0.0" -ember-cli-typescript@^2.0.2: +ember-cli-typescript@^2.0.0-rc.2, ember-cli-typescript@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" integrity sha512-7I5azCTxOgRDN8aSSnJZIKSqr+MGnT+jLTUbBYqF8wu6ojs2DUnTePxUcQMcvNh3Q3B1ySv7Q/uZFSjdU9gSjA== @@ -8918,6 +8943,16 @@ ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-co ember-cli-version-checker "^2.1.1" semver "^5.4.1" +ember-concurrency@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.10.1.tgz#aae4528540391a7278e2c193a146b5474cad5ec2" + integrity sha512-KdvR5TEfnLov4igeIZiVueFOL0kMjkabMQrioipegey+NF23SSYThc/y2rKv109D92lTAJgC6Vp7+j2RtXqD+w== + dependencies: + babel-core "^6.24.1" + ember-cli-babel "^6.8.2" + ember-compatibility-helpers "^1.2.0" + ember-maybe-import-regenerator "^0.1.5" + ember-concurrency@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.3.0.tgz#66f90fb792687470bcee1172adc0ebf33f5e8b9c" @@ -8996,6 +9031,15 @@ ember-data@~3.16.0: ember-cli-typescript "^3.1.3" ember-inflector "^3.0.1" +ember-decorators-polyfill@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ember-decorators-polyfill/-/ember-decorators-polyfill-1.1.5.tgz#49203c302ea4486618ba4866923ec657cf2c9f3d" + integrity sha512-O154i8sLoVjsiKzSqxGRfHGr+N+drT6mRrLDbNgJCnW/V5uLg/ppZFpUsrdxuXnp5Q9us3OfXV1nX2CH+7bUpA== + dependencies: + ember-cli-babel "^7.1.2" + ember-cli-version-checker "^3.1.3" + ember-compatibility-helpers "^1.2.0" + ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" @@ -9190,7 +9234,18 @@ ember-load-initializers@^2.1.1: ember-cli-babel "^7.11.0" ember-cli-typescript "^2.0.2" -ember-maybe-import-regenerator@^0.1.6: +ember-loading@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ember-loading/-/ember-loading-0.4.0.tgz#4909a6585b351c9540a26bf20ab086986b427acf" + integrity sha512-x5JDBdCc0AjoMcUyTFtO3lqZ5ye2Sn4STm0dInSYm21pOmwkHB9bxMH8vyWj9JEiLKY6+Vb6PC0WbRM/SOn31Q== + dependencies: + ember-cli-babel "^7.18.0" + ember-cli-htmlbars "^4.2.3" + ember-cli-typescript "^2.0.0-rc.2" + ember-concurrency "^0.10.0" + ember-decorators-polyfill "^1.1.5" + +ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso=