@truedat/dd 5.16.2 → 5.16.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.
Files changed (87) hide show
  1. package/package.json +5 -5
  2. package/src/api.js +6 -0
  3. package/src/components/GrantRequestApprovalResults.js +40 -0
  4. package/src/components/GrantRequestBulkActions.js +136 -0
  5. package/src/components/GrantRequestBulkApprovalForm.js +69 -0
  6. package/src/components/GrantRequestBulkApprovalPopup.js +43 -0
  7. package/src/components/GrantRequestBulkRoleSelector.js +41 -0
  8. package/src/components/GrantRequestRow.js +62 -0
  9. package/src/components/GrantRequestSearchFilters.js +22 -0
  10. package/src/components/GrantRequestsFiltersLoader.js +33 -0
  11. package/src/components/GrantRequestsLabelResults.js +52 -0
  12. package/src/components/GrantRequestsSearch.js +35 -0
  13. package/src/components/GrantRequestsSearchLoader.js +47 -0
  14. package/src/components/GrantRequestsSearchResults.js +156 -0
  15. package/src/components/GrantRequestsSelectedFilters.js +54 -0
  16. package/src/components/GrantRequestsTable.js +131 -0
  17. package/src/components/GrantRoutes.js +34 -16
  18. package/src/components/Grants.js +1 -0
  19. package/src/components/__tests__/GrantRequestApprovalResults.spec.js +30 -0
  20. package/src/components/__tests__/GrantRequestBulkActions.spec.js +31 -0
  21. package/src/components/__tests__/GrantRequestBulkApprovalForm.spec.js +54 -0
  22. package/src/components/__tests__/GrantRequestBulkApprovalPopup.spec.js +17 -0
  23. package/src/components/__tests__/GrantRequestBulkRoleSelector.spec.js +48 -0
  24. package/src/components/__tests__/GrantRequestFiltersLoader.spec.js +20 -0
  25. package/src/components/__tests__/GrantRequestRow.spec.js +95 -0
  26. package/src/components/__tests__/GrantRequestSearchFilters.spec.js +19 -0
  27. package/src/components/__tests__/GrantRequestsLabelResults.spec.js +45 -0
  28. package/src/components/__tests__/GrantRequestsSearch.spec.js +23 -0
  29. package/src/components/__tests__/GrantRequestsSearchLoader.spec.js +15 -0
  30. package/src/components/__tests__/GrantRequestsSearchResults.spec.js +59 -0
  31. package/src/components/__tests__/GrantRequestsTable.spec.js +35 -0
  32. package/src/components/__tests__/__snapshots__/GrantRequestApprovalResults.spec.js.snap +69 -0
  33. package/src/components/__tests__/__snapshots__/GrantRequestBulkActions.spec.js.snap +51 -0
  34. package/src/components/__tests__/__snapshots__/GrantRequestBulkApprovalForm.spec.js.snap +41 -0
  35. package/src/components/__tests__/__snapshots__/GrantRequestBulkApprovalPopup.spec.js.snap +11 -0
  36. package/src/components/__tests__/__snapshots__/GrantRequestBulkRoleSelector.spec.js.snap +56 -0
  37. package/src/components/__tests__/__snapshots__/GrantRequestRow.spec.js.snap +55 -0
  38. package/src/components/__tests__/__snapshots__/GrantRequestSearchFilters.spec.js.snap +47 -0
  39. package/src/components/__tests__/__snapshots__/GrantRequestsLabelResults.spec.js.snap +36 -0
  40. package/src/components/__tests__/__snapshots__/GrantRequestsSearch.spec.js.snap +50 -0
  41. package/src/components/__tests__/__snapshots__/GrantRequestsSearchLoader.spec.js.snap +3 -0
  42. package/src/components/__tests__/__snapshots__/GrantRequestsSearchResults.spec.js.snap +247 -0
  43. package/src/components/__tests__/__snapshots__/GrantRequestsTable.spec.js.snap +19 -0
  44. package/src/components/__tests__/__snapshots__/GrantRoutes.spec.js.snap +0 -4
  45. package/src/components/index.js +8 -0
  46. package/src/hooks/useGrantRequest.js +9 -0
  47. package/src/reducers/__tests__/grantRequestCount.spec.js +38 -0
  48. package/src/reducers/__tests__/grantRequestPermissions.spec.js +66 -0
  49. package/src/reducers/__tests__/grantRequestsActiveFilters.spec.js +90 -0
  50. package/src/reducers/__tests__/grantRequestsFiltersLoading.spec.js +34 -0
  51. package/src/reducers/__tests__/grantRequestsSearch.spec.js +38 -0
  52. package/src/reducers/__tests__/grantRequestsSearchLoading.spec.js +36 -0
  53. package/src/reducers/__tests__/grantRequestsSearchQuery.spec.js +96 -0
  54. package/src/reducers/__tests__/grantRequestsSelectedFilter.spec.js +72 -0
  55. package/src/reducers/grantRequestCount.js +23 -0
  56. package/src/reducers/grantRequestPermissions.js +36 -0
  57. package/src/reducers/grantRequestSearchQuery.js +55 -0
  58. package/src/reducers/grantRequestsActiveFilters.js +56 -0
  59. package/src/reducers/grantRequestsFilters.js +23 -0
  60. package/src/reducers/grantRequestsFiltersLoading.js +14 -0
  61. package/src/reducers/grantRequestsSearch.js +19 -0
  62. package/src/reducers/grantRequestsSearchLoading.js +14 -0
  63. package/src/reducers/grantRequestsSelectedFilter.js +34 -0
  64. package/src/reducers/index.js +22 -0
  65. package/src/reducers/structureRedirect.js +2 -3
  66. package/src/routines.js +13 -0
  67. package/src/sagas/__tests__/fetchGrantRequestsFilters.spec.js +91 -0
  68. package/src/sagas/__tests__/fetchGrantRequestsSearch.spec.js +92 -0
  69. package/src/sagas/fetchGrantRequestsFilters.js +32 -0
  70. package/src/sagas/fetchGrantRequestsSearch.js +30 -0
  71. package/src/sagas/index.js +6 -0
  72. package/src/selectors/__tests__/getGrantRequestsAvailableFilters.spec.js +15 -0
  73. package/src/selectors/__tests__/getGrantRequestsFilterTypes.spec.js +19 -0
  74. package/src/selectors/__tests__/getGrantRequestsSearchColumns.spec.js +30 -0
  75. package/src/selectors/__tests__/getGrantRequestsSearchQuery.spec.js +24 -0
  76. package/src/selectors/__tests__/getGrantRequestsSelectedFilterActiveValues.spec.js +15 -0
  77. package/src/selectors/__tests__/getGrantRequestsSelectedFilterValues.spec.js +15 -0
  78. package/src/selectors/__tests__/getGrantRequestsSelectedFilters.spec.js +13 -0
  79. package/src/selectors/getGrantRequestsAvailableFilters.js +17 -0
  80. package/src/selectors/getGrantRequestsFilterTypes.js +7 -0
  81. package/src/selectors/getGrantRequestsSearchColumns.js +119 -0
  82. package/src/selectors/getGrantRequestsSearchQuery.js +19 -0
  83. package/src/selectors/getGrantRequestsSelectedFilterActiveValues.js +8 -0
  84. package/src/selectors/getGrantRequestsSelectedFilterValues.js +12 -0
  85. package/src/selectors/getGrantRequestsSelectedFilters.js +8 -0
  86. package/src/selectors/index.js +10 -0
  87. package/src/components/GrantRequestApprovals.js +0 -41
@@ -0,0 +1,92 @@
1
+ import { testSaga } from "redux-saga-test-plan";
2
+ import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
3
+ import {
4
+ fetchGrantRequestsSearchRequestSaga,
5
+ fetchGrantRequestsSearchSaga,
6
+ } from "../fetchGrantRequestsSearch";
7
+ import { fetchGrantRequestsSearch } from "../../routines";
8
+ import { API_GRANT_REQUESTS_SEARCH } from "../../api";
9
+
10
+ const body = {
11
+ must: {
12
+ current_status: ["pending"],
13
+ },
14
+ };
15
+ const payload = body;
16
+
17
+ describe("sagas: fetchGrantRequestsSearchRequestSaga", () => {
18
+ it("should invoke fetchGrantRequestsSearchSaga on fetchGrantRequestsSearch.TRIGGER", () => {
19
+ expect(() => {
20
+ testSaga(fetchGrantRequestsSearchRequestSaga)
21
+ .next()
22
+ .debounce(
23
+ 200,
24
+ fetchGrantRequestsSearch.TRIGGER,
25
+ fetchGrantRequestsSearchSaga
26
+ )
27
+ .finish()
28
+ .isDone();
29
+ }).not.toThrow();
30
+ });
31
+
32
+ it("should throw exception if an unhandled action is received", () => {
33
+ expect(() => {
34
+ testSaga(fetchGrantRequestsSearchRequestSaga)
35
+ .next()
36
+ .takeLatest("FOO", fetchGrantRequestsSearchRequestSaga);
37
+ }).toThrow();
38
+ });
39
+ });
40
+
41
+ describe("sagas: fetchGrantRequestsSearchSaga", () => {
42
+ const data = {
43
+ _permissions: ["Role1", "Role2"],
44
+ data: [
45
+ {
46
+ id: 385,
47
+ },
48
+ {
49
+ id: 385,
50
+ },
51
+ ],
52
+ };
53
+
54
+ const headers = {
55
+ "x-total-count": "2",
56
+ };
57
+
58
+ it("should put a success action when a response is returned", () => {
59
+ expect(() => {
60
+ testSaga(fetchGrantRequestsSearchSaga, { payload })
61
+ .next()
62
+ .put(fetchGrantRequestsSearch.request(body))
63
+ .next()
64
+ .call(apiJsonPost, API_GRANT_REQUESTS_SEARCH, body, JSON_OPTS)
65
+ .next({ data, headers })
66
+ .put(fetchGrantRequestsSearch.success({ data, headers }))
67
+ .next()
68
+ .put(fetchGrantRequestsSearch.fulfill())
69
+ .next()
70
+ .isDone();
71
+ }).not.toThrow();
72
+ });
73
+
74
+ it("should put a failure action when the call returns an error", () => {
75
+ const message = "Request failed";
76
+ const error = { message };
77
+
78
+ expect(() => {
79
+ testSaga(fetchGrantRequestsSearchSaga, { payload })
80
+ .next()
81
+ .put(fetchGrantRequestsSearch.request(body))
82
+ .next()
83
+ .call(apiJsonPost, API_GRANT_REQUESTS_SEARCH, body, JSON_OPTS)
84
+ .throw(error)
85
+ .put(fetchGrantRequestsSearch.failure(message))
86
+ .next()
87
+ .put(fetchGrantRequestsSearch.fulfill())
88
+ .next()
89
+ .isDone();
90
+ }).not.toThrow();
91
+ });
92
+ });
@@ -0,0 +1,32 @@
1
+ import _ from "lodash/fp";
2
+ import { call, put, takeLatest } from "redux-saga/effects";
3
+ import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
4
+ import { fetchGrantRequestsFilters } from "../routines";
5
+ import { API_GRANT_REQUESTS_FILTERS_SEARCH } from "../api";
6
+
7
+ export function* fetchGrantRequestsFiltersSaga(payload) {
8
+ try {
9
+ yield put(fetchGrantRequestsFilters.request());
10
+ const url = API_GRANT_REQUESTS_FILTERS_SEARCH;
11
+ const filters = _.propOr({}, "payload.filters")(payload);
12
+ const body = { filters };
13
+ const { data } = yield call(apiJsonPost, url, body, JSON_OPTS);
14
+ yield put(fetchGrantRequestsFilters.success({ data }));
15
+ } catch (error) {
16
+ if (error.response) {
17
+ const { status, data } = error.response;
18
+ yield put(fetchGrantRequestsFilters.failure({ status, data }));
19
+ } else {
20
+ yield put(fetchGrantRequestsFilters.failure(error.message));
21
+ }
22
+ } finally {
23
+ yield put(fetchGrantRequestsFilters.fulfill());
24
+ }
25
+ }
26
+
27
+ export function* fetchGrantRequestsFiltersRequestSaga() {
28
+ yield takeLatest(
29
+ fetchGrantRequestsFilters.TRIGGER,
30
+ fetchGrantRequestsFiltersSaga
31
+ );
32
+ }
@@ -0,0 +1,30 @@
1
+ import { call, put, debounce } from "redux-saga/effects";
2
+ import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
3
+ import { fetchGrantRequestsSearch } from "../routines";
4
+ import { API_GRANT_REQUESTS_SEARCH } from "../api";
5
+
6
+ export function* fetchGrantRequestsSearchSaga({ payload: body }) {
7
+ try {
8
+ const url = API_GRANT_REQUESTS_SEARCH;
9
+ yield put(fetchGrantRequestsSearch.request(body));
10
+ const { data, headers } = yield call(apiJsonPost, url, body, JSON_OPTS);
11
+ yield put(fetchGrantRequestsSearch.success({ data, headers }));
12
+ } catch (error) {
13
+ if (error.response) {
14
+ const { status, data } = error.response;
15
+ yield put(fetchGrantRequestsSearch.failure({ status, data }));
16
+ } else {
17
+ yield put(fetchGrantRequestsSearch.failure(error.message));
18
+ }
19
+ } finally {
20
+ yield put(fetchGrantRequestsSearch.fulfill());
21
+ }
22
+ }
23
+
24
+ export function* fetchGrantRequestsSearchRequestSaga() {
25
+ yield debounce(
26
+ 200,
27
+ fetchGrantRequestsSearch.TRIGGER,
28
+ fetchGrantRequestsSearchSaga
29
+ );
30
+ }
@@ -23,6 +23,8 @@ import { downloadGrantsRequestSaga } from "./downloadGrants";
23
23
  import { downloadReferenceDatasetRequestSaga } from "./downloadReferenceDataset";
24
24
  import { downloadStructuresRequestSaga } from "./downloadStructures";
25
25
  import { fetchGrantFiltersRequestSaga } from "./fetchGrantFilters";
26
+ import { fetchGrantRequestsFiltersRequestSaga } from "./fetchGrantRequestsFilters";
27
+ import { fetchGrantRequestsSearchRequestSaga } from "./fetchGrantRequestsSearch";
26
28
  import { fetchGrantRequestRequestSaga } from "./fetchGrantRequest";
27
29
  import { fetchGrantRequestsRequestSaga } from "./fetchGrantRequests";
28
30
  import { fetchGrantsRequestSaga } from "./fetchGrants";
@@ -85,6 +87,8 @@ export {
85
87
  downloadStructuresRequestSaga,
86
88
  fetchGrantFiltersRequestSaga,
87
89
  fetchGrantRequestRequestSaga,
90
+ fetchGrantRequestsFiltersRequestSaga,
91
+ fetchGrantRequestsSearchRequestSaga,
88
92
  fetchGrantRequestsRequestSaga,
89
93
  fetchGrantsRequestSaga,
90
94
  fetchGraphRequestSaga,
@@ -148,6 +152,8 @@ export default [
148
152
  fetchGrantFiltersRequestSaga(),
149
153
  fetchGrantRequestRequestSaga(),
150
154
  fetchGrantRequestsRequestSaga(),
155
+ fetchGrantRequestsFiltersRequestSaga(),
156
+ fetchGrantRequestsSearchRequestSaga(),
151
157
  fetchGrantsRequestSaga(),
152
158
  fetchGraphRequestSaga(),
153
159
  fetchLineageEventsRequestSaga(),
@@ -0,0 +1,15 @@
1
+ import { getGrantRequestsAvailableFilters } from "..";
2
+
3
+ const foo = { values: ["foo1", "foo2"] };
4
+ const bar = { values: ["bar1", "bar2"] };
5
+ const baz = { values: ["baz1", "baz2"] };
6
+
7
+ describe("selectors: getGrantRequestsAvailableFilters", () => {
8
+ const grantRequestsFilters = { foo, bar, baz };
9
+ const grantRequestsActiveFilters = { baz: [] };
10
+ const state = { grantRequestsFilters, grantRequestsActiveFilters };
11
+
12
+ it("should return the keys of the grant request filters which are not currently active", () => {
13
+ expect(getGrantRequestsAvailableFilters(state)).toEqual(["foo", "bar"]);
14
+ });
15
+ });
@@ -0,0 +1,19 @@
1
+ import { getGrantRequestsFilterTypes } from "..";
2
+
3
+ const foo = { type: "fooType", values: ["foo1", "foo2"] };
4
+ const bar = { type: "barType", values: ["bar1", "bar2"] };
5
+ const bay = { values: ["bay1"] };
6
+
7
+ describe("selectors: getGrantRequestsFilterTypes", () => {
8
+ const state = { grantRequestsFilters: { foo, bar, bay } };
9
+
10
+ const expected = {
11
+ foo: "fooType",
12
+ bar: "barType",
13
+ bay: undefined,
14
+ };
15
+
16
+ it("should return a map with filter types", () => {
17
+ expect(getGrantRequestsFilterTypes(state)).toEqual(expected);
18
+ });
19
+ });
@@ -0,0 +1,30 @@
1
+ import _ from "lodash/fp";
2
+ import {
3
+ defaultGrantRequestsSearchTableColumns,
4
+ getGrantRequestsSearchColumns,
5
+ } from "..";
6
+
7
+ describe("selectors: getGrantRequestsSearchColumns", () => {
8
+ const state = {};
9
+
10
+ it("get default grant requests columns", () => {
11
+ const columns = getGrantRequestsSearchColumns(state);
12
+ expect(_.map("name")(columns)).toEqual(
13
+ _.flow(_.map("name"))(defaultGrantRequestsSearchTableColumns)
14
+ );
15
+ });
16
+
17
+ it("get specified columns in reducer", () => {
18
+ const grantRequestsSearchColumns = [
19
+ {
20
+ name: "foo",
21
+ fieldDecorator: _.identity,
22
+ },
23
+ ];
24
+ const columns = getGrantRequestsSearchColumns({
25
+ ...state,
26
+ grantRequestsSearchColumns,
27
+ });
28
+ expect(columns).toStrictEqual(grantRequestsSearchColumns);
29
+ });
30
+ });
@@ -0,0 +1,24 @@
1
+ import { getGrantRequestsSearchQuery } from "..";
2
+
3
+ const grantRequestSearchQuery = { query: "foo" };
4
+ const grantRequestsActiveFilters = { foo: "bar", bar: "baz" };
5
+ const grantRequestsDefaultFilters = { status: "some status" };
6
+
7
+ describe("selectors: getGrantRequestsSearchQuery", () => {
8
+ const state = {
9
+ grantRequestsDefaultFilters,
10
+ grantRequestsActiveFilters,
11
+ grantRequestSearchQuery,
12
+ };
13
+ it("get query merged with defaults", () => {
14
+ const res = getGrantRequestsSearchQuery({
15
+ grantRequestSearchQuery,
16
+ grantRequestsDefaultFilters,
17
+ grantRequestsActiveFilters,
18
+ });
19
+ expect(res).toEqual({
20
+ query: "foo",
21
+ filters: { foo: "bar", bar: "baz", status: "some status" },
22
+ });
23
+ });
24
+ });
@@ -0,0 +1,15 @@
1
+ import { getGrantRequestsSelectedFilterActiveValues } from "..";
2
+
3
+ const foo = ["foo1", "foo2"];
4
+ const bar = ["bar1", "bar2"];
5
+ const baz = ["baz1", "baz2"];
6
+
7
+ describe("selectors: getGrantRequestsSelectedFilterActiveValues", () => {
8
+ const grantRequestsActiveFilters = { foo: ["foo1"] };
9
+ const grantRequestsSelectedFilter = "foo";
10
+ const state = { grantRequestsActiveFilters, grantRequestsSelectedFilter };
11
+
12
+ it("should return the active values of the currently selected grant filters", () => {
13
+ expect(getGrantRequestsSelectedFilterActiveValues(state)).toEqual(["foo1"]);
14
+ });
15
+ });
@@ -0,0 +1,15 @@
1
+ import { getGrantRequestsSelectedFilterValues } from "../../../../dd/src/selectors";
2
+
3
+ const foo = { values: ["foo1", "foo2"] };
4
+ const bar = { values: ["bar1", "bar2"] };
5
+ const baz = { values: ["baz1", "baz2"] };
6
+
7
+ describe("selectors: getGrantRequestsSelectedFilterValues", () => {
8
+ const grantRequestsSelectedFilter = "foo";
9
+ const grantRequestsFilters = { foo, bar, baz };
10
+ const state = { grantRequestsSelectedFilter, grantRequestsFilters };
11
+
12
+ it("should return the values of the currently selected Grant Request filters", () => {
13
+ expect(getGrantRequestsSelectedFilterValues(state)).toEqual(foo.values);
14
+ });
15
+ });
@@ -0,0 +1,13 @@
1
+ import { getGrantRequestsSelectedFilters } from "..";
2
+
3
+ describe("selectors: getGrantRequestsSelectedFilters", () => {
4
+ const grantRequestsActiveFilters = {
5
+ baz: ["baz1", "baz2"],
6
+ must_not_approved_by: ["approver 1"],
7
+ };
8
+ const state = { grantRequestsActiveFilters };
9
+
10
+ it("should return the keys of the structure filters which are currently active", () => {
11
+ expect(getGrantRequestsSelectedFilters(state)).toEqual(["baz"]);
12
+ });
13
+ });
@@ -0,0 +1,17 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+ import { getGrantRequestsSelectedFilters } from "./getGrantRequestsSelectedFilters";
4
+
5
+ const getGrantRequestsFilters = _.propOr({}, "grantRequestsFilters");
6
+
7
+ export const getGrantRequestsAvailableFilters = createSelector(
8
+ getGrantRequestsFilters,
9
+ getGrantRequestsSelectedFilters,
10
+ (grantRequestsFilters, grantRequestsSelectedFilters) => {
11
+ return _.flow(
12
+ _.omitBy(({ values }) => _.size(values) < 2),
13
+ _.keys,
14
+ _.without(grantRequestsSelectedFilters)
15
+ )(grantRequestsFilters);
16
+ }
17
+ );
@@ -0,0 +1,7 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+
4
+ export const getGrantRequestsFilterTypes = createSelector(
5
+ _.prop("grantRequestsFilters"),
6
+ _.mapValues("type")
7
+ );
@@ -0,0 +1,119 @@
1
+ import _ from "lodash/fp";
2
+ import React from "react";
3
+ import { Header, Icon, Popup } from "semantic-ui-react";
4
+ import { createSelector } from "reselect";
5
+ import { useIntl } from "react-intl";
6
+ import PropTypes from "prop-types";
7
+ import Moment from "react-moment";
8
+
9
+ export const UserDecorator = ({ user }) => {
10
+ return user ? (
11
+ <Header as="h4">
12
+ <Header.Content>{user.full_name}</Header.Content>
13
+ </Header>
14
+ ) : (
15
+ "null"
16
+ );
17
+ };
18
+
19
+ UserDecorator.propTypes = {
20
+ user: PropTypes.object,
21
+ };
22
+
23
+ export const PathDecorator = ({ data_structure_version }) => {
24
+ const path = _.flow(_.prop("path"), _.join(" › "))(data_structure_version);
25
+ return <>{path}</>;
26
+ };
27
+
28
+ PathDecorator.propTypes = {
29
+ data_structure: PropTypes.object,
30
+ };
31
+
32
+ export const StructureDecorator = ({ name, modificationGrant }) => {
33
+ const { formatMessage } = useIntl();
34
+ return (
35
+ <>
36
+ {modificationGrant ? (
37
+ <Popup
38
+ content={formatMessage({ id: "grantRequest.modification_grant_id" })}
39
+ trigger={<Icon name="edit" />}
40
+ />
41
+ ) : null}
42
+ {name}
43
+ </>
44
+ );
45
+ };
46
+
47
+ StructureDecorator.propTypes = {
48
+ name: PropTypes.string,
49
+ modificationGrant: PropTypes.string,
50
+ };
51
+
52
+ const DateDecorator = ({ date }) => {
53
+ const { locale } = useIntl();
54
+ return date ? (
55
+ <Moment locale={locale} date={date} format="YYYY-MM-DD HH:mm" />
56
+ ) : null;
57
+ };
58
+
59
+ DateDecorator.propTypes = {
60
+ date: PropTypes.string,
61
+ };
62
+
63
+ const StatusDecorator = ({ status }) => {
64
+ const { formatMessage } = useIntl();
65
+ return status ? (
66
+ <>{formatMessage({ id: `grantRequest.content.${status}` })}</>
67
+ ) : null;
68
+ };
69
+
70
+ StatusDecorator.propTypes = {
71
+ status: PropTypes.string,
72
+ };
73
+
74
+ export const defaultGrantRequestsSearchTableColumns = [
75
+ {
76
+ name: "user",
77
+ sort: { name: "user.user_name" },
78
+ fieldSelector: (grantRequest) => ({
79
+ user: grantRequest?.user,
80
+ }),
81
+ fieldDecorator: UserDecorator,
82
+ },
83
+ {
84
+ name: "data_structure",
85
+ sort: { name: "data_structure_version.name.raw" },
86
+ fieldSelector: (grantRequest) => ({
87
+ name: grantRequest?.data_structure_version?.name,
88
+ modificationGrant: _.prop("modification_grant_id")(grantRequest),
89
+ }),
90
+ fieldDecorator: StructureDecorator,
91
+ },
92
+ {
93
+ name: "path",
94
+ fieldSelector: (grantRequest) => ({
95
+ data_structure_version: grantRequest?.data_structure_version,
96
+ }),
97
+ fieldDecorator: PathDecorator,
98
+ },
99
+ {
100
+ name: "inserted_at",
101
+ sort: { name: "inserted_at" },
102
+ fieldSelector: (grantRequest) => ({
103
+ date: grantRequest?.inserted_at,
104
+ }),
105
+ fieldDecorator: DateDecorator,
106
+ textAlign: "center",
107
+ width: 2,
108
+ },
109
+ ];
110
+
111
+ export const getGrantRequestsSearchColumns = createSelector(
112
+ [_.prop("grantRequestsSearchColumns")],
113
+ (grantRequestsSearchColumns) => {
114
+ return _.flow(
115
+ _.defaultTo(defaultGrantRequestsSearchTableColumns),
116
+ _.reject({ name: "status" })
117
+ )(grantRequestsSearchColumns);
118
+ }
119
+ );
@@ -0,0 +1,19 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+
4
+ export const getGrantRequestsSearchQuery = createSelector(
5
+ _.prop("grantRequestSearchQuery"),
6
+ _.prop("grantRequestsActiveFilters"),
7
+ _.prop("grantRequestsDefaultFilters"),
8
+ (grantRequestQuery, grantRequestsActiveFilters, defaultFilters) => {
9
+ const query = _.trim(grantRequestQuery?.query);
10
+ const filters = _.omitBy(_.isEmpty)(grantRequestsActiveFilters);
11
+ const filtersWithDefaults = {
12
+ ...defaultFilters,
13
+ ...filters,
14
+ };
15
+ return query
16
+ ? { filters: filtersWithDefaults, query }
17
+ : { filters: filtersWithDefaults };
18
+ }
19
+ );
@@ -0,0 +1,8 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+
4
+ export const getGrantRequestsSelectedFilterActiveValues = createSelector(
5
+ [_.prop("grantRequestsSelectedFilter"), _.prop("grantRequestsActiveFilters")],
6
+ (grantRequestsSelectedFilter, grantRequestsActiveFilters) =>
7
+ _.propOr([], grantRequestsSelectedFilter)(grantRequestsActiveFilters)
8
+ );
@@ -0,0 +1,12 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+ import { formatFilterValues } from "@truedat/core/services/filters";
4
+
5
+ export const getGrantRequestsSelectedFilterValues = createSelector(
6
+ [_.prop("grantRequestsSelectedFilter"), _.prop("grantRequestsFilters")],
7
+ (grantRequestsSelectedFilter, grantRequestsFilters) =>
8
+ _.flow(
9
+ _.propOr({ values: [] }, grantRequestsSelectedFilter),
10
+ formatFilterValues
11
+ )(grantRequestsFilters)
12
+ );
@@ -0,0 +1,8 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+
4
+ export const getGrantRequestsSelectedFilters = createSelector(
5
+ [_.prop("grantRequestsActiveFilters")],
6
+ (grantRequestsActiveFilters) =>
7
+ _.without(["must_not_approved_by"])(_.keys(grantRequestsActiveFilters))
8
+ );
@@ -3,6 +3,16 @@ export {
3
3
  structureColumnsSelector,
4
4
  structureRowsSelector,
5
5
  } from "./structureColumnsSelector";
6
+ export { getGrantRequestsSelectedFilterActiveValues } from "./getGrantRequestsSelectedFilterActiveValues";
7
+ export { getGrantRequestsFilterTypes } from "./getGrantRequestsFilterTypes";
8
+ export { getGrantRequestsSelectedFilterValues } from "./getGrantRequestsSelectedFilterValues";
9
+ export { getGrantRequestsSelectedFilters } from "./getGrantRequestsSelectedFilters";
10
+ export {
11
+ getGrantRequestsSearchColumns,
12
+ defaultGrantRequestsSearchTableColumns,
13
+ } from "./getGrantRequestsSearchColumns";
14
+ export { getGrantRequestsSearchQuery } from "./getGrantRequestsSearchQuery";
15
+ export { getGrantRequestsAvailableFilters } from "./getGrantRequestsAvailableFilters";
6
16
  export { getGrantAvailableFilters } from "./getGrantAvailableFilters";
7
17
  export { getGrantSelectedFilters } from "./getGrantSelectedFilters";
8
18
  export { getGrantFilterTypes } from "./getGrantFilterTypes";
@@ -1,41 +0,0 @@
1
- import React from "react";
2
- import { connect } from "react-redux";
3
- import PropTypes from "prop-types";
4
- import { useIntl } from "react-intl";
5
- import { Header, Icon, Segment } from "semantic-ui-react";
6
- import {
7
- getGrantRequests,
8
- getGrantRequestsApprovalColumns
9
- } from "../selectors";
10
- import GrantRequests from "./GrantRequests";
11
-
12
- export const GrantRequestApprovals = ({ columns, grantRequests }) => {
13
- const { formatMessage } = useIntl();
14
-
15
- return (
16
- <Segment>
17
- <Header as="h2">
18
- <Icon circular name="key" />
19
- <Header.Content>
20
- {formatMessage({ id: "grantRequests.header.approve" })}
21
- <Header.Subheader>
22
- {formatMessage({ id: "grantRequests.subheader.approve" })}
23
- </Header.Subheader>
24
- </Header.Content>
25
- </Header>
26
- <GrantRequests columns={columns} grantRequests={grantRequests} />
27
- </Segment>
28
- );
29
- };
30
-
31
- const mapStateToProps = state => ({
32
- columns: getGrantRequestsApprovalColumns(state),
33
- grantRequests: getGrantRequests(state)
34
- });
35
-
36
- GrantRequestApprovals.propTypes = {
37
- columns: PropTypes.array,
38
- grantRequests: PropTypes.array
39
- };
40
-
41
- export default connect(mapStateToProps)(GrantRequestApprovals);