diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index 17781cbc9..60b8dfd78 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -466,6 +466,7 @@ message.delete-attribute-title=Delete Attribute? message.delete-attribute-body=You are requesting to delete a custom attribute. If you complete this process the attribute will be removed. This cannot be undone. Do you wish to continue? message.must-be-unique=Must be unique. +message.must-be-number=Must be a number. message.name-must-be-unique=Name must be unique. message.uri-valid-format=URI must be valid format. message.id-unique=ID must be unique. diff --git a/ui/src/app/form/component/widgets/RadioWidget.js b/ui/src/app/form/component/widgets/RadioWidget.js index 987a88e2e..c92d63e95 100644 --- a/ui/src/app/form/component/widgets/RadioWidget.js +++ b/ui/src/app/form/component/widgets/RadioWidget.js @@ -33,9 +33,6 @@ const RadioWidget = ({ const inline = Boolean(options && options.inline); - - console.log(enumOptions, id); - return ( diff --git a/ui/src/app/metadata/domain/source/SourceDefinition.js b/ui/src/app/metadata/domain/source/SourceDefinition.js index cef3eaba1..f82662a58 100644 --- a/ui/src/app/metadata/domain/source/SourceDefinition.js +++ b/ui/src/app/metadata/domain/source/SourceDefinition.js @@ -1,8 +1,8 @@ -import { defaults } from 'lodash'; +import { defaults, merge, toNumber, uniq } from 'lodash'; import defaultsDeep from 'lodash/defaultsDeep'; import API_BASE_PATH from '../../../App.constant'; import {removeNull} from '../../../core/utility/remove_null'; - +import { updatedDiff, detailedDiff } from 'deep-object-diff'; export const SourceBase = { label: 'Metadata Source', @@ -26,18 +26,6 @@ export const SourceBase = { if (entityIds.indexOf(formData.entityId) > -1) { errors.entityId.addError('message.id-unique'); } - - /*if (!formData?.relyingPartyOverrides?.signAssertion && formData?.relyingPartyOverrides?.dontSignResponse) { - errors = { - ...errors, - relyingPartyOverrides: { - dontSignResponse: { - __errors: ['message.invalid-signing'], - nonBlocking: true - } - } - }; - }*/ return errors; } }, @@ -56,6 +44,27 @@ export const SourceBase = { return warnings; }, + bindings: (original, formData) => { + + let d = { ...formData }; + + if (formData.assertionConsumerServices && formData.assertionConsumerServices.length) { + const { updated, added } = detailedDiff(original.assertionConsumerServices, formData.assertionConsumerServices); + const merged = merge(updated, added); + const changingDefault = Object.keys(merged).some(k => merged[k].hasOwnProperty('makeDefault')); + if (changingDefault) { + const settingToTrue = Object.keys(merged).some(k => merged[k].makeDefault === true); + if (settingToTrue) { + d.assertionConsumerServices = d.assertionConsumerServices.map((s, i) => ({ + ...s, + makeDefault: i === toNumber(Object.keys(merged)[0]) + })); + } + } + } + return d; + }, + uiSchema: { 'ui:order': ['serviceProviderName', '*'], layout: { diff --git a/ui/src/app/metadata/editor/MetadataEditorForm.js b/ui/src/app/metadata/editor/MetadataEditorForm.js index 22689ff8c..1d2b7ecad 100644 --- a/ui/src/app/metadata/editor/MetadataEditorForm.js +++ b/ui/src/app/metadata/editor/MetadataEditorForm.js @@ -8,6 +8,8 @@ import { templates } from '../../form/component'; import { useUiSchema } from '../hooks/schema'; import Alert from 'react-bootstrap/Alert'; +import { updatedDiff } from 'deep-object-diff'; + const invisErrors = ['const', 'oneOf'] function ErrorListTemplate () { @@ -29,6 +31,11 @@ export function MetadataEditorForm({ metadata, definition, schema, current, onCh const transformErrors = (errors) => { return errors.filter(e => invisErrors.indexOf(e.name) === -1); } + + const onFormChange = (form) => { + onChange(definition.bindings ? { ...form, formData: definition.bindings(data, form.formData) }: form); + }; + return ( <> {step.locked &&
@@ -49,8 +56,8 @@ export function MetadataEditorForm({ metadata, definition, schema, current, onCh
}
onChange(form)} + noHtml5Validate={false} + onChange={(form) => onFormChange(form)} onSubmit={() => onSubmit()} schema={schema} uiSchema={uiSchema}