@rebasepro/admin 0.0.1-canary.09e5ec5

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