@truedat/dd 4.40.12 → 4.41.0

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 (26) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +6 -6
  3. package/src/api.js +3 -0
  4. package/src/components/DictionaryRoutes.js +17 -1
  5. package/src/components/PendingStructureNoteRow.js +45 -0
  6. package/src/components/PendingStructureNotes.js +149 -0
  7. package/src/components/PendingStructureNotesTable.js +73 -0
  8. package/src/components/StructuresDomainsUploadOption.js +52 -0
  9. package/src/components/StructuresOptions.js +4 -0
  10. package/src/components/__tests__/PendingStructureNoteRow.spec.js +48 -0
  11. package/src/components/__tests__/PendingStructureNotes.spec.js +102 -0
  12. package/src/components/__tests__/PendingStructureNotesTable.spec.js +83 -0
  13. package/src/components/__tests__/StructuresOptions.spec.js +6 -1
  14. package/src/components/__tests__/__snapshots__/DictionaryRoutes.spec.js.snap +4 -0
  15. package/src/components/__tests__/__snapshots__/PendingStructureNoteRow.spec.js.snap +35 -0
  16. package/src/components/__tests__/__snapshots__/PendingStructureNotes.spec.js.snap +126 -0
  17. package/src/components/__tests__/__snapshots__/PendingStructureNotesTable.spec.js.snap +123 -0
  18. package/src/components/__tests__/__snapshots__/StructuresOptions.spec.js.snap +14 -0
  19. package/src/messages/en.js +27 -0
  20. package/src/messages/es.js +30 -0
  21. package/src/reducers/__tests__/ddMessage.spec.js +76 -0
  22. package/src/reducers/ddMessage.js +51 -8
  23. package/src/routines.js +1 -0
  24. package/src/sagas/__tests__/uploadStructuresDomains.spec.js +81 -0
  25. package/src/sagas/index.js +3 -0
  26. package/src/sagas/uploadStructuresDomains.js +35 -0
@@ -4,6 +4,7 @@ import {
4
4
  bulkUpdateStructures,
5
5
  uploadStructures,
6
6
  updateStructureType,
7
+ uploadStructuresDomains,
7
8
  } from "../routines";
8
9
 
9
10
  const initialState = null;
@@ -18,10 +19,7 @@ const ddMessage = (state = initialState, { type, payload }) => {
18
19
  ? _.flow(
19
20
  _.propOr([], "errors"),
20
21
  _.map((error) => ({
21
- id:
22
- type == bulkUpdateStructures.SUCCESS
23
- ? `structures.bulkUpdateStructures.failed.note.${error.message}`
24
- : `structures.uploadStructures.failed.note.${error.message}`,
22
+ id: `structures.bulkUpdateStructures.failed.note.${error.message}`,
25
23
  fields: {
26
24
  row: error.row,
27
25
  id: error.id,
@@ -29,10 +27,7 @@ const ddMessage = (state = initialState, { type, payload }) => {
29
27
  externalId: error.external_id,
30
28
  message: error.message,
31
29
  },
32
- defaultMessage:
33
- type == bulkUpdateStructures.SUCCESS
34
- ? "structures.bulkUpdateStructures.success.errors"
35
- : "structures.bulkUploadStructures.success.errors",
30
+ defaultMessage: "structures.bulkUploadStructures.success.errors",
36
31
  }))
37
32
  )(payload.data)
38
33
  : "";
@@ -51,6 +46,54 @@ const ddMessage = (state = initialState, { type, payload }) => {
51
46
  initialMaxListItems: 5,
52
47
  };
53
48
  }
49
+
50
+ case uploadStructuresDomains.SUCCESS: {
51
+ const messagesImp = _.has("errors")(payload.data)
52
+ ? _.flow(
53
+ _.propOr([], "errors"),
54
+ _.map((error) => {
55
+ const errorMessage = Object.entries(error.message)
56
+ .map(([field, messages]) => `${field}: ${messages.join(", ")}`)
57
+ .join(" | ");
58
+ return {
59
+ id: `structures.bulkUploadStructuresDomains.success.errors.${errorMessage}`,
60
+ fields: {
61
+ row: error.row,
62
+ id: error.id,
63
+ field: error.field,
64
+ externalId: error.external_id,
65
+ message: errorMessage,
66
+ },
67
+ };
68
+ })
69
+ )(payload.data)
70
+ : "";
71
+ return {
72
+ error: false,
73
+ header: "structures.bulkUploadStructuresDomains.success.header",
74
+ icon: "check",
75
+ color: payload.data.errors.length >= 1 ? "orange" : "green",
76
+ text: "",
77
+ messages: messagesImp,
78
+ fields: {
79
+ count_ids: payload.data.ids.length,
80
+ count_errors: payload.data.errors.length,
81
+ },
82
+ downloadable: true,
83
+ initialMaxListItems: 5,
84
+ };
85
+ }
86
+
87
+ case uploadStructuresDomains.FAILURE:
88
+ return payload.status !== 422
89
+ ? state
90
+ : {
91
+ error: true,
92
+ header: "structures.uploadStructuresDomains.failed.header",
93
+ icon: "attention",
94
+ content: payload?.data?.error?.message,
95
+ };
96
+
54
97
  case updateStructureType.SUCCESS:
55
98
  return {
56
99
  error: false,
package/src/routines.js CHANGED
@@ -132,6 +132,7 @@ export const updateStructureTag = createRoutine("UPDATE_STRUCTURE_TAG");
132
132
  export const updateStructureType = createRoutine("UPDATE_STRUCTURE_TYPE");
133
133
  export const updateSystem = createRoutine("UPDATE_SYSTEM");
134
134
  export const uploadStructures = createRoutine("UPLOAD_STRUCTURES");
135
+ export const uploadStructuresDomains = createRoutine("UPLOAD_STRUCTURES_DOMAINS");
135
136
  export const addGrantRequestToCart = createRoutine("ADD_GRANT_REQUEST_TO_CART");
136
137
  export const removeGrantRequestFromCart = createRoutine(
137
138
  "REMOVE_GRANT_REQUEST_FROM_CART"
@@ -0,0 +1,81 @@
1
+ import { testSaga } from "redux-saga-test-plan";
2
+ import { apiJsonPost, UPLOAD_JSON_OPTS } from "@truedat/core/services/api";
3
+ import {
4
+ uploadStructuresDomainsRequestSaga,
5
+ uploadStructuresDomainsSaga,
6
+ } from "../uploadStructuresDomains";
7
+ import { uploadStructuresDomains } from "../../routines";
8
+ import { API_STRUCTURES_DOMAINS_UPLOAD } from "../../api";
9
+
10
+ describe("sagas: uploadStructuresDomainsRequestSaga", () => {
11
+ it("should invoke uploadStructuresDomainsSaga on trigger", () => {
12
+ expect(() => {
13
+ testSaga(uploadStructuresDomainsRequestSaga)
14
+ .next()
15
+ .takeLatest(
16
+ uploadStructuresDomains.TRIGGER,
17
+ uploadStructuresDomainsSaga
18
+ )
19
+ .finish()
20
+ .isDone();
21
+ }).not.toThrow();
22
+ });
23
+
24
+ it("should throw exception if an unhandled action is received", () => {
25
+ expect(() => {
26
+ testSaga(uploadStructuresDomainsRequestSaga)
27
+ .next()
28
+ .takeLatest("FOO", uploadStructuresDomainsSaga);
29
+ }).toThrow();
30
+ });
31
+ });
32
+
33
+ describe("sagas: uploadStructuresDomainsSaga", () => {
34
+ const body = { structures_domains: "content" };
35
+ const payload = { data: body };
36
+ const data = { message: [1, 2] };
37
+ it("should put a success action when a response is returned", () => {
38
+ expect(() => {
39
+ testSaga(uploadStructuresDomainsSaga, { payload })
40
+ .next()
41
+ .put(uploadStructuresDomains.request())
42
+ .next()
43
+ .call(
44
+ apiJsonPost,
45
+ API_STRUCTURES_DOMAINS_UPLOAD,
46
+ body,
47
+ UPLOAD_JSON_OPTS
48
+ )
49
+ .next({ data })
50
+ .put(uploadStructuresDomains.success({ data }))
51
+ .next()
52
+ .put(uploadStructuresDomains.fulfill())
53
+ .next()
54
+ .isDone();
55
+ }).not.toThrow();
56
+ });
57
+
58
+ it("should put a failure action when the call returns an error", () => {
59
+ const message = "Request failed";
60
+ const error = { message };
61
+
62
+ expect(() => {
63
+ testSaga(uploadStructuresDomainsSaga, { payload })
64
+ .next()
65
+ .put(uploadStructuresDomains.request())
66
+ .next()
67
+ .call(
68
+ apiJsonPost,
69
+ API_STRUCTURES_DOMAINS_UPLOAD,
70
+ body,
71
+ UPLOAD_JSON_OPTS
72
+ )
73
+ .throw(error)
74
+ .put(uploadStructuresDomains.failure(message))
75
+ .next()
76
+ .put(uploadStructuresDomains.fulfill())
77
+ .next()
78
+ .isDone();
79
+ }).not.toThrow();
80
+ });
81
+ });
@@ -46,6 +46,7 @@ import { updateStructureTagRequestSaga } from "./updateStructureTag";
46
46
  import { updateStructureTypeRequestSaga } from "./updateStructureType";
47
47
  import { updateSystemRequestSaga } from "./updateSystem";
48
48
  import { uploadStructuresRequestSaga } from "./uploadStructures";
49
+ import { uploadStructuresDomainsRequestSaga } from "./uploadStructuresDomains";
49
50
  import { operateGrantRequestToCartRequestSaga } from "./operateGrantRequestCart";
50
51
 
51
52
  export {
@@ -97,6 +98,7 @@ export {
97
98
  updateStructureTypeRequestSaga,
98
99
  updateSystemRequestSaga,
99
100
  uploadStructuresRequestSaga,
101
+ uploadStructuresDomainsRequestSaga,
100
102
  operateGrantRequestToCartRequestSaga,
101
103
  };
102
104
 
@@ -149,5 +151,6 @@ export default [
149
151
  updateStructureTypeRequestSaga(),
150
152
  updateSystemRequestSaga(),
151
153
  uploadStructuresRequestSaga(),
154
+ uploadStructuresDomainsRequestSaga(),
152
155
  operateGrantRequestToCartRequestSaga(),
153
156
  ];
@@ -0,0 +1,35 @@
1
+ import { call, put, takeLatest } from "redux-saga/effects";
2
+ import { apiJsonPost, UPLOAD_JSON_OPTS } from "@truedat/core/services/api";
3
+ import { uploadStructuresDomains } from "../routines";
4
+ import { API_STRUCTURES_DOMAINS_UPLOAD } from "../api";
5
+
6
+ export function* uploadStructuresDomainsSaga({ payload }) {
7
+ try {
8
+ const { data: body } = payload;
9
+ yield put(uploadStructuresDomains.request());
10
+ const { data } = yield call(
11
+ apiJsonPost,
12
+ API_STRUCTURES_DOMAINS_UPLOAD,
13
+ body,
14
+ UPLOAD_JSON_OPTS
15
+ );
16
+
17
+ yield put(uploadStructuresDomains.success({ data }));
18
+ } catch (error) {
19
+ if (error.response) {
20
+ const { status, data } = error.response;
21
+ yield put(uploadStructuresDomains.failure({ status, data }));
22
+ } else {
23
+ yield put(uploadStructuresDomains.failure(error.message));
24
+ }
25
+ } finally {
26
+ yield put(uploadStructuresDomains.fulfill());
27
+ }
28
+ }
29
+
30
+ export function* uploadStructuresDomainsRequestSaga() {
31
+ yield takeLatest(
32
+ uploadStructuresDomains.TRIGGER,
33
+ uploadStructuresDomainsSaga
34
+ );
35
+ }