Compare commits

..
83 Commits
Author SHA1 Message Date
Randall Morey 4fa5b924c9 Merge pull request #562 from hashicorp/chore-bump-cli-version
chore:  bump CLI version and update changelog
2021-05-19 13:23:22 -04:00
Randall Morey e86a4fc27d chore: bump CLI version and update changelog 2021-05-19 13:04:40 -04:00
Randall Morey d72b02ad29 Merge pull request #555 from hashicorp/ICU-1335-close-all-sessions-on-exit
feat: Prompt before quitting inprogress session on desktop client quit
2021-05-19 12:52:19 -04:00
Randall Morey 545e7d5a7f fix: import session manager correctly and reconstruct origin URL without extra colons 2021-05-19 09:45:07 -04:00
Randall Morey 4055f3a06e Merge pull request #560 from hashicorp/refactor-session-management
refactor:  change isActive to isRunning and related language to reduc…
2021-05-18 17:34:01 -04:00
Randall Morey 4fed7f3d94 refactor: rename to "running" 2021-05-17 17:23:18 -04:00
Randall Morey ee29f3c599 refactor: change isActive to isRunning and related language to reduce confusion with the API concept of session status "active" 2021-05-17 16:33:34 -04:00
Susmitha Girumala a1b0481db9 Merge branch 'main' into ICU-1335-close-all-sessions-on-exit 2021-05-17 14:52:39 -04:00
Susmitha Girumala 685ddeac7e Merge pull request #549 from hashicorp/ICU-1335-close-session-on-cancel
feat: Close local proxy on session cancellation in Desktop
2021-05-17 08:29:51 -04:00
Susmitha Girumala f2f5a46cdf refactor: Add conditional chaining to session-manager call 2021-05-14 15:08:06 -04:00
Susmitha Girumala 1a0650ff7c fix: Add url validation to origin validation in desktop 2021-05-14 15:00:24 -04:00
Susmitha Girumala 82a0c7c17c refactor: Rename origin service to runtime-settings 2021-05-14 14:29:26 -04:00
Susmitha Girumala 1397df807f fix: Add url validation to origin addr in desktop 2021-05-14 10:40:50 -04:00
Susmitha Girumala cc01bddea3 refactor: Create net-request-promise helper for runtimesettin 2021-05-13 12:50:01 -04:00
Susmitha Girumala 9f32b8cdc3 refactor: Origin runtime settings into origin service desktop 2021-05-13 10:36:28 -04:00
Susmitha Girumala ae8e20b8e1 refactor: Create services folder in desktop/electron-app 2021-05-13 10:23:22 -04:00
Susmitha Girumala aab980a7dc Merge remote-tracking branch 'origin/ICU-1335-close-session-on-cancel' into ICU-1335-close-all-sessions-on-exit 2021-05-12 17:01:29 -04:00
Susmitha Girumala 13146975e2 fix: Add missing cli folder in electron-app 2021-05-12 16:57:27 -04:00
Susmitha Girumala 542b469ad8 chore: Reapply stopping all session in desktop after merge 2021-05-12 15:46:40 -04:00
Susmitha Girumala c2c63294f4 Merge branch 'ICU-1335-close-session-on-cancel' into ICU-1335-close-all-sessions-on-exit 2021-05-12 15:41:47 -04:00
Susmitha Girumala 56936f78b8 chore: Update cancel to stop for ipc sessions call
Additional cleanup: remove unused async calls, separate session and
associated manager models, & attempt encoding origin url as part of
sanitization for cli command
2021-05-12 15:31:28 -04:00
Susmitha Girumala dcc77153bf feat: Do not allow desktop to quit without closing sessions 2021-05-12 14:27:01 -04:00
Susmitha Girumala 4b587d35fa docs: Add feature note to changelog 2021-05-12 12:48:03 -04:00
Susmitha Girumala ce7cdba0bc feat: Prompt for quitting session on desktop quit 2021-05-12 12:45:05 -04:00
Susmitha Girumala 4e13ea56c3 Add bug fix to changelog 2021-05-12 12:35:17 -04:00
Susmitha Girumala 3ef7436f3f chore: Cleanup SessionManager interface 2021-05-12 11:40:50 -04:00
Susmitha Girumala ee748de5c9 chore: Run cancellation tests in electron 2021-05-12 11:10:11 -04:00
Susmitha Girumala 74501a440f refactor: Create structure in desktop/electron-app 2021-05-12 10:27:38 -04:00
Susmitha Girumala 828faf2be4 refactor: Create helpers folder in desktop/electron 2021-05-12 09:53:10 -04:00
Susmitha Girumala dfb9d6e686 Merge remote-tracking branch 'origin/main' into ICU-1335-close-session-on-cancel 2021-05-11 18:09:50 -04:00
Susmitha Girumala 2be18bcf6f chore: Cleanup 2021-05-11 18:09:38 -04:00
Susmitha Girumala 3bef3e4bc5 Merge pull request #553 from hashicorp/chore-desktop-hbs-prettier
upgrade prettier and apply HBS formatting to desktop
2021-05-11 18:01:49 -04:00
Susmitha Girumala 81447e65c8 Merge pull request #552 from hashicorp/chore-admin-hbs-prettier-lint
chore: 🤖 add prettier hbs linting plugin
2021-05-11 18:01:19 -04:00
Susmitha Girumala 2e71beee81 Merge pull request #551 from hashicorp/chore-admin-hbs-prettier
chore: 🤖 upgrade prettier and apply HBS formatting to admin
2021-05-11 17:58:42 -04:00
Susmitha Girumala dfbb54a1ee refactor: Add SessionManager and Session classes to electron 2021-05-11 16:42:30 -04:00
Randall Morey 0d67b512a2 chore: 🤖 add prettier 2.3 and apply hbs formatting and linting 2021-05-11 15:39:59 -04:00
Randall Morey e551ec4008 chore: 🤖 add prettier hbs linting plugin 2021-05-11 15:29:46 -04:00
Randall Morey 49a85f1a7f chore: 🤖 upgrade prettier and apply HBS formatting to admin 2021-05-11 14:13:24 -04:00
Susmitha Girumala 15d3520408 Merge pull request #550 from hashicorp/fix-trim-package-vulnerability
fix: 🐛 Update trim package version resolution
2021-05-11 12:38:11 -04:00
Carlos Alcaide 5d7c0180d5 fix: 🐛 Update trim package version resolution
Update the version we resolve of dependency package trim since older
version has a security vulnerability.
2021-05-11 08:33:44 -07:00
Susmitha Girumala 053e16dca8 Merge branch 'main' into ICU-1335-close-session-on-cancel 2021-05-11 11:13:37 -04:00
Susmitha Girumala 3e2ed2dc27 Merge pull request #548 from hashicorp/fix-flaky-origin-test
fix: 🐛 migrate IPC to service-based window for reliable testing
2021-05-10 11:07:32 -04:00
Susmitha Girumala faaf7352c1 Merge branch 'main' into fix-flaky-origin-test 2021-05-10 10:32:57 -04:00
Susmitha Girumala 58252ee6f5 Merge pull request #547 from hashicorp/refactor-oidc-inline
Enable inline OIDC flow for admin
2021-05-10 10:32:43 -04:00
Randall Morey 85ddd7fc4b chore: remove empty comments 2021-05-08 12:10:41 -04:00
Randall Morey 863e81bc01 fix: 🐛 migrate IPC to service-based window for reliable testing
This resolves a longstanding issue where IPC tests rely on the real
window.postMessage and MessageChannel APIs.  These are evented and
asynchronous, resulting in nondeterministic tests.  This commit updates
tests with synchronous mocked APIs.
2021-05-08 12:08:56 -04:00
Randall Morey 4b212e1ae0 Merge branch 'refactor-oidc-inline' of https://github.com/hashicorp/boundary-ui into refactor-oidc-inline 2021-05-08 07:50:28 -04:00
Randall Morey 343f73bc21 style: set max width for SVG in dialog 2021-05-08 07:50:16 -04:00
Randall Morey cf5f41acbd fix: 🐛 handle null window in case of popup blocker 2021-05-08 07:49:53 -04:00
Susmitha Girumala 2f12cc91f2 feat: Cancelling session should close associated spawned proc 2021-05-07 15:31:32 -04:00
Susmitha Girumala 99125dbb77 feat: Cleanup spawned session after process termination 2021-05-07 15:31:31 -04:00
Randall Morey 3bfae4b33d Merge branch 'main' into refactor-oidc-inline 2021-05-07 15:24:12 -04:00
Randall Morey da6b34b337 feat: 🎸 enable inline OIDC authentication 2021-05-07 14:32:37 -04:00
Randall Morey 9a909c0ec1 chore: 🤖 retry oidc should also restart with boundary
rather than just re-opening the external window
2021-05-07 13:21:18 -04:00
Randall Morey 42c01100ad Merge branch 'main' into refactor-oidc-inline 2021-05-07 13:04:58 -04:00
Carlos Alcaide Corvo fe56acd57f Merge pull request #545 from hashicorp/feat-fieldset-component
feat: 🎸 Add Form fieldset component
2021-05-07 08:34:09 -07:00
Carlos Alcaide e4fb2e7c4d feat: 🎸 Fix ARIA issues and add tests
Fix an ARIA issue where fieldset aria-describedby was pointing the
legend when it should point to description. Also no aria-describedby
will show if description (optional) is not provided.
2021-05-06 15:33:59 -07:00
Carlos Alcaide b1361bcb83 feat: 🎸 Applying PR suggested changes
Apply the changes suggested on the PR. Also modified tests to could test
the rendering of the componet without description field.
2021-05-06 14:55:13 -07:00
Carlos Alcaide 30090d82e3 feat: 🎸 Add Form fieldset component
Add a simple form fieldset component, basic storybook page and tests.

✅ Closes: ICU-1428
2021-05-06 14:55:13 -07:00
Susmitha Girumala fbe8aefcb4 Merge pull request #546 from hashicorp/chore-bump-deps
chore: 🤖 bump deps due to security audit
2021-05-06 16:45:16 -04:00
Randall Morey fa02fd3f89 chore: 🤖 bump deps due to security audit 2021-05-06 15:30:02 -04:00
Randall Morey f021719d8b refactor: open and close oidc windows via window manager 2021-05-06 15:19:12 -04:00
Randall Morey be9ee8f672 Merge pull request #544 from hashicorp/chore-dependabot
chore: 🤖 bump dep version for dependabot
2021-05-05 17:45:23 -04:00
Randall Morey 48ca4c5ac0 chore: 🤖 bump dep version for dependabot 2021-05-05 15:06:32 -04:00
Randall Morey ac7db55be2 Merge pull request #542 from hashicorp/refactor-browser-services
chore: 🤖 replace admin window usage with ember browser services
2021-05-05 14:51:40 -04:00
Randall Morey dea79d785b feat: 🎸 add WindowManager service for simple open/close 2021-05-05 14:34:26 -04:00
Randall Morey f597901140 Merge branch 'main' into refactor-browser-services 2021-05-05 13:51:01 -04:00
Randall Morey 0c1b5bf879 Merge pull request #543 from hashicorp/fix-vulnerability-merge-package
fix: 🐛 Fix merge package vulnerability
2021-05-05 13:50:36 -04:00
Carlos Alcaide bab68f4507 fix: 🐛 Fix merge package vulnerability
Merge package has a security vulnerability that is fixed in a newer
version. We do not resolve merge directly, but as a dependecy of a
dependecy, so we especify a version range via selective dependecy
resolution.
2021-05-05 10:23:11 -07:00
Carlos Alcaide Corvo c6e4a24dab Merge pull request #541 from hashicorp/docs-connect-ui-to-boundary-local
docs: ✏️ Connect Boundary UI to Boundary local instance
2021-05-04 07:44:48 -07:00
Carlos Alcaide 0bcb91ede0 docs: ✏️ Update docs for PR
Update documentation with suggestions from PR
2021-05-03 14:13:52 -07:00
Carlos Alcaide fbeb764c76 Merge branch 'docs-connect-ui-to-boundary-local' of github.com:hashicorp/boundary-ui into docs-connect-ui-to-boundary-local 2021-05-03 14:04:18 -07:00
Carlos Alcaide 67959d7a58 docs: ✏️ Update docs from PR
Update documentation with comments from team members on my initial PR.
2021-05-03 14:03:43 -07:00
Susmitha Girumala c4bb5173d2 Merge branch 'main' into docs-connect-ui-to-boundary-local 2021-05-03 15:44:24 -04:00
Carlos Alcaide ea011592a7 docs: ✏️ Connect Boundary UI to Boundary local instance
Add documentation on how to connect Boundary UI, admin and desktop
version, to a Boundary local instance.
2021-05-03 12:42:55 -07:00
Susmitha Girumala e761e0e4af Merge pull request #540 from hashicorp/docs-m1
docs:  add troubleshooting note for M1 users
2021-05-03 15:39:57 -04:00
Randall Morey fa36f9008b docs: add troubleshooting note for M1 users 2021-04-30 17:16:21 -04:00
Randall Morey 15d360abc5 Merge pull request #539 from hashicorp/chore-update-node-engines
chore: 🤖 Update node version engines
2021-04-30 17:10:30 -04:00
Randall Morey 9914954d08 docs: ✏️ add engines to top-level package.json 2021-04-30 16:58:54 -04:00
Carlos Alcaide ec184ff4f1 chore: 🤖 Update UI's to could use node v15
Update UI's engines in package.json to could use node v15. The change is
motivated for apple M1 chip. If you have an apple M1 chip you need to
use node v15 to avoid errors while building the UI.
2021-04-29 14:39:48 -07:00
Randall Morey bb2d0420d9 chore: 🤖 replace admin window usage with ember browser services 2021-04-28 17:55:30 -04:00
Carlos Alcaide e3cabe3102 chore: 🤖 Update node version engines for addons
Update the versions of node addons can use to be aligned with the node
versions defined in our UI's.
2021-04-28 14:26:46 -07:00
Carlos Alcaide 7065f462cd chore: 🤖 Update node version engines
Update the node versions our UI's can use. These versions are specified
on the engines key in the package.json of each UI (admin and desktop).
Our UI's can run from node v10 to v14, we can not run on v15 because
ember-cli does not support it yet.
2021-04-28 11:35:52 -07:00
225 changed files with 2596 additions and 1603 deletions

No files matched your search

+31
View File
@@ -24,6 +24,9 @@ subproject, e.g. running or testing.
- [Building Admin UI for Production](#building-admin-ui-for-production)
- [Building with a Container](#building-with-a-container)
- [Building Desktop UI for Production](#building-desktop-ui-for-production)
- [Connect Boundary UI to Boundary local instance](#connect-boundary-ui-to-boundary-local-instance)
- [For admin](#for-admin)
- [For desktop](#for-desktop)
- [Committing](#committing)
- [License Checking](#license-checking)
@@ -35,6 +38,9 @@ You will need the following things properly installed on your computer.
* [Git][git]
* [Node.js][node]
* v10–v15
* **Apple Silicon Users**: if you experience problems building or running
Boundary UIs, try Node v15.
* [Yarn][yarn] installed globally
* [Google Chrome][chrome]
* [Firefox][firefox]
@@ -122,6 +128,31 @@ environment variable to set signing certificate name (e.g Developer ID Applicati
Assets are saved to `ui/desktop/electron-app/out/make/`.
DMG packaged desktop UI is available at asset location as `boundary.dmg`.
### Connect Boundary UI to Boundary local instance
This describes how to connect local Boundary UI to your local instance of Boundary.
This assumes you already have up and running a Boundary dev instance in your local environment with a listener `127.0.0.1:9200` (default behaviour). [Learn how to start a local Boundary dev instance](https://learn.hashicorp.com/tutorials/boundary/getting-started-dev?in=boundary/getting-started#start-a-dev-environment).
#### For admin
This assumes you are within `boundary-ui/ui/admin`.
You will need to turn `off` mirage, tell the UI where to find Boundary and run it: `$ ENABLE_MIRAGE=false API_HOST=http://localhost:9200 yarn start`.
Following terminal instructions, open in your browser: `http://localhost:4200/`.
Once you open the UI you will see the login screen, authenticate using generated admin login name and password.
#### For desktop
This assumes you are within `boundary-ui/ui/desktop`.
You will need to turn `off` mirage and run it: `$ ENABLE_MIRAGE=false yarn start:desktop`.
In login screen, authenticate using generated admin login name and password.
Enter the origin of your Boundary dev instance, by default is: `http://localhost:9200`.
### Committing
Instead of the default `git commit`, we prescribe a custom command that ensures
+1 -1
View File
@@ -71,7 +71,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
+1 -1
View File
@@ -65,7 +65,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
+3 -2
View File
@@ -30,14 +30,15 @@
"dependencies": {
"api": "*",
"auth": "*",
"ember-browser-services": "^1.1.6",
"ember-cli-babel": "^7.23.0",
"ember-cli-htmlbars": "^5.3.1",
"ember-feature-flags": "^6.0.0",
"ember-get-config": "^0.3.0",
"ember-intl": "^5.5.0",
"ember-loading": "^0.4.0",
"ember-page-title": "^6.0.3",
"ember-route-action-helper": "^2.0.8",
"ember-feature-flags": "^6.0.0",
"rose": "*"
},
"devDependencies": {
@@ -80,7 +81,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
@@ -0,0 +1,21 @@
<fieldset ...attributes class='rose-form-fieldset' aria-describedby={{if (has-block "description") (concat 'description-' this.id)}}>
<legend
id={{concat 'title-' this.id}}
class='rose-form-fieldset-title'
>
{{yield to='title'}}
</legend>
{{#if (has-block "description")}}
<div
id={{concat 'description-' this.id}}
class='rose-form-fieldset-description'
>
{{yield to='description'}}
</div>
{{/if}}
<div class='rose-form-fieldset-body'>
{{yield to='body'}}
</div>
</fieldset>
@@ -0,0 +1,11 @@
import Component from '@glimmer/component';
import { generateComponentID } from '../../../../utilities/component-auto-id';
export default class RoseFormFieldsetComponent extends Component {
// =attributes
/**
* @type {string}
*/
id = generateComponentID();
}
@@ -0,0 +1,29 @@
import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
import { hbs } from 'ember-cli-htmlbars';
import { action } from '@storybook/addon-actions';
import { text, boolean, select } from '@storybook/addon-knobs';
<Meta title="Rose|Form/Fieldset" component="Form/Fieldset" />
# Form Fieldset
Renders a simple fieldset with title, description and body.
```html
<Rose::Form::Fieldset>
<:title>Title</:title>
<:description>Description</:description>
<:body>Rest of the form</:body>
</Rose::Form::Fieldset>
```
<Preview>
<Story name="Basic Fieldset">{{
template: hbs`
<Rose::Form::Fieldset>
<:title>Title</:title>
<:description>Description</:description>
<:body>Rest of the form</:body>
</Rose::Form::Fieldset>`
}}</Story>
</Preview>
@@ -0,0 +1,14 @@
@use '../../variables/sizing';
@use '../../utilities/type';
.rose-form-fieldset {
.rose-form-fieldset-title {
@include type.type(l, bold);
}
.rose-form-fieldset-description {
margin: sizing.rems(xxs) 0;
@include type.type(xs);
color: var(--ui-gray);
}
}
@@ -5,3 +5,4 @@
@import 'checkbox';
@import 'select';
@import 'radio';
@import 'fieldset';
@@ -0,0 +1 @@
export { default } from 'rose/components/rose/form/fieldset';
+2 -3
View File
@@ -36,8 +36,7 @@
"ember-named-blocks-polyfill": "^0.2.4",
"ember-radio-button": "^2.0.1",
"ember-uuid": "^2.1.0",
"emberx-select": "github:adopted-ember-addons/emberx-select#bc5f774",
"ember-named-blocks-polyfill": "^0.2.4"
"emberx-select": "github:adopted-ember-addons/emberx-select#bc5f774"
},
"devDependencies": {
"@ember/optional-features": "^2.0.0",
@@ -88,7 +87,7 @@
"sass-lint": "^1.13.1"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
@@ -0,0 +1,89 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, find } from '@ember/test-helpers';
import { hbs } from 'ember-cli-htmlbars';
module('Integration | Component | rose/form/fieldset', function (hooks) {
setupRenderingTest(hooks);
// Global values for mocking
this.mockTitle = 'Title';
this.mockDescription = 'Description';
this.mockBody = 'Rest of the form';
// Wrap the rendering in a function to avoid repeat code
async function renderComponent(noDescription) {
if (noDescription === true) {
return render(hbs`
<Rose::Form::Fieldset>
<:title>{{this.mockTitle}}</:title>
<:body>{{this.mockBody}}</:body>
</Rose::Form::Fieldset>
`);
}
return render(hbs`
<Rose::Form::Fieldset>
<:title>{{this.mockTitle}}</:title>
<:description>{{this.mockDescription}}</:description>
<:body>{{this.mockBody}}</:body>
</Rose::Form::Fieldset>
`);
}
test('it renders the full component', async function (assert) {
assert.expect(4);
await renderComponent(false);
assert.ok(find('.rose-form-fieldset'));
assert.equal(
find('.rose-form-fieldset-title').textContent.trim(),
this.mockTitle
);
assert.equal(
find('.rose-form-fieldset-description').textContent.trim(),
this.mockDescription
);
assert.equal(
find('.rose-form-fieldset-body').textContent.trim(),
this.mockBody
);
});
test('it renders with no description', async function (assert) {
assert.expect(4);
await renderComponent(true);
assert.ok(find('.rose-form-fieldset'));
assert.equal(
find('.rose-form-fieldset-title').textContent.trim(),
this.mockTitle
);
assert.notOk(find('.rose-form-fieldset-description'));
assert.equal(
find('.rose-form-fieldset-body').textContent.trim(),
this.mockBody
);
});
test('it supports aria description for fieldset with description provided', async function (assert) {
assert.expect(1);
await renderComponent(false);
const descriptionElement = find('.rose-form-fieldset-description');
const fieldsetElement = find('.rose-form-fieldset');
assert.equal(
fieldsetElement.getAttribute('aria-describedby'),
descriptionElement.id,
'Fieldset is described by description'
);
});
test('it does not support aria description for fieldset with no description provided', async function (assert) {
assert.expect(3);
await renderComponent(true);
const fieldsetElement = find('.rose-form-fieldset');
assert.ok(find('.rose-form-fieldset'));
assert.notOk(find('.rose-form-fieldset-description'));
assert.notOk(fieldsetElement.getAttribute('aria-describedby'));
});
});
+9 -1
View File
@@ -59,11 +59,19 @@
"hoek": "~4.2.0",
"elliptic": "~6.5.4",
"react-dev-utils": "~11.0.4",
"yargs-parser": "~20.2.7"
"yargs-parser": "~20.2.7",
"merge": "^2.1.1",
"xmlhttprequest-ssl": "^1.6.2",
"underscore": "^1.12.1",
"hosted-git-info": "3.0.8",
"trim": "~1.0.1"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"engines": {
"node": ">=10 <=15"
}
}
+2 -1
View File
@@ -1,7 +1,8 @@
'use strict';
module.exports = {
extends: 'octane',
plugins: ['ember-template-lint-plugin-prettier'],
extends: ['octane', 'ember-template-lint-plugin-prettier:recommended'],
rules: {
'no-bare-strings': true,
'no-curly-component-invocation': {
+7 -7
View File
@@ -3,10 +3,10 @@
{{#if this.scope.org}}
{{#unless this.scope.org.isGlobal}}
{{#if this.session.data.authenticated.isGlobal}}
<crumbs.link @route="scopes.scope.scopes" @model="global">
{{t "resources.org.title_plural"}}
<crumbs.link @route='scopes.scope.scopes' @model='global'>
{{t 'resources.org.title_plural'}}
</crumbs.link>
<crumbs.link @route="scopes.scope.edit" @model={{this.scope.org.id}}>
<crumbs.link @route='scopes.scope.edit' @model={{this.scope.org.id}}>
{{this.scope.org.displayName}}
</crumbs.link>
{{/if}}
@@ -14,10 +14,10 @@
{{/if}}
{{#if this.scope.project}}
<crumbs.link @route="scopes.scope.scopes" @model={{this.scope.org.id}}>
{{t "resources.project.title_plural"}}
<crumbs.link @route='scopes.scope.scopes' @model={{this.scope.org.id}}>
{{t 'resources.project.title_plural'}}
</crumbs.link>
<crumbs.link @route="scopes.scope.edit" @model={{this.scope.project.id}}>
<crumbs.link @route='scopes.scope.edit' @model={{this.scope.project.id}}>
{{this.scope.project.displayName}}
</crumbs.link>
{{/if}}
@@ -34,4 +34,4 @@
{{/if}}
{{/each}}
</Rose::Nav::Breadcrumbs>
</Rose::Nav::Breadcrumbs>
+6 -6
View File
@@ -1,16 +1,16 @@
<span
id={{this.id}}
class="copyable"
class='copyable'
{{did-insert this.register}}
{{will-destroy this.tearDown}}
>
{{#if this.copied}}
<mark class="copyable-content">
<mark class='copyable-content'>
{{yield}}
</mark>
{{else}}
<span class="copyable-content">
<span class='copyable-content'>
{{yield}}
</span>
{{/if}}
@@ -19,12 +19,12 @@
<Rose::Button
id={{this.copyableButtonId}}
aria-describedby={{this.id}}
class="copyable-button"
@style="ghost"
class='copyable-button'
@style='ghost'
@iconOnly={{if this.copied this.successIcon this.actionIcon}}
title={{if this.copied this.successText this.actionText}}
>
{{this.actionText}}
</Rose::Button>
{{/if}}
</span>
</span>
@@ -1,5 +1,5 @@
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit this.currentPassword this.newPassword}}
@cancel={{fn this.cancel @cancel}}
@disabled={{@model.isSaving}}
@@ -8,14 +8,15 @@
>
<form.input
@name="currentPassword"
@type="password"
@name='currentPassword'
@type='password'
@value={{this.currentPassword}}
@label={{t "form.current_password.label"}}
@label={{t 'form.current_password.label'}}
@error={{@model.errors.name}}
readonly={{false}}
autocomplete="current-password"
as |field|>
autocomplete='current-password'
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,14 +27,15 @@
</form.input>
<form.input
@name="newPassword"
@type="password"
@name='newPassword'
@type='password'
@value={{this.newPassword}}
@label={{t "form.new_password.label"}}
@label={{t 'form.new_password.label'}}
@error={{@model.errors.name}}
readonly={{false}}
autocomplete="new-password"
as |field|>
autocomplete='new-password'
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -45,7 +47,8 @@
<form.actions
@submitDisabled={{this.cannotSave}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -7,20 +7,22 @@
as |form|
>
<form.input
@value={{@model.type}}
@label={{t "form.type.label"}}
readonly={{true}}
@disabled={{true}} />
@value={{@model.type}}
@label={{t 'form.type.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -31,15 +33,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -50,13 +53,14 @@
</form.textarea>
<form.input
@name="login_name"
@type="text"
@name='login_name'
@type='text'
@value={{@model.attributes.login_name}}
@label={{t "form.login_name.label"}}
@label={{t 'form.login_name.label'}}
@error={{@model.errors.login_name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.login_name}}
<field.errors as |errors|>
{{#each @model.errors.login_name as |error|}}
@@ -68,14 +72,15 @@
{{#if @model.isNew}}
<form.input
@name="password"
@type="password"
@name='password'
@type='password'
@value={{this.password}}
@label={{t "form.password.label"}}
@label={{t 'form.password.label'}}
@error={{@model.errors.password}}
readonly={{false}}
autocomplete="new-password"
as |field|>
autocomplete='new-password'
as |field|
>
{{#if @model.errors.password}}
<field.errors as |errors|>
{{#each @model.errors.password as |error|}}
@@ -88,8 +93,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -6,15 +6,16 @@
>
<form.input
@name="password"
@type="password"
@name='password'
@type='password'
@value={{this.password}}
@label={{t "form.set_password.label"}}
@label={{t 'form.set_password.label'}}
@error={{@model.errors.password}}
@helperText={{t "form.set_password.help"}}
@helperText={{t 'form.set_password.help'}}
readonly={{false}}
autocomplete="new-password"
as |field|>
autocomplete='new-password'
as |field|
>
{{#if @model.errors.password}}
<field.errors as |errors|>
{{#each @model.errors.password as |error|}}
@@ -27,7 +28,8 @@
<form.actions
@submitDisabled={{this.cannotSave}}
@showCancel={{false}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -1,7 +1,8 @@
{{#if @model.type}}
{{component (concat "form/auth-method/" @model.type)
{{component
(concat 'form/auth-method/' @model.type)
model=@model
submit=@submit
cancel=@cancel
}}
{{/if}}
{{/if}}
@@ -7,20 +7,22 @@
as |form|
>
<form.input
@value={{@model.type}}
@label={{t "form.type.label"}}
readonly={{true}}
@disabled={{true}} />
@value={{@model.type}}
@label={{t 'form.type.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -31,15 +33,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -51,7 +54,8 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
</Rose::Form>
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
@@ -1,6 +1,6 @@
{{#if this.availableUsers}}
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit}}
@cancel={{@cancel}}
@disabled={{@model.isSaving}}
@@ -9,8 +9,9 @@
>
<form.actions
@submitText={{t "resources.group.actions.add-members"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'resources.group.actions.add-members'}}
@cancelText={{t 'actions.cancel'}}
/>
<Rose::Table as |table|>
<table.header as |header|>
@@ -26,7 +27,8 @@
<form.checkbox
@label={{user.id}}
@description={{user.description}}
onChange={{fn this.toggleMember user}} />
onChange={{fn this.toggleMember user}}
/>
</row.cell>
<row.cell>{{user.name}}</row.cell>
</body.row>
@@ -39,14 +41,17 @@
{{#unless this.availableUsers}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.group.messages.no-members.title"}} as |message|>
<Rose::Message
@title={{t 'resources.group.messages.no-members.title'}}
as |message|
>
<message.description>
{{t "resources.group.messages.no-members.description"}}
{{t 'resources.group.messages.no-members.description'}}
</message.description>
<message.link @route="scopes.scope.groups.group.members">
<Rose::Icon @name="chevron-left" />
{{t "actions.back"}}
<message.link @route='scopes.scope.groups.group.members'>
<Rose::Icon @name='chevron-left' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
</Rose::Layout::Centered>
{{/unless}}
+17 -14
View File
@@ -8,14 +8,15 @@
>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,15 +27,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -46,8 +48,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -8,14 +8,15 @@
>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,15 +27,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -46,8 +48,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -1,6 +1,6 @@
{{#if this.hasAvailableHosts}}
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit}}
@cancel={{@cancel}}
@disabled={{@model.isSaving}}
@@ -9,15 +9,16 @@
>
<form.actions
@submitText={{t "actions.add-hosts"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.add-hosts'}}
@cancelText={{t 'actions.cancel'}}
/>
<Rose::Table as |table|>
<table.header as |header|>
<header.row as |row|>
<row.headerCell>{{t "form.name.label"}}</row.headerCell>
<row.headerCell>{{t "form.type.label"}}</row.headerCell>
<row.headerCell>{{t "form.id.label"}}</row.headerCell>
<row.headerCell>{{t 'form.name.label'}}</row.headerCell>
<row.headerCell>{{t 'form.type.label'}}</row.headerCell>
<row.headerCell>{{t 'form.id.label'}}</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
@@ -27,7 +28,8 @@
<form.checkbox
@label={{host.id}}
@description={{host.description}}
onChange={{fn this.toggleHost host}} />
onChange={{fn this.toggleHost host}}
/>
</row.cell>
<row.cell>{{host.name}}</row.cell>
<row.cell>
@@ -43,14 +45,19 @@
{{#unless this.hasAvailableHosts}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.host-set.host.messages.add-none.title"}} as |message|>
<Rose::Message
@title={{t 'resources.host-set.host.messages.add-none.title'}}
as |message|
>
<message.description>
{{t "resources.host-set.host.messages.add-none.description"}}
{{t 'resources.host-set.host.messages.add-none.description'}}
</message.description>
<message.link @route="scopes.scope.host-catalogs.host-catalog.host-sets.host-set.hosts">
<Rose::Icon @name="chevron-left" />
{{t "actions.back"}}
<message.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.hosts'
>
<Rose::Icon @name='chevron-left' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
{{/unless}}
+22 -18
View File
@@ -8,20 +8,22 @@
>
<form.input
@value={{@model.type}}
@label={{t "form.type.label"}}
readonly={{true}}
@disabled={{true}} />
@value={{@model.type}}
@label={{t 'form.type.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -32,15 +34,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -52,8 +55,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
+28 -23
View File
@@ -8,20 +8,22 @@
>
<form.input
@value={{@model.type}}
@label={{t "form.type.label"}}
readonly={{true}}
@disabled={{true}} />
@value={{@model.type}}
@label={{t 'form.type.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@label={{t 'form.name.label'}}
@error={{@model.errors.name}}
@helperText={{t "form.name.help"}}
@helperText={{t 'form.name.help'}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -32,15 +34,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@label={{t 'form.description.label'}}
@error={{@model.errors.description}}
@helperText={{t "form.description.help"}}
@helperText={{t 'form.description.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -51,14 +54,15 @@
</form.textarea>
<form.input
@name="address"
@type="text"
@name='address'
@type='text'
@value={{@model.attributes.address}}
@label={{t "form.address.label"}}
@label={{t 'form.address.label'}}
@error={{@model.errors.name}}
@helperText={{t "form.address.help"}}
@helperText={{t 'form.address.help'}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -70,8 +74,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -1,6 +1,6 @@
{{#if this.hasAvailablePrincipals}}
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit}}
@cancel={{@cancel}}
@disabled={{@model.isSaving}}
@@ -9,8 +9,9 @@
>
<form.actions
@submitText={{t "actions.add-principals"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.add-principals'}}
@cancelText={{t 'actions.cancel'}}
/>
<Rose::Table as |table|>
<table.header as |header|>
@@ -27,11 +28,17 @@
<form.checkbox
@label={{principal.id}}
@description={{principal.description}}
onChange={{fn this.togglePrincipal principal}} />
onChange={{fn this.togglePrincipal principal}}
/>
</row.cell>
<row.cell>{{principal.name}}</row.cell>
<row.cell>
<Rose::Badge>{{t (concat 'resources.role.principal.types.' principal.constructor.modelName)}}</Rose::Badge>
<Rose::Badge>{{t
(concat
'resources.role.principal.types.'
principal.constructor.modelName
)
}}</Rose::Badge>
</row.cell>
</body.row>
{{/each}}
@@ -43,14 +50,17 @@
{{#unless this.hasAvailablePrincipals}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.role.principal.messages.none.title"}} as |message|>
<Rose::Message
@title={{t 'resources.role.principal.messages.none.title'}}
as |message|
>
<message.description>
{{t "resources.role.principal.messages.none.description"}}
{{t 'resources.role.principal.messages.none.description'}}
</message.description>
<message.link @route="scopes.scope.roles.role.principals">
<Rose::Icon @name="chevron-left" />
{{t "actions.back"}}
<message.link @route='scopes.scope.roles.role.principals'>
<Rose::Icon @name='chevron-left' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
{{/unless}}
@@ -5,28 +5,29 @@
as |form|
>
<Rose::List::KeyValue as |list|>
{{!-- Add grant field (only one per form) --}}
{{! Add grant field (only one per form) }}
<list.item as |item|>
<form.input
@contextual={{true}}
@name="grant"
@type="text"
@name='grant'
@type='text'
@value={{this.newGrantString}}
as |input|>
as |input|
>
<item.key>
<input.label>{{t "resources.role.grant.actions.create"}}</input.label>
<input.label>{{t 'resources.role.grant.actions.create'}}</input.label>
</item.key>
<item.cell>
<input.field title={{t "form.grant.help"}} />
<input.field title={{t 'form.grant.help'}} />
</item.cell>
<item.cell>
<Rose::Button
@submit={{true}}
@disabled={{this.cannotSave}}
@style="secondary"
title={{t "actions.add"}}
@style='secondary'
title={{t 'actions.add'}}
>
{{t "actions.add"}}
{{t 'actions.add'}}
</Rose::Button>
</item.cell>
</form.input>
@@ -57,26 +58,27 @@
<list.item as |item|>
<form.input
@contextual={{true}}
@name="grant"
@type="text"
@name='grant'
@type='text'
@value={{grant.value}}
@error={{@model.errors.grant_strings}}
as |input|>
as |input|
>
<item.key>
<input.label>{{t "form.grant.label"}}</input.label>
<input.label>{{t 'form.grant.label'}}</input.label>
</item.key>
<item.cell>
<input.field title={{t "form.grant.help"}} />
<input.field title={{t 'form.grant.help'}} />
</item.cell>
</form.input>
<item.cell>
<Rose::Button
@style="secondary"
@iconOnly="trash"
title={{t "actions.remove"}}
{{on "click" (fn @removeGrant grant.value)}}
@style='secondary'
@iconOnly='trash'
title={{t 'actions.remove'}}
{{on 'click' (fn @removeGrant grant.value)}}
>
{{t "actions.remove"}}
{{t 'actions.remove'}}
</Rose::Button>
</item.cell>
</list.item>
@@ -85,7 +87,8 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
+49 -30
View File
@@ -8,14 +8,15 @@
>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,15 +27,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -46,46 +48,62 @@
{{#unless @model.isNew}}
<fieldset
aria-labelledby="legend-text-grant-scope"
aria-describedby="helper-text-grant-scope"
aria-labelledby='legend-text-grant-scope'
aria-describedby='helper-text-grant-scope'
>
<legend id="legend-text-grant-scope">{{t "form.grant_scope.label"}}</legend>
<Rose::Form::HelperText @id="helper-text-grant-scope" @error={{@model.errors.grant_scope_id}}>
{{t "form.grant_scope.help"}}
<legend id='legend-text-grant-scope'>{{t
'form.grant_scope.label'
}}</legend>
<Rose::Form::HelperText
@id='helper-text-grant-scope'
@error={{@model.errors.grant_scope_id}}
>
{{t 'form.grant_scope.help'}}
</Rose::Form::HelperText>
<form.radioGroup @name="grant_scope_id" @selectedValue={{@model.grant_scope_id}} as |radioGroup|>
<form.radioGroup
@name='grant_scope_id'
@selectedValue={{@model.grant_scope_id}}
as |radioGroup|
>
<Rose::Dropdown
@text={{this.selectedGrantScope.displayName}}
@icon={{if this.selectedGrantScope.isProject "app-icons/project" (if this.selectedGrantScope.isOrg "app-icons/org" "app-icons/global")}}
as |dropdown|>
@icon={{if
this.selectedGrantScope.isProject
'app-icons/project'
(if
this.selectedGrantScope.isOrg 'app-icons/org' 'app-icons/global'
)
}}
as |dropdown|
>
<ul>
{{#each @grantScopes as |grantScope|}}
<li class={{if grantScope.model.isProject "is-project"}}>
<li class={{if grantScope.model.isProject 'is-project'}}>
<dropdown.item>
<radioGroup.radio
@label={{grantScope.model.displayName}}
@value={{grantScope.model.id}}
@icon={{concat "app-icons/" grantScope.model.type}}
@icon={{concat 'app-icons/' grantScope.model.type}}
/>
</dropdown.item>
<ul class="indent-label-1">
<ul class='indent-label-1'>
{{#each grantScope.subScopes as |subScope|}}
<li class={{if subScope.model.isProject "is-project"}}>
<li class={{if subScope.model.isProject 'is-project'}}>
<dropdown.item>
<radioGroup.radio
@label={{subScope.model.displayName}}
@value={{subScope.model.id}}
@icon={{concat "app-icons/" subScope.model.type}}
@icon={{concat 'app-icons/' subScope.model.type}}
/>
</dropdown.item>
<ul class="indent-label-2">
<ul class='indent-label-2'>
{{#each subScope.subScopes as |subSubScope|}}
<li class={{if subSubScope.isProject "is-project"}}>
<li class={{if subSubScope.isProject 'is-project'}}>
<dropdown.item>
<radioGroup.radio
@label={{subSubScope.displayName}}
@value={{subSubScope.id}}
@icon={{concat "app-icons/" subSubScope.type}}
@icon={{concat 'app-icons/' subSubScope.type}}
/>
</dropdown.item>
</li>
@@ -104,8 +122,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
+17 -14
View File
@@ -8,14 +8,15 @@
>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,15 +27,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -46,8 +48,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -1,6 +1,6 @@
{{#if this.hasAvailableHostSets}}
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit}}
@cancel={{@cancel}}
@disabled={{@model.isSaving}}
@@ -9,8 +9,9 @@
>
<form.actions
@submitText={{t "actions.add-host-sets"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'actions.add-host-sets'}}
@cancelText={{t 'actions.cancel'}}
/>
<Rose::Table as |table|>
<table.header as |header|>
@@ -28,11 +29,14 @@
<form.checkbox
@label={{hostSet.id}}
@description={{hostSet.description}}
onChange={{fn this.toggleHostSet hostSet}} />
onChange={{fn this.toggleHostSet hostSet}}
/>
</row.cell>
<row.cell>{{hostSet.name}}</row.cell>
<row.cell>
<Rose::Badge>{{t (concat 'resources.host-set.types.' hostSet.type)}}</Rose::Badge>
<Rose::Badge>{{t
(concat 'resources.host-set.types.' hostSet.type)
}}</Rose::Badge>
</row.cell>
<row.cell>
<code>{{hostSet.host_catalog_id}}</code>
@@ -47,14 +51,17 @@
{{#unless this.hasAvailableHostSets}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.target.host-set.messages.none.title"}} as |message|>
<Rose::Message
@title={{t 'resources.target.host-set.messages.none.title'}}
as |message|
>
<message.description>
{{t "resources.target.host-set.messages.none.description"}}
{{t 'resources.target.host-set.messages.none.description'}}
</message.description>
<message.link @route="scopes.scope.targets.target.host-sets">
<Rose::Icon @name="chevron-left" />
{{t "actions.back"}}
<message.link @route='scopes.scope.targets.target.host-sets'>
<Rose::Icon @name='chevron-left' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
{{/unless}}
+48 -41
View File
@@ -8,19 +8,21 @@
>
<form.input
@value={{@model.type}}
@label={{t "form.type.label"}}
readonly={{true}}
@disabled={{true}} />
@value={{@model.type}}
@label={{t 'form.type.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@name="name"
@type="text"
@name='name'
@type='text'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -31,13 +33,14 @@
</form.input>
<form.textarea
@name="description"
@type="text"
@name='description'
@type='text'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -48,15 +51,16 @@
</form.textarea>
<form.input
@name="session_max_seconds"
@type="number"
@name='session_max_seconds'
@type='number'
@value={{@model.session_max_seconds}}
@label={{t "form.session_max_seconds.label"}}
@label={{t 'form.session_max_seconds.label'}}
@error={{@model.errors.session_max_seconds}}
@helperText={{t "form.session_max_seconds.help"}}
min="0"
step="1"
as |field|>
@helperText={{t 'form.session_max_seconds.help'}}
min='0'
step='1'
as |field|
>
{{#if @model.errors.session_max_seconds}}
<field.errors as |errors|>
{{#each @model.errors.session_max_seconds as |error|}}
@@ -67,15 +71,16 @@
</form.input>
<form.input
@name="session_connection_limit"
@type="number"
@name='session_connection_limit'
@type='number'
@value={{@model.session_connection_limit}}
@label={{t "form.session_connection_limit.label"}}
@label={{t 'form.session_connection_limit.label'}}
@error={{@model.errors.session_connection_limit}}
@helperText={{t "form.session_connection_limit.help"}}
min="-1"
step="1"
as |field|>
@helperText={{t 'form.session_connection_limit.help'}}
min='-1'
step='1'
as |field|
>
{{#if @model.errors.session_connection_limit}}
<field.errors as |errors|>
{{#each @model.errors.session_connection_limit as |error|}}
@@ -85,18 +90,19 @@
{{/if}}
</form.input>
{{!-- TODO this is a type-specific field --}}
{{! TODO this is a type-specific field }}
<form.input
@name="default_port"
@type="number"
@name='default_port'
@type='number'
@value={{@model.attributes.default_port}}
@label={{t "form.default_port.label"}}
@label={{t 'form.default_port.label'}}
@error={{@model.errors.default_port}}
@helperText={{t "form.default_port.help"}}
min="0"
step="1"
as |field|>
{{!-- TODO need to figure out how to reference `attributes.errors` here --}}
@helperText={{t 'form.default_port.help'}}
min='0'
step='1'
as |field|
>
{{! TODO need to figure out how to reference `attributes.errors` here }}
{{#if @model.errors.default_port}}
<field.errors as |errors|>
{{#each @model.errors.default_port as |error|}}
@@ -108,8 +114,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
@@ -1,6 +1,6 @@
{{#if this.hasAvailableAccounts}}
<Rose::Form
class="full-width"
class='full-width'
@onSubmit={{fn this.submit @submit}}
@cancel={{@cancel}}
@disabled={{@model.isSaving}}
@@ -9,8 +9,9 @@
>
<form.actions
@submitText={{t "resources.user.actions.add-accounts"}}
@cancelText={{t "actions.cancel"}} />
@submitText={{t 'resources.user.actions.add-accounts'}}
@cancelText={{t 'actions.cancel'}}
/>
<Rose::Table as |table|>
<table.header as |header|>
@@ -27,7 +28,8 @@
<form.checkbox
@label={{account.id}}
@description={{account.description}}
onChange={{fn this.toggleAccount account}} />
onChange={{fn this.toggleAccount account}}
/>
</row.cell>
<row.cell>{{account.username}}</row.cell>
<row.cell>
@@ -43,14 +45,17 @@
{{#unless this.hasAvailableAccounts}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.user.messages.no-accounts.title"}} as |message|>
<Rose::Message
@title={{t 'resources.user.messages.no-accounts.title'}}
as |message|
>
<message.description>
{{t "resources.user.messages.no-accounts.description"}}
{{t 'resources.user.messages.no-accounts.description'}}
</message.description>
<message.link @route="scopes.scope.users.user.accounts">
<Rose::Icon @name="chevron-left" />
{{t "actions.back"}}
<message.link @route='scopes.scope.users.user.accounts'>
<Rose::Icon @name='chevron-left' />
{{t 'actions.back'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
{{/unless}}
+17 -14
View File
@@ -8,14 +8,15 @@
>
<form.input
@name="name"
@type="name"
@name='name'
@type='name'
@value={{@model.name}}
@label={{t "form.name.label"}}
@helperText={{t "form.name.help"}}
@label={{t 'form.name.label'}}
@helperText={{t 'form.name.help'}}
@error={{@model.errors.name}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.name}}
<field.errors as |errors|>
{{#each @model.errors.name as |error|}}
@@ -26,15 +27,16 @@
</form.input>
<form.textarea
@name="description"
@type="description"
@name='description'
@type='description'
@value={{@model.description}}
@label={{t "form.description.label"}}
@helperText={{t "form.description.help"}}
@label={{t 'form.description.label'}}
@helperText={{t 'form.description.help'}}
@error={{@model.errors.description}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|>
as |field|
>
{{#if @model.errors.description}}
<field.errors as |errors|>
{{#each @model.errors.description as |error|}}
@@ -46,8 +48,9 @@
<form.actions
@disabled={{if @model.cannotSave @model.cannotSave}}
@enableEditText={{t "actions.edit-form"}}
@submitText={{t "actions.save"}}
@cancelText={{t "actions.cancel"}} />
@enableEditText={{t 'actions.edit-form'}}
@submitText={{t 'actions.save'}}
@cancelText={{t 'actions.cancel'}}
/>
</Rose::Form>
</Rose::Form>
+6 -1
View File
@@ -1,12 +1,17 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class AuthenticationErrorRoute extends Route {
// =services
@service('browser/window') window;
// =methods
/**
* @return {string}
*/
model() {
return window.location.toString();
return this.window.location.toString();
}
}
@@ -11,6 +11,7 @@ export default class ScopesScopeAuthenticateMethodRoute extends Route {
@service session;
@service notify;
@service intl;
@service windowManager;
// =methods
@@ -25,24 +26,16 @@ export default class ScopesScopeAuthenticateMethodRoute extends Route {
}
/**
*
* Kicks off the OIDC auth flow by opening a new window to the provider.
* @param {string} authenticatorName
* @param {object} options
*/
async startOIDCAuthentication(authenticatorName, options) {
const oidc = getOwner(this).lookup(authenticatorName);
// TODO: delegate this call from the session service so that we don't have
// to look up the authenticator directly
const json = await oidc.startAuthentication(options);
await this.openExternalOIDCFlow(json.attributes.auth_url);
}
/**
* Opens the specified URL in a new tab or window. By default this uses
* `window.open`, but may be overriden.
* @param {string} url
*/
async openExternalOIDCFlow(url) {
// TODO don't use window directly
await window.open(url);
await this.windowManager.open(json.attributes.auth_url);
}
// =actions
@@ -13,6 +13,7 @@ export default class ScopesScopeAuthenticateMethodOidcRoute extends Route {
// =services
@service session;
@service windowManager;
// =attributes
@@ -61,10 +62,12 @@ export default class ScopesScopeAuthenticateMethodOidcRoute extends Route {
}
/**
* When this route is deactivated (exited), stop polling for changes.
* When this route is deactivated (exited), stop polling for changes and close
* any windows opened via the window manager service.
*/
deactivate() {
this.poller.cancelAll();
this.windowManager.closeAll();
}
/**
+58
View File
@@ -0,0 +1,58 @@
import Service from '@ember/service';
import { inject as service } from '@ember/service';
/**
* The window manager service enables browser windows to open and close
* without the need to retain window references at the callsite.
*/
export default class WindowManagerService extends Service {
// =services
@service('browser/window') window;
// =attributes
/**
* An array of windows under management.
* @private
* @type {[Window]}
*/
#managedWindows = [];
// =methods
/**
* Opens a new window of the specified URL via browser services.
* @param {string} url
* @see `window.open`
*/
open(url) {
const newWindow = this.window.open(url);
if (newWindow) this.add(newWindow);
}
/**
* Closes all windows under management and purges their references.
* @see `window.close`
*/
closeAll() {
this.#managedWindows.forEach((window) => window.close());
this.purgeAll();
}
/**
* Adds a window to management.
* @param {Window} window
*/
add(window) {
this.#managedWindows.push(window);
}
/**
* Resets the managed windows array. As long as no array references are
* retained, this should result in the original array being GC'd.
*/
purgeAll() {
this.#managedWindows = [];
}
}
+6
View File
@@ -152,6 +152,12 @@
}
}
.rose-dialog-cover {
svg {
max-width: 20rem;
}
}
.copyable {
white-space: nowrap;
@@ -1,4 +1,4 @@
{{page-title (t "actions.change-password")}}
{{page-title (t 'actions.change-password')}}
<Rose::Layout::Sidebar as |sidebarLayout|>
<sidebarLayout.body>
@@ -7,14 +7,14 @@
<Rose::Layout::Page as |page|>
<page.header>
<h2>{{t "actions.change-password"}}</h2>
<h2>{{t 'actions.change-password'}}</h2>
</page.header>
<page.body>
<Form::Account::Password::ChangePassword
@model={{@model}}
@submit={{route-action "changePassword" @model}}
@cancel={{route-action "cancel" @model}}
@submit={{route-action 'changePassword' @model}}
@cancel={{route-action 'cancel' @model}}
/>
</page.body>
@@ -22,4 +22,4 @@
</Rose::Layout::Centered>
</main>
</sidebarLayout.body>
</Rose::Layout::Sidebar>
</Rose::Layout::Sidebar>
+49 -37
View File
@@ -3,49 +3,55 @@
<Rose::Layout::Global as |layout|>
<layout.header>
<Rose::Header class="{{if (is-loading) " loading"}}" as |header|>
<header.brand @logo="logo-app" @text={{app-name}} />
<Rose::Header class='{{if (is-loading) ' loading'}}' as |header|>
<header.brand @logo='logo-app' @text={{app-name}} />
{{#if this.session.isAuthenticated}}
<header.nav>
{{outlet "header-nav"}}
{{outlet 'header-nav'}}
</header.nav>
<header.utilities as |utilities|>
<utilities.dropdown
@text={{this.session.data.authenticated.username}}
@icon="app-icons/user-profile" as |dropdown|
@icon='app-icons/user-profile'
as |dropdown|
>
<dropdown.link @route="account.change-password">
<dropdown.link @route='account.change-password'>
{{t 'actions.change-password'}}
</dropdown.link>
<dropdown.separator />
<dropdown.button
{{on "click" (route-action "invalidateSession")}}
>
<dropdown.button {{on 'click' (route-action 'invalidateSession')}}>
{{t 'actions.deauthenticate'}}
</dropdown.button>
<dropdown.separator />
<dropdown.section @title={{t "titles.toggle-color-theme"}}>
<dropdown.section @title={{t 'titles.toggle-color-theme'}}>
<Rose::Form as |form|>
<form.radioGroup
@name="theme"
@name='theme'
@selectedValue={{this.session.data.theme}}
@changed={{route-action "toggleTheme"}}
as |radioGroup|>
@changed={{route-action 'toggleTheme'}}
as |radioGroup|
>
<dropdown.item>
<radioGroup.radio @label={{t "themes.system"}} />
<radioGroup.radio @label={{t 'themes.system'}} />
</dropdown.item>
<dropdown.item>
<radioGroup.radio @label={{t "themes.light"}} @value="light" />
<radioGroup.radio
@label={{t 'themes.light'}}
@value='light'
/>
</dropdown.item>
<dropdown.item>
<radioGroup.radio @label={{t "themes.dark"}} @value="dark" />
<radioGroup.radio
@label={{t 'themes.dark'}}
@value='dark'
/>
</dropdown.item>
</form.radioGroup>
</Rose::Form>
@@ -65,12 +71,12 @@
<layout.footer>
<Rose::Footer as |footer|>
<footer.brand @logo="logo-company" @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|>
<nav.link @href={{doc-url}}>
{{t "titles.documentation"}}
{{t 'titles.documentation'}}
</nav.link>
</footer.nav>
</Rose::Footer>
@@ -92,45 +98,51 @@
<PendingConfirmations as |confirmation accept deny|>
{{#if confirmation.options.isAbandonConfirm}}
<Rose::Dialog
@heading={{t "titles.abandon-confirm"}}
@dismissButtonText={{t "actions.cancel"}}
@icon="alert-triangle"
@style="warning"
@heading={{t 'titles.abandon-confirm'}}
@dismissButtonText={{t 'actions.cancel'}}
@icon='alert-triangle'
@style='warning'
@modal={{true}}
@dismiss={{deny}}
as |dialog|>
as |dialog|
>
<dialog.body>
<p>{{t "questions.abandon-confirm"}}</p>
<p>{{t 'questions.abandon-confirm'}}</p>
</dialog.body>
<dialog.footer>
<Rose::Button @style="primary" {{on "click" accept}}>
{{t "actions.discard"}}
<Rose::Button @style='primary' {{on 'click' accept}}>
{{t 'actions.discard'}}
</Rose::Button>
<Rose::Button @style="secondary" {{on "click" deny}}>
{{t "actions.cancel"}}
<Rose::Button @style='secondary' {{on 'click' deny}}>
{{t 'actions.cancel'}}
</Rose::Button>
</dialog.footer>
</Rose::Dialog>
{{else}}
<Rose::Dialog
@heading={{if confirmation.options.title (t confirmation.options.title) (t "actions.confirm")}}
@dismissButtonText={{t "actions.cancel"}}
@icon="alert-triangle"
@style="warning"
@heading={{if
confirmation.options.title
(t confirmation.options.title)
(t 'actions.confirm')
}}
@dismissButtonText={{t 'actions.cancel'}}
@icon='alert-triangle'
@style='warning'
@modal={{true}}
@dismiss={{deny}}
as |dialog|>
as |dialog|
>
<dialog.body>
<p>{{confirmation.text}}</p>
</dialog.body>
<dialog.footer>
<Rose::Button @style="primary" {{on "click" accept}}>
{{t "actions.ok"}}
<Rose::Button @style='primary' {{on 'click' accept}}>
{{t 'actions.ok'}}
</Rose::Button>
<Rose::Button @style="secondary" {{on "click" deny}}>
{{t "actions.cancel"}}
<Rose::Button @style='secondary' {{on 'click' deny}}>
{{t 'actions.cancel'}}
</Rose::Button>
</dialog.footer>
</Rose::Dialog>
{{/if}}
</PendingConfirmations>
</PendingConfirmations>
@@ -3,10 +3,10 @@
<main>
<Rose::Layout::Centered>
<Rose::Notification
@style="success"
@heading={{t "auth.titles.flow-success"}}
@style='success'
@heading={{t 'auth.titles.flow-success'}}
>
{{t "auth.descriptions.flow-success"}}
{{t 'auth.descriptions.flow-success'}}
</Rose::Notification>
</Rose::Layout::Centered>
</main>
</main>
@@ -1,20 +1,17 @@
{{page-title (t "auth.titles.flow-error")}}
{{page-title (t 'auth.titles.flow-error')}}
<main>
<Rose::Layout::Centered>
<Rose::Notification
@style="error"
@heading={{t "auth.titles.flow-error"}}
>
{{t "auth.descriptions.flow-error"}}
<br>
<Rose::Notification @style='error' @heading={{t 'auth.titles.flow-error'}}>
{{t 'auth.descriptions.flow-error'}}
<br />
<Copyable
@text={{@model}}
@buttonText={{t "actions.copy-error-detail-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-error-detail-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
{{t "actions.copy-error-detail-to-clipboard"}}
{{t 'actions.copy-error-detail-to-clipboard'}}
</Copyable>
</Rose::Notification>
</Rose::Layout::Centered>
</main>
</main>
+3 -3
View File
@@ -1,6 +1,6 @@
{{!--
{{!
Add content you wish automatically added to the documents head
here. The 'model' available in this template can be populated by
setting values on the 'head-data' service.
--}}
<title>{{this.model.title}}</title>
}}
<title>{{this.model.title}}</title>
+1 -1
View File
@@ -1 +1 @@
<h1>{{app-name}}</h1>
<h1>{{app-name}}</h1>
+6 -5
View File
@@ -7,11 +7,12 @@
<main>
<Rose::Layout::Centered>
<Rose::Message
@title={{t "auth.titles.no-scopes"}}
@icon="alert-circle-outline"
as |message|>
@title={{t 'auth.titles.no-scopes'}}
@icon='alert-circle-outline'
as |message|
>
<message.description>
{{t "auth.descriptions.no-scopes"}}
{{t 'auth.descriptions.no-scopes'}}
</message.description>
</Rose::Message>
</Rose::Layout::Centered>
@@ -19,4 +20,4 @@
</sidebarLayout.body>
</Rose::Layout::Sidebar>
{{/unless}}
{{/unless}}
+53 -77
View File
@@ -1,12 +1,12 @@
{{#if @model.isOrg}}
{{page-title (t "resources.org.title_plural") }}
{{page-title (t 'resources.org.title_plural')}}
{{page-title @model.displayName}}
{{/if}}
{{#if @model.isProject}}
{{page-title (t "resources.org.title_plural") }}
{{page-title (t 'resources.org.title_plural')}}
{{page-title this.scopes.selectedOrg.displayName}}
{{page-title (t "resources.project.title_plural") }}
{{page-title (t 'resources.project.title_plural')}}
{{page-title @model.displayName}}
{{/if}}
@@ -16,54 +16,44 @@
<sidebarLayout.sidebar>
{{#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" />
{{t "resources.org.title_plural"}}
<Rose::Nav::Sidebar @title={{t 'titles.general'}} as |nav|>
<nav.link @route='scopes.scope.scopes'>
<Rose::Icon @name='app-icons/org' @size='medium' />
{{t 'resources.org.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
{{/if}}
{{#if @model.isOrg}}
<Rose::Nav::Sidebar @title={{t "titles.general"}} as |nav|>
<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" />
{{t "resources.org.title_plural"}}
<nav.link @route='scopes.scope.scopes' @model='global'>
<Rose::Icon @name='app-icons/org' @size='medium' />
{{t 'resources.org.title_plural'}}
</nav.link>
{{/if}}
<nav.link @route="scopes.scope.scopes">
<Rose::Icon
@name="app-icons/project"
@size="medium" />
{{t "resources.project.title_plural"}}
<nav.link @route='scopes.scope.scopes'>
<Rose::Icon @name='app-icons/project' @size='medium' />
{{t 'resources.project.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
{{/if}}
{{#if @model.isProject}}
<Rose::Nav::Sidebar @title={{t "titles.general"}} as |nav|>
<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" />
{{t "resources.org.title_plural"}}
<nav.link @route='scopes.scope.scopes' @model='global'>
<Rose::Icon @name='app-icons/org' @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" />
{{t "resources.project.title_plural"}}
<nav.link @route='scopes.scope.scopes' @model={{@model.scopeID}}>
<Rose::Icon @name='app-icons/project' @size='medium' />
{{t 'resources.project.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
{{!-- TODO: after scope awareness refactor, update groups and roles
to support project scopes --}}
{{! TODO: after scope awareness refactor, update groups and roles
to support project scopes }}
{{!--
<Rose::Nav::Sidebar @title={{t "titles.iam"}} as |nav|>
<nav.link @route="scopes.scope.groups">
@@ -80,71 +70,57 @@
</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"}}
<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 @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 @route='scopes.scope.host-catalogs'>
<Rose::Icon @name='app-icons/host-catalogs' @size='medium' />
{{t 'resources.host-catalog.title_plural'}}
</nav.link>
</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"}}
<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 @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 @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 @route='scopes.scope.auth-methods'>
<Rose::Icon @name='app-icons/auth-method' @size='medium' />
{{t 'resources.auth-method.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
{{/unless}}
{{#if @model.isOrg}}
{{#if this.session.data.authenticated.isGlobal}}
<Rose::Nav::Sidebar @title={{t "titles.settings"}} as |nav|>
<nav.link @route="scopes.scope.edit">
{{t "resources.org.messages.settings.title"}}
<Rose::Nav::Sidebar @title={{t 'titles.settings'}} as |nav|>
<nav.link @route='scopes.scope.edit'>
{{t 'resources.org.messages.settings.title'}}
</nav.link>
</Rose::Nav::Sidebar>
{{/if}}
{{/if}}
{{#if @model.isProject}}
<Rose::Nav::Sidebar @title={{t "titles.settings"}} as |nav|>
<nav.link @route="scopes.scope.edit">
{{t "resources.project.messages.settings.title"}}
<Rose::Nav::Sidebar @title={{t 'titles.settings'}} as |nav|>
<nav.link @route='scopes.scope.edit'>
{{t 'resources.project.messages.settings.title'}}
</nav.link>
</Rose::Nav::Sidebar>
{{/if}}
@@ -158,4 +134,4 @@
</main>
</sidebarLayout.body>
</Rose::Layout::Sidebar>
</Rose::Layout::Sidebar>
@@ -1,15 +1,20 @@
<Rose::Dropdown
@text={{this.scopes.selectedOrg.displayName}}
@icon={{if this.scopes.selectedOrg.isGlobal "app-icons/global" "app-icons/org"}} as |dropdown|
@icon={{if
this.scopes.selectedOrg.isGlobal
'app-icons/global'
'app-icons/org'
}}
as |dropdown|
>
{{#if this.session.data.authenticated.isGlobal}}
<dropdown.link @route="scopes.scope" @model="global">
{{t "titles.global"}}
<dropdown.link @route='scopes.scope' @model='global'>
{{t 'titles.global'}}
</dropdown.link>
<dropdown.separator />
{{/if}}
{{#each this.scopes.orgs as |scope|}}
<dropdown.link @route="scopes.scope" @model={{scope.id}}>
<dropdown.link @route='scopes.scope' @model={{scope.id}}>
{{scope.displayName}}
</dropdown.link>
{{/each}}
@@ -18,12 +23,13 @@
{{#if this.scopes.selectedProject}}
<Rose::Dropdown
@text={{this.scopes.selectedProject.displayName}}
@icon="app-icons/project" as |dropdown|
@icon='app-icons/project'
as |dropdown|
>
{{#each this.scopes.projects as |scope|}}
<dropdown.link @route="scopes.scope" @model={{scope.id}}>
<dropdown.link @route='scopes.scope' @model={{scope.id}}>
{{scope.displayName}}
</dropdown.link>
{{/each}}
</Rose::Dropdown>
{{/if}}
{{/if}}
@@ -1,26 +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" />
{{t "resources.user.title_plural"}}
<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 @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 @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 @route='scopes.scope.auth-methods'>
<Rose::Icon @name='app-icons/auth-method' @size='medium' />
{{t 'resources.auth-method.title_plural'}}
</nav.link>
</Rose::Nav::Sidebar>
</Rose::Nav::Sidebar>
@@ -1,3 +1,3 @@
{{page-title (t "resources.auth-method.title_plural")}}
{{page-title (t 'resources.auth-method.title_plural')}}
{{outlet}}
{{outlet}}
@@ -7,19 +7,19 @@
</page.breadcrumbs>
<page.header>
{{outlet "header"}}
{{outlet 'header'}}
</page.header>
<page.navigation>
{{outlet "navigation"}}
{{outlet 'navigation'}}
</page.navigation>
<page.actions>
{{outlet "actions"}}
{{outlet 'actions'}}
</page.actions>
<page.body>
{{outlet}}
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,9 +1,13 @@
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
{{#if (feature-flag 'primary-auth-method')}}
{{#unless @model.isPrimary}}
<dropdown.button
@disabled={{@model.canSave}}
{{on "click" (route-action "makePrimary" @model)}}
{{on 'click' (route-action 'makePrimary' @model)}}
>
{{t 'resources.auth-method.actions.make-primary'}}
</dropdown.button>
@@ -11,24 +15,24 @@
{{#if @model.isPrimary}}
<dropdown.button
@disabled={{@model.canSave}}
{{on "click" (route-action "removeAsPrimary" @model)}}
{{on 'click' (route-action 'removeAsPrimary' @model)}}
>
{{t 'resources.auth-method.actions.remove-as-primary'}}
</dropdown.button>
{{/if}}
{{/if}}
<dropdown.link
@route="scopes.scope.auth-methods.auth-method.accounts.new"
@route='scopes.scope.auth-methods.auth-method.accounts.new'
@model={{@model}}
>
{{t "resources.account.actions.create"}}
{{t 'resources.account.actions.create'}}
</dropdown.link>
<dropdown.separator />
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "delete" @model)}}
{{on 'click' (route-action 'delete' @model)}}
>
{{t 'resources.auth-method.actions.delete'}}
</dropdown.button>
</Rose::Dropdown>
</Rose::Dropdown>
@@ -1,21 +1,21 @@
<h2>
{{t "resources.auth-method.title"}}
{{t 'resources.auth-method.title'}}
{{#if (feature-flag 'primary-auth-method')}}
{{#if @model.isPrimary}}
&nbsp;
<Rose::Badge @style="success-outline">
<Rose::Badge @style='success-outline'>
{{t 'states.primary'}}
</Rose::Badge>
&nbsp;
{{/if}}
{{/if}}
<DocLink @doc="auth-method" @iconSize="large" />
<DocLink @doc='auth-method' @iconSize='large' />
</h2>
<p>{{t "resources.auth-method.description"}}</p>
<p>{{t 'resources.auth-method.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -5,4 +5,4 @@
<nav.link @route='scopes.scope.auth-methods.auth-method.accounts'>
{{t 'resources.account.title_plural'}}
</nav.link>
</Rose::Nav::Tabs>
</Rose::Nav::Tabs>
@@ -1,3 +1,3 @@
{{page-title (t 'resources.account.title_plural')}}
{{outlet}}
{{outlet}}
@@ -1,3 +1,3 @@
{{page-title @model.displayName}}
{{outlet}}
{{outlet}}
@@ -1,9 +1,13 @@
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "deleteAccount" @model)}}
{{on 'click' (route-action 'deleteAccount' @model)}}
>
{{t 'resources.account.actions.delete'}}
</dropdown.button>
</Rose::Dropdown>
</Rose::Dropdown>
@@ -1,12 +1,12 @@
<h2>
{{t "resources.account.title"}}
<DocLink @doc="account" @iconSize="large" />
{{t 'resources.account.title'}}
<DocLink @doc='account' @iconSize='large' />
</h2>
<p>{{t "resources.account.description"}}</p>
<p>{{t 'resources.account.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -1,8 +1,12 @@
<Rose::Nav::Tabs as |nav|>
<nav.link @route='scopes.scope.auth-methods.auth-method.accounts.account.index'>
<nav.link
@route='scopes.scope.auth-methods.auth-method.accounts.account.index'
>
{{t 'titles.details'}}
</nav.link>
<nav.link @route='scopes.scope.auth-methods.auth-method.accounts.account.set-password'>
<nav.link
@route='scopes.scope.auth-methods.auth-method.accounts.account.set-password'
>
{{t 'actions.set-password'}}
</nav.link>
</Rose::Nav::Tabs>
</Rose::Nav::Tabs>
@@ -1,5 +1,5 @@
<Form::Account::Password
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
@@ -2,6 +2,6 @@
<Form::Account::Password::SetPassword
@model={{@model}}
@submit={{route-action "setPassword" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'setPassword' @model}}
@cancel={{route-action 'cancel' @model}}
/>
@@ -1,9 +1,9 @@
<h2>{{t "resources.account.title"}}</h2>
<h2>{{t 'resources.account.title'}}</h2>
<p>{{t 'resources.account.messages.set-password.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -17,7 +17,7 @@
<body.row as |row|>
<row.headerCell>
<LinkTo
@route="scopes.scope.auth-methods.auth-method.accounts.account"
@route='scopes.scope.auth-methods.auth-method.accounts.account'
@model={{account.id}}
>
{{account.displayName}}
@@ -30,8 +30,8 @@
<row.cell>
<Copyable
@text={{account.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{account.id}}</code>
</Copyable>
@@ -44,15 +44,18 @@
{{else}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.account.messages.welcome.title"}} as |message|>
<Rose::Message
@title={{t 'resources.account.messages.welcome.title'}}
as |message|
>
<message.description>
{{t "resources.account.messages.welcome.description"}}
{{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" />
<message.link @route='scopes.scope.auth-methods.auth-method.accounts.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'resources.account.actions.create'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/if}}
{{/if}}
@@ -1,5 +1,5 @@
<Form::Account::Password
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
@@ -1,4 +1,4 @@
<h2>
{{t "titles.new"}}
<DocLink @doc="account.new" @iconSize="large" />
</h2>
{{t 'titles.new'}}
<DocLink @doc='account.new' @iconSize='large' />
</h2>
@@ -1,5 +1,5 @@
<Form::AuthMethod
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
@@ -1,10 +1,10 @@
<Rose::Layout::Page as |page|>
<page.header>
<h2>
{{t "resources.auth-method.title_plural"}}
<DocLink @doc="auth-method" @iconSize="large" />
{{t 'resources.auth-method.title_plural'}}
<DocLink @doc='auth-method' @iconSize='large' />
</h2>
<p>{{t "resources.auth-method.description"}}</p>
<p>{{t 'resources.auth-method.description'}}</p>
</page.header>
<page.breadcrumbs>
@@ -14,12 +14,13 @@
<page.actions>
{{#if @model}}
<Rose::Dropdown
@text={{t "titles.new"}}
@text={{t 'titles.new'}}
@dropdownRight={{true}}
as |dropdown|>
as |dropdown|
>
<dropdown.link
@route="scopes.scope.auth-methods.new"
@query={{hash type="password"}}
@route='scopes.scope.auth-methods.new'
@query={{hash type='password'}}
>
{{t 'resources.auth-method.types.password'}}
</dropdown.link>
@@ -33,10 +34,14 @@
{{#if (feature-flag 'primary-auth-method')}}
{{#unless this.hasPrimaryAuthMethod}}
<Rose::Notification
@style="warning"
@heading={{t "resources.auth-method.messages.no-primary-auth-method.title"}}
@style='warning'
@heading={{t
'resources.auth-method.messages.no-primary-auth-method.title'
}}
>
{{t "resources.auth-method.messages.no-primary-auth-method.description"}}
{{t
'resources.auth-method.messages.no-primary-auth-method.description'
}}
</Rose::Notification>
{{/unless}}
{{/if}}
@@ -48,7 +53,7 @@
<row.headerCell>{{t 'form.type.label'}}</row.headerCell>
<row.headerCell>{{t 'form.id.label'}}</row.headerCell>
{{#if (feature-flag 'primary-auth-method')}}
<row.cell></row.cell>
<row.cell />
<row.headerCell>{{t 'titles.actions'}}</row.headerCell>
{{/if}}
</header.row>
@@ -66,7 +71,7 @@
{{#if authMethod.isOIDC}}
{{#if (feature-flag 'oidc-crud')}}
<LinkTo
@route="scopes.scope.auth-methods.auth-method"
@route='scopes.scope.auth-methods.auth-method'
@model={{authMethod.id}}
>
{{authMethod.displayName}}
@@ -76,7 +81,7 @@
{{/if}}
{{else}}
<LinkTo
@route="scopes.scope.auth-methods.auth-method"
@route='scopes.scope.auth-methods.auth-method'
@model={{authMethod.id}}
>
{{authMethod.displayName}}
@@ -92,8 +97,8 @@
<row.cell>
<Copyable
@text={{authMethod.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{authMethod.id}}</code>
</Copyable>
@@ -101,29 +106,33 @@
{{#if (feature-flag 'primary-auth-method')}}
<row.cell>
{{#if authMethod.isPrimary}}
<Rose::Badge @style="success-outline">
<Rose::Badge @style='success-outline'>
{{t 'states.primary'}}
</Rose::Badge>
{{/if}}
</row.cell>
<row.cell>
<Rose::Dropdown
@text={{t "actions.manage"}}
@text={{t 'actions.manage'}}
@dropdownRight={{true}}
@iconOnly={{true}}
@showCaret={{false}}
@icon="more-horizontal"
as |dropdown|>
@icon='more-horizontal'
as |dropdown|
>
{{#unless authMethod.isPrimary}}
<dropdown.button
{{on "click" (route-action "makePrimary" authMethod)}}
{{on 'click' (route-action 'makePrimary' authMethod)}}
>
{{t 'resources.auth-method.actions.make-primary'}}
</dropdown.button>
{{/unless}}
{{#if authMethod.isPrimary}}
<dropdown.button
{{on "click" (route-action "removeAsPrimary" authMethod)}}
{{on
'click'
(route-action 'removeAsPrimary' authMethod)
}}
>
{{t 'resources.auth-method.actions.remove-as-primary'}}
</dropdown.button>
@@ -139,14 +148,18 @@
{{else}}
<Rose::Layout::Centered>
<Rose::Message @title={{t 'resources.auth-method.messages.welcome.title'}} as |message|>
<Rose::Message
@title={{t 'resources.auth-method.messages.welcome.title'}}
as |message|
>
<message.description>
{{t 'resources.auth-method.messages.welcome.description'}}
</message.description>
<message.link
@route="scopes.scope.auth-methods.new"
@query={{hash type="password"}}>
<Rose::Icon @name="plus-circle-outline" />
@route='scopes.scope.auth-methods.new'
@query={{hash type='password'}}
>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -154,4 +167,4 @@
{{/if}}
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,8 +1,8 @@
{{page-title (t "titles.new")}}
{{page-title (t 'titles.new')}}
<Rose::Layout::Page as |page|>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>{{t 'titles.new'}}</h2>
</page.header>
<page.breadcrumbs>
@@ -12,8 +12,8 @@
<page.body>
<Form::AuthMethod
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,4 +1,4 @@
{{page-title (t "actions.authenticate")}}
{{page-title (t 'actions.authenticate')}}
<Rose::Layout::Centered>
<Rose::Layout::Page as |page|>
@@ -7,19 +7,26 @@
<Rose::Frame>
<:header>
<h2>{{t "actions.authenticate"}}</h2>
<h2>{{t 'actions.authenticate'}}</h2>
</:header>
<:body>
<p>{{t "auth.descriptions.authenticating-with-org" name=@model.scope.displayName}}</p>
<p>{{t
'auth.descriptions.authenticating-with-org'
name=@model.scope.displayName
}}</p>
<Rose::Dropdown
@text={{t "actions.choose-different-org"}}
@icon="user-organization"
as |dropdown|>
<dropdown.link @route="scopes.scope.authenticate" @model="global">
{{t "titles.global"}}
@text={{t 'actions.choose-different-org'}}
@icon='user-organization'
as |dropdown|
>
<dropdown.link @route='scopes.scope.authenticate' @model='global'>
{{t 'titles.global'}}
</dropdown.link>
{{#each this.sortedScopes as |scope|}}
<dropdown.link @route="scopes.scope.authenticate" @model={{scope.id}}>
<dropdown.link
@route='scopes.scope.authenticate'
@model={{scope.id}}
>
{{scope.displayName}}
</dropdown.link>
{{/each}}
@@ -31,11 +38,16 @@
{{#if (feature-flag 'oidc')}}
{{! OIDC enable: list all auth methods }}
{{#each @model.authMethods as |authMethod|}}
<nav.link @route="scopes.scope.authenticate.method" @model={{authMethod.id}}>
<nav.link
@route='scopes.scope.authenticate.method'
@model={{authMethod.id}}
>
{{#if authMethod.name}}
{{authMethod.name}}
{{else}}
{{t (concat "resources.auth-method.types." authMethod.type)}}
{{t
(concat 'resources.auth-method.types.' authMethod.type)
}}
{{/if}}
</nav.link>
{{/each}}
@@ -43,11 +55,16 @@
{{! OIDC disabled: filter out OIDC auth methods}}
{{#each @model.authMethods as |authMethod|}}
{{#unless authMethod.isOIDC}}
<nav.link @route="scopes.scope.authenticate.method" @model={{authMethod.id}}>
<nav.link
@route='scopes.scope.authenticate.method'
@model={{authMethod.id}}
>
{{#if authMethod.name}}
{{authMethod.name}}
{{else}}
{{t (concat "resources.auth-method.types." authMethod.type)}}
{{t
(concat 'resources.auth-method.types.' authMethod.type)
}}
{{/if}}
</nav.link>
{{/unless}}
@@ -61,11 +78,12 @@
{{#unless @model.authMethods}}
<Rose::Layout::Centered>
<Rose::Message
@title={{t "resources.auth-method.messages.none.title"}}
@icon="alert-circle-outline"
as |message|>
@title={{t 'resources.auth-method.messages.none.title'}}
@icon='alert-circle-outline'
as |message|
>
<message.description>
{{t "resources.auth-method.messages.none.description"}}
{{t 'resources.auth-method.messages.none.description'}}
</message.description>
</Rose::Message>
</Rose::Layout::Centered>
@@ -75,4 +93,4 @@
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Centered>
</Rose::Layout::Centered>
@@ -1,12 +1,13 @@
{{#unless @model}}
<Rose::Layout::Centered>
<Rose::Message
@title={{t "resources.auth-method.messages.none.title"}}
@icon="alert-circle-outline"
as |message|>
@title={{t 'resources.auth-method.messages.none.title'}}
@icon='alert-circle-outline'
as |message|
>
<message.description>
{{t "resources.auth-method.messages.none.description"}}
{{t 'resources.auth-method.messages.none.description'}}
</message.description>
</Rose::Message>
</Rose::Layout::Centered>
{{/unless}}
{{/unless}}
@@ -1 +1 @@
{{outlet}}
{{outlet}}
@@ -2,7 +2,7 @@
{{! OIDC enabled: show form for any auth method}}
<Form::Authenticate
@model={{@model}}
@submit={{route-action "authenticate"}}
@submit={{route-action 'authenticate'}}
@disabled={{is-loading}}
/>
{{else}}
@@ -10,8 +10,8 @@
{{#unless @model.isOIDC}}
<Form::Authenticate
@model={{@model}}
@submit={{route-action "authenticate"}}
@submit={{route-action 'authenticate'}}
@disabled={{is-loading}}
/>
{{/unless}}
{{/if}}
{{/if}}
@@ -1,24 +1,20 @@
<Rose::Dialog::Cover>
<:header>
{{inline-svg "logo-app-full"}}
{{inline-svg 'logo-app-full'}}
<h1>{{t 'resources.auth-method.messages.pending.title'}}</h1>
</:header>
<:body>
<p>{{t 'resources.auth-method.messages.pending.description'}}</p>
<p>
{{t 'resources.auth-method.questions.no-see-window'}}
<a
href="{{this.authURL}}"
target="_blank"
rel="noreferrer noopener"
>
<a href='#' role='button' {{on 'click' (route-action 'authenticate')}}>
{{t 'actions.retry'}}
</a>
</p>
<p>
<LinkTo @route="scopes.scope.authenticate.method">
<LinkTo @route='scopes.scope.authenticate.method'>
{{t 'actions.cancel'}}
</LinkTo>
</p>
</:body>
</Rose::Dialog::Cover>
</Rose::Dialog::Cover>
+18 -14
View File
@@ -7,22 +7,22 @@
<page.header>
{{#if @model.isOrg}}
<h2>
{{t "resources.org.title"}}
<DocLink @doc="org" @iconSize="large" />
{{t 'resources.org.title'}}
<DocLink @doc='org' @iconSize='large' />
</h2>
<p>{{t "resources.org.description"}}</p>
<p>{{t 'resources.org.description'}}</p>
{{/if}}
{{#if @model.isProject}}
<h2>
{{t "resources.project.title"}}
<DocLink @doc="project" @iconSize="large" />
{{t 'resources.project.title'}}
<DocLink @doc='project' @iconSize='large' />
</h2>
<p>{{t "resources.project.description"}}</p>
<p>{{t 'resources.project.description'}}</p>
{{/if}}
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
@@ -37,11 +37,15 @@
</page.navigation>
<page.actions>
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "delete" @model)}}
{{on 'click' (route-action 'delete' @model)}}
>
{{#if @model.isOrg}}
{{t 'resources.org.actions.delete'}}
@@ -55,9 +59,9 @@
<page.body>
<Form::Scope
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,7 +1,7 @@
{{page-title (t "errors.generic.title") }}
{{page-title (t 'errors.generic.title')}}
<Rose::Layout::Centered>
{{#each @model.errors as |error|}}
<Error::Message @status={{error.status}}/>
<Error::Message @status={{error.status}} />
{{/each}}
</Rose::Layout::Centered>
</Rose::Layout::Centered>
@@ -1,3 +1,3 @@
{{page-title (t "resources.group.title_plural")}}
{{page-title (t 'resources.group.title_plural')}}
{{outlet}}
{{outlet}}
@@ -7,19 +7,19 @@
</page.breadcrumbs>
<page.header>
{{outlet "header"}}
{{outlet 'header'}}
</page.header>
<page.navigation>
{{outlet "navigation"}}
{{outlet 'navigation'}}
</page.navigation>
<page.actions>
{{outlet "actions"}}
{{outlet 'actions'}}
</page.actions>
<page.body>
{{outlet}}
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,13 +1,17 @@
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<dropdown.link @route="scopes.scope.groups.group.add-members">
{{t "resources.group.actions.add-members"}}
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.link @route='scopes.scope.groups.group.add-members'>
{{t 'resources.group.actions.add-members'}}
</dropdown.link>
<dropdown.separator />
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "delete" @model)}}
{{on 'click' (route-action 'delete' @model)}}
>
{{t 'resources.group.actions.delete'}}
</dropdown.button>
</Rose::Dropdown>
</Rose::Dropdown>
@@ -1,12 +1,12 @@
<h2>
{{t "resources.group.title"}}
<DocLink @doc="group" @iconSize="large" />
{{t 'resources.group.title'}}
<DocLink @doc='group' @iconSize='large' />
</h2>
<p>{{t "resources.group.description"}}</p>
<p>{{t 'resources.group.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -5,4 +5,4 @@
<nav.link @route='scopes.scope.groups.group.members'>
{{t 'resources.group.messages.members.title'}}
</nav.link>
</Rose::Nav::Tabs>
</Rose::Nav::Tabs>
@@ -1,8 +1,8 @@
{{page-title (t "resources.group.messages.add-members.title")}}
{{page-title (t 'resources.group.messages.add-members.title')}}
<Form::Group::AddMembers
@model={{@model.group}}
@users={{@model.users}}
@submit={{route-action "addMembers" @model.group}}
@cancel={{route-action "cancel"}}
/>
@submit={{route-action 'addMembers' @model.group}}
@cancel={{route-action 'cancel'}}
/>
@@ -1,5 +1,5 @@
<h2>
{{t "resources.group.messages.add-members.title"}}
<DocLink @doc="group.add-members" @iconSize="large" />
{{t 'resources.group.messages.add-members.title'}}
<DocLink @doc='group.add-members' @iconSize='large' />
</h2>
<p>{{t "resources.group.messages.add-members.description"}}</p>
<p>{{t 'resources.group.messages.add-members.description'}}</p>
@@ -1,5 +1,5 @@
<Form::Group
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
@@ -7,7 +7,7 @@
<header.row as |row|>
<row.headerCell>{{t 'form.name.label'}}</row.headerCell>
<row.headerCell>{{t 'form.id.label'}}</row.headerCell>
<row.headerCell>{{t "titles.actions"}}</row.headerCell>
<row.headerCell>{{t 'titles.actions'}}</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
@@ -19,25 +19,26 @@
<row.cell>
<Copyable
@text={{member.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{member.id}}</code>
</Copyable>
</row.cell>
<row.cell>
<row.cell>
<Rose::Dropdown
@icon="more-horizontal"
@icon='more-horizontal'
@iconOnly={{true}}
@showCaret={{false}}
@dropdownRight={{true}}
@text="{{t "actions.manage"}}" as |dropdown|
@text='{{t 'actions.manage'}}'
as |dropdown|
>
<dropdown.button
@style="danger"
{{on "click" (route-action "removeMember" @model.group member)}}
@style='danger'
{{on 'click' (route-action 'removeMember' @model.group member)}}
>
{{t "actions.remove"}}
{{t 'actions.remove'}}
</dropdown.button>
</Rose::Dropdown>
</row.cell>
@@ -49,15 +50,18 @@
{{else}}
<Rose::Layout::Centered>
<Rose::Message @title={{t "resources.group.messages.members.title"}} as |message|>
<Rose::Message
@title={{t 'resources.group.messages.members.title'}}
as |message|
>
<message.description>
{{t "resources.group.messages.members.description"}}
{{t 'resources.group.messages.members.description'}}
</message.description>
<message.link @route="scopes.scope.groups.group.add-members">
<Rose::Icon @name="plus-circle-outline" />
<message.link @route='scopes.scope.groups.group.add-members'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'resources.group.actions.add-members'}}
</message.link>
</Rose::Message>
</Rose::Layout::Centered>
{{/if}}
{{/if}}
@@ -6,15 +6,17 @@
<page.header>
<h2>
{{t "resources.group.title_plural"}}
<DocLink @doc="group" @iconSize="large" />
{{t 'resources.group.title_plural'}}
<DocLink @doc='group' @iconSize='large' />
</h2>
<p>{{t "resources.group.description"}}</p>
<p>{{t 'resources.group.description'}}</p>
</page.header>
<page.actions>
{{#if @model}}
<Rose::LinkButton @route="scopes.scope.groups.new" @style="primary">{{t 'titles.new'}}</Rose::LinkButton>
<Rose::LinkButton @route='scopes.scope.groups.new' @style='primary'>{{t
'titles.new'
}}</Rose::LinkButton>
{{/if}}
</page.actions>
@@ -25,18 +27,15 @@
<Rose::Table as |table|>
<table.header as |header|>
<header.row as |row|>
<row.headerCell>{{t "form.name.label"}}</row.headerCell>
<row.headerCell>{{t "form.id.label"}}</row.headerCell>
<row.headerCell>{{t 'form.name.label'}}</row.headerCell>
<row.headerCell>{{t 'form.id.label'}}</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
{{#each @model as |group|}}
<body.row as |row|>
<row.headerCell>
<LinkTo
@route="scopes.scope.groups.group"
@model={{group.id}}
>
<LinkTo @route='scopes.scope.groups.group' @model={{group.id}}>
{{group.displayName}}
</LinkTo>
<p>{{group.description}}</p>
@@ -44,8 +43,8 @@
<row.cell>
<Copyable
@text={{group.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{group.id}}</code>
</Copyable>
@@ -58,12 +57,15 @@
{{else}}
<Rose::Layout::Centered>
<Rose::Message @title={{t 'resources.group.messages.welcome.title'}} as |message|>
<Rose::Message
@title={{t 'resources.group.messages.welcome.title'}}
as |message|
>
<message.description>
{{t 'resources.group.description'}}
</message.description>
<message.link @route="scopes.scope.groups.new">
<Rose::Icon @name="plus-circle-outline" />
<message.link @route='scopes.scope.groups.new'>
<Rose::Icon @name='plus-circle-outline' />
{{t 'titles.new'}}
</message.link>
</Rose::Message>
@@ -73,4 +75,4 @@
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -7,15 +7,15 @@
</page.breadcrumbs>
<page.header>
<h2>{{t "titles.new"}}</h2>
<h2>{{t 'titles.new'}}</h2>
</page.header>
<page.body>
<Form::Group
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,3 +1,3 @@
{{page-title (t "resources.host-catalog.title_plural")}}
{{page-title (t 'resources.host-catalog.title_plural')}}
{{outlet}}
{{outlet}}
@@ -7,19 +7,19 @@
</page.breadcrumbs>
<page.header>
{{outlet "header"}}
{{outlet 'header'}}
</page.header>
<page.actions>
{{outlet "actions"}}
{{outlet 'actions'}}
</page.actions>
<page.navigation>
{{outlet "navigation"}}
{{outlet 'navigation'}}
</page.navigation>
<page.body>
{{outlet}}
</page.body>
</Rose::Layout::Page>
</Rose::Layout::Page>
@@ -1,22 +1,26 @@
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.link
@route="scopes.scope.host-catalogs.host-catalog.hosts.new"
@route='scopes.scope.host-catalogs.host-catalog.hosts.new'
@model={{@model}}
>
{{t "resources.host.actions.create"}}
{{t 'resources.host.actions.create'}}
</dropdown.link>
<dropdown.link
@route="scopes.scope.host-catalogs.host-catalog.host-sets.new"
@route='scopes.scope.host-catalogs.host-catalog.host-sets.new'
@model={{@model}}
>
{{t "resources.host-set.actions.create"}}
{{t 'resources.host-set.actions.create'}}
</dropdown.link>
<dropdown.separator />
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "delete" @model)}}
{{on 'click' (route-action 'delete' @model)}}
>
{{t "resources.host-catalog.actions.delete"}}
{{t 'resources.host-catalog.actions.delete'}}
</dropdown.button>
</Rose::Dropdown>
</Rose::Dropdown>
@@ -1,12 +1,12 @@
<h2>
{{t "resources.host-catalog.title"}}
<DocLink @doc="host-catalog" @iconSize="large" />
{{t 'resources.host-catalog.title'}}
<DocLink @doc='host-catalog' @iconSize='large' />
</h2>
<p>{{t "resources.host-catalog.description"}}</p>
<p>{{t 'resources.host-catalog.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -8,4 +8,4 @@
<nav.link @route='scopes.scope.host-catalogs.host-catalog.host-sets'>
{{t 'resources.host-set.title_plural'}}
</nav.link>
</Rose::Nav::Tabs>
</Rose::Nav::Tabs>
@@ -1,3 +1,3 @@
{{page-title (t "resources.host-set.title_plural")}}
{{page-title (t 'resources.host-set.title_plural')}}
{{outlet}}
{{outlet}}
@@ -1,3 +1,3 @@
{{page-title @model.displayName}}
{{outlet}}
{{outlet}}
@@ -1,16 +1,24 @@
<Rose::Dropdown @text="{{t 'actions.manage'}}" @dropdownRight={{true}} as |dropdown|>
<dropdown.link @route="scopes.scope.host-catalogs.host-catalog.host-sets.host-set.create-and-add-host">
<Rose::Dropdown
@text='{{t 'actions.manage'}}'
@dropdownRight={{true}}
as |dropdown|
>
<dropdown.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.create-and-add-host'
>
{{t 'resources.host-set.actions.create-and-add-host'}}
</dropdown.link>
<dropdown.link @route="scopes.scope.host-catalogs.host-catalog.host-sets.host-set.add-hosts">
<dropdown.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.add-hosts'
>
{{t 'resources.host-set.actions.add-hosts'}}
</dropdown.link>
<dropdown.separator />
<dropdown.button
@style="danger"
@style='danger'
@disabled={{@model.canSave}}
{{on "click" (route-action "deleteHostSet" @model)}}
{{on 'click' (route-action 'deleteHostSet' @model)}}
>
{{t 'resources.host-set.actions.delete'}}
</dropdown.button>
</Rose::Dropdown>
</Rose::Dropdown>
@@ -1,12 +1,12 @@
<h2>
{{t "resources.host-set.title"}}
<DocLink @doc="host-set" @iconSize="large" />
{{t 'resources.host-set.title'}}
<DocLink @doc='host-set' @iconSize='large' />
</h2>
<p>{{t "resources.host-set.description"}}</p>
<p>{{t 'resources.host-set.description'}}</p>
<Copyable
@text={{@model.id}}
@buttonText={{t "actions.copy-to-clipboard"}}
@acknowledgeText={{t "states.copied"}}
@buttonText={{t 'actions.copy-to-clipboard'}}
@acknowledgeText={{t 'states.copied'}}
>
<code>{{@model.id}}</code>
</Copyable>
</Copyable>
@@ -1,8 +1,12 @@
<Rose::Nav::Tabs as |nav|>
<nav.link @route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.index'>
<nav.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.index'
>
{{t 'titles.details'}}
</nav.link>
<nav.link @route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.hosts'>
<nav.link
@route='scopes.scope.host-catalogs.host-catalog.host-sets.host-set.hosts'
>
{{t 'resources.host.title_plural'}}
</nav.link>
</Rose::Nav::Tabs>
</Rose::Nav::Tabs>
@@ -1,8 +1,8 @@
{{page-title (t "resources.host-set.actions.add-hosts")}}
{{page-title (t 'resources.host-set.actions.add-hosts')}}
<Form::HostSet::AddHosts
@model={{@model.hostSet}}
@hosts={{@model.hosts}}
@submit={{route-action "addHosts" @model.hostSet}}
@cancel={{route-action "cancel"}}
/>
@submit={{route-action 'addHosts' @model.hostSet}}
@cancel={{route-action 'cancel'}}
/>
@@ -1,5 +1,5 @@
<h2>
{{t "resources.host-set.host.messages.add.title"}}
<DocLink @doc="host-set.add-hosts" @iconSize="large" />
{{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>
<p>{{t 'resources.host-set.host.messages.add.description'}}</p>
@@ -2,6 +2,6 @@
<Form::Host
@model={{@model}}
@submit={{route-action "save" @model}}
@cancel={{route-action "cancel" @model}}
/>
@submit={{route-action 'save' @model}}
@cancel={{route-action 'cancel' @model}}
/>
Loaded 100 of 225 files, more files were not shown because too many files have changed in this diff. Show more