@@ -162,7 +155,7 @@ export function CopySource({ copy, onNext }) {
|
onSelect(item, checked)}
diff --git a/ui/src/app/metadata/domain/provider/component/ProviderList.js b/ui/src/app/metadata/domain/provider/component/ProviderList.js
index 3e559eb2a..9a9ac90d4 100644
--- a/ui/src/app/metadata/domain/provider/component/ProviderList.js
+++ b/ui/src/app/metadata/domain/provider/component/ProviderList.js
@@ -12,88 +12,92 @@ import { Scroller } from '../../../../dashboard/component/Scroller';
import { useIsAdmin } from '../../../../core/user/UserContext';
import { useTranslator } from '../../../../i18n/hooks';
-export function ProviderList({ entities, reorder = true, first, last, onEnable, onOrderUp, onOrderDown }) {
+export function ProviderList({ children, entities, reorder = true, first, last, onEnable, onOrderUp, onOrderDown }) {
const isAdmin = useIsAdmin();
const translator = useTranslator();
return (
-
- {(limited) =>
-
-
-
- | Order |
- Title |
- Provider Type |
- Author |
- Created Date |
- Enabled |
-
-
-
- {limited.map((provider, idx) =>
-
-
-
- {reorder ?
- {idx + 1}
+
+
+ {(limited) =>
+
+
+
+ | Order |
+ Title |
+ Provider Type |
+ Author |
+ Created Date |
+ Enabled |
+
+
+
+ {limited.map((provider, idx) =>
+
+
+
+ {reorder ?
+ {idx + 1}
+ :
+ —
+ }
+
+
+
+
+ |
+
+ {provider.name}
+ |
+ { provider['@type'] } |
+ { provider.createdBy } |
+ |
+
+
+ {onEnable && isAdmin ?
+ onEnable(provider, checked)}
+ checked={provider.enabled}
+ >
+
:
- —
+
+
+
}
-
-
-
-
- |
-
- {provider.name}
- |
- { provider['@type'] } |
- { provider.createdBy } |
- |
-
-
- {onEnable && isAdmin ?
- onEnable(provider, checked)}
- checked={provider.enabled}
- >
-
- :
-
-
-
- }
-
- |
-
- )}
-
-
-
- }
-
+
+ |
+
+ )}
+
+
+
+ }
+
+ {children}
+
+
);
}
diff --git a/ui/src/app/metadata/domain/source/component/SourceList.js b/ui/src/app/metadata/domain/source/component/SourceList.js
index 109396c2c..8e8a10825 100644
--- a/ui/src/app/metadata/domain/source/component/SourceList.js
+++ b/ui/src/app/metadata/domain/source/component/SourceList.js
@@ -16,14 +16,15 @@ import { useTranslator } from '../../../../i18n/hooks';
import { useCanEnable, useIsAdmin } from '../../../../core/user/UserContext';
import { GroupsProvider } from '../../../../admin/hoc/GroupsProvider';
-export default function SourceList({ entities, onDelete, onEnable, onChangeGroup }) {
+export default function SourceList({ entities, onDelete, onEnable, onChangeGroup, children }) {
const translator = useTranslator();
const isAdmin = useIsAdmin();
const canEnable = useCanEnable();
return (
-
+
+
{(limited) =>
@@ -124,6 +125,9 @@ export default function SourceList({ entities, onDelete, onEnable, onChangeGroup
}
-
+
+ {children}
+
+
);
}
diff --git a/ui/src/app/metadata/domain/source/definition/SourceDefinition.js b/ui/src/app/metadata/domain/source/definition/SourceDefinition.js
index a448d2d03..41d409907 100644
--- a/ui/src/app/metadata/domain/source/definition/SourceDefinition.js
+++ b/ui/src/app/metadata/domain/source/definition/SourceDefinition.js
@@ -6,6 +6,7 @@ import API_BASE_PATH from '../../../../App.constant';
import {removeNull} from '../../../../core/utility/remove_null';
import { detailedDiff } from 'deep-object-diff';
import isNil from 'lodash/isNil';
+import { useMetadataSchemaContext } from '../../../hoc/MetadataSchema';
export const SourceBase = {
label: 'Metadata Source',
@@ -534,4 +535,35 @@ export const SourceWizard = {
fields: []
}
]
+}
+
+export const sections = [
+ { i18nKey: 'organizationInformation', property: 'organization' },
+ { i18nKey: 'contacts', property: 'contacts' },
+ { i18nKey: 'uiMduiInfo', property: 'mdui' },
+ { i18nKey: 'spSsoDescriptorInfo', property: 'serviceProviderSsoDescriptor' },
+ { i18nKey: 'logoutEndpoints', property: 'logoutEndpoints' },
+ { i18nKey: 'securityDescriptorInfo', property: 'securityInfo' },
+ { i18nKey: 'assertionConsumerServices', property: 'assertionConsumerServices' },
+ { i18nKey: 'relyingPartyOverrides', property: 'relyingPartyOverrides' },
+ { i18nKey: 'attributeRelease', property: 'attributeRelease' }
+];
+
+export function useMetadataSourceSections() {
+ const schema = useMetadataSchemaContext();
+
+ const keys = Object.keys(schema.properties);
+ const properties = sections.map((s) => s.property);
+
+ const reduced = keys.reduce(
+ (collection, key) => {
+ if (properties.indexOf(key) > -1) {
+ collection.push(sections.find(s => s.property === key));
+ }
+ return collection;
+ },
+ []
+ );
+
+ return reduced;
}
\ No newline at end of file
diff --git a/ui/src/app/metadata/hoc/MetadataSchema.js b/ui/src/app/metadata/hoc/MetadataSchema.js
index 025e7a415..ea14361d9 100644
--- a/ui/src/app/metadata/hoc/MetadataSchema.js
+++ b/ui/src/app/metadata/hoc/MetadataSchema.js
@@ -5,10 +5,12 @@ import { useTranslator } from '../../i18n/hooks';
export const MetadataSchemaContext = React.createContext();
export const MetadataDefinitionContext = React.createContext();
+export const MetadataSchemaLoading = React.createContext();
export function MetadataSchema({ type, children, wizard = false }) {
const definition = React.useMemo(() => wizard ? getWizard(type) : getDefinition(type), [type, wizard]);
+ const [loading, setLoading] = React.useState(false);
const { get, response } = useFetch(``, {
cachePolicy: 'no-cache'
@@ -21,19 +23,23 @@ export function MetadataSchema({ type, children, wizard = false }) {
if (response.ok) {
setSchema(source);
}
+ setLoading(false);
}
/*eslint-disable react-hooks/exhaustive-deps*/
React.useEffect(() => {
setSchema(null);
loadSchema(definition);
+ setLoading(true);
}, [definition]);
return (
{type && definition && schema &&
-
- {children}
+
+
+ {children}
+
}
@@ -44,6 +50,10 @@ export function useMetadataSchemaContext () {
return React.useContext(MetadataSchemaContext);
}
+export function useMetadataSchemaLoading () {
+ return React.useContext(MetadataSchemaLoading);
+}
+
export function useMetadataDefinitionContext() {
return React.useContext(MetadataDefinitionContext);
}
diff --git a/ui/src/app/metadata/hoc/MetadataVersionsLoader.js b/ui/src/app/metadata/hoc/MetadataVersionsLoader.js
index 025cea743..d957903d9 100644
--- a/ui/src/app/metadata/hoc/MetadataVersionsLoader.js
+++ b/ui/src/app/metadata/hoc/MetadataVersionsLoader.js
@@ -4,12 +4,15 @@ import { getMetadataPath } from '../hooks/api';
import API_BASE_PATH from '../../App.constant';
import useFetch from 'use-http';
import { last } from 'lodash';
+import Spinner from '../../core/components/Spinner';
export function MetadataVersionsLoader ({versions, children}) {
const ref = React.useRef({});
const [list, setList] = React.useState({});
+ const [loading, setLoading] = React.useState(false);
+
const { type, id } = useParams();
const { get, response } = useFetch(`/${API_BASE_PATH}${getMetadataPath(type)}/${id}/Versions`, {
@@ -22,6 +25,8 @@ export function MetadataVersionsLoader ({versions, children}) {
addToList(v, l);
if (last(versions) !== v) {
loadNext(versions[versions.indexOf(v) + 1]);
+ } else {
+ setLoading(false);
}
}
}
@@ -36,14 +41,19 @@ export function MetadataVersionsLoader ({versions, children}) {
function loadNext (v) {
loadVersion(v);
+
}
/*eslint-disable react-hooks/exhaustive-deps*/
React.useEffect(() => {
loadNext(versions[0]);
+ setLoading(true);
}, [versions]);
- return (
- {children(versions.map(v => list[v]).filter(v => !!v))}
- );
+ return (
+
+ {loading && }
+ {children(versions.map(v => list[v]).filter(v => !!v))}
+
+ );
}
\ No newline at end of file
diff --git a/ui/src/app/metadata/new/NewProvider.js b/ui/src/app/metadata/new/NewProvider.js
index e181747b8..9a9b87ad7 100644
--- a/ui/src/app/metadata/new/NewProvider.js
+++ b/ui/src/app/metadata/new/NewProvider.js
@@ -7,7 +7,7 @@ import { MetadataProviderTypeSelector } from '../wizard/MetadataProviderTypeSele
export function NewProvider() {
- const { data = [] } = useMetadataProviderTypes({}, []);
+ const { data = [], loading } = useMetadataProviderTypes({}, []);
return (
@@ -20,7 +20,7 @@ export function NewProvider() {
-
+
{(data, onRestart) =>
{
return versions.sort((a, b) => {
@@ -107,16 +108,13 @@ export function MetadataHistory () {
)}
+ {loading && }
>
}
- {loading &&
-
- Loading...
- }
>
);
}
\ No newline at end of file
diff --git a/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js b/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js
index 09260c018..ff16b61a4 100644
--- a/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js
+++ b/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js
@@ -41,14 +41,14 @@ export function MetadataFilterTypeSelector({ types = [], children, actions}) {
-
-
+
+
-
+
{types.map(t => )}
diff --git a/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js b/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js
index fbc890fb9..e53f06b13 100644
--- a/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js
+++ b/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js
@@ -1,5 +1,5 @@
import React from 'react';
-import { faArrowCircleRight, faSpinner } from '@fortawesome/free-solid-svg-icons';
+import { faArrowCircleRight, faAsterisk, faSpinner } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { useForm } from 'react-hook-form';
@@ -10,11 +10,11 @@ import { InfoIcon } from '../../form/component/InfoIcon';
import { useTranslator } from '../../i18n/hooks';
import { useMetadataProviders } from '../hooks/api';
-export function MetadataProviderTypeSelector({ type, types = [], children}) {
+export function MetadataProviderTypeSelector({ type, types = [], loading, children}) {
const translator = useTranslator();
- const { data = [], loading } = useMetadataProviders({cachePolicy: 'no-cache'}, []);
+ const { data = [] } = useMetadataProviders({cachePolicy: 'no-cache'}, []);
const [showSelector, setShowSelector] = React.useState(true);
@@ -81,7 +81,10 @@ export function MetadataProviderTypeSelector({ type, types = [], children}) {
-
+
+
+
+
+
{loading && }
diff --git a/ui/src/app/metadata/wizard/MetadataProviderWizard.js b/ui/src/app/metadata/wizard/MetadataProviderWizard.js
index 7193c0573..72df681fd 100644
--- a/ui/src/app/metadata/wizard/MetadataProviderWizard.js
+++ b/ui/src/app/metadata/wizard/MetadataProviderWizard.js
@@ -2,7 +2,7 @@ import React from 'react';
import { WizardNav } from './WizardNav';
import { MetadataWizardForm } from './MetadataWizardForm';
import { setWizardIndexAction, useCurrentIndex, useIsLastPage, useWizardDispatcher } from './Wizard';
-import { useMetadataDefinitionContext, useMetadataDefinitionValidator, useMetadataSchemaContext } from '../hoc/MetadataSchema';
+import { useMetadataDefinitionContext, useMetadataDefinitionValidator, useMetadataSchemaContext, useMetadataSchemaLoading } from '../hoc/MetadataSchema';
import { checkChanges, useMetadataSchema } from '../hooks/schema';
import { useMetadataFormDispatcher, setFormDataAction, setFormErrorAction, useMetadataFormData, useMetadataFormErrors } from '../hoc/MetadataFormContext';
import { MetadataConfiguration } from '../component/MetadataConfiguration';
@@ -12,6 +12,7 @@ import { useMetadataProviders } from '../hooks/api';
import { removeNull } from '../../core/utility/remove_null';
import { useUserGroup } from '../../core/user/UserContext';
+import Spinner from '../../core/components/Spinner';
export function MetadataProviderWizard({onSave, loading, block}) {
@@ -20,6 +21,7 @@ export function MetadataProviderWizard({onSave, loading, block}) {
const definition = useMetadataDefinitionContext();
const schema = useMetadataSchemaContext();
+ const schemaLoading = useMetadataSchemaLoading();
const processed = useMetadataSchema(definition, schema);
@@ -49,6 +51,7 @@ export function MetadataProviderWizard({onSave, loading, block}) {
return (
<>
+
+ {schemaLoading &&
}
{
@@ -75,6 +77,7 @@ export function MetadataSourceWizard ({ onShowNav, onSave, block, loading }) {
+ {schemaLoading &&
}
{warnings && warnings.hasOwnProperty(current) &&
|