Merge branch 'develop' into dropdown-separator

This commit is contained in:
Randall Morey authored and GitHub committed 2020-10-07 12:10:54 -04:00
commit 36e2dabd36
94 files changed
+145 -83

No files matched your search

View File
Whitespace-only changes.
+4 -1
View File
@@ -37,8 +37,11 @@ export default class ApplicationSerializer extends RESTSerializer {
* @param {String} key
* @param {Object} attribute
*/
serializeAttribute(snapshot, json, key, { options }) {
serializeAttribute(snapshot, json, key, attribute) {
const { type, options } = attribute;
let value = super.serializeAttribute(...arguments);
// Convert empty strings to null.
if (type === 'string' && json[key] === '') json[key] = null;
// Do not serialize read-only attributes.
if (options.readOnly) delete json[key];
// Version is sent only if it has a non-nullish value
View File
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
View File
Whitespace-only changes.
Whitespace-only changes.
@@ -70,6 +70,21 @@ module('Unit | Serializer | application', function (hooks) {
});
});
test('it serializes empty strings to null', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('user', {
name: '',
description: '',
version: null,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: null,
description: null,
});
});
test('it serializes non-nullish version fields', function (assert) {
assert.expect(2);
const store = this.owner.lookup('service:store');
View File
Whitespace-only changes.
View File
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
View File
Whitespace-only changes.
Whitespace-only changes.
View File
Whitespace-only changes.
View File
Whitespace-only changes.
View File
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
View File
Whitespace-only changes.
Whitespace-only changes.
View File
Whitespace-only changes.
@@ -1,6 +1,6 @@
<Rose::Form
class="full-width"
@onSubmit={{fn this.submit @submit}}
@onSubmit={{fn this.submit @submit this.currentPassword this.newPassword}}
@cancel={{fn this.cancel @cancel}}
@disabled={{@model.isSaving}}
@error={{@model.errors.base}}
@@ -2,7 +2,7 @@ import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { computed } from '@ember/object';
import { action } from '@ember/object';
import { next } from '@ember/runloop';
import { run } from '@ember/runloop';
export default class FormAccountPasswordChangePasswordIndexComponent extends Component {
@@ -50,13 +50,13 @@ export default class FormAccountPasswordChangePasswordIndexComponent extends Com
* Call passed submit function with passwords.
* Unset passwords before callack.
* @param {function} fn
* @param {string} currentPassword
* @param {string} newPassword
*/
@action
submit(fn) {
const currentPassword = this.currentPassword;
const newPassword = this.newPassword;
next(() => this.resetPasswords());
fn(currentPassword, newPassword);
submit(fn, currentPassword, newPassword) {
run(() => this.resetPasswords());
run(() => fn(currentPassword, newPassword));
}
/**
@@ -1,5 +1,5 @@
<Rose::Form
@onSubmit={{fn this.submit @submit}}
@onSubmit={{fn this.submit @submit this.password}}
@disabled={{@model.isSaving}}
@error={{@model.errors.base}}
as |form|
@@ -2,7 +2,7 @@ import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { computed } from '@ember/object';
import { action } from '@ember/object';
import { next } from '@ember/runloop';
import { run } from '@ember/runloop';
export default class FormAccountPasswordSetPasswordIndexComponent extends Component {
// =properties
@@ -36,11 +36,11 @@ export default class FormAccountPasswordSetPasswordIndexComponent extends Compon
* Submit with password value when it is allowed.
* Callback with no arguments otherwise.
* @param {function} fn
* @param {string} password
*/
@action
submit(fn) {
const password = this.password;
next(() => this.resetPassword());
fn(password);
submit(fn, password) {
run(() => this.resetPassword());
run(() => fn(password));
}
}
+1 -2
View File
@@ -1,12 +1,11 @@
import { helper } from '@ember/component/helper';
import { get } from '@ember/object';
import { assert } from '@ember/debug';
import config from '../config/environment';
export default helper(function docUrl(params/*, hash*/) {
const baseURL = config.documentation.baseURL;
const docKey = params[0] || '';
const configuredPath = get(config.documentation, docKey);
const configuredPath = config.documentation.topics[docKey];
if (docKey) {
assert(`
Documentation for "${docKey}" could not be found. Please ensure that
+2
View File
@@ -12,6 +12,8 @@
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/core.css">
<link rel="icon" type="image/svg+xml" href="{{rootURL}}logo-app.svg">
{{content-for "head-footer"}}
</head>
<body>
View File
Whitespace-only changes.
+4 -4
View File
@@ -5,13 +5,13 @@
<layout.header>
<Rose::Header class="{{if (is-loading) " loading"}}" as |header|>
<header.brand @logo="logo-boundary" @text={{app-name}} />
<header.brand @logo="logo-app" @text={{app-name}} />
{{#if this.session.isAuthenticated}}
<header.nav as |nav|>
<nav.dropdown
@text={{this.scope.displayName}}
@icon="boundary-icons/org" as |dropdown|
@icon="app-icons/org" as |dropdown|
>
{{#if this.session.data.authenticated.isGlobal}}
<dropdown.link @route="scopes.scope" @model="global">
@@ -35,7 +35,7 @@
<header.utilities as |utilities|>
<utilities.dropdown
@text={{this.session.data.authenticated.username}}
@icon="boundary-icons/user-profile" as |dropdown|
@icon="app-icons/user-profile" as |dropdown|
>
<dropdown.link @route="account.change-password">
{{t 'actions.change-password'}}
@@ -60,7 +60,7 @@
<layout.footer>
<Rose::Footer as |footer|>
<footer.brand @logo="logo-hashi" @text={{company-name}} />
<footer.brand @logo="logo-company" @text={{company-name}} />
<footer.text>{{company-copyright}}</footer.text>
<footer.text>{{app-name}}</footer.text>
<footer.nav as |nav|>
+1 -1
View File
@@ -6,7 +6,7 @@
<Rose::Nav::Sidebar @title={{t "titles.general"}} as |nav|>
<nav.link @route="scopes.scope.projects">
<Rose::Icon
@name="boundary-icons/project"
@name="app-icons/project"
@size="medium" />
{{t "resources.project.title_plural"}}
</nav.link>
@@ -1,25 +1,25 @@
<Rose::Nav::Sidebar @title={{t "titles.iam"}} as |nav|>
<nav.link @route="scopes.scope.users">
<Rose::Icon
@name="boundary-icons/users"
@name="app-icons/users"
@size="medium" />
{{t "resources.user.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.groups">
<Rose::Icon
@name="boundary-icons/group"
@name="app-icons/group"
@size="medium" />
{{t "resources.group.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.roles">
<Rose::Icon
@name="boundary-icons/roles"
@name="app-icons/roles"
@size="medium" />
{{t "resources.role.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.auth-methods">
<Rose::Icon
@name="boundary-icons/auth-method"
@name="app-icons/auth-method"
@size="medium" />
{{t "resources.auth-method.title_plural"}}
</nav.link>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.auth-method.title"}}
<DocLink @doc="topics.auth-method" @iconSize="large" />
<DocLink @doc="auth-method" @iconSize="large" />
</h2>
<p>{{t "resources.auth-method.description"}}</p>
<Copyable
@@ -1,6 +1,6 @@
<h2>
{{t "resources.account.title"}}
<DocLink @doc="topics.account" @iconSize="large" />
<DocLink @doc="account" @iconSize="large" />
</h2>
<Copyable
@text={{@model.id}}
@@ -1 +1,4 @@
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="account.new" @iconSize="large" />
</h2>
@@ -2,7 +2,7 @@
<page.header>
<h2>
{{t "resources.auth-method.title_plural"}}
<DocLink @doc="topics.auth-method" @iconSize="large" />
<DocLink @doc="auth-method" @iconSize="large" />
</h2>
<p>{{t "resources.auth-method.description"}}</p>
</page.header>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.group.title"}}
<DocLink @doc="topics.group" @iconSize="large" />
<DocLink @doc="group" @iconSize="large" />
</h2>
<p>{{t "resources.group.description"}}</p>
<Copyable
@@ -1,2 +1,5 @@
<h2>{{t "resources.group.messages.add-members.title"}}</h2>
<h2>
{{t "resources.group.messages.add-members.title"}}
<DocLink @doc="group.add-members" @iconSize="large" />
</h2>
<p>{{t "resources.group.messages.add-members.description"}}</p>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.group.title_plural"}}
<DocLink @doc="topics.group" @iconSize="large" />
<DocLink @doc="group" @iconSize="large" />
</h2>
<p>{{t "resources.group.description"}}</p>
</page.header>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.org.title_plural"}}
<DocLink @doc="topics.org" @iconSize="large" />
<DocLink @doc="org" @iconSize="large" />
</h2>
{{#if @model}}
<p>{{t "resources.org.description"}}</p>
@@ -35,7 +35,7 @@
@title={{org.name}}
@description={{org.description}}
@id={{org.id}}
@icon="boundary-icons/org"
@icon="app-icons/org"
@route="scopes.scope"
@model={{org.id}}
/>
@@ -7,7 +7,10 @@
</page.breadcrumbs>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="org.new" @iconSize="large" />
</h2>
</page.header>
<page.body>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.project.title_plural"}}
<DocLink @doc="topics.project" @iconSize="large" />
<DocLink @doc="project" @iconSize="large" />
</h2>
{{#if @model}}
<p>{{t "resources.project.description"}}</p>
@@ -35,7 +35,7 @@
@title={{project.name}}
@description={{project.description}}
@id={{project.id}}
@icon="boundary-icons/project"
@icon="app-icons/project"
@route="scopes.scope.projects.project"
@model={{project.id}}
/>
@@ -7,7 +7,10 @@
</page.breadcrumbs>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="project.new" @iconSize="large" />
</h2>
</page.header>
<page.body>
@@ -1,19 +1,19 @@
<Rose::Nav::Sidebar @title={{t "titles.resources"}} as |nav|>
<nav.link @route="scopes.scope.projects.project.sessions">
<Rose::Icon
@name="boundary-icons/action-session"
@name="app-icons/action-session"
@size="medium" />
{{t "resources.session.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.projects.project.targets">
<Rose::Icon
@name="boundary-icons/target"
@name="app-icons/target"
@size="medium" />
{{t "resources.target.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.projects.project.host-catalogs">
<Rose::Icon
@name="boundary-icons/host-catalogs"
@name="app-icons/host-catalogs"
@size="medium" />
{{t "resources.host-catalog.title_plural"}}
</nav.link>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.host-catalog.title"}}
<DocLink @doc="topics.host-catalog" @iconSize="large" />
<DocLink @doc="host-catalog" @iconSize="large" />
</h2>
<p>{{t "resources.host-catalog.description"}}</p>
<Copyable
@@ -1,6 +1,6 @@
<h2>
{{t "resources.host-set.title"}}
<DocLink @doc="topics.host-set" @iconSize="large" />
<DocLink @doc="host-set" @iconSize="large" />
</h2>
<p>{{t "resources.host-set.description"}}</p>
<Copyable
@@ -1,2 +1,5 @@
<h2>{{t "resources.host-set.host.messages.add.title"}}</h2>
<p>{{t "resources.host-set.host.messages.add.description"}}</p>
<h2>
{{t "resources.host-set.host.messages.add.title"}}
<DocLink @doc="host-set.add-hosts" @iconSize="large" />
</h2>
<p>{{t "resources.host-set.host.messages.add.description"}}</p>
@@ -1 +1,4 @@
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="host-set.new" @iconSize="large" />
</h2>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.host.title"}}
<DocLink @doc="topics.host" @iconSize="large" />
<DocLink @doc="host" @iconSize="large" />
</h2>
<p>{{t "resources.host.description"}}</p>
<Copyable
@@ -1 +1,4 @@
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="host.new" @iconSize="large" />
</h2>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.host-catalog.title_plural"}}
<DocLink @doc="topics.host-catalog" @iconSize="large" />
<DocLink @doc="host-catalog" @iconSize="large" />
</h2>
<p>{{t "resources.host-catalog.description"}}</p>
</page.header>
@@ -7,7 +7,10 @@
</page.breadcrumbs>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="host-catalog.new" @iconSize="large" />
</h2>
</page.header>
<page.body>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.project.title"}}
<DocLink @doc="topics.project" @iconSize="large" />
<DocLink @doc="project" @iconSize="large" />
</h2>
<p>{{t "resources.project.description"}}</p>
<Copyable
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.session.title_plural"}}
<DocLink @doc="topics.session" @iconSize="large" />
<DocLink @doc="session" @iconSize="large" />
</h2>
<p>{{t "resources.session.description"}}</p>
</page.header>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.target.title_plural"}}
<DocLink @doc="topics.target" @iconSize="large" />
<DocLink @doc="target" @iconSize="large" />
</h2>
{{#if @model}}
<p>{{t "resources.target.description"}}</p>
@@ -7,7 +7,10 @@
</page.breadcrumbs>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>
{{t "titles.new"}}
<DocLink @doc="target.new" @iconSize="large" />
</h2>
</page.header>
<page.body>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.target.title"}}
<DocLink @doc="topics.target" @iconSize="large" />
<DocLink @doc="target" @iconSize="large" />
</h2>
<p>{{t "resources.target.description"}}</p>
<Copyable
@@ -1,2 +1,5 @@
<h2>{{t "resources.target.host-set.messages.add.title"}}</h2>
<p>{{t "resources.target.host-set.messages.add.description"}}</p>
<h2>
{{t "resources.target.host-set.messages.add.title"}}
<DocLink @doc="target.add-host-sets" @iconSize="large" />
</h2>
<p>{{t "resources.target.host-set.messages.add.description"}}</p>
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.role.title_plural"}}
<DocLink @doc="topics.role" @iconSize="large" />
<DocLink @doc="role" @iconSize="large" />
</h2>
{{#if @model}}
<p>{{t "resources.role.description"}}</p>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.role.title"}}
<DocLink @doc="topics.role" @iconSize="large" />
<DocLink @doc="role" @iconSize="large" />
</h2>
<p>{{t "resources.role.description"}}</p>
<Copyable
@@ -1,2 +1,5 @@
<h2>{{t "resources.role.principal.messages.add-principals.title"}}</h2>
<p>{{t "resources.role.principal.messages.add-principals.description"}}</p>
<h2>
{{t "resources.role.principal.messages.add-principals.title"}}
<DocLink @doc="role.add-principals" @iconSize="large" />
</h2>
<p>{{t "resources.role.principal.messages.add-principals.description"}}</p>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.role.title"}}
<DocLink @doc="topics.role" @iconSize="large" />
<DocLink @doc="role" @iconSize="large" />
</h2>
<p>{{t "resources.role.grant.description"}}</p>
<Copyable
@@ -1,6 +1,6 @@
<h2>
{{t "resources.role.title"}}
<DocLink @doc="topics.role" @iconSize="large" />
<DocLink @doc="role" @iconSize="large" />
</h2>
<p>{{t "resources.role.principal.description"}}</p>
<Copyable
@@ -7,7 +7,7 @@
<page.header>
<h2>
{{t "resources.user.title_plural"}}
<DocLink @doc="topics.user" @iconSize="large" />
<DocLink @doc="user" @iconSize="large" />
</h2>
{{#if @model}}
<p>{{t "resources.user.description"}}</p>
@@ -1,6 +1,6 @@
<h2>
{{t "resources.user.title"}}
<DocLink @doc="topics.user" @iconSize="large" />
<DocLink @doc="user" @iconSize="large" />
</h2>
<p>{{t "resources.user.description"}}</p>
<Copyable
+23 -12
View File
@@ -41,18 +41,29 @@ module.exports = function (environment) {
documentation: {
baseURL: 'https://boundaryproject.io/help/admin-ui',
topics: {
org: '/org',
project: '/project',
account: '/account',
'auth-method': '/auth-method',
group: '/group',
'host-catalog': '/host-catalog',
'host-set': '/host-set',
host: '/host',
role: '/role',
session: '/session',
target: '/target',
user: '/user'
org: '/orgs',
'org.new': '/orgs/new',
project: '/projects',
'project.new': '/projects/new',
account: '/accounts',
'account.new': '/accounts/new',
'auth-method': '/auth-methods',
group: '/groups',
'group.add-members': '/groups/add-members',
'host-catalog': '/host-catalogs',
'host-catalog.new': '/host-catalogs/new',
'host-set': '/host-sets',
'host-set.new': '/host-sets/new',
'host-set.add-hosts': '/host-sets/add-hosts',
host: '/hosts',
'host.new': '/hosts/new',
role: '/roles',
'role.add-principals': '/roles/add-principals',
session: '/sessions',
target: '/targets',
'target.new': '/targets/new',
'target.add-host-sets': '/targets/add-host-sets',
user: '/users'
}
},
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
-1
View File
@@ -1 +0,0 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.278 9.313a2.021 2.021 0 0 1-2.01-.951c-.552-.928-.224-2.115.732-2.65.956-.536 2.179-.218 2.732.71.407.684.346 1.54-.155 2.164l2.354 3.955c2.02-.731 4.352.038 5.466 1.91 1.242 2.087.504 4.76-1.647 5.964a4.608 4.608 0 0 1-3.51.41l.474-1.383c.77.204 1.594.1 2.286-.288 1.434-.804 1.925-2.583 1.098-3.975a3.006 3.006 0 0 0-2.193-1.429 3.059 3.059 0 0 0-2.507.807l-3.12-5.244zm3.367 6.592a2.003 2.003 0 0 1 1.855-1.213c1.104 0 2 .87 2 1.94 0 1.072-.896 1.94-2 1.941-.815 0-1.549-.48-1.855-1.213h-4.707C10.58 19.424 8.728 21 6.5 21c-2.484 0-4.5-1.957-4.5-4.366 0-1.24.533-2.358 1.389-3.153l.997 1.088a2.859 2.859 0 0 0-.886 2.065c0 1.607 1.343 2.91 3 2.91.928 0 1.803-.417 2.371-1.128a2.844 2.844 0 0 0 .534-2.51h6.24zm-7.568-.49c.501.623.562 1.479.155 2.164-.553.927-1.775 1.245-2.732.71-.956-.536-1.284-1.723-.732-2.65a2.022 2.022 0 0 1 2.01-.953l2.354-3.955c-1.664-1.332-2.143-3.676-1.03-5.548C9.345 3.096 12.1 2.38 14.25 3.585a4.37 4.37 0 0 1 2.12 2.744l-1.47.293a2.915 2.915 0 0 0-1.4-1.777c-1.435-.802-3.269-.326-4.098 1.065a2.835 2.835 0 0 0-.179 2.557 2.973 2.973 0 0 0 1.974 1.704l-3.12 5.243z" fill="currentColor"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File
Whitespace-only changes.
@@ -8,7 +8,7 @@ module('Integration | Component | doc-link', function(hooks) {
test('it renders', async function(assert) {
assert.expect(1);
await render(hbs`<DocLink @doc="topics.account" @iconSize="large" />`);
await render(hbs`<DocLink @doc="account" @iconSize="large" />`);
assert.ok(find('.doc-link .rose-icon.large'));
});
});
@@ -11,7 +11,7 @@ module('Integration | Helper | doc-url', function(hooks) {
assert.expect(3);
const baseURL = config.documentation.baseURL;
const path = config.documentation.topics.account;
await render(hbs`{{doc-url 'topics.account'}}`);
await render(hbs`{{doc-url 'account'}}`);
assert.ok(baseURL);
assert.ok(path);
assert.equal(this.element.textContent.trim(), `${baseURL}${path}`);
@@ -20,7 +20,7 @@ module('Integration | Helper | doc-url', function(hooks) {
test('it throws an error if the specified documentation path cannot be found', async function(assert) {
assert.expect(2);
const helper = this.owner.lookup('helper:doc-url');
assert.ok(helper.compute(['topics.account']), 'Specified document exists.')
assert.ok(helper.compute(['account']), 'Specified document exists.')
assert.throws(() => {
helper.compute(['no.such.doc']);
}, 'Specified documentation was not found, so the helper threw an error.');
View File
Whitespace-only changes.
+2 -2
View File
@@ -107,14 +107,14 @@ session:
org:
title: Organization
title_plural: Organizations
description: An organization is a type of scope used to organize projects and IAM resources. Organizations contain projects and is a child scope of global.
description: An organization is a type of scope used to organize projects and IAM resources. Organizations are child scopes of the global scope.
messages:
welcome:
title: Welcome to Organizations
project:
title: Project
title_plural: Projects
description: A project is a type of scope used to organize resources such as by targets and host catalogs.
description: A project is a type of scope used to organize resources such as targets and host catalogs.
messages:
welcome:
title: Welcome to Projects
View File
Whitespace-only changes.