@rebasepro/core 0.0.1-canary.0

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 (570) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/app/AppBar.d.ts +12 -0
  4. package/dist/app/Drawer.d.ts +19 -0
  5. package/dist/app/Scaffold.d.ts +34 -0
  6. package/dist/app/index.d.ts +4 -0
  7. package/dist/app/useApp.d.ts +17 -0
  8. package/dist/components/AIIcon.d.ts +16 -0
  9. package/dist/components/AdminModeSyncer.d.ts +17 -0
  10. package/dist/components/ArrayContainer.d.ts +59 -0
  11. package/dist/components/CircularProgressCenter.d.ts +11 -0
  12. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  13. package/dist/components/ConfirmationDialog.d.ts +9 -0
  14. package/dist/components/Debug/UIReferenceView.d.ts +1 -0
  15. package/dist/components/Debug/UIStyleGuide.d.ts +1 -0
  16. package/dist/components/DeleteEntityDialog.d.ts +12 -0
  17. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +37 -0
  18. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +27 -0
  19. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +128 -0
  20. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +25 -0
  21. package/dist/components/EntityCollectionTable/column_utils.d.ts +15 -0
  22. package/dist/components/EntityCollectionTable/fields/TableMultipleRelationField.d.ts +20 -0
  23. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +21 -0
  24. package/dist/components/EntityCollectionTable/fields/TableRelationField.d.ts +21 -0
  25. package/dist/components/EntityCollectionTable/fields/TableRelationSelectorField.d.ts +20 -0
  26. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +32 -0
  27. package/dist/components/EntityCollectionTable/index.d.ts +6 -0
  28. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +16 -0
  29. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +32 -0
  30. package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +9 -0
  31. package/dist/components/EntityCollectionTable/internal/common.d.ts +4 -0
  32. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +26 -0
  33. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +13 -0
  34. package/dist/components/EntityCollectionTable/internal/popup_field/useWindowSize.d.ts +6 -0
  35. package/dist/components/EntityCollectionView/Board.d.ts +2 -0
  36. package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
  37. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
  38. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
  39. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +26 -0
  40. package/dist/components/EntityCollectionView/EntityCard.d.ts +19 -0
  41. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +20 -0
  42. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +31 -0
  43. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +54 -0
  44. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +14 -0
  45. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +15 -0
  46. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +14 -0
  47. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
  48. package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
  49. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +60 -0
  50. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  51. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  52. package/dist/components/EntityJsonPreview.d.ts +3 -0
  53. package/dist/components/EntityPreview.d.ts +54 -0
  54. package/dist/components/EntityView.d.ts +11 -0
  55. package/dist/components/ErrorBoundary.d.ts +11 -0
  56. package/dist/components/ErrorTooltip.d.ts +2 -0
  57. package/dist/components/ErrorView.d.ts +21 -0
  58. package/dist/components/FieldCaption.d.ts +5 -0
  59. package/dist/components/HomePage/ContentHomePage.d.ts +11 -0
  60. package/dist/components/HomePage/FavouritesView.d.ts +3 -0
  61. package/dist/components/HomePage/HomePageDnD.d.ts +77 -0
  62. package/dist/components/HomePage/NavigationCard.d.ts +10 -0
  63. package/dist/components/HomePage/NavigationCardBinding.d.ts +18 -0
  64. package/dist/components/HomePage/NavigationGroup.d.ts +11 -0
  65. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  66. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  67. package/dist/components/HomePage/StudioHomePage.d.ts +9 -0
  68. package/dist/components/HomePage/index.d.ts +5 -0
  69. package/dist/components/NotFoundPage.d.ts +1 -0
  70. package/dist/components/PropertyCollectionView.d.ts +22 -0
  71. package/dist/components/PropertyConfigBadge.d.ts +6 -0
  72. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  73. package/dist/components/RebaseLogo.d.ts +7 -0
  74. package/dist/components/ReferenceTable/EntitySelectionTable.d.ts +58 -0
  75. package/dist/components/ReferenceWidget.d.ts +29 -0
  76. package/dist/components/RelationSelector.d.ts +32 -0
  77. package/dist/components/SearchIconsView.d.ts +5 -0
  78. package/dist/components/SelectableTable/SelectableTable.d.ts +89 -0
  79. package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
  80. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -0
  81. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +12 -0
  82. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +15 -0
  83. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +12 -0
  84. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +13 -0
  85. package/dist/components/UnsavedChangesDialog.d.ts +9 -0
  86. package/dist/components/UserDisplay.d.ts +7 -0
  87. package/dist/components/UserSettingsView.d.ts +1 -0
  88. package/dist/components/VirtualTable/VirtualTable.d.ts +11 -0
  89. package/dist/components/VirtualTable/VirtualTableCell.d.ts +20 -0
  90. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
  91. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  92. package/dist/components/VirtualTable/VirtualTableProps.d.ts +239 -0
  93. package/dist/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  94. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +12 -0
  95. package/dist/components/VirtualTable/fields/VirtualTableInput.d.ts +9 -0
  96. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.d.ts +8 -0
  97. package/dist/components/VirtualTable/fields/VirtualTableSelect.d.ts +15 -0
  98. package/dist/components/VirtualTable/fields/VirtualTableSwitch.d.ts +7 -0
  99. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  100. package/dist/components/VirtualTable/index.d.ts +3 -0
  101. package/dist/components/VirtualTable/types.d.ts +37 -0
  102. package/dist/components/admin/RoleChip.d.ts +4 -0
  103. package/dist/components/admin/RolesView.d.ts +4 -0
  104. package/dist/components/admin/UsersView.d.ts +4 -0
  105. package/dist/components/admin/index.d.ts +3 -0
  106. package/dist/components/common/default_entity_actions.d.ts +4 -0
  107. package/dist/components/common/index.d.ts +6 -0
  108. package/dist/components/common/table_height.d.ts +5 -0
  109. package/dist/components/common/types.d.ts +58 -0
  110. package/dist/components/common/useColumnsIds.d.ts +6 -0
  111. package/dist/components/common/useDataSourceTableController.d.ts +44 -0
  112. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  113. package/dist/components/common/useDebouncedData.d.ts +9 -0
  114. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  115. package/dist/components/common/useTableSearchHelper.d.ts +11 -0
  116. package/dist/components/index.d.ts +35 -0
  117. package/dist/contexts/AdminModeController.d.ts +4 -0
  118. package/dist/contexts/AnalyticsContext.d.ts +3 -0
  119. package/dist/contexts/AuthControllerContext.d.ts +3 -0
  120. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  121. package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
  122. package/dist/contexts/DataSourceContext.d.ts +3 -0
  123. package/dist/contexts/DialogsProvider.d.ts +4 -0
  124. package/dist/contexts/EffectiveRoleController.d.ts +4 -0
  125. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  126. package/dist/contexts/ModeController.d.ts +4 -0
  127. package/dist/contexts/NavigationContext.d.ts +3 -0
  128. package/dist/contexts/SideDialogsControllerContext.d.ts +3 -0
  129. package/dist/contexts/SideEntityControllerContext.d.ts +3 -0
  130. package/dist/contexts/SnackbarProvider.d.ts +2 -0
  131. package/dist/contexts/StorageSourceContext.d.ts +3 -0
  132. package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  133. package/dist/contexts/index.d.ts +15 -0
  134. package/dist/core/DefaultAppBar.d.ts +29 -0
  135. package/dist/core/DefaultDrawer.d.ts +29 -0
  136. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  137. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  138. package/dist/core/EntityEditView.d.ts +47 -0
  139. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  140. package/dist/core/EntitySidePanel.d.ts +10 -0
  141. package/dist/core/Rebase.d.ts +13 -0
  142. package/dist/core/RebaseRouter.d.ts +4 -0
  143. package/dist/core/RebaseRoutes.d.ts +17 -0
  144. package/dist/core/SideDialogs.d.ts +25 -0
  145. package/dist/core/field_configs.d.ts +6 -0
  146. package/dist/core/index.d.ts +9 -0
  147. package/dist/form/EntityForm.d.ts +7 -0
  148. package/dist/form/EntityFormActions.d.ts +2 -0
  149. package/dist/form/PropertyFieldBinding.d.ts +30 -0
  150. package/dist/form/components/ErrorFocus.d.ts +4 -0
  151. package/dist/form/components/FieldHelperText.d.ts +12 -0
  152. package/dist/form/components/FormEntry.d.ts +6 -0
  153. package/dist/form/components/FormLayout.d.ts +5 -0
  154. package/dist/form/components/LabelWithIcon.d.ts +14 -0
  155. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  156. package/dist/form/components/LocalChangesMenu.d.ts +11 -0
  157. package/dist/form/components/StorageItemPreview.d.ts +13 -0
  158. package/dist/form/components/StorageUploadProgress.d.ts +10 -0
  159. package/dist/form/components/index.d.ts +5 -0
  160. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +9 -0
  161. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +11 -0
  162. package/dist/form/field_bindings/BlockFieldBinding.d.ts +10 -0
  163. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +11 -0
  164. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +7 -0
  165. package/dist/form/field_bindings/MapFieldBinding.d.ts +9 -0
  166. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  167. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +9 -0
  168. package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +9 -0
  169. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +10 -0
  170. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  171. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +9 -0
  172. package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -0
  173. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +10 -0
  174. package/dist/form/field_bindings/SelectFieldBinding.d.ts +10 -0
  175. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +19 -0
  176. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +9 -0
  177. package/dist/form/field_bindings/TextFieldBinding.d.ts +8 -0
  178. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  179. package/dist/form/index.d.ts +20 -0
  180. package/dist/form/useClearRestoreValue.d.ts +13 -0
  181. package/dist/form/validation.d.ts +26 -0
  182. package/dist/hooks/ApiConfigContext.d.ts +24 -0
  183. package/dist/hooks/data/delete.d.ts +33 -0
  184. package/dist/hooks/data/save.d.ts +37 -0
  185. package/dist/hooks/data/useCollectionFetch.d.ts +50 -0
  186. package/dist/hooks/data/useDataOrder.d.ts +12 -0
  187. package/dist/hooks/data/useDataSource.d.ts +6 -0
  188. package/dist/hooks/data/useEntityFetch.d.ts +29 -0
  189. package/dist/hooks/data/useRelationSelector.d.ts +45 -0
  190. package/dist/hooks/index.d.ts +41 -0
  191. package/dist/hooks/navigation/contexts/CMSUrlContext.d.ts +4 -0
  192. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +4 -0
  193. package/dist/hooks/navigation/contexts/NavigationStateContext.d.ts +4 -0
  194. package/dist/hooks/navigation/contexts/index.d.ts +3 -0
  195. package/dist/hooks/navigation/useBuildCMSUrlController.d.ts +6 -0
  196. package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +7 -0
  197. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +32 -0
  198. package/dist/hooks/navigation/useNavigationRegistry.d.ts +10 -0
  199. package/dist/hooks/navigation/useNavigationResolution.d.ts +5 -0
  200. package/dist/hooks/navigation/useNavigationURLs.d.ts +11 -0
  201. package/dist/hooks/navigation/useResolvedCollections.d.ts +26 -0
  202. package/dist/hooks/navigation/useResolvedViews.d.ts +28 -0
  203. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +26 -0
  204. package/dist/hooks/navigation/utils.d.ts +12 -0
  205. package/dist/hooks/useAdminModeController.d.ts +19 -0
  206. package/dist/hooks/useAnalyticsController.d.ts +5 -0
  207. package/dist/hooks/useAuthController.d.ts +11 -0
  208. package/dist/hooks/useBackendStorageSource.d.ts +30 -0
  209. package/dist/hooks/useBreadcrumbsController.d.ts +42 -0
  210. package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  211. package/dist/hooks/useBuildAdminModeController.d.ts +6 -0
  212. package/dist/hooks/useBuildEffectiveRoleController.d.ts +8 -0
  213. package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  214. package/dist/hooks/useBuildModeController.d.ts +6 -0
  215. package/dist/hooks/useBuildNavigationController.d.ts +16 -0
  216. package/dist/hooks/useClipboard.d.ts +57 -0
  217. package/dist/hooks/useCollapsedGroups.d.ts +12 -0
  218. package/dist/hooks/useCustomizationController.d.ts +11 -0
  219. package/dist/hooks/useDialogsController.d.ts +11 -0
  220. package/dist/hooks/useEffectiveRoleController.d.ts +7 -0
  221. package/dist/hooks/useEntitySelectionDialog.d.ts +18 -0
  222. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  223. package/dist/hooks/useLargeLayout.d.ts +1 -0
  224. package/dist/hooks/useModeController.d.ts +19 -0
  225. package/dist/hooks/usePermissions.d.ts +11 -0
  226. package/dist/hooks/useRebaseContext.d.ts +11 -0
  227. package/dist/hooks/useResolvedNavigationFrom.d.ts +72 -0
  228. package/dist/hooks/useSideDialogsController.d.ts +18 -0
  229. package/dist/hooks/useSideEntityController.d.ts +12 -0
  230. package/dist/hooks/useSnackbarController.d.ts +20 -0
  231. package/dist/hooks/useStorageSource.d.ts +6 -0
  232. package/dist/hooks/useUnsavedChangesDialog.d.ts +12 -0
  233. package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
  234. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  235. package/dist/index.d.ts +15 -0
  236. package/dist/index.es.js +34745 -0
  237. package/dist/index.es.js.map +1 -0
  238. package/dist/index.umd.js +34751 -0
  239. package/dist/index.umd.js.map +1 -0
  240. package/dist/internal/common.d.ts +3 -0
  241. package/dist/internal/useBuildDataSource.d.ts +12 -0
  242. package/dist/internal/useBuildSideDialogsController.d.ts +2 -0
  243. package/dist/internal/useBuildSideEntityController.d.ts +4 -0
  244. package/dist/internal/useRestoreScroll.d.ts +6 -0
  245. package/dist/preview/PropertyPreview.d.ts +6 -0
  246. package/dist/preview/components/ArrayEnumPreview.d.ts +10 -0
  247. package/dist/preview/components/AsyncPreviewComponent.d.ts +11 -0
  248. package/dist/preview/components/BooleanPreview.d.ts +10 -0
  249. package/dist/preview/components/DatePreview.d.ts +17 -0
  250. package/dist/preview/components/EmptyValue.d.ts +6 -0
  251. package/dist/preview/components/EnumValuesChip.d.ts +13 -0
  252. package/dist/preview/components/ImagePreview.d.ts +16 -0
  253. package/dist/preview/components/ReferencePreview.d.ts +16 -0
  254. package/dist/preview/components/RelationPreview.d.ts +16 -0
  255. package/dist/preview/components/StorageThumbnail.d.ts +15 -0
  256. package/dist/preview/components/UrlComponentPreview.d.ts +13 -0
  257. package/dist/preview/components/UserPreview.d.ts +8 -0
  258. package/dist/preview/index.d.ts +24 -0
  259. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +5 -0
  260. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +5 -0
  261. package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +5 -0
  262. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +5 -0
  263. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +5 -0
  264. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +5 -0
  265. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +5 -0
  266. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +5 -0
  267. package/dist/preview/property_previews/MapPropertyPreview.d.ts +8 -0
  268. package/dist/preview/property_previews/NumberPropertyPreview.d.ts +6 -0
  269. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +13 -0
  270. package/dist/preview/property_previews/StringPropertyPreview.d.ts +6 -0
  271. package/dist/preview/util.d.ts +6 -0
  272. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  273. package/dist/routes/RebaseRoute.d.ts +1 -0
  274. package/dist/routes/index.d.ts +2 -0
  275. package/dist/util/createFormexStub.d.ts +2 -0
  276. package/dist/util/entity_cache.d.ts +27 -0
  277. package/dist/util/enums.d.ts +5 -0
  278. package/dist/util/icon_list.d.ts +5 -0
  279. package/dist/util/icon_synonyms.d.ts +1853 -0
  280. package/dist/util/icons.d.ts +16 -0
  281. package/dist/util/index.d.ts +11 -0
  282. package/dist/util/previews.d.ts +3 -0
  283. package/dist/util/property_utils.d.ts +23 -0
  284. package/dist/util/useDebouncedCallback.d.ts +1 -0
  285. package/dist/util/useStorageUploadController.d.ts +36 -0
  286. package/dist/util/useTraceUpdate.d.ts +2 -0
  287. package/dist/vitePlugin.d.ts +16 -0
  288. package/package.json +165 -0
  289. package/src/app/AppBar.tsx +18 -0
  290. package/src/app/Drawer.tsx +30 -0
  291. package/src/app/Scaffold.tsx +238 -0
  292. package/src/app/index.ts +4 -0
  293. package/src/app/useApp.tsx +36 -0
  294. package/src/components/AIIcon.tsx +39 -0
  295. package/src/components/AdminModeSyncer.tsx +47 -0
  296. package/src/components/ArrayContainer.tsx +549 -0
  297. package/src/components/CircularProgressCenter.tsx +26 -0
  298. package/src/components/ClearFilterSortButton.tsx +44 -0
  299. package/src/components/ConfirmationDialog.tsx +46 -0
  300. package/src/components/Debug/UIReferenceView.tsx +710 -0
  301. package/src/components/Debug/UIStyleGuide.tsx +164 -0
  302. package/src/components/DeleteEntityDialog.tsx +181 -0
  303. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +225 -0
  304. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +383 -0
  305. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +180 -0
  306. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +561 -0
  307. package/src/components/EntityCollectionTable/column_utils.tsx +74 -0
  308. package/src/components/EntityCollectionTable/fields/TableMultipleRelationField.tsx +122 -0
  309. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +169 -0
  310. package/src/components/EntityCollectionTable/fields/TableRelationField.tsx +177 -0
  311. package/src/components/EntityCollectionTable/fields/TableRelationSelectorField.tsx +42 -0
  312. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +315 -0
  313. package/src/components/EntityCollectionTable/index.tsx +12 -0
  314. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +90 -0
  315. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +311 -0
  316. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +82 -0
  317. package/src/components/EntityCollectionTable/internal/common.tsx +72 -0
  318. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +425 -0
  319. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +96 -0
  320. package/src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx +20 -0
  321. package/src/components/EntityCollectionView/Board.tsx +324 -0
  322. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  323. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  324. package/src/components/EntityCollectionView/BoardSortableList.tsx +172 -0
  325. package/src/components/EntityCollectionView/EntityBoardCard.tsx +200 -0
  326. package/src/components/EntityCollectionView/EntityCard.tsx +225 -0
  327. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +746 -0
  328. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +254 -0
  329. package/src/components/EntityCollectionView/EntityCollectionView.tsx +1220 -0
  330. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +142 -0
  331. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +131 -0
  332. package/src/components/EntityCollectionView/FiltersDialog.tsx +249 -0
  333. package/src/components/EntityCollectionView/ViewModeToggle.tsx +194 -0
  334. package/src/components/EntityCollectionView/board_types.ts +113 -0
  335. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  336. package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
  337. package/src/components/EntityCollectionView/utils.ts +19 -0
  338. package/src/components/EntityJsonPreview.tsx +66 -0
  339. package/src/components/EntityPreview.tsx +367 -0
  340. package/src/components/EntityView.tsx +66 -0
  341. package/src/components/ErrorBoundary.tsx +40 -0
  342. package/src/components/ErrorTooltip.tsx +12 -0
  343. package/src/components/ErrorView.tsx +69 -0
  344. package/src/components/FieldCaption.tsx +14 -0
  345. package/src/components/HomePage/ContentHomePage.tsx +634 -0
  346. package/src/components/HomePage/FavouritesView.tsx +59 -0
  347. package/src/components/HomePage/HomePageDnD.tsx +702 -0
  348. package/src/components/HomePage/NavigationCard.tsx +80 -0
  349. package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
  350. package/src/components/HomePage/NavigationGroup.tsx +154 -0
  351. package/src/components/HomePage/RenameGroupDialog.tsx +121 -0
  352. package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
  353. package/src/components/HomePage/StudioHomePage.tsx +231 -0
  354. package/src/components/HomePage/index.tsx +6 -0
  355. package/src/components/NotFoundPage.tsx +25 -0
  356. package/src/components/PropertyCollectionView.tsx +333 -0
  357. package/src/components/PropertyConfigBadge.tsx +27 -0
  358. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  359. package/src/components/RebaseLogo.tsx +29 -0
  360. package/src/components/ReferenceTable/EntitySelectionTable.tsx +371 -0
  361. package/src/components/ReferenceWidget.tsx +152 -0
  362. package/src/components/RelationSelector.tsx +518 -0
  363. package/src/components/SearchIconsView.tsx +78 -0
  364. package/src/components/SelectableTable/SelectableTable.tsx +344 -0
  365. package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
  366. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +49 -0
  367. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +126 -0
  368. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +203 -0
  369. package/src/components/SelectableTable/filters/RelationFilterField.tsx +138 -0
  370. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +217 -0
  371. package/src/components/UnsavedChangesDialog.tsx +45 -0
  372. package/src/components/UserDisplay.tsx +55 -0
  373. package/src/components/UserSettingsView.tsx +220 -0
  374. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +386 -0
  375. package/src/components/VirtualTable/VirtualTable.tsx +625 -0
  376. package/src/components/VirtualTable/VirtualTableCell.tsx +58 -0
  377. package/src/components/VirtualTable/VirtualTableHeader.tsx +275 -0
  378. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +249 -0
  379. package/src/components/VirtualTable/VirtualTableProps.tsx +298 -0
  380. package/src/components/VirtualTable/VirtualTableRow.tsx +52 -0
  381. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +39 -0
  382. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +93 -0
  383. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +83 -0
  384. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +133 -0
  385. package/src/components/VirtualTable/fields/VirtualTableSwitch.tsx +32 -0
  386. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +111 -0
  387. package/src/components/VirtualTable/index.tsx +3 -0
  388. package/src/components/VirtualTable/types.tsx +46 -0
  389. package/src/components/admin/RoleChip.tsx +23 -0
  390. package/src/components/admin/RolesView.tsx +408 -0
  391. package/src/components/admin/UsersView.tsx +353 -0
  392. package/src/components/admin/index.ts +3 -0
  393. package/src/components/common/default_entity_actions.tsx +144 -0
  394. package/src/components/common/index.ts +6 -0
  395. package/src/components/common/table_height.tsx +21 -0
  396. package/src/components/common/types.tsx +61 -0
  397. package/src/components/common/useColumnsIds.tsx +210 -0
  398. package/src/components/common/useDataSourceTableController.tsx +480 -0
  399. package/src/components/common/useDebouncedCallback.tsx +20 -0
  400. package/src/components/common/useDebouncedData.ts +49 -0
  401. package/src/components/common/useScrollRestoration.tsx +68 -0
  402. package/src/components/common/useTableSearchHelper.ts +75 -0
  403. package/src/components/index.tsx +49 -0
  404. package/src/contexts/AdminModeController.tsx +11 -0
  405. package/src/contexts/AnalyticsContext.tsx +4 -0
  406. package/src/contexts/AuthControllerContext.tsx +4 -0
  407. package/src/contexts/BreacrumbsContext.tsx +45 -0
  408. package/src/contexts/CustomizationControllerContext.tsx +4 -0
  409. package/src/contexts/DataSourceContext.tsx +4 -0
  410. package/src/contexts/DialogsProvider.tsx +53 -0
  411. package/src/contexts/EffectiveRoleController.tsx +11 -0
  412. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  413. package/src/contexts/ModeController.tsx +11 -0
  414. package/src/contexts/NavigationContext.tsx +4 -0
  415. package/src/contexts/SideDialogsControllerContext.tsx +4 -0
  416. package/src/contexts/SideEntityControllerContext.tsx +4 -0
  417. package/src/contexts/SnackbarProvider.tsx +14 -0
  418. package/src/contexts/StorageSourceContext.tsx +4 -0
  419. package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
  420. package/src/contexts/index.ts +15 -0
  421. package/src/core/DefaultAppBar.tsx +274 -0
  422. package/src/core/DefaultDrawer.tsx +267 -0
  423. package/src/core/DrawerNavigationGroup.tsx +117 -0
  424. package/src/core/DrawerNavigationItem.tsx +65 -0
  425. package/src/core/EntityEditView.tsx +590 -0
  426. package/src/core/EntityEditViewFormActions.tsx +343 -0
  427. package/src/core/EntitySidePanel.tsx +173 -0
  428. package/src/core/Rebase.tsx +229 -0
  429. package/src/core/RebaseRouter.tsx +17 -0
  430. package/src/core/RebaseRoutes.tsx +47 -0
  431. package/src/core/SideDialogs.tsx +200 -0
  432. package/src/core/field_configs.tsx +443 -0
  433. package/src/core/index.tsx +14 -0
  434. package/src/form/EntityForm.tsx +820 -0
  435. package/src/form/EntityFormActions.tsx +201 -0
  436. package/src/form/PropertyFieldBinding.tsx +348 -0
  437. package/src/form/components/ErrorFocus.tsx +44 -0
  438. package/src/form/components/FieldHelperText.tsx +45 -0
  439. package/src/form/components/FormEntry.tsx +22 -0
  440. package/src/form/components/FormLayout.tsx +16 -0
  441. package/src/form/components/LabelWithIcon.tsx +43 -0
  442. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  443. package/src/form/components/LocalChangesMenu.tsx +144 -0
  444. package/src/form/components/StorageItemPreview.tsx +79 -0
  445. package/src/form/components/StorageUploadProgress.tsx +105 -0
  446. package/src/form/components/index.tsx +5 -0
  447. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +105 -0
  448. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +163 -0
  449. package/src/form/field_bindings/BlockFieldBinding.tsx +268 -0
  450. package/src/form/field_bindings/DateTimeFieldBinding.tsx +70 -0
  451. package/src/form/field_bindings/KeyValueFieldBinding.tsx +567 -0
  452. package/src/form/field_bindings/MapFieldBinding.tsx +156 -0
  453. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +146 -0
  454. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +120 -0
  455. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +151 -0
  456. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +64 -0
  457. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  458. package/src/form/field_bindings/ReferenceFieldBinding.tsx +134 -0
  459. package/src/form/field_bindings/RelationFieldBinding.tsx +176 -0
  460. package/src/form/field_bindings/RepeatFieldBinding.tsx +136 -0
  461. package/src/form/field_bindings/SelectFieldBinding.tsx +107 -0
  462. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +490 -0
  463. package/src/form/field_bindings/SwitchFieldBinding.tsx +64 -0
  464. package/src/form/field_bindings/TextFieldBinding.tsx +153 -0
  465. package/src/form/field_bindings/UserSelectFieldBinding.tsx +96 -0
  466. package/src/form/index.tsx +27 -0
  467. package/src/form/useClearRestoreValue.tsx +35 -0
  468. package/src/form/validation.ts +532 -0
  469. package/src/hooks/ApiConfigContext.tsx +40 -0
  470. package/src/hooks/data/delete.ts +77 -0
  471. package/src/hooks/data/save.ts +75 -0
  472. package/src/hooks/data/useCollectionFetch.tsx +148 -0
  473. package/src/hooks/data/useDataOrder.ts +26 -0
  474. package/src/hooks/data/useDataSource.tsx +22 -0
  475. package/src/hooks/data/useEntityFetch.tsx +121 -0
  476. package/src/hooks/data/useRelationSelector.tsx +205 -0
  477. package/src/hooks/index.tsx +51 -0
  478. package/src/hooks/navigation/contexts/CMSUrlContext.tsx +24 -0
  479. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +19 -0
  480. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +15 -0
  481. package/src/hooks/navigation/contexts/index.ts +14 -0
  482. package/src/hooks/navigation/useBuildCMSUrlController.tsx +68 -0
  483. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +150 -0
  484. package/src/hooks/navigation/useBuildNavigationStateController.tsx +135 -0
  485. package/src/hooks/navigation/useNavigationRegistry.ts +142 -0
  486. package/src/hooks/navigation/useNavigationResolution.ts +98 -0
  487. package/src/hooks/navigation/useNavigationURLs.ts +56 -0
  488. package/src/hooks/navigation/useResolvedCollections.ts +139 -0
  489. package/src/hooks/navigation/useResolvedViews.tsx +204 -0
  490. package/src/hooks/navigation/useTopLevelNavigation.ts +265 -0
  491. package/src/hooks/navigation/utils.ts +177 -0
  492. package/src/hooks/useAdminModeController.tsx +23 -0
  493. package/src/hooks/useAnalyticsController.tsx +8 -0
  494. package/src/hooks/useAuthController.tsx +14 -0
  495. package/src/hooks/useBackendStorageSource.ts +276 -0
  496. package/src/hooks/useBreadcrumbsController.tsx +49 -0
  497. package/src/hooks/useBrowserTitleAndIcon.tsx +25 -0
  498. package/src/hooks/useBuildAdminModeController.tsx +24 -0
  499. package/src/hooks/useBuildEffectiveRoleController.tsx +30 -0
  500. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +65 -0
  501. package/src/hooks/useBuildModeController.tsx +71 -0
  502. package/src/hooks/useBuildNavigationController.tsx +341 -0
  503. package/src/hooks/useClipboard.tsx +158 -0
  504. package/src/hooks/useCollapsedGroups.ts +72 -0
  505. package/src/hooks/useCustomizationController.tsx +14 -0
  506. package/src/hooks/useDialogsController.tsx +14 -0
  507. package/src/hooks/useEffectiveRoleController.tsx +10 -0
  508. package/src/hooks/useEntitySelectionDialog.tsx +56 -0
  509. package/src/hooks/useInternalUserManagementController.tsx +17 -0
  510. package/src/hooks/useLargeLayout.tsx +65 -0
  511. package/src/hooks/useModeController.tsx +23 -0
  512. package/src/hooks/usePermissions.ts +43 -0
  513. package/src/hooks/useRebaseContext.tsx +86 -0
  514. package/src/hooks/useResolvedNavigationFrom.tsx +158 -0
  515. package/src/hooks/useSideDialogsController.tsx +21 -0
  516. package/src/hooks/useSideEntityController.tsx +15 -0
  517. package/src/hooks/useSnackbarController.tsx +52 -0
  518. package/src/hooks/useStorageSource.tsx +14 -0
  519. package/src/hooks/useUnsavedChangesDialog.tsx +62 -0
  520. package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
  521. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  522. package/src/index.ts +17 -0
  523. package/src/internal/common.tsx +5 -0
  524. package/src/internal/useBuildDataSource.ts +380 -0
  525. package/src/internal/useBuildSideDialogsController.tsx +135 -0
  526. package/src/internal/useBuildSideEntityController.tsx +309 -0
  527. package/src/internal/useRestoreScroll.tsx +60 -0
  528. package/src/preview/PropertyPreview.tsx +308 -0
  529. package/src/preview/components/ArrayEnumPreview.tsx +38 -0
  530. package/src/preview/components/AsyncPreviewComponent.tsx +47 -0
  531. package/src/preview/components/BooleanPreview.tsx +25 -0
  532. package/src/preview/components/DatePreview.tsx +94 -0
  533. package/src/preview/components/EmptyValue.tsx +10 -0
  534. package/src/preview/components/EnumValuesChip.tsx +39 -0
  535. package/src/preview/components/ImagePreview.tsx +111 -0
  536. package/src/preview/components/ReferencePreview.tsx +162 -0
  537. package/src/preview/components/RelationPreview.tsx +153 -0
  538. package/src/preview/components/StorageThumbnail.tsx +91 -0
  539. package/src/preview/components/UrlComponentPreview.tsx +113 -0
  540. package/src/preview/components/UserPreview.tsx +27 -0
  541. package/src/preview/index.ts +26 -0
  542. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +72 -0
  543. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +43 -0
  544. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +52 -0
  545. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +49 -0
  546. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +44 -0
  547. package/src/preview/property_previews/ArrayOneOfPreview.tsx +67 -0
  548. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +34 -0
  549. package/src/preview/property_previews/ArrayPropertyPreview.tsx +69 -0
  550. package/src/preview/property_previews/MapPropertyPreview.tsx +145 -0
  551. package/src/preview/property_previews/NumberPropertyPreview.tsx +28 -0
  552. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +275 -0
  553. package/src/preview/property_previews/StringPropertyPreview.tsx +57 -0
  554. package/src/preview/util.ts +30 -0
  555. package/src/routes/CustomCMSRoute.tsx +21 -0
  556. package/src/routes/RebaseRoute.tsx +255 -0
  557. package/src/routes/index.ts +2 -0
  558. package/src/util/createFormexStub.tsx +66 -0
  559. package/src/util/entity_cache.ts +267 -0
  560. package/src/util/enums.ts +32 -0
  561. package/src/util/icon_list.ts +23 -0
  562. package/src/util/icon_synonyms.ts +1853 -0
  563. package/src/util/icons.tsx +87 -0
  564. package/src/util/index.ts +11 -0
  565. package/src/util/previews.ts +50 -0
  566. package/src/util/property_utils.tsx +152 -0
  567. package/src/util/useDebouncedCallback.ts +25 -0
  568. package/src/util/useStorageUploadController.tsx +342 -0
  569. package/src/util/useTraceUpdate.tsx +24 -0
  570. package/src/vitePlugin.ts +47 -0
@@ -0,0 +1,490 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { Entity, EntityCollection, FilterValues } from "@rebasepro/types";
3
+ import { useDataSource, useRebaseContext } from "../../hooks";
4
+
5
+ const DEFAULT_PAGE_SIZE = 20;
6
+
7
+ /**
8
+ * Data state for a single board column
9
+ */
10
+ export interface BoardColumnData<M extends Record<string, any> = any> {
11
+ /** Entities loaded for this column */
12
+ entities: Entity<M>[];
13
+ /** Whether the column is currently loading data */
14
+ loading: boolean;
15
+ /** Whether there are more items to load */
16
+ hasMore: boolean;
17
+ /** Error if loading failed */
18
+ error?: Error;
19
+ /** Total count of entities in this column */
20
+ totalCount?: number;
21
+ }
22
+
23
+ /**
24
+ * Controller for managing per-column data in a Kanban board
25
+ */
26
+ export interface BoardDataController<M extends Record<string, any> = any, COLUMN extends string = string> {
27
+ /** Data state for each column */
28
+ columnData: Record<COLUMN, BoardColumnData<M>>;
29
+ /** Load more items for a specific column */
30
+ loadMoreColumn: (column: COLUMN) => void;
31
+ /** Refresh data for a specific column */
32
+ refreshColumn: (column: COLUMN) => void;
33
+ /** Refresh all columns */
34
+ refreshAll: () => void;
35
+ /** Update counts for columns (for optimistic updates when moving items) */
36
+ updateColumnCounts: (sourceColumn: COLUMN, targetColumn: COLUMN) => void;
37
+ /** Decrement column counts (for optimistic updates when deleting items) */
38
+ decrementColumnCounts: (columnDeltas: Record<COLUMN, number>) => void;
39
+ /** Whether any column is loading */
40
+ loading: boolean;
41
+ /** Any error from any column */
42
+ error?: Error;
43
+ }
44
+
45
+ export interface UseBoardDataControllerProps<M extends Record<string, any> = any> {
46
+ /** Full path to the collection */
47
+ fullPath: string;
48
+ /** The entity collection configuration */
49
+ collection: EntityCollection<M>;
50
+ /** Property key used for column assignment */
51
+ columnProperty: string;
52
+ /** Array of column values (enum values from columnProperty) */
53
+ columns: string[];
54
+ /** Property key used for ordering within columns */
55
+ orderProperty?: string;
56
+ /** Number of items to load per page per column */
57
+ pageSize?: number;
58
+ /** Text search string to filter entities */
59
+ searchString?: string;
60
+ /** Additional filter values */
61
+ filterValues?: FilterValues<string>;
62
+ }
63
+
64
+ /**
65
+ * Hook that manages per-column data loading for the Kanban board.
66
+ * Each column gets its own independent query to the data source.
67
+ */
68
+ export function useBoardDataController<M extends Record<string, any> = any, COLUMN extends string = string>({
69
+ fullPath,
70
+ collection,
71
+ columnProperty,
72
+ columns,
73
+ orderProperty,
74
+ pageSize = DEFAULT_PAGE_SIZE,
75
+ searchString,
76
+ filterValues
77
+ }: UseBoardDataControllerProps<M>): BoardDataController<M, COLUMN> {
78
+
79
+ const context = useRebaseContext();
80
+ const dataSource = useDataSource(collection);
81
+ // v4: use fullPath directly instead of resolveIdsFrom
82
+ const resolvedPath = fullPath;
83
+
84
+ // Stable refs for objects that shouldn't trigger re-subscriptions
85
+ const dataSourceRef = useRef(dataSource);
86
+ const collectionRef = useRef(collection);
87
+ const contextRef = useRef(context);
88
+ dataSourceRef.current = dataSource;
89
+ collectionRef.current = collection;
90
+ contextRef.current = context;
91
+
92
+ // Store filter/order params in refs so they're accessible without causing re-subscriptions
93
+ const filterValuesRef = useRef(filterValues);
94
+ const columnPropertyRef = useRef(columnProperty);
95
+ const orderPropertyRef = useRef(orderProperty);
96
+ const searchStringRef = useRef(searchString);
97
+ const resolvedPathRef = useRef(resolvedPath);
98
+ filterValuesRef.current = filterValues;
99
+ columnPropertyRef.current = columnProperty;
100
+ orderPropertyRef.current = orderProperty;
101
+ searchStringRef.current = searchString;
102
+ resolvedPathRef.current = resolvedPath;
103
+
104
+ // Track item count per column for pagination
105
+ const [columnItemCounts, setColumnItemCounts] = useState<Record<string, number>>(() => {
106
+ const initial: Record<string, number> = {};
107
+ columns.forEach(col => {
108
+ initial[col] = pageSize;
109
+ });
110
+ return initial;
111
+ });
112
+
113
+ // Per-column data state
114
+ const [columnData, setColumnData] = useState<Record<string, BoardColumnData<M>>>(() => {
115
+ const initial: Record<string, BoardColumnData<M>> = {};
116
+ columns.forEach(col => {
117
+ initial[col] = {
118
+ entities: [],
119
+ loading: true,
120
+ hasMore: true,
121
+ error: undefined,
122
+ totalCount: undefined
123
+ };
124
+ });
125
+ return initial;
126
+ });
127
+
128
+ // Track cleanup functions for subscriptions
129
+ const unsubscribersRef = useRef<Record<string, () => void>>({});
130
+
131
+ // Flag to prevent race conditions during cleanup
132
+ const isCleaningUpRef = useRef(false);
133
+
134
+ // Stable keys for dependency comparison
135
+ const columnsKey = useMemo(() => [...columns].sort().join(","), [columns]);
136
+ const filterKey = useMemo(() => JSON.stringify(filterValues), [filterValues]);
137
+
138
+ // Track previous column item counts to detect which column changed
139
+ const prevColumnItemCountsRef = useRef<Record<string, number>>(columnItemCounts);
140
+
141
+ // Version counter to trigger full re-subscription when params change (not just load-more)
142
+ const [subscriptionVersion, setSubscriptionVersion] = useState(0);
143
+
144
+ // Trigger full re-subscription when key params change
145
+ useEffect(() => {
146
+ setSubscriptionVersion(v => v + 1);
147
+ }, [columnsKey, resolvedPath, columnProperty, orderProperty, searchString, filterKey, pageSize]);
148
+
149
+ // Cleanup subscriptions on unmount
150
+ useEffect(() => {
151
+ return () => {
152
+ isCleaningUpRef.current = true;
153
+ Object.values(unsubscribersRef.current).forEach(unsub => unsub?.());
154
+ unsubscribersRef.current = {};
155
+ };
156
+ }, []);
157
+
158
+ // Helper function to subscribe to a single column - uses refs to avoid dependency issues
159
+ const subscribeToColumn = useCallback((column: string, itemCount: number) => {
160
+ // Skip if we're in the middle of cleanup
161
+ if (isCleaningUpRef.current) return;
162
+
163
+ const currentDataSource = dataSourceRef.current;
164
+ const currentCollection = collectionRef.current;
165
+ const currentContext = contextRef.current;
166
+ const currentFilterValues = filterValuesRef.current;
167
+ const currentColumnProperty = columnPropertyRef.current;
168
+ const currentOrderProperty = orderPropertyRef.current;
169
+ const currentSearchString = searchStringRef.current;
170
+ const currentResolvedPath = resolvedPathRef.current;
171
+
172
+ // Build filter for this column
173
+ const columnFilter: FilterValues<string> = {
174
+ ...currentFilterValues,
175
+ [currentColumnProperty]: ["==", column]
176
+ };
177
+
178
+ // Mark column as loading
179
+ setColumnData(prev => ({
180
+ ...prev,
181
+ [column]: {
182
+ ...prev[column],
183
+ loading: true,
184
+ error: undefined
185
+ }
186
+ }));
187
+
188
+ // onUpdate callback
189
+ const onUpdate = async (entities: Entity<M>[]) => {
190
+ // Skip updates if we're cleaning up
191
+ if (isCleaningUpRef.current) return;
192
+
193
+ // When text search is active, the data source returns ALL matching entities
194
+ // regardless of the column filter. We need to filter in memory to only show
195
+ // entities that belong to this specific column.
196
+ let processed = currentSearchString
197
+ ? entities.filter(e => e.values?.[currentColumnProperty] === column)
198
+ : entities;
199
+
200
+ // Apply afterRead callbacks if any
201
+ if (currentCollection.callbacks?.afterRead) {
202
+ try {
203
+ processed = await Promise.all(
204
+ processed.map(entity =>
205
+ currentCollection.callbacks!.afterRead!({
206
+ collection: currentCollection,
207
+ path: currentResolvedPath,
208
+ entity,
209
+ context: currentContext
210
+ })
211
+ )
212
+ );
213
+ } catch (e) {
214
+ console.error("Error in afterRead callback:", e);
215
+ }
216
+ }
217
+
218
+ setColumnData(prev => ({
219
+ ...prev,
220
+ [column]: {
221
+ entities: processed,
222
+ loading: false,
223
+ hasMore: entities.length >= itemCount,
224
+ error: undefined,
225
+ totalCount: prev[column]?.totalCount // Keep existing count
226
+ }
227
+ }));
228
+ };
229
+
230
+ const onError = (error: Error) => {
231
+ // Skip error handling if we're cleaning up
232
+ if (isCleaningUpRef.current) return;
233
+
234
+ console.error(`Error loading column ${column}:`, error);
235
+ setColumnData(prev => ({
236
+ ...prev,
237
+ [column]: {
238
+ ...prev[column],
239
+ entities: [],
240
+ loading: false,
241
+ hasMore: false,
242
+ error
243
+ }
244
+ }));
245
+ };
246
+
247
+ // Set up listener or fetch
248
+ if (currentDataSource.listenCollection) {
249
+ const unsubscribe = currentDataSource.listenCollection<M>({
250
+ path: currentResolvedPath,
251
+ collection: currentCollection,
252
+ onUpdate,
253
+ onError,
254
+ searchString: currentSearchString,
255
+ filter: columnFilter,
256
+ limit: itemCount,
257
+ startAfter: undefined,
258
+ orderBy: currentOrderProperty,
259
+ order: currentOrderProperty ? "asc" : undefined
260
+ });
261
+ unsubscribersRef.current[column] = unsubscribe;
262
+ } else {
263
+ currentDataSource.fetchCollection<M>({
264
+ path: currentResolvedPath,
265
+ collection: currentCollection,
266
+ searchString: currentSearchString,
267
+ filter: columnFilter,
268
+ limit: itemCount,
269
+ startAfter: undefined,
270
+ orderBy: currentOrderProperty,
271
+ order: currentOrderProperty ? "asc" : undefined
272
+ })
273
+ .then(onUpdate)
274
+ .catch(onError);
275
+ }
276
+ }, []); // No dependencies - uses refs for all values
277
+
278
+ // Main effect for all column subscriptions - runs when subscriptionVersion changes (i.e., key params change)
279
+ useEffect(() => {
280
+ // Mark that we're setting up new subscriptions
281
+ isCleaningUpRef.current = false;
282
+
283
+ // Clean up all existing subscriptions synchronously
284
+ const existingUnsubscribers = { ...unsubscribersRef.current };
285
+ unsubscribersRef.current = {};
286
+ Object.values(existingUnsubscribers).forEach(unsub => {
287
+ try {
288
+ unsub?.();
289
+ } catch (e) {
290
+ // Ignore cleanup errors
291
+ }
292
+ });
293
+
294
+ const currentDataSource = dataSourceRef.current;
295
+ const currentCollection = collectionRef.current;
296
+ const currentFilterValues = filterValuesRef.current;
297
+ const currentColumnProperty = columnPropertyRef.current;
298
+ const currentSearchString = searchStringRef.current;
299
+ const currentResolvedPath = resolvedPathRef.current;
300
+ const currentColumns = columns;
301
+ const currentColumnItemCounts = columnItemCounts;
302
+
303
+ // Small delay to ensure Firestore has cleaned up previous listeners
304
+ const timeoutId = setTimeout(() => {
305
+ if (isCleaningUpRef.current) return;
306
+
307
+ currentColumns.forEach(column => {
308
+ const itemCount = currentColumnItemCounts[column] ?? pageSize;
309
+ subscribeToColumn(column, itemCount);
310
+
311
+ // Count query for column (for display in column header)
312
+ if (currentDataSource.countEntities) {
313
+ const columnFilter: FilterValues<string> = {
314
+ ...currentFilterValues,
315
+ [currentColumnProperty]: ["==", column]
316
+ };
317
+ currentDataSource.countEntities({
318
+ path: currentResolvedPath,
319
+ collection: currentCollection,
320
+ filter: columnFilter,
321
+ searchString: currentSearchString
322
+ }).then(count => {
323
+ if (isCleaningUpRef.current) return;
324
+ setColumnData(prev => ({
325
+ ...prev,
326
+ [column]: {
327
+ ...prev[column],
328
+ totalCount: count
329
+ }
330
+ }));
331
+ }).catch(e => {
332
+ console.warn(`Failed to get count for column ${column}:`, e);
333
+ });
334
+ }
335
+ });
336
+
337
+ // Update the ref after subscribing all
338
+ prevColumnItemCountsRef.current = { ...currentColumnItemCounts };
339
+ }, 0);
340
+
341
+ return () => {
342
+ clearTimeout(timeoutId);
343
+ isCleaningUpRef.current = true;
344
+ const unsubscribers = { ...unsubscribersRef.current };
345
+ unsubscribersRef.current = {};
346
+ Object.values(unsubscribers).forEach(unsub => {
347
+ try {
348
+ unsub?.();
349
+ } catch (e) {
350
+ // Ignore cleanup errors
351
+ }
352
+ });
353
+ };
354
+ // eslint-disable-next-line react-hooks/exhaustive-deps
355
+ }, [subscriptionVersion, subscribeToColumn, pageSize]);
356
+
357
+ // Track which subscription version last updated the counts
358
+ const lastProcessedVersionRef = useRef(subscriptionVersion);
359
+
360
+ // Separate effect to handle individual column load-more WITHOUT triggering full re-subscription
361
+ useEffect(() => {
362
+ // If subscriptionVersion changed, the main effect will handle everything
363
+ // Skip this effect to avoid race conditions
364
+ if (subscriptionVersion !== lastProcessedVersionRef.current) {
365
+ lastProcessedVersionRef.current = subscriptionVersion;
366
+ prevColumnItemCountsRef.current = { ...columnItemCounts };
367
+ return;
368
+ }
369
+
370
+ const prevCounts = prevColumnItemCountsRef.current;
371
+
372
+ columns.forEach(column => {
373
+ const prevCount = prevCounts[column] ?? pageSize;
374
+ const newCount = columnItemCounts[column] ?? pageSize;
375
+
376
+ // Only re-subscribe if this specific column's count increased (load more)
377
+ if (newCount > prevCount && !isCleaningUpRef.current) {
378
+ // Unsubscribe only this column
379
+ if (unsubscribersRef.current[column]) {
380
+ try {
381
+ unsubscribersRef.current[column]();
382
+ } catch (e) {
383
+ // Ignore cleanup errors
384
+ }
385
+ delete unsubscribersRef.current[column];
386
+ }
387
+ // Re-subscribe with new limit after a small delay
388
+ setTimeout(() => {
389
+ if (!isCleaningUpRef.current) {
390
+ subscribeToColumn(column, newCount);
391
+ }
392
+ }, 0);
393
+ }
394
+ });
395
+
396
+ // Update the ref
397
+ prevColumnItemCountsRef.current = { ...columnItemCounts };
398
+ }, [columnItemCounts, columns, pageSize, subscribeToColumn, subscriptionVersion]);
399
+
400
+ const loadMoreColumn = useCallback((column: COLUMN) => {
401
+ setColumnItemCounts(prev => ({
402
+ ...prev,
403
+ [column]: (prev[column] ?? pageSize) + pageSize
404
+ }));
405
+ }, [pageSize]);
406
+
407
+ const refreshColumn = useCallback((column: COLUMN) => {
408
+ // Force re-subscribe by resetting to initial count
409
+ setColumnItemCounts(prev => ({
410
+ ...prev,
411
+ [column]: pageSize
412
+ }));
413
+ }, [pageSize]);
414
+
415
+ const refreshAll = useCallback(() => {
416
+ const reset: Record<string, number> = {};
417
+ columns.forEach(col => {
418
+ reset[col] = pageSize;
419
+ });
420
+ setColumnItemCounts(reset);
421
+ }, [columns, pageSize]);
422
+
423
+ // Optimistic update for column counts when moving an item between columns
424
+ const updateColumnCounts = useCallback((sourceColumn: COLUMN, targetColumn: COLUMN) => {
425
+ if (sourceColumn === targetColumn) return;
426
+
427
+ setColumnData(prev => {
428
+ const updated = { ...prev };
429
+
430
+ // Decrease source column count
431
+ if (updated[sourceColumn]?.totalCount !== undefined) {
432
+ updated[sourceColumn] = {
433
+ ...updated[sourceColumn],
434
+ totalCount: Math.max(0, (updated[sourceColumn].totalCount ?? 0) - 1)
435
+ };
436
+ }
437
+
438
+ // Increase target column count
439
+ if (updated[targetColumn]?.totalCount !== undefined) {
440
+ updated[targetColumn] = {
441
+ ...updated[targetColumn],
442
+ totalCount: (updated[targetColumn].totalCount ?? 0) + 1
443
+ };
444
+ }
445
+
446
+ return updated;
447
+ });
448
+ }, []);
449
+
450
+ // Optimistic update for column counts when deleting items
451
+ const decrementColumnCounts = useCallback((columnDeltas: Record<COLUMN, number>) => {
452
+ setColumnData(prev => {
453
+ const updated = { ...prev };
454
+
455
+ for (const [column, delta] of Object.entries(columnDeltas) as [COLUMN, number][]) {
456
+ if (updated[column]?.totalCount !== undefined) {
457
+ updated[column] = {
458
+ ...updated[column],
459
+ totalCount: Math.max(0, (updated[column].totalCount ?? 0) - delta)
460
+ };
461
+ }
462
+ }
463
+
464
+ return updated;
465
+ });
466
+ }, []);
467
+
468
+ // Aggregate loading and error state
469
+ const loading = useMemo(() => {
470
+ return Object.values(columnData).some((col) => col.loading);
471
+ }, [columnData]);
472
+
473
+ const error = useMemo(() => {
474
+ const errors = Object.values(columnData)
475
+ .map((col) => col.error)
476
+ .filter(Boolean);
477
+ return errors[0];
478
+ }, [columnData]);
479
+
480
+ return {
481
+ columnData: columnData as Record<COLUMN, BoardColumnData<M>>,
482
+ loadMoreColumn,
483
+ refreshColumn,
484
+ refreshAll,
485
+ updateColumnCounts,
486
+ decrementColumnCounts,
487
+ loading,
488
+ error
489
+ };
490
+ }
@@ -0,0 +1,43 @@
1
+ import { useCallback, useState } from "react";
2
+ import { Entity, SelectionController } from "@rebasepro/types";
3
+
4
+ export function useSelectionController<M extends Record<string, any> = any>(
5
+ onSelectionChange?: (entity: Entity<M>, selected: boolean) => void
6
+ ): SelectionController<M> {
7
+
8
+ const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);
9
+
10
+ const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {
11
+ let newValue;
12
+ if (newSelectedState === undefined) {
13
+ const isSelected = Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
14
+ if (isSelected) {
15
+ onSelectionChange?.(entity, false);
16
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
17
+ } else {
18
+ onSelectionChange?.(entity, true);
19
+ newValue = [...selectedEntities, entity];
20
+ }
21
+ } else {
22
+ if (newSelectedState) {
23
+ onSelectionChange?.(entity, true);
24
+ newValue = [...selectedEntities, entity];
25
+ } else {
26
+ onSelectionChange?.(entity, false);
27
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
28
+ }
29
+ }
30
+ setSelectedEntities(newValue);
31
+ }, [selectedEntities]);
32
+
33
+ const isEntitySelected = useCallback((entity: Entity<M>) => {
34
+ return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
35
+ }, [selectedEntities]);
36
+
37
+ return {
38
+ selectedEntities,
39
+ setSelectedEntities,
40
+ isEntitySelected,
41
+ toggleEntitySelection
42
+ };
43
+ }
@@ -0,0 +1,19 @@
1
+ export function addRecentId(collectionId: string, id: string | number) {
2
+ const recentIds = getRecentIds(collectionId);
3
+ const newRecentIds = [id, ...recentIds.filter(i => i !== id)];
4
+ if (newRecentIds.length > 5) {
5
+ newRecentIds.pop();
6
+ }
7
+ saveSearchedIdsLocally(collectionId, newRecentIds);
8
+ return newRecentIds;
9
+ }
10
+
11
+ export function saveSearchedIdsLocally(collectionId: string, ids: (string | number)[]) {
12
+ localStorage.setItem("recent_id_searches::" + collectionId, JSON.stringify(ids));
13
+ }
14
+
15
+ export function getRecentIds(collectionId: string): (string | number)[] {
16
+ const stored = localStorage.getItem("recent_id_searches::" + collectionId);
17
+ if (!stored) return [];
18
+ return JSON.parse(stored);
19
+ }
@@ -0,0 +1,66 @@
1
+ import React, { useRef } from "react";
2
+ import { Highlight, themes } from "prism-react-renderer";
3
+ import { useModeController } from "../hooks";
4
+
5
+ export function EntityJsonPreview({ values }: { values: object }) {
6
+ const code = JSON.stringify(values, null, "\t");
7
+ const { mode } = useModeController();
8
+ const preRef = useRef<HTMLPreElement>(null);
9
+
10
+ // Global keydown handler
11
+ // const handleGlobalKeyDown = useCallback((e: KeyboardEvent) => {
12
+ // // Check for Control (Windows/Linux) or Command (macOS) + "a":
13
+ // if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "a") {
14
+ // // If our code view is mounted, perform selection
15
+ // if (preRef.current) {
16
+ // e.preventDefault();
17
+ // e.stopPropagation();
18
+ //
19
+ // const selection = window.getSelection();
20
+ // const range = document.createRange();
21
+ // range.selectNodeContents(preRef.current);
22
+ // if (selection) {
23
+ // selection.removeAllRanges();
24
+ // selection.addRange(range);
25
+ // }
26
+ // }
27
+ // }
28
+ // }, []);
29
+
30
+ // // Attach the global keydown listener when component mounts,
31
+ // // and remove it when it unmounts.
32
+ // useEffect(() => {
33
+ // document.addEventListener("keydown", handleGlobalKeyDown);
34
+ // return () => {
35
+ // document.removeEventListener("keydown", handleGlobalKeyDown);
36
+ // };
37
+ // }, [handleGlobalKeyDown]);
38
+
39
+ return (
40
+ <Highlight
41
+ theme={mode === "dark" ? themes.vsDark : themes.github}
42
+ code={code}
43
+ language="json"
44
+ >
45
+ {({ style, tokens, getLineProps, getTokenProps }) => (
46
+ <pre
47
+ // Bind the ref to our pre element so we can select its contents.
48
+ ref={preRef}
49
+ style={{
50
+ ...style,
51
+ backgroundColor: "inherit"
52
+ }}
53
+ className="max-w-6xl mx-auto p-8 rounded-xs text-sm"
54
+ >
55
+ {tokens.map((line, i) => (
56
+ <div key={i} {...getLineProps({ line })} className="text-wrap">
57
+ {line.map((token, key) => (
58
+ <span key={key} {...getTokenProps({ token })} className="word-break" />
59
+ ))}
60
+ </div>
61
+ ))}
62
+ </pre>
63
+ )}
64
+ </Highlight>
65
+ );
66
+ }