@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.
- package/MIGRATION.md +3 -3
- package/compat-manifest.json +11 -11
- package/dist/esm/DataTables/DataTableBody.d.ts +22 -0
- package/dist/esm/DataTables/DataTableBody.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableBody.js +10 -0
- package/dist/esm/DataTables/DataTableBody.js.map +1 -0
- package/dist/esm/DataTables/DataTableCore.d.ts +8 -48
- package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableCore.js +50 -278
- package/dist/esm/DataTables/DataTableCore.js.map +1 -1
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts +25 -0
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js +26 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js +4 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.js +4 -0
- package/dist/esm/DataTables/DataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/DataTableParts.d.ts +40 -0
- package/dist/esm/DataTables/DataTableParts.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableParts.js +4 -0
- package/dist/esm/DataTables/DataTableParts.js.map +1 -0
- package/dist/esm/DataTables/DataTableRow.d.ts +22 -0
- package/dist/esm/DataTables/DataTableRow.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRow.js +25 -0
- package/dist/esm/DataTables/DataTableRow.js.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts +8 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js +4 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts +13 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.js +7 -0
- package/dist/esm/DataTables/DataTableSearch.js.map +1 -0
- package/dist/esm/DataTables/DataTableState.d.ts +18 -0
- package/dist/esm/DataTables/DataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableState.js +4 -0
- package/dist/esm/DataTables/DataTableState.js.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts +20 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.js +4 -0
- package/dist/esm/DataTables/DataTableStateProps.js.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts +8 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.js +4 -0
- package/dist/esm/DataTables/ProcessedRow.js.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts +17 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.js +4 -0
- package/dist/esm/DataTables/RowProcessingState.js.map +1 -0
- package/dist/esm/DataTables/RowSelection.d.ts +19 -0
- package/dist/esm/DataTables/RowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelection.js +4 -0
- package/dist/esm/DataTables/RowSelection.js.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts +16 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.js +4 -0
- package/dist/esm/DataTables/RowSelectionSource.js.map +1 -0
- package/dist/esm/DataTables/classNames.d.ts +7 -0
- package/dist/esm/DataTables/classNames.d.ts.map +1 -0
- package/dist/esm/DataTables/classNames.js +4 -0
- package/dist/esm/DataTables/classNames.js.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts +15 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.js +70 -0
- package/dist/esm/DataTables/matchesFilterEntry.js.map +1 -0
- package/dist/esm/DataTables/processRows.d.ts +10 -0
- package/dist/esm/DataTables/processRows.d.ts.map +1 -0
- package/dist/esm/DataTables/processRows.js +42 -0
- package/dist/esm/DataTables/processRows.js.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts +9 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.js +33 -0
- package/dist/esm/DataTables/useDataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/useDataTableState.d.ts +10 -0
- package/dist/esm/DataTables/useDataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableState.js +19 -0
- package/dist/esm/DataTables/useDataTableState.js.map +1 -0
- package/dist/esm/DataTables/useRowSelection.d.ts +9 -0
- package/dist/esm/DataTables/useRowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/useRowSelection.js +87 -0
- package/dist/esm/DataTables/useRowSelection.js.map +1 -0
- package/dist/esm/DataTables/valueAtPath.d.ts +10 -0
- package/dist/esm/DataTables/valueAtPath.d.ts.map +1 -0
- package/dist/esm/DataTables/valueAtPath.js +18 -0
- package/dist/esm/DataTables/valueAtPath.js.map +1 -0
- 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`.
|
|
49
|
-
adapters
|
|
50
|
-
|
|
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
|
|
package/compat-manifest.json
CHANGED
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
{
|
|
69
69
|
"name": "@cratis/components",
|
|
70
70
|
"role": "core",
|
|
71
|
-
"version": "4.21.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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 {
|
|
7
|
-
|
|
8
|
-
export
|
|
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":"AAGA,OAAO,KAAK,EAAE,
|
|
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
|
|
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 '
|
|
9
|
-
import '
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
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 {
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
289
|
-
|
|
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 };
|