Merge remote-tracking branch 'origin/main' into debian-support

This commit is contained in:
Susmitha Girumala committed 2021-09-03 10:23:30 -04:00
commit 878f3be747
129 files changed
+1557 -543

No files matched your search

+2 -1
View File
@@ -29,7 +29,8 @@ export default class CollectionAbility extends Ability {
* @return {boolean}
*/
hasAuthorizedCollectionAction(action) {
const { authorized_collection_actions } = this.model;
const authorized_collection_actions =
(this.model || {}).authorized_collection_actions || {};
const collection = this.collection || {};
return authorized_collection_actions[collection]?.includes(action);
}
+6 -1
View File
@@ -42,6 +42,11 @@ export default class BaseModel extends Model {
})
authorized_actions;
@attr({
readOnly: true,
})
authorized_collection_actions;
set scopeModel(model) {
if (model) {
const json = model.serialize();
@@ -52,7 +57,7 @@ export default class BaseModel extends Model {
/**
* Convenience for getting and setting the parent scope ID.
* @type {string
* @type {string}
*/
@computed('scope.scope_id')
get scopeID() {
+13
View File
@@ -4,6 +4,19 @@ import { trait } from 'ember-cli-mirage';
export default factory.extend({
type: 'global',
authorized_collection_actions: () => {
return {
users: ['create', 'list'],
sessions: ['list'],
groups: ['create', 'list'],
roles: ['create', 'list'],
targets: ['create', 'list'],
'credential-stores': ['create', 'list'],
'auth-methods': ['create', 'list'],
'host-catalogs': ['create', 'list'],
};
},
/**
* Generates realistic-ish IDs while still being deterministic.
*/
+1 -1
View File
@@ -41,7 +41,7 @@
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.27.0",
"ember-cli": "~3.28.0",
"ember-cli-dependency-checker": "^3.2.0",
"ember-cli-inject-live-reload": "^2.1.0",
"ember-cli-sri": "^2.1.1",
+1 -1
View File
@@ -35,7 +35,7 @@
"core": "*",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.27.0",
"ember-cli": "~3.28.0",
"ember-cli-dependency-checker": "^3.2.0",
"ember-cli-inject-live-reload": "^2.1.0",
"ember-cli-sri": "^2.1.1",
@@ -4,5 +4,5 @@
target="_blank"
rel="noreferrer noopener"
title={{t "actions.get-topic-help"}}>
<Rose::Icon @name="help-circle-outline" @size={{@iconSize}} />
<Rose::Icon @name="flight-icons/help-24" @size={{@iconSize}} />
</a>
@@ -27,13 +27,12 @@ export default class ErrorMessageComponent extends MessageComponent {
@computed('args.status')
get icon() {
switch (this.args.status) {
case '404':
return 'flight-icons/help-16';
case '401':
case '403':
return 'disabled';
case '404':
return 'help-circle-outline';
default:
return 'alert-circle-outline';
return 'flight-icons/alert-circle-16';
}
}
+37
View File
@@ -1,4 +1,41 @@
'use strict';
var path = require('path');
module.exports = {
name: require('./package').name,
included(app) {
this._super.included.apply(this, arguments);
this.includePublic(app);
this.setupSVGO(app);
},
/**
* Finds the public folder and includes it into the ember-inline-svg addon.
*/
includePublic(app) {
const publicPath = path.resolve('public');
const dummyPublicPath = path.resolve('tests/dummy/public');
app.options.svg = app.options.svg || {};
app.options.svg.paths = app.options.svg.paths || [];
app.options.svg.paths.push(publicPath);
if (this.isDevelopingAddon()) app.options.svg.paths.push(dummyPublicPath);
this.addons.forEach((addon) => {
if (addon.name === 'ember-inline-svg') addon.included(app);
});
},
/**
* Adjust SVG optimizer defaults (used by ember-inline-svg).
*/
setupSVGO(app) {
app.options.svg = app.options.svg || {};
app.options.svg.optimize = app.options.svg.optimize || {};
app.options.svg.optimize.plugins = app.options.svg.optimize.plugins || [];
app.options.svg.optimize.plugins.push({ removeViewBox: false });
},
};
+1 -1
View File
@@ -50,7 +50,7 @@
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.27.0",
"ember-cli": "~3.28.0",
"ember-cli-dependency-checker": "^3.2.0",
"ember-cli-inject-live-reload": "^2.1.0",
"ember-cli-sri": "^2.1.1",
+5 -3
View File
@@ -1,3 +1,5 @@
<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>
<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0, 0)">
<path d="M8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0ZM6.1281 1.77359C3.76051 2.48438 1.96114 4.50867 1.57645 7L4.06861 7C4.28628 5.12647 4.99696 3.33655 6.1281 1.77359ZM9.8719 1.77359C11.003 3.33655 11.7137 5.12647 11.9314 7L14.4236 7C14.0389 4.50867 12.2395 2.48438 9.8719 1.77359ZM10.4196 7C10.1652 5.12363 9.33287 3.33469 8 1.8356C6.66712 3.33469 5.83478 5.12363 5.58044 7L10.4196 7ZM5.52655 8.5L10.4734 8.5C10.3086 10.5575 9.45081 12.5327 8 14.1644C6.54919 12.5327 5.6914 10.5575 5.52655 8.5ZM4.02241 8.5L1.51894 8.5C1.7257 11.2179 3.60398 13.4686 6.1281 14.2264C4.89671 12.5249 4.16361 10.5545 4.02241 8.5ZM9.8719 14.2264C11.1033 12.5249 11.8364 10.5545 11.9776 8.5L14.4811 8.5C14.2743 11.2179 12.396 13.4686 9.8719 14.2264Z" fill-rule="EVENODD"></path>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 990 B

After

Width:  |  Height:  |  Size: 973 B

+12 -3
View File
@@ -1,3 +1,12 @@
<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>
<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(1, 1)">
<path d="M0 2.25C0 1.00736 1.00736 0 2.25 0L8.75 0C9.99264 0 11 1.00736 11 2.25L11 4.36218L13.0506 5.81469C13.6461 6.23651 14.0001 6.92096 14.0001 7.65074L14.0001 12.7501C14.0001 13.4404 13.4404 14.0001 12.7501 14.0001L10.2501 14.0001C10.0421 14.0001 9.85396 13.9154 9.71811 13.7788C9.5833 13.6432 9.5 13.4563 9.5 13.25L9.5 2.25C9.5 1.83579 9.16421 1.5 8.75 1.5L2.25 1.5C1.83579 1.5 1.5 1.83579 1.5 2.25L1.5 13.25C1.5 13.6642 1.16421 14 0.75 14C0.335786 14 0 13.6642 0 13.25L0 2.25ZM11 12.5001L11 6.20036L12.1836 7.03872C12.3821 7.17933 12.5001 7.40748 12.5001 7.65074L12.5001 12.5001L11 12.5001Z" fill-rule="EVENODD"></path>
<path d="M3.75005 9.5498C3.36345 9.5498 3.05005 9.8632 3.05005 10.2498L3.05005 13.2498C3.05005 13.6364 3.36345 13.9498 3.75005 13.9498C4.13665 13.9498 4.45005 13.6364 4.45005 13.2498L4.45005 10.9498L6.55005 10.9498L6.55005 13.2498C6.55005 13.6364 6.86345 13.9498 7.25005 13.9498C7.63665 13.9498 7.95005 13.6364 7.95005 13.2498L7.95005 10.2498C7.95005 9.8632 7.63665 9.5498 7.25005 9.5498L3.75005 9.5498Z" fill-rule="NONZERO"></path>
<path d="M3.25 3.75C3.25 3.33579 3.58579 3 4 3L4.25 3C4.66421 3 5 3.33579 5 3.75C5 4.16421 4.66421 4.5 4.25 4.5L4 4.5C3.58579 4.5 3.25 4.16421 3.25 3.75Z" fill-rule="NONZERO"></path>
<path d="M6.75 3C6.33579 3 6 3.33579 6 3.75C6 4.16421 6.33579 4.5 6.75 4.5L7 4.5C7.41421 4.5 7.75 4.16421 7.75 3.75C7.75 3.33579 7.41421 3 7 3L6.75 3Z" fill-rule="NONZERO"></path>
<path d="M3.25 5.75C3.25 5.33579 3.58579 5 4 5L4.25 5C4.66421 5 5 5.33579 5 5.75C5 6.16421 4.66421 6.5 4.25 6.5L4 6.5C3.58579 6.5 3.25 6.16421 3.25 5.75Z" fill-rule="NONZERO"></path>
<path d="M6.75 5C6.33579 5 6 5.33579 6 5.75C6 6.16421 6.33579 6.5 6.75 6.5L7 6.5C7.41421 6.5 7.75 6.16421 7.75 5.75C7.75 5.33579 7.41421 5 7 5L6.75 5Z" fill-rule="NONZERO"></path>
<path d="M3.25 7.75C3.25 7.33579 3.58579 7 4 7L4.25 7C4.66421 7 5 7.33579 5 7.75C5 8.16421 4.66421 8.5 4.25 8.5L4 8.5C3.58579 8.5 3.25 8.16421 3.25 7.75Z" fill-rule="NONZERO"></path>
<path d="M6.75 7C6.33579 7 6 7.33579 6 7.75C6 8.16421 6.33579 8.5 6.75 8.5L7 8.5C7.41421 8.5 7.75 8.16421 7.75 7.75C7.75 7.33579 7.41421 7 7 7L6.75 7Z" fill-rule="NONZERO"></path>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 2.3 KiB

+8 -3
View File
@@ -1,3 +1,8 @@
<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="M1.5 1.5H5.50461V5.63615H1.5V1.5ZM0 7.13615V0H7.00461V7.13615H0ZM1.5 10.3639H5.50461V14.5H1.5V10.3639ZM0 16V8.86386H7.00461V16H0ZM14.5 1.5H10.4954V5.63615H14.5V1.5ZM8.99536 0V7.13615H16V0H8.99536ZM10.4954 10.3639H14.5V14.5H10.4954V10.3639ZM8.99536 16V8.86386H16V16H8.99536Z" fill="currentColor"/>
</svg>
<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(1, 1)">
<path d="M1.25 0C0.559644 0 0 0.559644 0 1.25L0 4.75C0 5.44036 0.559644 6 1.25 6L4.75 6C5.44036 6 6 5.44036 6 4.75L6 1.25C6 0.559644 5.44036 0 4.75 0L1.25 0ZM1.5 4.5L1.5 1.5L4.5 1.5L4.5 4.5L1.5 4.5Z" fill-rule="EVENODD"></path>
<path d="M9.25 0C8.55964 0 8 0.559644 8 1.25L8 4.75C8 5.44036 8.55964 6 9.25 6L12.75 6C13.4404 6 14 5.44036 14 4.75L14 1.25C14 0.559644 13.4404 0 12.75 0L9.25 0ZM9.5 4.5L9.5 1.5L12.5 1.5L12.5 4.5L9.5 4.5Z" fill-rule="EVENODD"></path>
<path d="M8 9.25C8 8.55964 8.55964 8 9.25 8L12.75 8C13.4404 8 14 8.55964 14 9.25L14 12.75C14 13.4404 13.4404 14 12.75 14L9.25 14C8.55964 14 8 13.4404 8 12.75L8 9.25ZM9.5 9.5L9.5 12.5L12.5 12.5L12.5 9.5L9.5 9.5Z" fill-rule="EVENODD"></path>
<path d="M1.25 8C0.559644 8 0 8.55964 0 9.25L0 12.75C0 13.4404 0.559644 14 1.25 14L4.75 14C5.44036 14 6 13.4404 6 12.75L6 9.25C6 8.55964 5.44036 8 4.75 8L1.25 8ZM1.5 12.5L1.5 9.5L4.5 9.5L4.5 12.5L1.5 12.5Z" fill-rule="EVENODD"></path>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 1.1 KiB

+2
View File
@@ -32,6 +32,8 @@ titles:
descriptions:
empty-set: There are no items to display yet. You may be able to add items or try back later.
origin-initialization: To get started, please enter your origin URL
create-but-not-list: You do not have permission to list {resource}, but you can create new instances.
neither-list-nor-create: You do not have permission to list or create {resource}.
questions:
delete-confirm: Are you sure you want to delete this resource?
remove-confirm: Are you sure you want to remove this association?
@@ -13,7 +13,7 @@ When style definition isn't supplied, a default style will be supplied.
Styles: outline, dark, informational, informational-outline, success, success-outline, error, error-outline, warning, warning-outline, alert, alert-outline
```html
<Rose::Badge @style="outline" @icon="user-organization">Badge</Rose::Badge>
<Rose::Badge @style="outline" @icon="flight-icons/org-16">Badge</Rose::Badge>
```
<Preview>
@@ -43,11 +43,9 @@ Styles: outline, dark, informational, informational-outline, success, success-ou
'none'
),
icon: select('icon', {
'user-organization': 'user-organization',
'partner': 'partner',
'gift-fill': 'gift-fill',
'flight-icons/org-16': 'flight-icons/org-16',
},
'user-organization'
'flight-icons/org-16'
),
}
}}</Story>
@@ -58,7 +56,7 @@ Styles: outline, dark, informational, informational-outline, success, success-ou
template: hbs`
<Rose::Badge>default style</Rose::Badge>
<Rose::Badge @style="outline">outline</Rose::Badge>
<Rose::Badge @icon="user-organization">default style with icon</Rose::Badge>
<Rose::Badge @icon="flight-icons/org-16">default style with icon</Rose::Badge>
<Rose::Badge @style="dark">dark</Rose::Badge>
<Rose::Badge @style="informational">informational</Rose::Badge>
<Rose::Badge @style="informational-outline">informational-outline</Rose::Badge>
@@ -12,7 +12,7 @@ to trigger actions or to submit forms. Avoid using buttons as simple links to
other routes. For accessibility, use links instead.
```htmlbars
<Rose::Button @style="primary" @iconRight="chevron-right">
<Rose::Button @style="primary" @iconRight="flight-icons/entry-point-16">
Action
</Rose::Button>
```
@@ -49,23 +49,18 @@ other routes. For accessibility, use links instead.
iconLeft: select(
'iconLeft',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'check-circle-outline'
'flight-icons/check-circle-16'
),
iconRight: select(
'iconRight',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'chevron-right',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'chevron-right'
'flight-icons/clipboard-copy-16'
),
onClick: action('clicked'),
},
@@ -86,12 +81,10 @@ button in this case for accessibility.
iconOnly: select(
'iconOnly',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'check-circle-outline'
'flight-icons/check-circle-16'
),
},
}}</Story>
@@ -13,7 +13,7 @@ Card link component wraps content with `LinkTo` component. Supports title and de
@title='Card title'
@description='Card description'
@id='resource_id_1234'
@icon='user-organization'
@icon='flight-icons/org-16'
@route='about'/>
```
@@ -32,11 +32,9 @@ Card link component wraps content with `LinkTo` component. Supports title and de
description: text('description', 'Card description'),
id: text('id', 'resource_id_1234'),
icon: select('icon', {
'user-organization': 'user-organization',
'partner': 'partner',
'gift-fill': 'gift-fill',
'flight-icons/org-16': 'flight-icons/org-16',
},
'user-organization'
'flight-icons/org-16'
),
},
}}</Story>
@@ -18,35 +18,35 @@ A set of cards arranged side-by-side.
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
<cards.link
@route="index"
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
<cards.link
@route="index"
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
<cards.link
@route="index"
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
<cards.link
@route="index"
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
</Rose::Cards>
`,
@@ -62,14 +62,14 @@ A set of cards arranged side-by-side.
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
<cards.link
@route="index"
@title="Card Title"
@description="Description"
@id="resource_id_1234"
@icon="user-organization"
@icon="flight-icons/org-16"
/>
</Rose::Cards>
```
@@ -27,7 +27,7 @@
title={{@dismissButtonText}}
{{on "click" (fn this.dismiss @dismiss)}}
>
<Rose::Icon @name="cancel-plain" @size="small" />
<Rose::Icon @name="flight-icons/x-16" @size="small" />
</button>
</header>
@@ -62,7 +62,7 @@
title={{@dismissButtonText}}
{{on "click" (fn this.dismiss @dismiss)}}
>
<Rose::Icon @name="cancel-plain" @size="small" />
<Rose::Icon @name="flight-icons/x-16" @size="small" />
</button>
</header>
@@ -36,12 +36,10 @@ A dialog component with optional modal capabilities.
icon: select(
'icon',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less'
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'check-circle-outline'
'flight-icons/check-circle-16'
),
style: select(
'style',
@@ -60,7 +58,7 @@ A dialog component with optional modal capabilities.
<Rose::Dialog
@modal={{true}}
@dismiss={{@dismissFn}}
@icon="check-circle-outline"
@icon="flight-icons/check-circle-16"
@heading="Heading"
@dismissButtonText="Dismiss"
as |dialog|>
@@ -11,7 +11,7 @@ A simple dropdown component with support for links and buttons.
<Preview>
<Story name="Basic Dropdown" height="7rem">{{
template: hbs`
<Rose::Dropdown @text="Choose One&hellip;" @icon="user-organization" @showCaret={{showCaret}} as |dropdown|>
<Rose::Dropdown @text="Choose One&hellip;" @icon="flight-icons/org-16" @showCaret={{showCaret}} as |dropdown|>
<dropdown.link @route="index">Menu item</dropdown.link>
<dropdown.link @route="about">Menu item</dropdown.link>
<dropdown.separator />
@@ -31,7 +31,7 @@ A simple dropdown component with support for links and buttons.
<Preview>
<Story name="Icon-only Dropdown" height="5rem">{{
template: hbs`
<Rose::Dropdown @text="Choose One&hellip;" @icon="user-organization" @iconOnly={{true}} as |dropdown|>
<Rose::Dropdown @text="Choose One&hellip;" @icon="flight-icons/org-16" @iconOnly={{true}} as |dropdown|>
<dropdown.link @route="index">Menu item</dropdown.link>
<dropdown.link @route="about">Menu item</dropdown.link>
<dropdown.separator />
@@ -117,7 +117,7 @@ Dropdown supports `danger` styling through `style` attribute.
Dropdown indicator can be hidden using `showCaret` attribute.
```html
<Rose::Dropdown @showCaret={{true}} @icon="more-horizontal" as |dropdown|>
<Rose::Dropdown @showCaret={{true}} @icon="flight-icons/more-horizontal-16" as |dropdown|>
<dropdown.link @route="index">Menu item</dropdown.link>
<dropdown.button>Button menu item</dropdown.button>
</Rose::Dropdown>
@@ -1,4 +1,4 @@
<p class="rose-form-error-message" ...attributes>
<Rose::Icon @name="cancel-square-fill" @size="medium" />
<Rose::Icon @name="flight-icons/x-square-16" @size="medium" />
{{yield}}
</p>
@@ -68,12 +68,10 @@ Renders a form radiofield group.
firstFieldIcon: select(
'first icon',
{
'user-organization': 'user-organization',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/org-16': 'flight-icons/org-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'user-organization'
'flight-icons/org-16'
),
secondFieldLabel: text('second label', 'Maybe'),
secondFieldValue: text('second value', 'maybe'),
@@ -44,10 +44,8 @@ Renders a form radiofield.
'icon',
{
'none': null,
'user-organization': 'user-organization',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/org-16': 'flight-icons/org-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
null
),
@@ -111,14 +109,12 @@ Renders a form radiofield.
'icon',
{
'none': null,
'user-organization': 'user-organization',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/org-16': 'flight-icons/org-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
null
),
inline: boolean('inline', false)
}
}}</Story>
</Preview>
</Preview>
@@ -27,7 +27,7 @@ A header component that allows three distinct sections to be configured: brand,
<utilities.dropdown
@text="user@example.net"
@iconOnly={{true}}
@icon="user-square-fill" as |dropdown|
@icon="flight-icons/user-circle-16" as |dropdown|
>
<dropdown.link @route="index">Menu item</dropdown.link>
<dropdown.link @route="about">Menu item</dropdown.link>
@@ -69,13 +69,11 @@ A header component that allows three distinct sections to be configured: brand,
dropdownIcon: select(
'dropdownIcon',
{
'user-square-fill': 'user-square-fill',
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/user-circle-16': 'flight-icons/user-circle-16',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'user-square-fill'
'flight-icons/user-circle-16'
),
},
}}</Story>
@@ -7,9 +7,7 @@ import { text, boolean, select } from '@storybook/addon-knobs';
# Icon
Renders a simple icon from [Structure Icons][structure-icons].
[structure-icons]: https://github.com/hashicorp/structure-icons
Renders a simple icon.
```htmlbars
<Rose::Icon @name={{name}} @size={{size}} />
@@ -24,12 +22,10 @@ Renders a simple icon from [Structure Icons][structure-icons].
name: select(
'name',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'unfold-less': 'unfold-less',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'check-circle-outline'
'flight-icons/check-circle-16'
),
}
}}</Story>
@@ -12,7 +12,7 @@ Styles supported: primary, secondary, warning, and ghost.
Disabling link button is not supported as it is an action on form components only.
```html
<Rose::LinkButton @route="index" @style="primary" @iconRight="chevron-right">
<Rose::LinkButton @route="index" @style="primary" @iconRight="flight-icons/entry-point-16">
Content
</Rose::LinkButton>
```
@@ -45,21 +45,18 @@ Disabling link button is not supported as it is an action on form components onl
iconLeft: select(
'iconLeft',
{
'check-circle-outline': 'check-circle-outline',
'copy-action': 'copy-action',
'unfold-more': 'unfold-more',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'copy-action'
'flight-icons/clipboard-copy-16'
),
iconRight: select(
'iconRight',
{
'check-circle-outline': 'check-circle-outline',
'chevron-right': 'chevron-right',
'copy-action': 'copy-action',
'search': 'search',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/clipboard-copy-16': 'flight-icons/clipboard-copy-16',
},
'chevron-right'
'flight-icons/clipboard-copy-16'
),
},
}}</Story>
@@ -68,7 +65,7 @@ Disabling link button is not supported as it is an action on form components onl
Similar to `Rose::Button`, icon only link button is supported.
```html
<Rose::LinkButton @route="index" @style="primary" @iconOnly="help-circle-outline" />
<Rose::LinkButton @route="index" @style="primary" @iconOnly="flight-icons/help-16" />
```
<Preview>
@@ -91,12 +88,10 @@ Similar to `Rose::Button`, icon only link button is supported.
iconOnly: select(
'iconOnly',
{
'check-circle-outline': 'check-circle-outline',
'help-circle-outline': 'help-circle-outline',
'plus-circle-fill': 'plus-circle-fill',
'user-square-outline': 'user-square-outline',
'flight-icons/check-circle-16': 'flight-icons/check-circle-16',
'flight-icons/help-16': 'flight-icons/help-16',
},
'help-circle-outline'
'flight-icons/help-16'
),
},
}}</Story>
@@ -46,7 +46,7 @@ A simple key/value list with support for embedded form fields and buttons.
<input.field />
</item.cell>
<item.cell>
<Rose::Button @style="secondary" @iconOnly="trash" title="Remove">Remove</Rose::Button>
<Rose::Button @style="secondary" @iconOnly="flight-icons/trash-16" title="Remove">Remove</Rose::Button>
</item.cell>
</list.item>
</Rose::Form::Input>
@@ -94,7 +94,7 @@ A simple key/value list with support for embedded form fields and buttons.
<input.field />
</item.cell>
<item.cell>
<Rose::Button @style="secondary" @iconOnly="trash" title="Remove">Remove</Rose::Button>
<Rose::Button @style="secondary" @iconOnly="flight-icons/trash-16" title="Remove">Remove</Rose::Button>
</item.cell>
</list.item>
</Rose::Form::Input>
@@ -18,7 +18,7 @@ Title can be configured with optional icon and subtitle.
{{description}}
</message.description>
<message.link @route="index">
<Rose::Icon @name="chevron-left" />
<Rose::Icon @name="flight-icons/chevron-left-16" />
Go back
</message.link>
<message.link @route="index">
@@ -33,24 +33,23 @@ Title can be configured with optional icon and subtitle.
icon: select(
'icon',
{
'alert-circle-outline': 'alert-circle-outline',
'help-circle-outline': 'help-circle-outline',
'disabled': 'disabled',
'flight-icons/alert-circle-16': 'flight-icons/alert-circle-16',
'flight-icons/help-16': 'flight-icons/help-16',
},
'help-circle-outline'
'flight-icons/help-16'
),
},
}}</Story>
</Preview>
```html
<Rose::Message @title="Page not found" @subtitle="Error 404" @icon="disabled" as |message|>
<Rose::Message @title="Page not found" @subtitle="Error 404" @icon="flight-icons/alert-circle-16" as |message|>
<message.description>
You must be granted permissions to view this data. Ask your administrator
if you think you should have access.
</message.description>
<message.link @route="index">
<Rose::Icon @name="chevron-left" />
<Rose::Icon @name="flight-icons/chevron-left-16" />
Go back
</message.link>
<message.link @route="index">Need help?</message.link>
@@ -26,7 +26,7 @@
{{on "click" @dismiss}}
>
<Rose::Icon
@name="cancel-plain"
@name="flight-icons/x-16"
@size="medium" />
<span class="rose-notification-dismiss-text">
{{@dismissText}}
@@ -8,17 +8,17 @@ export default class RoseNotificationComponent extends Component {
*/
@computed('style')
get icon() {
let icon = 'info-circle-fill';
let icon = 'flight-icons/info-16';
switch (this.style) {
case 'error':
icon = 'cancel-square-fill';
icon = 'flight-icons/x-square-16';
break;
case 'success':
icon = 'check-circle-fill';
icon = 'flight-icons/check-circle-16';
break;
case 'warning':
icon = 'alert-triangle';
icon = 'flight-icons/alert-triangle-16';
break;
}
@@ -122,7 +122,7 @@ Cell shrink should be applied to all the cells in a row. Otherwise the bigger ce
</Rose::Form::Input>
</row.cell>
<row.cell @shrink={{true}} @alignRight={{true}}>
<Rose::Button @style="secondary" @iconOnly="trash" title="Remove">Remove</Rose::Button>
<Rose::Button @style="secondary" @iconOnly="flight-icons/trash-16" title="Remove">Remove</Rose::Button>
</row.cell>
</body.row>
<body.row as |row|>
+5 -3
View File
@@ -10,7 +10,7 @@ module.exports = {
this._super.included.apply(this, arguments);
this.includeStyles(app);
this.includeIcons(app);
this.includeFlightIcons(app);
this.includePublic(app);
this.setupSVGO(app);
},
@@ -45,8 +45,10 @@ module.exports = {
* Finds the structure-icons folder and includes it into the
* ember-inline-svg addon.
*/
includeIcons(app) {
const iconPackagePath = require.resolve('@hashicorp/structure-icons');
includeFlightIcons(app) {
const iconPackagePath = path.resolve(
'../../node_modules/@hashicorp/flight-icons'
);
const iconsPath = path.resolve(iconPackagePath, '..');
app.options.svg = app.options.svg || {};
+2 -2
View File
@@ -43,7 +43,7 @@
"@ember/test-helpers": "^2.2.8",
"@glimmer/component": "^1.0.3",
"@glimmer/tracking": "^1.0.3",
"@hashicorp/structure-icons": "^1.9.0-0",
"@hashicorp/flight-icons": "0.0.6-beta",
"@storybook/addon-actions": "^6.3.1",
"@storybook/addon-docs": "^6.3.1",
"@storybook/addon-knobs": "^6.3.0",
@@ -53,7 +53,7 @@
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.27.0",
"ember-cli": "~3.28.0",
"ember-cli-dependency-checker": "^3.2.0",
"ember-cli-inject-live-reload": "^2.1.0",
"ember-cli-sass": "^10.0.1",
@@ -19,7 +19,7 @@
<utilities.dropdown
@text="user@example.net"
@iconOnly={{true}}
@icon="user-square-fill" as |dropdown|
@icon="flight-icons/user-circle-16" as |dropdown|
>
<dropdown.link @route="index">Menu item</dropdown.link>
<dropdown.link @route="about">Menu item</dropdown.link>
@@ -82,7 +82,7 @@
<input.field />
</item.cell>
<item.cell>
<Rose::Button @style="secondary" @iconOnly="trash" title="Remove">Remove</Rose::Button>
<Rose::Button @style="secondary" @iconOnly="flight-icons/trash-16" title="Remove">Remove</Rose::Button>
</item.cell>
</list.item>
</Rose::Form::Input>
@@ -17,7 +17,7 @@ module('Integration | Component | rose/badge', function (hooks) {
});
test('it renders an icon using @icon', async function (assert) {
await render(hbs`<Rose::Badge @icon="chevron-right" />`);
await render(hbs`<Rose::Badge @icon="flight-icons/entry-point-16" />`);
assert.ok(find('.rose-icon'));
});
@@ -34,14 +34,20 @@ module('Integration | Component | rose/button', function (hooks) {
});
test('it supports left and right icons', async function (assert) {
await render(hbs`<Rose::Button @iconLeft="chevron-left" />`);
await render(
hbs`<Rose::Button @iconLeft="flight-icons/chevron-left-16" />`
);
assert.ok(find('.has-icon-left .rose-icon'));
await render(hbs`<Rose::Button @iconRight="chevron-left" />`);
await render(
hbs`<Rose::Button @iconRight="flight-icons/chevron-left-16" />`
);
assert.ok(find('.has-icon-right .rose-icon'));
});
test('it supports an icon-only type', async function (assert) {
await render(hbs`<Rose::Button @iconOnly="chevron-left" />`);
await render(
hbs`<Rose::Button @iconOnly="flight-icons/chevron-left-16" />`
);
assert.ok(find('.has-icon-only .rose-icon'));
});
});
@@ -42,7 +42,7 @@ module('Integration | Component | rose/card/link', function (hooks) {
test('it renders with @icon', async function (assert) {
await render(
hbs`<Rose::Card::Link @title="foo" @icon="alert-circle-outline" />`
hbs`<Rose::Card::Link @title="foo" @icon="flight-icons/alert-circle-16" />`
);
assert.ok(find('.rose-icon'));
});
@@ -24,7 +24,7 @@ module('Integration | Component | rose/dropdown', function (hooks) {
});
test('it supports an icon', async function (assert) {
await render(hbs`<Rose::Dropdown @icon="user-square-fill" />`);
await render(hbs`<Rose::Dropdown @icon="flight-icons/user-circle-16" />`);
assert.ok(find('svg'));
});
@@ -32,7 +32,9 @@ module('Integration | Component | rose/dropdown/button', function (hooks) {
});
test('it supports an icon-only type', async function (assert) {
await render(hbs`<Rose::Dropdown::Button @iconOnly="chevron-left" />`);
await render(
hbs`<Rose::Dropdown::Button @iconOnly="flight-icons/chevron-left-16" />`
);
assert.ok(find('.has-icon-only .rose-icon'));
});
});
@@ -18,7 +18,9 @@ module('Integration | Component | rose/form/radio/radio', function (hooks) {
});
test('it supports an icon', async function (assert) {
await render(hbs`<Rose::Form::Radio::Radio @icon="user-square-fill" />`);
await render(
hbs`<Rose::Form::Radio::Radio @icon="flight-icons/user-circle-16" />`
);
assert.ok(find('svg'));
});
@@ -7,12 +7,14 @@ module('Integration | Component | rose/icon', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
await render(hbs`<Rose::Icon @name="unfold-more" />`);
await render(hbs`<Rose::Icon @name="flight-icons/globe-16" />`);
assert.ok(find('svg'));
});
test('it supports optional @size', async function (assert) {
await render(hbs`<Rose::Icon @name="unfold-more" @size="small" />`);
await render(
hbs`<Rose::Icon @name="flight-icons/globe-16" @size="small" />`
);
assert.ok(find('.small'));
});
});
@@ -35,7 +35,7 @@ module('Integration | Component | rose/link-button', function (hooks) {
test('it supports left icon with @iconLeft', async function (assert) {
await render(
hbs`<Rose::LinkButton @route="index" @iconLeft="chevron-left" />`
hbs`<Rose::LinkButton @route="index" @iconLeft="flight-icons/chevron-left-16" />`
);
assert.ok(find('.rose-icon'));
assert.ok(find('.has-icon-left'));
@@ -43,7 +43,7 @@ module('Integration | Component | rose/link-button', function (hooks) {
test('it supports left icon with @iconRight', async function (assert) {
await render(
hbs`<Rose::LinkButton @route="index" @iconRight="chevron-right" />`
hbs`<Rose::LinkButton @route="index" @iconRight="flight-icons/entry-point-16" />`
);
assert.ok(find('.rose-icon'));
assert.ok(find('.has-icon-right'));
@@ -51,7 +51,7 @@ module('Integration | Component | rose/link-button', function (hooks) {
test('it supports only icon with @iconOnly', async function (assert) {
await render(
hbs`<Rose::LinkButton @route="index" @iconOnly="help-circle-outline" />`
hbs`<Rose::LinkButton @route="index" @iconOnly="flight-icons/help-16" />`
);
assert.ok(find('.rose-icon'));
assert.ok(find('.has-icon-only'));
+1 -2
View File
@@ -76,8 +76,7 @@
"minimist": "^1.2.3",
"normalize-url": "^4.5.1",
"glob-parent": "^5.1.2",
"tar": "^6.1.2",
"xmldom": "github:xmldom/xmldom#0.7.0",
"tar": "^6.1.9",
"path-parse": "^1.0.7"
},
"config": {
+2 -2
View File
@@ -12,8 +12,8 @@ export default class CopyableComponent extends Component {
id = generateComponentID();
copyableButtonId = `copyable-button-${this.id}`;
actionIcon = 'copy-action';
successIcon = 'copy-success';
actionIcon = 'flight-icons/clipboard-copy-16';
successIcon = 'flight-icons/clipboard-checked-16';
actionText = this.args.buttonText;
successText = this.args.acknowledgeText;
@@ -177,7 +177,7 @@
<row.cell @shrink={{true}}>
<Rose::Button
@style='warning'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
@disabled={{if
@model.isNew
@@ -278,7 +278,7 @@
<row.cell @shrink={{true}}>
<Rose::Button
@style='warning'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
@disabled={{if
@model.isNew
@@ -368,7 +368,7 @@
<row.cell @shrink={{true}}>
<Rose::Button
@style='warning'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
@disabled={{if
@model.isNew
@@ -477,7 +477,7 @@
<row.cell @shrink={{true}}>
<Rose::Button
@style='warning'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
@disabled={{if
@model.isNew
@@ -578,7 +578,7 @@
<row.cell @shrink={{true}}>
<Rose::Button
@style='warning'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
@disabled={{if
@model.isNew
@@ -49,7 +49,7 @@
{{t 'resources.group.messages.no-members.description'}}
</message.description>
<message.link @route='scopes.scope.groups.group.members'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -55,7 +55,7 @@
<message.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.hosts'
>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -58,7 +58,7 @@
{{t 'resources.role.principal.messages.none.description'}}
</message.description>
<message.link @route='scopes.scope.roles.role.principals'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -74,7 +74,7 @@
<item.cell>
<Rose::Button
@style='secondary'
@iconOnly='trash'
@iconOnly='flight-icons/trash-16'
title={{t 'actions.remove'}}
{{on 'click' (fn @removeGrant grant.value)}}
>
+4 -2
View File
@@ -69,9 +69,11 @@
@text={{this.selectedGrantScope.displayName}}
@icon={{if
this.selectedGrantScope.isProject
'app-icons/project'
'flight-icons/grid-16'
(if
this.selectedGrantScope.isOrg 'app-icons/org' 'app-icons/global'
this.selectedGrantScope.isOrg
'flight-icons/org-16'
'flight-icons/globe-16'
)
}}
as |dropdown|
@@ -55,7 +55,7 @@
{{t 'resources.target.credential-library.messages.none.description'}}
</message.description>
<message.link @route='scopes.scope.targets.target.credential-libraries'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -59,7 +59,7 @@
{{t 'resources.target.host-set.messages.none.description'}}
</message.description>
<message.link @route='scopes.scope.targets.target.host-sets'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -59,7 +59,7 @@
{{t 'resources.user.messages.no-accounts.description'}}
</message.description>
<message.link @route='scopes.scope.users.user.accounts'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -11,6 +11,7 @@ export default class ScopesScopeAuthMethodsRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
@@ -26,8 +27,13 @@ export default class ScopesScopeAuthMethodsRoute extends Route {
* @return {Promise[AuthMethodModel]}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('auth-method', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (
this.can.can('list collection', scope, { collection: 'auth-methods' })
) {
return this.store.query('auth-method', { scope_id });
}
}
// =actions
@@ -1,4 +1,5 @@
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 'core/decorators/confirm';
@@ -6,14 +7,21 @@ import { notifySuccess, notifyError } from 'core/decorators/notify';
export default class ScopesScopeCredentialStoresRoute extends Route {
// =methods
@service can;
/**
* Load all credential stores under current scope
* @returns {Promise[CredentialStoreModel]}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('credential-store', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (
this.can.can('list collection', scope, {
collection: 'credential-stores',
})
) {
return this.store.query('credential-store', { scope_id });
}
}
// =actions
@@ -1,3 +1,10 @@
import Route from '@ember/routing/route';
export default class ScopesScopeCredentialStoresIndexRoute extends Route {
// =methods
export default class ScopesScopeCredentialStoresIndexRoute extends Route {}
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
+6 -3
View File
@@ -11,7 +11,7 @@ export default class ScopesScopeGroupsRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
/**
@@ -26,8 +26,11 @@ export default class ScopesScopeGroupsRoute extends Route {
* @return {Promise[GroupModel]}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('group', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (this.can.can('list collection', scope, { collection: 'groups' })) {
return this.store.query('group', { scope_id });
}
}
// =actions
@@ -1,3 +1,10 @@
import Route from '@ember/routing/route';
export default class ScopesScopeGroupsIndexRoute extends Route {
// =methods
export default class ScopesScopeGroupsIndexRoute extends Route {}
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
@@ -11,7 +11,7 @@ export default class ScopesScopeHostCatalogsRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
/**
@@ -26,8 +26,13 @@ export default class ScopesScopeHostCatalogsRoute extends Route {
* @return {Promise{[HostCatalogModel]}}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('host-catalog', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (
this.can.can('list collection', scope, { collection: 'host-catalogs' })
) {
return this.store.query('host-catalog', { scope_id });
}
}
// =actions
@@ -1,3 +1,9 @@
import Route from '@ember/routing/route';
export default class ScopesScopeHostCatalogsIndexRoute extends Route {}
export default class ScopesScopeHostCatalogsIndexRoute extends Route {
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
+6 -2
View File
@@ -11,6 +11,7 @@ export default class ScopesScopeRolesRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
@@ -26,8 +27,11 @@ export default class ScopesScopeRolesRoute extends Route {
* @return {Promise{[RoleModel]}}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('role', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (this.can.can('list collection', scope, { collection: 'roles' })) {
return this.store.query('role', { scope_id });
}
}
// =actions
@@ -1,3 +1,10 @@
import Route from '@ember/routing/route';
export default class ScopesScopeRolesIndexRoute extends Route {
// =methods
export default class ScopesScopeRolesIndexRoute extends Route {}
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
+6 -2
View File
@@ -11,6 +11,7 @@ export default class ScopesScopeTargetsRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
@@ -26,8 +27,11 @@ export default class ScopesScopeTargetsRoute extends Route {
* @return {Promise{[TargetModel]}}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('target', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (this.can.can('list collection', scope, { collection: 'targets' })) {
return this.store.query('target', { scope_id });
}
}
// =actions
@@ -1,3 +1,10 @@
import Route from '@ember/routing/route';
export default class ScopesScopeTargetsIndexRoute extends Route {
// =methods
export default class ScopesScopeTargetsIndexRoute extends Route {}
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
+6 -2
View File
@@ -11,6 +11,7 @@ export default class ScopesScopeUsersRoute extends Route {
@service intl;
@service notify;
@service session;
@service can;
// =methods
@@ -26,8 +27,11 @@ export default class ScopesScopeUsersRoute extends Route {
* @return {Promise{[UserModel]}}
*/
async model() {
const { id: scope_id } = this.modelFor('scopes.scope');
return this.store.query('user', { scope_id });
const scope = this.modelFor('scopes.scope');
const { id: scope_id } = scope;
if (this.can.can('list collection', scope, { collection: 'users' })) {
return this.store.query('user', { scope_id });
}
}
// =actions
@@ -1,3 +1,11 @@
import Route from '@ember/routing/route';
export default class ScopesScopeUsersIndexRoute extends Route {}
export default class ScopesScopeUsersIndexRoute extends Route {
// =methods
setupController(controller) {
const scope = this.modelFor('scopes.scope');
super.setupController(...arguments);
controller.setProperties({ scope });
}
}
-8
View File
@@ -189,14 +189,6 @@
}
}
.doc-link {
.large {
svg {
transform: scale(0.8);
}
}
}
[class*='session-status-'] {
color: var(--ui-gray-subtler-2);
}
+3 -3
View File
@@ -16,7 +16,7 @@
<header.utilities as |utilities|>
<utilities.dropdown
@text={{this.session.data.authenticated.username}}
@icon='app-icons/user-profile'
@icon='flight-icons/user-circle-16'
as |dropdown|
>
<dropdown.link @route='account.change-password'>
@@ -100,7 +100,7 @@
<Rose::Dialog
@heading={{t 'titles.abandon-confirm'}}
@dismissButtonText={{t 'actions.cancel'}}
@icon='alert-triangle'
@icon='flight-icons/alert-triangle-16'
@style='warning'
@modal={{true}}
@dismiss={{deny}}
@@ -126,7 +126,7 @@
(t 'actions.confirm')
}}
@dismissButtonText={{t 'actions.cancel'}}
@icon='alert-triangle'
@icon='flight-icons/alert-triangle-16'
@style='warning'
@modal={{true}}
@dismiss={{deny}}
+1 -1
View File
@@ -8,7 +8,7 @@
<Rose::Layout::Centered>
<Rose::Message
@title={{t 'auth.titles.no-scopes'}}
@icon='alert-circle-outline'
@icon='flight-icons/alert-circle-16'
as |message|
>
<message.description>
+60 -39
View File
@@ -18,7 +18,7 @@
{{#if @model.isGlobal}}
<Rose::Nav::Sidebar @title={{t 'titles.general'}} as |nav|>
<nav.link @route='scopes.scope.scopes'>
<Rose::Icon @name='app-icons/org' @size='medium' />
<Rose::Icon @name='flight-icons/org-16' @size='medium' />
{{t 'resources.org.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
@@ -28,12 +28,12 @@
<Rose::Nav::Sidebar @title={{t 'titles.general'}} as |nav|>
{{#if this.session.data.authenticated.isGlobal}}
<nav.link @route='scopes.scope.scopes' @model='global'>
<Rose::Icon @name='app-icons/org' @size='medium' />
<Rose::Icon @name='flight-icons/org-16' @size='medium' />
{{t 'resources.org.title_plural'}}
</nav.link>
{{/if}}
<nav.link @route='scopes.scope.scopes'>
<Rose::Icon @name='app-icons/project' @size='medium' />
<Rose::Icon @name='flight-icons/grid-16' @size='medium' />
{{t 'resources.project.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
@@ -43,12 +43,12 @@
<Rose::Nav::Sidebar @title={{t 'titles.general'}} as |nav|>
{{#if this.session.data.authenticated.isGlobal}}
<nav.link @route='scopes.scope.scopes' @model='global'>
<Rose::Icon @name='app-icons/org' @size='medium' />
<Rose::Icon @name='flight-icons/org-16' @size='medium' />
{{t 'resources.org.title_plural'}}
</nav.link>
{{/if}}
<nav.link @route='scopes.scope.scopes' @model={{@model.scopeID}}>
<Rose::Icon @name='app-icons/project' @size='medium' />
<Rose::Icon @name='flight-icons/grid-16' @size='medium' />
{{t 'resources.project.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
@@ -58,58 +58,79 @@
<Rose::Nav::Sidebar @title={{t "titles.iam"}} as |nav|>
<nav.link @route="scopes.scope.groups">
<Rose::Icon
@name="app-icons/group"
@name="flight-icons/folder-users-16"
@size="medium" />
{{t "resources.group.title_plural"}}
</nav.link>
<nav.link @route="scopes.scope.roles">
<Rose::Icon
@name="app-icons/roles"
@name="flight-icons/identity-user-16"
@size="medium" />
{{t "resources.role.title_plural"}}
</nav.link>
</Rose::Nav::Sidebar>
--}}
<Rose::Nav::Sidebar @title={{t 'titles.resources'}} as |nav|>
<nav.link @route='scopes.scope.sessions'>
<Rose::Icon @name='app-icons/action-session' @size='medium' />
{{t 'resources.session.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.targets'>
<Rose::Icon @name='app-icons/target' @size='medium' />
{{t 'resources.target.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.host-catalogs'>
<Rose::Icon @name='app-icons/host-catalogs' @size='medium' />
{{t 'resources.host-catalog.title_plural'}}
</nav.link>
{{#if (feature-flag 'credential-store')}}
<nav.link @route='scopes.scope.credential-stores'>
<Rose::Icon @name='app-icons/credentials' @size='medium' />
{{t 'resources.credential-store.title_plural'}}
{{#if (can 'navigate collection' @model collection='sessions')}}
<nav.link @route='scopes.scope.sessions'>
<Rose::Icon @name='flight-icons/entry-point-16' @size='medium' />
{{t 'resources.session.title_plural'}}
</nav.link>
{{/if}}
{{#if (can 'navigate collection' @model collection='targets')}}
<nav.link @route='scopes.scope.targets'>
<Rose::Icon @name='flight-icons/crosshair-16' @size='medium' />
{{t 'resources.target.title_plural'}}
</nav.link>
{{/if}}
{{#if (can 'navigate collection' @model collection='host-catalogs')}}
<nav.link @route='scopes.scope.host-catalogs'>
<Rose::Icon @name='flight-icons/collections-16' @size='medium' />
{{t 'resources.host-catalog.title_plural'}}
</nav.link>
{{/if}}
{{#if
(can 'navigate collection' @model collection='credential-stores')
}}
{{#if (feature-flag 'credential-store')}}
<nav.link @route='scopes.scope.credential-stores'>
<Rose::Icon @name='flight-icons/key-16' @size='medium' />
{{t 'resources.credential-store.title_plural'}}
</nav.link>
{{/if}}
{{/if}}
</Rose::Nav::Sidebar>
{{/if}}
{{#unless @model.isProject}}
<Rose::Nav::Sidebar @title={{t 'titles.iam'}} as |nav|>
<nav.link @route='scopes.scope.users'>
<Rose::Icon @name='app-icons/users' @size='medium' />
{{t 'resources.user.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.groups'>
<Rose::Icon @name='app-icons/group' @size='medium' />
{{t 'resources.group.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.roles'>
<Rose::Icon @name='app-icons/roles' @size='medium' />
{{t 'resources.role.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.auth-methods'>
<Rose::Icon @name='app-icons/auth-method' @size='medium' />
{{t 'resources.auth-method.title_plural'}}
</nav.link>
{{#if (can 'navigate collection' @model collection='users')}}
<nav.link @route='scopes.scope.users'>
<Rose::Icon @name='flight-icons/users-16' @size='medium' />
{{t 'resources.user.title_plural'}}
</nav.link>
{{/if}}
{{#if (can 'navigate collection' @model collection='groups')}}
<nav.link @route='scopes.scope.groups'>
<Rose::Icon @name='flight-icons/folder-users-16' @size='medium' />
{{t 'resources.group.title_plural'}}
</nav.link>
{{/if}}
{{#if (can 'navigate collection' @model collection='roles')}}
<nav.link @route='scopes.scope.roles'>
<Rose::Icon
@name='flight-icons/identity-user-16'
@size='medium'
/>
{{t 'resources.role.title_plural'}}
</nav.link>
{{/if}}
{{#if (can 'navigate collection' @model collection='auth-methods')}}
<nav.link @route='scopes.scope.auth-methods'>
<Rose::Icon @name='flight-icons/lock-16' @size='medium' />
{{t 'resources.auth-method.title_plural'}}
</nav.link>
{{/if}}
</Rose::Nav::Sidebar>
{{/unless}}
@@ -2,8 +2,8 @@
@text={{this.scopes.selectedOrg.displayName}}
@icon={{if
this.scopes.selectedOrg.isGlobal
'app-icons/global'
'app-icons/org'
'flight-icons/globe-16'
'flight-icons/org-16'
}}
as |dropdown|
>
@@ -23,7 +23,7 @@
{{#if this.scopes.selectedProject}}
<Rose::Dropdown
@text={{this.scopes.selectedProject.displayName}}
@icon='app-icons/project'
@icon='flight-icons/grid-16'
as |dropdown|
>
{{#each this.scopes.projects as |scope|}}
@@ -1,18 +1,18 @@
<Rose::Nav::Sidebar @title={{t 'titles.iam'}} as |nav|>
<nav.link @route='scopes.scope.users'>
<Rose::Icon @name='app-icons/users' @size='medium' />
<Rose::Icon @name='flight-icons/users-16' @size='medium' />
{{t 'resources.user.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.groups'>
<Rose::Icon @name='app-icons/group' @size='medium' />
<Rose::Icon @name='flight-icons/folder-users-16' @size='medium' />
{{t 'resources.group.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.roles'>
<Rose::Icon @name='app-icons/roles' @size='medium' />
<Rose::Icon @name='flight-icons/identity-user-16' @size='medium' />
{{t 'resources.role.title_plural'}}
</nav.link>
<nav.link @route='scopes.scope.auth-methods'>
<Rose::Icon @name='app-icons/auth-method' @size='medium' />
<Rose::Icon @name='flight-icons/lock-16' @size='medium' />
{{t 'resources.auth-method.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
@@ -3,8 +3,10 @@
@text={{t (concat 'states.' @model.attributes.state)}}
@icon={{if
@model.isInactive
'disabled'
(if @model.isPrivate 'lock-closed-outline' 'check-circle-outline')
'flight-icons/x-circle-16'
(if
@model.isPrivate 'flight-icons/lock-16' 'flight-icons/check-circle-16'
)
}}
@dropdownRight={{true}}
as |dropdown|
@@ -115,7 +115,7 @@
{{t 'resources.account.messages.welcome.description'}}
</message.description>
<message.link @route='scopes.scope.auth-methods.auth-method.accounts.new'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.account.actions.create'}}
</message.link>
</Rose::Message>
@@ -12,25 +12,28 @@
</page.breadcrumbs>
<page.actions>
{{#if @model}}
<Rose::Dropdown
@text={{t 'titles.new'}}
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.link
@route='scopes.scope.auth-methods.new'
@query={{hash type='password'}}
{{#if (can 'create collection' this.scopeModel collection='auth-methods')}}
{{#if @model}}
<Rose::Dropdown
@text={{t 'titles.new'}}
@dropdownRight={{true}}
as |dropdown|
>
{{t 'resources.auth-method.types.password'}}
</dropdown.link>
<dropdown.link
@route='scopes.scope.auth-methods.new'
@query={{hash type='oidc'}}
>
{{t 'resources.auth-method.types.oidc'}}
</dropdown.link>
</Rose::Dropdown>
<dropdown.link
@route='scopes.scope.auth-methods.new'
@query={{hash type='password'}}
>
{{t 'resources.auth-method.types.password'}}
</dropdown.link>
<dropdown.link
@route='scopes.scope.auth-methods.new'
@query={{hash type='oidc'}}
>
{{t 'resources.auth-method.types.oidc'}}
</dropdown.link>
</Rose::Dropdown>
{{/if}}
{{/if}}
</page.actions>
@@ -129,7 +132,7 @@
@dropdownRight={{true}}
@iconOnly={{true}}
@showCaret={{false}}
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
as |dropdown|
>
{{#unless authMethod.isPrimary}}
@@ -165,15 +168,38 @@
as |message|
>
<message.description>
{{t 'resources.auth-method.messages.welcome.description'}}
{{#if (can 'list collection' this.scope collection='auth-methods')}}
{{! can list (at least): show default welcome message}}
{{t 'resources.auth-method.messages.welcome.description'}}
{{else if (can
'create collection' this.scope collection='auth-methods'
)}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.auth-method.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.auth-method.title_plural')
}}
{{/if}}
</message.description>
<message.link
@route='scopes.scope.auth-methods.new'
@query={{hash type='password'}}
>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{#if (can 'create collection' this.scope collection='auth-methods')}}
<message.link @route='scopes.scope.auth-method.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -16,7 +16,7 @@
}}</p>
<Rose::Dropdown
@text={{t 'actions.choose-different-org'}}
@icon='user-organization'
@icon='flight-icons/org-16'
as |dropdown|
>
<dropdown.link @route='scopes.scope.authenticate' @model='global'>
@@ -79,7 +79,7 @@
<Rose::Layout::Centered>
<Rose::Message
@title={{t 'resources.auth-method.messages.none.title'}}
@icon='alert-circle-outline'
@icon='flight-icons/alert-circle-16'
as |message|
>
<message.description>
@@ -2,7 +2,7 @@
<Rose::Layout::Centered>
<Rose::Message
@title={{t 'resources.auth-method.messages.none.title'}}
@icon='alert-circle-outline'
@icon='flight-icons/alert-circle-16'
as |message|
>
<message.description>
@@ -58,7 +58,7 @@
<message.link
@route='scopes.scope.credential-stores.credential-store.credential-libraries.new'
>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -14,13 +14,16 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton
@route='scopes.scope.credential-stores.new'
@style='primary'
>
{{t 'titles.new'}}
</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='credential-stores')}}
{{#if @model}}
<Rose::LinkButton
@route='scopes.scope.credential-stores.new'
@style='primary'
>
{{t 'titles.new'}}
</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
@@ -79,12 +82,35 @@
as |message|
>
<message.description>
{{t 'resources.credential-store.description'}}
{{#if
(can 'list collection' this.scope collection='credential-stores')
}}
{{! can list (at least): show default welcome message}}
{{t 'resources.credential-store.description'}}
{{else if (can
'create collection' this.scope collection='credential-stores'
)}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.credential-store.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.user.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.credential-stores.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if
(can 'create collection' this.scope collection='credential-stores')
}}
<message.link @route='scopes.scope.credential-stores.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -27,7 +27,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -58,7 +58,7 @@
{{t 'resources.group.messages.members.description'}}
</message.description>
<message.link @route='scopes.scope.groups.group.add-members'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.group.actions.add-members'}}
</message.link>
</Rose::Message>
@@ -13,10 +13,12 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.groups.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='groups')}}
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.groups.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
@@ -70,11 +72,29 @@
>
<message.description>
{{t 'resources.group.description'}}
{{#if (can 'list collection' this.scope collection='groups')}}
{{! can list (at least): show default welcome message}}
{{t 'resources.group.description'}}
{{else if (can 'create collection' this.scope collection='groups')}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.group.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.group.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.groups.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if (can 'create collection' this.scope collection='groups')}}
<message.link @route='scopes.scope.groups.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -37,7 +37,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -70,7 +70,7 @@
</message.description>
{{!--
<message.link @route="scopes.scope.host-catalogs.host-catalog.host-sets.host-set.create-and-add-host">
<Rose::Icon @name="plus-circle-outline" />
<Rose::Icon @name="flight-icons/plus-circle-16" />
{{t "resources.host-set.actions.create-and-add-host"}}
</message.link>
--}}
@@ -56,7 +56,7 @@
<message.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.new'
>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -58,7 +58,7 @@
{{t 'resources.host.description'}}
</message.description>
<message.link @route='scopes.scope.host-catalogs.host-catalog.hosts.new'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -15,13 +15,15 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton
@route='scopes.scope.host-catalogs.new'
@style='primary'
>
{{t 'titles.new'}}
</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='host-catalogs')}}
{{#if @model}}
<Rose::LinkButton
@route='scopes.scope.host-catalogs.new'
@style='primary'
>
{{t 'titles.new'}}
</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
@@ -82,12 +84,35 @@
as |message|
>
<message.description>
{{t 'resources.host-catalog.description'}}
{{#if
(can 'list collection' this.scope collection='host-catalogs')
}}
{{! can list (at least): show default welcome message}}
{{t 'resources.host-catalog.description'}}
{{else if (can
'create collection' this.scope collection='host-catalogs'
)}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.host-catalog.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.host-catalog.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.host-catalogs.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if
(can 'create collection' this.scope collection='host-catalogs')
}}
<message.link @route='scopes.scope.host-catalogs.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -15,10 +15,12 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.roles.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='roles')}}
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.roles.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
@@ -68,12 +70,29 @@
as |message|
>
<message.description>
{{t 'resources.role.description'}}
{{#if (can 'list collection' this.scope collection='roles')}}
{{! can list (at least): show default welcome message}}
{{t 'resources.roles.description'}}
{{else if (can 'create collection' this.scope collection='roles')}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.role.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.role.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.roles.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if (can 'create collection' this.scope collection='roles')}}
<message.link @route='scopes.scope.roles.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -31,7 +31,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -62,7 +62,7 @@
{{t 'resources.role.principal.messages.welcome.description'}}
</message.description>
<message.link @route='scopes.scope.roles.role.add-principals'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.role.principal.actions.add-principals'}}
</message.link>
</Rose::Message>
@@ -43,7 +43,11 @@
@title={{scope.name}}
@description={{scope.description}}
@id={{scope.id}}
@icon={{if scope.isOrg 'app-icons/org' 'app-icons/project'}}
@icon={{if
scope.isOrg
'flight-icons/org-16'
'flight-icons/grid-16'
}}
@route='scopes.scope'
@model={{scope.id}}
/>
@@ -62,7 +66,7 @@
{{t 'resources.org.description'}}
</message.description>
<message.link @route='scopes.scope.new'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -79,7 +83,7 @@
{{t 'resources.project.description'}}
</message.description>
<message.link @route='scopes.scope.new'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -36,7 +36,7 @@
'session-status-'
sessionAggregate.session.status
}}
@name='app-icons/action-session'
@name='flight-icons/entry-point-16'
@size='medium'
/>
<Copyable
@@ -15,13 +15,14 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.targets.new' @style='primary'>
{{t 'titles.new'}}
</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='targets')}}
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.targets.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
<page.body>
{{#if @model}}
@@ -79,12 +80,34 @@
as |message|
>
<message.description>
{{t 'resources.target.description'}}
{{#if (can 'list collection' this.scope collection='targets')}}
{{! can list (at least): show default welcome message}}
{{t 'resources.target.description'}}
{{else if (can
'create collection' this.scope collection='targets'
)}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.target.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.target.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.targets.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if (can 'create collection' this.scope collection='targets')}}
<message.link @route='scopes.scope.targets.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -19,7 +19,7 @@
{{t 'resources.target.credential-library.messages.none.description'}}
</message.description>
<message.link @route='scopes.scope.targets.target.credential-libraries'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -20,7 +20,7 @@
{{t 'resources.target.host-set.messages.none.description'}}
</message.description>
<message.link @route='scopes.scope.targets.target.host-sets'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
@@ -44,7 +44,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -82,7 +82,7 @@
<message.link
@route='scopes.scope.targets.target.add-credential-libraries'
>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.target.actions.add-credential-libraries'}}
</message.link>
</Rose::Message>
@@ -34,7 +34,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -68,7 +68,7 @@
{{t 'resources.target.host-set.messages.welcome.description'}}
</message.description>
<message.link @route='scopes.scope.targets.target.add-host-sets'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.target.actions.add-host-sets'}}
</message.link>
</Rose::Message>
@@ -15,10 +15,12 @@
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.users.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{#if (can 'create collection' this.scope collection='users')}}
{{#if @model}}
<Rose::LinkButton @route='scopes.scope.users.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{/if}}
{{/if}}
</page.actions>
@@ -68,12 +70,29 @@
as |message|
>
<message.description>
{{t 'resources.user.description'}}
{{#if (can 'list collection' this.scope collection='users')}}
{{! can list (at least): show default welcome message}}
{{t 'resources.user.description'}}
{{else if (can 'create collection' this.scope collection='users')}}
{{! can create (only): show create-but-not-list welcome message}}
{{t
'descriptions.create-but-not-list'
resource=(t 'resources.user.title_plural')
}}
{{else}}
{{! can neither list nor create }}
{{t
'descriptions.neither-list-nor-create'
resource=(t 'resources.user.title_plural')
}}
{{/if}}
</message.description>
<message.link @route='scopes.scope.users.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
{{#if (can 'create collection' this.scope collection='users')}}
<message.link @route='scopes.scope.users.new'>
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'titles.new'}}
</message.link>
{{/if}}
</Rose::Message>
</Rose::Layout::Centered>
@@ -34,7 +34,7 @@
</row.cell>
<row.cell>
<Rose::Dropdown
@icon='more-horizontal'
@icon='flight-icons/more-horizontal-16'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@@ -68,7 +68,7 @@
{{t 'resources.user.messages.accounts.description'}}
</message.description>
<message.link @route='scopes.scope.users.user.add-accounts'>
<Rose::Icon @name='plus-circle-outline' />
<Rose::Icon @name='flight-icons/plus-circle-16' />
{{t 'resources.user.actions.add-accounts'}}
</message.link>
</Rose::Message>
@@ -20,7 +20,7 @@
{{t 'resources.user.messages.no-accounts.description'}}
</message.description>
<message.link @route='scopes.scope.users.user.accounts'>
<Rose::Icon @name='chevron-left' />
<Rose::Icon @name='flight-icons/chevron-left-16' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
+1 -1
View File
@@ -50,7 +50,7 @@
"ember-a11y-testing": "^4.0.7",
"ember-auto-import": "^1.10.1",
"ember-breadcrumbs": "^0.2.3",
"ember-cli": "~3.27.0",
"ember-cli": "~3.28.0",
"ember-cli-app-version": "^5.0.0",
"ember-cli-babel": "^7.23.0",
"ember-cli-code-coverage": "^1.0.2",
@@ -2,7 +2,6 @@ import { module, test } from 'qunit';
import { visit, currentURL, click, find, fillIn } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
import a11yAudit from 'ember-a11y-testing/test-support/audit';
import { Response } from 'miragejs';
import {
authenticateSession,
@@ -12,7 +11,7 @@ import {
} from 'ember-simple-auth/test-support';
import { enableFeature } from 'ember-feature-flags/test-support';
module('Acceptance | auth methods', function (hooks) {
module('Acceptance | auth-methods | create ', function (hooks) {
setupApplicationTest(hooks);
setupMirage(hooks);
@@ -20,9 +19,12 @@ module('Acceptance | auth methods', function (hooks) {
scopes: {
global: null,
org: null,
project: null,
},
authMethod: null,
orgScope: null,
};
const urls = {
orgScope: null,
authMethods: null,
@@ -31,58 +33,33 @@ module('Acceptance | auth methods', function (hooks) {
};
hooks.beforeEach(function () {
// Setup Mirage mock resources for this test
authenticateSession({});
instances.scopes.global = this.server.create('scope', { id: 'global' });
instances.scopes.org = this.server.create('scope', {
type: 'org',
scope: { id: 'global', type: 'global' },
instances.orgScope = this.server.create(
'scope',
{
type: 'org',
scope: { id: 'global', type: 'global' },
},
'withChildren'
);
instances.scopes.project = this.server.create('scope', {
type: 'project',
scope: { id: instances.orgScope.id, type: instances.orgScope.type },
});
instances.authMethod = this.server.create('auth-method', {
scope: instances.scopes.org,
scope: instances.orgScope,
});
// Generate route URLs for resources
urls.orgScope = `/scopes/${instances.scopes.org.id}`;
urls.orgScope = `/scopes/${instances.orgScope.id}`;
urls.authMethods = `${urls.orgScope}/auth-methods`;
urls.newAuthMethod = `${urls.authMethods}/new?type=password`;
urls.authMethod = `${urls.authMethods}/${instances.authMethod.id}`;
});
test('visiting auth methods', async function (assert) {
assert.expect(1);
await visit(urls.authMethods);
await a11yAudit();
assert.equal(currentURL(), urls.authMethods);
});
test('can navigate to an auth method form', async function (assert) {
assert.expect(1);
await visit(urls.authMethods);
await click('main tbody .rose-table-header-cell:nth-child(1) a');
await a11yAudit();
assert.equal(currentURL(), urls.authMethod);
});
test('can update an auth method and save changes', async function (assert) {
assert.expect(1);
await visit(urls.authMethod);
await click('form [type="button"]', 'Activate edit mode');
await fillIn('[name="name"]', 'update name');
await click('form [type="submit"]:not(:disabled)');
assert.equal(this.server.db.authMethods[0].name, 'update name');
});
test('can update an auth method and cancel changes', async function (assert) {
assert.expect(1);
await visit(urls.authMethod);
await click('form [type="button"]', 'Activate edit mode');
await fillIn('[name="name"]', 'update name');
await click('form button:not([type="submit"])');
assert.notEqual(this.server.db.authMethods[0].name, 'update name');
});
test('can create new auth method', async function (assert) {
test('Users can create new auth method', async function (assert) {
assert.expect(1);
const authMethodsCount = this.server.db.authMethods.length;
await visit(urls.newAuthMethod);
@@ -92,6 +69,33 @@ module('Acceptance | auth methods', function (hooks) {
assert.equal(this.server.db.authMethods.length, authMethodsCount + 1);
});
test('Users can navigate to new auth-methods route with proper authorization', async function (assert) {
assert.expect(2);
instances.orgScope.authorized_collection_actions['auth-methods'] = [
'create',
'list',
];
await visit(urls.orgScope);
assert.ok(
instances.orgScope.authorized_collection_actions['auth-methods'].includes(
'create'
)
);
assert.ok(find(`[href="${urls.authMethods}"]`));
});
test('Users cannot navigate to new auth-methods route without proper authorization', async function (assert) {
assert.expect(2);
instances.orgScope.authorized_collection_actions['auth-methods'] = [];
await visit(urls.orgScope);
assert.notOk(
instances.orgScope.authorized_collection_actions['auth-methods'].includes(
'create'
)
);
assert.notOk(find(`[href="${urls.authMethods}"]`));
});
test('can cancel new auth method creation', async function (assert) {
assert.expect(2);
const authMethodsCount = this.server.db.authMethods.length;
@@ -106,7 +110,7 @@ module('Acceptance | auth methods', function (hooks) {
test('user can make primary an auth method', async function (assert) {
assert.expect(2);
assert.notOk(
instances.scopes.org.primaryAuthMethodId,
instances.orgScope.primaryAuthMethodId,
'Primary auth method is not yet set.'
);
enableFeature('primary-auth-method');
@@ -114,7 +118,7 @@ module('Acceptance | auth methods', function (hooks) {
await click(
'.rose-layout-page-actions .rose-dropdown-content [type="button"]:first-child'
);
const scope = this.server.schema.scopes.find(instances.scopes.org.id);
const scope = this.server.schema.scopes.find(instances.orgScope.id);
assert.equal(
scope.primaryAuthMethodId,
instances.authMethod.id,
@@ -136,7 +140,7 @@ module('Acceptance | auth methods', function (hooks) {
);
});
assert.notOk(
instances.scopes.org.primaryAuthMethodId,
instances.orgScope.primaryAuthMethodId,
'Primary auth method is not yet set.'
);
enableFeature('primary-auth-method');
@@ -149,11 +153,11 @@ module('Acceptance | auth methods', function (hooks) {
test('user can remove as primary an auth method', async function (assert) {
assert.expect(2);
instances.scopes.org.update({
instances.orgScope.update({
primaryAuthMethodId: instances.authMethod.id,
});
assert.ok(
instances.scopes.org.primaryAuthMethodId,
instances.orgScope.primaryAuthMethodId,
'Primary auth method is set.'
);
enableFeature('primary-auth-method');
@@ -161,7 +165,7 @@ module('Acceptance | auth methods', function (hooks) {
await click(
'.rose-layout-page-actions .rose-dropdown-content [type="button"]:first-child'
);
const scope = this.server.schema.scopes.find(instances.scopes.org.id);
const scope = this.server.schema.scopes.find(instances.orgScope.id);
assert.notOk(scope.primaryAuthMethodId, 'Primary auth method is unset.');
});
@@ -178,11 +182,11 @@ module('Acceptance | auth methods', function (hooks) {
}
);
});
instances.scopes.org.update({
instances.orgScope.update({
primaryAuthMethodId: instances.authMethod.id,
});
assert.ok(
instances.scopes.org.primaryAuthMethodId,
instances.orgScope.primaryAuthMethodId,
'Primary auth method is set.'
);
enableFeature('primary-auth-method');
@@ -196,7 +200,7 @@ module('Acceptance | auth methods', function (hooks) {
test('user can make and remove primary auth methods from index', async function (assert) {
assert.expect(3);
assert.notOk(
instances.scopes.org.primaryAuthMethodId,
instances.orgScope.primaryAuthMethodId,
'Primary auth method is not yet set.'
);
enableFeature('primary-auth-method');
@@ -204,7 +208,7 @@ module('Acceptance | auth methods', function (hooks) {
await click(
'.rose-table-body .rose-table-row:first-child .rose-dropdown-content [type="button"]:first-child'
);
let scope = this.server.schema.scopes.find(instances.scopes.org.id);
let scope = this.server.schema.scopes.find(instances.orgScope.id);
assert.equal(
scope.primaryAuthMethodId,
instances.authMethod.id,
@@ -213,7 +217,7 @@ module('Acceptance | auth methods', function (hooks) {
await click(
'.rose-table-body .rose-table-row:first-child .rose-dropdown-content [type="button"]:first-child'
);
scope = this.server.schema.scopes.find(instances.scopes.org.id);
scope = this.server.schema.scopes.find(instances.orgScope.id);
assert.notOk(scope.primaryAuthMethodId, 'Primary auth method is unset.');
});
});
@@ -0,0 +1,79 @@
import { module, test } from 'qunit';
import { visit, find } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
import {
authenticateSession,
// These are left here intentionally for future reference.
//currentSession,
//invalidateSession,
} from 'ember-simple-auth/test-support';
module('Acceptance | auth-methods | list', function (hooks) {
setupApplicationTest(hooks);
setupMirage(hooks);
const instances = {
scopes: {
global: null,
org: null,
},
orgScope: null,
};
const urls = {
scopes: {
org: null,
},
authMethods: null,
orgScope: null,
};
hooks.beforeEach(function () {
instances.scopes.global = this.server.create('scope', { id: 'global' });
instances.orgScope = this.server.create(
'scope',
{
type: 'org',
scope: { id: 'global', type: 'global' },
},
'withChildren'
);
urls.orgScope = `/scopes/${instances.orgScope.id}`;
urls.authMethods = `/scopes/${instances.orgScope.id}/auth-methods`;
authenticateSession({});
});
test('Users can navigate to auth methods with proper authorization', async function (assert) {
assert.expect(2);
await visit(urls.orgScope);
assert.ok(
instances.orgScope.authorized_collection_actions['auth-methods'].includes(
'list'
)
);
assert.ok(find(`[href="${urls.authMethods}"]`));
});
test('Users cannot navigate to index without either list or create actions', async function (assert) {
assert.expect(2);
instances.orgScope.authorized_collection_actions['auth-methods'] = [];
await visit(urls.orgScope);
assert.notOk(
instances.orgScope.authorized_collection_actions['auth-methods'].includes(
'list'
)
);
assert.notOk(find(`[href="${urls.authMethods}"]`));
});
test('User can navigate to index with only create action', async function (assert) {
assert.expect(1);
instances.orgScope.authorized_collection_actions['auth-methods'] = [
'create',
];
await visit(urls.orgScope);
assert.ok(find(`[href="${urls.authMethods}"]`));
});
});
Loaded 100 of 129 files, more files were not shown because too many files have changed in this diff. Show more