@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.
Files changed (205) hide show
  1. package/dist/{PublicPageProvider-BABf6JCh.d.ts → PublicPageProvider-DIzEzwKl.d.ts} +4 -2
  2. package/dist/{chunk-STTZQK2I.js → chunk-DAGICKHT.js} +7 -5
  3. package/dist/chunk-DAGICKHT.js.map +1 -0
  4. package/dist/{chunk-AISXLWGZ.js → chunk-GRIQLQ52.js} +2 -2
  5. package/dist/{chunk-HC67NW5K.js → chunk-HDCUMOOI.js} +125 -47
  6. package/dist/chunk-HDCUMOOI.js.map +1 -0
  7. package/dist/{chunk-OKI34GZD.js → chunk-OALXJH4Y.js} +2 -2
  8. package/dist/{chunk-MX3EIJGQ.js → chunk-TC7D3CR3.js} +86 -7
  9. package/dist/chunk-TC7D3CR3.js.map +1 -0
  10. package/dist/{chunk-IXSNYUCT.js → chunk-UQWSHFVX.js} +1 -1
  11. package/dist/chunk-UQWSHFVX.js.map +1 -0
  12. package/dist/components.d.ts +2 -2
  13. package/dist/components.js +3 -3
  14. package/dist/{database.generated-CBmg2950.d.ts → database.generated-DI89OQeI.d.ts} +63 -9
  15. package/dist/{file-reference-BjR39ktt.d.ts → file-reference-PRTSLxKx.d.ts} +3 -0
  16. package/dist/hooks.d.ts +49 -5
  17. package/dist/hooks.js +6 -4
  18. package/dist/hooks.js.map +1 -1
  19. package/dist/index.d.ts +5 -5
  20. package/dist/index.js +9 -8
  21. package/dist/index.js.map +1 -1
  22. package/dist/rbac/index.d.ts +1 -1
  23. package/dist/rbac/index.js +2 -2
  24. package/dist/types.d.ts +2 -2
  25. package/dist/types.js +1 -1
  26. package/dist/{usePublicRouteParams-CvnC3d-e.d.ts → usePublicRouteParams-D71QLlg4.d.ts} +2 -2
  27. package/dist/utils.d.ts +1 -1
  28. package/docs/api/classes/ColumnFactory.md +1 -1
  29. package/docs/api/classes/ErrorBoundary.md +1 -1
  30. package/docs/api/classes/InvalidScopeError.md +1 -1
  31. package/docs/api/classes/Logger.md +1 -1
  32. package/docs/api/classes/MissingUserContextError.md +1 -1
  33. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  34. package/docs/api/classes/PermissionDeniedError.md +1 -1
  35. package/docs/api/classes/RBACAuditManager.md +2 -2
  36. package/docs/api/classes/RBACCache.md +1 -1
  37. package/docs/api/classes/RBACEngine.md +2 -2
  38. package/docs/api/classes/RBACError.md +1 -1
  39. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  40. package/docs/api/classes/SecureSupabaseClient.md +5 -5
  41. package/docs/api/classes/StorageUtils.md +1 -1
  42. package/docs/api/enums/FileCategory.md +1 -1
  43. package/docs/api/enums/LogLevel.md +1 -1
  44. package/docs/api/enums/RBACErrorCode.md +1 -1
  45. package/docs/api/enums/RPCFunction.md +1 -1
  46. package/docs/api/interfaces/AggregateConfig.md +1 -1
  47. package/docs/api/interfaces/BadgeProps.md +1 -1
  48. package/docs/api/interfaces/ButtonProps.md +1 -1
  49. package/docs/api/interfaces/CalendarProps.md +1 -1
  50. package/docs/api/interfaces/CardProps.md +1 -1
  51. package/docs/api/interfaces/ColorPalette.md +1 -1
  52. package/docs/api/interfaces/ColorShade.md +1 -1
  53. package/docs/api/interfaces/ComplianceResult.md +1 -1
  54. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  55. package/docs/api/interfaces/DataRecord.md +1 -1
  56. package/docs/api/interfaces/DataTableAction.md +1 -1
  57. package/docs/api/interfaces/DataTableColumn.md +1 -1
  58. package/docs/api/interfaces/DataTableProps.md +1 -1
  59. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  60. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  61. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  62. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  63. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  64. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  65. package/docs/api/interfaces/ExportColumn.md +1 -1
  66. package/docs/api/interfaces/ExportOptions.md +1 -1
  67. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  68. package/docs/api/interfaces/FileMetadata.md +1 -1
  69. package/docs/api/interfaces/FileReference.md +1 -1
  70. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  71. package/docs/api/interfaces/FileUploadOptions.md +33 -9
  72. package/docs/api/interfaces/FileUploadProps.md +36 -14
  73. package/docs/api/interfaces/FooterProps.md +1 -1
  74. package/docs/api/interfaces/FormFieldProps.md +1 -1
  75. package/docs/api/interfaces/FormProps.md +1 -1
  76. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  77. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  78. package/docs/api/interfaces/InputProps.md +1 -1
  79. package/docs/api/interfaces/LabelProps.md +1 -1
  80. package/docs/api/interfaces/LoggerConfig.md +1 -1
  81. package/docs/api/interfaces/LoginFormProps.md +1 -1
  82. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  83. package/docs/api/interfaces/NavigationContextType.md +1 -1
  84. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  85. package/docs/api/interfaces/NavigationItem.md +1 -1
  86. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  87. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  88. package/docs/api/interfaces/Organisation.md +1 -1
  89. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  90. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  91. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  92. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  93. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  94. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  95. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  96. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  97. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  98. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  99. package/docs/api/interfaces/PaletteData.md +1 -1
  100. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  101. package/docs/api/interfaces/ProgressProps.md +1 -1
  102. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  103. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  104. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  105. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  106. package/docs/api/interfaces/QuickFix.md +1 -1
  107. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  108. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  109. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  110. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  111. package/docs/api/interfaces/RBACConfig.md +2 -2
  112. package/docs/api/interfaces/RBACContext.md +1 -1
  113. package/docs/api/interfaces/RBACLogger.md +1 -1
  114. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  115. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  116. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  117. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  118. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  119. package/docs/api/interfaces/RBACResult.md +1 -1
  120. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  121. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  122. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  123. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  124. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  125. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  126. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  127. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  128. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  129. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  130. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  131. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  132. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  133. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  134. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  135. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  136. package/docs/api/interfaces/RouteConfig.md +1 -1
  137. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  138. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  139. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  140. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  141. package/docs/api/interfaces/SetupIssue.md +1 -1
  142. package/docs/api/interfaces/StorageConfig.md +1 -1
  143. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  144. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  145. package/docs/api/interfaces/StorageListOptions.md +1 -1
  146. package/docs/api/interfaces/StorageListResult.md +1 -1
  147. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  148. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  149. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  150. package/docs/api/interfaces/StyleImport.md +1 -1
  151. package/docs/api/interfaces/SwitchProps.md +1 -1
  152. package/docs/api/interfaces/TabsContentProps.md +1 -1
  153. package/docs/api/interfaces/TabsListProps.md +1 -1
  154. package/docs/api/interfaces/TabsProps.md +1 -1
  155. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  156. package/docs/api/interfaces/TextareaProps.md +1 -1
  157. package/docs/api/interfaces/ToastActionElement.md +1 -1
  158. package/docs/api/interfaces/ToastProps.md +1 -1
  159. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  160. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  161. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  162. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  163. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  164. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  165. package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
  166. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  167. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  168. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  169. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  170. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  171. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  172. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  173. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  174. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  175. package/docs/api/interfaces/UserEventAccess.md +1 -1
  176. package/docs/api/interfaces/UserMenuProps.md +1 -1
  177. package/docs/api/interfaces/UserProfile.md +1 -1
  178. package/docs/api/modules.md +17 -17
  179. package/docs/api-reference/components.md +26 -12
  180. package/docs/implementation-guides/file-reference-system.md +24 -2
  181. package/docs/implementation-guides/file-upload-storage.md +9 -1
  182. package/package.json +1 -1
  183. package/scripts/check-pace-core-compliance.js +512 -0
  184. package/src/components/FileUpload/FileUpload.test.tsx +2 -0
  185. package/src/components/FileUpload/FileUpload.tsx +7 -1
  186. package/src/components/Header/Header.tsx +2 -5
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +134 -1
  188. package/src/hooks/index.ts +3 -0
  189. package/src/hooks/useFileReference.test.ts +1 -0
  190. package/src/hooks/usePreventTabReload.ts +106 -0
  191. package/src/hooks/useSecureDataAccess.ts +2 -2
  192. package/src/rbac/__tests__/rbac-role-isolation.test.ts +456 -0
  193. package/src/styles/core.css +5 -5
  194. package/src/types/database.generated.ts +63 -9
  195. package/src/types/file-reference.ts +3 -0
  196. package/src/utils/file-reference/__tests__/file-reference.test.ts +58 -4
  197. package/src/utils/file-reference/index.ts +12 -2
  198. package/src/utils/security/secureDataAccess.ts +1 -1
  199. package/src/utils/storage/helpers.ts +68 -0
  200. package/dist/chunk-HC67NW5K.js.map +0 -1
  201. package/dist/chunk-IXSNYUCT.js.map +0 -1
  202. package/dist/chunk-MX3EIJGQ.js.map +0 -1
  203. package/dist/chunk-STTZQK2I.js.map +0 -1
  204. /package/dist/{chunk-AISXLWGZ.js.map → chunk-GRIQLQ52.js.map} +0 -0
  205. /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
- appName: string;
1833
- orgId: string;
1834
- onUploadComplete?: (fileRef: FileReference) => void;
1835
- onUploadStart?: (file: File) => void;
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, logger } from '@jmruthers/pace-core';
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
- appName="my-app"
1859
- orgId={organisationId}
1860
- onUploadComplete={handleUpload}
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}/{category}/{filename}
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/id_documents/timestamp-uuid-passport.pdf (private)
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"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.5.185",
3
+ "version": "0.5.186",
4
4
  "description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
5
5
  "private": false,
6
6
  "publishConfig": {