@truedat/core 4.46.3 → 4.46.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/package.json +3 -3
- package/src/components/FiltersLoader.js +2 -1
- package/src/components/SelectedFilters.js +64 -55
- package/src/routes.js +2 -2
- package/src/selectors/makeActiveFiltersSelector.js +2 -2
- package/src/services/__tests__/filters.spec.js +14 -6
- package/src/services/filters.js +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.46.4] 2022-06-16
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- [TD-4720] When merging default filters and user-specified filters, the
|
|
8
|
+
`taxonomy` filter specified now overrides the default value. This change was
|
|
9
|
+
needed for the domain filter to work in the `<DomainConcepts />` tab.
|
|
10
|
+
|
|
3
11
|
## [4.46.2] 2022-06-16
|
|
4
12
|
|
|
5
13
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/core",
|
|
3
|
-
"version": "4.46.
|
|
3
|
+
"version": "4.46.4",
|
|
4
4
|
"description": "Truedat Web Core",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"jsnext:main": "src/index.js",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@testing-library/jest-dom": "^5.16.4",
|
|
36
36
|
"@testing-library/react": "^12.0.0",
|
|
37
37
|
"@testing-library/user-event": "^13.2.1",
|
|
38
|
-
"@truedat/test": "4.46.
|
|
38
|
+
"@truedat/test": "4.46.4",
|
|
39
39
|
"babel-jest": "^28.1.0",
|
|
40
40
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
41
41
|
"babel-plugin-lodash": "^3.3.4",
|
|
@@ -112,5 +112,5 @@
|
|
|
112
112
|
"react-dom": ">= 16.8.6 < 17",
|
|
113
113
|
"semantic-ui-react": ">= 0.88.2 < 2.1"
|
|
114
114
|
},
|
|
115
|
-
"gitHead": "
|
|
115
|
+
"gitHead": "dcd0aa42ffe1fb816945154ec2a2d06889dca7e7"
|
|
116
116
|
}
|
|
@@ -25,13 +25,14 @@ export const FiltersLoader = ({
|
|
|
25
25
|
}
|
|
26
26
|
: _.omit([selectedFilter])({ ...defaultFilters, ...filters });
|
|
27
27
|
fetchFilters({ filters: mergedFilters });
|
|
28
|
-
}, [fetchFilters, filters, selectedFilter]);
|
|
28
|
+
}, [fetchFilters, filters, selectedFilter, defaultFilters]);
|
|
29
29
|
return null;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
FiltersLoader.propTypes = {
|
|
33
33
|
clearFilters: PropTypes.func.isRequired,
|
|
34
34
|
clearSort: PropTypes.func,
|
|
35
|
+
defaultFilters: PropTypes.object,
|
|
35
36
|
fetchFilters: PropTypes.func.isRequired,
|
|
36
37
|
filters: PropTypes.object.isRequired,
|
|
37
38
|
selectedFilter: PropTypes.string,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
|
-
import React from "react";
|
|
2
|
+
import React, { useEffect } from "react";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { FormattedMessage } from "react-intl";
|
|
5
5
|
import FilterDropdown from "./FilterDropdown";
|
|
@@ -25,61 +25,70 @@ export const SelectedFilters = ({
|
|
|
25
25
|
toggleFilterValue,
|
|
26
26
|
userFilters,
|
|
27
27
|
userFilterScope,
|
|
28
|
-
}) =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const options = _.isEqual(filter, selectedFilter)
|
|
49
|
-
? selectedFilterValues
|
|
50
|
-
: null;
|
|
51
|
-
const props = {
|
|
52
|
-
key: filter,
|
|
53
|
-
activeValues,
|
|
54
|
-
closeFilter,
|
|
55
|
-
filter,
|
|
56
|
-
loading,
|
|
57
|
-
openFilter,
|
|
58
|
-
options,
|
|
59
|
-
removeFilter,
|
|
60
|
-
toggleFilterValue,
|
|
61
|
-
};
|
|
62
|
-
return selectedFilter === "taxonomy" ? (
|
|
63
|
-
<FilterMultilevelDropdown {...props} />
|
|
64
|
-
) : (
|
|
65
|
-
<FilterDropdown {...props} />
|
|
66
|
-
);
|
|
67
|
-
})}
|
|
68
|
-
<a className="resetFilters" onClick={() => resetFilters()}>
|
|
69
|
-
<FormattedMessage id="search.clear_filters" />
|
|
70
|
-
</a>
|
|
71
|
-
{saveFilters && (
|
|
72
|
-
<ModalSaveFilter
|
|
73
|
-
saveFilters={saveFilters}
|
|
74
|
-
activeFilters={activeFilters}
|
|
75
|
-
scope={userFilterScope}
|
|
76
|
-
/>
|
|
77
|
-
)}
|
|
78
|
-
</>
|
|
28
|
+
}) => {
|
|
29
|
+
useEffect(
|
|
30
|
+
() => () => {
|
|
31
|
+
resetFilters();
|
|
32
|
+
},
|
|
33
|
+
[resetFilters]
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<>
|
|
38
|
+
{_.isEmpty(userFilters) ? null : (
|
|
39
|
+
<UserFilters
|
|
40
|
+
applyUserFilter={applyUserFilter}
|
|
41
|
+
userFilterScope={userFilterScope}
|
|
42
|
+
deleteUserFilter={deleteUserFilter}
|
|
43
|
+
resetFilters={resetFilters}
|
|
44
|
+
selectedUserFilter={selectedUserFilter}
|
|
45
|
+
userFilters={userFilters}
|
|
46
|
+
disabled={loading}
|
|
47
|
+
/>
|
|
79
48
|
)}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
49
|
+
<div className="selectedFilters">
|
|
50
|
+
{_.isEmpty(selectedFilters) ? null : (
|
|
51
|
+
<>
|
|
52
|
+
<div className="appliedFilters">
|
|
53
|
+
<FormattedMessage id="search.applied_filters" />
|
|
54
|
+
</div>
|
|
55
|
+
{selectedFilters.map((filter) => {
|
|
56
|
+
const options = _.isEqual(filter, selectedFilter)
|
|
57
|
+
? selectedFilterValues
|
|
58
|
+
: null;
|
|
59
|
+
const props = {
|
|
60
|
+
key: filter,
|
|
61
|
+
activeValues,
|
|
62
|
+
closeFilter,
|
|
63
|
+
filter,
|
|
64
|
+
loading,
|
|
65
|
+
openFilter,
|
|
66
|
+
options,
|
|
67
|
+
removeFilter,
|
|
68
|
+
toggleFilterValue,
|
|
69
|
+
};
|
|
70
|
+
return selectedFilter === "taxonomy" ? (
|
|
71
|
+
<FilterMultilevelDropdown {...props} />
|
|
72
|
+
) : (
|
|
73
|
+
<FilterDropdown {...props} />
|
|
74
|
+
);
|
|
75
|
+
})}
|
|
76
|
+
<a className="resetFilters" onClick={() => resetFilters()}>
|
|
77
|
+
<FormattedMessage id="search.clear_filters" />
|
|
78
|
+
</a>
|
|
79
|
+
{saveFilters && (
|
|
80
|
+
<ModalSaveFilter
|
|
81
|
+
saveFilters={saveFilters}
|
|
82
|
+
activeFilters={activeFilters}
|
|
83
|
+
scope={userFilterScope}
|
|
84
|
+
/>
|
|
85
|
+
)}
|
|
86
|
+
</>
|
|
87
|
+
)}
|
|
88
|
+
</div>
|
|
89
|
+
</>
|
|
90
|
+
);
|
|
91
|
+
};
|
|
83
92
|
|
|
84
93
|
SelectedFilters.propTypes = {
|
|
85
94
|
activeFilters: PropTypes.object,
|
package/src/routes.js
CHANGED
|
@@ -36,7 +36,7 @@ export const DOMAINS = "/domains";
|
|
|
36
36
|
export const DOMAINS_ACTIONS = "/domains/:action";
|
|
37
37
|
export const DOMAINS_NEW = "/domains/new";
|
|
38
38
|
export const DOMAINS_SEARCH = "/domains/search";
|
|
39
|
-
export const
|
|
39
|
+
export const DOMAIN_CONCEPTS = "/domains/:id/concepts";
|
|
40
40
|
export const DOMAIN_EDIT = "/domains/:id/edit";
|
|
41
41
|
export const DOMAIN_MEMBERS = "/domains/:id/members";
|
|
42
42
|
export const DOMAIN_MEMBERS_NEW = "/domains/:id/members/new";
|
|
@@ -217,7 +217,7 @@ const routes = {
|
|
|
217
217
|
DOMAINS_ACTIONS,
|
|
218
218
|
DOMAINS_NEW,
|
|
219
219
|
DOMAINS_SEARCH,
|
|
220
|
-
|
|
220
|
+
DOMAIN_CONCEPTS,
|
|
221
221
|
DOMAIN_EDIT,
|
|
222
222
|
DOMAIN_MEMBERS,
|
|
223
223
|
DOMAIN_MEMBERS_NEW,
|
|
@@ -2,12 +2,12 @@ import _ from "lodash/fp";
|
|
|
2
2
|
import {
|
|
3
3
|
createSelector,
|
|
4
4
|
createSelectorCreator,
|
|
5
|
-
defaultMemoize
|
|
5
|
+
defaultMemoize,
|
|
6
6
|
} from "reselect";
|
|
7
7
|
|
|
8
8
|
const defaultFilters = false;
|
|
9
9
|
|
|
10
|
-
export const makeActiveFiltersSelector = activeFiltersProp => {
|
|
10
|
+
export const makeActiveFiltersSelector = (activeFiltersProp) => {
|
|
11
11
|
const activeFiltersSelector = createSelector(
|
|
12
12
|
_.prop(activeFiltersProp),
|
|
13
13
|
(_state, props) => _.propOr(defaultFilters, "defaultFilters")(props),
|
|
@@ -5,7 +5,7 @@ describe("services: filters", () => {
|
|
|
5
5
|
describe("mergeFilters", () => {
|
|
6
6
|
const defaultFilters = {
|
|
7
7
|
status: ["draft", "pending", "rejected"],
|
|
8
|
-
current: [true]
|
|
8
|
+
current: [true],
|
|
9
9
|
};
|
|
10
10
|
const userFilters1 = { type: ["type1"] };
|
|
11
11
|
const userFilters2 = { status: ["draft", "rejected"] };
|
|
@@ -16,7 +16,7 @@ describe("services: filters", () => {
|
|
|
16
16
|
expect(merged).toEqual({
|
|
17
17
|
current: [true],
|
|
18
18
|
status: ["draft", "pending", "rejected"],
|
|
19
|
-
type: ["type1"]
|
|
19
|
+
type: ["type1"],
|
|
20
20
|
});
|
|
21
21
|
});
|
|
22
22
|
|
|
@@ -24,7 +24,7 @@ describe("services: filters", () => {
|
|
|
24
24
|
const merged = mergeFilters([defaultFilters, userFilters2]);
|
|
25
25
|
expect(merged).toEqual({
|
|
26
26
|
current: [true],
|
|
27
|
-
status: ["draft", "rejected"]
|
|
27
|
+
status: ["draft", "rejected"],
|
|
28
28
|
});
|
|
29
29
|
});
|
|
30
30
|
|
|
@@ -32,9 +32,17 @@ describe("services: filters", () => {
|
|
|
32
32
|
const merged = mergeFilters([defaultFilters, userFilters3]);
|
|
33
33
|
expect(merged).toEqual({
|
|
34
34
|
current: [true],
|
|
35
|
-
status: ["draft", "pending", "rejected"]
|
|
35
|
+
status: ["draft", "pending", "rejected"],
|
|
36
36
|
});
|
|
37
37
|
});
|
|
38
|
+
|
|
39
|
+
it("should use overrides if present for taxonomy key", () => {
|
|
40
|
+
const defaults = { taxonomy: [123] };
|
|
41
|
+
const overrides = { taxonomy: [456] };
|
|
42
|
+
const emptyOverrides = { taxonomy: [] };
|
|
43
|
+
expect(mergeFilters([defaults, overrides])).toEqual(overrides);
|
|
44
|
+
expect(mergeFilters([defaults, emptyOverrides])).toEqual(defaults);
|
|
45
|
+
});
|
|
38
46
|
});
|
|
39
47
|
|
|
40
48
|
describe("getSearchPayload", () => {
|
|
@@ -52,7 +60,7 @@ describe("services: filters", () => {
|
|
|
52
60
|
getSearchPayload(searchQuery, {
|
|
53
61
|
defaultFilters,
|
|
54
62
|
linkable,
|
|
55
|
-
pageSize: size
|
|
63
|
+
pageSize: size,
|
|
56
64
|
})
|
|
57
65
|
).toEqual({
|
|
58
66
|
filters: { ...filters, ...defaultFilters },
|
|
@@ -60,7 +68,7 @@ describe("services: filters", () => {
|
|
|
60
68
|
page,
|
|
61
69
|
query,
|
|
62
70
|
size,
|
|
63
|
-
sort
|
|
71
|
+
sort,
|
|
64
72
|
});
|
|
65
73
|
});
|
|
66
74
|
});
|
package/src/services/filters.js
CHANGED
|
@@ -6,16 +6,16 @@ const intersectionOrDefault = (defaults, overrides) => {
|
|
|
6
6
|
return _.isEmpty(v) ? defaults : v;
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const isNonEmptyArray = (a) => _.isArray(a) && !_.isEmpty(a);
|
|
10
|
+
|
|
11
|
+
const filterCustomizer = (defaults, overrides, key) =>
|
|
12
|
+
key === "taxonomy" && isNonEmptyArray(overrides)
|
|
13
|
+
? overrides
|
|
14
|
+
: isNonEmptyArray(defaults) && isNonEmptyArray(overrides)
|
|
14
15
|
? intersectionOrDefault(defaults, overrides)
|
|
15
16
|
: undefined;
|
|
16
17
|
|
|
17
|
-
export const mergeFilters = (
|
|
18
|
-
_.mergeAllWith(filterCustomizer)(filters);
|
|
18
|
+
export const mergeFilters = _.mergeAllWith(filterCustomizer);
|
|
19
19
|
|
|
20
20
|
export const getSearchPayload = (searchQuery, props) => {
|
|
21
21
|
const { defaultFilters = {}, linkable, pageSize: size = 20 } = props;
|