From c45c1f23b2e766d45244800d55937df3e708441c Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Fri, 18 Nov 2022 12:49:45 -0700 Subject: [PATCH] Added labels, cleanup, bug fixes --- .../dynamic-registration.schema.json | 70 +++++++++---------- .../main/resources/i18n/messages.properties | 53 ++++++++------ ui/package-lock.json | 21 ++++++ ui/package.json | 1 + ui/src/app/admin/component/AccessRequest.js | 5 +- ui/src/app/admin/container/UserActions.js | 4 +- ui/src/app/core/components/Header.js | 19 ++++- ui/src/app/dashboard/view/ActionsTab.js | 4 +- .../dashboard/view/DynamicRegistrationsTab.js | 19 ++++- ui/src/app/dashboard/view/ProvidersTab.js | 14 ++++ ui/src/app/dashboard/view/SourcesTab.js | 14 ++++ .../component/DynamicRegistrationForm.js | 11 +-- .../component/DynamicRegistrationList.js | 13 ++-- .../hoc/DynamicConfigurationDefinition.js | 19 +++-- .../hoc/DynamicRegistrationActions.js | 11 ++- .../view/DynamicRegistrationCreate.js | 34 +++++---- .../view/DynamicRegistrationDetail.js | 2 - .../view/DynamicRegistrationEdit.js | 4 +- ui/src/app/form/Schema.js | 4 +- .../domain/provider/component/ProviderList.js | 7 ++ .../domain/source/component/SourceList.js | 7 ++ .../source/definition/SourceDefinition.js | 2 - ui/src/app/store/user/CurrentUserSlice.js | 1 - 23 files changed, 226 insertions(+), 113 deletions(-) diff --git a/backend/src/main/resources/dynamic-registration.schema.json b/backend/src/main/resources/dynamic-registration.schema.json index ce4916e75..a1e8819c5 100644 --- a/backend/src/main/resources/dynamic-registration.schema.json +++ b/backend/src/main/resources/dynamic-registration.schema.json @@ -13,8 +13,8 @@ "maxLength": 255 }, "redirectUris": { - "title": "label.redirect-uris", - "description": "tooltip.redirect-uris", + "title": "label.dynamic-registration-redirectUris", + "description": "tooltip.dynamic-registration-redirectUris", "type": "string", "minLength": 1, "maxLength": 255 @@ -30,74 +30,70 @@ "type": "boolean" }, "applicationType": { - "title": "label.application-type", - "description": "tooltip.application-type", + "title": "label.dynamic-registration-applicationType", + "description": "tooltip.dynamic-registration-applicationType", "type": "string" }, "contacts": { - "title": "label.contacts", - "description": "tooltip.contacts", + "title": "label.dynamic-registration-contacts", + "description": "tooltip.dynamic-registration-contacts", "type": "string" }, "grantType": { - "title": "label.grant-type", - "description": "tooltip.grant-type", + "title": "label.dynamic-registration-grantTypes", + "description": "tooltip.dynamic-registration-grantTypes", "type": "string", "minLength": 1, - "oneOf": [ - { - "enum": ["authorization_code"], - "description": "value.authorization-code" - }, - { - "enum": ["implicit"], - "description": "value.implicit" - }, - { - "enum": ["refresh_token"], - "description": "value.refresh-token" - } + "enum": [ + "authorization_code", + "implicit", + "refresh_token" + ], + "enumNames": [ + "value.authorization-code", + "value.implicit", + "value.refresh-token" ] }, "jwks": { - "title": "label.jwks", - "description": "tooltip.jwks", + "title": "label.dynamic-registration-jwks", + "description": "label.dynamic-registration-jwks", "type": "string" }, "logoUri": { - "title": "label.logo-uri", - "description": "tooltip.logo-uri", + "title": "label.dynamic-registration-logo-uri", + "description": "tooltip.dynamic-registration-logo-uri", "type": "string" }, "policyUri": { - "title": "label.policy-uri", - "description": "tooltip.policy-uri", + "title": "label.dynamic-registration-policy-uri", + "description": "tooltip.dynamic-registration-policy-uri", "type": "string" }, "responseTypes": { - "title": "label.response-types", - "description": "tooltip.response-types", + "title": "label.dynamic-registration-responseTypes", + "description": "tooltip.dynamic-registration-responseTypes", "type": "string" }, "scope": { - "title": "label.scope", - "description": "tooltip.scope", + "title": "label.dynamic-registration-scope", + "description": "tooltip.dynamic-registration-scope", "type": "string" }, "subjectType": { - "title": "label.subject-type", - "description": "tooltip.subject-type", + "title": "label.dynamic-registration-subjectType", + "description": "tooltip.dynamic-registration-subjectType", "type": "string" }, "tokenEndpointAuthMethod": { - "title": "label.token-endpoint-auth-method", - "description": "tooltip.token-endpoint-auth-method", + "title": "label.dynamic-registration-tokenEndpointAuthMethod", + "description": "tooltip.dynamic-registration-tokenEndpointAuthMethod", "type": "string" }, "tosUri": { - "title": "label.tos-uri", - "description": "tooltip.tos-uri", + "title": "label.dynamic-registration-tosuri", + "description": "tooltip.dynamic-registration-tosuri", "type": "string" } } diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index c6a8bbeda..435d3dc16 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -962,39 +962,50 @@ tooltip.IDTokenLifetime=Lifetime of ID token issued to client tooltip.deniedUserInfoAttributes=Specifies IdPAttributes to omit from UserInfo token tooltip.resolveAttributes.oauth=Whether to run the attribute resolution/filtering step -label.dynamic-registration=Dynamic Registration +label.dynamic-registration=Dynamic registration label.dynamic-registration-configuration=Dynamic Registration action.dynamic-registrations=Dynamic registrations action.add-new-dynamic-registration=Add a new dynamic registration label.dynamic-registration-name=Name +label.current-dynamic-registrations=Current dynamic registrations +label.new-dynamic-registration=New dynamic registration +label.edit-dynamic-registration=Edit dynamic registration +message.delete-dynamic-registration-title=Delete dynamic registration? +message.delete-dynamic-registration-body=You are requesting to delete a dynamic registration. If you complete this process the role will be removed. This cannot be undone. Do you wish to continue? +label.enable-dynamic-registrations=Enable Dynamic Registrations +label.approve-dynamic-registrations=Approve Dynamic Registrations label.dynamic-registration-name=Name tooltip.dynamic-registration-name=Name -label.dynamic-registration-redirectUris=Redirect uris -tooltip.dynamic-registration-redirectUris=Redirect uris -label.dynamic-registration-responseTypes=Response types -tooltip.dynamic-registration-responseTypes=Response types -label.dynamic-registration-grantTypes=Grant types -tooltip.dynamic-registration-grantTypes=Grant types -label.dynamic-registration-applicationType=Application type -tooltip.dynamic-registration-applicationType=Application type +label.dynamic-registration-redirectUris=Redirect Uris +tooltip.dynamic-registration-redirectUris=Redirect Uris +label.dynamic-registration-responseTypes=Response Types +tooltip.dynamic-registration-responseTypes=Response Types +label.dynamic-registration-grantTypes=Grant Types +tooltip.dynamic-registration-grantTypes=Grant Types +label.dynamic-registration-applicationType=Application Type +tooltip.dynamic-registration-applicationType=Application Type label.dynamic-registration-contacts=Contacts tooltip.dynamic-registration-contacts=Contacts -label.dynamic-registration-subjectType=Subject type -tooltip.dynamic-registration-subjectType=Subject type +label.dynamic-registration-subjectType=Subject Type +tooltip.dynamic-registration-subjectType=Subject Type label.dynamic-registration-jwks=Jwks tooltip.dynamic-registration-jwks=Jwks -label.dynamic-registration-jwksUri=Jwks uri -tooltip.dynamic-registration-jwksUri=Jwks uri -label.dynamic-registration-tokenEndpointAuthMethod=Token endpoint auth method -tooltip.dynamic-registration-tokenEndpointAuthMethod=Token endpoint auth method -label.dynamic-registration-logo-uri=Logo uri -tooltip.dynamic-registration-logo-uri=Logo uri -label.dynamic-registration-policy-uri=Policy uri -tooltip.dynamic-registration-policy-uri=Policy uri -label.dynamic-registration-tosuri=To uri -tooltip.dynamic-registration-tosuri=To uri +label.dynamic-registration-jwksUri=Jwks Uri +tooltip.dynamic-registration-jwksUri=Jwks Uri +label.dynamic-registration-tokenEndpointAuthMethod=Token Endpoint Auth Method +tooltip.dynamic-registration-tokenEndpointAuthMethod=Token Endpoint Auth Method +label.dynamic-registration-logo-uri=Logo Uri +tooltip.dynamic-registration-logo-uri=Logo Uri +label.dynamic-registration-policy-uri=Policy Uri +tooltip.dynamic-registration-policy-uri=Policy Uri +label.dynamic-registration-tosuri=TOS Uri +tooltip.dynamic-registration-tosuri=TOS Uri label.dynamic-registration-scope=Scope tooltip.dynamic-registration-scope=Scope label.dynamic-registration-enabled=Enabled tooltip.dynamic-registration-enabled=Enabled + +value.authorization-code=Authorization Code +value.implicit=Implicit +value.refresh-token=Refresh Token \ No newline at end of file diff --git a/ui/package-lock.json b/ui/package-lock.json index 1731bb9b1..a48e78b9d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@fortawesome/fontawesome-free": "^6.1.1", "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", @@ -2495,6 +2496,18 @@ "node": ">=6" } }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz", + "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.2.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-regular-svg-icons": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz", @@ -21016,6 +21029,14 @@ "@fortawesome/fontawesome-common-types": "6.2.1" } }, + "@fortawesome/free-brands-svg-icons": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz", + "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.2.1" + } + }, "@fortawesome/free-regular-svg-icons": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz", diff --git a/ui/package.json b/ui/package.json index fd9a03526..34554c706 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,6 +6,7 @@ "dependencies": { "@fortawesome/fontawesome-free": "^6.1.1", "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", diff --git a/ui/src/app/admin/component/AccessRequest.js b/ui/src/app/admin/component/AccessRequest.js index c3a3e730c..64d57a6b5 100644 --- a/ui/src/app/admin/component/AccessRequest.js +++ b/ui/src/app/admin/component/AccessRequest.js @@ -4,14 +4,13 @@ import Form from 'react-bootstrap/Form'; import Translate from '../../i18n/components/translate'; export function AccessRequest({ users, roles, onDeleteUser, onChangeUserRole }) { - return ( <> {(!users || !users.length) ? <>
-
-

There are no new user requests at this time.

+
+

There are no new user requests at this time.

diff --git a/ui/src/app/admin/container/UserActions.js b/ui/src/app/admin/container/UserActions.js index f7924c750..f00c1fcb8 100644 --- a/ui/src/app/admin/container/UserActions.js +++ b/ui/src/app/admin/container/UserActions.js @@ -2,9 +2,9 @@ import React from 'react'; import { AccessRequest } from '../../admin/component/AccessRequest'; import UserManagement from '../../admin/container/UserManagement'; -export function UserActions({ users, reloadUsers }) { +export function UserActions({ users }) { return ( - + {(u, roles, onChangeUserRole, onChangeGroup, onDeleteUser) => } diff --git a/ui/src/app/core/components/Header.js b/ui/src/app/core/components/Header.js index 8c4398f56..691d0478a 100644 --- a/ui/src/app/core/components/Header.js +++ b/ui/src/app/core/components/Header.js @@ -7,7 +7,22 @@ import Dropdown from 'react-bootstrap/Dropdown'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faTh, faSignOutAlt, faPlusCircle, faCube, faCubes, faUsersCog, faSpinner, faUserCircle, faCog, faBoxOpen, faTags, faIdBadge, faFileLines } from '@fortawesome/free-solid-svg-icons'; +import { + faTh, + faSignOutAlt, + faPlusCircle, + faCube, + faCubes, + faUsersCog, + faSpinner, + faUserCircle, + faCog, + faBoxOpen, + faTags, + faIdBadge, + faFileLines +} from '@fortawesome/free-solid-svg-icons'; +import { faOpenid } from '@fortawesome/free-brands-svg-icons'; import Translate from '../../i18n/components/translate'; import { useTranslator } from '../../i18n/hooks'; @@ -64,7 +79,7 @@ export function Header () { } - + diff --git a/ui/src/app/dashboard/view/ActionsTab.js b/ui/src/app/dashboard/view/ActionsTab.js index 96daf8535..99e4a0fd2 100644 --- a/ui/src/app/dashboard/view/ActionsTab.js +++ b/ui/src/app/dashboard/view/ActionsTab.js @@ -13,8 +13,6 @@ import Spinner from '../../core/components/Spinner'; import Translate from '../../i18n/components/translate'; import SourceList from '../../metadata/domain/source/component/SourceList'; import { ProtectRoute } from '../../core/components/ProtectRoute'; - - import { DynamicRegistrationList } from '../../dynamic-registration/component/DynamicRegistrationList'; import { useGetNewUsersQuery } from '../../store/user/UserSlice'; import { useGetDisabledSourcesQuery, useGetUnapprovedSourcesQuery } from '../../store/metadata/SourceSlice'; @@ -24,7 +22,7 @@ import { useGetUnapprovedRegistrationsQuery } from '../../store/dynamic-registration/DynamicRegistrationSlice'; -export function ActionsTab({ registrations }) { +export function ActionsTab() { const { path, url } = useRouteMatch(); diff --git a/ui/src/app/dashboard/view/DynamicRegistrationsTab.js b/ui/src/app/dashboard/view/DynamicRegistrationsTab.js index 7a299da31..1888301a6 100644 --- a/ui/src/app/dashboard/view/DynamicRegistrationsTab.js +++ b/ui/src/app/dashboard/view/DynamicRegistrationsTab.js @@ -7,6 +7,10 @@ import { useGetDynamicRegistrationsQuery } from '../../store/dynamic-registration/DynamicRegistrationSlice'; import { DynamicRegistrationActions } from '../../dynamic-registration/hoc/DynamicRegistrationActions'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { Link } from 'react-router-dom'; +import Spinner from '../../core/components/Spinner'; +import { faOpenid } from '@fortawesome/free-brands-svg-icons'; const searchProps = ['name']; @@ -33,7 +37,20 @@ export function DynamicRegistrationsTab () { loading={loading} onDelete={(id) => remove({id})} onEnable={(id, enabled) => enable({id, enabled}) } - onChangeGroup={(registration, group) => changeGroup({ registration, group })}/> + onChangeGroup={(registration, group) => changeGroup({ registration, group })}> + {loading &&
} + {(!searched || !searched.length) && +
+
+

No Dynamic Registrations found.

+ + + + +
+
+ } + }
diff --git a/ui/src/app/dashboard/view/ProvidersTab.js b/ui/src/app/dashboard/view/ProvidersTab.js index a8627ab5d..9d78ad2fc 100644 --- a/ui/src/app/dashboard/view/ProvidersTab.js +++ b/ui/src/app/dashboard/view/ProvidersTab.js @@ -9,6 +9,9 @@ import { useIsAdmin } from '../../core/user/UserContext'; import Alert from 'react-bootstrap/Alert'; import { MetadataActions } from '../../admin/container/MetadataActions'; import Spinner from '../../core/components/Spinner'; +import { Link } from 'react-router-dom'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faCube } from '@fortawesome/free-solid-svg-icons'; const searchProps = ['name', '@type', 'createdBy']; export function ProvidersTab () { @@ -57,6 +60,17 @@ export function ProvidersTab () { onOrderUp={onOrderUp} onOrderDown={onOrderDown}> {loading &&
} + {(!searched || !searched.length) && +
+
+

No Metadata Providers found.

+ + + + +
+
+ } } diff --git a/ui/src/app/dashboard/view/SourcesTab.js b/ui/src/app/dashboard/view/SourcesTab.js index d997cb4ba..b21e789a3 100644 --- a/ui/src/app/dashboard/view/SourcesTab.js +++ b/ui/src/app/dashboard/view/SourcesTab.js @@ -7,6 +7,9 @@ import { Search } from '../component/Search'; import { Spinner } from '../../core/components/Spinner'; import { useChangeSourceGroupMutation, useGetSourcesQuery } from '../../store/metadata/SourceSlice'; +import { Link } from 'react-router-dom'; +import { faCube } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; const searchProps = ['serviceProviderName', 'entityId', 'createdBy', 'protocol']; @@ -35,6 +38,17 @@ export function SourcesTab () { onEnable={(s, e) => enable(s, e) } onChangeGroup={changeSourceGroup}> {loading &&
} + {(!searched || !searched.length) && +
+
+

No Metadata Sources found.

+ + + + +
+
+ } } diff --git a/ui/src/app/dynamic-registration/component/DynamicRegistrationForm.js b/ui/src/app/dynamic-registration/component/DynamicRegistrationForm.js index 1590d23be..8bde3862a 100644 --- a/ui/src/app/dynamic-registration/component/DynamicRegistrationForm.js +++ b/ui/src/app/dynamic-registration/component/DynamicRegistrationForm.js @@ -7,6 +7,9 @@ import Translate from '../../i18n/components/translate'; import { FormContext, setFormDataAction, setFormErrorAction } from '../../form/FormManager'; import { useDynamicRegistrationUiSchema, useDynamicRegistrationValidator } from '../api'; +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; + export function DynamicRegistrationForm ({registration = {}, errors = [], loading = false, schema, onSave, onCancel}) { @@ -39,8 +42,8 @@ export function DynamicRegistrationForm ({registration = {}, errors = [], loadin
-
-
+ +
onChange(form)} @@ -50,8 +53,8 @@ export function DynamicRegistrationForm ({registration = {}, errors = [], loadin liveValidate={true}> <>
-
-
+ + ) } diff --git a/ui/src/app/dynamic-registration/component/DynamicRegistrationList.js b/ui/src/app/dynamic-registration/component/DynamicRegistrationList.js index 18ffba499..a3562a99d 100644 --- a/ui/src/app/dynamic-registration/component/DynamicRegistrationList.js +++ b/ui/src/app/dynamic-registration/component/DynamicRegistrationList.js @@ -27,13 +27,6 @@ export function DynamicRegistrationList ({entities, children, onChangeGroup, onD {(limited) =>
- {!limited || !limited.length ? -
-
-

No Dynamic Registrations found.

-
-
- : @@ -146,6 +139,12 @@ export function DynamicRegistrationList ({entities, children, onChangeGroup, onD
+ { !limited?.length && !children && +
+
+

No Dynamic Registrations found.

+
+
}
} diff --git a/ui/src/app/dynamic-registration/hoc/DynamicConfigurationDefinition.js b/ui/src/app/dynamic-registration/hoc/DynamicConfigurationDefinition.js index 1a37c1af5..a160a10a4 100644 --- a/ui/src/app/dynamic-registration/hoc/DynamicConfigurationDefinition.js +++ b/ui/src/app/dynamic-registration/hoc/DynamicConfigurationDefinition.js @@ -12,7 +12,7 @@ export const DynamicRegistrationDefinition = { 'name', 'redirectUris', 'responseTypes', - 'grantTypes', + 'grantType', 'applicationType', 'contacts', 'subjectType', @@ -34,22 +34,31 @@ export const DynamicRegistrationDefinition = { { sizes: { xs: 12, - lg: 12 + lg: 6 }, classNames: '', fields: [ 'name', 'redirectUris', 'responseTypes', - 'grantTypes', 'applicationType', 'contacts', + 'logoUri', + 'policyUri', + ] + }, + { + sizes: { + xs: 12, + lg: 6 + }, + classNames: '', + fields: [ + 'grantType', 'subjectType', 'jwks', 'jwksUri', 'tokenEndpointAuthMethod', - 'logoUri', - 'policyUri', 'tosUri', 'scope' ] diff --git a/ui/src/app/dynamic-registration/hoc/DynamicRegistrationActions.js b/ui/src/app/dynamic-registration/hoc/DynamicRegistrationActions.js index ce1d89420..69a266490 100644 --- a/ui/src/app/dynamic-registration/hoc/DynamicRegistrationActions.js +++ b/ui/src/app/dynamic-registration/hoc/DynamicRegistrationActions.js @@ -1,4 +1,5 @@ import React, { Fragment, useMemo } from 'react'; +import { useHistory } from 'react-router'; import { DeleteConfirmation } from '../../core/components/DeleteConfirmation'; import { @@ -10,9 +11,9 @@ import { export function DynamicRegistrationActions ({ children }) { - // const toast = useCallback((message, type) => dispatch(createNotificationAction(message, type)), [dispatch]); + const history = useHistory(); - const [remove] = useDeleteDynamicRegistrationMutation(); + const [remove, {isSuccess: isDeleteSuccess}] = useDeleteDynamicRegistrationMutation(); const [approve] = useApproveDynamicRegistrationMutation(); const [enable] = useEnableDynamicRegistrationMutation(); const [changeGroup] = useChangeDynamicRegistrationGroupMutation(); @@ -25,6 +26,12 @@ export function DynamicRegistrationActions ({ children }) { changeGroup }), [remove, approve, enable, changeGroup]); + React.useEffect(() => { + if (isDeleteSuccess) { + history.push('/dashboard/dynamic-registration'); + } + }, [isDeleteSuccess, history]); + return ( {(block) => diff --git a/ui/src/app/dynamic-registration/view/DynamicRegistrationCreate.js b/ui/src/app/dynamic-registration/view/DynamicRegistrationCreate.js index b8e34676b..5d707e32a 100644 --- a/ui/src/app/dynamic-registration/view/DynamicRegistrationCreate.js +++ b/ui/src/app/dynamic-registration/view/DynamicRegistrationCreate.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {Fragment} from 'react'; import { Prompt, useHistory } from 'react-router-dom'; import Translate from '../../i18n/components/translate'; @@ -7,31 +7,28 @@ import { FormManager } from '../../form/FormManager'; import { DynamicRegistrationForm } from '../component/DynamicRegistrationForm'; import DynamicConfigurationDefinition from '../hoc/DynamicConfigurationDefinition'; import { useCreateDynamicRegistrationMutation } from '../../store/dynamic-registration/DynamicRegistrationSlice'; +import Spinner from '../../core/components/Spinner'; export function DynamicRegistrationCreate () { const history = useHistory(); - const [create] = useCreateDynamicRegistrationMutation(); + const [create, {isSuccess, isLoading: loading}] = useCreateDynamicRegistrationMutation(); - async function save(reg) { - const resp = await create(reg); - if (resp.ok) { - gotoDetail({ refresh: true }); - } - }; - - const cancel = () => { - gotoDetail(); - }; - - const gotoDetail = (state = null) => { + const save = React.useCallback(async (registration) => await create({registration}), [create]); + + const gotoDetail = React.useCallback((state = null) => { setBlocking(false); history.push(`/dashboard/dynamic-registration`, state); - }; + }, [history]); + + React.useEffect(() => { + if (isSuccess) { + gotoDetail({ refresh: true }); + } + }, [isSuccess, gotoDetail]) const [blocking, setBlocking] = React.useState(false); - const [loading, setLoading] = React.useState(false); return (
@@ -51,7 +48,7 @@ export function DynamicRegistrationCreate () {
- {(schema) => + {(schema, loadingSchema) => {(data, errors) => <> @@ -61,7 +58,8 @@ export function DynamicRegistrationCreate () { schema={schema} loading={loading} onSave={(data) => save(data)} - onCancel={() => cancel()} /> + onCancel={() => gotoDetail()} /> + { loadingSchema &&
}
}
}
diff --git a/ui/src/app/dynamic-registration/view/DynamicRegistrationDetail.js b/ui/src/app/dynamic-registration/view/DynamicRegistrationDetail.js index 82c4091b1..ec6c17b90 100644 --- a/ui/src/app/dynamic-registration/view/DynamicRegistrationDetail.js +++ b/ui/src/app/dynamic-registration/view/DynamicRegistrationDetail.js @@ -22,8 +22,6 @@ export function DynamicRegistrationDetail () { const history = useHistory(); const { data: detail } = useSelectDynamicRegistrationQuery({id}); - - const redirectOnDelete = () => history.push('/dashboard/dynamic-registration'); const edit = (section) => { history.push(`/dynamic-registration/${id}/edit`); diff --git a/ui/src/app/dynamic-registration/view/DynamicRegistrationEdit.js b/ui/src/app/dynamic-registration/view/DynamicRegistrationEdit.js index 8f7034d86..87705c2a7 100644 --- a/ui/src/app/dynamic-registration/view/DynamicRegistrationEdit.js +++ b/ui/src/app/dynamic-registration/view/DynamicRegistrationEdit.js @@ -7,6 +7,7 @@ import { FormManager } from '../../form/FormManager'; import { DynamicRegistrationForm } from '../component/DynamicRegistrationForm'; import DynamicConfigurationDefinition from '../hoc/DynamicConfigurationDefinition'; import { useSelectDynamicRegistrationQuery, useUpdateDynamicRegistrationMutation } from '../../store/dynamic-registration/DynamicRegistrationSlice'; +import Spinner from '../../core/components/Spinner'; export function DynamicRegistrationEdit () { @@ -53,7 +54,7 @@ export function DynamicRegistrationEdit () {
- {(schema) => + {(schema, loadingSchema) => {(data, errors) => <> @@ -64,6 +65,7 @@ export function DynamicRegistrationEdit () { loading={loading} onSave={(registration) => update({ id: registration.resourceId, registration })} onCancel={() => cancel()} /> + { loadingSchema &&
}
}
}
diff --git a/ui/src/app/form/Schema.js b/ui/src/app/form/Schema.js index 92aefe325..13321349a 100644 --- a/ui/src/app/form/Schema.js +++ b/ui/src/app/form/Schema.js @@ -6,7 +6,7 @@ export function Schema({ path, children }) { const [schema, setSchema] = React.useState({}); - const { get, response } = useFetch(path, { + const { get, response, loading } = useFetch(path, { cachePolicy: 'no-cache' }); @@ -20,5 +20,5 @@ export function Schema({ path, children }) { /*eslint-disable react-hooks/exhaustive-deps*/ React.useEffect(() => { loadSchema() }, []); - return (<>{children(schema)}); + return (<>{children(schema, loading)}); } \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/component/ProviderList.js b/ui/src/app/metadata/domain/provider/component/ProviderList.js index 08188dba0..10f034c5e 100644 --- a/ui/src/app/metadata/domain/provider/component/ProviderList.js +++ b/ui/src/app/metadata/domain/provider/component/ProviderList.js @@ -92,6 +92,13 @@ export function ProviderList({ children, entities, reorder = true, first, last, )} + { !limited?.length && !children && +
+
+

No Metadata Providers found.

+
+
+ }
}
diff --git a/ui/src/app/metadata/domain/source/component/SourceList.js b/ui/src/app/metadata/domain/source/component/SourceList.js index 16cff09ed..b1f4078a3 100644 --- a/ui/src/app/metadata/domain/source/component/SourceList.js +++ b/ui/src/app/metadata/domain/source/component/SourceList.js @@ -151,6 +151,13 @@ export default function SourceList({ entities, onDelete, onEnable, onApprove, on + { !limited?.length && !children && +
+
+

No Metadata Sources found.

+
+
+ } } diff --git a/ui/src/app/metadata/domain/source/definition/SourceDefinition.js b/ui/src/app/metadata/domain/source/definition/SourceDefinition.js index 3178dc805..9296d0aba 100644 --- a/ui/src/app/metadata/domain/source/definition/SourceDefinition.js +++ b/ui/src/app/metadata/domain/source/definition/SourceDefinition.js @@ -76,8 +76,6 @@ export const SourceBase = { const obj = { ...merged[k] }; return obj.hasOwnProperty('makeDefault'); }); - - if (changingDefault) { const settingToTrue = Object.keys(merged).some(k => merged[k].makeDefault === true); diff --git a/ui/src/app/store/user/CurrentUserSlice.js b/ui/src/app/store/user/CurrentUserSlice.js index 66c4968dc..6b2a162df 100644 --- a/ui/src/app/store/user/CurrentUserSlice.js +++ b/ui/src/app/store/user/CurrentUserSlice.js @@ -15,7 +15,6 @@ export const CurrentUserAdminApi = createApi({ export const { useGetUsersQuery, - useGetNewUsersQuery, useRemoveUserMutation, useSetUserGroupRequestMutation, useSetUserRoleRequestMutation