@rebasepro/admin 0.1.2 → 0.2.1

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 (241) hide show
  1. package/LICENSE +21 -6
  2. package/dist/{CollectionEditorDialog-ywdxhs1L.js → CollectionEditorDialog-BXIh2AXg.js} +40 -31
  3. package/dist/CollectionEditorDialog-BXIh2AXg.js.map +1 -0
  4. package/dist/{CollectionsStudioView-BDzMFzqH.js → CollectionsStudioView-jR8iz_ja.js} +6 -8
  5. package/dist/CollectionsStudioView-jR8iz_ja.js.map +1 -0
  6. package/dist/{ContentHomePage-0tHuEIm_.js → ContentHomePage-BQZWuOFb.js} +5 -7
  7. package/dist/ContentHomePage-BQZWuOFb.js.map +1 -0
  8. package/dist/{ExportCollectionAction-BIrq92To.js → ExportCollectionAction-CMdiiv1L.js} +36 -38
  9. package/dist/ExportCollectionAction-CMdiiv1L.js.map +1 -0
  10. package/dist/{ImportCollectionAction-h8yg_To8.js → ImportCollectionAction-C05lE0IW.js} +5 -7
  11. package/dist/ImportCollectionAction-C05lE0IW.js.map +1 -0
  12. package/dist/{PropertyEditView-BuZrNnBN.js → PropertyEditView-BB5xjnhZ.js} +261 -165
  13. package/dist/PropertyEditView-BB5xjnhZ.js.map +1 -0
  14. package/dist/{RolesView-CMPsaIXo.js → RolesView-CULIHWZ9.js} +22 -11
  15. package/dist/RolesView-CULIHWZ9.js.map +1 -0
  16. package/dist/{UsersView-BkeblMVT.js → UsersView-D7_AtJ44.js} +7 -71
  17. package/dist/UsersView-D7_AtJ44.js.map +1 -0
  18. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +2 -2
  19. package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +3 -0
  20. package/dist/collection_editor_ui.js +5 -5
  21. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +1 -1
  22. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +1 -1
  23. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +18 -2
  24. package/dist/components/EntityCollectionView/FilterPresetsButton.d.ts +21 -0
  25. package/dist/components/EntityDetailView.d.ts +31 -0
  26. package/dist/components/EntityEditView.d.ts +3 -2
  27. package/dist/components/ReferenceTable/EntitySelectionTable.d.ts +1 -1
  28. package/dist/components/admin/CreationResultDialog.d.ts +5 -0
  29. package/dist/components/admin/RolesFilterSelect.d.ts +2 -0
  30. package/dist/components/admin/UserRolesSelectField.d.ts +2 -0
  31. package/dist/components/common/default_entity_actions.d.ts +7 -1
  32. package/dist/components/field_configs.d.ts +1 -1
  33. package/dist/components/index.d.ts +1 -0
  34. package/dist/data_import/utils/data.d.ts +1 -1
  35. package/dist/data_import/utils/file_headers.d.ts +6 -1
  36. package/dist/data_import/utils/file_to_json.d.ts +1 -11
  37. package/dist/data_import/utils/transforms.d.ts +11 -0
  38. package/dist/editor.js +2 -4
  39. package/dist/editor.js.map +1 -1
  40. package/dist/form/EntityForm.d.ts +1 -1
  41. package/dist/form/field_bindings/RelationFieldBinding.d.ts +1 -1
  42. package/dist/form/field_bindings/VectorFieldBinding.d.ts +11 -0
  43. package/dist/form/index.d.ts +1 -0
  44. package/dist/hooks/navigation/useResolvedViews.d.ts +2 -1
  45. package/dist/{index-CS6uJ7oW.js → index-BAM9KCmM.js} +4 -6
  46. package/dist/index-BAM9KCmM.js.map +1 -0
  47. package/dist/{index-BuZaHcyc.js → index-CoSNm3e3.js} +3 -3
  48. package/dist/index-CoSNm3e3.js.map +1 -0
  49. package/dist/{index-eRJbMvHi.js → index-D5OQhv-T.js} +3 -3
  50. package/dist/index-D5OQhv-T.js.map +1 -0
  51. package/dist/index.d.ts +4 -1
  52. package/dist/index.js +352 -148
  53. package/dist/index.js.map +1 -1
  54. package/dist/types/components/EntityFormActionsProps.d.ts +1 -1
  55. package/dist/types/components/EntityFormProps.d.ts +2 -1
  56. package/dist/types/fields.d.ts +3 -3
  57. package/dist/util/navigation_utils.d.ts +1 -1
  58. package/dist/{util-zfU1zOCX.js → util-DtbWD7LF.js} +5304 -2572
  59. package/dist/util-DtbWD7LF.js.map +1 -0
  60. package/package.json +45 -39
  61. package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
  62. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +12 -2
  63. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -2
  64. package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -2
  65. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -2
  66. package/src/collection_editor/ui/EditorEntityAction.tsx +1 -2
  67. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -2
  68. package/src/collection_editor/ui/NewCollectionButton.tsx +1 -2
  69. package/src/collection_editor/ui/NewCollectionCard.tsx +4 -6
  70. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -2
  71. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +10 -2
  72. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +18 -2
  73. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +22 -7
  74. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +16 -2
  75. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +19 -9
  76. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +13 -2
  77. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +24 -2
  78. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +22 -3
  79. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -2
  80. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +11 -2
  81. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +12 -2
  82. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +16 -3
  83. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +17 -2
  84. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +18 -2
  85. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +1 -2
  86. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +1 -2
  87. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
  88. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +32 -6
  89. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +7 -7
  90. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +14 -2
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +16 -2
  92. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
  93. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -2
  94. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +1 -2
  95. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +9 -2
  96. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +11 -2
  97. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
  98. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +15 -7
  99. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
  100. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +15 -3
  101. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
  102. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
  103. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -2
  104. package/src/collection_editor/validateCollectionJson.ts +9 -9
  105. package/src/components/AdminModeSyncer.tsx +1 -1
  106. package/src/components/ArrayContainer.tsx +19 -15
  107. package/src/components/ClearFilterSortButton.tsx +1 -2
  108. package/src/components/CollectionEditorDialogs.tsx +1 -1
  109. package/src/components/DefaultAppBar.tsx +15 -3
  110. package/src/components/DefaultDrawer.tsx +3 -3
  111. package/src/components/DrawerNavigationGroup.tsx +1 -2
  112. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +14 -6
  113. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +1 -1
  114. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +1 -1
  115. package/src/components/EntityCollectionTable/fields/TableMultipleRelationField.tsx +1 -2
  116. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +1 -2
  117. package/src/components/EntityCollectionTable/fields/TableRelationField.tsx +1 -2
  118. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +1 -2
  119. package/src/components/EntityCollectionTable/fields/VirtualTableSelect.tsx +0 -1
  120. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +15 -27
  121. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +1 -2
  122. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -2
  123. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -5
  124. package/src/components/EntityCollectionTable/table_bindings.tsx +51 -45
  125. package/src/components/EntityCollectionView/Board.tsx +1 -2
  126. package/src/components/EntityCollectionView/BoardColumn.tsx +9 -2
  127. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +5 -4
  128. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +18 -16
  129. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +16 -17
  130. package/src/components/EntityCollectionView/EntityCollectionListView.tsx +87 -18
  131. package/src/components/EntityCollectionView/EntityCollectionView.tsx +20 -11
  132. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +6 -7
  133. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +14 -5
  134. package/src/components/EntityCollectionView/FilterPresetsButton.tsx +292 -0
  135. package/src/components/EntityCollectionView/FiltersDialog.tsx +1 -2
  136. package/src/components/EntityCollectionView/SplitListView.tsx +76 -25
  137. package/src/components/EntityCollectionView/ViewModeToggle.tsx +20 -7
  138. package/src/components/EntityCollectionView/hooks/useKanbanDragAndDrop.ts +1 -1
  139. package/src/components/EntityCollectionView/useBoardDataController.tsx +74 -6
  140. package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +1 -1
  141. package/src/components/EntityDetailView.tsx +619 -0
  142. package/src/components/EntityEditView.tsx +29 -10
  143. package/src/components/EntityEditViewFormActions.tsx +20 -7
  144. package/src/components/EntityPreview.tsx +14 -5
  145. package/src/components/EntitySidePanel.tsx +116 -62
  146. package/src/components/EntityView.tsx +1 -2
  147. package/src/components/HomePage/ContentHomePage.tsx +1 -1
  148. package/src/components/HomePage/FavouritesView.tsx +1 -2
  149. package/src/components/HomePage/NavigationCard.tsx +1 -2
  150. package/src/components/HomePage/NavigationCardBinding.tsx +1 -2
  151. package/src/components/HomePage/NavigationGroup.tsx +1 -2
  152. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  153. package/src/components/PropertyIdCopyTooltip.tsx +1 -2
  154. package/src/components/RebaseAuthGate.tsx +2 -2
  155. package/src/components/RebaseNavigation.tsx +9 -7
  156. package/src/components/ReferenceTable/EntitySelectionTable.tsx +12 -8
  157. package/src/components/RelationSelector.tsx +34 -6
  158. package/src/components/SearchIconsView.tsx +10 -2
  159. package/src/components/SelectableTable/SelectableTable.tsx +2 -2
  160. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -2
  161. package/src/components/SideDialogs.tsx +63 -38
  162. package/src/components/UserSelector.tsx +30 -6
  163. package/src/components/admin/CreationResultDialog.tsx +135 -0
  164. package/src/components/admin/RolesFilterSelect.tsx +45 -0
  165. package/src/components/admin/RolesView.tsx +53 -14
  166. package/src/components/admin/UserRolesSelectField.tsx +50 -0
  167. package/src/components/admin/UsersView.tsx +41 -124
  168. package/src/components/app/Scaffold.tsx +1 -2
  169. package/src/components/common/default_entity_actions.tsx +119 -12
  170. package/src/components/field_configs.tsx +39 -3
  171. package/src/components/history/EntityHistoryEntry.tsx +1 -2
  172. package/src/components/history/EntityHistoryView.tsx +1 -2
  173. package/src/components/index.ts +2 -0
  174. package/src/data_export/export/BasicExportAction.tsx +35 -38
  175. package/src/data_export/export/ExportCollectionAction.tsx +39 -40
  176. package/src/data_import/components/DataNewPropertiesMapping.tsx +15 -2
  177. package/src/data_import/components/ImportFileUpload.tsx +1 -2
  178. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +1 -2
  179. package/src/data_import/import/ImportCollectionAction.tsx +21 -8
  180. package/src/data_import/utils/data.ts +23 -5
  181. package/src/data_import/utils/file_headers.ts +13 -89
  182. package/src/data_import/utils/file_to_json.ts +43 -68
  183. package/src/data_import/utils/transforms.ts +47 -0
  184. package/src/editor/components/SlashCommandMenu.tsx +17 -2
  185. package/src/editor/components/editor-bubble-item.tsx +1 -1
  186. package/src/editor/extensions/Image/index.ts +1 -1
  187. package/src/editor/extensions/Image.ts +1 -1
  188. package/src/editor/selectors/color-selector.tsx +1 -2
  189. package/src/editor/selectors/link-selector.tsx +1 -2
  190. package/src/editor/selectors/node-selector.tsx +16 -2
  191. package/src/editor/selectors/text-buttons.tsx +1 -2
  192. package/src/editor/utils/prosemirror-utils.ts +1 -1
  193. package/src/form/EntityForm.tsx +16 -6
  194. package/src/form/EntityFormActions.tsx +11 -3
  195. package/src/form/PropertyFieldBinding.tsx +5 -12
  196. package/src/form/components/FieldHelperText.tsx +1 -2
  197. package/src/form/components/LocalChangesMenu.tsx +17 -2
  198. package/src/form/components/StorageItemPreview.tsx +1 -2
  199. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -2
  200. package/src/form/field_bindings/KeyValueFieldBinding.tsx +17 -2
  201. package/src/form/field_bindings/MapFieldBinding.tsx +1 -1
  202. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +10 -3
  203. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +1 -2
  204. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +1 -2
  205. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +7 -7
  206. package/src/form/field_bindings/RelationFieldBinding.tsx +150 -147
  207. package/src/form/field_bindings/RepeatFieldBinding.tsx +1 -1
  208. package/src/form/field_bindings/SelectFieldBinding.tsx +1 -2
  209. package/src/form/field_bindings/TextFieldBinding.tsx +10 -2
  210. package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
  211. package/src/form/index.tsx +1 -0
  212. package/src/form/validation.ts +54 -2
  213. package/src/hooks/navigation/useBuildNavigationStateController.tsx +2 -1
  214. package/src/hooks/navigation/useResolvedViews.tsx +30 -15
  215. package/src/hooks/navigation/useTopLevelNavigation.ts +1 -1
  216. package/src/index.ts +6 -0
  217. package/src/preview/PropertyPreview.tsx +1 -1
  218. package/src/preview/components/ImagePreview.tsx +1 -1
  219. package/src/preview/components/UrlComponentPreview.tsx +1 -2
  220. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -2
  221. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +23 -24
  222. package/src/routes/RebaseRoute.tsx +64 -35
  223. package/src/types/components/EntityFormActionsProps.tsx +1 -1
  224. package/src/types/components/EntityFormProps.tsx +3 -1
  225. package/src/types/fields.tsx +4 -3
  226. package/src/util/navigation_utils.ts +4 -3
  227. package/src/util/previews.ts +1 -1
  228. package/src/util/property_utils.tsx +22 -6
  229. package/src/util/resolutions.ts +2 -2
  230. package/dist/CollectionEditorDialog-ywdxhs1L.js.map +0 -1
  231. package/dist/CollectionsStudioView-BDzMFzqH.js.map +0 -1
  232. package/dist/ContentHomePage-0tHuEIm_.js.map +0 -1
  233. package/dist/ExportCollectionAction-BIrq92To.js.map +0 -1
  234. package/dist/ImportCollectionAction-h8yg_To8.js.map +0 -1
  235. package/dist/PropertyEditView-BuZrNnBN.js.map +0 -1
  236. package/dist/RolesView-CMPsaIXo.js.map +0 -1
  237. package/dist/UsersView-BkeblMVT.js.map +0 -1
  238. package/dist/index-BuZaHcyc.js.map +0 -1
  239. package/dist/index-CS6uJ7oW.js.map +0 -1
  240. package/dist/index-eRJbMvHi.js.map +0 -1
  241. package/dist/util-zfU1zOCX.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"CollectionsStudioView-BDzMFzqH.js","sources":["../src/collection_editor/ui/collection_editor/CollectionStudioView.tsx","../src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx"],"sourcesContent":["\nimport { useUnsavedChangesDialog, UnsavedChangesDialog } from \"@rebasepro/core\";\nimport { useUrlController } from \"../../_cms_internals\";\nimport * as React from \"react\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport { Typography, Button } from \"@rebasepro/ui\";\nimport { PlusIcon } from \"lucide-react\";\nimport { useSnackbarController } from \"@rebasepro/core\";\nimport { CollectionEditorDialogProps } from \"./CollectionEditorDialog\";\nimport { AIModifiedPathsProvider } from \"./AIModifiedPathsContext\";\nimport { CollectionEditor } from \"./CollectionEditorDialog\";\nimport { useNavigate } from \"react-router-dom\";\n\nexport type CollectionStudioViewProps = Omit<CollectionEditorDialogProps, \"open\" | \"isNewCollection\" | \"editedCollectionId\" | \"handleClose\" | \"handleCancel\"> & {\n collectionId?: string | \"new\";\n};\n\nexport function CollectionStudioView({ collectionId, ...props }: CollectionStudioViewProps) {\n const snackbarController = useSnackbarController();\n const navigate = useNavigate();\n const urlController = useUrlController();\n\n // Form state from the editor\n const [formDirty, setFormDirty] = useState<boolean>(false);\n const [cancelRequested, setCancelRequested] = useState<boolean>(false);\n\n const { dialogProps, triggerDialog } = useUnsavedChangesDialog(\n formDirty,\n () => setFormDirty(false)\n );\n\n // Map collectionId from URL params if missing? We can pass it directly.\n const activeCollectionId = collectionId;\n\n const handleCancelClick = () => {\n if (!formDirty) {\n navigate(urlController.buildAppUrlPath(\"/\"));\n } else {\n setCancelRequested(true);\n triggerDialog();\n }\n };\n\n return (\n <div className=\"flex-grow flex flex-col h-full w-full bg-white dark:bg-surface-950\">\n <AIModifiedPathsProvider>\n {activeCollectionId ? (\n <CollectionEditor\n key={activeCollectionId}\n {...props}\n fullScreen={true}\n open={true}\n isNewCollection={activeCollectionId === \"new\"}\n editedCollectionId={activeCollectionId !== \"new\" ? activeCollectionId : undefined}\n handleCancel={handleCancelClick}\n handleClose={(savedCollection) => {\n setFormDirty(false);\n if (savedCollection) {\n snackbarController.open({\n type: \"success\",\n message: `Collection ${savedCollection.name || savedCollection.slug} saved`\n });\n if (activeCollectionId === \"new\") {\n navigate(urlController.buildAppUrlPath(`s/schema/${savedCollection.slug}`));\n }\n }\n }}\n setFormDirty={setFormDirty}\n />\n ) : (\n <div className=\"flex-grow flex flex-col items-center justify-center h-full gap-4\">\n <Typography variant=\"label\">\n Select a collection or create a new one\n </Typography>\n <Button\n disabled={props.configController?.readOnly}\n onClick={() => navigate(urlController.buildAppUrlPath(\"schema/new\"))}\n >\n <PlusIcon/>\n Add new collection\n </Button>\n </div>\n )}\n\n <UnsavedChangesDialog\n {...dialogProps}\n handleOk={() => {\n dialogProps.handleOk();\n if (cancelRequested) {\n navigate(urlController.buildAppUrlPath(\"/\"));\n setCancelRequested(false);\n }\n }}\n handleCancel={() => {\n dialogProps.handleCancel();\n setCancelRequested(false);\n }}\n />\n </AIModifiedPathsProvider>\n </div>\n );\n}\n","\nimport { IconForView } from \"@rebasepro/core\";\n;\nimport { useUrlController } from \"../../_cms_internals\";\nimport React, { useState, useEffect } from \"react\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { cls, defaultBorderMixin, ResizablePanels, Typography, IconButton, Button , iconSize, Tooltip } from \"@rebasepro/ui\";\nimport { PlusIcon } from \"lucide-react\";\n;\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { CollectionStudioView } from \"./CollectionStudioView\";\n\nexport interface CollectionsStudioViewProps {\n configController: CollectionsConfigController;\n}\n\nexport function CollectionsStudioView({ configController }: CollectionsStudioViewProps) {\n const navigate = useNavigate();\n const urlController = useUrlController();\n const location = useLocation();\n\n // Determine the active collection from the URL segment after \"schema/\"\n const basePath = urlController.buildAppUrlPath(\"schema\");\n const relativePath = location.pathname.replace(basePath, \"\").replace(/^\\//, \"\");\n\n // The collectionId could be \"new\", empty (no selection), or a collection slug\n const activeCollectionId = relativePath.split(\"/\")[0] || undefined;\n\n const [sidebarSize, setSidebarSize] = useState(() => {\n try {\n const saved = localStorage.getItem(\"rebase_collections_editor_sidebar_size\");\n return saved !== null ? parseFloat(saved) : 25;\n } catch (e) {\n return 25;\n }\n });\n\n useEffect(() => {\n try {\n localStorage.setItem(\"rebase_collections_editor_sidebar_size\", sidebarSize.toString());\n } catch (e) {\n // ignore local storage error\n }\n }, [sidebarSize]);\n\n const collections = configController.collections || [];\n\n return (\n <div className=\"flex h-full w-full bg-white dark:bg-surface-950 overflow-hidden text-text-primary dark:text-text-primary-dark\">\n <ResizablePanels\n orientation=\"horizontal\"\n panelSizePercent={sidebarSize}\n onPanelSizeChange={setSidebarSize}\n minPanelSizePx={220}\n firstPanel={\n <div className={cls(\"flex flex-col h-full w-full bg-white dark:bg-surface-950 border-r\", defaultBorderMixin)}>\n <div className={cls(\"flex items-center justify-between px-3 py-2 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">\n Collections\n </Typography>\n <Tooltip title={configController.readOnly ? configController.readOnlyReason || \"Read only\" : \"Add collection\"}>\n <div>\n <IconButton\n size=\"small\"\n disabled={configController.readOnly}\n onClick={() => navigate(urlController.buildAppUrlPath(\"schema/new\"))}\n className={activeCollectionId === \"new\" ? \"text-primary dark:text-primary-dark\" : \"text-text-secondary dark:text-text-secondary-dark\"}\n >\n <PlusIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </Tooltip>\n </div>\n\n <div className=\"flex-grow overflow-y-auto w-full no-scrollbar p-2 space-y-0.5\">\n {collections.length === 0 && (\n <div className=\"p-4 text-center\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark italic\">\n No collections yet.\n </Typography>\n </div>\n )}\n {collections.map((collection) => {\n const collectionKey = collection.slug;\n const isSelected = activeCollectionId === collectionKey;\n return (\n <div\n key={collectionKey}\n onClick={() => navigate(urlController.buildAppUrlPath(`schema/${collectionKey}`))}\n className={cls(\n \"flex items-center gap-3 px-3 py-2 cursor-pointer rounded-md text-sm transition-colors\",\n isSelected\n ? \"bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary-light\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-900 text-text-secondary dark:text-text-secondary-dark\"\n )}\n >\n <IconForView collectionOrView={collection} size={\"small\"} className={cls(\n isSelected\n ? \"text-primary dark:text-primary-light\"\n : \"text-text-secondary dark:text-text-secondary-dark\"\n )}/>\n <span className=\"truncate flex-1\">\n {collection.name || collection.slug}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n }\n secondPanel={\n <div className=\"flex-grow flex flex-col min-w-0 h-full w-full\">\n {/* We use key to force unmount when switching collections, preventing stale state */}\n {activeCollectionId ? (\n <CollectionStudioView\n key={activeCollectionId}\n configController={configController}\n collectionId={activeCollectionId}\n />\n ) : (\n <div className=\"flex flex-col items-center justify-center h-full gap-4\">\n <Typography variant=\"label\">\n Select a collection or create a new one to start editing\n </Typography>\n <Button\n disabled={configController.readOnly}\n onClick={() => navigate(urlController.buildAppUrlPath(\"schema/new\"))}\n >\n <PlusIcon/>\n Add new collection\n </Button>\n </div>\n )}\n </div>\n }\n />\n </div>\n );\n}\n"],"names":["CollectionStudioView","t0","$","_c","collectionId","props","snackbarController","useSnackbarController","navigate","useNavigate","urlController","useUrlController","formDirty","setFormDirty","useState","cancelRequested","setCancelRequested","t1","Symbol","for","dialogProps","triggerDialog","useUnsavedChangesDialog","activeCollectionId","t2","buildAppUrlPath","handleCancelClick","t3","undefined","savedCollection","open","type","message","name","slug","configController","readOnly","t4","handleOk","t5","handleCancel","t6","t7","CollectionsStudioView","location","useLocation","basePath","relativePath","pathname","replace","split","sidebarSize","setSidebarSize","saved","localStorage","getItem","parseFloat","e","useEffect","setItem","toString","collections","cls","defaultBorderMixin","readOnlyReason","iconSize","smallest","length","map","collection","collectionKey","isSelected"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentHomePage-0tHuEIm_.js","sources":["../src/components/HomePage/FavouritesView.tsx","../src/components/HomePage/NavigationGroup.tsx","../src/components/HomePage/NavigationCard.tsx","../src/components/HomePage/NavigationCardBinding.tsx","../src/components/HomePage/HomePageDnD.tsx","../src/components/HomePage/RenameGroupDialog.tsx","../src/components/HomePage/ContentHomePage.tsx"],"sourcesContent":["import type { NavigationEntry } from \"@rebasepro/types\";\nimport { useNavigate } from \"react-router-dom\";\n;\nimport { Chip, Collapse } from \"@rebasepro/ui\";\nimport { StarIcon } from \"lucide-react\";\nimport { useUserConfigurationPersistence } from \"@rebasepro/core\";\nimport { useNavigationStateController } from \"../../index\";\n\nfunction NavigationChip({ entry }: { entry: NavigationEntry }) {\n\n const navigate = useNavigate();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favourite = userConfigurationPersistence.favouritePaths.includes(entry.slug);\n const onIconClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== entry.slug)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, entry.slug]\n );\n }\n };\n return <Chip\n key={entry.slug}\n onClick={() => navigate(entry.url)}\n icon={<StarIcon\n onClick={onIconClick}\n size={\"small\"}\n className={favourite ? \"text-secondary\" : \"text-surface-400 dark:text-surface-500\"}/>\n }>\n {entry.name}\n </Chip>;\n}\n\nexport function FavouritesView({ hidden }: { hidden: boolean }) {\n\n const navigationStateController = useNavigationStateController();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favouriteCollections = (userConfigurationPersistence?.favouritePaths ?? [])\n .map((path) => navigationStateController.topLevelNavigation?.navigationEntries.find((entry) => entry.slug === path))\n .filter(Boolean) as NavigationEntry[];\n\n return <Collapse in={favouriteCollections.length > 0}>\n <div className=\"flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]\">\n {favouriteCollections.map((entry) => <NavigationChip key={entry.slug}\n entry={entry}/>)}\n </div>\n </Collapse>;\n}\n","import React, { PropsWithChildren, useState } from \"react\";\nimport { cls, IconButton, Typography, ExpandablePanel , iconSize } from \"@rebasepro/ui\";\nimport { PencilIcon } from \"lucide-react\";\nimport { useTranslation } from \"@rebasepro/core\";\n\nexport function NavigationGroup({\n children,\n group,\n minimised,\n isPreview,\n isPotentialCardDropTarget,\n onEditGroup,\n dndDisabled,\n collapsed,\n onToggleCollapsed\n}: PropsWithChildren<{\n group: string | undefined,\n minimised?: boolean,\n isPreview?: boolean,\n isPotentialCardDropTarget?: boolean,\n onEditGroup?: (groupName: string) => void;\n dndDisabled?: boolean;\n collapsed?: boolean;\n onToggleCollapsed?: () => void;\n}>) {\n\n const { t } = useTranslation();\n const [isHovered, setIsHovered] = useState(false);\n const currentGroupName = group ?? t(\"views_group\");\n\n // Show caret only when not in preview and there is a toggle handler\n const showCaret = !isPreview && !!onToggleCollapsed;\n\n // Helper for the title content (left side)\n const TitleContent = (\n <div className={cls(\"flex items-center\", isPreview ? \"px-1 py-0.5\" : \"\")}\n >\n <Typography\n variant={isPreview ? \"body2\" : \"caption\"}\n component={\"h2\"}\n color=\"secondary\"\n className={cls(\n \"px-4 py-1 rounded\",\n \"font-semibold text-[11px] uppercase tracking-wider text-surface-400 dark:text-surface-400\"\n )}\n >\n {currentGroupName}\n </Typography>\n {!isPreview && onEditGroup && !dndDisabled && (\n <IconButton\n size=\"smallest\"\n onClick={(e) => {\n e.stopPropagation(); // Prevent toggle on click\n onEditGroup(currentGroupName);\n }}\n className={cls(\"ml-2 \", isHovered ? \"opacity-100\" : \"opacity-0\", \"transition-opacity duration-100\")}\n >\n <PencilIcon size={iconSize.smallest}/>\n </IconButton>\n )}\n </div>\n );\n\n return (\n <div className={cls(\n !isPotentialCardDropTarget ? \"my-10\" : \"my-6\",\n \"transition-all duration-200 ease-in-out\"\n )}\n >\n {/* Preview: static header + content (no caret / no collapse) */}\n {isPreview && (\n <>\n <div\n className={cls(\n \"flex items-center justify-between w-full\",\n \"p-4 py-2\"\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {TitleContent}\n </div>\n {children}\n </>\n )}\n\n {/* Interactive collapsible version when a toggle handler is provided */}\n {!isPreview && showCaret && (\n <ExpandablePanel\n invisible\n expanded={!collapsed}\n onExpandedChange={(open) => {\n if (open !== !collapsed) {\n onToggleCollapsed?.();\n }\n }}\n className={cls(\"mt-6\")}\n titleClassName={cls(\n \"min-h-0 p-0 border-none\",\n \"rounded flex items-center justify-between w-full\",\n \"hover:bg-transparent\",\n \"cursor-pointer select-none\",\n collapsed && \"bg-surface-100 dark:bg-surface-900/50\"\n )}\n innerClassName={cls(\"mt-4\", !minimised ? \"pt-0\" : \"\")}\n title={\n <div\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className=\"flex items-center\"\n >\n {TitleContent}\n </div>\n }\n >\n {minimised ? (\n <div className={cls(\"mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg\")}\n style={{ minHeight: \"50px\" }}>\n </div>\n ) : (\n <div className={cls(\"mt-4\", !minimised ? \"pt-0\" : \"\")}>\n {children}\n </div>\n )}\n </ExpandablePanel>\n )}\n\n {/* Non-collapsible (no caret) runtime, keep old behavior */}\n {!isPreview && !showCaret && (\n <>\n <div\n className={cls(\n \"flex items-center justify-between w-full\",\n \"mt-6\"\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {TitleContent}\n </div>\n\n {!collapsed && (\n minimised ? (\n <div className={cls(\"mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg\")}\n style={{ minHeight: \"50px\" }}>\n </div>\n ) : (\n <div className={cls(\"mt-4\", !minimised ? \"pt-0\" : \"\")}>\n {children}\n </div>\n )\n )}\n </>\n )}\n </div>\n );\n}\n","import { Card, cls, Markdown, Typography } from \"@rebasepro/ui\";\nimport { ArrowRightIcon } from \"lucide-react\";\nimport React from \"react\";\n\nexport type NavigationCardProps = {\n name: string,\n description?: string;\n actions: React.ReactNode;\n icon: React.ReactNode;\n additionalContent?: React.ReactNode;\n onClick?: () => void,\n shrink?: boolean\n};\n\n// Wrap the component with React.memo\nexport const NavigationCard = React.memo(function NavigationCard({\n name,\n description,\n icon,\n actions,\n additionalContent,\n onClick,\n shrink\n}: NavigationCardProps) {\n\n return (\n <Card\n className={cls(\n \"group h-full p-4 cursor-pointer transition-all duration-150 ease-in-out\",\n \"border-surface-200 dark:border-surface-700/40\",\n \"hover:shadow-md hover:shadow-black/[0.04]\",\n \"hover:border-surface-300 dark:hover:border-primary/20\",\n shrink && \"w-full max-w-full min-h-0 scale-75\"\n )}\n onClick={() => {\n onClick?.();\n }}\n >\n\n <div className=\"flex flex-col h-full\">\n {/* Header: title + icon left, actions right */}\n <div className=\"flex items-center w-full justify-between mb-1\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center justify-center w-7 h-7 rounded-lg bg-primary/8 dark:bg-primary/10 text-primary/70 dark:text-primary/60 transition-colors duration-200 group-hover:bg-primary/12 dark:group-hover:bg-primary/15 group-hover:text-primary dark:group-hover:text-primary/80\">\n {icon}\n </div>\n <Typography variant=\"subtitle1\"\n component=\"h2\">\n {name}\n </Typography>\n </div>\n\n <div\n className=\"flex items-center gap-0.5\"\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }}>\n {actions}\n </div>\n </div>\n\n {/* Description */}\n <div className=\"grow pl-[44px]\">\n {description && <Typography variant=\"caption\"\n color=\"secondary\"\n component=\"div\">\n <Markdown source={description} size={\"small\"}/>\n </Typography>}\n </div>\n\n {additionalContent && (\n <div className=\"pl-[44px] pointer-events-none\">\n {additionalContent}\n </div>\n )}\n\n {/* Arrow */}\n <div className=\"self-end mt-1\">\n <div className={\"transition-transform duration-200 group-hover:translate-x-0.5\"}>\n <ArrowRightIcon className=\"text-primary\"/>\n </div>\n </div>\n\n </div>\n\n </Card>)\n});\n","import type { NavigationEntry, EntityCollection } from \"@rebasepro/types\";\nimport { useNavigate } from \"react-router-dom\";\n;\nimport { IconButton, Tooltip } from \"@rebasepro/ui\";\nimport { StarIcon } from \"lucide-react\";\nimport { NavigationCard } from \"./NavigationCard\";\nimport { SmallNavigationCard } from \"./SmallNavigationCard\";\nimport React from \"react\";\nimport { useRebaseContext, useSlot } from \"@rebasepro/core\";\nimport { IconForView } from \"@rebasepro/core\";\nimport { useUserConfigurationPersistence } from \"@rebasepro/core\";\n\n/**\n * This is the component used in the home page to render a card for each\n * collection or view.\n * @group Components\n * @param view\n * @param path\n * @param collection\n * @param url\n * @param name\n * @param description\n * @param onClick\n\n */\nexport function NavigationCardBinding({\n slug,\n collection,\n view,\n url,\n name,\n description,\n onClick,\n type,\n shrink\n}: NavigationEntry & {\n onClick?: () => void,\n shrink?: boolean // <-- add shrink prop type\n}) {\n\n const userConfigurationPersistence = useUserConfigurationPersistence();\n const collectionIcon = <IconForView collectionOrView={collection ?? view}/>;\n\n const navigate = useNavigate();\n const context = useRebaseContext();\n\n const favourite = (userConfigurationPersistence?.favouritePaths ?? []).includes(slug);\n\n const actionsArray: React.ReactNode[] = userConfigurationPersistence\n ? [\n <IconButton\n key={\"favourite\"}\n size={\"small\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== slug)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, slug]\n );\n }\n }}>\n <StarIcon\n className={favourite ? \"text-secondary\" : \"text-surface-400 dark:text-surface-500\"}/>\n </IconButton>\n ]\n : [];\n\n const pluginCardActions = useSlot(\"home.collection.actions\", {\n slug: slug,\n collection: collection!,\n context\n });\n\n const pluginCardInsights = useSlot(\"home.card.insight\", {\n slug: slug,\n collection: collection!,\n context\n });\n\n\n const actions: React.ReactNode | undefined = <>\n {actionsArray}\n {pluginCardActions}\n </>\n\n return <NavigationCard\n icon={collectionIcon}\n name={name}\n description={description}\n actions={actions}\n additionalContent={pluginCardInsights.length > 0 ? <>{pluginCardInsights}</> : undefined}\n onClick={() => {\n onClick?.();\n navigate(url);\n if (userConfigurationPersistence) {\n userConfigurationPersistence.setRecentlyVisitedPaths(\n [slug, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== slug)]\n );\n }\n }}\n shrink={shrink}\n />;\n}\n","import type { NavigationEntry } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Active,\n closestCenter,\n closestCorners,\n CollisionDetection,\n DropAnimation,\n getFirstCollision,\n KeyboardSensor,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n UniqueIdentifier,\n useDndMonitor,\n useDroppable,\n useSensor,\n useSensors\n} from \"@dnd-kit/core\";\nimport {\n AnimateLayoutChanges,\n arrayMove,\n defaultAnimateLayoutChanges,\n rectSortingStrategy,\n SortableContext,\n useSortable\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\n\nimport { NavigationCardBinding } from \"./NavigationCardBinding\";\n;\nimport { cls } from \"@rebasepro/ui\";\n\nconst animateLayoutChanges: AnimateLayoutChanges = (args) =>\n defaultAnimateLayoutChanges({\n ...args,\n wasDragging: true\n });\n\nconst dropAnimationConfig: DropAnimation = {};\n\nconst cloneSerializableNavigationEntry = (entry: NavigationEntry): NavigationEntry => {\n const clonedEntry: Partial<NavigationEntry> = {\n id: entry.id,\n slug: entry.slug,\n url: entry.url,\n name: entry.name,\n type: entry.type,\n collection: entry.collection ? { ...entry.collection } : undefined,\n view: entry.view ? { ...entry.view } : undefined,\n ...(entry.group && { group: entry.group }),\n ...(entry.description && { description: entry.description })\n };\n return clonedEntry as NavigationEntry;\n};\n\nconst cloneItemsForDnd = (items: { name: string; entries: NavigationEntry[] }[]) =>\n items.map((g) => ({\n name: g.name,\n entries: g.entries.map(cloneSerializableNavigationEntry)\n }));\n\n/* ─────────────────────────────────────────────────────────── */\n/* Sortable card & group */\n\n/* ─────────────────────────────────────────────────────────── */\nexport function SortableNavigationCard({\n entry,\n onClick\n}: {\n entry: NavigationEntry;\n onClick?: () => void;\n}) {\n const {\n setNodeRef,\n listeners,\n attributes,\n transform,\n transition,\n isDragging\n } =\n useSortable({\n id: entry.url,\n animateLayoutChanges\n });\n\n const style = {\n transform: transform ? CSS.Transform.toString(transform) : undefined,\n transition,\n opacity: isDragging ? 0 : 1\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n <NavigationCardBinding {...entry} onClick={onClick}/>\n </div>\n );\n}\n\nexport function NavigationGroupDroppable({\n id,\n itemIds,\n children,\n isPotentialCardDropTarget = false\n}: {\n id: UniqueIdentifier;\n itemIds: UniqueIdentifier[];\n children: React.ReactNode;\n isPotentialCardDropTarget?: boolean;\n}) {\n const { setNodeRef } = useDroppable({ id });\n\n return (\n <div\n ref={setNodeRef}\n className={cls(\n isPotentialCardDropTarget\n ? \"p-2 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg\"\n : undefined,\n \"transition-all duration-200 ease-in-out\"\n )}\n >\n <SortableContext items={itemIds} strategy={rectSortingStrategy}>\n {children}\n </SortableContext>\n </div>\n );\n}\n\nexport function SortableNavigationGroup({\n groupName,\n children,\n disabled\n}: {\n groupName: string;\n children: React.ReactNode;\n disabled?: boolean;\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } =\n useSortable({\n id: groupName,\n animateLayoutChanges,\n disabled\n });\n\n const style = {\n transform: transform ? CSS.Transform.toString(transform) : undefined,\n transition,\n opacity: isDragging ? 0 : 1\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes} {...listeners}>\n {children}\n </div>\n );\n}\n\nexport function useHomePageDnd({\n items,\n setItems,\n disabled,\n onCardMovedBetweenGroups,\n onGroupMoved,\n onNewGroupDrop,\n onPersist\n}: {\n items: { name: string; entries: NavigationEntry[] }[];\n setItems: (\n newItemsOrUpdater:\n | { name: string; entries: NavigationEntry[] }[]\n | ((\n currentItems: { name: string; entries: NavigationEntry[] }[]\n ) => { name: string; entries: NavigationEntry[] }[])\n ) => void;\n disabled: boolean;\n onCardMovedBetweenGroups?: (card: NavigationEntry) => void;\n onGroupMoved?: (groupName: string, oldIndex: number, newIndex: number) => void;\n onNewGroupDrop?: () => void;\n onPersist?: (latest: { name: string; entries: NavigationEntry[] }[]) => void;\n}) {\n /* ---------------- local state ---------------- */\n const dndItems = items;\n const setDndItems = setItems;\n\n const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);\n const [activeIsGroup, setActiveIsGroup] = useState(false);\n const [currentDraggingGroupId, setCurrentDraggingGroupId] =\n useState<UniqueIdentifier | null>(null);\n const [dndKitActiveNode, setDndKitActiveNode] = useState<Active | null>(null);\n const [isDraggingCardOnly, setIsDraggingCardOnly] = useState(false);\n const [dialogOpenForGroup, setDialogOpenForGroup] = useState<string | null>(null);\n const [isHoveringNewGroupDropZone, setIsHoveringNewGroupDropZone] =\n useState(false);\n const [pendingNewGroupName, setPendingNewGroupName] = useState<string | null>(null);\n const [stateBeforeNewGroup, setStateBeforeNewGroup] = useState<\n { name: string; entries: NavigationEntry[] }[] | null\n >(null);\n\n /* store the original state before any drag modifications */\n const preDragItemsRef = useRef<\n { name: string; entries: NavigationEntry[] }[] | null\n >(null);\n\n /* store interim state for cross-group moves */\n const interimItemsRef = useRef<\n { name: string; entries: NavigationEntry[] }[] | null\n >(null);\n useEffect(() => {\n interimItemsRef.current = dndItems;\n }, [dndItems]);\n\n /* ---------------- sensors ---------------- */\n const mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance: 10 } });\n const touchSensor = useSensor(TouchSensor, {\n activationConstraint: {\n delay: 150,\n tolerance: 5\n }\n });\n const keyboardSensor = useSensor(KeyboardSensor);\n const sensors = useSensors(mouseSensor, touchSensor, keyboardSensor);\n\n /* ---------------- helpers ---------------- */\n const dndContainers = dndItems.map((g) => g.name);\n\n const findDndContainer = useCallback(\n (id: UniqueIdentifier): string | undefined => {\n if (!id) return undefined;\n const group = dndItems.find((g) => g.name === id);\n if (group) return group.name;\n for (const g of dndItems) {\n if (g.entries.some((e) => e.url === id)) return g.name;\n }\n return undefined;\n },\n [dndItems]\n );\n\n /* ---------------- collision detection ---------------- */\n const lastOverId = useRef<UniqueIdentifier | null>(null);\n const recentlyMovedToNewContainer = useRef(false);\n\n const collisionDetection: CollisionDetection = useCallback(\n (args) => {\n if (disabled || !activeId) return [];\n if (activeIsGroup) {\n const groups = args.droppableContainers.filter((c) =>\n dndItems.some((g) => g.name === c.id)\n );\n if (!groups.length) return [];\n return closestCenter({\n ...args,\n droppableContainers: groups\n });\n }\n\n const pointer = pointerWithin(args);\n if (pointer.length) {\n const zone = pointer.find((c) => c.id === \"new-group-drop-zone\");\n if (zone) return [zone];\n\n const container = pointer.find((c) =>\n dndItems.some((g) => g.name === c.id)\n );\n if (container) {\n const itemsIn = dndItems.find((g) => g.name === container.id)\n ?.entries;\n if (itemsIn?.length) {\n const closest = closestCorners({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (c) => itemsIn.some((e) => e.url === c.id)\n )\n });\n if (closest.length) return closest;\n }\n return [container];\n }\n const first = getFirstCollision(pointer, \"id\");\n if (first) return [{ id: first }];\n }\n\n const rects = rectIntersection(args);\n const zoneRect = rects.find((c) => c.id === \"new-group-drop-zone\");\n if (zoneRect) return [zoneRect];\n\n let overId = getFirstCollision(rects, \"id\");\n if (overId != null) {\n const overIsContainer = dndItems.some((g) => g.name === overId);\n if (overIsContainer) {\n const itemsIn = dndItems.find((g) => g.name === overId)\n ?.entries;\n if (itemsIn?.length) {\n const closestItem = closestCorners({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (c) => itemsIn.some((e) => e.url === c.id)\n )\n })[0]?.id;\n if (closestItem) overId = closestItem;\n }\n }\n lastOverId.current = overId;\n return [{ id: overId }];\n }\n\n if (\n recentlyMovedToNewContainer.current &&\n lastOverId.current &&\n !activeIsGroup\n )\n return [{ id: lastOverId.current }];\n\n return [];\n },\n [activeId, dndItems, disabled, activeIsGroup]\n );\n\n /* ---------------- drag handlers ---------------- */\n const handleDragStart = ({ active }: { active: Active }) => {\n setDndKitActiveNode(active);\n if (disabled) return;\n\n // Capture the original state before any drag modifications\n preDragItemsRef.current = cloneItemsForDnd(dndItems);\n\n const isGroup = dndItems.some((g) => g.name === active.id);\n if (!active.data.current) active.data.current = {};\n active.data.current.type = isGroup ? \"group\" : \"item\";\n\n setActiveId(active.id);\n setActiveIsGroup(isGroup);\n setIsDraggingCardOnly(!isGroup);\n if (isGroup) setCurrentDraggingGroupId(active.id);\n recentlyMovedToNewContainer.current = false;\n };\n\n const handleDragOver = ({\n active,\n over\n }: { active: Active; over: any }) => {\n if (disabled || !over) return;\n\n const activeIdNow = active.id;\n const overIdNow = over.id;\n if (activeIdNow === overIdNow) return;\n if (activeIsGroup) return;\n\n const activeCont = findDndContainer(activeIdNow);\n const overCont = findDndContainer(overIdNow);\n if (!activeCont) return;\n\n if (overCont && activeCont !== overCont) {\n recentlyMovedToNewContainer.current = true;\n lastOverId.current = overIdNow;\n\n // Update state for visual feedback during drag\n setDndItems((current) => {\n const newState = cloneItemsForDnd(current);\n const srcIdx = newState.findIndex((g) => g.name === activeCont);\n const tgtIdx = newState.findIndex((g) => g.name === overCont);\n if (srcIdx === -1 || tgtIdx === -1) return current;\n const src = newState[srcIdx];\n const tgt = newState[tgtIdx];\n const idxInSrc = src.entries.findIndex((e) => e.url === activeIdNow);\n if (idxInSrc === -1) return current;\n const [moved] = src.entries.splice(idxInSrc, 1);\n\n // Calculate insertion position - SAME logic as handleDragEnd\n const overIsContainer = overIdNow === overCont;\n if (overIsContainer) {\n tgt.entries.push(moved);\n } else {\n const overIdx = tgt.entries.findIndex((e) => e.url === overIdNow);\n if (overIdx !== -1) {\n tgt.entries.splice(overIdx, 0, moved);\n } else {\n tgt.entries.push(moved);\n }\n }\n\n return newState;\n });\n } else if (activeCont === overCont) {\n recentlyMovedToNewContainer.current = false;\n }\n };\n\n const handleDragEnd = ({\n active,\n over\n }: { active: Active; over: any }) => {\n if (disabled || !over) {\n resetDragState();\n return;\n }\n\n const activeIdNow = active.id;\n const overIdNow = over.id;\n\n /* ─── group reorder ─── */\n if (activeIsGroup) {\n if (\n activeIdNow !== overIdNow &&\n dndItems.some((g) => g.name === overIdNow)\n ) {\n const from = dndItems.findIndex((g) => g.name === activeIdNow);\n const to = dndItems.findIndex((g) => g.name === overIdNow);\n if (from !== -1 && to !== -1) {\n const newState = arrayMove(dndItems, from, to);\n setDndItems(newState);\n onPersist?.(newState);\n onGroupMoved?.(activeIdNow as string, from, to);\n }\n }\n }\n /* ─── card move ─── */\n else {\n // CRITICAL: Find source container from ORIGINAL pre-drag state, not current (potentially stale) dndItems\n const findContainerInState = (id: string, state: { name: string; entries: NavigationEntry[] }[]): string | undefined => {\n const group = state.find((g) => g.name === id);\n if (group) return group.name;\n for (const g of state) {\n if (g.entries.some((e) => e.url === id)) return g.name;\n }\n return undefined;\n };\n\n const sourceState = preDragItemsRef.current || dndItems;\n const activeCont = findContainerInState(activeIdNow as string, sourceState);\n const overCont = findDndContainer(overIdNow);\n\n /* drop on new-group zone */\n if (overIdNow === \"new-group-drop-zone\") {\n if (activeCont) {\n // Save current state before making changes\n setStateBeforeNewGroup(cloneItemsForDnd(dndItems));\n\n const newState = cloneItemsForDnd(dndItems);\n const srcIdx = newState.findIndex((g) => g.name === activeCont);\n if (srcIdx !== -1) {\n const src = newState[srcIdx];\n const idxInSrc = src.entries.findIndex(\n (e) => e.url === activeIdNow\n );\n if (idxInSrc !== -1) {\n const [dragged] = src.entries.splice(idxInSrc, 1);\n if (src.entries.length === 0) newState.splice(srcIdx, 1);\n\n let tentative = \"New Group\";\n let counter = 1;\n while (newState.some((g) => g.name === tentative))\n tentative = `New Group ${counter++}`;\n\n newState.push({\n name: tentative,\n entries: [dragged]\n });\n\n // Update local state but DON'T persist yet\n setDndItems(newState);\n setPendingNewGroupName(tentative);\n setDialogOpenForGroup(tentative);\n onNewGroupDrop?.();\n }\n }\n }\n }\n /* reorder inside same container */\n else {\n const overCont = findDndContainer(overIdNow);\n if (activeCont === overCont) {\n const grpIdx = dndItems.findIndex((g) => g.name === activeCont);\n if (grpIdx !== -1) {\n const group = dndItems[grpIdx];\n const oldIdx = group.entries.findIndex(\n (e) => e.url === activeIdNow\n );\n let newIdx = group.entries.findIndex(\n (e) => e.url === overIdNow\n );\n if (newIdx === -1 && overIdNow === activeCont)\n newIdx = group.entries.length - 1;\n if (\n oldIdx !== -1 &&\n newIdx !== -1 &&\n oldIdx !== newIdx\n ) {\n const reordered = arrayMove(group.entries, oldIdx, newIdx);\n const newState = [...dndItems];\n newState[grpIdx] = {\n ...group,\n entries: reordered\n };\n setDndItems(newState);\n onPersist?.(newState);\n }\n }\n } else if (overCont && activeCont !== overCont) {\n // Card moved between different groups - use CLEAN pre-drag state\n const finalState = cloneItemsForDnd(sourceState);\n\n // Find target container from clean state too\n const finalOverId = lastOverId.current || overIdNow;\n const cleanOverCont = findContainerInState(finalOverId as string, sourceState) || overCont;\n\n const srcIdx = finalState.findIndex((g) => g.name === activeCont);\n const tgtIdx = finalState.findIndex((g) => g.name === cleanOverCont);\n\n if (srcIdx !== -1 && tgtIdx !== -1) {\n const src = finalState[srcIdx];\n const tgt = finalState[tgtIdx];\n const idxInSrc = src.entries.findIndex((e) => e.url === activeIdNow);\n\n if (idxInSrc !== -1) {\n // Remove from source\n const [moved] = src.entries.splice(idxInSrc, 1);\n\n // Calculate insertion position in target\n const overIsContainer = finalOverId === cleanOverCont;\n if (overIsContainer) {\n tgt.entries.push(moved);\n } else {\n const overIdx = tgt.entries.findIndex((e) => e.url === finalOverId);\n if (overIdx !== -1) {\n tgt.entries.splice(overIdx, 0, moved);\n } else {\n tgt.entries.push(moved);\n }\n }\n\n // Remove empty source group if needed\n if (src.entries.length === 0) {\n finalState.splice(srcIdx, 1);\n }\n\n setDndItems(finalState);\n onPersist?.(finalState);\n\n onCardMovedBetweenGroups?.(moved);\n }\n }\n } else if (recentlyMovedToNewContainer.current) {\n // This shouldn't happen but log it for debugging\n console.error(\"Move between containers detected but conditions not met\", {\n activeCont,\n overCont,\n activeIdNow,\n overIdNow\n });\n }\n }\n }\n\n resetDragState();\n };\n\n const resetDragState = () => {\n setDndKitActiveNode(null);\n setActiveId(null);\n setActiveIsGroup(false);\n setCurrentDraggingGroupId(null);\n setIsDraggingCardOnly(false);\n recentlyMovedToNewContainer.current = false;\n };\n\n const handleDragCancel = () => resetDragState();\n\n /* ---------------- group rename ---------------- */\n const handleRenameGroup = (oldName: string, newName: string) => {\n setDndItems((current) => {\n const idx = current.findIndex((g) => g.name === oldName);\n if (idx === -1) return current;\n if (current.some((g) => g.name === newName && g.name !== oldName))\n return current;\n\n const updated = [...current];\n updated[idx] = {\n ...updated[idx],\n name: newName\n };\n\n // Persist after successful rename\n onPersist?.(updated);\n return updated;\n });\n\n // Clear all pending state\n setPendingNewGroupName(null);\n setStateBeforeNewGroup(null);\n setDialogOpenForGroup(null);\n };\n\n /* Handle dialog close without renaming */\n const handleDialogClose = () => {\n // If there's a pending new group that wasn't renamed, restore previous state\n if (pendingNewGroupName && dialogOpenForGroup === pendingNewGroupName && stateBeforeNewGroup) {\n // Restore the state from before the new group was created\n setDndItems(stateBeforeNewGroup);\n }\n\n // Clear all pending state\n setPendingNewGroupName(null);\n setStateBeforeNewGroup(null);\n setDialogOpenForGroup(null);\n };\n\n /* ---------------- public API ---------------- */\n const activeItemForOverlay =\n disabled || !activeId || activeIsGroup\n ? null\n : dndItems.flatMap((g) => g.entries).find((e) => e.url === activeId) || null;\n\n const activeGroupData =\n disabled || !activeId || !activeIsGroup\n ? null\n : dndItems.find((g) => g.name === activeId) || null;\n\n return {\n sensors,\n collisionDetection,\n onDragStart: handleDragStart,\n onDragOver: handleDragOver,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n dropAnimation: dropAnimationConfig,\n activeItemForOverlay,\n activeGroupData,\n draggingGroupId: currentDraggingGroupId,\n containers: dndContainers,\n dndKitActiveNode,\n isDraggingCardOnly,\n dialogOpenForGroup,\n setDialogOpenForGroup,\n handleRenameGroup,\n handleDialogClose,\n isHoveringNewGroupDropZone,\n setIsHoveringNewGroupDropZone\n };\n}\n\nexport function NewGroupDropZone({\n disabled,\n setIsHovering\n}: {\n disabled: boolean;\n setIsHovering: (v: boolean) => void;\n}) {\n const {\n setNodeRef,\n isOver\n } = useDroppable({\n id: \"new-group-drop-zone\",\n disabled\n });\n const [isVisible, setIsVisible] = useState(false);\n\n useDndMonitor({\n onDragStart({ active }) {\n if (disabled) return;\n const tp = active.data.current?.type;\n setIsVisible(tp === \"item\");\n },\n onDragEnd() {\n setIsVisible(false);\n },\n onDragCancel() {\n setIsVisible(false);\n }\n });\n\n useEffect(() => {\n setIsHovering(isOver && isVisible);\n }, [isOver, isVisible, setIsHovering]);\n\n if (!isVisible || disabled) return null;\n\n return (\n <div\n ref={setNodeRef}\n className={cls(\n \"fixed right-8 top-1/2 -translate-y-1/2 w-[200px] h-[120px] border border-dashed rounded-lg flex items-center justify-center transition-all\",\n isOver\n ? \"bg-surface-accent-100 dark:bg-surface-accent-800 border-surface-300 dark:border-surface-600\"\n : \"bg-surface-50 dark:bg-surface-900 border-surface-200 dark:border-surface-700\"\n )}>\n <div className=\"text-center p-4\">\n <span className=\"block font-medium text-sm\">\n Drop here to create a new group\n </span>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\n\ninterface RenameGroupDialogProps {\n open: boolean;\n initialName: string;\n existingGroupNames: string[]; // Names of other existing groups to check for duplicates\n onClose: () => void;\n onRename: (newName: string) => void;\n}\n\nexport function RenameGroupDialog({\n open,\n initialName,\n existingGroupNames,\n onClose,\n onRename\n}: RenameGroupDialogProps) {\n const { t } = useTranslation();\n const [name, setName] = useState(initialName);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null); // Create a ref for the input\n\n useEffect(() => {\n if (open) {\n setName(initialName);\n setError(null);\n // Focus and select text when dialog opens\n setTimeout(() => { // setTimeout to ensure the input is rendered and focusable\n if (inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, 100);\n }\n }, [initialName, open]);\n\n const handleNameChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const newName = event.target.value;\n setName(newName);\n if (!newName.trim()) {\n setError(t(\"group_name_empty_error\"));\n } else if (existingGroupNames.includes(newName.trim())) {\n setError(t(\"group_name_exists_error\"));\n } else {\n setError(null);\n }\n };\n\n const handleSave = () => {\n const trimmedName = name.trim();\n if (!trimmedName) {\n setError(t(\"group_name_empty_error\"));\n return;\n }\n if (existingGroupNames.includes(trimmedName)) {\n setError(t(\"group_name_exists_error\"));\n return;\n }\n if (!error) {\n onRename(trimmedName);\n onClose();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault(); // Prevent default form submission behavior\n const trimmedName = name.trim();\n // We need to check the error state directly as well,\n // because the error state might not have updated if the user types and immediately hits enter.\n let currentError = null;\n if (!trimmedName) {\n currentError = t(\"group_name_empty_error\");\n } else if (existingGroupNames.includes(trimmedName)) {\n currentError = t(\"group_name_exists_error\");\n }\n\n if (!currentError && trimmedName) {\n handleSave();\n } else if (currentError) {\n setError(currentError); // Ensure error is displayed if trying to submit with Enter\n }\n }\n };\n\n const handleClose = () => {\n setName(initialName);\n setError(null);\n onClose();\n };\n\n if (!open) return null;\n\n return (\n <Dialog open={open}>\n <DialogTitle>{t(\"rename_group\")}</DialogTitle>\n <DialogContent>\n <TextField\n inputRef={inputRef} // Pass the ref to the TextField\n label={t(\"group_name_label\")}\n value={name}\n onChange={handleNameChange}\n onKeyDown={handleKeyDown} // Added onKeyDown handler\n error={!!error}\n aria-describedby={error ? \"group-name-error\" : undefined}\n />\n {error && <p id=\"group-name-error\" style={{ display: \"none\" }}>{error}</p>}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}\n variant=\"text\">\n {t(\"cancel\")}\n </Button>\n <Button onClick={handleSave}\n disabled={!!error || !name.trim()}>\n {t(\"save\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import type { HomePageSection, NavigationEntry, NavigationGroupMapping, PluginGenericProps } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport Fuse from \"fuse.js\";\nimport { Container, SearchBar } from \"@rebasepro/ui\";\nimport { AnalyticsEvent } from \"@rebasepro/types\";\nimport { FavouritesView } from \"./FavouritesView\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { NavigationGroup } from \"./NavigationGroup\";\nimport {\n NavigationGroupDroppable,\n NewGroupDropZone,\n SortableNavigationCard,\n SortableNavigationGroup,\n useHomePageDnd\n} from \"./HomePageDnD\";\nimport { DndContext, DragOverlay, MeasuringStrategy } from \"@dnd-kit/core\";\nimport { NavigationCardBinding } from \"./NavigationCardBinding\";\nimport { SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { restrictToVerticalAxis, restrictToWindowEdges } from \"@dnd-kit/modifiers\";\nimport { RenameGroupDialog } from \"./RenameGroupDialog\";\nimport { toArray } from \"@rebasepro/utils\";\nimport { useCollapsedGroups, buildCollapsedDefaults, useCustomizationController, useTranslation, useSlot, useAdminModeController, useRebaseRegistry } from \"@rebasepro/core\";\nimport { useRestoreScroll } from \"@rebasepro/core\";\n\nimport { BootstrapAdminBanner } from \"@rebasepro/core\";\nimport { useBreadcrumbsController, useCMSContext } from \"../../index\";\n\nexport const DEFAULT_GROUP_NAME = \"Views\";\nexport const ADMIN_GROUP_NAME = \"Admin\";\n\nexport function ContentHomePage({\n additionalActions,\n additionalChildrenStart,\n additionalChildrenEnd,\n sections,\n hiddenGroups\n}: {\n additionalActions?: React.ReactNode;\n additionalChildrenStart?: React.ReactNode;\n additionalChildrenEnd?: React.ReactNode;\n sections?: HomePageSection[];\n hiddenGroups?: string[];\n}) {\n\n const context = useCMSContext();\n const { navigationStateController } = context;\n const customizationController = useCustomizationController();\n const adminModeController = useAdminModeController();\n const registry = useRebaseRegistry();\n\n const { resolvedSlots } = customizationController;\n const breadcrumbs = useBreadcrumbsController();\n const { t } = useTranslation();\n\n useEffect(() => {\n breadcrumbs.set({ breadcrumbs: [] });\n }, [breadcrumbs.set]);\n\n const {\n allowDragAndDrop = false,\n navigationEntries: unFilteredNavigationEntries = [],\n groups: unFilteredGroupOrder = [],\n onNavigationEntriesUpdate = () => {}\n } = navigationStateController.topLevelNavigation || {};\n\n // Studio mode shows view-type entries (devViews) + admin entries (Users/Roles).\n // Content mode shows collections, admin entries (Users/Roles), and custom entries — but not studio views.\n const rawNavigationEntries = useMemo(() => {\n if (adminModeController.mode === \"studio\") {\n return unFilteredNavigationEntries.filter(e => e.type === \"view\" || e.type === \"admin\");\n }\n return unFilteredNavigationEntries.filter(e => e.type !== \"view\");\n }, [unFilteredNavigationEntries, adminModeController.mode]);\n\n const groupOrderFromNavController = useMemo(() => {\n const entryGroups = new Set(rawNavigationEntries.map(e => e.group).filter(Boolean));\n return unFilteredGroupOrder.filter(g => entryGroups.has(g));\n }, [unFilteredGroupOrder, rawNavigationEntries]);\n\n const fuse = useRef<Fuse<NavigationEntry> | null>(null);\n const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);\n const performingSearch = Boolean(filteredUrls);\n\n // Memoize filtered navigation entries to prevent unnecessary recalculations\n const filteredNavigationEntries = useMemo(() => {\n return filteredUrls\n ? rawNavigationEntries.filter((e) => filteredUrls.includes(e.url))\n : rawNavigationEntries;\n }, [filteredUrls, rawNavigationEntries]);\n\n useEffect(() => {\n fuse.current = new Fuse(rawNavigationEntries, {\n keys: [\"name\", \"description\", \"group\", \"path\"]\n });\n }, [rawNavigationEntries]);\n\n const updateSearch = useCallback((v?: string) => {\n if (!v?.trim()) {\n setFilteredUrls(null);\n return;\n }\n const results = fuse.current?.search(v.trim());\n setFilteredUrls(results ? results.map((x) => x.item.url) : []);\n }, []);\n\n /* ───────────────────────────────────────────────────────────────\n Build groups (all items) + isolate Admin\n ─────────────────────────────────────────────────────────────── */\n const [items, setItems] = useState<\n { name: string; entries: NavigationEntry[] }[]\n >([]);\n const [adminGroupData, setAdminGroupData] = useState<{\n name: string;\n entries: NavigationEntry[];\n } | null>(null);\n\n // Flag to prevent useEffect from overwriting local DnD state\n const isDndDirtyRef = useRef(false);\n const dndDirtyTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Memoize the processed groups to avoid unnecessary recalculations\n const processedGroups = useMemo(() => {\n const src = filteredNavigationEntries;\n const entriesByGroup: Record<string, NavigationEntry[]> = {};\n\n src.forEach((e) => {\n const g =\n e.type === \"admin\"\n ? ADMIN_GROUP_NAME\n : e.group ?? DEFAULT_GROUP_NAME;\n (entriesByGroup[g] ??= []).push(e);\n });\n\n // Check if there are custom additional card components from plugins\n const hasPluginAdditionalCards = customizationController.resolvedSlots.some(s => s.slot === \"home.cards\");\n\n let allProcessed: { name: string; entries: NavigationEntry[] }[];\n\n if (performingSearch) {\n const ordered = [\n ...new Set(src.map((e) => e.group ?? DEFAULT_GROUP_NAME))\n ];\n allProcessed = ordered\n .map((name) => ({\n name,\n entries: entriesByGroup[name] || []\n }))\n .filter((g) => g.entries.length);\n } else {\n allProcessed = groupOrderFromNavController.map((g) => ({\n name: g,\n entries: entriesByGroup[g] || []\n }));\n Object.keys(entriesByGroup).forEach((g) => {\n if (!groupOrderFromNavController.includes(g))\n allProcessed.push({\n name: g,\n entries: entriesByGroup[g]\n });\n });\n\n // Ensure default group exists if there are plugin additional cards but no collections\n if (hasPluginAdditionalCards && !allProcessed.some(g => g.name === DEFAULT_GROUP_NAME)) {\n allProcessed.push({\n name: DEFAULT_GROUP_NAME,\n entries: []\n });\n }\n\n allProcessed = allProcessed.filter(\n (g) =>\n g.entries.length ||\n (g.name === DEFAULT_GROUP_NAME && hasPluginAdditionalCards)\n );\n }\n\n const admin = allProcessed.find((g) => g.name === ADMIN_GROUP_NAME);\n return {\n adminGroupData: admin || null,\n items: allProcessed.filter((g) => g.name !== ADMIN_GROUP_NAME && !hiddenGroups?.includes(g.name))\n };\n }, [filteredNavigationEntries, performingSearch, groupOrderFromNavController, customizationController.resolvedSlots, hiddenGroups]);\n\n // Update state only when processedGroups actually changes\n // Skip update if DnD just made a local change (dirty flag is set)\n useEffect(() => {\n if (isDndDirtyRef.current) {\n // DnD just updated the state, skip this sync\n return;\n }\n setAdminGroupData(processedGroups.adminGroupData);\n setItems(processedGroups.items);\n }, [processedGroups]);\n\n /* ───────────────────────────────────────────────────────────────\n Local update vs. persistence helpers\n ─────────────────────────────────────────────────────────────── */\n const updateItems = (\n updater:\n | { name: string; entries: NavigationEntry[] }[]\n | ((\n prev: { name: string; entries: NavigationEntry[] }[]\n ) => { name: string; entries: NavigationEntry[] }[])\n ) => {\n setItems(updater); // local only\n };\n\n const persistNavigationGroups = (\n latest: { name: string; entries: NavigationEntry[] }[]\n ) => {\n // Set dirty flag to prevent useEffect from overwriting local state\n isDndDirtyRef.current = true;\n\n // Clear any existing timeout\n if (dndDirtyTimeoutRef.current) {\n clearTimeout(dndDirtyTimeoutRef.current);\n }\n\n // Clear dirty flag after a delay to allow navigation to update\n dndDirtyTimeoutRef.current = setTimeout(() => {\n isDndDirtyRef.current = false;\n }, 1000);\n\n // Map ALL groups including \"Views\"\n const draggable: NavigationGroupMapping[] = latest.map((g) => ({\n name: g.name,\n entries: g.entries.map((e) => e.slug)\n }));\n\n const all: NavigationGroupMapping[] = adminGroupData\n ? [\n ...draggable,\n {\n name: adminGroupData.name,\n entries: adminGroupData.entries.map((e) => e.slug)\n }\n ]\n : draggable;\n\n onNavigationEntriesUpdate(all);\n };\n\n // Use custom hook for collapsed groups with localStorage persistence\n const groupNames = useMemo(() => [\n ...items.map(item => item.name),\n ...(adminGroupData ? [adminGroupData.name] : [])\n ], [items, adminGroupData]);\n\n const collapsedDefaults = useMemo(\n () => buildCollapsedDefaults(registry.cmsConfig?.navigationGroupMappings, \"home\"),\n [registry.cmsConfig?.navigationGroupMappings]\n );\n const { isGroupCollapsed, toggleGroupCollapsed } = useCollapsedGroups(groupNames, \"home\", collapsedDefaults);\n\n const {\n sensors,\n collisionDetection,\n onDragStart,\n onDragOver,\n onDragEnd,\n dropAnimation,\n activeItemForOverlay,\n activeGroupData,\n draggingGroupId,\n containers,\n dndKitActiveNode,\n onDragCancel,\n isDraggingCardOnly,\n dialogOpenForGroup,\n setDialogOpenForGroup,\n handleRenameGroup,\n handleDialogClose,\n isHoveringNewGroupDropZone,\n setIsHoveringNewGroupDropZone\n } = useHomePageDnd({\n items,\n setItems: updateItems,\n disabled: !allowDragAndDrop || performingSearch,\n onPersist: persistNavigationGroups,\n onGroupMoved: (g) =>\n context.analyticsController?.onAnalyticsEvent?.(\"home_move_group\", {\n name: g\n }),\n onCardMovedBetweenGroups: (card) =>\n context.analyticsController?.onAnalyticsEvent?.(\"home_move_card\", {\n id: card.id\n }),\n onNewGroupDrop: () =>\n context.analyticsController?.onAnalyticsEvent?.(\n \"home_drop_new_group\"\n )\n });\n\n const {\n containerRef,\n direction\n } = useRestoreScroll();\n\n const dndDisabled = !allowDragAndDrop || performingSearch;\n\n const dndModifiers = dndKitActiveNode?.data.current?.type === \"group\"\n ? [restrictToVerticalAxis, restrictToWindowEdges]\n : [restrictToWindowEdges];\n\n const sectionProps: PluginGenericProps = { context };\n const additionalPluginChildrenStart = useSlot(\"home.children.start\", sectionProps);\n const additionalPluginChildrenEnd = useSlot(\"home.children.end\", sectionProps);\n const additionalPluginActions = useSlot(\"home.actions\", sectionProps);\n\n // Pre-compute home.cards slot contributions (cannot call useSlot inside .map loop)\n const homeCardContributions = useMemo(() => {\n return resolvedSlots\n .filter(s => s.slot === \"home.cards\")\n .sort((a, b) => (a.order ?? 50) - (b.order ?? 50));\n }, [resolvedSlots]);\n\n /* ───────────────────────────────────────────────────────────────\n Render\n ─────────────────────────────────────────────────────────────── */\n return (\n <div ref={containerRef} className=\"py-2 overflow-auto h-full w-full bg-surface-50 dark:bg-surface-800\">\n <Container maxWidth=\"6xl\">\n <div className=\"mb-4\">\n <BootstrapAdminBanner />\n </div>\n {/* search & actions */}\n <div\n className=\"w-full sticky py-4 transition-all duration-400 ease-in-out top-0 z-10 flex flex-row gap-4\"\n style={{ top: direction === \"down\" ? -84 : 0 }}\n >\n <SearchBar\n onTextSearch={updateSearch}\n placeholder={t(\"search_collections\")}\n autoFocus\n size=\"small\"\n innerClassName=\"w-full\"\n className=\"w-full grow\"\n />\n {additionalActions}\n {additionalPluginActions}\n </div>\n\n <FavouritesView hidden={performingSearch}/>\n\n {additionalChildrenStart}\n {additionalPluginChildrenStart}\n\n {/* ─────── DND context ─────── */}\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n measuring={{\n droppable: {\n strategy: MeasuringStrategy.Always,\n frequency: 500\n }\n }}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n modifiers={dndModifiers}\n >\n <SortableContext\n key={JSON.stringify(containers)}\n items={containers}\n strategy={verticalListSortingStrategy}\n >\n {items.map((groupData, groupIndex) => {\n const groupKey = groupData.name;\n const entriesInGroup = groupData.entries;\n\n const homeCardsProps = {\n group:\n groupKey === DEFAULT_GROUP_NAME\n ? undefined\n : groupKey,\n context\n };\n // Render home.cards contributions inline (no hook call inside loop)\n const additionalCards = homeCardContributions.map((s, i) => (\n <ErrorBoundary key={`home_cards_${groupKey}_${i}`}>\n <s.Component {...homeCardsProps} {...(s.props ?? {})}/>\n </ErrorBoundary>\n ));\n\n if (\n entriesInGroup.length === 0 &&\n (additionalCards.length === 0 || performingSearch)\n )\n return null;\n\n return (\n <SortableNavigationGroup\n key={`group-${groupIndex}`}\n groupName={groupKey}\n disabled={dndDisabled}\n >\n <NavigationGroup\n group={\n groupKey === DEFAULT_GROUP_NAME\n ? undefined\n : groupKey\n }\n minimised={\n draggingGroupId === groupKey &&\n !isDraggingCardOnly\n }\n isPotentialCardDropTarget={\n isDraggingCardOnly\n }\n dndDisabled={dndDisabled}\n onEditGroup={() => {\n if (dndDisabled) return;\n setDialogOpenForGroup(groupKey);\n }}\n collapsed={isGroupCollapsed(groupKey)}\n onToggleCollapsed={() => toggleGroupCollapsed(groupKey)}\n >\n <NavigationGroupDroppable\n id={groupKey}\n itemIds={entriesInGroup.map(\n (e) => e.url\n )}\n isPotentialCardDropTarget={\n isDraggingCardOnly\n }\n >\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 \">\n {entriesInGroup.map(\n (entry) => (\n <SortableNavigationCard\n key={entry.url}\n entry={entry}\n onClick={() => {\n let event: AnalyticsEvent =\n \"unmapped_event\";\n if (\n entry.type ===\n \"collection\"\n )\n event =\n \"home_navigate_to_collection\";\n else if (\n entry.type ===\n \"view\"\n )\n event =\n \"home_navigate_to_view\";\n else if (\n entry.type ===\n \"admin\"\n )\n event =\n \"home_navigate_to_admin_view\";\n\n context.analyticsController?.onAnalyticsEvent?.(\n event,\n {\n path: entry.slug\n }\n );\n }}\n />\n )\n )}\n {!performingSearch &&\n groupKey.toLowerCase() !==\n ADMIN_GROUP_NAME.toLowerCase() &&\n additionalCards}\n </div>\n </NavigationGroupDroppable>\n </NavigationGroup>\n </SortableNavigationGroup>\n );\n })}\n </SortableContext>\n\n <NewGroupDropZone\n disabled={dndDisabled}\n setIsHovering={setIsHoveringNewGroupDropZone}\n />\n\n <DragOverlay adjustScale={false} dropAnimation={dropAnimation}>\n {activeGroupData &&\n draggingGroupId === activeGroupData.name ? (\n <div\n className=\"rounded-lg bg-transparent\"\n style={{\n padding: 0,\n margin: 0\n }}\n >\n <NavigationGroup\n group={\n activeGroupData.name ===\n DEFAULT_GROUP_NAME\n ? undefined\n : activeGroupData.name\n }\n isPreview={false}\n minimised\n />\n </div>\n ) : activeItemForOverlay ? (\n <NavigationCardBinding\n {...activeItemForOverlay}\n shrink={isHoveringNewGroupDropZone}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {!performingSearch && adminGroupData && (\n <NavigationGroup\n group={adminGroupData.name}\n collapsed={isGroupCollapsed(adminGroupData.name)}\n onToggleCollapsed={() => toggleGroupCollapsed(adminGroupData.name)}\n >\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 \">\n {adminGroupData.entries.map((entry) => (\n <NavigationCardBinding\n key={entry.url}\n {...entry}\n onClick={() => {\n let event: AnalyticsEvent =\n \"unmapped_event\";\n if (entry.type === \"collection\")\n event =\n \"home_navigate_to_collection\";\n else if (entry.type === \"view\")\n event = \"home_navigate_to_view\";\n else if (entry.type === \"admin\")\n event =\n \"home_navigate_to_admin_view\";\n\n context.analyticsController?.onAnalyticsEvent?.(\n event,\n { path: entry.slug }\n );\n }}\n />\n ))}\n </div>\n </NavigationGroup>\n )}\n\n {sections && sections.map((section) => (\n <NavigationGroup\n key={section.key}\n group={section.title}\n >\n {section.children}\n </NavigationGroup>\n ))}\n\n {additionalPluginChildrenEnd}\n {additionalChildrenEnd}\n </Container>\n\n {dialogOpenForGroup && (\n <RenameGroupDialog\n open\n initialName={dialogOpenForGroup}\n existingGroupNames={items\n .map((g) => g.name)\n .filter((n) => n !== dialogOpenForGroup)}\n onClose={handleDialogClose}\n onRename={(newName) => {\n handleRenameGroup(dialogOpenForGroup, newName);\n }}\n />\n )}\n </div>\n );\n}\n"],"names":["NavigationChip","t0","$","_c","entry","navigate","useNavigate","userConfigurationPersistence","useUserConfigurationPersistence","t1","slug","favouritePaths","includes","favourite","t2","e","preventDefault","stopPropagation","setFavouritePaths","filter","p","onIconClick","t3","url","t4","t5","t6","name","FavouritesView","navigationStateController","useNavigationStateController","T0","path","topLevelNavigation","navigationEntries","find","favouriteCollections","map","Boolean","Collapse","length","_temp","entry_0","NavigationGroup","children","group","minimised","isPreview","isPotentialCardDropTarget","onEditGroup","dndDisabled","collapsed","onToggleCollapsed","t","useTranslation","isHovered","setIsHovered","useState","currentGroupName","showCaret","cls","Symbol","for","t7","iconSize","smallest","t8","TitleContent","t9","t10","t11","t12","open","minHeight","t13","t14","NavigationCard","React","memo","description","icon","actions","additionalContent","onClick","shrink","event","NavigationCardBinding","collection","view","collectionIcon","context","useRebaseContext","actionsArray","pluginCardActions","useSlot","pluginCardInsights","undefined","setRecentlyVisitedPaths","recentlyVisitedPaths","p_0","animateLayoutChanges","args","defaultAnimateLayoutChanges","wasDragging","dropAnimationConfig","cloneSerializableNavigationEntry","clonedEntry","id","type","cloneItemsForDnd","items","g","entries","SortableNavigationCard","setNodeRef","listeners","attributes","transform","transition","isDragging","useSortable","CSS","Transform","toString","opacity","style","NavigationGroupDroppable","itemIds","useDroppable","rectSortingStrategy","SortableNavigationGroup","groupName","disabled","useHomePageDnd","setItems","onCardMovedBetweenGroups","onGroupMoved","onNewGroupDrop","onPersist","dndItems","setDndItems","activeId","setActiveId","activeIsGroup","setActiveIsGroup","currentDraggingGroupId","setCurrentDraggingGroupId","dndKitActiveNode","setDndKitActiveNode","isDraggingCardOnly","setIsDraggingCardOnly","dialogOpenForGroup","setDialogOpenForGroup","isHoveringNewGroupDropZone","setIsHoveringNewGroupDropZone","pendingNewGroupName","setPendingNewGroupName","stateBeforeNewGroup","setStateBeforeNewGroup","preDragItemsRef","useRef","interimItemsRef","useEffect","current","mouseSensor","useSensor","MouseSensor","activationConstraint","distance","touchSensor","TouchSensor","delay","tolerance","keyboardSensor","KeyboardSensor","sensors","useSensors","dndContainers","findDndContainer","useCallback","some","lastOverId","recentlyMovedToNewContainer","collisionDetection","groups","droppableContainers","c","closestCenter","pointer","pointerWithin","zone","container","itemsIn","closest","closestCorners","first","getFirstCollision","rects","rectIntersection","zoneRect","overId","overIsContainer","closestItem","handleDragStart","active","isGroup","data","handleDragOver","over","activeIdNow","overIdNow","activeCont","overCont","newState","srcIdx","findIndex","tgtIdx","src","tgt","idxInSrc","moved","splice","push","overIdx","handleDragEnd","resetDragState","from","to","arrayMove","findContainerInState","state","sourceState","dragged","tentative","counter","grpIdx","oldIdx","newIdx","reordered","finalState","finalOverId","cleanOverCont","console","error","handleDragCancel","handleRenameGroup","oldName","newName","idx","updated","handleDialogClose","activeItemForOverlay","flatMap","activeGroupData","onDragStart","onDragOver","onDragEnd","onDragCancel","dropAnimation","draggingGroupId","containers","NewGroupDropZone","setIsHovering","isOver","isVisible","setIsVisible","tp","useDndMonitor","RenameGroupDialog","initialName","existingGroupNames","onClose","onRename","setName","setError","inputRef","setTimeout","focus","select","target","value","trim","handleNameChange","trimmedName","handleSave","event_0","key","trimmedName_0","currentError","handleKeyDown","display","t15","t16","t17","t18","t19","t20","DEFAULT_GROUP_NAME","ADMIN_GROUP_NAME","ContentHomePage","additionalActions","additionalChildrenStart","additionalChildrenEnd","sections","hiddenGroups","useCMSContext","customizationController","useCustomizationController","adminModeController","useAdminModeController","registry","useRebaseRegistry","resolvedSlots","breadcrumbs","useBreadcrumbsController","set","allowDragAndDrop","unFilteredNavigationEntries","unFilteredGroupOrder","onNavigationEntriesUpdate","rawNavigationEntries","useMemo","mode","groupOrderFromNavController","entryGroups","Set","has","fuse","filteredUrls","setFilteredUrls","performingSearch","filteredNavigationEntries","Fuse","keys","updateSearch","v","results","search","x","item","adminGroupData","setAdminGroupData","isDndDirtyRef","dndDirtyTimeoutRef","processedGroups","entriesByGroup","forEach","hasPluginAdditionalCards","s","slot","allProcessed","ordered","Object","admin","updateItems","updater","persistNavigationGroups","latest","clearTimeout","draggable","all","groupNames","collapsedDefaults","buildCollapsedDefaults","cmsConfig","navigationGroupMappings","isGroupCollapsed","toggleGroupCollapsed","useCollapsedGroups","analyticsController","onAnalyticsEvent","card","containerRef","direction","useRestoreScroll","dndModifiers","restrictToVerticalAxis","restrictToWindowEdges","sectionProps","additionalPluginChildrenStart","additionalPluginChildrenEnd","additionalPluginActions","homeCardContributions","sort","a","b","order","top","droppable","strategy","MeasuringStrategy","Always","frequency","verticalListSortingStrategy","groupData","groupIndex","groupKey","entriesInGroup","homeCardsProps","additionalCards","i","props","toLowerCase","JSON","stringify","padding","margin","section","title","n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExportCollectionAction-BIrq92To.js","sources":["../src/data_export/export/export.ts","../src/data_export/export/BasicExportAction.tsx","../src/data_export/export/ExportCollectionAction.tsx"],"sourcesContent":["import { Entity, EntityReference, Properties, Property } from \"@rebasepro/types\";\nimport { type ArrayValuesCount, getArrayValuesCount, getValueInPath } from \"@rebasepro/utils\";\n\ninterface Header {\n key: string;\n label: string;\n}\n\nexport interface DownloadEntitiesExportParams<M extends Record<string, unknown>> {\n data: Entity<M>[];\n additionalData: Record<string, any>[] | undefined;\n properties: Properties;\n propertiesOrder: string[] | undefined;\n name: string;\n flattenArrays: boolean;\n additionalHeaders: string[] | undefined;\n exportType: \"csv\" | \"json\";\n dateExportType: \"timestamp\" | \"string\";\n}\n\nexport function downloadEntitiesExport<M extends Record<string, unknown>>({\n data,\n additionalData,\n properties,\n propertiesOrder,\n name,\n flattenArrays,\n additionalHeaders,\n exportType,\n dateExportType\n}: DownloadEntitiesExportParams<M>\n) {\n\n console.debug(\"Downloading export\", {\n dataLength: data.length,\n properties,\n exportType,\n dateExportType\n });\n\n if (exportType === \"csv\") {\n const arrayValuesCount = flattenArrays ? getArrayValuesCount(data.map(d => d.values)) : {};\n const headers = getExportHeaders(properties, propertiesOrder, additionalHeaders, arrayValuesCount);\n const exportableData = getEntityCSVExportableData(data, additionalData, properties, headers, dateExportType);\n const headersData = entryToCSVRow(headers.map(h => h.label));\n const csvData = exportableData.map(entry => entryToCSVRow(entry));\n downloadBlob([headersData, ...csvData], `${name}.csv`, \"text/csv\");\n } else {\n const exportableData = getEntityJsonExportableData(data, additionalData, properties, dateExportType);\n const json = JSON.stringify(exportableData, null, 2);\n downloadBlob([json], `${name}.json`, \"application/json\");\n }\n}\n\nexport function getEntityCSVExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: Properties,\n headers: Header[],\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"csv\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index],\n...additional };\n });\n }\n\n return mergedData && mergedData.map((entry) => {\n return headers.map((header) => getValueInPath(entry, header.key));\n });\n}\n\nexport function getEntityJsonExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: Properties,\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"json\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index],\n...additional };\n });\n }\n\n return mergedData;\n}\n\nfunction getExportHeaders<M extends Record<string, unknown>>(properties: Properties,\n propertiesOrder: string[] | undefined,\n additionalHeaders: string[] | undefined,\n arrayValuesCount?: ArrayValuesCount): Header[] {\n\n const headers: Header[] = [\n {\n label: \"id\",\n key: \"id\"\n },\n ...(propertiesOrder ?? Object.keys(properties))\n .flatMap((childKey) => {\n const property = properties[childKey];\n if (!property) {\n console.warn(\"Property not found\", childKey, properties);\n return [];\n }\n if (arrayValuesCount && arrayValuesCount[childKey] > 1) {\n return Array.from({ length: arrayValuesCount[childKey] },\n (_, i) => getHeaders(property as Property, `${childKey}[${i}]`, \"\"))\n .flat();\n } else {\n return getHeaders(property as Property, childKey, \"\");\n }\n })\n ];\n\n if (additionalHeaders) {\n headers.push(...additionalHeaders.map(h => ({\n label: h,\n key: h\n })));\n }\n\n return headers;\n}\n\n/**\n * Get headers for property. There could be more than one header per property\n * @param property\n * @param propertyKey\n * @param prefix\n */\nfunction getHeaders(property: Property, propertyKey: string, prefix = \"\"): Header[] {\n const currentKey = prefix ? `${prefix}.${propertyKey}` : propertyKey;\n if (property.type === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .map(([childKey, p]) => getHeaders(p, childKey, currentKey))\n .flat();\n } else {\n return [{\n label: currentKey,\n key: currentKey\n }];\n }\n}\n\nfunction processValueForExport(inputValue: any,\n property: Property,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): any {\n\n let value;\n if (property.type === \"map\" && property.properties) {\n value = processValuesForExport(inputValue, property.properties as Properties, exportType, dateExportType);\n } else if (property.type === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n if (Array.isArray(property.of)) {\n value = property.of.map((p, i) => processValueForExport(inputValue[i], p, exportType, dateExportType));\n } else if (property.of.type === \"map\") {\n value = exportType === \"csv\"\n ? inputValue.map((e) => JSON.stringify(e))\n : inputValue.map((e) => processValueForExport(e, property.of as Property, exportType, dateExportType));\n ;\n } else {\n value = inputValue.map((e) => processValueForExport(e, property.of as Property, exportType, dateExportType));\n }\n } else {\n value = inputValue;\n }\n } else if (property.type === \"reference\" && inputValue && inputValue.isEntityReference && inputValue.isEntityReference()) {\n const ref = inputValue ? inputValue as EntityReference : undefined;\n value = ref ? ref.fullPath : null;\n } else if (property.type === \"date\" && inputValue instanceof Date) {\n value = inputValue ? (dateExportType === \"timestamp\" ? inputValue.getTime() : inputValue.toISOString()) : null;\n } else {\n value = inputValue;\n }\n\n return value;\n}\n\nfunction processValuesForExport<M extends Record<string, unknown>>\n (inputValues: Record<keyof M, any>,\n properties: Properties,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n ): Record<keyof M, any> {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = processValueForExport(inputValue, property as Property, exportType, dateExportType);\n if (updatedValue === undefined) return {};\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a,\n...b }), {}) as Record<keyof M, any>;\n return { ...inputValues,\n...updatedValues };\n}\n\nfunction entryToCSVRow(entry: any[]) {\n return entry\n .map((v: any) => {\n if (v === null || v === undefined) return \"\";\n if (Array.isArray(v))\n return \"\\\"\" + JSON.stringify(v).replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n const s = String(v);\n return \"\\\"\" + s.replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n })\n .join(\",\") + \"\\r\\n\";\n}\n\nexport function downloadBlob(content: BlobPart[], filename: string, contentType: string) {\n const blob = new Blob(content, { type: contentType });\n const url = URL.createObjectURL(blob);\n const pom = document.createElement(\"a\");\n pom.href = url;\n pom.setAttribute(\"download\", filename);\n pom.click();\n}\n\nexport function downloadDataAsCsv(data: object[], name: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(\",\"),\n ...data.map(row => headers.map(header => {\n const value = (row as Record<string, unknown>)[header];\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return `\"${JSON.stringify(value).replace(/\"/g, '\"\"')}\"`;\n return `\"${String(value).replace(/\"/g, '\"\"')}\"`;\n }).join(\",\"))\n ].join(\"\\r\\n\");\n\n downloadBlob([csvContent], `${name}.csv`, \"text/csv\");\n}\n","\nimport React, { useCallback } from \"react\";\n\nimport { Entity, Properties } from \"@rebasepro/types\";\nimport { BooleanSwitchWithLabel, Button, cls, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Tooltip } from \"@rebasepro/ui\";\nimport { DownloadIcon } from \"lucide-react\";\nimport { downloadEntitiesExport } from \"./export\";\n\nexport type BasicExportActionProps = {\n data: Entity<any>[];\n properties: Properties;\n propertiesOrder?: string[];\n}\n\nexport function BasicExportAction({\n data,\n properties,\n propertiesOrder\n}: BasicExportActionProps) {\n\n const dateRef = React.useRef<Date>(new Date());\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onOkClicked = useCallback(() => {\n downloadEntitiesExport({\n data,\n additionalData: [],\n properties,\n propertiesOrder,\n name: \"export.csv\",\n flattenArrays,\n additionalHeaders: [],\n exportType,\n dateExportType\n });\n handleClose();\n }, []);\n\n return <>\n\n <Tooltip title={\"Export\"}\n asChild={true}>\n <IconButton\n size={\"small\"}\n color={\"primary\"} onClick={handleClickOpen}>\n <DownloadIcon\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n\n <DialogTitle variant={\"h6\"}>Export data</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>DownloadIcon the the content of this table as a CSV</div>\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-csv\" type=\"radio\" value=\"csv\" name=\"exportType\"\n checked={exportType === \"csv\"}\n onChange={() => setExportType(\"csv\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-csv\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-accent-300\">CSV</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-json\" type=\"radio\" value=\"json\" name=\"exportType\"\n checked={exportType === \"json\"}\n onChange={() => setExportType(\"json\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-json\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-accent-300\">JSON</label>\n </div>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-timestamp\" type=\"radio\" value=\"timestamp\" name=\"dateExportType\"\n checked={dateExportType === \"timestamp\"}\n onChange={() => setDateExportType(\"timestamp\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-timestamp\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-accent-300\">Dates\n as\n timestamps ({dateRef.current.getTime()})</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-string\" type=\"radio\" value=\"string\" name=\"dateExportType\"\n checked={dateExportType === \"string\"}\n onChange={() => setDateExportType(\"string\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-string\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-accent-300\">Dates\n as\n strings ({dateRef.current.toISOString()})</label>\n </div>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n </DialogContent>\n\n <DialogActions>\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button onClick={onOkClicked}>\n DownloadIcon\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n","\nimport React, { useCallback } from \"react\";\n\nimport {\n useAuthController,\n useCustomizationController,\n useData\n} from \"@rebasepro/core\";\nimport { useCMSContext } from \"../../hooks\";\nimport { CollectionActionsProps, Entity, EntityCollection, ExportConfig, RebaseContext, User } from \"@rebasepro/types\";\nimport { getDefaultValuesFor } from \"@rebasepro/common\";\nimport { Alert, BooleanSwitchWithLabel, Button, CircularProgress, cls, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Tooltip , iconSize } from \"@rebasepro/ui\";\nimport { DownloadIcon } from \"lucide-react\";\nimport { downloadEntitiesExport } from \"./export\";\n\nconst DOCS_LIMIT = 500;\n\nexport function ExportCollectionAction<M extends Record<string, unknown>, USER extends User>({\n collection,\n path,\n collectionEntitiesCount,\n onAnalyticsEvent,\n exportAllowed,\n notAllowedView\n}: CollectionActionsProps<M, USER, EntityCollection<M>> & {\n exportAllowed?: (props: { collectionEntitiesCount: number, path: string, collection: EntityCollection }) => boolean;\n notAllowedView?: React.ReactNode;\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}) {\n\n const exportConfig = typeof collection.exportable === \"object\" ? collection.exportable : undefined;\n\n const dateRef = React.useRef<Date>(new Date());\n\n const [includeUndefinedValues, setIncludeUndefinedValues] = React.useState<boolean>(false);\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const context = useCMSContext<USER>();\n const dataClient = useData();\n\n const canExport = !exportAllowed || exportAllowed({\n collectionEntitiesCount: collectionEntitiesCount ?? 0,\n path,\n collection\n });\n\n const [dataLoading, setDataLoading] = React.useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = React.useState<Error | undefined>();\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const fetchAdditionalFields = useCallback(async (entities: Entity<M>[]) => {\n\n const additionalExportFields = exportConfig?.additionalFields;\n const additionalFields = collection.additionalFields;\n\n const resolvedExportColumnsValues: Record<string, any>[] = additionalExportFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalExportFields.map(async (column) => {\n return {\n [column.key]: await column.builder({\n entity,\n context: context as unknown as RebaseContext\n })\n };\n }))).reduce((a, b) => ({ ...a,\n...b }), {});\n }))\n : [];\n\n const resolvedColumnsValues: Record<string, any>[] = additionalFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalFields\n .map(async (field) => {\n if (!field.value)\n return {};\n return {\n [field.key]: await field.value({\n entity,\n context: context as unknown as RebaseContext\n })\n };\n }))).reduce((a, b) => ({ ...a,\n...b }), {});\n }))\n : [];\n return [...resolvedExportColumnsValues, ...resolvedColumnsValues];\n }, [exportConfig?.additionalFields]);\n\n const doDownload = useCallback(async (collection: EntityCollection<M>,\n exportConfig: ExportConfig<any> | undefined) => {\n\n onAnalyticsEvent?.(\"export_collection\", {\n collection: collection.slug\n });\n setDataLoading(true);\n dataClient.collection(path).find({})\n .then(async (res) => {\n const data = res.data as Entity<M>[];\n setDataLoadingError(undefined);\n const additionalData = await fetchAdditionalFields(data);\n const additionalHeaders = [\n ...exportConfig?.additionalFields?.map(column => column.key) ?? [],\n ...collection.additionalFields?.map(field => field.key) ?? []\n ];\n\n const dataWithDefaults = includeUndefinedValues\n ? data.map(entity => {\n const defaultValues = getDefaultValuesFor(collection.properties);\n return {\n ...entity,\n values: { ...defaultValues,\n...entity.values }\n };\n })\n : data;\n downloadEntitiesExport({\n data: dataWithDefaults,\n additionalData,\n properties: collection.properties,\n propertiesOrder: collection.propertiesOrder,\n name: collection.name,\n flattenArrays,\n additionalHeaders,\n exportType,\n dateExportType\n });\n onAnalyticsEvent?.(\"export_collection_success\", {\n collection: collection.slug\n });\n })\n .catch((e) => {\n console.error(\"Error loading export data\", e);\n setDataLoadingError(e);\n })\n .finally(() => setDataLoading(false));\n\n }, [onAnalyticsEvent, dataClient, path, fetchAdditionalFields, includeUndefinedValues, flattenArrays, exportType, dateExportType]);\n\n const onOkClicked = useCallback(() => {\n doDownload(collection, exportConfig);\n handleClose();\n }, [doDownload, collection, exportConfig, handleClose]);\n\n return <>\n\n <Tooltip title={\"Export\"}\n asChild={true}>\n <IconButton\n size={\"small\"}\n color={\"primary\"}\n onClick={handleClickOpen}>\n <DownloadIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n\n <DialogTitle variant={\"h6\"}>Export data</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>DownloadIcon the the content of this table as a CSV</div>\n\n {collectionEntitiesCount !== undefined && collectionEntitiesCount > DOCS_LIMIT &&\n <Alert color={\"warning\"}>\n <div>\n This collections has a large number\n of documents ({collectionEntitiesCount}).\n </div>\n </Alert>}\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-csv\" type=\"radio\" value=\"csv\" name=\"exportType\"\n checked={exportType === \"csv\"}\n onChange={() => setExportType(\"csv\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-csv\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-300\">CSV</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-json\" type=\"radio\" value=\"json\" name=\"exportType\"\n checked={exportType === \"json\"}\n onChange={() => setExportType(\"json\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-json\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-300\">JSON</label>\n </div>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-timestamp\" type=\"radio\" value=\"timestamp\" name=\"dateExportType\"\n checked={dateExportType === \"timestamp\"}\n onChange={() => setDateExportType(\"timestamp\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-timestamp\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-300\">Dates\n as\n timestamps ({dateRef.current.getTime()})</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-string\" type=\"radio\" value=\"string\" name=\"dateExportType\"\n checked={dateExportType === \"string\"}\n onChange={() => setDateExportType(\"string\")}\n className={cls(\"w-4 bg-surface-100 border-surface-300 dark:bg-surface-700 dark:border-surface-600\")}/>\n <label htmlFor=\"radio-string\"\n className=\"p-2 text-sm font-medium text-surface-900 dark:text-surface-300\">Dates\n as\n strings ({dateRef.current.toISOString()})</label>\n </div>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n value={includeUndefinedValues}\n onValueChange={setIncludeUndefinedValues}\n label={\"Include undefined values\"}/>\n\n {!canExport && notAllowedView}\n\n </DialogContent>\n\n <DialogActions>\n\n {dataLoading && <CircularProgress size={\"smallest\"}/>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button onClick={onOkClicked}\n disabled={dataLoading || !canExport}>\n DownloadIcon\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n"],"names":["downloadEntitiesExport","data","additionalData","properties","propertiesOrder","name","flattenArrays","additionalHeaders","exportType","dateExportType","console","debug","dataLength","length","arrayValuesCount","getArrayValuesCount","map","d","values","headers","getExportHeaders","exportableData","getEntityCSVExportableData","headersData","entryToCSVRow","h","label","csvData","entry","downloadBlob","getEntityJsonExportableData","json","JSON","stringify","mergedData","e","id","processValuesForExport","forEach","additional","index","header","getValueInPath","key","Object","keys","flatMap","childKey","property","warn","Array","from","_","i","getHeaders","flat","push","propertyKey","prefix","currentKey","type","entries","p","processValueForExport","inputValue","value","of","isArray","isEntityReference","ref","undefined","fullPath","Date","getTime","toISOString","inputValues","updatedValues","updatedValue","reduce","a","b","v","replaceAll","s","String","join","content","filename","contentType","blob","Blob","url","URL","createObjectURL","pom","document","createElement","href","setAttribute","click","downloadDataAsCsv","csvContent","row","replace","BasicExportAction","dateRef","React","useRef","setFlattenArrays","useState","setExportType","setDateExportType","open","setOpen","handleClickOpen","useCallback","handleClose","onOkClicked","cls","current","DOCS_LIMIT","ExportCollectionAction","collection","path","collectionEntitiesCount","onAnalyticsEvent","exportAllowed","notAllowedView","exportConfig","exportable","includeUndefinedValues","setIncludeUndefinedValues","context","useCMSContext","dataClient","useData","canExport","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","fetchAdditionalFields","entities","additionalExportFields","additionalFields","resolvedExportColumnsValues","Promise","all","entity","column","builder","resolvedColumnsValues","field","doDownload","slug","find","then","res","dataWithDefaults","defaultValues","getDefaultValuesFor","catch","error","finally","iconSize","small"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImportCollectionAction-h8yg_To8.js","sources":["../src/data_import/import/ImportCollectionAction.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from \"react\";\nimport {\n useAuthController,\n useCustomizationController,\n useSnackbarController\n} from \"@rebasepro/core\";\nimport { getPropertiesWithPropertiesOrder, getPropertyInPath } from \"../../util\";\nimport { CollectionActionsProps, Properties, Property, User, EntityCollection } from \"@rebasepro/types\";\nimport {\n getFieldConfig,\n PropertyConfigBadge,\n useSelectionController\n} from \"../../components\";\nimport { EntityCollectionTable } from \"../../components/EntityCollectionTable/EntityCollectionTable\";\nimport { useCollectionRegistryController } from \"../../hooks\";\nimport { Button, cls, defaultBorderMixin, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Select, SelectItem, Tooltip, Typography , iconSize } from \"@rebasepro/ui\";\nimport { UploadIcon } from \"lucide-react\";\nimport { buildEntityPropertiesFromData } from \"@rebasepro/schema-inference\";\nimport { useImportConfig } from \"../hooks\";\nimport { convertDataToEntity, getInferenceType } from \"../utils\";\nimport { DataNewPropertiesMapping, ImportFileUpload, ImportSaveInProgress } from \"../components\";\nimport { ImportConfig } from \"../types\";\nimport { slugify } from \"@rebasepro/utils\";\n\ntype ImportState = \"initial\" | \"mapping\" | \"preview\" | \"import_data_saving\";\n\nexport function ImportCollectionAction<M extends Record<string, unknown>, USER extends User>({\n collection,\n path,\n onAnalyticsEvent\n}: CollectionActionsProps<M, USER> & {\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}\n) {\n\n const snackbarController = useSnackbarController();\n\n const [open, setOpen] = React.useState(false);\n\n const [step, setStep] = React.useState<ImportState>(\"initial\");\n\n const importConfig = useImportConfig();\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n onAnalyticsEvent?.(\"import_open\");\n setStep(\"initial\");\n }, [onAnalyticsEvent]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onMappingComplete = useCallback(() => {\n onAnalyticsEvent?.(\"import_mapping_complete\");\n setStep(\"preview\");\n }, [onAnalyticsEvent]);\n\n const onPreviewComplete = useCallback(() => {\n onAnalyticsEvent?.(\"import_data_save\");\n setStep(\"import_data_saving\");\n }, [onAnalyticsEvent]);\n\n const onDataAdded = async (data: object[]) => {\n importConfig.setImportData(data);\n\n if (data.length > 0) {\n const originProperties = await buildEntityPropertiesFromData(data, getInferenceType);\n importConfig.setOriginProperties(originProperties as any);\n\n const headersMapping = buildHeadersMappingFromData(data, collection?.properties);\n importConfig.setHeadersMapping(headersMapping);\n const firstKey = Object.keys(headersMapping)?.[0];\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n importConfig.setIdColumn(firstKey);\n }\n }\n setTimeout(() => {\n onAnalyticsEvent?.(\"import_data_added\");\n setStep(\"mapping\");\n }, 100);\n };\n\n const properties = getPropertiesWithPropertiesOrder(collection.properties, collection.propertiesOrder as Extract<keyof M, string>[]);\n\n const propertiesAndLevel = Object.entries(properties)\n .flatMap(([key, property]) => getPropertiesAndLevel(key, property, 0));\n const propertiesOrder = (collection.propertiesOrder ?? Object.keys(collection.properties)) as Extract<keyof M, string>[];\n\n return <>\n\n <Tooltip title={\"Import\"}\n asChild={true}>\n <IconButton\n size={\"small\"}\n color={\"primary\"} onClick={handleClickOpen}>\n <UploadIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n\n <Dialog open={open}\n fullWidth={step !== \"initial\"}\n fullHeight={step !== \"initial\"}\n maxWidth={step === \"initial\" ? \"lg\" : \"7xl\"}>\n\n <DialogTitle variant={\"h6\"} hidden={step === \"preview\"}>Import data</DialogTitle>\n\n <DialogContent className={\"h-full flex flex-col gap-4 my-4\"} fullHeight={step === \"preview\"}>\n\n {step === \"initial\" && <>\n <Typography variant={\"body2\"}>Upload a CSV, Excel or JSON file and map it to your existing\n schema</Typography>\n <ImportFileUpload onDataAdded={onDataAdded}/>\n </>}\n\n {step === \"mapping\" && <>\n <DataNewPropertiesMapping importConfig={importConfig}\n destinationProperties={properties}\n buildPropertyView={({\n isIdColumn,\n property,\n propertyKey,\n importKey\n }) => {\n return <PropertyTreeSelect\n selectedPropertyKey={propertyKey ?? \"\"}\n properties={properties}\n propertiesAndLevel={propertiesAndLevel}\n isIdColumn={isIdColumn}\n onIdSelected={() => {\n importConfig.setIdColumn(importKey);\n }}\n onPropertySelected={(newPropertyKey) => {\n\n onAnalyticsEvent?.(\"import_mapping_field_updated\");\n const newHeadersMapping: Record<string, string | null> = Object.entries(importConfig.headersMapping)\n .map(([currentImportKey, currentPropertyKey]) => {\n if (currentPropertyKey === newPropertyKey) {\n return { [currentImportKey]: null };\n }\n if (currentImportKey === importKey) {\n return { [currentImportKey]: newPropertyKey };\n }\n return { [currentImportKey]: currentPropertyKey };\n })\n .reduce((acc, curr) => ({ ...acc,\n...curr }), {});\n importConfig.setHeadersMapping(newHeadersMapping as Record<string, string>);\n\n if (newPropertyKey === importConfig.idColumn) {\n importConfig.setIdColumn(undefined);\n }\n\n }}\n />;\n }}/>\n </>}\n\n {step === \"preview\" && <ImportDataPreview importConfig={importConfig}\n properties={properties}\n propertiesOrder={propertiesOrder}/>}\n\n {step === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={collection as unknown as EntityCollection}\n path={path}\n onImportSuccess={(importedCollection) => {\n handleClose();\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n }}\n />}\n\n </DialogContent>\n <DialogActions>\n\n {step === \"mapping\" && <Button\n onClick={() => setStep(\"initial\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n {step === \"preview\" && <Button\n onClick={() => setStep(\"mapping\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n {step === \"mapping\" && <Button variant=\"filled\"\n color={\"primary\"}\n onClick={onMappingComplete}>\n Next\n </Button>}\n\n {step === \"preview\" && <Button variant=\"filled\"\n color={\"primary\"}\n onClick={onPreviewComplete}>\n Save data\n </Button>}\n\n </DialogActions>\n </Dialog>\n\n </>;\n}\n\nconst internalIDValue = \"__internal_id__\";\n\nfunction PropertyTreeSelect({\n selectedPropertyKey,\n properties,\n onPropertySelected,\n onIdSelected,\n propertiesAndLevel,\n isIdColumn\n}: {\n selectedPropertyKey: string | null;\n properties: Record<string, Property>;\n onPropertySelected: (propertyKey: string | null) => void;\n onIdSelected: () => void;\n propertiesAndLevel: PropertyAndLevel[];\n isIdColumn?: boolean;\n}) {\n\n const selectedProperty = selectedPropertyKey ? getPropertyInPath(properties, selectedPropertyKey) : null;\n\n const renderValue = useCallback((selectedPropertyKey: string) => {\n\n if (selectedPropertyKey === internalIDValue) {\n return <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>;\n }\n\n if (!selectedPropertyKey || !selectedProperty) {\n return <Typography variant={\"body2\"} color=\"disabled\" className={\"p-4\"}>Do not import this\n property</Typography>;\n }\n\n return <PropertySelectEntry propertyKey={selectedPropertyKey}\n property={selectedProperty as Property}/>;\n }, [selectedProperty]);\n\n const onSelectValueChange = (value: string) => {\n if (value === internalIDValue) {\n onIdSelected();\n onPropertySelected(null);\n } else if (value === \"__do_not_import\") {\n onPropertySelected(null);\n } else {\n onPropertySelected(value);\n }\n };\n\n return <Select value={isIdColumn ? internalIDValue : (selectedPropertyKey ?? undefined)}\n fullWidth={true}\n onValueChange={onSelectValueChange}\n renderValue={renderValue}>\n\n <SelectItem value={\"__do_not_import\"}>\n <Typography variant={\"body2\"} color={\"disabled\"} className={\"p-4\"}>Do not import this property</Typography>\n </SelectItem>\n\n <SelectItem value={internalIDValue}>\n <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>\n </SelectItem>\n\n {propertiesAndLevel.map(({\n property,\n level,\n propertyKey\n }) => {\n return <SelectItem value={propertyKey}\n key={propertyKey}\n disabled={property.type === \"map\"}>\n <PropertySelectEntry propertyKey={propertyKey}\n property={property}\n level={level}/>\n </SelectItem>;\n })}\n\n </Select>;\n}\n\ntype PropertyAndLevel = {\n property: Property,\n level: number,\n propertyKey: string\n};\n\nfunction getPropertiesAndLevel(key: string, property: Property, level: number): PropertyAndLevel[] {\n const properties: PropertyAndLevel[] = [];\n properties.push({\n property,\n level,\n propertyKey: key\n });\n if (property.type === \"map\" && property.properties) {\n Object.entries(property.properties).forEach(([childKey, value]) => {\n properties.push(...getPropertiesAndLevel(`${key}.${childKey}`, value as Property, level + 1));\n });\n }\n return properties;\n}\n\nexport function PropertySelectEntry({\n propertyKey,\n property,\n level = 0\n}: {\n propertyKey: string;\n property: Property;\n level?: number;\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = getFieldConfig(property, propertyConfigs);\n\n return <div\n className=\"flex flex-row w-full text-start items-center h-full\">\n\n {new Array(level).fill(0).map((_, index) =>\n <div className={cls(defaultBorderMixin, \"ml-8 border-l h-12\")} key={index}/>)}\n\n <div className={\"m-4\"}>\n <Tooltip title={widget?.name}>\n <PropertyConfigBadge propertyConfig={widget}/>\n </Tooltip>\n </div>\n\n <div className={\"flex flex-col grow p-2 pl-2\"}>\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"grow pr-2\">\n {property.name\n ? property.name\n : \"\\u00a0\"\n }\n </Typography>\n\n <Typography className=\" pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyKey}\n </Typography>\n </div>\n\n </div>;\n\n}\n\nexport function ImportDataPreview<M extends Record<string, unknown>>({\n importConfig,\n properties,\n propertiesOrder\n}: {\n importConfig: ImportConfig,\n properties: Properties,\n propertiesOrder: Extract<keyof M, string>[],\n}) {\n const authController = useAuthController();\n const collectionRegistry = useCollectionRegistryController();\n useEffect(() => {\n const mappedData = importConfig.importData.map(d => convertDataToEntity(\n authController,\n collectionRegistry,\n d,\n importConfig.idColumn,\n importConfig.headersMapping,\n properties,\n \"TEMP_PATH\",\n importConfig.defaultValues\n ));\n importConfig.setEntities(mappedData);\n }, []);\n\n const selectionController = useSelectionController();\n\n return <EntityCollectionTable\n title={<div>\n <Typography variant={\"subtitle2\"}>Imported data preview</Typography>\n <Typography variant={\"caption\"}>Entities with the same id will be overwritten</Typography>\n </div>}\n tableController={{\n data: importConfig.entities,\n dataLoading: false,\n noMoreToLoad: false\n }}\n enablePopupIcon={false}\n endAdornment={<div className={\"h-12\"}/>}\n filterable={false}\n sortable={false}\n openEntityMode={\"full_screen\"}\n selectionController={selectionController}\n properties={properties}/>\n\n}\n\nfunction buildHeadersMappingFromData(objArr: object[], properties?: Properties) {\n const headersMapping: Record<string, string> = {};\n objArr.filter(Boolean).forEach((obj) => {\n Object.keys(obj).forEach((key) => {\n // @ts-ignore\n const child = obj[key];\n if (typeof child === \"object\" && !Array.isArray(child)) {\n const childProperty = properties?.[key];\n const childProperties = childProperty && \"properties\" in childProperty ? childProperty.properties : undefined;\n const childHeadersMapping = buildHeadersMappingFromData([child], childProperties);\n Object.entries(childHeadersMapping).forEach(([subKey, mapping]) => {\n headersMapping[`${key}.${subKey}`] = `${key}.${mapping}`;\n });\n }\n\n if (!properties) {\n headersMapping[key] = key;\n } else if (key in properties) {\n headersMapping[key] = key;\n } else {\n const slug = slugify(key);\n if (slug in properties) {\n headersMapping[key] = slug;\n } else {\n headersMapping[key] = key;\n }\n }\n\n });\n });\n return headersMapping;\n}\n"],"names":["ImportCollectionAction","t0","$","_c","collection","path","onAnalyticsEvent","snackbarController","useSnackbarController","open","setOpen","React","useState","step","setStep","importConfig","useImportConfig","t1","handleClickOpen","t2","Symbol","for","handleClose","t3","onMappingComplete","t4","onPreviewComplete","t5","properties","data","setImportData","length","originProperties","buildEntityPropertiesFromData","getInferenceType","setOriginProperties","headersMapping","buildHeadersMappingFromData","setHeadersMapping","firstKey","Object","keys","includes","setIdColumn","setTimeout","onDataAdded","t6","propertiesOrder","t7","getPropertiesWithPropertiesOrder","entries","flatMap","_temp","propertiesAndLevel","t8","t9","iconSize","small","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","isIdColumn","propertyKey","importKey","newPropertyKey","newHeadersMapping","map","t20","currentImportKey","currentPropertyKey","reduce","_temp2","idColumn","undefined","importedCollection","type","message","t21","t22","t23","t24","t25","t26","t27","t28","t29","acc","curr","key","property","getPropertiesAndLevel","internalIDValue","PropertyTreeSelect","selectedPropertyKey","onPropertySelected","onIdSelected","getPropertyInPath","selectedProperty","selectedPropertyKey_0","renderValue","value","onSelectValueChange","_temp3","level","push","forEach","childKey","PropertySelectEntry","propertyConfigs","useCustomizationController","getFieldConfig","widget","Array","fill","_temp4","name","_","index","cls","defaultBorderMixin","ImportDataPreview","authController","useAuthController","collectionRegistry","useCollectionRegistryController","mappedData","importData","d","convertDataToEntity","defaultValues","setEntities","useEffect","selectionController","useSelectionController","entities","dataLoading","noMoreToLoad","objArr","filter","Boolean","obj","child","isArray","childProperty","childProperties","childHeadersMapping","subKey","mapping","slug","slugify"],"mappings":"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"}