boreal-ui 0.0.883 → 0.0.885
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.
- package/dist/core/{Card-BTrF1W-e.js → Card-BGx1_N5A.js} +125 -72
- package/dist/core/Card-BGx1_N5A.js.map +1 -0
- package/dist/core/{Card-Ha3HknHh.cjs → Card-D9dQ1jar.cjs} +125 -72
- package/dist/core/Card-D9dQ1jar.cjs.map +1 -0
- package/dist/core/Card.cjs.js +1 -1
- package/dist/core/Card.css +0 -6
- package/dist/core/Card.js +1 -1
- package/dist/core/DataTable-BB7nx-un.js +357 -0
- package/dist/core/DataTable-BB7nx-un.js.map +1 -0
- package/dist/core/DataTable-Blz-v6wp.cjs +356 -0
- package/dist/core/DataTable-Blz-v6wp.cjs.map +1 -0
- package/dist/core/DataTable.cjs.js +1 -1
- package/dist/core/DataTable.css +101 -56
- package/dist/core/DataTable.js +1 -1
- package/dist/core/index.cjs.js +2 -2
- package/dist/core/index.js +2 -2
- package/dist/next/{Card-B4XAnIBE.js → Card-BmAdA56_.js} +185 -132
- package/dist/next/Card-BmAdA56_.js.map +1 -0
- package/dist/next/Card.css +183 -189
- package/dist/next/Card.js +1 -1
- package/dist/next/DataTable-l98woAcr.js +387 -0
- package/dist/next/DataTable-l98woAcr.js.map +1 -0
- package/dist/next/DataTable.css +133 -88
- package/dist/next/DataTable.js +1 -1
- package/dist/next/{Footer-DLnIK3R3.js → Footer-Cz_Sq0zJ.js} +2 -2
- package/dist/next/{Footer-DLnIK3R3.js.map → Footer-Cz_Sq0zJ.js.map} +1 -1
- package/dist/next/Footer.js +1 -1
- package/dist/next/{Select-D4bH7djH.js → Select-8eeLU06R.js} +30 -30
- package/dist/next/{Select-D4bH7djH.js.map → Select-8eeLU06R.js.map} +1 -1
- package/dist/next/Select.css +80 -80
- package/dist/next/Select.js +1 -1
- package/dist/next/index.js +4 -4
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/components/Card/Card.types.d.ts +22 -6
- package/dist/types/components/Card/Card.types.d.ts.map +1 -1
- package/dist/types/components/Card/CardBase.d.ts.map +1 -1
- package/dist/types/components/DataTable/DataTable.types.d.ts +61 -0
- package/dist/types/components/DataTable/DataTable.types.d.ts.map +1 -1
- package/dist/types/components/DataTable/DataTableBase.d.ts +1 -1
- package/dist/types/components/DataTable/DataTableBase.d.ts.map +1 -1
- package/dist/types/components/DataTable/core/DataTable.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/core/Card-BTrF1W-e.js.map +0 -1
- package/dist/core/Card-Ha3HknHh.cjs.map +0 -1
- package/dist/core/DataTable-6f7j0ahI.cjs +0 -313
- package/dist/core/DataTable-6f7j0ahI.cjs.map +0 -1
- package/dist/core/DataTable-BC8BOwEL.js +0 -314
- package/dist/core/DataTable-BC8BOwEL.js.map +0 -1
- package/dist/next/Card-B4XAnIBE.js.map +0 -1
- package/dist/next/DataTable-F9mtABNi.js +0 -339
- package/dist/next/DataTable-F9mtABNi.js.map +0 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo, useEffect } from "react";
|
|
3
|
+
import { c as combineClassNames } from "./classNames-AS8QjFq7.js";
|
|
4
|
+
import { c as capitalize } from "./capitalize-C0TSQSPh.js";
|
|
5
|
+
import { d as getDefaultTheme, a as getDefaultRounding, b as getDefaultShadow } from "./boreal-style-config-DsaRlxmw.js";
|
|
6
|
+
import './DataTable.css';function DataTableBase({
|
|
7
|
+
columns,
|
|
8
|
+
data,
|
|
9
|
+
onRowClick,
|
|
10
|
+
classMap,
|
|
11
|
+
theme = getDefaultTheme(),
|
|
12
|
+
rounding = getDefaultRounding(),
|
|
13
|
+
shadow = getDefaultShadow(),
|
|
14
|
+
state = "",
|
|
15
|
+
outline = false,
|
|
16
|
+
className = "",
|
|
17
|
+
tableClassName,
|
|
18
|
+
theadClassName,
|
|
19
|
+
tbodyClassName,
|
|
20
|
+
rowClassName,
|
|
21
|
+
cellClassName,
|
|
22
|
+
striped = true,
|
|
23
|
+
wrapCells = false,
|
|
24
|
+
defaultSortKey,
|
|
25
|
+
defaultSortOrder = "asc",
|
|
26
|
+
serverSort = false,
|
|
27
|
+
onSortChange,
|
|
28
|
+
rowKey,
|
|
29
|
+
caption = "Data table",
|
|
30
|
+
hideCaption = true,
|
|
31
|
+
getSortAriaLabel,
|
|
32
|
+
getSortAnnouncement,
|
|
33
|
+
getRowAriaLabel,
|
|
34
|
+
getRowAriaDescription,
|
|
35
|
+
emptyMessage = "No data available",
|
|
36
|
+
loading = false,
|
|
37
|
+
loadingMessage = "Loading data",
|
|
38
|
+
colCount,
|
|
39
|
+
rowCount,
|
|
40
|
+
"aria-label": ariaLabel,
|
|
41
|
+
"aria-labelledby": ariaLabelledBy,
|
|
42
|
+
"aria-describedby": ariaDescribedBy,
|
|
43
|
+
"data-testid": testId = "data-table"
|
|
44
|
+
}) {
|
|
45
|
+
const [sortKey, setSortKey] = useState(defaultSortKey);
|
|
46
|
+
const [sortOrder, setSortOrder] = useState(defaultSortOrder);
|
|
47
|
+
const [sortAnnouncement, setSortAnnouncement] = useState("");
|
|
48
|
+
const captionId = `${testId}-caption`;
|
|
49
|
+
const liveRegionId = `${testId}-live-region`;
|
|
50
|
+
const computedAriaDescribedBy = [
|
|
51
|
+
ariaDescribedBy,
|
|
52
|
+
caption ? captionId : void 0,
|
|
53
|
+
liveRegionId
|
|
54
|
+
].filter(Boolean).join(" ");
|
|
55
|
+
const sortedData = useMemo(() => {
|
|
56
|
+
if (serverSort || !sortKey) return data;
|
|
57
|
+
return [...data].sort((a, b) => {
|
|
58
|
+
const valA = a[sortKey];
|
|
59
|
+
const valB = b[sortKey];
|
|
60
|
+
if (valA === valB) return 0;
|
|
61
|
+
if (valA == null) return 1;
|
|
62
|
+
if (valB == null) return -1;
|
|
63
|
+
const numA = Number(valA);
|
|
64
|
+
const numB = Number(valB);
|
|
65
|
+
const bothNumeric = !Number.isNaN(numA) && !Number.isNaN(numB);
|
|
66
|
+
if (bothNumeric) {
|
|
67
|
+
return sortOrder === "asc" ? numA - numB : numB - numA;
|
|
68
|
+
}
|
|
69
|
+
const cmp = String(valA).localeCompare(String(valB), void 0, {
|
|
70
|
+
numeric: true
|
|
71
|
+
});
|
|
72
|
+
return sortOrder === "asc" ? cmp : -cmp;
|
|
73
|
+
});
|
|
74
|
+
}, [data, sortKey, sortOrder, serverSort]);
|
|
75
|
+
const announceSortChange = (column, nextOrder) => {
|
|
76
|
+
const message = getSortAnnouncement ? getSortAnnouncement(column, nextOrder) : `${column.label} sorted ${nextOrder === "asc" ? "ascending" : "descending"}`;
|
|
77
|
+
setSortAnnouncement(message);
|
|
78
|
+
};
|
|
79
|
+
const handleSort = (column) => {
|
|
80
|
+
const nextOrder = column.key === sortKey && sortOrder === "asc" ? "desc" : "asc";
|
|
81
|
+
setSortKey(column.key);
|
|
82
|
+
setSortOrder(nextOrder);
|
|
83
|
+
announceSortChange(column, nextOrder);
|
|
84
|
+
if (serverSort && onSortChange) {
|
|
85
|
+
onSortChange(column.key, nextOrder);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const handleSortKeyDown = (column) => (e) => {
|
|
89
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
handleSort(column);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const handleRowKeyDown = (row) => (e) => {
|
|
95
|
+
if (!onRowClick) return;
|
|
96
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
onRowClick(row);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const getColumnStyle = (column) => ({
|
|
102
|
+
width: column.width,
|
|
103
|
+
minWidth: column.minWidth,
|
|
104
|
+
maxWidth: column.maxWidth
|
|
105
|
+
});
|
|
106
|
+
const getRowClassName = (row, index) => {
|
|
107
|
+
if (typeof rowClassName === "function") {
|
|
108
|
+
return rowClassName(row, index);
|
|
109
|
+
}
|
|
110
|
+
return rowClassName;
|
|
111
|
+
};
|
|
112
|
+
const getCellClassName = (value, row, column, rowIndex) => {
|
|
113
|
+
return cellClassName == null ? void 0 : cellClassName(value, row, column, rowIndex);
|
|
114
|
+
};
|
|
115
|
+
const getHeaderScope = (column) => column.scope ?? "col";
|
|
116
|
+
const getHeaderId = (column) => column.id ?? `${testId}-header-${String(column.key)}`;
|
|
117
|
+
const getColumnAriaLabel = (column, isActive) => {
|
|
118
|
+
if (!column.sortable) {
|
|
119
|
+
return column.srLabel;
|
|
120
|
+
}
|
|
121
|
+
if (getSortAriaLabel) {
|
|
122
|
+
return getSortAriaLabel(column, sortOrder, isActive);
|
|
123
|
+
}
|
|
124
|
+
const baseLabel = column.srLabel ?? column.label;
|
|
125
|
+
if (isActive) {
|
|
126
|
+
return `${baseLabel}, sorted ${sortOrder === "asc" ? "ascending" : "descending"}. Activate to sort ${sortOrder === "asc" ? "descending" : "ascending"}.`;
|
|
127
|
+
}
|
|
128
|
+
return `${baseLabel}. Activate to sort ascending.`;
|
|
129
|
+
};
|
|
130
|
+
const renderCellContent = (row, column) => {
|
|
131
|
+
const value = row[column.key];
|
|
132
|
+
if (column.render) {
|
|
133
|
+
return column.render(value, row);
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === "object" && value !== null) {
|
|
136
|
+
return JSON.stringify(value);
|
|
137
|
+
}
|
|
138
|
+
return String(value ?? "");
|
|
139
|
+
};
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (!sortKey) {
|
|
142
|
+
setSortAnnouncement("");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const activeColumn = columns.find((column) => column.key === sortKey);
|
|
146
|
+
if (!activeColumn) return;
|
|
147
|
+
announceSortChange(activeColumn, sortOrder);
|
|
148
|
+
}, []);
|
|
149
|
+
const tableClass = useMemo(
|
|
150
|
+
() => combineClassNames(
|
|
151
|
+
classMap.table,
|
|
152
|
+
classMap[theme],
|
|
153
|
+
classMap[state],
|
|
154
|
+
outline && classMap.outline,
|
|
155
|
+
tableClassName
|
|
156
|
+
),
|
|
157
|
+
[classMap, theme, state, outline, tableClassName]
|
|
158
|
+
);
|
|
159
|
+
const wrapperClass = useMemo(
|
|
160
|
+
() => combineClassNames(
|
|
161
|
+
classMap.wrapper,
|
|
162
|
+
shadow && classMap[`shadow${capitalize(shadow)}`],
|
|
163
|
+
rounding && classMap[`round${capitalize(rounding)}`],
|
|
164
|
+
striped && classMap.striped,
|
|
165
|
+
className
|
|
166
|
+
),
|
|
167
|
+
[classMap, shadow, rounding, striped, className]
|
|
168
|
+
);
|
|
169
|
+
return /* @__PURE__ */ jsxs("div", { className: wrapperClass, "data-testid": testId, children: [
|
|
170
|
+
/* @__PURE__ */ jsx(
|
|
171
|
+
"div",
|
|
172
|
+
{
|
|
173
|
+
id: liveRegionId,
|
|
174
|
+
className: classMap.srOnly ?? "sr_only",
|
|
175
|
+
"aria-live": "polite",
|
|
176
|
+
"aria-atomic": "true",
|
|
177
|
+
children: loading ? loadingMessage : sortAnnouncement
|
|
178
|
+
}
|
|
179
|
+
),
|
|
180
|
+
/* @__PURE__ */ jsxs(
|
|
181
|
+
"table",
|
|
182
|
+
{
|
|
183
|
+
className: tableClass,
|
|
184
|
+
"aria-label": ariaLabel,
|
|
185
|
+
"aria-labelledby": ariaLabelledBy,
|
|
186
|
+
"aria-describedby": computedAriaDescribedBy || void 0,
|
|
187
|
+
"aria-colcount": colCount,
|
|
188
|
+
"aria-rowcount": rowCount,
|
|
189
|
+
children: [
|
|
190
|
+
caption ? /* @__PURE__ */ jsx(
|
|
191
|
+
"caption",
|
|
192
|
+
{
|
|
193
|
+
id: captionId,
|
|
194
|
+
className: hideCaption ? classMap.srOnly ?? "sr_only" : void 0,
|
|
195
|
+
children: caption
|
|
196
|
+
}
|
|
197
|
+
) : null,
|
|
198
|
+
/* @__PURE__ */ jsx("thead", { className: theadClassName, children: /* @__PURE__ */ jsx("tr", { children: columns.map((column) => {
|
|
199
|
+
const isActive = sortKey === column.key;
|
|
200
|
+
return /* @__PURE__ */ jsx(
|
|
201
|
+
"th",
|
|
202
|
+
{
|
|
203
|
+
id: getHeaderId(column),
|
|
204
|
+
scope: getHeaderScope(column),
|
|
205
|
+
style: getColumnStyle(column),
|
|
206
|
+
"aria-sort": column.sortable ? isActive ? sortOrder === "asc" ? "ascending" : "descending" : "none" : void 0,
|
|
207
|
+
className: combineClassNames(
|
|
208
|
+
column.sortable && classMap.sortable,
|
|
209
|
+
classMap.headerCell,
|
|
210
|
+
(column.wrap ?? wrapCells) && classMap.wrapCell,
|
|
211
|
+
column.headerClassName
|
|
212
|
+
),
|
|
213
|
+
children: column.sortable ? /* @__PURE__ */ jsxs(
|
|
214
|
+
"button",
|
|
215
|
+
{
|
|
216
|
+
type: "button",
|
|
217
|
+
className: combineClassNames(
|
|
218
|
+
classMap.sortButton,
|
|
219
|
+
column.sortButtonClassName
|
|
220
|
+
),
|
|
221
|
+
onClick: () => handleSort(column),
|
|
222
|
+
onKeyDown: handleSortKeyDown(column),
|
|
223
|
+
"aria-label": getColumnAriaLabel(column, isActive),
|
|
224
|
+
"data-testid": `${testId}-sort-${String(column.key)}`,
|
|
225
|
+
children: [
|
|
226
|
+
/* @__PURE__ */ jsx("span", { children: column.label }),
|
|
227
|
+
/* @__PURE__ */ jsx("span", { className: classMap.sortIcon, "aria-hidden": "true", children: isActive ? sortOrder === "asc" ? "▲" : "▼" : "⇅" })
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
) : /* @__PURE__ */ jsx("span", { "aria-label": column.srLabel, children: column.label })
|
|
231
|
+
},
|
|
232
|
+
String(column.key)
|
|
233
|
+
);
|
|
234
|
+
}) }) }),
|
|
235
|
+
/* @__PURE__ */ jsx("tbody", { className: tbodyClassName, children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
|
|
236
|
+
"td",
|
|
237
|
+
{
|
|
238
|
+
className: classMap.emptyCell,
|
|
239
|
+
colSpan: columns.length,
|
|
240
|
+
"aria-live": "polite",
|
|
241
|
+
children: loadingMessage
|
|
242
|
+
}
|
|
243
|
+
) }) : sortedData.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
|
|
244
|
+
"td",
|
|
245
|
+
{
|
|
246
|
+
className: classMap.emptyCell,
|
|
247
|
+
colSpan: columns.length,
|
|
248
|
+
"aria-live": "polite",
|
|
249
|
+
children: emptyMessage
|
|
250
|
+
}
|
|
251
|
+
) }) : sortedData.map((row, index) => {
|
|
252
|
+
const key = rowKey ? rowKey(row) : index;
|
|
253
|
+
const rowAriaLabel = getRowAriaLabel == null ? void 0 : getRowAriaLabel(row, index);
|
|
254
|
+
const rowAriaDescription = getRowAriaDescription == null ? void 0 : getRowAriaDescription(row, index);
|
|
255
|
+
return /* @__PURE__ */ jsx(
|
|
256
|
+
"tr",
|
|
257
|
+
{
|
|
258
|
+
className: combineClassNames(
|
|
259
|
+
onRowClick && classMap.clickable,
|
|
260
|
+
striped && index % 2 === 1 && classMap.striped,
|
|
261
|
+
getRowClassName(row, index)
|
|
262
|
+
),
|
|
263
|
+
onClick: () => onRowClick == null ? void 0 : onRowClick(row),
|
|
264
|
+
onKeyDown: handleRowKeyDown(row),
|
|
265
|
+
tabIndex: onRowClick ? 0 : void 0,
|
|
266
|
+
"aria-label": onRowClick ? rowAriaLabel : void 0,
|
|
267
|
+
"aria-description": onRowClick ? rowAriaDescription : void 0,
|
|
268
|
+
"data-testid": `${testId}-row-${key}`,
|
|
269
|
+
children: columns.map((column) => {
|
|
270
|
+
const cellKey = String(column.key);
|
|
271
|
+
const value = row[column.key];
|
|
272
|
+
const content = renderCellContent(row, column);
|
|
273
|
+
const headerId = getHeaderId(column);
|
|
274
|
+
const shouldWrap = column.wrap ?? wrapCells;
|
|
275
|
+
const resolvedCellClassName = combineClassNames(
|
|
276
|
+
classMap.cell,
|
|
277
|
+
shouldWrap && classMap.wrapCell,
|
|
278
|
+
column.cellClassName,
|
|
279
|
+
getCellClassName(value, row, column, index)
|
|
280
|
+
);
|
|
281
|
+
if (column.isRowHeader) {
|
|
282
|
+
return /* @__PURE__ */ jsx(
|
|
283
|
+
"th",
|
|
284
|
+
{
|
|
285
|
+
scope: "row",
|
|
286
|
+
headers: headerId,
|
|
287
|
+
"data-label": column.label,
|
|
288
|
+
style: getColumnStyle(column),
|
|
289
|
+
className: combineClassNames(
|
|
290
|
+
resolvedCellClassName,
|
|
291
|
+
column.rowHeaderClassName
|
|
292
|
+
),
|
|
293
|
+
children: content
|
|
294
|
+
},
|
|
295
|
+
cellKey
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
return /* @__PURE__ */ jsx(
|
|
299
|
+
"td",
|
|
300
|
+
{
|
|
301
|
+
headers: headerId,
|
|
302
|
+
"data-label": column.label,
|
|
303
|
+
style: getColumnStyle(column),
|
|
304
|
+
className: resolvedCellClassName,
|
|
305
|
+
children: content
|
|
306
|
+
},
|
|
307
|
+
cellKey
|
|
308
|
+
);
|
|
309
|
+
})
|
|
310
|
+
},
|
|
311
|
+
key
|
|
312
|
+
);
|
|
313
|
+
}) })
|
|
314
|
+
]
|
|
315
|
+
}
|
|
316
|
+
)
|
|
317
|
+
] });
|
|
318
|
+
}
|
|
319
|
+
DataTableBase.displayName = "DataTableBase";
|
|
320
|
+
const classes = {
|
|
321
|
+
wrapper: "data_table_wrapper",
|
|
322
|
+
table: "data_table",
|
|
323
|
+
headerCell: "data_table_header_cell",
|
|
324
|
+
sortable: "data_table_header_sortable",
|
|
325
|
+
sortButton: "data_table_sort_button",
|
|
326
|
+
sortIcon: "data_table_sort_icon",
|
|
327
|
+
clickable: "data_table_row_clickable",
|
|
328
|
+
striped: "data_table_row_striped",
|
|
329
|
+
cell: "data_table_cell",
|
|
330
|
+
wrapCell: "data_table_cell_wrap",
|
|
331
|
+
primary: "data_table_primary",
|
|
332
|
+
secondary: "data_table_secondary",
|
|
333
|
+
tertiary: "data_table_tertiary",
|
|
334
|
+
quaternary: "data_table_quaternary",
|
|
335
|
+
success: "data_table_success",
|
|
336
|
+
error: "data_table_error",
|
|
337
|
+
warning: "data_table_warning",
|
|
338
|
+
clear: "data_table_clear",
|
|
339
|
+
outline: "data_table_outline",
|
|
340
|
+
shadowNone: "data_table_shadow-None",
|
|
341
|
+
shadowLight: "data_table_shadow-Light",
|
|
342
|
+
shadowMedium: "data_table_shadow-Medium",
|
|
343
|
+
shadowStrong: "data_table_shadow-Strong",
|
|
344
|
+
shadowIntense: "data_table_shadow-Intense",
|
|
345
|
+
roundNone: "data_table_round-None",
|
|
346
|
+
roundSmall: "data_table_round-Small",
|
|
347
|
+
roundMedium: "data_table_round-Medium",
|
|
348
|
+
roundLarge: "data_table_round-Large"
|
|
349
|
+
};
|
|
350
|
+
function DataTable(props) {
|
|
351
|
+
return /* @__PURE__ */ jsx(DataTableBase, { ...props, classMap: classes });
|
|
352
|
+
}
|
|
353
|
+
DataTable.displayName = "DataTable";
|
|
354
|
+
export {
|
|
355
|
+
DataTable as D
|
|
356
|
+
};
|
|
357
|
+
//# sourceMappingURL=DataTable-BB7nx-un.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable-BB7nx-un.js","sources":["../../src/components/DataTable/DataTableBase.tsx","../../src/components/DataTable/core/DataTable.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, KeyboardEvent } from \"react\";\r\nimport { combineClassNames } from \"../../utils/classNames\";\r\nimport { DataTableBaseProps, Column } from \"./DataTable.types\";\r\nimport { capitalize } from \"../../utils/capitalize\";\r\nimport {\r\n getDefaultRounding,\r\n getDefaultShadow,\r\n getDefaultTheme,\r\n} from \"../../config/boreal-style-config\";\r\n\r\nfunction DataTableBase<T extends object>({\r\n columns,\r\n data,\r\n onRowClick,\r\n classMap,\r\n theme = getDefaultTheme(),\r\n rounding = getDefaultRounding(),\r\n shadow = getDefaultShadow(),\r\n state = \"\",\r\n outline = false,\r\n className = \"\",\r\n tableClassName,\r\n theadClassName,\r\n tbodyClassName,\r\n rowClassName,\r\n cellClassName,\r\n striped = true,\r\n wrapCells = false,\r\n defaultSortKey,\r\n defaultSortOrder = \"asc\",\r\n serverSort = false,\r\n onSortChange,\r\n rowKey,\r\n caption = \"Data table\",\r\n hideCaption = true,\r\n getSortAriaLabel,\r\n getSortAnnouncement,\r\n getRowAriaLabel,\r\n getRowAriaDescription,\r\n emptyMessage = \"No data available\",\r\n loading = false,\r\n loadingMessage = \"Loading data\",\r\n colCount,\r\n rowCount,\r\n \"aria-label\": ariaLabel,\r\n \"aria-labelledby\": ariaLabelledBy,\r\n \"aria-describedby\": ariaDescribedBy,\r\n \"data-testid\": testId = \"data-table\",\r\n}: DataTableBaseProps<T>) {\r\n const [sortKey, setSortKey] = useState<keyof T | undefined>(defaultSortKey);\r\n const [sortOrder, setSortOrder] = useState<\"asc\" | \"desc\">(defaultSortOrder);\r\n const [sortAnnouncement, setSortAnnouncement] = useState(\"\");\r\n\r\n const captionId = `${testId}-caption`;\r\n const liveRegionId = `${testId}-live-region`;\r\n\r\n const computedAriaDescribedBy = [\r\n ariaDescribedBy,\r\n caption ? captionId : undefined,\r\n liveRegionId,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const sortedData = useMemo(() => {\r\n if (serverSort || !sortKey) return data;\r\n\r\n return [...data].sort((a, b) => {\r\n const valA = a[sortKey];\r\n const valB = b[sortKey];\r\n\r\n if (valA === valB) return 0;\r\n if (valA == null) return 1;\r\n if (valB == null) return -1;\r\n\r\n const numA = Number(valA);\r\n const numB = Number(valB);\r\n const bothNumeric = !Number.isNaN(numA) && !Number.isNaN(numB);\r\n\r\n if (bothNumeric) {\r\n return sortOrder === \"asc\" ? numA - numB : numB - numA;\r\n }\r\n\r\n const cmp = String(valA).localeCompare(String(valB), undefined, {\r\n numeric: true,\r\n });\r\n\r\n return sortOrder === \"asc\" ? cmp : -cmp;\r\n });\r\n }, [data, sortKey, sortOrder, serverSort]);\r\n\r\n const announceSortChange = (\r\n column: Column<T>,\r\n nextOrder: \"asc\" | \"desc\",\r\n ): void => {\r\n const message = getSortAnnouncement\r\n ? getSortAnnouncement(column, nextOrder)\r\n : `${column.label} sorted ${nextOrder === \"asc\" ? \"ascending\" : \"descending\"}`;\r\n\r\n setSortAnnouncement(message);\r\n };\r\n\r\n const handleSort = (column: Column<T>): void => {\r\n const nextOrder =\r\n column.key === sortKey && sortOrder === \"asc\" ? \"desc\" : \"asc\";\r\n\r\n setSortKey(column.key);\r\n setSortOrder(nextOrder);\r\n announceSortChange(column, nextOrder);\r\n\r\n if (serverSort && onSortChange) {\r\n onSortChange(column.key, nextOrder);\r\n }\r\n };\r\n\r\n const handleSortKeyDown =\r\n (column: Column<T>) =>\r\n (e: KeyboardEvent<HTMLButtonElement>): void => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleSort(column);\r\n }\r\n };\r\n\r\n const handleRowKeyDown =\r\n (row: T) =>\r\n (e: KeyboardEvent<HTMLTableRowElement>): void => {\r\n if (!onRowClick) return;\r\n\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onRowClick(row);\r\n }\r\n };\r\n\r\n const getColumnStyle = (column: Column<T>): React.CSSProperties => ({\r\n width: column.width,\r\n minWidth: column.minWidth,\r\n maxWidth: column.maxWidth,\r\n });\r\n\r\n const getRowClassName = (row: T, index: number): string | undefined => {\r\n if (typeof rowClassName === \"function\") {\r\n return rowClassName(row, index);\r\n }\r\n\r\n return rowClassName;\r\n };\r\n\r\n const getCellClassName = (\r\n value: unknown,\r\n row: T,\r\n column: Column<T>,\r\n rowIndex: number,\r\n ): string | undefined => {\r\n return cellClassName?.(value, row, column, rowIndex);\r\n };\r\n\r\n const getHeaderScope = (column: Column<T>): \"col\" | \"colgroup\" =>\r\n column.scope ?? \"col\";\r\n\r\n const getHeaderId = (column: Column<T>): string =>\r\n column.id ?? `${testId}-header-${String(column.key)}`;\r\n\r\n const getColumnAriaLabel = (\r\n column: Column<T>,\r\n isActive: boolean,\r\n ): string | undefined => {\r\n if (!column.sortable) {\r\n return column.srLabel;\r\n }\r\n\r\n if (getSortAriaLabel) {\r\n return getSortAriaLabel(column, sortOrder, isActive);\r\n }\r\n\r\n const baseLabel = column.srLabel ?? column.label;\r\n\r\n if (isActive) {\r\n return `${baseLabel}, sorted ${sortOrder === \"asc\" ? \"ascending\" : \"descending\"}. Activate to sort ${sortOrder === \"asc\" ? \"descending\" : \"ascending\"}.`;\r\n }\r\n\r\n return `${baseLabel}. Activate to sort ascending.`;\r\n };\r\n\r\n const renderCellContent = (row: T, column: Column<T>): React.ReactNode => {\r\n const value = row[column.key];\r\n\r\n if (column.render) {\r\n return column.render(value, row);\r\n }\r\n\r\n if (typeof value === \"object\" && value !== null) {\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value ?? \"\");\r\n };\r\n\r\n useEffect(() => {\r\n if (!sortKey) {\r\n setSortAnnouncement(\"\");\r\n return;\r\n }\r\n\r\n const activeColumn = columns.find((column) => column.key === sortKey);\r\n if (!activeColumn) return;\r\n\r\n announceSortChange(activeColumn, sortOrder);\r\n }, []);\r\n\r\n const tableClass = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.table,\r\n classMap[theme],\r\n classMap[state],\r\n outline && classMap.outline,\r\n tableClassName,\r\n ),\r\n [classMap, theme, state, outline, tableClassName],\r\n );\r\n\r\n const wrapperClass = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.wrapper,\r\n shadow && classMap[`shadow${capitalize(shadow)}`],\r\n rounding && classMap[`round${capitalize(rounding)}`],\r\n striped && classMap.striped,\r\n className,\r\n ),\r\n [classMap, shadow, rounding, striped, className],\r\n );\r\n\r\n return (\r\n <div className={wrapperClass} data-testid={testId}>\r\n <div\r\n id={liveRegionId}\r\n className={classMap.srOnly ?? \"sr_only\"}\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n >\r\n {loading ? loadingMessage : sortAnnouncement}\r\n </div>\r\n\r\n <table\r\n className={tableClass}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n aria-describedby={computedAriaDescribedBy || undefined}\r\n aria-colcount={colCount}\r\n aria-rowcount={rowCount}\r\n >\r\n {caption ? (\r\n <caption\r\n id={captionId}\r\n className={hideCaption ? (classMap.srOnly ?? \"sr_only\") : undefined}\r\n >\r\n {caption}\r\n </caption>\r\n ) : null}\r\n\r\n <thead className={theadClassName}>\r\n <tr>\r\n {columns.map((column) => {\r\n const isActive = sortKey === column.key;\r\n\r\n return (\r\n <th\r\n key={String(column.key)}\r\n id={getHeaderId(column)}\r\n scope={getHeaderScope(column)}\r\n style={getColumnStyle(column)}\r\n aria-sort={\r\n column.sortable\r\n ? isActive\r\n ? sortOrder === \"asc\"\r\n ? \"ascending\"\r\n : \"descending\"\r\n : \"none\"\r\n : undefined\r\n }\r\n className={combineClassNames(\r\n column.sortable && classMap.sortable,\r\n classMap.headerCell,\r\n (column.wrap ?? wrapCells) && classMap.wrapCell,\r\n column.headerClassName,\r\n )}\r\n >\r\n {column.sortable ? (\r\n <button\r\n type=\"button\"\r\n className={combineClassNames(\r\n classMap.sortButton,\r\n column.sortButtonClassName,\r\n )}\r\n onClick={() => handleSort(column)}\r\n onKeyDown={handleSortKeyDown(column)}\r\n aria-label={getColumnAriaLabel(column, isActive)}\r\n data-testid={`${testId}-sort-${String(column.key)}`}\r\n >\r\n <span>{column.label}</span>\r\n <span className={classMap.sortIcon} aria-hidden=\"true\">\r\n {isActive ? (sortOrder === \"asc\" ? \"▲\" : \"▼\") : \"⇅\"}\r\n </span>\r\n </button>\r\n ) : (\r\n <span aria-label={column.srLabel}>{column.label}</span>\r\n )}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n\r\n <tbody className={tbodyClassName}>\r\n {loading ? (\r\n <tr>\r\n <td\r\n className={classMap.emptyCell}\r\n colSpan={columns.length}\r\n aria-live=\"polite\"\r\n >\r\n {loadingMessage}\r\n </td>\r\n </tr>\r\n ) : sortedData.length === 0 ? (\r\n <tr>\r\n <td\r\n className={classMap.emptyCell}\r\n colSpan={columns.length}\r\n aria-live=\"polite\"\r\n >\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : (\r\n sortedData.map((row, index) => {\r\n const key = rowKey ? rowKey(row) : index;\r\n const rowAriaLabel = getRowAriaLabel?.(row, index);\r\n const rowAriaDescription = getRowAriaDescription?.(row, index);\r\n\r\n return (\r\n <tr\r\n key={key}\r\n className={combineClassNames(\r\n onRowClick && classMap.clickable,\r\n striped && index % 2 === 1 && classMap.striped,\r\n getRowClassName(row, index),\r\n )}\r\n onClick={() => onRowClick?.(row)}\r\n onKeyDown={handleRowKeyDown(row)}\r\n tabIndex={onRowClick ? 0 : undefined}\r\n aria-label={onRowClick ? rowAriaLabel : undefined}\r\n aria-description={onRowClick ? rowAriaDescription : undefined}\r\n data-testid={`${testId}-row-${key}`}\r\n >\r\n {columns.map((column) => {\r\n const cellKey = String(column.key);\r\n const value = row[column.key];\r\n const content = renderCellContent(row, column);\r\n const headerId = getHeaderId(column);\r\n const shouldWrap = column.wrap ?? wrapCells;\r\n\r\n const resolvedCellClassName = combineClassNames(\r\n classMap.cell,\r\n shouldWrap && classMap.wrapCell,\r\n column.cellClassName,\r\n getCellClassName(value, row, column, index),\r\n );\r\n\r\n if (column.isRowHeader) {\r\n return (\r\n <th\r\n key={cellKey}\r\n scope=\"row\"\r\n headers={headerId}\r\n data-label={column.label}\r\n style={getColumnStyle(column)}\r\n className={combineClassNames(\r\n resolvedCellClassName,\r\n column.rowHeaderClassName,\r\n )}\r\n >\r\n {content}\r\n </th>\r\n );\r\n }\r\n\r\n return (\r\n <td\r\n key={cellKey}\r\n headers={headerId}\r\n data-label={column.label}\r\n style={getColumnStyle(column)}\r\n className={resolvedCellClassName}\r\n >\r\n {content}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\nDataTableBase.displayName = \"DataTableBase\";\r\nexport default DataTableBase;\r\n","import \"./DataTable.scss\";\r\nimport DataTableBase from \"../DataTableBase\";\r\nimport { DataTableProps } from \"../DataTable.types\";\r\n\r\nconst classes = {\r\n wrapper: \"data_table_wrapper\",\r\n table: \"data_table\",\r\n\r\n headerCell: \"data_table_header_cell\",\r\n sortable: \"data_table_header_sortable\",\r\n sortButton: \"data_table_sort_button\",\r\n sortIcon: \"data_table_sort_icon\",\r\n\r\n clickable: \"data_table_row_clickable\",\r\n striped: \"data_table_row_striped\",\r\n\r\n cell: \"data_table_cell\",\r\n wrapCell: \"data_table_cell_wrap\",\r\n\r\n primary: \"data_table_primary\",\r\n secondary: \"data_table_secondary\",\r\n tertiary: \"data_table_tertiary\",\r\n quaternary: \"data_table_quaternary\",\r\n\r\n success: \"data_table_success\",\r\n error: \"data_table_error\",\r\n warning: \"data_table_warning\",\r\n\r\n clear: \"data_table_clear\",\r\n outline: \"data_table_outline\",\r\n\r\n shadowNone: \"data_table_shadow-None\",\r\n shadowLight: \"data_table_shadow-Light\",\r\n shadowMedium: \"data_table_shadow-Medium\",\r\n shadowStrong: \"data_table_shadow-Strong\",\r\n shadowIntense: \"data_table_shadow-Intense\",\r\n\r\n roundNone: \"data_table_round-None\",\r\n roundSmall: \"data_table_round-Small\",\r\n roundMedium: \"data_table_round-Medium\",\r\n roundLarge: \"data_table_round-Large\",\r\n};\r\n\r\nfunction DataTable<T extends object>(props: DataTableProps<T>) {\r\n return <DataTableBase {...props} classMap={classes} />;\r\n}\r\n\r\nDataTable.displayName = \"DataTable\";\r\n\r\nexport default DataTable;\r\n"],"names":[],"mappings":"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"}
|