@truedat/dd 4.58.0 → 4.58.2

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 +6 -0
  2. package/package.json +7 -6
  3. package/src/components/Grant.js +225 -0
  4. package/src/components/GrantApprovalRuleConditions.js +1 -1
  5. package/src/components/GrantCrumbs.js +24 -0
  6. package/src/components/GrantRemoval.js +14 -5
  7. package/src/components/GrantRoutes.js +108 -100
  8. package/src/components/__tests__/Grant.spec.js +81 -0
  9. package/src/components/__tests__/GrantApprovalRuleConditions.spec.js +0 -1
  10. package/src/components/__tests__/GrantCrumbs.spec.js +10 -0
  11. package/src/components/__tests__/GrantRemoval.spec.js +25 -4
  12. package/src/components/__tests__/GrantsTable.spec.js +7 -6
  13. package/src/components/__tests__/StructureGrants.spec.js +6 -0
  14. package/src/components/__tests__/StructureLoader.spec.js +1 -1
  15. package/src/components/__tests__/__snapshots__/Grant.spec.js.snap +468 -0
  16. package/src/components/__tests__/__snapshots__/GrantCrumbs.spec.js.snap +102 -0
  17. package/src/components/__tests__/__snapshots__/GrantRoutes.spec.js.snap +12 -4
  18. package/src/components/__tests__/__snapshots__/GrantsTable.spec.js.snap +41 -15
  19. package/src/components/__tests__/__snapshots__/StructureGrants.spec.js.snap +19 -0
  20. package/src/hooks/useGrant.js +18 -0
  21. package/src/messages/en.js +9 -2
  22. package/src/messages/es.js +9 -2
  23. package/src/sagas/__tests__/fetchStructure.spec.js +1 -1
  24. package/src/selectors/__tests__/__snapshots__/getGrantsColumns.spec.js.snap +10 -0
  25. package/src/selectors/__tests__/getGrantsColumns.spec.js +9 -0
  26. package/src/selectors/getGrantsColumns.js +20 -0
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { render } from "@truedat/test/render";
3
+ import GrantCrumbs from "../GrantCrumbs";
4
+
5
+ describe("<GrantCrumbs />", () => {
6
+ it("matches the latest snapshot", () => {
7
+ const container = render(<GrantCrumbs title="foo" />);
8
+ expect(container).toMatchSnapshot();
9
+ });
10
+ });
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { fireEvent } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
3
  import { render } from "@truedat/test/render";
4
4
  import { requestGrantRemoval } from "../../routines";
5
5
  import GrantRemoval from "../GrantRemoval";
@@ -20,7 +20,7 @@ describe("<GrantRemoval />", () => {
20
20
  expect(container).toMatchSnapshot();
21
21
  });
22
22
 
23
- it("on click calls requestGrantRemoval routine", async () => {
23
+ it("on click calls requestGrantRemoval routine if onConfirm si undefined", async () => {
24
24
  const dispatch = jest.fn();
25
25
  const { findByText } = render(
26
26
  <GrantRemoval grant={grant}>
@@ -29,10 +29,10 @@ describe("<GrantRemoval />", () => {
29
29
  { dispatch }
30
30
  );
31
31
 
32
- fireEvent.click(await findByText("child"));
32
+ userEvent.click(await findByText("child"));
33
33
  expect(await findByText("Request grant removal")).toBeInTheDocument();
34
34
 
35
- fireEvent.click(await findByText("Yes"));
35
+ userEvent.click(await findByText("Yes"));
36
36
 
37
37
  expect(dispatch).toHaveBeenLastCalledWith({
38
38
  ...requestGrantRemoval(),
@@ -44,4 +44,25 @@ describe("<GrantRemoval />", () => {
44
44
  },
45
45
  });
46
46
  });
47
+
48
+ it("on click calls onConfirm prop", async () => {
49
+ const onConfirm = jest.fn();
50
+ const { findByText } = render(
51
+ <GrantRemoval grant={grant} onConfirm={onConfirm}>
52
+ <p>child</p>
53
+ </GrantRemoval>
54
+ );
55
+
56
+ userEvent.click(await findByText("child"));
57
+ expect(await findByText("Request grant removal")).toBeInTheDocument();
58
+
59
+ userEvent.click(await findByText("Yes"));
60
+
61
+ expect(onConfirm).toHaveBeenLastCalledWith({
62
+ action: "request_removal",
63
+ data_structure_id: 2,
64
+ id: 1,
65
+ version: 3,
66
+ });
67
+ });
47
68
  });
@@ -100,9 +100,10 @@ describe("<GrantsTable />", () => {
100
100
  .find("TableHeaderCell");
101
101
 
102
102
  expect(tableHeaderCells.at(0).props().sorted).toEqual(null);
103
- expect(tableHeaderCells.at(1).props().sorted).toEqual("ascending");
104
- expect(tableHeaderCells.at(2).props().sorted).toEqual(null);
103
+ expect(tableHeaderCells.at(1).props().sorted).toEqual(null);
104
+ expect(tableHeaderCells.at(2).props().sorted).toEqual("ascending");
105
105
  expect(tableHeaderCells.at(3).props().sorted).toEqual(null);
106
+ expect(tableHeaderCells.at(4).props().sorted).toEqual(null);
106
107
  });
107
108
 
108
109
  it("handles sort when column header is clicked", () => {
@@ -113,7 +114,7 @@ describe("<GrantsTable />", () => {
113
114
  .find("TableRow")
114
115
  .dive()
115
116
  .find("TableHeaderCell")
116
- .at(0)
117
+ .at(1)
117
118
  .simulate("click");
118
119
 
119
120
  expect(
@@ -122,7 +123,7 @@ describe("<GrantsTable />", () => {
122
123
  .find("TableRow")
123
124
  .dive()
124
125
  .find("TableHeaderCell")
125
- .at(0)
126
+ .at(1)
126
127
  .props().sorted
127
128
  ).toEqual("ascending");
128
129
 
@@ -131,7 +132,7 @@ describe("<GrantsTable />", () => {
131
132
  .find("TableRow")
132
133
  .dive()
133
134
  .find("TableHeaderCell")
134
- .at(0)
135
+ .at(1)
135
136
  .simulate("click");
136
137
  expect(
137
138
  wrapper
@@ -139,7 +140,7 @@ describe("<GrantsTable />", () => {
139
140
  .find("TableRow")
140
141
  .dive()
141
142
  .find("TableHeaderCell")
142
- .at(0)
143
+ .at(1)
143
144
  .props().sorted
144
145
  ).toEqual("descending");
145
146
  });
@@ -4,6 +4,7 @@ import { render } from "@truedat/test/render";
4
4
  import { StructureGrants } from "../StructureGrants";
5
5
 
6
6
  describe("<StructureGrants />", () => {
7
+ const idDecorator = ({ id }) => <p>{id}</p>;
7
8
  const userDecorator = ({ user }) => <p>{user.full_name}</p>;
8
9
  const structureDecorator = ({ data_structure }) => (
9
10
  <p>{data_structure.name}</p>
@@ -11,6 +12,11 @@ describe("<StructureGrants />", () => {
11
12
  const endDateDecorator = ({ end_date }) => <p>{end_date}</p>;
12
13
  const fooDecorator = () => "foo";
13
14
  const columns = [
15
+ {
16
+ name: "id",
17
+ fieldDecorator: idDecorator,
18
+ fieldSelector: _.pick(["id"]),
19
+ },
14
20
  {
15
21
  name: "user",
16
22
  fieldDecorator: userDecorator,
@@ -6,7 +6,7 @@ const getProps = () => ({
6
6
  match: { params: { id: 1 } },
7
7
  clearStructure: jest.fn(),
8
8
  structureLoading: false,
9
- fetchStructure: jest.fn()
9
+ fetchStructure: jest.fn(),
10
10
  });
11
11
 
12
12
  describe("<StructureLoader />", () => {
@@ -0,0 +1,468 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<Grant /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <div
6
+ class="ui breadcrumb"
7
+ style="display: none;"
8
+ >
9
+ <a
10
+ class="section"
11
+ href="/grants"
12
+ >
13
+ Grants
14
+ </a>
15
+ <i
16
+ aria-hidden="true"
17
+ class="right angle icon divider"
18
+ />
19
+ <div
20
+ class="active section"
21
+ >
22
+ -&gt; foo
23
+ </div>
24
+ </div>
25
+ <div
26
+ class="ui segment"
27
+ style="display: none;"
28
+ >
29
+ <div
30
+ class="ui grid"
31
+ >
32
+ <div
33
+ class="row"
34
+ >
35
+ <div
36
+ class="sixteen wide column"
37
+ >
38
+ <div
39
+ class="ui grid"
40
+ >
41
+ <div
42
+ class="row"
43
+ >
44
+ <div
45
+ class="twelve wide column"
46
+ >
47
+ <h2
48
+ class="ui header"
49
+ >
50
+ <i
51
+ aria-hidden="true"
52
+ class="key circular icon"
53
+ />
54
+ <div
55
+ class="content"
56
+ >
57
+ Grants -&gt; foo
58
+ </div>
59
+ </h2>
60
+ </div>
61
+ <div
62
+ class="right aligned four wide column"
63
+ >
64
+ <button
65
+ class="ui red button button icon group-actions"
66
+ >
67
+ Remove
68
+ </button>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ <div
73
+ class="ui big very relaxed list"
74
+ role="list"
75
+ >
76
+ <div
77
+ class="item"
78
+ role="listitem"
79
+ >
80
+ <div
81
+ class="content"
82
+ >
83
+ <div
84
+ class="header"
85
+ >
86
+ Structure
87
+ </div>
88
+ <div
89
+ class="description"
90
+ >
91
+ <a
92
+ href="/structures/2/grants"
93
+ >
94
+ foo
95
+ </a>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ <div
100
+ class="item"
101
+ role="listitem"
102
+ >
103
+ <div
104
+ class="header"
105
+ >
106
+ Account
107
+ </div>
108
+ <div
109
+ class="description"
110
+ >
111
+ <h4
112
+ class="ui header"
113
+ >
114
+ <div
115
+ class="content"
116
+ >
117
+ foo user
118
+ <div
119
+ class="sub header"
120
+ >
121
+ foo@gmail.com
122
+ </div>
123
+ </div>
124
+ </h4>
125
+ </div>
126
+ </div>
127
+ <div
128
+ class="item"
129
+ role="listitem"
130
+ >
131
+ <div
132
+ class="header"
133
+ >
134
+ Grant created
135
+ </div>
136
+ <div
137
+ class="description"
138
+ >
139
+ <time
140
+ datetime="1670849349789"
141
+ >
142
+ 2022-12-12 12:49
143
+ </time>
144
+ </div>
145
+ </div>
146
+ <div
147
+ class="item"
148
+ role="listitem"
149
+ >
150
+ <div
151
+ class="header"
152
+ >
153
+ Access granted
154
+ </div>
155
+ <div
156
+ class="description"
157
+ >
158
+ <time
159
+ datetime="1543622400000"
160
+ >
161
+ 2018-12-01
162
+ </time>
163
+ </div>
164
+ </div>
165
+ <div
166
+ class="item"
167
+ role="listitem"
168
+ >
169
+ <div
170
+ class="header"
171
+ >
172
+ Expires
173
+ </div>
174
+ <div
175
+ class="description"
176
+ >
177
+ <time
178
+ datetime="1577750400000"
179
+ >
180
+ 2019-12-31
181
+ </time>
182
+ </div>
183
+ </div>
184
+ <div
185
+ class="item"
186
+ role="listitem"
187
+ >
188
+ <div
189
+ class="header"
190
+ >
191
+ Details
192
+ </div>
193
+ <div
194
+ class="description"
195
+ >
196
+ <div
197
+ class="ui list"
198
+ role="list"
199
+ />
200
+ </div>
201
+ </div>
202
+ </div>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ lazy
208
+ </div>
209
+ `;
210
+
211
+ exports[`<Grant /> matches the latest snapshot with cancel_removal action 1`] = `
212
+ <div>
213
+ <div
214
+ class="ui breadcrumb"
215
+ >
216
+ <a
217
+ class="section"
218
+ href="/grants"
219
+ >
220
+ Grants
221
+ </a>
222
+ <i
223
+ aria-hidden="true"
224
+ class="right angle icon divider"
225
+ />
226
+ <div
227
+ class="active section"
228
+ >
229
+ -&gt; foo
230
+ </div>
231
+ </div>
232
+ <div
233
+ class="ui segment"
234
+ >
235
+ <div
236
+ class="ui grid"
237
+ >
238
+ <div
239
+ class="row"
240
+ >
241
+ <div
242
+ class="sixteen wide column"
243
+ >
244
+ <div
245
+ class="ui grid"
246
+ >
247
+ <div
248
+ class="row"
249
+ >
250
+ <div
251
+ class="twelve wide column"
252
+ >
253
+ <h2
254
+ class="ui header"
255
+ >
256
+ <i
257
+ aria-hidden="true"
258
+ class="key circular icon"
259
+ />
260
+ <div
261
+ class="content"
262
+ >
263
+ Grants -&gt; foo
264
+ </div>
265
+ </h2>
266
+ </div>
267
+ <div
268
+ class="right aligned four wide column"
269
+ >
270
+ <button
271
+ class="ui olive button button icon group-actions"
272
+ >
273
+ Reactivate
274
+ </button>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ <div
279
+ class="ui big very relaxed list"
280
+ role="list"
281
+ >
282
+ <div
283
+ class="item"
284
+ role="listitem"
285
+ >
286
+ <div
287
+ class="content"
288
+ >
289
+ <div
290
+ class="header"
291
+ >
292
+ Structure
293
+ </div>
294
+ <div
295
+ class="description"
296
+ >
297
+ <a
298
+ href="/structures/2/grants"
299
+ >
300
+ foo
301
+ </a>
302
+ </div>
303
+ </div>
304
+ </div>
305
+ <div
306
+ class="item"
307
+ role="listitem"
308
+ >
309
+ <div
310
+ class="header"
311
+ >
312
+ Account
313
+ </div>
314
+ <div
315
+ class="description"
316
+ >
317
+ <h4
318
+ class="ui header"
319
+ >
320
+ <div
321
+ class="content"
322
+ >
323
+ foo user
324
+ <div
325
+ class="sub header"
326
+ >
327
+ foo@gmail.com
328
+ </div>
329
+ </div>
330
+ </h4>
331
+ </div>
332
+ </div>
333
+ <div
334
+ class="item"
335
+ role="listitem"
336
+ >
337
+ <div
338
+ class="header"
339
+ >
340
+ Grant created
341
+ </div>
342
+ <div
343
+ class="description"
344
+ >
345
+ <time
346
+ datetime="1670849349789"
347
+ >
348
+ 2022-12-12 12:49
349
+ </time>
350
+ </div>
351
+ </div>
352
+ <div
353
+ class="item"
354
+ role="listitem"
355
+ >
356
+ <div
357
+ class="header"
358
+ >
359
+ Access granted
360
+ </div>
361
+ <div
362
+ class="description"
363
+ >
364
+ <time
365
+ datetime="1543622400000"
366
+ >
367
+ 2018-12-01
368
+ </time>
369
+ </div>
370
+ </div>
371
+ <div
372
+ class="item"
373
+ role="listitem"
374
+ >
375
+ <div
376
+ class="header"
377
+ >
378
+ Expires
379
+ </div>
380
+ <div
381
+ class="description"
382
+ >
383
+ <time
384
+ datetime="1577750400000"
385
+ >
386
+ 2019-12-31
387
+ </time>
388
+ </div>
389
+ </div>
390
+ <div
391
+ class="item"
392
+ role="listitem"
393
+ >
394
+ <div
395
+ class="header"
396
+ >
397
+ Details
398
+ </div>
399
+ <div
400
+ class="description"
401
+ >
402
+ <div
403
+ class="ui list"
404
+ role="list"
405
+ >
406
+ <div
407
+ class="item"
408
+ role="listitem"
409
+ >
410
+ <div
411
+ class="header dynamic-field-header"
412
+ >
413
+ foo
414
+ </div>
415
+ <div
416
+ class="description"
417
+ >
418
+ <div
419
+ class="ui label"
420
+ >
421
+ 1
422
+ </div>
423
+ <div
424
+ class="ui label"
425
+ >
426
+ 2
427
+ </div>
428
+ <div
429
+ class="ui label"
430
+ >
431
+ 3
432
+ </div>
433
+ <div
434
+ class="ui label"
435
+ >
436
+ 4
437
+ </div>
438
+ </div>
439
+ </div>
440
+ <div
441
+ class="item"
442
+ role="listitem"
443
+ >
444
+ <div
445
+ class="header dynamic-field-header"
446
+ >
447
+ bar
448
+ </div>
449
+ <div
450
+ class="description"
451
+ >
452
+ <div
453
+ class="default-value"
454
+ >
455
+ baz
456
+ </div>
457
+ </div>
458
+ </div>
459
+ </div>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ </div>
467
+ </div>
468
+ `;