@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.
Files changed (113) hide show
  1. package/package.json +6 -6
  2. package/src/concepts/api.js +3 -7
  3. package/src/concepts/components/ConceptActions.js +1 -0
  4. package/src/concepts/components/ConceptCreate.js +6 -4
  5. package/src/concepts/components/ConceptRoutes.js +10 -33
  6. package/src/concepts/components/Concepts.js +25 -16
  7. package/src/concepts/components/ConceptsActions.js +8 -14
  8. package/src/concepts/components/ConceptsBulkUpdate.js +25 -64
  9. package/src/concepts/components/ConceptsLabelResults.js +13 -26
  10. package/src/concepts/components/ConceptsLinksManagement.js +6 -92
  11. package/src/concepts/components/ConceptsPagination.js +13 -11
  12. package/src/concepts/components/ConceptsPanel.js +57 -20
  13. package/src/concepts/components/ConceptsTable.js +77 -106
  14. package/src/concepts/components/ConceptsUpdateButton.js +49 -37
  15. package/src/concepts/components/DomainConcepts.js +2 -11
  16. package/src/concepts/components/LinkedMessage.js +81 -0
  17. package/src/concepts/components/__tests__/ConceptLinksManagement.spec.js +60 -12
  18. package/src/concepts/components/__tests__/Concepts.spec.js +66 -11
  19. package/src/concepts/components/__tests__/ConceptsActions.spec.js +47 -3
  20. package/src/concepts/components/__tests__/ConceptsBulkUpdate.spec.js +7 -3
  21. package/src/concepts/components/__tests__/ConceptsLabelResults.spec.js +34 -4
  22. package/src/concepts/components/__tests__/ConceptsPanel.spec.js +59 -13
  23. package/src/concepts/components/__tests__/ConceptsTable.spec.js +53 -6
  24. package/src/concepts/components/__tests__/ConceptsUpdateButton.spec.js +26 -13
  25. package/src/concepts/components/__tests__/__snapshots__/ConceptLinksManagement.spec.js.snap +164 -8
  26. package/src/concepts/components/__tests__/__snapshots__/Concepts.spec.js.snap +284 -34
  27. package/src/concepts/components/__tests__/__snapshots__/ConceptsActions.spec.js.snap +1 -1
  28. package/src/concepts/components/__tests__/__snapshots__/ConceptsPanel.spec.js.snap +125 -2
  29. package/src/concepts/components/__tests__/__snapshots__/ConceptsTable.spec.js.snap +28 -44
  30. package/src/concepts/components/__tests__/__snapshots__/ConceptsUpdateButton.spec.js.snap +10 -47
  31. package/src/concepts/hooks/useConcepts.js +34 -0
  32. package/src/concepts/reducers/bulkUpdateQueryInfo.js +12 -0
  33. package/src/concepts/reducers/index.js +2 -26
  34. package/src/concepts/relations/components/ConceptRelationsRoutes.js +39 -35
  35. package/src/concepts/relations/components/ConceptSelector.js +44 -29
  36. package/src/concepts/relations/components/__tests__/ConceptRelationForm.spec.js +63 -23
  37. package/src/concepts/relations/components/__tests__/ConceptSelector.spec.js +74 -41
  38. package/src/concepts/relations/components/__tests__/ConceptSelector2.spec.js +72 -0
  39. package/src/concepts/relations/components/__tests__/__snapshots__/ConceptRelationForm.spec.js.snap +44 -8
  40. package/src/concepts/relations/components/__tests__/__snapshots__/ConceptSelector.spec.js.snap +44 -27
  41. package/src/concepts/routines.js +2 -29
  42. package/src/concepts/sagas/__tests__/bulkUpdate.spec.js +6 -10
  43. package/src/concepts/sagas/__tests__/downloadConcepts.spec.js +4 -8
  44. package/src/concepts/sagas/bulkUpdate.js +6 -5
  45. package/src/concepts/sagas/downloadConcepts.js +3 -4
  46. package/src/concepts/sagas/index.js +2 -17
  47. package/src/concepts/selectors/getConceptColumns.js +12 -21
  48. package/src/concepts/selectors/index.js +1 -7
  49. package/src/concepts/utils/filterOptions.js +6 -5
  50. package/src/concepts/components/ConceptFilters.js +0 -20
  51. package/src/concepts/components/ConceptFiltersLoader.js +0 -27
  52. package/src/concepts/components/ConceptSelectedFilters.js +0 -29
  53. package/src/concepts/components/ConceptSelectedFiltersDefault.js +0 -42
  54. package/src/concepts/components/ConceptSelectedFiltersPending.js +0 -41
  55. package/src/concepts/components/ConceptSelectedFiltersPublished.js +0 -73
  56. package/src/concepts/components/ConceptUserFiltersLoader.js +0 -27
  57. package/src/concepts/components/ConceptsLoader.js +0 -38
  58. package/src/concepts/components/ConceptsSearch.js +0 -32
  59. package/src/concepts/components/__tests__/ConceptFilters.spec.js +0 -19
  60. package/src/concepts/components/__tests__/ConceptSelectedFilters.spec.js +0 -10
  61. package/src/concepts/components/__tests__/ConceptUserFiltersLoader.spec.js +0 -27
  62. package/src/concepts/components/__tests__/ConceptsLoader.spec.js +0 -34
  63. package/src/concepts/components/__tests__/__snapshots__/ConceptFilters.spec.js.snap +0 -47
  64. package/src/concepts/components/__tests__/__snapshots__/ConceptSelectedFilters.spec.js.snap +0 -9
  65. package/src/concepts/components/__tests__/__snapshots__/ConceptUserFiltersLoader.spec.js.snap +0 -3
  66. package/src/concepts/reducers/__tests__/conceptActiveFilters.spec.js +0 -83
  67. package/src/concepts/reducers/__tests__/conceptCount.spec.js +0 -33
  68. package/src/concepts/reducers/__tests__/conceptFilters.spec.js +0 -49
  69. package/src/concepts/reducers/__tests__/conceptFiltersLoading.spec.js +0 -28
  70. package/src/concepts/reducers/__tests__/conceptQuery.spec.js +0 -75
  71. package/src/concepts/reducers/__tests__/conceptSelectedFilter.spec.js +0 -66
  72. package/src/concepts/reducers/__tests__/conceptSelectedUserFilter.spec.js +0 -53
  73. package/src/concepts/reducers/__tests__/conceptUserFilters.spec.js +0 -76
  74. package/src/concepts/reducers/__tests__/concepts.spec.js +0 -40
  75. package/src/concepts/reducers/__tests__/conceptsActions.spec.js +0 -38
  76. package/src/concepts/reducers/__tests__/conceptsLoading.spec.js +0 -32
  77. package/src/concepts/reducers/__tests__/conceptsPageSize.spec.js +0 -33
  78. package/src/concepts/reducers/__tests__/previousConceptQuery.spec.js +0 -23
  79. package/src/concepts/reducers/conceptActiveFilters.js +0 -58
  80. package/src/concepts/reducers/conceptCount.js +0 -20
  81. package/src/concepts/reducers/conceptFilters.js +0 -21
  82. package/src/concepts/reducers/conceptFiltersLoading.js +0 -14
  83. package/src/concepts/reducers/conceptQuery.js +0 -60
  84. package/src/concepts/reducers/conceptSelectedFilter.js +0 -34
  85. package/src/concepts/reducers/conceptSelectedUserFilter.js +0 -31
  86. package/src/concepts/reducers/conceptUserFilters.js +0 -36
  87. package/src/concepts/reducers/concepts.js +0 -21
  88. package/src/concepts/reducers/conceptsActions.js +0 -24
  89. package/src/concepts/reducers/conceptsLoading.js +0 -16
  90. package/src/concepts/reducers/conceptsPageSize.js +0 -16
  91. package/src/concepts/reducers/previousConceptQuery.js +0 -15
  92. package/src/concepts/sagas/__tests__/deleteConceptUserFilter.spec.js +0 -75
  93. package/src/concepts/sagas/__tests__/fetchConceptUserFilters.spec.js +0 -70
  94. package/src/concepts/sagas/__tests__/fetchConcepts.spec.js +0 -87
  95. package/src/concepts/sagas/__tests__/saveConceptFilters.spec.js +0 -78
  96. package/src/concepts/sagas/deleteConceptUserFilter.js +0 -34
  97. package/src/concepts/sagas/fecthConceptUserFilters.js +0 -30
  98. package/src/concepts/sagas/fetchConceptFilters.js +0 -29
  99. package/src/concepts/sagas/fetchConcepts.js +0 -27
  100. package/src/concepts/sagas/saveConceptFilters.js +0 -30
  101. package/src/concepts/selectors/__tests__/getConceptAvailableFilters.spec.js +0 -16
  102. package/src/concepts/selectors/__tests__/getConceptFilterTypes.spec.js +0 -19
  103. package/src/concepts/selectors/__tests__/getConceptSelectedFilterActiveValues.spec.js +0 -16
  104. package/src/concepts/selectors/__tests__/getConceptSelectedFilterValues.spec.js +0 -15
  105. package/src/concepts/selectors/__tests__/getConceptSelectedFilters.spec.js +0 -15
  106. package/src/concepts/selectors/__tests__/mapSelectedFilterStateToPropsByStatus.spec.js +0 -37
  107. package/src/concepts/selectors/getConceptAvailableFilters.js +0 -15
  108. package/src/concepts/selectors/getConceptFilterTypes.js +0 -7
  109. package/src/concepts/selectors/getConceptSelectedFilterActiveValues.js +0 -9
  110. package/src/concepts/selectors/getConceptSelectedFilterValues.js +0 -12
  111. package/src/concepts/selectors/getConceptSelectedFilters.js +0 -7
  112. package/src/concepts/selectors/getPreviousConceptQuery.js +0 -1
  113. 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, Message } from "semantic-ui-react";
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
- import ConceptUserFiltersLoader from "./ConceptUserFiltersLoader";
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 { connect } from "react-redux";
2
- import { bindActionCreators } from "redux";
1
+ import React from "react";
3
2
  import { Pagination } from "@truedat/core/components";
4
- import { selectConceptPage } from "../routines";
3
+ import { useSearchContext } from "@truedat/core/search/SearchContext";
5
4
 
6
- const mapDispatchToProps = (dispatch) =>
7
- bindActionCreators({ selectPage: selectConceptPage }, dispatch);
5
+ export default function ConceptsPagination() {
6
+ const { count, size, page, selectPage } = useSearchContext();
7
+ const totalPages = Math.ceil(count / size);
8
8
 
9
- const mapStateToProps = ({ conceptQuery, conceptCount, conceptsPageSize }) => ({
10
- activePage: conceptQuery?.page,
11
- totalPages: Math.ceil(conceptCount / conceptsPageSize),
12
- });
13
-
14
- export default connect(mapStateToProps, mapDispatchToProps)(Pagination);
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
- import ConceptSelectedFilters from "./ConceptSelectedFilters";
11
-
12
- export const ConceptsPanel = ({ loading, ...actions }) => (
13
- <>
14
- <ConceptsActions {...actions} />
15
- <ConceptsSearch />
16
- <ConceptSelectedFilters />
17
- <Dimmer.Dimmable dimmed={loading}>
18
- <Dimmer active={loading} inverted>
19
- <Loader />
20
- </Dimmer>
21
- <ConceptsLabelResults />
22
- <ConceptsTable />
23
- <ConceptsPagination />
24
- </Dimmer.Dimmable>
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
- loading: PropTypes.bool,
63
+ actions: PropTypes.object,
64
+ defaultFilters: PropTypes.object,
30
65
  };
31
66
 
32
- const mapStateToProps = ({ conceptsLoading }) => ({ loading: conceptsLoading });
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 { withRouter } from "react-router";
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 { sortConcepts } from "../routines";
12
- import { getConceptsRows, getConceptColumns } from "../selectors";
10
+ import { useSearchContext } from "@truedat/core/search/SearchContext";
11
+ import { getConceptColumns } from "../selectors";
13
12
  import ConceptRow from "./ConceptRow";
14
13
 
15
- export class ConceptsTable extends React.Component {
16
- static propTypes = {
17
- loading: PropTypes.bool,
18
- sortBy: PropTypes.array,
19
- concepts: PropTypes.array,
20
- columns: PropTypes.array,
21
- location: PropTypes.object,
22
- sortConcepts: PropTypes.func,
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
- //initial state
26
- state = {
27
- sortedColumn: _.prop("column")(getSortInfo(this.props.sortBy)),
28
- direction: _.prop("direction")(getSortInfo(this.props.sortBy)),
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
- setDirection = (direction) => {
32
- this.setState({ direction: direction });
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
- setColumn = (column) => {
36
- this.setState({ sortedColumn: column });
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 compose(
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 PropTypes from "prop-types";
4
- import { connect } from "react-redux";
3
+ import { useDispatch } from "react-redux";
5
4
  import { Button, Popup } from "semantic-ui-react";
6
- import { Link, useLocation } from "react-router-dom";
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
- as={Link}
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
- ConceptsUpdateButton.propTypes = {
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
- return (
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 = {