@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,634 @@
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import Fuse from "fuse.js";
3
+ import { Container, SearchBar } from "@rebasepro/ui";
4
+ import {
5
+ useCollapsedGroups,
6
+ useCustomizationController,
7
+ useRebaseContext,
8
+ useNavigationStateController
9
+ } from "../../hooks";
10
+ import { useBreadcrumbsController } from "../../hooks/useBreadcrumbsController";
11
+ import {
12
+ CMSAnalyticsEvent,
13
+ HomePageSection,
14
+ NavigationEntry,
15
+ NavigationGroupMapping,
16
+ PluginGenericProps,
17
+ PluginHomePageAdditionalCardsProps
18
+ } from "@rebasepro/types";
19
+ import { FavouritesView } from "./FavouritesView";
20
+ import { useRestoreScroll } from "../../internal/useRestoreScroll";
21
+ import { NavigationGroup } from "./NavigationGroup";
22
+ import {
23
+ NavigationGroupDroppable,
24
+ NewGroupDropZone,
25
+ SortableNavigationCard,
26
+ SortableNavigationGroup,
27
+ useHomePageDnd
28
+ } from "./HomePageDnD";
29
+ import { DndContext, DragOverlay, MeasuringStrategy } from "@dnd-kit/core";
30
+ import { NavigationCardBinding } from "./NavigationCardBinding";
31
+ import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
32
+ import { restrictToVerticalAxis, restrictToWindowEdges } from "@dnd-kit/modifiers";
33
+ import { RenameGroupDialog } from "./RenameGroupDialog";
34
+ import { toArray } from "@rebasepro/common";
35
+
36
+ export const DEFAULT_GROUP_NAME = "Views";
37
+ export const ADMIN_GROUP_NAME = "Admin";
38
+
39
+ export function ContentHomePage({
40
+ additionalActions,
41
+ additionalChildrenStart,
42
+ additionalChildrenEnd,
43
+ sections,
44
+ hiddenGroups
45
+ }: {
46
+ additionalActions?: React.ReactNode;
47
+ additionalChildrenStart?: React.ReactNode;
48
+ additionalChildrenEnd?: React.ReactNode;
49
+ sections?: HomePageSection[];
50
+ hiddenGroups?: string[];
51
+ }) {
52
+
53
+ const context = useRebaseContext();
54
+ const customizationController = useCustomizationController();
55
+ const navigationController = useNavigationStateController();
56
+ const breadcrumbs = useBreadcrumbsController();
57
+
58
+ useEffect(() => {
59
+ breadcrumbs.set({ breadcrumbs: [] });
60
+ }, [breadcrumbs.set]);
61
+
62
+ if (!navigationController.topLevelNavigation)
63
+ throw Error("Navigation not ready");
64
+
65
+ const {
66
+ allowDragAndDrop,
67
+ navigationEntries: rawNavigationEntries,
68
+ groups: groupOrderFromNavController,
69
+ onNavigationEntriesUpdate
70
+ } = navigationController.topLevelNavigation;
71
+
72
+ const fuse = useRef<Fuse<NavigationEntry> | null>(null);
73
+ const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);
74
+ const performingSearch = Boolean(filteredUrls);
75
+
76
+ // Memoize filtered navigation entries to prevent unnecessary recalculations
77
+ const filteredNavigationEntries = useMemo(() => {
78
+ return filteredUrls
79
+ ? rawNavigationEntries.filter((e) => filteredUrls.includes(e.url))
80
+ : rawNavigationEntries;
81
+ }, [filteredUrls, rawNavigationEntries]);
82
+
83
+ useEffect(() => {
84
+ fuse.current = new Fuse(rawNavigationEntries, {
85
+ keys: ["name", "description", "group", "path"]
86
+ });
87
+ }, [rawNavigationEntries]);
88
+
89
+ const updateSearch = useCallback((v?: string) => {
90
+ if (!v?.trim()) {
91
+ setFilteredUrls(null);
92
+ return;
93
+ }
94
+ const results = fuse.current?.search(v.trim());
95
+ setFilteredUrls(results ? results.map((x) => x.item.url) : []);
96
+ }, []);
97
+
98
+ /* ───────────────────────────────────────────────────────────────
99
+ Build groups (all items) + isolate Admin
100
+ ─────────────────────────────────────────────────────────────── */
101
+ const [items, setItems] = useState<
102
+ { name: string; entries: NavigationEntry[] }[]
103
+ >([]);
104
+ const [adminGroupData, setAdminGroupData] = useState<{
105
+ name: string;
106
+ entries: NavigationEntry[];
107
+ } | null>(null);
108
+
109
+ // Flag to prevent useEffect from overwriting local DnD state
110
+ const isDndDirtyRef = useRef(false);
111
+ const dndDirtyTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
112
+
113
+ // Memoize the processed groups to avoid unnecessary recalculations
114
+ const processedGroups = useMemo(() => {
115
+ const src = filteredNavigationEntries;
116
+ const entriesByGroup: Record<string, NavigationEntry[]> = {};
117
+
118
+ src.forEach((e) => {
119
+ const g =
120
+ e.type === "admin"
121
+ ? ADMIN_GROUP_NAME
122
+ : e.group ?? DEFAULT_GROUP_NAME;
123
+ (entriesByGroup[g] ??= []).push(e);
124
+ });
125
+
126
+ // Check if there are custom actions from plugins that should show in the default group
127
+ const hasPluginAdditionalCards = customizationController.plugins?.some(p => p.homePage?.AdditionalCards);
128
+
129
+ let allProcessed: { name: string; entries: NavigationEntry[] }[];
130
+
131
+ if (performingSearch) {
132
+ const ordered = [
133
+ ...new Set(src.map((e) => e.group ?? DEFAULT_GROUP_NAME))
134
+ ];
135
+ allProcessed = ordered
136
+ .filter(g => g === DEFAULT_GROUP_NAME || g === ADMIN_GROUP_NAME)
137
+ .map((name) => ({
138
+ name,
139
+ entries: entriesByGroup[name] || []
140
+ }))
141
+ .filter((g) => g.entries.length);
142
+ } else {
143
+ const filteredGroupOrder: string[] = groupOrderFromNavController.filter(g => g === DEFAULT_GROUP_NAME || g === ADMIN_GROUP_NAME);
144
+
145
+ allProcessed = filteredGroupOrder.map((g) => ({
146
+ name: g,
147
+ entries: entriesByGroup[g] || []
148
+ }));
149
+ Object.keys(entriesByGroup).forEach((g) => {
150
+ const shouldInclude = g === DEFAULT_GROUP_NAME || g === ADMIN_GROUP_NAME;
151
+ if (!filteredGroupOrder.includes(g) && shouldInclude)
152
+ allProcessed.push({
153
+ name: g,
154
+ entries: entriesByGroup[g]
155
+ });
156
+ });
157
+
158
+ // Ensure default group exists if there are plugin additional cards but no collections
159
+ if (hasPluginAdditionalCards && !allProcessed.some(g => g.name === DEFAULT_GROUP_NAME)) {
160
+ allProcessed.push({
161
+ name: DEFAULT_GROUP_NAME,
162
+ entries: []
163
+ });
164
+ }
165
+
166
+ allProcessed = allProcessed.filter(
167
+ (g) =>
168
+ g.entries.length ||
169
+ (g.name === DEFAULT_GROUP_NAME && hasPluginAdditionalCards)
170
+ );
171
+ }
172
+
173
+ const admin = allProcessed.find((g) => g.name === ADMIN_GROUP_NAME);
174
+ return {
175
+ adminGroupData: admin || null,
176
+ items: allProcessed.filter((g) => g.name !== ADMIN_GROUP_NAME && !hiddenGroups?.includes(g.name))
177
+ };
178
+ }, [filteredNavigationEntries, performingSearch, groupOrderFromNavController, customizationController.plugins, hiddenGroups]);
179
+
180
+ // Update state only when processedGroups actually changes
181
+ // Skip update if DnD just made a local change (dirty flag is set)
182
+ useEffect(() => {
183
+ if (isDndDirtyRef.current) {
184
+ // DnD just updated the state, skip this sync
185
+ return;
186
+ }
187
+ setAdminGroupData(processedGroups.adminGroupData);
188
+ setItems(processedGroups.items);
189
+ }, [processedGroups]);
190
+
191
+ /* ───────────────────────────────────────────────────────────────
192
+ Local update vs. persistence helpers
193
+ ─────────────────────────────────────────────────────────────── */
194
+ const updateItems = (
195
+ updater:
196
+ | { name: string; entries: NavigationEntry[] }[]
197
+ | ((
198
+ prev: { name: string; entries: NavigationEntry[] }[]
199
+ ) => { name: string; entries: NavigationEntry[] }[])
200
+ ) => {
201
+ setItems(updater); // local only
202
+ };
203
+
204
+ const persistNavigationGroups = (
205
+ latest: { name: string; entries: NavigationEntry[] }[]
206
+ ) => {
207
+ // Set dirty flag to prevent useEffect from overwriting local state
208
+ isDndDirtyRef.current = true;
209
+
210
+ // Clear any existing timeout
211
+ if (dndDirtyTimeoutRef.current) {
212
+ clearTimeout(dndDirtyTimeoutRef.current);
213
+ }
214
+
215
+ // Clear dirty flag after a delay to allow navigation to update
216
+ dndDirtyTimeoutRef.current = setTimeout(() => {
217
+ isDndDirtyRef.current = false;
218
+ }, 1000);
219
+
220
+ // Map ALL groups including "Views"
221
+ const draggable: NavigationGroupMapping[] = latest.map((g) => ({
222
+ name: g.name,
223
+ entries: g.entries.map((e) => e.slug)
224
+ }));
225
+
226
+ const all: NavigationGroupMapping[] = adminGroupData
227
+ ? [
228
+ ...draggable,
229
+ {
230
+ name: adminGroupData.name,
231
+ entries: adminGroupData.entries.map((e) => e.slug)
232
+ }
233
+ ]
234
+ : draggable;
235
+
236
+ onNavigationEntriesUpdate(all);
237
+ };
238
+
239
+ // Use custom hook for collapsed groups with localStorage persistence
240
+ const groupNames = useMemo(() => [
241
+ ...items.map(item => item.name),
242
+ ...(adminGroupData ? [adminGroupData.name] : [])
243
+ ], [items, adminGroupData]);
244
+
245
+ const { isGroupCollapsed, toggleGroupCollapsed } = useCollapsedGroups(groupNames, "home");
246
+
247
+
248
+ const {
249
+ sensors,
250
+ collisionDetection,
251
+ onDragStart,
252
+ onDragOver,
253
+ onDragEnd,
254
+ dropAnimation,
255
+ activeItemForOverlay,
256
+ activeGroupData,
257
+ draggingGroupId,
258
+ containers,
259
+ dndKitActiveNode,
260
+ onDragCancel,
261
+ isDraggingCardOnly,
262
+ dialogOpenForGroup,
263
+ setDialogOpenForGroup,
264
+ handleRenameGroup,
265
+ handleDialogClose,
266
+ isHoveringNewGroupDropZone,
267
+ setIsHoveringNewGroupDropZone
268
+ } = useHomePageDnd({
269
+ items,
270
+ setItems: updateItems,
271
+ disabled: !allowDragAndDrop || performingSearch,
272
+ onPersist: persistNavigationGroups,
273
+ onGroupMoved: (g) =>
274
+ context.analyticsController?.onAnalyticsEvent?.("home_move_group", {
275
+ name: g
276
+ }),
277
+ onCardMovedBetweenGroups: (card) =>
278
+ context.analyticsController?.onAnalyticsEvent?.("home_move_card", {
279
+ id: card.id
280
+ }),
281
+ onNewGroupDrop: () =>
282
+ context.analyticsController?.onAnalyticsEvent?.(
283
+ "home_drop_new_group"
284
+ )
285
+ });
286
+
287
+ const {
288
+ containerRef,
289
+ direction
290
+ } = useRestoreScroll();
291
+
292
+ const dndDisabled = !allowDragAndDrop || performingSearch;
293
+
294
+ const dndModifiers = dndKitActiveNode?.data.current?.type === "group"
295
+ ? [restrictToVerticalAxis, restrictToWindowEdges]
296
+ : [restrictToWindowEdges];
297
+
298
+ /* ───────────────────────────────────────────────────────────────
299
+ Plugin extras
300
+ ─────────────────────────────────────────────────────────────── */
301
+ let additionalPluginChildrenStart: React.ReactNode | undefined;
302
+ let additionalPluginChildrenEnd: React.ReactNode | undefined;
303
+ let additionalPluginSections: React.ReactNode | undefined;
304
+ let additionalPluginActions: React.ReactNode | undefined;
305
+
306
+ if (customizationController.plugins) {
307
+ const sectionProps: PluginGenericProps = { context };
308
+
309
+ additionalPluginSections = (
310
+ <>
311
+ {customizationController.plugins
312
+ .filter((p) => p.homePage?.includeSection)
313
+ .map((plugin) => {
314
+ const section = plugin.homePage!.includeSection!(
315
+ sectionProps
316
+ );
317
+ return (
318
+ <NavigationGroup
319
+ group={section.title}
320
+ key={`plugin_section_${plugin.key}`}
321
+ >
322
+ {section.children}
323
+ </NavigationGroup>
324
+ );
325
+ })}
326
+ </>
327
+ );
328
+
329
+ additionalPluginChildrenStart = (
330
+ <div className="flex flex-col gap-2">
331
+ {customizationController.plugins
332
+ .filter((p) => p.homePage?.additionalChildrenStart)
333
+ .map((plugin, i) => (
334
+ <div key={`plugin_children_start_${i}`}>
335
+ {plugin.homePage!.additionalChildrenStart}
336
+ </div>
337
+ ))}
338
+ </div>
339
+ );
340
+
341
+ additionalPluginChildrenEnd = (
342
+ <div className="flex flex-col gap-2">
343
+ {customizationController.plugins
344
+ .filter((p) => p.homePage?.additionalChildrenEnd)
345
+ .map((plugin, i) => (
346
+ <div key={`plugin_children_end_${i}`}>
347
+ {plugin.homePage!.additionalChildrenEnd}
348
+ </div>
349
+ ))}
350
+ </div>
351
+ );
352
+
353
+ // Collect additionalActions from plugins
354
+ additionalPluginActions = (
355
+ <>
356
+ {customizationController.plugins
357
+ .filter((p) => p.homePage?.additionalActions)
358
+ .map((plugin, i) => (
359
+ <React.Fragment key={`plugin_actions_${i}`}>
360
+ {plugin.homePage!.additionalActions}
361
+ </React.Fragment>
362
+ ))}
363
+ </>
364
+ );
365
+ }
366
+
367
+ /* ───────────────────────────────────────────────────────────────
368
+ Render
369
+ ─────────────────────────────────────────────────────────────── */
370
+ return (
371
+ <div ref={containerRef} className="py-2 overflow-auto h-full w-full">
372
+ <Container maxWidth="6xl">
373
+ {/* search & actions */}
374
+ <div
375
+ className="w-full sticky py-4 transition-all duration-400 ease-in-out top-0 z-10 flex flex-row gap-4"
376
+ style={{ top: direction === "down" ? -84 : 0 }}
377
+ >
378
+ <SearchBar
379
+ onTextSearch={updateSearch}
380
+ placeholder="Search collections"
381
+ autoFocus
382
+ innerClassName="w-full"
383
+ className="w-full grow"
384
+ />
385
+ {additionalActions}
386
+ {additionalPluginActions}
387
+ </div>
388
+
389
+ <FavouritesView hidden={performingSearch} />
390
+
391
+ {additionalChildrenStart}
392
+ {additionalPluginChildrenStart}
393
+
394
+ {/* ─────── DND context ─────── */}
395
+ <DndContext
396
+ sensors={sensors}
397
+ collisionDetection={collisionDetection}
398
+ measuring={{
399
+ droppable: {
400
+ strategy: MeasuringStrategy.Always,
401
+ frequency: 500
402
+ }
403
+ }}
404
+ onDragStart={onDragStart}
405
+ onDragOver={onDragOver}
406
+ onDragEnd={onDragEnd}
407
+ onDragCancel={onDragCancel}
408
+ modifiers={dndModifiers}
409
+ >
410
+ <SortableContext
411
+ key={JSON.stringify(containers)}
412
+ items={containers}
413
+ strategy={verticalListSortingStrategy}
414
+ >
415
+ {items.map((groupData, groupIndex) => {
416
+ const groupKey = groupData.name;
417
+ const entriesInGroup = groupData.entries;
418
+
419
+ const AdditionalCards: React.ComponentType<PluginHomePageAdditionalCardsProps>[] =
420
+ [];
421
+ customizationController.plugins?.forEach((p) => {
422
+ if (p.homePage?.AdditionalCards)
423
+ AdditionalCards.push(
424
+ ...toArray(p.homePage.AdditionalCards)
425
+ );
426
+ });
427
+
428
+ const actionProps: PluginHomePageAdditionalCardsProps = {
429
+ group:
430
+ groupKey === DEFAULT_GROUP_NAME
431
+ ? undefined
432
+ : groupKey,
433
+ context
434
+ };
435
+
436
+ if (
437
+ entriesInGroup.length === 0 &&
438
+ (AdditionalCards.length === 0 || performingSearch)
439
+ )
440
+ return null;
441
+
442
+ return (
443
+ <SortableNavigationGroup
444
+ key={`group-${groupIndex}`}
445
+ groupName={groupKey}
446
+ disabled={dndDisabled}
447
+ >
448
+ <NavigationGroup
449
+ group={
450
+ groupKey === DEFAULT_GROUP_NAME
451
+ ? undefined
452
+ : groupKey
453
+ }
454
+ minimised={
455
+ draggingGroupId === groupKey &&
456
+ !isDraggingCardOnly
457
+ }
458
+ isPotentialCardDropTarget={
459
+ isDraggingCardOnly
460
+ }
461
+ dndDisabled={dndDisabled}
462
+ onEditGroup={() => {
463
+ if (dndDisabled) return;
464
+ setDialogOpenForGroup(groupKey);
465
+ }}
466
+ collapsed={isGroupCollapsed(groupKey)}
467
+ onToggleCollapsed={() => toggleGroupCollapsed(groupKey)}
468
+ >
469
+ <NavigationGroupDroppable
470
+ id={groupKey}
471
+ itemIds={entriesInGroup.map(
472
+ (e) => e.url
473
+ )}
474
+ isPotentialCardDropTarget={
475
+ isDraggingCardOnly
476
+ }
477
+ >
478
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ">
479
+ {entriesInGroup.map(
480
+ (entry) => (
481
+ <SortableNavigationCard
482
+ key={entry.url}
483
+ entry={entry}
484
+ onClick={() => {
485
+ let event: CMSAnalyticsEvent =
486
+ "unmapped_event";
487
+ if (
488
+ entry.type ===
489
+ "collection"
490
+ )
491
+ event =
492
+ "home_navigate_to_collection";
493
+ else if (
494
+ entry.type ===
495
+ "view"
496
+ )
497
+ event =
498
+ "home_navigate_to_view";
499
+ else if (
500
+ entry.type ===
501
+ "admin"
502
+ )
503
+ event =
504
+ "home_navigate_to_admin_view";
505
+
506
+ context.analyticsController?.onAnalyticsEvent?.(
507
+ event,
508
+ {
509
+ path: entry.slug
510
+ }
511
+ );
512
+ }}
513
+ />
514
+ )
515
+ )}
516
+ {!performingSearch &&
517
+ groupKey.toLowerCase() !==
518
+ ADMIN_GROUP_NAME.toLowerCase() &&
519
+ AdditionalCards.map(
520
+ (C, i) => (
521
+ <C
522
+ key={`extra_${groupKey}_${i}`}
523
+ {...actionProps}
524
+ />
525
+ )
526
+ )}
527
+ </div>
528
+ </NavigationGroupDroppable>
529
+ </NavigationGroup>
530
+ </SortableNavigationGroup>
531
+ );
532
+ })}
533
+ </SortableContext>
534
+
535
+ <NewGroupDropZone
536
+ disabled={dndDisabled}
537
+ setIsHovering={setIsHoveringNewGroupDropZone}
538
+ />
539
+
540
+ <DragOverlay adjustScale={false} dropAnimation={dropAnimation}>
541
+ {activeGroupData &&
542
+ draggingGroupId === activeGroupData.name ? (
543
+ <div
544
+ className="rounded-lg bg-transparent"
545
+ style={{
546
+ padding: 0,
547
+ margin: 0
548
+ }}
549
+ >
550
+ <NavigationGroup
551
+ group={
552
+ activeGroupData.name ===
553
+ DEFAULT_GROUP_NAME
554
+ ? undefined
555
+ : activeGroupData.name
556
+ }
557
+ isPreview={false}
558
+ minimised
559
+ />
560
+ </div>
561
+ ) : activeItemForOverlay ? (
562
+ <NavigationCardBinding
563
+ {...activeItemForOverlay}
564
+ shrink={isHoveringNewGroupDropZone}
565
+ />
566
+ ) : null}
567
+ </DragOverlay>
568
+ </DndContext>
569
+
570
+ {!performingSearch && adminGroupData && (
571
+ <NavigationGroup
572
+ group={adminGroupData.name}
573
+ collapsed={isGroupCollapsed(adminGroupData.name)}
574
+ onToggleCollapsed={() => toggleGroupCollapsed(adminGroupData.name)}
575
+ >
576
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ">
577
+ {adminGroupData.entries.map((entry) => (
578
+ <NavigationCardBinding
579
+ key={entry.url}
580
+ {...entry}
581
+ onClick={() => {
582
+ let event: CMSAnalyticsEvent =
583
+ "unmapped_event";
584
+ if (entry.type === "collection")
585
+ event =
586
+ "home_navigate_to_collection";
587
+ else if (entry.type === "view")
588
+ event = "home_navigate_to_view";
589
+ else if (entry.type === "admin")
590
+ event =
591
+ "home_navigate_to_admin_view";
592
+
593
+ context.analyticsController?.onAnalyticsEvent?.(
594
+ event,
595
+ { path: entry.slug }
596
+ );
597
+ }}
598
+ />
599
+ ))}
600
+ </div>
601
+ </NavigationGroup>
602
+ )}
603
+
604
+ {additionalPluginSections}
605
+
606
+ {sections && sections.map((section) => (
607
+ <NavigationGroup
608
+ key={section.key}
609
+ group={section.title}
610
+ >
611
+ {section.children}
612
+ </NavigationGroup>
613
+ ))}
614
+
615
+ {additionalPluginChildrenEnd}
616
+ {additionalChildrenEnd}
617
+ </Container>
618
+
619
+ {dialogOpenForGroup && (
620
+ <RenameGroupDialog
621
+ open
622
+ initialName={dialogOpenForGroup}
623
+ existingGroupNames={items
624
+ .map((g) => g.name)
625
+ .filter((n) => n !== dialogOpenForGroup)}
626
+ onClose={handleDialogClose}
627
+ onRename={(newName) => {
628
+ handleRenameGroup(dialogOpenForGroup, newName);
629
+ }}
630
+ />
631
+ )}
632
+ </div>
633
+ );
634
+ }
@@ -0,0 +1,59 @@
1
+ import { useNavigate } from "react-router-dom";
2
+ import { useNavigationStateController } from "../../hooks";
3
+ import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
4
+ import { NavigationEntry } from "@rebasepro/types";
5
+ import { Chip, Collapse, StarIcon } from "@rebasepro/ui";
6
+
7
+ function NavigationChip({ entry }: { entry: NavigationEntry }) {
8
+
9
+ const navigate = useNavigate();
10
+ const userConfigurationPersistence = useUserConfigurationPersistence();
11
+
12
+ if (!userConfigurationPersistence)
13
+ return null;
14
+
15
+ const favourite = userConfigurationPersistence.favouritePaths.includes(entry.slug);
16
+ const onIconClick = (e: React.SyntheticEvent) => {
17
+ e.preventDefault();
18
+ e.stopPropagation();
19
+ if (favourite) {
20
+ userConfigurationPersistence.setFavouritePaths(
21
+ userConfigurationPersistence.favouritePaths.filter(p => p !== entry.slug)
22
+ );
23
+ } else {
24
+ userConfigurationPersistence.setFavouritePaths(
25
+ [...userConfigurationPersistence.favouritePaths, entry.slug]
26
+ );
27
+ }
28
+ };
29
+ return <Chip
30
+ key={entry.slug}
31
+ onClick={() => navigate(entry.url)}
32
+ icon={<StarIcon
33
+ onClick={onIconClick}
34
+ size={18}
35
+ className={favourite ? "text-secondary" : "text-surface-400 dark:text-surface-500"} />
36
+ }>
37
+ {entry.name}
38
+ </Chip>;
39
+ }
40
+
41
+ export function FavouritesView({ hidden }: { hidden: boolean }) {
42
+
43
+ const navigationController = useNavigationStateController();
44
+ const userConfigurationPersistence = useUserConfigurationPersistence();
45
+
46
+ if (!userConfigurationPersistence)
47
+ return null;
48
+
49
+ const favouriteCollections = (userConfigurationPersistence?.favouritePaths ?? [])
50
+ .map((path) => navigationController.topLevelNavigation?.navigationEntries.find((entry) => entry.slug === path))
51
+ .filter(Boolean) as NavigationEntry[];
52
+
53
+ return <Collapse in={favouriteCollections.length > 0}>
54
+ <div className="flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]">
55
+ {favouriteCollections.map((entry) => <NavigationChip key={entry.slug}
56
+ entry={entry} />)}
57
+ </div>
58
+ </Collapse>;
59
+ }