@jmruthers/pace-core 0.5.64 → 0.5.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DataTable-7BER7PDS.js → DataTable-MFUXNGPR.js} +2 -2
- package/dist/{DataTable-D15XipLZ.d.ts → DataTable-ntgmhO2W.d.ts} +1 -1
- package/dist/{chunk-S66AJVI2.js → chunk-4HQ5BOVZ.js} +97 -27
- package/dist/chunk-4HQ5BOVZ.js.map +1 -0
- package/dist/{chunk-2LPYEFXI.js → chunk-PSE2XO4L.js} +2 -2
- package/dist/components.d.ts +2 -2
- package/dist/components.js +2 -2
- package/dist/hooks.d.ts +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/{types-E5WSpEtz.d.ts → types-CGX9Vyf5.d.ts} +8 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +1 -1
- package/docs/api/classes/ColumnFactory.md +6 -6
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +14 -14
- package/docs/api/interfaces/DataTableColumn.md +21 -21
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +4 -4
- package/package.json +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +27 -11
- package/src/components/DataTable/components/DataTableCore.tsx +13 -13
- package/src/components/DataTable/components/EditableRow.tsx +46 -28
- package/src/components/DataTable/components/UnifiedTableBody.tsx +86 -38
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +5 -3
- package/src/components/DataTable/core/ColumnFactory.ts +4 -0
- package/src/components/DataTable/types.ts +10 -0
- package/src/types/index.ts +2 -0
- package/dist/chunk-S66AJVI2.js.map +0 -1
- /package/dist/{DataTable-7BER7PDS.js.map → DataTable-MFUXNGPR.js.map} +0 -0
- /package/dist/{chunk-2LPYEFXI.js.map → chunk-PSE2XO4L.js.map} +0 -0
package/docs/api/modules.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
[@jmruthers/pace-core - v0.5.
|
|
1
|
+
[@jmruthers/pace-core - v0.5.66](README.md) / Exports
|
|
2
2
|
|
|
3
|
-
# @jmruthers/pace-core - v0.5.
|
|
3
|
+
# @jmruthers/pace-core - v0.5.66
|
|
4
4
|
|
|
5
5
|
**`File`**
|
|
6
6
|
|
|
@@ -372,7 +372,7 @@ Generic data record type - all DataTable data must extend this
|
|
|
372
372
|
|
|
373
373
|
#### Defined in
|
|
374
374
|
|
|
375
|
-
[packages/core/src/components/DataTable/types.ts:
|
|
375
|
+
[packages/core/src/components/DataTable/types.ts:37](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/components/DataTable/types.ts#L37)
|
|
376
376
|
|
|
377
377
|
___
|
|
378
378
|
|
|
@@ -405,7 +405,7 @@ Row identifier function type
|
|
|
405
405
|
|
|
406
406
|
#### Defined in
|
|
407
407
|
|
|
408
|
-
[packages/core/src/components/DataTable/types.ts:
|
|
408
|
+
[packages/core/src/components/DataTable/types.ts:42](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/components/DataTable/types.ts#L42)
|
|
409
409
|
|
|
410
410
|
___
|
|
411
411
|
|
package/package.json
CHANGED
|
@@ -273,7 +273,7 @@ export function DataTableBody<TData extends Record<string, any>>({
|
|
|
273
273
|
aria-label={`Sort by ${typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : 'column'}`}
|
|
274
274
|
tabIndex={0}
|
|
275
275
|
>
|
|
276
|
-
<div className=
|
|
276
|
+
<div className={`flex items-center gap-1 ${header.column.columnDef.meta?.align === 'right' ? 'justify-end' : ''}`}>
|
|
277
277
|
{typeof header.column.columnDef.header === 'function'
|
|
278
278
|
? header.column.columnDef.header(header.getContext())
|
|
279
279
|
: header.column.columnDef.header}
|
|
@@ -287,7 +287,7 @@ export function DataTableBody<TData extends Record<string, any>>({
|
|
|
287
287
|
</div>
|
|
288
288
|
</Button>
|
|
289
289
|
) : (
|
|
290
|
-
<div>
|
|
290
|
+
<div className={header.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}>
|
|
291
291
|
{typeof header.column.columnDef.header === 'function'
|
|
292
292
|
? header.column.columnDef.header(header.getContext())
|
|
293
293
|
: header.column.columnDef.header}
|
|
@@ -438,15 +438,31 @@ export function DataTableBody<TData extends Record<string, any>>({
|
|
|
438
438
|
{row.getVisibleCells().map((cell) => (
|
|
439
439
|
<td key={cell.id}>
|
|
440
440
|
{isEditing && cell.column.id !== 'actions' ? (
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
441
|
+
// Check if column has a custom cell renderer - if so, use it in edit mode
|
|
442
|
+
cell.column.columnDef.cell ? (
|
|
443
|
+
flexRender(cell.column.columnDef.cell, {
|
|
444
|
+
...cell.getContext(),
|
|
445
|
+
getIsEditing: () => true, // Always true in edit mode
|
|
446
|
+
setValue: (value: any) => {
|
|
447
|
+
if (typeof value === 'object' && value !== null) {
|
|
448
|
+
onEditingDataChange({ ...editingData, ...value });
|
|
449
|
+
} else {
|
|
450
|
+
onEditingDataChange({ ...editingData, [cell.column.id]: value });
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
})
|
|
454
|
+
) : (
|
|
455
|
+
// Fall back to default edit field rendering when no custom cell renderer
|
|
456
|
+
renderEditField(cell.column, editingData[cell.column.id], (value) => {
|
|
457
|
+
if (typeof value === 'object' && value !== null) {
|
|
458
|
+
// Handle editAccessorKey case
|
|
459
|
+
onEditingDataChange({ ...editingData, ...value });
|
|
460
|
+
} else {
|
|
461
|
+
// Handle simple value case
|
|
462
|
+
onEditingDataChange({ ...editingData, [cell.column.id]: value });
|
|
463
|
+
}
|
|
464
|
+
}, editingData)
|
|
465
|
+
)
|
|
450
466
|
) : (
|
|
451
467
|
flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
452
468
|
)}
|
|
@@ -1062,21 +1062,21 @@ function DataTableInternal<TData extends DataRecord>({
|
|
|
1062
1062
|
aria-label={`Sort by ${typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : 'column'}`}
|
|
1063
1063
|
tabIndex={0}
|
|
1064
1064
|
>
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1065
|
+
<div className={`flex items-center gap-1 ${header.column.columnDef.meta?.align === 'right' ? 'justify-end' : ''}`}>
|
|
1066
|
+
{typeof header.column.columnDef.header === 'function'
|
|
1067
|
+
? header.column.columnDef.header(header.getContext())
|
|
1068
|
+
: header.column.columnDef.header}
|
|
1069
|
+
{header.column.getIsSorted() === 'asc' ? (
|
|
1070
|
+
<ChevronUp className="h-4 w-4" />
|
|
1071
|
+
) : header.column.getIsSorted() === 'desc' ? (
|
|
1072
|
+
<ChevronDown className="h-4 w-4" />
|
|
1073
|
+
) : (
|
|
1074
|
+
<ChevronsUpDown className="h-4 w-4" />
|
|
1075
|
+
)}
|
|
1076
|
+
</div>
|
|
1077
1077
|
</Button>
|
|
1078
1078
|
) : (
|
|
1079
|
-
<div>
|
|
1079
|
+
<div className={header.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}>
|
|
1080
1080
|
{typeof header.column.columnDef.header === 'function'
|
|
1081
1081
|
? header.column.columnDef.header(header.getContext())
|
|
1082
1082
|
: header.column.columnDef.header}
|
|
@@ -117,34 +117,52 @@ export function EditableRow<TData extends DataRecord>({
|
|
|
117
117
|
<tr>
|
|
118
118
|
{row.getVisibleCells().map((cell: any) => (
|
|
119
119
|
<td key={cell.id}>
|
|
120
|
-
{cell.column.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
120
|
+
<div className={cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}>
|
|
121
|
+
{cell.column.id !== 'actions' ? (
|
|
122
|
+
// Check if column has a custom cell renderer - if so, use it in edit mode
|
|
123
|
+
cell.column.columnDef.cell ? (
|
|
124
|
+
flexRender(cell.column.columnDef.cell, {
|
|
125
|
+
...cell.getContext(),
|
|
126
|
+
getIsEditing: () => true, // Always true in edit mode
|
|
127
|
+
setValue: (value: any) => {
|
|
128
|
+
if (typeof value === 'object' && value !== null) {
|
|
129
|
+
onEditingDataChange({ ...editingData, ...value });
|
|
130
|
+
} else {
|
|
131
|
+
onEditingDataChange({ ...editingData, [cell.column.id]: value });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
) : (
|
|
136
|
+
// Fall back to default edit field rendering when no custom cell renderer
|
|
137
|
+
renderEditField(cell.column, editingData[cell.column.id], (value) => {
|
|
138
|
+
if (typeof value === 'object' && value !== null) {
|
|
139
|
+
// Handle editAccessorKey case
|
|
140
|
+
onEditingDataChange({ ...editingData, ...value });
|
|
141
|
+
} else {
|
|
142
|
+
// Handle simple value case
|
|
143
|
+
onEditingDataChange({ ...editingData, [cell.column.id]: value });
|
|
144
|
+
}
|
|
145
|
+
}, editingData)
|
|
146
|
+
)
|
|
147
|
+
) : (
|
|
148
|
+
<div className="flex gap-1">
|
|
149
|
+
<Button
|
|
150
|
+
onClick={onSave}
|
|
151
|
+
size="sm"
|
|
152
|
+
variant="default"
|
|
153
|
+
>
|
|
154
|
+
Save
|
|
155
|
+
</Button>
|
|
156
|
+
<Button
|
|
157
|
+
onClick={onCancel}
|
|
158
|
+
size="sm"
|
|
159
|
+
variant="outline"
|
|
160
|
+
>
|
|
161
|
+
Cancel
|
|
162
|
+
</Button>
|
|
163
|
+
</div>
|
|
164
|
+
)}
|
|
165
|
+
</div>
|
|
148
166
|
</td>
|
|
149
167
|
))}
|
|
150
168
|
{actions.length > 0 && (
|
|
@@ -349,36 +349,61 @@ const MemoizedRow = ({
|
|
|
349
349
|
className: "px-3 py-2 pl-8 whitespace-normal break-words"
|
|
350
350
|
})}
|
|
351
351
|
>
|
|
352
|
-
{
|
|
353
|
-
|
|
354
|
-
if
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
352
|
+
<div className={`${cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}`}>
|
|
353
|
+
{isSubRowEditing && cell.column.id !== 'actions' ? (
|
|
354
|
+
// Check if column has a custom cell renderer - if so, use it in edit mode
|
|
355
|
+
cell.column.columnDef.cell ? (
|
|
356
|
+
flexRender(cell.column.columnDef.cell, {
|
|
357
|
+
...cell.getContext(),
|
|
358
|
+
hierarchical: hierarchical,
|
|
359
|
+
isParent: false,
|
|
360
|
+
isChild: true,
|
|
361
|
+
isHierarchical: false,
|
|
362
|
+
rowId: subRowId,
|
|
363
|
+
isExpanded: false,
|
|
364
|
+
hasChildren: false,
|
|
365
|
+
getIsEditing: () => true, // Always true in edit mode
|
|
366
|
+
setValue: (value: any) => {
|
|
367
|
+
if (typeof value === 'object' && value !== null) {
|
|
368
|
+
onEditingDataChange?.({ ...editingData, ...value });
|
|
369
|
+
} else {
|
|
370
|
+
onEditingDataChange?.({ ...editingData, [cell.column.id]: value });
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
})
|
|
374
|
+
) : (
|
|
375
|
+
// Fall back to default edit field rendering when no custom cell renderer
|
|
376
|
+
renderEditField(cell.column, editingData?.[cell.column.id], (value) => {
|
|
377
|
+
if (typeof value === 'object' && value !== null) {
|
|
378
|
+
onEditingDataChange?.({ ...editingData, ...value });
|
|
379
|
+
} else {
|
|
380
|
+
onEditingDataChange?.({ ...editingData, [cell.column.id]: value });
|
|
381
|
+
}
|
|
382
|
+
}, editingData)
|
|
383
|
+
)
|
|
384
|
+
) : cell.column.id === 'actions' ? (
|
|
385
|
+
<ActionButtons
|
|
386
|
+
row={row}
|
|
387
|
+
actions={actions}
|
|
388
|
+
isEditing={isEditing}
|
|
389
|
+
isParent={isParent}
|
|
390
|
+
hierarchical={!!hierarchical}
|
|
391
|
+
rbac={rbac}
|
|
392
|
+
permissions={permissions}
|
|
393
|
+
/>
|
|
394
|
+
) : (
|
|
395
|
+
flexRender(cell.column.columnDef.cell, {
|
|
396
|
+
...cell.getContext(),
|
|
397
|
+
hierarchical: hierarchical,
|
|
398
|
+
isParent: false,
|
|
399
|
+
isChild: true,
|
|
400
|
+
isHierarchical: false,
|
|
401
|
+
rowId: subRowId,
|
|
402
|
+
isExpanded: false,
|
|
403
|
+
hasChildren: false
|
|
404
|
+
})
|
|
405
|
+
)}
|
|
406
|
+
</div>
|
|
382
407
|
</td>
|
|
383
408
|
))}
|
|
384
409
|
</tr>
|
|
@@ -468,15 +493,38 @@ const MemoizedRow = ({
|
|
|
468
493
|
)}
|
|
469
494
|
|
|
470
495
|
{/* Cell content */}
|
|
471
|
-
<div className=
|
|
496
|
+
<div className={`flex-1 ${cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}`}>
|
|
472
497
|
{isEditing && cell.column.id !== 'actions' ? (
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
498
|
+
// Check if column has a custom cell renderer - if so, use it in edit mode
|
|
499
|
+
cell.column.columnDef.cell ? (
|
|
500
|
+
flexRender(cell.column.columnDef.cell, {
|
|
501
|
+
...cell.getContext(),
|
|
502
|
+
hierarchical: hierarchical,
|
|
503
|
+
isParent: isParent,
|
|
504
|
+
isChild: isChild,
|
|
505
|
+
isHierarchical: isHierarchical,
|
|
506
|
+
rowId: rowId,
|
|
507
|
+
isExpanded: isExpanded,
|
|
508
|
+
hasChildren: hasChildren,
|
|
509
|
+
getIsEditing: () => true, // Always true in edit mode
|
|
510
|
+
setValue: (value: any) => {
|
|
511
|
+
if (typeof value === 'object' && value !== null) {
|
|
512
|
+
onEditingDataChange?.({ ...editingData, ...value });
|
|
513
|
+
} else {
|
|
514
|
+
onEditingDataChange?.({ ...editingData, [cell.column.id]: value });
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
})
|
|
518
|
+
) : (
|
|
519
|
+
// Fall back to default edit field rendering when no custom cell renderer
|
|
520
|
+
renderEditField(cell.column, editingData?.[cell.column.id], (value) => {
|
|
521
|
+
if (typeof value === 'object' && value !== null) {
|
|
522
|
+
onEditingDataChange?.({ ...editingData, ...value });
|
|
523
|
+
} else {
|
|
524
|
+
onEditingDataChange?.({ ...editingData, [cell.column.id]: value });
|
|
525
|
+
}
|
|
526
|
+
}, editingData)
|
|
527
|
+
)
|
|
480
528
|
) : cell.column.id === 'actions' ? (
|
|
481
529
|
isEditing ? (
|
|
482
530
|
<div className="flex gap-1">
|
|
@@ -32,7 +32,9 @@ const MemoizedCell = memo(({ cell, style }: { cell: any; style?: React.CSSProper
|
|
|
32
32
|
)}
|
|
33
33
|
style={style}
|
|
34
34
|
>
|
|
35
|
-
{
|
|
35
|
+
<div className={cell.column?.columnDef?.meta?.align === 'right' ? 'text-right' : ''}>
|
|
36
|
+
{flexRender(cell.column?.columnDef?.cell, cell.getContext?.() || {})}
|
|
37
|
+
</div>
|
|
36
38
|
</td>
|
|
37
39
|
);
|
|
38
40
|
});
|
|
@@ -185,7 +187,7 @@ export function VirtualizedDataTable<TData extends DataRecord>({
|
|
|
185
187
|
style={{}}
|
|
186
188
|
onClick={header.column?.getToggleSortingHandler ? header.column.getToggleSortingHandler() : undefined}
|
|
187
189
|
>
|
|
188
|
-
<div className=
|
|
190
|
+
<div className={`flex items-center space-x-1 ${header.column?.columnDef?.meta?.align === 'right' ? 'justify-end' : ''}`}>
|
|
189
191
|
{header.isPlaceholder
|
|
190
192
|
? null
|
|
191
193
|
: flexRender(header.column?.columnDef?.header, header.getContext?.() || {})}
|
|
@@ -413,7 +415,7 @@ export function EnhancedVirtualizedDataTable<TData extends DataRecord>({
|
|
|
413
415
|
style={{}}
|
|
414
416
|
onClick={header.column?.getToggleSortingHandler ? header.column.getToggleSortingHandler() : undefined}
|
|
415
417
|
>
|
|
416
|
-
<div className=
|
|
418
|
+
<div className={`flex items-center space-x-1 ${header.column?.columnDef?.meta?.align === 'right' ? 'justify-end' : ''}`}>
|
|
417
419
|
{header.isPlaceholder
|
|
418
420
|
? null
|
|
419
421
|
: flexRender(header.column?.columnDef?.header, header.getContext?.() || {})}
|
|
@@ -120,6 +120,10 @@ export class ColumnFactory<TData extends DataRecord = DataRecord> {
|
|
|
120
120
|
size: options.size,
|
|
121
121
|
minSize: options.minSize,
|
|
122
122
|
maxSize: options.maxSize,
|
|
123
|
+
meta: {
|
|
124
|
+
align: 'right' as const,
|
|
125
|
+
type: 'number' as const,
|
|
126
|
+
},
|
|
123
127
|
} as ColumnDef<TData>;
|
|
124
128
|
}
|
|
125
129
|
|
|
@@ -17,6 +17,16 @@ import type {
|
|
|
17
17
|
} from '@tanstack/react-table';
|
|
18
18
|
import type { ImportModalConfig } from './components/ImportModal';
|
|
19
19
|
|
|
20
|
+
// Extend TanStack Table types to include custom meta properties
|
|
21
|
+
declare module '@tanstack/react-table' {
|
|
22
|
+
interface ColumnMeta<TData, TValue> {
|
|
23
|
+
/** Text alignment for the column content */
|
|
24
|
+
align?: 'left' | 'right' | 'center';
|
|
25
|
+
/** Column type for styling purposes */
|
|
26
|
+
type?: 'text' | 'number' | 'date' | 'boolean' | 'custom';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
20
30
|
// ============================================================================
|
|
21
31
|
// CORE DATA TYPES
|
|
22
32
|
// ============================================================================
|