diff --git a/ui/public/assets/schema/provider/dynamic-http.schema.json b/ui/public/assets/schema/provider/dynamic-http.schema.json index a0a815c86..f4f96fe4b 100644 --- a/ui/public/assets/schema/provider/dynamic-http.schema.json +++ b/ui/public/assets/schema/provider/dynamic-http.schema.json @@ -42,7 +42,9 @@ { "properties": { "@type": { - "enum": ["Regex"] + "enum": [ + "Regex" + ] }, "match": { "title": "label.match", @@ -84,7 +86,10 @@ "widget": { "id": "select" }, - "enum": ["MetadataQueryProtocol", "Regex"] + "enum": [ + "MetadataQueryProtocol", + "Regex" + ] }, "content": { "title": "label.md-request-value", @@ -311,14 +316,12 @@ "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "widget": "hidden" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "widget": "hidden" + "description": "" }, "proxyHost": { "type": "string", @@ -388,6 +391,7 @@ } }, "metadataFilters": { + "$id": "metadataFilters", "title": "", "description": "", "type": "array", @@ -480,8 +484,14 @@ "id": "select" }, "type": "string", - "enum": ["SPSSODescriptor", "AttributeAuthorityDescriptor"], - "enumNames": ["value.spdescriptor", "value.attr-auth-descriptor"] + "enum": [ + "SPSSODescriptor", + "AttributeAuthorityDescriptor" + ], + "enumNames": [ + "value.spdescriptor", + "value.attr-auth-descriptor" + ] } }, "removeRolelessEntityDescriptors": { diff --git a/ui/public/assets/schema/provider/filebacked-http.schema.json b/ui/public/assets/schema/provider/filebacked-http.schema.json index 5940a8794..a85d1e400 100644 --- a/ui/public/assets/schema/provider/filebacked-http.schema.json +++ b/ui/public/assets/schema/provider/filebacked-http.schema.json @@ -51,14 +51,12 @@ "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "metadataURL": { "title": "label.metadata-url", "description": "tooltip.metadata-url", "type": "string", - "default": "", "minLength": 1 }, "initializeFromBackupFile": { @@ -99,59 +97,9 @@ "type": "boolean" }, "httpMetadataResolverAttributes": { + "$id": "httpMetadataResolverAttributes", "order": [], "type": "object", - "fieldsets": [ - { - "title": "label.http-security-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "disregardTLSCertificate" - ] - }, - { - "title": "label.http-connection-attributes", - "type": "section", - "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" - ] - }, - { - "title": "label.http-proxy-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "proxyHost", - "proxyPort", - "proxyUser", - "proxyPassword" - ] - }, - { - "title": "label.http-caching-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "httpCaching", - "httpCacheDirectory", - "httpMaxCacheEntries", - "httpMaxCacheEntrySize" - ] - }, - { - "title": "", - "type": "hidden", - "class": "col-12", - "fields": [ - "tlsTrustEngineRef", - "httpClientSecurityParametersRef", - "httpClientRef" - ] - } - ], "properties": { "disregardTLSCertificate": { "type": "boolean", @@ -227,14 +175,12 @@ "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "widget": "hidden" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "widget": "hidden" + "description": "" }, "proxyHost": { "type": "string", @@ -330,6 +276,7 @@ } }, "metadataFilters": { + "$id": "metadataFilters", "title": "", "description": "", "type": "array", diff --git a/ui/public/assets/schema/provider/local-dynamic.schema.json b/ui/public/assets/schema/provider/local-dynamic.schema.json index a86dff74b..be547ae24 100644 --- a/ui/public/assets/schema/provider/local-dynamic.schema.json +++ b/ui/public/assets/schema/provider/local-dynamic.schema.json @@ -78,21 +78,6 @@ "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT8H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } diff --git a/ui/public/assets/schema/source/metadata-source.json b/ui/public/assets/schema/source/metadata-source.json index 0df4739e8..a35ccbb45 100644 --- a/ui/public/assets/schema/source/metadata-source.json +++ b/ui/public/assets/schema/source/metadata-source.json @@ -136,7 +136,9 @@ } }, "dependencies": { - "nameIdFormats": ["protocolSupportEnum"] + "nameIdFormats": [ + "protocolSupportEnum" + ] } }, "logoutEndpoints": { diff --git a/ui/src/app/form/component/templates/FieldTemplate.js b/ui/src/app/form/component/templates/FieldTemplate.js index fea2b4831..1e2b8f7eb 100644 --- a/ui/src/app/form/component/templates/FieldTemplate.js +++ b/ui/src/app/form/component/templates/FieldTemplate.js @@ -1,7 +1,6 @@ import React from "react"; import Form from "react-bootstrap/Form"; -import ListGroup from "react-bootstrap/ListGroup"; import {Translate} from '../../../i18n/components/translate'; @@ -25,19 +24,6 @@ export function FieldTemplate ({ {children}
- {rawErrors.length > 0 && ( - - {rawErrors.map((error, i) => { - return ( - 0 ? 'sr-only' : ''}`}> - - {error} - - - ); - })} - - )} {rawHelp && rawErrors.length < 1 && ( 0 ? "text-danger" : "text-muted"} id={id}> diff --git a/ui/src/app/form/component/widgets/OptionWidget.js b/ui/src/app/form/component/widgets/OptionWidget.js index 370396c99..d5e2c4fd0 100644 --- a/ui/src/app/form/component/widgets/OptionWidget.js +++ b/ui/src/app/form/component/widgets/OptionWidget.js @@ -1,6 +1,8 @@ import React from "react"; +import ListGroup from "react-bootstrap/ListGroup"; import Form from "react-bootstrap/Form"; + import Translate from "../../../i18n/components/translate"; import { InfoIcon } from "../InfoIcon"; @@ -51,6 +53,13 @@ const OptionWidget = ({ const translator = useTranslator(); + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + return ( 0 ? "text-danger" : ""}`}> @@ -70,7 +79,7 @@ const OptionWidget = ({ placeholder={uiSchema['ui:placeholder'] ? translator(uiSchema['ui:placeholder'] ): ''} disabled={disabled || readonly} onChange={_onChange} - onBlur={_onBlur} + onBlur={onCustomBlur} onFocus={_onFocus} filterBy={(option, props) => true} renderMenuItemChildren={(option, {options, text}, index) => { @@ -80,6 +89,19 @@ const OptionWidget = ({ toggleMenu()} disabled={disabled || readonly} /> )} + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} ); }; diff --git a/ui/src/app/form/component/widgets/SelectWidget.js b/ui/src/app/form/component/widgets/SelectWidget.js index c250e4da3..c38388e8c 100644 --- a/ui/src/app/form/component/widgets/SelectWidget.js +++ b/ui/src/app/form/component/widgets/SelectWidget.js @@ -1,6 +1,7 @@ import React from "react"; import Form from "react-bootstrap/Form"; +import ListGroup from "react-bootstrap/ListGroup"; import { utils } from "@rjsf/core"; @@ -81,6 +82,8 @@ const SelectWidget = ({ } } + const [touched, setTouched] = React.useState(false); + return ( 0 ? "text-danger" : ""}`}> @@ -106,6 +109,7 @@ const SelectWidget = ({ ((event) => { const newValue = getValue(event, multiple); onBlur(id, processValue(schema, newValue)); + setTouched(true); }) } onFocus={ @@ -128,6 +132,19 @@ const SelectWidget = ({ )} + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} ); }; diff --git a/ui/src/app/form/component/widgets/TextWidget.js b/ui/src/app/form/component/widgets/TextWidget.js index e9da932ce..08343905f 100644 --- a/ui/src/app/form/component/widgets/TextWidget.js +++ b/ui/src/app/form/component/widgets/TextWidget.js @@ -1,8 +1,10 @@ +import React from "react"; import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React from "react"; +import ListGroup from "react-bootstrap/ListGroup"; import Form from "react-bootstrap/Form"; + import Translate from "../../../i18n/components/translate"; import { InfoIcon } from "../InfoIcon"; @@ -71,6 +73,19 @@ const TextWidget = ({ })} ) : null} + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} ); }; diff --git a/ui/src/app/form/component/widgets/TextareaWidget.js b/ui/src/app/form/component/widgets/TextareaWidget.js index 4b593df1b..e9b2003f3 100644 --- a/ui/src/app/form/component/widgets/TextareaWidget.js +++ b/ui/src/app/form/component/widgets/TextareaWidget.js @@ -1,7 +1,8 @@ +import React from "react"; import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React from "react"; +import ListGroup from "react-bootstrap/ListGroup"; import Form from "react-bootstrap/Form"; import FormControl from "react-bootstrap/FormControl"; import InputGroup from "react-bootstrap/InputGroup"; @@ -36,6 +37,13 @@ const TextareaWidget = ({ target: { value }, }) => onFocus(id, value); + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + return ( <> 0 ? "text-danger" : ""}`}> @@ -57,10 +65,23 @@ const TextareaWidget = ({ autoFocus={autofocus} rows={options.rows || 5} onChange={_onChange} - onBlur={_onBlur} + onBlur={onCustomBlur} onFocus={_onFocus} /> + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} ); }; diff --git a/ui/src/app/form/component/widgets/UpDownWidget.js b/ui/src/app/form/component/widgets/UpDownWidget.js index b8229725d..4394a070f 100644 --- a/ui/src/app/form/component/widgets/UpDownWidget.js +++ b/ui/src/app/form/component/widgets/UpDownWidget.js @@ -1,7 +1,9 @@ +import React from "react"; + import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React from "react"; +import ListGroup from "react-bootstrap/ListGroup"; import Form from "react-bootstrap/Form"; import Translate from "../../../i18n/components/translate"; @@ -20,7 +22,8 @@ const UpDownWidget = ({ onFocus, autofocus, schema, - uiSchema + uiSchema, + rawErrors = [] }) => { const _onChange = ({ target: { value }, @@ -33,6 +36,13 @@ const UpDownWidget = ({ const translator = useTranslator(); + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + return ( @@ -53,9 +63,22 @@ const UpDownWidget = ({ value={value || value === 0 ? value : ""} step={schema.multipleOf} onChange={_onChange} - onBlur={_onBlur} + onBlur={onCustomBlur} onFocus={_onFocus} /> + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} ); }; diff --git a/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js index a8f304121..73950a97b 100644 --- a/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js @@ -1,7 +1,5 @@ -// import { metadataFilterProcessor } from './utility/providerFilterProcessor'; - import { BaseProviderDefinition, HttpMetadataResolverAttributesSchema, MetadataFilterPluginsSchema } from './BaseProviderDefinition'; -// import API_BASE_PATH from '../../../App.constant'; +import API_BASE_PATH from '../../../App.constant'; import defaultsDeep from 'lodash/defaultsDeep'; import { DurationOptions } from '../data'; @@ -9,8 +7,7 @@ export const DynamicHttpMetadataProviderWizard = { ...BaseProviderDefinition, label: 'DynamicHttpMetadataProvider', type: 'DynamicHttpMetadataResolver', - schema: '/assets/schema/provider/dynamic-http.schema.json', - // schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, + schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, steps: [ ...BaseProviderDefinition.steps, { diff --git a/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js index 7c72764e0..db0816397 100644 --- a/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js @@ -1,5 +1,5 @@ import defaultsDeep from 'lodash/defaultsDeep'; -// import API_BASE_PATH from "../../../App.constant"; +import API_BASE_PATH from "../../../App.constant"; import { BaseProviderDefinition } from "./BaseProviderDefinition"; import { DurationOptions } from '../data'; @@ -7,8 +7,7 @@ export const FileSystemMetadataProviderWizard = { ...BaseProviderDefinition, label: 'FilesystemMetadataProvider', type: 'FilesystemMetadataResolver', - schema: '/assets/schema/provider/file-system.schema.json', - // schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, + schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, steps: [ ...BaseProviderDefinition.steps, { diff --git a/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js index 94635ddfc..9a49fe955 100644 --- a/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js @@ -1,6 +1,6 @@ import defaultsDeep from 'lodash/defaultsDeep'; -// import API_BASE_PATH from "../../../App.constant"; +import API_BASE_PATH from "../../../App.constant"; import {DurationOptions} from '../data'; import { BaseProviderDefinition } from "./BaseProviderDefinition"; @@ -8,8 +8,7 @@ export const LocalDynamicMetadataProviderWizard = { ...BaseProviderDefinition, label: 'LocalDynamicMetadataProvider', type: 'LocalDynamicMetadataResolver', - schema: '/assets/schema/provider/local-dynamic.schema.json', - // schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, + schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, steps: [ ...BaseProviderDefinition.steps, { diff --git a/ui/src/app/metadata/domain/source/SourceDefinition.js b/ui/src/app/metadata/domain/source/SourceDefinition.js index 493658213..2891ef3bf 100644 --- a/ui/src/app/metadata/domain/source/SourceDefinition.js +++ b/ui/src/app/metadata/domain/source/SourceDefinition.js @@ -1,6 +1,6 @@ import { defaults } from 'lodash'; import defaultsDeep from 'lodash/defaultsDeep'; -// import API_BASE_PATH from '../../../App.constant'; +import API_BASE_PATH from '../../../App.constant'; import {removeNull} from '../../../core/utility/remove_null'; @@ -8,8 +8,7 @@ export const SourceBase = { label: 'Metadata Source', type: '@MetadataProvider', steps: [], - schema: `/assets/schema/source/metadata-source.json`, - //${API_BASE_PATH}/ui/MetadataSources + schema: `${API_BASE_PATH}/ui/MetadataSources`, validatorParams: [/*getAllOtherIds*/], parser: (data) => removeNull(data, true), @@ -23,10 +22,7 @@ export const SourceBase = { const sources = current ? data.filter(s => s.id !== current.id) : data; const entityIds = sources.map(s => s.entityId); - console.log(sources); - return (formData, errors) => { - console.log(formData) if (entityIds.indexOf(formData.entityId) > -1) { errors.entityId.addError('message.id-unique'); } diff --git a/ui/src/app/metadata/wizard/MetadataSourceWizard.js b/ui/src/app/metadata/wizard/MetadataSourceWizard.js index c8e500061..529ecb32f 100644 --- a/ui/src/app/metadata/wizard/MetadataSourceWizard.js +++ b/ui/src/app/metadata/wizard/MetadataSourceWizard.js @@ -61,6 +61,8 @@ export function MetadataSourceWizard ({ onShowNav }) { const validator = definition.validator(data); + console.log(errors, loading) + return ( <>