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.
Files changed (51) hide show
  1. package/dist/core/{Card-BTrF1W-e.js → Card-BGx1_N5A.js} +125 -72
  2. package/dist/core/Card-BGx1_N5A.js.map +1 -0
  3. package/dist/core/{Card-Ha3HknHh.cjs → Card-D9dQ1jar.cjs} +125 -72
  4. package/dist/core/Card-D9dQ1jar.cjs.map +1 -0
  5. package/dist/core/Card.cjs.js +1 -1
  6. package/dist/core/Card.css +0 -6
  7. package/dist/core/Card.js +1 -1
  8. package/dist/core/DataTable-BB7nx-un.js +357 -0
  9. package/dist/core/DataTable-BB7nx-un.js.map +1 -0
  10. package/dist/core/DataTable-Blz-v6wp.cjs +356 -0
  11. package/dist/core/DataTable-Blz-v6wp.cjs.map +1 -0
  12. package/dist/core/DataTable.cjs.js +1 -1
  13. package/dist/core/DataTable.css +101 -56
  14. package/dist/core/DataTable.js +1 -1
  15. package/dist/core/index.cjs.js +2 -2
  16. package/dist/core/index.js +2 -2
  17. package/dist/next/{Card-B4XAnIBE.js → Card-BmAdA56_.js} +185 -132
  18. package/dist/next/Card-BmAdA56_.js.map +1 -0
  19. package/dist/next/Card.css +183 -189
  20. package/dist/next/Card.js +1 -1
  21. package/dist/next/DataTable-l98woAcr.js +387 -0
  22. package/dist/next/DataTable-l98woAcr.js.map +1 -0
  23. package/dist/next/DataTable.css +133 -88
  24. package/dist/next/DataTable.js +1 -1
  25. package/dist/next/{Footer-DLnIK3R3.js → Footer-Cz_Sq0zJ.js} +2 -2
  26. package/dist/next/{Footer-DLnIK3R3.js.map → Footer-Cz_Sq0zJ.js.map} +1 -1
  27. package/dist/next/Footer.js +1 -1
  28. package/dist/next/{Select-D4bH7djH.js → Select-8eeLU06R.js} +30 -30
  29. package/dist/next/{Select-D4bH7djH.js.map → Select-8eeLU06R.js.map} +1 -1
  30. package/dist/next/Select.css +80 -80
  31. package/dist/next/Select.js +1 -1
  32. package/dist/next/index.js +4 -4
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. package/dist/types/components/Card/Card.types.d.ts +22 -6
  35. package/dist/types/components/Card/Card.types.d.ts.map +1 -1
  36. package/dist/types/components/Card/CardBase.d.ts.map +1 -1
  37. package/dist/types/components/DataTable/DataTable.types.d.ts +61 -0
  38. package/dist/types/components/DataTable/DataTable.types.d.ts.map +1 -1
  39. package/dist/types/components/DataTable/DataTableBase.d.ts +1 -1
  40. package/dist/types/components/DataTable/DataTableBase.d.ts.map +1 -1
  41. package/dist/types/components/DataTable/core/DataTable.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/core/Card-BTrF1W-e.js.map +0 -1
  44. package/dist/core/Card-Ha3HknHh.cjs.map +0 -1
  45. package/dist/core/DataTable-6f7j0ahI.cjs +0 -313
  46. package/dist/core/DataTable-6f7j0ahI.cjs.map +0 -1
  47. package/dist/core/DataTable-BC8BOwEL.js +0 -314
  48. package/dist/core/DataTable-BC8BOwEL.js.map +0 -1
  49. package/dist/next/Card-B4XAnIBE.js.map +0 -1
  50. package/dist/next/DataTable-F9mtABNi.js +0 -339
  51. 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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"}