diff --git a/ui/public/assets/schema/provider/dynamic-http.schema.json b/ui/public/assets/schema/provider/dynamic-http.schema.json index 1969c9ab4..24e77122d 100644 --- a/ui/public/assets/schema/provider/dynamic-http.schema.json +++ b/ui/public/assets/schema/provider/dynamic-http.schema.json @@ -1,11 +1,23 @@ { "type": "object", "required": [ + "name", + "@type", "xmlId", - "metadataURL", "metadataRequestURLConstructionScheme" ], "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string" + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "type": "string", + "const": "DynamicHttpMetadataResolver" + }, "enabled": { "title": "label.enable-provider-upon-saving", "description": "tooltip.enable-provider-upon-saving", @@ -16,7 +28,6 @@ "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "metadataRequestURLConstructionScheme": { @@ -25,6 +36,46 @@ "@type", "content" ], + "dependencies": { + "@type": { + "oneOf": [ + { + "properties": { + "@type": { + "enum": ["Regex"] + }, + "match": { + "title": "label.match", + "description": "tooltip.match", + "type": "string", + "widget": { + "id": "string", + "required": true + } + } + }, + "required": [ + "@type", + "content", + "match" + ] + }, + { + "properties": { + "@type": { + "enum": [ + "MetadataQueryProtocol" + ] + } + }, + "required": [ + "@type", + "content" + ] + } + ] + } + }, "properties": { "@type": { "title": "label.md-request-type", @@ -33,267 +84,101 @@ "widget": { "id": "select" }, - "oneOf": [ - { - "enum": [ - "MetadataQueryProtocol" - ], - "description": "value.md-query-protocol" - }, - { - "enum": [ - "Regex" - ], - "description": "value.regex" - } - ] + "enum": ["MetadataQueryProtocol", "Regex"] }, "content": { "title": "label.md-request-value", "description": "tooltip.md-request-value", "type": "string" - }, - "match": { - "title": "label.match", - "description": "tooltip.match", - "type": "string", - "visibleIf": { - "@type": [ - "Regex" - ] - } } } }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "dynamicMetadataResolverAttributes": { "type": "object", + "dependencies": { + "initializeFromPersistentCacheInBackground": { + "oneOf": [ + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "const": true + }, + "backgroundInitializationFromCacheDelay": { + "title": "label.background-init-from-cache-delay", + "description": "tooltip.background-init-from-cache-delay", + "type": "string", + "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)?)?$" + } + } + }, + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "const": false + } + } + } + ] + } + }, "properties": { "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0.01, - "maximum": 0.99, - "default": null + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 }, "minCacheDuration": { "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "persistentCacheManagerDirectory": { "title": "label.persistent-cache-manager-directory", "description": "tooltip.persistent-cache-manager-directory", "type": "string", - "default": "", "minLength": 1 }, "initializeFromPersistentCacheInBackground": { "title": "label.initialize-from-persistent-cache-in-background", "description": "tooltip.initialize-from-persistent-cache-in-background", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "backgroundInitializationFromCacheDelay": { - "title": "label.background-init-from-cache-delay", - "description": "tooltip.background-init-from-cache-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "visibleIf": { - "initializeFromPersistentCacheInBackground": [ - true - ] - }, - "default": null, - "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)?)?$" + "type": "boolean" } } }, @@ -355,39 +240,18 @@ "disregardTLSCertificate": { "type": "boolean", "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ], - "default": false + "description": "tooltip.disregard-tls-cert" }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -402,14 +266,12 @@ "PT24H" ] }, - "default": null, "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)?)?$" }, "connectionTimeout": { "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -424,14 +286,12 @@ "PT24H" ] }, - "default": null, "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)?)?$" }, "socketTimeout": { "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -446,58 +306,44 @@ "PT24H" ] }, - "default": null, "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)?)?$" }, "tlsTrustEngineRef": { "type": "string", "title": "", "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "widget": "hidden" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "widget": "hidden" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -525,23 +371,18 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", - "default": 0, "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", - "default": 0, "minimum": 0 } } @@ -549,9 +390,11 @@ "metadataFilters": { "title": "", "description": "", - "type": "object", - "properties": { - "RequiredValidUntil": { + "type": "array", + "additionalItems": true, + "items": [ + { + "$id": "RequiredValidUntil", "title": "label.required-valid-until", "type": "object", "widget": { @@ -562,27 +405,12 @@ "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" } } }, - "SignatureValidation": { + { + "$id": "SignatureValidation", "title": "label.signature-validation-filter", "type": "object", "widget": { @@ -592,41 +420,40 @@ "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true + "type": "boolean" }, "certificateFile": { "title": "label.certificate-file", "description": "tooltip.certificate-file", - "type": "string", - "default": "" + "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "enum": [true] + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "enum": [false] + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, - "EntityRoleWhiteList": { + { + "$id": "EntityRoleWhiteList", "title": "label.entity-role-whitelist", "type": "object", "widget": { @@ -661,18 +488,16 @@ "removeRolelessEntityDescriptors": { "title": "label.remove-roleless-entity-descriptors", "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true + "type": "boolean" }, "removeEmptyEntitiesDescriptors": { "title": "label.remove-empty-entities-descriptors", "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true + "type": "boolean" } } } - } + ] } } } \ No newline at end of file diff --git a/ui/public/assets/schema/provider/file-system.schema.json b/ui/public/assets/schema/provider/file-system.schema.json index 122f46cc8..38d0d90e3 100644 --- a/ui/public/assets/schema/provider/file-system.schema.json +++ b/ui/public/assets/schema/provider/file-system.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.service-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -19,34 +19,19 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] + "const": "FilesystemMetadataResolver" }, "xmlId": { "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "metadataFile": { "title": "label.metadata-file", "description": "tooltip.metadata-file", "type": "string", - "default": "", "minLength": 1 }, "enabled": { @@ -58,25 +43,7 @@ "doInitialization": { "title": "label.do-resolver-initialization", "description": "tooltip.do-resolver-initialization", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false + "type": "boolean" }, "reloadableMetadataResolverAttributes": { "type": "object", @@ -85,59 +52,23 @@ "title": "label.min-refresh-delay", "description": "tooltip.min-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxRefreshDelay": { "title": "label.max-refresh-delay", "description": "tooltip.max-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", - "type": "string", - "widget": { - "id": "string", - "help": "message.real-number" - }, - "placeholder": "label.real-number", - "default": "", - "pattern": "^(?:([0]*(\\.[0-9]+)?|[0]*\\.[0-9]*[1-9][0-9]*)|)$" + "type": "number", + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 } } } } -} +} \ No newline at end of file diff --git a/ui/public/assets/schema/provider/filebacked-http.schema.json b/ui/public/assets/schema/provider/filebacked-http.schema.json index 505fe6ebd..7c3984a68 100644 --- a/ui/public/assets/schema/provider/filebacked-http.schema.json +++ b/ui/public/assets/schema/provider/filebacked-http.schema.json @@ -38,21 +38,8 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileBackedHttpMetadataResolver" - ], - "description": "value.file-backed-http-metadata-provider" - } - ] + "const": "FileBackedHttpMetadataResolver" }, "enabled": { "title": "label.enable-service", @@ -77,166 +64,59 @@ "initializeFromBackupFile": { "title": "label.init-from-backup", "description": "tooltip.init-from-backup", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "backingFile": { "title": "label.backing-file", "description": "tooltip.backing-file", - "type": "string", - "default": "" + "type": "string" }, "backupFileInitNextRefreshDelay": { "title": "label.backup-file-init-refresh-delay", "description": "tooltip.backup-file-init-refresh-delay", "type": "string", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "useDefaultPredicateRegistry": { "title": "label.use-default-predicate-reg", "description": "tooltip.use-default-predicate-reg", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "satisfyAnyPredicates": { "$id": "satisfyAnyPredicates", "title": "label.satisfy-any-predicates", "description": "tooltip.satisfy-any-predicates", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false + "type": "boolean" }, "httpMetadataResolverAttributes": { - "$id": "httpMetadataResolverAttributes", "order": [], "type": "object", "fieldsets": [ { - "title": "label.http-connection-attributes", + "title": "label.http-security-attributes", "type": "section", + "class": "col-12", "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" + "disregardTLSCertificate" ] }, { - "title": "label.http-security-attributes", + "title": "label.http-connection-attributes", "type": "section", - "class": "col-12", "fields": [ - "disregardTLSCertificate" + "connectionRequestTimeout", + "connectionTimeout", + "socketTimeout" ] }, { @@ -273,18 +153,21 @@ } ], "properties": { + "disregardTLSCertificate": { + "type": "boolean", + "title": "label.disregard-tls-cert", + "description": "tooltip.disregard-tls-cert" + }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -305,7 +188,6 @@ "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -326,7 +208,6 @@ "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -343,71 +224,42 @@ }, "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)?)?$" }, - "disregardTLSCertificate": { - "type": "boolean", - "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ] - }, "tlsTrustEngineRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -435,21 +287,18 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", "minimum": 0 } } @@ -462,63 +311,25 @@ "title": "label.min-refresh-delay", "description": "tooltip.min-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxRefreshDelay": { "title": "label.max-refresh-delay", "description": "tooltip.max-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 } } }, "metadataFilters": { - "$id": "metadataFilters", "title": "", "description": "", "type": "array", @@ -536,22 +347,6 @@ "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" } } @@ -567,8 +362,7 @@ "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true + "type": "boolean" }, "certificateFile": { "title": "label.certificate-file", @@ -576,29 +370,33 @@ "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "enum": [ + true + ] + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "enum": [ + false + ] + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, { "$id": "EntityRoleWhiteList", @@ -613,37 +411,20 @@ "description": "tooltip.retained-roles", "type": "array", "items": { - "widget": { - "id": "select" - }, - "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } - ] + "enum": ["SPSSODescriptor", "AttributeAuthorityDescriptor"], + "enumNames": ["value.spdescriptor", "value.attr-auth-descriptor"], + "type": "string" } }, "removeRolelessEntityDescriptors": { "title": "label.remove-roleless-entity-descriptors", "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true + "type": "boolean" }, "removeEmptyEntitiesDescriptors": { "title": "label.remove-empty-entities-descriptors", "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true + "type": "boolean" } } } diff --git a/ui/public/assets/schema/provider/local-dynamic.schema.json b/ui/public/assets/schema/provider/local-dynamic.schema.json index 7f465221c..a86dff74b 100644 --- a/ui/public/assets/schema/provider/local-dynamic.schema.json +++ b/ui/public/assets/schema/provider/local-dynamic.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.metadata-provider-name", - "description": "tooltip.metadata-provider-name", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -19,34 +19,19 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] + "const": "LocalDynamicMetadataResolver" }, "xmlId": { "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "sourceDirectory": { "title": "label.source-directory", "description": "tooltip.source-directory", "type": "string", - "default": "", "minLength": 1 }, "enabled": { @@ -55,116 +40,44 @@ "type": "boolean", "default": false }, - "reloadableMetadataResolverAttributes": { + "dynamicMetadataResolverAttributes": { "type": "object", "properties": { "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0, - "maximum": 1, - "default": null + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 }, "minCacheDuration": { "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "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)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -175,11 +88,11 @@ "PT30M", "PT1H", "PT4H", + "PT8H", "PT12H", "PT24H" ] }, - "default": null, "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/provider/metadata-provider.schema.json b/ui/public/assets/schema/provider/metadata-provider.schema.json index 5849ec8d8..24d43a8ab 100644 --- a/ui/public/assets/schema/provider/metadata-provider.schema.json +++ b/ui/public/assets/schema/provider/metadata-provider.schema.json @@ -17,7 +17,6 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", "widget": { "id": "select", diff --git a/ui/public/assets/schema/source/metadata-source.json b/ui/public/assets/schema/source/metadata-source.json index cc5860671..0df4739e8 100644 --- a/ui/public/assets/schema/source/metadata-source.json +++ b/ui/public/assets/schema/source/metadata-source.json @@ -44,32 +44,33 @@ "widget": { "id": "fieldset" }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "x509CertificateAvailable", - "authenticationRequestsSigned", - "wantAssertionsSigned" - ] - }, - { - "type": "group", - "fields": [ - "x509Certificates" + "dependencies": { + "authenticationRequestsSigned": { + "oneOf": [ + { + "properties": { + "authenticationRequestsSigned": { + "const": true + }, + "x509Certificates": { + "minItems": 1 + } + } + }, + { + "properties": { + "authenticationRequestsSigned": { + "const": false + }, + "x509Certificates": { + "minItems": 0 + } + } + } ] } - ], + }, "properties": { - "x509CertificateAvailable": { - "title": "label.is-there-a-x509-certificate", - "description": "tooltip.is-there-a-x509-certificate", - "type": "boolean", - "enumNames": [ - "value.true", - "value.false" - ] - }, "authenticationRequestsSigned": { "title": "label.authentication-requests-signed", "description": "tooltip.authentication-requests-signed", @@ -107,24 +108,11 @@ }, "serviceProviderSsoDescriptor": { "type": "object", - "fieldsets": [ - { - "type": "group", - "fields": [ - "protocolSupportEnum", - "nameIdFormats" - ] - } - ], - "required": [ - "nameIdFormats" - ], "properties": { "protocolSupportEnum": { "title": "label.protocol-support-enumeration", "description": "tooltip.protocol-support-enumeration", "type": "string", - "placeholder": "label.select-protocol", "widget": { "id": "select" }, @@ -146,6 +134,9 @@ "nameIdFormats": { "$ref": "#/definitions/nameIdFormats" } + }, + "dependencies": { + "nameIdFormats": ["protocolSupportEnum"] } }, "logoutEndpoints": { diff --git a/ui/src/app/form/component/templates/ArrayFieldTemplate.js b/ui/src/app/form/component/templates/ArrayFieldTemplate.js index 67e291f59..3163c841a 100644 --- a/ui/src/app/form/component/templates/ArrayFieldTemplate.js +++ b/ui/src/app/form/component/templates/ArrayFieldTemplate.js @@ -136,10 +136,13 @@ const DefaultArrayItem = (props) => { paddingRight: 6, fontWeight: "bold", }; + + const uiSchemaOptions = props.uiSchema ? props.uiSchema['ui:options'] || {} : {}; + return ( -
+
-
{props.children}
+
{props.children}
{props.hasToolbar && (
{(props.hasMoveUp || props.hasMoveDown) && ( @@ -232,18 +235,21 @@ const DefaultFixedArrayFieldTemplate = (props) => { }; const DefaultNormalArrayFieldTemplate = (props) => { + + const showTitle = props.uiSchema.hasOwnProperty("ui:title") ? props.uiSchema["ui:title"] === false && !props.canAdd ? false : true : true; + return (
- + />} {props.canAdd && ( { props.schema.items.type === 'object' || props.schema.items.$ref ? ObjectArrayItem({type: props.uiSchema.type, ...p}) : - DefaultArrayItem({...p }) + DefaultArrayItem({...p, uiSchema: props.uiSchema.items }) )} diff --git a/ui/src/app/form/component/templates/FieldTemplate.js b/ui/src/app/form/component/templates/FieldTemplate.js index 656bba72f..c1228746e 100644 --- a/ui/src/app/form/component/templates/FieldTemplate.js +++ b/ui/src/app/form/component/templates/FieldTemplate.js @@ -12,6 +12,7 @@ export function FieldTemplate ({ displayLabel, rawErrors = [], rawHelp, + help, rawDescription, ...props }) { diff --git a/ui/src/app/form/component/templates/ObjectFieldTemplate.js b/ui/src/app/form/component/templates/ObjectFieldTemplate.js index c658fce6d..a0106f4a1 100644 --- a/ui/src/app/form/component/templates/ObjectFieldTemplate.js +++ b/ui/src/app/form/component/templates/ObjectFieldTemplate.js @@ -3,6 +3,7 @@ import React from "react"; import Container from "react-bootstrap/Container"; import Row from "react-bootstrap/Row"; import Col from "react-bootstrap/Col"; +import Translate from "../../../i18n/components/translate"; const ObjectFieldTemplate = ({ DescriptionField, @@ -14,21 +15,27 @@ const ObjectFieldTemplate = ({ uiSchema, idSchema, schema, - hidden + hidden, + formContext }) => { const displayTitle = (uiSchema["ui:title"] || (title && schema.title)); + console.log(properties); + return ( <> {!hidden && <> {displayTitle && ( + <> +
+ )} {displayTitle && description && ( {uiSchema.layout ? {uiSchema.layout.groups.map((group, rIdx) => ( - - {properties.filter(p => group.fields.indexOf(p.name) > -1).map((element, eIdx) => ( - {element.content} - ))} - + + {properties.some(p => group.fields.indexOf(p.name) > -1) && + + {group.title && } + {properties.filter(p => group.fields.indexOf(p.name) > -1).map((element, eIdx) => ( + {element.content}{console.log(element.content)} + ))} + + } + ))} : properties.map((element, index) => ( diff --git a/ui/src/app/form/component/widgets/OptionWidget.js b/ui/src/app/form/component/widgets/OptionWidget.js index 5a3c27b3c..f053fcd58 100644 --- a/ui/src/app/form/component/widgets/OptionWidget.js +++ b/ui/src/app/form/component/widgets/OptionWidget.js @@ -6,7 +6,8 @@ import { InfoIcon } from "../InfoIcon"; import { Typeahead } from 'react-bootstrap-typeahead'; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faArrowDown, faArrowUp, faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { faArrowDown, faArrowUp, faAsterisk, faCaretDown, faCaretUp } from "@fortawesome/free-solid-svg-icons"; +import { useTranslator } from "../../../i18n/hooks"; const ToggleButton = ({ isOpen, onClick }) => ( ); @@ -45,9 +46,9 @@ const OptionWidget = ({ const _onFocus = ({ target: { value } }) => onFocus(id, value); const inputType = (type || schema.type) === 'string' ? 'text' : `${type || schema.type}`; - const opts = Array.isArray(options) || options.enumOptions ? options : schema.examples ? schema.examples : []; + const opts = Array.isArray(options) || options.enumOptions ? options : schema.examples ? schema.examples : uiSchema.options ? uiSchema.options : []; - console.log(opts); + const translator = useTranslator(); return ( @@ -65,7 +66,7 @@ const OptionWidget = ({ multiple={false} className={`toggle-typeahead ${rawErrors.length > 0 ? "is-invalid" : ""}`} options={opts} - placeholder={uiSchema.placeholder ? uiSchema.placeholder : ''} + placeholder={uiSchema['ui:placeholder'] ? translator(uiSchema['ui:placeholder'] ): ''} disabled={disabled || readonly} onChange={_onChange} onBlur={_onBlur} @@ -78,28 +79,6 @@ const OptionWidget = ({ toggleMenu()} /> )} - - {/**/} - {schema.examples ? ( - - {(schema.examples) - .concat(schema.default ? ([schema.default]) : []) - .map((example) => { - return - ) : null} ); }; diff --git a/ui/src/app/form/component/widgets/SelectWidget.js b/ui/src/app/form/component/widgets/SelectWidget.js index 68e871c24..c250e4da3 100644 --- a/ui/src/app/form/component/widgets/SelectWidget.js +++ b/ui/src/app/form/component/widgets/SelectWidget.js @@ -8,6 +8,7 @@ import Translate from "../../../i18n/components/translate"; import { InfoIcon } from "../InfoIcon"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { useTranslator } from "../../../i18n/hooks"; const { asNumber, guessType } = utils; @@ -64,6 +65,8 @@ const SelectWidget = ({ const emptyValue = multiple ? [] : ""; + const translator = useTranslator(); + function getValue( event, multiple @@ -117,18 +120,13 @@ const SelectWidget = ({ onChange(processValue(schema, newValue)); }}> {!multiple && schema.default === undefined && ( - + + )} + {(enumOptions).map(({ value, label }, i) => + )} - {(enumOptions).map(({ value, label }, i) => { - const disabled = - Array.isArray(enumDisabled) && - (enumDisabled).indexOf(value) != -1; - return ( - - ); - })} ); diff --git a/ui/src/app/form/component/widgets/TextWidget.js b/ui/src/app/form/component/widgets/TextWidget.js index 90168d716..2688a9116 100644 --- a/ui/src/app/form/component/widgets/TextWidget.js +++ b/ui/src/app/form/component/widgets/TextWidget.js @@ -28,7 +28,7 @@ const TextWidget = ({ const _onBlur = ({ target: { value } }) => onBlur(id, value); const _onFocus = ({target: { value }} ) => onFocus(id, value); const inputType = (type || schema.type) === 'string' ? 'text' : `${type || schema.type}`; - + console.log(props) // const classNames = [rawErrors.length > 0 ? "is-invalid" : "", type === 'file' ? 'custom-file-label': ""] return ( diff --git a/ui/src/app/form/component/widgets/UpDownWidget.js b/ui/src/app/form/component/widgets/UpDownWidget.js index 18a42e48e..b8229725d 100644 --- a/ui/src/app/form/component/widgets/UpDownWidget.js +++ b/ui/src/app/form/component/widgets/UpDownWidget.js @@ -5,6 +5,7 @@ import React from "react"; import Form from "react-bootstrap/Form"; import Translate from "../../../i18n/components/translate"; +import { useTranslator } from "../../../i18n/hooks"; import { InfoIcon } from "../InfoIcon"; const UpDownWidget = ({ @@ -18,7 +19,8 @@ const UpDownWidget = ({ onBlur, onFocus, autofocus, - schema + schema, + uiSchema }) => { const _onChange = ({ target: { value }, @@ -29,6 +31,8 @@ const UpDownWidget = ({ target: { value }, }) => onFocus(id, value); + const translator = useTranslator(); + return ( @@ -45,7 +49,9 @@ const UpDownWidget = ({ type="number" disabled={disabled} readOnly={readonly} + placeholder={uiSchema['ui:placeholder'] ? translator(uiSchema['ui:placeholder']) : ''} value={value || value === 0 ? value : ""} + step={schema.multipleOf} onChange={_onChange} onBlur={_onBlur} onFocus={_onFocus} diff --git a/ui/src/app/i18n/components/translate.js b/ui/src/app/i18n/components/translate.js index cbc8b478f..909cc2d74 100644 --- a/ui/src/app/i18n/components/translate.js +++ b/ui/src/app/i18n/components/translate.js @@ -5,7 +5,7 @@ import { useTranslation } from '../hooks'; export function Translate ({ value, params = {} }) { const translated = useTranslation(value, params); - return (<>{translated}) + return (<>{translated || value}) } Translate.propTypes = { diff --git a/ui/src/app/i18n/hooks.js b/ui/src/app/i18n/hooks.js index 4638d5e8d..35b867de8 100644 --- a/ui/src/app/i18n/hooks.js +++ b/ui/src/app/i18n/hooks.js @@ -26,6 +26,11 @@ export function useTranslation (value, interpolated = {}) { return useInterpolatedTranslation(val, interpolated); } +export function useTranslator() { + const messages = useContext(I18nContext); + return (value, interpolated = {}) => translate(getMessage(value, messages), interpolated); +} + export function useInterpolatedTranslation(value, interpolated) { return translate(value, interpolated); } \ No newline at end of file diff --git a/ui/src/app/metadata/component/MetadataConfiguration.js b/ui/src/app/metadata/component/MetadataConfiguration.js index 79acec8c5..441de3935 100644 --- a/ui/src/app/metadata/component/MetadataConfiguration.js +++ b/ui/src/app/metadata/component/MetadataConfiguration.js @@ -11,6 +11,8 @@ export function MetadataConfiguration ({ configuration, onEdit }) { const columns = configuration.dates?.length || 1; const width = usePropertyWidth(columns); + console.log(configuration) + return ( <> { configuration && configuration.sections.map((section, sidx) => diff --git a/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js index 57176a5c6..eac73a10e 100644 --- a/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js @@ -1,29 +1,141 @@ import { metadataFilterProcessor } from './utility/providerFilterProcessor'; +import { DurationOptions } from '../data'; export const BaseProviderDefinition = { schemaPreprocessor: metadataFilterProcessor, parser: (changes) => (changes.metadataFilters ? ({ ...changes, metadataFilters: [ - ...Object.keys(changes.metadataFilters).reduce((collection, filterName) => ([ - ...collection, - { - ...changes.metadataFilters[filterName], - '@type': filterName - } - ]), []) + ...changes.metadataFilters.filter((filter, filterName) => ( + Object.keys(filter).length > 1 + )) ] }) : changes), formatter: (changes) => (changes.metadataFilters ? ({ ...changes, - metadataFilters: { - ...(changes.metadataFilters || []).reduce((collection, filter) => ({ - ...collection, - [filter['@type']]: filter - }), {}) - } + metadataFilters: [ + {}, + {}, + {} + ] }) : changes), uiSchema: { - + name: { + 'ui:help': 'message.must-be-unique' + }, + '@type': { + 'ui:disabled': true + } + } +} + +export const HttpMetadataResolverAttributesSchema = { + layout: { + groups: [ + { + title: 'label.http-security-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + size: 12, + fields: [ + 'disregardTLSCertificate' + ] + }, + { + title: 'label.http-connection-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + size: 12, + fields: [ + 'connectionRequestTimeout', + 'connectionTimeout', + 'socketTimeout' + ] + }, + { + title: 'label.http-proxy-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + size: 12, + fields: [ + 'proxyHost', + 'proxyPort', + 'proxyUser', + 'proxyPassword' + ] + }, + { + title: 'label.http-caching-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + size: 12, + fields: [ + 'httpCaching', + 'httpCacheDirectory', + 'httpMaxCacheEntries', + 'httpMaxCacheEntrySize' + ] + }, + { + classNames: 'd-none', + size: 12, + fields: [ + 'tlsTrustEngineRef', + 'httpClientSecurityParametersRef', + 'httpClientRef' + ] + } + ] + }, + disregardTLSCertificate: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + connectionRequestTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + connectionTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + socketTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + httpClientRef: { + 'ui:widget': 'hidden' + }, + tlsTrustEngineRef: { + 'ui:widget': 'hidden' + }, + httpClientSecurityParametersRef: { + 'ui:widget': 'hidden' + }, + httpMaxCacheEntries: { + 'ui:widget': 'updown' + }, + httpMaxCacheEntrySize: { + 'ui:widget': 'updown' + }, + httpCaching: { + 'ui:placeholder': 'label.select-caching-type' + } +}; + +export const MetadataFilterPluginsSchema = { + 'ui:title': false, + items: { + 'ui:options': { + classNames: 'bg-light border rounded px-4 pt-4 pb-1' + }, + retainedRoles: { + 'ui:options': { + orderable: false + } + } } -} \ No newline at end of file +}; + +// \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js index e1f04b0a1..dfc5365e6 100644 --- a/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js @@ -1,13 +1,16 @@ // import { metadataFilterProcessor } from './utility/providerFilterProcessor'; -import { BaseProviderDefinition } from './BaseProviderDefinition'; -import API_BASE_PATH from "../../../App.constant"; +import { BaseProviderDefinition, HttpMetadataResolverAttributesSchema, MetadataFilterPluginsSchema } from './BaseProviderDefinition'; +import API_BASE_PATH from '../../../App.constant'; +import defaultsDeep from 'lodash/defaultsDeep'; +import { DurationOptions } from '../data'; export const DynamicHttpMetadataProviderWizard = { ...BaseProviderDefinition, label: 'DynamicHttpMetadataProvider', type: 'DynamicHttpMetadataResolver', - schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, + schema: '/assets/schema/provider/dynamic-http.schema.json', + // schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, steps: [ { id: 'common', @@ -48,10 +51,111 @@ export const DynamicHttpMetadataProviderWizard = { 'enabled' ] } - ] + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 9, + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + fields: [ + 'name', + '@type', + 'enabled' + ] + }, + { + size: 9, + fields: [ + 'xmlId', + 'requireValidMetadata', + 'failFastInitialization', + 'metadataRequestURLConstructionScheme' + ] + }, + { + size: 9, + fields: [ + 'dynamicMetadataResolverAttributes' + ], + }, + { + size: 9, + fields: [ + 'metadataFilters' + ], + }, + { + size: 9, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ] + }, + requireValidMetadata: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + failFastInitialization: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + dynamicMetadataResolverAttributes: { + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:options': { + help: 'message.real-number' + }, + 'ui:placeholder': 'label.real-number' + }, + removeIdleEntityData: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + initializeFromPersistentCacheInBackground: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + minCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxIdleEntityData: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + cleanupTaskInterval: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + backgroundInitializationFromCacheDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + } + }, + metadataFilters: MetadataFilterPluginsSchema, + httpMetadataResolverAttributes: HttpMetadataResolverAttributesSchema + }, BaseProviderDefinition.uiSchema), }; - export const DynamicHttpMetadataProviderEditor = { ...DynamicHttpMetadataProviderWizard, steps: [ @@ -127,5 +231,7 @@ export const DynamicHttpMetadataProviderEditor = { 'httpMetadataResolverAttributes' ] } - ] + ], + uiSchema: defaultsDeep({ + }, DynamicHttpMetadataProviderWizard.uiSchema) }; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js index 37e4216b2..1d93696dd 100644 --- a/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js @@ -1,4 +1,7 @@ -import { BaseProviderDefinition } from "./BaseProviderDefinition"; +import defaultsDeep from 'lodash/defaultsDeep'; +import { BaseProviderDefinition, HttpMetadataResolverAttributesSchema, MetadataFilterPluginsSchema } from './BaseProviderDefinition'; + +import { DurationOptions } from '../data'; export const FileBackedHttpMetadataProviderWizard = { ...BaseProviderDefinition, @@ -52,7 +55,111 @@ export const FileBackedHttpMetadataProviderWizard = { 'enabled' ] } - ] + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 9, + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + fields: [ + 'name', + '@type', + 'enabled' + ] + }, + { + size: 9, + fields: [ + 'xmlId', + 'metadataURL', + 'initializeFromBackupFile', + 'backingFile', + 'backupFileInitNextRefreshDelay', + 'requireValidMetadata', + 'failFastInitialization', + 'useDefaultPredicateRegistry', + 'satisfyAnyPredicates', + ] + }, + { + size: 9, + fields: [ + 'reloadableMetadataResolverAttributes' + ], + }, + { + size: 9, + fields: [ + 'metadataFilters' + ], + }, + { + size: 9, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ] + }, + initializeFromBackupFile: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + backupFileInitNextRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + requireValidMetadata: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + useDefaultPredicateRegistry: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + satisfyAnyPredicates: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + failFastInitialization: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + reloadableMetadataResolverAttributes: { + minRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:options': { + help: 'message.real-number', + step: 0.001 + }, + 'ui:placeholder': 'label.real-number' + } + }, + metadataFilters: MetadataFilterPluginsSchema, + httpMetadataResolverAttributes: HttpMetadataResolverAttributesSchema + }, BaseProviderDefinition.uiSchema) }; @@ -110,5 +217,7 @@ export const FileBackedHttpMetadataProviderEditor = { 'httpMetadataResolverAttributes' ] } - ] + ], + uiSchema: defaultsDeep({ + }, FileBackedHttpMetadataProviderWizard.uiSchema) }; diff --git a/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js index 6a06e1d51..229b45bac 100644 --- a/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js @@ -1,11 +1,14 @@ +import defaultsDeep from 'lodash/defaultsDeep'; import API_BASE_PATH from "../../../App.constant"; import { BaseProviderDefinition } from "./BaseProviderDefinition"; +import { DurationOptions } from '../data'; export const FileSystemMetadataProviderWizard = { ...BaseProviderDefinition, label: 'FilesystemMetadataProvider', type: 'FilesystemMetadataResolver', - schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, + schema: '/assets/schema/provider/file-system.schema.json', + // schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, steps: [ { id: 'common', @@ -65,7 +68,61 @@ export const FileSystemMetadataProviderWizard = { } ] } - ] + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 9, + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + fields: [ + 'name', + '@type', + 'enabled' + ] + }, + { + size: 9, + fields: [ + 'xmlId', + 'metadataFile', + 'doInitialization', + ] + }, + { + size: 9, + fields: [ + 'reloadableMetadataResolverAttributes' + ] + } + ] + }, + doInitialization: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + reloadableMetadataResolverAttributes: { + minRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:options': { + help: 'message.real-number' + }, + 'ui:placeholder': 'label.real-number' + } + }, + }, BaseProviderDefinition.uiSchema) }; @@ -133,5 +190,7 @@ export const FileSystemMetadataProviderEditor = { } ] } - ] + ], + uiSchema: defaultsDeep({ + }, FileSystemMetadataProviderWizard.uiSchema) }; diff --git a/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js index e61cfb184..50e15b7ee 100644 --- a/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js +++ b/ui/src/app/metadata/domain/provider/LocalDynamicMetadataProviderDefinition.js @@ -8,15 +8,8 @@ export const LocalDynamicMetadataProviderWizard = { ...BaseProviderDefinition, label: 'LocalDynamicMetadataProvider', type: 'LocalDynamicMetadataResolver', - schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, - uiSchema: { - dynamicMetadataResolverAttributes: { - minCacheDuration: { - 'ui:widget': 'OptionWidget', - options: DurationOptions - } - } - }, + schema: '/assets/schema/provider/local-dynamic.schema.json', + // schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, steps: [ { id: 'common', @@ -74,16 +67,74 @@ export const LocalDynamicMetadataProviderWizard = { } ] } - ] + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 9, + classNames: 'bg-light border rounded px-4 pt-4 pb-1 mb-4', + fields: [ + 'name', + '@type', + 'enabled' + ] + }, + { + size: 9, + fields: [ + 'xmlId', + 'sourceDirectory' + ] + }, + { + size: 9, + fields: [ + 'dynamicMetadataResolverAttributes' + ], + } + ] + }, + dynamicMetadataResolverAttributes: { + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:help': 'message.real-number', + 'ui:placeholder': 'label.real-number' + }, + removeIdleEntityData: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + minCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxIdleEntityData: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + cleanupTaskInterval: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + } + } + }, BaseProviderDefinition.uiSchema) }; export const LocalDynamicMetadataProviderEditor = { ...LocalDynamicMetadataProviderWizard, uiSchema: defaultsDeep({ - '@type': { - 'ui:disabled': true - } }, LocalDynamicMetadataProviderWizard.uiSchema), steps: [ { diff --git a/ui/src/app/metadata/domain/source/SourceDefinition.js b/ui/src/app/metadata/domain/source/SourceDefinition.js index 18b4b55b2..53cb42cd6 100644 --- a/ui/src/app/metadata/domain/source/SourceDefinition.js +++ b/ui/src/app/metadata/domain/source/SourceDefinition.js @@ -10,65 +10,13 @@ export const SourceBase = { validatorParams: [/*getAllOtherIds*/], parse: (data) => { - const parsed = {...data}; - if (parsed?.securityInfo?.x509CertificateAvailable) { - if (!parsed?.securityInfo?.x509Certificates) { - parsed.securityInfo.x509Certificates = []; + if (data?.securityInfo?.x509CertificateAvailable) { + if (!data?.securityInfo?.x509Certificates) { + data.securityInfo.x509Certificates = []; } - parsed.securityInfo.x509Certificates.push({}) + data.securityInfo.x509Certificates.push({}) } - return parsed; - }, - - bindings: { - '/securityInfo/x509CertificateAvailable': [ - { - 'input': (event, property) => { - let available = !property.value, - parent = property.parent, - certs = parent.getProperty('x509Certificates'); - if (available && !certs.value.length) { - certs.setValue([ - { - name: '', - type: 'both', - value: '' - } - ], true); - } - - if (!available && certs.value.length > 0) { - certs.setValue([], true); - } - } - } - ], - '/assertionConsumerServices/*/makeDefault': [ - { - 'input': (event, property) => { - let parent = property.parent.parent; - let props = parent.properties; - props.forEach(prop => { - if (prop !== property) { - prop.setValue({ - ...prop.value, - makeDefault: false - }, false); - } - }); - } - } - ] - }, - - parser: (changes, schema) => { - if (!schema || !schema.properties) { - return changes; - } - if (schema.properties.hasOwnProperty('organization') && !changes.organization) { - changes.organization = {}; - } - return changes; + return data; }, formatter: (changes, schema) => { @@ -235,6 +183,9 @@ export const SourceBase = { } }, serviceProviderSsoDescriptor: { + protocolSupportEnum: { + 'ui:placeholder': 'label.select-protocol' + }, nameIdFormats: { "ui:options": { orderable: false @@ -250,16 +201,10 @@ export const SourceBase = { { size: 6, fields: [ - 'x509CertificateAvailable', 'authenticationRequestsSigned', - 'wantAssertionsSigned' - ], - }, - { - size: 6, - fields: [ + 'wantAssertionsSigned', 'x509Certificates' - ] + ], } ] }, diff --git a/ui/src/app/metadata/editor/MetadataEditor.js b/ui/src/app/metadata/editor/MetadataEditor.js index d10f9c54a..56c852208 100644 --- a/ui/src/app/metadata/editor/MetadataEditor.js +++ b/ui/src/app/metadata/editor/MetadataEditor.js @@ -13,19 +13,23 @@ export function MetadataEditor () { const { type, id, section } = useParams(); - const [current, setCurrent] = React.useState({}); - - React.useEffect(() => { - setCurrent({}); - }, []); - - const metadata = React.useContext(MetadataObjectContext); + const base = React.useContext(MetadataObjectContext); const definition = React.useContext(MetadataDefinitionContext); const schema = React.useContext(MetadataSchemaContext); const [invalid, setInvalid] = React.useState(false); const [saving, setSaving] = React.useState(false); + const [updates, setUpdates] = React.useState(base); + + const onChange = (updates) => { + setUpdates(definition.parser(updates)); + }; + + React.useEffect(() => { + setUpdates(base); + }, [base]); + const save = () => { console.log('save!'); }; @@ -36,13 +40,13 @@ export function MetadataEditor () { return (
-
+
  - Edit metadata {type} - {metadata.serviceProviderName || metadata.name} + Edit metadata {type} - {base.serviceProviderName || base.name}
@@ -92,7 +96,7 @@ export function MetadataEditor () {
- +
diff --git a/ui/src/app/metadata/editor/MetadataEditorForm.js b/ui/src/app/metadata/editor/MetadataEditorForm.js index 20e885950..34cf03c68 100644 --- a/ui/src/app/metadata/editor/MetadataEditorForm.js +++ b/ui/src/app/metadata/editor/MetadataEditorForm.js @@ -6,21 +6,27 @@ import { fields, widgets } from '../../form/component'; import { templates } from '../../form/component'; import { useUiSchema } from '../hooks/schema'; -export function MetadataEditorForm ({ metadata, definition, schema, current }) { +export function MetadataEditorForm ({ metadata, definition, schema, current, onChange }) { const uiSchema = useUiSchema(definition, schema, current); const [data, setData] = React.useState(metadata); - React.useEffect(() => setData(metadata), [metadata]); + React.useEffect(() => setData(metadata), [metadata, definition]); const onSubmit = () => {}; + const [context, setContext] = React.useState(definition.steps.find(s => s.id === current)); + + React.useEffect(() => { + setContext(definition.steps.find(s => s.id === current)) + }, [current, definition]); + return ( <>
setData(definition.parse(formData)) } + onChange={({ formData }) => setData(formData) } onSubmit={() => onSubmit()} schema={schema} uiSchema={uiSchema} @@ -28,10 +34,19 @@ export function MetadataEditorForm ({ metadata, definition, schema, current }) { ObjectFieldTemplate={templates.ObjectFieldTemplate} ArrayFieldTemplate={templates.ArrayFieldTemplate} fields={ fields } - widgets={widgets}> + widgets={widgets} + liveValidate={true} + formContext={context}> <>
-
{JSON.stringify(data, null, 4)}
+
+
+
{JSON.stringify(data, null, 4)}
+
+
+
{JSON.stringify(schema, null, 4)}
+
+
); } \ No newline at end of file diff --git a/ui/src/app/metadata/hooks/configuration.js b/ui/src/app/metadata/hooks/configuration.js index da0ba0c28..2095766bd 100644 --- a/ui/src/app/metadata/hooks/configuration.js +++ b/ui/src/app/metadata/hooks/configuration.js @@ -14,6 +14,8 @@ export const getLimitedConfigurationsFn = (configurations, limited) => { export function useMetadataConfiguration(models, schema, definition, limited = false) { + console.log(models, schema, definition) + if (!models || !schema || !definition) { return {}; } diff --git a/ui/src/app/metadata/hooks/schema.js b/ui/src/app/metadata/hooks/schema.js index 263bc8bbe..8318ac39b 100644 --- a/ui/src/app/metadata/hooks/schema.js +++ b/ui/src/app/metadata/hooks/schema.js @@ -32,8 +32,8 @@ export function useUiSchema(definition, schema, current) { } -export function useMetadataSchema(schema) { - return schema; +export function useMetadataSchema(definition, schema) { + return definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema; } export * from './utility'; \ No newline at end of file diff --git a/ui/src/theme/project/forms.scss b/ui/src/theme/project/forms.scss index 4b9c67712..75428b7b0 100644 --- a/ui/src/theme/project/forms.scss +++ b/ui/src/theme/project/forms.scss @@ -88,7 +88,11 @@ select.form-control:disabled { } .toggle-typeahead { - padding-right: 36px; + padding-right: 34px; + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } } .toggle-button { @@ -99,6 +103,7 @@ select.form-control:disabled { border-bottom-left-radius: 0; border-top-left-radius: 0; background: white; + border: 1px solid #ced4da; } @media only screen and (max-width: 1200px) { diff --git a/ui/src/theme/project/index.scss b/ui/src/theme/project/index.scss index f630af154..48b875785 100644 --- a/ui/src/theme/project/index.scss +++ b/ui/src/theme/project/index.scss @@ -87,6 +87,10 @@ nav.navbar { display: none; } +.d-empty-none:empty { + display: none; +} + @media only screen and (min-width: 1024px) { .pad-content { padding: 0 3rem;