diff --git a/ui-v2/app/components/policy-selector.js b/ui-v2/app/components/policy-selector.js
index 295afce42..66210aaec 100644
--- a/ui-v2/app/components/policy-selector.js
+++ b/ui-v2/app/components/policy-selector.js
@@ -61,6 +61,9 @@ export default ChildSelectorComponent.extend({
}
},
actions: {
+ open: function(e) {
+ this.refreshCodeEditor(e, e.target.parentElement);
+ },
loadItem: function(e, item, items) {
const target = e.target;
// the Details expander toggle, only load on opening
diff --git a/ui-v2/app/components/role-selector.js b/ui-v2/app/components/role-selector.js
index f1243ad17..8d88ea36e 100644
--- a/ui-v2/app/components/role-selector.js
+++ b/ui-v2/app/components/role-selector.js
@@ -1,25 +1,25 @@
import ChildSelectorComponent from './child-selector';
import { inject as service } from '@ember/service';
import { get, set } from '@ember/object';
-
import { alias } from '@ember/object/computed';
import { CallableEventSource as EventSource } from 'consul-ui/utils/dom/event-source';
export default ChildSelectorComponent.extend({
repo: service('repository/role/component'),
+ dom: service('dom'),
name: 'role',
type: 'role',
classNames: ['role-selector'],
state: 'role',
+ // You have to alias data.
+ // If you just set it, it loses its reference?
+ policy: alias('policyForm.data'),
init: function() {
this._super(...arguments);
this.policyForm = get(this, 'formContainer').form('policy');
this.source = new EventSource();
},
- // You have to alias data
- // is you just set it it loses its reference?
- policy: alias('policyForm.data'),
actions: {
reset: function(e) {
this._super(...arguments);
@@ -30,9 +30,15 @@ export default ChildSelectorComponent.extend({
},
change: function() {
const event = get(this, 'dom').normalizeEvent(...arguments);
- switch (event.target.name) {
+ const target = event.target;
+ switch (target.name) {
case 'role[state]':
- set(this, 'state', event.target.value);
+ set(this, 'state', target.value);
+ if (target.value === 'policy') {
+ get(this, 'dom')
+ .component('.code-editor', target.nextElementSibling)
+ .didAppear();
+ }
break;
default:
this._super(...arguments);
diff --git a/ui-v2/app/templates/components/policy-form.hbs b/ui-v2/app/templates/components/policy-form.hbs
index c573ee5a1..6b20175e3 100644
--- a/ui-v2/app/templates/components/policy-form.hbs
+++ b/ui-v2/app/templates/components/policy-form.hbs
@@ -18,13 +18,13 @@
{{/each}}
{{/yield-slot}}
-
{{!TODO: potentially call trigger something else}}
{{!the modal has to go here so that if you provide a slot to trigger it doesn't get rendered}}
- {{#modal-dialog data-test-policy-form name="new-policy-toggle"}}
+ {{#modal-dialog data-test-policy-form onopen=(action 'open') name="new-policy-toggle"}}
{{#block-slot 'header'}}
New Policy
{{/block-slot}}
diff --git a/ui-v2/tests/acceptance/dc/acls/policies/as-many/reset.feature b/ui-v2/tests/acceptance/dc/acls/policies/as-many/reset.feature
new file mode 100644
index 000000000..12e5eea6e
--- /dev/null
+++ b/ui-v2/tests/acceptance/dc/acls/policies/as-many/reset.feature
@@ -0,0 +1,37 @@
+@setupApplicationTest
+Feature: dc / acls / policies / as many / reset: Reset policy form
+ Background:
+ Given 1 datacenter model with the value "datacenter"
+ And 1 [Model] model from yaml
+ ---
+ Policies: ~
+ ServiceIdentities: ~
+ ---
+ When I visit the [Model] page for yaml
+ ---
+ dc: datacenter
+ [Model]: key
+ ---
+ Then the url should be /datacenter/acls/[Model]s/key
+ And I click policies.create
+ Scenario: Adding a new policy as a child of [Model]
+ Then I fill in the policies.form form with yaml
+ ---
+ Name: New-Policy
+ Description: New Policy Description
+ Rules: operator {}
+ ---
+ And I click cancel on the policies.form
+ And I click policies.create
+ Then I see the policies.form form with yaml
+ ---
+ Name: ""
+ Description: ""
+ Rules: ""
+ ---
+ Where:
+ -------------
+ | Model |
+ | token |
+ | role |
+ -------------
diff --git a/ui-v2/tests/acceptance/steps/dc/acls/policies/as-many/reset-steps.js b/ui-v2/tests/acceptance/steps/dc/acls/policies/as-many/reset-steps.js
new file mode 100644
index 000000000..550f68858
--- /dev/null
+++ b/ui-v2/tests/acceptance/steps/dc/acls/policies/as-many/reset-steps.js
@@ -0,0 +1,10 @@
+import steps from '../../../../steps';
+
+// step definitions that are shared between features should be moved to the
+// tests/acceptance/steps/steps.js file
+
+export default function(assert) {
+ return steps(assert).then('I should find a file', function() {
+ assert.ok(true, this.step);
+ });
+}
diff --git a/ui-v2/tests/steps.js b/ui-v2/tests/steps.js
index 3bec04174..a34bce897 100644
--- a/ui-v2/tests/steps.js
+++ b/ui-v2/tests/steps.js
@@ -8,6 +8,7 @@ import assertHttp from './steps/assertions/http';
import assertModel from './steps/assertions/model';
import assertPage from './steps/assertions/page';
import assertDom from './steps/assertions/dom';
+import assertForm from './steps/assertions/form';
// const dont = `( don't| shouldn't| can't)?`;
@@ -79,6 +80,7 @@ export default function(assert, library, pages, utils) {
assertModel(library, assert, find, getCurrentPage, pauseUntil, utils.pluralize);
assertPage(library, assert, find, getCurrentPage);
assertDom(library, assert, pauseUntil, utils.find, utils.currentURL);
+ assertForm(library, assert, find, getCurrentPage);
return library.given(["I'm using a legacy token"], function(number, model, data) {
window.localStorage['consul:token'] = JSON.stringify({ AccessorID: null, SecretID: 'id' });
diff --git a/ui-v2/tests/steps/assertions/form.js b/ui-v2/tests/steps/assertions/form.js
new file mode 100644
index 000000000..9c4ddec69
--- /dev/null
+++ b/ui-v2/tests/steps/assertions/form.js
@@ -0,0 +1,21 @@
+export default function(scenario, assert, find, currentPage) {
+ scenario.then('I see the $property form with yaml\n$yaml', function(property, data) {
+ try {
+ let obj;
+ try {
+ obj = find(property);
+ } catch (e) {
+ obj = currentPage();
+ }
+ return Object.keys(data).reduce(function(prev, item, i, arr) {
+ const name = `${obj.prefix || property}[${item}]`;
+ const $el = document.querySelector(`[name="${name}"]`);
+ const actual = $el.value;
+ const expected = data[item];
+ assert.strictEqual(actual, expected, `Expected settings to be ${expected} was ${actual}`);
+ }, obj);
+ } catch (e) {
+ throw e;
+ }
+ });
+}