@cratis/components 4.21.0 → 4.21.1

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 (91) hide show
  1. package/MIGRATION.md +3 -3
  2. package/compat-manifest.json +11 -11
  3. package/dist/esm/DataTables/DataTableBody.d.ts +22 -0
  4. package/dist/esm/DataTables/DataTableBody.d.ts.map +1 -0
  5. package/dist/esm/DataTables/DataTableBody.js +10 -0
  6. package/dist/esm/DataTables/DataTableBody.js.map +1 -0
  7. package/dist/esm/DataTables/DataTableCore.d.ts +8 -48
  8. package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
  9. package/dist/esm/DataTables/DataTableCore.js +50 -278
  10. package/dist/esm/DataTables/DataTableCore.js.map +1 -1
  11. package/dist/esm/DataTables/DataTableHeaderCell.d.ts +25 -0
  12. package/dist/esm/DataTables/DataTableHeaderCell.d.ts.map +1 -0
  13. package/dist/esm/DataTables/DataTableHeaderCell.js +26 -0
  14. package/dist/esm/DataTables/DataTableHeaderCell.js.map +1 -0
  15. package/dist/esm/DataTables/DataTableMessageOverrides.d.ts +12 -0
  16. package/dist/esm/DataTables/DataTableMessageOverrides.d.ts.map +1 -0
  17. package/dist/esm/DataTables/DataTableMessageOverrides.js +4 -0
  18. package/dist/esm/DataTables/DataTableMessageOverrides.js.map +1 -0
  19. package/dist/esm/DataTables/DataTableMessages.d.ts +12 -0
  20. package/dist/esm/DataTables/DataTableMessages.d.ts.map +1 -0
  21. package/dist/esm/DataTables/DataTableMessages.js +4 -0
  22. package/dist/esm/DataTables/DataTableMessages.js.map +1 -0
  23. package/dist/esm/DataTables/DataTableParts.d.ts +40 -0
  24. package/dist/esm/DataTables/DataTableParts.d.ts.map +1 -0
  25. package/dist/esm/DataTables/DataTableParts.js +4 -0
  26. package/dist/esm/DataTables/DataTableParts.js.map +1 -0
  27. package/dist/esm/DataTables/DataTableRow.d.ts +22 -0
  28. package/dist/esm/DataTables/DataTableRow.d.ts.map +1 -0
  29. package/dist/esm/DataTables/DataTableRow.js +25 -0
  30. package/dist/esm/DataTables/DataTableRow.js.map +1 -0
  31. package/dist/esm/DataTables/DataTableRowClickEvent.d.ts +8 -0
  32. package/dist/esm/DataTables/DataTableRowClickEvent.d.ts.map +1 -0
  33. package/dist/esm/DataTables/DataTableRowClickEvent.js +4 -0
  34. package/dist/esm/DataTables/DataTableRowClickEvent.js.map +1 -0
  35. package/dist/esm/DataTables/DataTableSearch.d.ts +13 -0
  36. package/dist/esm/DataTables/DataTableSearch.d.ts.map +1 -0
  37. package/dist/esm/DataTables/DataTableSearch.js +7 -0
  38. package/dist/esm/DataTables/DataTableSearch.js.map +1 -0
  39. package/dist/esm/DataTables/DataTableState.d.ts +18 -0
  40. package/dist/esm/DataTables/DataTableState.d.ts.map +1 -0
  41. package/dist/esm/DataTables/DataTableState.js +4 -0
  42. package/dist/esm/DataTables/DataTableState.js.map +1 -0
  43. package/dist/esm/DataTables/DataTableStateProps.d.ts +20 -0
  44. package/dist/esm/DataTables/DataTableStateProps.d.ts.map +1 -0
  45. package/dist/esm/DataTables/DataTableStateProps.js +4 -0
  46. package/dist/esm/DataTables/DataTableStateProps.js.map +1 -0
  47. package/dist/esm/DataTables/ProcessedRow.d.ts +8 -0
  48. package/dist/esm/DataTables/ProcessedRow.d.ts.map +1 -0
  49. package/dist/esm/DataTables/ProcessedRow.js +4 -0
  50. package/dist/esm/DataTables/ProcessedRow.js.map +1 -0
  51. package/dist/esm/DataTables/RowProcessingState.d.ts +17 -0
  52. package/dist/esm/DataTables/RowProcessingState.d.ts.map +1 -0
  53. package/dist/esm/DataTables/RowProcessingState.js +4 -0
  54. package/dist/esm/DataTables/RowProcessingState.js.map +1 -0
  55. package/dist/esm/DataTables/RowSelection.d.ts +19 -0
  56. package/dist/esm/DataTables/RowSelection.d.ts.map +1 -0
  57. package/dist/esm/DataTables/RowSelection.js +4 -0
  58. package/dist/esm/DataTables/RowSelection.js.map +1 -0
  59. package/dist/esm/DataTables/RowSelectionSource.d.ts +16 -0
  60. package/dist/esm/DataTables/RowSelectionSource.d.ts.map +1 -0
  61. package/dist/esm/DataTables/RowSelectionSource.js +4 -0
  62. package/dist/esm/DataTables/RowSelectionSource.js.map +1 -0
  63. package/dist/esm/DataTables/classNames.d.ts +7 -0
  64. package/dist/esm/DataTables/classNames.d.ts.map +1 -0
  65. package/dist/esm/DataTables/classNames.js +4 -0
  66. package/dist/esm/DataTables/classNames.js.map +1 -0
  67. package/dist/esm/DataTables/matchesFilterEntry.d.ts +15 -0
  68. package/dist/esm/DataTables/matchesFilterEntry.d.ts.map +1 -0
  69. package/dist/esm/DataTables/matchesFilterEntry.js +70 -0
  70. package/dist/esm/DataTables/matchesFilterEntry.js.map +1 -0
  71. package/dist/esm/DataTables/processRows.d.ts +10 -0
  72. package/dist/esm/DataTables/processRows.d.ts.map +1 -0
  73. package/dist/esm/DataTables/processRows.js +42 -0
  74. package/dist/esm/DataTables/processRows.js.map +1 -0
  75. package/dist/esm/DataTables/useDataTableMessages.d.ts +9 -0
  76. package/dist/esm/DataTables/useDataTableMessages.d.ts.map +1 -0
  77. package/dist/esm/DataTables/useDataTableMessages.js +33 -0
  78. package/dist/esm/DataTables/useDataTableMessages.js.map +1 -0
  79. package/dist/esm/DataTables/useDataTableState.d.ts +10 -0
  80. package/dist/esm/DataTables/useDataTableState.d.ts.map +1 -0
  81. package/dist/esm/DataTables/useDataTableState.js +19 -0
  82. package/dist/esm/DataTables/useDataTableState.js.map +1 -0
  83. package/dist/esm/DataTables/useRowSelection.d.ts +9 -0
  84. package/dist/esm/DataTables/useRowSelection.d.ts.map +1 -0
  85. package/dist/esm/DataTables/useRowSelection.js +87 -0
  86. package/dist/esm/DataTables/useRowSelection.js.map +1 -0
  87. package/dist/esm/DataTables/valueAtPath.d.ts +10 -0
  88. package/dist/esm/DataTables/valueAtPath.d.ts.map +1 -0
  89. package/dist/esm/DataTables/valueAtPath.js +18 -0
  90. package/dist/esm/DataTables/valueAtPath.js.map +1 -0
  91. package/package.json +1 -1
package/MIGRATION.md CHANGED
@@ -45,9 +45,9 @@ Keep a Prime package only when your application still imports it directly. Migra
45
45
 
46
46
  Applications using Canvas or PivotViewer must install `pixi.js@^8.20.0`, now an optional peer rather than a nested Components dependency. Align any existing direct Pixi dependency to the same compatible resolution so public `PIXI.Container` and pointer-event types come from one package instance. Applications using only non-Pixi subpaths do not need it.
47
47
 
48
- The package declares an Arc peer range of `>=20.3.1 <23`. Conformance and all three renderer
49
- adapters declare the final `@cratis/components >=4 <5` peer range, so each remains bounded to the
50
- Components major whose renderer ABI and stable presentation profile it implements.
48
+ The package declares an Arc peer range of `>=20.3.1 <23`. Each published release of Conformance
49
+ and the three renderer adapters requires exactly the `@cratis/components` version it is released
50
+ with, so install and upgrade an adapter and `@cratis/components` together, at the same version.
51
51
 
52
52
  ## Import from explicit subpaths
53
53
 
@@ -68,7 +68,7 @@
68
68
  {
69
69
  "name": "@cratis/components",
70
70
  "role": "core",
71
- "version": "4.21.0",
71
+ "version": "4.21.1",
72
72
  "releaseMajorRange": ">=4 <5",
73
73
  "independentRelease": false,
74
74
  "private": false,
@@ -92,7 +92,7 @@
92
92
  {
93
93
  "name": "@cratis/eslint-plugin-components",
94
94
  "role": "eslint",
95
- "version": "4.21.0",
95
+ "version": "4.21.1",
96
96
  "releaseMajorRange": ">=4 <5",
97
97
  "independentRelease": false,
98
98
  "private": false,
@@ -105,7 +105,7 @@
105
105
  {
106
106
  "name": "@cratis/components.migrator",
107
107
  "role": "migrator",
108
- "version": "4.21.0",
108
+ "version": "4.21.1",
109
109
  "releaseMajorRange": ">=4 <5",
110
110
  "independentRelease": false,
111
111
  "private": false,
@@ -116,13 +116,13 @@
116
116
  {
117
117
  "name": "@cratis/components.conformance",
118
118
  "role": "conformance",
119
- "version": "4.21.0",
119
+ "version": "4.21.1",
120
120
  "releaseMajorRange": ">=4 <5",
121
121
  "independentRelease": false,
122
122
  "private": false,
123
123
  "packageAccess": "public",
124
124
  "peerDependencies": {
125
- "@cratis/components": "4.21.0",
125
+ "@cratis/components": "4.21.1",
126
126
  "react": "^19.0.0",
127
127
  "react-dom": "^19.0.0"
128
128
  },
@@ -132,13 +132,13 @@
132
132
  {
133
133
  "name": "@cratis/components.mui",
134
134
  "role": "renderer-adapter",
135
- "version": "4.21.0",
135
+ "version": "4.21.1",
136
136
  "releaseMajorRange": ">=4 <5",
137
137
  "independentRelease": false,
138
138
  "private": false,
139
139
  "packageAccess": "public",
140
140
  "peerDependencies": {
141
- "@cratis/components": "4.21.0",
141
+ "@cratis/components": "4.21.1",
142
142
  "@emotion/react": ">=11.5 <12",
143
143
  "@emotion/styled": ">=11.11 <12",
144
144
  "@mui/material": ">=9 <10",
@@ -188,13 +188,13 @@
188
188
  {
189
189
  "name": "@cratis/components.primereact",
190
190
  "role": "renderer-adapter",
191
- "version": "4.21.0",
191
+ "version": "4.21.1",
192
192
  "releaseMajorRange": ">=4 <5",
193
193
  "independentRelease": false,
194
194
  "private": false,
195
195
  "packageAccess": "public",
196
196
  "peerDependencies": {
197
- "@cratis/components": "4.21.0",
197
+ "@cratis/components": "4.21.1",
198
198
  "@primereact/core": ">=11 <12",
199
199
  "@primereact/ui": ">=11 <12",
200
200
  "@primeuix/themes": ">=3 <4",
@@ -256,13 +256,13 @@
256
256
  {
257
257
  "name": "@cratis/components.primereact10",
258
258
  "role": "renderer-adapter",
259
- "version": "4.21.0",
259
+ "version": "4.21.1",
260
260
  "releaseMajorRange": ">=4 <5",
261
261
  "independentRelease": false,
262
262
  "private": false,
263
263
  "packageAccess": "public",
264
264
  "peerDependencies": {
265
- "@cratis/components": "4.21.0",
265
+ "@cratis/components": "4.21.1",
266
266
  "primereact": ">=10.9.9 <11",
267
267
  "react": "^19.0.0",
268
268
  "react-dom": "^19.0.0"
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DataTableMessages } from './DataTableMessages.js';
3
+ import type { DataTableParts } from './DataTableParts.js';
4
+ import { DataTableStatus } from './DataTableStatus.js';
5
+ /** Props for {@link DataTableBody}. */
6
+ export interface DataTableBodyProps {
7
+ status: DataTableStatus;
8
+ /** Whether the table was given any rows, before filtering. */
9
+ hasLoadedRows: boolean;
10
+ /** How many rows are left to render after filtering. */
11
+ rowCount: number;
12
+ columnCount: number;
13
+ /** The table's part attributes. */
14
+ parts?: DataTableParts;
15
+ messages: DataTableMessages;
16
+ emptyMessage: ReactNode;
17
+ /** Renders the data rows; called only when there are rows to show. */
18
+ renderRows: () => ReactNode;
19
+ }
20
+ /** The table body: a failure, loading or empty message row, or the data rows. */
21
+ export declare const DataTableBody: ({ status, hasLoadedRows, rowCount, columnCount, parts: pt, messages, emptyMessage, renderRows, }: DataTableBodyProps) => import("react").JSX.Element;
22
+ //# sourceMappingURL=DataTableBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableBody.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableBody.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEpD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,8DAA8D;IAC9D,aAAa,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,EAAE,SAAS,CAAC;IACxB,sEAAsE;IACtE,UAAU,EAAE,MAAM,SAAS,CAAC;CAC/B;AAED,iFAAiF;AACjF,eAAO,MAAM,aAAa,qGASvB,kBAAkB,gCAgFpB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { classNames } from './classNames.js';
3
+ import { DataTableStatus } from './DataTableStatus.js';
4
+
5
+ const DataTableBody = ({ status, hasLoadedRows, rowCount, columnCount, parts: pt, messages, emptyMessage, renderRows, }) => (jsx("tbody", { ...pt?.body, className: classNames('cratis-datatable__body', pt?.body?.className), "data-cratis-part": 'body', children: status === DataTableStatus.Failed || status === DataTableStatus.Unauthorized ? (jsx("tr", { ...pt?.failureRow, className: classNames('cratis-datatable__failure-row', pt?.failureRow?.className), "data-cratis-part": 'failure-row', "data-reason": status, children: jsx("td", { ...pt?.failureCell, colSpan: Math.max(columnCount, 1), className: classNames('cratis-datatable__failure-cell', pt?.failureCell?.className), "data-cratis-part": 'failure-cell', children: jsx("div", { role: 'alert', children: status === DataTableStatus.Failed
6
+ ? messages.resolvedFailureMessage
7
+ : messages.resolvedUnauthorizedMessage }) }) }, status)) : status === DataTableStatus.Loading && !hasLoadedRows ? (jsx("tr", { ...pt?.loadingRow, className: classNames('cratis-datatable__loading-row', pt?.loadingRow?.className), "data-cratis-part": 'loading-row', children: jsx("td", { ...pt?.loadingCell, colSpan: Math.max(columnCount, 1), className: classNames('cratis-datatable__loading-cell', pt?.loadingCell?.className), "data-cratis-part": 'loading-cell', children: jsx("div", { role: 'status', children: messages.resolvedLoadingMessage }) }) }, status)) : rowCount === 0 ? (jsx("tr", { ...pt?.emptyRow, className: classNames('cratis-datatable__empty-row', pt?.emptyRow?.className), "data-cratis-part": 'empty-row', children: jsx("td", { ...pt?.emptyCell, colSpan: Math.max(columnCount, 1), className: classNames('cratis-datatable__empty-cell', pt?.emptyCell?.className), "data-cratis-part": 'empty-cell', children: emptyMessage }) })) : (renderRows()) }));
8
+
9
+ export { DataTableBody };
10
+ //# sourceMappingURL=DataTableBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableBody.js","sources":["../../../DataTables/DataTableBody.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\nimport { classNames } from './classNames';\nimport type { DataTableMessages } from './DataTableMessages';\nimport type { DataTableParts } from './DataTableParts';\nimport { DataTableStatus } from './DataTableStatus';\n\n/** Props for {@link DataTableBody}. */\nexport interface DataTableBodyProps {\n status: DataTableStatus;\n /** Whether the table was given any rows, before filtering. */\n hasLoadedRows: boolean;\n /** How many rows are left to render after filtering. */\n rowCount: number;\n columnCount: number;\n /** The table's part attributes. */\n parts?: DataTableParts;\n messages: DataTableMessages;\n emptyMessage: ReactNode;\n /** Renders the data rows; called only when there are rows to show. */\n renderRows: () => ReactNode;\n}\n\n/** The table body: a failure, loading or empty message row, or the data rows. */\nexport const DataTableBody = ({\n status,\n hasLoadedRows,\n rowCount,\n columnCount,\n parts: pt,\n messages,\n emptyMessage,\n renderRows,\n}: DataTableBodyProps) => (\n <tbody\n {...pt?.body}\n className={classNames('cratis-datatable__body', pt?.body?.className)}\n data-cratis-part='body'\n >\n {status === DataTableStatus.Failed || status === DataTableStatus.Unauthorized ? (\n <tr\n key={status}\n {...pt?.failureRow}\n className={classNames(\n 'cratis-datatable__failure-row',\n pt?.failureRow?.className,\n )}\n data-cratis-part='failure-row'\n data-reason={status}\n >\n <td\n {...pt?.failureCell}\n colSpan={Math.max(columnCount, 1)}\n className={classNames(\n 'cratis-datatable__failure-cell',\n pt?.failureCell?.className,\n )}\n data-cratis-part='failure-cell'\n >\n <div role='alert'>\n {status === DataTableStatus.Failed\n ? messages.resolvedFailureMessage\n : messages.resolvedUnauthorizedMessage}\n </div>\n </td>\n </tr>\n ) : status === DataTableStatus.Loading && !hasLoadedRows ? (\n <tr\n key={status}\n {...pt?.loadingRow}\n className={classNames(\n 'cratis-datatable__loading-row',\n pt?.loadingRow?.className,\n )}\n data-cratis-part='loading-row'\n >\n <td\n {...pt?.loadingCell}\n colSpan={Math.max(columnCount, 1)}\n className={classNames(\n 'cratis-datatable__loading-cell',\n pt?.loadingCell?.className,\n )}\n data-cratis-part='loading-cell'\n >\n <div role='status'>{messages.resolvedLoadingMessage}</div>\n </td>\n </tr>\n ) : rowCount === 0 ? (\n <tr\n {...pt?.emptyRow}\n className={classNames(\n 'cratis-datatable__empty-row',\n pt?.emptyRow?.className,\n )}\n data-cratis-part='empty-row'\n >\n <td\n {...pt?.emptyCell}\n colSpan={Math.max(columnCount, 1)}\n className={classNames(\n 'cratis-datatable__empty-cell',\n pt?.emptyCell?.className,\n )}\n data-cratis-part='empty-cell'\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n renderRows()\n )}\n </tbody>\n);\n"],"names":["_jsx"],"mappings":";;;;AA0BO,MAAM,aAAa,GAAG,CAAC,EAC1B,MAAM,EACN,aAAa,EACb,QAAQ,EACR,WAAW,EACX,KAAK,EAAE,EAAE,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,GACO,MACjBA,GAAA,CAAA,OAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,SAAS,EAAE,UAAU,CAAC,wBAAwB,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,EAAA,kBAAA,EACnD,MAAM,EAAA,QAAA,EAEtB,MAAM,KAAK,eAAe,CAAC,MAAM,IAAI,MAAM,KAAK,eAAe,CAAC,YAAY,IACzEA,GAAA,CAAA,IAAA,EAAA,EAAA,GAEQ,EAAE,EAAE,UAAU,EAClB,SAAS,EAAE,UAAU,CACjB,+BAA+B,EAC/B,EAAE,EAAE,UAAU,EAAE,SAAS,CAC5B,EAAA,kBAAA,EACgB,aAAa,EAAA,aAAA,EACjB,MAAM,EAAA,QAAA,EAEnBA,GAAA,CAAA,IAAA,EAAA,EAAA,GACQ,EAAE,EAAE,WAAW,EACnB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EACjC,SAAS,EAAE,UAAU,CACjB,gCAAgC,EAChC,EAAE,EAAE,WAAW,EAAE,SAAS,CAC7B,EAAA,kBAAA,EACgB,cAAc,EAAA,QAAA,EAE/BA,GAAA,CAAA,KAAA,EAAA,EAAK,IAAI,EAAC,OAAO,EAAA,QAAA,EACZ,MAAM,KAAK,eAAe,CAAC;sBACtB,QAAQ,CAAC;AACX,sBAAE,QAAQ,CAAC,2BAA2B,EAAA,CACxC,GACL,EAAA,EAvBA,MAAM,CAwBV,IACL,MAAM,KAAK,eAAe,CAAC,OAAO,IAAI,CAAC,aAAa,IACpDA,GAAA,CAAA,IAAA,EAAA,EAAA,GAEQ,EAAE,EAAE,UAAU,EAClB,SAAS,EAAE,UAAU,CACjB,+BAA+B,EAC/B,EAAE,EAAE,UAAU,EAAE,SAAS,CAC5B,sBACgB,aAAa,EAAA,QAAA,EAE9BA,GAAA,CAAA,IAAA,EAAA,EAAA,GACQ,EAAE,EAAE,WAAW,EACnB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EACjC,SAAS,EAAE,UAAU,CACjB,gCAAgC,EAChC,EAAE,EAAE,WAAW,EAAE,SAAS,CAC7B,sBACgB,cAAc,EAAA,QAAA,EAE/BA,aAAK,IAAI,EAAC,QAAQ,EAAA,QAAA,EAAE,QAAQ,CAAC,sBAAsB,GAAO,EAAA,CACzD,EAAA,EAlBA,MAAM,CAmBV,IACL,QAAQ,KAAK,CAAC,IACdA,eACQ,EAAE,EAAE,QAAQ,EAChB,SAAS,EAAE,UAAU,CACjB,6BAA6B,EAC7B,EAAE,EAAE,QAAQ,EAAE,SAAS,CAC1B,EAAA,kBAAA,EACgB,WAAW,EAAA,QAAA,EAE5BA,GAAA,CAAA,IAAA,EAAA,EAAA,GACQ,EAAE,EAAE,SAAS,EACjB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EACjC,SAAS,EAAE,UAAU,CACjB,8BAA8B,EAC9B,EAAE,EAAE,SAAS,EAAE,SAAS,CAC3B,EAAA,kBAAA,EACgB,YAAY,EAAA,QAAA,EAE5B,YAAY,GACZ,EAAA,CACJ,KAEL,UAAU,EAAE,CACf,EAAA,CACG;;"}
@@ -1,53 +1,13 @@
1
- import React, { type CSSProperties, type HTMLAttributes, type ReactNode, type TableHTMLAttributes, type TdHTMLAttributes, type ThHTMLAttributes } from 'react';
1
+ import React, { type CSSProperties, type ReactNode } from 'react';
2
+ import type { DataTableFilterMeta } from './DataTableFilterMeta.js';
3
+ import type { DataTableParts } from './DataTableParts.js';
4
+ import type { DataTableRowClickEvent } from './DataTableRowClickEvent.js';
5
+ import { DataTableRowProcessing } from './DataTableRowProcessing.js';
2
6
  import type { DataTableSelectionChangeEvent } from './DataTableSelectionChangeEvent.js';
3
- import { type DataTableFilterMeta } from './DataTableFilterMeta.js';
4
- import { DataTableStatus } from './DataTableStatus.js';
5
7
  import type { DataTableSort } from './DataTableSort.js';
6
- import { DataTableRowProcessing } from './DataTableRowProcessing.js';
7
- /** Event emitted when a DataTable row is activated. */
8
- export interface DataTableRowClickEvent<TData> {
9
- /** Activated row data. */
10
- data: TData;
11
- /** Loaded-page row index. */
12
- index: number;
13
- }
14
- /** Stable Cratis-owned parts for styling a {@link DataTableCore}. */
15
- export interface DataTableParts {
16
- /** Outer table composition. */
17
- root?: HTMLAttributes<HTMLDivElement>;
18
- /** Loaded-page search wrapper. */
19
- search?: HTMLAttributes<HTMLDivElement>;
20
- /** Loaded-page search input. */
21
- searchInput?: React.InputHTMLAttributes<HTMLInputElement>;
22
- /** Scroll container. */
23
- tableContainer?: HTMLAttributes<HTMLDivElement>;
24
- /** Semantic table element. */
25
- table?: TableHTMLAttributes<HTMLTableElement>;
26
- /** Table head. */
27
- head?: HTMLAttributes<HTMLTableSectionElement>;
28
- /** Header row. */
29
- headerRow?: HTMLAttributes<HTMLTableRowElement>;
30
- /** Header cell. */
31
- headerCell?: ThHTMLAttributes<HTMLTableCellElement>;
32
- /** Table body. */
33
- body?: HTMLAttributes<HTMLTableSectionElement>;
34
- /** Data row. */
35
- row?: HTMLAttributes<HTMLTableRowElement>;
36
- /** Data cell. */
37
- cell?: TdHTMLAttributes<HTMLTableCellElement>;
38
- /** Empty-state row. */
39
- emptyRow?: HTMLAttributes<HTMLTableRowElement>;
40
- /** Empty-state cell. */
41
- emptyCell?: TdHTMLAttributes<HTMLTableCellElement>;
42
- /** Loading-state row. */
43
- loadingRow?: HTMLAttributes<HTMLTableRowElement>;
44
- /** Loading-state cell. */
45
- loadingCell?: TdHTMLAttributes<HTMLTableCellElement>;
46
- /** Failed or unauthorized row. */
47
- failureRow?: HTMLAttributes<HTMLTableRowElement>;
48
- /** Failed or unauthorized cell. */
49
- failureCell?: TdHTMLAttributes<HTMLTableCellElement>;
50
- }
8
+ import { DataTableStatus } from './DataTableStatus.js';
9
+ export type { DataTableParts } from './DataTableParts.js';
10
+ export type { DataTableRowClickEvent } from './DataTableRowClickEvent.js';
51
11
  /** Props for the semantic loaded-page DataTable renderer. */
52
12
  export interface DataTableCoreProps<TData extends object> {
53
13
  /** Loaded page rows. */
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableCore.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableCore.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTableCore.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableCore.tsx"],"names":[],"mappings":"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"}
@@ -1,170 +1,61 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import React, { useId, useMemo, useRef, useEffect } from 'react';
3
- import 'react-aria-components/I18nProvider';
4
- import 'ts-deepmerge';
5
- import 'react-dom';
6
- import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
2
+ import React, { useId, useMemo } from 'react';
7
3
  import { useCratisIcon } from '../configuration/useCratisIcon.js';
8
- import '../Notifications/toast.js';
9
- import '../renderer/RendererContext.js';
10
- import { ColumnFilterMenu } from './ColumnFilterMenu.js';
11
- import { DataTableFilterMatchMode } from './DataTableFilterMeta.js';
12
- import { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry.js';
13
- import { DataTableStatus } from './DataTableStatus.js';
14
- import { DataTableSortDirection } from './DataTableSortDirection.js';
4
+ import { classNames } from './classNames.js';
5
+ import { DataTableHeaderCell } from './DataTableHeaderCell.js';
6
+ import { DataTableBody } from './DataTableBody.js';
7
+ import { DataTableRow } from './DataTableRow.js';
8
+ import { DataTableSearch } from './DataTableSearch.js';
15
9
  import { DataTableRowProcessing } from './DataTableRowProcessing.js';
16
- import { useControllableState } from './useControllableState.js';
10
+ import { DataTableStatus } from './DataTableStatus.js';
11
+ import { processRows } from './processRows.js';
12
+ import { useDataTableMessages } from './useDataTableMessages.js';
13
+ import { useDataTableState } from './useDataTableState.js';
14
+ import { useRowSelection } from './useRowSelection.js';
17
15
 
18
16
  const useColumns = (children) => useMemo(() => React.Children.toArray(children).filter(React.isValidElement), [children]);
19
- const asCellValue = (value) => typeof value === 'function' ? String(value) : value;
20
- const valueAtPath = (row, path) => {
21
- if (!path)
22
- return undefined;
23
- let current = row;
24
- for (const segment of path.split('.')) {
25
- if (current === null || typeof current !== 'object')
26
- return undefined;
27
- const record = current;
28
- if (!Object.hasOwn(record, segment))
29
- return undefined;
30
- current = asCellValue(record[segment]);
31
- }
32
- return current;
33
- };
34
- const renderCellContent = (column, row) => {
35
- if (column.body)
36
- return column.body(row);
37
- const value = valueAtPath(row, column.field);
38
- return value == null ? '' : String(value);
39
- };
40
- const dateNumber = (value) => {
41
- const date = value instanceof Date ? new Date(value.getTime()) : new Date(String(value));
42
- return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);
43
- };
44
- const firstConstraint = (entry) => entry && 'constraints' in entry ? entry.constraints[0] : entry;
45
- const builtInMatches = (value, constraint) => {
46
- const filter = constraint.value;
47
- const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;
48
- if (filter === null || filter === undefined || filter === '')
49
- return true;
50
- const valueText = String(value ?? '').toLocaleLowerCase();
51
- const filterText = String(filter).toLocaleLowerCase();
52
- const valueNumber = typeof value === 'number' ? value : Number(value);
53
- const filterNumber = typeof filter === 'number' ? filter : Number(filter);
54
- switch (mode) {
55
- case DataTableFilterMatchMode.StartsWith:
56
- return valueText.startsWith(filterText);
57
- case DataTableFilterMatchMode.Contains:
58
- return valueText.includes(filterText);
59
- case DataTableFilterMatchMode.NotContains:
60
- return !valueText.includes(filterText);
61
- case DataTableFilterMatchMode.EndsWith:
62
- return valueText.endsWith(filterText);
63
- case DataTableFilterMatchMode.Equals:
64
- return Object.is(value, filter) || valueText === filterText;
65
- case DataTableFilterMatchMode.NotEquals:
66
- return !(Object.is(value, filter) || valueText === filterText);
67
- case DataTableFilterMatchMode.In:
68
- return Array.isArray(filter) && filter.some((item) => Object.is(item, value));
69
- case DataTableFilterMatchMode.Between:
70
- return (Array.isArray(filter) &&
71
- filter.length >= 2 &&
72
- valueNumber >= Number(filter[0]) &&
73
- valueNumber <= Number(filter[1]));
74
- case DataTableFilterMatchMode.LessThan:
75
- return valueNumber < filterNumber;
76
- case DataTableFilterMatchMode.LessThanOrEqual:
77
- return valueNumber <= filterNumber;
78
- case DataTableFilterMatchMode.GreaterThan:
79
- return valueNumber > filterNumber;
80
- case DataTableFilterMatchMode.GreaterThanOrEqual:
81
- return valueNumber >= filterNumber;
82
- case DataTableFilterMatchMode.DateIs:
83
- return dateNumber(value) === dateNumber(filter);
84
- case DataTableFilterMatchMode.DateIsNot:
85
- return dateNumber(value) !== dateNumber(filter);
86
- case DataTableFilterMatchMode.DateBefore:
87
- return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);
88
- case DataTableFilterMatchMode.DateAfter:
89
- return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);
90
- default:
91
- return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;
92
- }
93
- };
94
- const matchesFilterEntry = (value, entry) => {
95
- if (!('constraints' in entry))
96
- return builtInMatches(value, entry);
97
- if (entry.constraints.length === 0)
98
- return true;
99
- const matches = entry.constraints.map((constraint) => builtInMatches(value, constraint));
100
- return entry.operator?.toLowerCase() === 'or'
101
- ? matches.some(Boolean)
102
- : matches.every(Boolean);
103
- };
104
- const compareValues = (left, right) => {
105
- if (typeof left === 'number' && typeof right === 'number')
106
- return left - right;
107
- if (left instanceof Date && right instanceof Date)
108
- return left.getTime() - right.getTime();
109
- return String(left ?? '').localeCompare(String(right ?? ''), undefined, {
110
- numeric: true,
111
- sensitivity: 'base',
112
- });
113
- };
114
- const classNames = (...values) => values.filter(Boolean).join(' ');
115
17
  const DataTableCore = ({ data, children, dataKey, emptyMessage, status = DataTableStatus.Ready, loadingMessage, failureMessage, unauthorizedMessage, selectionMode, selectionAriaLabel, selectAllAriaLabel, selection, onSelectionChange, selectedItems, onSelectedItemsChange, onRowClick, rowClassName, globalFilterFields, globalSearchPlaceholder, globalSearchAriaLabel, defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, rowProcessing = DataTableRowProcessing.Loaded, scrollable, scrollHeight, className, style, pt, }) => {
116
- const { messages } = useCratisComponentsConfig();
117
- const dataTableMessages = messages?.dataTable;
118
- const resolvedSelectionAriaLabel = selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row';
119
- const resolvedSelectAllAriaLabel = selectAllAriaLabel ?? dataTableMessages?.selectAllRows ?? 'Select all rows';
120
- const resolvedGlobalSearchPlaceholder = globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…';
121
- const resolvedGlobalSearchAriaLabel = globalSearchAriaLabel ?? dataTableMessages?.searchAriaLabel ?? 'Search table';
122
- const resolvedLoadingMessage = loadingMessage ?? dataTableMessages?.loading ?? 'Loading…';
123
- const resolvedFailureMessage = failureMessage ?? dataTableMessages?.failed ?? 'Could not load data.';
124
- const resolvedUnauthorizedMessage = unauthorizedMessage ?? dataTableMessages?.unauthorized ??
125
- 'You are not authorized to view this data.';
18
+ const messages = useDataTableMessages({
19
+ selectionAriaLabel,
20
+ selectAllAriaLabel,
21
+ globalSearchPlaceholder,
22
+ globalSearchAriaLabel,
23
+ loadingMessage,
24
+ failureMessage,
25
+ unauthorizedMessage,
26
+ });
27
+ const { resolvedSelectionAriaLabel, resolvedSelectAllAriaLabel, resolvedGlobalSearchPlaceholder, resolvedGlobalSearchAriaLabel, } = messages;
126
28
  const isBusy = status === DataTableStatus.Loading && data.length > 0;
127
29
  const icon = useCratisIcon();
128
30
  const sortAscendingIcon = icon('sortAscending', '▲');
129
31
  const sortDescendingIcon = icon('sortDescending', '▼');
130
32
  const columns = useColumns(children);
131
33
  const selectionGroupName = useId();
132
- const [filters, setFilters] = useControllableState(filtersProp, defaultFilters ?? {}, onFilter);
133
- const [globalFilter, setGlobalFilter] = useControllableState(globalFilterProp, '', onGlobalFilterChange);
134
- const [sort, setSort] = useControllableState(sortProp, null, onSortChange);
135
- const filteredRows = useMemo(() => {
136
- if (rowProcessing === DataTableRowProcessing.None) {
137
- return data.map((row, loadedIndex) => ({ row, loadedIndex }));
138
- }
139
- const term = globalFilter.trim().toLocaleLowerCase();
140
- const rows = data
141
- .map((row, loadedIndex) => ({ row, loadedIndex }))
142
- .filter(({ row }) => {
143
- const rowValues = row;
144
- const matchesColumns = Object.entries(filters).every(([field, entry]) => matchesFilterEntry(valueAtPath(rowValues, field), entry));
145
- if (!matchesColumns)
146
- return false;
147
- if (!term || !globalFilterFields?.length)
148
- return true;
149
- return globalFilterFields.some((field) => String(valueAtPath(rowValues, field) ?? '')
150
- .toLocaleLowerCase()
151
- .includes(term));
152
- });
153
- if (!sort)
154
- return rows;
155
- return [...rows].sort((left, right) => {
156
- const comparison = compareValues(valueAtPath(left.row, sort.field), valueAtPath(right.row, sort.field));
157
- return sort.direction === 'ascending' ? comparison : -comparison;
158
- });
159
- }, [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);
160
- const updateFilter = (field, constraint) => {
161
- const next = { ...filters };
162
- if (constraint)
163
- next[field] = constraint;
164
- else
165
- delete next[field];
166
- setFilters(next);
167
- };
34
+ const { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort } = useDataTableState({
35
+ defaultFilters,
36
+ filters: filtersProp,
37
+ onFilter,
38
+ globalFilter: globalFilterProp,
39
+ onGlobalFilterChange,
40
+ sort: sortProp,
41
+ onSortChange,
42
+ });
43
+ const filteredRows = useMemo(() => processRows(data, {
44
+ filters,
45
+ globalFilter,
46
+ globalFilterFields,
47
+ sort,
48
+ rowProcessing,
49
+ }), [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);
50
+ const { dataKeyIdentity, isSelectedRow, isRowSelected, toggleRowSelection, allFilteredRowsSelected, selectAllRef, toggleSelectAll, } = useRowSelection({
51
+ data,
52
+ visibleRows: filteredRows.map(({ row }) => row),
53
+ dataKey,
54
+ selection,
55
+ selectedItems,
56
+ onSelectedItemsChange,
57
+ });
58
+ const isInteractive = Boolean(onRowClick) || selectionMode === 'single' || selectionMode === 'multiple';
168
59
  const activateRow = (row, index, originalEvent) => {
169
60
  onRowClick?.({ data: row, index });
170
61
  if (selectionMode === 'single') {
@@ -174,138 +65,19 @@ const DataTableCore = ({ data, children, dataKey, emptyMessage, status = DataTab
174
65
  toggleRowSelection(row);
175
66
  }
176
67
  };
177
- const dataKeyIdentity = (row) => String(valueAtPath(row, dataKey));
178
- const dataKeyCounts = useMemo(() => {
179
- const counts = new Map();
180
- if (!dataKey)
181
- return counts;
182
- for (const row of data) {
183
- const identity = String(valueAtPath(row, dataKey));
184
- counts.set(identity, (counts.get(identity) ?? 0) + 1);
185
- }
186
- return counts;
187
- }, [data, dataKey]);
188
- const firstLoadedIndexByDataKey = useMemo(() => {
189
- const indices = new Map();
190
- if (!dataKey)
191
- return indices;
192
- data.forEach((row, loadedIndex) => {
193
- const identity = String(valueAtPath(row, dataKey));
194
- if (!indices.has(identity))
195
- indices.set(identity, loadedIndex);
196
- });
197
- return indices;
198
- }, [data, dataKey]);
199
- const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;
200
- const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;
201
- const isSelectedRow = (row, loadedIndex) => {
202
- if (!selection)
203
- return false;
204
- if (!dataKey)
205
- return loadedIndex === selectedLoadedIndex;
206
- const identity = dataKeyIdentity(row);
207
- if (identity !== selectedDataKey)
208
- return false;
209
- if ((dataKeyCounts.get(identity) ?? 0) <= 1)
210
- return true;
211
- if (selectedLoadedIndex >= 0)
212
- return loadedIndex === selectedLoadedIndex;
213
- return loadedIndex === firstLoadedIndexByDataKey.get(identity);
214
- };
215
- const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);
216
- const isRowSelected = (row) => dataKey
217
- ? selectedItemsList.some((selected) => dataKeyIdentity(selected) === dataKeyIdentity(row))
218
- : selectedItemsList.includes(row);
219
- const toggleRowSelection = (row) => {
220
- const next = isRowSelected(row)
221
- ? selectedItemsList.filter((selected) => dataKey
222
- ? dataKeyIdentity(selected) !== dataKeyIdentity(row)
223
- : selected !== row)
224
- : [...selectedItemsList, row];
225
- onSelectedItemsChange?.(next);
226
- };
227
- const visibleRows = filteredRows.map(({ row }) => row);
228
- const isVisibleRow = (row) => dataKey
229
- ? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))
230
- : visibleRows.includes(row);
231
- const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;
232
- const allFilteredRowsSelected = visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;
233
- const someFilteredRowsSelected = selectedVisibleCount > 0 && !allFilteredRowsSelected;
234
- const selectAllRef = useRef(null);
235
- useEffect(() => {
236
- if (selectAllRef.current) {
237
- selectAllRef.current.indeterminate = someFilteredRowsSelected;
238
- }
239
- }, [someFilteredRowsSelected]);
240
- const toggleSelectAll = () => {
241
- if (allFilteredRowsSelected) {
242
- onSelectedItemsChange?.(selectedItemsList.filter((selected) => !isVisibleRow(selected)));
243
- return;
244
- }
245
- const additions = visibleRows.filter((row) => !isRowSelected(row));
246
- onSelectedItemsChange?.([...selectedItemsList, ...additions]);
247
- };
248
- return (jsxs("div", { ...pt?.root, className: classNames('cratis-datatable', scrollable ? 'cratis-datatable--scrollable' : undefined, pt?.root?.className, className), style: { ...pt?.root?.style, ...style }, "data-cratis-part": 'root', "data-busy": isBusy || undefined, children: [!!globalFilterFields?.length && (jsx("div", { ...pt?.search, className: classNames('cratis-datatable-search', pt?.search?.className), "data-cratis-part": 'search', children: jsx("input", { ...pt?.searchInput, value: globalFilter, placeholder: resolvedGlobalSearchPlaceholder, "aria-label": resolvedGlobalSearchAriaLabel, className: classNames('cratis-datatable-search__input', pt?.searchInput?.className), "data-cratis-part": 'search-input', onChange: (event) => setGlobalFilter(event.target.value) }) })), jsx("div", { ...pt?.tableContainer, className: classNames('cratis-datatable__container', pt?.tableContainer?.className), style: {
68
+ return (jsxs("div", { ...pt?.root, className: classNames('cratis-datatable', scrollable ? 'cratis-datatable--scrollable' : undefined, pt?.root?.className, className), style: { ...pt?.root?.style, ...style }, "data-cratis-part": 'root', "data-busy": isBusy || undefined, children: [!!globalFilterFields?.length && (jsx(DataTableSearch, { parts: pt, value: globalFilter, placeholder: resolvedGlobalSearchPlaceholder, ariaLabel: resolvedGlobalSearchAriaLabel, onChange: setGlobalFilter })), jsx("div", { ...pt?.tableContainer, className: classNames('cratis-datatable__container', pt?.tableContainer?.className), style: {
249
69
  ...pt?.tableContainer?.style,
250
70
  ...(scrollable
251
71
  ? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }
252
72
  : {}),
253
- }, "data-cratis-part": 'table-container', children: jsxs("table", { ...pt?.table, className: classNames('cratis-datatable__table', pt?.table?.className), "data-cratis-part": 'table', "aria-busy": isBusy || undefined, children: [jsx("thead", { ...pt?.head, className: classNames('cratis-datatable__head', pt?.head?.className), "data-cratis-part": 'head', children: jsx("tr", { ...pt?.headerRow, className: classNames('cratis-datatable__header-row', pt?.headerRow?.className), "data-cratis-part": 'header-row', children: columns.map((column, index) => {
254
- const field = column.props.filterField ?? column.props.field;
255
- const ariaSort = sort && sort.field === column.props.field
256
- ? sort.direction
257
- : undefined;
258
- return (jsx("th", { ...pt?.headerCell, scope: 'col', "aria-label": column.props.selectionMode
259
- ? resolvedSelectionAriaLabel
260
- : undefined, "aria-sort": ariaSort, style: {
261
- ...pt?.headerCell?.style,
262
- ...column.props.style,
263
- ...column.props.headerStyle,
264
- }, className: classNames('cratis-datatable__header-cell', pt?.headerCell?.className, column.props.headerClassName), "data-cratis-part": 'header-cell', "data-selected": Boolean(ariaSort) || undefined, children: jsxs("div", { className: 'cratis-datatable-header-cell', "data-cratis-part": 'header-content', "data-selected": Boolean(ariaSort) || undefined, children: [column.props.selectionMode ===
265
- 'multiple' ? (jsx("input", { type: 'checkbox', "aria-label": resolvedSelectAllAriaLabel, "data-cratis-part": 'select-all', checked: allFilteredRowsSelected, ref: selectAllRef, onChange: toggleSelectAll })) : (column.props.selectionMode && (jsx("span", { className: 'cratis-datatable__sr-only', children: resolvedSelectionAriaLabel }))), column.props.sortable &&
266
- column.props.field ? (jsxs("button", { type: 'button', className: 'cratis-datatable__sort', "data-cratis-part": 'sort', "data-pressed": Boolean(ariaSort) || undefined, onClick: () => setSort({
267
- field: column.props
268
- .field,
269
- direction: sort?.field ===
270
- column.props.field &&
271
- sort?.direction ===
272
- DataTableSortDirection.Ascending
273
- ? DataTableSortDirection.Descending
274
- : DataTableSortDirection.Ascending,
275
- }), children: [jsx("span", { children: column.props.header }), ariaSort && (jsx("span", { "aria-hidden": 'true', children: ariaSort === 'ascending'
276
- ? sortAscendingIcon
277
- : sortDescendingIcon }))] })) : (column.props.header), column.props.filter && field && (jsx(ColumnFilterMenu, { field: field, dataType: column.props.dataType, placeholder: column.props.filterPlaceholder, showMatchModes: column.props.showFilterMatchModes, filterElement: column.props.filterElement, filterOptions: column.props.filterOptions, labels: column.props.filterLabels, pt: column.props.filterPt, constraint: firstConstraint(filters[field]), onApply: (constraint) => updateFilter(field, constraint), onClear: () => updateFilter(field, undefined) }))] }) }, index));
278
- }) }) }), jsx("tbody", { ...pt?.body, className: classNames('cratis-datatable__body', pt?.body?.className), "data-cratis-part": 'body', children: status === DataTableStatus.Failed ||
279
- status === DataTableStatus.Unauthorized ? (jsx("tr", { ...pt?.failureRow, className: classNames('cratis-datatable__failure-row', pt?.failureRow?.className), "data-cratis-part": 'failure-row', "data-reason": status, children: jsx("td", { ...pt?.failureCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__failure-cell', pt?.failureCell?.className), "data-cratis-part": 'failure-cell', children: jsx("div", { role: 'alert', children: status === DataTableStatus.Failed
280
- ? resolvedFailureMessage
281
- : resolvedUnauthorizedMessage }) }) }, status)) : status === DataTableStatus.Loading && data.length === 0 ? (jsx("tr", { ...pt?.loadingRow, className: classNames('cratis-datatable__loading-row', pt?.loadingRow?.className), "data-cratis-part": 'loading-row', children: jsx("td", { ...pt?.loadingCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__loading-cell', pt?.loadingCell?.className), "data-cratis-part": 'loading-cell', children: jsx("div", { role: 'status', children: resolvedLoadingMessage }) }) }, status)) : filteredRows.length === 0 ? (jsx("tr", { ...pt?.emptyRow, className: classNames('cratis-datatable__empty-row', pt?.emptyRow?.className), "data-cratis-part": 'empty-row', children: jsx("td", { ...pt?.emptyCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__empty-cell', pt?.emptyCell?.className), "data-cratis-part": 'empty-cell', children: emptyMessage }) })) : (filteredRows.map(({ row, loadedIndex }) => {
73
+ }, "data-cratis-part": 'table-container', children: jsxs("table", { ...pt?.table, className: classNames('cratis-datatable__table', pt?.table?.className), "data-cratis-part": 'table', "aria-busy": isBusy || undefined, children: [jsx("thead", { ...pt?.head, className: classNames('cratis-datatable__head', pt?.head?.className), "data-cratis-part": 'head', children: jsx("tr", { ...pt?.headerRow, className: classNames('cratis-datatable__header-row', pt?.headerRow?.className), "data-cratis-part": 'header-row', children: columns.map((column, index) => (jsx(DataTableHeaderCell, { column: column, parts: pt, sort: sort, onSort: setSort, filters: filters, updateFilter: updateFilter, resolvedSelectionAriaLabel: resolvedSelectionAriaLabel, resolvedSelectAllAriaLabel: resolvedSelectAllAriaLabel, allFilteredRowsSelected: allFilteredRowsSelected, selectAllRef: selectAllRef, toggleSelectAll: toggleSelectAll, sortAscendingIcon: sortAscendingIcon, sortDescendingIcon: sortDescendingIcon }, index))) }) }), jsx(DataTableBody, { status: status, hasLoadedRows: data.length > 0, rowCount: filteredRows.length, columnCount: columns.length, parts: pt, messages: messages, emptyMessage: emptyMessage, renderRows: () => filteredRows.map(({ row, loadedIndex }) => {
282
74
  const identity = dataKey
283
75
  ? dataKeyIdentity(row)
284
76
  : 'loaded-row';
285
- const rowKey = `${identity}::${loadedIndex}`;
286
77
  const isSelected = selectionMode === 'single' &&
287
78
  isSelectedRow(row, loadedIndex);
288
- const isInteractive = Boolean(onRowClick) ||
289
- selectionMode === 'single' ||
290
- selectionMode === 'multiple';
291
- return (jsx("tr", { ...pt?.row, tabIndex: isInteractive ? 0 : pt?.row?.tabIndex, "aria-selected": selectionMode === 'single'
292
- ? isSelected
293
- : undefined, className: classNames('cratis-datatable__row', pt?.row?.className, rowClassName?.(row)), "data-cratis-part": 'row', "data-selected": isSelected || undefined, "data-interactive": isInteractive || undefined, onClick: (event) => activateRow(row, loadedIndex, event), onKeyDown: (event) => {
294
- if (event.target !== event.currentTarget ||
295
- (event.key !== 'Enter' &&
296
- event.key !== ' ')) {
297
- return;
298
- }
299
- event.preventDefault();
300
- activateRow(row, loadedIndex, event);
301
- }, children: columns.map((column, columnIndex) => (jsx("td", { ...pt?.cell, style: {
302
- ...pt?.cell?.style,
303
- ...column.props.style,
304
- ...column.props.bodyStyle,
305
- }, className: classNames('cratis-datatable__cell', pt?.cell?.className, column.props.bodyClassName ??
306
- column.props.className), "data-cratis-part": 'cell', "data-selected": isSelected || undefined, children: column.props.selectionMode ===
307
- 'multiple' ? (jsx("input", { type: 'checkbox', "aria-label": resolvedSelectionAriaLabel, checked: isRowSelected(row), onClick: (event) => event.stopPropagation(), onChange: () => toggleRowSelection(row) })) : column.props.selectionMode ? (jsx("input", { type: 'radio', name: selectionGroupName, readOnly: true, tabIndex: -1, "aria-label": resolvedSelectionAriaLabel, checked: isSelected })) : (renderCellContent(column.props, row)) }, columnIndex))) }, rowKey));
308
- })) })] }) })] }));
79
+ return (jsx(DataTableRow, { row: row, columns: columns, parts: pt, selectionMode: selectionMode, isSelected: isSelected, isInteractive: isInteractive, isRowSelected: isRowSelected(row), rowClassName: rowClassName, resolvedSelectionAriaLabel: resolvedSelectionAriaLabel, selectionGroupName: selectionGroupName, onActivate: (event) => activateRow(row, loadedIndex, event), onToggleSelection: () => toggleRowSelection(row) }, `${identity}::${loadedIndex}`));
80
+ }) })] }) })] }));
309
81
  };
310
82
 
311
83
  export { DataTableCore };