@jmruthers/pace-core 0.5.123 → 0.5.125
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-WTS4IRF2.js → DataTable-IHD4JP4W.js} +2 -2
- package/dist/{chunk-ZPJMYGEP.js → chunk-HC7AOIC2.js} +2 -2
- package/dist/{chunk-DHMFMXFV.js → chunk-JJVLYIEO.js} +75 -17
- package/dist/chunk-JJVLYIEO.js.map +1 -0
- package/dist/components.js +2 -2
- package/dist/index.js +2 -2
- package/dist/utils.js +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- 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/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- 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/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.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/ProtectedRouteProps.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/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.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/SwitchProps.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/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.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 +2 -2
- package/package.json +1 -1
- package/src/components/DataTable/components/DataTableCore.tsx +62 -11
- package/src/components/DataTable/components/UnifiedTableBody.tsx +27 -5
- package/dist/chunk-DHMFMXFV.js.map +0 -1
- /package/dist/{DataTable-WTS4IRF2.js.map → DataTable-IHD4JP4W.js.map} +0 -0
- /package/dist/{chunk-ZPJMYGEP.js.map → chunk-HC7AOIC2.js.map} +0 -0
package/docs/api/modules.md
CHANGED
package/package.json
CHANGED
|
@@ -234,6 +234,17 @@ function DataTableInternal<TData extends DataRecord>({
|
|
|
234
234
|
// MANDATORY: Get permissions and secure features
|
|
235
235
|
const { permissions, secureFeatures, effectivePageId } = useDataTablePermissions(rbac, requestedFeatures);
|
|
236
236
|
|
|
237
|
+
// Debug logging for creation feature
|
|
238
|
+
if (import.meta.env.MODE === 'development') {
|
|
239
|
+
logger.debug('[DataTableCore] Creation feature check:', {
|
|
240
|
+
'incomingFeatures.creation': incomingFeatures.creation,
|
|
241
|
+
'requestedFeatures.creation': requestedFeatures.creation,
|
|
242
|
+
'secureFeatures.creation': secureFeatures.creation,
|
|
243
|
+
'permissions.canCreate.can': permissions.canCreate.can,
|
|
244
|
+
'onCreateRow prop provided': !!onCreateRow
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
237
248
|
// ============================================================================
|
|
238
249
|
// UNIFIED STATE MANAGEMENT - Use ONLY useDataTableState for all state
|
|
239
250
|
// ============================================================================
|
|
@@ -640,14 +651,45 @@ function DataTableInternal<TData extends DataRecord>({
|
|
|
640
651
|
// ============================================================================
|
|
641
652
|
|
|
642
653
|
// MANDATORY: Handlers are automatically secured
|
|
643
|
-
const secureHandlers = useMemo(() =>
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
654
|
+
const secureHandlers = useMemo(() => {
|
|
655
|
+
const handlers = {
|
|
656
|
+
onEditRow: permissions.canUpdate.can ? onEditRow : undefined,
|
|
657
|
+
onDeleteRow: permissions.canDelete.can ? onDeleteRow : undefined,
|
|
658
|
+
onCreateRow: permissions.canCreate.can ? onCreateRow : undefined,
|
|
659
|
+
onImport: permissions.canImport.can ? onImport : undefined,
|
|
660
|
+
onExport: permissions.canExport.can ? onExport : undefined,
|
|
661
|
+
onDeleteSelected: permissions.canDelete.can ? onDeleteSelected : undefined,
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
// Debug logging for creation handler
|
|
665
|
+
if (import.meta.env.MODE === 'development') {
|
|
666
|
+
logger.debug('[DataTableCore] Creation handler check:', {
|
|
667
|
+
'permissions.canCreate.can': permissions.canCreate.can,
|
|
668
|
+
'onCreateRow prop provided': !!onCreateRow,
|
|
669
|
+
'secureHandlers.onCreateRow': !!handlers.onCreateRow,
|
|
670
|
+
'secureFeatures.creation': secureFeatures.creation,
|
|
671
|
+
'will pass onCreateRow to toolbar': secureFeatures.creation && !!handlers.onCreateRow
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
return handlers;
|
|
676
|
+
}, [permissions.canUpdate.can, permissions.canDelete.can, permissions.canCreate.can, permissions.canImport.can, permissions.canExport.can, onEditRow, onDeleteRow, onCreateRow, onImport, onExport, onDeleteSelected, secureFeatures.creation, logger]);
|
|
677
|
+
|
|
678
|
+
// Explicit debug log for creation button visibility (easier to spot)
|
|
679
|
+
if (import.meta.env.MODE === 'development') {
|
|
680
|
+
logger.debug('[DataTableCore] ⚠️ CREATION BUTTON DIAGNOSIS:', {
|
|
681
|
+
'✅ permissions.canCreate.can': permissions.canCreate.can,
|
|
682
|
+
'❓ features.creation enabled': secureFeatures.creation,
|
|
683
|
+
'❓ onCreateRow handler provided': !!onCreateRow,
|
|
684
|
+
'❓ secureHandlers.onCreateRow': !!secureHandlers.onCreateRow,
|
|
685
|
+
'🔍 WILL SHOW BUTTON': secureFeatures.creation && permissions.canCreate.can && !!onCreateRow,
|
|
686
|
+
'💡 SOLUTION': !secureFeatures.creation
|
|
687
|
+
? 'Enable features={{ creation: true }} in DataTable props'
|
|
688
|
+
: !onCreateRow
|
|
689
|
+
? 'Provide onCreateRow handler in DataTable props'
|
|
690
|
+
: 'All conditions met - button should be visible'
|
|
691
|
+
});
|
|
692
|
+
}
|
|
651
693
|
|
|
652
694
|
// MANDATORY: Process actions with RBAC checks
|
|
653
695
|
const effectiveActions = useMemo(() => {
|
|
@@ -659,15 +701,24 @@ function DataTableInternal<TData extends DataRecord>({
|
|
|
659
701
|
originalActions: actions.length,
|
|
660
702
|
secureFeatures: {
|
|
661
703
|
editing: secureFeatures.editing,
|
|
662
|
-
deletion: secureFeatures.deletion
|
|
704
|
+
deletion: secureFeatures.deletion,
|
|
705
|
+
creation: secureFeatures.creation,
|
|
706
|
+
import: secureFeatures.import,
|
|
707
|
+
export: secureFeatures.export
|
|
663
708
|
},
|
|
664
709
|
secureHandlers: {
|
|
665
710
|
onEditRow: !!secureHandlers.onEditRow,
|
|
666
|
-
onDeleteRow: !!secureHandlers.onDeleteRow
|
|
711
|
+
onDeleteRow: !!secureHandlers.onDeleteRow,
|
|
712
|
+
onCreateRow: !!secureHandlers.onCreateRow,
|
|
713
|
+
onImport: !!secureHandlers.onImport,
|
|
714
|
+
onExport: !!secureHandlers.onExport
|
|
667
715
|
},
|
|
668
716
|
permissions: {
|
|
669
717
|
canUpdate: permissions.canUpdate.can,
|
|
670
|
-
canDelete: permissions.canDelete.can
|
|
718
|
+
canDelete: permissions.canDelete.can,
|
|
719
|
+
canCreate: permissions.canCreate.can,
|
|
720
|
+
canImport: permissions.canImport.can,
|
|
721
|
+
canExport: permissions.canExport.can
|
|
671
722
|
}
|
|
672
723
|
});
|
|
673
724
|
|
|
@@ -148,7 +148,13 @@ function SelectEditField<TData extends DataRecord>({
|
|
|
148
148
|
|
|
149
149
|
// Monitor search input value via DOM events to detect when user types
|
|
150
150
|
React.useEffect(() => {
|
|
151
|
-
if (!isOpen || !isSearchable || !isCreatable)
|
|
151
|
+
if (!isOpen || !isSearchable || !isCreatable || !columnDef.onCreateNew) {
|
|
152
|
+
// Reset showCreateOption when conditions aren't met
|
|
153
|
+
if (!isOpen || !isCreatable || !columnDef.onCreateNew) {
|
|
154
|
+
setShowCreateOption(false);
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
152
158
|
|
|
153
159
|
// Function to find and attach listener to search input
|
|
154
160
|
const findAndAttachSearchInput = (): (() => void) | null => {
|
|
@@ -206,7 +212,22 @@ function SelectEditField<TData extends DataRecord>({
|
|
|
206
212
|
};
|
|
207
213
|
|
|
208
214
|
const hasMatch = (columnDef.fieldOptions || []).some(checkMatch);
|
|
209
|
-
|
|
215
|
+
const shouldShow = !hasMatch && isCreatable && !!columnDef.onCreateNew;
|
|
216
|
+
|
|
217
|
+
// Debug logging for creatable select
|
|
218
|
+
if (import.meta.env.MODE === 'development' && isCreatable) {
|
|
219
|
+
logger.debug('[SelectEditField] Creatable select check:', {
|
|
220
|
+
searchTerm: currentSearch,
|
|
221
|
+
searchLower,
|
|
222
|
+
hasMatch,
|
|
223
|
+
isCreatable,
|
|
224
|
+
hasOnCreateNew: !!columnDef.onCreateNew,
|
|
225
|
+
shouldShow,
|
|
226
|
+
fieldOptionsCount: columnDef.fieldOptions?.length || 0
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
setShowCreateOption(shouldShow);
|
|
210
231
|
} else {
|
|
211
232
|
setShowCreateOption(false);
|
|
212
233
|
}
|
|
@@ -238,7 +259,8 @@ function SelectEditField<TData extends DataRecord>({
|
|
|
238
259
|
};
|
|
239
260
|
|
|
240
261
|
const hasMatch = (columnDef.fieldOptions || []).some(checkMatch);
|
|
241
|
-
|
|
262
|
+
const shouldShow = !hasMatch && isCreatable && !!columnDef.onCreateNew;
|
|
263
|
+
setShowCreateOption(shouldShow);
|
|
242
264
|
} else {
|
|
243
265
|
setShowCreateOption(false);
|
|
244
266
|
}
|
|
@@ -268,7 +290,7 @@ function SelectEditField<TData extends DataRecord>({
|
|
|
268
290
|
}
|
|
269
291
|
|
|
270
292
|
return cleanup;
|
|
271
|
-
}, [isOpen, isSearchable, isCreatable, columnDef.fieldOptions]);
|
|
293
|
+
}, [isOpen, isSearchable, isCreatable, columnDef.fieldOptions, columnDef.onCreateNew]);
|
|
272
294
|
|
|
273
295
|
const handleCreateNew = React.useCallback(async () => {
|
|
274
296
|
if (!isCreatable || !columnDef.onCreateNew || !searchTerm.trim()) return;
|
|
@@ -344,7 +366,7 @@ function SelectEditField<TData extends DataRecord>({
|
|
|
344
366
|
|
|
345
367
|
return null;
|
|
346
368
|
})}
|
|
347
|
-
{showCreateOption && isCreatable && searchTerm.trim() && (
|
|
369
|
+
{showCreateOption && isCreatable && searchTerm.trim() && columnDef.onCreateNew && (
|
|
348
370
|
<SelectItem
|
|
349
371
|
key="__create_new__"
|
|
350
372
|
value={`__create_new__${searchTerm}`}
|