@jmruthers/pace-core 0.5.185 → 0.5.186
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/{PublicPageProvider-BABf6JCh.d.ts → PublicPageProvider-DIzEzwKl.d.ts} +4 -2
- package/dist/{chunk-STTZQK2I.js → chunk-DAGICKHT.js} +7 -5
- package/dist/chunk-DAGICKHT.js.map +1 -0
- package/dist/{chunk-AISXLWGZ.js → chunk-GRIQLQ52.js} +2 -2
- package/dist/{chunk-HC67NW5K.js → chunk-HDCUMOOI.js} +125 -47
- package/dist/chunk-HDCUMOOI.js.map +1 -0
- package/dist/{chunk-OKI34GZD.js → chunk-OALXJH4Y.js} +2 -2
- package/dist/{chunk-MX3EIJGQ.js → chunk-TC7D3CR3.js} +86 -7
- package/dist/chunk-TC7D3CR3.js.map +1 -0
- package/dist/{chunk-IXSNYUCT.js → chunk-UQWSHFVX.js} +1 -1
- package/dist/chunk-UQWSHFVX.js.map +1 -0
- package/dist/components.d.ts +2 -2
- package/dist/components.js +3 -3
- package/dist/{database.generated-CBmg2950.d.ts → database.generated-DI89OQeI.d.ts} +63 -9
- package/dist/{file-reference-BjR39ktt.d.ts → file-reference-PRTSLxKx.d.ts} +3 -0
- package/dist/hooks.d.ts +49 -5
- package/dist/hooks.js +6 -4
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/rbac/index.d.ts +1 -1
- package/dist/rbac/index.js +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-CvnC3d-e.d.ts → usePublicRouteParams-D71QLlg4.d.ts} +2 -2
- package/dist/utils.d.ts +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/Logger.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/RBACAuditManager.md +2 -2
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +5 -5
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.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/ComplianceResult.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/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.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/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.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 +33 -9
- package/docs/api/interfaces/FileUploadProps.md +36 -14
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.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/LoggerConfig.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/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
- 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/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.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/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.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/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +1 -1
- package/docs/api/interfaces/TextareaProps.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/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.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 +2 -2
- 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/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.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 +17 -17
- package/docs/api-reference/components.md +26 -12
- package/docs/implementation-guides/file-reference-system.md +24 -2
- package/docs/implementation-guides/file-upload-storage.md +9 -1
- package/package.json +1 -1
- package/scripts/check-pace-core-compliance.js +512 -0
- package/src/components/FileUpload/FileUpload.test.tsx +2 -0
- package/src/components/FileUpload/FileUpload.tsx +7 -1
- package/src/components/Header/Header.tsx +2 -5
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +134 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFileReference.test.ts +1 -0
- package/src/hooks/usePreventTabReload.ts +106 -0
- package/src/hooks/useSecureDataAccess.ts +2 -2
- package/src/rbac/__tests__/rbac-role-isolation.test.ts +456 -0
- package/src/styles/core.css +5 -5
- package/src/types/database.generated.ts +63 -9
- package/src/types/file-reference.ts +3 -0
- package/src/utils/file-reference/__tests__/file-reference.test.ts +58 -4
- package/src/utils/file-reference/index.ts +12 -2
- package/src/utils/security/secureDataAccess.ts +1 -1
- package/src/utils/storage/helpers.ts +68 -0
- package/dist/chunk-HC67NW5K.js.map +0 -1
- package/dist/chunk-IXSNYUCT.js.map +0 -1
- package/dist/chunk-MX3EIJGQ.js.map +0 -1
- package/dist/chunk-STTZQK2I.js.map +0 -1
- /package/dist/{chunk-AISXLWGZ.js.map → chunk-GRIQLQ52.js.map} +0 -0
- /package/dist/{chunk-OKI34GZD.js.map → chunk-OALXJH4Y.js.map} +0 -0
|
@@ -1829,37 +1829,51 @@ A comprehensive file upload component with drag-and-drop support, validation, an
|
|
|
1829
1829
|
```typescript
|
|
1830
1830
|
interface FileUploadProps {
|
|
1831
1831
|
supabase: SupabaseClient;
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1832
|
+
table_name: string;
|
|
1833
|
+
record_id: string;
|
|
1834
|
+
organisation_id: string;
|
|
1835
|
+
app_id?: string; // Optional - will be resolved from app name if not provided
|
|
1836
|
+
category: FileCategory; // File category for metadata (stored in file_metadata JSONB field)
|
|
1837
|
+
folder: string; // Folder name in storage bucket (e.g., 'profile_photos', 'documents')
|
|
1838
|
+
pageContext: string; // The page context where the file upload occurs (e.g., 'configuration', 'forms', 'applications')
|
|
1836
1839
|
accept?: string;
|
|
1837
1840
|
maxSize?: number;
|
|
1838
1841
|
multiple?: boolean;
|
|
1839
1842
|
disabled?: boolean;
|
|
1843
|
+
isPublic?: boolean; // Whether files should be uploaded to public-files bucket
|
|
1840
1844
|
className?: string;
|
|
1845
|
+
showPreview?: boolean; // Show image preview for accepted files
|
|
1846
|
+
showProgress?: boolean; // Show upload progress bar
|
|
1847
|
+
onUploadSuccess?: (result: FileUploadResult) => void;
|
|
1848
|
+
onUploadError?: (error: string, file?: File) => void;
|
|
1849
|
+
onProgress?: (progress: UploadProgress) => void;
|
|
1841
1850
|
children?: React.ReactNode;
|
|
1842
1851
|
}
|
|
1843
1852
|
```
|
|
1844
1853
|
|
|
1854
|
+
**Note:** The `category` prop is used for metadata purposes (stored in the `file_metadata` JSONB field), while the `folder` prop determines the actual storage path: `{orgId}/{folder}/{timestamp-uuid-filename}`. You can use the same value for both (e.g., `category={FileCategory.PROFILE_PHOTOS}` and `folder="profile_photos"`), or use different values if needed.
|
|
1855
|
+
|
|
1845
1856
|
#### Usage
|
|
1846
1857
|
|
|
1847
1858
|
```tsx
|
|
1848
|
-
import { FileUpload, FileCategory
|
|
1859
|
+
import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
1849
1860
|
|
|
1850
1861
|
function MyFileUpload() {
|
|
1851
|
-
const handleUpload = (fileRef: FileReference) => {
|
|
1852
|
-
logger.debug('FileUpload', 'File uploaded:', { fileId: fileRef.id, fileName: fileRef.name });
|
|
1853
|
-
};
|
|
1854
|
-
|
|
1855
1862
|
return (
|
|
1856
1863
|
<FileUpload
|
|
1857
1864
|
supabase={supabase}
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1865
|
+
table_name="pace_person"
|
|
1866
|
+
record_id={personId}
|
|
1867
|
+
organisation_id={organisationId}
|
|
1868
|
+
category={FileCategory.PROFILE_PHOTOS}
|
|
1869
|
+
folder="profile_photos"
|
|
1870
|
+
pageContext="configuration"
|
|
1861
1871
|
accept="image/*"
|
|
1862
1872
|
maxSize={2 * 1024 * 1024} // 2MB
|
|
1873
|
+
onUploadSuccess={(result) => {
|
|
1874
|
+
console.log('Uploaded:', result.file_reference);
|
|
1875
|
+
console.log('URL:', result.file_url);
|
|
1876
|
+
}}
|
|
1863
1877
|
>
|
|
1864
1878
|
<div className="border-2 border-dashed border-main-300 rounded-lg p-8 text-center">
|
|
1865
1879
|
<p>Drag and drop files here or click to browse</p>
|
|
@@ -45,14 +45,16 @@ CREATE TABLE file_references (
|
|
|
45
45
|
|
|
46
46
|
**Organisation-First Structure:**
|
|
47
47
|
```
|
|
48
|
-
{bucket}/{orgId}/{
|
|
48
|
+
{bucket}/{orgId}/{folder}/{timestamp-uuid-filename}
|
|
49
49
|
|
|
50
50
|
Examples:
|
|
51
51
|
- files/org-123/profile_photos/timestamp-uuid-photo.jpg (private)
|
|
52
|
-
- files/org-123/
|
|
52
|
+
- files/org-123/documents/timestamp-uuid-passport.pdf (private)
|
|
53
53
|
- public-files/org-123/event_logos/timestamp-uuid-logo.png (public)
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
**Note:** The `folder` prop determines the storage path, while `category` is stored in the `file_metadata` JSONB field for filtering and metadata purposes. You can use the same value for both (e.g., `category={FileCategory.PROFILE_PHOTOS}` and `folder="profile_photos"`), or use different values if needed.
|
|
57
|
+
|
|
56
58
|
### Bucket Selection
|
|
57
59
|
|
|
58
60
|
The system uses two Supabase storage buckets:
|
|
@@ -77,7 +79,10 @@ await service.createFileReference({
|
|
|
77
79
|
table_name: 'pace_person',
|
|
78
80
|
record_id: personId,
|
|
79
81
|
organisation_id: orgId,
|
|
82
|
+
app_id: 'your-app-id',
|
|
80
83
|
category: FileCategory.PROFILE_PHOTOS,
|
|
84
|
+
folder: 'profile_photos',
|
|
85
|
+
pageContext: 'configuration',
|
|
81
86
|
is_public: false // Uses 'files' bucket
|
|
82
87
|
}, file);
|
|
83
88
|
|
|
@@ -86,7 +91,10 @@ await service.createFileReference({
|
|
|
86
91
|
table_name: 'event',
|
|
87
92
|
record_id: eventId,
|
|
88
93
|
organisation_id: orgId,
|
|
94
|
+
app_id: 'your-app-id',
|
|
89
95
|
category: FileCategory.EVENT_LOGOS,
|
|
96
|
+
folder: 'event_logos',
|
|
97
|
+
pageContext: 'configuration',
|
|
90
98
|
is_public: true // Uses 'public-files' bucket
|
|
91
99
|
}, file);
|
|
92
100
|
```
|
|
@@ -136,6 +144,8 @@ import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
|
136
144
|
organisation_id={orgId}
|
|
137
145
|
app_id="your-app-id" // Optional - auto-resolved from app name if not provided
|
|
138
146
|
category={FileCategory.PROFILE_PHOTOS}
|
|
147
|
+
folder="profile_photos"
|
|
148
|
+
pageContext="configuration"
|
|
139
149
|
accept="image/*"
|
|
140
150
|
maxSize={5 * 1024 * 1024}
|
|
141
151
|
onUploadSuccess={(result) => {
|
|
@@ -157,6 +167,8 @@ import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
|
157
167
|
organisation_id={orgId}
|
|
158
168
|
// app_id omitted - will be auto-resolved from app name
|
|
159
169
|
category={FileCategory.PROFILE_PHOTOS}
|
|
170
|
+
folder="profile_photos"
|
|
171
|
+
pageContext="configuration"
|
|
160
172
|
accept="image/*"
|
|
161
173
|
maxSize={5 * 1024 * 1024}
|
|
162
174
|
showProgress={true}
|
|
@@ -191,6 +203,8 @@ import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
|
191
203
|
organisation_id={orgId}
|
|
192
204
|
app_id="your-app-id"
|
|
193
205
|
category={FileCategory.EVENT_LOGOS}
|
|
206
|
+
folder="event_logos"
|
|
207
|
+
pageContext="configuration"
|
|
194
208
|
accept="image/*"
|
|
195
209
|
isPublic={true} // Uploads to public-files bucket
|
|
196
210
|
showPreview={true}
|
|
@@ -210,6 +224,8 @@ import { FileUpload, FileCategory } from '@jmruthers/pace-core';
|
|
|
210
224
|
organisation_id={orgId}
|
|
211
225
|
app_id="your-app-id"
|
|
212
226
|
category={FileCategory.PROFILE_PHOTOS}
|
|
227
|
+
folder="profile_photos"
|
|
228
|
+
pageContext="configuration"
|
|
213
229
|
>
|
|
214
230
|
<div className="custom-upload-ui">
|
|
215
231
|
<p>Click to upload profile photo</p>
|
|
@@ -237,6 +253,8 @@ import { FileDisplay, FileCategory } from '@jmruthers/pace-core';
|
|
|
237
253
|
organisation_id={orgId}
|
|
238
254
|
app_id="your-app-id"
|
|
239
255
|
category={FileCategory.PROFILE_PHOTOS}
|
|
256
|
+
folder="profile_photos"
|
|
257
|
+
pageContext="configuration"
|
|
240
258
|
/>
|
|
241
259
|
</FileDisplay>
|
|
242
260
|
```
|
|
@@ -331,6 +349,8 @@ const result = await uploadFile({
|
|
|
331
349
|
organisation_id: orgId,
|
|
332
350
|
app_id: 'your-app-id',
|
|
333
351
|
category: FileCategory.PROFILE_PHOTOS,
|
|
352
|
+
folder: 'profile_photos',
|
|
353
|
+
pageContext: 'configuration',
|
|
334
354
|
is_public: false // Uses 'files' bucket
|
|
335
355
|
}, file);
|
|
336
356
|
|
|
@@ -341,6 +361,8 @@ const publicResult = await uploadFile({
|
|
|
341
361
|
organisation_id: orgId,
|
|
342
362
|
app_id: 'your-app-id',
|
|
343
363
|
category: FileCategory.EVENT_LOGOS,
|
|
364
|
+
folder: 'event_logos',
|
|
365
|
+
pageContext: 'configuration',
|
|
344
366
|
is_public: true // Uses 'public-files' bucket
|
|
345
367
|
}, logoFile);
|
|
346
368
|
|
|
@@ -48,6 +48,7 @@ function MyFileUpload() {
|
|
|
48
48
|
organisation_id="org-123"
|
|
49
49
|
// app_id auto-resolved from app name
|
|
50
50
|
category={FileCategory.GENERAL_DOCUMENTS}
|
|
51
|
+
folder="documents"
|
|
51
52
|
pageContext="configuration"
|
|
52
53
|
accept=".pdf,.doc,.docx"
|
|
53
54
|
maxSize={5 * 1024 * 1024} // 5MB
|
|
@@ -103,6 +104,8 @@ function UserProfile({ userId }: { userId: string }) {
|
|
|
103
104
|
record_id={userId}
|
|
104
105
|
organisation_id="org-123"
|
|
105
106
|
category={FileCategory.GENERAL_DOCUMENTS}
|
|
107
|
+
folder="documents"
|
|
108
|
+
pageContext="configuration"
|
|
106
109
|
accept=".pdf,.doc,.docx"
|
|
107
110
|
maxSize={10 * 1024 * 1024}
|
|
108
111
|
/>
|
|
@@ -127,7 +130,8 @@ interface FileUploadProps {
|
|
|
127
130
|
record_id: string;
|
|
128
131
|
organisation_id: string;
|
|
129
132
|
app_id?: string; // Optional - will be resolved from app name if not provided
|
|
130
|
-
category: FileCategory;
|
|
133
|
+
category: FileCategory; // File category for metadata (stored in file_metadata JSONB field)
|
|
134
|
+
folder: string; // Folder name in storage bucket (e.g., 'profile_photos', 'documents')
|
|
131
135
|
pageContext: string; // The page context where the file upload occurs (e.g., 'configuration', 'forms', 'applications')
|
|
132
136
|
accept?: string;
|
|
133
137
|
maxSize?: number;
|
|
@@ -144,6 +148,8 @@ interface FileUploadProps {
|
|
|
144
148
|
}
|
|
145
149
|
```
|
|
146
150
|
|
|
151
|
+
**Note:** The `category` prop is used for metadata purposes (stored in the `file_metadata` JSONB field), while the `folder` prop determines the actual storage path: `{orgId}/{folder}/{timestamp-uuid-filename}`. You can use the same value for both (e.g., `category={FileCategory.PROFILE_PHOTOS}` and `folder="profile_photos"`), or use different values if needed.
|
|
152
|
+
|
|
147
153
|
#### Usage Examples
|
|
148
154
|
|
|
149
155
|
**Basic Upload:**
|
|
@@ -154,6 +160,7 @@ interface FileUploadProps {
|
|
|
154
160
|
record_id="person-123"
|
|
155
161
|
organisation_id={organisationId}
|
|
156
162
|
category={FileCategory.PROFILE_PHOTOS}
|
|
163
|
+
folder="profile_photos"
|
|
157
164
|
pageContext="configuration"
|
|
158
165
|
accept="image/*"
|
|
159
166
|
maxSize={2 * 1024 * 1024} // 2MB
|
|
@@ -171,6 +178,7 @@ interface FileUploadProps {
|
|
|
171
178
|
record_id="person-123"
|
|
172
179
|
organisation_id={organisationId}
|
|
173
180
|
category={FileCategory.GENERAL_DOCUMENTS}
|
|
181
|
+
folder="documents"
|
|
174
182
|
pageContext="forms"
|
|
175
183
|
multiple={true}
|
|
176
184
|
accept=".pdf,.doc,.docx"
|