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 (
<>