@rebasepro/admin 0.0.1-canary.000dc36

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 (780) hide show
  1. package/LICENSE +6 -0
  2. package/dist/CollectionEditorDialog-D509-IMx.js +4731 -0
  3. package/dist/CollectionEditorDialog-D509-IMx.js.map +1 -0
  4. package/dist/CollectionsStudioView-B549BDpU.js +218 -0
  5. package/dist/CollectionsStudioView-B549BDpU.js.map +1 -0
  6. package/dist/ContentHomePage--Bl1FXk7.js +1786 -0
  7. package/dist/ContentHomePage--Bl1FXk7.js.map +1 -0
  8. package/dist/ExportCollectionAction-CttNAdM1.js +439 -0
  9. package/dist/ExportCollectionAction-CttNAdM1.js.map +1 -0
  10. package/dist/ImportCollectionAction-BB33kxAN.js +686 -0
  11. package/dist/ImportCollectionAction-BB33kxAN.js.map +1 -0
  12. package/dist/PropertyEditView-UtDO8g0A.js +8138 -0
  13. package/dist/PropertyEditView-UtDO8g0A.js.map +1 -0
  14. package/dist/RoleChip-QtUFXeTp.js +67 -0
  15. package/dist/RoleChip-QtUFXeTp.js.map +1 -0
  16. package/dist/RolesView-B0E7L0hE.js +426 -0
  17. package/dist/RolesView-B0E7L0hE.js.map +1 -0
  18. package/dist/UsersView-BM2_7VPV.js +494 -0
  19. package/dist/UsersView-BM2_7VPV.js.map +1 -0
  20. package/dist/collection_editor/CollectionEditorDialogsContext.d.ts +19 -0
  21. package/dist/collection_editor/ConfigControllerProvider.d.ts +45 -0
  22. package/dist/collection_editor/_cms_internals.d.ts +29 -0
  23. package/dist/collection_editor/api/generateCollectionApi.d.ts +77 -0
  24. package/dist/collection_editor/api/index.d.ts +1 -0
  25. package/dist/collection_editor/index.d.ts +16 -0
  26. package/dist/collection_editor/pgColumnToProperty.d.ts +6 -0
  27. package/dist/collection_editor/types/collection_editor_controller.d.ts +59 -0
  28. package/dist/collection_editor/types/collection_inference.d.ts +10 -0
  29. package/dist/collection_editor/types/config_controller.d.ts +98 -0
  30. package/dist/collection_editor/types/config_permissions.d.ts +19 -0
  31. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +12 -0
  32. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +11 -0
  33. package/dist/collection_editor/ui/EditorCollectionAction.d.ts +2 -0
  34. package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +2 -0
  35. package/dist/collection_editor/ui/EditorEntityAction.d.ts +2 -0
  36. package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +2 -0
  37. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +11 -0
  38. package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +3 -0
  39. package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -0
  40. package/dist/collection_editor/ui/NewCollectionCard.d.ts +2 -0
  41. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +8 -0
  42. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +36 -0
  43. package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +20 -0
  44. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +12 -0
  45. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +73 -0
  46. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +19 -0
  47. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +7 -0
  48. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +17 -0
  49. package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +12 -0
  50. package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +1 -0
  51. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +5 -0
  52. package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +14 -0
  53. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +5 -0
  54. package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +3 -0
  55. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +5 -0
  56. package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +4 -0
  57. package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +4 -0
  58. package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +12 -0
  59. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +7 -0
  60. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +6 -0
  61. package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +4 -0
  62. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +5 -0
  63. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +47 -0
  64. package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +16 -0
  65. package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +31 -0
  66. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +12 -0
  67. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +8 -0
  68. package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +6 -0
  69. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +7 -0
  70. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +13 -0
  71. package/dist/collection_editor/ui/collection_editor/import/clean_import_data.d.ts +7 -0
  72. package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +7 -0
  73. package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +3 -0
  74. package/dist/collection_editor/ui/collection_editor/properties/CommonPropertyFields.d.ts +10 -0
  75. package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +3 -0
  76. package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +9 -0
  77. package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +3 -0
  78. package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +7 -0
  79. package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +4 -0
  80. package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +3 -0
  81. package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +14 -0
  82. package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +15 -0
  83. package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +9 -0
  84. package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +5 -0
  85. package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +5 -0
  86. package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +4 -0
  87. package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +3 -0
  88. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +10 -0
  89. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +3 -0
  90. package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +6 -0
  91. package/dist/collection_editor/ui/collection_editor/properties/conditions/index.d.ts +6 -0
  92. package/dist/collection_editor/ui/collection_editor/properties/conditions/property_paths.d.ts +19 -0
  93. package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +5 -0
  94. package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +4 -0
  95. package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +3 -0
  96. package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +11 -0
  97. package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.d.ts +3 -0
  98. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -0
  99. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -0
  100. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -0
  101. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -0
  102. package/dist/collection_editor/ui/collection_editor/util.d.ts +5 -0
  103. package/dist/collection_editor/ui/collection_editor/utils/strings.d.ts +1 -0
  104. package/dist/collection_editor/ui/collection_editor/utils/supported_fields.d.ts +3 -0
  105. package/dist/collection_editor/ui/collection_editor/utils/update_property_for_widget.d.ts +2 -0
  106. package/dist/collection_editor/useCollectionEditorController.d.ts +6 -0
  107. package/dist/collection_editor/useCollectionsConfigController.d.ts +6 -0
  108. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +6 -0
  109. package/dist/collection_editor/validateCollectionJson.d.ts +22 -0
  110. package/dist/collection_editor_ui.d.ts +8 -0
  111. package/dist/collection_editor_ui.js +11 -0
  112. package/dist/collection_editor_ui.js.map +1 -0
  113. package/dist/components/AdminModeSyncer.d.ts +17 -0
  114. package/dist/components/ArrayContainer.d.ts +58 -0
  115. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  116. package/dist/components/CollectionEditorDialogs.d.ts +15 -0
  117. package/dist/components/DefaultAppBar.d.ts +29 -0
  118. package/dist/components/DefaultDrawer.d.ts +29 -0
  119. package/dist/components/DeleteEntityDialog.d.ts +13 -0
  120. package/dist/components/DrawerNavigationGroup.d.ts +49 -0
  121. package/dist/components/DrawerNavigationItem.d.ts +10 -0
  122. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +39 -0
  123. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +27 -0
  124. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +129 -0
  125. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +26 -0
  126. package/dist/components/EntityCollectionTable/column_utils.d.ts +16 -0
  127. package/dist/components/EntityCollectionTable/fields/TableMultipleRelationField.d.ts +21 -0
  128. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +22 -0
  129. package/dist/components/EntityCollectionTable/fields/TableRelationField.d.ts +22 -0
  130. package/dist/components/EntityCollectionTable/fields/TableRelationSelectorField.d.ts +20 -0
  131. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +35 -0
  132. package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +12 -0
  133. package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +9 -0
  134. package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +8 -0
  135. package/dist/components/EntityCollectionTable/fields/VirtualTableSelect.d.ts +15 -0
  136. package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +7 -0
  137. package/dist/components/EntityCollectionTable/fields/VirtualTableUserSelect.d.ts +12 -0
  138. package/dist/components/EntityCollectionTable/index.d.ts +6 -0
  139. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +21 -0
  140. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +32 -0
  141. package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +9 -0
  142. package/dist/components/EntityCollectionTable/internal/common.d.ts +5 -0
  143. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +27 -0
  144. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +13 -0
  145. package/dist/components/EntityCollectionTable/internal/popup_field/useWindowSize.d.ts +6 -0
  146. package/dist/components/EntityCollectionTable/table_bindings.d.ts +28 -0
  147. package/dist/components/EntityCollectionView/Board.d.ts +2 -0
  148. package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
  149. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
  150. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
  151. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +31 -0
  152. package/dist/components/EntityCollectionView/EntityCard.d.ts +20 -0
  153. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +22 -0
  154. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +32 -0
  155. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +34 -0
  156. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +65 -0
  157. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +19 -0
  158. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +19 -0
  159. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +15 -0
  160. package/dist/components/EntityCollectionView/SplitListView.d.ts +58 -0
  161. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
  162. package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
  163. package/dist/components/EntityCollectionView/hooks/useCollectionInlineEditor.d.ts +12 -0
  164. package/dist/components/EntityCollectionView/hooks/useKanbanDragAndDrop.d.ts +19 -0
  165. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +61 -0
  166. package/dist/components/EntityCollectionView/useEntityPreviewSlots.d.ts +101 -0
  167. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  168. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  169. package/dist/components/EntityEditView.d.ts +50 -0
  170. package/dist/components/EntityEditViewFormActions.d.ts +2 -0
  171. package/dist/components/EntityJsonPreview.d.ts +3 -0
  172. package/dist/components/EntityPreview.d.ts +56 -0
  173. package/dist/components/EntitySidePanel.d.ts +10 -0
  174. package/dist/components/EntityView.d.ts +12 -0
  175. package/dist/components/FieldCaption.d.ts +5 -0
  176. package/dist/components/HomePage/ContentHomePage.d.ts +11 -0
  177. package/dist/components/HomePage/FavouritesView.d.ts +3 -0
  178. package/dist/components/HomePage/HomePageDnD.d.ts +77 -0
  179. package/dist/components/HomePage/NavigationCard.d.ts +11 -0
  180. package/dist/components/HomePage/NavigationCardBinding.d.ts +18 -0
  181. package/dist/components/HomePage/NavigationGroup.d.ts +11 -0
  182. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  183. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  184. package/dist/components/HomePage/index.d.ts +4 -0
  185. package/dist/components/PropertyCollectionView.d.ts +24 -0
  186. package/dist/components/PropertyConfigBadge.d.ts +6 -0
  187. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  188. package/dist/components/RebaseAuthGate.d.ts +21 -0
  189. package/dist/components/RebaseCMS.d.ts +10 -0
  190. package/dist/components/RebaseLayout.d.ts +32 -0
  191. package/dist/components/RebaseNavigation.d.ts +24 -0
  192. package/dist/components/RebaseRouteDefs.d.ts +30 -0
  193. package/dist/components/RebaseShell.d.ts +25 -0
  194. package/dist/components/ReferenceTable/EntitySelectionTable.d.ts +59 -0
  195. package/dist/components/ReferenceWidget.d.ts +30 -0
  196. package/dist/components/RelationSelector.d.ts +32 -0
  197. package/dist/components/SearchIconsView.d.ts +5 -0
  198. package/dist/components/SelectableTable/SelectableTable.d.ts +95 -0
  199. package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
  200. package/dist/components/SelectableTable/SelectionStore.d.ts +26 -0
  201. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -0
  202. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +12 -0
  203. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +15 -0
  204. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +12 -0
  205. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +13 -0
  206. package/dist/components/SideDialogs.d.ts +25 -0
  207. package/dist/components/SideEntityProvider.d.ts +32 -0
  208. package/dist/components/UserSelector.d.ts +18 -0
  209. package/dist/components/admin/RoleChip.d.ts +4 -0
  210. package/dist/components/admin/RolesView.d.ts +4 -0
  211. package/dist/components/admin/UsersView.d.ts +4 -0
  212. package/dist/components/admin/index.d.ts +3 -0
  213. package/dist/components/app/AppBar.d.ts +12 -0
  214. package/dist/components/app/Drawer.d.ts +19 -0
  215. package/dist/components/app/Scaffold.d.ts +34 -0
  216. package/dist/components/app/index.d.ts +4 -0
  217. package/dist/components/app/useApp.d.ts +17 -0
  218. package/dist/components/common/default_entity_actions.d.ts +4 -0
  219. package/dist/components/common/index.d.ts +1 -0
  220. package/dist/components/field_configs.d.ts +7 -0
  221. package/dist/components/history/EntityHistoryEntry.d.ts +17 -0
  222. package/dist/components/history/EntityHistoryView.d.ts +6 -0
  223. package/dist/components/history/LastEditedByFormAction.d.ts +6 -0
  224. package/dist/components/history/LastEditedByIndicator.d.ts +10 -0
  225. package/dist/components/history/UserChip.d.ts +4 -0
  226. package/dist/components/history/index.d.ts +5 -0
  227. package/dist/components/index.d.ts +38 -0
  228. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  229. package/dist/contexts/SideDialogsControllerContext.d.ts +3 -0
  230. package/dist/contexts/SideEntityControllerContext.d.ts +3 -0
  231. package/dist/data_export/export/BasicExportAction.d.ts +7 -0
  232. package/dist/data_export/export/ExportCollectionAction.d.ts +11 -0
  233. package/dist/data_export/export/export.d.ts +22 -0
  234. package/dist/data_export/export/index.d.ts +3 -0
  235. package/dist/data_export/index.d.ts +1 -0
  236. package/dist/data_import/components/DataNewPropertiesMapping.d.ts +13 -0
  237. package/dist/data_import/components/ImportFileUpload.d.ts +3 -0
  238. package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +9 -0
  239. package/dist/data_import/components/ImportSaveInProgress.d.ts +8 -0
  240. package/dist/data_import/components/index.d.ts +4 -0
  241. package/dist/data_import/hooks/index.d.ts +1 -0
  242. package/dist/data_import/hooks/useImportConfig.d.ts +2 -0
  243. package/dist/data_import/import/ImportCollectionAction.d.ts +15 -0
  244. package/dist/data_import/import/index.d.ts +1 -0
  245. package/dist/data_import/index.d.ts +5 -0
  246. package/dist/data_import/types/column_mapping.d.ts +20 -0
  247. package/dist/data_import/types/index.d.ts +1 -0
  248. package/dist/data_import/utils/data.d.ts +4 -0
  249. package/dist/data_import/utils/file_headers.d.ts +1 -0
  250. package/dist/data_import/utils/file_to_json.d.ts +16 -0
  251. package/dist/data_import/utils/get_import_inference_type.d.ts +2 -0
  252. package/dist/data_import/utils/get_properties_mapping.d.ts +1 -0
  253. package/dist/data_import/utils/index.d.ts +3 -0
  254. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  255. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  256. package/dist/editor/components/editor-bubble.d.ts +8 -0
  257. package/dist/editor/components/image-bubble.d.ts +5 -0
  258. package/dist/editor/components/index.d.ts +16 -0
  259. package/dist/editor/components/table-bubble.d.ts +5 -0
  260. package/dist/editor/editor.d.ts +30 -0
  261. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  262. package/dist/editor/extensions/Image/index.d.ts +6 -0
  263. package/dist/editor/extensions/Image.d.ts +6 -0
  264. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  265. package/dist/editor/extensions/clipboard.d.ts +7 -0
  266. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  267. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  268. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  269. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  270. package/dist/editor/index.d.ts +2 -0
  271. package/dist/editor/markdown.d.ts +5 -0
  272. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  273. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  274. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  275. package/dist/editor/nodeViews/index.d.ts +6 -0
  276. package/dist/editor/plugins/index.d.ts +2 -0
  277. package/dist/editor/plugins/inputrules.d.ts +6 -0
  278. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  279. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  280. package/dist/editor/schema.d.ts +2 -0
  281. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  282. package/dist/editor/selectors/color-selector.d.ts +10 -0
  283. package/dist/editor/selectors/link-selector.d.ts +8 -0
  284. package/dist/editor/selectors/node-selector.d.ts +15 -0
  285. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  286. package/dist/editor/types.d.ts +5 -0
  287. package/dist/editor/useProseMirror.d.ts +16 -0
  288. package/dist/editor/utils/prosemirror-utils.d.ts +7 -0
  289. package/dist/editor/utils/remove_classes.d.ts +1 -0
  290. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  291. package/dist/editor.js +3834 -0
  292. package/dist/editor.js.map +1 -0
  293. package/dist/form/EntityForm.d.ts +10 -0
  294. package/dist/form/EntityFormActions.d.ts +2 -0
  295. package/dist/form/PropertyFieldBinding.d.ts +30 -0
  296. package/dist/form/components/ErrorFocus.d.ts +4 -0
  297. package/dist/form/components/FieldHelperText.d.ts +12 -0
  298. package/dist/form/components/FormEntry.d.ts +6 -0
  299. package/dist/form/components/FormLayout.d.ts +5 -0
  300. package/dist/form/components/LabelWithIcon.d.ts +14 -0
  301. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  302. package/dist/form/components/LocalChangesMenu.d.ts +11 -0
  303. package/dist/form/components/StorageItemPreview.d.ts +14 -0
  304. package/dist/form/components/StorageUploadProgress.d.ts +10 -0
  305. package/dist/form/components/index.d.ts +5 -0
  306. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +10 -0
  307. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +13 -0
  308. package/dist/form/field_bindings/BlockFieldBinding.d.ts +11 -0
  309. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +12 -0
  310. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +8 -0
  311. package/dist/form/field_bindings/MapFieldBinding.d.ts +10 -0
  312. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +12 -0
  313. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +10 -0
  314. package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +10 -0
  315. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +11 -0
  316. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +10 -0
  317. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +10 -0
  318. package/dist/form/field_bindings/RelationFieldBinding.d.ts +3 -0
  319. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +11 -0
  320. package/dist/form/field_bindings/SelectFieldBinding.d.ts +11 -0
  321. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +21 -0
  322. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +10 -0
  323. package/dist/form/field_bindings/TextFieldBinding.d.ts +9 -0
  324. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +14 -0
  325. package/dist/form/index.d.ts +20 -0
  326. package/dist/form/useClearRestoreValue.d.ts +13 -0
  327. package/dist/form/validation.d.ts +21 -0
  328. package/dist/hooks/index.d.ts +15 -0
  329. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +5 -0
  330. package/dist/hooks/navigation/contexts/NavigationStateContext.d.ts +4 -0
  331. package/dist/hooks/navigation/contexts/UrlContext.d.ts +4 -0
  332. package/dist/hooks/navigation/contexts/index.d.ts +3 -0
  333. package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +7 -0
  334. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +34 -0
  335. package/dist/hooks/navigation/useBuildUrlController.d.ts +7 -0
  336. package/dist/hooks/navigation/useNavigationRegistry.d.ts +12 -0
  337. package/dist/hooks/navigation/useNavigationResolution.d.ts +7 -0
  338. package/dist/hooks/navigation/useNavigationURLs.d.ts +11 -0
  339. package/dist/hooks/navigation/useResolvedCollections.d.ts +28 -0
  340. package/dist/hooks/navigation/useResolvedViews.d.ts +29 -0
  341. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +27 -0
  342. package/dist/hooks/navigation/utils.d.ts +12 -0
  343. package/dist/hooks/useBreadcrumbsController.d.ts +42 -0
  344. package/dist/hooks/useBuildSideDialogsController.d.ts +2 -0
  345. package/dist/hooks/useBuildSideEntityController.d.ts +6 -0
  346. package/dist/hooks/useCMSContext.d.ts +27 -0
  347. package/dist/hooks/useEntityHistory.d.ts +30 -0
  348. package/dist/hooks/useEntitySelectionDialog.d.ts +18 -0
  349. package/dist/hooks/useResolvedNavigationFrom.d.ts +73 -0
  350. package/dist/hooks/useSideDialogsController.d.ts +19 -0
  351. package/dist/hooks/useSideEntityController.d.ts +11 -0
  352. package/dist/index-C9YDsMC9.js +8 -0
  353. package/dist/index-C9YDsMC9.js.map +1 -0
  354. package/dist/index-CNDetux9.js +463 -0
  355. package/dist/index-CNDetux9.js.map +1 -0
  356. package/dist/index-DO7lMeNB.js +12 -0
  357. package/dist/index-DO7lMeNB.js.map +1 -0
  358. package/dist/index.d.ts +12 -0
  359. package/dist/index.js +811 -0
  360. package/dist/index.js.map +1 -0
  361. package/dist/markdown-z2Ir7Cgo.js +618 -0
  362. package/dist/markdown-z2Ir7Cgo.js.map +1 -0
  363. package/dist/preview/PropertyPreview.d.ts +7 -0
  364. package/dist/preview/components/ArrayEnumPreview.d.ts +11 -0
  365. package/dist/preview/components/BooleanPreview.d.ts +11 -0
  366. package/dist/preview/components/DatePreview.d.ts +17 -0
  367. package/dist/preview/components/EmptyValue.d.ts +6 -0
  368. package/dist/preview/components/EnumValuesChip.d.ts +13 -0
  369. package/dist/preview/components/ImagePreview.d.ts +16 -0
  370. package/dist/preview/components/ReferencePreview.d.ts +17 -0
  371. package/dist/preview/components/RelationPreview.d.ts +17 -0
  372. package/dist/preview/components/StorageThumbnail.d.ts +15 -0
  373. package/dist/preview/components/UrlComponentPreview.d.ts +14 -0
  374. package/dist/preview/components/UserPreview.d.ts +9 -0
  375. package/dist/preview/index.d.ts +23 -0
  376. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +6 -0
  377. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +6 -0
  378. package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +6 -0
  379. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +6 -0
  380. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +6 -0
  381. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +6 -0
  382. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +6 -0
  383. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +6 -0
  384. package/dist/preview/property_previews/MapPropertyPreview.d.ts +9 -0
  385. package/dist/preview/property_previews/NumberPropertyPreview.d.ts +7 -0
  386. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +14 -0
  387. package/dist/preview/property_previews/StringPropertyPreview.d.ts +7 -0
  388. package/dist/preview/util.d.ts +7 -0
  389. package/dist/routes/CustomViewRoute.d.ts +4 -0
  390. package/dist/routes/RebaseRoute.d.ts +1 -0
  391. package/dist/routes/index.d.ts +2 -0
  392. package/dist/types/components/EntityFormActionsProps.d.ts +19 -0
  393. package/dist/types/components/EntityFormProps.d.ts +48 -0
  394. package/dist/types/components/PropertyPreviewProps.d.ts +47 -0
  395. package/dist/types/components/formex.d.ts +40 -0
  396. package/dist/types/components/index.d.ts +3 -0
  397. package/dist/types/fields.d.ts +221 -0
  398. package/dist/types/index.d.ts +2 -0
  399. package/dist/useEntityHistory-UVsSclfZ.js +123 -0
  400. package/dist/useEntityHistory-UVsSclfZ.js.map +1 -0
  401. package/dist/util/entity_actions.d.ts +2 -0
  402. package/dist/util/index.d.ts +5 -0
  403. package/dist/util/navigation_utils.d.ts +17 -0
  404. package/dist/util/previews.d.ts +4 -0
  405. package/dist/util/property_utils.d.ts +25 -0
  406. package/dist/util/resolutions.d.ts +9 -0
  407. package/dist/util-DK1O3uM0.js +28006 -0
  408. package/dist/util-DK1O3uM0.js.map +1 -0
  409. package/package.json +163 -0
  410. package/src/collection_editor/CollectionEditorDialogsContext.tsx +25 -0
  411. package/src/collection_editor/ConfigControllerProvider.tsx +407 -0
  412. package/src/collection_editor/_cms_internals.ts +41 -0
  413. package/src/collection_editor/api/generateCollectionApi.ts +125 -0
  414. package/src/collection_editor/api/index.ts +1 -0
  415. package/src/collection_editor/index.ts +63 -0
  416. package/src/collection_editor/pgColumnToProperty.ts +273 -0
  417. package/src/collection_editor/types/collection_editor_controller.tsx +64 -0
  418. package/src/collection_editor/types/collection_inference.ts +17 -0
  419. package/src/collection_editor/types/config_controller.tsx +109 -0
  420. package/src/collection_editor/types/config_permissions.ts +20 -0
  421. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +186 -0
  422. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +50 -0
  423. package/src/collection_editor/ui/EditorCollectionAction.tsx +58 -0
  424. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +93 -0
  425. package/src/collection_editor/ui/EditorEntityAction.tsx +54 -0
  426. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +122 -0
  427. package/src/collection_editor/ui/KanbanSetupAction.tsx +41 -0
  428. package/src/collection_editor/ui/MissingReferenceWidget.tsx +34 -0
  429. package/src/collection_editor/ui/NewCollectionButton.tsx +28 -0
  430. package/src/collection_editor/ui/NewCollectionCard.tsx +54 -0
  431. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +53 -0
  432. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +246 -0
  433. package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +90 -0
  434. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +416 -0
  435. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +977 -0
  436. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +286 -0
  437. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +164 -0
  438. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +589 -0
  439. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +347 -0
  440. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +242 -0
  441. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +102 -0
  442. package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +9 -0
  443. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +139 -0
  444. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +301 -0
  445. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +151 -0
  446. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +40 -0
  447. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +39 -0
  448. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +358 -0
  449. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +252 -0
  450. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +142 -0
  451. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +194 -0
  452. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +41 -0
  453. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +777 -0
  454. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +155 -0
  455. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +350 -0
  456. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +241 -0
  457. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +39 -0
  458. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +47 -0
  459. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +67 -0
  460. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +295 -0
  461. package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +57 -0
  462. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +147 -0
  463. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +41 -0
  464. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +113 -0
  465. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +250 -0
  466. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +125 -0
  467. package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +20 -0
  468. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +153 -0
  469. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +210 -0
  470. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +117 -0
  471. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +163 -0
  472. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +346 -0
  473. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +106 -0
  474. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +360 -0
  475. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +148 -0
  476. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +90 -0
  477. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +47 -0
  478. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +915 -0
  479. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +29 -0
  480. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +614 -0
  481. package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +6 -0
  482. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +93 -0
  483. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +52 -0
  484. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +63 -0
  485. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +117 -0
  486. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +154 -0
  487. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +29 -0
  488. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +112 -0
  489. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +183 -0
  490. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +88 -0
  491. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +42 -0
  492. package/src/collection_editor/ui/collection_editor/util.ts +28 -0
  493. package/src/collection_editor/ui/collection_editor/utils/strings.ts +1 -0
  494. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +34 -0
  495. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +281 -0
  496. package/src/collection_editor/useCollectionEditorController.tsx +9 -0
  497. package/src/collection_editor/useCollectionsConfigController.tsx +9 -0
  498. package/src/collection_editor/useLocalCollectionsConfigController.tsx +120 -0
  499. package/src/collection_editor/validateCollectionJson.ts +379 -0
  500. package/src/collection_editor_ui.ts +15 -0
  501. package/src/components/AdminModeSyncer.tsx +56 -0
  502. package/src/components/ArrayContainer.tsx +538 -0
  503. package/src/components/ClearFilterSortButton.tsx +48 -0
  504. package/src/components/CollectionEditorDialogs.tsx +68 -0
  505. package/src/components/DefaultAppBar.tsx +242 -0
  506. package/src/components/DefaultDrawer.tsx +347 -0
  507. package/src/components/DeleteEntityDialog.tsx +182 -0
  508. package/src/components/DrawerNavigationGroup.tsx +130 -0
  509. package/src/components/DrawerNavigationItem.tsx +65 -0
  510. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +233 -0
  511. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +385 -0
  512. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +171 -0
  513. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +340 -0
  514. package/src/components/EntityCollectionTable/column_utils.tsx +75 -0
  515. package/src/components/EntityCollectionTable/fields/TableMultipleRelationField.tsx +130 -0
  516. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +172 -0
  517. package/src/components/EntityCollectionTable/fields/TableRelationField.tsx +181 -0
  518. package/src/components/EntityCollectionTable/fields/TableRelationSelectorField.tsx +42 -0
  519. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +322 -0
  520. package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +39 -0
  521. package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +90 -0
  522. package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +80 -0
  523. package/src/components/EntityCollectionTable/fields/VirtualTableSelect.tsx +133 -0
  524. package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +32 -0
  525. package/src/components/EntityCollectionTable/fields/VirtualTableUserSelect.tsx +41 -0
  526. package/src/components/EntityCollectionTable/index.tsx +14 -0
  527. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +102 -0
  528. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +310 -0
  529. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +81 -0
  530. package/src/components/EntityCollectionTable/internal/common.tsx +73 -0
  531. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +418 -0
  532. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +96 -0
  533. package/src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx +22 -0
  534. package/src/components/EntityCollectionTable/table_bindings.tsx +346 -0
  535. package/src/components/EntityCollectionView/Board.tsx +474 -0
  536. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  537. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  538. package/src/components/EntityCollectionView/BoardSortableList.tsx +177 -0
  539. package/src/components/EntityCollectionView/EntityBoardCard.tsx +263 -0
  540. package/src/components/EntityCollectionView/EntityCard.tsx +224 -0
  541. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +642 -0
  542. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +267 -0
  543. package/src/components/EntityCollectionView/EntityCollectionListView.tsx +918 -0
  544. package/src/components/EntityCollectionView/EntityCollectionView.tsx +1328 -0
  545. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +180 -0
  546. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +153 -0
  547. package/src/components/EntityCollectionView/FiltersDialog.tsx +242 -0
  548. package/src/components/EntityCollectionView/SplitListView.tsx +330 -0
  549. package/src/components/EntityCollectionView/ViewModeToggle.tsx +199 -0
  550. package/src/components/EntityCollectionView/board_types.ts +113 -0
  551. package/src/components/EntityCollectionView/hooks/useCollectionInlineEditor.ts +79 -0
  552. package/src/components/EntityCollectionView/hooks/useKanbanDragAndDrop.ts +140 -0
  553. package/src/components/EntityCollectionView/useBoardDataController.tsx +675 -0
  554. package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +442 -0
  555. package/src/components/EntityCollectionView/useSelectionController.tsx +39 -0
  556. package/src/components/EntityCollectionView/utils.ts +19 -0
  557. package/src/components/EntityEditView.tsx +633 -0
  558. package/src/components/EntityEditViewFormActions.tsx +352 -0
  559. package/src/components/EntityJsonPreview.tsx +66 -0
  560. package/src/components/EntityPreview.tsx +372 -0
  561. package/src/components/EntitySidePanel.tsx +164 -0
  562. package/src/components/EntityView.tsx +69 -0
  563. package/src/components/FieldCaption.tsx +14 -0
  564. package/src/components/HomePage/ContentHomePage.tsx +567 -0
  565. package/src/components/HomePage/FavouritesView.tsx +61 -0
  566. package/src/components/HomePage/HomePageDnD.tsx +703 -0
  567. package/src/components/HomePage/NavigationCard.tsx +88 -0
  568. package/src/components/HomePage/NavigationCardBinding.tsx +108 -0
  569. package/src/components/HomePage/NavigationGroup.tsx +157 -0
  570. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  571. package/src/components/HomePage/SmallNavigationCard.tsx +46 -0
  572. package/src/components/HomePage/index.tsx +5 -0
  573. package/src/components/PropertyCollectionView.tsx +335 -0
  574. package/src/components/PropertyConfigBadge.tsx +27 -0
  575. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  576. package/src/components/RebaseAuthGate.tsx +42 -0
  577. package/src/components/RebaseCMS.tsx +27 -0
  578. package/src/components/RebaseLayout.tsx +73 -0
  579. package/src/components/RebaseNavigation.tsx +230 -0
  580. package/src/components/RebaseRouteDefs.tsx +130 -0
  581. package/src/components/RebaseShell.tsx +70 -0
  582. package/src/components/ReferenceTable/EntitySelectionTable.tsx +363 -0
  583. package/src/components/ReferenceWidget.tsx +155 -0
  584. package/src/components/RelationSelector.tsx +672 -0
  585. package/src/components/SearchIconsView.tsx +96 -0
  586. package/src/components/SelectableTable/SelectableTable.tsx +356 -0
  587. package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
  588. package/src/components/SelectableTable/SelectionStore.ts +67 -0
  589. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +51 -0
  590. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +125 -0
  591. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +208 -0
  592. package/src/components/SelectableTable/filters/RelationFilterField.tsx +138 -0
  593. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +221 -0
  594. package/src/components/SideDialogs.tsx +208 -0
  595. package/src/components/SideEntityProvider.tsx +76 -0
  596. package/src/components/UserSelector.tsx +339 -0
  597. package/src/components/admin/RoleChip.tsx +23 -0
  598. package/src/components/admin/RolesView.tsx +426 -0
  599. package/src/components/admin/UsersView.tsx +785 -0
  600. package/src/components/admin/index.ts +3 -0
  601. package/src/components/app/AppBar.tsx +17 -0
  602. package/src/components/app/Drawer.tsx +30 -0
  603. package/src/components/app/Scaffold.tsx +242 -0
  604. package/src/components/app/index.ts +4 -0
  605. package/src/components/app/useApp.tsx +36 -0
  606. package/src/components/common/default_entity_actions.tsx +156 -0
  607. package/src/components/common/index.ts +1 -0
  608. package/src/components/field_configs.tsx +420 -0
  609. package/src/components/history/EntityHistoryEntry.tsx +182 -0
  610. package/src/components/history/EntityHistoryView.tsx +202 -0
  611. package/src/components/history/LastEditedByFormAction.tsx +24 -0
  612. package/src/components/history/LastEditedByIndicator.tsx +98 -0
  613. package/src/components/history/UserChip.tsx +15 -0
  614. package/src/components/history/index.tsx +5 -0
  615. package/src/components/index.ts +55 -0
  616. package/src/contexts/BreacrumbsContext.tsx +53 -0
  617. package/src/contexts/SideDialogsControllerContext.tsx +5 -0
  618. package/src/contexts/SideEntityControllerContext.tsx +5 -0
  619. package/src/data_export/export/BasicExportAction.tsx +143 -0
  620. package/src/data_export/export/ExportCollectionAction.tsx +266 -0
  621. package/src/data_export/export/export.ts +248 -0
  622. package/src/data_export/export/index.ts +3 -0
  623. package/src/data_export/index.ts +1 -0
  624. package/src/data_import/components/DataNewPropertiesMapping.tsx +231 -0
  625. package/src/data_import/components/ImportFileUpload.tsx +43 -0
  626. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +60 -0
  627. package/src/data_import/components/ImportSaveInProgress.tsx +121 -0
  628. package/src/data_import/components/index.ts +4 -0
  629. package/src/data_import/hooks/index.ts +1 -0
  630. package/src/data_import/hooks/useImportConfig.tsx +34 -0
  631. package/src/data_import/import/ImportCollectionAction.tsx +436 -0
  632. package/src/data_import/import/index.ts +1 -0
  633. package/src/data_import/index.ts +5 -0
  634. package/src/data_import/types/column_mapping.ts +32 -0
  635. package/src/data_import/types/index.ts +1 -0
  636. package/src/data_import/utils/data.ts +148 -0
  637. package/src/data_import/utils/file_headers.ts +90 -0
  638. package/src/data_import/utils/file_to_json.ts +106 -0
  639. package/src/data_import/utils/get_import_inference_type.ts +27 -0
  640. package/src/data_import/utils/get_properties_mapping.ts +67 -0
  641. package/src/data_import/utils/index.ts +3 -0
  642. package/src/editor/components/SlashCommandMenu.tsx +517 -0
  643. package/src/editor/components/editor-bubble-item.tsx +32 -0
  644. package/src/editor/components/editor-bubble.tsx +120 -0
  645. package/src/editor/components/image-bubble.tsx +165 -0
  646. package/src/editor/components/index.ts +14 -0
  647. package/src/editor/components/table-bubble.tsx +171 -0
  648. package/src/editor/editor.tsx +510 -0
  649. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  650. package/src/editor/extensions/Image/index.ts +133 -0
  651. package/src/editor/extensions/Image.ts +159 -0
  652. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  653. package/src/editor/extensions/clipboard.ts +72 -0
  654. package/src/editor/extensions/custom-keymap.ts +25 -0
  655. package/src/editor/extensions/drag-and-drop.tsx +508 -0
  656. package/src/editor/hooks/useProseMirror.ts +126 -0
  657. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  658. package/src/editor/index.ts +2 -0
  659. package/src/editor/markdown.ts +205 -0
  660. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  661. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  662. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  663. package/src/editor/nodeViews/index.ts +35 -0
  664. package/src/editor/plugins/index.ts +58 -0
  665. package/src/editor/plugins/inputrules.ts +82 -0
  666. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  667. package/src/editor/plugins/slashCommandPlugin.ts +65 -0
  668. package/src/editor/schema.ts +263 -0
  669. package/src/editor/selectors/ai-selector.tsx +111 -0
  670. package/src/editor/selectors/color-selector.tsx +200 -0
  671. package/src/editor/selectors/link-selector.tsx +119 -0
  672. package/src/editor/selectors/node-selector.tsx +145 -0
  673. package/src/editor/selectors/text-buttons.tsx +80 -0
  674. package/src/editor/types.ts +6 -0
  675. package/src/editor/useProseMirror.ts +125 -0
  676. package/src/editor/utils/prosemirror-utils.ts +113 -0
  677. package/src/editor/utils/remove_classes.ts +17 -0
  678. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  679. package/src/form/EntityForm.tsx +856 -0
  680. package/src/form/EntityFormActions.tsx +214 -0
  681. package/src/form/PropertyFieldBinding.tsx +344 -0
  682. package/src/form/components/ErrorFocus.tsx +44 -0
  683. package/src/form/components/FieldHelperText.tsx +85 -0
  684. package/src/form/components/FormEntry.tsx +22 -0
  685. package/src/form/components/FormLayout.tsx +16 -0
  686. package/src/form/components/LabelWithIcon.tsx +43 -0
  687. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  688. package/src/form/components/LocalChangesMenu.tsx +132 -0
  689. package/src/form/components/StorageItemPreview.tsx +82 -0
  690. package/src/form/components/StorageUploadProgress.tsx +105 -0
  691. package/src/form/components/index.tsx +5 -0
  692. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +107 -0
  693. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +171 -0
  694. package/src/form/field_bindings/BlockFieldBinding.tsx +280 -0
  695. package/src/form/field_bindings/DateTimeFieldBinding.tsx +72 -0
  696. package/src/form/field_bindings/KeyValueFieldBinding.tsx +554 -0
  697. package/src/form/field_bindings/MapFieldBinding.tsx +162 -0
  698. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +232 -0
  699. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +123 -0
  700. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +157 -0
  701. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +66 -0
  702. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +141 -0
  703. package/src/form/field_bindings/ReferenceFieldBinding.tsx +141 -0
  704. package/src/form/field_bindings/RelationFieldBinding.tsx +184 -0
  705. package/src/form/field_bindings/RepeatFieldBinding.tsx +139 -0
  706. package/src/form/field_bindings/SelectFieldBinding.tsx +110 -0
  707. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +493 -0
  708. package/src/form/field_bindings/SwitchFieldBinding.tsx +65 -0
  709. package/src/form/field_bindings/TextFieldBinding.tsx +156 -0
  710. package/src/form/field_bindings/UserSelectFieldBinding.tsx +66 -0
  711. package/src/form/index.tsx +27 -0
  712. package/src/form/useClearRestoreValue.tsx +36 -0
  713. package/src/form/validation.ts +519 -0
  714. package/src/hooks/index.ts +15 -0
  715. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +21 -0
  716. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +16 -0
  717. package/src/hooks/navigation/contexts/UrlContext.tsx +25 -0
  718. package/src/hooks/navigation/contexts/index.ts +14 -0
  719. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +183 -0
  720. package/src/hooks/navigation/useBuildNavigationStateController.tsx +133 -0
  721. package/src/hooks/navigation/useBuildUrlController.tsx +66 -0
  722. package/src/hooks/navigation/useNavigationRegistry.ts +164 -0
  723. package/src/hooks/navigation/useNavigationResolution.ts +91 -0
  724. package/src/hooks/navigation/useNavigationURLs.ts +56 -0
  725. package/src/hooks/navigation/useResolvedCollections.ts +133 -0
  726. package/src/hooks/navigation/useResolvedViews.tsx +216 -0
  727. package/src/hooks/navigation/useTopLevelNavigation.ts +257 -0
  728. package/src/hooks/navigation/utils.ts +176 -0
  729. package/src/hooks/useBreadcrumbsController.tsx +49 -0
  730. package/src/hooks/useBuildSideDialogsController.tsx +145 -0
  731. package/src/hooks/useBuildSideEntityController.tsx +310 -0
  732. package/src/hooks/useCMSContext.tsx +79 -0
  733. package/src/hooks/useEntityHistory.ts +172 -0
  734. package/src/hooks/useEntitySelectionDialog.tsx +57 -0
  735. package/src/hooks/useResolvedNavigationFrom.tsx +160 -0
  736. package/src/hooks/useSideDialogsController.tsx +25 -0
  737. package/src/hooks/useSideEntityController.tsx +13 -0
  738. package/src/index.ts +95 -0
  739. package/src/preview/PropertyPreview.tsx +292 -0
  740. package/src/preview/components/ArrayEnumPreview.tsx +39 -0
  741. package/src/preview/components/BooleanPreview.tsx +25 -0
  742. package/src/preview/components/DatePreview.tsx +93 -0
  743. package/src/preview/components/EmptyValue.tsx +10 -0
  744. package/src/preview/components/EnumValuesChip.tsx +39 -0
  745. package/src/preview/components/ImagePreview.tsx +143 -0
  746. package/src/preview/components/ReferencePreview.tsx +166 -0
  747. package/src/preview/components/RelationPreview.tsx +160 -0
  748. package/src/preview/components/StorageThumbnail.tsx +93 -0
  749. package/src/preview/components/UrlComponentPreview.tsx +115 -0
  750. package/src/preview/components/UserPreview.tsx +30 -0
  751. package/src/preview/index.ts +25 -0
  752. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +73 -0
  753. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +44 -0
  754. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +50 -0
  755. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +49 -0
  756. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +44 -0
  757. package/src/preview/property_previews/ArrayOneOfPreview.tsx +72 -0
  758. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +35 -0
  759. package/src/preview/property_previews/ArrayPropertyPreview.tsx +70 -0
  760. package/src/preview/property_previews/MapPropertyPreview.tsx +146 -0
  761. package/src/preview/property_previews/NumberPropertyPreview.tsx +29 -0
  762. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +277 -0
  763. package/src/preview/property_previews/StringPropertyPreview.tsx +59 -0
  764. package/src/preview/util.ts +30 -0
  765. package/src/routes/CustomViewRoute.tsx +24 -0
  766. package/src/routes/RebaseRoute.tsx +365 -0
  767. package/src/routes/index.ts +2 -0
  768. package/src/types/components/EntityFormActionsProps.tsx +20 -0
  769. package/src/types/components/EntityFormProps.tsx +54 -0
  770. package/src/types/components/PropertyPreviewProps.tsx +59 -0
  771. package/src/types/components/formex.tsx +46 -0
  772. package/src/types/components/index.ts +3 -0
  773. package/src/types/fields.tsx +299 -0
  774. package/src/types/index.ts +4 -0
  775. package/src/util/entity_actions.ts +28 -0
  776. package/src/util/index.ts +5 -0
  777. package/src/util/navigation_utils.ts +74 -0
  778. package/src/util/previews.ts +50 -0
  779. package/src/util/property_utils.tsx +215 -0
  780. package/src/util/resolutions.ts +71 -0
@@ -0,0 +1,1328 @@
1
+
2
+ import type { AdditionalFieldDelegate, EntityCollection } from "@rebasepro/types";
3
+ import type { EntityAction, Property } from "@rebasepro/types";
4
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
5
+
6
+ import { deepEqual as equal } from "fast-equals"
7
+
8
+ const EMPTY_ARRAY: any[] = [];
9
+ const DEFAULT_ENTITY_OPEN_MODE = "split";
10
+
11
+ import { CollectionSize, Entity, EntityReference, EntityTableController, FilterValues, PartialEntityCollection, SaveEntityProps, ViewMode } from "@rebasepro/types";
12
+ import {
13
+ EntityCollectionRowActions,
14
+ EntityCollectionTable
15
+ } from "../EntityCollectionTable";
16
+ import { CollectionTableToolbar } from "../EntityCollectionTable/internal/CollectionTableToolbar";
17
+ import { getSubcollections } from "@rebasepro/common";
18
+ import { useCollectionInlineEditor } from "./hooks/useCollectionInlineEditor";
19
+ import { navigateToEntity } from "../../util/navigation_utils";
20
+ import { mergeEntityActions } from "../../util/entity_actions";
21
+ import { resolveEntityAction } from "../../util/resolutions";
22
+ import { getPropertyInPath } from "../../util/property_utils";
23
+ import { ReferencePreview } from "../../preview";
24
+ import {
25
+ saveEntityWithCallbacks,
26
+ useAuthController,
27
+ useCustomizationController,
28
+ useData,
29
+ useDataTableController,
30
+ useLargeLayout,
31
+ usePermissions,
32
+ useTranslation,
33
+ useSlot
34
+ } from "@rebasepro/core";
35
+ import { useUserConfigurationPersistence } from "@rebasepro/core";
36
+ import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
37
+ import { EntityCollectionCardView } from "./EntityCollectionCardView";
38
+ import { EntityCollectionListView } from "./EntityCollectionListView";
39
+ import { SplitListView } from "./SplitListView";
40
+ import { EntityCollectionBoardView } from "./EntityCollectionBoardView";
41
+ import { ViewModeToggle, KanbanPropertyOption } from "./ViewModeToggle";
42
+ import { Button, cls, focusedDisabled, IconButton, Markdown, Popover, Skeleton, Tooltip, Typography, VirtualTableColumn , iconSize } from "@rebasepro/ui";
43
+ import { PlusIcon, ArrowRightToLineIcon, SearchIcon } from "lucide-react";
44
+ import { setIn } from "@rebasepro/formex";
45
+ import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
46
+ import {
47
+ copyEntityAction,
48
+ deleteEntityAction,
49
+ editEntityAction
50
+ } from "../common/default_entity_actions";
51
+ import { OnCellValueChange, OnColumnResizeParams, UniqueFieldValidator } from "@rebasepro/core";
52
+ import { useColumnIds } from "@rebasepro/core";
53
+ import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
54
+ import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
55
+ import { DeleteEntityDialog } from "../DeleteEntityDialog";
56
+ import { useAnalyticsController } from "@rebasepro/core";
57
+ import { useSelectionController } from "./useSelectionController";
58
+ import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
59
+ import { addRecentId, getRecentIds } from "./utils";
60
+ import { useScrollRestoration } from "@rebasepro/core";
61
+ import { ErrorBoundary } from "@rebasepro/ui";
62
+ import { mergeDeep } from "@rebasepro/utils";
63
+ import { useCollectionRegistryController, useUrlController, useSideEntityController, useCMSContext } from "../../index";
64
+ import { useBreadcrumbsController } from "../../index";
65
+
66
+ function getOpenEntityMode(
67
+ viewMode: ViewMode,
68
+ configuredMode?: "side_panel" | "full_screen" | "split"
69
+ ): "side_panel" | "full_screen" | "split" {
70
+ if (configuredMode) return configuredMode;
71
+ if (viewMode === "kanban") return "side_panel";
72
+ if (viewMode === "table" || viewMode === "cards") return "full_screen";
73
+ // "list" view defaults to split
74
+ return "split";
75
+ }
76
+
77
+ /**
78
+ * @group Components
79
+ */
80
+ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
81
+ /**
82
+ * Complete path where this collection is located.
83
+ * It defaults to the collection path if not provided.
84
+ */
85
+ path?: string;
86
+ /**
87
+ * Full path using navigation ids.
88
+ */
89
+ idPath?: string;
90
+ /**
91
+ * If this is a subcollection, specify the parent collection ids.
92
+ */
93
+ parentCollectionSlugs?: string[], parentEntityIds?: string[];
94
+ /**
95
+ * Whether this is a subcollection or not.
96
+ */
97
+ isSubCollection?: boolean;
98
+
99
+ className?: string;
100
+
101
+ /**
102
+ * If true, this view will store its filter and sorting status in the url params
103
+ */
104
+ updateUrl?: boolean;
105
+
106
+ /**
107
+ * When provided, the split view will render this entity's detail panel.
108
+ * Used by the router to pass the entity ID from the URL path.
109
+ */
110
+ selectedEntityId?: string | number;
111
+
112
+ /**
113
+ * When provided, the split view will open this tab (e.g. a subcollection slug)
114
+ * in the entity detail panel. Used by the router to pass the subcollection from the URL.
115
+ */
116
+ selectedTab?: string;
117
+
118
+ } & EntityCollection<M>;
119
+
120
+ /**
121
+ * This component is in charge of binding a driver path with an {@link EntityCollection}
122
+ * where it's configuration is defined. It includes an infinite scrolling table
123
+ * and a 'Add' new entities button,
124
+ *
125
+ * This component is the default one used for displaying entity collections
126
+ * and is in charge of generating all the specific actions and customization
127
+ * of the lower level {@link EntityCollectionTable}
128
+ *
129
+ * Please **note** that you only need to use this component if you are building
130
+ * a custom view. If you just need to create a default view you can do it
131
+ * exclusively with config options.
132
+ *
133
+ * If you need a lower level implementation with more granular options, you
134
+ * can use {@link EntityCollectionTable}.
135
+ *
136
+ * If you need a generic table that is not bound to the driver or entities and
137
+ * properties at all, you can check {@link VirtualTable}
138
+ *
139
+ * @param path
140
+ * @param collection
141
+
142
+ * @group Components
143
+ */
144
+ export const EntityCollectionView = React.memo(
145
+ function EntityCollectionView<M extends Record<string, unknown>>({
146
+ path: pathProp,
147
+
148
+ parentCollectionSlugs, parentEntityIds,
149
+ isSubCollection,
150
+ className,
151
+ updateUrl,
152
+ selectedEntityId: selectedEntityIdProp,
153
+ selectedTab: selectedTabProp,
154
+ ...collectionProp
155
+ }: EntityCollectionViewProps<M>
156
+ ) {
157
+
158
+ const { t } = useTranslation();
159
+ const context = useCMSContext();
160
+ const collectionRegistry = useCollectionRegistryController();
161
+ const urlController = useUrlController();
162
+ const breadcrumbs = useBreadcrumbsController();
163
+ const path = pathProp ?? collectionProp.slug;
164
+ const dataClient = useData();
165
+ const sideEntityController = useSideEntityController();
166
+ const authController = useAuthController();
167
+ const userConfigPersistence = useUserConfigurationPersistence();
168
+ const analyticsController = useAnalyticsController();
169
+ const customizationController = useCustomizationController();
170
+ const { canCreate, canEdit, canDelete } = usePermissions();
171
+
172
+ const containerRef = React.useRef<HTMLDivElement>(null);
173
+
174
+ const scrollRestoration = useScrollRestoration();
175
+
176
+ const collection = useMemo(() => {
177
+ const registryCollection = collectionRegistry.getCollection(path) || collectionProp;
178
+ const userOverride = userConfigPersistence?.getCollectionConfig<M>(path);
179
+ return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as EntityCollection<M>;
180
+ }, [collectionProp, path, userConfigPersistence, collectionRegistry]);
181
+
182
+ const collectionRef = React.useRef(collection);
183
+ useEffect(() => {
184
+ collectionRef.current = collection;
185
+ }, [collection]);
186
+
187
+ const canCreateEntities = canCreate(collection, path);
188
+ const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);
189
+ const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);
190
+
191
+ const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);
192
+
193
+ // Track recently deleted entities for optimistic Kanban count updates
194
+ const [deletedEntities, setDeletedEntities] = React.useState<Entity<M>[]>([]);
195
+
196
+ // number of entities in the collection (undefined = loading)
197
+ const [docsCount, setDocsCount] = useState<number | null | undefined>(null);
198
+
199
+ // Optimistic state for column order to prevent UI flickering during persistence
200
+ const [localPropertiesOrder, setLocalPropertiesOrder] = useState<string[] | undefined>(collection.propertiesOrder);
201
+
202
+ // Sync local state with collection's propertiesOrder when it changes from external sources
203
+ useEffect(() => {
204
+ setLocalPropertiesOrder(collection.propertiesOrder);
205
+ }, [collection.propertiesOrder]);
206
+
207
+ const unselectNavigatedEntity = useCallback(() => {
208
+ const currentSelection = highlightedEntity;
209
+ setTimeout(() => {
210
+ if (currentSelection === highlightedEntity)
211
+ setHighlightedEntity(undefined);
212
+ }, 2400);
213
+ }, [highlightedEntity]);
214
+
215
+ const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
216
+ const collection = collectionRef.current;
217
+ if (!canEdit(collection, path, entity ?? null)) {
218
+ return false;
219
+ }
220
+ return collection.inlineEditing === undefined || collection.inlineEditing;
221
+ }, [canEdit, path]);
222
+
223
+ const selectionEnabled = collection.selectionEnabled === undefined || collection.selectionEnabled;
224
+ const hoverRow = !checkInlineEditing();
225
+
226
+ const [popOverOpen, setPopOverOpen] = useState(false);
227
+
228
+ // View mode priority: URL > saved user config > collection.defaultViewMode
229
+ const defaultViewMode = collection.defaultViewMode ?? "list";
230
+
231
+ // Parse view from URL
232
+ const getViewFromUrl = useCallback((): ViewMode | null => {
233
+ const params = new URLSearchParams(window.location.search);
234
+ const urlView = params.get("__view");
235
+ if (urlView && ["list", "table", "kanban", "cards"].includes(urlView)) {
236
+ return urlView as ViewMode;
237
+ }
238
+ return null;
239
+ }, []);
240
+
241
+ // Get saved view from local persistence
242
+ const getSavedView = useCallback((): ViewMode | null => {
243
+ const saved = userConfigPersistence?.getCollectionConfig<M>(path)?.defaultViewMode;
244
+ return (saved as ViewMode) ?? null;
245
+ }, [userConfigPersistence, path]);
246
+
247
+ const [viewMode, setViewModeState] = useState<ViewMode>(() => {
248
+ // Priority: URL > saved config > collection default
249
+ const urlView = getViewFromUrl();
250
+ if (urlView) return urlView;
251
+ const savedView = getSavedView();
252
+ if (savedView) return savedView;
253
+ return defaultViewMode;
254
+ });
255
+
256
+ const openEntityMode = getOpenEntityMode(viewMode, collection?.openEntityMode);
257
+
258
+ // Sync URL with current view on init (if view came from saved config)
259
+ useEffect(() => {
260
+ const urlView = getViewFromUrl();
261
+ if (!urlView && viewMode !== defaultViewMode) {
262
+ // View came from saved config but URL doesn't have it - update URL without push
263
+ const url = new URL(window.location.href);
264
+ url.searchParams.set("__view", viewMode);
265
+ window.history.replaceState({}, "", url.toString());
266
+ }
267
+ }, []); // Only on mount
268
+
269
+ // Update URL when view mode changes (user action)
270
+ const setViewMode = useCallback((newMode: ViewMode) => {
271
+ setViewModeState(newMode);
272
+
273
+ // Update URL with __view param
274
+ const url = new URL(window.location.href);
275
+ if (newMode === defaultViewMode) {
276
+ url.searchParams.delete("__view");
277
+ } else {
278
+ url.searchParams.set("__view", newMode);
279
+ }
280
+ window.history.pushState({}, "", url.toString());
281
+ }, [defaultViewMode]);
282
+
283
+ // Listen for browser back/forward
284
+ useEffect(() => {
285
+ const handlePopState = () => {
286
+ const urlView = getViewFromUrl();
287
+ if (urlView) {
288
+ // URL has explicit view - use it
289
+ setViewModeState(urlView);
290
+ } else {
291
+ // No URL param - fallback to saved config or collection default
292
+ const savedView = getSavedView();
293
+ setViewModeState(savedView ?? defaultViewMode);
294
+ }
295
+ };
296
+
297
+ window.addEventListener("popstate", handlePopState);
298
+ return () => window.removeEventListener("popstate", handlePopState);
299
+ }, [getViewFromUrl, getSavedView, defaultViewMode]);
300
+
301
+ // List view size state - controls row height and info density
302
+ const [listSize, setListSize] = useState<CollectionSize>(collection.defaultSize ?? "m");
303
+
304
+ // Card view size state - controls the grid column count
305
+ const [cardSize, setCardSize] = useState<CollectionSize>(collection.defaultSize ?? "m");
306
+
307
+ // Table view size state - controls row height
308
+ const [tableSize, setTableSize] = useState<CollectionSize>(collection.defaultSize ?? "m");
309
+
310
+ const selectionController = useSelectionController<M>();
311
+ const usedSelectionController = collection.selectionController ?? selectionController;
312
+ const {
313
+ selectedEntities,
314
+ setSelectedEntities
315
+ } = usedSelectionController;
316
+
317
+ const tableController = useDataTableController<M>({
318
+ path,
319
+ collection,
320
+ lastDeleteTimestamp,
321
+ scrollRestoration,
322
+ updateUrl
323
+ });
324
+
325
+ const tableKey = React.useRef<string>(Math.random().toString(36));
326
+ const popupCell = tableController.popupCell as {
327
+ entityId: string | number;
328
+ propertyKey: Extract<keyof M, string>;
329
+ cellRect?: DOMRect;
330
+ } | undefined;
331
+
332
+ const onPopupClose = useCallback(() => {
333
+ tableController.setPopupCell?.(undefined);
334
+ }, [tableController.setPopupCell]);
335
+
336
+ const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
337
+ const collection = collectionRef.current;
338
+ setHighlightedEntity(clickedEntity);
339
+ analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
340
+ path: clickedEntity.path,
341
+ entityId: clickedEntity.id
342
+ });
343
+
344
+ if (collection) {
345
+ addRecentId(collection.slug, clickedEntity.id);
346
+ }
347
+
348
+ const entityPath = path ?? clickedEntity.path;
349
+ navigateToEntity({
350
+ navigation: urlController,
351
+ path: entityPath,
352
+ sideEntityController,
353
+ openEntityMode,
354
+ collection,
355
+ entityId: clickedEntity.id
356
+ });
357
+
358
+ }, [unselectNavigatedEntity, sideEntityController]);
359
+
360
+ const onNewClick = useCallback(() => {
361
+ const collection = collectionRef.current;
362
+ analyticsController.onAnalyticsEvent?.("new_entity_click", {
363
+ path: path
364
+ });
365
+ navigateToEntity({
366
+ openEntityMode,
367
+ collection,
368
+ entityId: undefined,
369
+ path: path,
370
+ sideEntityController,
371
+ navigation: urlController,
372
+ onClose: unselectNavigatedEntity
373
+ })
374
+ }, [path, sideEntityController]);
375
+
376
+ const onMultipleDeleteClick = () => {
377
+ analyticsController.onAnalyticsEvent?.("multiple_delete_dialog_open", {
378
+ path: path
379
+ });
380
+ setDeleteEntityClicked(selectedEntities);
381
+ };
382
+
383
+ const internalOnEntityDelete = (_path: string, entity: Entity<M>) => {
384
+ analyticsController.onAnalyticsEvent?.("single_entity_deleted", {
385
+ path: path
386
+ });
387
+ setSelectedEntities((selectedEntities) => selectedEntities.filter((e) => e.id !== entity.id));
388
+ setDeletedEntities(prev => [...prev, entity]);
389
+ setLastDeleteTimestamp(Date.now());
390
+ };
391
+
392
+ const internalOnMultipleEntitiesDelete = (_path: string, entities: Entity<M>[]) => {
393
+ analyticsController.onAnalyticsEvent?.("multiple_entities_deleted", {
394
+ path: path
395
+ });
396
+ setSelectedEntities([]);
397
+ setDeleteEntityClicked(undefined);
398
+ setDeletedEntities(prev => [...prev, ...entities]);
399
+ setLastDeleteTimestamp(Date.now());
400
+ };
401
+
402
+ const pluginAddColumnComponents = useSlot("collection.add-column", {
403
+ path,
404
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
405
+ collection,
406
+ tableController
407
+ });
408
+
409
+ const pluginToolbarWidgets = useSlot("collection.toolbar", {
410
+ path,
411
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
412
+ collection: collection,
413
+ tableController: tableController,
414
+ selectionController: usedSelectionController
415
+ });
416
+
417
+ const pluginEmptyStates = useSlot("collection.empty-state", {
418
+ path,
419
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
420
+ collection,
421
+ canCreate: canCreateEntities,
422
+ onNewClick
423
+ });
424
+
425
+ const pluginInsights = useSlot("collection.insights", {
426
+ path,
427
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
428
+ collection
429
+ });
430
+
431
+ const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialEntityCollection<M>) => {
432
+ if (userConfigPersistence) {
433
+ const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);
434
+ const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);
435
+ userConfigPersistence.onCollectionModified(path, updatedConfig);
436
+ }
437
+ }, [userConfigPersistence]);
438
+
439
+ const onColumnResize = useCallback(({
440
+ width,
441
+ key
442
+ }: OnColumnResizeParams) => {
443
+
444
+ const collection = collectionRef.current;
445
+ // Only for property columns
446
+ if (!getPropertyInPath(collection.properties, key)) return;
447
+ const localCollection = buildPropertyWidthOverwrite(key, width) as PartialEntityCollection<M>;
448
+ onCollectionModifiedForUser(path, localCollection);
449
+ }, [onCollectionModifiedForUser, path]);
450
+
451
+ const onListSizeChanged = useCallback((size: CollectionSize) => {
452
+ setListSize(size);
453
+ if (userConfigPersistence)
454
+ onCollectionModifiedForUser(path, { defaultSize: size })
455
+ }, [onCollectionModifiedForUser, path, userConfigPersistence]);
456
+
457
+ const onTableSizeChanged = useCallback((size: CollectionSize) => {
458
+ setTableSize(size);
459
+ if (userConfigPersistence)
460
+ onCollectionModifiedForUser(path, { defaultSize: size })
461
+ }, [onCollectionModifiedForUser, path, userConfigPersistence]);
462
+
463
+ // View mode change: update URL + save to local persistence
464
+ const onViewModeChange = useCallback((mode: ViewMode) => {
465
+ analyticsController.onAnalyticsEvent?.("view_mode_changed", {
466
+ path: path,
467
+ from: viewMode,
468
+ to: mode
469
+ });
470
+ setViewMode(mode);
471
+ // Save to local persistence for next visit
472
+ if (userConfigPersistence) {
473
+ onCollectionModifiedForUser(path, { defaultViewMode: mode } as PartialEntityCollection<M>);
474
+ }
475
+ }, [setViewMode, userConfigPersistence, onCollectionModifiedForUser, path, analyticsController, viewMode]);
476
+
477
+ const createEnabled = canCreate(collection, path);
478
+
479
+ const { onValueChange, uniqueFieldValidator } = useCollectionInlineEditor({
480
+ path,
481
+ collection,
482
+ dataClient,
483
+ context
484
+ });
485
+
486
+ // In v4, collections are already resolved, so we use collection directly
487
+ const resolvedCollection = collection;
488
+
489
+ // Check if Kanban view is available (needs kanban.columnProperty with enum)
490
+ const kanbanEnabled = useMemo(() => {
491
+ if (!collection.kanban?.columnProperty) return false;
492
+ const property = getPropertyInPath(resolvedCollection.properties, collection.kanban.columnProperty);
493
+ if (!property || property.type !== "string") return false;
494
+ return Boolean("enum" in property && property.enum);
495
+ }, [collection.kanban?.columnProperty, resolvedCollection.properties]);
496
+
497
+ // Compute the effective enabled views:
498
+ // - Start from collection.enabledViews (defaults to all three)
499
+ // - Filter out kanban if no enum properties exist
500
+ const hasEnumProperty = useMemo(() => {
501
+ return Object.values(resolvedCollection.properties).some((p: Property) => p.type === "string" && "enum" in p && p.enum);
502
+ }, [resolvedCollection.properties]);
503
+
504
+ const enabledViews: ViewMode[] = useMemo(() => {
505
+ const configured = collection.enabledViews ?? ["list", "table", "cards", "kanban"];
506
+ if (!hasEnumProperty) {
507
+ return configured.filter(v => v !== "kanban");
508
+ }
509
+ return configured;
510
+ }, [collection.enabledViews, hasEnumProperty]);
511
+
512
+ // Compute available enum properties for kanban column selection
513
+ const kanbanPropertyOptions: KanbanPropertyOption[] = useMemo(() => {
514
+ const options: KanbanPropertyOption[] = [];
515
+ const properties = resolvedCollection.properties;
516
+
517
+ for (const [key, property] of Object.entries(properties)) {
518
+ const prop = property;
519
+ if (prop && prop.type === "string" && "enum" in prop && prop.enum) {
520
+ options.push({
521
+ key,
522
+ label: prop.name || key
523
+ });
524
+ }
525
+ }
526
+
527
+ return options;
528
+ }, [resolvedCollection.properties]);
529
+
530
+ // Get saved kanban property from user config
531
+ const getSavedKanbanProperty = useCallback((): string | undefined => {
532
+ const saved = userConfigPersistence?.getCollectionConfig<M>(path);
533
+ return (saved as Record<string, unknown>)?.kanbanColumnProperty as string | undefined;
534
+ }, [userConfigPersistence, path]);
535
+
536
+ // Selected kanban property state - priority: saved config > collection default > first available
537
+ const [selectedKanbanProperty, setSelectedKanbanProperty] = useState<string>(() => {
538
+ const saved = getSavedKanbanProperty();
539
+ if (saved && kanbanPropertyOptions.some(o => o.key === saved)) return saved;
540
+ if (collection.kanban?.columnProperty) return collection.kanban.columnProperty;
541
+ return kanbanPropertyOptions[0]?.key ?? "";
542
+ });
543
+
544
+ // Update selected property if options change and current selection is no longer valid
545
+ useEffect(() => {
546
+ if (kanbanPropertyOptions.length > 0 && !kanbanPropertyOptions.some(o => o.key === selectedKanbanProperty)) {
547
+ const saved = getSavedKanbanProperty();
548
+ if (saved && kanbanPropertyOptions.some(o => o.key === saved)) {
549
+ setSelectedKanbanProperty(saved);
550
+ } else if (collection.kanban?.columnProperty && kanbanPropertyOptions.some(o => o.key === collection.kanban?.columnProperty)) {
551
+ setSelectedKanbanProperty(collection.kanban.columnProperty);
552
+ } else {
553
+ setSelectedKanbanProperty(kanbanPropertyOptions[0]?.key ?? "");
554
+ }
555
+ }
556
+ }, [kanbanPropertyOptions, selectedKanbanProperty, getSavedKanbanProperty, collection.kanban?.columnProperty]);
557
+
558
+ // Handle kanban property change
559
+ const onKanbanPropertyChange = useCallback((property: string) => {
560
+ analyticsController.onAnalyticsEvent?.("kanban_property_changed", {
561
+ path: path,
562
+ property
563
+ });
564
+ setSelectedKanbanProperty(property);
565
+ // Save to local persistence
566
+ if (userConfigPersistence) {
567
+ onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as PartialEntityCollection<M>);
568
+ }
569
+ }, [userConfigPersistence, onCollectionModifiedForUser, path, analyticsController]);
570
+
571
+ const getPropertyFor = useCallback(({
572
+ propertyKey,
573
+ entity
574
+ }: GetPropertyForProps<M>) => {
575
+ let property: Property | undefined = getPropertyInPath(collection.properties, propertyKey);
576
+
577
+ // we might not find the property in the collection if combining property builders and map spread
578
+ if (!property) {
579
+ // these 2 properties are coming from the resolved collection with default values
580
+ property = getPropertyInPath(resolvedCollection.properties, propertyKey);
581
+ }
582
+
583
+
584
+ // In v4, properties are already resolved, so we return them directly
585
+ return property ?? null;
586
+ }, [collection.properties, resolvedCollection.properties]);
587
+
588
+ // Use a collection with local propertiesOrder for optimistic UI updates
589
+ const collectionWithLocalOrder = useMemo(() => {
590
+ if (localPropertiesOrder && localPropertiesOrder !== resolvedCollection.propertiesOrder) {
591
+ return {
592
+ ...resolvedCollection,
593
+ propertiesOrder: localPropertiesOrder
594
+ };
595
+ }
596
+ return resolvedCollection;
597
+ }, [resolvedCollection, localPropertiesOrder]);
598
+
599
+ const displayedColumnIds = useColumnIds(collectionWithLocalOrder, true);
600
+
601
+ const additionalFields = useMemo(() => {
602
+ // v4: use getSubcollections helper to access subcollections
603
+ const subcollectionsList = getSubcollections(collection);
604
+ const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: EntityCollection) => {
605
+ return {
606
+ key: getSubcollectionColumnId(subcollection),
607
+ name: subcollection.name,
608
+ width: 200,
609
+ dependencies: [],
610
+ Builder: ({ entity }: { entity: Entity }) => (
611
+ <Button
612
+ className={"max-w-full truncate justify-start"}
613
+ startIcon={<ArrowRightToLineIcon size={iconSize.small}/>}
614
+ onClick={(event: React.MouseEvent) => {
615
+ event.stopPropagation();
616
+ navigateToEntity({
617
+ openEntityMode,
618
+ collection,
619
+ entityId: entity.id,
620
+ selectedTab: subcollection.slug,
621
+ path: path,
622
+ navigation: urlController,
623
+ sideEntityController
624
+ })
625
+ }}>
626
+ {subcollection.name}
627
+ </Button>
628
+ )
629
+ };
630
+ }) ?? EMPTY_ARRAY;
631
+
632
+ return [
633
+ ...(collection.additionalFields ?? EMPTY_ARRAY),
634
+ ...subcollectionColumns
635
+ ];
636
+ }, [collection, path, sideEntityController]);
637
+
638
+ const updateLastDeleteTimestamp = useCallback(() => {
639
+ setLastDeleteTimestamp(Date.now());
640
+ }, []);
641
+
642
+ const largeLayout = useLargeLayout();
643
+
644
+ const isSplitLayout = openEntityMode === "split";
645
+ const isCompact = isSplitLayout && selectedEntityIdProp !== undefined;
646
+ const activeSelectionEnabled = !isCompact && selectionEnabled;
647
+
648
+ const getActionsForEntity = useCallback(({
649
+ entity,
650
+ customEntityActions
651
+ }: {
652
+ entity?: Entity<M>,
653
+ customEntityActions?: EntityAction[]
654
+ }): EntityAction[] => {
655
+ const deleteEnabled = entity ? canDelete(collection, path, entity) : true;
656
+ const actions: EntityAction[] = [editEntityAction];
657
+ if (createEnabled)
658
+ actions.push(copyEntityAction);
659
+ if (deleteEnabled)
660
+ actions.push(deleteEntityAction);
661
+ if (customEntityActions)
662
+ return mergeEntityActions(actions, customEntityActions);
663
+ return actions;
664
+ }, [canDelete, collection, path, createEnabled]);
665
+
666
+ const getIdColumnWidth = useCallback(() => {
667
+ const entityActions = getActionsForEntity({});
668
+ const collapsedActions = entityActions.filter(a => a.collapsed !== false);
669
+ const uncollapsedActions = entityActions.filter(a => a.collapsed === false);
670
+ const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);
671
+ return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
672
+ }, [getActionsForEntity, largeLayout]);
673
+
674
+ const tableRowActionsBuilder = useCallback(({
675
+ entity,
676
+ size,
677
+ width,
678
+ frozen
679
+ }: {
680
+ entity: Entity<any>,
681
+ size: CollectionSize,
682
+ width: number,
683
+ frozen?: boolean
684
+ }) => {
685
+
686
+ const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
687
+ const customEntityActions = (collection.entityActions ?? EMPTY_ARRAY)
688
+ .map(action => resolveEntityAction(action, customizationController.entityActions))
689
+ .filter(Boolean) as EntityAction<M>[];
690
+
691
+ const actions = getActionsForEntity({
692
+ entity,
693
+ customEntityActions
694
+ });
695
+
696
+ return (
697
+ <EntityCollectionRowActions
698
+ entity={entity}
699
+ width={width}
700
+ frozen={frozen}
701
+ isSelected={isSelected}
702
+ selectionEnabled={activeSelectionEnabled}
703
+ size={size}
704
+ highlightEntity={setHighlightedEntity}
705
+ unhighlightEntity={unselectNavigatedEntity}
706
+ collection={collection}
707
+ path={path}
708
+ actions={actions}
709
+ hideId={collection?.hideIdFromCollection}
710
+ onCollectionChange={updateLastDeleteTimestamp}
711
+ selectionController={usedSelectionController}
712
+ openEntityMode={openEntityMode}
713
+ />
714
+ );
715
+
716
+ }, [updateLastDeleteTimestamp, usedSelectionController]);
717
+
718
+ // Update breadcrumb count when count changes
719
+ const updateCountRef = React.useRef(breadcrumbs.updateCount);
720
+ updateCountRef.current = breadcrumbs.updateCount;
721
+ useEffect(() => {
722
+ updateCountRef.current(path, docsCount);
723
+ }, [docsCount, path]);
724
+
725
+ // EntitiesCount fetches count and updates breadcrumb - no visual rendering needed here
726
+ const countFetcher = <EntitiesCount
727
+ path={path}
728
+ collection={collection}
729
+ filter={tableController.filterValues}
730
+ sortBy={tableController.sortBy}
731
+ onCountChange={setDocsCount}
732
+ />;
733
+
734
+ const { resolvedSlots } = customizationController;
735
+
736
+ // Pre-compute header action slot contributions (avoid useSlot inside callback)
737
+ const headerActionContributions = useMemo(() => resolvedSlots
738
+ .filter(s => s.slot === "collection.header.action")
739
+ .sort((a, b) => (a.order ?? 50) - (b.order ?? 50)), [resolvedSlots]);
740
+
741
+ const buildAdditionalHeaderWidget = useCallback(({
742
+ property,
743
+ propertyKey,
744
+ onHover
745
+ }: {
746
+ property: Property,
747
+ propertyKey: string,
748
+ onHover: boolean
749
+ }) => {
750
+ const collection = collectionRef.current;
751
+ const headerSlotProps = {
752
+ property,
753
+ propertyKey,
754
+ onHover,
755
+ path,
756
+ collection: collection as unknown as EntityCollection,
757
+ tableController: tableController as unknown as EntityTableController,
758
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY
759
+ };
760
+ return <>{headerActionContributions.map((s, i) => (
761
+ <ErrorBoundary key={`header_action_${propertyKey}_${i}`}>
762
+ <s.Component {...headerSlotProps} {...(s.props ?? {})}/>
763
+ </ErrorBoundary>
764
+ ))}</>;
765
+ }, [headerActionContributions, path, parentCollectionSlugs]);
766
+
767
+ const addColumnComponentInternal = pluginAddColumnComponents.length > 0
768
+ ? function () {
769
+ return (
770
+ <div className="flex flex-row items-center gap-2">
771
+ {pluginAddColumnComponents}
772
+ </div>
773
+ );
774
+ }
775
+ : undefined;
776
+
777
+ const onColumnsOrderChange = useCallback((newColumns: VirtualTableColumn[]) => {
778
+ // Extract property keys from the new column order
779
+ // Filter to only include actual property columns (not frozen columns, not additional fields, etc.)
780
+ // Deduplicate to clean up any previously duplicated keys
781
+ const seenKeys = new Set<string>();
782
+ const newPropertiesOrder = newColumns
783
+ .filter(col => !col.frozen && getPropertyInPath(collection.properties, col.key))
784
+ .map(col => col.key)
785
+ .filter(key => {
786
+ if (seenKeys.has(key)) return false;
787
+ seenKeys.add(key);
788
+ return true;
789
+ });
790
+
791
+ // Optimistically update local state to prevent UI flickering
792
+ setLocalPropertiesOrder(newPropertiesOrder);
793
+
794
+ // Call each plugin's onColumnsReorder callback
795
+ if (customizationController?.plugins) {
796
+ customizationController.plugins
797
+ .filter(plugin => plugin.hooks?.onColumnsReorder)
798
+ .forEach(plugin => {
799
+ plugin.hooks!.onColumnsReorder!({
800
+ fullPath: path,
801
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY, parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
802
+ collection,
803
+ newPropertiesOrder
804
+ });
805
+ });
806
+ }
807
+ }, [collection, setLocalPropertiesOrder, customizationController, path, parentCollectionSlugs]);
808
+
809
+ // Popover open state managed at parent level to prevent closing when view changes
810
+ const [viewModePopoverOpen, setViewModePopoverOpen] = useState(false);
811
+
812
+ // Create ViewModeToggle once to prevent remounting when view changes
813
+ const viewModeToggleElement = (
814
+ <ViewModeToggle
815
+ viewMode={viewMode}
816
+ onViewModeChange={onViewModeChange}
817
+ enabledViews={enabledViews}
818
+ size={viewMode === "list" ? listSize : viewMode === "table" ? tableSize : viewMode === "cards" ? cardSize : undefined}
819
+ onSizeChanged={viewMode === "list" ? onListSizeChanged : viewMode === "table" ? onTableSizeChanged : viewMode === "cards" ? setCardSize : undefined}
820
+ open={viewModePopoverOpen}
821
+ onOpenChange={setViewModePopoverOpen}
822
+ kanbanPropertyOptions={kanbanPropertyOptions}
823
+ selectedKanbanProperty={selectedKanbanProperty}
824
+ onKanbanPropertyChange={onKanbanPropertyChange}
825
+ />
826
+ );
827
+
828
+ // Compute plugin-provided error view for collection loading errors
829
+ const pluginErrorViews = useSlot("collection.error", {
830
+ path,
831
+ collection,
832
+ parentCollectionSlugs, parentEntityIds,
833
+ error: tableController.dataLoadingError as Error
834
+ });
835
+ const pluginErrorView = tableController.dataLoadingError && pluginErrorViews.length > 0
836
+ ? pluginErrorViews[0]
837
+ : null;
838
+
839
+ // Shared empty state — plugin slot takes priority, then default
840
+ const isFilteredOrSorted = tableController.filterValues !== undefined || tableController.sortBy !== undefined;
841
+ const emptyComponent = pluginEmptyStates.length > 0
842
+ ? <>{pluginEmptyStates}</>
843
+ : canCreateEntities && !isFilteredOrSorted
844
+ ? <div className="flex flex-col items-center justify-center">
845
+ <Typography variant={"subtitle2"}>{t("so_empty")}</Typography>
846
+ <Button
847
+ onClick={onNewClick}
848
+ className="mt-4"
849
+ >
850
+ <PlusIcon/>
851
+ {t("create_your_first_entry")}
852
+ </Button>
853
+ </div>
854
+ : <Typography variant={"label"}>{t("no_results_filter_sort")}</Typography>;
855
+
856
+ const toolbarNode = (
857
+ <CollectionTableToolbar
858
+ compact={isCompact}
859
+ loading={tableController.dataLoading}
860
+ onTextSearch={tableController.setSearchString}
861
+ viewModeToggle={viewModeToggleElement}
862
+ actionsStart={<EntityCollectionViewStartActions
863
+ parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
864
+ collection={collection}
865
+ tableController={tableController}
866
+ path={path}
867
+ relativePath={collection.slug}
868
+ selectionController={usedSelectionController}
869
+ collectionEntitiesCount={docsCount ?? undefined}
870
+ resolvedProperties={resolvedCollection.properties}
871
+ compact={isCompact}/>}
872
+ actions={
873
+ <EntityCollectionViewActions
874
+ parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
875
+ collection={collection}
876
+ tableController={tableController}
877
+ onMultipleDeleteClick={onMultipleDeleteClick}
878
+ onNewClick={onNewClick}
879
+ path={path}
880
+ relativePath={collection.slug}
881
+ selectionController={usedSelectionController}
882
+ selectionEnabled={activeSelectionEnabled}
883
+ collectionEntitiesCount={docsCount ?? undefined}
884
+ compact={isCompact}
885
+ >
886
+ {pluginToolbarWidgets}
887
+ </EntityCollectionViewActions>
888
+ }
889
+ />
890
+ ); const innerView = viewMode === "kanban" ? (
891
+ <EntityCollectionBoardView
892
+ key={`kanban-view-${path}-${selectedKanbanProperty}`}
893
+ collection={collection}
894
+ tableController={tableController}
895
+ fullPath={path}
896
+ parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
897
+ columnProperty={selectedKanbanProperty}
898
+ onEntityClick={onEntityClick}
899
+ selectionController={usedSelectionController}
900
+ selectionEnabled={selectionEnabled}
901
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
902
+ deletedEntities={deletedEntities}
903
+ emptyComponent={emptyComponent}
904
+ />
905
+ ) : viewMode === "cards" ? (
906
+ <EntityCollectionCardView
907
+ key={`cards-view-${path}`}
908
+ collection={collection}
909
+ tableController={tableController}
910
+ onEntityClick={onEntityClick}
911
+ selectionController={usedSelectionController}
912
+ selectionEnabled={selectionEnabled}
913
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
914
+ onScroll={tableController.onScroll}
915
+ initialScroll={tableController.initialScroll}
916
+ size={cardSize}
917
+ emptyComponent={emptyComponent}
918
+ />
919
+ ) : viewMode === "list" ? (
920
+ <EntityCollectionListView
921
+ key={`list-view-${path}`}
922
+ collection={collection}
923
+ tableController={tableController}
924
+ onEntityClick={onEntityClick}
925
+ selectionController={usedSelectionController}
926
+ selectionEnabled={selectionEnabled}
927
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
928
+ size={listSize}
929
+ emptyComponent={emptyComponent}
930
+ />
931
+ ) : (
932
+ <EntityCollectionTable
933
+ key={`collection_table_${path}`}
934
+ hideToolbar={true}
935
+ additionalFields={additionalFields}
936
+ tableController={tableController}
937
+ enablePopupIcon={true}
938
+ displayedColumnIds={displayedColumnIds}
939
+ onSizeChanged={onTableSizeChanged}
940
+ onEntityClick={onEntityClick}
941
+ onColumnResize={onColumnResize}
942
+ onValueChange={onValueChange}
943
+ tableRowActionsBuilder={tableRowActionsBuilder}
944
+ uniqueFieldValidator={uniqueFieldValidator}
945
+ selectionController={usedSelectionController}
946
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
947
+ defaultSize={tableSize}
948
+ properties={resolvedCollection.properties}
949
+ getPropertyFor={getPropertyFor}
950
+ onScroll={tableController.onScroll}
951
+ initialScroll={tableController.initialScroll}
952
+ emptyComponent={emptyComponent}
953
+ hoverRow={hoverRow}
954
+ inlineEditing={checkInlineEditing()}
955
+ AdditionalHeaderWidget={buildAdditionalHeaderWidget}
956
+ AddColumnComponent={addColumnComponentInternal}
957
+ getIdColumnWidth={getIdColumnWidth}
958
+ additionalIDHeaderWidget={<EntityIdHeaderWidget
959
+ path={path}
960
+ idPath={path}
961
+ collection={collection}/>}
962
+ openEntityMode={openEntityMode}
963
+ onColumnsOrderChange={onColumnsOrderChange}
964
+ />
965
+ );
966
+
967
+ return (
968
+ <div className={cls("overflow-hidden h-full w-full rounded-md flex flex-col dark:bg-surface-800", className)}
969
+ ref={containerRef}>
970
+
971
+ {countFetcher}
972
+
973
+
974
+ {/* When isSplitLayout, SplitListView is ALWAYS mounted — regardless
975
+ of viewMode. The toolbar + current view live in the left panel;
976
+ the right panel (entity detail) shows/hides based on selection.
977
+ This keeps the toolbar's React tree position stable across view
978
+ mode switches, preventing the ViewModeToggle popover from flashing. */}
979
+ {isSplitLayout ? (
980
+ <SplitListView
981
+ key={`split-list-view-${path}`}
982
+ collection={collection}
983
+ tableController={tableController}
984
+ onEntityClick={onEntityClick}
985
+ onNewClick={onNewClick}
986
+ selectionController={usedSelectionController}
987
+ selectionEnabled={selectionEnabled}
988
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
989
+ onScroll={tableController.onScroll}
990
+ initialScroll={tableController.initialScroll}
991
+ size={listSize}
992
+ emptyComponent={emptyComponent}
993
+ path={path}
994
+ parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
995
+ selectedEntityId={selectedEntityIdProp}
996
+ selectedTab={selectedTabProp}
997
+ toolbar={toolbarNode}
998
+ >
999
+ {/* When detail panel is open, left panel is always the list
1000
+ view — regardless of which view mode triggered the entity
1001
+ click. When no detail, show the active view mode. */}
1002
+ {(selectedEntityIdProp !== undefined || viewMode === "list") ? (
1003
+ <div
1004
+ className={cls(
1005
+ "flex flex-col w-full",
1006
+ selectedEntityIdProp === undefined
1007
+ ? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
1008
+ : ""
1009
+ )}
1010
+ >
1011
+ {/* Collapsible title — grid-rows for smooth height, transform for GPU */}
1012
+ <div
1013
+ className={cls(
1014
+ "grid transition-[grid-template-rows,transform,margin] duration-150 ease-out",
1015
+ selectedEntityIdProp === undefined
1016
+ ? "grid-rows-[1fr] translate-y-0 mt-12 mb-6"
1017
+ : "grid-rows-[0fr] -translate-y-2 mt-0 mb-0"
1018
+ )}
1019
+ >
1020
+ <div className="overflow-hidden flex items-center gap-4">
1021
+ <Typography gutterBottom variant="h4" className="grow mb-0" component="h4">
1022
+ {collection.name}
1023
+ </Typography>
1024
+ </div>
1025
+ </div>
1026
+ {pluginInsights.length > 0 && (
1027
+ <div
1028
+ className={cls(
1029
+ "grid transition-[grid-template-rows] duration-150 ease-out",
1030
+ selectedEntityIdProp === undefined
1031
+ ? "grid-rows-[1fr]"
1032
+ : "grid-rows-[0fr]"
1033
+ )}
1034
+ >
1035
+ <div className="overflow-hidden flex-shrink-0">
1036
+ {pluginInsights}
1037
+ </div>
1038
+ </div>
1039
+ )}
1040
+ <EntityCollectionListView
1041
+ key={`list-view-${path}`}
1042
+ collection={collection}
1043
+ tableController={tableController}
1044
+ onEntityClick={onEntityClick}
1045
+ selectionController={usedSelectionController}
1046
+ selectionEnabled={selectionEnabled}
1047
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
1048
+ size={listSize}
1049
+ emptyComponent={emptyComponent}
1050
+ selectedEntityId={selectedEntityIdProp}
1051
+ />
1052
+ </div>
1053
+ ) : (
1054
+ innerView
1055
+ )}
1056
+ </SplitListView>
1057
+ ) : (
1058
+ <div className="flex flex-col w-full h-full">
1059
+ {toolbarNode}
1060
+ <div className="flex-1 flex flex-col overflow-y-auto">
1061
+ {viewMode === "list" ? (
1062
+ <div
1063
+ className={cls(
1064
+ "flex flex-col w-full",
1065
+ selectedEntityIdProp === undefined
1066
+ ? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
1067
+ : ""
1068
+ )}
1069
+ >
1070
+ <div
1071
+ className={cls(
1072
+ "grid transition-[grid-template-rows,transform,margin] duration-150 ease-out",
1073
+ selectedEntityIdProp === undefined
1074
+ ? "grid-rows-[1fr] translate-y-0 mt-12 mb-6"
1075
+ : "grid-rows-[0fr] -translate-y-2 mt-0 mb-0"
1076
+ )}
1077
+ >
1078
+ <div className="overflow-hidden flex items-center gap-4">
1079
+ <Typography gutterBottom variant="h4" className="grow mb-0" component="h4">
1080
+ {collection.name}
1081
+ </Typography>
1082
+ </div>
1083
+ </div>
1084
+ {pluginInsights.length > 0 && (
1085
+ <div className="flex-shrink-0">
1086
+ {pluginInsights}
1087
+ </div>
1088
+ )}
1089
+ {innerView}
1090
+ </div>
1091
+ ) : (
1092
+ innerView
1093
+ )}
1094
+ </div>
1095
+ </div>
1096
+ )}
1097
+
1098
+ {popupCell && <PopupFormField
1099
+ key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
1100
+ open={Boolean(popupCell)}
1101
+ onClose={onPopupClose}
1102
+ cellRect={popupCell?.cellRect}
1103
+ propertyKey={popupCell?.propertyKey}
1104
+ collection={collection}
1105
+ entityId={popupCell.entityId}
1106
+ tableKey={tableKey.current}
1107
+ customFieldValidator={uniqueFieldValidator}
1108
+ path={path}
1109
+ onCellValueChange={onValueChange}
1110
+ container={containerRef.current}/>}
1111
+
1112
+ {deleteEntityClicked &&
1113
+ <DeleteEntityDialog
1114
+ entityOrEntitiesToDelete={deleteEntityClicked}
1115
+ path={path}
1116
+ collection={collection}
1117
+ callbacks={collection.callbacks}
1118
+ open={Boolean(deleteEntityClicked)}
1119
+ onEntityDelete={internalOnEntityDelete}
1120
+ onMultipleEntitiesDelete={internalOnMultipleEntitiesDelete}
1121
+ onClose={() => setDeleteEntityClicked(undefined)}/>}
1122
+
1123
+ </div>
1124
+ );
1125
+ }, (a, b) => {
1126
+ return equal(a.path, b.path) &&
1127
+ equal(a.parentCollectionSlugs, b.parentCollectionSlugs) && equal(a.parentEntityIds, b.parentEntityIds) &&
1128
+ equal(a.isSubCollection, b.isSubCollection) &&
1129
+ equal(a.className, b.className) &&
1130
+ equal(a.properties, b.properties) &&
1131
+ equal(a.propertiesOrder, b.propertiesOrder) &&
1132
+ equal(a.hideIdFromCollection, b.hideIdFromCollection) &&
1133
+ equal(a.inlineEditing, b.inlineEditing) &&
1134
+ equal(a.selectionEnabled, b.selectionEnabled) &&
1135
+ equal(a.selectionController, b.selectionController) &&
1136
+ equal(a.Actions, b.Actions) &&
1137
+ equal(a.defaultSize, b.defaultSize) &&
1138
+ equal(a.includeJsonView, b.includeJsonView) &&
1139
+ equal(a.additionalFields, b.additionalFields) &&
1140
+ equal(a.sideDialogWidth, b.sideDialogWidth) &&
1141
+ equal(a.openEntityMode, b.openEntityMode) &&
1142
+ equal(a.exportable, b.exportable) &&
1143
+ equal(a.history, b.history) &&
1144
+ equal(a.fixedFilter, b.fixedFilter) &&
1145
+ equal(a.selectedEntityId, b.selectedEntityId) &&
1146
+ equal(a.selectedTab, b.selectedTab);
1147
+ }) as React.FunctionComponent<EntityCollectionViewProps<any>>
1148
+
1149
+ function EntitiesCount({
1150
+ path,
1151
+ collection,
1152
+ filter,
1153
+ sortBy,
1154
+ onCountChange
1155
+ }: {
1156
+ path: string,
1157
+ collection: EntityCollection,
1158
+ filter?: FilterValues<any>,
1159
+ sortBy?: [string, "asc" | "desc"],
1160
+ onCountChange?: (count: number | null | undefined) => void,
1161
+ }) {
1162
+
1163
+ const dataClient = useData();
1164
+
1165
+ const sortByProperty = sortBy ? sortBy[0] : undefined;
1166
+ const currentSort = sortBy ? sortBy[1] : undefined;
1167
+
1168
+ // Use refs for values that should NOT trigger re-fetches
1169
+ const dataClientRef = React.useRef(dataClient);
1170
+ dataClientRef.current = dataClient;
1171
+ const onCountChangeRef = React.useRef(onCountChange);
1172
+ onCountChangeRef.current = onCountChange;
1173
+
1174
+ // Serialize filter to a stable string to avoid re-fetches on object identity changes
1175
+ const filterKey = React.useMemo(() => filter ? JSON.stringify(filter) : "", [filter]);
1176
+
1177
+ useEffect(() => {
1178
+ const accessor = dataClientRef.current.collection(path);
1179
+ if (!accessor.count) {
1180
+ onCountChangeRef.current?.(undefined);
1181
+ return;
1182
+ }
1183
+
1184
+ let cancelled = false;
1185
+
1186
+ // Convert filterValues to PostgREST where clause
1187
+ const whereMap: Record<string, string> = {};
1188
+ if (filter) {
1189
+ Object.entries(filter).forEach(([key, value]) => {
1190
+ if (value && Array.isArray(value)) {
1191
+ const [op, val] = value;
1192
+ const postgrestOp = op === "==" ? "eq" : op === "!=" ? "neq" : op === ">" ? "gt" : op === ">=" ? "gte" : op === "<" ? "lt" : op === "<=" ? "lte" : op === "in" ? "in" : op === "not-in" ? "nin" : op === "array-contains" ? "cs" : op === "array-contains-any" ? "csa" : "eq";
1193
+
1194
+ let stringVal: string;
1195
+ if (Array.isArray(val)) {
1196
+ stringVal = `(${val.join(",")})`;
1197
+ } else {
1198
+ stringVal = String(val);
1199
+ }
1200
+ whereMap[key] = `${postgrestOp}.${stringVal}`;
1201
+ }
1202
+ });
1203
+ }
1204
+ const whereParams = Object.keys(whereMap).length > 0 ? whereMap : undefined;
1205
+ const orderByParams = sortByProperty ? `${String(sortByProperty)}:${currentSort}` : undefined;
1206
+
1207
+ accessor.count({
1208
+ where: whereParams,
1209
+ orderBy: orderByParams
1210
+ }).then((c) => {
1211
+ if (!cancelled) onCountChangeRef.current?.(c);
1212
+ }).catch((e) => {
1213
+ console.warn("Error fetching count", e);
1214
+ if (!cancelled) onCountChangeRef.current?.(undefined);
1215
+ });
1216
+
1217
+ return () => { cancelled = true; };
1218
+ }, [path, filterKey, sortByProperty, currentSort]);
1219
+
1220
+ // Count is now displayed in the breadcrumb bar, this component only fetches and reports
1221
+ return null;
1222
+ }
1223
+
1224
+ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityCollection {
1225
+ if (key.includes(".")) {
1226
+ const [parentKey, ...childKey] = key.split(".");
1227
+ return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as PartialEntityCollection;
1228
+ }
1229
+ return { properties: { [key]: { ui: { columnWidth: width } } } } as PartialEntityCollection;
1230
+ }
1231
+
1232
+ function EntityIdHeaderWidget({
1233
+ collection,
1234
+ path,
1235
+ idPath
1236
+ }: {
1237
+ collection: EntityCollection,
1238
+ path: string,
1239
+ idPath: string
1240
+ }) {
1241
+
1242
+ const { t } = useTranslation();
1243
+ const urlController = useUrlController();
1244
+ const [openPopup, setOpenPopup] = React.useState(false);
1245
+ const [searchString, setSearchString] = React.useState("");
1246
+ const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.slug).map(String));
1247
+ const sideEntityController = useSideEntityController();
1248
+
1249
+ const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
1250
+
1251
+ return (
1252
+ <Tooltip title={!openPopup ? t("find_by_id") : undefined} asChild={false}>
1253
+ <Popover
1254
+ open={openPopup}
1255
+ onOpenChange={setOpenPopup}
1256
+ sideOffset={0}
1257
+ align={"start"}
1258
+ alignOffset={-117}
1259
+ trigger={
1260
+ <IconButton size={"small"}>
1261
+ <SearchIcon size={iconSize.small}/>
1262
+ </IconButton>
1263
+ }>
1264
+ <div
1265
+ className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-800 text-surface-900 dark:text-white")}>
1266
+ <form noValidate={true}
1267
+ onSubmit={(e) => {
1268
+ e.preventDefault();
1269
+ if (!searchString) return;
1270
+ setOpenPopup(false);
1271
+ const entityId = searchString.trim();
1272
+ setRecentIds(addRecentId(collection.slug, entityId).map(String));
1273
+ navigateToEntity({
1274
+ openEntityMode,
1275
+ collection,
1276
+ entityId,
1277
+ path,
1278
+
1279
+ sideEntityController,
1280
+ navigation: urlController
1281
+ })
1282
+ }}
1283
+ className={"w-96 max-w-full"}>
1284
+
1285
+ <div className="flex p-2 w-full gap-2">
1286
+ <input
1287
+ autoFocus={openPopup}
1288
+ placeholder={t("find_entity_by_id")}
1289
+ // size={"small"}
1290
+ onChange={(e) => {
1291
+ setSearchString(e.target.value);
1292
+ }}
1293
+ value={searchString}
1294
+ className={"rounded-lg bg-white dark:bg-surface-900 flex-grow outline-none p-2 " + focusedDisabled}/>
1295
+ <Button variant={"text"}
1296
+ disabled={!(searchString.trim())}
1297
+ type={"submit"}
1298
+ ><ArrowRightToLineIcon/></Button>
1299
+ </div>
1300
+ </form>
1301
+ {recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
1302
+ {recentIds.map(id => (
1303
+ <ReferencePreview reference={new EntityReference({ id,
1304
+ path })}
1305
+ key={id}
1306
+ hover={true}
1307
+ onClick={() => {
1308
+ setOpenPopup(false);
1309
+ navigateToEntity({
1310
+ openEntityMode,
1311
+ collection,
1312
+ entityId: id,
1313
+ path,
1314
+
1315
+ sideEntityController,
1316
+ navigation: urlController
1317
+ })
1318
+ }}
1319
+ includeEntityLink={false}
1320
+ size={"small"}/>
1321
+ ))}
1322
+ </div>}
1323
+ </div>
1324
+ </Popover>
1325
+
1326
+ </Tooltip>
1327
+ );
1328
+ }