@dhis2-ui/table 10.16.2 → 10.16.3

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 (101) hide show
  1. package/package.json +5 -4
  2. package/src/data-table/__tests__/data-table-cell.test.js +168 -0
  3. package/src/data-table/__tests__/data-table-column-header/filter-handle.test.js +43 -0
  4. package/src/data-table/__tests__/data-table-column-header/sorter.test.js +41 -0
  5. package/src/data-table/__tests__/data-table-column-header.test.js +227 -0
  6. package/src/data-table/__tests__/data-table-row/expand-handle-cell.js +32 -0
  7. package/src/data-table/__tests__/data-table-row/expanded-row.test.js +57 -0
  8. package/src/data-table/__tests__/data-table-row.test.js +162 -0
  9. package/src/data-table/__tests__/data-table.test.js +85 -0
  10. package/src/data-table/data-table-body.js +3 -0
  11. package/src/data-table/data-table-cell.js +111 -0
  12. package/src/data-table/data-table-column-header/data-table-column-header.js +130 -0
  13. package/src/data-table/data-table-column-header/data-table-column-header.styles.js +30 -0
  14. package/src/data-table/data-table-column-header/filter-handle.js +30 -0
  15. package/src/data-table/data-table-column-header/sorter.js +67 -0
  16. package/src/data-table/data-table-foot.js +3 -0
  17. package/src/data-table/data-table-head.js +3 -0
  18. package/src/data-table/data-table-row/data-table-row.js +103 -0
  19. package/src/data-table/data-table-row/data-table-row.styles.js +20 -0
  20. package/src/data-table/data-table-row/drag-handle-cell.js +9 -0
  21. package/src/data-table/data-table-row/expand-handle-cell.js +28 -0
  22. package/src/data-table/data-table-row/expanded-row.js +51 -0
  23. package/src/data-table/data-table-toolbar.js +3 -0
  24. package/src/data-table/data-table.e2e.stories.js +192 -0
  25. package/src/data-table/data-table.js +75 -0
  26. package/src/data-table/data-table.prod.stories.js +1342 -0
  27. package/src/data-table/features/can_scroll/index.js +48 -0
  28. package/src/data-table/features/can_scroll.feature +31 -0
  29. package/src/data-table/index.js +8 -0
  30. package/src/data-table/table-elements/__tests__/table-body.test.js +40 -0
  31. package/src/data-table/table-elements/__tests__/table-data-cell.test.js +123 -0
  32. package/src/data-table/table-elements/__tests__/table-foot.test.js +40 -0
  33. package/src/data-table/table-elements/__tests__/table-head.test.js +40 -0
  34. package/src/data-table/table-elements/__tests__/table-header-cell-action.test.js +46 -0
  35. package/src/data-table/table-elements/__tests__/table-header-cell.test.js +130 -0
  36. package/src/data-table/table-elements/__tests__/table-row.test.js +52 -0
  37. package/src/data-table/table-elements/__tests__/table-scroll-box.test.js +40 -0
  38. package/src/data-table/table-elements/__tests__/table-toolbar.test.js +44 -0
  39. package/src/data-table/table-elements/__tests__/table.test.js +53 -0
  40. package/src/data-table/table-elements/features/can_scroll/index.js +42 -0
  41. package/src/data-table/table-elements/features/can_scroll.feature +31 -0
  42. package/src/data-table/table-elements/index.js +10 -0
  43. package/src/data-table/table-elements/table-body.js +75 -0
  44. package/src/data-table/table-elements/table-data-cell/table-data-cell.js +126 -0
  45. package/src/data-table/table-elements/table-data-cell/table-data-cell.styles.js +42 -0
  46. package/src/data-table/table-elements/table-foot.js +35 -0
  47. package/src/data-table/table-elements/table-head.js +26 -0
  48. package/src/data-table/table-elements/table-header-cell/table-header-cell.js +121 -0
  49. package/src/data-table/table-elements/table-header-cell/table-header-cell.styles.js +71 -0
  50. package/src/data-table/table-elements/table-header-cell-action.js +62 -0
  51. package/src/data-table/table-elements/table-row.js +52 -0
  52. package/src/data-table/table-elements/table-scroll-box.js +41 -0
  53. package/src/data-table/table-elements/table-toolbar.js +50 -0
  54. package/src/data-table/table-elements/table.e2e.stories.js +190 -0
  55. package/src/data-table/table-elements/table.js +70 -0
  56. package/src/data-table/table-elements/table.stories.internal.js +1144 -0
  57. package/src/index.js +32 -0
  58. package/src/locales/ar/translations.json +4 -0
  59. package/src/locales/cs/translations.json +4 -0
  60. package/src/locales/en/translations.json +4 -0
  61. package/src/locales/es/translations.json +4 -0
  62. package/src/locales/es_419/translations.json +4 -0
  63. package/src/locales/fr/translations.json +4 -0
  64. package/src/locales/index.js +44 -0
  65. package/src/locales/km/translations.json +4 -0
  66. package/src/locales/lo/translations.json +4 -0
  67. package/src/locales/nb/translations.json +4 -0
  68. package/src/locales/nl/translations.json +4 -0
  69. package/src/locales/pt/translations.json +4 -0
  70. package/src/locales/ru/translations.json +4 -0
  71. package/src/locales/uk/translations.json +4 -0
  72. package/src/locales/uz_UZ_Cyrl/translations.json +4 -0
  73. package/src/locales/zh/translations.json +4 -0
  74. package/src/stacked-table/add-col-num-to-children.js +16 -0
  75. package/src/stacked-table/content-with-title.js +40 -0
  76. package/src/stacked-table/extract-header-labels.js +99 -0
  77. package/src/stacked-table/index.js +8 -0
  78. package/src/stacked-table/stacked-table-body.js +23 -0
  79. package/src/stacked-table/stacked-table-cell-head.js +39 -0
  80. package/src/stacked-table/stacked-table-cell.js +60 -0
  81. package/src/stacked-table/stacked-table-foot.js +24 -0
  82. package/src/stacked-table/stacked-table-head.js +23 -0
  83. package/src/stacked-table/stacked-table-row-head.js +19 -0
  84. package/src/stacked-table/stacked-table-row.js +50 -0
  85. package/src/stacked-table/stacked-table.js +33 -0
  86. package/src/stacked-table/stacked-table.prod.stories.js +463 -0
  87. package/src/stacked-table/stacked-table.test.js +127 -0
  88. package/src/stacked-table/supply-header-labels-to-children.js +7 -0
  89. package/src/stacked-table/table-context.js +4 -0
  90. package/src/stacked-table/table.js +28 -0
  91. package/src/table/index.js +8 -0
  92. package/src/table/table-body.js +21 -0
  93. package/src/table/table-cell-head.js +56 -0
  94. package/src/table/table-cell.js +56 -0
  95. package/src/table/table-context.js +7 -0
  96. package/src/table/table-foot.js +21 -0
  97. package/src/table/table-head.js +21 -0
  98. package/src/table/table-row-head.js +30 -0
  99. package/src/table/table-row.js +51 -0
  100. package/src/table/table.js +41 -0
  101. package/src/table/table.prod.stories.js +724 -0
@@ -0,0 +1,463 @@
1
+ import { Button } from '@dhis2-ui/button'
2
+ import React from 'react'
3
+ import { StackedTableBody } from './stacked-table-body.js'
4
+ import { StackedTableCellHead } from './stacked-table-cell-head.js'
5
+ import { StackedTableCell } from './stacked-table-cell.js'
6
+ import { StackedTableFoot } from './stacked-table-foot.js'
7
+ import { StackedTableHead } from './stacked-table-head.js'
8
+ import { StackedTableRowHead } from './stacked-table-row-head.js'
9
+ import { StackedTableRow } from './stacked-table-row.js'
10
+ import { StackedTable } from './stacked-table.js'
11
+
12
+ const description = `
13
+ Expresses tabular data such that each 'row' becomes a table section with the 'column' header in each cell. Multiple rows become multiple sections.
14
+
15
+ Compose with StackedTable child components, as seen in the examples.
16
+
17
+ \`\`\`js
18
+ import {
19
+ StackedTable,
20
+ StackedTableBody,
21
+ StackedTableCell,
22
+ StackedTableCellHead,
23
+ StackedTableFoot,
24
+ StackedTableHead,
25
+ StackedTableRow,
26
+ StackedTableRowHead,
27
+ } from 'dhis2/ui'
28
+ \`\`\`
29
+ `
30
+
31
+ const CustomCell = (props) => (
32
+ <td>
33
+ Received props:
34
+ <code>
35
+ <pre>{JSON.stringify(props, null, 2)}</pre>
36
+ </code>
37
+ </td>
38
+ )
39
+
40
+ export default {
41
+ title: 'Stacked Table',
42
+ component: StackedTable,
43
+ parameters: { docs: { description: { component: description } } },
44
+ }
45
+
46
+ export const Default = (args) => (
47
+ <StackedTable {...args}>
48
+ <StackedTableHead>
49
+ <StackedTableRowHead>
50
+ <StackedTableCellHead>First name</StackedTableCellHead>
51
+ <StackedTableCellHead>Last name</StackedTableCellHead>
52
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
53
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
54
+ <StackedTableCellHead>Age</StackedTableCellHead>
55
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
56
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
57
+ <StackedTableCellHead>Status</StackedTableCellHead>
58
+ </StackedTableRowHead>
59
+ </StackedTableHead>
60
+ <StackedTableBody>
61
+ <StackedTableRow>
62
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
63
+ <StackedTableCell>Kariuki</StackedTableCell>
64
+ <StackedTableCell>02/06/2007</StackedTableCell>
65
+ <StackedTableCell>05/25/1972</StackedTableCell>
66
+ <StackedTableCell>66</StackedTableCell>
67
+ <StackedTableCell>Jawi</StackedTableCell>
68
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
69
+ <StackedTableCell>Incomplete</StackedTableCell>
70
+ </StackedTableRow>
71
+ </StackedTableBody>
72
+ <StackedTableFoot>
73
+ <StackedTableRow>
74
+ <StackedTableCell colSpan="8" hideTitle>
75
+ <Button primary>StackedTable footer button</Button>
76
+ </StackedTableCell>
77
+ </StackedTableRow>
78
+ </StackedTableFoot>
79
+ </StackedTable>
80
+ )
81
+
82
+ export const HiddenLabel = (args) => (
83
+ <StackedTable {...args}>
84
+ <StackedTableHead>
85
+ <StackedTableRowHead>
86
+ <StackedTableCellHead>First name</StackedTableCellHead>
87
+ <StackedTableCellHead>Last name</StackedTableCellHead>
88
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
89
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
90
+ <StackedTableCellHead>Age</StackedTableCellHead>
91
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
92
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
93
+ <StackedTableCellHead />
94
+ </StackedTableRowHead>
95
+ </StackedTableHead>
96
+ <StackedTableBody>
97
+ <StackedTableRow>
98
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
99
+ <StackedTableCell>Kariuki</StackedTableCell>
100
+ <StackedTableCell>02/06/2007</StackedTableCell>
101
+ <StackedTableCell>05/25/1972</StackedTableCell>
102
+ <StackedTableCell>66</StackedTableCell>
103
+ <StackedTableCell>Jawi</StackedTableCell>
104
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
105
+ <StackedTableCell>
106
+ <Button
107
+ primary
108
+ onClick={() => alert('something should happen now')}
109
+ >
110
+ A row action
111
+ </Button>
112
+ </StackedTableCell>
113
+ </StackedTableRow>
114
+ </StackedTableBody>
115
+ </StackedTable>
116
+ )
117
+
118
+ export const HiddenLabelInCell = (args) => (
119
+ <StackedTable {...args}>
120
+ <StackedTableHead>
121
+ <StackedTableRowHead>
122
+ <StackedTableCellHead>First name</StackedTableCellHead>
123
+ <StackedTableCellHead>Last name</StackedTableCellHead>
124
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
125
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
126
+ <StackedTableCellHead>Age</StackedTableCellHead>
127
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
128
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
129
+ <StackedTableCellHead>Status</StackedTableCellHead>
130
+ </StackedTableRowHead>
131
+ </StackedTableHead>
132
+ <StackedTableBody>
133
+ <StackedTableRow>
134
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
135
+ <StackedTableCell>Kariuki</StackedTableCell>
136
+ <StackedTableCell>02/06/2007</StackedTableCell>
137
+ <StackedTableCell>05/25/1972</StackedTableCell>
138
+ <StackedTableCell>66</StackedTableCell>
139
+ <StackedTableCell>Jawi</StackedTableCell>
140
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
141
+ <StackedTableCell hideTitle>
142
+ <Button
143
+ primary
144
+ onClick={() => alert('something should happen now')}
145
+ >
146
+ A row action
147
+ </Button>
148
+ </StackedTableCell>
149
+ </StackedTableRow>
150
+ <StackedTableRow>
151
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
152
+ <StackedTableCell>Kariuki</StackedTableCell>
153
+ <StackedTableCell>02/06/2007</StackedTableCell>
154
+ <StackedTableCell>05/25/1972</StackedTableCell>
155
+ <StackedTableCell>66</StackedTableCell>
156
+ <StackedTableCell>Jawi</StackedTableCell>
157
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
158
+ <StackedTableCell>Incomplete</StackedTableCell>
159
+ </StackedTableRow>
160
+ </StackedTableBody>
161
+ </StackedTable>
162
+ )
163
+
164
+ export const ColspanInHeader = (args) => (
165
+ <StackedTable {...args}>
166
+ <StackedTableHead>
167
+ <StackedTableRowHead>
168
+ <StackedTableCellHead colSpan="2">Name</StackedTableCellHead>
169
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
170
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
171
+ <StackedTableCellHead>Age</StackedTableCellHead>
172
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
173
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
174
+ <StackedTableCellHead>Status</StackedTableCellHead>
175
+ </StackedTableRowHead>
176
+ </StackedTableHead>
177
+ <StackedTableBody>
178
+ <StackedTableRow>
179
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
180
+ <StackedTableCell>Kariuki</StackedTableCell>
181
+ <StackedTableCell>02/06/2007</StackedTableCell>
182
+ <StackedTableCell>05/25/1972</StackedTableCell>
183
+ <StackedTableCell>66</StackedTableCell>
184
+ <StackedTableCell>Jawi</StackedTableCell>
185
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
186
+ <StackedTableCell>Incomplete</StackedTableCell>
187
+ </StackedTableRow>
188
+ </StackedTableBody>
189
+ </StackedTable>
190
+ )
191
+
192
+ export const ColspanInBody = (args) => (
193
+ <StackedTable {...args}>
194
+ <StackedTableHead>
195
+ <StackedTableRowHead>
196
+ <StackedTableCellHead>First name</StackedTableCellHead>
197
+ <StackedTableCellHead>Last name</StackedTableCellHead>
198
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
199
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
200
+ <StackedTableCellHead>Age</StackedTableCellHead>
201
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
202
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
203
+ <StackedTableCellHead>Status</StackedTableCellHead>
204
+ </StackedTableRowHead>
205
+ </StackedTableHead>
206
+ <StackedTableBody>
207
+ <StackedTableRow>
208
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
209
+ <StackedTableCell>Kariuki</StackedTableCell>
210
+ <StackedTableCell colSpan="2">
211
+ {
212
+ "Colspan 2 here. Next cell doesn't get header 'Last updated'."
213
+ }
214
+ </StackedTableCell>
215
+ <StackedTableCell>66</StackedTableCell>
216
+ <StackedTableCell>Jawi</StackedTableCell>
217
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
218
+ <StackedTableCell>Incomplete</StackedTableCell>
219
+ </StackedTableRow>
220
+ <StackedTableRow>
221
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
222
+ <StackedTableCell>Kariuki</StackedTableCell>
223
+ <StackedTableCell>02/06/2007</StackedTableCell>
224
+ <StackedTableCell>05/25/1972</StackedTableCell>
225
+ <StackedTableCell>66</StackedTableCell>
226
+ <StackedTableCell>Jawi</StackedTableCell>
227
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
228
+ <StackedTableCell>Incomplete</StackedTableCell>
229
+ </StackedTableRow>
230
+ </StackedTableBody>
231
+ </StackedTable>
232
+ )
233
+
234
+ export const MultipleHeaderRows = (args) => (
235
+ <StackedTable {...args}>
236
+ <StackedTableHead>
237
+ <StackedTableRowHead>
238
+ <StackedTableCellHead colSpan="2">Name</StackedTableCellHead>
239
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
240
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
241
+ <StackedTableCellHead>Age</StackedTableCellHead>
242
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
243
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
244
+ <StackedTableCellHead>Status</StackedTableCellHead>
245
+ </StackedTableRowHead>
246
+ <StackedTableRowHead>
247
+ <StackedTableCellHead>First name</StackedTableCellHead>
248
+ <StackedTableCellHead>Last name</StackedTableCellHead>
249
+ <StackedTableCellHead colSpan="6"></StackedTableCellHead>
250
+ </StackedTableRowHead>
251
+ </StackedTableHead>
252
+ <StackedTableBody>
253
+ <StackedTableRow>
254
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
255
+ <StackedTableCell>Kariuki</StackedTableCell>
256
+ <StackedTableCell>02/06/2007</StackedTableCell>
257
+ <StackedTableCell>05/25/1972</StackedTableCell>
258
+ <StackedTableCell>66</StackedTableCell>
259
+ <StackedTableCell>Jawi</StackedTableCell>
260
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
261
+ <StackedTableCell>Incomplete</StackedTableCell>
262
+ </StackedTableRow>
263
+ </StackedTableBody>
264
+ </StackedTable>
265
+ )
266
+
267
+ export const LongTitle = (args) => (
268
+ <StackedTable {...args}>
269
+ <StackedTableHead>
270
+ <StackedTableRowHead>
271
+ <StackedTableCellHead>
272
+ This title is so long, it should be displayed in multiple
273
+ lines. Lorem ipsum dolor sit amet, consetetur sadipscing
274
+ elitr, sed diam nonumy eirmod tempor invidunt ut labore et
275
+ dolore magna aliquyam erat, sed diam voluptua. At vero eos
276
+ et accusam et justo duo dolores et ea rebum. Stet clita kasd
277
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
278
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing
279
+ elitr, sed diam nonumy eirmod tempor invidunt ut labore et
280
+ dolore magna aliquyam erat, sed diam voluptua. At vero eos
281
+ et accusam et justo duo dolores et ea rebum. Stet clita kasd
282
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
283
+ amet.
284
+ </StackedTableCellHead>
285
+ </StackedTableRowHead>
286
+ </StackedTableHead>
287
+ <StackedTableBody>
288
+ <StackedTableRow>
289
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
290
+ </StackedTableRow>
291
+ </StackedTableBody>
292
+ </StackedTable>
293
+ )
294
+
295
+ export const _CustomCell = (args) => (
296
+ <StackedTable {...args}>
297
+ <StackedTableHead>
298
+ <StackedTableRowHead>
299
+ <StackedTableCellHead colSpan="2">Name</StackedTableCellHead>
300
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
301
+ </StackedTableRowHead>
302
+ </StackedTableHead>
303
+ <StackedTableBody>
304
+ <StackedTableRow>
305
+ <CustomCell>Onyekachukwu</CustomCell>
306
+ <CustomCell>Kariuki</CustomCell>
307
+ <CustomCell>02/06/2007</CustomCell>
308
+ </StackedTableRow>
309
+ </StackedTableBody>
310
+ </StackedTable>
311
+ )
312
+
313
+ export const CustomCellTitle = (args) => (
314
+ <StackedTable {...args}>
315
+ <StackedTableHead>
316
+ <StackedTableRowHead>
317
+ <StackedTableCellHead colSpan="2">Name</StackedTableCellHead>
318
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
319
+ </StackedTableRowHead>
320
+ </StackedTableHead>
321
+ <StackedTableBody>
322
+ <StackedTableRow>
323
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
324
+ <StackedTableCell title="Custom title">
325
+ Kariuki
326
+ </StackedTableCell>
327
+ <StackedTableCell>02/06/2007</StackedTableCell>
328
+ </StackedTableRow>
329
+ </StackedTableBody>
330
+ </StackedTable>
331
+ )
332
+
333
+ export const LargerTable = (args) => (
334
+ <StackedTable {...args}>
335
+ <StackedTableHead>
336
+ <StackedTableRowHead>
337
+ <StackedTableCellHead>First name</StackedTableCellHead>
338
+ <StackedTableCellHead>Last name</StackedTableCellHead>
339
+ <StackedTableCellHead>Incident date</StackedTableCellHead>
340
+ <StackedTableCellHead>Last updated</StackedTableCellHead>
341
+ <StackedTableCellHead>Age</StackedTableCellHead>
342
+ <StackedTableCellHead>Registering unit</StackedTableCellHead>
343
+ <StackedTableCellHead>Assigned user</StackedTableCellHead>
344
+ <StackedTableCellHead>Status</StackedTableCellHead>
345
+ </StackedTableRowHead>
346
+ </StackedTableHead>
347
+ <StackedTableBody>
348
+ <StackedTableRow>
349
+ <StackedTableCell>Onyekachukwu</StackedTableCell>
350
+ <StackedTableCell>Kariuki</StackedTableCell>
351
+ <StackedTableCell>02/06/2007</StackedTableCell>
352
+ <StackedTableCell>05/25/1972</StackedTableCell>
353
+ <StackedTableCell>66</StackedTableCell>
354
+ <StackedTableCell>Jawi</StackedTableCell>
355
+ <StackedTableCell>Sofie Hubert</StackedTableCell>
356
+ <StackedTableCell>Incomplete</StackedTableCell>
357
+ </StackedTableRow>
358
+ <StackedTableRow>
359
+ <StackedTableCell>Kwasi</StackedTableCell>
360
+ <StackedTableCell>Okafor</StackedTableCell>
361
+ <StackedTableCell>08/11/2010</StackedTableCell>
362
+ <StackedTableCell>02/26/1991</StackedTableCell>
363
+ <StackedTableCell>38</StackedTableCell>
364
+ <StackedTableCell>Mokassie MCHP</StackedTableCell>
365
+ <StackedTableCell>Dashonte Clarke</StackedTableCell>
366
+ <StackedTableCell>Complete</StackedTableCell>
367
+ </StackedTableRow>
368
+ <StackedTableRow>
369
+ <StackedTableCell>Siyabonga</StackedTableCell>
370
+ <StackedTableCell>Abiodun</StackedTableCell>
371
+ <StackedTableCell>07/21/1981</StackedTableCell>
372
+ <StackedTableCell>02/06/2007</StackedTableCell>
373
+ <StackedTableCell>98</StackedTableCell>
374
+ <StackedTableCell>Bathurst MCHP</StackedTableCell>
375
+ <StackedTableCell>Unassigned</StackedTableCell>
376
+ <StackedTableCell>Incomplete</StackedTableCell>
377
+ </StackedTableRow>
378
+ <StackedTableRow>
379
+ <StackedTableCell>Chiyembekezo</StackedTableCell>
380
+ <StackedTableCell>Okeke</StackedTableCell>
381
+ <StackedTableCell>01/23/1982</StackedTableCell>
382
+ <StackedTableCell>07/15/2003</StackedTableCell>
383
+ <StackedTableCell>2</StackedTableCell>
384
+ <StackedTableCell>Mayolla MCHP</StackedTableCell>
385
+ <StackedTableCell>Wan Gengxin</StackedTableCell>
386
+ <StackedTableCell>Incomplete</StackedTableCell>
387
+ </StackedTableRow>
388
+ <StackedTableRow>
389
+ <StackedTableCell>Mtendere</StackedTableCell>
390
+ <StackedTableCell>Afolayan</StackedTableCell>
391
+ <StackedTableCell>08/12/1994</StackedTableCell>
392
+ <StackedTableCell>05/12/1972</StackedTableCell>
393
+ <StackedTableCell>37</StackedTableCell>
394
+ <StackedTableCell>Gbangadu MCHP</StackedTableCell>
395
+ <StackedTableCell>Gvozden Boskovsky</StackedTableCell>
396
+ <StackedTableCell>Complete</StackedTableCell>
397
+ </StackedTableRow>
398
+ <StackedTableRow>
399
+ <StackedTableCell>Inyene</StackedTableCell>
400
+ <StackedTableCell>Okonkwo</StackedTableCell>
401
+ <StackedTableCell>04/01/1971</StackedTableCell>
402
+ <StackedTableCell>03/16/2000</StackedTableCell>
403
+ <StackedTableCell>70</StackedTableCell>
404
+ <StackedTableCell>Kunike Barina</StackedTableCell>
405
+ <StackedTableCell>Oscar de la Cavallería</StackedTableCell>
406
+ <StackedTableCell>Complete</StackedTableCell>
407
+ </StackedTableRow>
408
+ <StackedTableRow>
409
+ <StackedTableCell>Amaka</StackedTableCell>
410
+ <StackedTableCell>Pretorius</StackedTableCell>
411
+ <StackedTableCell>01/25/1996</StackedTableCell>
412
+ <StackedTableCell>09/15/1986</StackedTableCell>
413
+ <StackedTableCell>32</StackedTableCell>
414
+ <StackedTableCell>Bargbo</StackedTableCell>
415
+ <StackedTableCell>Alberto Raya</StackedTableCell>
416
+ <StackedTableCell>Incomplete</StackedTableCell>
417
+ </StackedTableRow>
418
+ <StackedTableRow>
419
+ <StackedTableCell>Meti</StackedTableCell>
420
+ <StackedTableCell>Abiodun</StackedTableCell>
421
+ <StackedTableCell>10/24/2010</StackedTableCell>
422
+ <StackedTableCell>07/26/1989</StackedTableCell>
423
+ <StackedTableCell>8</StackedTableCell>
424
+ <StackedTableCell>Majihun MCHP</StackedTableCell>
425
+ <StackedTableCell>Unassigned</StackedTableCell>
426
+ <StackedTableCell>Complete</StackedTableCell>
427
+ </StackedTableRow>
428
+ <StackedTableRow>
429
+ <StackedTableCell>Eshe</StackedTableCell>
430
+ <StackedTableCell>Okeke</StackedTableCell>
431
+ <StackedTableCell>01/31/1995</StackedTableCell>
432
+ <StackedTableCell>01/31/1995</StackedTableCell>
433
+ <StackedTableCell>63</StackedTableCell>
434
+ <StackedTableCell>Mambiama CHP</StackedTableCell>
435
+ <StackedTableCell>Shadrias Pearson</StackedTableCell>
436
+ <StackedTableCell>Incomplete</StackedTableCell>
437
+ </StackedTableRow>
438
+ <StackedTableRow>
439
+ <StackedTableCell>Obi</StackedTableCell>
440
+ <StackedTableCell>Okafor</StackedTableCell>
441
+ <StackedTableCell>06/07/1990</StackedTableCell>
442
+ <StackedTableCell>01/03/2006</StackedTableCell>
443
+ <StackedTableCell>28</StackedTableCell>
444
+ <StackedTableCell>Dalakuru CHP</StackedTableCell>
445
+ <StackedTableCell>Anatoliy Shcherbatykh</StackedTableCell>
446
+ <StackedTableCell>Incomplete</StackedTableCell>
447
+ </StackedTableRow>
448
+ </StackedTableBody>
449
+ <StackedTableFoot>
450
+ <StackedTableRow>
451
+ <StackedTableCell colSpan="8" hideTitle>
452
+ <Button primary>StackedTable footer button</Button>
453
+ </StackedTableCell>
454
+ </StackedTableRow>
455
+ </StackedTableFoot>
456
+ </StackedTable>
457
+ )
458
+
459
+ export const RTL = (args) => (
460
+ <div dir="rtl">
461
+ <Default {...args} />
462
+ </div>
463
+ )
@@ -0,0 +1,127 @@
1
+ /* eslint-disable react/prop-types */
2
+ import { mount } from 'enzyme'
3
+ import React from 'react'
4
+ import { StackedTableBody } from './stacked-table-body.js'
5
+ import { StackedTableCellHead } from './stacked-table-cell-head.js'
6
+ import { StackedTableCell } from './stacked-table-cell.js'
7
+ import { StackedTableHead } from './stacked-table-head.js'
8
+ import { StackedTableRowHead } from './stacked-table-row-head.js'
9
+ import { StackedTableRow } from './stacked-table-row.js'
10
+ import { StackedTable } from './stacked-table.js'
11
+
12
+ const Table = ({ headerLabels, bodyLabels }) => (
13
+ <StackedTable>
14
+ <StackedTableHead>
15
+ <StackedTableRowHead>
16
+ {headerLabels.map(({ label, ...props }, index) => (
17
+ <StackedTableCellHead {...props} key={label + index}>
18
+ {label}
19
+ </StackedTableCellHead>
20
+ ))}
21
+ </StackedTableRowHead>
22
+ </StackedTableHead>
23
+ <StackedTableBody>
24
+ <StackedTableRow>
25
+ {bodyLabels.map(({ label, ...props }) => (
26
+ <StackedTableCell {...props} key={label}>
27
+ {label}
28
+ </StackedTableCell>
29
+ ))}
30
+ </StackedTableRow>
31
+ </StackedTableBody>
32
+ </StackedTable>
33
+ )
34
+
35
+ describe('StackedTable', () => {
36
+ const headerLabels = [
37
+ { label: 'First name', colSpan: '1' },
38
+ { label: 'Last name', colSpan: '1' },
39
+ { label: 'Incident date', colSpan: '1' },
40
+ { label: 'Last updated', colSpan: '1' },
41
+ { label: 'Age', colSpan: '1' },
42
+ { label: 'Registering unit', colSpan: '1' },
43
+ { label: 'Assigned user', colSpan: '1' },
44
+ { label: 'Status', colSpan: '1' },
45
+ ]
46
+
47
+ const bodyLabels = [
48
+ { label: 'Onyekachukwu' },
49
+ { label: 'Kariuki' },
50
+ { label: '02/06/2007' },
51
+ { label: '05/25/1972' },
52
+ { label: '66' },
53
+ { label: 'Jawi' },
54
+ { label: 'Sofie Hubert' },
55
+ { label: 'Incomplete' },
56
+ ]
57
+
58
+ it('should add the headerLabels to each cell', () => {
59
+ const table = mount(
60
+ <Table headerLabels={headerLabels} bodyLabels={bodyLabels} />
61
+ )
62
+ const cells = table.find('td')
63
+
64
+ headerLabels.forEach((label, index) => {
65
+ const cell = cells.at(index)
66
+ const title = cell.find('.title').text()
67
+
68
+ expect(title).toBe(headerLabels[index].label)
69
+ })
70
+ })
71
+
72
+ it('should not add empty header labels to the body cells', () => {
73
+ const emptyLabelIndex = 2
74
+ const headerLabelsWithEmpty = [
75
+ ...headerLabels.slice(0, emptyLabelIndex),
76
+ '',
77
+ ...headerLabels.slice(emptyLabelIndex + 1),
78
+ ]
79
+ const table = mount(
80
+ <Table
81
+ headerLabels={headerLabelsWithEmpty}
82
+ bodyLabels={bodyLabels}
83
+ />
84
+ )
85
+ const cells = table.find('td')
86
+ const cell = cells.at(emptyLabelIndex)
87
+ const title = cell.find('.title')
88
+
89
+ expect(title).toHaveLength(0)
90
+ })
91
+
92
+ it('should add a header label with a colspan higher than 1 to multiple body cells', () => {
93
+ const indexWithColspan = 1
94
+ const colSpan = 3
95
+ const originalHeaderLabel = headerLabels[indexWithColspan]
96
+ const headerLabelsWithColspan = [
97
+ ...headerLabels.slice(0, indexWithColspan),
98
+ { ...originalHeaderLabel, colSpan: `${colSpan}` },
99
+ ...headerLabels.slice(indexWithColspan + colSpan),
100
+ ]
101
+ const table = mount(
102
+ <Table
103
+ headerLabels={headerLabelsWithColspan}
104
+ bodyLabels={bodyLabels}
105
+ />
106
+ )
107
+ const cells = table.find('td')
108
+ const label = headerLabelsWithColspan[indexWithColspan].label
109
+
110
+ // all body cells that are group under the single header should share the same label
111
+ for (let i = 0; i < colSpan; ++i) {
112
+ const index = indexWithColspan + i
113
+ const cell = cells.at(index)
114
+ expect(cell).toHaveLength(1)
115
+
116
+ const title = cell.find('.title')
117
+ expect(title.text()).toBe(label)
118
+ }
119
+
120
+ // the next body cell should have the label of the next header cell
121
+ const titleAfterColspan =
122
+ headerLabelsWithColspan[indexWithColspan + 1].label
123
+ const cellAfterColspan = cells.at(indexWithColspan + colSpan)
124
+ expect(cellAfterColspan).toHaveLength(1)
125
+ expect(cellAfterColspan.find('.title').text()).toBe(titleAfterColspan)
126
+ })
127
+ })
@@ -0,0 +1,7 @@
1
+ import { Children, cloneElement } from 'react'
2
+
3
+ export const supplyHeaderLabelsToChildren = (headerLabels, children) => {
4
+ return Children.map(children, (child) => {
5
+ return cloneElement(child, { headerLabels })
6
+ })
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createContext } from 'react'
2
+
3
+ export const TableContext = createContext({ headerLabels: [] })
4
+ export const { Provider, Consumer } = TableContext
@@ -0,0 +1,28 @@
1
+ import { colors } from '@dhis2/ui-constants'
2
+ import PropTypes from 'prop-types'
3
+ import React from 'react'
4
+
5
+ export const Table = ({ children, className, dataTest }) => (
6
+ <table className={className} data-test={dataTest}>
7
+ {children}
8
+
9
+ <style jsx>{`
10
+ table {
11
+ display: block;
12
+ border: 0;
13
+ background-color: ${colors.white};
14
+ min-width: 100%;
15
+ text-align: left;
16
+ border-collapse: collapse;
17
+ vertical-align: top;
18
+ color: ${colors.grey900};
19
+ }
20
+ `}</style>
21
+ </table>
22
+ )
23
+
24
+ Table.propTypes = {
25
+ children: PropTypes.node.isRequired,
26
+ className: PropTypes.string,
27
+ dataTest: PropTypes.string,
28
+ }
@@ -0,0 +1,8 @@
1
+ export { Table } from './table.js'
2
+ export { TableFoot } from './table-foot.js'
3
+ export { TableBody } from './table-body.js'
4
+ export { TableHead } from './table-head.js'
5
+ export { TableCell } from './table-cell.js'
6
+ export { TableCellHead } from './table-cell-head.js'
7
+ export { TableRow } from './table-row.js'
8
+ export { TableRowHead } from './table-row-head.js'
@@ -0,0 +1,21 @@
1
+ import PropTypes from 'prop-types'
2
+ import React from 'react'
3
+
4
+ export const TableBody = ({
5
+ children,
6
+ className,
7
+ dataTest = 'dhis2-uicore-tablebody',
8
+ role,
9
+ }) => (
10
+ <tbody className={className} data-test={dataTest} role={role}>
11
+ {children}
12
+ </tbody>
13
+ )
14
+
15
+ TableBody.propTypes = {
16
+ /** Should be `<TableRow>` components */
17
+ children: PropTypes.node,
18
+ className: PropTypes.string,
19
+ dataTest: PropTypes.string,
20
+ role: PropTypes.string,
21
+ }