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
-
- 2,
- 'container': (numVersions$ | async) <= 2
-}">
-
-
-
- Version History
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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);