diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilter.js b/ui/src/app/metadata/domain/filter/component/MetadataFilter.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js new file mode 100644 index 000000000..e3e1c2557 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { MetadataFilterTypes } from '../index'; + +export const isAdditionalFilter = (type) => MetadataFilterTypes.indexOf(type) > -1; + +export const getVersionModelFilterPluginsFn = (model, kind) => { + const filters = kind === 'provider' ? + model.metadataFilters ? model.metadataFilters.filter(filter => MetadataFilterTypes.indexOf(filter['@type']) === -1) : + [] : null; + return filters; +}; + +export const getComparisonModelsFilteredFn = (models) => models.map((model) => { + return ({ + ...model, + metadataFilters: getVersionModelFilterPluginsFn( + model, + model.hasOwnProperty('@type') ? model.hasOwnProperty('metadataFilters') ? 'provider' : 'filter' : 'resolver' + ) + }); +}); + +export const getVersionModelFiltersFn = + (model, kind) => kind === 'provider' ? + model.metadataFilters ? model.metadataFilters.filter(filter => isAdditionalFilter(filter['@type'])) : + [] : null; + +export const getComparisonFilterOrderedFn = (list) => + list.map(models => + models.map(filter => + ({ + ...filter, + comparable: list + .reduce((acc, v) => acc.concat(v), []) + .map(v => v.resourceId) + .some((id, index, coll) => { + return coll.indexOf(filter.resourceId) !== coll.lastIndexOf(filter.resourceId); + }) + }) + )); + +export const getComparisonFilterListFn = (models) => models.map(m => getVersionModelFiltersFn(m, 'provider')); + +export const getComparisonFilterConfiguration = (filters, dates) => { + const rows = filters.reduce((num, version) => version.length > num ? version.length : num, 0); + const range = [...Array(rows).keys()]; + return { + dates, + filters: range.reduce((collection, index) => { + const val = filters.map(version => version[index]); + collection[index] = val; + return collection; + }, []) + }; +} + +export function useComparisonFilterList(models) { + return React.useMemo(() => getComparisonFilterListFn(models), [models]); +} + +export function useOrderedComparisonFilterList (models) { + const data = useComparisonFilterList(models); + + return React.useMemo(() => getComparisonFilterOrderedFn(data), [data]); +} + +export function useComparisonFilterConfiguration (models, dates) { + const filters = useOrderedComparisonFilterList(models); + + return React.useMemo(() => getComparisonFilterConfiguration(filters, dates), [filters, dates]); +} + + +export function MetadataFilterVersionContext ({ models, dates, children }) { + const config = useComparisonFilterConfiguration(models, dates); + + return (<>{children(config)}); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js new file mode 100644 index 000000000..b8d6e8df2 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js @@ -0,0 +1,82 @@ +import { faCheckSquare, faSquare } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import React from 'react'; +import FormattedDate from '../../../../core/components/FormattedDate'; +import Translate from '../../../../i18n/components/translate'; +import { usePropertyWidth } from '../../../component/properties/hooks'; + + + + +export function MetadataFilterVersionList ({ configuration, columns }) { + + const width = usePropertyWidth(columns); + + const [comparing, setComparing] = React.useState(false); + const [selected, setSelected] = React.useState(null); + + return ( + + { configuration && configuration.dates.length > 0 && + +
+ + + + {configuration.dates.map(d => + + + + ) } +
+ {configuration.filters.map((version, i) => +
+
+ { i + 1 } +
+ {version.map((filter, n) => +
+ {filter ? +
+
+

{ filter.name }

+

{ filter['@type'] }

+
+ { filter.comparable && + + } +
+ : +
-
+ } +
+ )} +
+ ) } + { configuration && + + {configuration.filters.length < 1 ? +
+

No Filters

+

No filters have been added to this Metadata Provider

+
+ : +
+ +
+ } +
+ } +
+ } +
+ + + + ); +} diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilters.js b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js index 7c994ab37..25f8aa3fb 100644 --- a/ui/src/app/metadata/domain/filter/component/MetadataFilters.js +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js @@ -1,4 +1,3 @@ -import { fi } from 'date-fns/locale'; import React from 'react'; import { useMetadataEntities } from '../../../hooks/api'; diff --git a/ui/src/app/metadata/hoc/ComparisonContext.js b/ui/src/app/metadata/hoc/ComparisonContext.js new file mode 100644 index 000000000..5917a32db --- /dev/null +++ b/ui/src/app/metadata/hoc/ComparisonContext.js @@ -0,0 +1,8 @@ +import React from 'react'; + + + + +export function ComparisonContext () { + return (<>); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/Configuration.js b/ui/src/app/metadata/hoc/Configuration.js index 1e12f541c..06bac7b0b 100644 --- a/ui/src/app/metadata/hoc/Configuration.js +++ b/ui/src/app/metadata/hoc/Configuration.js @@ -5,8 +5,6 @@ export function Configuration ({entities, schema, definition, limited, children} const config = useMetadataConfiguration(entities, schema, definition, limited); - console.log(config) - return ( <>{children(config)} ); diff --git a/ui/src/app/metadata/hooks/configuration.js b/ui/src/app/metadata/hooks/configuration.js index 4f02f61a6..da0ba0c28 100644 --- a/ui/src/app/metadata/hooks/configuration.js +++ b/ui/src/app/metadata/hooks/configuration.js @@ -21,4 +21,4 @@ export function useMetadataConfiguration(models, schema, definition, limited = f const processed = definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema; return getLimitedConfigurationsFn(getConfigurationSections(models, definition, processed), limited); -} \ No newline at end of file +} diff --git a/ui/src/app/metadata/hooks/schema.js b/ui/src/app/metadata/hooks/schema.js index bc432fb80..ae1a4872e 100644 --- a/ui/src/app/metadata/hooks/schema.js +++ b/ui/src/app/metadata/hooks/schema.js @@ -1,3 +1,5 @@ +import { MetadataFilterTypes } from "../domain/filter"; + export function getDefinition(path, definitions) { let def = path.split('/').pop(); return definitions[def]; @@ -213,4 +215,4 @@ export const getSplitSchema = (schema, step) => { } return s; -}; \ No newline at end of file +}; diff --git a/ui/src/app/metadata/view/MetadataComparison.js b/ui/src/app/metadata/view/MetadataComparison.js index 5b04c013a..a945c2578 100644 --- a/ui/src/app/metadata/view/MetadataComparison.js +++ b/ui/src/app/metadata/view/MetadataComparison.js @@ -14,6 +14,8 @@ import { faHistory } from '@fortawesome/free-solid-svg-icons'; import Translate from '../../i18n/components/translate'; import { CustomInput } from 'reactstrap'; import { useTranslation } from '../../i18n/hooks'; +import { MetadataFilterVersionList } from '../domain/filter/component/MetadataFilterVersionList'; +import { MetadataFilterVersionContext } from '../domain/filter/component/MetadataFilterVersionContext'; export function MetadataComparison () { @@ -50,6 +52,19 @@ export function MetadataComparison () { onChange={ () => setLimited(!limited) } /> + + {type === 'provider' && v && + +
+

+ Metadata Filter +

+
+ + {(c) => } + +
+ } } @@ -60,62 +75,3 @@ export function MetadataComparison () { ); } -/* - -

- Compare - Source - Provider - Configuration -

-
-
- -   - Version History - - -
- - -
-

- Metadata Filter -

-
- - - - - -
- -
- -
-
-
-
-
- - Loading... -
- -*/ \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataHistory.js b/ui/src/app/metadata/view/MetadataHistory.js index 27095dae3..64d7e7de2 100644 --- a/ui/src/app/metadata/view/MetadataHistory.js +++ b/ui/src/app/metadata/view/MetadataHistory.js @@ -43,6 +43,14 @@ export function MetadataHistory () { const [selected, setSelected] = React.useState([]); + const [sorted, setSorted] = React.useState([]); + + React.useEffect(() => { + if (data && data.length) { + setSorted(sortVersionsByDate(data)); + } + }, [data]); + return ( <>

diff --git a/ui/src/app/metadata/view/MetadataVersion.js b/ui/src/app/metadata/view/MetadataVersion.js index 02a88d558..db3bf3d81 100644 --- a/ui/src/app/metadata/view/MetadataVersion.js +++ b/ui/src/app/metadata/view/MetadataVersion.js @@ -23,7 +23,6 @@ export function MetadataVersion() { const [metadata, setMetadata] = React.useState(); - const schema = React.useContext(MetadataSchemaContext); const definition = React.useContext(MetadataDefinitionContext);