feat: Show scopes in header in desktop

This commit is contained in:
Susmitha Girumala committed 2020-11-09 17:48:54 -05:00
1 parent 9f7469992a
commit 6bccb3b42f
21 files changed
+229 -22

No files matched your search

+3 -1
View File
@@ -7,5 +7,7 @@ export default class Router extends EmberRouter {
}
Router.map(function () {
this.route('scopes');
this.route('scopes', function() {
this.route('scope', { path: ':scope_id' }, function() {});
});
});
+12
View File
@@ -0,0 +1,12 @@
import Route from '@ember/routing/route';
export default class IndexRoute extends Route {
// =methods
/**
* Redirects to scopes route for further processing.
*/
redirect() {
this.transitionTo('scopes');
}
}
+79
View File
@@ -0,0 +1,79 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import { A } from '@ember/array';
export default class ScopesScopeRoute extends Route {
// =services
@service scope;
// =methods
/**
* Attempt to load the specified scope from the API. This is allowed
* to fail, since in some cases the user may not have permission to read a
* scope directly, but may have permission to read resources under it.
* If the scope fails to load, we still proceed using a temporary scope object
* consisting of only the specified ID.
* @param {object} params
* @param {string} params.scope_id
* @return {Promise{ScopeModel}}
*/
model({ scope_id: id }) {
// Since only global and org scopes are authenticatable, we can infer type
// from ID because global has a fixed ID.
const type = id === 'global' ? 'global' : 'org';
return this.store.findRecord('scope', id).catch(() => {
console.error('caught error');
const maybeExistingScope = this.store.peekRecord('scope', id);
const scopeOptions = { id, type };
return (
maybeExistingScope || this.store.createRecord('scope', scopeOptions)
);
});
}
/**
* Load all scopes within the current scope context. Always attempt to load
* org scopes. Only attempt to load project scopes if the current scope is
* a project. These are used for scope navigation.
*/
async afterModel(model) {
// Load all orgs
let orgs;
orgs = await this.store.query('scope', { scope_id: 'global' })
.catch(() => A([]));
// Then pull out the "selected" scopes, if relevant
let selectedOrg;
if (model.isGlobal || model.isOrg) selectedOrg = model;
// Update the scope service with the current scope(s);
this.scope.org = selectedOrg;
this.scopes = { orgs, selectedOrg };
}
/**
* Adds the scopes hash to the controller context (see `afterModel`).
* @param {Controller} controller
*/
setupController(controller) {
super.setupController(...arguments);
const scopes = this.scopes;
controller.setProperties({ scopes });
}
/**
* Renders the scope-specific sidebar template.
* @override
* @param {object} controller
* @param {object} model
*/
renderTemplate() {
super.renderTemplate(...arguments);
this.render('scopes/scope/-header-nav', {
into: 'application',
outlet: 'header-nav',
});
}
}
+17
View File
@@ -0,0 +1,17 @@
import Service from '@ember/service';
import { tracked } from '@glimmer/tracking';
/**
* This simple non-functional service is used to retain references to
* the currently active scope or scopes.
*/
export default class ScopeService extends Service {
// =attributes
/**
* @type {ScopeModel}
*/
@tracked org;
}
+4
View File
@@ -5,6 +5,10 @@
<layout.header>
<Rose::Header as |header|>
<header.brand @logo="logo-app" @text={{app-name}} />
<header.nav>
{{outlet "header-nav"}}
</header.nav>
</Rose::Header>
</layout.header>
+1
View File
@@ -0,0 +1 @@
{{outlet}}
+1 -4
View File
@@ -1,4 +1 @@
I'm in scopes
{{@model}}
{{outlet}}
{{outlet}}
+26
View File
@@ -0,0 +1,26 @@
{{outlet}}
<Rose::Table as |table|>
<table.header as |header|>
<header.row as |row|>
<row.headerCell>Scope</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
{{#each @model as |scope|}}
<body.row as |row|>
<row.cell>
<Rose::LinkButton
@route="scopes.scope"
@model={{scope.id}}
>
{{scope.name}}
</Rose::LinkButton>
</row.cell>
<row.cell>
{{scope.id}}
</row.cell>
</body.row>
{{/each}}
</table.body>
</Rose::Table>
@@ -0,0 +1 @@
{{outlet}}
@@ -0,0 +1,16 @@
<Rose::Dropdown
@text={{this.scopes.selectedOrg.displayName}}
@icon={{if this.scopes.selectedOrg.isGlobal "app-icons/global" "app-icons/org"}} as |dropdown|
>
{{!-- {{#if this.session.data.authenticated.isGlobal}} --}}
<dropdown.link @route="scopes.scope" @model="global">
{{t "titles.global"}}
</dropdown.link>
<dropdown.separator />
{{!-- {{/if}} --}}
{{#each this.scopes.orgs as |scope|}}
<dropdown.link @route="scopes.scope" @model={{scope.id}}>
{{scope.displayName}}
</dropdown.link>
{{/each}}
</Rose::Dropdown>
@@ -0,0 +1 @@
{{outlet}}
+2 -2
View File
@@ -7,8 +7,8 @@ module.exports = function (environment) {
let ENV = {
modulePrefix: 'desktop',
environment,
rootURL: process.env.EMBER_CLI_ELECTRON ? '' : process.env.EMBER_CLI_ELECTRON ? '' : '/',
locationType: process.env.EMBER_CLI_ELECTRON ? 'hash' : process.env.EMBER_CLI_ELECTRON ? 'hash' : 'auto',
rootURL: process.env.EMBER_CLI_ELECTRON ? '' : process.env.EMBER_CLI_ELECTRON ? '' : process.env.EMBER_CLI_ELECTRON ? '' : '/',
locationType: process.env.EMBER_CLI_ELECTRON ? 'hash' : process.env.EMBER_CLI_ELECTRON ? 'hash' : process.env.EMBER_CLI_ELECTRON ? 'hash' : 'auto',
EmberENV: {
FEATURES: {
// Here you can enable experimental features on an ember canary build
+2 -1
View File
@@ -53,7 +53,7 @@
"ember-cli-template-lint": "^2.0.2",
"ember-cli-uglify": "^3.0.0",
"ember-data": "~3.20.0",
"ember-data-model-fragments": "^4.0.0",
"ember-data-model-fragments": "5.0.0-beta.0",
"ember-electron": "https://github.com/adopted-ember-addons/ember-electron#v3.0.0-beta.4",
"ember-exam": "^6.0.1",
"ember-export-application-global": "^2.0.1",
@@ -62,6 +62,7 @@
"ember-intl": "^5.5.0",
"ember-load-initializers": "^2.1.1",
"ember-maybe-import-regenerator": "^0.1.6",
"ember-modifier": "^2.1.1",
"ember-page-title": "^6.0.3",
"ember-qunit": "^4.6.0",
"ember-resolver": "^8.0.0",
+3
View File
@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.97503 7.25H10.0232C9.83952 5.33678 9.13836 3.52559 7.99998 2.00183C6.85742 3.53084 6.15589 5.3466 5.97503 7.25ZM10.025 8.75C9.84413 10.6534 9.14259 12.4692 8.00003 13.9982C6.86166 12.4744 6.16049 10.6632 5.97679 8.75H10.025ZM11.5309 8.75H14.4572C14.1478 11.4433 12.1921 13.6359 9.62187 14.296C10.707 12.6405 11.3662 10.7347 11.5309 8.75ZM14.4572 7.25H11.5293C11.3619 5.25743 10.7034 3.35494 9.62165 1.70392C12.192 2.36401 14.1478 4.55661 14.4572 7.25ZM4.46913 7.25H1.5428C1.85224 4.55668 3.80789 2.36413 6.37814 1.70397C5.29298 3.35946 4.63378 5.2653 4.46913 7.25ZM4.47076 8.75H1.5428C1.85224 11.4434 3.808 13.636 6.37836 14.2961C5.29662 12.6451 4.63811 10.7426 4.47076 8.75ZM0 8C0 3.58172 3.58172 0 8 0L8.00195 3.05531e-06C12.4193 0.00105872 16 3.58237 16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 990 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.15625 12.1875H5V16H0V0H12V5.125H15.5V16H12H10.5H7.15625V12.1875ZM10.5 14.5H8.65625V10.6875H3.5V14.5H1.5V1.5H10.5V5.125V14.5ZM12 14.5H14V6.625H12V14.5ZM3 3H4.88235V5H3V3ZM4.88235 7H3V9H4.88235V7ZM7 3H8.88235V5H7V3ZM8.88235 7H7V9H8.88235V7Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 417 B

@@ -0,0 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Route | index', function(hooks) {
setupTest(hooks);
test('it exists', function(assert) {
let route = this.owner.lookup('route:index');
assert.ok(route);
});
});
@@ -0,0 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Route | scopes/scope', function(hooks) {
setupTest(hooks);
test('it exists', function(assert) {
let route = this.owner.lookup('route:scopes/scope');
assert.ok(route);
});
});
@@ -0,0 +1,12 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Service | scope', function(hooks) {
setupTest(hooks);
// TODO: Replace this with your real tests.
test('it exists', function(assert) {
let service = this.owner.lookup('service:scope');
assert.ok(service);
});
});
+2
View File
@@ -0,0 +1,2 @@
titles:
global: Global
View File
Whitespace-only changes.
+22 -14
View File
@@ -8229,7 +8229,7 @@ ember-cli-babel@7.21.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.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, 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==
@@ -8775,19 +8775,6 @@ ember-data-model-fragments@5.0.0-beta.0:
git-repo-info "^2.0.0"
npm-git-info "^1.0.3"
ember-data-model-fragments@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-4.0.0.tgz#8570d8b6bef12e8a3518279af01478ef8818a44f"
integrity sha512-DcRRQAWrrfRQBW8+v6takQdS2hNJ9rKWU/uHjnPY6+Vg/y6TxyPU8mo0PF2z0DYAeXwoIQ05iYTJT0sqFPEo+w==
dependencies:
broccoli-file-creator "^2.1.1"
broccoli-merge-trees "^3.0.0"
calculate-cache-key-for-tree "^1.1.0"
ember-cli-babel "^6.8.0"
ember-copy "1.0.0"
git-repo-info "^2.0.0"
npm-git-info "^1.0.3"
ember-data@^3.16.0:
version "3.22.1"
resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.22.1.tgz#5b075fc8a2c3f18dac2305037d34b88666631b1a"
@@ -8837,6 +8824,15 @@ ember-decorators-polyfill@^1.1.5:
ember-cli-version-checker "^3.1.3"
ember-compatibility-helpers "^1.2.0"
ember-destroyable-polyfill@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.2.tgz#2cc7532bd3c00e351b4da9b7fc683f4daff79671"
integrity sha512-9t+ya+9c+FkNM5IAyJIv6ETG8jfZQaUnFCO5SeLlV0wkSw7TOexyb61jh5GVee0KmknfRhrRGGAyT4Y0TwkZ+w==
dependencies:
ember-cli-babel "^7.22.1"
ember-cli-version-checker "^5.1.1"
ember-compatibility-helpers "^1.2.1"
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"
@@ -9054,6 +9050,18 @@ ember-modifier@^1.0.3:
ember-compatibility-helpers "^1.2.1"
ember-modifier-manager-polyfill "^1.2.0"
ember-modifier@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9"
integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg==
dependencies:
ember-cli-babel "^7.22.1"
ember-cli-normalize-entity-name "^1.0.0"
ember-cli-string-utils "^1.1.0"
ember-cli-typescript "^3.1.3"
ember-destroyable-polyfill "^2.0.2"
ember-modifier-manager-polyfill "^1.2.0"
ember-notify@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/ember-notify/-/ember-notify-6.0.0.tgz#f92978e3452934f7c9b70d76ad2ec62bf072495a"