@truedat/bg 6.3.3 → 6.3.5
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/package.json +6 -6
- package/src/concepts/api.js +3 -7
- package/src/concepts/components/ConceptActions.js +1 -0
- package/src/concepts/components/ConceptCreate.js +6 -4
- package/src/concepts/components/ConceptRoutes.js +10 -33
- package/src/concepts/components/Concepts.js +25 -16
- package/src/concepts/components/ConceptsActions.js +8 -14
- package/src/concepts/components/ConceptsBulkUpdate.js +25 -64
- package/src/concepts/components/ConceptsLabelResults.js +13 -26
- package/src/concepts/components/ConceptsLinksManagement.js +6 -92
- package/src/concepts/components/ConceptsPagination.js +13 -11
- package/src/concepts/components/ConceptsPanel.js +57 -20
- package/src/concepts/components/ConceptsTable.js +77 -106
- package/src/concepts/components/ConceptsUpdateButton.js +49 -37
- package/src/concepts/components/DomainConcepts.js +2 -11
- package/src/concepts/components/LinkedMessage.js +81 -0
- package/src/concepts/components/__tests__/ConceptLinksManagement.spec.js +60 -12
- package/src/concepts/components/__tests__/Concepts.spec.js +66 -11
- package/src/concepts/components/__tests__/ConceptsActions.spec.js +47 -3
- package/src/concepts/components/__tests__/ConceptsBulkUpdate.spec.js +7 -3
- package/src/concepts/components/__tests__/ConceptsLabelResults.spec.js +34 -4
- package/src/concepts/components/__tests__/ConceptsPanel.spec.js +59 -13
- package/src/concepts/components/__tests__/ConceptsTable.spec.js +53 -6
- package/src/concepts/components/__tests__/ConceptsUpdateButton.spec.js +26 -13
- package/src/concepts/components/__tests__/__snapshots__/ConceptLinksManagement.spec.js.snap +164 -8
- package/src/concepts/components/__tests__/__snapshots__/Concepts.spec.js.snap +284 -34
- package/src/concepts/components/__tests__/__snapshots__/ConceptsActions.spec.js.snap +1 -1
- package/src/concepts/components/__tests__/__snapshots__/ConceptsPanel.spec.js.snap +125 -2
- package/src/concepts/components/__tests__/__snapshots__/ConceptsTable.spec.js.snap +28 -44
- package/src/concepts/components/__tests__/__snapshots__/ConceptsUpdateButton.spec.js.snap +10 -47
- package/src/concepts/hooks/useConcepts.js +34 -0
- package/src/concepts/reducers/bulkUpdateQueryInfo.js +12 -0
- package/src/concepts/reducers/index.js +2 -26
- package/src/concepts/relations/components/ConceptRelationsRoutes.js +39 -35
- package/src/concepts/relations/components/ConceptSelector.js +44 -29
- package/src/concepts/relations/components/__tests__/ConceptRelationForm.spec.js +63 -23
- package/src/concepts/relations/components/__tests__/ConceptSelector.spec.js +74 -41
- package/src/concepts/relations/components/__tests__/ConceptSelector2.spec.js +72 -0
- package/src/concepts/relations/components/__tests__/__snapshots__/ConceptRelationForm.spec.js.snap +44 -8
- package/src/concepts/relations/components/__tests__/__snapshots__/ConceptSelector.spec.js.snap +44 -27
- package/src/concepts/routines.js +2 -29
- package/src/concepts/sagas/__tests__/bulkUpdate.spec.js +6 -10
- package/src/concepts/sagas/__tests__/downloadConcepts.spec.js +4 -8
- package/src/concepts/sagas/bulkUpdate.js +6 -5
- package/src/concepts/sagas/downloadConcepts.js +3 -4
- package/src/concepts/sagas/index.js +2 -17
- package/src/concepts/selectors/getConceptColumns.js +12 -21
- package/src/concepts/selectors/index.js +1 -7
- package/src/concepts/utils/filterOptions.js +6 -5
- package/src/concepts/components/ConceptFilters.js +0 -20
- package/src/concepts/components/ConceptFiltersLoader.js +0 -27
- package/src/concepts/components/ConceptSelectedFilters.js +0 -29
- package/src/concepts/components/ConceptSelectedFiltersDefault.js +0 -42
- package/src/concepts/components/ConceptSelectedFiltersPending.js +0 -41
- package/src/concepts/components/ConceptSelectedFiltersPublished.js +0 -73
- package/src/concepts/components/ConceptUserFiltersLoader.js +0 -27
- package/src/concepts/components/ConceptsLoader.js +0 -38
- package/src/concepts/components/ConceptsSearch.js +0 -32
- package/src/concepts/components/__tests__/ConceptFilters.spec.js +0 -19
- package/src/concepts/components/__tests__/ConceptSelectedFilters.spec.js +0 -10
- package/src/concepts/components/__tests__/ConceptUserFiltersLoader.spec.js +0 -27
- package/src/concepts/components/__tests__/ConceptsLoader.spec.js +0 -34
- package/src/concepts/components/__tests__/__snapshots__/ConceptFilters.spec.js.snap +0 -47
- package/src/concepts/components/__tests__/__snapshots__/ConceptSelectedFilters.spec.js.snap +0 -9
- package/src/concepts/components/__tests__/__snapshots__/ConceptUserFiltersLoader.spec.js.snap +0 -3
- package/src/concepts/reducers/__tests__/conceptActiveFilters.spec.js +0 -83
- package/src/concepts/reducers/__tests__/conceptCount.spec.js +0 -33
- package/src/concepts/reducers/__tests__/conceptFilters.spec.js +0 -49
- package/src/concepts/reducers/__tests__/conceptFiltersLoading.spec.js +0 -28
- package/src/concepts/reducers/__tests__/conceptQuery.spec.js +0 -75
- package/src/concepts/reducers/__tests__/conceptSelectedFilter.spec.js +0 -66
- package/src/concepts/reducers/__tests__/conceptSelectedUserFilter.spec.js +0 -53
- package/src/concepts/reducers/__tests__/conceptUserFilters.spec.js +0 -76
- package/src/concepts/reducers/__tests__/concepts.spec.js +0 -40
- package/src/concepts/reducers/__tests__/conceptsActions.spec.js +0 -38
- package/src/concepts/reducers/__tests__/conceptsLoading.spec.js +0 -32
- package/src/concepts/reducers/__tests__/conceptsPageSize.spec.js +0 -33
- package/src/concepts/reducers/__tests__/previousConceptQuery.spec.js +0 -23
- package/src/concepts/reducers/conceptActiveFilters.js +0 -58
- package/src/concepts/reducers/conceptCount.js +0 -20
- package/src/concepts/reducers/conceptFilters.js +0 -21
- package/src/concepts/reducers/conceptFiltersLoading.js +0 -14
- package/src/concepts/reducers/conceptQuery.js +0 -60
- package/src/concepts/reducers/conceptSelectedFilter.js +0 -34
- package/src/concepts/reducers/conceptSelectedUserFilter.js +0 -31
- package/src/concepts/reducers/conceptUserFilters.js +0 -36
- package/src/concepts/reducers/concepts.js +0 -21
- package/src/concepts/reducers/conceptsActions.js +0 -24
- package/src/concepts/reducers/conceptsLoading.js +0 -16
- package/src/concepts/reducers/conceptsPageSize.js +0 -16
- package/src/concepts/reducers/previousConceptQuery.js +0 -15
- package/src/concepts/sagas/__tests__/deleteConceptUserFilter.spec.js +0 -75
- package/src/concepts/sagas/__tests__/fetchConceptUserFilters.spec.js +0 -70
- package/src/concepts/sagas/__tests__/fetchConcepts.spec.js +0 -87
- package/src/concepts/sagas/__tests__/saveConceptFilters.spec.js +0 -78
- package/src/concepts/sagas/deleteConceptUserFilter.js +0 -34
- package/src/concepts/sagas/fecthConceptUserFilters.js +0 -30
- package/src/concepts/sagas/fetchConceptFilters.js +0 -29
- package/src/concepts/sagas/fetchConcepts.js +0 -27
- package/src/concepts/sagas/saveConceptFilters.js +0 -30
- package/src/concepts/selectors/__tests__/getConceptAvailableFilters.spec.js +0 -16
- package/src/concepts/selectors/__tests__/getConceptFilterTypes.spec.js +0 -19
- package/src/concepts/selectors/__tests__/getConceptSelectedFilterActiveValues.spec.js +0 -16
- package/src/concepts/selectors/__tests__/getConceptSelectedFilterValues.spec.js +0 -15
- package/src/concepts/selectors/__tests__/getConceptSelectedFilters.spec.js +0 -15
- package/src/concepts/selectors/__tests__/mapSelectedFilterStateToPropsByStatus.spec.js +0 -37
- package/src/concepts/selectors/getConceptAvailableFilters.js +0 -15
- package/src/concepts/selectors/getConceptFilterTypes.js +0 -7
- package/src/concepts/selectors/getConceptSelectedFilterActiveValues.js +0 -9
- package/src/concepts/selectors/getConceptSelectedFilterValues.js +0 -12
- package/src/concepts/selectors/getConceptSelectedFilters.js +0 -7
- package/src/concepts/selectors/getPreviousConceptQuery.js +0 -1
- package/src/concepts/selectors/mapSelectedFilterStateToPropsByStatus.js +0 -47
|
@@ -3,11 +3,12 @@ import React, { useState, useEffect } from "react";
|
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { useIntl } from "react-intl";
|
|
5
5
|
import { connect } from "react-redux";
|
|
6
|
-
import { Header, Icon, Segment, Grid
|
|
6
|
+
import { Header, Icon, Segment, Grid } from "semantic-ui-react";
|
|
7
7
|
import {
|
|
8
8
|
makeTagOptionsSelector,
|
|
9
9
|
makeSearchQuerySelector,
|
|
10
10
|
} from "@truedat/core/selectors";
|
|
11
|
+
|
|
11
12
|
import {
|
|
12
13
|
clearStructures,
|
|
13
14
|
fetchStructures,
|
|
@@ -17,10 +18,10 @@ import {
|
|
|
17
18
|
} from "@truedat/dd/routines";
|
|
18
19
|
import { createRelation, deleteRelation } from "@truedat/core/routines";
|
|
19
20
|
import ConceptSelector from "../relations/components/ConceptSelector";
|
|
20
|
-
import { fetchConcepts } from "../routines";
|
|
21
21
|
import { pickConceptAttrs } from "../relations/components/ConceptRelationForm";
|
|
22
|
+
import LinkedMessage from "./LinkedMessage";
|
|
22
23
|
import ConceptLinksDropdownSelector from "./ConceptLinksDropdownSelector";
|
|
23
|
-
|
|
24
|
+
|
|
24
25
|
const RelationsLoader = React.lazy(() =>
|
|
25
26
|
import("@truedat/lm/components/RelationsLoader")
|
|
26
27
|
);
|
|
@@ -47,77 +48,6 @@ const STATUS_PENDING = "pending";
|
|
|
47
48
|
const STATUS_CREATED = "created";
|
|
48
49
|
const STATUS_DELETED = "deleted";
|
|
49
50
|
|
|
50
|
-
const LinkedMessage = ({
|
|
51
|
-
selectedSourceConcept,
|
|
52
|
-
selectedTargetConcept,
|
|
53
|
-
selectedLinkType,
|
|
54
|
-
selectedStructure,
|
|
55
|
-
selectedTag,
|
|
56
|
-
status,
|
|
57
|
-
}) => {
|
|
58
|
-
const { formatMessage } = useIntl();
|
|
59
|
-
|
|
60
|
-
const messagesMap = {
|
|
61
|
-
[STATUS_PENDING]: formatMessage({ id: "concept.events.relation_creating" }),
|
|
62
|
-
[STATUS_DELETED]: formatMessage({ id: "concept.events.relation_deleted" }),
|
|
63
|
-
[STATUS_CREATED]: formatMessage({ id: "concept.events.relation_created" }),
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<Message success={status !== STATUS_PENDING} floating>
|
|
68
|
-
<Message.Header>{messagesMap[status]}</Message.Header>
|
|
69
|
-
<Message.List>
|
|
70
|
-
{selectedSourceConcept ? (
|
|
71
|
-
<Message.Item>
|
|
72
|
-
{formatMessage({ id: "conceptRelations.from" })}
|
|
73
|
-
{": "} {selectedSourceConcept.name}
|
|
74
|
-
</Message.Item>
|
|
75
|
-
) : null}
|
|
76
|
-
{selectedStructure ? (
|
|
77
|
-
<Message.Item>
|
|
78
|
-
{formatMessage({ id: "conceptRelations.to" })}
|
|
79
|
-
{": "}
|
|
80
|
-
{selectedStructure.name}
|
|
81
|
-
</Message.Item>
|
|
82
|
-
) : selectedTargetConcept ? (
|
|
83
|
-
<Message.Item>
|
|
84
|
-
{formatMessage({ id: "conceptRelations.to" })}
|
|
85
|
-
{": "}
|
|
86
|
-
{selectedTargetConcept.name}
|
|
87
|
-
</Message.Item>
|
|
88
|
-
) : null}
|
|
89
|
-
{selectedTag ? (
|
|
90
|
-
<Message.Item>
|
|
91
|
-
{formatMessage({ id: "conceptRelations.tag" })}
|
|
92
|
-
{": "}
|
|
93
|
-
{selectedLinkType === "structures"
|
|
94
|
-
? formatMessage({
|
|
95
|
-
id: selectedTag.text,
|
|
96
|
-
defaultMessage: selectedTag.text,
|
|
97
|
-
})
|
|
98
|
-
: formatMessage({
|
|
99
|
-
id: `source.${selectedTag.text}`,
|
|
100
|
-
defaultMessage: formatMessage({
|
|
101
|
-
id: selectedTag.text,
|
|
102
|
-
defaultMessage: selectedTag.text,
|
|
103
|
-
}),
|
|
104
|
-
})}
|
|
105
|
-
</Message.Item>
|
|
106
|
-
) : null}
|
|
107
|
-
</Message.List>
|
|
108
|
-
</Message>
|
|
109
|
-
);
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
LinkedMessage.propTypes = {
|
|
113
|
-
selectedSourceConcept: PropTypes.object,
|
|
114
|
-
selectedStructure: PropTypes.object,
|
|
115
|
-
selectedTargetConcept: PropTypes.object,
|
|
116
|
-
selectedLinkType: PropTypes.string,
|
|
117
|
-
selectedTag: PropTypes.object,
|
|
118
|
-
status: PropTypes.string,
|
|
119
|
-
};
|
|
120
|
-
|
|
121
51
|
export const ConceptsLinksManagement = ({
|
|
122
52
|
header,
|
|
123
53
|
subheader,
|
|
@@ -127,8 +57,6 @@ export const ConceptsLinksManagement = ({
|
|
|
127
57
|
conceptLinks,
|
|
128
58
|
tagStructureOptions,
|
|
129
59
|
tagConceptOptions,
|
|
130
|
-
fetchConcepts,
|
|
131
|
-
conceptPayload,
|
|
132
60
|
selectedRelationTags,
|
|
133
61
|
clearStructures,
|
|
134
62
|
clearStructureFilters,
|
|
@@ -155,13 +83,6 @@ export const ConceptsLinksManagement = ({
|
|
|
155
83
|
setSelectedStructure(null);
|
|
156
84
|
} else if (selectedLinkType == "structures") {
|
|
157
85
|
setSelectedTargetConcept(null);
|
|
158
|
-
const must = conceptPayload.must;
|
|
159
|
-
const payload = {
|
|
160
|
-
...conceptPayload,
|
|
161
|
-
must: { ...must, ...linksDefaultFilters },
|
|
162
|
-
size: 7,
|
|
163
|
-
};
|
|
164
|
-
fetchConcepts(payload);
|
|
165
86
|
setTagOptions(tagStructureOptions);
|
|
166
87
|
}
|
|
167
88
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -311,6 +232,7 @@ export const ConceptsLinksManagement = ({
|
|
|
311
232
|
</Header.Content>
|
|
312
233
|
</Header>
|
|
313
234
|
<ConceptSelector
|
|
235
|
+
defaultFilters={linksDefaultFilters}
|
|
314
236
|
showTitle={false}
|
|
315
237
|
selectedConcept={selectedSourceConcept}
|
|
316
238
|
handleConceptSelected={handleSourceConceptSelected}
|
|
@@ -332,7 +254,6 @@ export const ConceptsLinksManagement = ({
|
|
|
332
254
|
</Header>
|
|
333
255
|
{selectedSourceConcept && selectedLinkType == "structures" ? (
|
|
334
256
|
<>
|
|
335
|
-
<ConceptUserFiltersLoader />
|
|
336
257
|
<RelationsLoader
|
|
337
258
|
resource_id={selectedSourceConcept.business_concept_id}
|
|
338
259
|
resource_type="business_concept"
|
|
@@ -354,6 +275,7 @@ export const ConceptsLinksManagement = ({
|
|
|
354
275
|
target_type="business_concept"
|
|
355
276
|
/>
|
|
356
277
|
<ConceptSelector
|
|
278
|
+
defaultFilters={linksDefaultFilters}
|
|
357
279
|
selectedConcept={selectedTargetConcept}
|
|
358
280
|
handleConceptSelected={handleTargetConceptSelected}
|
|
359
281
|
businessConceptId={
|
|
@@ -378,8 +300,6 @@ ConceptsLinksManagement.propTypes = {
|
|
|
378
300
|
header: PropTypes.string,
|
|
379
301
|
icon: PropTypes.string,
|
|
380
302
|
subheader: PropTypes.string,
|
|
381
|
-
fetchConcepts: PropTypes.func,
|
|
382
|
-
conceptPayload: PropTypes.object,
|
|
383
303
|
structurePayload: PropTypes.object,
|
|
384
304
|
fetchStructures: PropTypes.func,
|
|
385
305
|
clearStructures: PropTypes.func,
|
|
@@ -396,10 +316,6 @@ ConceptsLinksManagement.propTypes = {
|
|
|
396
316
|
|
|
397
317
|
const makeMapStateToProps = () => {
|
|
398
318
|
const getTagStructureOptions = makeTagOptionsSelector("data_field");
|
|
399
|
-
const searchQuerySelector = makeSearchQuerySelector(
|
|
400
|
-
"conceptQuery",
|
|
401
|
-
"conceptActiveFilters"
|
|
402
|
-
);
|
|
403
319
|
const getTagConceptOptions = makeTagOptionsSelector("business_concept");
|
|
404
320
|
const structureSearchQuerySelector = makeSearchQuerySelector(
|
|
405
321
|
"structureQuery",
|
|
@@ -407,7 +323,6 @@ const makeMapStateToProps = () => {
|
|
|
407
323
|
"structureDateFilter"
|
|
408
324
|
);
|
|
409
325
|
const mapStateToProps = (state, props) => ({
|
|
410
|
-
conceptPayload: searchQuerySelector(state, props),
|
|
411
326
|
selectedRelationTags: state.selectedRelationTags,
|
|
412
327
|
structurePayload: structureSearchQuerySelector(state, props),
|
|
413
328
|
tagStructureOptions: getTagStructureOptions(state),
|
|
@@ -419,7 +334,6 @@ const makeMapStateToProps = () => {
|
|
|
419
334
|
};
|
|
420
335
|
|
|
421
336
|
export default connect(makeMapStateToProps, {
|
|
422
|
-
fetchConcepts,
|
|
423
337
|
createRelation,
|
|
424
338
|
deleteRelation,
|
|
425
339
|
fetchStructures,
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { bindActionCreators } from "redux";
|
|
1
|
+
import React from "react";
|
|
3
2
|
import { Pagination } from "@truedat/core/components";
|
|
4
|
-
import {
|
|
3
|
+
import { useSearchContext } from "@truedat/core/search/SearchContext";
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export default function ConceptsPagination() {
|
|
6
|
+
const { count, size, page, selectPage } = useSearchContext();
|
|
7
|
+
const totalPages = Math.ceil(count / size);
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
return (
|
|
10
|
+
<Pagination
|
|
11
|
+
totalPages={totalPages}
|
|
12
|
+
activePage={page}
|
|
13
|
+
selectPage={selectPage}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -2,33 +2,70 @@ import React from "react";
|
|
|
2
2
|
import PropTypes from "prop-types";
|
|
3
3
|
import { connect } from "react-redux";
|
|
4
4
|
import { Dimmer, Loader } from "semantic-ui-react";
|
|
5
|
+
import SearchWidget from "@truedat/core/search/SearchWidget";
|
|
6
|
+
import {
|
|
7
|
+
SearchContextProvider,
|
|
8
|
+
useSearchContext,
|
|
9
|
+
} from "@truedat/core/search/SearchContext";
|
|
10
|
+
import { translations } from "../utils/filterOptions";
|
|
11
|
+
import {
|
|
12
|
+
useConceptVersionsSearch,
|
|
13
|
+
useConceptFilters,
|
|
14
|
+
} from "../hooks/useConcepts";
|
|
5
15
|
import ConceptsActions from "./ConceptsActions";
|
|
6
16
|
import ConceptsLabelResults from "./ConceptsLabelResults";
|
|
7
17
|
import ConceptsPagination from "./ConceptsPagination";
|
|
8
|
-
import ConceptsSearch from "./ConceptsSearch";
|
|
9
18
|
import ConceptsTable from "./ConceptsTable";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<Dimmer
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
|
|
20
|
+
export function ConceptsPanelContent({ actions }) {
|
|
21
|
+
const { loading } = useSearchContext();
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<>
|
|
25
|
+
<ConceptsActions {...actions} />
|
|
26
|
+
<SearchWidget />
|
|
27
|
+
<Dimmer.Dimmable dimmed={loading}>
|
|
28
|
+
<Dimmer active={loading} inverted>
|
|
29
|
+
<Loader />
|
|
30
|
+
</Dimmer>
|
|
31
|
+
<ConceptsLabelResults />
|
|
32
|
+
<ConceptsTable />
|
|
33
|
+
<ConceptsPagination />
|
|
34
|
+
</Dimmer.Dimmable>
|
|
35
|
+
</>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ConceptsPanelContent.propTypes = {
|
|
40
|
+
actions: PropTypes.object,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const ConceptsPanel = ({ defaultFilters, actions, filtersGroup }) => {
|
|
44
|
+
const searchProps = {
|
|
45
|
+
initialSortColumn: "name.raw",
|
|
46
|
+
initialSortDirection: "ascending",
|
|
47
|
+
useSearch: useConceptVersionsSearch,
|
|
48
|
+
useFilters: useConceptFilters,
|
|
49
|
+
userFiltersType: "business_concept_user_filters",
|
|
50
|
+
omitFilters: ["current", "domain_ids"],
|
|
51
|
+
translations,
|
|
52
|
+
filtersGroup,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<SearchContextProvider {...searchProps} defaultFilters={defaultFilters}>
|
|
57
|
+
<ConceptsPanelContent actions={actions} />
|
|
58
|
+
</SearchContextProvider>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
27
61
|
|
|
28
62
|
ConceptsPanel.propTypes = {
|
|
29
|
-
|
|
63
|
+
actions: PropTypes.object,
|
|
64
|
+
defaultFilters: PropTypes.object,
|
|
30
65
|
};
|
|
31
66
|
|
|
32
|
-
const mapStateToProps = (
|
|
67
|
+
const mapStateToProps = (state) => ({
|
|
68
|
+
filtersGroup: state.conceptFiltersGroup || [],
|
|
69
|
+
});
|
|
33
70
|
|
|
34
71
|
export default connect(mapStateToProps)(ConceptsPanel);
|
|
@@ -1,123 +1,94 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
|
-
import { compose } from "redux";
|
|
5
4
|
import { connect } from "react-redux";
|
|
5
|
+
import { useLocation } from "react-router-dom";
|
|
6
6
|
import { Table, Header, Icon } from "semantic-ui-react";
|
|
7
7
|
import { FormattedMessage } from "react-intl";
|
|
8
|
-
import {
|
|
9
|
-
import { getSortInfo, sortColumn } from "@truedat/core/services/sort";
|
|
8
|
+
import { sortColumn } from "@truedat/core/services/sort";
|
|
10
9
|
import { CONCEPTS_PENDING } from "@truedat/core/routes";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { useSearchContext } from "@truedat/core/search/SearchContext";
|
|
11
|
+
import { getConceptColumns } from "../selectors";
|
|
13
12
|
import ConceptRow from "./ConceptRow";
|
|
14
13
|
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
};
|
|
14
|
+
export const ConceptsTable = ({ columns }) => {
|
|
15
|
+
const {
|
|
16
|
+
searchData,
|
|
17
|
+
loading,
|
|
18
|
+
sortColumn: sortedColumn,
|
|
19
|
+
sortDirection: direction,
|
|
20
|
+
setSortColumn: setColumn,
|
|
21
|
+
setSortDirection: setDirection,
|
|
22
|
+
} = useSearchContext();
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
const concepts = searchData?.data;
|
|
25
|
+
const { pathname } = useLocation();
|
|
26
|
+
const conceptColumns = columns.filter(
|
|
27
|
+
(column) => pathname === CONCEPTS_PENDING || column.name != "status"
|
|
28
|
+
);
|
|
29
|
+
const dummySortFunc = () => {};
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
return (
|
|
32
|
+
<>
|
|
33
|
+
{!_.isEmpty(concepts) && (
|
|
34
|
+
<Table selectable sortable>
|
|
35
|
+
<Table.Header>
|
|
36
|
+
<Table.Row>
|
|
37
|
+
{conceptColumns &&
|
|
38
|
+
conceptColumns.map((column, key) => (
|
|
39
|
+
<Table.HeaderCell
|
|
40
|
+
key={key}
|
|
41
|
+
width={column.width}
|
|
42
|
+
content={
|
|
43
|
+
<FormattedMessage
|
|
44
|
+
id={`concepts.props.${column.header || column.name}`}
|
|
45
|
+
/>
|
|
46
|
+
}
|
|
47
|
+
sorted={
|
|
48
|
+
_.path("sort.name")(column) === sortedColumn
|
|
49
|
+
? direction
|
|
50
|
+
: null
|
|
51
|
+
}
|
|
52
|
+
className={_.path("sort.name")(column) ? "" : "disabled"}
|
|
53
|
+
onClick={() =>
|
|
54
|
+
sortColumn(
|
|
55
|
+
column,
|
|
56
|
+
dummySortFunc,
|
|
57
|
+
setDirection,
|
|
58
|
+
setColumn,
|
|
59
|
+
direction,
|
|
60
|
+
sortedColumn
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
/>
|
|
64
|
+
))}
|
|
65
|
+
</Table.Row>
|
|
66
|
+
</Table.Header>
|
|
67
|
+
<Table.Body>
|
|
68
|
+
{concepts.map((c, i) => (
|
|
69
|
+
<ConceptRow key={i} concept={c} columns={conceptColumns} />
|
|
70
|
+
))}
|
|
71
|
+
</Table.Body>
|
|
72
|
+
</Table>
|
|
73
|
+
)}
|
|
74
|
+
{loading || concepts?.length ? null : (
|
|
75
|
+
<Header as="h4">
|
|
76
|
+
<Icon name="search" />
|
|
77
|
+
<Header.Content>
|
|
78
|
+
<FormattedMessage id="concepts.search.results.empty" />
|
|
79
|
+
</Header.Content>
|
|
80
|
+
</Header>
|
|
81
|
+
)}
|
|
82
|
+
</>
|
|
83
|
+
);
|
|
84
|
+
};
|
|
34
85
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
componentDidUpdate(prevProps) {
|
|
40
|
-
if (prevProps.sortBy != this.props.sortBy) {
|
|
41
|
-
const { column: sortedColumn, direction: direction } = getSortInfo(
|
|
42
|
-
this.props.sortBy
|
|
43
|
-
);
|
|
44
|
-
this.setState({ sortedColumn, direction });
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
render() {
|
|
49
|
-
const { concepts, columns, loading, location, sortConcepts } = this.props;
|
|
50
|
-
const { sortedColumn, direction } = this.state;
|
|
51
|
-
|
|
52
|
-
const pathname = _.prop("pathname")(location);
|
|
53
|
-
const conceptColumns = columns.filter(
|
|
54
|
-
(column) => pathname === CONCEPTS_PENDING || column.name != "status"
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
return (
|
|
58
|
-
<>
|
|
59
|
-
{!_.isEmpty(concepts) && (
|
|
60
|
-
<Table selectable sortable>
|
|
61
|
-
<Table.Header>
|
|
62
|
-
<Table.Row>
|
|
63
|
-
{conceptColumns &&
|
|
64
|
-
conceptColumns.map((column, key) => (
|
|
65
|
-
<Table.HeaderCell
|
|
66
|
-
key={key}
|
|
67
|
-
width={column.width}
|
|
68
|
-
content={
|
|
69
|
-
<FormattedMessage
|
|
70
|
-
id={`concepts.props.${column.header || column.name}`}
|
|
71
|
-
/>
|
|
72
|
-
}
|
|
73
|
-
sorted={
|
|
74
|
-
_.path("sort.name")(column) === sortedColumn
|
|
75
|
-
? direction
|
|
76
|
-
: null
|
|
77
|
-
}
|
|
78
|
-
className={_.path("sort.name")(column) ? "" : "disabled"}
|
|
79
|
-
onClick={() =>
|
|
80
|
-
sortColumn(
|
|
81
|
-
column,
|
|
82
|
-
sortConcepts,
|
|
83
|
-
this.setDirection,
|
|
84
|
-
this.setColumn,
|
|
85
|
-
direction,
|
|
86
|
-
sortedColumn
|
|
87
|
-
)
|
|
88
|
-
}
|
|
89
|
-
/>
|
|
90
|
-
))}
|
|
91
|
-
</Table.Row>
|
|
92
|
-
</Table.Header>
|
|
93
|
-
<Table.Body>
|
|
94
|
-
{concepts.map((c, i) => (
|
|
95
|
-
<ConceptRow key={i} concept={c} columns={conceptColumns} />
|
|
96
|
-
))}
|
|
97
|
-
</Table.Body>
|
|
98
|
-
</Table>
|
|
99
|
-
)}
|
|
100
|
-
{loading || concepts?.length ? null : (
|
|
101
|
-
<Header as="h4">
|
|
102
|
-
<Icon name="search" />
|
|
103
|
-
<Header.Content>
|
|
104
|
-
<FormattedMessage id="concepts.search.results.empty" />
|
|
105
|
-
</Header.Content>
|
|
106
|
-
</Header>
|
|
107
|
-
)}
|
|
108
|
-
</>
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
86
|
+
ConceptsTable.propTypes = {
|
|
87
|
+
columns: PropTypes.array,
|
|
88
|
+
};
|
|
112
89
|
|
|
113
90
|
const mapStateToProps = (state) => ({
|
|
114
91
|
columns: getConceptColumns(state),
|
|
115
|
-
concepts: getConceptsRows(state),
|
|
116
|
-
loading: state.conceptsLoading,
|
|
117
|
-
sortBy: _.path("conceptQuery.sort")(state),
|
|
118
92
|
});
|
|
119
93
|
|
|
120
|
-
export default
|
|
121
|
-
withRouter,
|
|
122
|
-
connect(mapStateToProps, { sortConcepts })
|
|
123
|
-
)(ConceptsTable);
|
|
94
|
+
export default connect(mapStateToProps)(ConceptsTable);
|
|
@@ -1,18 +1,61 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
2
|
import React from "react";
|
|
3
|
-
import
|
|
4
|
-
import { connect } from "react-redux";
|
|
3
|
+
import { useDispatch } from "react-redux";
|
|
5
4
|
import { Button, Popup } from "semantic-ui-react";
|
|
6
|
-
import {
|
|
5
|
+
import { useLocation, useHistory } from "react-router-dom";
|
|
7
6
|
import { FormattedMessage } from "react-intl";
|
|
8
7
|
import { useAuthorized } from "@truedat/core/hooks";
|
|
8
|
+
import { useSearchContext } from "@truedat/core/search/SearchContext";
|
|
9
9
|
import { CONCEPTS_BULK_UPDATE } from "@truedat/core/routes";
|
|
10
|
+
import { bulkUpdateQuery } from "../routines";
|
|
11
|
+
|
|
12
|
+
const withoutTemplate = (filters) =>
|
|
13
|
+
_.negate(_.isEmpty)(filters) && _.negate(_.has("template"))(filters);
|
|
14
|
+
|
|
15
|
+
const singleTemplate = (filters, key) =>
|
|
16
|
+
_.flow(_.propOr([], key), verifyTemplateSize)(filters);
|
|
17
|
+
|
|
18
|
+
const existingTemplate = (conceptFilters, conceptActiveFilters) =>
|
|
19
|
+
withoutTemplate(conceptFilters) ||
|
|
20
|
+
singleTemplate(conceptActiveFilters, "template") ||
|
|
21
|
+
singleTemplate(conceptFilters, "template.values");
|
|
22
|
+
const verifyTemplateSize = (template) => _.size(template) === 1;
|
|
23
|
+
|
|
24
|
+
export const ConceptsUpdateButton = () => {
|
|
25
|
+
const setBulkUpdateQuery = useDispatch();
|
|
26
|
+
|
|
27
|
+
const history = useHistory();
|
|
28
|
+
const {
|
|
29
|
+
allActiveFilters: conceptActiveFilters,
|
|
30
|
+
count: conceptCount,
|
|
31
|
+
filters: conceptFilters,
|
|
32
|
+
loading: conceptsLoading,
|
|
33
|
+
filterParams: searchParams,
|
|
34
|
+
searchData,
|
|
35
|
+
} = useSearchContext();
|
|
10
36
|
|
|
11
|
-
export const ConceptsUpdateButton = ({ updateUrl }) => {
|
|
12
37
|
const { pathname } = useLocation();
|
|
13
38
|
const authorized = useAuthorized();
|
|
14
39
|
const pathNameWithoutSlash = pathname.split("/").pop();
|
|
15
40
|
|
|
41
|
+
const updateUrl =
|
|
42
|
+
conceptCount !== 0 &&
|
|
43
|
+
!conceptsLoading &&
|
|
44
|
+
existingTemplate(conceptFilters, conceptActiveFilters)
|
|
45
|
+
? CONCEPTS_BULK_UPDATE
|
|
46
|
+
: null;
|
|
47
|
+
|
|
48
|
+
const navigate = () => {
|
|
49
|
+
setBulkUpdateQuery(
|
|
50
|
+
bulkUpdateQuery({
|
|
51
|
+
conceptCount,
|
|
52
|
+
searchParams,
|
|
53
|
+
concepts: searchData?.data || [],
|
|
54
|
+
})
|
|
55
|
+
);
|
|
56
|
+
history.push(updateUrl + `?${pathNameWithoutSlash}` || "");
|
|
57
|
+
};
|
|
58
|
+
|
|
16
59
|
return authorized ? (
|
|
17
60
|
<Popup
|
|
18
61
|
content={<FormattedMessage id="concepts.actions.bulk_update.popup" />}
|
|
@@ -22,8 +65,7 @@ export const ConceptsUpdateButton = ({ updateUrl }) => {
|
|
|
22
65
|
<span className="button-update">
|
|
23
66
|
<Button
|
|
24
67
|
primary
|
|
25
|
-
|
|
26
|
-
to={updateUrl + `?${pathNameWithoutSlash}` || ""}
|
|
68
|
+
onClick={navigate}
|
|
27
69
|
content={<FormattedMessage id="actions.update" />}
|
|
28
70
|
disabled={_.isEmpty(updateUrl)}
|
|
29
71
|
/>
|
|
@@ -33,34 +75,4 @@ export const ConceptsUpdateButton = ({ updateUrl }) => {
|
|
|
33
75
|
) : null;
|
|
34
76
|
};
|
|
35
77
|
|
|
36
|
-
|
|
37
|
-
updateUrl: PropTypes.string,
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const withoutTemplate = (filters) =>
|
|
41
|
-
_.negate(_.isEmpty)(filters) && _.negate(_.has("template"))(filters);
|
|
42
|
-
|
|
43
|
-
const singleTemplate = (filters, key) =>
|
|
44
|
-
_.flow(_.propOr([], key), verifyTemplateSize)(filters);
|
|
45
|
-
|
|
46
|
-
const existingTemplate = (conceptFilters, conceptActiveFilters) =>
|
|
47
|
-
withoutTemplate(conceptFilters) ||
|
|
48
|
-
singleTemplate(conceptActiveFilters, "template") ||
|
|
49
|
-
singleTemplate(conceptFilters, "template.values");
|
|
50
|
-
const verifyTemplateSize = (template) => _.size(template) === 1;
|
|
51
|
-
|
|
52
|
-
const mapStateToProps = ({
|
|
53
|
-
conceptActiveFilters,
|
|
54
|
-
conceptFilters,
|
|
55
|
-
conceptCount,
|
|
56
|
-
conceptsLoading,
|
|
57
|
-
}) => ({
|
|
58
|
-
updateUrl:
|
|
59
|
-
conceptCount !== 0 &&
|
|
60
|
-
!conceptsLoading &&
|
|
61
|
-
existingTemplate(conceptFilters, conceptActiveFilters)
|
|
62
|
-
? CONCEPTS_BULK_UPDATE
|
|
63
|
-
: null,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
export default connect(mapStateToProps)(ConceptsUpdateButton);
|
|
78
|
+
export default ConceptsUpdateButton;
|
|
@@ -2,9 +2,6 @@ import React from "react";
|
|
|
2
2
|
import PropTypes from "prop-types";
|
|
3
3
|
import { connect } from "react-redux";
|
|
4
4
|
import ConceptsPanel from "./ConceptsPanel";
|
|
5
|
-
import ConceptsLoader from "./ConceptsLoader";
|
|
6
|
-
import ConceptFiltersLoader from "./ConceptFiltersLoader";
|
|
7
|
-
import ConceptUserFiltersLoader from "./ConceptUserFiltersLoader";
|
|
8
5
|
|
|
9
6
|
export const DomainConcepts = ({ domain = {} }) => {
|
|
10
7
|
const defaultFilters = {
|
|
@@ -12,14 +9,8 @@ export const DomainConcepts = ({ domain = {} }) => {
|
|
|
12
9
|
current: [true],
|
|
13
10
|
status: ["published"],
|
|
14
11
|
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
<ConceptUserFiltersLoader />
|
|
18
|
-
<ConceptFiltersLoader defaultFilters={defaultFilters} />
|
|
19
|
-
<ConceptsLoader defaultFilters={defaultFilters} />
|
|
20
|
-
<ConceptsPanel />
|
|
21
|
-
</>
|
|
22
|
-
);
|
|
12
|
+
|
|
13
|
+
return <ConceptsPanel defaultFilters={defaultFilters} />;
|
|
23
14
|
};
|
|
24
15
|
|
|
25
16
|
DomainConcepts.propTypes = {
|