diff --git a/addons/api/addon/generated/models/auth-method.js b/addons/api/addon/generated/models/auth-method.js index ccf7675d3..1466afcfb 100644 --- a/addons/api/addon/generated/models/auth-method.js +++ b/addons/api/addon/generated/models/auth-method.js @@ -71,4 +71,34 @@ export default class GeneratedAuthMethodModel extends BaseModel { disable_discovered_config_validation; @attr('boolean', { isNestedAttribute: true }) dry_run; + + @attr('string-array', { + emptyArrayIfMissing: true, + isNestedAttribute: true, + }) + claims_scopes; + + @attr('string-array', { + emptyArrayIfMissing: true, + isNestedAttribute: true, + }) + signing_algorithms; + + @attr('string-array', { + emptyArrayIfMissing: true, + isNestedAttribute: true, + }) + allowed_audiences; + + @attr('string-array', { + emptyArrayIfMissing: true, + isNestedAttribute: true, + }) + idp_ca_certs; + + @attr('account-claim-map-array', { + emptyArrayIfMissing: true, + isNestedAttribute: true, + }) + account_claim_maps; } diff --git a/addons/api/addon/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js b/addons/api/addon/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js deleted file mode 100644 index 59387536f..000000000 --- a/addons/api/addon/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js +++ /dev/null @@ -1,15 +0,0 @@ -// app/initializers/fragment-serializer.js -import FragmentAuthMethodAttributesAccountClaimMapSerializer from '../serializers/fragment-auth-method-attributes-account-claim-map'; - -export function initialize(application) { - application.register( - 'serializer:fragment-auth-method-attributes-account-claim-map', - FragmentAuthMethodAttributesAccountClaimMapSerializer - ); -} - -// Fragment serializers must be manually registered -export default { - name: 'fragment-auth-method-attributes-account-claim-map', - initialize: initialize, -}; diff --git a/addons/api/addon/initializers/fragment-string.js b/addons/api/addon/initializers/fragment-string.js deleted file mode 100644 index 4ed82346a..000000000 --- a/addons/api/addon/initializers/fragment-string.js +++ /dev/null @@ -1,12 +0,0 @@ -// app/initializers/fragment-serializer.js -import FragmentStringSerializer from '../serializers/fragment-string'; - -export function initialize(application) { - application.register('serializer:fragment-string', FragmentStringSerializer); -} - -// Fragment serializers must be manually registered -export default { - name: 'fragment-string', - initialize: initialize, -}; diff --git a/addons/api/addon/models/auth-method.js b/addons/api/addon/models/auth-method.js index 57a69cf90..eeb262560 100644 --- a/addons/api/addon/models/auth-method.js +++ b/addons/api/addon/models/auth-method.js @@ -1,5 +1,4 @@ import GeneratedAuthMethodModel from '../generated/models/auth-method'; -import { fragmentArray } from 'ember-data-model-fragments/attributes'; import { equal } from '@ember/object/computed'; /** @@ -29,36 +28,6 @@ export const options = { export default class AuthMethodModel extends GeneratedAuthMethodModel { // =attributes - @fragmentArray('fragment-auth-method-attributes-account-claim-map', { - emptyArrayIfMissing: true, - isNestedAttribute: true, - }) - account_claim_maps; - - @fragmentArray('fragment-string', { - emptyArrayIfMissing: true, - isNestedAttribute: true, - }) - claims_scopes; - - @fragmentArray('fragment-string', { - emptyArrayIfMissing: true, - isNestedAttribute: true, - }) - signing_algorithms; - - @fragmentArray('fragment-string', { - emptyArrayIfMissing: true, - isNestedAttribute: true, - }) - allowed_audiences; - - @fragmentArray('fragment-string', { - emptyArrayIfMissing: true, - isNestedAttribute: true, - }) - idp_ca_certs; - /** * @type {boolean} */ diff --git a/addons/api/addon/models/fragment-auth-method-attributes-account-claim-map.js b/addons/api/addon/models/fragment-auth-method-attributes-account-claim-map.js deleted file mode 100644 index c3e2aec21..000000000 --- a/addons/api/addon/models/fragment-auth-method-attributes-account-claim-map.js +++ /dev/null @@ -1,9 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; - -export default class FragmentAuthMethodAttributesAccountClaimMapModel extends Fragment { - // =attributes (OIDC) - - @attr('string') from; - @attr('string') to; -} diff --git a/addons/api/addon/models/fragment-string.js b/addons/api/addon/models/fragment-string.js deleted file mode 100644 index 8f2c8690c..000000000 --- a/addons/api/addon/models/fragment-string.js +++ /dev/null @@ -1,14 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; - -/** - * Represents an item in an array of strings. - */ -export default class FragmentStringModel extends Fragment { - // =attributes - - @attr('string', { - description: 'The value of the string.', - }) - value; -} diff --git a/addons/api/addon/serializers/fragment-auth-method-attributes-account-claim-map.js b/addons/api/addon/serializers/fragment-auth-method-attributes-account-claim-map.js deleted file mode 100644 index 611f6aa13..000000000 --- a/addons/api/addon/serializers/fragment-auth-method-attributes-account-claim-map.js +++ /dev/null @@ -1,30 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentHostSourceSerializer extends JSONSerializer { - // =methods - - /** - * Serializes an account claim to string. - * @param {Snapshot} snapshot - * @return {string} - */ - serialize(snapshot) { - const from = snapshot.attr('from'); - const to = snapshot.attr('to'); - return `${from}=${to}`; - } - - /** - * Normalizes account claim strings into JSON API objects. - * @param {Model} typeClass - * @param {string} value - * @return {object} - */ - normalize(typeClass, value) { - const normalizedHash = { - from: value.split('=')[0], - to: value.split('=')[1], - }; - return super.normalize(typeClass, normalizedHash); - } -} diff --git a/addons/api/addon/serializers/fragment-string.js b/addons/api/addon/serializers/fragment-string.js deleted file mode 100644 index 9b10f74d1..000000000 --- a/addons/api/addon/serializers/fragment-string.js +++ /dev/null @@ -1,24 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentStringSerializer extends JSONSerializer { - // =methods - - /** - * Serializes a to string. - * @param {Snapshot} snapshot - * @return {string} - */ - serialize(snapshot) { - return snapshot.attr('value'); - } - - /** - * Normalizes from strings. - * @param {Model} typeClass - * @param {string} value - * @return {object} - */ - normalize(typeClass, value) { - return super.normalize(typeClass, { value }); - } -} diff --git a/addons/api/addon/transforms/account-claim-map-array.js b/addons/api/addon/transforms/account-claim-map-array.js new file mode 100644 index 000000000..a383156b7 --- /dev/null +++ b/addons/api/addon/transforms/account-claim-map-array.js @@ -0,0 +1,16 @@ +import Transform from '@ember-data/serializer/transform'; + +export default class AccountClaimMapArrayTransform extends Transform { + deserialize(serialized) { + const accountClaims = serialized || []; + return accountClaims.map((accountClaimString) => ({ + from: accountClaimString.split('=')[0], + to: accountClaimString.split('=')[1], + })); + } + + serialize(deserialized) { + const accountClaims = deserialized || []; + return accountClaims.map(({ from, to }) => `${from}=${to}`); + } +} diff --git a/addons/api/app/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js b/addons/api/app/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js deleted file mode 100644 index 844980fbc..000000000 --- a/addons/api/app/initializers/fragment-auth-method-attributes-account-claim-map-serializer.js +++ /dev/null @@ -1,4 +0,0 @@ -export { - default, - initialize, -} from 'api/initializers/fragment-auth-method-attributes-account-claim-map-serializer'; diff --git a/addons/api/app/initializers/fragment-string.js b/addons/api/app/initializers/fragment-string.js deleted file mode 100644 index 813fb5c5a..000000000 --- a/addons/api/app/initializers/fragment-string.js +++ /dev/null @@ -1 +0,0 @@ -export { default, initialize } from 'api/initializers/fragment-string'; diff --git a/addons/api/app/models/fragment-auth-method-attributes-account-claim-map.js b/addons/api/app/models/fragment-auth-method-attributes-account-claim-map.js deleted file mode 100644 index 8d0f7b0c7..000000000 --- a/addons/api/app/models/fragment-auth-method-attributes-account-claim-map.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-auth-method-attributes-account-claim-map'; diff --git a/addons/api/app/models/fragment-string.js b/addons/api/app/models/fragment-string.js deleted file mode 100644 index 90c1321af..000000000 --- a/addons/api/app/models/fragment-string.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-string'; diff --git a/addons/api/app/serializers/fragment-string.js b/addons/api/app/serializers/fragment-string.js deleted file mode 100644 index 8e61ed28e..000000000 --- a/addons/api/app/serializers/fragment-string.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-string'; diff --git a/addons/api/app/transforms/account-claim-map-array.js b/addons/api/app/transforms/account-claim-map-array.js new file mode 100644 index 000000000..81a5fc31c --- /dev/null +++ b/addons/api/app/transforms/account-claim-map-array.js @@ -0,0 +1 @@ +export { default } from 'api/transforms/account-claim-map-array'; diff --git a/addons/api/mirage/config.js b/addons/api/mirage/config.js index ed5b77368..95bbe9ac7 100644 --- a/addons/api/mirage/config.js +++ b/addons/api/mirage/config.js @@ -81,7 +81,17 @@ export default function () { return authMethods.create(attrs); }); this.get('/auth-methods/:id'); - this.patch('/auth-methods/:id'); + this.patch( + '/auth-methods/:id', + function ({ authMethods }, { params: { id } }) { + const attrs = this.normalizedRequestAttrs(); + if (attrs.type === 'oidc') { + attrs.attributes.state = 'active-public'; + } + + return authMethods.find(id).update(attrs); + } + ); this.del('/auth-methods/:id', ({ authMethods }, { params: { id } }) => { const authMethod = authMethods.find(id); const scope = authMethod.scope; diff --git a/addons/api/package.json b/addons/api/package.json index 7c5836077..5d0bbc2bb 100644 --- a/addons/api/package.json +++ b/addons/api/package.json @@ -31,8 +31,8 @@ "ember-cli-babel": "^7.26.10", "ember-cli-htmlbars": "^6.1.0", "ember-cli-mirage": "^2.2.0", + "ember-copy": "^2.0.1", "ember-data": "^3.20.0", - "ember-data-model-fragments": "5.0.0-beta.2", "ember-fetch": "^8.1.1" }, "devDependencies": { @@ -50,7 +50,6 @@ "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.2", - "ember-copy": "^2.0.1", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.2", diff --git a/addons/api/tests/unit/initializers/fragment-auth-method-attributes-account-claim-map-serializer-test.js b/addons/api/tests/unit/initializers/fragment-auth-method-attributes-account-claim-map-serializer-test.js deleted file mode 100644 index caac46ee2..000000000 --- a/addons/api/tests/unit/initializers/fragment-auth-method-attributes-account-claim-map-serializer-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Application from '@ember/application'; - -import { initialize } from 'dummy/initializers/fragment-auth-method-attributes-account-claim-map-serializer'; -import { module, test } from 'qunit'; -import Resolver from 'ember-resolver'; -import { run } from '@ember/runloop'; - -module( - 'Unit | Initializer | fragment-auth-method-attributes-account-claim-map-serializer', - function (hooks) { - hooks.beforeEach(function () { - this.TestApplication = class TestApplication extends Application {}; - this.TestApplication.initializer({ - name: 'initializer under test', - initialize, - }); - - this.application = this.TestApplication.create({ - autoboot: false, - Resolver, - }); - }); - - hooks.afterEach(function () { - run(this.application, 'destroy'); - }); - - // TODO: Replace this with your real tests. - test('it works', async function (assert) { - await this.application.boot(); - - assert.ok(true); - }); - } -); diff --git a/addons/api/tests/unit/initializers/fragment-string-test.js b/addons/api/tests/unit/initializers/fragment-string-test.js deleted file mode 100644 index 6779bb9ff..000000000 --- a/addons/api/tests/unit/initializers/fragment-string-test.js +++ /dev/null @@ -1,32 +0,0 @@ -import Application from '@ember/application'; - -import { initialize } from 'dummy/initializers/fragment-string'; -import { module, test } from 'qunit'; -import Resolver from 'ember-resolver'; -import { run } from '@ember/runloop'; - -module('Unit | Initializer | fragment-string', function (hooks) { - hooks.beforeEach(function () { - this.TestApplication = class TestApplication extends Application {}; - this.TestApplication.initializer({ - name: 'initializer under test', - initialize, - }); - - this.application = this.TestApplication.create({ - autoboot: false, - Resolver, - }); - }); - - hooks.afterEach(function () { - run(this.application, 'destroy'); - }); - - // TODO: Replace this with your real tests. - test('it works', async function (assert) { - await this.application.boot(); - - assert.ok(true); - }); -}); diff --git a/addons/api/tests/unit/models/fragment-auth-method-attributes-account-claim-map-test.js b/addons/api/tests/unit/models/fragment-auth-method-attributes-account-claim-map-test.js deleted file mode 100644 index 7f87ebe7e..000000000 --- a/addons/api/tests/unit/models/fragment-auth-method-attributes-account-claim-map-test.js +++ /dev/null @@ -1,18 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module( - 'Unit | Model | fragment auth method attributes account claim map', - function (hooks) { - setupTest(hooks); - - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let model = store.createRecord( - 'fragment-auth-method-attributes-account-claim-map', - {} - ); - assert.ok(model); - }); - } -); diff --git a/addons/api/tests/unit/models/fragment-string-test.js b/addons/api/tests/unit/models/fragment-string-test.js deleted file mode 100644 index 7d3c7dcb9..000000000 --- a/addons/api/tests/unit/models/fragment-string-test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Model | fragment string', function (hooks) { - setupTest(hooks); - - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let model = store.createRecord('fragment-string', {}); - assert.ok(model); - }); -}); diff --git a/addons/api/tests/unit/serializers/auth-method-test.js b/addons/api/tests/unit/serializers/auth-method-test.js index 1d9dcc1c5..17043ffba 100644 --- a/addons/api/tests/unit/serializers/auth-method-test.js +++ b/addons/api/tests/unit/serializers/auth-method-test.js @@ -157,16 +157,10 @@ module('Unit | Serializer | auth method', function (hooks) { this.server.get('/v1/auth-methods/oidc123', () => ({ attributes: { account_claim_maps: ['from=to', 'foo=bar'], - claims_scopes: [{ value: 'profile' }, { value: 'email' }], - signing_algorithms: [{ value: 'RS256' }, { value: 'RS384' }], - allowed_audiences: [ - { value: 'www.alice.com' }, - { value: 'www.alice.com/admin' }, - ], - idp_ca_certs: [ - { value: 'certificate-1234' }, - { value: 'certificate-5678' }, - ], + claims_scopes: ['profile', 'email'], + signing_algorithms: ['RS256', 'RS384'], + allowed_audiences: ['www.alice.com', 'www.alice.com/admin'], + idp_ca_certs: ['certificate-1234', 'certificate-5678'], api_url_prefix: apiUrlPrefix, client_id: clientId, client_secret: clientSecret, @@ -181,12 +175,31 @@ module('Unit | Serializer | auth method', function (hooks) { })); const record = await store.findRecord('auth-method', 'oidc123'); - const { account_claim_maps } = record; - - assert.strictEqual(account_claim_maps.firstObject.from, 'from'); - assert.strictEqual(account_claim_maps.firstObject.to, 'to'); - assert.strictEqual(account_claim_maps.lastObject.from, 'foo'); - assert.strictEqual(account_claim_maps.lastObject.to, 'bar'); + const { + account_claim_maps, + claims_scopes, + allowed_audiences, + signing_algorithms, + idp_ca_certs, + } = record; + console.log(record); + assert.deepEqual(account_claim_maps, [ + { from: 'from', to: 'to' }, + { from: 'foo', to: 'bar' }, + ]); + assert.deepEqual(claims_scopes, [{ value: 'profile' }, { value: 'email' }]); + assert.deepEqual(allowed_audiences, [ + { value: 'www.alice.com' }, + { value: 'www.alice.com/admin' }, + ]); + assert.deepEqual(signing_algorithms, [ + { value: 'RS256' }, + { value: 'RS384' }, + ]); + assert.deepEqual(idp_ca_certs, [ + { value: 'certificate-1234' }, + { value: 'certificate-5678' }, + ]); assert.strictEqual(record.api_url_prefix, apiUrlPrefix); assert.strictEqual(record.client_id, clientId); assert.strictEqual(record.client_secret, clientSecret); diff --git a/addons/api/tests/unit/serializers/fragment-string-test.js b/addons/api/tests/unit/serializers/fragment-string-test.js deleted file mode 100644 index 93b0c8397..000000000 --- a/addons/api/tests/unit/serializers/fragment-string-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Serializer | fragment string', function (hooks) { - setupTest(hooks); - - // Replace this with your real tests. - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let serializer = store.serializerFor('fragment-string'); - - assert.ok(serializer); - }); - - test('it serializes records', function (assert) { - let store = this.owner.lookup('service:store'); - let record = store.createRecord('fragment-string', { - value: 'string value', - }); - - let serializedRecord = record.serialize(); - - assert.strictEqual(serializedRecord, 'string value'); - }); - - test('it normalizes records', function (assert) { - assert.expect(1); - const store = this.owner.lookup('service:store'); - const serializer = store.serializerFor('fragment-string'); - const modelClass = store.createRecord('fragment-string').constructor; - const payload = 'string value'; - const normalized = serializer.normalizeSingleResponse( - store, - modelClass, - payload - ); - assert.deepEqual(normalized, { - included: [], - data: { - id: null, - type: 'fragment-string', - attributes: { - value: 'string value', - }, - relationships: {}, - }, - }); - }); -}); diff --git a/addons/api/tests/unit/transforms/account-claim-map-array-test.js b/addons/api/tests/unit/transforms/account-claim-map-array-test.js new file mode 100644 index 000000000..0baf1b9c1 --- /dev/null +++ b/addons/api/tests/unit/transforms/account-claim-map-array-test.js @@ -0,0 +1,26 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Transform | account claim map array', function (hooks) { + setupTest(hooks); + + test('it deserializes an array of account claims', function (assert) { + assert.expect(1); + const transform = this.owner.lookup('transform:account-claim-map-array'); + const deserialized = transform.deserialize(['oid=sub', 'full_name=name']); + assert.deepEqual(deserialized, [ + { from: 'oid', to: 'sub' }, + { from: 'full_name', to: 'name' }, + ]); + }); + + test('it serializes an array of account claims', function (assert) { + assert.expect(1); + const transform = this.owner.lookup('transform:account-claim-map-array'); + const serialized = transform.serialize([ + { from: 'oid', to: 'sub' }, + { from: 'full_name', to: 'name' }, + ]); + assert.deepEqual(serialized, ['oid=sub', 'full_name=name']); + }); +}); diff --git a/addons/rose/addon/helpers/set-from-event.js b/addons/rose/addon/helpers/set-from-event.js index 1fdfbea2e..abf997c0e 100644 --- a/addons/rose/addon/helpers/set-from-event.js +++ b/addons/rose/addon/helpers/set-from-event.js @@ -3,7 +3,7 @@ import { set } from '@ember/object'; export function setFromEvent([context, field]) { // The Ember `set` function is used here because `field` may be in dotted - // notation, refering to nested fields within `context`. + // notation, referring to nested fields within `context`. return (event) => event?.target ? set(context, field, event.target.value) : null; } diff --git a/ui/admin/app/components/form/auth-method/index.hbs b/ui/admin/app/components/form/auth-method/index.hbs index 77cf37d4d..40dd52b64 100644 --- a/ui/admin/app/components/form/auth-method/index.hbs +++ b/ui/admin/app/components/form/auth-method/index.hbs @@ -2,6 +2,7 @@ {{component (concat 'form/auth-method/' @model.type) model=@model + edit=@edit submit=@submit cancel=@cancel removeItemByIndex=@removeItemByIndex diff --git a/ui/admin/app/components/form/auth-method/oidc/index.hbs b/ui/admin/app/components/form/auth-method/oidc/index.hbs index eae4ad4e7..9985dd278 100644 --- a/ui/admin/app/components/form/auth-method/oidc/index.hbs +++ b/ui/admin/app/components/form/auth-method/oidc/index.hbs @@ -1,4 +1,5 @@ i !== index); + authMethod.set(property, array); } /** @@ -179,21 +179,22 @@ export default class ScopesScopeAuthMethodsRoute extends Route { */ @action async addStringItem(authMethod, property, value) { - const array = authMethod.get(property); - array.addObject({ value }); + const existingArray = authMethod[property] ?? []; + const array = [...existingArray, { value }]; + authMethod.set(property, array); } /** * Adds an account claim map fragment to the passed OIDC `authMethod`. * @param {AuthMethodModel} authMethod - * @param {string} property - * @param {string} value + * @param {string} from + * @param {string} to */ @action async addAccountClaimMapItem(authMethod, from, to) { - const array = authMethod.account_claim_maps; - const value = { from, to }; - array.addObject(value); + const existingArray = authMethod.account_claim_maps ?? []; + const array = [...existingArray, { from, to }]; + authMethod.set('account_claim_maps', array); } /** diff --git a/ui/admin/app/routes/scopes/scope/auth-methods/auth-method.js b/ui/admin/app/routes/scopes/scope/auth-methods/auth-method.js index 8cdf8d5b1..f80e83b55 100644 --- a/ui/admin/app/routes/scopes/scope/auth-methods/auth-method.js +++ b/ui/admin/app/routes/scopes/scope/auth-methods/auth-method.js @@ -2,6 +2,7 @@ import Route from '@ember/routing/route'; import { action } from '@ember/object'; import { notifySuccess, notifyError } from 'core/decorators/notify'; import { inject as service } from '@ember/service'; +import { copy } from 'ember-copy'; export default class ScopesScopeAuthMethodsAuthMethodRoute extends Route { // =services @@ -22,6 +23,35 @@ export default class ScopesScopeAuthMethodsAuthMethodRoute extends Route { // =actions + /** + * Copies the contents of string array fields in order to force the instance + * into a dirty state. This ensures that `model.rollbackAttributes()` reverts + * to the original expected array. + * + * The deep copy implemented here is required to ensure that both the + * array itself and its members are all new. + * + * @param {authMethodModel} authMethod + */ + @action + edit(authMethod) { + if (authMethod.claims_scopes) { + authMethod.claims_scopes = copy(authMethod.claims_scopes, true); + } + if (authMethod.signing_algorithms) { + authMethod.signing_algorithms = copy(authMethod.signing_algorithms, true); + } + if (authMethod.allowed_audiences) { + authMethod.allowed_audiences = copy(authMethod.allowed_audiences, true); + } + if (authMethod.idp_ca_certs) { + authMethod.idp_ca_certs = copy(authMethod.idp_ca_certs, true); + } + if (authMethod.account_claim_maps) { + authMethod.account_claim_maps = copy(authMethod.account_claim_maps, true); + } + } + /** * Update state of OIDC auth method * @param {string} state diff --git a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/new.js b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/new.js index 85d0f7ab4..7e30220ec 100644 --- a/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/new.js +++ b/ui/admin/app/routes/scopes/scope/host-catalogs/host-catalog/host-sets/new.js @@ -32,7 +32,8 @@ export default class ScopesScopeHostCatalogsHostCatalogHostSetsNewRoute extends */ @action async addStringItem(hostSet, property, value) { - const array = [...(hostSet.get(property) ?? []), { value }]; + const existingArray = hostSet[property] ?? []; + const array = [...existingArray, { value }]; hostSet.set(property, array); } /** diff --git a/ui/admin/app/templates/scopes/scope/auth-methods/auth-method/index.hbs b/ui/admin/app/templates/scopes/scope/auth-methods/auth-method/index.hbs index 2360f98a6..88a6f3a05 100644 --- a/ui/admin/app/templates/scopes/scope/auth-methods/auth-method/index.hbs +++ b/ui/admin/app/templates/scopes/scope/auth-methods/auth-method/index.hbs @@ -19,6 +19,7 @@