@rebasepro/admin 0.9.0 → 0.9.1-canary.0de22e0
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.
- package/README.md +7 -7
- package/dist/{CollectionEditorDialog-B-7uW3iJ.js → CollectionEditorDialog-D7odTn0N.js} +150 -36
- package/dist/CollectionEditorDialog-D7odTn0N.js.map +1 -0
- package/dist/{PropertyEditView-7KMTcrqi.js → PropertyEditView-i51tFOfM.js} +6 -6
- package/dist/PropertyEditView-i51tFOfM.js.map +1 -0
- package/dist/{RouterCollectionsStudioView-epqIbZrJ.js → RouterCollectionsStudioView-B9AjTCjT.js} +5 -5
- package/dist/RouterCollectionsStudioView-B9AjTCjT.js.map +1 -0
- package/dist/collection_editor/api/generateCollectionApi.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
- package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
- package/dist/collection_editor_ui.js +5 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/CollectionTableBinding/CollectionTableBindingProps.d.ts +1 -1
- package/dist/components/CollectionTableBinding/internal/EntityTableCell.d.ts +1 -1
- package/dist/components/CollectionTableBinding/internal/popup_field/PopupFormField.d.ts +1 -1
- package/dist/components/CollectionTableBinding/table_bindings.d.ts +1 -1
- package/dist/components/CollectionViewBinding/hooks/useCollectionInlineEditor.d.ts +1 -1
- package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
- package/dist/components/RebaseLayout.d.ts +5 -4
- package/dist/components/RebaseShell.d.ts +1 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +1 -1
- package/dist/components/SidePanelProvider.d.ts +1 -1
- package/dist/components/field_configs.d.ts +17 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/contexts/BreacrumbsContext.d.ts +1 -1
- package/dist/editor.js +1 -1
- package/dist/editor.js.map +1 -1
- package/dist/export-BM6HPujv.js +518 -0
- package/dist/export-BM6HPujv.js.map +1 -0
- package/dist/form/components/LocalChangesMenu.d.ts +1 -1
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
- package/dist/{history-7X5bON_n.js → history-CtIPJxvQ.js} +6 -6
- package/dist/history-CtIPJxvQ.js.map +1 -0
- package/dist/hooks/useSelectionDialog.d.ts +1 -1
- package/dist/import-DzQnT03v.js +328 -0
- package/dist/import-DzQnT03v.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3300 -2
- package/dist/index.js.map +1 -0
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +1 -0
- package/dist/types/components/formex.d.ts +1 -1
- package/dist/util/view_mode.d.ts +54 -0
- package/dist/{src-sUZfe29F.js → util-XFwQ9FEc.js} +17554 -21391
- package/dist/util-XFwQ9FEc.js.map +1 -0
- package/package.json +12 -17
- package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
- package/src/collection_editor/api/generateCollectionApi.ts +4 -4
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +1 -1
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -1
- package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -1
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -1
- package/src/collection_editor/ui/EditorEntityAction.tsx +1 -1
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
- package/src/collection_editor/ui/KanbanSetupAction.tsx +1 -1
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +139 -13
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
- package/src/collection_editor/useSafeSnackbarController.ts +1 -1
- package/src/components/AdminModeSyncer.tsx +1 -1
- package/src/components/ArrayContainer.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +1 -1
- package/src/components/CollectionPanel.tsx +1 -1
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +3 -3
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +3 -3
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +1 -1
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +1 -1
- package/src/components/CollectionTableBinding/column_utils.tsx +1 -1
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +2 -2
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +4 -4
- package/src/components/CollectionTableBinding/table_bindings.tsx +1 -1
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +2 -2
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +4 -4
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +1 -1
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +3 -3
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +3 -3
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +77 -127
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +5 -9
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +3 -3
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +19 -1
- package/src/components/CollectionViewBinding/SplitListView.tsx +114 -63
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +1 -1
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +2 -2
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +2 -2
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +9 -3
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +1 -1
- package/src/components/DefaultAppBar.tsx +3 -3
- package/src/components/DefaultDrawer.tsx +3 -3
- package/src/components/DeleteEntityDialog.tsx +1 -1
- package/src/components/DetailViewBinding.tsx +7 -5
- package/src/components/DrawerNavigationGroup.tsx +2 -2
- package/src/components/EditFormActions.tsx +6 -6
- package/src/components/EditViewBinding.tsx +9 -8
- package/src/components/EntityPreviewBinding.tsx +5 -4
- package/src/components/EntityViewBinding.tsx +2 -2
- package/src/components/HomePage/ContentHomePage.tsx +6 -5
- package/src/components/HomePage/FavouritesView.tsx +2 -2
- package/src/components/HomePage/NavigationCardBinding.tsx +3 -3
- package/src/components/HomePage/NavigationGroup.tsx +1 -1
- package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
- package/src/components/JsonPreviewBinding.tsx +1 -1
- package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +3 -3
- package/src/components/RebaseAuthGate.tsx +2 -2
- package/src/components/RebaseLayout.tsx +7 -13
- package/src/components/RebaseNavigation.tsx +18 -3
- package/src/components/RebaseRouteDefs.tsx +3 -3
- package/src/components/RebaseShell.tsx +2 -1
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +7 -6
- package/src/components/ReferenceWidget.tsx +1 -1
- package/src/components/RelationSelector.tsx +1 -1
- package/src/components/SearchIconsView.tsx +2 -2
- package/src/components/SelectableTable/SelectableTable.tsx +2 -2
- package/src/components/SelectableTable/SelectableTableContext.tsx +1 -1
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +1 -1
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +1 -1
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +1 -1
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -1
- package/src/components/SideDialogs.tsx +1 -1
- package/src/components/SidePanelBinding.tsx +47 -9
- package/src/components/SidePanelProvider.tsx +15 -12
- package/src/components/UserSelector.tsx +1 -1
- package/src/components/admin/CreationResultDialog.tsx +6 -3
- package/src/components/app/Scaffold.tsx +6 -2
- package/src/components/common/default_entity_actions.tsx +123 -25
- package/src/components/field_configs.tsx +42 -25
- package/src/components/history/EntityHistoryEntry.tsx +1 -1
- package/src/components/history/EntityHistoryView.tsx +5 -5
- package/src/components/history/LastEditedByIndicator.tsx +2 -2
- package/src/components/index.ts +1 -1
- package/src/contexts/BreacrumbsContext.tsx +1 -1
- package/src/data_export/export/BasicExportAction.tsx +1 -1
- package/src/data_export/export/ExportCollectionAction.tsx +1 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
- package/src/data_import/components/ImportFileUpload.tsx +1 -1
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +3 -5
- package/src/data_import/components/ImportSaveInProgress.tsx +1 -1
- package/src/data_import/import/ImportCollectionAction.tsx +8 -8
- package/src/data_import/utils/data.ts +2 -2
- package/src/data_import/utils/get_properties_mapping.ts +1 -1
- package/src/editor/components/image-bubble.tsx +1 -1
- package/src/editor/components/table-bubble.tsx +1 -1
- package/src/editor/editor.tsx +1 -1
- package/src/editor/selectors/color-selector.tsx +1 -1
- package/src/editor/selectors/link-selector.tsx +1 -1
- package/src/editor/selectors/node-selector.tsx +2 -2
- package/src/editor/selectors/text-buttons.tsx +1 -1
- package/src/form/EntityForm.tsx +8 -5
- package/src/form/EntityFormActions.tsx +1 -1
- package/src/form/EntityFormBinding.tsx +7 -5
- package/src/form/PropertyFieldBinding.tsx +3 -3
- package/src/form/components/ErrorFocus.tsx +1 -1
- package/src/form/components/LocalChangesMenu.tsx +3 -3
- package/src/form/components/StorageItemPreview.tsx +1 -1
- package/src/form/components/StorageUploadProgress.tsx +3 -3
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +3 -2
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -3
- package/src/form/field_bindings/BlockFieldBinding.tsx +4 -3
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +3 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +4 -3
- package/src/form/field_bindings/MapFieldBinding.tsx +3 -2
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +4 -3
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -2
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -1
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -4
- package/src/form/field_bindings/RelationFieldBinding.tsx +3 -2
- package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -2
- package/src/form/field_bindings/SelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +5 -4
- package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -1
- package/src/form/field_bindings/TextFieldBinding.tsx +2 -1
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/VectorFieldBinding.tsx +2 -1
- package/src/form/form_utils.ts +1 -1
- package/src/hooks/navigation/useNavigationResolution.ts +19 -4
- package/src/hooks/useBuildSidePanel.tsx +10 -2
- package/src/hooks/useCMSContext.tsx +1 -1
- package/src/hooks/useHistory.ts +1 -1
- package/src/hooks/useResolvedNavigationFrom.tsx +4 -2
- package/src/hooks/useSelectionDialog.tsx +3 -3
- package/src/index.ts +3 -3
- package/src/preview/PropertyPreview.tsx +2 -2
- package/src/preview/components/DatePreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +2 -2
- package/src/preview/components/ReferencePreview.tsx +3 -3
- package/src/preview/components/RelationPreview.tsx +3 -3
- package/src/preview/components/StorageThumbnail.tsx +1 -1
- package/src/preview/components/UrlComponentPreview.tsx +2 -9
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
- package/src/preview/property_previews/NumberPropertyPreview.tsx +1 -1
- package/src/preview/util.ts +9 -0
- package/src/routes/CustomViewRoute.tsx +2 -1
- package/src/routes/RebaseRoute.tsx +21 -26
- package/src/types/components/formex.tsx +1 -1
- package/src/util/navigation_utils.ts +2 -5
- package/src/util/previews.ts +4 -2
- package/src/util/view_mode.ts +102 -0
- package/dist/CollectionEditorDialog-B-7uW3iJ.js.map +0 -1
- package/dist/PropertyEditView-7KMTcrqi.js.map +0 -1
- package/dist/RouterCollectionsStudioView-epqIbZrJ.js.map +0 -1
- package/dist/history-7X5bON_n.js.map +0 -1
- package/dist/src-sUZfe29F.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util-XFwQ9FEc.js","names":[],"sources":["../src/form/components/FormEntry.tsx","../src/form/components/FormLayout.tsx","../src/form/components/LabelWithIcon.tsx","../src/components/PropertyIdCopyTooltip.tsx","../src/form/components/LabelWithIconAndTooltip.tsx","../src/preview/components/EmptyValue.tsx","../src/preview/util.ts","../src/preview/components/ImagePreview.tsx","../src/preview/components/UrlComponentPreview.tsx","../src/preview/property_previews/SkeletonPropertyComponent.tsx","../src/preview/components/StorageThumbnail.tsx","../src/preview/components/EnumValuesChip.tsx","../src/preview/property_previews/StringPropertyPreview.tsx","../src/preview/property_previews/ArrayPropertyPreview.tsx","../src/util/property_utils.tsx","../src/util/previews.ts","../src/hooks/navigation/contexts/CollectionRegistryContext.tsx","../src/hooks/useSidePanel.tsx","../src/components/EntityPreviewBinding.tsx","../src/preview/components/ReferencePreview.tsx","../src/preview/property_previews/ArrayOfReferencesPreview.tsx","../src/preview/components/RelationPreview.tsx","../src/preview/property_previews/ArrayOfRelationsPreview.tsx","../src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx","../src/preview/components/ArrayEnumPreview.tsx","../src/preview/property_previews/ArrayPropertyEnumPreview.tsx","../src/preview/property_previews/ArrayOfStringsPreview.tsx","../src/preview/property_previews/ArrayOneOfPreview.tsx","../src/preview/property_previews/MapPropertyPreview.tsx","../src/preview/components/DatePreview.tsx","../src/preview/components/BooleanPreview.tsx","../src/preview/property_previews/NumberPropertyPreview.tsx","../src/preview/components/UserPreview.tsx","../src/preview/PropertyPreview.tsx","../src/preview/property_previews/ArrayOfMapsPreview.tsx","../src/form/components/FieldHelperText.tsx","../src/form/field_bindings/ReadOnlyFieldBinding.tsx","../src/form/useClearRestoreValue.tsx","../src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx","../src/components/SelectableTable/SelectionStore.ts","../src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx","../src/components/UserSelector.tsx","../src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx","../src/form/components/StorageUploadProgress.tsx","../src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx","../src/components/CollectionTableBinding/fields/TableStorageUpload.tsx","../src/components/CollectionTableBinding/fields/TableReferenceField.tsx","../src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx","../src/components/CollectionTableBinding/fields/TableRelationField.tsx","../src/components/RelationSelector.tsx","../src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx","../src/components/CollectionTableBinding/table_bindings.tsx","../src/form/validation.ts","../src/components/CollectionTableBinding/internal/EntityTableCell.tsx","../src/components/SelectableTable/SelectableTableContext.tsx","../src/components/CollectionTableBinding/PropertyTableCell.tsx","../src/contexts/SideDialogsControllerContext.tsx","../src/hooks/useSideDialogsController.tsx","../src/hooks/navigation/contexts/NavigationStateContext.tsx","../src/hooks/navigation/contexts/UrlContext.tsx","../src/hooks/useCMSContext.tsx","../src/components/CollectionTableBinding/CollectionRowActions.tsx","../src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx","../src/components/CollectionTableBinding/internal/common.tsx","../src/components/CollectionTableBinding/column_utils.tsx","../src/components/SelectableTable/filters/StringNumberFilterField.tsx","../src/components/SelectableTable/filters/BooleanFilterField.tsx","../src/components/SelectableTable/filters/DateTimeFilterField.tsx","../src/components/SelectableTable/filters/ReferenceFilterField.tsx","../src/components/SelectableTable/filters/RelationFilterField.tsx","../src/components/SelectableTable/filters/FilterFieldBinding.tsx","../src/components/SelectableTable/SelectableTable.tsx","../src/components/CollectionTableBinding/CollectionTableBinding.tsx","../src/components/CollectionViewBinding/useSelectionController.tsx","../src/util/resolutions.ts","../src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts","../src/util/view_mode.ts","../src/util/navigation_utils.ts","../src/util/entity_actions.ts","../src/contexts/BreacrumbsContext.tsx","../src/hooks/useBreadcrumbsController.tsx","../src/components/FieldCaption.tsx","../src/components/SearchIconsView.tsx","../src/components/PropertyConfigBadge.tsx","../src/components/ArrayContainer.tsx","../src/data_import/utils/file_headers.ts","../src/data_import/utils/transforms.ts","../src/data_import/utils/file_to_json.ts","../src/data_import/components/ImportFileUpload.tsx","../src/data_import/components/ImportSaveInProgress.tsx","../src/data_import/hooks/useImportConfig.tsx","../src/data_import/utils/get_import_inference_type.ts","../src/data_import/utils/data.ts","../src/data_import/components/DataNewPropertiesMapping.tsx","../src/data_import/components/ImportNewPropertyFieldPreview.tsx","../src/collection_editor/CollectionEditorDialogsContext.tsx","../src/collection_editor/ConfigControllerProvider.tsx","../src/collection_editor/useCollectionEditorController.tsx","../src/collection_editor/ui/EditorCollectionAction.tsx","../src/components/CollectionViewBinding/CollectionViewActions.tsx","../src/components/CollectionViewBinding/usePreviewSlots.ts","../src/components/CollectionViewBinding/EntityCardBinding.tsx","../src/components/CollectionViewBinding/CollectionCardViewBinding.tsx","../src/components/CollectionViewBinding/CollectionListViewBinding.tsx","../src/components/PropertyCollectionView.tsx","../src/components/EntityViewBinding.tsx","../src/components/JsonPreviewBinding.tsx","../src/util/view_constants.ts","../src/components/DetailViewBinding.tsx","../src/components/CollectionViewBinding/SplitListView.tsx","../src/components/CollectionViewBinding/BoardCardBinding.tsx","../src/components/CollectionViewBinding/useBoardDataController.tsx","../src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts","../src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx","../src/components/CollectionViewBinding/ViewModeToggle.tsx","../src/components/DeleteEntityDialog.tsx","../src/components/CollectionViewBinding/utils.ts","../src/components/admin/CreationResultDialog.tsx","../src/components/common/default_entity_actions.tsx","../src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx","../src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx","../src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx","../src/components/ClearFilterSortButton.tsx","../src/components/CollectionViewBinding/FiltersDialog.tsx","../src/components/CollectionViewBinding/FilterPresetsButton.tsx","../src/components/CollectionViewBinding/CollectionViewStartActions.tsx","../src/components/CollectionViewBinding/CollectionViewBinding.tsx","../src/components/EditFormActions.tsx","../src/components/EditViewBinding.tsx","../src/components/SidePanelBinding.tsx","../src/hooks/useBuildSidePanel.tsx","../src/hooks/useResolvedNavigationFrom.tsx","../src/hooks/useHistory.ts","../src/hooks/navigation/useBuildCollectionRegistryController.tsx","../src/hooks/navigation/useNavigationResolution.ts","../src/hooks/navigation/utils.ts","../src/hooks/navigation/useAsyncResolver.ts","../src/hooks/navigation/useResolvedCollections.ts","../src/hooks/navigation/useResolvedViews.tsx","../src/hooks/navigation/useTopLevelNavigation.ts","../src/hooks/navigation/useBuildNavigationStateController.tsx","../src/hooks/navigation/useBuildUrlController.tsx","../src/components/SideDialogs.tsx","../src/components/ReferenceTable/SelectionTableBinding.tsx","../src/hooks/useSelectionDialog.tsx","../src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx","../src/form/field_bindings/BlockFieldBinding.tsx","../src/form/field_bindings/DateTimeFieldBinding.tsx","../src/form/field_bindings/KeyValueFieldBinding.tsx","../src/form/field_bindings/MapFieldBinding.tsx","../src/form/field_bindings/MarkdownEditorFieldBinding.tsx","../src/form/field_bindings/MultiSelectFieldBinding.tsx","../src/form/field_bindings/ReferenceFieldBinding.tsx","../src/form/field_bindings/RepeatFieldBinding.tsx","../src/form/field_bindings/SelectFieldBinding.tsx","../src/form/components/StorageItemPreview.tsx","../src/form/field_bindings/StorageUploadFieldBinding.tsx","../src/form/field_bindings/SwitchFieldBinding.tsx","../src/form/field_bindings/TextFieldBinding.tsx","../src/form/field_bindings/VectorFieldBinding.tsx","../src/form/field_bindings/MultipleRelationFieldBinding.tsx","../src/form/field_bindings/RelationFieldBinding.tsx","../src/form/field_bindings/UserSelectFieldBinding.tsx","../src/components/field_configs.tsx","../src/form/PropertyFieldBinding.tsx","../src/form/components/ErrorFocus.tsx","../src/form/EntityFormActions.tsx","../src/form/components/LocalChangesMenu.tsx","../src/form/form_utils.ts","../src/form/EntityForm.tsx","../src/form/EntityFormBinding.tsx","../src/collection_editor/useCollectionsConfigController.tsx","../src/collection_editor/serializable_utils.ts","../src/collection_editor/validateCollectionJson.ts","../src/collection_editor/api/generateCollectionApi.ts","../src/collection_editor/ui/collection_editor/util.ts"],"sourcesContent":["import React from \"react\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\nexport function FormEntry({\n propertyKey,\n widthPercentage = 100,\n children\n }: {\n propertyKey: string;\n widthPercentage?: number;\n children: React.ReactNode;\n}) {\n return (\n <div id={`form_field_${propertyKey}`}\n className={\"relative\"}\n style={{ width: widthPercentage === 100 ? \"100%\" : `calc(${widthPercentage}% - 8px)` }}>\n <ErrorBoundary>\n {children}\n </ErrorBoundary>\n </div>\n );\n}\n","import React from \"react\";\nimport { cls } from \"@rebasepro/ui\";\n\nexport function FormLayout({\n children,\n className\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={cls(\"flex flex-wrap gap-x-4 w-full space-y-6\", className)}>\n {children}\n </div>\n );\n}\n","import React, { forwardRef } from \"react\";\nimport { cls } from \"@rebasepro/ui\";\n\ninterface LabelWithIconProps {\n icon: React.ReactNode;\n title?: string;\n small?: boolean;\n className?: string;\n required?: boolean;\n}\n\n/**\n * Render the label of with an icon and the title of a property\n * @group Form custom fields\n */\nexport const LabelWithIcon = forwardRef<HTMLDivElement, LabelWithIconProps>(\n ({\n icon,\n title,\n small,\n className,\n required\n }, ref) => {\n return (\n <div\n ref={ref}\n className={cls(\"align-middle inline-flex items-center my-0.5\",\n small ? \"gap-1\" : \"gap-2\",\n className)}\n >\n {icon}\n <span\n className={`text-start font-medium text-${small ? \"base\" : \"sm\"} origin-top-left transform ${small ? \"translate-x-2 scale-75\" : \"\"\n }`}\n >\n {(title ?? \"\") + (required ? \" *\" : \"\")}\n </span>\n </div>\n );\n }\n);\n\nLabelWithIcon.displayName = \"LabelWithIcon\";\n","import { CopyIcon, IconButton, Tooltip, Typography } from \"@rebasepro/ui\";\nimport { useCallback, useState } from \"react\";\n\nexport function PropertyIdCopyTooltip({\n propertyKey,\n className,\n children\n}: {\n propertyKey: string,\n className?: string,\n children: React.ReactNode\n}) {\n return <Tooltip title={<PropertyIdCopyTooltipContent propertyKey={propertyKey}/>}\n delayDuration={800}\n side={\"top\"}\n align={\"start\"}\n sideOffset={8}\n className={className}>\n {children}\n </Tooltip>\n\n}\n\nexport function PropertyIdCopyTooltipContent({ propertyKey }: { propertyKey: string }) {\n\n const [copied, setCopied] = useState(false);\n\n return (\n <div className={\"flex flex-row gap-2 items-center justify-center text-on-surface\"}>\n <div>\n <Typography variant={\"caption\"} className={\"min-w-20 text-on-surface-variant opacity-80\"}\n color={\"inherit\"}>{copied ? \"Copied\" : \"Property ID\"}</Typography>\n <Typography variant={\"caption\"} className={\"text-on-surface\"}><code>{propertyKey}</code></Typography>\n </div>\n <IconButton size={\"small\"}>\n <CopyIcon\n className={\"text-on-surface\"}\n onClick={useCallback(() => {\n navigator.clipboard.writeText(propertyKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [propertyKey])}\n />\n </IconButton>\n </div>\n );\n}\n","import React from \"react\";\nimport { LabelWithIcon } from \"./LabelWithIcon\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\n\ninterface LabelWithIconAndTooltip {\n icon: React.ReactNode;\n title?: string;\n small?: boolean;\n className?: string;\n required?: boolean;\n propertyKey: string\n}\n\n/**\n * Render the label of with an icon and the title of a property\n * @group Form custom fields\n */\nexport function LabelWithIconAndTooltip({\n propertyKey,\n className,\n ...props\n }: LabelWithIconAndTooltip) {\n return (\n <PropertyIdCopyTooltip propertyKey={propertyKey} className={className}>\n <LabelWithIcon {...props}/>\n </PropertyIdCopyTooltip>\n );\n}\n","import React from \"react\";\n\n/**\n * @group Preview components\n */\nexport function EmptyValue({ className }: { className?: string }) {\n\n return <div\n className=\"rounded-full bg-surface-200 bg-opacity-30 bg-surface-200/30 dark:bg-opacity-20 dark:bg-surface-200/20 w-5 h-2 inline-block\"/>;\n}\n","import { CollectionSize } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../types/components/PropertyPreviewProps\";\nexport function sanitizeUrl(url: string | undefined): string {\n if (!url) return \"about:blank\";\n const trimmed = url.trim();\n if (/^(?:javascript|data|vbscript):/i.test(trimmed)) {\n return \"about:blank\";\n }\n return trimmed;\n}\n\nexport const SMALL_THUMBNAIL = 40;\nexport const MEDIUM_THUMBNAIL = 100;\nexport const LARGE_THUMBNAIL = 200;\n\nexport function getThumbnailMeasure(size: PreviewSize): number {\n if (size === \"small\")\n return SMALL_THUMBNAIL;\n else if (size === \"medium\")\n return MEDIUM_THUMBNAIL;\n else if (size === \"large\")\n return LARGE_THUMBNAIL;\n else throw Error(\"Thumbnail size not mapped\");\n}\n\nexport function getPreviewSizeFrom(size: CollectionSize): PreviewSize {\n switch (size) {\n case \"xs\":\n case \"s\":\n return \"small\";\n case \"m\":\n return \"medium\";\n case \"l\":\n case \"xl\":\n return \"large\";\n default:\n throw Error(\"Missing mapping value in getPreviewSizeFrom: \" + size);\n }\n}\n","import { CopyIcon, ExternalLinkIcon, ImageOffIcon } from \"@rebasepro/ui\";\nimport React, { CSSProperties, useMemo, useState, useEffect } from \"react\";import { IconButton, Tooltip } from \"@rebasepro/ui\";\nimport { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { getThumbnailMeasure } from \"../util\";\nimport { useTranslation } from \"@rebasepro/app\";\nimport { sanitizeUrl } from \"../util\";\n\n/**\n * @group Preview components\n */\nexport interface ImagePreviewProps {\n size: PreviewSize,\n url: string,\n /**\n * If true, image fills its container completely with object-fit cover\n */\n fill?: boolean\n}\n\n/**\n * @group Preview components\n */\nexport function ImagePreview({\n size,\n url,\n fill\n }: ImagePreviewProps) {\n const [hasError, setHasError] = useState(false);\n\n useEffect(() => {\n setHasError(false);\n }, [url]);\n\n const handleError = () => setHasError(true);\n\n const imageSize = useMemo(() => getThumbnailMeasure(size), [size]);\n const { t } = useTranslation();\n\n // Fill mode - image fills its container completely\n if (fill) {\n if (hasError) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-surface-100 dark:bg-surface-900 rounded-md\">\n <ImageOffIcon className=\"text-surface-400 dark:text-surface-500\"/>\n </div>\n );\n }\n return (\n <img src={url}\n className={\"w-full h-full object-cover\"}\n key={\"fill_image_preview_\" + url}\n loading=\"lazy\"\n onError={handleError}\n />\n );\n }\n\n if (size === \"small\") {\n if (hasError) {\n return (\n <div className=\"flex items-center justify-center bg-surface-100 dark:bg-surface-900 rounded-md\"\n style={{ width: imageSize,\nheight: imageSize,\nmaxHeight: \"100%\" }}>\n <ImageOffIcon className=\"text-surface-400 dark:text-surface-500\"/>\n </div>\n );\n }\n return (\n <img src={url}\n className={\"rounded-md\"}\n key={\"tiny_image_preview_\" + url}\n onError={handleError}\n style={{\n position: \"relative\",\n objectFit: \"cover\",\n width: imageSize,\n height: imageSize,\n maxHeight: \"100%\"\n }}/>\n );\n }\n\n const imageStyle: CSSProperties =\n {\n maxWidth: \"100%\",\n maxHeight: \"100%\"\n };\n\n return (\n <div\n className=\"relative flex items-center justify-center max-w-full max-h-full group\"\n style={{\n width: imageSize,\n height: imageSize\n }}\n key={\"image_preview_\" + url}>\n\n {hasError ? (\n <div className=\"w-full h-full flex items-center justify-center bg-surface-100 dark:bg-surface-900 rounded-md\">\n <ImageOffIcon className=\"text-surface-400 dark:text-surface-500\"/>\n </div>\n ) : (\n <img src={url}\n className={\"rounded-md\"}\n style={imageStyle}\n onError={handleError}/>\n )}\n\n <div className={\"flex flex-row gap-2 absolute bottom-[-4px] right-[-4px] invisible group-hover:visible\"}>\n {navigator && <Tooltip\n asChild={true}\n title={t(\"copy_url_to_clipboard\")} side={\"bottom\"}>\n <IconButton\n variant={\"filled\"}\n size={\"smallest\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n return navigator.clipboard.writeText(url);\n }}>\n <CopyIcon className={\"text-surface-700 dark:text-surface-300\"}/>\n </IconButton>\n </Tooltip>}\n\n <Tooltip title={t(\"open_image_in_new_tab\")} side={\"bottom\"}>\n <IconButton\n className=\"invisible group-hover:visible\"\n variant={\"filled\"}\n component={\"a\" as React.ElementType}\n href={sanitizeUrl(url)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n size={\"smallest\"}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <ExternalLinkIcon className={\"text-surface-700 dark:text-surface-300\"}/>\n </IconButton>\n </Tooltip>\n </div>\n\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\n\nimport { ImagePreview } from \"./ImagePreview\";\nimport { PreviewType } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { cls, ExternalLinkIcon, FileTextIcon, Tooltip, Typography } from \"@rebasepro/ui\";\nimport { EmptyValue } from \"./EmptyValue\";\nimport { getThumbnailMeasure, sanitizeUrl } from \"../util\";\n\nexport { sanitizeUrl };\n\n/**\n * @group Preview components\n */\nexport function UrlComponentPreview({\n url,\n previewType,\n size,\n hint,\n interactive = true,\n fill\n}: {\n url: string,\n previewType?: PreviewType,\n size: PreviewSize,\n hint?: string,\n // for video controls\n interactive?: boolean,\n fill?: boolean\n}): React.ReactElement {\n\n if (!previewType) {\n if (!url || !url.trim()) return <EmptyValue/>;\n return (\n <a className=\"flex gap-4 break-words items-center font-medium text-primary visited:text-primary dark:visited:text-primary dark:text-primary\"\n href={sanitizeUrl(url)}\n rel=\"noopener noreferrer\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n }}\n target=\"_blank\">\n <ExternalLinkIcon/>\n {url}\n </a>\n );\n }\n\n if (previewType === \"image\") {\n return <ImagePreview url={url}\n size={size}\n fill={fill}/>;\n } else if (previewType === \"audio\") {\n return <audio controls\n className={\"max-w-100%\"}\n src={url}>\n Your browser does not support the\n <code>audio</code> element.\n </audio>;\n } else if (previewType === \"video\") {\n return <VideoPreview size={size} src={url} interactive={interactive}/>;\n } else {\n return (\n <Tooltip title={hint}>\n <a\n href={sanitizeUrl(url)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex flex-col items-center justify-center\"\n style={{\n width: getThumbnailMeasure(size),\n height: getThumbnailMeasure(size)\n }}>\n <FileTextIcon className=\"text-surface-700 dark:text-surface-300\"/>\n {hint && <Typography\n className=\"max-w-full truncate rtl text-left\"\n variant={\"caption\"}>{hint}</Typography>}\n </a>\n </Tooltip>\n );\n }\n}\n\nfunction VideoPreview({\n size,\n src,\n interactive\n}: { size: PreviewSize, src: string, interactive: boolean }) {\n\n const imageSize = useMemo(() => {\n if (size === \"small\")\n return \"140px\";\n else if (size === \"medium\")\n return \"240px\";\n else if (size === \"large\")\n return \"100%\";\n else throw new Error(\"Invalid size\");\n }, [size]);\n\n const videoProps = {\n controls: interactive\n };\n return <video\n style={{\n position: \"relative\",\n objectFit: \"cover\",\n width: imageSize,\n minWidth: \"140px\",\n // height: imageSize,\n maxHeight: \"100%\"\n }}\n {...videoProps}\n className={cls(\"max-w-100% rounded-xs\", { \"pointer-events-none\": !interactive })}>\n <source src={src}/>\n </video>;\n}\n","import type { Properties } from \"@rebasepro/types\";\nimport type { ArrayProperty, MapProperty, Property, StringProperty } from \"@rebasepro/types\";\nimport { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport React from \"react\";\nimport { Skeleton, Table, TableBody, TableRow, TableCell, Typography } from \"@rebasepro/ui\";\nimport { getThumbnailMeasure } from \"../util\";\n\nexport interface SkeletonPropertyComponentProps {\n property: Property,\n size: PreviewSize\n}\n\n/**\n * @group Preview components\n */\nexport function SkeletonPropertyComponent({\n property,\n size\n}: SkeletonPropertyComponentProps\n) {\n\n if (!property) {\n console.error(\"No property assigned for skeleton component\", property, size);\n }\n\n let content: React.ReactNode | any;\n if (property.type === \"string\") {\n const stringProperty = property as StringProperty;\n if (stringProperty.ui?.url) {\n content = renderUrlComponent(stringProperty, size);\n } else if (stringProperty.storage) {\n content = renderSkeletonImageThumbnail(size);\n } else {\n content = renderSkeletonText();\n }\n } else if (property.type === \"array\") {\n const arrayProperty = property as ArrayProperty;\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <>{arrayProperty.of.map((p, i) => renderGenericArrayCell(p, i))} </>;\n } else {\n if (arrayProperty.of.type === \"map\" && arrayProperty.of.properties) {\n content = renderArrayOfMaps(arrayProperty.of.properties, size, arrayProperty.of.previewProperties);\n } else if (arrayProperty.of.type === \"string\") {\n if (arrayProperty.of.enum) {\n content = renderArrayEnumTableCell();\n } else if (arrayProperty.of.storage) {\n content = renderGenericArrayCell(arrayProperty.of);\n } else {\n content = renderArrayOfStrings();\n }\n } else {\n content = renderGenericArrayCell(arrayProperty.of);\n }\n }\n }\n\n } else if (property.type === \"map\") {\n content = renderMap(property as MapProperty, size);\n } else if (property.type === \"date\") {\n content = renderSkeletonText();\n } else if (property.type === \"reference\") {\n content = renderReference();\n } else if (property.type === \"boolean\") {\n content = renderSkeletonText();\n } else {\n content = renderSkeletonText();\n }\n return (content || null);\n}\n\nfunction renderMap<T extends Record<string, any>>(property: MapProperty, size: PreviewSize) {\n\n if (!property.properties)\n return <></>;\n\n let mapPropertyKeys: string[];\n if (size === \"large\") {\n mapPropertyKeys = Object.keys(property.properties);\n } else {\n mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];\n if (size === \"medium\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 3);\n else if (size === \"small\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 1);\n }\n\n if (size !== \"large\")\n return (\n <div\n className=\"w-full flex flex-col space-y-4\"\n >\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"medium\"}/>}\n </div>\n ))}\n </div>\n );\n\n return (\n <Table className=\"table-auto\">\n <TableBody>\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n return (\n <TableRow\n key={`map_preview_table__${index}`}>\n <TableCell key={`table-cell-title--${key}`}\n className=\"align-top\"\n style={{ width: \"30%\" }}>\n <Typography variant=\"caption\" color=\"secondary\">\n {property.properties![key].name}\n </Typography>\n </TableCell>\n <TableCell key={`table-cell-${key}`}\n style={{ width: \"70%\" }}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"medium\"}/>}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n );\n}\n\nfunction renderArrayOfMaps(properties: Properties, size: PreviewSize, previewProperties?: string[]) {\n let tableProperties = previewProperties;\n if (!tableProperties || !tableProperties.length) {\n tableProperties = Object.keys(properties) as string[];\n if (size)\n tableProperties = tableProperties.slice(0, 3);\n }\n\n return (\n <Table className=\"table-auto\">\n <TableBody>\n {\n [0, 1, 2].map((value, index) => {\n return (\n <TableRow key={`table_${value}_${index}`}>\n {tableProperties && tableProperties.map(\n (key) => (\n <TableCell\n key={`table-cell-${key}`}\n >\n <SkeletonPropertyComponent\n property={(properties)[key]}\n size={\"medium\"}/>\n </TableCell>\n )\n )}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n );\n}\n\nfunction renderArrayOfStrings() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) => (\n renderSkeletonText(index)\n ))}\n </div>\n );\n}\n\nfunction renderArrayEnumTableCell() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) =>\n <>\n {renderSkeletonText(index)}\n </>\n )}\n </div>\n );\n}\n\nfunction renderGenericArrayCell(\n property: Property,\n index = 0\n) {\n return (\n\n <div key={\"array_index_\" + index}\n className={\"flex flex-col gap-2\"}>\n\n {\n [0, 1].map((value, index) =>\n <>\n <SkeletonPropertyComponent key={`i_${index}`}\n property={property}\n size={\"medium\"}/>\n </>\n )}\n </div>\n );\n}\n\nfunction renderUrlAudioComponent() {\n return (\n <Skeleton width={300}\n height={100}/>\n );\n}\n\nexport function renderSkeletonImageThumbnail(size: PreviewSize) {\n const imageSize = size === \"small\" ? 40 : size === \"medium\" ? 100 : 200;\n return (\n <Skeleton width={imageSize}\n height={imageSize}/>\n );\n}\n\nfunction renderUrlVideo(size: PreviewSize) {\n\n return (\n <Skeleton width={size !== \"large\" ? 300 : 500}\n height={size !== \"large\" ? 200 : 250}/>\n );\n}\n\nfunction renderReference() {\n return <Skeleton width={200} height={100}/>;\n}\n\nfunction renderUrlComponent(property: StringProperty, size: PreviewSize = \"large\") {\n\n if (typeof property.ui?.url === \"boolean\") {\n return <div style={{\n display: \"flex\"\n }}>\n {renderSkeletonIcon()}\n {renderSkeletonText()}\n </div>;\n }\n\n return renderUrlFile(size);\n}\n\nfunction renderUrlFile(size: PreviewSize) {\n\n return (\n <div\n className={`w-${getThumbnailMeasure(size)} h-${getThumbnailMeasure(size)}`}>\n {renderSkeletonIcon()}\n </div>\n );\n}\n\nexport function renderSkeletonText(index?: number, width = 120) {\n return <Skeleton width={width} key={`skeleton_${index}`}/>;\n}\n\nexport function renderSkeletonCaptionText(index?: number) {\n return <Skeleton\n height={20}/>;\n}\n\nexport function renderSkeletonIcon() {\n return <Skeleton width={24} height={24}/>;\n}\n","import React, { useEffect } from \"react\";\n\nimport { renderSkeletonImageThumbnail } from \"../property_previews/SkeletonPropertyComponent\";\nimport { UrlComponentPreview } from \"./UrlComponentPreview\";\nimport { ErrorView, useStorageSource, useStorageSources } from \"@rebasepro/app\";\nimport { resolveStorageSource } from \"@rebasepro/common\";\nimport { DownloadConfig, FileType } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { Skeleton } from \"@rebasepro/ui\";\ntype StorageThumbnailProps = {\n storagePathOrDownloadUrl: string;\n storeUrl: boolean;\n size: PreviewSize;\n interactive?: boolean;\n fill?: boolean;\n /** Key of the storage source backing this property (`StorageConfig.storageSource`). */\n storageSourceKey?: string;\n};\n\n/**\n * @group Preview components\n */\nexport const StorageThumbnail = React.memo<StorageThumbnailProps>(StorageThumbnailInternal, areEqual) as React.FunctionComponent<StorageThumbnailProps>;\n\nfunction areEqual(prevProps: StorageThumbnailProps, nextProps: StorageThumbnailProps) {\n return prevProps.size === nextProps.size &&\n prevProps.storagePathOrDownloadUrl === nextProps.storagePathOrDownloadUrl &&\n prevProps.storeUrl === nextProps.storeUrl &&\n prevProps.interactive === nextProps.interactive &&\n prevProps.fill === nextProps.fill &&\n prevProps.storageSourceKey === nextProps.storageSourceKey;\n}\n\nconst URL_CACHE: Record<string, DownloadConfig> = {};\n\nexport function StorageThumbnailInternal({\n storeUrl,\n interactive,\n storagePathOrDownloadUrl,\n size,\n fill,\n storageSourceKey\n}: StorageThumbnailProps) {\n\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const defaultStorage = useStorageSource();\n const storageSources = useStorageSources();\n // Resolve the per-property backend so previews of `storeUrl: false`\n // properties pointing at a named source hit the right backend.\n const storage = resolveStorageSource({\n sourceKey: storageSourceKey,\n sources: storageSources.sources,\n defaultSource: defaultStorage\n });\n\n // Cache key is namespaced by source so the same path on two backends\n // does not collide.\n const cacheKey = `${storageSourceKey ?? \"\"}::${storagePathOrDownloadUrl}`;\n\n const [downloadConfig, setDownloadConfig] = React.useState<DownloadConfig>(URL_CACHE[cacheKey]);\n\n useEffect(() => {\n if (!storagePathOrDownloadUrl)\n return;\n let unmounted = false;\n storage.getSignedUrl(storagePathOrDownloadUrl)\n .then(function (downloadConfig) {\n if (!unmounted) {\n setDownloadConfig(downloadConfig);\n URL_CACHE[cacheKey] = downloadConfig;\n }\n }).catch(setError);\n return () => {\n unmounted = true;\n };\n }, [storagePathOrDownloadUrl, cacheKey]);\n\n if (!storagePathOrDownloadUrl) return null;\n\n const filetype = downloadConfig?.metadata ? getFiletype(downloadConfig?.metadata.contentType) : undefined;\n const previewType = filetype?.startsWith(\"image\")\n ? \"image\"\n : (filetype?.startsWith(\"video\")\n ? \"video\"\n : (filetype?.startsWith(\"audio\") ? \"audio\" : \"file\"));\n\n if (downloadConfig?.fileNotFound)\n return <ErrorView error={\"File not found\"}></ErrorView>\n\n return downloadConfig?.url\n ? <UrlComponentPreview previewType={previewType}\n url={downloadConfig.url}\n interactive={interactive}\n size={size}\n fill={fill}\n hint={storagePathOrDownloadUrl}/>\n : fill\n ? <Skeleton className=\"w-full h-full\"/>\n : renderSkeletonImageThumbnail(size);\n}\n\nfunction getFiletype(input: string): FileType {\n if (input.startsWith(\"image\")) return \"image/*\";\n else if (input.startsWith(\"video\")) return \"video/*\";\n else if (input.startsWith(\"audio\")) return \"audio/*\";\n else if (input.startsWith(\"application\")) return \"application/*\";\n else if (input.startsWith(\"text\")) return \"text/*\";\n else if (input.startsWith(\"font\")) return \"font/*\";\n else return input;\n}\n","import React from \"react\";\nimport { Chip } from \"@rebasepro/ui\";\nimport { EnumValues } from \"@rebasepro/types\";\nimport { enumToObjectEntries, getLabelOrConfigFrom } from \"@rebasepro/common\";\nimport { buildEnumLabel, getColorScheme } from \"@rebasepro/app\";\n\nexport interface EnumValuesChipProps {\n enumValues?: EnumValues;\n enumKey: string | number;\n size: \"small\" | \"medium\" | \"large\";\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * @group Preview components\n */\nexport function EnumValuesChip({\n enumValues,\n enumKey,\n size,\n className,\n children\n}: EnumValuesChipProps) {\n if (!enumValues) return null;\n const enumValuesConfig = enumToObjectEntries(enumValues);\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValuesConfig, enumKey) : undefined;\n const label = buildEnumLabel(enumValue);\n const colorScheme = getColorScheme(enumValuesConfig, enumKey);\n return <Chip\n className={className}\n colorScheme={colorScheme}\n error={!label}\n outlined={false}\n size={size}>\n {children}\n {!children && (label !== undefined ? label : String(enumKey))}\n </Chip>;\n}\n","import type { StringProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport { EnumValuesChip } from \"../components/EnumValuesChip\";\nimport { PreviewType } from \"@rebasepro/types\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { UrlComponentPreview } from \"../components/UrlComponentPreview\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { Chip, cls, getColorSchemeForSeed } from \"@rebasepro/ui\";\n\n/**\n * @group Preview components\n */\nexport function StringPropertyPreview({\n propertyKey,\n value,\n property,\n size\n}: PropertyPreviewProps<StringProperty>): React.ReactElement {\n\n const strValue = value as string;\n\n if (property.enum) {\n const enumKey = strValue;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={property.enum}\n size={size}/>;\n } else if (property.ui?.previewAsTag) {\n const colorScheme = getColorSchemeForSeed(propertyKey ?? \"\");\n return (\n <ErrorBoundary>\n <Chip\n colorScheme={colorScheme}\n size={size}>\n {strValue}\n </Chip>\n </ErrorBoundary>);\n } else if (property.ui?.url) {\n return (\n <UrlComponentPreview size={size}\n url={strValue}\n previewType={typeof property.ui?.url === \"string\" ? property.ui?.url as PreviewType : undefined}/>\n );\n } else {\n if (!strValue) return <></>;\n const lines = strValue.split(\"\\n\");\n return strValue && strValue.includes(\"\\n\")\n ? <div className={cls(\"overflow-x-scroll overflow-hidden\", size === \"small\" ? \"text-sm\" : \"\")}>\n {lines.map((str: any, index: number) =>\n <React.Fragment key={`string_preview_${index}`}>\n <span>{str}</span>\n {index !== lines.length - 1 && <br/>}\n </React.Fragment>)}\n </div>\n : (size === \"small\"\n ? <span className={\"text-sm\"}>{strValue}</span>\n : <>{strValue}</>\n );\n }\n}\n","import type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport type { PropertyPreviewProps, PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useAuthController, useCustomizationController } from \"@rebasepro/app\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { resolveArrayProperties } from \"@rebasepro/common\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyPreview({\n propertyKey,\n value,\n property: property,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (property.type !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n if (!property.of) {\n throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n const resolvedProperties = resolveArrayProperties({\n propertyKey,\n property: property as ArrayProperty,\n propertyConfigs: customizationController.propertyConfigs,\n authController\n });\n\n const values = value as unknown[];\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"medium\" : \"small\";\n\n return (\n <div className=\"w-full flex flex-col gap-2\">\n {values &&\n values.map((val, index: number) => {\n if (!resolvedProperties) {\n throw Error(\"Property resolvedProperties is undefined\");\n }\n const of: Property = resolvedProperties[index] ??\n (resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));\n return of\n ? <React.Fragment\n key={\"preview_array_\" + index}>\n <div className={cls(defaultBorderMixin, \"m-1 border-b last:border-b-0\")}>\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={propertyKey}\n value={val}\n property={of}\n size={childSize}/>\n </ErrorBoundary>\n </div>\n </React.Fragment>\n : null;\n }\n )}\n </div>\n );\n}\n","\nimport type { Properties } from \"@rebasepro/types\";\nimport type { CollectionConfig, MapProperty, Property, PropertyConfig } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport { isPropertyBuilder } from \"@rebasepro/common\";\nimport {\n AlignLeftIcon,\n CalendarIcon,\n CircleIcon,\n FlagIcon,\n FunctionSquareIcon,\n GlobeIcon,\n HashIcon,\n iconSize,\n LinkIcon,\n MailIcon,\n RepeatIcon,\n Rows3Icon,\n TextIcon,\n UploadIcon,\n VoteIcon\n} from \"@rebasepro/ui\";\nimport type { IconSize, LucideIcon } from \"@rebasepro/ui\";\n\n/**\n * Resolve a size value (string token or number) to a numeric pixel value\n * suitable for passing to Lucide icons.\n */\nfunction resolveSize(size: IconSize | number): number {\n if (typeof size === \"number\") return size;\n return iconSize[size];\n}\n\nexport function isReferenceProperty(property: Property) {\n\n if (!property) return null;\n if (property.type === \"reference\") {\n return true;\n }\n if (property.type === \"array\") {\n if (Array.isArray(property.of)) return false;\n else return property.of?.type === \"reference\"\n }\n return false;\n}\n\nexport function isRelationProperty(property: Property) {\n if (!property) return null;\n if (property.type === \"relation\") {\n return true;\n }\n if (property.type === \"array\") {\n if (Array.isArray(property.of)) return false;\n else return property.of?.type === \"relation\"\n }\n return false;\n}\n\nexport function getIconForWidget(widget: PropertyConfig | undefined,\n size: IconSize | number) {\n const Icon = widget?.Icon ?? CircleIcon;\n const px = resolveSize(size);\n return <Icon size={px}/>;\n}\n\n/**\n * Returns a default Lucide icon component based on property type.\n * This provides a sensible fallback when no PropertyConfig is available.\n */\nfunction getDefaultIconForProperty(property: Property): LucideIcon {\n switch (property.type) {\n case \"string\": {\n if (property.storage) return UploadIcon;\n if (property.ui?.url) return GlobeIcon;\n if (property.email) return MailIcon;\n if (property.ui?.multiline || property.ui?.markdown) return AlignLeftIcon;\n return TextIcon;\n }\n case \"number\":\n return HashIcon;\n case \"boolean\":\n return FlagIcon;\n case \"date\":\n return CalendarIcon;\n case \"map\":\n return VoteIcon;\n case \"array\": {\n const of = property.of;\n const oneOf = property.oneOf;\n if (oneOf) return Rows3Icon;\n if (of && !Array.isArray(of)) {\n if (of.type === \"reference\") return LinkIcon;\n if (of.type === \"string\" && of.storage) return UploadIcon;\n }\n return RepeatIcon;\n }\n case \"reference\":\n return LinkIcon;\n case \"relation\":\n return LinkIcon;\n case \"vector\":\n return HashIcon;\n default:\n return CircleIcon;\n }\n}\n\nexport function getIconForProperty(\n property: Property,\n size: IconSize | number = \"small\",\n fields: Record<string, PropertyConfig> = {}\n): React.ReactNode {\n const px = resolveSize(size);\n\n if (isPropertyBuilder(property)) {\n return <FunctionSquareIcon size={px}/>;\n }\n\n // Try to look up a custom PropertyConfig icon first\n const configId = property.propertyConfig || undefined;\n const widget = configId ? fields[configId] : undefined;\n if (widget?.Icon) {\n return getIconForWidget(widget, size);\n }\n\n // Fall back to a type-based default icon\n const Icon = getDefaultIconForProperty(property);\n return <Icon size={px}/>;\n}\n\n/**\n * Get a property in a property tree from a path like\n * `address.street`\n * @param properties\n * @param path\n */\nexport function getPropertyInPath(properties: Properties, path: string): Property | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return (properties as Record<string, Property>)[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = (properties as Record<string, Property>)[pathSegments[0]];\n if (typeof childProperty === \"object\" && childProperty.type === \"map\" && childProperty.properties) {\n return getPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\nexport function getResolvedPropertyInPath(properties: Record<string, Property>, path: string): Property | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return properties[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = properties[pathSegments[0]];\n if (childProperty.type === \"map\" && childProperty.properties) {\n return getResolvedPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\n// replace the dot notation with brackets\n// address.street => address[street]\nexport function getBracketNotation(path: string): string {\n return path.replace(/\\.([^.]*)/g, \"[$1]\");\n}\n\n/**\n * Get properties sorted by their order, but include ALL properties.\n * Nested keys (like \"data.mode\") in propertiesOrder are ignored - they're for column ordering.\n * @param properties\n * @param propertiesOrder\n */\nexport function getPropertiesWithPropertiesOrder(properties: Properties, propertiesOrder?: string[]): Properties {\n if (!propertiesOrder) return properties;\n\n const propertyKeys = Object.keys(properties);\n\n // Filter propertiesOrder to only include top-level keys (no dots) that exist\n const validOrderKeys = (propertiesOrder as string[]).filter(\n key => !key.includes(\".\") && properties[key]\n );\n\n const result: Properties = {};\n\n // First add properties in the specified order\n validOrderKeys.forEach(key => {\n const property = properties[key];\n if (typeof property === \"object\" && property.type === \"map\" && (property as MapProperty).properties) {\n const mapProp = property as MapProperty;\n result[key] = {\n ...mapProp,\n properties: getPropertiesWithPropertiesOrder(mapProp.properties!, mapProp.propertiesOrder ?? [])\n } as Property;\n } else if (property) {\n result[key] = property;\n }\n });\n\n // Then add any missing properties (so they don't disappear!)\n propertyKeys.forEach(key => {\n if (!result[key]) {\n const property = properties[key];\n if (typeof property === \"object\" && property.type === \"map\" && (property as MapProperty).properties) {\n const mapProp = property as MapProperty;\n result[key] = {\n ...mapProp,\n properties: getPropertiesWithPropertiesOrder(mapProp.properties!, mapProp.propertiesOrder ?? [])\n } as Property;\n } else if (property) {\n result[key] = property;\n }\n }\n });\n\n return result;\n}\n\nexport function getDefaultPropertiesOrder(collection: CollectionConfig): string[] {\n if (collection.propertiesOrder) return collection.propertiesOrder;\n return [...Object.keys(collection.properties), ...(collection.additionalFields ?? []).map(field => field.key)];\n}\n","import type { CollectionConfig, Property, PropertyConfig } from \"@rebasepro/types\";\nimport { AuthController } from \"@rebasepro/types\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\nimport { isReferenceProperty, isRelationProperty } from \"./property_utils\";\n\nfunction isHiddenProperty(property: Property | undefined): boolean {\n if (!property) return false;\n return Boolean(property.ui?.hideFromCollection);\n}\n\n/**\n * Returns true when the property holds file-storage content (single image,\n * array of images, generic upload, …). These properties are rendered by the\n * dedicated image-slot and should NOT appear as regular preview columns.\n */\nfunction isStorageProperty(property: Property | undefined): boolean {\n if (!property) return false;\n // Single string with storage config\n if (property.type === \"string\" && property.storage) return true;\n // String displayed as image URL\n if (property.type === \"string\" && property.ui?.url === \"image\") return true;\n // Array whose inner element has storage config or image URL\n if (property.type === \"array\" && property.of && !Array.isArray(property.of)) {\n const inner = property.of;\n if (inner.type === \"string\" && (inner.storage || inner.ui?.url === \"image\")) return true;\n }\n return false;\n}\n\nexport function getEntityPreviewKeys(\n authController: AuthController,\n targetCollection: CollectionConfig<any>,\n fields: Record<string, PropertyConfig>,\n previewProperties?: string[],\n limit = 3) {\n const allProperties = Object.keys(targetCollection.properties);\n let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));\n if (!listProperties && targetCollection.previewProperties) {\n listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string));\n }\n if (listProperties && listProperties.length > 0) {\n return listProperties;\n } else {\n const hasExplicitOrder = !!(targetCollection.propertiesOrder as string[] | undefined);\n listProperties = (targetCollection.propertiesOrder as string[]) || allProperties;\n return listProperties\n .filter(key => {\n const prop = targetCollection.properties[key];\n const isIdProp = prop && typeof prop === \"object\" && \"isId\" in prop && Boolean((prop as { isId?: boolean }).isId);\n return !isIdProp && key !== \"id\";\n })\n .filter(key => {\n const property = targetCollection.properties[key];\n return property && !isPropertyBuilder(property) && !isReferenceProperty(property) && !isHiddenProperty(property)\n && !isStorageProperty(property as Property)\n && (hasExplicitOrder || !isRelationProperty(property));\n }).slice(0, limit);\n }\n}\n\nexport function getEntityTitlePropertyKey<M extends Record<string, unknown>>(collection: CollectionConfig<M>, propertyConfigs: Record<string, PropertyConfig>): string | undefined {\n if (collection.titleProperty) {\n return collection.titleProperty as string;\n }\n\n const hasExplicitOrder = !!(collection.propertiesOrder as string[] | undefined);\n const orderToSearch = (collection.propertiesOrder as string[]) || Object.keys(collection.properties);\n\n // If explicit propertiesOrder is set, allow the first non-ID relation or string to be the titleKey.\n // Storage/image properties are excluded — they are rendered by the dedicated image slot,\n // so using one here would duplicate the same image in both the image and title slots.\n if (hasExplicitOrder) {\n for (const key of orderToSearch) {\n const property = collection.properties[key];\n if (property && !isPropertyBuilder(property)) {\n const prop = property as Property;\n const isIdProp = prop && typeof prop === \"object\" && \"isId\" in prop && Boolean((prop as { isId?: boolean }).isId);\n if (isIdProp || key === \"id\" || isHiddenProperty(prop)) {\n continue;\n }\n if (prop.type === \"relation\" || (prop.type === \"string\" && !isStorageProperty(prop))) {\n return key;\n }\n }\n }\n }\n\n let firstStringCandidate: string | undefined;\n\n for (const key of orderToSearch) {\n const property = collection.properties[key];\n if (property && !isPropertyBuilder(property)) {\n const prop = property as Property;\n if (isHiddenProperty(prop)) {\n continue;\n }\n if (prop.type === \"string\" && !prop.ui?.multiline && !prop.ui?.markdown && !prop.storage && !prop.isId) {\n if (!firstStringCandidate) {\n firstStringCandidate = key;\n }\n const lowerKey = key.toLowerCase();\n if ([\"name\", \"title\", \"label\", \"displayname\", \"username\"].includes(lowerKey)) {\n return key; // Immediate return if it's a strong title candidate\n }\n }\n }\n }\n return firstStringCandidate;\n}\n\n/**\n * Attempt to turn a title value (which might be a relation, reference, date, array, or other complex object)\n * into a renderable, human-readable string.\n */\nexport function resolveTitleToString(title: any): string {\n if (title === null || title === undefined) {\n return \"\";\n }\n\n if (typeof title !== \"object\") {\n return String(title);\n }\n\n // Check if it's a relation shape: { __type: \"relation\", id, path, data }\n if (\"__type\" in title && title.__type === \"relation\") {\n if (title.data && title.data.values) {\n const values = title.data.values;\n // Prioritize common title fields in eagerly loaded relation data\n for (const key of [\"name\", \"title\", \"label\", \"displayName\"]) {\n if (values[key] !== undefined && values[key] !== null) {\n return String(values[key]);\n }\n }\n // Fallback: search for first short string value in values\n for (const val of Object.values(values)) {\n if (typeof val === \"string\" && val.length > 0 && val.length < 200) {\n return val;\n }\n }\n }\n if (title.id !== undefined && title.id !== null) {\n return String(title.id);\n }\n }\n\n // Check if it's a reference shape: { isEntityReference() } or similar\n if (\"isEntityReference\" in title && typeof title.isEntityReference === \"function\" && title.isEntityReference()) {\n return String(title.id);\n }\n if (\"id\" in title && \"path\" in title && !(\"__type\" in title)) {\n // Flat reference/relation-like object\n return String(title.id);\n }\n\n // Check if it's a Date\n if (title instanceof Date) {\n return title.toLocaleDateString();\n }\n\n // Check if it has a string/number property like name/title/label/id\n if (\"name\" in title && title.name !== undefined && title.name !== null && typeof title.name !== \"object\") {\n return String(title.name);\n }\n if (\"title\" in title && title.title !== undefined && title.title !== null && typeof title.title !== \"object\") {\n return String(title.title);\n }\n if (\"label\" in title && title.label !== undefined && title.label !== null && typeof title.label !== \"object\") {\n return String(title.label);\n }\n if (\"id\" in title && title.id !== undefined && title.id !== null && typeof title.id !== \"object\") {\n return String(title.id);\n }\n\n // Fallback: try converting to string, or JSON.stringify if it looks like a generic object\n try {\n const str = String(title);\n if (str !== \"[object Object]\") {\n return str;\n }\n return JSON.stringify(title);\n } catch {\n return \"\";\n }\n}\n\n\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { createContext } from \"react\";\nimport { CollectionRegistryController } from \"@rebasepro/types\";\n\nexport const CollectionRegistryContext = createContext<CollectionRegistryController>({\n getCollection: () => undefined,\n getRawCollection: () => undefined,\n getParentReferencesFromPath: () => [],\n getParentCollectionSlugs: () => [],\n getParentEntityIds: () => [],\n convertIdsToPaths: () => [],\n initialised: false\n});\n\nexport function useCollectionRegistryController<DB = Record<string, unknown>, EC extends CollectionConfig = CollectionConfig>(): CollectionRegistryController<DB, EC> {\n const context = React.useContext(CollectionRegistryContext);\n if (context === undefined) {\n throw new Error(\"useCollectionRegistryController must be used within a CollectionRegistryContext.Provider\");\n }\n return context as CollectionRegistryController<DB, EC>;\n}\n","import type { SidePanelController } from \"@rebasepro/types\";\nimport React, { useContext } from \"react\";\n\nexport const SidePanelControllerContext = React.createContext<SidePanelController>({} as SidePanelController);\n\n/**\n * Use this hook to retrieve a entity controller that allows you to open\n * a side dialog to edit a entity.\n *\n * @see SidePanelController\n * @group Hooks and utilities\n */\nexport const useSidePanel = (): SidePanelController => useContext(SidePanelControllerContext);\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport type { Property } from \"@rebasepro/types\";\nimport * as React from \"react\";\nimport { useEffect, useMemo } from \"react\";\n\nimport { Entity } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../types/components/PropertyPreviewProps\";\nimport { getEntityImagePreviewPropertyKey } from \"@rebasepro/common\";\nimport {\n ArrowRightToLineIcon,\n cls,\n defaultBorderMixin,\n IconButton,\n Skeleton,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { PropertyPreview, SkeletonPropertyComponent } from \"../preview\";\nimport {\n useAuthController,\n useCustomizationController,\n useData,\n ErrorView\n} from \"@rebasepro/app\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { getPropertyInPath } from \"../util/property_utils\";\nimport { getEntityPreviewKeys, getEntityTitlePropertyKey } from \"../util/previews\";\nimport { getValueInPath } from \"@rebasepro/utils\";\nimport { useCollectionRegistryController } from \"../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useSidePanel } from \"../hooks/useSidePanel\";\n\nexport type EntityPreviewBindingProps = {\n size?: PreviewSize,\n actions?: React.ReactNode,\n collection?: CollectionConfig,\n hover?: boolean;\n previewKeys?: string[],\n disabled?: boolean,\n entity: Entity<any>,\n includeId?: boolean,\n includeTitle?: boolean,\n includeEntityLink?: boolean,\n includeImage?: boolean,\n onClick?: (e: React.SyntheticEvent) => void;\n onSidePanelClick?: (entity: Entity) => void,\n};\n\nexport type EntityPreviewBindingDataProps = {\n size?: \"smallest\" | \"small\" | \"medium\" | \"large\",\n actions?: React.ReactNode,\n collection?: CollectionConfig,\n previewKeys?: string[],\n entity: Entity<any>,\n onSidePanelClick?: (entity: Entity) => void,\n includeId?: boolean,\n includeTitle?: boolean,\n includeEntityLink?: boolean,\n includeImage?: boolean,\n};\n\n/**\n * This component contains the main logic and content for displaying a entity preview,\n * without any container wrapper. Used internally by EntityPreviewBinding.\n */\nexport function EntityPreviewBindingData({\n actions,\n collection: collectionProp,\n previewKeys,\n size = \"medium\",\n includeId = true,\n onSidePanelClick,\n includeTitle = true,\n includeEntityLink = true,\n includeImage = true,\n entity\n}: EntityPreviewBindingDataProps) {\n\n const authController = useAuthController();\n const analyticsController = useAnalyticsController();\n const sidePanelController = useSidePanel();\n const customizationController = useCustomizationController();\n\n const collectionRegistryController = useCollectionRegistryController();\n\n const collection = collectionProp ?? collectionRegistryController.getCollection(entity.path);\n\n const listProperties = useMemo(() => {\n if (!collection) return [];\n return previewKeys ?? getEntityPreviewKeys(authController, collection, customizationController.propertyConfigs, previewKeys, size === \"medium\" || size === \"large\" ? 3 : 2);\n }, [previewKeys, collection, size, authController, customizationController.propertyConfigs]);\n\n if (!collection) {\n return (\n <>\n <ErrorView error={`Collection not found: ${entity.path}`}/>\n </>\n );\n }\n\n const titleProperty = includeTitle ? getEntityTitlePropertyKey(collection, customizationController.propertyConfigs) : undefined;\n const imagePropertyKey = includeImage ? getEntityImagePreviewPropertyKey(collection) : undefined;\n const imageProperty = imagePropertyKey ? collection.properties[imagePropertyKey] : undefined;\n const ofProp = imageProperty && \"of\" in imageProperty ? imageProperty.of : undefined;\n const usedImageProperty = ofProp ? (Array.isArray(ofProp) ? ofProp[0] : ofProp) : imageProperty;\n const restProperties = listProperties.filter(p => p !== titleProperty && p !== imagePropertyKey);\n\n const imageValue = imagePropertyKey ? getValueInPath(entity.values, imagePropertyKey) : undefined;\n const usedImageValue = imageProperty !== undefined ? (\"of\" in imageProperty\n ? (((imageValue as unknown[]) ?? []).length > 0\n ? (imageValue as unknown[])[0] : undefined)\n : imageValue)\n : undefined;\n\n return (\n <>\n <div className={cls(\"flex shrink-0\", {\n \"w-6 h-6 mx-1 my-0.5\": size === \"small\" || size === \"smallest\",\n \"w-8 h-8 ml-1 mr-2 m-2 self-start\": size === \"medium\",\n \"w-10 h-10 ml-2 mr-2 m-2 self-start\": size === \"large\"\n })}>\n {usedImageProperty && usedImageValue ? <PropertyPreview property={usedImageProperty}\n propertyKey={imagePropertyKey as string}\n size={\"small\"}\n value={usedImageValue as never}/> : null}\n {(!usedImageProperty || !usedImageValue) ? <IconForView collectionOrView={collection}\n color={\"primary\"}\n size={size}\n className={\"m-auto\"}/> : null}\n </div>\n\n <div\n className={\"flex flex-col grow w-full m-1 shrink min-w-0 text-text-primary dark:text-text-primary-dark flex-1 mr-2\"}>\n\n {includeId && (\n entity\n ? <div className={\"block whitespace-nowrap overflow-hidden truncate\"}>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"font-mono\"}>\n {entity.id}\n </Typography>\n </div>\n : <Skeleton/>)}\n\n {titleProperty && (\n <div\n className={\"truncate my-0.5 text-sm font-medium text-text-primary dark:text-text-primary-dark\"}>\n {\n entity\n ? <PropertyPreview\n propertyKey={titleProperty as string}\n value={getValueInPath(entity.values, titleProperty) as never}\n property={collection.properties[titleProperty as string] as Property}\n size={\"medium\"}/>\n : <SkeletonPropertyComponent\n property={collection.properties[titleProperty as string] as Property}\n size={\"medium\"}/>\n }\n </div>\n )}\n\n {restProperties && restProperties.map((key) => {\n const childProperty = getPropertyInPath(collection.properties, key);\n if (!childProperty) return null;\n\n const valueInPath = getValueInPath(entity.values, key);\n return (\n <div key={\"ref_prev_\" + key}\n className={cls(\"truncate\", restProperties.length > 1 ? \"my-0.5\" : \"my-0\")}>\n {\n entity\n ? <PropertyPreview\n propertyKey={key as string}\n value={valueInPath as never}\n property={childProperty as Property}\n size={\"small\"}/>\n : <SkeletonPropertyComponent\n property={childProperty as Property}\n size={\"small\"}/>\n }\n </div>\n );\n })}\n\n </div>\n\n {entity && includeEntityLink &&\n <div className=\"flex-shrink-0\">\n <Tooltip title={`See details for ${entity.id}`} className={\"shrink-0\"}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n className={size !== \"small\" ? \"self-start\" : \"\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSidePanelClick?.(entity);\n analyticsController.onAnalyticsEvent?.(\"entity_click_from_reference\", {\n path: entity.path,\n entityId: entity.id\n });\n sidePanelController.open({\n entityId: entity.id,\n path: entity.path,\n collection,\n updateUrl: true\n });\n }}>\n <ArrowRightToLineIcon/>\n </IconButton>\n </Tooltip>\n </div>}\n\n {actions && <div className=\"flex-shrink-0\">{actions}</div>}\n </>\n );\n}\n\nexport function EntityPreviewBindingWithId({\n entityId,\n path,\n ...props\n}: Omit<EntityPreviewBindingProps, \"entity\"> & {\n entityId: string | number;\n path: string;\n databaseId?: string;\n}) {\n\n const [entity, setEntity] = React.useState<Entity | undefined>();\n const [dataLoading, setDataLoading] = React.useState(false);\n const dataClient = useData();\n\n useEffect(() => {\n let isMounted = true;\n if (!entityId || !path) {\n setEntity(undefined);\n return;\n }\n const fetchOne = async () => {\n setDataLoading(true);\n try {\n const fetchedEntity = await dataClient.collection(path).findById(entityId);\n if (isMounted) {\n setEntity(fetchedEntity);\n }\n } catch (error) {\n console.error(\"Error fetching entity:\", error);\n if (isMounted) {\n setEntity(undefined);\n }\n } finally {\n if (isMounted) {\n setDataLoading(false);\n }\n }\n }\n\n fetchOne();\n\n return () => {\n isMounted = false;\n }\n }, [entityId, path]);\n\n if (dataLoading && !entity) {\n return (\n <EntityPreviewContainer\n hover={props.hover}\n size={props.size}>\n <Skeleton/>\n </EntityPreviewContainer>\n );\n }\n\n if (!entity) {\n return (\n <EntityPreviewContainer\n hover={props.hover}\n size={props.size}>\n <div className={\"text-text-secondary dark:text-text-secondary-dark\"}>\n Entity not found\n </div>\n </EntityPreviewContainer>\n );\n }\n\n return <EntityPreviewBindingData\n {...props}\n entity={entity}/>;\n}\n\n/**\n * This view is used to display a preview of a entity.\n * It is used by default in reference fields and whenever a reference is displayed.\n */\nexport function EntityPreviewBinding({\n actions,\n disabled,\n hover,\n collection,\n previewKeys,\n onClick,\n size = \"medium\",\n includeId = true,\n includeTitle = true,\n includeEntityLink = true,\n includeImage = true,\n onSidePanelClick,\n entity\n}: EntityPreviewBindingProps) {\n\n return (\n <EntityPreviewContainer\n onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <EntityPreviewBindingData\n actions={actions}\n collection={collection}\n previewKeys={previewKeys}\n size={size}\n includeId={includeId}\n includeTitle={includeTitle}\n includeEntityLink={includeEntityLink}\n includeImage={includeImage}\n onSidePanelClick={onSidePanelClick}\n entity={entity}\n />\n </EntityPreviewContainer>\n );\n}\n\nexport type EntityPreviewContainerProps = {\n children: React.ReactNode;\n hover?: boolean;\n fullwidth?: boolean;\n size?: PreviewSize;\n className?: string;\n style?: React.CSSProperties;\n onClick?: (e: React.SyntheticEvent) => void;\n};\n\nexport const EntityPreviewContainer = React.forwardRef<HTMLDivElement, EntityPreviewContainerProps>(({\n children,\n hover,\n onClick,\n size = \"medium\",\n style,\n className,\n fullwidth = true,\n ...props\n}, ref) => {\n return <div\n ref={ref}\n tabIndex={0}\n style={style}\n className={cls(\n \"bg-white dark:bg-surface-900\",\n size === \"small\" ? \"min-h-[32px]\" : \"min-h-[44px]\",\n fullwidth ? \"w-full\" : \"\",\n \"items-center\",\n hover ? \"hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\" : \"\",\n size === \"small\" ? \"p-1\" : \"px-2 py-1\",\n \"flex border rounded-lg\",\n onClick ? \"cursor-pointer\" : \"\",\n defaultBorderMixin,\n className)}\n role={onClick ? \"button\" : undefined}\n onClick={(event) => {\n if (onClick) {\n event.preventDefault();\n onClick(event);\n }\n }}\n onKeyDown={(event) => {\n if (onClick && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onClick(event);\n }\n }}\n {...props}>\n {children}\n </div>;\n});\n\nEntityPreviewContainer.displayName = \"EntityPreviewContainer\";\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport * as React from \"react\";\n\nimport { Entity, EntityReference } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useCustomizationController, useFetch, useComponentOverride, CollectionScopeProvider } from \"@rebasepro/app\";\nimport { Skeleton } from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { EntityPreviewBinding, EntityPreviewContainer } from \"../../components/EntityPreviewBinding\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { getEntityTitlePropertyKey } from \"../../util/previews\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport type ReferencePreviewProps = {\n disabled?: boolean;\n reference: EntityReference,\n size?: PreviewSize;\n previewProperties?: string[];\n onClick?: (e: React.SyntheticEvent) => void;\n hover?: boolean;\n includeEntityLink?: boolean;\n includeId?: boolean;\n textOnly?: boolean;\n};\n\n/**\n * @group Preview components\n */\nexport const ReferencePreview = function ReferencePreview(props: ReferencePreviewProps) {\n const reference = props.reference;\n if (!(typeof reference === \"object\" && \"isEntityReference\" in reference && reference.isEntityReference())) {\n console.warn(\"Reference preview received value of type\", typeof reference);\n if (props.textOnly) {\n return <span>{String(reference)}</span>;\n }\n return <EntityPreviewContainer\n onClick={props.onClick}\n size={props.size ?? \"medium\"}>\n <ErrorView error={\"Unexpected value. Click to edit\"}\n tooltip={JSON.stringify(reference)}/>\n </EntityPreviewContainer>;\n }\n return <ErrorBoundary>\n <ReferencePreviewInternal {...props}/>\n </ErrorBoundary>;\n};\n\nconst DefaultMissingReference: React.FC<{ path: string }> = () => null;\n\nfunction ReferencePreviewInternalInner({\n disabled,\n reference,\n previewProperties,\n size,\n hover,\n onClick,\n includeEntityLink = true,\n includeId = true,\n textOnly,\n collection\n}: ReferencePreviewProps & { collection?: CollectionConfig }) {\n const ResolvedMissingReference = useComponentOverride(\"Entity.MissingReference\", DefaultMissingReference);\n\n if (!collection) {\n if (ResolvedMissingReference !== DefaultMissingReference) {\n return <ResolvedMissingReference path={reference.path}/>;\n } else {\n if (textOnly) {\n return <span>{reference.path}</span>;\n }\n return <EntityPreviewContainer\n onClick={onClick}\n size={size ?? \"medium\"}>\n <ErrorView error={\"Unexpected reference value. Click to edit\"}\n tooltip={reference.pathWithId}/>\n </EntityPreviewContainer>;\n }\n }\n\n return <ReferencePreviewExisting\n reference={reference}\n collection={collection}\n previewProperties={previewProperties}\n size={size}\n disabled={disabled}\n includeEntityLink={includeEntityLink}\n includeId={includeId}\n onClick={onClick}\n textOnly={textOnly}\n hover={hover}/>\n}\n\nfunction ReferencePreviewInternal(props: ReferencePreviewProps) {\n const collectionRegistryController = useCollectionRegistryController();\n const collection = collectionRegistryController.getCollection(props.reference.path);\n\n const content = (\n <ReferencePreviewInternalInner\n {...props}\n collection={collection}\n />\n );\n\n if (collection) {\n return (\n <CollectionScopeProvider collection={collection}>\n {content}\n </CollectionScopeProvider>\n );\n }\n return content;\n}\n\nfunction ReferencePreviewExisting<M extends Record<string, unknown> = Record<string, unknown>>({\n reference,\n collection,\n previewProperties,\n size,\n disabled,\n includeEntityLink,\n includeId,\n onClick,\n hover,\n textOnly\n}: ReferencePreviewProps & {\n collection: CollectionConfig<M>\n}) {\n\n const ResolvedEntityPreview = useComponentOverride(\"EntityPreview\", EntityPreviewBinding);\n const customizationController = useCustomizationController();\n\n const {\n entity,\n dataLoading,\n dataLoadingError\n } = useFetch({\n path: reference.path,\n entityId: reference.id,\n collection,\n useCache: true\n });\n\n if (entity) {\n referencesCache.set(reference.pathWithId, entity);\n }\n\n const usedEntity = entity ?? referencesCache.get(reference.pathWithId);\n\n let body: React.ReactNode;\n\n if (!reference) {\n body = <ErrorView error={\"Reference not set\"}/>;\n } else if (usedEntity && !usedEntity.values) {\n body = <ErrorView error={\"Reference does not exist\"}\n tooltip={reference.path}/>;\n }\n if (body) {\n if (textOnly) {\n return <span>{reference.id}</span>;\n }\n\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n {body}\n </EntityPreviewContainer>\n );\n }\n\n if (dataLoading && !usedEntity) {\n if (textOnly) {\n return <Skeleton className=\"inline-block w-20 h-4\" />;\n }\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <Skeleton/>\n </EntityPreviewContainer>\n );\n }\n\n if (!usedEntity) {\n if (textOnly) {\n return <span>{reference.id}</span>;\n }\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <ErrorView error={\"Entity not found\"}/>\n </EntityPreviewContainer>\n );\n }\n\n if (textOnly) {\n const titleProperty = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);\n const titleValue = titleProperty ? getValueInPath(usedEntity.values, titleProperty) : undefined;\n const displayValue = titleValue !== undefined && titleValue !== null ? String(titleValue) : String(reference.id);\n return <span className=\"truncate\">{displayValue}</span>;\n }\n\n return <ResolvedEntityPreview size={size}\n previewKeys={previewProperties}\n disabled={disabled}\n entity={usedEntity}\n collection={collection}\n onClick={onClick}\n includeEntityLink={includeEntityLink}\n includeId={includeId}\n hover={hover}/>;\n\n}\n\nconst referencesCache = new Map<string, Entity<any>>();\n","import type { ArrayProperty, ReferenceProperty, EntityReference } from \"@rebasepro/types\";\nimport type { PropertyPreviewProps, PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { ReferencePreview } from \"../components/ReferencePreview\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfReferencesPreview({\n propertyKey,\n value,\n property: property,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.type !== \"array\" || !property.of || property.of.type !== \"reference\")\n throw Error(\"Picked wrong preview component ArrayOfReferencesPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"medium\" : \"small\";\n\n return (\n <div className=\"flex flex-col w-full\">\n {value ?\n (value as EntityReference[]).map((reference, index: number) => {\n const ofProperty = property.of as ReferenceProperty;\n return <div className=\"mt-1 mb-1 w-full\"\n key={`preview_array_ref_${propertyKey}_${index}`}>\n <ReferencePreview\n disabled={!ofProperty.path}\n previewProperties={ofProperty.ui?.previewProperties}\n size={childSize}\n reference={reference}\n includeId={ofProperty.includeId}\n includeEntityLink={ofProperty.includeEntityLink}\n />\n </div>;\n }\n ) : null}\n </div>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport * as React from \"react\";\n\nimport { Entity, EntityRelation } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useCustomizationController, useFetch, ErrorView, useComponentOverride, CollectionScopeProvider } from \"@rebasepro/app\";\nimport { Skeleton } from \"@rebasepro/ui\";\nimport { EntityPreviewBinding, EntityPreviewContainer } from \"../../components/EntityPreviewBinding\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { getEntityTitlePropertyKey } from \"../../util/previews\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport type RelationPreviewProps = {\n disabled?: boolean;\n relation: EntityRelation,\n size?: PreviewSize;\n previewProperties?: string[];\n onClick?: (e: React.SyntheticEvent) => void;\n hover?: boolean;\n includeEntityLink?: boolean;\n includeId?: boolean;\n textOnly?: boolean;\n};\n\n/**\n * Extract a display name from a plain relation-shaped object that isn't\n * a proper EntityRelation instance. Tries common name fields in the\n * entity's values, then falls back to the id.\n */\nfunction extractDisplayFromPlainObject(obj: unknown): string {\n if (!obj || typeof obj !== \"object\") return \"—\";\n const record = obj as Record<string, unknown>;\n\n // Try data.values.{name,title,...} (EntityRelation.data is a Entity with .values)\n const data = record.data;\n if (data && typeof data === \"object\") {\n const dataRecord = data as Record<string, unknown>;\n const values = (dataRecord.values && typeof dataRecord.values === \"object\")\n ? dataRecord.values as Record<string, unknown>\n : dataRecord;\n const nameFields = [\"name\", \"title\", \"label\", \"display_name\", \"displayName\", \"email\", \"username\"];\n for (const field of nameFields) {\n const v = values[field];\n if (v && typeof v === \"string\") return v;\n }\n }\n\n // Try direct fields on the object itself (some serialization paths flatten the data)\n const directFields = [\"name\", \"title\", \"label\", \"display_name\", \"displayName\", \"email\"];\n for (const field of directFields) {\n const v = record[field];\n if (v && typeof v === \"string\") return v;\n }\n\n // Last resort: show the id\n if (\"id\" in record && record.id != null) return String(record.id);\n\n return \"—\";\n}\n\n/**\n * @group Preview components\n */\nexport const RelationPreview = function RelationPreview(props: RelationPreviewProps) {\n const relation = props.relation;\n if (!(typeof relation === \"object\" && \"isEntityRelation\" in relation && relation.isEntityRelation())) {\n console.warn(\"Relation preview received value of type\", typeof relation);\n if (props.textOnly) {\n const display = extractDisplayFromPlainObject(relation);\n return <span className=\"truncate\">{display}</span>;\n }\n return <EntityPreviewContainer\n onClick={props.onClick}\n size={props.size}>\n <ErrorView error={\"Unexpected value. Click to edit\"}\n tooltip={JSON.stringify(relation)}/>\n </EntityPreviewContainer>;\n }\n return <RelationPreviewInternal {...props}/>;\n};\n\nconst DefaultMissingReference: React.FC<{ path: string }> = () => null;\n\nfunction RelationPreviewInternalInner({\n disabled,\n relation,\n previewProperties,\n size,\n hover,\n onClick,\n includeEntityLink = true,\n includeId = true,\n textOnly,\n collection\n}: RelationPreviewProps & { collection?: CollectionConfig }) {\n const ResolvedMissingReference = useComponentOverride(\"Entity.MissingReference\", DefaultMissingReference);\n\n if (!collection) {\n if (ResolvedMissingReference !== DefaultMissingReference) {\n return <ResolvedMissingReference path={relation.path}/>;\n } else {\n if (textOnly) {\n return <span>{relation.path}</span>;\n }\n return <EntityPreviewContainer size={size}>\n <ErrorView error={`Collection not found: ${relation.path}`}/>\n </EntityPreviewContainer>;\n }\n }\n\n return <RelationPreviewExisting\n relation={relation}\n collection={collection}\n previewProperties={previewProperties}\n size={size}\n disabled={disabled}\n includeEntityLink={includeEntityLink}\n includeId={includeId}\n onClick={onClick}\n textOnly={textOnly}\n hover={hover}/>\n}\n\nfunction RelationPreviewInternal(props: RelationPreviewProps) {\n const collectionRegistryController = useCollectionRegistryController();\n const collection = collectionRegistryController.getCollection(props.relation.path);\n\n const content = (\n <RelationPreviewInternalInner\n {...props}\n collection={collection}\n />\n );\n\n if (collection) {\n return (\n <CollectionScopeProvider collection={collection}>\n {content}\n </CollectionScopeProvider>\n );\n }\n return content;\n}\n\nfunction RelationPreviewExisting<M extends Record<string, unknown> = Record<string, unknown>>({\n relation,\n collection,\n previewProperties,\n size,\n disabled,\n includeEntityLink,\n includeId,\n onClick,\n hover,\n textOnly\n}: RelationPreviewProps & {\n collection: CollectionConfig<M>\n}) {\n\n // CMS wire format embeds relation data as { id, path, values }\n const passedEntity = relation.data as Entity<M> | undefined;\n const ResolvedEntityPreview = useComponentOverride(\"EntityPreview\", EntityPreviewBinding);\n const customizationController = useCustomizationController();\n\n const {\n entity,\n dataLoading,\n dataLoadingError\n } = useFetch({\n path: relation.path,\n entityId: passedEntity ? undefined : relation.id,\n collection,\n useCache: true\n });\n\n if (entity) {\n relationsCache.set(relation.pathWithId, entity);\n }\n\n const usedEntity = passedEntity ?? entity ?? relationsCache.get(relation.pathWithId);\n\n let body: React.ReactNode;\n\n if (!relation) {\n body = <ErrorView error={\"Relation not set\"}/>;\n } else if (usedEntity && !usedEntity.values) {\n body = <ErrorView error={\"Relation does not exist\"}\n tooltip={relation.path}/>;\n }\n\n if (body) {\n if (textOnly) {\n return <span>{relation.id}</span>;\n }\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n {body}\n </EntityPreviewContainer>\n );\n }\n\n if (dataLoading && !usedEntity) {\n if (textOnly) {\n return <Skeleton className=\"inline-block w-20 h-4\" />;\n }\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <Skeleton/>\n </EntityPreviewContainer>\n );\n }\n\n if (!usedEntity) {\n if (textOnly) {\n return <span>{relation.id}</span>;\n }\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <ErrorView error={\"Entity not found\"}/>\n </EntityPreviewContainer>\n );\n }\n\n if (textOnly) {\n const titleProperty = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);\n const titleValue = titleProperty ? getValueInPath(usedEntity.values, titleProperty) : undefined;\n const displayValue = titleValue !== undefined && titleValue !== null ? String(titleValue) : String(relation.id);\n return <span className=\"truncate\">{displayValue}</span>;\n }\n\n return <ResolvedEntityPreview size={size}\n previewKeys={previewProperties}\n disabled={disabled}\n entity={usedEntity}\n collection={collection}\n onClick={onClick}\n includeEntityLink={includeEntityLink}\n includeId={false}\n hover={hover}/>;\n\n}\n\nconst relationsCache = new Map<string, Entity<any>>();\n","import type { ArrayProperty, RelationProperty } from \"@rebasepro/types\";\nimport { EntityRelation } from \"@rebasepro/types\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { normalizeToEntityRelation } from \"@rebasepro/common\";\nimport { RelationPreview } from \"../components/RelationPreview\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfRelationsPreview({\n propertyKey,\n value,\n property,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.type !== \"array\" || !property.of || property.of.type !== \"relation\")\n throw Error(\"Picked wrong preview component ArrayOfRelationsPreview\");\n\n const ofProperty = property.of as RelationProperty;\n\n return (\n <div className=\"flex flex-col w-full gap-0.5\">\n {value ?\n (value as unknown[]).map((relation: unknown, index: number) => {\n const entityRelation = normalizeToEntityRelation(relation);\n\n if (!entityRelation) return null;\n\n return (\n <div className=\"w-full\"\n key={`preview_array_rel_${propertyKey}_${index}`}>\n <RelationPreview\n disabled={!ofProperty.relation}\n previewProperties={ofProperty.ui?.previewProperties}\n size={\"small\"}\n relation={entityRelation}\n includeId={ofProperty.includeId}\n includeEntityLink={ofProperty.includeEntityLink}\n />\n </div>\n );\n }) : null}\n </div>\n );\n}\n","import type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport type { PropertyPreviewProps, PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useAuthController, useCustomizationController } from \"@rebasepro/app\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStorageComponentsPreview({\n propertyKey,\n // entity,\n value,\n property: property,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property.type !== \"array\" || !property.of || property.of.type !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStorageComponentsPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"medium\" : \"small\";\n\n if (!property.of) {\n throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n return (\n <div className={\"flex flex-wrap gap-2\"}>\n {value ?\n (value as string[]).map((v, index: number) =>\n <ErrorBoundary key={`preview_array_storage_${propertyKey}_${index}`}>\n <PropertyPreview\n propertyKey={propertyKey}\n value={v}\n property={property.of as Property}\n size={childSize}/>\n </ErrorBoundary>\n ) : null}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { EnumValueConfig } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { EnumValuesChip } from \"./EnumValuesChip\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\n/**\n * @group Preview components\n */\nexport function ArrayEnumPreview({\n name,\n value,\n enumValues,\n size\n}: {\n value: string[] | number[],\n name: string | undefined,\n enumValues: EnumValueConfig[],\n size: PreviewSize\n}) {\n\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {value && value.map((enumKey, index) => {\n return (\n <ErrorBoundary\n key={`preview_array_ref_${name}_${index}`}>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>\n </ErrorBoundary>\n );\n }\n )}\n </div>\n );\n}\n","import type { ArrayProperty, NumberProperty, StringProperty } from \"@rebasepro/types\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { ArrayEnumPreview } from \"../components/ArrayEnumPreview\";\nimport { resolveEnumValues } from \"@rebasepro/common\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyEnumPreview({\n propertyKey,\n value,\n property,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (property.type !== \"array\")\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n const ofProperty = property.of as StringProperty | NumberProperty;\n if (!ofProperty.enum)\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n if (!value) return null;\n\n const enumValues = resolveEnumValues(ofProperty.enum);\n if (!enumValues)\n throw Error(\n `Enum values not resolved for property ${propertyKey}`\n )\n\n return <ArrayEnumPreview name={propertyKey}\n value={value as string[] | number[]}\n enumValues={enumValues}\n size={size}/>;\n}\n","import type { ArrayProperty, StringProperty } from \"@rebasepro/types\";\nimport React from \"react\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { StringPropertyPreview } from \"./StringPropertyPreview\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStringsPreview({\n propertyKey,\n value,\n property: property,\n // entity,\n size\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (!property.of || property.type !== \"array\" || property.of.type !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStringsPreview\");\n\n if (value && !Array.isArray(value)) {\n return <div>{`Unexpected value: ${value}`}</div>;\n }\n const stringProperty = property.of as StringProperty;\n const arrayValues = value as string[];\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arrayValues &&\n arrayValues.map((v, index: number) =>\n <div key={`preview_array_strings_${propertyKey}_${index}`}>\n <ErrorBoundary>\n <StringPropertyPreview propertyKey={propertyKey}\n property={stringProperty}\n value={v}\n size={size}/>\n </ErrorBoundary>\n </div>\n )}\n </div>\n );\n}\n","import type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React from \"react\";\nimport type { PropertyPreviewProps, PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useAuthController, useCustomizationController } from \"@rebasepro/app\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"@rebasepro/common\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOneOfPreview({\n propertyKey,\n value,\n property: property,\n size\n // entity\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (property.type !== \"array\")\n throw Error(\n `You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`\n )\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n if (property?.type !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n if (!property?.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n const values = value as Record<string, unknown>[];\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"medium\" : \"small\";\n\n const typeField = property.oneOf.typeField ?? DEFAULT_ONE_OF_TYPE;\n const valueField = property.oneOf.valueField ?? DEFAULT_ONE_OF_VALUE;\n const properties = property.oneOf.properties;\n\n return (\n <div className={\"flex flex-col\"}>\n {values &&\n values.map((val, index: number) => {\n const resolvedProperty = properties[val?.[typeField] as string];\n if (!val || !resolvedProperty) return null;\n return (\n <React.Fragment\n key={\"preview_array_\" + index}>\n <div className={cls(defaultBorderMixin, \"m-1 border-b last:border-b-0 py-2\")}>\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={propertyKey}\n value={val[valueField]}\n // entity={entity}\n property={resolvedProperty as Property}\n size={childSize}/>\n </ErrorBoundary>\n </div>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n","import type { MapProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cls, defaultBorderMixin, Typography } from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { EmptyValue } from \"../components/EmptyValue\";\n\n/**\n * @group Preview components\n */\nexport function MapPropertyPreview({\n propertyKey,\n value,\n property,\n size\n}: PropertyPreviewProps<MapProperty>) {\n\n if (property.type !== \"map\") {\n throw Error(\"Picked wrong preview component MapPropertyPreview\");\n }\n\n const mapProperty = property as MapProperty;\n\n if (!mapProperty.properties || Object.keys(mapProperty.properties ?? {}).length === 0) {\n return (\n <KeyValuePreview value={value}/>\n );\n }\n\n if (!value) return null;\n const mapValue = value as Record<string, unknown>;\n\n const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)\n\n if (size === \"small\")\n return (\n <div className=\"w-full flex flex-col space-y-1 md:space-y-2\">\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n <ErrorBoundary\n key={\"map_preview_\" + mapProperty.name + key + index}>\n <PropertyPreview propertyKey={key}\n value={mapValue[key]}\n property={mapProperty.properties![key]}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n </div>\n ))}\n </div>\n );\n\n return (\n <div\n className=\"flex flex-col gap-1 w-full\">\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n const childProperty = mapProperty.properties![key];\n const isArrayOrMap = childProperty.type === \"map\" || childProperty.type === \"array\";\n return (\n <div\n key={`map_preview_table_${key}}`}\n className={cls(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"break-words font-semibold\"}\n color={\"secondary\"}>\n {childProperty.name}\n </Typography>\n </div>\n <div\n className=\"grow max-w-[75%]\">\n <ErrorBoundary>\n {!isArrayOrMap &&\n <PropertyPreview\n propertyKey={key}\n value={mapValue[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>}\n </ErrorBoundary>\n </div>\n </div>\n\n {isArrayOrMap &&\n <div className={cls(defaultBorderMixin, \"border-l pl-4 ml-2 my-2\")}>\n <PropertyPreview\n propertyKey={key}\n value={mapValue[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>\n </div>\n }\n </div>\n );\n })}\n </div>\n );\n\n}\n\nexport function KeyValuePreview({ value }: { value: any }) {\n if (typeof value !== \"object\") return null;\n if (!value) return <EmptyValue/>;\n return <div\n className=\"flex flex-col gap-1 w-full\">\n {\n Object.entries(value).map(([key, childValue]: [string, any]) => (\n <div\n key={`map_preview_table_${key}}`}\n className={cls(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n key={`table-cell-title-${key}-${key}`}\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"font-semibold break-words\"}\n color={\"secondary\"}>\n {key}\n </Typography>\n </div>\n <div\n className=\"grow max-w-[75%]\">\n {childValue && typeof childValue !== \"object\" && <Typography>\n <ErrorBoundary>\n {childValue.toString()}\n </ErrorBoundary>\n </Typography>}\n </div>\n </div>\n {typeof childValue === \"object\" &&\n <div className={cls(defaultBorderMixin, \"border-l pl-4\")}>\n <KeyValuePreview value={childValue}/>\n </div>\n }\n </div>\n ))\n }\n </div>;\n}\n","import React from \"react\";\n\nimport { format } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport { useCustomizationController } from \"@rebasepro/app\";\nimport { defaultDateFormat } from \"@rebasepro/utils\";\n\nexport interface DatePreviewProps {\n date: Date;\n /**\n * Display mode: \"date\" for date-only, \"date_time\" for date and time\n */\n mode?: \"date\" | \"date_time\";\n /**\n * IANA timezone identifier (e.g., \"America/New_York\")\n * When specified, the date will be displayed in this timezone\n */\n timezone?: string;\n}\n\n/**\n * @group Preview components\n */\nexport function DatePreview({\n date,\n mode = \"date_time\",\n timezone\n}: DatePreviewProps): React.ReactElement {\n\n const customizationController = useCustomizationController();\n const dateUtilsLocale = customizationController?.locale ? (locales as Record<string, locales.Locale>)[customizationController.locale] : undefined;\n\n if (!date || !(date instanceof Date) || isNaN(date.getTime())) {\n return <></>;\n }\n\n // If timezone is specified, format in that timezone using Intl.DateTimeFormat\n if (timezone) {\n const options: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n timeZone: timezone\n };\n\n if (mode === \"date_time\") {\n options.hour = \"2-digit\";\n options.minute = \"2-digit\";\n }\n\n const formatter = new Intl.DateTimeFormat(customizationController?.locale ?? \"en-US\", options);\n const formattedDate = formatter.format(date);\n\n // Get timezone abbreviation\n const tzFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n timeZoneName: \"short\"\n });\n const parts = tzFormatter.formatToParts(date);\n const tzAbbrev = parts.find(p => p.type === \"timeZoneName\")?.value ?? \"\";\n\n return (\n <span className=\"flex items-center gap-1\">\n {formattedDate}\n {tzAbbrev && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">\n ({tzAbbrev})\n </span>\n )}\n </span>\n );\n }\n\n // No timezone specified: use local formatting with date-fns\n let dateFormat: string;\n if (mode === \"date\") {\n // Date-only format (no time)\n dateFormat = customizationController?.dateTimeFormat\n ? customizationController.dateTimeFormat.replace(/[, ]*[HhKk].*$/, \"\").trim()\n : \"PP\"; // e.g., \"Apr 29, 2024\"\n } else {\n // Full date-time format\n dateFormat = customizationController?.dateTimeFormat ?? defaultDateFormat;\n }\n\n const formattedDate = format(date, dateFormat, { locale: dateUtilsLocale });\n\n return (\n <>\n {formattedDate}\n </>\n );\n}\n","import type { Property } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { Checkbox, cls } from \"@rebasepro/ui\";\nimport { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\n/**\n * @group Preview components\n */\nexport function BooleanPreview({\n value,\n size,\n property\n}: {\n value: boolean,\n size: PreviewSize,\n property: Property,\n}): React.ReactElement {\n return <div className={\"flex flex-row gap-2 items-center\"}>\n <Checkbox checked={value}\n padding={false}\n size={size}\n color={\"secondary\"}/>\n {property.name && <span\n className={cls(\"text-text-secondary dark:text-text-secondary-dark\", size === \"small\" ? \"text-sm\" : \"\")}>{property.name}</span>}\n </div>;\n}\n","import type { NumberProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport { EnumValuesChip } from \"../components/EnumValuesChip\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { enumToObjectEntries } from \"@rebasepro/common\";\n\n/**\n * @group Preview components\n */\nexport function NumberPropertyPreview({\n value,\n property,\n size\n}: PropertyPreviewProps<NumberProperty>): React.ReactElement {\n\n const numValue = value as number;\n\n if (property.enum) {\n const enumKey = numValue;\n const enumValues = enumToObjectEntries(property.enum);\n if (!enumValues)\n return <span className={size === \"small\" ? \"text-sm\" : \"\"}>{numValue}</span>;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>;\n } else {\n return <span className={size === \"small\" ? \"text-sm\" : \"\"}>{numValue}</span>;\n }\n}\n","import type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport type { StringProperty } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { EmptyValue } from \"./EmptyValue\";\nimport { Typography } from \"@rebasepro/ui\";\n\n/**\n * Preview component for displaying a user reference value.\n *\n * Shows the raw user ID. Collection-based user management means\n * user records are fetched through the standard data layer.\n *\n * @group Preview components\n */\nexport function UserPreview({ value }: PropertyPreviewProps<StringProperty>) {\n if (typeof value !== \"string\" || !value) {\n return <EmptyValue/>;\n }\n\n return <Typography variant={\"caption\"} color={\"secondary\"}>{value}</Typography>;\n}\n","import type { ArrayProperty, MapProperty, NumberProperty, Property, StringProperty } from \"@rebasepro/types\";\nimport React, { createElement, Suspense } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport { EntityReference, EntityRelation } from \"@rebasepro/types\";\nimport type { PropertyPreviewProps } from \"../types/components/PropertyPreviewProps\";\nimport { resolveProperty, normalizeToEntityRelation } from \"@rebasepro/common\";\nimport { useAuthController, useCustomizationController, resolveComponentRef } from \"@rebasepro/app\";\nimport { EmptyValue } from \"./components/EmptyValue\";\nimport { UrlComponentPreview } from \"./components/UrlComponentPreview\";\nimport { StorageThumbnail } from \"./components/StorageThumbnail\";\nimport { Markdown } from \"@rebasepro/ui\";\nimport { StringPropertyPreview } from \"./property_previews/StringPropertyPreview\";\nimport { ArrayPropertyPreview } from \"./property_previews/ArrayPropertyPreview\";\nimport { ArrayOfReferencesPreview } from \"./property_previews/ArrayOfReferencesPreview\";\nimport { ArrayOfRelationsPreview } from \"./property_previews/ArrayOfRelationsPreview\";\nimport { ArrayOfStorageComponentsPreview } from \"./property_previews/ArrayOfStorageComponentsPreview\";\nimport { ArrayPropertyEnumPreview } from \"./property_previews/ArrayPropertyEnumPreview\";\nimport { ArrayOfStringsPreview } from \"./property_previews/ArrayOfStringsPreview\";\nimport { ArrayOneOfPreview } from \"./property_previews/ArrayOneOfPreview\";\nimport { MapPropertyPreview } from \"./property_previews/MapPropertyPreview\";\nimport { ReferencePreview } from \"./components/ReferencePreview\";\nimport { DatePreview } from \"./components/DatePreview\";\nimport { BooleanPreview } from \"./components/BooleanPreview\";\nimport { NumberPropertyPreview } from \"./property_previews/NumberPropertyPreview\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { RelationPreview } from \"./components/RelationPreview\";\nimport { UserPreview } from \"./components/UserPreview\";\n\n/**\n * @group Preview components\n */\nexport const PropertyPreview = React.memo(function PropertyPreview<P extends Property>(props: PropertyPreviewProps<P>) {\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n let content: React.ReactNode | any;\n const {\n property: inputProperty,\n propertyKey,\n value,\n size,\n height,\n width,\n interactive,\n fill\n } = props;\n\n const property = resolveProperty({\n propertyKey,\n property: inputProperty,\n propertyConfigs: customizationController.propertyConfigs,\n authController\n }) as Property | null;\n\n if (property === null) {\n content = <EmptyValue/>;\n } else if (property.ui?.Preview) {\n const ResolvedPreview = resolveComponentRef(property.ui.Preview) as React.ComponentType<PropertyPreviewProps<Property>> | undefined;\n if (ResolvedPreview) {\n content = <Suspense fallback={null}>\n {createElement(ResolvedPreview,\n {\n propertyKey,\n value,\n property,\n size,\n height,\n width,\n customProps: property.ui?.customProps\n })}\n </Suspense>;\n }\n } else if (value === undefined || value === null) {\n content = <EmptyValue/>;\n } else if (property.type === \"string\") {\n const stringProperty = property as StringProperty;\n if (typeof value === \"string\") {\n if (stringProperty.storage) {\n const filePath = stringProperty.storage.previewUrl ? stringProperty.storage.previewUrl(value) : value;\n content = <StorageThumbnail\n interactive={interactive}\n storeUrl={property.storage?.storeUrl ?? false}\n storageSourceKey={stringProperty.storage.storageSource}\n size={props.size}\n fill={fill}\n storagePathOrDownloadUrl={filePath}/>;\n } else if (stringProperty.ui?.url) {\n if (typeof stringProperty.ui?.url === \"boolean\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}\n fill={fill}/>;\n else if (typeof stringProperty.ui?.url === \"string\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}\n interactive={interactive}\n fill={fill}\n previewType={stringProperty.ui?.url}/>;\n } else if (stringProperty.ui?.markdown) {\n content = <Markdown source={value} size={\"small\"}/>;\n } else if (stringProperty.userSelect) {\n content = <UserPreview\n value={value}\n property={stringProperty}\n propertyKey={propertyKey}\n size={props.size}\n />;\n } else {\n content = <StringPropertyPreview {...props}\n property={stringProperty}\n value={value}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else if (property.type === \"array\") {\n if (Array.isArray(value)) {\n const arrayProperty = property as ArrayProperty;\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={arrayProperty}/>;\n } else if (arrayProperty.of.type === \"reference\") {\n content = <ArrayOfReferencesPreview {...props}\n value={value}\n property={property}/>;\n } else if (arrayProperty.of.type === \"relation\") {\n content = <ArrayOfRelationsPreview {...props}\n value={value}\n property={property}/>;\n } else if (arrayProperty.of.type === \"string\") {\n if (arrayProperty.of.enum) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value}\n property={property}/>;\n } else if (arrayProperty.of.storage) {\n content = <ArrayOfStorageComponentsPreview\n {...props}\n value={value}\n property={property as ArrayProperty}/>;\n } else {\n content = <ArrayOfStringsPreview\n {...props}\n property={property as ArrayProperty}\n value={value as string[]}/>;\n }\n } else if (arrayProperty.of.type === \"number\" && arrayProperty.of.enum) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value as number[]}\n property={property as ArrayProperty}/>;\n } else {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={property as ArrayProperty}/>;\n }\n } else if (arrayProperty.oneOf) {\n content = <ArrayOneOfPreview {...props}\n value={value}\n property={property as ArrayProperty}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else if (property.type === \"map\") {\n if (typeof value === \"object\") {\n content =\n <MapPropertyPreview {...props}\n value={value as Record<string, any>}\n property={property as MapProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else if (property.type === \"date\") {\n if (value instanceof Date) {\n content = <DatePreview\n date={value}\n mode={property.mode}\n />;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else if (property.type === \"reference\") {\n if (typeof property.path === \"string\") {\n if (typeof value === \"object\" && value !== null && \"isEntityReference\" in value && (value as EntityReference).isEntityReference()) {\n content = <ReferencePreview\n disabled={!property.path}\n previewProperties={property.ui?.previewProperties}\n includeId={property.includeId}\n includeEntityLink={property.includeEntityLink}\n size={props.size}\n reference={value as EntityReference}\n textOnly={props.textOnly}\n />;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else {\n content = <EmptyValue/>;\n }\n\n } else if (property.type === \"relation\") {\n if (!value) {\n content = <EmptyValue/>;\n } else if (Array.isArray(value)) {\n // Many-cardinality relation: value is an array of EntityRelation (or plain objects)\n content = (\n <div className=\"flex flex-col w-full gap-0.5\">\n {(value as unknown[]).map((item: unknown, index: number) => {\n const entityRelation = normalizeToEntityRelation(item, \"relation\");\n if (!entityRelation) return null;\n return (\n <div className=\"w-full\"\n key={`preview_rel_${propertyKey}_${index}`}>\n <RelationPreview\n disabled={!property.relation}\n previewProperties={property.ui?.previewProperties}\n includeId={property.includeId}\n includeEntityLink={property.includeEntityLink}\n size={\"small\"}\n relation={entityRelation}\n textOnly={props.textOnly}\n />\n </div>\n );\n })}\n </div>\n );\n } else {\n // Single-cardinality relation\n const relationValue = normalizeToEntityRelation(value, \"relation\");\n if (relationValue) {\n content = <RelationPreview\n disabled={!property.relation}\n previewProperties={property.ui?.previewProperties}\n includeId={property.includeId}\n includeEntityLink={property.includeEntityLink}\n size={props.size}\n relation={relationValue}\n textOnly={props.textOnly}\n />;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n }\n\n } else if (property.type === \"boolean\") {\n if (typeof value === \"boolean\") {\n content = <BooleanPreview value={value} size={size} property={property}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else if (property.type === \"number\") {\n if (typeof value === \"number\") {\n content = <NumberPropertyPreview {...props}\n value={value}\n property={property as NumberProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.type, value);\n }\n } else {\n content = JSON.stringify(value);\n }\n\n return content === undefined || content === null || (Array.isArray(content) && content.length === 0)\n ? <EmptyValue/>\n : content;\n}, equal);\n\nfunction buildWrongValueType(name: string | undefined, type: string, value: any) {\n console.warn(`Unexpected value for property ${name}, of type ${type}`, value);\n return (\n <ErrorView title={\"Unexpected value\"}\n error={`${JSON.stringify(value)}`}/>\n );\n}\n","import type { ArrayProperty, MapProperty, Property } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport type { PropertyPreviewProps } from \"../../types/components/PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfMapsPreview({\n propertyKey,\n value,\n property,\n size\n // entity\n}: PropertyPreviewProps<ArrayProperty>) {\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.type !== \"array\" || !property.of || property.of.type !== \"map\")\n throw Error(\"Picked wrong preview component ArrayOfMapsPreview\");\n\n const mapProperty = property.of;\n const properties = mapProperty.properties;\n if (!properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property '${propertyKey}'${mapProperty.name ? ` (\"${mapProperty.name}\")` : \"\"}`);\n }\n const values = value as Record<string, unknown>[];\n const previewProperties: string[] | undefined = (mapProperty as MapProperty).previewProperties;\n\n if (!values) return null;\n\n let mapProperties = previewProperties;\n if (!mapProperties || !mapProperties.length) {\n mapProperties = Object.keys(properties);\n if (size)\n mapProperties = mapProperties.slice(0, 3);\n }\n\n return (\n <div className=\"table-auto text-xs\">\n <div>\n {values &&\n values.map((v, index: number) => {\n return (\n <div key={`table_${v}_${index}`}\n className=\"border-b last:border-b-0 py-2\">\n {mapProperties && mapProperties.map(\n (key) => (\n <div\n key={`table-cell-${key as string}`}\n className=\"table-cell\"\n >\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={key as string}\n value={(v)[key]}\n property={properties[key as string] as Property}\n // entity={entity}\n size={\"small\"}/>\n </ErrorBoundary>\n </div>\n )\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { Property } from \"@rebasepro/types\";\nimport { IconButton, InfoIcon, Tooltip, Typography } from \"@rebasepro/ui\";\n\n/**\n * Normalize an error value to a displayable string.\n * Handles cases where the error is an array (e.g. per-element validation\n * errors from array fields) or an object (e.g. raw Zod issue objects).\n */\nfunction normalizeError(error: unknown): string | undefined {\n if (error === undefined || error === null) return undefined;\n if (typeof error === \"string\") return error;\n if (Array.isArray(error)) {\n // Find the first non-falsy element and extract its message\n const firstError = error.find((e) => !!e);\n if (!firstError) return undefined;\n return normalizeError(firstError);\n }\n if (typeof error === \"object\") {\n if (\"message\" in error) {\n return String((error as { message: unknown }).message);\n }\n\n // Extract all string values from the object (e.g., nested validation errors)\n const messages: string[] = [];\n const extractMessages = (obj: Record<string, unknown>) => {\n for (const key in obj) {\n if (typeof obj[key] === \"string\") {\n messages.push(obj[key] as string);\n } else if (typeof obj[key] === \"object\" && obj[key] !== null) {\n extractMessages(obj[key] as Record<string, unknown>);\n }\n }\n };\n extractMessages(error as Record<string, unknown>);\n if (messages.length > 0) {\n return Array.from(new Set(messages)).join(\", \");\n }\n }\n return String(error);\n}\n\n/**\n * Component in charge of rendering the description of a field\n * as well as the error message if any.\n */\nexport function FieldHelperText<T>({\n error,\n showError,\n property,\n includeDescription = true,\n disabled\n}: {\n error?: string,\n showError?: boolean,\n property: Property | Property,\n includeDescription?: boolean,\n disabled?: boolean,\n}\n) {\n\n const displayError = normalizeError(error);\n const hasDescription = property.description !== undefined && property.description.trim().length > 0;\n\n if (!(showError && displayError) && (!includeDescription || !hasDescription))\n return null;\n\n if (showError && displayError) {\n return <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {displayError}\n </Typography>\n }\n\n const disabledTooltip: string | undefined = typeof property.ui?.disabled === \"object\" ? property.ui?.disabled.disabledMessage : undefined;\n\n return <div className={\"flex ml-3.5 mt-1\"}>\n <Typography variant={\"caption\"}\n color={disabled ? \"disabled\" : \"secondary\"}\n className={\"grow\"}>\n {disabledTooltip || property.description}\n </Typography>\n\n </div>\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { Property } from \"@rebasepro/types\";\nimport React from \"react\";\n\n;\n\nimport { PropertyPreview } from \"../../preview\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { cls } from \"@rebasepro/ui\";\n\n/**\n *\n * Simply render the non-editable preview of a field\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReadOnlyFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n minimalistView,\n property,\n includeDescription,\n context\n}: FieldProps<Property>) {\n\n // if (!context.entityId)\n // throw new Error(\"ReadOnlyFieldBinding: Entity id is null\");\n\n const skipCardWrapper = property.type === \"relation\" || property.type === \"reference\";\n\n return (\n\n <>\n\n {!minimalistView && <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n }\n\n <div\n className={cls(\n \"w-full overflow-x-scroll no-scrollbar flex items-center\",\n skipCardWrapper\n ? \"\"\n : \"rounded-lg border border-surface-200 dark:border-surface-700 px-4 md:px-6 min-h-10 opacity-80\"\n )}>\n\n <ErrorBoundary>\n <PropertyPreview propertyKey={propertyKey}\n value={value}\n property={property}\n size={\"medium\"}/>\n </ErrorBoundary>\n\n </div>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n property={property}/>\n\n </>\n );\n}\n","import type { Property } from \"@rebasepro/types\";\nimport { useEffect, useRef } from \"react\";\n;\n\n/**\n * Hook we use to restore a value after it has been cleared\n * @param property\n * @param value\n * @param setValue\n * @ignore\n */\nexport function useClearRestoreValue<T>({\n property,\n value,\n setValue\n}:\n {\n property: Property,\n value: T | null,\n setValue: (value: T | null, shouldValidate?: boolean) => void\n }) {\n\n const clearedValueRef = useRef<T | null>(null);\n useEffect(() => {\n const shouldClearValueIfDisabled = typeof property.ui?.disabled === \"object\" && Boolean(property.ui?.disabled.clearOnDisabled);\n if (shouldClearValueIfDisabled) {\n if (value != null) {\n clearedValueRef.current = value;\n setValue(null);\n }\n } else if (clearedValueRef.current) {\n setValue(clearedValueRef.current);\n clearedValueRef.current = null;\n }\n }, [property]);\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React from \"react\";\n;\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel, Typography } from \"@rebasepro/ui\";\nimport { getArrayResolvedProperties, isReadOnly } from \"@rebasepro/common\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { useAuthController } from \"@rebasepro/app\";\n\n/**\n * Array field used for custom\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayCustomShapedFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n customProps,\n minimalistView: minimalistViewProp,\n property,\n includeDescription,\n context,\n disabled\n}: FieldProps<ArrayProperty | ArrayProperty>) {\n\n const authController = useAuthController();\n const minimalistView = minimalistViewProp || property.ui?.minimalistView;\n\n const resolvedProperties: Property[] | undefined = getArrayResolvedProperties({\n propertyValue: value,\n propertyKey,\n property,\n ignoreMissingFields: false,\n authController\n })\n\n const expanded = property.ui?.expanded === undefined ? true : property.ui?.expanded;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const title = (<>\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 grow text-text-secondary dark:text-text-secondary-dark\"}/>\n {Array.isArray(value) && <Typography variant={\"caption\"} className={\"px-4\"}>({value.length})</Typography>}\n </>);\n\n const body = (resolvedProperties ?? []).map((childProperty, index) => {\n const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.ui?.disabled);\n const fieldProps = {\n propertyKey: `${propertyKey}[${index}]`,\n disabled: disabled || thisDisabled,\n property: childProperty,\n includeDescription,\n context,\n partOfArray: true,\n minimalistView: false,\n autoFocus: false,\n value,\n setValue,\n setFieldValue,\n customProps\n } as FieldProps;\n return <div key={`custom_shaped_array_${index}`} className=\"pb-4\">\n <PropertyFieldBinding {...fieldProps}/>\n </div>;\n });\n\n return (\n\n <>\n\n {!minimalistView &&\n <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n innerClassName={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>\n {body}\n </ExpandablePanel>}\n\n {minimalistView && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import { useSyncExternalStore, useCallback, useRef } from \"react\";\nimport { SelectedCellProps } from \"@rebasepro/types\";\nimport {\n createVirtualTableSelectionStore,\n VirtualTableSelectionStore,\n SelectedCell\n} from \"@rebasepro/ui\";\n\nexport interface AdminSelectedCell extends SelectedCell {\n entityPath: string;\n entityId: string | number;\n propertyKey: string;\n cellRect: DOMRect;\n width: number;\n height: number;\n}\n\nexport function createSelectionStore() {\n return createVirtualTableSelectionStore<AdminSelectedCell>();\n}\n\nexport type SelectionStore = VirtualTableSelectionStore<AdminSelectedCell>;\n\nexport function useCellSelected(\n store: { getEntity: () => SelectedCellProps | undefined; subscribe: (listener: () => void) => () => void },\n propertyKey: string,\n entityPath: string,\n entityId: string | number\n): boolean {\n const selectorRef = useRef({ propertyKey, entityPath, entityId });\n selectorRef.current = { propertyKey, entityPath, entityId };\n\n const getEntity = useCallback(() => {\n const cell = store.getEntity();\n if (!cell) return false;\n const s = selectorRef.current;\n return cell.propertyKey === s.propertyKey &&\n cell.entityPath === s.entityPath &&\n cell.entityId === s.entityId;\n }, [store]);\n\n return useSyncExternalStore(store.subscribe, getEntity, getEntity);\n}\n","import { EnumValues } from \"@rebasepro/types\";\nimport { EnumValuesChip } from \"../../../preview\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { MultiSelect, MultiSelectItem, Select, SelectItem } from \"@rebasepro/ui\";\nimport { resolveEnumValues } from \"@rebasepro/common\";\n\nexport function VirtualTableSelect(props: {\n name: string;\n enumValues: EnumValues;\n error: Error | undefined;\n multiple: boolean;\n disabled: boolean;\n small: boolean;\n internalValue: string | number | string[] | number[] | undefined;\n valueType: \"string\" | \"number\";\n updateValue: (newValue: (string | number | string[] | number[] | null)) => void;\n focused: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n enumValues,\n internalValue,\n disabled,\n small,\n focused,\n updateValue,\n multiple,\n valueType\n } = props;\n\n const validValue = (Array.isArray(internalValue) && multiple) ||\n (!Array.isArray(internalValue) && !multiple);\n\n const ref = React.useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (ref.current && focused) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n const onChange = useCallback((updatedValue: string | string[]) => {\n if (valueType === \"number\") {\n if (multiple) {\n const newValue = (updatedValue as string[]).map((v) => parseFloat(v));\n updateValue(newValue);\n } else {\n updateValue(parseFloat(updatedValue as string));\n }\n } else if (valueType === \"string\") {\n if (!updatedValue)\n updateValue(null)\n else\n updateValue(updatedValue);\n } else {\n throw Error(\"Missing mapping in TableSelect\");\n }\n }, [multiple, updateValue, valueType]);\n\n const resolvedEnumValues = resolveEnumValues(enumValues);\n\n const renderValue = (enumKey?: string | number) => {\n return <EnumValuesChip\n key={`${enumKey}`}\n enumKey={String(enumKey)}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>;\n };\n\n // When the dropdown closes (including on escape), restore focus to the trigger\n const handleOpenChange = useCallback((open: boolean) => {\n if (!open && ref.current) {\n // Use setTimeout to ensure focus is restored after Radix finishes its cleanup\n setTimeout(() => {\n ref.current?.focus({ preventScroll: true });\n }, 0);\n }\n }, []);\n\n return (\n multiple\n ? <MultiSelect\n inputRef={ref}\n className=\"w-full h-full p-0 bg-transparent outline-none\"\n position={\"item-aligned\"}\n disabled={disabled}\n includeClear={false}\n useChips={false}\n value={validValue\n ? ((internalValue as (string | number)[]).map(v => v.toString()))\n : ([])}\n onValueChange={onChange}\n onOpenChange={handleOpenChange}>\n {resolvedEnumValues?.map((enumConfig) => (\n <MultiSelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </MultiSelectItem>\n ))}\n </MultiSelect>\n : <Select\n inputRef={ref}\n fullWidth={true}\n className=\"w-full h-full p-0 bg-transparent outline-none [&_button]:ring-0 [&_button]:ring-offset-0\"\n inputClassName=\"ring-0 ring-offset-0 focus:ring-0 focus-visible:ring-0 outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-offset-0\"\n position={\"item-aligned\"}\n disabled={disabled}\n padding={false}\n value={validValue\n ? internalValue?.toString()\n : \"\"}\n onValueChange={onChange}\n onOpenChange={handleOpenChange}\n renderValue={renderValue}>\n {resolvedEnumValues?.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </SelectItem>\n ))}\n </Select>\n\n );\n}\n","\nimport {\n ChevronDownIcon,\n CircularProgress,\n cls,\n defaultBorderMixin,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundInvisibleMixin,\n fieldBackgroundMixin,\n focusedDisabled,\n IconButton,\n iconSize,\n PopoverPrimitive,\n SearchIcon,\n Separator,\n useInjectStyles,\n XIcon\n} from \"@rebasepro/ui\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { User } from \"@rebasepro/types\";\nimport { useRebaseClient, useAuthController, UserDisplay } from \"@rebasepro/app\";\nimport { EmptyValue } from \"../preview\";\n\ninterface UserSelectorItem {\n uid: string;\n label: string;\n description?: string;\n user: User;\n}\n\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * Local hook to fetch users from the collection REST API with search and pagination.\n */\nfunction useUserSelector({ pageSize = DEFAULT_PAGE_SIZE }: { pageSize?: number } = {}) {\n const client = useRebaseClient<{ baseUrl?: string }>();\n const { getAuthToken } = useAuthController();\n\n const [items, setItems] = useState<UserSelectorItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n const [currentSearch, setCurrentSearch] = useState(\"\");\n const offsetRef = useRef(0);\n const userCacheRef = useRef<Map<string, User>>(new Map());\n\n const fetchUsers = useCallback(async (searchStr: string, offset: number, append: boolean) => {\n if (!client?.baseUrl) return;\n setIsLoading(true);\n try {\n const token = await getAuthToken?.();\n const params = new URLSearchParams({\n limit: String(pageSize),\n offset: String(offset)\n });\n if (searchStr) params.set(\"search\", searchStr);\n const response = await fetch(`${client.baseUrl}/api/users?${params}`, {\n headers: token ? { Authorization: `Bearer ${token}` } : {}\n });\n if (!response.ok) throw new Error(\"Failed to fetch users\");\n const data = await response.json();\n const rows: Record<string, unknown>[] = data.data ?? data.users ?? [];\n const newItems: UserSelectorItem[] = rows.map((r: Record<string, unknown>) => {\n const user: User = {\n uid: (r.id as string) ?? \"\",\n email: (r.email as string) ?? \"\",\n displayName: (r.displayName as string) ?? (r.display_name as string) ?? null,\n photoURL: (r.photoURL as string) ?? (r.photo_url as string) ?? null,\n providerId: \"custom\",\n isAnonymous: false,\n roles: (r.roles as string[]) ?? []\n };\n userCacheRef.current.set(user.uid, user);\n return { uid: user.uid,\nlabel: user.displayName ?? user.email ?? user.uid,\nuser };\n });\n setItems(prev => append ? [...prev, ...newItems] : newItems);\n setHasMore(newItems.length >= pageSize);\n offsetRef.current = offset + newItems.length;\n } catch {\n setHasMore(false);\n } finally {\n setIsLoading(false);\n }\n }, [client?.baseUrl, getAuthToken, pageSize]);\n\n useEffect(() => {\n offsetRef.current = 0;\n fetchUsers(\"\", 0, false);\n }, [fetchUsers]);\n\n const search = useCallback((searchStr: string) => {\n setCurrentSearch(searchStr);\n offsetRef.current = 0;\n fetchUsers(searchStr, 0, false);\n }, [fetchUsers]);\n\n const loadMore = useCallback(() => {\n fetchUsers(currentSearch, offsetRef.current, true);\n }, [fetchUsers, currentSearch]);\n\n const getUser = useCallback((uid: string): User | null => {\n return userCacheRef.current.get(uid) ?? null;\n }, []);\n\n return { items,\nisLoading,\nhasMore,\nsearch,\nloadMore,\ngetUser };\n}\n\nexport interface UserSelectorProps {\n className?: string;\n name?: string;\n id?: string;\n value?: string | null;\n onValueChange?: (userId: string | null) => void;\n placeholder?: React.ReactNode;\n size?: \"small\" | \"medium\";\n disabled?: boolean;\n invisible?: boolean;\n clearable?: boolean;\n pageSize?: number;\n searchPlaceholder?: string;\n noResultsText?: string;\n loadingText?: string;\n}\n\nexport const UserSelector = React.forwardRef<\n HTMLButtonElement,\n UserSelectorProps\n>(\n (\n {\n value,\n size = \"medium\",\n onValueChange,\n invisible,\n disabled,\n placeholder,\n clearable = true,\n className,\n pageSize,\n searchPlaceholder = \"Search users...\",\n noResultsText = \"No users found.\",\n loadingText = \"Loading...\"\n },\n ref\n ) => {\n\n const {\n items: availableItems,\n isLoading,\n hasMore,\n search,\n loadMore,\n getUser\n } = useUserSelector({ pageSize });\n\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n const [searchString, setSearchString] = useState<string>(\"\");\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const localTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const handleButtonRef = useCallback((node: HTMLButtonElement | null) => {\n localTriggerRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }, [ref]);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n\n // Resolve the currently selected user for display\n const selectedUser: User | null = value ? getUser(value) ?? null : null;\n\n // If the user isn't in the cache, try to find in available items\n const resolvedUser: User | null = selectedUser\n ?? (value ? availableItems.find(i => i.uid === value)?.user ?? null : null);\n\n // IntersectionObserver for infinite scroll\n const sentinelCallbackRef = useCallback((node: HTMLDivElement | null) => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n if (sentinelRef.current !== node) {\n (sentinelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n if (!node || !hasMore || isLoading || !loadMore) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry.isIntersecting && hasMore && !isLoading) loadMore();\n },\n {\n root: scrollContainerRef.current,\n rootMargin: \"20px\",\n threshold: 0\n }\n );\n observer.observe(node);\n observerRef.current = observer;\n }, [hasMore, isLoading, loadMore]);\n\n useEffect(() => () => {\n if (observerRef.current) observerRef.current.disconnect();\n }, []);\n\n // Scroll-based pagination fallback\n useEffect(() => {\n const scrollContainer = scrollContainerRef.current;\n if (!scrollContainer || !hasMore || isLoading || !isPopoverOpen) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - 100;\n if (isNearBottom && hasMore && !isLoading) {\n loadMore();\n }\n };\n\n scrollContainer.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n scrollContainer.removeEventListener(\"scroll\", handleScroll);\n };\n }, [hasMore, isLoading, loadMore, isPopoverOpen]);\n\n const handleSearchChange = useCallback((newSearchString: string) => {\n setSearchString(newSearchString);\n search(newSearchString);\n }, [search]);\n\n const handleItemClick = useCallback((item: UserSelectorItem) => {\n if (value === item.uid) {\n // Deselect\n onValueChange?.(null);\n } else {\n onValueChange?.(item.uid);\n }\n setIsPopoverOpen(false);\n }, [value, onValueChange]);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n onValueChange?.(null);\n }, [onValueChange]);\n\n const handleRootOpenChange = useCallback((next: boolean) => {\n if (disabled) return;\n if (next) setIsPopoverOpen(true);\n }, [disabled]);\n\n // Outside click + Escape handling\n useEffect(() => {\n if (!isPopoverOpen) return;\n\n function handlePointerDown(ev: MouseEvent) {\n const target = ev.target as Node;\n const triggerEl = localTriggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl?.contains(target)) return;\n if (contentEl?.contains(target)) return;\n setIsPopoverOpen(false);\n }\n\n function handleKey(ev: KeyboardEvent) {\n if (ev.key === \"Escape\") setIsPopoverOpen(false);\n }\n\n document.addEventListener(\"mousedown\", handlePointerDown, true);\n document.addEventListener(\"keydown\", handleKey, true);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown, true);\n document.removeEventListener(\"keydown\", handleKey, true);\n };\n }, [isPopoverOpen]);\n\n useInjectStyles(\"UserSelector\", \" [cmdk-group] { max-height: 40vh; overflow-y: auto; } \");\n\n const resolvedPlaceholder = placeholder || <EmptyValue className={\"ml-2\"}/>;\n const portalContainer = (typeof document !== \"undefined\" ? document.body : undefined);\n\n return (\n <>\n <PopoverPrimitive.Root open={isPopoverOpen} onOpenChange={handleRootOpenChange} modal={false}>\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={handleButtonRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={isPopoverOpen}\n data-user-selector-trigger\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setIsPopoverOpen(o => !o);\n }}\n className={cls(\n {\n \"min-h-[42px] py-1 px-2\": size === \"small\",\n \"min-h-[56px] py-2 px-4\": size === \"medium\"\n },\n \"w-full select-none rounded-md text-sm relative flex items-center\",\n invisible ? fieldBackgroundInvisibleMixin : fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n className\n )}\n >\n <div className=\"flex justify-between items-center w-full\">\n {resolvedUser ? (\n <div className=\"flex flex-row items-center gap-1 truncate flex-1 min-w-0 mr-2\">\n <UserDisplay user={resolvedUser}/>\n </div>\n ) : (\n <span className=\"text-sm text-text-secondary dark:text-text-secondary-dark\">\n {resolvedPlaceholder}\n </span>\n )}\n\n <div className=\"flex-shrink-0 flex items-center gap-1\">\n {clearable && !disabled && value && (\n <IconButton\n size=\"small\"\n onClick={handleClear}>\n <XIcon size={iconSize.small}/>\n </IconButton>\n )}\n <ChevronDownIcon\n size={size === \"medium\" ? iconSize.medium : iconSize.small}\n className={cls(\"transition\", isPopoverOpen ? \"rotate-180\" : \"\")}\n />\n </div>\n </div>\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={contentRef}\n data-user-selector-content\n className={cls(\"z-50 overflow-hidden border bg-white dark:bg-surface-800 rounded-lg min-w-72\", defaultBorderMixin)}\n align=\"start\"\n sideOffset={8}\n side=\"bottom\"\n avoidCollisions={true}\n collisionPadding={16}\n onOpenAutoFocus={(_e) => { /* leave default */ }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n <CommandPrimitive shouldFilter={false}>\n <div className=\"flex flex-row items-center\">\n <div className=\"relative flex-1\">\n <SearchIcon\n className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-text-secondary dark:text-text-secondary-dark\"\n size={iconSize.smallest}/>\n <CommandPrimitive.Input\n ref={searchInputRef}\n className={cls(\n focusedDisabled,\n \"bg-transparent outline-hidden flex-1 h-full w-full pl-10 pr-4 py-3 text-text-primary dark:text-text-primary-dark placeholder:text-text-secondary dark:placeholder:text-text-secondary-dark\"\n )}\n placeholder={searchPlaceholder}\n value={searchString}\n onValueChange={handleSearchChange}\n />\n </div>\n {isLoading && (\n <div className=\"flex items-center justify-center px-3\">\n <CircularProgress size=\"smallest\"/>\n </div>\n )}\n </div>\n <Separator orientation=\"horizontal\" className=\"my-0\"/>\n <CommandPrimitive.List\n ref={scrollContainerRef}\n style={{\n maxHeight: \"40vh\",\n overflowY: \"auto\"\n }}\n >\n {isLoading && availableItems.length === 0 && (\n <div className=\"flex items-center justify-center py-6\">\n <CircularProgress size=\"small\"/>\n <span\n className=\"ml-2 text-sm text-text-secondary dark:text-text-secondary-dark\">{loadingText}</span>\n </div>\n )}\n {!isLoading && availableItems.length === 0 && (\n <CommandPrimitive.Empty\n className=\"px-4 py-6 text-center text-text-secondary dark:text-text-secondary-dark\">\n {noResultsText}\n </CommandPrimitive.Empty>\n )}\n <CommandPrimitive.Group>\n {availableItems.map((item) => {\n const isSelected = value === item.uid;\n return (\n <CommandPrimitive.Item\n key={item.uid}\n value={item.uid}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => handleItemClick(item)}\n className={cls(\n \"flex flex-row items-center gap-1.5 m-1 p-1.5 rounded-xs cursor-pointer ring-offset-transparent\",\n isSelected && \"bg-surface-accent-200 dark:bg-surface-accent-950\",\n \"aria-selected:outline-hidden aria-selected:ring-2 aria-selected:ring-primary/75 aria-selected:ring-offset-2 aria-selected:bg-surface-accent-100 dark:aria-selected:bg-surface-accent-900\"\n )}\n >\n <UserDisplay user={item.user}/>\n </CommandPrimitive.Item>\n );\n })}\n {availableItems.length > 0 && hasMore && (\n <div ref={sentinelCallbackRef} className=\"h-1 w-full\"\n style={{ visibility: \"hidden\" }}/>\n )}\n {isLoading && availableItems.length > 0 && (\n <div className=\"flex items-center justify-center py-4\">\n <CircularProgress size=\"smallest\"/>\n <span\n className=\"ml-2 text-xs text-text-secondary dark:text-text-secondary-dark\">Loading...</span>\n </div>\n )}\n </CommandPrimitive.Group>\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n );\n }\n);\n\nUserSelector.displayName = \"UserSelector\";\n","import React, { useEffect } from \"react\";\nimport { User } from \"@rebasepro/types\";\nimport { UserSelector } from \"../../../components/UserSelector\";\n\nexport function VirtualTableUserSelect(props: {\n name: string;\n error: Error | undefined;\n multiple: boolean;\n disabled: boolean;\n small: boolean;\n internalValue: string | string[] | undefined;\n updateValue: (newValue: (string | string[] | null)) => void;\n focused: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n internalValue,\n disabled,\n small,\n focused,\n updateValue,\n multiple\n } = props;\n\n // For now we only support single-select in the table context via the new UserSelector\n const singleValue = Array.isArray(internalValue) ? internalValue[0] ?? null : internalValue ?? null;\n\n return (\n <UserSelector\n value={singleValue}\n onValueChange={(userId) => {\n updateValue(userId);\n }}\n disabled={disabled}\n size={\"small\"}\n clearable={true}\n invisible={true}\n />\n );\n}\n","import React, { useCallback } from \"react\";\n\nimport { useSnackbarController, useStorageSource } from \"@rebasepro/app\";\nimport { StorageFieldItem } from \"@rebasepro/app\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport type { StorageSource } from \"@rebasepro/types\";\nimport { cls, paperMixin, Skeleton } from \"@rebasepro/ui\";\n\nexport interface StorageUploadItemProps {\n storagePath: string;\n metadata?: Record<string, unknown>,\n entry: StorageFieldItem,\n onFileUploadComplete: (value: string,\n entry: StorageFieldItem,\n metadata?: Record<string, unknown>,\n uploadedUrl?: string) => Promise<void>;\n imageSize: number;\n simple: boolean;\n /** Override the storage source for this upload. When provided, this source\n * is used instead of the default from context — enabling per-property\n * multi-backend uploads. */\n storageSource?: StorageSource;\n}\n\nexport function StorageUploadProgress({\n storagePath,\n entry,\n metadata,\n onFileUploadComplete,\n imageSize,\n simple,\n storageSource: storageSourceProp\n}: StorageUploadItemProps) {\n\n const defaultStorageSource = useStorageSource();\n const storageSource = storageSourceProp ?? defaultStorageSource;\n\n const snackbarController = useSnackbarController();\n\n const [error, setError] = React.useState<Error | undefined>();\n const [loading, setLoading] = React.useState<boolean>(false);\n const mounted = React.useRef(false);\n const uploading = React.useRef(false);\n\n const upload = useCallback((file: File, fileName?: string) => {\n\n if (uploading.current) return;\n uploading.current = true;\n setError(undefined);\n setLoading(true);\n\n const key = storagePath && fileName ? `${storagePath}/${fileName}` : fileName || storagePath || \"unnamed\";\n storageSource.putObject({\n file,\n key,\n metadata\n })\n .then(async ({ key: resultKey, storageUrl }) => {\n console.debug(\"Upload successful\", resultKey);\n await onFileUploadComplete(resultKey, entry, metadata, storageUrl);\n if (mounted.current)\n setLoading(false);\n })\n .catch((e) => {\n console.warn(\"Upload error\", e);\n if (mounted.current) {\n setError(e);\n setLoading(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error uploading file: \" + e.message\n });\n }\n })\n .finally(() => {\n uploading.current = false;\n });\n }, [entry, metadata, onFileUploadComplete, storageSource, storagePath]);\n\n React.useEffect(() => {\n mounted.current = true;\n if (entry.file)\n upload(entry.file, entry.fileName);\n return () => {\n mounted.current = false;\n };\n }, [entry.file, entry.fileName, upload]);\n\n if (simple) {\n return <div className={`w-${imageSize} h-${imageSize}`}>\n\n {loading && <Skeleton className={`w-${imageSize} h-${imageSize}`}/>}\n\n </div>\n }\n return (\n\n <div className={cls(paperMixin,\n \"p-4 relative border-box flex items-center justify-center\",\n `min-w-[${imageSize}px] min-h-[${imageSize}px]`)}>\n\n {loading &&\n <Skeleton className=\"w-full h-full\"/>}\n\n {error && <ErrorView title={\"Error uploading file\"}\n error={error}/>}\n\n </div>\n\n );\n\n}\n","import { AlertCircleIcon, IconButton } from \"@rebasepro/ui\";\nimport { ErrorTooltip } from \"@rebasepro/app\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface EntityTableCellActionsProps {\n showError: false | Error | undefined;\n disabled: boolean;\n showExpandIcon: boolean | undefined;\n selected: boolean | undefined;\n openPopup?: (cellRect: DOMRect | undefined) => void;\n children?: React.ReactNode;\n}\n\nexport function EntityTableCellActions({\n showError,\n disabled,\n showExpandIcon,\n selected,\n openPopup,\n children\n}: EntityTableCellActionsProps) {\n\n const ref = useRef<HTMLDivElement>(null);\n const doOpenPopup = useCallback(() => {\n if (openPopup) {\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n openPopup(cellRect);\n }\n }, []);\n\n const iconRef = useRef<HTMLButtonElement>(undefined);\n useEffect(() => {\n if (iconRef.current && selected) {\n iconRef.current.focus({ preventScroll: true });\n }\n }, [selected]);\n\n return <>\n {(showError || (!disabled && showExpandIcon)) &&\n <div ref={ref} className=\"absolute top-0.5 right-0.5 flex items-center\">\n {selected && children}\n\n {selected && !disabled && showExpandIcon &&\n <IconButton\n ref={iconRef}\n color={\"inherit\"}\n size={\"small\"}\n onClick={doOpenPopup}>\n <svg\n fill={\"#888\"}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\">\n <path className=\"cls-2\"\n d=\"M20,5a1,1,0,0,0-1-1L14,4h0a1,1,0,0,0,0,2h2.57L13.29,9.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L18,7.42V10a1,1,0,0,0,1,1h0a1,1,0,0,0,1-1Z\"/>\n <path className=\"cls-2\"\n d=\"M10.71,13.29a1,1,0,0,0-1.42,0L6,16.57V14a1,1,0,0,0-1-1H5a1,1,0,0,0-1,1l0,5a1,1,0,0,0,1,1h5a1,1,0,0,0,0-2H7.42l3.29-3.29A1,1,0,0,0,10.71,13.29Z\"/>\n </svg>\n </IconButton>\n }\n\n {showError && <ErrorTooltip\n side={\"left\"}\n title={showError.message}>\n <div\n className={\"flex items-center justify-center\"}\n style={{\n width: 32,\n height: 32\n }}>\n <AlertCircleIcon\n />\n </div>\n </ErrorTooltip>\n }\n\n </div>\n }\n </>;\n}\n","import type { ArrayProperty, StringProperty } from \"@rebasepro/types\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { Entity, StorageConfig } from \"@rebasepro/types\";\nimport { PreviewSize } from \"../../../types\";\nimport { useDropzone } from \"react-dropzone\";\nimport { PropertyPreview } from \"../../../preview\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { cls, IconButton, PencilIcon, Typography } from \"@rebasepro/ui\";\nimport { useSnackbarController, useStorageSource, useTranslation, StorageFieldItem, useStorageUploadController, StorageSourceContext } from \"@rebasepro/app\";\nimport { getThumbnailMeasure } from \"../../../preview/util\";\nimport { StorageUploadProgress } from \"../../../form/components/StorageUploadProgress\";\nimport { EntityTableCellActions } from \"../internal/EntityTableCellActions\";\n\nconst dropZoneClasses = \"max-w-full box-border relative pt-[2px] items-center border border-transparent outline-hidden rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500 bg-green-50 dark:bg-green-900\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500 bg-red-50 dark:bg-red-900\"\n\n/**\n * Field that allows to upload files to Google Cloud Storage.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TableStorageUpload(props: {\n propertyKey: string;\n error: Error | undefined;\n disabled: boolean;\n value: string | string[] | null;\n updateValue: (newValue: (string | string[] | null)) => void;\n selected: boolean;\n focused: boolean;\n property: StringProperty | ArrayProperty;\n entity: Entity<Record<string, unknown>>;\n path: string;\n previewSize: PreviewSize;\n openPopup?: (cellRect?: DOMRect) => void;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n propertyKey,\n error,\n selected,\n openPopup,\n value,\n disabled,\n property,\n entity,\n path,\n previewSize,\n updateValue\n } = props;\n\n const storageSource = useStorageSource();\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported,\n resolvedStorageSource\n } = useStorageUploadController({\n entityValues: entity.values,\n entityId: entity.id,\n path,\n property: property as StringProperty,\n propertyKey,\n storageSource,\n onChange: updateValue,\n value,\n disabled\n });\n\n return (\n\n <StorageSourceContext.Provider value={resolvedStorageSource}>\n <StorageUpload\n internalValue={internalValue}\n setInternalValue={setInternalValue}\n name={propertyKey}\n disabled={disabled}\n autoFocus={false}\n openPopup={openPopup}\n error={error}\n selected={selected}\n property={property}\n onChange={updateValue}\n entity={entity}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}\n onFilesAdded={onFilesAdded}\n onFileUploadComplete={onFileUploadComplete}\n previewSize={previewSize}/>\n </StorageSourceContext.Provider>\n\n );\n}\n\ninterface StorageUploadProps {\n internalValue: StorageFieldItem[];\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n error?: Error;\n property: StringProperty | ArrayProperty;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n selected: boolean;\n disabled: boolean;\n entity: Entity<Record<string, unknown>>;\n previewSize: PreviewSize;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => void;\n storagePathBuilder: (file: File) => string;\n openPopup?: (cellRect?: DOMRect) => void;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: Record<string, unknown>) => Promise<void>;\n}\n\nfunction StorageUpload({\n property,\n name,\n internalValue,\n setInternalValue,\n openPopup,\n entity,\n selected,\n error,\n onChange,\n multipleFilesSupported,\n previewSize: previewSizeInput,\n disabled,\n autoFocus,\n storage,\n onFilesAdded,\n onFileUploadComplete,\n storagePathBuilder\n}: StorageUploadProps) {\n\n const previewSize = previewSizeInput;\n if (multipleFilesSupported) {\n const arrayProperty = property as ArrayProperty;\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (arrayProperty.of) {\n if (arrayProperty.of.type !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: Record<string, unknown> | undefined = storage?.metadata;\n const hasValue = Boolean(internalValue);\n\n const snackbarContext = useSnackbarController();\n const { t } = useTranslation();\n\n const {\n open,\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a,\n...b }), {}) : undefined,\n disabled,\n maxSize: storage.maxSize,\n noClick: true,\n noKeyboard: true,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections, event) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n console.error(\"Error uploading file: \", error);\n if (error.code === \"file-too-large\") {\n snackbarContext.open({\n type: \"error\",\n message: t(\"error_uploading_file_size\", { maxSize: String(storage.maxSize) })\n });\n } else if (error.code === \"file-invalid-type\") {\n snackbarContext.open({\n type: \"error\",\n message: t(\"error_uploading_file_type\")\n });\n }\n }\n }\n }\n }\n );\n\n const { ...rootProps } = getRootProps();\n\n const helpText = multipleFilesSupported\n ? t(\"drag_drop_files\")\n : t(\"drag_drop_file\");\n\n const renderProperty = multipleFilesSupported\n ? (property as ArrayProperty).of as StringProperty\n : property as StringProperty;\n\n const imageSize = useMemo(() => getThumbnailMeasure(previewSize), [previewSize]);\n const showError = !disabled && error;\n\n return (\n <div {...rootProps}\n className={cls(dropZoneClasses,\n \"relative w-full h-full flex\",\n `justify-${hasValue ? \"start\" : \"center\"}`,\n isDragActive ? activeDropClasses : \"\",\n isDragAccept ? acceptDropClasses : \"\",\n isDragReject ? rejectDropClasses : \"\"\n )}\n >\n\n <input autoFocus={autoFocus} {...getInputProps()}/>\n\n {internalValue.map((entry, index) => {\n let child;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <TableStorageItemPreview\n key={`storage_preview_${index}`}\n propertyKey={name}\n property={renderProperty}\n value={entry.storagePathOrDownloadUrl}\n entity={entity}\n size={previewSize}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n key={`storage_progress_${index}`}\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={imageSize}\n simple={true}\n />\n );\n }\n\n return child;\n })}\n\n {!internalValue && <div\n className=\"grow m-2 max-w-[200px]\"\n onClick={open}>\n <Typography\n className=\"text-surface-400 dark:text-surface-600\"\n variant={\"body2\"}\n align={\"center\"}>\n {helpText}\n </Typography>\n </div>}\n\n <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={true}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n onClick={open}>\n <PencilIcon className={\"text-surface-500\"}/>\n </IconButton>\n </EntityTableCellActions>\n\n </div>\n );\n\n}\n\ninterface TableStorageItemPreviewProps {\n propertyKey: string;\n property: StringProperty;\n value: string,\n size: PreviewSize;\n entity: Entity<Record<string, unknown>>;\n}\n\nexport function TableStorageItemPreview({\n propertyKey,\n property,\n value,\n size,\n entity\n}: TableStorageItemPreviewProps) {\n\n return (\n <div\n className={\"relative p-2 max-w-full\"}\n >\n\n {value &&\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={propertyKey}\n value={value}\n property={property}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n }\n\n </div>\n );\n\n}\n","import { useSelectionDialog } from \"../../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport { ReferencePreview } from \"../../../preview\";\nimport { CollectionSize, Entity, EntityReference, FilterValues } from \"@rebasepro/types\";\n\nimport { getPreviewSizeFrom } from \"../../../preview/util\";\nimport { useComponentOverride, ErrorView, CollectionScopeProvider } from \"@rebasepro/app\";\nimport { cls, PencilIcon } from \"@rebasepro/ui\";\nimport { EntityPreviewContainer } from \"../../EntityPreviewBinding\";\nimport { getReferenceFrom } from \"@rebasepro/common\";\nimport { useCollectionRegistryController } from \"../../../hooks/navigation/contexts/CollectionRegistryContext\";\n\ntype TableReferenceFieldProps = {\n name: string;\n disabled: boolean;\n internalValue: EntityReference | EntityReference[] | undefined | null;\n updateValue: (newValue: (EntityReference | EntityReference[] | null)) => void;\n size: CollectionSize;\n multiselect: boolean;\n previewProperties?: string[];\n title?: string;\n path: string;\n fixedFilter?: FilterValues<string>;\n includeId?: boolean;\n includeEntityLink?: boolean;\n};\n\nconst DefaultMissingReference: React.FC<{ path: string }> = () => null;\n\nfunction TableReferenceFieldResolver(props: TableReferenceFieldProps & { collection: CollectionConfig | undefined }) {\n const ResolvedMissingReference = useComponentOverride(\"Entity.MissingReference\", DefaultMissingReference);\n const { path, collection } = props;\n\n if (!collection) {\n if (ResolvedMissingReference !== DefaultMissingReference) {\n return <ResolvedMissingReference path={path}/>;\n } else {\n return <ErrorView error={`Collection not found: ${path}`}/>;\n }\n }\n return <TableReferenceFieldInternal {...props} collection={collection}/>;\n}\n\nexport function TableReferenceField(props: TableReferenceFieldProps) {\n const collectionRegistryController = useCollectionRegistryController();\n const { path } = props;\n const collection = collectionRegistryController.getCollection(path);\n\n const content = (\n <TableReferenceFieldResolver\n {...props}\n collection={collection}\n />\n );\n\n if (collection) {\n return (\n <CollectionScopeProvider collection={collection}>\n {content}\n </CollectionScopeProvider>\n );\n }\n return content;\n}\n\nexport const TableReferenceFieldInternal = React.memo(\n function TableReferenceFieldInternal(props: TableReferenceFieldProps & {\n collection: CollectionConfig;\n }) {\n const {\n name,\n internalValue,\n updateValue,\n multiselect,\n path,\n size,\n previewProperties,\n title,\n disabled,\n fixedFilter,\n collection,\n includeId,\n includeEntityLink\n } = props;\n\n const onSingleEntitySelected = useCallback((entity: Entity<any>) => {\n updateValue(entity ? getReferenceFrom(entity) : null);\n }, [updateValue]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n updateValue(entities.map((e) => getReferenceFrom(e)));\n }, [updateValue]);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue)\n ? internalValue.map((ref) => ref.id)\n : internalValue.id ? [internalValue.id] : [])\n : [];\n\n const referenceDialogController = useSelectionDialog({\n multiselect,\n path,\n collection,\n onMultipleEntitiesSelected,\n onSingleEntitySelected,\n selectedEntityIds,\n fixedFilter\n }\n );\n\n const handleOpen = () => {\n if (disabled)\n return;\n referenceDialogController.open();\n };\n\n const valueNotSet = !internalValue || (Array.isArray(internalValue) && internalValue.length === 0);\n\n const buildSingleReferenceField = () => {\n if (internalValue && !Array.isArray(internalValue) && internalValue.isEntityReference && internalValue.isEntityReference())\n return <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}\n reference={internalValue as EntityReference}\n hover={!disabled}\n disabled={!path}\n previewProperties={previewProperties}\n includeId={includeId}\n includeEntityLink={includeEntityLink}\n />;\n else\n return <EntityPreviewContainer\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}>\n <ErrorView title=\"Value is not a reference.\" error={\"Click to edit\"}/>\n </EntityPreviewContainer>;\n };\n\n const buildMultipleReferenceField = () => {\n if (Array.isArray(internalValue))\n return <>\n {internalValue.map((reference, index) =>\n <div className=\"w-full my-0.5\"\n key={`preview_array_ref_${name}_${index}`}>\n <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={\"small\"}\n reference={reference}\n hover={!disabled}\n disabled={!path}\n previewProperties={previewProperties}\n includeId={includeId}\n includeEntityLink={includeEntityLink}\n />\n </div>\n )\n }\n </>;\n else\n return <ErrorView error={\"Data is not an array of references\"}/>;\n };\n\n if (!collection)\n return <ErrorView error={\"The specified collection does not exist\"}/>;\n\n return (\n <div className=\"w-full group\">\n\n {internalValue && !multiselect && buildSingleReferenceField()}\n\n {internalValue && multiselect && buildMultipleReferenceField()}\n\n {valueNotSet &&\n <EntityPreviewContainer\n className={cls(\"px-3 py-2 text-sm font-medium flex items-center\",\n multiselect ? \"gap-4\" : \"gap-6\",\n disabled\n ? \"text-surface-accent-500\"\n : \"cursor-pointer text-text-secondary dark:text-text-secondary-dark hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\")}\n onClick={handleOpen}\n size={\"medium\"}>\n <PencilIcon\n className={\"ml-2 mr-1 text-surface-300 dark:text-surface-600\"}/>\n {title}\n </EntityPreviewContainer>}\n\n </div>\n );\n }, equal);\n","import { useSelectionDialog } from \"../../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport { getCollectionDataPath } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nimport { cls, PencilIcon } from \"@rebasepro/ui\";\nimport { getRelationFrom, normalizeToEntityRelation } from \"@rebasepro/common\";\n\nimport { RelationPreview } from \"../../../preview\";\nimport { CollectionSize, Entity, EntityRelation, FilterValues, Relation } from \"@rebasepro/types\";\nimport { } from \"@rebasepro/app\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { EntityPreviewContainer } from \"../../EntityPreviewBinding\";\n\ntype TableMultipleRelationFieldProps = {\n name: string;\n disabled: boolean;\n internalValue: EntityRelation[] | undefined | null;\n updateValue: (newValue: EntityRelation[] | null) => void;\n size: CollectionSize;\n previewProperties?: string[];\n title?: string;\n relation: Relation;\n fixedFilter?: FilterValues<string>;\n includeId?: boolean;\n includeEntityLink?: boolean;\n};\n\nexport function TableMultipleRelationField(props: TableMultipleRelationFieldProps) {\n const collection = props.relation.target();\n return <TableMultipleRelationFieldInternal {...props} collection={collection}/>;\n}\n\nexport const TableMultipleRelationFieldInternal = React.memo(\n function TableMultipleRelationFieldInternal(props: TableMultipleRelationFieldProps & {\n collection: CollectionConfig;\n }) {\n const {\n name,\n internalValue,\n updateValue,\n previewProperties,\n title,\n disabled,\n fixedFilter,\n collection,\n includeId,\n includeEntityLink\n } = props;\n\n const value = Array.isArray(internalValue) ? internalValue : [];\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n updateValue(entities.map(e => getRelationFrom(e)));\n }, [updateValue]);\n\n const selectedEntityIds = value.map((ref) => ref.id);\n\n const relationDialogController = useSelectionDialog({\n multiselect: true,\n path: getCollectionDataPath(collection),\n collection,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n fixedFilter\n }\n );\n\n const handleOpen = () => {\n if (disabled)\n return;\n relationDialogController.open();\n };\n\n const valueNotSet = !internalValue || (Array.isArray(internalValue) && internalValue.length === 0);\n\n const buildMultipleRelationField = () => {\n if (Array.isArray(internalValue))\n return <>\n {internalValue.map((item, index) => {\n const relationItem = normalizeToEntityRelation(item);\n\n if (!relationItem) return null;\n\n return (\n <div className=\"w-full my-0.5\"\n key={`preview_array_ref_${name}_${index}`}>\n <RelationPreview\n onClick={disabled ? undefined : handleOpen}\n size={\"small\"}\n relation={relationItem}\n hover={!disabled}\n previewProperties={previewProperties}\n includeId={includeId}\n includeEntityLink={includeEntityLink}\n />\n </div>\n );\n })\n }\n </>;\n else\n return <ErrorView error={\"Data is not an array of relations\"}/>;\n };\n\n if (!collection)\n return <ErrorView error={\"The specified collection does not exist\"}/>;\n\n return (\n <div className=\"w-full group\">\n\n {internalValue && buildMultipleRelationField()}\n\n {valueNotSet &&\n <EntityPreviewContainer\n className={cls(\"px-3 py-2 text-sm font-medium flex items-center gap-4\",\n disabled\n ? \"text-surface-accent-500\"\n : \"cursor-pointer text-text-secondary dark:text-text-secondary-dark hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\")}\n onClick={handleOpen}\n size={\"medium\"}>\n <PencilIcon\n className={\"ml-2 mr-1 text-surface-300 dark:text-surface-600\"}/>\n {title}\n </EntityPreviewContainer>}\n\n </div>\n );\n }, equal);\n","import { useSelectionDialog } from \"../../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport { getCollectionDataPath } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport { RelationPreview } from \"../../../preview\";\nimport { CollectionSize, Entity, EntityRelation, FilterValues, Relation } from \"@rebasepro/types\";\n\nimport { getPreviewSizeFrom } from \"../../../preview/util\";\nimport { } from \"@rebasepro/app\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { cls, PencilIcon } from \"@rebasepro/ui\";\nimport { EntityPreviewContainer } from \"../../EntityPreviewBinding\";\nimport { getRelationFrom, normalizeToEntityRelation } from \"@rebasepro/common\";\nimport { TableMultipleRelationField } from \"./TableMultipleRelationField\";\n\ntype TableRelationFieldProps = {\n name: string;\n disabled: boolean;\n internalValue: EntityRelation | EntityRelation[] | undefined | null;\n updateValue: (newValue: (EntityRelation | EntityRelation[] | null)) => void;\n size: CollectionSize;\n multiselect: boolean;\n previewProperties?: string[];\n title?: string;\n relation: Relation;\n fixedFilter?: FilterValues<string>;\n includeId?: boolean;\n includeEntityLink?: boolean;\n};\n\nexport function TableRelationField(props: TableRelationFieldProps) {\n const collection = props.relation.target();\n\n // Check if this is a many-to-many relation\n const manyRelation = props.relation?.cardinality === \"many\";\n\n if (manyRelation) {\n return <TableMultipleRelationField\n name={props.name}\n disabled={props.disabled}\n internalValue={Array.isArray(props.internalValue) ? props.internalValue : []}\n updateValue={(newValue) => props.updateValue(newValue)}\n size={props.size}\n previewProperties={props.previewProperties}\n title={props.title}\n relation={props.relation}\n fixedFilter={props.fixedFilter}\n includeId={props.includeId}\n includeEntityLink={props.includeEntityLink}\n />;\n }\n\n return <TableRelationFieldInternal {...props} collection={collection}/>;\n}\n\nexport const TableRelationFieldInternal = React.memo(\n function TableRelationFieldInternal(props: TableRelationFieldProps & {\n collection: CollectionConfig;\n }) {\n const {\n name,\n internalValue,\n updateValue,\n multiselect,\n relation,\n size,\n previewProperties,\n title,\n disabled,\n fixedFilter,\n collection,\n includeId,\n includeEntityLink\n } = props;\n\n const onSingleEntitySelected = useCallback((entity: Entity<any>) => {\n updateValue(entity ? getRelationFrom(entity) : null);\n }, [updateValue]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n updateValue(entities.map((e) => getRelationFrom(e)));\n }, [updateValue]);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue)\n ? internalValue.map((ref) => ref.id)\n : internalValue.id ? [internalValue.id] : [])\n : [];\n\n const relationDialogController = useSelectionDialog({\n multiselect,\n path: getCollectionDataPath(collection),\n collection,\n onMultipleEntitiesSelected,\n onSingleEntitySelected,\n selectedEntityIds,\n fixedFilter\n }\n );\n\n const handleOpen = () => {\n if (disabled)\n return;\n relationDialogController.open();\n };\n\n const valueNotSet = !internalValue || (Array.isArray(internalValue) && internalValue.length === 0);\n\n const buildSingleRelationField = () => {\n const normalizedRelation = normalizeToEntityRelation(internalValue);\n\n if (normalizedRelation)\n return <RelationPreview\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}\n relation={normalizedRelation}\n hover={!disabled}\n previewProperties={previewProperties}\n includeId={includeId}\n includeEntityLink={includeEntityLink}\n />;\n else\n return <EntityPreviewContainer\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}>\n <ErrorView title=\"Value is not a relation.\" error={\"Click to edit\"}/>\n </EntityPreviewContainer>;\n };\n\n const buildMultipleRelationField = () => {\n if (Array.isArray(internalValue))\n return <>\n {internalValue.map((relationItem, index) =>\n <div className=\"w-full my-0.5\"\n key={`preview_array_ref_${name}_${index}`}>\n <RelationPreview\n onClick={disabled ? undefined : handleOpen}\n size={\"small\"}\n relation={relationItem}\n hover={!disabled}\n previewProperties={previewProperties}\n includeId={includeId}\n includeEntityLink={includeEntityLink}\n />\n </div>\n )\n }\n </>;\n else\n return <ErrorView error={\"Data is not an array of relations\"}/>;\n };\n\n if (!collection)\n return <ErrorView error={\"The specified collection does not exist\"}/>;\n\n return (\n <div className=\"w-full group\">\n\n {internalValue && !multiselect && buildSingleRelationField()}\n\n {internalValue && multiselect && buildMultipleRelationField()}\n\n {valueNotSet &&\n <EntityPreviewContainer\n className={cls(\"px-3 py-2 text-sm font-medium flex items-center\",\n multiselect ? \"gap-4\" : \"gap-6\",\n disabled\n ? \"text-surface-accent-500\"\n : \"cursor-pointer text-text-secondary dark:text-text-secondary-dark hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\")}\n onClick={handleOpen}\n size={\"medium\"}>\n <PencilIcon\n className={\"ml-2 mr-1 text-surface-300 dark:text-surface-600\"}/>\n {title}\n </EntityPreviewContainer>}\n\n </div>\n );\n }, equal);\n","\nimport {\n ArrowRightToLineIcon,\n CheckIcon,\n ChevronDownIcon,\n Chip,\n CircularProgress,\n cls,\n defaultBorderMixin,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundInvisibleMixin,\n fieldBackgroundMixin,\n focusedDisabled,\n IconButton,\n iconSize,\n PopoverPrimitive,\n SearchIcon,\n Separator,\n Tooltip,\n useInjectStyles,\n XIcon\n} from \"@rebasepro/ui\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Entity, EntityRelation, FilterValues, Relation, getCollectionDataPath } from \"@rebasepro/types\";\nimport { EntityPreviewBindingData } from \"./EntityPreviewBinding\";\nimport { useData, useRelationSelector } from \"@rebasepro/app\";\nimport { useSidePanel } from \"../hooks/useSidePanel\";\nimport { normalizeToEntityRelation } from \"@rebasepro/common\";\nimport { EmptyValue } from \"../preview\";\n\nexport interface RelationItem {\n id: string | number;\n label: string;\n description?: string;\n data?: Entity;\n relation: EntityRelation;\n}\n\nexport interface RelationSelectorProps {\n className?: string;\n name?: string;\n id?: string;\n value?: EntityRelation | EntityRelation[] | null;\n /** Callback returning selected EntityRelation(s) */\n\n onValueChange?: (updatedValue: EntityRelation | EntityRelation[] | undefined) => void;\n placeholder?: React.ReactNode;\n size?: \"small\" | \"medium\";\n useChips?: boolean;\n disabled?: boolean;\n error?: boolean; // kept for backwards compatibility (could be used for styling later)\n padding?: boolean; // legacy prop\n invisible?: boolean;\n\n relation: Relation;\n fixedFilter?: FilterValues<string>;\n pageSize?: number;\n emptyPlaceholder?: string;\n searchPlaceholder?: string;\n noResultsText?: string;\n loadingText?: string;\n}\n\nexport const RelationSelector = React.forwardRef<\n HTMLButtonElement,\n RelationSelectorProps\n>(\n (\n {\n value,\n size = \"medium\",\n onValueChange,\n invisible,\n disabled,\n placeholder,\n useChips = true,\n className,\n relation,\n fixedFilter,\n pageSize,\n emptyPlaceholder,\n searchPlaceholder = \"Search...\",\n noResultsText = \"No relations found.\",\n loadingText = \"Loading...\"\n },\n ref\n ) => {\n\n const collection = relation.target();\n const dataClient = useData();\n const sidePanelController = useSidePanel();\n const multiple = relation.cardinality === \"many\";\n\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n const isPopoverOpenRef = useRef(false);\n const [selectedItems, setSelectedItems] = useState<RelationItem[]>([]);\n const [isLoadingSelectedItems, setIsLoadingSelectedItems] = useState(false);\n const [searchString, setSearchString] = useState<string>(\"\");\n // Track IDs that were set via local user interaction (onItemClick / handleClear / handleRemoveItem).\n // When an incoming value change matches these IDs exactly, we skip async re-resolution.\n const localSelectionIdsRef = useRef<string | null>(null);\n // Entity of selected IDs captured when the popover opens.\n // Used to sort the dropdown list so selected items appear at the top.\n // Stays stable for the entire popover session so items don't jump around.\n const pinnedIdsRef = useRef<Set<string> | null>(null);\n\n const {\n items: availableItems,\n isLoading,\n hasMore,\n search,\n loadMore,\n entityToRelationItem\n } = useRelationSelector({\n path: getCollectionDataPath(collection),\n collection,\n fixedFilter,\n pageSize\n });\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const localTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const handleButtonRef = useCallback((node: HTMLButtonElement | null) => {\n localTriggerRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }, [ref]);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n\n // Keep stable refs for dependencies used in the value-resolution effect\n // so the effect only re-fires when the actual `value` identity changes.\n const dataClientRef = useRef(dataClient);\n dataClientRef.current = dataClient;\n const entityToRelationItemRef = useRef(entityToRelationItem);\n entityToRelationItemRef.current = entityToRelationItem;\n const collectionSlugRef = useRef(collection.slug);\n collectionSlugRef.current = collection.slug;\n\n // Stable ref to track which IDs we've already resolved\n const resolvedIdsRef = useRef<string>(\"\");\n // Track whether we have resolved items (used for skip guard without adding to deps)\n const hasResolvedItemsRef = useRef(false);\n\n const selectedItemsRef = useRef(selectedItems);\n selectedItemsRef.current = selectedItems;\n\n // Normalize incoming values — plain { __type: \"relation\" } objects\n // from the server are converted to proper EntityRelation instances.\n const rawArray = !value ? [] : Array.isArray(value) ? value : [value];\n const relationsArray = rawArray.map(rel => {\n if (typeof rel === \"string\" || typeof rel === \"number\") return rel;\n return normalizeToEntityRelation(rel) ?? rel;\n });\n\n // Build a fingerprint of the incoming value's IDs\n const incomingIds = relationsArray\n .map(rel => {\n const isPrimitive = typeof rel === \"string\" || typeof rel === \"number\";\n return String(isPrimitive ? rel : (rel as EntityRelation).id);\n })\n .sort()\n .join(\",\");\n\n // CheckIcon if every relation already has embedded data\n const allHaveData = relationsArray.length > 0 && relationsArray.every(rel => {\n if (typeof rel === \"string\" || typeof rel === \"number\") return false;\n return !!(rel as EntityRelation)?.data;\n });\n\n const relationsArrayRef = useRef(relationsArray);\n relationsArrayRef.current = relationsArray;\n\n useEffect(() => {\n let active = true;\n const currentRelationsArray = relationsArrayRef.current;\n\n // If the IDs haven't changed and we already resolved them, skip entirely\n if (incomingIds === resolvedIdsRef.current && (allHaveData || hasResolvedItemsRef.current)) {\n return;\n }\n\n // FAST PATH: If the incoming IDs match what we just set locally via user interaction,\n // our selectedItems already have the correct data — no re-resolution needed.\n if (localSelectionIdsRef.current !== null && incomingIds === localSelectionIdsRef.current) {\n resolvedIdsRef.current = incomingIds;\n hasResolvedItemsRef.current = true;\n // Do NOT call setSelectedItems or setIsLoadingSelectedItems — they are already correct.\n return;\n }\n\n const currentSelected = selectedItemsRef.current;\n const currentSelectedMap = new Map(currentSelected.map(item => [String(item.id), item]));\n\n let allCovered = true;\n const newResolvedItems: RelationItem[] = [];\n const toRelationItem = entityToRelationItemRef.current;\n const slug = collectionSlugRef.current;\n\n for (const rel of currentRelationsArray) {\n const isPrimitive = typeof rel === \"string\" || typeof rel === \"number\";\n const relId = String(isPrimitive ? rel : (rel as EntityRelation).id);\n const hasEmbeddedData = !isPrimitive && !!(rel as EntityRelation).data;\n\n if (hasEmbeddedData) {\n const r = rel as EntityRelation;\n // CMS wire format embeds relation data as { id, path, values }\n newResolvedItems.push(toRelationItem(r.data as unknown as Entity, r));\n } else if (currentSelectedMap.has(relId)) {\n // We already have it in currentSelected\n const existingItem = currentSelectedMap.get(relId)!;\n newResolvedItems.push(existingItem);\n } else {\n allCovered = false;\n break;\n }\n }\n\n // FAST PATH: We have all necessary data embedded or in local cache\n if (allCovered) {\n setSelectedItems(newResolvedItems);\n hasResolvedItemsRef.current = true;\n resolvedIdsRef.current = incomingIds;\n setIsLoadingSelectedItems(false);\n return;\n }\n\n // SLOW PATH: fetch missing data — but don't show loading if popover is open\n // (user is actively interacting; showing a spinner is disruptive)\n if (!isPopoverOpenRef.current) {\n setIsLoadingSelectedItems(true);\n }\n const client = dataClientRef.current;\n\n Promise.all(\n currentRelationsArray.map(async (rel) => {\n const isPrimitive = typeof rel === \"string\" || typeof rel === \"number\";\n const relId = isPrimitive ? rel : (rel as EntityRelation).id;\n const path = isPrimitive ? slug : (rel as EntityRelation).path;\n const relation = isPrimitive ? new EntityRelation(relId, path) : rel as EntityRelation;\n\n if (!isPrimitive && (rel as EntityRelation).data) {\n // CMS wire format embeds relation data as { id, path, values }\n return toRelationItem((rel as EntityRelation).data as unknown as Entity, relation);\n }\n if (currentSelectedMap.has(String(relId))) {\n return currentSelectedMap.get(String(relId))!;\n }\n\n try {\n const entity = await client.collection(path).findById(relId);\n if (entity) return toRelationItem(entity, relation);\n } catch (e) {\n console.warn(\"RelationSelector: could not fetch entity for relation\", rel, e);\n }\n return { id: relId,\nlabel: String(relId),\nrelation } as RelationItem;\n })\n ).then(resolved => {\n if (active) {\n setSelectedItems(resolved);\n setIsLoadingSelectedItems(false);\n hasResolvedItemsRef.current = true;\n resolvedIdsRef.current = incomingIds;\n }\n });\n\n return () => {\n active = false;\n };\n }, [incomingIds, allHaveData]);\n\n const sentinelCallbackRef = useCallback((node: HTMLDivElement | null) => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n if (sentinelRef.current !== node) {\n (sentinelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n if (!node || !hasMore || isLoading || !loadMore) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry.isIntersecting && hasMore && !isLoading) loadMore();\n },\n {\n root: scrollContainerRef.current,\n rootMargin: \"20px\",\n threshold: 0\n }\n );\n observer.observe(node);\n observerRef.current = observer;\n }, [hasMore, isLoading, loadMore]);\n\n useEffect(() => () => {\n if (observerRef.current) observerRef.current.disconnect();\n }, []);\n\n // Enhanced scroll event listener specifically for dialog contexts\n useEffect(() => {\n const scrollContainer = scrollContainerRef.current;\n if (!scrollContainer || !hasMore || isLoading || !isPopoverOpen) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - 100;\n\n if (isNearBottom && hasMore && !isLoading) {\n loadMore();\n }\n };\n\n // Add scroll listener directly to the container\n scrollContainer.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n scrollContainer.removeEventListener(\"scroll\", handleScroll);\n };\n }, [hasMore, isLoading, loadMore, isPopoverOpen]);\n\n const handleSearchChange = useCallback((newSearchString: string) => {\n setSearchString(newSearchString);\n search(newSearchString);\n }, [search]);\n\n const emitValueChange = useCallback((selected: RelationItem[]) => {\n if (multiple) onValueChange?.(selected.length ? selected.map(i => i.relation) : undefined);\n else onValueChange?.(selected[0]?.relation);\n }, [onValueChange, multiple]);\n\n // Helper: compute the \"IDs fingerprint\" for a set of RelationItems\n // so we can mark it in localSelectionIdsRef and skip re-resolution.\n const computeSelectionFingerprint = useCallback((items: RelationItem[]): string => {\n return items.map(i => String(i.id)).sort().join(\",\");\n }, []);\n\n const onItemClick = useCallback((item: RelationItem) => {\n let newSelected: RelationItem[];\n if (multiple) {\n const isSelected = selectedItems.some(v => String(v.id) === String(item.id));\n newSelected = isSelected\n ? selectedItems.filter(v => String(v.id) !== String(item.id))\n : [...selectedItems, item];\n } else {\n newSelected = [item];\n setIsPopoverOpen(false);\n isPopoverOpenRef.current = false;\n pinnedIdsRef.current = null;\n }\n setSelectedItems(newSelected);\n // Mark this fingerprint so the resolution effect skips async work\n // when the parent echoes the same IDs back via props.\n localSelectionIdsRef.current = computeSelectionFingerprint(newSelected);\n emitValueChange(newSelected);\n }, [multiple, selectedItems, emitValueChange, computeSelectionFingerprint]);\n\n const handleClear = useCallback(() => {\n setSelectedItems([]);\n localSelectionIdsRef.current = \"\";\n onValueChange?.(undefined);\n }, [onValueChange]);\n\n const handleRemoveItem = useCallback((itemToRemove: RelationItem) => {\n const newSelected = selectedItems.filter(v => String(v.id) !== String(itemToRemove.id));\n setSelectedItems(newSelected);\n localSelectionIdsRef.current = computeSelectionFingerprint(newSelected);\n emitValueChange(newSelected);\n }, [selectedItems, emitValueChange, computeSelectionFingerprint]);\n\n const handleRootOpenChange = useCallback((next: boolean) => {\n if (disabled) return;\n // We control open manually; only allow opening attempts from Radix (e.g. trigger press)\n if (next) {\n // Capture current selection so we can pin those items to the top of the list\n pinnedIdsRef.current = new Set(selectedItems.map(i => String(i.id)));\n setIsPopoverOpen(true);\n isPopoverOpenRef.current = true;\n }\n // Ignore close attempts here; outside click/Escape handled manually; single select closes explicitly on selection.\n }, [disabled, selectedItems]);\n\n // Outside click + Escape handling (simple and reliable)\n useEffect(() => {\n if (!isPopoverOpen) return;\n\n function handlePointerDown(ev: MouseEvent) {\n const target = ev.target as Node;\n const triggerEl = localTriggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl?.contains(target)) return;\n if (contentEl?.contains(target)) return;\n // Outside\n setIsPopoverOpen(false);\n isPopoverOpenRef.current = false;\n pinnedIdsRef.current = null;\n }\n\n function handleKey(ev: KeyboardEvent) {\n if (ev.key === \"Escape\") {\n setIsPopoverOpen(false);\n isPopoverOpenRef.current = false;\n pinnedIdsRef.current = null;\n }\n }\n\n document.addEventListener(\"mousedown\", handlePointerDown, true);\n document.addEventListener(\"keydown\", handleKey, true);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown, true);\n document.removeEventListener(\"keydown\", handleKey, true);\n };\n }, [isPopoverOpen]);\n\n useInjectStyles(\"RelationSelector\", \" [cmdk-group] { max-height: 40vh; overflow-y: auto; } \");\n\n const closePopover = useCallback(() => {\n setIsPopoverOpen(false);\n isPopoverOpenRef.current = false;\n pinnedIdsRef.current = null;\n }, []);\n\n const resolvedPlaceholder = placeholder || emptyPlaceholder || <EmptyValue className={\"ml-2\"}/>;\n\n // Use Sheet portal container if available, otherwise document.body\n const portalContainer = (typeof document !== \"undefined\" ? document.body : undefined);\n\n return (\n <>\n <PopoverPrimitive.Root open={isPopoverOpen} onOpenChange={handleRootOpenChange} modal={false}>\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={handleButtonRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={isPopoverOpen}\n data-relation-selector-trigger\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setIsPopoverOpen(o => {\n const next = !o;\n isPopoverOpenRef.current = next;\n if (next) {\n pinnedIdsRef.current = new Set(selectedItems.map(i => String(i.id)));\n } else {\n pinnedIdsRef.current = null;\n }\n return next;\n });\n }}\n className={cls(\n {\n \"min-h-[42px] py-1 px-2\": size === \"small\",\n \"min-h-[56px] py-2 px-4\": size === \"medium\"\n },\n \"w-full select-none rounded-md text-sm relative flex items-center\",\n invisible ? fieldBackgroundInvisibleMixin : fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n className\n )}\n >\n <div className=\"flex justify-between items-center w-full\">\n {isLoadingSelectedItems ? (\n <div className=\"flex items-center gap-2\">\n <CircularProgress size=\"smallest\"/>\n <span className=\"text-sm text-text-secondary dark:text-text-secondary-dark\">{loadingText}</span>\n </div>\n ) : selectedItems.length > 0 ? (\n <div\n className=\"flex flex-wrap items-center gap-1.5 text-start flex-1 min-w-0 mr-2\">\n {selectedItems.map((item) => {\n if (!useChips || !multiple) {\n\n return (\n <div key={String(item.id)}\n className=\"flex flex-row items-center gap-1 truncate\">\n {item.data ? (\n <EntityPreviewBindingData size={\"medium\"}\n entity={item.data}\n includeEntityLink={false}\n includeId={false}\n onSidePanelClick={closePopover}\n />\n ) : (\n <span className=\"text-sm truncate\">{item.label}</span>\n )}\n </div>\n );\n }\n return (\n <Chip\n size={\"small\"}\n key={String(item.id)}\n className={cls(\"flex flex-row items-center gap-1 truncate\")}\n >\n {item.data ? (\n <EntityPreviewBindingData size={\"smallest\"} entity={item.data}\n includeEntityLink={false}\n includeId={false}/>\n ) : (\n <span className=\"text-sm truncate\">{item.label}</span>\n )}\n <XIcon\n size={iconSize.smallest}\n onClick={(event) => {\n event.stopPropagation();\n handleRemoveItem(item);\n }}\n />\n </Chip>\n );\n })}\n </div>\n ) :\n (\n <span className=\"text-sm text-text-secondary dark:text-text-secondary-dark\">\n {resolvedPlaceholder}\n </span>\n )}\n\n <div className=\"flex items-center flex-shrink-0\">\n {!multiple && selectedItems.length === 1 && selectedItems[0]?.data && (\n <Tooltip title={`Open ${selectedItems[0].label}`}>\n <IconButton\n component={\"div\"}\n size={\"small\"}\n color={\"inherit\"}\n className=\"opacity-60 hover:opacity-100\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n const entity = selectedItems[0].data!;\n setIsPopoverOpen(false);\n sidePanelController.open({\n entityId: entity.id,\n path: entity.path,\n collection,\n updateUrl: true\n });\n }}>\n <ArrowRightToLineIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n )}\n <ChevronDownIcon\n size={size === \"medium\" ? iconSize.medium : iconSize.small}\n className={cls(\"transition\", isPopoverOpen ? \"rotate-180\" : \"\")}\n />\n </div>\n </div>\n\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={contentRef}\n data-relation-selector-content\n className={cls(\"z-50 overflow-hidden border bg-white dark:bg-surface-800 rounded-lg min-w-72\", defaultBorderMixin)}\n align=\"start\"\n sideOffset={8}\n side=\"bottom\"\n avoidCollisions={true}\n collisionPadding={16}\n // Allow default auto focus (we manually refocus anyway)\n onOpenAutoFocus={(_e) => { /* leave default or custom manual focus */\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n <CommandPrimitive shouldFilter={false}>\n <div className=\"flex flex-row items-center\">\n <div className=\"relative flex-1\">\n <SearchIcon\n className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-text-secondary dark:text-text-secondary-dark\"\n size={iconSize.smallest}/>\n <CommandPrimitive.Input\n ref={searchInputRef}\n className={cls(\n focusedDisabled,\n \"bg-transparent outline-hidden flex-1 h-full w-full pl-10 pr-4 py-3 text-text-primary dark:text-text-primary-dark placeholder:text-text-secondary dark:placeholder:text-text-secondary-dark\"\n )}\n placeholder={searchPlaceholder}\n value={searchString}\n onValueChange={handleSearchChange}\n />\n </div>\n {isLoading && (\n <div className=\"flex items-center justify-center px-3\">\n <CircularProgress size=\"smallest\"/>\n </div>\n )}\n {selectedItems.length > 0 && (\n <div\n onClick={handleClear}\n className=\"text-sm justify-center cursor-pointer py-3 px-4 text-text-secondary dark:text-text-secondary-dark hover:text-text-primary dark:hover:text-text-primary-dark\"\n >\n Clear\n </div>\n )}\n </div>\n <Separator orientation=\"horizontal\" className=\"my-0\"/>\n <CommandPrimitive.List\n ref={scrollContainerRef}\n style={{\n maxHeight: \"40vh\",\n overflowY: \"auto\"\n }}\n >\n {isLoading && availableItems.length === 0 && (\n <div className=\"flex items-center justify-center py-6\">\n <CircularProgress size=\"small\"/>\n <span\n className=\"ml-2 text-sm text-text-secondary dark:text-text-secondary-dark\">{loadingText}</span>\n </div>\n )}\n {!isLoading && availableItems.length === 0 && (\n <CommandPrimitive.Empty\n className=\"px-4 py-6 text-center text-text-secondary dark:text-text-secondary-dark\">\n {noResultsText}\n </CommandPrimitive.Empty>\n )}\n <CommandPrimitive.Group>\n {(() => {\n // Sort items so that initially-selected (pinned) items appear first.\n // We use the entity taken when the popover opened so items don't\n // jump around as the user checks/unchecks.\n const pinned = pinnedIdsRef.current;\n const sortedItems = pinned && pinned.size > 0\n ? [...availableItems].sort((a, b) => {\n const aP = pinned.has(String(a.id)) ? 0 : 1;\n const bP = pinned.has(String(b.id)) ? 0 : 1;\n return aP - bP;\n })\n : availableItems;\n return sortedItems;\n })().map((item) => {\n const isSelected = selectedItems.some(v => String(v.id) === String(item.id));\n return (\n <CommandPrimitive.Item\n key={String(item.id)}\n value={String(item.id)}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => onItemClick(item)}\n className={cls(\n \"flex flex-row items-center gap-1.5 m-1 p-1 rounded-xs cursor-pointer ring-offset-transparent\",\n isSelected && \"bg-surface-accent-200 dark:bg-surface-accent-950\",\n \"aria-selected:outline-hidden aria-selected:ring-2 aria-selected:ring-primary/75 aria-selected:ring-offset-2 aria-selected:bg-surface-accent-100 dark:aria-selected:bg-surface-accent-900\"\n )}\n >\n {multiple && (<InnerCheckBox checked={isSelected}/>)}\n {item.data ? (\n <div\n className=\"flex flex-row items-center gap-2 min-w-0 w-full\">\n <EntityPreviewBindingData\n size={multiple ? \"smallest\" : \"medium\"}\n entity={item.data}\n includeId={false}\n includeEntityLink={true}\n />\n </div>\n ) : (\n <div>\n <div\n className=\"text-sm font-medium text-text-primary dark:text-text-primary-dark\">{item.label}</div>\n {item.description && (\n <div\n className=\"text-xs text-text-secondary dark:text-text-secondary-dark\">{item.description}</div>\n )}\n </div>\n )}\n </CommandPrimitive.Item>\n );\n })}\n {availableItems.length > 0 && hasMore && (\n <div ref={sentinelCallbackRef} className=\"h-1 w-full\"\n style={{ visibility: \"hidden\" }}/>\n )}\n {isLoading && availableItems.length > 0 && (\n <div className=\"flex items-center justify-center py-4\">\n <CircularProgress size=\"smallest\"/>\n <span\n className=\"ml-2 text-xs text-text-secondary dark:text-text-secondary-dark\">Loading...</span>\n </div>\n )}\n </CommandPrimitive.Group>\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n );\n }\n);\n\nRelationSelector.displayName = \"RelationSelector\";\n\nfunction InnerCheckBox({ checked }: { checked: boolean }) {\n return (\n <div className={cls(\n \"p-2 w-8 h-8 inline-flex items-center justify-center text-sm font-medium focus:outline-hidden transition-colors ease-in-out duration-150\"\n )}>\n <div\n className={cls(\n \"border-2 relative transition-colors ease-in-out duration-150 w-4 h-4 rounded-xs flex items-center justify-center\",\n checked ? \"bg-primary text-surface-accent-100 dark:text-surface-accent-900 border-transparent\" : \"bg-white dark:bg-surface-accent-900 border-surface-accent-800 dark:border-surface-accent-200\"\n )}\n >\n {checked && <CheckIcon size={iconSize.smallest} className=\"absolute\"/>}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { EntityRelation, FilterValues, Relation } from \"@rebasepro/types\";\nimport { RelationSelector } from \"../../RelationSelector\";\n\ninterface RelationSelectorFieldProps {\n /** Field name */\n name: string;\n /** Whether the field is disabled */\n disabled?: boolean;\n /** Current value - can be single EntityRelation or array for multiple selection */\n internalValue: EntityRelation | EntityRelation[] | undefined | null;\n /** Callback when value changes */\n updateValue: (newValue: EntityRelation | EntityRelation[] | null) => void;\n /** The relation configuration */\n relation: Relation;\n /** Force filter to be applied to the relation search */\n fixedFilter?: FilterValues<string>;\n /** Collection size for display */\n size?: \"small\" | \"medium\";\n}\n\n/** Thin wrapper around RelationSelector for table cells */\nexport function TableRelationSelectorField({\n disabled = false,\n internalValue,\n updateValue,\n relation,\n fixedFilter,\n size = \"medium\"\n}: RelationSelectorFieldProps) {\n\n return (\n <RelationSelector\n disabled={disabled}\n size={size}\n value={internalValue || null}\n onValueChange={(newVal) => updateValue(newVal ?? null)}\n relation={relation}\n fixedFilter={fixedFilter}\n />\n );\n}\n","import React from \"react\";\nimport { ArrayProperty, DateProperty, Entity, EntityReference, EntityRelation, NumberProperty, Property, ReferenceProperty, RelationProperty, StringProperty } from \"@rebasepro/types\";\nimport { TableSize, useCustomizationController } from \"@rebasepro/app\";\nimport {\n VirtualTableInput,\n VirtualTableNumberInput,\n VirtualTableSwitch,\n VirtualTableDateField\n} from \"@rebasepro/ui\";\n\nimport { VirtualTableSelect } from \"./fields/VirtualTableSelect\";\nimport { VirtualTableUserSelect } from \"./fields/VirtualTableUserSelect\";\nimport { TableStorageUpload } from \"./fields/TableStorageUpload\";\nimport { TableReferenceField } from \"./fields/TableReferenceField\";\nimport { TableRelationField } from \"./fields/TableRelationField\";\nimport { TableRelationSelectorField } from \"./fields/TableRelationSelectorField\";\n\nimport { getPreviewSizeFrom } from \"../../preview/util\";\n\nexport interface TableFieldBindingProps<T = unknown> {\n propertyKey: string;\n property: Property;\n internalValue: T;\n updateValue: (newValue: T | null) => void;\n error?: Error;\n validationError?: Error;\n disabled: boolean;\n selected: boolean;\n size: TableSize;\n align: \"left\" | \"center\" | \"right\";\n entity: Entity<Record<string, unknown>>;\n path: string;\n openPopup?: (cellRect: DOMRect | undefined) => void;\n}\n\nexport interface TableFieldConfig {\n Component: React.ComponentType<TableFieldBindingProps>;\n fullHeight?: boolean;\n allowScroll?: boolean;\n removePadding?: boolean;\n showExpandIcon?: boolean;\n hideOverflow?: boolean;\n includeActions?: boolean;\n}\n\nexport function isStorageProperty(property: Property) {\n if (property.type === \"string\" && property.ui?.markdown)\n return false;\n if (property.type === \"string\" && (property as StringProperty).storage)\n return true;\n if (property.type === \"array\") {\n if (Array.isArray(property.of)) {\n return false;\n } else {\n return ((property as ArrayProperty).of as Property)?.type === \"string\" &&\n ((property as ArrayProperty).of as StringProperty)?.storage\n }\n }\n return false;\n}\n\nexport function getTableBindingForProperty(\n property: Property,\n selected: boolean\n): TableFieldConfig | undefined {\n const isAStorageProperty = isStorageProperty(property);\n\n if (isAStorageProperty) {\n return {\n Component: ({ validationError, error, disabled, selected, openPopup, property, entity, path, internalValue, size, updateValue, propertyKey }: TableFieldBindingProps) => (\n <TableStorageUpload\n error={validationError ?? error}\n disabled={disabled}\n focused={selected}\n selected={selected}\n openPopup={openPopup}\n property={property as StringProperty | ArrayProperty}\n entity={entity}\n path={path}\n value={internalValue as string | string[] | null}\n previewSize={getPreviewSizeFrom(size)}\n updateValue={updateValue}\n propertyKey={propertyKey}\n />\n ),\n includeActions: false,\n showExpandIcon: true,\n fullHeight: true,\n removePadding: true\n };\n } else if (selected && property.type === \"number\") {\n const numberProperty = property as NumberProperty;\n if (numberProperty.enum) {\n return {\n Component: ({ propertyKey, disabled, selected, size, error, validationError, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableSelect\n name={propertyKey}\n multiple={false}\n disabled={disabled}\n focused={selected}\n valueType={\"number\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={numberProperty.enum!}\n error={validationError ?? error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />\n ),\n fullHeight: true\n };\n } else {\n return {\n Component: ({ align, error, validationError, selected, disabled, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableNumberInput\n align={align}\n error={validationError ?? error}\n focused={selected}\n disabled={disabled}\n value={internalValue as number}\n updateValue={updateValue}\n />\n ),\n allowScroll: true\n };\n }\n } else if (selected && property.type === \"string\") {\n const stringProperty = property as StringProperty;\n if (stringProperty.enum) {\n return {\n Component: ({ propertyKey, disabled, selected, size, error, validationError, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableSelect\n name={propertyKey}\n multiple={false}\n focused={selected}\n disabled={disabled}\n valueType={\"string\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={stringProperty.enum!}\n error={validationError ?? error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />\n ),\n fullHeight: true\n };\n } else if (stringProperty.userSelect) {\n return {\n Component: ({ propertyKey, disabled, selected, size, error, validationError, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableUserSelect\n name={propertyKey}\n multiple={false}\n focused={selected}\n disabled={disabled}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n error={validationError ?? error}\n internalValue={internalValue as string}\n updateValue={updateValue}\n />\n ),\n fullHeight: true\n };\n } else if (stringProperty.ui?.markdown || !stringProperty.storage) {\n const multiline = Boolean(stringProperty.ui?.multiline) || Boolean(stringProperty.ui?.markdown);\n return {\n Component: ({ error, validationError, disabled, selected, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableInput\n error={validationError ?? error}\n disabled={disabled}\n multiline={multiline}\n focused={selected}\n value={internalValue as string}\n updateValue={updateValue}\n />\n ),\n allowScroll: true\n };\n }\n } else if (property.type === \"boolean\") {\n return {\n Component: ({ error, validationError, disabled, selected, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableSwitch\n error={validationError ?? error}\n disabled={disabled}\n focused={selected}\n internalValue={internalValue as boolean}\n updateValue={updateValue}\n />\n )\n };\n } else if (property.type === \"date\") {\n return {\n Component: ({ propertyKey, error, validationError, disabled, selected, property, internalValue, updateValue }: TableFieldBindingProps) => {\n const { locale } = useCustomizationController();\n return (\n <VirtualTableDateField\n name={propertyKey}\n error={validationError ?? error}\n disabled={disabled}\n mode={(property as DateProperty).mode}\n focused={selected}\n internalValue={internalValue as Date}\n updateValue={updateValue}\n locale={locale}\n />\n );\n },\n fullHeight: true,\n hideOverflow: false,\n allowScroll: false\n };\n } else if (property.type === \"reference\") {\n if ((property as ReferenceProperty).path) {\n return {\n Component: ({ propertyKey, internalValue, updateValue, disabled, size, property }: TableFieldBindingProps) => {\n return (\n <TableReferenceField\n name={propertyKey}\n internalValue={internalValue as EntityReference}\n updateValue={updateValue}\n disabled={disabled}\n size={size}\n path={(property as ReferenceProperty).path!}\n multiselect={false}\n previewProperties={(property as ReferenceProperty).ui?.previewProperties}\n includeId={(property as ReferenceProperty).includeId}\n includeEntityLink={(property as ReferenceProperty).includeEntityLink}\n title={property.name ?? propertyKey}\n fixedFilter={(property as ReferenceProperty).fixedFilter}\n />\n );\n },\n allowScroll: false\n };\n }\n } else if (property.type === \"relation\") {\n if ((property as RelationProperty).relation) {\n if ((property as RelationProperty).ui?.widget === \"dialog\") {\n return {\n Component: RelationDialogBindingComponent,\n allowScroll: false\n };\n } else {\n return {\n Component: RelationSelectorBindingComponent,\n allowScroll: false\n };\n }\n }\n } else if (property.type === \"array\") {\n const arrayProperty = (property as ArrayProperty);\n\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(\"You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property\");\n } else if (arrayProperty.of && !Array.isArray(arrayProperty.of)) {\n const ofProp = arrayProperty.of as Property;\n if (ofProp.type === \"string\" || ofProp.type === \"number\") {\n if (selected && ofProp.enum) {\n return {\n Component: ({ propertyKey, disabled, selected, size, error, validationError, internalValue, updateValue }: TableFieldBindingProps) => (\n <VirtualTableSelect\n name={propertyKey}\n multiple={true}\n disabled={disabled}\n focused={selected}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n valueType={ofProp.type}\n enumValues={ofProp.enum!}\n error={validationError ?? error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />\n ),\n allowScroll: true,\n fullHeight: true,\n hideOverflow: false\n };\n }\n } else if (ofProp.type === \"reference\") {\n const refOfProp = ofProp as ReferenceProperty;\n if (refOfProp.path) {\n return {\n Component: ({ propertyKey, disabled, internalValue, updateValue, size }: TableFieldBindingProps) => (\n <TableReferenceField\n name={propertyKey}\n disabled={disabled}\n internalValue={internalValue as EntityReference[]}\n updateValue={updateValue}\n size={size}\n multiselect={true}\n path={refOfProp.path!}\n previewProperties={refOfProp.ui?.previewProperties}\n title={arrayProperty.name}\n fixedFilter={refOfProp.fixedFilter}\n includeId={refOfProp.includeId}\n includeEntityLink={refOfProp.includeEntityLink}\n />\n ),\n allowScroll: false\n };\n }\n }\n }\n }\n\n return undefined;\n}\n\n/** Stable component for relation fields rendered with the dialog widget */\nfunction RelationDialogBindingComponent({ propertyKey, internalValue, updateValue, disabled, size, property }: TableFieldBindingProps) {\n const relProp = property as RelationProperty;\n return (\n <TableRelationField\n name={propertyKey}\n internalValue={internalValue as EntityRelation}\n updateValue={updateValue}\n disabled={disabled}\n size={size}\n multiselect={false}\n relation={relProp.relation!}\n previewProperties={relProp.ui?.previewProperties}\n includeId={relProp.includeId}\n includeEntityLink={relProp.includeEntityLink}\n title={relProp.name ?? propertyKey}\n fixedFilter={relProp.fixedFilter}\n />\n );\n}\n\n/** Stable component for relation fields rendered with the inline selector */\nfunction RelationSelectorBindingComponent({ propertyKey, internalValue, updateValue, disabled, property }: TableFieldBindingProps) {\n const relProp = property as RelationProperty;\n return (\n <TableRelationSelectorField\n name={propertyKey}\n internalValue={internalValue as EntityRelation}\n updateValue={updateValue}\n disabled={disabled}\n size={\"small\"}\n relation={relProp.relation!}\n fixedFilter={relProp.fixedFilter}\n />\n );\n}\n","import type { Properties } from \"@rebasepro/types\";\nimport type { ArrayProperty, MapProperty, NumberProperty, Property, BooleanProperty, DateProperty, GeopointProperty, ReferenceProperty, RelationProperty, StringProperty, VectorProperty, BinaryProperty } from \"@rebasepro/types\";\n;\nimport { z, ZodTypeAny } from \"zod\";\nimport { enumToObjectEntries, isPropertyBuilder } from \"@rebasepro/common\";\nimport { getValueInPath, hydrateRegExp } from \"@rebasepro/utils\";\n\nexport type CustomFieldValidator = (props: {\n name: string,\n value: unknown,\n property: Property,\n entityId?: string | number,\n parentProperty?: MapProperty | ArrayProperty,\n}) => Promise<boolean>;\n\ninterface PropertyContext<P extends Property> {\n property: P,\n parentProperty?: MapProperty | ArrayProperty,\n entityId?: string | number,\n customFieldValidator?: CustomFieldValidator,\n name?: string\n}\n\nexport function getEntitySchema<M extends Record<string, unknown>>(\n entityId: string | number | undefined,\n properties: Properties,\n customFieldValidator?: CustomFieldValidator): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n Object.entries(properties as Record<string, Property>)\n .forEach(([name, property]) => {\n const isStringOrNumber = property.type === \"string\" || property.type === \"number\";\n const isIdAndAuto = isStringOrNumber && \"isId\" in property && typeof property.isId === \"string\" && property.isId !== \"manual\";\n if (entityId === undefined && isIdAndAuto) {\n return; // Skip validation for auto-generated IDs on new entities\n }\n shape[name] = mapPropertyToZod({\n property: property as Property,\n customFieldValidator,\n name,\n entityId\n });\n });\n return z.object(shape).passthrough();\n}\n\n\nexport function mapPropertyToZod(propertyContext: PropertyContext<Property>): ZodTypeAny {\n\n const property = propertyContext.property;\n if (isPropertyBuilder(property) && !property.type) {\n console.error(\"Error in property\", propertyContext);\n // Return a schema that always fails\n return z.any().refine(\n () => false,\n { message: \"Invalid property configuration: property builder should be resolved\" }\n );\n }\n\n if (property.type === \"string\") {\n return getZodStringSchema(propertyContext as PropertyContext<StringProperty>);\n } else if (property.type === \"number\") {\n return getZodNumberSchema(propertyContext as PropertyContext<NumberProperty>);\n } else if (property.type === \"boolean\") {\n return getZodBooleanSchema(propertyContext as PropertyContext<BooleanProperty>);\n } else if (property.type === \"map\") {\n return getZodMapObjectSchema(propertyContext as PropertyContext<MapProperty>);\n } else if (property.type === \"array\") {\n return getZodArraySchema(propertyContext as PropertyContext<ArrayProperty>);\n } else if (property.type === \"date\") {\n return getZodDateSchema(propertyContext as PropertyContext<DateProperty>);\n } else if (property.type === \"geopoint\") {\n return getZodGeoPointSchema(propertyContext as PropertyContext<GeopointProperty>);\n } else if (property.type === \"reference\") {\n return getZodReferenceSchema(propertyContext as PropertyContext<ReferenceProperty>);\n } else if (property.type === \"relation\") {\n return getZodRelationSchema(propertyContext as PropertyContext<RelationProperty>);\n } else if (property.type === \"vector\") {\n return getZodVectorSchema(propertyContext as PropertyContext<VectorProperty>);\n } else if (property.type === \"binary\") {\n return getZodBinarySchema(propertyContext as PropertyContext<BinaryProperty>);\n }\n\n // Log the error but don't crash the form\n console.error(\"Unsupported data type in zod mapping\", property);\n const dataType = \"dataType\" in (property as Record<string, unknown>) ? String((property as Record<string, unknown>).dataType) : \"unknown\";\n return z.any().refine(\n () => false,\n { message: `Unsupported data type: ${dataType}` }\n );\n}\n\n\nexport function getZodMapObjectSchema({\n property,\n entityId,\n customFieldValidator,\n name\n}: PropertyContext<MapProperty>): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n const validation = property.validation;\n if (property.properties)\n Object.entries(property.properties).forEach(([childName, childProperty]) => {\n const typedChildProperty = childProperty as Readonly<Property>;\n try {\n shape[childName] = mapPropertyToZod({\n property: typedChildProperty,\n parentProperty: property as MapProperty,\n customFieldValidator,\n name: `${name}[${childName}]`,\n entityId\n });\n } catch (e: unknown) {\n console.error(`Error creating validation schema for property ${childName}:`, e);\n shape[childName] = z.any().refine(\n () => false,\n { message: `Validation error: ${e instanceof Error ? e.message : \"Unknown error\"}` }\n );\n }\n });\n\n let schema: ZodTypeAny = z.object(shape).passthrough();\n if (validation?.required) {\n schema = schema.nullable().optional().refine(\n (value) => value !== undefined,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n } else {\n schema = schema.nullable().optional();\n }\n return schema;\n}\n\nfunction getZodStringSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<StringProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.string().nullable().optional();\n const validation = property.validation;\n\n const isRequired = validation?.required || property.isId === true || property.isId === \"manual\";\n\n if (property.enum) {\n if (isRequired) {\n schema = z.string().nullable().optional().refine(\n (value) => value !== undefined && value !== null && value !== \"\",\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n const entries = enumToObjectEntries(property.enum);\n const allowedValues = (isRequired ? entries : [...entries, null])\n .map((enumValueConfig) => enumValueConfig?.id ?? null);\n schema = schema.refine(\n (value: unknown) => allowedValues.includes(value as string | null),\n { message: `Must be one of: ${allowedValues.filter(Boolean).join(\", \")}` }\n );\n }\n\n if (isRequired && !property.enum) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null && value !== \"\",\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n if (validation) {\n\n if (validation.min || validation.min === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"string\" && value.length >= validation.min!),\n { message: `${property.name} must be min ${validation.min} characters long` }\n );\n if (validation.max || validation.max === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"string\" && value.length <= validation.max!),\n { message: `${property.name} must be max ${validation.max} characters long` }\n );\n if (validation.matches) {\n const regExp = typeof validation.matches === \"string\" ? hydrateRegExp(validation.matches) : validation.matches;\n if (regExp) {\n schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"string\" && regExp.test(value)),\n { message: validation.matchesMessage ?? \"Invalid format\" }\n );\n }\n }\n if (validation.trim) schema = z.preprocess((v: unknown) => typeof v === \"string\" ? v.trim() : v, schema);\n if (validation.lowercase) schema = z.preprocess((v: unknown) => typeof v === \"string\" ? v.toLowerCase() : v, schema);\n if (validation.uppercase) schema = z.preprocess((v: unknown) => typeof v === \"string\" ? v.toUpperCase() : v, schema);\n if (property.email) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"string\" && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)),\n { message: `${property.name} must be an email` }\n );\n if (property.ui?.url) {\n if (!property.storage || property.storage?.storeUrl) {\n schema = schema.refine(\n (value: unknown) => {\n if (value == null) return true;\n try {\n new URL(value as string);\n return true;\n } catch {\n return false;\n }\n },\n { message: `${property.name} must be a url` }\n );\n } else {\n console.warn(`Property ${property.name} has a url validation but its storage configuration is not set to store urls`);\n }\n }\n }\n return schema;\n}\n\nfunction getZodNumberSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<NumberProperty>): ZodTypeAny {\n const validation = property.validation;\n // Accept number or null, coerce non-numbers to fail\n let schema: ZodTypeAny = z.preprocess(\n (val) => {\n if (val === null || val === undefined) return null;\n if (typeof val === \"number\") return val;\n const n = Number(val);\n return isNaN(n) ? val : n; // pass through non-numeric to let refine catch it\n },\n z.number({ error: \"Must be a number\" }).nullable()\n );\n\n const isRequired = validation?.required || property.isId === true || property.isId === \"manual\";\n\n if (isRequired) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n if (validation) {\n\n if (validation.min || validation.min === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value >= validation.min!),\n { message: `${property.name} must be higher or equal to ${validation.min}` }\n );\n if (validation.max || validation.max === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value <= validation.max!),\n { message: `${property.name} must be lower or equal to ${validation.max}` }\n );\n if (validation.lessThan || validation.lessThan === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value < validation.lessThan!),\n { message: `${property.name} must be higher than ${validation.lessThan}` }\n );\n if (validation.moreThan || validation.moreThan === 0) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value > validation.moreThan!),\n { message: `${property.name} must be lower than ${validation.moreThan}` }\n );\n if (validation.positive) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value > 0),\n { message: `${property.name} must be positive` }\n );\n if (validation.negative) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && value < 0),\n { message: `${property.name} must be negative` }\n );\n if (validation.integer) schema = schema.refine(\n (value: unknown) => value == null || (typeof value === \"number\" && Number.isInteger(value)),\n { message: `${property.name} must be an integer` }\n );\n }\n return schema;\n}\n\nfunction getZodGeoPointSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<GeopointProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.object({}).passthrough().nullable().optional();\n const validation = property.validation;\n\n\n if (validation?.required) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null,\n { message: validation.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n return schema;\n}\n\nfunction getZodDateSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<DateProperty>): ZodTypeAny {\n if (property.autoValue) {\n return z.date().nullable().optional();\n }\n // Accept Date objects and null, reject everything else\n let schema: ZodTypeAny = z.custom<Date | null | undefined>(\n (v) => v === null || v === undefined || v instanceof Date,\n { message: \"Expected a Date\" }\n ).optional();\n const validation = property.validation;\n\n if (validation) {\n if (validation.required) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n if (validation.min) schema = schema.refine(\n (value: unknown) => value == null || (value instanceof Date && value >= validation.min!),\n { message: `${property.name} must be after ${validation.min}` }\n );\n if (validation.max) schema = schema.refine(\n (value: unknown) => value == null || (value instanceof Date && value <= validation.max!),\n { message: `${property.name} must be before ${validation.min}` }\n );\n }\n return schema;\n}\n\nfunction getZodReferenceSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<ReferenceProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.object({}).passthrough().nullable().optional();\n const validation = property.validation;\n\n if (validation) {\n if (validation.required) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n }\n return schema;\n}\n\nfunction getZodRelationSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<RelationProperty>): ZodTypeAny {\n const isMany = property.relation?.cardinality === \"many\";\n let schema: ZodTypeAny = isMany\n ? z.array(z.object({}).passthrough()).nullable().optional()\n : z.object({}).passthrough().nullable().optional();\n const validation = property.validation;\n\n if (validation) {\n if (validation.required) {\n schema = schema.refine(\n (value: unknown) => {\n if (isMany) {\n return value !== undefined && value !== null && Array.isArray(value) && value.length > 0;\n }\n return value !== undefined && value !== null;\n },\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n }\n return schema;\n}\n\nfunction getZodBooleanSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<BooleanProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean().nullable().optional();\n const validation = property.validation;\n\n if (validation) {\n if (validation.required) {\n schema = schema.refine(\n (value: unknown) => value !== undefined && value !== null,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n\n }\n return schema;\n}\n\nfunction hasUniqueInArrayModifier(property: Property): boolean | [string, Property][] {\n if (property.validation?.uniqueInArray) {\n return true;\n } else if (property.type === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .filter(([key, childProperty]) => (childProperty as Readonly<Property>).validation?.uniqueInArray) as [string, Property][];\n }\n return false;\n}\n\nfunction getZodArraySchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n}: PropertyContext<ArrayProperty>): ZodTypeAny {\n\n let arraySchema: ZodTypeAny = z.array(z.any()).nullable().optional();\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n const zodProperties: Record<string, ZodTypeAny> = {};\n (property.of as Property[]).forEach((p, index) => {\n try {\n zodProperties[`${name}[${index}]`] = mapPropertyToZod({\n property: p as Property,\n parentProperty: property,\n entityId\n });\n } catch (e: unknown) {\n console.error(`Error creating validation schema for array item ${index}:`, e);\n zodProperties[`${name}[${index}]`] = z.any().refine(\n () => false,\n { message: `Validation error: ${e instanceof Error ? e.message : \"Unknown error\"}` }\n );\n }\n });\n arraySchema = z.array(\n z.any().superRefine(async (object, ctx) => {\n // In Zod v4, ctx.path is not available in superRefine.\n // Instead, iterate all zodProperties and validate against each.\n for (const [key, zodProperty] of Object.entries(zodProperties)) {\n if (zodProperty) {\n const result = await (zodProperty as ZodTypeAny).safeParseAsync(object);\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n ctx.addIssue({\n code: \"custom\",\n message: issue.message\n });\n });\n }\n }\n }\n })\n ).nullable().optional();\n } else {\n try {\n const ofSchema = mapPropertyToZod({\n property: property.of,\n parentProperty: property,\n entityId\n });\n arraySchema = z.array(ofSchema).nullable().optional();\n } catch (e: unknown) {\n console.error(\"Error creating validation schema for array of property:\", e);\n arraySchema = z.array(z.any().refine(\n () => false,\n { message: `Validation error: ${e instanceof Error ? e.message : \"Unknown error\"}` }\n )).nullable().optional();\n }\n const arrayUniqueFields = hasUniqueInArrayModifier(property.of);\n if (arrayUniqueFields) {\n if (typeof arrayUniqueFields === \"boolean\") {\n arraySchema = arraySchema.refine(\n (values: unknown) => !values || !Array.isArray(values) || values.length === new Set(values).size,\n { message: `${property.name} should have unique values within the array` }\n );\n } else if (Array.isArray(arrayUniqueFields)) {\n arrayUniqueFields.forEach(([fieldName, childProperty]) => {\n arraySchema = arraySchema.refine(\n (values: unknown) => !values || !Array.isArray(values) || values.length === new Set(values.map((v: unknown) => v && typeof v === \"object\" ? (v as Record<string, unknown>)[fieldName] : v)).size,\n { message: `${property.name} → ${childProperty.name ?? fieldName}: should have unique values within the array` }\n );\n });\n }\n }\n }\n }\n const validation = property.validation;\n\n if (validation) {\n if (validation.required) {\n arraySchema = arraySchema.refine(\n (value: unknown) => value !== undefined && value !== null && Array.isArray(value) && value.length > 0,\n { message: validation?.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n if (validation.min || validation.min === 0) arraySchema = arraySchema.refine(\n (value: unknown) => !value || !Array.isArray(value) || value.length >= validation.min!,\n { message: `${property.name} should be min ${validation.min} entries long` }\n );\n if (validation.max) arraySchema = arraySchema.refine(\n (value: unknown) => !value || !Array.isArray(value) || value.length <= validation.max!,\n { message: `${property.name} should be max ${validation.max} entries long` }\n );\n // Handle uniqueInArray at the array level\n if (validation.uniqueInArray) {\n arraySchema = arraySchema.refine(\n (values: unknown) => !values || !Array.isArray(values) || values.length === new Set(values).size,\n { message: `${property.name} should have unique values within the array` }\n );\n }\n }\n return arraySchema;\n}\n\nfunction getZodVectorSchema({\n property\n}: PropertyContext<VectorProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.preprocess(\n (val: unknown) => {\n if (val && typeof val === \"object\" && \"__type\" in val && (val as Record<string, unknown>).__type === \"Vector\") {\n return (val as Record<string, unknown>).value;\n }\n if (val && typeof val === \"object\" && \"value\" in val && Array.isArray((val as Record<string, unknown>).value)) {\n return (val as Record<string, unknown>).value;\n }\n return val;\n },\n z.array(z.number()).nullable().optional()\n );\n\n if (property.dimensions) {\n schema = schema.refine(\n (val: unknown) => val === null || val === undefined || (Array.isArray(val) && val.length === property.dimensions),\n { message: `${property.name ?? \"Vector\"} must have exactly ${property.dimensions} dimensions` }\n );\n }\n\n if (property.validation?.required) {\n schema = schema.refine(\n (val: unknown) => val !== null && val !== undefined && Array.isArray(val) && val.length > 0,\n { message: property.validation?.requiredMessage ?? \"Required\" }\n );\n }\n\n return schema;\n}\n\nfunction getZodBinarySchema({\n property\n}: PropertyContext<BinaryProperty>): ZodTypeAny {\n let schema: ZodTypeAny = z.string().nullable().optional();\n const validation = property.validation;\n\n if (validation?.required) {\n schema = schema.nullable().optional().refine(\n (value: unknown) => value !== undefined && value !== null && value !== \"\",\n { message: validation.requiredMessage ? validation.requiredMessage : \"Required\" }\n );\n }\n return schema;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport useMeasure from \"react-use-measure\";\n\nimport { cls, Tooltip, iconSize } from \"@rebasepro/ui\";\nimport { ErrorBoundary, MinusCircleIcon } from \"@rebasepro/ui\";\nimport { getRowHeight, TableSize } from \"@rebasepro/app\";\nimport { ErrorTooltip } from \"@rebasepro/app\";\n\ninterface EntityTableCellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n /**\n * The value is used only to check changes and force re-renders\n */\n value?: unknown;\n disabled: boolean;\n savedTimestamp?: number;\n error?: Error;\n allowScroll?: boolean;\n align: \"right\" | \"left\" | \"center\";\n size: TableSize;\n disabledTooltip?: string;\n width: number;\n showExpandIcon?: boolean;\n removePadding?: boolean;\n fullHeight?: boolean;\n selected?: boolean;\n hideOverflow?: boolean;\n onSelect?: (cellRect: DOMRect | undefined) => void;\n // Sortable props for dnd-kit integration\n sortableNodeRef?: (node: HTMLElement | null) => void;\n sortableStyle?: React.CSSProperties;\n sortableAttributes?: Record<string, string | number | undefined>;\n isDragging?: boolean;\n isDraggable?: boolean;\n frozen?: boolean;\n}\n\ntype TableCellInnerProps = {\n justifyContent: string;\n scrollable: boolean;\n faded: boolean;\n fullHeight: boolean;\n children: React.ReactNode;\n}\n\nconst TableCellInner = ({\n justifyContent,\n scrollable,\n faded,\n fullHeight,\n children\n}: TableCellInnerProps) => {\n return (\n <div className={cls(\"flex flex-col max-h-full w-full\",\n {\n \"items-start\": faded || scrollable\n })}\n style={{\n justifyContent,\n height: fullHeight ? \"100%\" : undefined,\n overflow: scrollable ? \"auto\" : undefined,\n WebkitMaskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined,\n maskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined\n }}\n >\n {children}\n </div>\n );\n};\n\nexport const EntityTableCell = React.memo<EntityTableCellProps>(\n function EntityTableCell({\n children,\n actions,\n size,\n selected,\n disabled,\n disabledTooltip,\n savedTimestamp,\n error,\n align,\n allowScroll,\n removePadding,\n fullHeight,\n onSelect,\n width,\n hideOverflow = true,\n showExpandIcon = true,\n sortableNodeRef,\n sortableStyle,\n sortableAttributes,\n isDragging,\n isDraggable,\n frozen\n }: EntityTableCellProps) {\n\n const [measureRef, bounds] = useMeasure();\n const ref = useRef<HTMLDivElement>(null);\n\n const maxHeight = useMemo(() => getRowHeight(size), [size]);\n\n const [onHover, setOnHover] = useState(false);\n const [showSaved, setShowSaved] = useState(false);\n\n const showError = !disabled && Boolean(error);\n\n useEffect(() => {\n if (savedTimestamp && savedTimestamp > 0) {\n setShowSaved(true);\n const handler = setTimeout(() => {\n setShowSaved(false);\n }, 400);\n return () => {\n clearTimeout(handler);\n };\n }\n return undefined;\n }, [savedTimestamp]);\n\n let p = 0;\n if (!removePadding) {\n switch (size) {\n case \"l\":\n case \"xl\":\n p = 4;\n break;\n case \"m\":\n p = 2;\n break;\n case \"s\":\n default:\n p = 1;\n break;\n }\n }\n\n let justifyContent;\n switch (align) {\n case \"right\":\n justifyContent = \"flex-end\";\n break;\n case \"center\":\n justifyContent = \"center\";\n break;\n case \"left\":\n default:\n justifyContent = \"flex-start\";\n }\n\n // const onClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n // if (event.detail === 3) {\n // doOpenPopup();\n // }\n // }, [doOpenPopup]);\n\n const onSelectCallback = useCallback(() => {\n if (!onSelect) return;\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n if (disabled) {\n onSelect(undefined);\n } else if (!selected && cellRect) {\n onSelect(cellRect);\n }\n }, [ref, onSelect, selected, disabled]);\n\n const onFocus = useCallback((event: React.SyntheticEvent<HTMLDivElement>) => {\n event.stopPropagation();\n event.preventDefault();\n onSelectCallback();\n }, [onSelectCallback]);\n\n const isOverflowing = useMemo(() => {\n if (bounds) {\n return bounds.height > maxHeight;\n }\n return false;\n }, [bounds, maxHeight]);\n\n const isSelected = !showError && selected;\n\n const scrollable = !disabled && allowScroll && isOverflowing;\n const faded = !disabled && !allowScroll && isOverflowing;\n\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n const borderClass = showError\n ? \"border-red-500\"\n : isSelected\n ? \"border-primary\"\n : \"border-transparent\";\n\n const result = <>\n <div\n className={cls(\n \"transition-colors duration-500\",\n `flex relative h-full rounded-md p-${p} border-4`,\n showSaved ? \"bg-primary/20 dark:bg-primary/20\" : (onHover && !disabled ? \"bg-surface-50 dark:bg-surface-900\" : \"\"),\n hideOverflow ? \"overflow-hidden\" : \"\",\n isSelected && !showSaved ? \"bg-surface-accent-50 dark:bg-surface-accent-900\" : \"\",\n borderClass\n )}\n ref={ref}\n style={{\n justifyContent,\n alignItems: disabled || !isOverflowing ? \"center\" : undefined,\n width: width ?? \"100%\",\n textAlign: align\n }}\n tabIndex={selected || disabled ? undefined : 0}\n onFocus={onFocus}\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n >\n\n <ErrorBoundary>\n\n {fullHeight && !faded && children}\n\n {(!fullHeight || faded) && <TableCellInner\n fullHeight={fullHeight ?? false}\n justifyContent={justifyContent}\n scrollable={scrollable ?? false}\n faded={faded}>\n\n {!fullHeight && <div ref={measureRef}\n style={{\n display: \"flex\",\n width: \"100%\",\n justifyContent,\n height: fullHeight ? \"100%\" : undefined\n }}>\n {children}\n </div>}\n\n </TableCellInner>}\n </ErrorBoundary>\n\n {actions}\n\n {/*{disabled && onHover && disabledTooltip &&*/}\n {/* <div className=\"absolute top-1 right-1 text-xs\">*/}\n {/* <Tooltip title={disabledTooltip}>*/}\n {/* <MinusCircleIcon size={iconSize.smallest} color={\"disabled\"} className={\"text-text-disabled\"} />*/}\n {/* </Tooltip>*/}\n {/* </div>}*/}\n\n </div>\n </>;\n\n // Wrap with sortable outer div when sortable props are provided\n // Remove tabIndex from attributes to avoid capturing focus before cell content\n const { tabIndex: _tabIndex, ...sortableAttrsWithoutTabIndex } = sortableAttributes ?? {};\n const sortableContent = sortableNodeRef ? (\n <div\n ref={sortableNodeRef}\n style={sortableStyle}\n className={cls(\n \"flex-shrink-0\",\n frozen && \"sticky left-0 z-10 bg-white dark:bg-surface-900\"\n )}\n {...sortableAttrsWithoutTabIndex}\n >\n {showError ? (\n <ErrorTooltip\n className={\"flex h-full w-full\"}\n align={\"start\"}\n title={error?.message ?? \"Error\"}>\n {result}\n </ErrorTooltip>\n ) : result}\n </div>\n ) : (\n showError ? (\n <ErrorTooltip\n className={\"flex h-full w-full\"}\n align={\"start\"}\n title={error?.message ?? \"Error\"}>\n {result}\n </ErrorTooltip>\n ) : result\n );\n\n return sortableContent;\n }, (a, b) => {\n return a.error === b.error &&\n a.value === b.value &&\n a.disabled === b.disabled &&\n a.savedTimestamp === b.savedTimestamp &&\n a.allowScroll === b.allowScroll &&\n a.align === b.align &&\n a.size === b.size &&\n a.disabledTooltip === b.disabledTooltip &&\n a.width === b.width &&\n a.showExpandIcon === b.showExpandIcon &&\n a.removePadding === b.removePadding &&\n a.fullHeight === b.fullHeight &&\n a.selected === b.selected &&\n a.isDragging === b.isDragging &&\n a.isDraggable === b.isDraggable &&\n a.frozen === b.frozen;\n }) as React.FunctionComponent<EntityTableCellProps>;\n","import React, { useContext } from \"react\";\nimport { DataCollectionTableController } from \"@rebasepro/app\";\n\nexport const SelectableTableContext = React.createContext<DataCollectionTableController<Record<string, unknown>>>(null! as DataCollectionTableController<Record<string, unknown>>);\n\nexport const useSelectableTableController = <M extends Record<string, unknown> = Record<string, unknown>>() =>\n useContext(SelectableTableContext) as unknown as DataCollectionTableController<M>;\n","import { useCellSelected, createSelectionStore } from \"../SelectableTable/SelectionStore\";\nimport type { ArrayProperty, NumberProperty, Property, ReferenceProperty, StringProperty } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport { Entity, EntityReference, EntityRelation } from \"@rebasepro/types\";\n\nimport { getTableBindingForProperty } from \"./table_bindings\";\n\nimport { PropertyPreview } from \"../../preview\";\nimport { getPreviewSizeFrom } from \"../../preview/util\";\n\nimport { CustomFieldValidator, mapPropertyToZod } from \"../../form/validation\";\n\nimport { EntityTableCell } from \"./internal/EntityTableCell\";\nimport { EntityTableCellActions } from \"./internal/EntityTableCellActions\";\n\nimport { useSelectableTableController } from \"../SelectableTable/SelectableTableContext\";\nimport { useClearRestoreValue } from \"../../form/useClearRestoreValue\";\nimport { getRowHeight } from \"@rebasepro/app\";\nimport { isReadOnly } from \"@rebasepro/common\";\nimport { TableRelationField } from \"./fields/TableRelationField\";\nimport { TableRelationSelectorField } from \"./fields/TableRelationSelectorField\";\n\nexport interface PropertyTableCellProps<T> {\n propertyKey: string;\n columnIndex: number;\n align: \"right\" | \"left\" | \"center\";\n customFieldValidator?: CustomFieldValidator;\n value: T;\n readonly: boolean;\n property: Property;\n height: number;\n width: number;\n entity: Entity<any>;\n path: string;\n disabled: boolean;\n enablePopupIcon?: boolean;\n // Sortable props for dnd-kit integration\n sortableNodeRef?: (node: HTMLElement | null) => void;\n sortableStyle?: React.CSSProperties;\n sortableAttributes?: Record<string, any>;\n isDragging?: boolean;\n isDraggable?: boolean;\n frozen?: boolean;\n}\n\n\nexport const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(\n function PropertyTableCell<T, M extends Record<string, any>>({\n propertyKey,\n customFieldValidator,\n value,\n property,\n align,\n width,\n height,\n path,\n entity,\n readonly,\n disabled: disabledProp,\n enablePopupIcon = true,\n sortableNodeRef,\n sortableStyle,\n sortableAttributes,\n isDragging,\n isDraggable,\n frozen\n }: PropertyTableCellProps<T>) {\n\n const {\n onValueChange,\n size,\n selectionStore,\n select,\n setPopupCell\n } = useSelectableTableController();\n\n const dummySelectionStore = useMemo(() => createSelectionStore(), []);\n const activeSelectionStore = selectionStore || dummySelectionStore;\n const selected = useCellSelected(activeSelectionStore, propertyKey, entity.path, entity.id);\n\n const [internalValue, setInternalValue] = useState<any | null>(value);\n const internalValueRef = useRef(value);\n\n const [error, setError] = useState<Error | undefined>();\n const [validationError, setValidationError] = useState<Error | undefined>();\n const [savedTimestamp, setSavedTimestamp] = useState<number>(0);\n\n const onValueUpdated = useCallback(() => {\n setSavedTimestamp(Date.now());\n }, []);\n\n const customField = Boolean(property.ui?.Field);\n const customPreview = Boolean(property.ui?.Preview);\n const readOnlyProperty = isReadOnly(property);\n const disabledTooltip: string | undefined = typeof property.ui?.disabled === \"object\" ? property.ui?.disabled.disabledMessage : undefined;\n const disabled = readonly || disabledProp || Boolean(property.ui?.disabled);\n\n const validation = useMemo(() => mapPropertyToZod({\n property,\n entityId: entity.id,\n customFieldValidator,\n name: propertyKey\n }), [entity.id, property, propertyKey]);\n\n useEffect(\n () => {\n if (!equal(value, internalValueRef.current)) {\n setValidationError(undefined);\n setInternalValue(value);\n internalValueRef.current = value;\n onValueUpdated();\n }\n },\n [onValueUpdated, value]\n );\n\n const saveValues = async (value: unknown) => {\n if (equal(value, internalValueRef.current))\n return;\n const result = await validation.safeParseAsync(value);\n if (result.success) {\n setValidationError(undefined);\n internalValueRef.current = value as T;\n if (onValueChange) {\n try {\n onValueChange({\n value,\n propertyKey,\n setError,\n onValueUpdated,\n data: entity\n });\n } catch (e: unknown) {\n console.error(\"onValueChange error\", e);\n setError(e instanceof Error ? e : new Error(String(e)));\n }\n\n }\n } else {\n setValidationError(result.error);\n }\n };\n\n useEffect(() => {\n validation\n .safeParseAsync(internalValue)\n .then((result) => {\n if (result.success) {\n setValidationError(undefined);\n } else {\n setValidationError(result.error);\n }\n });\n }, [internalValue, validation, propertyKey, property, entity]);\n\n const updateValue = (newValue: unknown | null) => {\n\n let updatedValue: unknown;\n if (newValue === undefined) {\n updatedValue = null;\n } else {\n updatedValue = newValue;\n }\n setInternalValue(updatedValue);\n saveValues(updatedValue);\n };\n\n useClearRestoreValue<unknown>({\n property,\n value: internalValue,\n setValue: updateValue\n });\n\n const onSelect = useCallback((cellRect: DOMRect | undefined) => {\n if (!cellRect) {\n select(undefined);\n } else {\n select({\n width,\n height,\n entityPath: entity.path,\n entityId: entity.id,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>\n });\n }\n }, [entity, height, propertyKey, select, width]);\n\n const openPopup = (cellRect: DOMRect | undefined) => {\n if (!setPopupCell)\n return;\n if (!cellRect) {\n setPopupCell(undefined);\n } else {\n setPopupCell({\n width,\n height,\n entityPath: entity.path,\n entityId: entity.id,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>\n });\n }\n };\n\n let innerComponent: React.ReactNode | undefined;\n let allowScroll = false;\n let showExpandIcon = false;\n let hideOverflow = true;\n let removePadding = false;\n let fullHeight = false;\n let includeActions = true;\n const showError = !disabled && error;\n\n if (readonly || readOnlyProperty) {\n return <EntityTableCell\n size={size}\n width={width}\n savedTimestamp={savedTimestamp}\n key={`${propertyKey}_${entity.path}_${entity.id}`}\n value={internalValue}\n align={align ?? \"left\"}\n fullHeight={false}\n disabledTooltip={disabledTooltip ?? (readOnlyProperty ? \"Read only\" : undefined)}\n disabled={true}\n sortableNodeRef={sortableNodeRef}\n sortableStyle={sortableStyle}\n sortableAttributes={sortableAttributes}\n isDragging={isDragging}\n isDraggable={isDraggable}\n frozen={frozen}>\n <PropertyPreview\n width={width}\n height={getRowHeight(size)}\n propertyKey={propertyKey}\n property={property}\n value={internalValue}\n size={getPreviewSizeFrom(size)}\n />\n </EntityTableCell>;\n }\n\n if (!customField && (!customPreview || selected)) {\n const tableBinding = getTableBindingForProperty(property, selected);\n\n if (tableBinding) {\n const Component = tableBinding.Component;\n innerComponent = <Component\n propertyKey={propertyKey}\n property={property}\n internalValue={internalValue}\n updateValue={updateValue}\n error={error}\n validationError={validationError}\n disabled={disabled}\n selected={selected}\n size={size}\n align={align}\n entity={entity}\n path={path}\n openPopup={setPopupCell ? openPopup : undefined}\n />;\n\n allowScroll = tableBinding.allowScroll ?? false;\n includeActions = tableBinding.includeActions ?? true;\n showExpandIcon = tableBinding.showExpandIcon ?? false;\n fullHeight = tableBinding.fullHeight ?? false;\n removePadding = tableBinding.removePadding ?? false;\n if (tableBinding.hideOverflow !== undefined) hideOverflow = tableBinding.hideOverflow;\n }\n }\n\n if (!innerComponent) {\n allowScroll = false;\n showExpandIcon = enablePopupIcon && selected && !innerComponent && !disabled && !readOnlyProperty;\n innerComponent = (\n <PropertyPreview width={width}\n height={height}\n propertyKey={propertyKey as string}\n value={internalValue}\n property={property}\n size={getPreviewSizeFrom(size)}\n />\n );\n }\n\n return (\n <EntityTableCell\n key={`cell_${propertyKey}_${entity.path}_${entity.id}`}\n size={size}\n width={width}\n onSelect={onSelect}\n selected={selected}\n disabled={disabled || readOnlyProperty}\n disabledTooltip={disabledTooltip ?? \"Disabled\"}\n removePadding={removePadding}\n fullHeight={fullHeight}\n savedTimestamp={savedTimestamp}\n error={validationError ?? error}\n align={align}\n allowScroll={allowScroll}\n showExpandIcon={showExpandIcon}\n value={internalValue}\n hideOverflow={hideOverflow}\n sortableNodeRef={sortableNodeRef}\n sortableStyle={sortableStyle}\n sortableAttributes={sortableAttributes}\n isDragging={isDragging}\n isDraggable={isDraggable}\n frozen={frozen}\n actions={includeActions && <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={showExpandIcon}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}/>}\n >\n\n {innerComponent}\n\n </EntityTableCell>\n );\n\n },\n areEqual) as React.FunctionComponent<PropertyTableCellProps<any>>;\n\nfunction areEqual(prevProps: PropertyTableCellProps<any>, nextProps: PropertyTableCellProps<any>) {\n return prevProps.height === nextProps.height &&\n prevProps.propertyKey === nextProps.propertyKey &&\n prevProps.align === nextProps.align &&\n prevProps.width === nextProps.width &&\n equal(prevProps.property, nextProps.property) &&\n equal(prevProps.value, nextProps.value) &&\n prevProps.entity.id === nextProps.entity.id &&\n prevProps.entity.path === nextProps.entity.path &&\n prevProps.isDragging === nextProps.isDragging &&\n prevProps.isDraggable === nextProps.isDraggable &&\n prevProps.frozen === nextProps.frozen\n ;\n}\n","import type { SideDialogsController } from \"@rebasepro/types\";\nimport React from \"react\";\n;\n\nexport const SideDialogsControllerContext = React.createContext<SideDialogsController>({} as SideDialogsController);\n","import React from \"react\";\nimport { SideDialogsControllerContext } from \"../contexts/SideDialogsControllerContext\";\nimport { useContext } from \"react\";\n\n/**\n * Hook to retrieve the side dialogs' controller.\n *\n * This hook allows you to open and close side dialogs. This is the mechanism\n * used when open a side entity dialog, or when selecting a reference.\n *\n * If you want to open a side entity dialog, you can use the {@link useSidePanel}\n * hook.\n *\n * If you want to select a reference, you can use the {@link useReferenceDialog}\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @group Hooks and utilities\n */\nimport { SideDialogPanelProps, SideDialogsController } from \"@rebasepro/types\";\n\nexport type { SideDialogPanelProps, SideDialogsController };\n\nexport const useSideDialogsController = (): SideDialogsController => useContext(SideDialogsControllerContext);\n","import type { NavigationStateController } from \"@rebasepro/types\";\nimport React, { createContext } from \"react\";\n\n\nexport const NavigationStateContext = createContext<NavigationStateController>({\n loading: true,\n refreshNavigation: () => { }\n});\n\nexport function useNavigationStateController(): NavigationStateController {\n const context = React.useContext(NavigationStateContext);\n if (context === undefined) {\n throw new Error(\"useNavigationStateController must be used within a NavigationStateContext.Provider\");\n }\n return context;\n}\n","import type { UrlController } from \"@rebasepro/types\";\nimport React, { createContext } from \"react\";\n\n\n\nexport const UrlContext = createContext<UrlController>({\n basePath: \"/\",\n baseCollectionPath: \"/c\",\n urlPathToDataPath: () => \"\",\n homeUrl: \"/\",\n isUrlCollectionPath: () => false,\n buildUrlCollectionPath: () => \"\",\n buildAppUrlPath: () => \"\",\n resolveDatabasePathsFrom: () => \"\",\n navigate: () => { }\n});\n\nexport function useUrlController(): UrlController {\n const context = React.useContext(UrlContext);\n if (context === undefined) {\n throw new Error(\"useUrlController must be used within a UrlContext.Provider\");\n }\n return context;\n}\n","import { useMemo } from \"react\";\nimport { useRebaseContext } from \"@rebasepro/app\";\nimport type {\n AuthController,\n RebaseContext,\n SideDialogsController,\n SidePanelController,\n User\n} from \"@rebasepro/types\";\nimport type {\n CollectionRegistryController,\n NavigationStateController,\n UrlController\n} from \"@rebasepro/types\";\nimport { useSidePanel } from \"./useSidePanel\";\nimport { useSideDialogsController } from \"./useSideDialogsController\";\nimport {\n useUrlController,\n useNavigationStateController,\n useCollectionRegistryController\n} from \"./navigation/contexts\";\n\n/**\n * The CMS context extends the core RebaseContext with CMS-specific\n * controllers that are only available inside the CMS routing tree.\n *\n * Use {@link useCMSContext} to obtain an instance.\n * @group Hooks and utilities\n */\nexport type CMSContext<\n DB = Record<string, unknown>,\n USER extends User = User,\n AuthControllerType extends AuthController<USER> = AuthController<USER>\n> = RebaseContext<USER, AuthControllerType> & {\n sidePanelController: SidePanelController;\n sideDialogsController: SideDialogsController;\n urlController: UrlController;\n navigationStateController: NavigationStateController;\n collectionRegistryController: CollectionRegistryController<DB>;\n};\n\n/**\n * Hook that builds a fully-populated CMS context by combining the\n * core {@link RebaseContext} with CMS-specific controllers.\n *\n * Use this instead of `useRebaseContext()` in CMS components that\n * need to pass context to entity action callbacks, plugin slots,\n * or any consumer that expects CMS controllers on the context object.\n *\n * @group Hooks and utilities\n */\nexport function useCMSContext<\n DB = Record<string, unknown>,\n USER extends User = User,\n AuthControllerType extends AuthController<USER> = AuthController<USER>\n>(): CMSContext<DB, USER, AuthControllerType> {\n const baseContext = useRebaseContext<USER, AuthControllerType>();\n const sidePanelController = useSidePanel();\n const sideDialogsController = useSideDialogsController();\n const urlController = useUrlController();\n const navigationStateController = useNavigationStateController();\n const collectionRegistryController = useCollectionRegistryController<DB>();\n\n return useMemo(() => ({\n ...baseContext,\n sidePanelController,\n sideDialogsController,\n urlController,\n navigationStateController,\n collectionRegistryController\n }), [\n baseContext,\n sidePanelController,\n sideDialogsController,\n urlController,\n navigationStateController,\n collectionRegistryController\n ]);\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport type { EntityAction } from \"@rebasepro/types\";\nimport React, { MouseEvent, useCallback } from \"react\";\n\nimport { CollectionSize, Entity, SelectionController } from \"@rebasepro/types\";\nimport {\n Badge,\n Checkbox,\n cls,\n IconButton,\n Menu,\n MenuItem,\n MoreVerticalIcon,\n Skeleton,\n Tooltip\n} from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\nimport { getEntityFromCache } from \"@rebasepro/app\";\nimport { getLocalChangesBackup } from \"@rebasepro/common\";\nimport { useCMSContext } from \"../../hooks/useCMSContext\";\n\n/**\n *\n * @param entity\n * @param width\n * @param frozen\n * @param isSelected\n * @param selectionEnabled\n * @param size\n * @param toggleEntitySelection\n * @param hideId\n *\n * @group Collection components\n */\nexport const CollectionRowActions = function CollectionRowActions({\n entity,\n collection,\n path,\n width,\n frozen,\n isSelected,\n selectionEnabled,\n size,\n highlightEntity,\n onCollectionChange,\n unhighlightEntity,\n actions = [],\n hideId,\n selectionController,\n openEntityMode,\n sortableNodeRef,\n sortableStyle,\n sortableAttributes,\n isDragging,\n isDraggable\n}:\n {\n entity: Entity<any>,\n collection?: CollectionConfig<any>,\n path?: string,\n width: number,\n frozen?: boolean,\n size: CollectionSize,\n isSelected?: boolean,\n selectionEnabled?: boolean,\n actions?: EntityAction[],\n hideId?: boolean,\n onCollectionChange?: () => void,\n selectionController?: SelectionController;\n highlightEntity?: (entity: Entity<any>) => void;\n unhighlightEntity?: (entity: Entity<any>) => void;\n openEntityMode: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n // Sortable props for dnd-kit integration\n sortableNodeRef?: (node: HTMLElement | null) => void;\n sortableStyle?: React.CSSProperties;\n sortableAttributes?: Record<string, any>;\n isDragging?: boolean;\n isDraggable?: boolean;\n }) {\n\n\n const context = useCMSContext();\n const sidePanelCtrl = context.sidePanelController;\n const { t } = useTranslation();\n\n const onCheckedChange = useCallback((checked: boolean) => {\n selectionController?.toggleEntitySelection(entity, checked);\n }, [entity, selectionController?.toggleEntitySelection]);\n\n const hasActions = actions.length > 0;\n const hasCollapsedActions = actions.some(a => a.collapsed || a.collapsed === undefined);\n\n const collapsedActions = actions.filter(a => a.collapsed || a.collapsed === undefined);\n const uncollapsedActions = actions.filter(a => a.collapsed === false);\n const enableLocalChangesBackup = collection ? getLocalChangesBackup(collection) : false;\n const hasDraft = enableLocalChangesBackup ? getEntityFromCache(path + \"/\" + entity.id) : false;\n const iconSize = \"small\" as const;\n\n const content = (\n <div\n className={cls(\n \"h-full flex items-center justify-center flex-col z-10\",\n isSelected\n ? \"bg-surface-accent-50 dark:bg-surface-accent-900\"\n : \"bg-surface-50/90 dark:bg-surface-900/90\",\n frozen ? \"sticky left-0\" : \"\"\n )}\n onClick={useCallback((event: React.MouseEvent) => {\n event.stopPropagation();\n }, [])}\n style={{\n width,\n position: frozen ? \"sticky\" : \"initial\",\n left: frozen ? 0 : \"initial\",\n contain: \"strict\"\n }}>\n\n {(hasActions || selectionEnabled) &&\n <div className=\"flex items-center justify-center gap-0.5\">\n\n {uncollapsedActions.map((action, index) => {\n const isEditAction = action.key === \"edit\";\n const tooltip = isEditAction && hasDraft ? t(\"unsaved_local_changes\") : action.name;\n\n let iconButton = <IconButton\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n action.onClick({\n view: \"collection\",\n entity,\n path,\n collection,\n context,\n sidePanelController: sidePanelCtrl,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange,\n openEntityMode: openEntityMode ?? collection?.openEntityMode\n });\n }}\n size={iconSize}>\n {action.icon}\n </IconButton>;\n if (isEditAction && hasDraft) {\n iconButton = (\n <Badge color={\"warning\"}>\n {iconButton}\n </Badge>\n );\n }\n return (\n <Tooltip key={index}\n title={tooltip}\n asChild={true}>\n {iconButton}\n </Tooltip>\n );\n })}\n\n {hasCollapsedActions &&\n <Menu\n trigger={<IconButton\n size={iconSize}>\n <MoreVerticalIcon/>\n </IconButton>}>\n {collapsedActions.map((action, index) => (\n <MenuItem\n key={index}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick({\n view: \"collection\",\n entity,\n path,\n collection,\n context,\n sidePanelController: sidePanelCtrl,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange,\n openEntityMode: openEntityMode ?? collection?.openEntityMode\n });\n }}>\n {action.icon}\n {action.name}\n </MenuItem>\n ))}\n </Menu>\n }\n\n {selectionEnabled &&\n <Tooltip title={`Select ${entity.id}`}>\n <Checkbox\n size={\"smallest\"}\n checked={Boolean(isSelected)}\n onCheckedChange={onCheckedChange}\n />\n </Tooltip>}\n\n </div>}\n\n {!hideId && size !== \"xs\" && (\n <div\n className=\"w-[138px] overflow-hidden truncate font-mono text-xs text-text-secondary dark:text-text-secondary-dark max-w-full text-ellipsis px-2 align-center justify-center flex items-center gap-1\"\n onClick={(event) => {\n event.stopPropagation();\n }}>\n <span className=\"min-w-0 truncate text-center\">\n {entity\n ? entity.id\n : <Skeleton/>\n }\n </span>\n </div>\n )}\n\n </div>\n );\n\n // Wrap with sortable outer div when sortable props are provided\n // Remove tabIndex from attributes to avoid capturing focus before cell content\n if (sortableNodeRef) {\n const { tabIndex: _tabIndex, ...sortableAttrsWithoutTabIndex } = sortableAttributes ?? {};\n return (\n <div\n ref={sortableNodeRef}\n style={sortableStyle}\n className={cls(\n \"flex-shrink-0\",\n frozen && \"sticky left-0 z-10 bg-white dark:bg-surface-900\"\n )}\n {...sortableAttrsWithoutTabIndex}\n >\n {content}\n </div>\n );\n }\n\n return content;\n\n};\n","import React from \"react\";\n\nimport { CircularProgress, cls, defaultBorderMixin, SearchBar } from \"@rebasepro/ui\";\nimport { useLargeLayout, useTranslation } from \"@rebasepro/app\";\n\ninterface CollectionTableToolbarProps {\n loading: boolean;\n actionsStart?: React.ReactNode;\n actions?: React.ReactNode;\n /**\n * View mode toggle button, positioned left of the search bar.\n */\n viewModeToggle?: React.ReactNode;\n title?: React.ReactNode,\n onTextSearch?: (searchString?: string) => void;\n /**\n * Initial search string to pre-populate the search bar (e.g. from URL params).\n */\n initialSearchText?: string;\n /**\n * When true the toolbar is in \"compact\" mode for the split-view left panel.\n * - Search bar, loading spinner, and view-mode toggle are hidden.\n * - Secondary actions remain inline (displayed horizontally).\n * - Only `actionsStart` (filters) and the add button (last child of `actions`) remain visible.\n */\n compact?: boolean;\n}\n\nexport function CollectionTableToolbar({\n actions,\n actionsStart,\n loading,\n onTextSearch,\n title,\n viewModeToggle,\n initialSearchText,\n compact = false\n}: CollectionTableToolbarProps) {\n\n const largeLayout = useLargeLayout();\n const { t } = useTranslation();\n\n // Split actions into \"primary\" (add button = last child) and \"secondary\" (everything else)\n const actionChildren = React.Children.toArray(actions);\n const addButton = actionChildren.length > 0 ? actionChildren[actionChildren.length - 1] : null;\n const secondaryActions = actionChildren.slice(0, -1);\n\n return (\n <div\n className={cls(defaultBorderMixin, \"no-scrollbar min-h-[52px] overflow-x-auto px-2 md:px-4 bg-surface-50 dark:bg-surface-900 border-b flex flex-row justify-between items-center w-full\")}>\n\n <div className=\"flex items-center gap-1 md:mr-4 mr-2 min-w-0\">\n\n {/* View toggle — hidden in compact */}\n {!compact && viewModeToggle}\n\n {title && <div className={\"flex items-center\"}>\n {title}\n </div>}\n\n {actionsStart}\n\n </div>\n\n <div className=\"flex items-center gap-1\">\n\n {/* Loading spinner — hidden in compact */}\n {largeLayout && !compact && loading && (\n <div className=\"mr-4\">\n <CircularProgress size={\"smallest\"}/>\n </div>\n )}\n\n {/* Search bar — hidden in compact */}\n {!compact && onTextSearch &&\n <SearchBar\n key={\"search-bar\"}\n size={\"small\"}\n placeholder={t(\"search\")}\n onTextSearch={onTextSearch}\n expandable={true}\n initialValue={initialSearchText}/>}\n\n {/* Secondary actions — always inline */}\n <div className=\"flex items-center gap-1\">\n {secondaryActions}\n </div>\n\n {/* Add button — always visible */}\n {addButton}\n\n </div>\n\n </div>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport type { ArrayProperty, Property } from \"@rebasepro/types\";\n\nexport function getTableCellAlignment(property: Property): \"right\" | \"left\" | \"center\" {\n if (property.type === \"boolean\") {\n return \"center\";\n } else if (property.type === \"number\") {\n if (property.enum)\n return \"left\";\n return \"right\";\n } else if (property.type === \"date\") {\n return \"right\";\n } else {\n return \"left\";\n }\n}\n\nexport function getTablePropertyColumnWidth(property: Property): number {\n\n if (property.ui?.columnWidth) {\n return property.ui?.columnWidth;\n }\n\n if (property.type === \"string\") {\n if (property.ui?.url) {\n return 280;\n } else if (property.storage) {\n return 160;\n } else if (property.enum) {\n return 200;\n } else if (property.ui?.multiline) {\n return 300;\n } else if (property.ui?.markdown) {\n return 300;\n } else if (property.email) {\n return 200;\n } else {\n return 200;\n }\n } else if (property.type === \"array\") {\n const arrayProperty = property as ArrayProperty;\n if (arrayProperty.of) {\n if (Array.isArray(property.of)) {\n return 300;\n } else {\n return getTablePropertyColumnWidth(arrayProperty.of as Property);\n }\n } else {\n return 300;\n }\n } else if (property.type === \"number\") {\n if (property.enum) {\n return 200;\n }\n return 140;\n } else if (property.type === \"map\") {\n return 360;\n } else if (property.type === \"date\") {\n return 200;\n } else if (property.type === \"reference\") {\n return 220;\n } else if (property.type === \"relation\") {\n return 280;\n } else if (property.type === \"boolean\") {\n return 140;\n } else {\n return 200;\n }\n}\n\nexport function getSubcollectionColumnId(collection: CollectionConfig) {\n return `subcollection:${collection.slug}`;\n}\n","import type { Properties, Property } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { getTableCellAlignment, getTablePropertyColumnWidth } from \"./internal/common\";\nimport { FilterValues } from \"@rebasepro/types\";\nimport { VirtualTableColumn } from \"@rebasepro/ui\";\nimport { getIconForProperty, getResolvedPropertyInPath } from \"../../util/property_utils\";\nimport { getColumnKeysForProperty } from \"@rebasepro/app\";\n\nexport function buildIdColumn(largeLayout?: boolean): VirtualTableColumn {\n return {\n key: \"id_ewcfedcswdf3\",\n width: (largeLayout ? 160 : 130),\n title: \"ID\",\n resizable: false,\n frozen: largeLayout ?? false,\n headerAlign: \"center\",\n align: \"center\"\n };\n}\n\nexport interface PropertiesToColumnsParams<M extends Record<string, unknown>> {\n properties: Properties;\n sortable?: boolean;\n fixedFilter?: FilterValues<keyof M extends string ? keyof M : never>;\n AdditionalHeaderWidget?: React.ComponentType<{\n property: Property,\n propertyKey: string,\n onHover: boolean,\n }>;\n}\n\nexport function propertiesToColumns<M extends Record<string, unknown>>({ properties, sortable, fixedFilter, AdditionalHeaderWidget }: PropertiesToColumnsParams<M>): VirtualTableColumn[] {\n const disabledFilter = Boolean(fixedFilter);\n return Object.entries<Property>(properties)\n .flatMap(([key, property]) => getColumnKeysForProperty(property, key))\n .map(({\n key,\n disabled\n }) => {\n const property = getResolvedPropertyInPath(properties, key) as Property;\n if (!property)\n throw Error(\"Internal error: no property found in path \" + key);\n const filterable = filterableProperty(property);\n return {\n key: key as string,\n align: getTableCellAlignment(property),\n icon: getIconForProperty(property, \"small\"),\n title: property.name ?? key as string,\n sortable: sortable,\n filter: !disabledFilter && filterable,\n width: getTablePropertyColumnWidth(property),\n resizable: true,\n custom: {\n resolvedProperty: property,\n disabled\n },\n AdditionalHeaderWidget: AdditionalHeaderWidget\n ? ({ onHover }: { onHover: boolean }) => <AdditionalHeaderWidget property={property} propertyKey={key} onHover={onHover}/>\n : undefined\n } satisfies VirtualTableColumn;\n });\n}\n\nfunction filterableProperty(property: Property, partOfArray = false): boolean {\n if (partOfArray) {\n return [\"string\", \"number\", \"date\", \"reference\", \"relation\"].includes(property.type);\n }\n if (property.type === \"array\") {\n if (property.of && !Array.isArray(property.of))\n return filterableProperty(property.of, true);\n else\n return false;\n }\n return [\"string\", \"number\", \"boolean\", \"date\", \"reference\", \"relation\", \"array\"].includes(property.type);\n}\n","import React, { useState } from \"react\";\nimport { EnumValuesChip } from \"../../../preview\";\nimport {\n IconButton,\n MultiSelect,\n MultiSelectItem,\n Select,\n SelectItem,\n TextField,\n VirtualTableWhereFilterOp,\n XIcon\n} from \"@rebasepro/ui\";\nimport { EnumValueConfig } from \"@rebasepro/types\";\nimport { useTranslation } from \"@rebasepro/app\";\n\ninterface StringNumberFilterFieldProps {\n name: string,\n type: \"string\" | \"number\";\n value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: unknown]) => void;\n isArray?: boolean;\n enumValues?: EnumValueConfig[];\n title?: string;\n /**\n * Restrict the offered operators (already resolved against engine\n * capabilities and property config). When omitted, all operators this\n * field can render are offered.\n */\n operators?: readonly VirtualTableWhereFilterOp[];\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\",\n \"ilike\": \"Contains\",\n \"not-ilike\": \"Not contains\",\n \"is-null\": \"Is null\",\n \"is-not-null\": \"Is not null\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\n/** Operators that match a substring, wrapped in SQL wildcards (`%value%`). */\nconst containsOperations = [\"ilike\", \"not-ilike\"];\n\n/** Strip the surrounding `%` wildcards a contains-filter adds, for display. */\nfunction unwrapContains(value: unknown): string {\n if (typeof value !== \"string\") return \"\";\n return value.replace(/^%/, \"\").replace(/%$/, \"\");\n}\n\nexport function StringNumberFilterField({\n name,\n value,\n setValue,\n type,\n isArray,\n enumValues,\n title,\n operators\n }: StringNumberFilterFieldProps) {\n const { t } = useTranslation();\n\n let possibleOperations: (keyof typeof operationLabels)[] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"is-null\", \"is-not-null\"];\n\n // Case-insensitive substring matching is only meaningful for free-text\n // string columns (not numbers, arrays, or enums).\n if (!isArray && !enumValues && type === \"string\") {\n possibleOperations.push(\"ilike\", \"not-ilike\");\n }\n\n if (enumValues) {\n if (isArray) {\n possibleOperations.push(\"array-contains-any\");\n } else {\n possibleOperations.push(\"in\", \"not-in\");\n }\n }\n\n if (operators) {\n possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));\n }\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n // Read back both the canonical null operators and the legacy `[\"==\", null]` /\n // `[\"!=\", null]` form saved by older filter presets.\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(\n fieldOperation === \"==\" && fieldValue === null ? \"is-null\"\n : fieldOperation === \"!=\" && fieldValue === null ? \"is-not-null\"\n : fieldOperation\n );\n const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(\n containsOperations.includes(fieldOperation) ? unwrapContains(fieldValue) : (fieldValue as string | number | string[] | number[] | null | undefined)\n );\n\n const isNullOperation = operation === \"is-null\" || operation === \"is-not-null\";\n\n // All renderable operators were filtered out (engine/property narrowing).\n if (possibleOperations.length === 0) return null;\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {\n // Null-testing operators ignore their value.\n if (op === \"is-null\" || op === \"is-not-null\") {\n setOperation(op);\n setInternalValue(null);\n setValue([op, null]);\n return;\n }\n\n // Substring matching: keep the raw text in the field, emit it wrapped\n // in SQL wildcards so the backend runs `column ILIKE '%value%'`.\n if (op === \"ilike\" || op === \"not-ilike\") {\n const raw = typeof val === \"string\" ? val : \"\";\n setOperation(op);\n setInternalValue(raw);\n if (raw.length > 0) {\n setValue([op, `%${raw}%`]);\n } else {\n setValue(undefined);\n }\n return;\n }\n\n let newValue = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n if (newOpIsArray) {\n if (typeof val === \"string\") newValue = [val];\n else if (typeof val === \"number\") newValue = [val];\n else newValue = [];\n } else {\n newValue = undefined;\n }\n }\n\n if (typeof newValue === \"number\" && isNaN(newValue))\n newValue = undefined;\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const multiple = multipleSelectOperations.includes(operation);\n\n return (\n\n <div className=\"flex w-full\">\n <div className={\"w-[100px]\"}>\n <Select value={operation}\n size={\"medium\"}\n fullWidth={true}\n position={\"item-aligned\"}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"grow ml-2 flex flex-col gap-2\">\n\n {!enumValues && <TextField\n size={\"medium\"}\n type={type === \"number\" ? \"number\" : undefined}\n value={internalValue !== undefined && internalValue != null ? String(internalValue) : \"\"}\n disabled={isNullOperation}\n placeholder={isNullOperation ? \"null\" : undefined}\n onChange={(evt) => {\n const val = type === \"number\"\n ? parseFloat(evt.target.value)\n : evt.target.value;\n updateFilter(operation, val);\n }}\n endAdornment={internalValue !== undefined && internalValue != null && <IconButton\n onClick={(e) => updateFilter(operation, undefined)}>\n <XIcon/>\n </IconButton>}\n />}\n\n {enumValues && !multiple &&\n <Select\n size={\"medium\"}\n position={\"item-aligned\"}\n fullWidth={true}\n disabled={isNullOperation}\n value={typeof internalValue === \"string\" ? internalValue : \"\"}\n onValueChange={(value) => {\n if (value !== \"\")\n updateFilter(operation, type === \"number\" ? parseInt(value as string) : value as string)\n }}\n endAdornment={internalValue && <IconButton\n onClick={(e) => updateFilter(operation, undefined)}>\n <XIcon/>\n </IconButton>}\n renderValue={(enumKey) => {\n if (enumKey === null)\n return t(\"filter_for_null_values\");\n if (enumKey === undefined)\n return null;\n\n return <EnumValuesChip\n key={`select_value_${name}_${enumKey}`}\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"small\"}/>;\n }}>\n {enumValues.map((enumConfig) => (\n <SelectItem key={`select_item_${name}_${enumConfig.id}`}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={String(enumConfig.id)}\n enumValues={enumValues}\n size={\"small\"}/>\n </SelectItem>\n ))}\n </Select>\n }\n\n {enumValues && multiple &&\n <MultiSelect\n size={\"medium\"}\n position={\"item-aligned\"}\n value={Array.isArray(internalValue) ? internalValue.map(e => String(e)) : []}\n disabled={isNullOperation}\n onValueChange={(value) => {\n updateFilter(operation, type === \"number\" ? (value ?? []).map(v => parseInt(v)) : value)\n }}\n multiple={multiple}\n endAdornment={internalValue && <IconButton\n className=\"absolute right-2 top-3\"\n onClick={(e) => updateFilter(operation, undefined)}>\n <XIcon/>\n </IconButton>}\n >\n {enumValues.map((enumConfig) => (\n <MultiSelectItem key={`select_value_${name}_${enumConfig.id}`}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={String(enumConfig.id)}\n enumValues={enumValues}\n size={\"small\"}/>\n </MultiSelectItem>\n ))}\n </MultiSelect>\n }\n\n </div>\n\n </div>\n );\n\n}\n","import React from \"react\";\nimport { VirtualTableWhereFilterOp } from \"@rebasepro/ui\";\nimport { BooleanSwitchWithLabel } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\n\ninterface BooleanFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: unknown]) => void;\n title?: string;\n /**\n * Restrict the offered operators. This field only ever emits `[\"==\", …]`,\n * so it renders nothing when `==` is not allowed.\n */\n operators?: readonly VirtualTableWhereFilterOp[];\n}\n\nexport function BooleanFilterField({\n name,\n title,\n value,\n setValue,\n operators\n}: BooleanFieldProps) {\n const { t } = useTranslation();\n\n if (operators && !operators.includes(\"==\")) return null;\n\n function updateFilter(val?: boolean) {\n if (val !== undefined) {\n setValue(\n [\"==\", val]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const valueSetToTrue = value && value[1];\n const valueSet = !!value;\n\n return (\n <div className=\"w-full\">\n <BooleanSwitchWithLabel\n size={\"medium\"}\n value={valueSetToTrue as boolean | null}\n allowIndeterminate={true}\n onValueChange={(v: boolean | null) => updateFilter(v === null ? undefined : v)}\n label={!valueSet\n ? t(\"no_filter\")\n : valueSetToTrue\n ? `${title} ${t(\"is_true\")}`\n : `${title} ${t(\"is_false\")}`}\n />\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"@rebasepro/ui\";\nimport { DateTimeField, Select, SelectItem } from \"@rebasepro/ui\";\nimport { useCustomizationController } from \"@rebasepro/app\";\n\ninterface DateTimeFilterFieldProps {\n name: string,\n mode?: \"date\" | \"date_time\",\n value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: unknown]) => void;\n isArray?: boolean;\n title?: string;\n timezone?: string;\n /**\n * Restrict the offered operators (already resolved against engine\n * capabilities and property config). When omitted, all operators this\n * field can render are offered.\n */\n operators?: readonly VirtualTableWhereFilterOp[];\n}\n\nconst operationLabels: Partial<Record<VirtualTableWhereFilterOp, string>> = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n \"not-in\": \"not in\",\n in: \"in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\",\n \"is-null\": \"Is null\",\n \"is-not-null\": \"Is not null\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\"];\n\nexport function DateTimeFilterField({\n name,\n isArray,\n mode,\n value,\n setValue,\n title,\n timezone,\n operators\n}: DateTimeFilterFieldProps) {\n\n const { locale } = useCustomizationController();\n let possibleOperations: (keyof typeof operationLabels)[] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"is-null\", \"is-not-null\"];\n\n if (operators) {\n possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));\n }\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n // Read back both the canonical null operators and the legacy `[\"==\", null]` /\n // `[\"!=\", null]` form saved by older filter presets.\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(\n fieldOperation === \"==\" && fieldValue === null ? \"is-null\"\n : fieldOperation === \"!=\" && fieldValue === null ? \"is-not-null\"\n : fieldOperation\n );\n const [internalValue, setInternalValue] = useState<Date | null | undefined>(fieldValue as Date | null | undefined);\n\n const isNullOperation = operation === \"is-null\" || operation === \"is-not-null\";\n\n // All renderable operators were filtered out (engine/property narrowing).\n if (possibleOperations.length === 0) return null;\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: Date | undefined | null) {\n // Null-testing operators ignore their value.\n if (op === \"is-null\" || op === \"is-not-null\") {\n setOperation(op);\n setInternalValue(null);\n setValue([op, null]);\n return;\n }\n\n let newValue: Date | Date[] | null | undefined = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n newValue = newOpIsArray ? (val ? [val] : []) : undefined;\n }\n\n setOperation(op);\n setInternalValue(Array.isArray(newValue) ? newValue[0] ?? null : newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n return (\n\n <div className=\"flex w-full\">\n <div className=\"w-[100px]\">\n <Select value={operation}\n size={\"medium\"}\n fullWidth={true}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"grow ml-2 flex flex-col gap-2\">\n\n <DateTimeField\n mode={mode}\n size={\"medium\"}\n locale={locale}\n timezone={timezone}\n disabled={isNullOperation}\n value={isNullOperation ? undefined : (internalValue ?? undefined)}\n onChange={(dateValue: Date | null) => {\n updateFilter(operation, dateValue === null ? undefined : dateValue);\n }}\n clearable={true}\n />\n\n </div>\n\n </div>\n );\n\n}\n","import { useSelectionDialog } from \"../../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useMemo, useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"@rebasepro/ui\";\nimport { Entity, EntityReference } from \"@rebasepro/types\";\nimport { ReferencePreview } from \"../../../preview\";\nimport { Button, Checkbox, Label, Select, SelectItem } from \"@rebasepro/ui\";\nimport { getReferenceFrom } from \"@rebasepro/common\";\nimport { useTranslation } from \"@rebasepro/app\";\nimport { useCollectionRegistryController } from \"../../../hooks/navigation/contexts/CollectionRegistryContext\";\n\ninterface ReferenceFilterFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];\n setValue: (filterValue?: [VirtualTableWhereFilterOp, unknown]) => void;\n isArray?: boolean;\n path?: string;\n title?: string;\n includeId?: boolean;\n previewProperties?: string[];\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n /**\n * Restrict the offered operators (already resolved against engine\n * capabilities and property config). When omitted, all operators this\n * field can render are offered.\n */\n operators?: readonly VirtualTableWhereFilterOp[];\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Contains Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function ReferenceFilterField({\n value,\n setValue,\n isArray,\n path,\n includeId = true,\n previewProperties,\n setHidden,\n operators\n}: ReferenceFilterFieldProps) {\n const { t } = useTranslation();\n\n let possibleOperations: (keyof typeof operationLabels)[] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n if (isArray) {\n possibleOperations.push(\"array-contains-any\");\n } else {\n possibleOperations.push(\"in\", \"not-in\");\n }\n\n if (operators) {\n possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));\n }\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue as EntityReference | EntityReference[] | undefined | null);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue) ? internalValue.map((ref) => {\n if (!(ref?.isEntityReference && ref?.isEntityReference())) {\n return null;\n }\n return ref.id;\n }).filter(Boolean) as string[] : [internalValue.id])\n : [];\n\n function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {\n\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n let newValue = val;\n if (prevOpIsArray !== newOpIsArray) {\n newValue = newOpIsArray\n ? (newValue && !Array.isArray(newValue) && newValue.isEntityReference?.() ? [newValue] : [])\n : undefined;\n }\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const collectionRegistryController = useCollectionRegistryController();\n const collection: CollectionConfig | undefined = useMemo(() => {\n return path ? collectionRegistryController.getCollection(path) : undefined;\n }, [path]);\n\n const onSingleEntitySelected = (entity: Entity<Record<string, unknown>>) => {\n updateFilter(operation, getReferenceFrom(entity));\n };\n\n const onMultipleEntitiesSelected = (entities: Entity<Record<string, unknown>>[]) => {\n updateFilter(operation, entities.map(e => getReferenceFrom(e)));\n };\n\n const multiple = multipleSelectOperations.includes(operation);\n\n const referenceDialogController = useSelectionDialog({\n multiselect: multiple,\n path,\n collection,\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n onClose: () => {\n setHidden(false);\n }\n }\n );\n\n const doOpenDialog = () => {\n setHidden(true);\n referenceDialogController.open();\n };\n\n const buildEntry = (reference: EntityReference) => {\n return (\n <ReferencePreview\n disabled={!path}\n previewProperties={previewProperties}\n size={\"medium\"}\n onClick={doOpenDialog}\n reference={reference}\n hover={true}\n includeId={includeId}\n includeEntityLink={false}\n />\n );\n };\n\n // All renderable operators were filtered out (engine/property narrowing).\n if (possibleOperations.length === 0) return null;\n\n return (\n\n <div className=\"flex w-full flex-row\">\n <div className=\"w-[100px]\">\n <Select value={operation}\n size={\"medium\"}\n fullWidth={true}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"grow ml-2 h-full gap-2 flex flex-col\">\n\n {internalValue && Array.isArray(internalValue) && <div>\n {internalValue.map((ref, index) => buildEntry(ref))}\n </div>}\n\n {internalValue && !Array.isArray(internalValue) && <div>\n {buildEntry(internalValue)}\n </div>}\n\n {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&\n <Button onClick={doOpenDialog}\n\n size={\"medium\"}\n className=\"h-full w-full\">\n {multiple ? t(\"select_references\") : t(\"select_reference\")}\n </Button>\n }\n\n {!isArray && <Label\n className=\"border cursor-pointer rounded-md p-2 flex items-center gap-2 bg-surface-50 dark:bg-surface-900 hover:bg-surface-100 dark:hover:bg-surface-800\"\n htmlFor=\"null-filter\"\n >\n <Checkbox id=\"null-filter\"\n checked={internalValue === null}\n size={\"small\"}\n onCheckedChange={(checked) => {\n if (internalValue !== null)\n updateFilter(operation, null);\n else updateFilter(operation, undefined);\n }}/>\n {t(\"filter_for_null_values\")}\n </Label>}\n\n </div>\n\n </div>\n );\n\n}\n","import React, { useMemo, useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"@rebasepro/ui\";\nimport { EntityRelation, Relation } from \"@rebasepro/types\";\nimport { Checkbox, Label, Select, SelectItem } from \"@rebasepro/ui\";\nimport { RelationSelector } from \"../../RelationSelector\";\n\ninterface RelationFilterFieldProps {\n name: string,\n value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null];\n setValue: (value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null]) => void;\n relation: Relation; // relation config provided externally\n hidden: boolean;\n setHidden: (value: boolean) => void;\n /**\n * Restrict the offered operators (already resolved against engine\n * capabilities and property config). When omitted, all operators this\n * field can render are offered.\n */\n operators?: readonly VirtualTableWhereFilterOp[];\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Contains Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function RelationFilterField({\n value,\n setValue,\n relation,\n name: _name,\n hidden: _hidden,\n setHidden: _setHidden,\n operators\n}: RelationFilterFieldProps) {\n\n const manyRelation = relation.cardinality === \"many\";\n\n let possibleOperations: (keyof typeof operationLabels)[] = manyRelation\n ? [\"array-contains\", \"array-contains-any\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"in\", \"not-in\"];\n\n if (operators) {\n possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));\n }\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<EntityRelation | EntityRelation[] | undefined | null>(fieldValue);\n\n function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityRelation | EntityRelation[] | null) {\n\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n let newValue = val;\n if (prevOpIsArray !== newOpIsArray) {\n newValue = newOpIsArray ? (newValue instanceof EntityRelation ? [newValue] : []) : undefined;\n }\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue([op, newValue ?? null]);\n } else {\n setValue(undefined);\n }\n }\n\n const multiple = multipleSelectOperations.includes(operation);\n\n const relationSelectorValue = useMemo(() => {\n if (internalValue === null || internalValue === undefined) return undefined;\n if (Array.isArray(internalValue)) return internalValue.map(ref => new EntityRelation(ref.id, ref.path));\n return new EntityRelation(internalValue.id, internalValue.path);\n }, [internalValue]);\n\n const handleRelationSelectorChange = (newVal?: EntityRelation | EntityRelation[] | null) => {\n if (newVal === null) {\n updateFilter(operation, null);\n return;\n }\n if (newVal === undefined) {\n updateFilter(operation, undefined);\n return;\n }\n updateFilter(operation, newVal);\n };\n\n // All renderable operators were filtered out (engine/property narrowing).\n if (possibleOperations.length === 0) return null;\n\n return (\n <div className=\"flex flex-row\">\n <div className=\"\">\n <Select\n value={operation}\n fullWidth={true}\n onValueChange={(newOp) => {\n updateFilter(newOp as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}\n >\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"grow ml-2 h-full gap-2 flex flex-col w-[340px]\">\n <RelationSelector\n relation={relation}\n value={relationSelectorValue}\n onValueChange={handleRelationSelectorChange}\n disabled={internalValue === null}\n size={\"medium\"}\n />\n\n {!manyRelation && <Label\n className=\"border cursor-pointer rounded-md p-2 flex items-center gap-2 bg-surface-50 dark:bg-surface-900 hover:bg-surface-100 dark:hover:bg-surface-800\"\n htmlFor=\"null-filter\"\n >\n <Checkbox\n id=\"null-filter\"\n checked={internalValue === null}\n size={\"small\"}\n onCheckedChange={() => {\n if (internalValue !== null) updateFilter(operation, null);\n else updateFilter(operation, undefined);\n }}\n />\n Filter for null values\n </Label>}\n </div>\n </div>\n );\n}\n","import React, { Suspense } from \"react\";\nimport {\n ArrayProperty,\n FilterFieldBindingProps,\n Property,\n ReferenceProperty,\n RelationProperty,\n WhereFilterOp\n} from \"@rebasepro/types\";\nimport { enumToObjectEntries, resolveFilterOperators } from \"@rebasepro/common\";\nimport { useCollectionScope, useComponentOverride, useResolvedComponent } from \"@rebasepro/app\";\nimport { StringNumberFilterField } from \"./StringNumberFilterField\";\nimport { BooleanFilterField } from \"./BooleanFilterField\";\nimport { DateTimeFilterField } from \"./DateTimeFilterField\";\nimport { ReferenceFilterField } from \"./ReferenceFilterField\";\nimport { RelationFilterField } from \"./RelationFilterField\";\n\nexport interface FilterFieldBindingInput {\n /** Key of the property being filtered (the column id). */\n propertyKey: string;\n /** The raw property — array properties are unwrapped internally. */\n property: Property;\n /**\n * Engine backing the collection (`collection.engine`). Drives which\n * operators the engine can execute. Usually omitted — it is read from\n * the surrounding {@link CollectionScopeProvider}; pass it explicitly\n * only when rendering outside any collection scope.\n */\n engine?: string;\n value?: [WhereFilterOp, unknown];\n setValue: (value?: [WhereFilterOp, unknown]) => void;\n /** Coordination flags for fields that open their own dialogs. */\n hidden?: boolean;\n setHidden?: (hidden: boolean) => void;\n}\n\n/**\n * The single entry point for rendering a collection filter field.\n * Used by both the table header filters ({@link SelectableTable}) and the\n * Filters dialog.\n *\n * Resolution order:\n * 1. `property.ui.Filter` — per-property replacement (rendered even when the\n * resolved operator list is empty; the component owns filterability).\n * 2. `components[\"Collection.FilterField\"]` — collection-level or app-level\n * override (wrap mode supported via `OriginalComponent`).\n * 3. Built-in field dispatched by property type.\n *\n * The operators handed to the field are the intersection of the engine's\n * capabilities, the property-type defaults, and `property.ui.filterOperators`\n * (see `resolveFilterOperators`). When that intersection is empty and no\n * per-property `Filter` is set, nothing is rendered.\n *\n * @group Components\n */\nexport function FilterFieldBinding({\n propertyKey,\n property,\n engine,\n value,\n setValue,\n hidden,\n setHidden\n}: FilterFieldBindingInput): React.ReactNode {\n\n const isArray = property.type === \"array\";\n const ofVal = isArray ? (property as ArrayProperty).of : undefined;\n const baseProperty: Property | undefined = isArray\n ? (Array.isArray(ofVal) ? ofVal[0] : ofVal) as Property | undefined\n : property;\n\n // Hooks must run unconditionally — before any early return.\n const scopeCollection = useCollectionScope();\n const ResolvedFilterField = useComponentOverride<FilterFieldBindingProps>(\"Collection.FilterField\", DefaultFilterField);\n const PropertyFilter = useResolvedComponent<FilterFieldBindingProps>(baseProperty?.ui?.Filter);\n\n if (!baseProperty) return null;\n\n const operators = resolveFilterOperators({\n property: baseProperty,\n isArray,\n engine: engine ?? scopeCollection?.engine\n });\n\n const bindingProps: FilterFieldBindingProps = {\n propertyKey,\n property: baseProperty,\n isArray,\n operators,\n value,\n setValue,\n title: property.name,\n hidden,\n setHidden\n };\n\n // 1. Per-property replacement — always rendered, the dev owns filterability.\n if (PropertyFilter) {\n return (\n <Suspense fallback={null}>\n <PropertyFilter {...bindingProps}/>\n </Suspense>\n );\n }\n\n // 2/3. Override or built-in — only when the property is filterable here.\n if (operators.length === 0) return null;\n\n return <ResolvedFilterField {...bindingProps}/>;\n}\n\n/**\n * Built-in filter field dispatch by property type. This is the\n * `OriginalComponent` received by `\"Collection.FilterField\"` overrides in\n * wrap mode.\n */\nfunction DefaultFilterField({\n propertyKey,\n property,\n isArray,\n operators,\n value,\n setValue,\n title,\n hidden,\n setHidden\n}: FilterFieldBindingProps): React.ReactNode {\n\n if (property.type === \"reference\") {\n const referenceProperty = property as ReferenceProperty;\n return <ReferenceFilterField value={value}\n setValue={setValue}\n name={propertyKey}\n isArray={isArray}\n operators={operators}\n path={referenceProperty.path}\n title={title}\n includeId={referenceProperty.includeId}\n previewProperties={referenceProperty.ui?.previewProperties}\n hidden={hidden ?? false}\n setHidden={setHidden ?? (() => undefined)}/>;\n }\n\n if (property.type === \"relation\") {\n const relation = (property as RelationProperty).relation;\n if (!relation) return null;\n return <RelationFilterField value={value as never}\n setValue={setValue}\n name={propertyKey}\n operators={operators}\n relation={relation}\n hidden={hidden ?? false}\n setHidden={setHidden ?? (() => undefined)}/>;\n }\n\n if (property.type === \"number\" || property.type === \"string\") {\n const enumValues = property.enum ? enumToObjectEntries(property.enum) : undefined;\n return <StringNumberFilterField value={value}\n setValue={setValue}\n name={propertyKey}\n type={property.type}\n isArray={isArray}\n operators={operators}\n enumValues={enumValues}\n title={title}/>;\n }\n\n if (property.type === \"boolean\") {\n return <BooleanFilterField value={value}\n setValue={setValue}\n name={propertyKey}\n operators={operators}\n title={title}/>;\n }\n\n if (property.type === \"date\") {\n return <DateTimeFilterField value={value}\n setValue={setValue}\n name={propertyKey}\n mode={property.mode}\n isArray={isArray}\n operators={operators}\n title={title}/>;\n }\n\n return null;\n}\n","import { createSelectionStore, AdminSelectedCell } from \"./SelectionStore\";\nimport type { Property, WhereFilterOp } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { CollectionSize, Entity, EntityTableController, FilterValues, SelectedCellProps } from \"@rebasepro/types\";\nimport { CellRendererParams, TableView, VirtualTableColumn, VirtualTableFilterValues, OnRowClickParams } from \"@rebasepro/ui\";\nimport { DEFAULT_PAGE_SIZE, DataCollectionTableController, OnCellValueChange, OnColumnResizeParams } from \"@rebasepro/app\";\nimport { FilterFormFieldProps } from \"@rebasepro/ui\";\nimport { useOutsideAlerter } from \"@rebasepro/ui\";\nimport { SelectableTableContext } from \"./SelectableTableContext\";\nimport { getRowHeight } from \"@rebasepro/app\";\nimport { FilterFieldBinding } from \"./filters/FilterFieldBinding\";\n\nexport type SelectableTableProps<M extends Record<string, unknown>> = {\n\n /**\n * Callback when a cell value changes.\n */\n onValueChange?: OnCellValueChange<unknown, M>;\n\n columns: VirtualTableColumn[];\n\n cellRenderer: (props: CellRendererParams<Entity<M>>) => React.ReactNode;\n\n /**\n * Builder for creating the buttons in each row\n * @param entity\n * @param size\n */\n tableRowActionsBuilder?: (params: {\n entity: Entity<M>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => React.ReactNode;\n\n /**\n * Callback when anywhere on the table is clicked\n */\n onEntityClick?(entity: Entity<M>): void;\n\n /**\n * Callback when a column is resized\n */\n onColumnResize?(params: OnColumnResizeParams): void;\n\n /**\n * Should apply a different style to a row when hovering\n */\n hoverRow?: boolean;\n\n /**\n * Controller holding the logic for the table\n * {@link useDataTableController}\n * {@link EntityTableController}\n */\n tableController: EntityTableController<M>;\n\n filterable?: boolean;\n\n sortable?: boolean;\n\n inlineEditing?: boolean;\n\n fixedFilter?: FilterValues<keyof M extends string ? keyof M : never>;\n\n highlightedRow?: (data: Entity<M>) => boolean;\n\n size?: CollectionSize;\n\n initialScroll?: number;\n\n /**\n * Callback when the table is scrolled\n * @param props\n */\n onScroll?: (props: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean\n }) => void;\n\n emptyComponent?: React.ReactNode;\n\n endAdornment?: React.ReactNode;\n\n AddColumnComponent?: React.ComponentType;\n\n /**\n * Callback when columns are reordered via drag-and-drop\n */\n onColumnsOrderChange?: (columns: VirtualTableColumn[]) => void;\n\n /**\n * Extra data passed to VirtualTable cells. Changes to this object\n * bust the cell memo comparator, triggering re-render of cells\n * even when rowData hasn't changed.\n */\n extraData?: unknown;\n}\n\n/**\n * This component is in charge of rendering a collection table with a high\n * degree of customization.\n *\n * This component is used internally by {@link CollectionViewBinding} and\n * {@link useReferenceDialog}\n *\n * Please note that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you want to bind a {@link CollectionConfig} to a table with the default\n * options you see in collections in the top level navigation, you can\n * check {@link CollectionViewBinding}.\n *\n * The data displayed in the table is managed by a {@link EntityTableController}.\n * You can build the default, bound to a path in the driver, by using the hook\n * {@link useDataTableController}\n *\n * @see CollectionTableBindingProps\n * @see CollectionViewBinding\n * @see VirtualTable\n * @group Components\n */\nexport const SelectableTable = function SelectableTable<M extends Record<string, unknown>>\n ({\n onValueChange,\n cellRenderer,\n onEntityClick,\n onColumnResize,\n hoverRow = true,\n size = \"m\",\n inlineEditing = false,\n tableController:\n {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues,\n sortBy,\n setSortBy,\n itemCount,\n setItemCount,\n pageSize = DEFAULT_PAGE_SIZE,\n paginationEnabled,\n checkFilterCombination,\n setPopupCell\n },\n filterable = true,\n onScroll,\n initialScroll,\n emptyComponent,\n columns,\n fixedFilter,\n highlightedRow,\n endAdornment,\n AddColumnComponent,\n onColumnsOrderChange,\n extraData\n }: SelectableTableProps<M>) {\n\n const ref = useRef<HTMLDivElement>(null);\n\n // Create the selection store once\n const selectionStore = useMemo(() => createSelectionStore(), []);\n // We still keep local state for side-effects like outside-alerter, but we don't put it in context\n const [localSelectedCell, setLocalSelectedCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n\n const loadNextPage = useCallback(() => {\n if (!paginationEnabled || dataLoading || noMoreToLoad)\n return;\n if (itemCount !== undefined)\n setItemCount?.(itemCount + pageSize);\n }, [paginationEnabled, dataLoading, noMoreToLoad, itemCount, pageSize, setItemCount]);\n\n const resetPagination = useCallback(() => {\n setItemCount?.(pageSize);\n }, [pageSize]);\n\n const onRowClick = useCallback(({ rowData }: OnRowClickParams<Record<string, unknown>>) => {\n if (inlineEditing)\n return;\n return onEntityClick && onEntityClick(rowData as unknown as Entity<M>);\n }, [onEntityClick, inlineEditing]);\n\n const select = useCallback((cell?: SelectedCellProps<M>) => {\n setLocalSelectedCell(cell);\n if (cell) {\n selectionStore.select({\n ...cell,\n columnKey: cell.propertyKey,\n id: cell.entityId\n } as AdminSelectedCell);\n } else {\n selectionStore.select(undefined);\n }\n }, [selectionStore]);\n\n const unselect = useCallback(() => {\n setLocalSelectedCell(undefined);\n selectionStore.select(undefined);\n }, [selectionStore]);\n\n useOutsideAlerter(ref,\n () => {\n if (localSelectedCell) {\n unselect();\n }\n },\n Boolean(localSelectedCell));\n\n // on ESC key press\n useEffect(() => {\n const escFunction = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n unselect();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n }, [unselect]);\n\n const onFilterUpdate = useCallback((updatedFilterValues?: VirtualTableFilterValues<string>) => {\n if (setFilterValues) {\n setFilterValues({\n ...updatedFilterValues,\n ...fixedFilter\n } as FilterValues<Extract<keyof M, string> | (string & {})>);\n }\n }, [fixedFilter, setFilterValues]);\n\n const contextValue = useMemo(() => ({\n select,\n onValueChange,\n size: size ?? \"m\",\n selectionStore,\n setPopupCell\n } as unknown as DataCollectionTableController<Record<string, unknown>>), [setPopupCell, select, onValueChange, size, selectionStore]);\n\n const createFilterField = useCallback(({\n id,\n filterValue,\n setFilterValue,\n column,\n hidden,\n setHidden\n }: FilterFormFieldProps<unknown>): React.ReactNode => {\n if (!column.custom) return null;\n const { resolvedProperty } = column.custom as { resolvedProperty?: Property };\n if (!resolvedProperty) return null;\n // Engine-aware operator resolution happens inside FilterFieldBinding,\n // which reads the collection from the surrounding CollectionScopeProvider.\n return <FilterFieldBinding\n propertyKey={id as string}\n property={resolvedProperty}\n value={filterValue as [WhereFilterOp, unknown] | undefined}\n setValue={setFilterValue as (value?: [WhereFilterOp, unknown]) => void}\n hidden={hidden}\n setHidden={setHidden}/>;\n }, []);\n\n return (\n <SelectableTableContext.Provider\n value={contextValue}>\n <div className=\"h-full w-full flex flex-col bg-white dark:bg-surface-900\"\n ref={ref}>\n\n <TableView\n data={data as unknown as Record<string, unknown>[]}\n columns={columns}\n cellRenderer={(props) => cellRenderer(props as unknown as CellRendererParams<Entity<M>>)}\n onRowClick={inlineEditing ? undefined : (onEntityClick ? onRowClick : undefined)}\n onEndReached={loadNextPage}\n onResetPagination={resetPagination}\n error={dataLoadingError}\n onColumnResize={onColumnResize}\n rowHeight={getRowHeight(size)}\n loading={dataLoading}\n filter={filterValues as any}\n onFilterUpdate={setFilterValues ? onFilterUpdate : undefined}\n sortBy={sortBy}\n onSortByUpdate={setSortBy as ((sortBy?: [string, \"asc\" | \"desc\"]) => void)}\n hoverRow={hoverRow}\n initialScroll={initialScroll}\n onScroll={onScroll}\n checkFilterCombination={checkFilterCombination}\n createFilterField={filterable ? createFilterField : undefined}\n rowClassName={useCallback((entity: Record<string, unknown>) => {\n return highlightedRow?.(entity as unknown as Entity<M>) ? \"bg-surface-accent-50 dark:!bg-surface-accent-900\" : \"\";\n }, [highlightedRow])}\n className=\"grow\"\n emptyComponent={emptyComponent}\n endAdornment={endAdornment}\n AddColumnComponent={AddColumnComponent}\n onColumnsOrderChange={onColumnsOrderChange}\n extraData={extraData}\n />\n\n </div>\n </SelectableTableContext.Provider>\n );\n\n};\n\n\n","import type { AdditionalFieldDelegate } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo, useRef } from \"react\";\nimport { CollectionSize, Entity, RebaseContext, User, Property } from \"@rebasepro/types\";\nimport { PropertyTableCell } from \"./PropertyTableCell\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { useRebaseContext, useLargeLayout } from \"@rebasepro/app\";\nimport { CellRendererParams, VirtualTableColumn } from \"@rebasepro/ui\";\nimport { CollectionRowActions } from \"./CollectionRowActions\";\nimport { CollectionTableToolbar } from \"./internal/CollectionTableToolbar\";\nimport { CollectionTableBindingProps } from \"./CollectionTableBindingProps\";\nimport { EntityTableCell } from \"./internal/EntityTableCell\";\nimport { CustomFieldValidator } from \"../../form/validation\";\nimport { renderSkeletonText } from \"../../preview\";\nimport { propertiesToColumns } from \"./column_utils\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { SelectableTable } from \"../SelectableTable/SelectableTable\";\nimport { cls } from \"@rebasepro/ui\";\nimport { getRowHeight } from \"@rebasepro/app\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\n/**\n * This component is in charge of rendering a collection table with a high\n * degree of customization.\n *\n * This component is used internally by {@link CollectionViewBinding} and\n * {@link useReferenceDialog}\n *\n * Please note that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you want to bind a {@link CollectionConfig} to a table with the default\n * options you see in collections in the top level navigation, you can\n * check {@link CollectionViewBinding}.\n *\n * The data displayed in the table is managed by a {@link EntityTableController}.\n * You can build the default, bound to a path in the driver, by using the hook\n * {@link useDataTableController}\n *\n * @see CollectionTableBindingProps\n * @see CollectionViewBinding\n * @see VirtualTable\n * @group Components\n */\nexport const CollectionTableBinding = function CollectionTableBinding<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>\n ({\n className,\n style,\n fixedFilter,\n actionsStart,\n actions,\n viewModeToggle,\n title,\n tableRowActionsBuilder,\n uniqueFieldValidator,\n getPropertyFor,\n onValueChange,\n selectionController,\n highlightedEntities,\n onEntityClick,\n onColumnResize,\n initialScroll,\n onScroll,\n onSizeChanged,\n\n hoverRow = true,\n inlineEditing = false,\n additionalFields,\n displayedColumnIds,\n defaultSize,\n properties,\n tableController,\n filterable = true,\n sortable = true,\n endAdornment,\n AddColumnComponent,\n AdditionalHeaderWidget,\n additionalIDHeaderWidget,\n emptyComponent,\n getIdColumnWidth,\n enablePopupIcon,\n openEntityMode = \"side_panel\",\n onColumnsOrderChange,\n hideToolbar = false\n }: CollectionTableBindingProps<M>) {\n\n const ref = useRef<HTMLDivElement>(null);\n\n const largeLayout = useLargeLayout();\n const selectedEntities = useMemo(() => {\n return (selectionController?.selectedEntities?.length > 0 ? selectionController?.selectedEntities : highlightedEntities)?.filter(Boolean);\n }, [selectionController?.selectedEntities, highlightedEntities]);\n\n const context: RebaseContext<USER> = useRebaseContext<USER>();\n\n const [size, setSize] = React.useState<CollectionSize>(defaultSize ?? \"m\");\n\n // Sync internal size with defaultSize prop when it changes\n React.useEffect(() => {\n if (defaultSize) {\n setSize(defaultSize);\n }\n }, [defaultSize]);\n\n const updateSize = useCallback((size: CollectionSize) => {\n if (onSizeChanged)\n onSizeChanged(size);\n setSize(size);\n }, []);\n\n const onTextSearch = useCallback((newSearchString?: string) => tableController.setSearchString?.(newSearchString), []);\n\n const additionalFieldsMap: Record<string, AdditionalFieldDelegate<M, USER>> = useMemo(() => {\n return (additionalFields\n ? additionalFields\n .map((aC) => ({ [aC.key]: aC as AdditionalFieldDelegate<M, USER> }))\n .reduce((a, b) => ({ ...a,\n...b }), {})\n : {}) as Record<string, AdditionalFieldDelegate<M, USER>>;\n }, [additionalFields]);\n\n const customFieldValidator: CustomFieldValidator | undefined = uniqueFieldValidator;\n\n const propertyCellRenderer = useCallback(({\n column,\n columnIndex,\n rowData,\n rowIndex,\n sortableNodeRef,\n sortableStyle,\n sortableAttributes,\n isDragging,\n isDraggable,\n frozen\n }: CellRendererParams<Entity<M>>) => {\n\n const entity: Entity<M> | undefined = rowData;\n if (!entity) return null;\n\n const propertyKey = column.key;\n\n const columnCustom = column.custom as { disabled?: boolean; resolvedProperty?: Property } | undefined;\n let disabled: boolean = columnCustom?.disabled ?? false;\n const property = getPropertyFor?.({\n propertyKey,\n entity\n }) ?? columnCustom?.resolvedProperty;\n if (!property?.ui?.disabled) {\n disabled = false;\n }\n\n if (!property) {\n return null;\n }\n\n return (\n <ErrorBoundary>\n {entity\n ? <PropertyTableCell\n key={`property_table_cell_${entity.id}_${propertyKey}`}\n readonly={!inlineEditing}\n align={column.align ?? \"left\"}\n propertyKey={propertyKey as string}\n property={property}\n value={entity?.values ? getValueInPath(entity.values, propertyKey) : undefined}\n customFieldValidator={customFieldValidator}\n columnIndex={columnIndex}\n width={column.width}\n height={getRowHeight(size)}\n entity={entity}\n disabled={disabled}\n enablePopupIcon={enablePopupIcon}\n path={entity.path}\n sortableNodeRef={sortableNodeRef}\n sortableStyle={sortableStyle}\n sortableAttributes={sortableAttributes}\n isDragging={isDragging}\n isDraggable={isDraggable}\n frozen={frozen}/>\n : renderSkeletonText()\n }\n </ErrorBoundary>);\n\n }, [getPropertyFor, customFieldValidator, inlineEditing, enablePopupIcon, size]);\n\n const additionalCellRenderer = useCallback(({\n column,\n rowData,\n width,\n sortableNodeRef,\n sortableStyle,\n sortableAttributes,\n isDragging,\n isDraggable,\n frozen\n }: CellRendererParams<Entity<M>>) => {\n\n const entity: Entity<M> | undefined = rowData;\n if (!entity) return null;\n\n const additionalField = additionalFieldsMap[column.key as string];\n const value = additionalField.dependencies\n ? Object.entries(entity.values)\n .filter(([key, value]) => additionalField.dependencies!.includes(key as Extract<keyof M, string>))\n .reduce((a, b) => ({ ...a,\n...b }), {})\n : entity;\n\n const Builder = additionalField.Builder;\n if (!Builder && !additionalField.value) {\n throw new Error(\"When using additional fields you need to provide a Builder or a value\");\n }\n\n const child: React.ReactNode = Builder\n ? <Builder entity={entity} context={context}/>\n : <>\n {additionalField.value?.({\n entity,\n context: context as RebaseContext\n })?.toString()}\n </>;\n\n return (\n <EntityTableCell\n key={`additional_table_cell_${entity.id}_${column.key}`}\n width={width}\n size={size}\n value={value}\n selected={false}\n disabled={true}\n align={\"left\"}\n allowScroll={false}\n showExpandIcon={false}\n disabledTooltip={\"This column can't be edited directly\"}\n sortableNodeRef={sortableNodeRef}\n sortableStyle={sortableStyle}\n sortableAttributes={sortableAttributes as Record<string, string | number | undefined>}\n isDragging={isDragging}\n isDraggable={isDraggable}\n frozen={frozen}\n >\n <ErrorBoundary>\n {child}\n </ErrorBoundary>\n </EntityTableCell>\n );\n\n }, [size]);\n\n const collectionColumns: VirtualTableColumn[] = useMemo(() => {\n const columnsResult: VirtualTableColumn[] = propertiesToColumns({\n properties,\n sortable,\n fixedFilter,\n AdditionalHeaderWidget\n });\n\n // Get keys from property columns to filter out duplicate additional fields\n const propertyColumnKeys = new Set(columnsResult.map(col => col.key));\n\n const additionalTableColumns: VirtualTableColumn[] = additionalFields\n // Filter out additional fields whose key already exists in property columns\n ? additionalFields\n .filter((additionalField) => !propertyColumnKeys.has(additionalField.key))\n .map((additionalField) =>\n ({\n key: additionalField.key,\n align: \"left\",\n sortable: false,\n title: additionalField.name,\n width: additionalField.width ?? 200\n }))\n : [];\n return [...columnsResult, ...additionalTableColumns];\n }, [properties, sortable, fixedFilter, AdditionalHeaderWidget, additionalFields]);\n\n const idColumn: VirtualTableColumn = useMemo(() => ({\n key: \"id_ewcfedcswdf3\",\n width: getIdColumnWidth?.() ?? (largeLayout ? 140 : 120),\n title: \"ID\",\n resizable: false,\n frozen: largeLayout,\n headerAlign: \"center\",\n align: \"center\",\n AdditionalHeaderWidget: () => additionalIDHeaderWidget\n }), [getIdColumnWidth, largeLayout, additionalIDHeaderWidget]);\n\n const columns: VirtualTableColumn[] = useMemo(() => [\n idColumn,\n ...(displayedColumnIds\n ? displayedColumnIds\n .map((p) => {\n return collectionColumns.find(c => c.key === p.key);\n }).filter(Boolean)\n : collectionColumns) as VirtualTableColumn[]\n ], [idColumn, displayedColumnIds, collectionColumns]);\n\n const cellRenderer = useCallback((props: CellRendererParams<Entity<M>>) => {\n const column = props.column;\n const columns = props.columns;\n const columnKey = column.key;\n\n try {\n if (props.columnIndex === 0) {\n if (tableRowActionsBuilder)\n return tableRowActionsBuilder({\n entity: props.rowData!,\n size,\n width: column.width,\n frozen: column.frozen\n });\n else\n return <CollectionRowActions entity={props.rowData!}\n width={column.width}\n frozen={column.frozen}\n isSelected={false}\n size={size}\n openEntityMode={openEntityMode}\n sortableNodeRef={props.sortableNodeRef}\n sortableStyle={props.sortableStyle}\n sortableAttributes={props.sortableAttributes}\n isDragging={props.isDragging}\n isDraggable={props.isDraggable}/>;\n } else if (additionalFieldsMap[columnKey]) {\n return additionalCellRenderer(props);\n } else if (props.columnIndex < columns.length + 1) {\n return propertyCellRenderer(props);\n } else {\n throw Error(\"Internal: columns not mapped properly\");\n }\n } catch (e: unknown) {\n console.error(\"Error rendering cell\", e);\n return <EntityTableCell\n size={size}\n width={column.width}\n savedTimestamp={undefined}\n value={null}\n align={\"left\"}\n fullHeight={false}\n disabled={true}\n sortableNodeRef={props.sortableNodeRef}\n sortableStyle={props.sortableStyle}\n sortableAttributes={props.sortableAttributes as Record<string, string | number | undefined>}\n isDragging={props.isDragging}\n isDraggable={props.isDraggable}\n frozen={props.frozen}>\n <ErrorView error={e instanceof Error ? e : new Error(String(e))}/>\n </EntityTableCell>;\n }\n }, [tableRowActionsBuilder, additionalCellRenderer, propertyCellRenderer, size]);\n\n return (\n\n <div ref={ref}\n style={style}\n className={cls(\"h-full w-full flex flex-col bg-white dark:bg-surface-900\", className)}>\n\n {!hideToolbar && <CollectionTableToolbar\n onTextSearch={onTextSearch}\n title={title}\n actionsStart={actionsStart}\n actions={actions}\n viewModeToggle={viewModeToggle}\n loading={tableController.dataLoading}/>}\n\n <SelectableTable columns={columns}\n size={size}\n inlineEditing={inlineEditing}\n cellRenderer={cellRenderer}\n onEntityClick={onEntityClick}\n highlightedRow={useCallback((entity: Entity<M>) => Boolean(selectedEntities?.find(e => e.id === entity.id && e.path === entity.path)), [selectedEntities])}\n tableController={tableController}\n onValueChange={onValueChange}\n initialScroll={initialScroll}\n onScroll={onScroll}\n onColumnResize={onColumnResize}\n hoverRow={hoverRow}\n filterable={filterable}\n emptyComponent={emptyComponent}\n endAdornment={endAdornment}\n AddColumnComponent={AddColumnComponent}\n onColumnsOrderChange={onColumnsOrderChange}\n extraData={useMemo(() => ({ selectedEntityIds: selectedEntities?.map(e => e.id) }), [selectedEntities])}/>\n\n </div>\n );\n\n};\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { Entity, SelectionController } from \"@rebasepro/types\";\n\nexport function useSelectionController<M extends Record<string, unknown> = Record<string, unknown>>(\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void\n): SelectionController<M> {\n\n const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);\n\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n\n const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {\n setSelectedEntities(prev => {\n const isSelected = Boolean(prev.find(e => e.id === entity.id && e.path === entity.path));\n const shouldSelect = newSelectedState ?? !isSelected;\n\n if (shouldSelect && !isSelected) {\n onSelectionChangeRef.current?.(entity, true);\n return [...prev, entity];\n } else if (!shouldSelect && isSelected) {\n onSelectionChangeRef.current?.(entity, false);\n return prev.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));\n }\n return prev;\n });\n }, []);\n\n const isEntitySelected = useCallback((entity: Entity<M>) => {\n return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));\n }, [selectedEntities]);\n\n return useMemo(() => ({\n selectedEntities,\n setSelectedEntities,\n isEntitySelected,\n toggleEntitySelection\n }), [selectedEntities, setSelectedEntities, isEntitySelected, toggleEntitySelection]);\n}\n","import { HistoryIcon } from \"@rebasepro/ui\";\nimport React from \"react\";\nimport type { CustomizationController, EntityAction, EntityCustomView } from \"@rebasepro/types\";\n\n/**\n * Built-in entity views that are resolved by token name.\n * These are always available without needing to be registered\n * in the customization controller's entityViews array.\n */\nconst BUILTIN_ENTITY_VIEWS: Record<string, EntityCustomView> = {\n \"__rebase_history\": {\n key: \"__rebase_history\",\n name: \"History\",\n tabComponent: React.createElement(HistoryIcon, { size: 20 }),\n position: \"end\"\n }\n};\n\nexport function resolveEntityView(\n entityView: string | EntityCustomView<any>,\n contextEntityViews?: EntityCustomView<any>[]\n): EntityCustomView<any> | undefined {\n if (typeof entityView === \"string\") {\n // Check built-in views first, then user-registered views\n return BUILTIN_ENTITY_VIEWS[entityView]\n ?? contextEntityViews?.find((entry) => entry.key === entityView);\n } else {\n return entityView;\n }\n}\n\nexport function resolveEntityAction<M extends Record<string, unknown>>(\n entityAction: string | EntityAction<M>,\n contextEntityActions?: EntityAction<M>[]\n): EntityAction<M> | undefined {\n if (typeof entityAction === \"string\") {\n return contextEntityActions?.find((entry) => entry.key === entityAction);\n } else {\n return entityAction;\n }\n}\n\nexport function resolvedSelectedEntityView<M extends Record<string, unknown>>(\n customViews: (string | EntityCustomView<M>)[] | undefined,\n customizationController: CustomizationController,\n selectedTab?: string,\n _canEdit?: boolean\n) {\n const resolvedEntityViews = customViews\n ? customViews\n .map((e) => resolveEntityView(e, (customizationController as { entityViews?: EntityCustomView[] }).entityViews))\n .filter(Boolean)\n .filter((e) => (e as EntityCustomView).key !== \"__rebase_history\") as EntityCustomView[]\n : [];\n\n const selectedEntityView = resolvedEntityViews.find((e) => e.key === selectedTab);\n const selectedSecondaryForm =\n customViews &&\n resolvedEntityViews\n .filter((e) => e.includeActions)\n .find((e) => e.key === selectedTab);\n return {\n resolvedEntityViews,\n selectedEntityView,\n selectedSecondaryForm\n };\n}\n","import { useCallback, useMemo } from \"react\";\nimport { setIn } from \"@rebasepro/forms\";\nimport { CollectionConfig, RebaseData, RebaseContext } from \"@rebasepro/types\";\nimport { OnCellValueChange, saveEntityWithCallbacks, SaveEntityWithCallbacksProps, UniqueFieldValidator } from \"@rebasepro/app\";\n\nexport interface UseCollectionInlineEditorParams<M extends Record<string, unknown>> {\n path: string;\n collection: CollectionConfig<M>;\n dataClient: RebaseData;\n context: RebaseContext;\n}\n\nexport function useCollectionInlineEditor<M extends Record<string, unknown>>({\n path,\n collection,\n dataClient,\n context\n}: UseCollectionInlineEditorParams<M>) {\n\n // Unique field validator (ported from CollectionViewBinding)\n const uniqueFieldValidator: UniqueFieldValidator = useCallback(\n async ({ name, value, property, entityId }: Parameters<UniqueFieldValidator>[0]) => {\n const accessor = dataClient.collection(path);\n const res = await accessor.find({\n where: { [name]: [\"==\", value] }\n });\n\n const conflictingEntities = res.data;\n const isUnique = conflictingEntities.length === 0 ||\n (conflictingEntities.length === 1 && conflictingEntities[0].id === entityId);\n\n return isUnique;\n },\n [path, dataClient]\n );\n\n // Partial update payload builder\n const onValueChange: OnCellValueChange<any, any> = useCallback(({\n value,\n propertyKey,\n onValueUpdated,\n setError,\n data: entity\n }) => {\n if (!entity) return;\n\n const updatedValues = setIn({}, propertyKey, value) as Partial<Record<string, unknown>>;\n\n const saveProps: SaveEntityWithCallbacksProps<Record<string, unknown>> = {\n path: entity.path ?? path,\n entityId: entity.id,\n values: updatedValues,\n previousValues: entity.values,\n collection,\n status: \"existing\"\n };\n\n return saveEntityWithCallbacks({\n ...saveProps,\n collection,\n data: dataClient,\n context,\n afterSave: () => {\n setError(undefined);\n onValueUpdated();\n },\n afterSaveError: (e: Error) => {\n console.error(\"Save failure\");\n console.error(e);\n setError(e);\n }\n }).then();\n\n }, [path, collection, dataClient, context]);\n\n return useMemo(() => ({\n onValueChange,\n uniqueFieldValidator\n }), [onValueChange, uniqueFieldValidator]);\n}\n","import type { CollectionConfig, ViewMode } from \"@rebasepro/types\";\n\n/**\n * Query param that carries the active collection view mode across navigations.\n */\nexport const VIEW_MODE_PARAM = \"__view\";\n\nexport const VIEW_MODES: ViewMode[] = [\"list\", \"table\", \"cards\", \"kanban\"];\n\nexport const DEFAULT_VIEW_MODE: ViewMode = \"list\";\n\nexport type OpenEntityMode = \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n\nexport const DEFAULT_OPEN_ENTITY_MODE: OpenEntityMode = \"split\";\n\nexport function isViewMode(value: string | null | undefined): value is ViewMode {\n return Boolean(value) && VIEW_MODES.includes(value as ViewMode);\n}\n\n/**\n * Read the active view mode from a query string, if it holds a valid one.\n *\n * @param search a query string (e.g. `location.search`). Falls back to the\n * current browser location when omitted.\n */\nexport function getViewModeFromSearch(search?: string): ViewMode | null {\n const source = search ?? (typeof window !== \"undefined\" ? window.location.search : \"\");\n const value = new URLSearchParams(source).get(VIEW_MODE_PARAM);\n return isViewMode(value) ? value : null;\n}\n\n/**\n * Append the active view mode to a URL so the target route keeps rendering the\n * view the user was last looking at.\n *\n * Every entity/collection navigation must go through this — a missed call site\n * silently resets the user's view mode mid-session.\n *\n * @param url the URL to decorate. May already contain a query string and/or hash.\n * @param search query string to read the view mode from. Defaults to the\n * current browser location.\n */\nexport function withViewMode(url: string, search?: string): string {\n const viewMode = getViewModeFromSearch(search);\n if (!viewMode) return url;\n\n // Preserve any hash — the param belongs to the query, which precedes it.\n const hashIndex = url.indexOf(\"#\");\n const hash = hashIndex >= 0 ? url.substring(hashIndex) : \"\";\n const base = hashIndex >= 0 ? url.substring(0, hashIndex) : url;\n\n if (new URLSearchParams(base.split(\"?\")[1] ?? \"\").has(VIEW_MODE_PARAM)) {\n return url;\n }\n\n const separator = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${separator}${VIEW_MODE_PARAM}=${viewMode}${hash}`;\n}\n\n/**\n * Resolve the view mode for a collection, honouring the documented priority:\n * URL param > saved user config > collection default.\n */\nexport function resolveViewMode({\n collection,\n search,\n savedViewMode\n}: {\n collection?: Pick<CollectionConfig<any>, \"defaultViewMode\">;\n search?: string;\n savedViewMode?: ViewMode | null;\n}): ViewMode {\n const fromUrl = getViewModeFromSearch(search);\n if (fromUrl) return fromUrl;\n if (isViewMode(savedViewMode)) return savedViewMode;\n return collection?.defaultViewMode ?? DEFAULT_VIEW_MODE;\n}\n\n/**\n * Resolve how clicking an entity should present it.\n *\n * An explicit `collection.openEntityMode` always wins. Otherwise the mode is\n * derived from the active view mode, so the presentation suits the surface the\n * user is looking at: a board keeps its columns behind an overlay, a wide table\n * hands the entity the full width, and list/card views use master-detail.\n *\n * This is the single source of truth — row clicks, find-by-id and the router\n * must all resolve through it, otherwise the same entity opens differently\n * depending on how it was reached.\n */\nexport function resolveOpenEntityMode({\n collection,\n viewMode\n}: {\n collection?: Pick<CollectionConfig<any>, \"openEntityMode\">;\n viewMode?: ViewMode;\n}): OpenEntityMode {\n if (collection?.openEntityMode) return collection.openEntityMode;\n if (viewMode === \"kanban\") return \"side_panel\";\n if (viewMode === \"table\" || viewMode === \"cards\") return \"full_screen\";\n return DEFAULT_OPEN_ENTITY_MODE;\n}\n","import type { CollectionConfig, UrlController, SidePanelController, NavigateOptions } from \"@rebasepro/types\";\nimport { withViewMode } from \"./view_mode\";\n\n// Canonical path utilities — single source of truth in @rebasepro/common\nexport {\n removeInitialAndTrailingSlashes,\n removeInitialSlash,\n removeTrailingSlash,\n addInitialSlash,\n getLastSegment,\n resolveCollectionPathIds,\n getCollectionBySlugWithin,\n getCollectionPathsCombinations\n} from \"@rebasepro/common\";\n\n/**\n * Navigate to a entity using either a side panel or full-screen mode.\n * This is an admin-specific UI concern and lives here (not in common).\n */\nexport function navigateToEntity({\n openEntityMode,\n collection,\n entityId,\n copy,\n path,\n selectedTab,\n defaultValues,\n sidePanelController,\n onClose,\n navigation,\n replace\n}:\n\n {\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n collection?: CollectionConfig;\n entityId?: string | number;\n selectedTab?: string;\n copy?: boolean;\n /**\n * Pre-populate the new entity form with these values.\n * Only applied when entityId is not set (i.e. \"new\" mode).\n *\n * Side panel: passed through SidePanelBindingProps → EditViewBinding.\n * Full screen: carried via React Router location.state so the route\n * component can read it on mount without polluting the URL.\n */\n defaultValues?: Record<string, unknown>;\n path: string;\n sidePanelController: SidePanelController;\n onClose?: () => void;\n navigation: UrlController;\n replace?: boolean;\n }) {\n\n if (openEntityMode === \"side_panel\" || openEntityMode === \"dialog\") {\n\n\n sidePanelController.open({\n entityId,\n path: path,\n copy,\n selectedTab,\n collection,\n updateUrl: openEntityMode !== \"dialog\",\n onClose,\n defaultValues\n });\n\n } else {\n let to = navigation.buildUrlCollectionPath(entityId ? `${path ?? path}/${entityId}` : path ?? path);\n if (entityId && selectedTab) {\n to += `/${selectedTab}`;\n }\n to = withViewMode(to);\n if (!entityId) {\n to += \"#new\";\n }\n if (copy) {\n to += \"#copy\";\n }\n // Use React Router location.state to carry defaultValues — the correct SPA\n // approach. No URL size limits, no encoding, nothing in the address bar.\n // EntityFullScreenRoute reads location.state.defaultValues on mount.\n const navigateOptions: NavigateOptions = {};\n if (replace !== undefined) {\n navigateOptions.replace = replace;\n }\n if (defaultValues) {\n navigateOptions.state = { defaultValues };\n }\n const hasOptions = Object.keys(navigateOptions).length > 0;\n navigation.navigate(to, hasOptions ? navigateOptions : undefined);\n }\n\n}\n","import type { EntityAction } from \"@rebasepro/types\";\n\nconst reservedKeys = [\"edit\", \"copy\", \"delete\"];\n\nexport function mergeEntityActions(currentActions: EntityAction[], newActions: EntityAction[]): EntityAction[] {\n // given the current actions, replace the ones with the same key\n // and append the new ones\n const updatedActions: EntityAction[] = [];\n currentActions.forEach(action => {\n const newAction = newActions.find(a => a.key === action.key);\n if (newAction) {\n const mergedAction = {\n ...action,\n ...newAction\n }\n updatedActions.push(mergedAction);\n } else {\n updatedActions.push(action);\n }\n });\n newActions.forEach(action => {\n if (!currentActions.find(a => a.key === action.key) && (!action.key || !reservedKeys.includes(action.key))) {\n updatedActions.push(action);\n }\n });\n return updatedActions;\n\n}\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport type { BreadcrumbEntry, BreadcrumbsController } from \"@rebasepro/types\";\n\nconst DEFAULT_BREADCRUMBS_CONTROLLER: BreadcrumbsController = {\n breadcrumbs: [],\n set: () => {\n },\n updateCount: () => {\n }\n};\n\nexport const BreadcrumbContext = React.createContext<BreadcrumbsController>(DEFAULT_BREADCRUMBS_CONTROLLER);\n\ninterface BreadcrumbsProviderProps {\n children: React.ReactNode;\n}\n\nexport const BreadcrumbsProvider: React.FC<BreadcrumbsProviderProps> = ({ children }) => {\n\n const [breadcrumbs, setBreadcrumbs] = useState<BreadcrumbEntry[]>([]);\n\n const set = useCallback((props: {\n breadcrumbs: BreadcrumbEntry[];\n }) => {\n setBreadcrumbs(prev => {\n const next = props.breadcrumbs.map(newEntry => {\n const prevEntry = newEntry.id ? prev.find(p => p.id === newEntry.id) : undefined;\n if (prevEntry && newEntry.count === null && typeof prevEntry.count === \"number\") {\n return { ...newEntry,\ncount: prevEntry.count };\n }\n return newEntry;\n });\n // Bail out if nothing changed — return same reference to skip re-render\n if (prev.length === next.length && prev.every((p, i) =>\n p.title === next[i].title && p.url === next[i].url && p.id === next[i].id && p.count === next[i].count\n )) {\n return prev;\n }\n return next;\n });\n }, []);\n\n const updateCount = useCallback((id: string, count: number | null | undefined) => {\n setBreadcrumbs(prev => prev.map(entry =>\n entry.id === id ? { ...entry,\ncount } : entry\n ));\n }, []);\n\n const value = useMemo(() => ({\n breadcrumbs,\n set,\n updateCount\n }), [breadcrumbs, set, updateCount]);\n\n return (\n <BreadcrumbContext.Provider value={value}>\n {children}\n </BreadcrumbContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { BreadcrumbContext } from \"../contexts/BreacrumbsContext\";\nimport { BreadcrumbEntry, BreadcrumbsController } from \"@rebasepro/types\";\n\nexport type { BreadcrumbEntry, BreadcrumbsController };\n\n\n/**\n * Hook to retrieve the BreadcrumbsController.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @see BreadcrumbsController\n * @group Hooks and utilities\n */\nexport const useBreadcrumbsController = (): BreadcrumbsController => useContext(BreadcrumbContext);\n","import React from \"react\";\nimport { Typography } from \"@rebasepro/ui\";\n\nexport function FieldCaption({\n error,\n children\n}: { error?: boolean, children?: React.ReactNode }) {\n if (!children) return null;\n return (\n <Typography variant={\"caption\"} color={error ? \"error\" : \"secondary\"} className={\"ml-3.5 mt-0.5\"}>\n {children}\n </Typography>\n );\n}\n","import React from \"react\";\n\nimport {\n coolIconKeys,\n debounce,\n IconButton,\n iconKeys,\n iconSize,\n lucideIcons,\n SearchBar,\n Tooltip\n} from \"@rebasepro/ui\";\nimport { iconsSearch } from \"@rebasepro/app\";\nimport { useTranslation } from \"@rebasepro/app\";\n\nconst UPDATE_SEARCH_INDEX_WAIT_MS = 220;\n\n\nfunction toPascalCase(str: string): string {\n return str.split(/[-_]/).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(\"\");\n}\n\nfunction resolveIcon(iconKey: string): React.ComponentType<{ size: number }> | null {\n const allIcons = lucideIcons as Record<string, React.ComponentType<{ size: number }>>;\n let icon = allIcons[iconKey];\n if (!icon) {\n icon = allIcons[toPascalCase(iconKey)];\n }\n return icon ?? null;\n}\n\nexport interface SearchIconsProps {\n selectedIcon?: string;\n onIconSelected?: (icon: string) => void;\n}\n\nexport function SearchIconsView({\n selectedIcon = \"\",\n onIconSelected\n}: SearchIconsProps) {\n const { t } = useTranslation();\n const [keys, setKeys] = React.useState<string[] | null>(null);\n const [query, setQuery] = React.useState<string>(\"\");\n\n const updateSearchResults = React.useMemo(() =>\n debounce((value: string) => {\n if (!value || value === \"\") {\n setKeys(null);\n } else {\n const searchResult = iconsSearch.search(value);\n const limit = 50;\n const limited = searchResult.slice(0, limit);\n setKeys(limited.map((e) => e.item.key));\n }\n }, UPDATE_SEARCH_INDEX_WAIT_MS), []\n );\n\n React.useEffect(() => {\n updateSearchResults(query);\n return () => {\n updateSearchResults.clear();\n };\n }, [query, updateSearchResults]);\n\n const icons = keys === null ? coolIconKeys : keys;\n\n return (\n <>\n <SearchBar\n autoFocus={false}\n innerClassName={\"w-full sticky top-0 z-10\"}\n onTextSearch={(value?: string) => setQuery(value ?? \"\")}\n placeholder={t(\"search_for_more_icons\")}\n />\n\n <div className={\"flex max-w-full flex-wrap mt-4\"}>\n {icons.map((icon: string) => {\n const LucideIcon = resolveIcon(icon);\n if (!LucideIcon) return null;\n return (\n <Tooltip title={icon} key={icon}\n asChild={true}>\n <IconButton\n shape={\"square\"}\n toggled={selectedIcon === icon}\n onClick={onIconSelected ? () => onIconSelected(icon) : undefined}\n className=\"box-content m-1\"\n >\n <LucideIcon size={iconSize.medium}/>\n </IconButton>\n </Tooltip>\n );\n })}\n </div>\n </>\n );\n}\n","import type { PropertyConfig, Property } from \"@rebasepro/types\";\nimport { getDefaultFieldConfig } from \"./field_configs\";\nimport { getIconForWidget } from \"../util/property_utils\";\n\nexport function PropertyConfigBadge({\n propertyConfig,\n disabled,\n size = \"medium\"\n}: {\n propertyConfig: PropertyConfig | undefined,\n disabled?: boolean,\n size?: \"extraSmall\" | \"small\" | \"medium\"\n}): React.ReactNode {\n const sizeClasses = size === \"extraSmall\" ? \"h-5 w-5\" : size === \"small\" ? \"h-6 w-6\" : \"h-8 w-8\";\n const iconSize = size === \"extraSmall\" ? 14 : size === \"small\" ? \"smallest\" : \"small\";\n const classes = `${sizeClasses} flex-shrink-0 flex items-center justify-center rounded-full shadow-2xs text-white ` + (disabled ? \"bg-surface-400 dark:bg-surface-600\" : \"\");\n\n const defaultPropertyConfig = typeof propertyConfig?.property === \"object\" ? getDefaultFieldConfig(propertyConfig.property as Property) : undefined;\n\n return <div\n className={classes}\n style={{\n background: !disabled ? (propertyConfig?.color ?? defaultPropertyConfig?.color ?? \"#888\") : undefined\n }}>\n {propertyConfig?.Icon ? getIconForWidget(propertyConfig, iconSize) : getIconForWidget(defaultPropertyConfig, iconSize)}\n </div>\n}\n","\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n closestCenter,\n DndContext,\n DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\n\nimport { SortableContext, useSortable, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cls,\n CopyIcon,\n HandleIcon,\n IconButton,\n iconSize,\n Menu,\n MenuItem,\n MinusIcon,\n PlusIcon,\n Tooltip,\n useOutsideAlerter\n} from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\nimport { getHashValue } from \"@rebasepro/utils\";\n\nexport type ArrayEntryParams = {\n index: number;\n internalId: number;\n isDragging: boolean;\n storedProps?: object;\n storeProps: (props: object) => void;\n};\n\nexport type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;\n\nexport interface ArrayContainerProps<T> {\n droppableId: string;\n value: T[];\n addLabel: string;\n buildEntry: ArrayEntryBuilder;\n disabled?: boolean;\n size?: \"small\" | \"medium\";\n onInternalIdAdded?: (id: number) => void;\n\n canAddElements?: boolean;\n sortable?: boolean;\n newDefaultEntry: T;\n onValueChange: (value: T[]) => void;\n className?: string;\n min?: number;\n max?: number;\n}\n\nconst buildIdsMap = (value: unknown[]) =>\n value && Array.isArray(value) && value.length > 0\n ? value\n .map((v, index) => {\n if (!v) return {};\n return {\n [getHashValue(v) ?? String(index) + index]: getRandomId()\n };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {})\n : {};\n\ntype SortableItemProps = {\n id: number;\n index: number;\n size?: \"small\" | \"medium\";\n disabled: boolean;\n buildEntry: ArrayEntryBuilder;\n remove: (index: number) => void;\n copy: (index: number) => void;\n addInIndex?: (index: number) => void;\n canAddElements?: boolean;\n sortable: boolean;\n storedProps?: object;\n updateItemCustomProps: (internalId: number, props: object) => void;\n};\n\nfunction SortableItem({\n id,\n index,\n size,\n disabled,\n buildEntry,\n remove,\n copy,\n addInIndex,\n canAddElements,\n sortable,\n storedProps,\n updateItemCustomProps\n}: SortableItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id });\n\n const style = transform ? {\n transform: CSS.Transform.toString(transform),\n transition\n } : {};\n const dragHandleProps = { ...listeners,\n...attributes };\n\n return (\n <ArrayContainerItem\n nodeRef={setNodeRef}\n style={style}\n dragHandleProps={dragHandleProps}\n internalId={id}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n addInIndex={addInIndex}\n canAddElements={canAddElements}\n sortable={sortable}\n isDragging={isDragging}\n storedProps={storedProps}\n updateItemCustomProps={updateItemCustomProps}\n />\n );\n}\n\ntype ArrayContainerItemProps = {\n nodeRef: (node: HTMLElement | null) => void;\n style: React.CSSProperties;\n dragHandleProps: Record<string, unknown>;\n index: number;\n internalId: number;\n size?: \"small\" | \"medium\";\n disabled: boolean;\n buildEntry: ArrayEntryBuilder;\n remove: (index: number) => void;\n copy: (index: number) => void;\n addInIndex?: (index: number) => void;\n canAddElements?: boolean;\n sortable: boolean;\n isDragging: boolean;\n storedProps?: object;\n updateItemCustomProps: (internalId: number, props: object) => void;\n};\n\nexport function ArrayContainerItem({\n nodeRef,\n style,\n dragHandleProps,\n index,\n internalId,\n size,\n disabled,\n buildEntry,\n remove,\n copy,\n addInIndex,\n canAddElements,\n sortable,\n isDragging,\n storedProps,\n updateItemCustomProps\n}: ArrayContainerItemProps) {\n return (\n <div\n ref={nodeRef}\n style={style}\n className={`relative ${!isDragging ? \"hover\\\\:bg-surface-accent-50 dark\\\\:hover\\\\:bg-surface-800 dark\\\\:hover\\\\:bg-opacity-20 dark\\\\:hover\\\\:bg-surface-800/20\" : \"\"} rounded-md opacity-100`}\n >\n <div className=\"flex items-start\">\n <div className=\"flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark\">\n {buildEntry({\n index,\n internalId,\n isDragging,\n storedProps,\n storeProps: (props: object) => updateItemCustomProps(internalId, props)\n })}\n </div>\n <ArrayItemOptions\n dragHandleProps={dragHandleProps}\n direction={size === \"small\" ? \"row\" : \"column\"}\n disabled={disabled}\n remove={remove}\n index={index}\n copy={copy}\n canAddElements={canAddElements}\n sortable={sortable}\n addInIndex={addInIndex}\n />\n </div>\n </div>\n );\n}\n\nexport function ArrayItemOptions({\n dragHandleProps,\n direction,\n disabled,\n remove,\n index,\n copy,\n canAddElements,\n sortable,\n addInIndex\n}: {\n dragHandleProps: Record<string, unknown>;\n direction?: \"row\" | \"column\";\n disabled: boolean;\n remove: (index: number) => void;\n index: number;\n copy: (index: number) => void;\n sortable: boolean;\n canAddElements?: boolean;\n addInIndex?: (index: number) => void;\n}) {\n const [menuOpen, setMenuOpen] = useState(false);\n const iconRef = useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n useOutsideAlerter(iconRef, () => {\n if (menuOpen) setMenuOpen(false);\n });\n\n const showMenu = canAddElements ?? false;\n\n const handleIconButtonClick = (e: React.MouseEvent) => {\n if (showMenu) {\n e.stopPropagation();\n e.preventDefault();\n setMenuOpen(o => !o);\n } else if (sortable) {\n // Allow drag to propagate if menu is not shown\n } else {\n e.stopPropagation();\n e.preventDefault();\n }\n };\n\n const title = !disabled && sortable && showMenu ? \"Drag to move. Click for options\" :\n !disabled && showMenu ? \"Click for options\" :\n !disabled && sortable ? \"Drag to move\" : undefined;\n\n return (\n <div ref={iconRef}\n className={`pl-2 pt-1 pb-1 flex ${direction === \"row\" ? \"flex-row-reverse\" : \"flex-col\"} items-center`}>\n <Tooltip\n delayDuration={400}\n open={menuOpen ? false : undefined}\n side={direction === \"column\" ? \"left\" : undefined}\n title={title}\n >\n <IconButton\n size=\"small\"\n disabled={disabled || (!showMenu && !sortable)}\n {...(sortable ? dragHandleProps : {})}\n onClick={handleIconButtonClick}\n onFocus={() => {\n if (sortable && menuOpen) setMenuOpen(false);\n }}\n className={cls(\n (disabled || (!sortable && !showMenu)) ? \"cursor-inherit\" : \"\",\n sortable && !disabled ? \"cursor-grab\" : \"\",\n !sortable && showMenu && !disabled ? \"cursor-pointer\" : \"\"\n )}\n >\n <HandleIcon/>\n </IconButton>\n </Tooltip>\n {showMenu && (\n <Menu portalContainer={iconRef.current} open={menuOpen} trigger={<div tabIndex={-1}/>}>\n <MenuItem\n dense\n onClick={(e: React.MouseEvent) => {\n setMenuOpen(false);\n remove(index);\n }}\n >\n <MinusIcon size={iconSize.small}/>\n {t(\"remove\")}\n </MenuItem>\n <MenuItem\n dense\n onClick={() => {\n setMenuOpen(false);\n copy(index);\n }}\n >\n <CopyIcon size={iconSize.small}/>\n {t(\"copy\")}\n </MenuItem>\n {addInIndex && (\n <MenuItem\n dense\n onClick={() => {\n setMenuOpen(false);\n addInIndex(index);\n }}\n >\n <ChevronUpIcon size={iconSize.small}/>\n {t(\"add_on_top\")}\n </MenuItem>\n )}\n {addInIndex && (\n <MenuItem\n dense\n onClick={() => {\n setMenuOpen(false);\n addInIndex(index + 1);\n }}\n >\n <ChevronDownIcon size={iconSize.small}/>\n {t(\"add_below\")}\n </MenuItem>\n )}\n </Menu>\n )}\n </div>\n );\n}\n\nexport function ArrayContainer<T>({\n droppableId,\n addLabel,\n value,\n disabled = false,\n buildEntry,\n size = \"medium\",\n onInternalIdAdded,\n canAddElements: canAddElementsProp = true,\n sortable = true,\n newDefaultEntry,\n onValueChange,\n className,\n min = 0,\n max = Infinity\n}: ArrayContainerProps<T>) {\n const canAddElements = canAddElementsProp;\n\n const hasValue = value && Array.isArray(value) && value.length > 0;\n const internalIdsRef = useRef<Record<string, number>>(buildIdsMap(value));\n const [internalIds, setInternalIds] = useState<number[]>(\n hasValue ? Object.values(internalIdsRef.current) : []\n );\n const itemCustomPropsRef = useRef<Record<number, object>>({});\n\n const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {\n itemCustomPropsRef.current[internalId] = customProps;\n }, []);\n\n const pointerSensor = useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5\n }\n });\n const keyboardSensor = useSensor(KeyboardSensor, {});\n const sensors = useSensors(pointerSensor, keyboardSensor);\n\n useEffect(() => {\n if (hasValue && value && value.length !== internalIds.length) {\n const newInternalIds = value.map((v, index) => {\n const hashValue = (getHashValue(v) ?? String(index)) + index;\n if (hashValue in internalIdsRef.current) {\n return internalIdsRef.current[hashValue];\n } else {\n const newInternalId = getRandomId();\n internalIdsRef.current[hashValue] = newInternalId;\n return newInternalId;\n }\n });\n setInternalIds(newInternalIds);\n }\n }, [hasValue, internalIds.length, value]);\n\n const insertInEnd = (e: React.SyntheticEvent) => {\n e.preventDefault();\n if (disabled || (value ?? []).length >= max) return;\n const id = getRandomId();\n const newIds: number[] = [...internalIds, id];\n if (onInternalIdAdded) onInternalIdAdded(id);\n setInternalIds(newIds);\n onValueChange([...(value ?? []), newDefaultEntry]);\n };\n\n const remove = (index: number) => {\n if ((value ?? []).length <= min) return;\n const newIds = [...internalIds];\n newIds.splice(index, 1);\n setInternalIds(newIds);\n onValueChange((value ?? []).filter((_, i) => i !== index));\n };\n\n const copy = (index: number) => {\n if ((value ?? []).length >= max) return;\n const id = getRandomId();\n const copyingItem = (value ?? [])[index];\n const newIds: number[] = [\n ...internalIds.slice(0, index + 1),\n id,\n ...internalIds.slice(index + 1)\n ];\n if (onInternalIdAdded) onInternalIdAdded(id);\n setInternalIds(newIds);\n onValueChange([...(value ?? []).slice(0, index + 1), copyingItem, ...(value ?? []).slice(index + 1)]);\n };\n\n const addInIndex = (index: number) => {\n if ((value ?? []).length >= max) return;\n const id = getRandomId();\n const newIds: number[] = [\n ...internalIds.slice(0, index),\n id,\n ...internalIds.slice(index)\n ];\n if (onInternalIdAdded) onInternalIdAdded(id);\n setInternalIds(newIds);\n onValueChange([...(value ?? []).slice(0, index), newDefaultEntry, ...(value ?? []).slice(index)]);\n };\n\n const onDragEnd = (event: DragEndEvent) => {\n const {\n active,\n over\n } = event;\n if (!over || active.id === over.id) return;\n\n const oldIndex = internalIds.indexOf(active.id as number);\n const newIndex = internalIds.indexOf(over.id as number);\n if (oldIndex === -1 || newIndex === -1) return;\n const newIds = arrayMove(internalIds, oldIndex, newIndex);\n setInternalIds(newIds);\n onValueChange(arrayMove(value ?? [], oldIndex, newIndex));\n };\n\n return sortable ? (\n <DndContext sensors={sensors}\n modifiers={[restrictToVerticalAxis]}\n collisionDetection={closestCenter}\n onDragEnd={onDragEnd}>\n <SortableContext items={internalIds} strategy={verticalListSortingStrategy}>\n <div className={cls(\"space-y-1\", className)} id={droppableId}>\n {hasValue &&\n internalIds.map((internalId: number, index: number) => (\n <SortableItem\n key={`array_field_${internalId}`}\n id={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n addInIndex={addInIndex}\n canAddElements={canAddElements}\n sortable={sortable}\n storedProps={itemCustomPropsRef.current[internalId]}\n updateItemCustomProps={updateItemCustomProps}\n />\n ))}\n {canAddElements && (\n <div className=\"my-4 justify-center text-left\">\n <Button\n variant={\"text\"}\n size={size === \"small\" ? \"small\" : \"medium\"}\n disabled={disabled || (value?.length ?? 0) >= max}\n startIcon={<PlusIcon/>}\n onClick={insertInEnd}\n >\n {addLabel ?? \"Add\"}\n </Button>\n </div>\n )}\n </div>\n </SortableContext>\n </DndContext>\n ) : (\n <div className={cls(\"space-y-1\", className)} id={droppableId}>\n {hasValue &&\n internalIds.map((internalId: number, index: number) => (\n <ArrayContainerItem\n key={`array_field_${internalId}`}\n nodeRef={(node: HTMLElement | null) => {\n }}\n style={{}}\n dragHandleProps={{}}\n internalId={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n addInIndex={addInIndex}\n canAddElements={canAddElements}\n sortable={false}\n isDragging={false}\n storedProps={itemCustomPropsRef.current[internalId]}\n updateItemCustomProps={updateItemCustomProps}\n />\n ))}\n {canAddElements && (\n <div className=\"my-4 justify-center text-left\">\n <Button\n variant={\"text\"}\n size={size === \"small\" ? \"small\" : \"medium\"}\n disabled={disabled || (value?.length ?? 0) >= max}\n startIcon={<PlusIcon/>}\n onClick={insertInEnd}\n >\n {addLabel ?? \"Add\"}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction arrayMove<T>(value: T[], sourceIndex: number, destinationIndex: number): T[] {\n const result = Array.from(value);\n const [removed] = result.splice(sourceIndex, 1);\n result.splice(destinationIndex, 0, removed);\n return result;\n}\n\nexport function getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n","import type { Worksheet } from \"exceljs\";\n\n/**\n * Extract column headers from the first row of an ExcelJS worksheet.\n * Returns an array of header strings in column order.\n */\nexport function getWorksheetHeaders(worksheet: Worksheet): string[] {\n const headers: string[] = [];\n const headerRow = worksheet.getRow(1);\n headerRow.eachCell({ includeEmpty: false }, (cell, colNumber) => {\n headers[colNumber - 1] = cell.text ?? `Column${colNumber}`;\n });\n return headers.filter(Boolean);\n}\n","/**\n * Take an object with keys of type `address.street`, `address.city` and\n * convert it to an object with nested objects like `{ address: { street: ..., city: ... } }`\n * @param flatObj\n */\nexport function unflattenObject(flatObj: { [key: string]: any }) {\n return Object.keys(flatObj).reduce((nestedObj, key) => {\n let currentObj = nestedObj;\n const keyParts = key.split(\".\");\n keyParts.forEach((keyPart, i) => {\n\n if (/^[\\w]+\\[\\d+\\]$/.test(keyPart)) {\n const mainPropertyName = keyPart.slice(0, keyPart.indexOf(\"[\"));\n const index = parseInt(keyPart.slice(keyPart.indexOf(\"[\") + 1, keyPart.indexOf(\"]\")));\n\n if (!currentObj[mainPropertyName]) {\n currentObj[mainPropertyName] = []\n }\n\n if (i !== keyParts.length - 1) {\n currentObj[mainPropertyName][index] = currentObj[mainPropertyName][index] || {};\n currentObj = currentObj[mainPropertyName][index];\n } else {\n currentObj[mainPropertyName][index] = flatObj[key];\n }\n } else if (i !== keyParts.length - 1) {\n currentObj[keyPart] = currentObj[keyPart] || {};\n currentObj = currentObj[keyPart];\n } else {\n currentObj[keyPart] = flatObj[key];\n }\n\n });\n return nestedObj;\n }, {} as { [key: string]: any });\n}\n\nexport function mapJsonParse(obj: Record<string, any>) {\n return Object.keys(obj).reduce((acc: Record<string, any>, key) => {\n try {\n acc[key] = JSON.parse(obj[key]);\n } catch (e) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n","import ExcelJS from \"exceljs\";\nimport { getWorksheetHeaders } from \"./file_headers\";\nimport { mapJsonParse, unflattenObject } from \"./transforms\";\n\n// Re-export for backwards compat (tests import from this file)\nexport { unflattenObject } from \"./transforms\";\n\ntype ConversionResult = {\n data: object[];\n propertiesOrder: string[]\n}\n\nexport function convertFileToJson(file: File): Promise<ConversionResult> {\n return new Promise((resolve, reject) => {\n if (file.type === \"application/json\") {\n console.debug(\"Converting JSON file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = function (e) {\n try {\n const data = e.target?.result as string;\n const jsonData = JSON.parse(data);\n if (!Array.isArray(jsonData)) {\n reject(new Error(\"JSON file should contain an array of objects\"));\n } else {\n const propertiesOrder = jsonData.length > 0 ? Object.keys(jsonData[0]) : [];\n resolve({\n data: jsonData,\n propertiesOrder\n });\n }\n } catch (e) {\n console.error(\"Error parsing JSON file\", e);\n reject(e);\n }\n };\n reader.readAsText(file);\n } else {\n console.debug(\"Converting Excel file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = async function (e) {\n try {\n const buffer = e.target?.result as ArrayBuffer;\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(buffer);\n const worksheet = workbook.worksheets[0];\n if (!worksheet) {\n reject(new Error(\"No worksheets found in file\"));\n return;\n }\n\n const headers = getWorksheetHeaders(worksheet);\n\n // Convert rows to JSON objects (skip header row)\n const parsedData: Array<Record<string, any>> = [];\n worksheet.eachRow({ includeEmpty: false }, (row, rowNumber) => {\n if (rowNumber === 1) return;\n const obj: Record<string, any> = {};\n row.eachCell({ includeEmpty: false }, (cell, colNumber) => {\n const header = headers[colNumber - 1];\n if (header) {\n obj[header] = cell.value;\n }\n });\n parsedData.push(obj);\n });\n\n const cleanedData = parsedData.map(mapJsonParse);\n const jsonData = cleanedData.map(unflattenObject);\n resolve({\n data: jsonData,\n propertiesOrder: headers\n });\n } catch (err) {\n console.error(\"Error parsing Excel file\", err);\n reject(err);\n }\n };\n reader.readAsArrayBuffer(file);\n }\n });\n}\n","import { FileUpload, UploadIcon } from \"@rebasepro/ui\";\nimport { convertFileToJson } from \"../utils/file_to_json\";\nimport { useSnackbarController } from \"@rebasepro/app\";\n\nexport function ImportFileUpload({ onDataAdded }: {\n onDataAdded: (data: object[], propertiesOrder?: string[]) => void\n}) {\n const snackbarController = useSnackbarController();\n return <FileUpload\n accept={{\n \"text/*\": [\".csv\", \".xls\", \".xlsx\"],\n \"application/vnd.ms-excel\": [\".xls\", \".xlsx\"],\n \"application/msexcel\": [\".xls\", \".xlsx\"],\n \"application/vnd.ms-office\": [\".xls\", \".xlsx\"],\n \"application/xls\": [\".xls\", \".xlsx\"],\n \"application/x-xls\": [\".xls\", \".xlsx\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xls\", \".xlsx\"],\n \"application/json\": [\".json\"]\n }}\n preventDropOnDocument={true}\n size={\"small\"}\n maxFiles={1}\n uploadDescription={<><UploadIcon/>Drag and drop a file here or click to upload</>}\n onFilesAdded={(files: File[]) => {\n if (files.length > 0) {\n convertFileToJson(files[0])\n .then(({\n data,\n propertiesOrder\n }) => {\n onDataAdded(data, propertiesOrder);\n })\n .catch((error) => {\n console.error(\"Error parsing file\", error);\n snackbarController.open({\n type: \"error\",\n message: error.message\n });\n });\n }\n }}/>\n}\n","import { useData } from \"@rebasepro/app\";\nimport { Entity, CollectionConfig } from \"@rebasepro/types\";\nimport { RebaseData } from \"@rebasepro/types\";\nimport { Button, CenteredView, CircularProgress, Typography } from \"@rebasepro/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { ImportConfig } from \"../types\";\n\nexport function ImportSaveInProgress<C extends CollectionConfig<any>>\n ({\n path,\n importConfig,\n collection,\n onImportSuccess\n }:\n {\n path: string,\n importConfig: ImportConfig,\n collection: C,\n onImportSuccess: (collection: C) => void\n }) {\n\n const [errorSaving, setErrorSaving] = useState<Error | undefined>(undefined);\n const dataClient = useData();\n\n const savingRef = useRef<boolean>(false);\n\n const [processedEntities, setProcessedEntities] = useState<number>(0);\n\n function save() {\n\n if (savingRef.current)\n return;\n\n savingRef.current = true;\n\n saveDataBatch(\n dataClient,\n collection,\n path,\n importConfig.entities,\n 0,\n 25,\n setProcessedEntities\n ).then(() => {\n onImportSuccess(collection);\n savingRef.current = false;\n }).catch((e) => {\n setErrorSaving(e);\n savingRef.current = false;\n });\n }\n\n useEffect(() => {\n save();\n }, []);\n\n if (errorSaving) {\n return (\n <CenteredView className={\"flex flex-col gap-4 items-center\"}>\n <Typography variant={\"h6\"}>\n Error saving data\n </Typography>\n\n <Typography variant={\"body2\"} color={\"error\"}>\n {errorSaving.message}\n </Typography>\n <Button\n onClick={save}\n >\n Retry\n </Button>\n </CenteredView>\n );\n }\n\n return (\n <div className={\"flex flex-col gap-4 items-center\"}>\n <CircularProgress/>\n\n <Typography variant={\"h6\"}>\n Saving data\n </Typography>\n\n <Typography variant={\"body2\"}>\n {processedEntities}/{importConfig.entities.length} entities saved\n </Typography>\n\n <Typography variant={\"caption\"}>\n Do not close this tab or the import will be interrupted.\n </Typography>\n\n </div>\n );\n\n}\n\nfunction saveDataBatch(dataClient: RebaseData,\n collection: CollectionConfig,\n path: string,\n data: Partial<Entity<any>>[],\n offset = 0,\n batchSize = 25,\n onProgressUpdate: (progress: number) => void): Promise<void> {\n\n console.debug(\"Saving imported data\", offset, batchSize);\n\n const batch = data.slice(offset, offset + batchSize);\n return Promise.all(batch.map(d =>\n dataClient.collection(path).create(\n d.values,\n d.id\n )))\n .then(() => {\n if (offset + batchSize < data.length) {\n onProgressUpdate(offset + batchSize);\n return saveDataBatch(dataClient, collection, path, data, offset + batchSize, batchSize, onProgressUpdate);\n }\n onProgressUpdate(data.length);\n return Promise.resolve();\n });\n}\n","import { useState } from \"react\";\nimport { Entity, Property } from \"@rebasepro/types\";\nimport { ImportConfig } from \"../types\";\n\nexport const useImportConfig = (): ImportConfig => {\n\n const [inUse, setInUse] = useState<boolean>(false);\n const [defaultValues, setDefaultValues] = useState<Record<string, any>>({});\n const [idColumn, setIdColumn] = useState<string | undefined>();\n const [importData, setImportData] = useState<object[]>([]);\n const [entities, setEntities] = useState<Entity<any>[]>([]);\n const [headersMapping, setHeadersMapping] = useState<Record<string, string | null>>({});\n const [headingsOrder, setHeadingsOrder] = useState<string[]>([]);\n const [originProperties, setOriginProperties] = useState<Record<string, Property>>({});\n\n return {\n inUse,\n setInUse,\n idColumn,\n setIdColumn,\n entities,\n setEntities,\n importData,\n setImportData,\n headingsOrder: (headingsOrder ?? []).length > 0 ? headingsOrder : Object.keys(headersMapping),\n setHeadingsOrder,\n headersMapping,\n setHeadersMapping,\n originProperties,\n setOriginProperties,\n defaultValues,\n setDefaultValues\n };\n};\n","import { DataType } from \"@rebasepro/types\";\n\nexport function getInferenceType(value: any): DataType {\n if (typeof value === \"number\")\n return \"number\";\n else if (typeof value === \"string\")\n return \"string\";\n else if (typeof value === \"boolean\")\n return \"boolean\";\n else if (value instanceof Date)\n return \"date\";\n else if (Array.isArray(value))\n return \"array\";\n return \"map\";\n}\n\n\nfunction isUnixTimestamp(num: number): boolean {\n const numString = num.toString();\n // check if the number has 13 digits\n const isLengthValid = numString.length === 13;\n\n // check if it falls in the expected Unix timestamp range (from 1970 to 2100)\n const isInRange = num >= 0 && num <= 4102444800000;\n\n return isLengthValid && isInRange;\n}\n","import { getPropertyInPath } from \"../../util\";\nimport { AuthController, Entity, CollectionConfig, EntityReference, CollectionRegistryController, Properties, Property, Vector } from \"@rebasepro/types\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\nimport { unflattenObject } from \"./file_to_json\";\nimport { getIn } from \"@rebasepro/forms\";\nimport { inferTypeFromValue } from \"@rebasepro/inference\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\nexport function convertDataToEntity(authController: AuthController,\n navigation: CollectionRegistryController,\n data: Record<any, any>,\n idColumn: string | undefined,\n headersMapping: Record<string, string | null>,\n properties: Properties,\n path: string,\n defaultValues: Record<string, any>): Entity<any> {\n const flatObject = flattenEntry(data);\n if (idColumn)\n delete flatObject[idColumn];\n const mappedKeysObject = Object.entries(flatObject)\n .map(([key, value]) => {\n const mappedKey = (getIn(headersMapping, key) as string | undefined) ?? key;\n\n const mappedProperty = getPropertyInPath(properties, mappedKey);\n if (!mappedProperty) {\n return {};\n }\n const processedValue = processValueMapping(authController, value, navigation, mappedProperty);\n return ({\n [mappedKey]: processedValue\n });\n })\n .reduce((acc, curr) => ({ ...acc,\n...curr }), {});\n\n const values = mergeDeep(defaultValues ?? {}, unflattenObject(mappedKeysObject));\n let id = idColumn ? data[idColumn] : undefined;\n if (typeof id === \"string\") {\n id = id.trim();\n } else if (typeof id === \"number\") {\n id = id.toString();\n } else if (typeof id === \"boolean\") {\n id = id.toString();\n } else if (id instanceof Date) {\n id = id.toISOString();\n } else if (id && \"toString\" in id) {\n id = id.toString();\n }\n\n return {\n id,\n values,\n path: path\n };\n}\n\nexport function flattenEntry(obj: Record<string, unknown>, parent = \"\"): Record<string, unknown> {\n return Object.keys(obj).reduce<Record<string, unknown>>((acc, key) => {\n const prefixedKey = parent ? `${parent}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && !(obj[key] instanceof Date) && obj[key] !== null && !Array.isArray(obj[key])) {\n Object.assign(acc, flattenEntry(obj[key] as Record<string, unknown>, prefixedKey));\n } else {\n acc[prefixedKey] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\nexport function processValueMapping(authController: AuthController, value: any, navigation: CollectionRegistryController, property?: Property): any {\n if (value === null) return null;\n\n if (property === undefined) return value;\n const usedProperty: Property | null = property;\n if (usedProperty === null) return value;\n const from = inferTypeFromValue(value);\n const to = usedProperty.type;\n\n if (to === \"vector\") {\n if (value && typeof value === \"object\" && \"value\" in value && Array.isArray(value.value)) {\n return new Vector(value.value);\n } else if (Array.isArray(value)) {\n return new Vector(value.map(Number));\n } else if (typeof value === \"string\") {\n let cleaned = value.trim();\n if (cleaned.startsWith(\"[\") && cleaned.endsWith(\"]\")) {\n cleaned = cleaned.slice(1, -1);\n }\n if (cleaned === \"\") return null;\n return new Vector(cleaned.split(\",\").map(v => {\n const num = Number(v.trim());\n return isNaN(num) ? 0 : num;\n }));\n }\n return value;\n }\n\n if (from === \"array\" && to === \"array\" && Array.isArray(value) && usedProperty.of && !Array.isArray(usedProperty.of) && !isPropertyBuilder(usedProperty.of)) {\n return value.map(v => processValueMapping(authController, v, navigation, usedProperty.of as Property));\n } else if (from === \"string\" && to === \"number\" && typeof value === \"string\") {\n return Number(value);\n } else if (from === \"string\" && to === \"array\" && typeof value === \"string\" && usedProperty.of && !Array.isArray(usedProperty.of) && !isPropertyBuilder(usedProperty.of)) {\n return value.split(\",\").map((v: string) => processValueMapping(authController, v, navigation, usedProperty.of as Property));\n } else if (from === \"string\" && to === \"boolean\") {\n return value === \"true\";\n } else if (from === \"number\" && to === \"boolean\") {\n return value === 1;\n } else if (from === \"boolean\" && to === \"number\") {\n return value ? 1 : 0;\n } else if (from === \"boolean\" && to === \"string\") {\n return value ? \"true\" : \"false\";\n } else if (from === \"number\" && to === \"string\" && typeof value === \"number\") {\n return value.toString();\n } else if (from === \"string\" && to === \"array\" && typeof value === \"string\") {\n return value.split(\",\").map((v: string) => v.trim());\n } else if (from === \"string\" && to === \"date\" && typeof value === \"string\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (value instanceof Date && to === \"string\") {\n return value.toISOString();\n } else if (from === \"number\" && to === \"date\" && typeof value === \"number\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (from === \"string\" && to === \"reference\" && typeof value === \"string\") {\n // Parse optional database name in format: database_name:::path/to/entity\n // or simple format: path/to/entity\n let databaseId: string | undefined = undefined;\n let referencePath = value;\n\n if (value.includes(\":::\")) {\n const [dbName, pathPart] = value.split(\":::\");\n if (dbName && dbName !== \"(default)\") {\n databaseId = dbName;\n }\n referencePath = pathPart;\n }\n\n // split value into path and entityId (entityId is the last part of the path, after the last /)\n const path = referencePath.split(\"/\").slice(0, -1).join(\"/\");\n const entityId = referencePath.split(\"/\").slice(-1)[0];\n\n // If no explicit database was provided in the string, try to get it from the collection\n if (databaseId === undefined) {\n const targetCollection: CollectionConfig<any> | undefined = navigation.getCollection(path);\n databaseId = targetCollection?.databaseId;\n }\n\n return new EntityReference({ id: entityId,\npath,\ndatabaseId });\n\n } else if (from === to) {\n return value;\n } else if (from === \"array\" && to === \"string\" && Array.isArray(value)) {\n return value.join(\",\");\n }\n\n return value;\n}\n","\nimport { getPropertyInPath } from \"../../util\";\nimport { Properties, Property } from \"@rebasepro/types\";\nimport {\n BooleanSwitchWithLabel,\n ChevronRightIcon,\n DateTimeField,\n ExpandablePanel,\n Select,\n SelectItem,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n TextField,\n Typography\n} from \"@rebasepro/ui\";\nimport { getIn, setIn } from \"@rebasepro/forms\";\nimport { ImportConfig } from \"../types\";\n\nexport interface DataPropertyMappingProps {\n importConfig: ImportConfig;\n destinationProperties: Record<string, Property>;\n buildPropertyView?: (props: {\n isIdColumn: boolean,\n property: Property | null,\n propertyKey: string | null,\n importKey: string\n }) => any;\n}\n\nexport function DataNewPropertiesMapping({\n importConfig,\n destinationProperties,\n buildPropertyView\n}: DataPropertyMappingProps) {\n\n const headersMapping = importConfig.headersMapping;\n const headingsOrder = importConfig.headingsOrder;\n const idColumn = importConfig.idColumn;\n const originProperties = importConfig.originProperties;\n\n return (\n <>\n\n <IdSelectField idColumn={idColumn}\n headersMapping={headersMapping}\n onChange={(value) => importConfig.setIdColumn(value ?? undefined)}/>\n\n <div className={\"h-4\"}/>\n\n <Table style={{\n tableLayout: \"fixed\"\n }}>\n <TableHeader>\n <TableCell header={true} style={{ width: \"20%\" }}>\n Column in file\n </TableCell>\n <TableCell header={true}>\n </TableCell>\n <TableCell header={true} style={{ width: \"75%\" }}>\n Map to Property\n </TableCell>\n </TableHeader>\n <TableBody>\n {destinationProperties &&\n headingsOrder.map((importKey) => {\n const mappedKey = headersMapping[importKey];\n const propertyKey = headersMapping[importKey];\n const property = mappedKey ? getPropertyInPath(destinationProperties, mappedKey) as Property : null;\n\n const originProperty = getPropertyInPath(originProperties, importKey) as Property | undefined;\n const origintype = originProperty\n ? (originProperty.type === \"array\" && typeof originProperty.of === \"object\"\n ? `${originProperty.type} - ${(originProperty.of as Property).type}`\n : originProperty.type)\n : undefined;\n return <TableRow key={importKey} style={{ height: \"90px\" }}>\n <TableCell style={{ width: \"20%\" }}>\n <Typography variant={\"body2\"}>{importKey}</Typography>\n {originProperty && <Typography\n variant={\"caption\"}\n color={\"secondary\"}\n >{origintype}</Typography>}\n </TableCell>\n <TableCell>\n <ChevronRightIcon/>\n </TableCell>\n <TableCell className={importKey === idColumn ? \"text-center\" : undefined}\n style={{ width: \"75%\" }}>\n {buildPropertyView?.({\n isIdColumn: importKey === idColumn,\n property,\n propertyKey,\n importKey\n })}\n </TableCell>\n </TableRow>;\n }\n )}\n </TableBody>\n </Table>\n\n <ExpandablePanel title=\"Default values\" initiallyExpanded={false} innerClassName={\"p-4 mt-4\"}>\n\n <div className={\"text-sm text-surface-accent-500 dark:text-surface-accent-300 font-medium ml-3.5 mb-1\"}>\n You can select a default value for unmapped columns and empty values:\n </div>\n <Table style={{\n tableLayout: \"fixed\"\n }}>\n <TableHeader>\n <TableCell header={true} style={{ width: \"30%\" }}>\n Property\n </TableCell>\n <TableCell header={true}>\n </TableCell>\n <TableCell header={true} style={{ width: \"65%\" }}>\n Default value\n </TableCell>\n </TableHeader>\n <TableBody>\n {destinationProperties &&\n getAllPropertyKeys(destinationProperties).map((key) => {\n const property = getPropertyInPath(destinationProperties, key);\n if (typeof property !== \"object\" || property === null) {\n return null;\n }\n if (![\"number\", \"string\", \"boolean\", \"map\"].includes(property.type)) {\n return null;\n }\n return <TableRow key={key} style={{ height: \"70px\" }}>\n <TableCell style={{ width: \"20%\" }}>\n <Typography variant={\"body2\"}>{key}</Typography>\n </TableCell>\n <TableCell>\n <ChevronRightIcon/>\n </TableCell>\n <TableCell className={key === idColumn ? \"text-center\" : undefined}\n style={{ width: \"75%\" }}>\n <DefaultValuesField property={property}\n defaultValue={getIn(importConfig.defaultValues, key)}\n onValueChange={(value) => {\n const newValues = setIn(importConfig.defaultValues, key, value);\n importConfig.setDefaultValues(newValues as Record<string, any>);\n }}/>\n </TableCell>\n </TableRow>;\n }\n )}\n </TableBody>\n </Table>\n </ExpandablePanel>\n </>\n );\n}\n\nfunction getAllPropertyKeys(properties: Properties, currentKey?: string): string[] {\n return Object.entries(properties).reduce((acc, [key, property]) => {\n const accumulatedKey = currentKey ? `${currentKey}.${key}` : key;\n if (typeof property !== \"function\" && property.type === \"map\" && property.properties) {\n const childProperties = getAllPropertyKeys(property.properties, accumulatedKey);\n return [...acc, ...childProperties];\n }\n return [...acc, accumulatedKey];\n }, [] as string[]);\n}\n\nfunction IdSelectField({\n idColumn,\n headersMapping,\n onChange\n}: {\n idColumn?: string,\n headersMapping: Record<string, string | null>;\n onChange: (value: string | null) => void\n}) {\n return <div>\n <Select\n size={\"medium\"}\n value={idColumn ?? \"\"}\n fullWidth={true}\n onChange={(event) => {\n const value = event.target.value;\n onChange(value === \"__none__\" ? null : value);\n }}\n placeholder={\"Autogenerate ID\"}\n renderValue={(value) => {\n return <Typography variant={\"body2\"}>\n {value !== \"__none__\" ? value : \"Autogenerate ID\"}\n </Typography>;\n }}\n label={\"Column that will be used as ID for each document\"}>\n <SelectItem value={\"__none__\"}>Autogenerate ID</SelectItem>\n {Object.entries(headersMapping).map(([key, value]) => {\n return <SelectItem key={key} value={key}>{key}</SelectItem>;\n })}\n </Select>\n </div>;\n}\n\nfunction DefaultValuesField({\n property,\n onValueChange,\n defaultValue\n}: { property: Property, onValueChange: (value: any) => void, defaultValue?: any }) {\n if (property.type === \"string\") {\n return <TextField size={\"medium\"}\n placeholder={\"Default value\"}\n value={defaultValue ?? \"\"}\n onChange={(event) => onValueChange(event.target.value)}/>;\n } else if (property.type === \"number\") {\n return <TextField size={\"medium\"}\n type={\"number\"}\n value={defaultValue ?? \"\"}\n placeholder={\"Default value\"}\n onChange={(event) => onValueChange(event.target.value)}/>;\n } else if (property.type === \"boolean\") {\n return <BooleanSwitchWithLabel\n value={defaultValue ?? null}\n allowIndeterminate={true}\n size={\"small\"}\n onValueChange={(v: boolean | null) => onValueChange(v === null ? undefined : v)}\n label={defaultValue === undefined\n ? \"Do not set value\"\n : defaultValue === true\n ? \"Set value to true\"\n : \"Set value to false\"}\n />\n } else if (property.type === \"date\") {\n return <DateTimeField\n mode={property.mode ?? \"date\"}\n size={\"medium\"}\n value={defaultValue ?? undefined}\n onChange={(dateValue: Date | null) => {\n onValueChange(dateValue);\n }}\n clearable={true}\n />\n }\n\n return null;\n}\n","import React from \"react\";\nimport { useCustomizationController } from \"@rebasepro/app\";\nimport { Property } from \"@rebasepro/types\";\nimport { getFieldConfig } from \"../../components/field_configs\";\nimport { PropertyConfigBadge } from \"../../components/PropertyConfigBadge\";\nimport { ErrorBoundary, IconButton, PencilIcon, TextField } from \"@rebasepro/ui\";\n\nexport function ImportNewPropertyFieldPreview({\n propertyKey,\n property,\n onEditClick,\n includeName = true,\n onPropertyNameChanged,\n propertyTypeView\n}: {\n propertyKey: string | null,\n property: Property | null\n includeName?: boolean,\n onEditClick?: () => void,\n onPropertyNameChanged?: (propertyKey: string, value: string) => void,\n propertyTypeView?: any\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n return <ErrorBoundary>\n <div\n className=\"flex flex-row w-full items-center\">\n\n <div className={\"mx-4\"}>\n {propertyTypeView ?? <PropertyConfigBadge propertyConfig={widget ?? undefined}/>}\n </div>\n\n <div className=\"w-full flex flex-col grow\">\n\n <div className={\"flex flex-row items-center gap-2\"}>\n {includeName &&\n <TextField\n size={\"medium\"}\n className={\"text-base grow\"}\n value={property?.name ?? \"\"}\n onChange={(e) => {\n if (onPropertyNameChanged && propertyKey)\n onPropertyNameChanged(propertyKey, e.target.value);\n }}/>}\n\n <IconButton onClick={onEditClick} size={\"small\"}>\n <PencilIcon/>\n </IconButton>\n </div>\n\n </div>\n\n </div>\n </ErrorBoundary>\n}\n","import React, { createContext, useContext } from \"react\";\n\n/**\n * Holds the dialog state + rendering props that ConfigControllerProvider\n * sets and CollectionEditorDialogs reads.\n *\n * This indirection exists because ConfigControllerProvider is a root-scope\n * plugin provider that wraps <RebaseShell>, therefore living ABOVE the CMS\n * context providers (CollectionRegistryContext, NavigationStateContext,\n * UrlContext). The actual dialog components need those contexts, so they\n * must render inside the shell tree.\n */\nexport interface CollectionEditorDialogsState {\n /** Props for the active CollectionEditorDialog, or undefined when closed. */\n collectionDialogProps: Record<string, any> | undefined;\n /** Props for the active PropertyFormDialog, or undefined when closed. */\n propertyDialogProps: Record<string, any> | undefined;\n}\n\nexport const CollectionEditorDialogsContext =\n createContext<CollectionEditorDialogsState | undefined>(undefined);\n\nexport function useCollectionEditorDialogsState(): CollectionEditorDialogsState | undefined {\n return useContext(CollectionEditorDialogsContext);\n}\n","import { useUrlController } from \"./_cms_internals\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Entity, CollectionConfig, Property, TableMetadata, User } from \"@rebasepro/types\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { useCustomizationController, useRebaseContext, useAuthController, useSnackbarController } from \"@rebasepro/app\";\nimport { getTableName } from \"@rebasepro/common\";\nimport { useNavigate } from \"react-router-dom\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { CollectionGenerationCallback } from \"./api/generateCollectionApi\";\nimport { CollectionEditorDialogsContext, CollectionEditorDialogsState } from \"./CollectionEditorDialogsContext\";\n\nexport const ConfigControllerContext = React.createContext<CollectionsConfigController>({} as CollectionsConfigController);\nexport const CollectionEditorContext = React.createContext<CollectionEditorController>({} as CollectionEditorController);\n\nexport interface ConfigControllerProviderProps {\n /**\n * Controller for managing the collections' config.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Callback used to infer the schema from the data.\n */\n collectionInference?: CollectionInference;\n\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n pathSuggestions?: string[];\n\n getUser?: (uid: string) => User | null;\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n /**\n * Callback function for generating/modifying collections.\n * The plugin is API-agnostic - the consumer provides the implementation.\n */\n generateCollection?: CollectionGenerationCallback;\n\n}\n\nexport const ConfigControllerProvider = React.memo(\n function ConfigControllerProvider({\n children,\n collectionConfigController,\n collectionInference,\n extraView,\n getUser,\n getData,\n onAnalyticsEvent,\n pathSuggestions,\n generateCollection\n }: ConfigControllerProviderProps & { children?: React.ReactNode }) {\n\n // Internal: fetch unmapped tables and table columns from the data source\n const { databaseAdmin } = useRebaseContext();\n const authController = useAuthController();\n const [unmappedTables, setUnmappedTables] = useState<string[]>([]);\n\n useEffect(() => {\n if (!databaseAdmin?.fetchUnmappedTables || authController.initialLoading || !authController.user) return;\n const existingPaths = (collectionConfigController.collections ?? []).map(c => getTableName(c) ?? \"\").filter(Boolean);\n databaseAdmin.fetchUnmappedTables(existingPaths)\n .then((tables: string[]) => setUnmappedTables(tables))\n .catch((e: unknown) => console.warn(\"Could not fetch unmapped tables:\", e));\n }, [databaseAdmin, authController.initialLoading, authController.user, collectionConfigController.collections]);\n\n const onFetchTableMetadata = useCallback(async (tableName: string): Promise<TableMetadata | undefined> => {\n return databaseAdmin?.fetchTableMetadata?.(tableName) as Promise<TableMetadata | undefined>;\n }, [databaseAdmin]);\n\n const urlController = useUrlController();\n const navigate = useNavigate();\n const snackbarController = useSnackbarController();\n const { propertyConfigs } = useCustomizationController();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n parentCollection?: CollectionConfig,\n editedCollectionId?: string,\n path?: string,\n parentCollectionSlugs: string[], parentEntityIds: string[],\n initialValues?: {\n path?: string,\n name?: string\n },\n copyFrom?: CollectionConfig,\n redirect: boolean,\n existingEntities?: Entity[],\n pathSuggestions?: string[];\n initialView?: \"general\" | \"display\" | \"properties\";\n expandKanban?: boolean;\n }>();\n\n const [currentPropertyDialog, setCurrentPropertyDialog] = React.useState<{\n propertyKey?: string,\n property?: Property,\n namespace?: string,\n parentCollection?: CollectionConfig,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n path?: string,\n parentCollectionSlugs: string[], parentEntityIds: string[],\n\n existingEntities?: Entity[];\n collection?: CollectionConfig;\n }>();\n\n\n const editCollection = useCallback(({\n id,\n path,\n parentCollectionSlugs, parentEntityIds,\n parentCollection,\n existingEntities,\n initialView,\n expandKanban\n }: {\n id?: string,\n path?: string,\n parentCollectionSlugs: string[], parentEntityIds: string[],\n parentCollection?: CollectionConfig,\n existingEntities?: Entity[],\n initialView?: \"general\" | \"display\" | \"properties\",\n expandKanban?: boolean\n }) => {\n console.debug(\"Edit collection\", id, path, parentCollectionSlugs, parentEntityIds, parentCollection);\n onAnalyticsEvent?.(\"edit_collection\", {\n id,\n path\n });\n setCurrentDialog({\n editedCollectionId: id,\n path,\n parentCollectionSlugs,\nparentEntityIds,\n isNewCollection: false,\n parentCollection,\n redirect: false,\n existingEntities,\n pathSuggestions,\n initialView,\n expandKanban\n });\n }, [onAnalyticsEvent, pathSuggestions]);\n\n const editProperty = useCallback(({\n propertyKey,\n property,\n editedCollectionId,\n currentPropertiesOrder,\n parentCollectionSlugs, parentEntityIds,\n collection,\n existingEntities\n }: {\n propertyKey?: string,\n property?: Property,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n parentCollectionSlugs: string[], parentEntityIds: string[],\n collection: CollectionConfig,\n existingEntities?: Entity[]\n }) => {\n console.debug(\"Edit property\", propertyKey, property, editedCollectionId, currentPropertiesOrder, parentCollectionSlugs, parentEntityIds, collection);\n onAnalyticsEvent?.(\"edit_property\", {\n propertyKey,\n editedCollectionId\n });\n // namespace is all the path until the last dot\n const namespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(0, propertyKey.lastIndexOf(\".\"))\n : undefined;\n const propertyKeyWithoutNamespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(propertyKey.lastIndexOf(\".\") + 1)\n : propertyKey;\n setCurrentPropertyDialog({\n propertyKey: propertyKeyWithoutNamespace,\n property,\n namespace,\n currentPropertiesOrder,\n editedCollectionId,\n parentCollectionSlugs,\nparentEntityIds,\n\n existingEntities,\n collection\n });\n }, [onAnalyticsEvent]);\n\n const createCollection = useCallback(({\n parentCollectionSlugs, parentEntityIds,\n parentCollection,\n initialValues,\n copyFrom,\n redirect,\n sourceClick\n }: {\n parentCollectionSlugs: string[], parentEntityIds: string[],\n parentCollection?: CollectionConfig\n initialValues?: {\n path?: string,\n name?: string\n },\n copyFrom?: CollectionConfig,\n redirect: boolean,\n sourceClick?: string\n }) => {\n console.debug(\"Create collection\", {\n parentCollectionSlugs,\nparentEntityIds,\n parentCollection,\n initialValues,\n copyFrom,\n redirect,\n sourceClick\n });\n onAnalyticsEvent?.(copyFrom ? \"duplicate_collection\" : \"create_collection\", {\n parentCollectionSlugs,\nparentEntityIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n });\n setCurrentDialog({\n isNewCollection: true,\n parentCollectionSlugs,\nparentEntityIds,\n parentCollection,\n initialValues,\n copyFrom,\n redirect,\n pathSuggestions\n });\n }, [onAnalyticsEvent, pathSuggestions]);\n\n // Build the dialog props objects that will be consumed by\n // CollectionEditorDialogs (rendered inside RebaseShell where CMS\n // contexts are available).\n const collectionDialogProps = useMemo(() => {\n if (!currentDialog) return undefined;\n return {\n open: true,\n configController: collectionConfigController,\n collectionInference,\n ...currentDialog,\n getData,\n extraView,\n getUser,\n generateCollection,\n onAnalyticsEvent,\n unmappedTables,\n onFetchTableMetadata,\n handleClose: (collection?: CollectionConfig) => {\n if (currentDialog?.redirect) {\n if (collection && currentDialog?.isNewCollection && !currentDialog.parentCollectionSlugs.length) {\n const url = urlController.buildUrlCollectionPath(collection.slug);\n navigate(url);\n }\n }\n setCurrentDialog(undefined);\n }\n };\n }, [\n currentDialog, collectionConfigController, collectionInference,\n getData, extraView, getUser, generateCollection,\n onAnalyticsEvent, unmappedTables, onFetchTableMetadata,\n urlController, navigate\n ]);\n\n const propertyDialogProps = useMemo(() => {\n if (!currentPropertyDialog) return undefined;\n return {\n open: true,\n includeIdAndName: true,\n existingProperty: Boolean(currentPropertyDialog.propertyKey),\n autoUpdateId: !currentPropertyDialog.propertyKey,\n autoOpenTypeSelect: !currentPropertyDialog.propertyKey,\n inArray: false,\n getData: currentPropertyDialog.existingEntities || (getData && currentPropertyDialog.editedCollectionId)\n ? async () => {\n let data: object[] = [];\n if (currentPropertyDialog.existingEntities) {\n data = currentPropertyDialog.existingEntities.map(e => e.values);\n }\n if (getData && currentPropertyDialog.editedCollectionId) {\n console.debug(\"Get data for property, path:\", currentPropertyDialog.editedCollectionId);\n const resolvedPath = urlController.resolveDatabasePathsFrom(currentPropertyDialog.editedCollectionId!);\n const fetchedData = await getData(resolvedPath, []);\n data.push(...fetchedData);\n }\n return data;\n }\n : undefined,\n onPropertyChanged: ({\n id,\n property\n }: { id?: string; property: Property }) => {\n if (!currentPropertyDialog) return;\n if (!id) return;\n const newProperty = !(currentPropertyDialog.propertyKey);\n return collectionConfigController.saveProperty({\n path: currentPropertyDialog.editedCollectionId,\n property,\n propertyKey: id,\n newPropertiesOrder: newProperty && currentPropertyDialog.currentPropertiesOrder ? [...currentPropertyDialog.currentPropertiesOrder, id] : undefined,\n namespace: currentPropertyDialog.namespace,\n parentCollectionSlugs: currentPropertyDialog.parentCollectionSlugs\n })\n .catch((e: any) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n },\n onPropertyChangedImmediate: false,\n onDelete: () => {\n if (!currentPropertyDialog.propertyKey) return;\n const newPropertiesOrder = currentPropertyDialog.currentPropertiesOrder?.filter((p: string) => p !== currentPropertyDialog.propertyKey);\n return collectionConfigController.deleteProperty({\n path: currentPropertyDialog.editedCollectionId,\n propertyKey: currentPropertyDialog.propertyKey,\n namespace: currentPropertyDialog.namespace,\n newPropertiesOrder,\n parentCollectionSlugs: currentPropertyDialog.parentCollectionSlugs\n })\n .then(() => {\n setCurrentPropertyDialog(undefined);\n }).catch((e: any) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n },\n onError: () => { },\n onOkClicked: () => {\n setCurrentPropertyDialog(undefined);\n },\n onCancel: () => {\n setCurrentPropertyDialog(undefined);\n },\n initialErrors: {},\n forceShowErrors: false,\n existingPropertyKeys: currentPropertyDialog.collection?.properties ? Object.keys(currentPropertyDialog.collection.properties) : [],\n allowDataInference: true,\n propertyConfigs,\n property: currentPropertyDialog.property,\n propertyKey: currentPropertyDialog.propertyKey\n };\n }, [currentPropertyDialog, getData, urlController, collectionConfigController, snackbarController, propertyConfigs]);\n\n const dialogsState: CollectionEditorDialogsState = useMemo(() => ({\n collectionDialogProps,\n propertyDialogProps\n }), [collectionDialogProps, propertyDialogProps]);\n\n const collectionEditorContextValue = useMemo(() => ({\n editCollection,\n createCollection,\n editProperty,\n pathSuggestions,\n configController: collectionConfigController\n }), [editCollection, createCollection, editProperty, pathSuggestions, collectionConfigController]);\n\n return (\n <ConfigControllerContext.Provider value={collectionConfigController}>\n <CollectionEditorContext.Provider value={collectionEditorContextValue}>\n <CollectionEditorDialogsContext.Provider value={dialogsState}>\n {children}\n </CollectionEditorDialogsContext.Provider>\n </CollectionEditorContext.Provider>\n </ConfigControllerContext.Provider>\n );\n }, equal);\n","import { useContext } from \"react\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorContext } from \"./ConfigControllerProvider\";\n\n/**\n * Hook to access the collection editor controller.\n * The methods in this controller can be used to open the collection editor dialog.\n */\nexport const useCollectionEditorController = (): CollectionEditorController => useContext(CollectionEditorContext);\n","import { useCollectionRegistryController } from \"../_cms_internals\";\nimport { useAuthController, useTranslation } from \"@rebasepro/app\";\nimport { CollectionConfig, CollectionActionsProps } from \"@rebasepro/types\";\nimport { IconButton, SettingsIcon, Tooltip } from \"@rebasepro/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function EditorCollectionAction({\n path,\n parentCollectionSlugs, parentEntityIds,\n collection,\n tableController\n}: CollectionActionsProps) {\n\n const authController = useAuthController();\n const collectionRegistry = useCollectionRegistryController();\n const collectionEditorController = useCollectionEditorController();\n const { t } = useTranslation();\n\n const parentCollection = parentCollectionSlugs.length > 0 ? collectionRegistry.getCollection(parentCollectionSlugs[parentCollectionSlugs.length - 1]) : undefined;\n\n const canEditCollection = !collectionEditorController.configController?.readOnly;\n\n const tooltipTitle = collectionEditorController.configController?.readOnly\n ? (collectionEditorController.configController.readOnlyReason || t(\"studio_editor_collection_disabled\"))\n : (canEditCollection ? t(\"studio_editor_collection_edit\") : t(\"studio_editor_collection_no_permission\"));\n\n const editorButton = <Tooltip\n asChild={true}\n title={tooltipTitle}>\n <IconButton\n size={\"small\"}\n color={\"primary\"}\n disabled={!canEditCollection}\n onClick={canEditCollection\n ? () => collectionEditorController?.editCollection({\n id: collection.slug,\n path,\n parentCollectionSlugs,\nparentEntityIds,\n parentCollection: parentCollection as CollectionConfig,\n existingEntities: tableController?.data ?? []\n })\n : undefined}>\n <SettingsIcon/>\n </IconButton>\n </Tooltip>;\n\n return <>\n {editorButton}\n </>\n\n}\n","\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { lazy, Suspense } from \"react\";\n\nimport { useLargeLayout, useTranslation, useSlot, resolveComponentRef } from \"@rebasepro/app\";\nimport { CollectionActionsProps, EntityTableController, SelectionController } from \"@rebasepro/types\";\nimport { Button, IconButton, Tooltip, Popover, iconSize } from \"@rebasepro/ui\";\nimport { ErrorBoundary, MoreVerticalIcon, PlusIcon, Trash2Icon } from \"@rebasepro/ui\";\nimport { usePermissions } from \"@rebasepro/app\";\nimport { toArray } from \"@rebasepro/utils\";\n// Lazy-load import/export — pulls in exceljs only on demand\nconst ImportCollectionAction = lazy(() => import(\"../../data_import/import\").then(m => ({ default: m.ImportCollectionAction })));\nconst ExportCollectionAction = lazy(() => import(\"../../data_export/export\").then(m => ({ default: m.ExportCollectionAction })));\nimport { EditorCollectionAction } from \"../../collection_editor/ui/EditorCollectionAction\";\nimport { useCollectionEditorController } from \"../../collection_editor/useCollectionEditorController\";\nimport { useCMSContext } from \"../../hooks/useCMSContext\";\n\nexport type CollectionViewActionsProps<M extends Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n path: string;\n relativePath: string;\n parentCollectionSlugs: string[], parentEntityIds: string[];\n selectionEnabled: boolean;\n onNewClick: () => void;\n onMultipleDeleteClick: () => void;\n selectionController: SelectionController<M>;\n tableController: EntityTableController<M>;\n collectionEntitiesCount?: number;\n compact?: boolean;\n children?: React.ReactNode;\n openNewDocument: (defaultValues?: Record<string, unknown>) => void;\n}\n\nexport function CollectionViewActions<M extends Record<string, unknown>>({\n collection,\n relativePath,\n parentCollectionSlugs, parentEntityIds,\n onNewClick,\n onMultipleDeleteClick,\n selectionEnabled,\n path,\n selectionController,\n tableController,\n collectionEntitiesCount,\n compact,\n children,\n openNewDocument\n}: CollectionViewActionsProps<M>) {\n const context = useCMSContext();\n\n const { canCreate, canDelete } = usePermissions();\n\n const largeLayout = useLargeLayout();\n const { t } = useTranslation();\n\n // Check if the collection editor context is available (ConfigControllerProvider present)\n const collectionEditorController = useCollectionEditorController();\n const hasCollectionEditor = Boolean(collectionEditorController?.editCollection);\n\n const selectedEntities = selectionController.selectedEntities;\n\n const addButton = canCreate(collection, path) &&\n onNewClick && (largeLayout && !compact\n ? <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n startIcon={<PlusIcon size={iconSize.small}/>}\n size=\"small\"\n variant=\"filled\"\n color=\"primary\">\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n variant=\"filled\"\n color={compact ? \"neutral\" : \"primary\"}\n size=\"small\"\n >\n <PlusIcon size={iconSize.small}/>\n </Button>);\n\n const multipleDeleteEnabled = canDelete(collection, path, null);\n\n let multipleDeleteButton: React.ReactNode | undefined;\n {\n const button = largeLayout && !compact\n ? <Button\n variant={\"text\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n startIcon={<Trash2Icon size={iconSize.small}/>}\n onClick={onMultipleDeleteClick}\n color={\"primary\"}\n className=\"lg:w-20\"\n >\n ({selectedEntities?.length})\n </Button>\n : <IconButton\n size={\"small\"}\n color={\"primary\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n onClick={onMultipleDeleteClick}>\n <Trash2Icon size={iconSize.small}/>\n </IconButton>;\n multipleDeleteButton =\n <Tooltip\n title={multipleDeleteEnabled ? t(\"delete\") : t(\"delete_not_allowed\")}>\n {button}\n </Tooltip>\n }\n\n const actionProps: CollectionActionsProps<M> = {\n path,\n relativePath,\n parentCollectionSlugs,\nparentEntityIds,\n collection,\n selectionController,\n context,\n tableController,\n collectionEntitiesCount,\n openNewDocument\n };\n\n const actions = toArray(collection.Actions)\n .map((actionRef, i) => {\n const Action = resolveComponentRef(actionRef);\n if (!Action) return null;\n return (\n <ErrorBoundary key={`actions_${i}`}>\n <Suspense fallback={null}>\n <Action {...actionProps}/>\n </Suspense>\n </ErrorBoundary>\n );\n });\n\n const pluginActions = useSlot(\"collection.actions\", actionProps as CollectionActionsProps);\n\n const secondaryActions = (\n <>\n {children}\n <ErrorBoundary>\n {actions}\n {pluginActions}\n </ErrorBoundary>\n <ErrorBoundary>\n <Suspense fallback={null}>\n <ImportCollectionAction {...(actionProps as CollectionActionsProps)}/>\n </Suspense>\n </ErrorBoundary>\n <ErrorBoundary>\n <Suspense fallback={null}>\n <ExportCollectionAction {...(actionProps as CollectionActionsProps)}/>\n </Suspense>\n </ErrorBoundary>\n {hasCollectionEditor && (\n <ErrorBoundary>\n <EditorCollectionAction {...(actionProps as CollectionActionsProps)}/>\n </ErrorBoundary>\n )}\n </>\n );\n\n const [overflowOpen, setOverflowOpen] = React.useState(false);\n\n return (\n <div className=\"flex items-center gap-1\">\n {!compact ? (\n secondaryActions\n ) : (\n <Popover\n open={overflowOpen}\n onOpenChange={setOverflowOpen}\n trigger={\n <IconButton size=\"small\">\n <MoreVerticalIcon size={iconSize.smallest}/>\n </IconButton>\n }>\n <div className=\"flex flex-row items-center gap-1 p-2\">\n {secondaryActions}\n </div>\n </Popover>\n )}\n {multipleDeleteButton}\n {addButton}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type { CollectionConfig, Property, RelationProperty } from \"@rebasepro/types\";\nimport type { Entity, PropertyConfig, EntityRelation } from \"@rebasepro/types\";\nimport { getEntityImagePreviewPropertyKey } from \"@rebasepro/common\";\nimport { getEntityFromCache } from \"@rebasepro/app\";\nimport { getEntityTitlePropertyKey, getEntityPreviewKeys } from \"../../util/previews\";\nimport { getValueInPath } from \"@rebasepro/utils\";\nimport type { AuthController } from \"@rebasepro/types\";\nimport { ChipColorScheme, CHIP_COLORS } from \"@rebasepro/ui\";\n\n\n// ── Slot types ────────────────────────────────────────────────────────\n\n/**\n * A resolved \"slot\" containing the property definition, key, and the\n * concrete value extracted from a entity.\n */\nexport interface PreviewSlot {\n property: Property;\n propertyKey: string;\n value: unknown;\n}\n\n/**\n * Date slot extends the base with a pre-formatted string.\n */\nexport interface DatePreviewSlot extends PreviewSlot {\n formatted: string;\n}\n\n/**\n * A single resolved relation chip — one item to render as a compact chip.\n * For cardinality:\"one\" relations there will be one chip.\n * For cardinality:\"many\" there can be several (capped for layout stability).\n */\nexport interface RelationChipItem {\n /** Human-readable display text for the chip */\n displayName: string;\n /** Relation ID */\n id: string | number;\n}\n\n/**\n * A resolved relation slot — groups all chips for one relation property.\n */\nexport interface RelationChipSlot {\n /** The relation property definition */\n property: RelationProperty;\n /** The property key on this entity (e.g. \"author\", \"tags\") */\n propertyKey: string;\n /** The relation property's user-facing name (e.g. \"Author\", \"Tags\") */\n label: string;\n /** Resolved chip items (display names extracted from eagerly-loaded data) */\n items: RelationChipItem[];\n /** Total count (for \"many\" relations that exceed the chip cap) */\n totalCount: number;\n /** Deterministic color for this relation property */\n colorScheme: ChipColorScheme;\n}\n\n/**\n * Fixed set of preview slots resolved from any entity + collection.\n *\n * Every view (list, card, board) consumes these same slots and decides\n * which ones to render and how. This eliminates duplicated inference\n * logic across view components.\n */\nexport interface EntityPreviewSlots {\n /** MEDIA — image thumbnail or `undefined` (view falls back to icon) */\n image: PreviewSlot | undefined;\n /** PRIMARY — title / name field */\n title: PreviewSlot | undefined;\n /** SECONDARY — subtitle or short description (first non-title text field) */\n subtitle: PreviewSlot | undefined;\n /** RELATIONS — compact chips for all relation properties (one + many) */\n relations: RelationChipSlot[];\n /** STATUS — enum chip (first enum field that isn't the title) */\n status: PreviewSlot | undefined;\n /** META — date / timestamp */\n date: DatePreviewSlot | undefined;\n /** Entity ID (always available) */\n entityId: string | number;\n}\n\n// ── Collection-level slot resolution (entity-independent) ─────────────\n\n/**\n * Resolved property keys per slot. This is the expensive part (walks\n * all properties) so we memoize it at the collection level, not per entity.\n */\nexport interface CollectionSlotKeys {\n titleKey: string | undefined;\n imageKey: string | undefined;\n subtitleKey: string | undefined;\n relationKeys: string[];\n statusKey: string | undefined;\n dateKey: string | undefined;\n}\n\n/**\n * Resolve which property key fills each slot for a given collection.\n * Pure function — call inside `useMemo`.\n */\nexport function resolveCollectionSlotKeys(\n collection: CollectionConfig<Record<string, unknown>>,\n authController: AuthController,\n propertyConfigs: Record<string, PropertyConfig>\n): CollectionSlotKeys {\n const titleKey = getEntityTitlePropertyKey(collection, propertyConfigs);\n const imageKey = getEntityImagePreviewPropertyKey(collection);\n\n // Status: first string-enum that isn't the title\n let statusKey: string | undefined;\n\n // 1. Explicitly defined in previewProperties\n if (!statusKey && collection.previewProperties) {\n for (const key of collection.previewProperties) {\n const p = collection.properties[key] as Property | undefined;\n if (p?.type === \"string\" && \"enum\" in p && p.enum && key !== titleKey) {\n statusKey = key;\n break;\n }\n }\n }\n\n // 2. Explicitly defined in propertiesOrder\n if (!statusKey && collection.propertiesOrder) {\n for (const key of collection.propertiesOrder) {\n if (typeof key === \"string\" && !key.startsWith(\"subcollection:\")) {\n const p = collection.properties[key] as Property | undefined;\n if (p?.type === \"string\" && \"enum\" in p && p.enum && key !== titleKey) {\n statusKey = key;\n break;\n }\n }\n }\n }\n\n // 3. Default automatic inference\n if (!statusKey) {\n for (const [key, prop] of Object.entries(collection.properties)) {\n const p = prop as Property;\n if (p.type === \"string\" && \"enum\" in p && p.enum && key !== titleKey) {\n statusKey = key;\n break;\n }\n }\n }\n\n // Date: prefer well-known timestamp fields, fallback to any date\n let dateKey: string | undefined;\n const dateCandidates = [\"updated_at\", \"updatedAt\", \"modified_at\", \"modifiedAt\", \"created_at\", \"createdAt\"];\n for (const candidate of dateCandidates) {\n if (collection.properties[candidate]) {\n dateKey = candidate;\n break;\n }\n }\n if (!dateKey) {\n for (const [key, prop] of Object.entries(collection.properties)) {\n const p = prop as Property;\n if (p.type === \"date\") {\n dateKey = key;\n break;\n }\n }\n }\n\n // Relations: collect relation property keys for chip rendering.\n // When propertiesOrder is explicitly set, skip this — relations will\n // be shown in the developer-defined order, not as separate chips.\n const hasExplicitOrder = !!(collection.propertiesOrder as string[] | undefined);\n const relationKeys: string[] = [];\n if (!hasExplicitOrder) {\n for (const [key, prop] of Object.entries(collection.properties)) {\n const p = prop as Property;\n if (p.type === \"relation\") {\n relationKeys.push(key);\n }\n }\n }\n\n // Subtitle: first preview key that isn't title/image/status/date/id.\n // When propertiesOrder is not set, also exclude relation keys (they render as chips).\n // Prefer string fields (especially multiline/description-like) over numbers.\n const excludeKeys = new Set([titleKey, imageKey, statusKey, dateKey, ...relationKeys]);\n const previewKeys = getEntityPreviewKeys(authController, collection, propertyConfigs, undefined, 10)\n .filter(k => !excludeKeys.has(k) && k !== \"id\");\n\n // When propertiesOrder is set, respect the developer-defined order (no re-sorting).\n // When not set, sort: strings first (prefer multiline → good description candidate).\n const sortedPreviewKeys = hasExplicitOrder\n ? previewKeys\n : [...previewKeys].sort((a, b) => {\n const propA = collection.properties[a] as Property | undefined;\n const propB = collection.properties[b] as Property | undefined;\n const scoreA = propA?.type === \"string\" ? (propA.ui?.multiline ? 2 : 1) : 0;\n const scoreB = propB?.type === \"string\" ? (propB.ui?.multiline ? 2 : 1) : 0;\n return scoreB - scoreA;\n });\n const subtitleKey = sortedPreviewKeys.length > 0 ? sortedPreviewKeys[0] : undefined;\n\n return { titleKey,\nimageKey,\nsubtitleKey,\nrelationKeys,\nstatusKey,\ndateKey };\n}\n\n// ── Image unwrapping helper ───────────────────────────────────────────\n\n/**\n * Unwrap image property + value from potential array-of-images.\n * Returns `{ property, value }` where property is the *inner* property\n * and value is the first element (for arrays) or the raw value.\n */\nfunction resolveImageSlot(\n collection: CollectionConfig<Record<string, unknown>>,\n imageKey: string,\n entity: Entity<Record<string, unknown>>\n): PreviewSlot | undefined {\n const imageProperty = collection.properties[imageKey];\n if (!imageProperty) return undefined;\n\n const ofProp = \"of\" in imageProperty ? imageProperty.of : undefined;\n const resolvedProperty = ofProp\n ? (Array.isArray(ofProp) ? ofProp[0] : ofProp)\n : imageProperty;\n\n const rawValue = getValueInPath(entity.values, imageKey);\n const resolvedValue = ofProp\n ? (((rawValue as unknown[]) ?? []).length > 0 ? (rawValue as unknown[])[0] : undefined)\n : rawValue;\n\n if (resolvedValue === undefined || resolvedValue === null) return undefined;\n\n return {\n property: resolvedProperty as Property,\n propertyKey: imageKey,\n value: resolvedValue\n };\n}\n\n// ── Date formatting ───────────────────────────────────────────────────\n\nfunction formatDateValue(value: unknown): string {\n if (!value) return \"\";\n const date = value instanceof Date ? value : new Date(value as string | number);\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined\n });\n}\n\n// ── Hook: collection-level slot keys ──────────────────────────────────\n\n/**\n * Resolves which property key fills each preview slot for a collection.\n * Memoized — only recomputes when the collection definition changes.\n *\n * Use this in the parent list/grid component, then pass the result to\n * `resolveEntitySlots` for each entity row.\n */\nexport function useCollectionSlotKeys(\n collection: CollectionConfig<Record<string, unknown>>,\n authController: AuthController,\n propertyConfigs: Record<string, PropertyConfig>\n): CollectionSlotKeys {\n return useMemo(\n () => resolveCollectionSlotKeys(collection, authController, propertyConfigs),\n [collection, authController, propertyConfigs]\n );\n}\n\n// ── Pure function: entity-level slot resolution ───────────────────────\n\n/**\n * Resolve concrete slot values for a single entity.\n * This is a pure function (no hooks) so it can be called inside\n * `React.memo` render functions or loops without violating hook rules.\n */\nexport function resolveEntitySlots(\n entity: Entity<Record<string, unknown>>,\n collection: CollectionConfig<Record<string, unknown>>,\n slotKeys: CollectionSlotKeys\n): EntityPreviewSlots {\n const { titleKey, imageKey, subtitleKey, relationKeys, statusKey, dateKey } = slotKeys;\n\n // Image\n const image = imageKey ? resolveImageSlot(collection, imageKey, entity) : undefined;\n\n // Title\n let title: PreviewSlot | undefined;\n if (titleKey) {\n const prop = collection.properties[titleKey] as Property | undefined;\n const val = getValueInPath(entity.values, titleKey);\n if (prop) title = { property: prop,\npropertyKey: titleKey,\nvalue: val };\n }\n\n // Subtitle\n let subtitle: PreviewSlot | undefined;\n if (subtitleKey) {\n const prop = collection.properties[subtitleKey] as Property | undefined;\n const val = getValueInPath(entity.values, subtitleKey);\n if (prop && val !== undefined && val !== null && val !== \"\") {\n subtitle = { property: prop,\npropertyKey: subtitleKey,\nvalue: val };\n }\n }\n\n // Relations — resolve chip items for every relation property\n const relations: RelationChipSlot[] = [];\n const MAX_CHIPS_PER_RELATION = 3;\n\n for (const relKey of relationKeys) {\n const prop = collection.properties[relKey] as RelationProperty | undefined;\n if (!prop || prop.type !== \"relation\") continue;\n\n const val = getValueInPath(entity.values, relKey);\n if (val === undefined || val === null) continue;\n\n const items: RelationChipItem[] = [];\n let totalCount = 0;\n\n const isMany = prop.cardinality === \"many\" || prop.relation?.cardinality === \"many\";\n\n if (isMany && Array.isArray(val)) {\n // cardinality:\"many\" → array of EntityRelation\n totalCount = val.length;\n for (let i = 0; i < Math.min(val.length, MAX_CHIPS_PER_RELATION); i++) {\n const rel = val[i];\n if (rel && typeof rel === \"object\") {\n const displayName = resolveRelationDisplayName(rel as EntityRelation, prop);\n const id = (rel as EntityRelation).id ?? i;\n if (displayName) {\n items.push({ displayName,\nid });\n }\n }\n }\n } else if (!isMany && val && typeof val === \"object\") {\n // cardinality:\"one\" → single EntityRelation\n const obj = val as Record<string, unknown>;\n const isRelation = (\"__type\" in obj && obj.__type === \"relation\")\n || (typeof obj.isEntityRelation === \"function\"\n && (obj.isEntityRelation as () => boolean)());\n if (isRelation) {\n const relation = obj as unknown as EntityRelation;\n const displayName = resolveRelationDisplayName(relation, prop);\n totalCount = 1;\n if (displayName) {\n items.push({ displayName,\nid: relation.id });\n }\n }\n }\n\n if (items.length > 0) {\n const relIndex = relationKeys.indexOf(relKey);\n const chipColors = Object.values(CHIP_COLORS);\n const colorScheme = chipColors[relIndex % chipColors.length];\n relations.push({\n property: prop,\n propertyKey: relKey,\n label: prop.name || relKey,\n items,\n totalCount,\n colorScheme\n });\n }\n }\n\n // Status\n let status: PreviewSlot | undefined;\n if (statusKey) {\n const prop = collection.properties[statusKey] as Property | undefined;\n const val = getValueInPath(entity.values, statusKey);\n if (prop && val !== undefined && val !== null) {\n status = { property: prop,\npropertyKey: statusKey,\nvalue: val };\n }\n }\n\n // Date\n let date: DatePreviewSlot | undefined;\n if (dateKey) {\n const prop = collection.properties[dateKey] as Property | undefined;\n const val = getValueInPath(entity.values, dateKey);\n if (prop && val !== undefined && val !== null) {\n date = {\n property: prop,\n propertyKey: dateKey,\n value: val,\n formatted: formatDateValue(val)\n };\n }\n }\n\n return {\n image,\n title,\n subtitle,\n relations,\n status,\n date,\n entityId: entity.id\n };\n}\n\n// ── Relation display name resolution ─────────────────────────────────\n\n/**\n * Extract a human-readable display name from an eagerly-loaded EntityRelation.\n * Uses the target collection's title property when available, otherwise\n * walks the entity values for the first short string.\n */\nfunction resolveRelationDisplayName(\n relation: EntityRelation | Record<string, unknown>,\n prop: RelationProperty\n): string | undefined {\n // Support both EntityRelation instances and plain objects\n const data = \"data\" in relation ? (relation as EntityRelation).data : undefined;\n\n // Resolve target collection from either `prop.relation.target()` or `prop.target()` (inline API)\n let targetCollection: CollectionConfig | undefined;\n try {\n const resolved = prop.relation?.target?.() ?? (typeof prop.target === \"function\" ? prop.target() : undefined);\n if (resolved && typeof resolved === \"object\") {\n targetCollection = resolved as CollectionConfig;\n }\n } catch {\n // Target collection may not be resolvable\n }\n\n // Helper: extract display name from entity values using the target collection\n const extractDisplayName = (values: Record<string, unknown>): string | undefined => {\n if (targetCollection) {\n const targetTitleKey = targetCollection.titleProperty as string | undefined;\n if (targetTitleKey && values[targetTitleKey] !== undefined) {\n return String(values[targetTitleKey]);\n }\n\n // Helper to check if a property is hidden/internal\n const isHiddenProp = (p: Property): boolean => {\n if (p.ui?.hideFromCollection) return true;\n if (typeof p.ui?.disabled === \"object\" && p.ui.disabled.hidden) return true;\n return false;\n };\n\n // Helper to check if a property is a visible, non-id string\n const isDisplayCandidate = (p: Property): boolean => {\n return p.type === \"string\" && !p.ui?.multiline && !p.ui?.markdown && !p.storage\n && !(\"isId\" in p && p.isId) && !isHiddenProp(p);\n };\n\n // Prioritize common title-like fields: name, title, label, displayName\n const priorityKeys = [\"name\", \"title\", \"label\", \"displayName\"];\n for (const pk of priorityKeys) {\n const p = targetCollection.properties[pk] as Property | undefined;\n if (p && isDisplayCandidate(p) && values[pk] !== undefined && values[pk] !== null) {\n return String(values[pk]);\n }\n }\n\n // Fallback: find first visible, non-id string property in target\n for (const [k, p] of Object.entries(targetCollection.properties)) {\n const tp = p as Property;\n if (isDisplayCandidate(tp)) {\n if (values[k] !== undefined && values[k] !== null) {\n return String(values[k]);\n }\n }\n }\n }\n // Generic fallback: walk entity values for any short string.\n for (const [, v] of Object.entries(values)) {\n if (typeof v === \"string\" && v.length > 0 && v.length < 200) {\n return v;\n }\n }\n return undefined;\n };\n\n // 1. Try eagerly-loaded data on the relation object\n if (data && data.values) {\n const result = extractDisplayName(data.values as Record<string, unknown>);\n if (result) return result;\n }\n\n const id = \"id\" in relation ? relation.id : undefined;\n\n // 2. Try the entity cache (sessionStorage) as a fallback\n if (id !== undefined && targetCollection) {\n try {\n const slug = targetCollection.slug ?? (\"table\" in targetCollection ? targetCollection.table : undefined);\n if (slug) {\n const cacheKey = `${slug}/${id}`;\n const cached = getEntityFromCache(cacheKey) as { values?: Record<string, unknown> } | undefined;\n if (cached?.values) {\n const result = extractDisplayName(cached.values);\n if (result) return result;\n }\n }\n } catch {\n // Cache lookup failed — fall through\n }\n }\n\n // 3. Final fallback: show the ID\n return id !== undefined ? String(id) : undefined;\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useMemo } from \"react\";\nimport { CollectionSize, Entity } from \"@rebasepro/types\";\nimport {\n Card,\n Checkbox,\n Chip,\n cls,\n Typography\n} from \"@rebasepro/ui\";\nimport { PropertyPreview } from \"../../preview\";\nimport {\n useAuthController,\n useCustomizationController\n} from \"@rebasepro/app\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { useCollectionSlotKeys, resolveEntitySlots } from \"./usePreviewSlots\";\n\nexport type EntityCardBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n entity: Entity<M>;\n collection: CollectionConfig<M>;\n onClick?: (entity: Entity<M>) => void;\n selected?: boolean;\n highlighted?: boolean;\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void;\n selectionEnabled?: boolean;\n /**\n * Size of the card - affects checkbox styling\n */\n size?: CollectionSize;\n};\n\n/**\n * Card component for displaying a entity in a grid view.\n * Shows thumbnail, title, and preview properties via the shared slot system.\n */\nexport function EntityCardBinding<M extends Record<string, unknown> = Record<string, unknown>>({\n entity,\n collection,\n onClick,\n selected,\n highlighted,\n onSelectionChange,\n selectionEnabled,\n size = \"m\"\n}: EntityCardBindingProps<M>) {\n const authController = useAuthController();\n const analyticsController = useAnalyticsController();\n const customizationController = useCustomizationController();\n\n const slotKeys = useCollectionSlotKeys(\n collection as CollectionConfig<Record<string, unknown>>,\n authController,\n customizationController.propertyConfigs\n );\n\n const slots = useMemo(\n () => resolveEntitySlots(\n entity as Entity<Record<string, unknown>>,\n collection as CollectionConfig<Record<string, unknown>>,\n slotKeys\n ),\n [entity, collection, slotKeys]\n );\n\n const handleClick = (e?: React.MouseEvent) => {\n // Cmd+click (Mac) or Ctrl+click (Windows) toggles selection\n if (e && (e.metaKey || e.ctrlKey) && selectionEnabled) {\n e.preventDefault();\n onSelectionChange?.(entity, !selected);\n return;\n }\n if (onClick) {\n analyticsController.onAnalyticsEvent?.(\"card_view_entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n onClick(entity);\n }\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const handleSelectionChange = (checked: boolean) => {\n onSelectionChange?.(entity, checked);\n };\n\n return (\n <Card\n className={cls(\n \"cursor-pointer overflow-hidden group relative\",\n \"transition-all duration-200\",\n \"hover:shadow-lg hover:-translate-y-0.5\",\n selected && \"ring-2 ring-primary bg-surface-accent-50 dark:bg-surface-accent-900\",\n highlighted && !selected && \"ring-2 ring-primary ring-opacity-50 bg-surface-accent-50/50 dark:bg-surface-accent-900\"\n )}\n onClick={handleClick}\n >\n {/* Thumbnail area — image slot */}\n <div className=\"aspect-[4/3] relative overflow-hidden bg-surface-100 dark:bg-surface-900\">\n {slots.image ? (\n <div className=\"w-full h-full\">\n <PropertyPreview\n property={slots.image.property}\n propertyKey={slots.image.propertyKey}\n size=\"medium\"\n value={slots.image.value}\n fill={true}\n />\n </div>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <IconForView\n collectionOrView={collection}\n color=\"disabled\"\n />\n </div>\n )}\n\n {/* Hover overlay */}\n <div className={cls(\n \"absolute inset-0 bg-black/0 group-hover:bg-black/10\",\n \"transition-colors duration-200\"\n )}/>\n\n {/* Selection checkbox */}\n {selectionEnabled && (\n <div\n className={cls(\n \"absolute\",\n size === \"xs\" || size === \"s\" ? \"top-1 left-1\" : \"top-2 left-2\"\n )}\n onClick={handleCheckboxClick}\n >\n <Checkbox\n checked={selected ?? false}\n onCheckedChange={handleSelectionChange}\n size={size === \"xs\" ? \"smallest\" : \"small\"}\n />\n </div>\n )}\n\n </div>\n\n {/* Content area */}\n <div className=\"p-3\">\n {/* Entity ID */}\n <Typography\n variant=\"caption\"\n color=\"disabled\"\n className=\"font-mono truncate block\"\n >\n {entity.id}\n </Typography>\n\n {/* Title slot */}\n <div className=\"truncate my-1 text-sm font-medium min-h-[20px]\">\n {slots.title ? (\n <PropertyPreview\n propertyKey={slots.title.propertyKey}\n value={slots.title.value}\n property={slots.title.property}\n size=\"small\"\n />\n ) : (\n <Typography variant=\"body2\" className=\"text-surface-500\">\n {entity.id}\n </Typography>\n )}\n </div>\n\n {/* Subtitle slot */}\n {slots.subtitle && (\n <div className=\"line-clamp-3 [&_div]:line-clamp-3 text-xs text-surface-600 dark:text-surface-400 [&_p]:!my-1 [&_p:first-child]:!mt-0 [&_p:last-child]:!mb-0\">\n <PropertyPreview\n propertyKey={slots.subtitle.propertyKey}\n value={slots.subtitle.value}\n property={slots.subtitle.property}\n size=\"small\"\n />\n </div>\n )}\n\n {/* Relation chips slot */}\n {slots.relations.length > 0 && (\n <div className=\"flex items-center gap-1 mt-1 overflow-hidden max-w-full flex-wrap\">\n {slots.relations.map((rel) => (\n rel.items.map((item) => (\n <Chip\n key={`${rel.propertyKey}-${item.id}`}\n size=\"smallest\"\n colorScheme={rel.colorScheme}\n className=\"!text-[10px] !leading-tight !py-0 shrink-0 max-w-[100px] truncate\"\n >\n {item.displayName}\n </Chip>\n ))\n ))}\n {slots.relations.some(r => r.totalCount > r.items.length) && (\n <span className=\"text-[10px] text-surface-400 dark:text-surface-500 shrink-0\">\n +{slots.relations.reduce((acc, r) => acc + Math.max(0, r.totalCount - r.items.length), 0)}\n </span>\n )}\n </div>\n )}\n\n {/* Status slot */}\n {slots.status && (\n <div className=\"mt-1\">\n <PropertyPreview\n propertyKey={slots.status.propertyKey}\n value={slots.status.value}\n property={slots.status.property}\n size=\"small\"\n />\n </div>\n )}\n </div>\n </Card>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { CollectionSize, Entity, EntityTableController, SelectionController } from \"@rebasepro/types\";\nimport { EntityCardBinding } from \"./EntityCardBinding\";\nimport {\n cls,\n CircularProgress,\n Typography,\n CardView\n} from \"@rebasepro/ui\";\nimport { useComponentOverride } from \"@rebasepro/app\";\n\nexport type CollectionCardViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n tableController: EntityTableController<M>;\n onEntityClick?: (entity: Entity<M>) => void;\n selectionController?: SelectionController<M>;\n selectionEnabled?: boolean;\n highlightedEntities?: Entity<M>[];\n emptyComponent?: React.ReactNode;\n onScroll?: (props: {\n scrollDirection: \"forward\" | \"backward\";\n scrollOffset: number;\n scrollUpdateWasRequested: boolean;\n }) => void;\n initialScroll?: number;\n /**\n * Size of the cards in the grid view.\n * - \"xs\": Extra small cards, most cards per row\n * - \"s\": Small cards\n * - \"m\": Medium cards (default)\n * - \"l\": Large cards\n * - \"xl\": Extra large cards, fewest cards per row\n */\n size?: CollectionSize;\n};\n\n/**\n * Get grid column classes based on the size.\n * Smaller size = more columns (smaller cards)\n * Larger size = fewer columns (larger cards)\n */\nfunction getGridColumnsClass(size: CollectionSize): string {\n switch (size) {\n case \"xs\":\n // Compact: many small cards\n return \"grid-cols-4 sm:grid-cols-5 md:grid-cols-6 lg:grid-cols-8 xl:grid-cols-10\";\n case \"s\":\n // Small: more cards per row\n return \"grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-8\";\n case \"m\":\n // Medium: balanced (default)\n return \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6\";\n case \"l\":\n // Large: fewer, bigger cards\n return \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-4\";\n case \"xl\":\n // Extra large: fewest, biggest cards\n return \"grid-cols-1 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3\";\n default:\n return \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6\";\n }\n}\n\nfunction getScrollParent(element: HTMLElement | null): HTMLElement | null {\n if (!element) return null;\n let parent = element.parentElement;\n while (parent) {\n const overflowY = window.getComputedStyle(parent).overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document.documentElement;\n}\n\n/**\n * Card grid view for displaying entities with infinite scroll.\n * Alternative to the CollectionTableBinding for visual browsing.\n */\nexport function CollectionCardViewBinding<M extends Record<string, unknown> = Record<string, unknown>>({\n collection,\n tableController,\n onEntityClick,\n selectionController,\n selectionEnabled = true,\n highlightedEntities,\n emptyComponent,\n onScroll,\n initialScroll,\n size = \"m\"\n}: CollectionCardViewBindingProps<M>) {\n\n const ResolvedEntityCard = useComponentOverride(\"Collection.Card\", EntityCardBinding) as typeof EntityCardBinding;\n\n const {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n itemCount,\n setItemCount,\n pageSize = 50,\n paginationEnabled\n } = tableController;\n\n const handleEntityClick = useCallback((entity: Entity<M>) => {\n onEntityClick?.(entity);\n }, [onEntityClick]);\n\n const handleSelectionChange = useCallback((entity: Entity<M>, selected: boolean) => {\n selectionController?.toggleEntitySelection(entity, selected);\n }, [selectionController]);\n\n const selectedIds = useMemo(() => new Set(selectionController?.selectedEntities.map(e => e.id)), [selectionController?.selectedEntities]);\n const highlightedIds = useMemo(() => new Set(highlightedEntities?.map(e => e.id)), [highlightedEntities]);\n\n const handleRowSelectionChange = useCallback((entity: Entity<M>, selected: boolean) => {\n handleSelectionChange(entity, selected);\n }, [handleSelectionChange]);\n\n return (\n <CardView<Entity<M>>\n data={data}\n dataLoading={dataLoading}\n noMoreToLoad={noMoreToLoad}\n dataLoadingError={dataLoadingError}\n itemCount={itemCount}\n setItemCount={setItemCount}\n pageSize={pageSize}\n paginationEnabled={paginationEnabled}\n onItemClick={handleEntityClick}\n selectedIds={selectedIds}\n highlightedIds={highlightedIds}\n selectionEnabled={selectionEnabled}\n onSelectionChange={handleRowSelectionChange}\n onScroll={onScroll}\n initialScroll={initialScroll}\n size={size}\n emptyComponent={emptyComponent}\n renderCard={useCallback((entity, { selected, highlighted, onClick }) => (\n <ResolvedEntityCard\n key={`${entity.path}_${entity.id}`}\n entity={entity}\n collection={collection}\n onClick={onClick as any}\n selected={selected}\n highlighted={highlighted}\n onSelectionChange={handleRowSelectionChange}\n selectionEnabled={selectionEnabled}\n size={size}\n />\n ), [collection, selectionEnabled, size, handleRowSelectionChange, ResolvedEntityCard])}\n />\n );\n}\n","\nimport type { CollectionConfig, Property } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CollectionSize, Entity, EntityAction, EntityTableController, SelectionController } from \"@rebasepro/types\";\nimport {\n Checkbox,\n Chip,\n CircularProgress,\n cls,\n defaultBorderMixin,\n IconButton,\n Tooltip,\n Typography,\n ListView\n} from \"@rebasepro/ui\";\nimport { PropertyPreview } from \"../../preview\";\nimport {\n useAuthController,\n useCustomizationController\n} from \"@rebasepro/app\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\nimport { getEntityPreviewKeys } from \"../../util/previews\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { getValueInPath } from \"@rebasepro/utils\";\nimport { useCollectionSlotKeys, resolveEntitySlots, type CollectionSlotKeys } from \"./usePreviewSlots\";\nimport { useCMSContext } from \"../../hooks/useCMSContext\";\nimport { resolveEntityAction } from \"../../util/resolutions\";\n\nexport type CollectionListViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n tableController: EntityTableController<M>;\n onEntityClick?: (entity: Entity<M>) => void;\n selectionController?: SelectionController<M>;\n selectionEnabled?: boolean;\n highlightedEntities?: Entity<M>[];\n emptyComponent?: React.ReactNode;\n\n /**\n * Size of the list rows.\n * - \"xs\": Most compact, single-line rows\n * - \"s\": Compact with minimal info\n * - \"m\": Balanced (default) — title + subtitle\n * - \"l\": Spacious with more preview fields\n * - \"xl\": Full detail with all preview fields\n */\n size?: CollectionSize;\n /**\n * ID of the currently selected/active entity. When set, the matching\n * row is visually highlighted with a primary accent.\n */\n selectedEntityId?: string | number;\n\n /**\n * Callback to get entity actions for a given entity.\n * Only actions with `showActionsInListView: true` will be rendered.\n */\n getActionsForEntity?: (params: { entity?: Entity<M>, customEntityActions?: EntityAction[] }) => EntityAction[];\n\n /**\n * Full path of the collection, used as context for action handlers.\n */\n path?: string;\n\n /**\n * How entities open when an action triggers navigation.\n */\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n};\n\ntype ListColumnDef = {\n key: string;\n label: string;\n property: Property;\n isTitle?: boolean;\n isStatus?: boolean;\n isDate?: boolean;\n align: \"left\" | \"center\" | \"right\";\n width: string;\n};\n\n\n/**\n * Get row padding/spacing classes based on size\n */\nfunction getRowClasses(size: CollectionSize): string {\n switch (size) {\n case \"xs\": return \"py-2 px-5\";\n case \"s\": return \"py-2.5 px-5\";\n case \"m\": return \"py-3 px-5\";\n case \"l\": return \"py-4 px-5\";\n case \"xl\": return \"py-5 px-5\";\n default: return \"py-3 px-5\";\n }\n}\n\n/**\n * Estimated row height in pixels for virtualization, based on size.\n */\nfunction getEstimatedRowHeight(size: CollectionSize): number {\n switch (size) {\n case \"xs\": return 44;\n case \"s\": return 52;\n case \"m\": return 64;\n case \"l\": return 76;\n case \"xl\": return 88;\n default: return 64;\n }\n}\n\n/** Number of extra rows rendered above/below the viewport. */\nconst OVERSCAN_COUNT = 8;\n\n/** Threshold in pixels from the bottom of the scroll area to trigger loading more. */\nconst LOAD_MORE_THRESHOLD = 400;\n\n/** Stable empty array for when no list-view actions are available. */\nconst EMPTY_LIST_VIEW_ACTIONS: EntityAction[] = [];\n\n/**\n * Walk up the DOM from `element` to find the nearest scrollable ancestor.\n */\nfunction getScrollParent(element: HTMLElement | null): HTMLElement | null {\n let parent = element?.parentElement ?? null;\n while (parent) {\n const style = getComputedStyle(parent);\n if (\n style.overflowY === \"auto\" || style.overflowY === \"scroll\" ||\n style.overflow === \"auto\" || style.overflow === \"scroll\"\n ) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document.documentElement;\n}\n\n/**\n * Returns true if a property type should NOT be rendered via\n * PropertyPreview in list row columns (because it would blow up height).\n */\nfunction isComplexPropertyType(property: Property): boolean {\n if (property.type === \"array\") {\n const ofProp = \"of\" in property ? property.of : undefined;\n const innerProp = ofProp ? (Array.isArray(ofProp) ? ofProp[0] : ofProp) : undefined;\n if (innerProp && typeof innerProp === \"object\" && \"enum\" in innerProp && innerProp.enum) {\n return false;\n }\n }\n return property.type === \"array\"\n || property.type === \"map\"\n || property.type === \"reference\"\n || property.type === \"relation\";\n}\n\n/**\n * Render a complex value as a compact, single-line string.\n * - Arrays → \"Item, Item +3\"\n * - Maps → \"4 fields\"\n * - Refs → entity ID\n * - Relations → entity ID or name\n */\nfunction compactValueSummary(value: unknown, property: Property): string | null {\n if (value === undefined || value === null) return null;\n\n if (property.type === \"array\") {\n if (!Array.isArray(value)) return null;\n if (value.length === 0) return null;\n\n const of = \"of\" in property ? property.of : undefined;\n const innerProp = of ? (Array.isArray(of) ? of[0] : of) : undefined;\n\n // String/number arrays → join\n const labels = value.map((v: unknown) => {\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\") return String(v);\n // Reference inside array\n if (v && typeof v === \"object\" && \"id\" in v) return String((v as Record<string, unknown>).id);\n // Enum label lookup\n if (innerProp && \"enum\" in innerProp && innerProp.enum && typeof v === \"string\") {\n const enumValues = innerProp.enum;\n if (Array.isArray(enumValues)) {\n const match = enumValues.find((e: unknown) =>\n typeof e === \"object\" && e !== null && \"id\" in e && (e as Record<string, unknown>).id === v\n );\n if (match && typeof match === \"object\" && \"label\" in match) return String((match as Record<string, unknown>).label);\n } else if (typeof enumValues === \"object\") {\n const label = (enumValues as Record<string, unknown>)[v];\n if (typeof label === \"string\") return label;\n if (label && typeof label === \"object\" && \"label\" in label) return String((label as Record<string, unknown>).label);\n }\n return v;\n }\n return \"•\";\n });\n\n const MAX_SHOWN = 2;\n const shown = labels.slice(0, MAX_SHOWN).join(\", \");\n const remaining = labels.length - MAX_SHOWN;\n return remaining > 0 ? `${shown} +${remaining}` : shown;\n }\n\n if (property.type === \"map\") {\n if (typeof value !== \"object\" || value === null) return null;\n const count = Object.keys(value).length;\n return count === 0 ? null : `${count} field${count !== 1 ? \"s\" : \"\"}`;\n }\n\n if (property.type === \"reference\") {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && \"id\" in value) return String((value as Record<string, unknown>).id);\n return null;\n }\n\n if (property.type === \"relation\") {\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n // EntityRelation.data is a Entity: { id, path, values: { name, ... } }\n if (obj.data && typeof obj.data === \"object\") {\n const data = obj.data as Record<string, unknown>;\n const values = (data.values && typeof data.values === \"object\")\n ? data.values as Record<string, unknown>\n : data;\n const name = values.name ?? values.title ?? values.display_name\n ?? values.displayName ?? values.label ?? values.email;\n if (name && typeof name !== \"object\") return String(name);\n }\n if (\"id\" in obj) return String(obj.id);\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Format a date value for display in the list\n */\nfunction formatDateValue(value: unknown): string | null {\n if (!value) return null;\n let date: Date | null = null;\n if (value instanceof Date) {\n date = value;\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n date = new Date(value);\n }\n if (!date || isNaN(date.getTime())) return null;\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return date.toLocaleTimeString(undefined, { hour: \"2-digit\",\nminute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return `${diffDays}d ago`;\n } else {\n return date.toLocaleDateString(undefined, { month: \"short\",\nday: \"numeric\",\nyear: diffDays > 365 ? \"numeric\" : undefined });\n }\n}\n\n/**\n * Classic CMS list view for displaying entities.\n * Designed to be the most familiar, stereotypical CMS content management view:\n * - Clean rows with checkbox, icon/avatar, title, metadata, and actions\n * - Column-sortable headers\n * - Infinite scroll\n */\nexport function CollectionListViewBinding<M extends Record<string, unknown> = Record<string, unknown>>({\n collection,\n tableController,\n onEntityClick,\n selectionController,\n selectionEnabled = true,\n highlightedEntities,\n emptyComponent,\n\n size = \"m\",\n selectedEntityId,\n getActionsForEntity,\n path,\n openEntityMode\n}: CollectionListViewBindingProps<M>) {\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n const analyticsController = useAnalyticsController();\n const context = useCMSContext();\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(1200);\n\n // Track container width for responsive column visibility\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const ro = new ResizeObserver(([entry]) => {\n if (entry) setContainerWidth(entry.contentRect.width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n itemCount,\n setItemCount,\n pageSize = 50,\n paginationEnabled\n } = tableController;\n\n const isLoadingMore = useRef(false);\n\n // Reset the loading-more gate when new data arrives\n useEffect(() => {\n if (!dataLoading) isLoadingMore.current = false;\n }, [dataLoading]);\n\n const resolvedCollection = collection;\n\n // ── Shared slot resolution (replaces 4 individual useMemo calls) ──\n const slotKeys = useCollectionSlotKeys(\n resolvedCollection as CollectionConfig<Record<string, unknown>>,\n authController,\n customizationController.propertyConfigs\n );\n const { titleKey: titlePropertyKey, imageKey: imagePropertyKey, subtitleKey, statusKey: statusPropertyKey, dateKey: datePropertyKey } = slotKeys;\n\n\n const previewKeys = useMemo(\n () => getEntityPreviewKeys(authController, resolvedCollection, customizationController.propertyConfigs, undefined, 10)\n .filter(key => key !== titlePropertyKey && key !== imagePropertyKey && key !== statusPropertyKey && key !== datePropertyKey),\n [authController, resolvedCollection, customizationController.propertyConfigs, titlePropertyKey, imagePropertyKey, statusPropertyKey, datePropertyKey]\n );\n\n\n const columns = useMemo(() => {\n const cols: ListColumnDef[] = [];\n\n const getIdealColumnWidth = (prop: Property) => {\n if (prop.type === \"string\" && \"enum\" in prop) return \"flex-shrink-0 w-32\";\n if (prop.type === \"date\" || prop.type === \"number\" || prop.type === \"boolean\") return \"flex-shrink-0 w-28\";\n if (prop.type === \"reference\" || prop.type === \"relation\") return \"flex-shrink-0 w-56 lg:w-64\";\n if (prop.type === \"string\") return \"flex-shrink-0 w-40 lg:w-48\";\n return \"flex-shrink-0 w-40\";\n };\n\n if (resolvedCollection.listProperties && resolvedCollection.listProperties.length > 0) {\n resolvedCollection.listProperties.forEach((key, index) => {\n const prop = resolvedCollection.properties[key] as Property;\n if (!prop) return;\n\n cols.push({\n key,\n label: prop.name || key,\n property: prop,\n isTitle: index === 0,\n align: prop.type === \"number\" || prop.type === \"date\" ? \"right\" : \"left\",\n width: index === 0 ? \"flex-1 min-w-[200px]\" : getIdealColumnWidth(prop)\n });\n });\n return cols;\n }\n\n // Smart default\n if (titlePropertyKey) {\n const prop = resolvedCollection.properties[titlePropertyKey] as Property;\n if (prop) {\n cols.push({\n key: titlePropertyKey,\n label: prop.name || \"Name\",\n property: prop,\n isTitle: true,\n align: \"left\",\n width: \"flex-1 min-w-[200px]\"\n });\n }\n }\n\n // Collect all candidate columns — visible count determined later by container width\n const showDate = datePropertyKey && size !== \"xs\";\n const showStatus = statusPropertyKey && size !== \"xs\" && size !== \"s\";\n\n // The first previewKey makes a great subtitle (strict rules: no relations, no large blocks).\n const subtitleKey = previewKeys.length > 0 ? previewKeys[0] : undefined;\n\n // For the additional columns, we can use any unused property (including relations!).\n const allKeys = resolvedCollection.propertiesOrder || Object.keys(resolvedCollection.properties);\n const usedKeys = new Set([\n titlePropertyKey,\n imagePropertyKey,\n statusPropertyKey,\n datePropertyKey,\n subtitleKey,\n \"id\"\n ]);\n\n const availableExtraKeys = allKeys.filter(k => {\n if (usedKeys.has(k)) return false;\n const prop = resolvedCollection.properties[k] as Property | undefined;\n if (!prop) return false;\n // Exclude storage/image properties — they are already rendered in the image slot\n if (prop.type === \"string\" && (prop.storage || prop.ui?.url === \"image\")) return false;\n if (prop.type === \"array\" && prop.of && !Array.isArray(prop.of)) {\n const inner = prop.of;\n if (inner.type === \"string\" && (inner.storage || inner.ui?.url === \"image\")) return false;\n }\n return true;\n });\n\n availableExtraKeys.forEach(key => {\n const prop = resolvedCollection.properties[key] as Property;\n cols.push({\n key,\n label: prop.name || key,\n property: prop,\n align: prop.type === \"number\" || prop.type === \"date\" ? \"right\" : \"left\",\n width: getIdealColumnWidth(prop)\n });\n });\n\n if (showStatus && statusPropertyKey) {\n const prop = resolvedCollection.properties[statusPropertyKey] as Property;\n if (prop) {\n cols.push({\n key: statusPropertyKey,\n label: prop.name || \"Status\",\n property: prop,\n isStatus: true,\n align: \"center\",\n width: \"flex-shrink-0 w-32\"\n });\n }\n }\n\n if (showDate && datePropertyKey) {\n const prop = resolvedCollection.properties[datePropertyKey] as Property;\n if (prop) {\n cols.push({\n key: datePropertyKey,\n label: prop.name || \"Modified\",\n property: prop,\n isDate: true,\n align: \"right\",\n width: \"flex-shrink-0 w-28\"\n });\n }\n }\n\n return cols;\n }, [resolvedCollection, titlePropertyKey, statusPropertyKey, datePropertyKey, imagePropertyKey, previewKeys, size]);\n\n const showImage = size !== \"xs\";\n\n\n // Responsive: determine visible columns based on container width.\n // The first extra column requires significantly more available space (600px)\n // to ensure the title area has generous room before columns appear.\n // Each subsequent column needs 160px.\n const visibleColumns = useMemo(() => {\n if (columns.length <= 1) return columns;\n\n const titleCol = columns.find(c => c.isTitle);\n const extraCols = columns.filter(c => !c.isTitle);\n\n // Base width consumed by fixed-width elements (padding + checkbox + image + min title)\n const baseWidth = 40 + (selectionEnabled ? 40 : 0) + (showImage ? 56 : 0) + 200;\n const availableForExtra = Math.max(0, containerWidth - baseWidth);\n\n // First extra column needs 500px; each additional needs 160px\n const FIRST_COL_THRESHOLD = 500;\n const EXTRA_COL_WIDTH = 160;\n\n let maxExtraCols = 0;\n if (availableForExtra >= FIRST_COL_THRESHOLD) {\n maxExtraCols = 1 + Math.floor((availableForExtra - FIRST_COL_THRESHOLD) / EXTRA_COL_WIDTH);\n }\n\n return [\n ...(titleCol ? [titleCol] : []),\n ...extraCols.slice(0, maxExtraCols)\n ];\n }, [columns, containerWidth, selectionEnabled, showImage]);\n\n const handleEntityClick = useCallback((entity: Entity<M>) => {\n analyticsController.onAnalyticsEvent?.(\"entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n onEntityClick?.(entity);\n }, [onEntityClick, analyticsController]);\n\n const handleSelectionChange = useCallback((entity: Entity<M>, selected: boolean) => {\n selectionController?.toggleEntitySelection(entity, selected);\n }, [selectionController]);\n\n const isEntitySelected = useCallback((entity: Entity<M>) => {\n return selectionController?.isEntitySelected(entity) ?? false;\n }, [selectionController]);\n\n const isEntityHighlighted = useCallback((entity: Entity<M>) => {\n return highlightedEntities?.some(e => e.id === entity.id && e.path === entity.path) ?? false;\n }, [highlightedEntities]);\n\n // ── Compute list-view-visible actions per entity ──\n const getListViewActions = useCallback((entity: Entity<M>): EntityAction[] => {\n if (!getActionsForEntity) return EMPTY_LIST_VIEW_ACTIONS;\n const customEntityActions = (collection.entityActions ?? [])\n .map(action => resolveEntityAction(action, customizationController.entityActions))\n .filter(Boolean) as EntityAction<M>[];\n const allActions = getActionsForEntity({ entity,\ncustomEntityActions });\n return allActions.filter(a => a.showActionsInListView);\n }, [getActionsForEntity, collection.entityActions, customizationController.entityActions]);\n\n const rowClasses = getRowClasses(size);\n\n const selectedIds = useMemo(() => new Set(selectionController?.selectedEntities.map(e => e.id)), [selectionController?.selectedEntities]);\n const highlightedIds = useMemo(() => new Set(highlightedEntities?.map(e => e.id)), [highlightedEntities]);\n\n const handleRowSelectionChange = useCallback((entity: Entity<M>, selected: boolean) => {\n handleSelectionChange(entity, selected);\n }, [handleSelectionChange]);\n\n return (\n <ListView<Entity<M>>\n data={data}\n dataLoading={dataLoading}\n noMoreToLoad={noMoreToLoad}\n dataLoadingError={dataLoadingError}\n itemCount={itemCount}\n setItemCount={setItemCount}\n pageSize={pageSize}\n paginationEnabled={paginationEnabled}\n onItemClick={handleEntityClick}\n selectedIds={selectedIds}\n highlightedIds={highlightedIds}\n selectionEnabled={selectionEnabled}\n emptyComponent={emptyComponent}\n size={size}\n selectedEntityId={selectedEntityId}\n renderRow={useCallback(({ item: entity, style, className, selected, highlighted, isLast, onClick, onSelectionChange }) => {\n return (\n <div\n key={entity.id}\n style={style}\n className={className}\n >\n <ListRow\n entity={entity}\n collection={resolvedCollection}\n onClick={handleEntityClick}\n selected={selected}\n highlighted={highlighted}\n onSelectionChange={handleRowSelectionChange}\n selectionEnabled={selectionEnabled}\n columns={visibleColumns}\n slotKeys={slotKeys}\n rowClasses={rowClasses}\n showImage={showImage}\n size={size}\n isLast={isLast}\n isActive={selectedEntityId !== undefined && entity.id === selectedEntityId}\n listViewActions={getListViewActions(entity)}\n context={context}\n path={path}\n selectionController={selectionController}\n openEntityMode={openEntityMode}\n />\n </div>\n );\n }, [resolvedCollection, selectionEnabled, visibleColumns, slotKeys, rowClasses, showImage, size, selectedEntityId, getListViewActions, context, path, selectionController, openEntityMode, handleRowSelectionChange, handleEntityClick])}\n />\n );\n}\n\n/**\n * Single row in the list view.\n * Uses the shared slot system for a fixed editorial layout:\n * [Checkbox] [Image] [Title + Subtitle] → spacer → [Status] [Date]\n *\n * When collection.listProperties is explicitly set, falls back to\n * the column system for developer-defined table layouts.\n */\nconst ListRow = React.memo(function ListRow<M extends Record<string, unknown>>({\n entity,\n collection,\n onClick,\n selected,\n highlighted,\n onSelectionChange,\n selectionEnabled,\n columns,\n slotKeys,\n rowClasses,\n showImage,\n size,\n isLast,\n isActive = false,\n listViewActions = [],\n context,\n path,\n selectionController,\n openEntityMode\n}: {\n entity: Entity<M>;\n collection: CollectionConfig<M>;\n onClick?: (entity: Entity<M>) => void;\n selected?: boolean;\n highlighted?: boolean;\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void;\n selectionEnabled?: boolean;\n columns: ListColumnDef[];\n slotKeys: CollectionSlotKeys;\n rowClasses: string;\n showImage: boolean;\n size: CollectionSize;\n isLast: boolean;\n isActive?: boolean;\n listViewActions?: EntityAction[];\n context?: ReturnType<typeof useCMSContext>;\n path?: string;\n selectionController?: SelectionController<M>;\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n}) {\n // ── Resolve slots (pure function, no hooks) ──\n const slots = resolveEntitySlots(\n entity as Entity<Record<string, unknown>>,\n collection as CollectionConfig<Record<string, unknown>>,\n slotKeys\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Cmd+click (Mac) or Ctrl+click (Windows) toggles selection\n if ((e.metaKey || e.ctrlKey) && selectionEnabled) {\n e.preventDefault();\n onSelectionChange?.(entity, !selected);\n return;\n }\n onClick?.(entity);\n }, [entity, onClick, selected, selectionEnabled, onSelectionChange]);\n\n const handleCheckboxClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleCheckboxChange = useCallback((checked: boolean) => {\n onSelectionChange?.(entity, checked);\n }, [entity, onSelectionChange]);\n\n // Developer-defined column mode (listProperties is explicitly set)\n const useColumnMode = !!collection.listProperties && collection.listProperties.length > 0;\n const extraColumns = useColumnMode ? columns.filter(c => !c.isTitle) : [];\n\n return (\n <div\n className={cls(\n \"@container flex items-center gap-4 cursor-pointer group transition-colors duration-200 relative h-full\",\n rowClasses,\n isActive\n ? \"bg-surface-accent-100 dark:bg-surface-accent-950 hover:bg-surface-accent-200 dark:hover:bg-surface-accent-950\"\n : selected\n ? \"bg-surface-accent-50 dark:bg-surface-accent-900 hover:bg-surface-accent-100 dark:hover:bg-surface-accent-950\"\n : highlighted\n ? \"bg-surface-accent-50 dark:bg-surface-accent-900 hover:bg-surface-50 dark:hover:bg-surface-800/40\"\n : \"bg-white dark:bg-surface-900 hover:bg-surface-50 dark:hover:bg-surface-800/40\"\n )}\n onClick={handleClick}\n >\n {/* Selection indicator line */}\n {selected && !isActive && (\n <div className=\"absolute left-0 top-0 bottom-0 w-0.5 bg-primary-500 rounded-r-full\"/>\n )}\n\n {/* Selection Checkbox */}\n {selectionEnabled && (\n <div\n className=\"flex-shrink-0 w-8\"\n onClick={handleCheckboxClick}\n >\n <Checkbox\n checked={selected ?? false}\n onCheckedChange={handleCheckboxChange}\n size=\"smallest\"\n />\n </div>\n )}\n\n {/* MEDIA slot → Image / Icon */}\n {showImage && (\n <div className=\"flex-shrink-0\">\n {slots.image ? (\n <div className={cls(\"w-10 h-10 rounded-lg border relative overflow-hidden bg-surface-100 dark:bg-surface-900\", defaultBorderMixin)}>\n <PropertyPreview propertyKey={slots.image.propertyKey} value={slots.image.value} property={slots.image.property} size=\"small\" fill={true}/>\n </div>\n ) : (\n <div className={cls(\"w-10 h-10 rounded-lg bg-surface-100 dark:bg-surface-900 flex items-center justify-center border\", defaultBorderMixin)}>\n <IconForView\n collectionOrView={collection}\n className=\"text-surface-500 dark:text-surface-400\"\n size=\"small\"\n />\n </div>\n )}\n </div>\n )}\n\n {/* PRIMARY slot → Title + subtitle + byline */}\n <div className={cls(\"min-w-0 overflow-hidden\", useColumnMode ? \"flex-1\" : \"flex-1\")}>\n <div className=\"truncate\">\n {slots.title?.value !== undefined ? (\n <Typography component=\"div\" variant=\"body2\" className=\"font-semibold text-surface-900 dark:text-surface-50 truncate transition-colors group-hover:text-primary-600 dark:group-hover:text-primary-400\">\n <PropertyPreview\n propertyKey={slots.title.propertyKey}\n value={slots.title.value}\n property={slots.title.property}\n size=\"small\"\n textOnly={true}\n />\n </Typography>\n ) : (\n <Typography component=\"div\" variant=\"body2\" className=\"font-semibold text-surface-500 dark:text-surface-400 font-mono text-xs transition-colors group-hover:text-primary-600 dark:group-hover:text-primary-400\">\n {entity.id}\n </Typography>\n )}\n </div>\n\n {/* SUBTITLE slot */}\n {slots.subtitle && (\n <div className=\"truncate mt-0.5\">\n <Typography variant=\"caption\" component=\"div\" className=\"text-surface-500 dark:text-surface-400 truncate\">\n <PropertyPreview\n propertyKey={slots.subtitle.propertyKey}\n value={slots.subtitle.value}\n property={slots.subtitle.property}\n size=\"small\"\n textOnly={true}\n />\n </Typography>\n </div>\n )}\n\n {/* RELATION CHIPS slot — compact chips for all relations */}\n {!useColumnMode && slots.relations.length > 0 && (\n <div className=\"flex items-center gap-1 mt-1 overflow-hidden max-w-full @max-[350px]:hidden\">\n {slots.relations.map((rel) => (\n rel.items.map((item) => (\n <Chip\n key={`${rel.propertyKey}-${item.id}`}\n size=\"smallest\"\n colorScheme={rel.colorScheme}\n className=\"!text-[10px] !leading-tight !py-0 shrink-0 max-w-[120px] truncate\"\n >\n {item.displayName}\n </Chip>\n ))\n ))}\n {slots.relations.some(r => r.totalCount > r.items.length) && (\n <span className=\"text-[10px] text-surface-400 dark:text-surface-500 shrink-0\">\n +{slots.relations.reduce((acc, r) => acc + Math.max(0, r.totalCount - r.items.length), 0)}\n </span>\n )}\n </div>\n )}\n </div>\n\n {useColumnMode ? (\n /* ── COLUMN MODE (developer-defined listProperties) ── */\n <>\n {extraColumns.map((col) => {\n const value = getValueInPath(entity.values, col.key);\n\n if (col.isStatus || (col.property.type === \"string\" && \"enum\" in col.property)) {\n return (\n <div key={col.key} className={cls(col.width, \"flex\", col.align === \"center\" ? \"justify-center\" : col.align === \"right\" ? \"justify-end\" : \"justify-start\")}>\n {value ? (\n <PropertyPreview propertyKey={col.key} value={value} property={col.property} size=\"small\"/>\n ) : <span className=\"text-surface-400\">—</span>}\n </div>\n );\n }\n\n if (col.isDate || col.property.type === \"date\") {\n return (\n <div key={col.key} className={cls(col.width, col.align === \"center\" ? \"text-center\" : col.align === \"right\" ? \"text-right\" : \"text-left\")}>\n <Typography variant=\"caption\" className=\"whitespace-nowrap text-surface-400 dark:text-surface-500 font-medium\">\n {formatDateValue(value) ?? \"—\"}\n </Typography>\n </div>\n );\n }\n\n // Complex types → compact single-line summary\n if (isComplexPropertyType(col.property)) {\n const summary = compactValueSummary(value, col.property);\n return (\n <div key={col.key} className={cls(col.width, \"truncate\", col.align === \"center\" ? \"text-center\" : col.align === \"right\" ? \"text-right\" : \"text-left\")}>\n <Typography variant=\"caption\" className=\"text-surface-500 dark:text-surface-400 truncate\">\n {summary ?? \"—\"}\n </Typography>\n </div>\n );\n }\n\n // Simple scalar → PropertyPreview (single-line)\n return (\n <div key={col.key} className={cls(col.width, \"truncate\", col.align === \"center\" ? \"text-center\" : col.align === \"right\" ? \"text-right\" : \"text-left\")}>\n <Typography component=\"div\" variant=\"body2\" className=\"text-surface-600 dark:text-surface-300 truncate\">\n {value !== undefined ? (\n <PropertyPreview propertyKey={col.key} value={value} property={col.property} size=\"small\"/>\n ) : \"—\"}\n </Typography>\n </div>\n );\n })}\n </>\n ) : (\n /* ── SLOT MODE (editorial scanner layout) ── */\n <div className=\"flex items-center gap-4 flex-shrink-0 ml-auto\">\n {/* STATUS slot — hidden when row is narrow */}\n {slots.status && (\n <div className=\"flex-shrink-0 @max-[400px]:hidden\">\n <PropertyPreview\n propertyKey={slots.status.propertyKey}\n value={slots.status.value}\n property={slots.status.property}\n size=\"small\"\n />\n </div>\n )}\n\n {/* DATE slot */}\n {slots.date && (\n <div className=\"flex-shrink-0 text-right w-[80px] @max-[500px]:hidden\">\n <Typography variant=\"caption\" className=\"whitespace-nowrap text-surface-400 dark:text-surface-500 font-medium\">\n {slots.date.formatted ?? \"—\"}\n </Typography>\n </div>\n )}\n </div>\n )}\n\n {/* LIST VIEW ACTIONS — always visible on each row */}\n {listViewActions.length > 0 && (\n <div className=\"flex items-center gap-0.5 flex-shrink-0 ml-auto\" onClick={(e) => e.stopPropagation()}>\n {listViewActions.map((action, index) => (\n <Tooltip key={action.key ?? index} title={action.name} asChild>\n <IconButton\n size=\"small\"\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n action.onClick({\n view: \"collection\",\n entity,\n path,\n collection,\n context: context!,\n sidePanelController: context?.sidePanelController,\n selectionController,\n openEntityMode: openEntityMode ?? collection?.openEntityMode ?? \"full_screen\"\n });\n }}>\n {action.icon}\n </IconButton>\n </Tooltip>\n ))}\n </div>\n )}\n </div>\n );\n}) as <M extends Record<string, unknown>>(props: {\n entity: Entity<M>;\n collection: CollectionConfig<M>;\n onClick?: (entity: Entity<M>) => void;\n selected?: boolean;\n highlighted?: boolean;\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void;\n selectionEnabled?: boolean;\n columns: ListColumnDef[];\n slotKeys: CollectionSlotKeys;\n rowClasses: string;\n showImage: boolean;\n size: CollectionSize;\n isLast: boolean;\n isActive?: boolean;\n listViewActions?: EntityAction[];\n context?: ReturnType<typeof useCMSContext>;\n path?: string;\n selectionController?: SelectionController<M>;\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n}) => React.ReactElement;\n\n","import type { Properties } from \"@rebasepro/types\";\nimport type { Property } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { defaultBorderMixin, Typography } from \"@rebasepro/ui\";\nimport { PropertyPreview } from \"../preview\";\nimport { PreviewSize } from \"../types/components/PropertyPreviewProps\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\n/**\n * Build a readable label for a path and resolve the property\n * Supports map and array (including arrays of maps)\n */\nexport function buildPropertyLabelAndGetProperty(\n properties: Properties,\n key: string\n): { label: string; property: Property | undefined } {\n if (!key) return {\n label: \"\",\n property: undefined\n };\n\n // Parse \"a[0].b.c[2]\" -> [\"a\", 0, \"b\", \"c\", 2]\n const segments: (string | number)[] = [];\n const re = /([^[.\\]]+)|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(key)) !== null) {\n if (m[1] !== undefined) segments.push(m[1]);\n else if (m[2] !== undefined) segments.push(Number(m[2]));\n }\n\n let currentProps: Properties | undefined = properties;\n let currentProp: Property | undefined;\n let lastLabel = \"\";\n\n const getArrayOfProp = (p?: Property): Property | undefined => {\n if (!p || p.type !== \"array\") return undefined;\n return Array.isArray(p.of) ? (p.of[0] as Property) : (p.of as Property | undefined);\n };\n\n for (const seg of segments) {\n if (typeof seg === \"number\") {\n // Last segment label should be the index itself\n lastLabel = `[${seg}]`;\n\n // Move schema context into the array element\n if (currentProp?.type === \"array\") {\n currentProp = getArrayOfProp(currentProp);\n if (currentProp?.type === \"map\" && currentProp.properties) {\n currentProps = currentProp.properties as Properties;\n } else {\n currentProps = undefined;\n }\n } else {\n // Index without array schema context\n currentProp = undefined;\n currentProps = undefined;\n }\n continue;\n }\n\n // seg is a string key\n if (currentProps && (currentProps as Record<string, Property>)[seg]) {\n const nextProp = (currentProps as Record<string, Property>)[seg];\n currentProp = nextProp;\n // Last segment label should be the property name (or the raw key)\n lastLabel = nextProp.name || String(seg);\n\n if (nextProp.type === \"map\" && nextProp.properties) {\n currentProps = nextProp.properties as Properties;\n } else if (nextProp.type === \"array\") {\n // Keep array prop; the next segment (index) will step into its element schema\n currentProps = undefined;\n } else {\n currentProps = undefined;\n }\n } else {\n // Unknown key or no schema context\n currentProp = undefined;\n currentProps = undefined;\n lastLabel = String(seg);\n }\n }\n\n return {\n label: lastLabel,\n property: currentProp\n };\n}\n\nconst pathEndsWithIndex = (p: string) => /\\[\\d+\\]$/.test(p);\n\n/**\n * Improved simple layout for nested changes:\n * - Map or Array-of-Map -> section header + indented rows\n * - Leaf or Array-of-Primitives -> single row with label and value\n */\nexport const PropertyCollectionView = ({\n data,\n properties,\n baseKey = \"\",\n suppressHeader = false,\n size = \"small\"\n}: {\n data: unknown;\n properties: Properties;\n baseKey?: string;\n suppressHeader?: boolean;\n size?: PreviewSize;\n}) => {\n\n const isTopLevel = !!baseKey && !baseKey.includes(\".\") && !baseKey.includes(\"[\");\n\n // Arrays\n if (Array.isArray(data)) {\n const {\n label: arrayLabel,\n property\n } = baseKey\n ? buildPropertyLabelAndGetProperty(properties, baseKey)\n : {\n label: \"\",\n property: undefined as Property | undefined\n };\n\n const ofProp = property?.type === \"array\"\n ? (Array.isArray(property.of) ? property.of[0] : property.of) as Property | undefined\n : undefined;\n\n const isArrayOfMaps = ofProp?.type === \"map\";\n const isArrayOfPrimitives = property?.type === \"array\" && ofProp && ofProp.type !== \"map\";\n\n // Many-cardinality relation: property type is \"relation\" but value is an array\n // Render as a single row via PropertyPreview (which handles relation arrays)\n const isRelationArray = property?.type === \"relation\";\n\n // Array of primitives or many-relation -> single row\n if (baseKey && property && (isArrayOfPrimitives || isRelationArray)) {\n return (\n <div\n className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? \"py-4\" : \"py-2\"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : \"\"}`}>\n <div className=\"col-span-4 pr-2\">\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}\n className=\"break-words\">\n {arrayLabel}\n </Typography>\n </div>\n <div className=\"col-span-8\">\n <PropertyPreview propertyKey={baseKey}\n value={data}\n property={property}\n size={size}/>\n </div>\n </div>\n );\n }\n\n // Array of maps or unknown -> array header + combined item header (MapName [index]) then content\n return (\n <div className={`${isTopLevel ? \"py-4\" : \"py-1\"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : \"\"}`}>\n {baseKey && arrayLabel && !suppressHeader && (\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}>\n {arrayLabel}\n </Typography>\n )}\n <div className={baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : \"\"}>\n {data.map((item, index) => {\n if (item === null || item === undefined) return null;\n const currentKey = baseKey ? `${baseKey}[${index}]` : `[${index}]`;\n\n // Combined header text\n const itemHeader = isArrayOfMaps && ofProp?.name\n ? `${ofProp.name} [${index}]`\n : `[${index}]`;\n\n return (\n <div key={currentKey} className=\"py-1\">\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}>\n {itemHeader}\n </Typography>\n <div className={`pl-4 mt-1 border-l ${defaultBorderMixin}`}>\n <PropertyCollectionView\n data={item}\n properties={properties}\n baseKey={currentKey}\n suppressHeader={true} // don’t repeat the inner map header\n size={size}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n // Objects (maps or plain objects)\n if (typeof data === \"object\" && data !== null) {\n const {\n label,\n property\n } = baseKey\n ? buildPropertyLabelAndGetProperty(properties, baseKey)\n : {\n label: \"\",\n property: undefined as Property | undefined\n };\n\n // Non-map leaf-like object -> single row\n if (baseKey && (!property || property.type !== \"map\" || !property.properties)) {\n if (!property) return null;\n return (\n <div\n className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? \"py-4\" : \"py-2\"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : \"\"}`}>\n <div className=\"col-span-4 pr-2\">\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}\n className=\"break-words\">\n {label}\n </Typography>\n </div>\n <div className=\"col-span-8\">\n <PropertyPreview propertyKey={baseKey}\n value={data}\n property={property}\n size={size}/>\n </div>\n </div>\n );\n }\n\n // Map with defined properties -> show map header only if not suppressed\n const showMapHeader =\n baseKey &&\n !suppressHeader &&\n property?.type === \"map\" &&\n (property.name || !pathEndsWithIndex(baseKey));\n\n const headerText = property?.name || label;\n\n return (\n <div className={`${isTopLevel ? \"py-4\" : \"py-1\"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : \"\"}`}>\n {showMapHeader && (\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}\n >\n {headerText}\n </Typography>\n )}\n <div className={baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : \"\"}>\n {Object.entries(data).map(([key, value]) => {\n if (value === null || value === undefined) return null;\n if (baseKey === \"\" && !properties[key]) return null;\n const currentKey = baseKey ? `${baseKey}.${key}` : key;\n return (\n <PropertyCollectionView\n key={currentKey}\n data={value}\n properties={properties}\n baseKey={currentKey}\n size={size}\n />\n );\n })}\n </div>\n </div>\n );\n }\n\n // Primitives\n if (baseKey) {\n const {\n label,\n property\n } = buildPropertyLabelAndGetProperty(properties, baseKey);\n if (!property) return null;\n return (\n <div\n className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? \"py-4\" : \"py-2\"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : \"\"}`}>\n <div className=\"col-span-4 pr-2\">\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}\n className=\"break-words\">\n {label}\n </Typography>\n </div>\n <div className=\"col-span-8\">\n <PropertyPreview propertyKey={baseKey}\n value={data}\n property={property}\n size={size}/>\n </div>\n </div>\n );\n }\n\n return null;\n};\n\nexport function buildDataFromPaths(values: object, paths: string[]): object {\n const result = {};\n paths.forEach(path => {\n const value = getValueInPath(values, path);\n if (value === undefined) return;\n\n // lodash.set would be perfect here\n const segments = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let current: Record<string, unknown> = result;\n segments.forEach((segment, index) => {\n if (index === segments.length - 1) {\n current[segment] = value;\n } else {\n const nextSegment = segments[index + 1];\n const isNextAnIndex = /^\\d+$/.test(nextSegment);\n if (!current[segment]) {\n if (isNextAnIndex) {\n current[segment] = [];\n } else {\n current[segment] = {};\n }\n }\n current = current[segment] as Record<string, unknown>;\n }\n });\n });\n return result;\n}\n","import type { Properties } from \"@rebasepro/types\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport type { CustomizationController } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { Entity } from \"@rebasepro/types\";\nimport { cls, defaultBorderMixin, ExternalLinkIcon, IconButton, Typography } from \"@rebasepro/ui\";\n;\nimport { useCustomizationController } from \"@rebasepro/app\";\nimport { useAuthController } from \"@rebasepro/app\";\nimport { PropertyCollectionView } from \"./PropertyCollectionView\";\n\n/**\n * @group Components\n */\nexport interface EntityViewBindingProps<M extends Record<string, unknown>> {\n entity: Entity<M>;\n collection: CollectionConfig<M>;\n path: string;\n className?: string;\n}\n\nexport function EntityViewBinding<M extends Record<string, unknown>>(\n {\n entity,\n collection,\n path,\n className\n }: EntityViewBindingProps<M>) {\n\n const customizationController: CustomizationController = useCustomizationController();\n\n const properties: Properties = collection.properties;\n\n return (\n <div className={\"w-full \" + className}>\n <div className={\"w-full mb-4 p-4\"}>\n\n <div className={`grid grid-cols-12 gap-x-4 py-4 items-start border-b ${defaultBorderMixin}`}>\n <div className=\"col-span-4 pr-2\">\n <Typography variant=\"caption\"\n color={\"secondary\"}\n component={\"span\"}\n className=\"break-words\">\n Id\n </Typography>\n </div>\n <div className=\"col-span-8\">\n <div\n className=\"flex-grow text-surface-900 dark:text-white flex items-center\">\n <span className=\"flex-grow mr-2\">{entity.id}</span>\n {customizationController?.entityLinkBuilder &&\n <a href={customizationController.entityLinkBuilder({ entity })}\n rel=\"noopener noreferrer\"\n target=\"_blank\">\n <IconButton>\n <ExternalLinkIcon/>\n </IconButton>\n </a>}\n </div>\n </div>\n </div>\n\n <PropertyCollectionView data={entity.values} properties={properties} size={\"medium\"}/>\n\n </div>\n </div>\n );\n}\n","import React, { useRef } from \"react\";\nimport { Highlight, themes } from \"prism-react-renderer\";\nimport { useModeController } from \"@rebasepro/app\";\n\nexport function JsonPreviewBinding({ values }: { values: object }) {\n const code = JSON.stringify(values, null, \"\\t\");\n const { mode } = useModeController();\n const preRef = useRef<HTMLPreElement>(null);\n\n // Global keydown handler\n // const handleGlobalKeyDown = useCallback((e: KeyboardEvent) => {\n // // Check for Control (Windows/Linux) or Command (macOS) + \"a\":\n // if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"a\") {\n // // If our code view is mounted, perform selection\n // if (preRef.current) {\n // e.preventDefault();\n // e.stopPropagation();\n //\n // const selection = window.getSelection();\n // const range = document.createRange();\n // range.selectNodeContents(preRef.current);\n // if (selection) {\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n // }\n // }\n // }, []);\n\n // // Attach the global keydown listener when component mounts,\n // // and remove it when it unmounts.\n // useEffect(() => {\n // document.addEventListener(\"keydown\", handleGlobalKeyDown);\n // return () => {\n // document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n // };\n // }, [handleGlobalKeyDown]);\n\n return (\n <Highlight\n theme={mode === \"dark\" ? themes.vsDark : themes.github}\n code={code}\n language=\"json\"\n >\n {({ style, tokens, getLineProps, getTokenProps }) => (\n <pre\n // Bind the ref to our pre element so we can select its contents.\n ref={preRef}\n style={{\n ...style,\n backgroundColor: \"inherit\"\n }}\n className=\"max-w-6xl mx-auto p-8 rounded-xs text-sm\"\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })} className=\"text-wrap\">\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} className=\"word-break\"/>\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n );\n}\n","/**\n * Shared tab value constants used by EditViewBinding and DetailViewBinding.\n */\nexport const MAIN_TAB_VALUE = \"__main_##Q$SC^#S6\";\nexport const JSON_TAB_VALUE = \"__json\";\nexport const HISTORY_TAB_VALUE = \"__rebase_history\";\n","import type { ComponentRef, CollectionConfig, EntityCustomViewParams, FormViewConfig } from \"@rebasepro/types\";\nimport type { FormContext } from \"../types/fields\";\nimport type { PluginFormActionProps } from \"@rebasepro/types\";\nimport React, { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Entity, EntityStatus, getCollectionDataPath, Property } from \"@rebasepro/types\";\nimport { PluginProviderStack, resolveComponentRef, useComponentOverride, CollectionScopeProvider } from \"@rebasepro/app\";\n\nimport { CollectionViewBinding } from \"./CollectionViewBinding/CollectionViewBinding\";\nimport { EntityViewBinding } from \"./EntityViewBinding\";\nimport { CircularProgressCenter, iconSize } from \"@rebasepro/ui\";\nimport {\n Alert,\n Button,\n CenteredView,\n cls,\n CodeIcon,\n defaultBorderMixin,\n HistoryIcon,\n IconButton,\n Maximize2Icon,\n PencilIcon,\n Skeleton,\n Tab,\n Tabs,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { ErrorView, createFormexStub, usePermissions, useTranslation, getIcon } from \"@rebasepro/app\";\nimport {\n getSubcollections,\n removeInitialAndTrailingSlashes,\n resolveDefaultSelectedView\n} from \"@rebasepro/common\";\nimport { resolvedSelectedEntityView } from \"../util/resolutions\";\nimport {\n useCustomizationController,\n useFetch,\n useRebaseContext,\n useLargeLayout,\n useSlot\n} from \"@rebasepro/app\";\nimport { useUrlController } from \"../hooks/navigation/contexts/UrlContext\";\nimport { useCollectionRegistryController } from \"../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useNavigate } from \"react-router-dom\";\nimport { getValueInPath } from \"@rebasepro/utils\";\nimport { getEntityTitlePropertyKey, resolveTitleToString } from \"../util/previews\";\nimport { JsonPreviewBinding } from \"../components/JsonPreviewBinding\";\n\nconst EntityHistoryView = lazy(() => import(\"../components/history\").then(m => ({ default: m.EntityHistoryView })));\n\nimport { MAIN_TAB_VALUE, JSON_TAB_VALUE, HISTORY_TAB_VALUE } from \"../util/view_constants\";\n\nexport type BarActionsParams = {\n values: object,\n status: EntityStatus,\n path: string,\n entityId?: string | number;\n};\n\nexport type OnTabChangeParams<M extends Record<string, unknown>> = {\n path: string;\n entityId?: string | number;\n selectedTab?: string;\n collection: CollectionConfig<M>;\n};\n\nexport interface DetailViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> {\n path: string;\n collection: CollectionConfig<M>;\n entityId: string | number;\n selectedTab?: string;\n parentCollectionSlugs: string[];\n parentEntityIds: string[];\n onTabChange?: (props: OnTabChangeParams<M>) => void;\n onEditClick?: () => void;\n layout?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n barActions?: (params: BarActionsParams) => React.ReactNode;\n}\n\nexport function DetailViewBinding<M extends Record<string, unknown>>({\n entityId,\n ...props\n}: DetailViewBindingProps<M>) {\n\n const {\n entity,\n dataLoading,\n dataLoadingError\n } = useFetch<M>({\n path: props.path,\n entityId: entityId,\n collection: props.collection,\n useCache: false\n });\n\n if (!dataLoading && dataLoadingError) {\n return <CenteredView>\n <ErrorView error={dataLoadingError} />\n </CenteredView>;\n }\n\n if (!dataLoading && !entity) {\n return <CenteredView>\n <Typography variant=\"label\">Entity not found</Typography>\n </CenteredView>;\n }\n\n const content = (\n <DetailViewBindingInner<M>\n {...props}\n entityId={entityId}\n entity={entity}\n dataLoading={dataLoading}\n />\n );\n\n return (\n <CollectionScopeProvider collection={props.collection}>\n {content}\n </CollectionScopeProvider>\n );\n}\n\nfunction DetailViewBindingInner<M extends Record<string, unknown>>({\n path,\n entityId,\n selectedTab: selectedTabProp,\n collection,\n parentCollectionSlugs,\n parentEntityIds,\n onTabChange,\n onEditClick,\n entity,\n dataLoading,\n layout = \"full_screen\",\n barActions\n}: DetailViewBindingProps<M> & {\n entity?: Entity<M>,\n dataLoading: boolean,\n}) {\n const ResolvedCollectionView = useComponentOverride(\"Collection.View\", CollectionViewBinding);\n const { t } = useTranslation();\n const context = useRebaseContext();\n const urlController = useUrlController();\n const navigate = useNavigate();\n const customizationController = useCustomizationController();\n const plugins = customizationController.plugins;\n const collectionRegistryController = useCollectionRegistryController();\n const { canEdit: canEditHook } = usePermissions();\n\n const canEdit = useMemo(() => {\n return entity ? canEditHook(collection, path, entity) : false;\n }, [canEditHook, entity, collection, path]);\n\n const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);\n useEffect(() => {\n if (entity) setUsedEntity(entity);\n }, [entity]);\n\n const defaultSelectedView = useMemo(() => resolveDefaultSelectedView(\n collection.defaultSelectedView,\n { status: \"existing\",\nentityId }\n ), [collection, entityId]);\n\n // Track whether the user has explicitly clicked a tab in this component\n // instance. See EditViewBindingInner for full explanation.\n const userHasChangedTab = useRef(false);\n\n const [selectedTab, setSelectedTab] = useState<string>(() => {\n const val = selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE;\n return val === \"edit\" ? MAIN_TAB_VALUE : val;\n });\n useEffect(() => {\n const val = userHasChangedTab.current\n ? (selectedTabProp ?? MAIN_TAB_VALUE)\n : (selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE);\n const target = val === \"edit\" ? MAIN_TAB_VALUE : val;\n if (target !== selectedTab) {\n setSelectedTab(target);\n }\n }, [selectedTabProp, defaultSelectedView]);\n\n const subcollections = getSubcollections(collection).filter(c => !c.hideFromNavigation);\n const subcollectionsCount = subcollections?.length ?? 0;\n const customViews = collection.entityViews ?? [];\n const customViewsCount = customViews?.length ?? 0;\n const includeJsonView = collection.includeJsonView === undefined ? true : collection.includeJsonView;\n const includeHistoryView = Boolean(collection.history);\n const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0 || includeJsonView || includeHistoryView;\n\n const {\n resolvedEntityViews\n } = resolvedSelectedEntityView(customViews, customizationController, undefined, canEdit);\n\n const validTabValues = useMemo(() => {\n const set = new Set<string>([\n MAIN_TAB_VALUE,\n ...(includeJsonView ? [JSON_TAB_VALUE] : []),\n ...(includeHistoryView ? [HISTORY_TAB_VALUE] : []),\n ...resolvedEntityViews.map(v => v.key),\n ...subcollections.map(s => s.slug)\n ]);\n return set;\n }, [includeJsonView, includeHistoryView, resolvedEntityViews, subcollections]);\n\n const activeTab = validTabValues.has(selectedTab) ? selectedTab : MAIN_TAB_VALUE;\n\n const {\n selectedEntityView\n } = resolvedSelectedEntityView(customViews, customizationController, activeTab, canEdit);\n\n const mainViewVisible = activeTab === MAIN_TAB_VALUE;\n\n // Track which custom view tabs have been visited\n const mountedTabsRef = useRef<Set<string>>(new Set());\n if (activeTab) {\n mountedTabsRef.current.add(activeTab);\n }\n\n // Read-only form context for custom entity views\n const readOnlyFormContext = useMemo<FormContext<M> | undefined>(() => {\n if (!entityId) return undefined;\n const formexStub = createFormexStub<M>(usedEntity?.values ?? {} as M);\n return {\n entityId,\n disabled: true,\n readOnly: true,\n openEntityMode: layout,\n status: \"existing\",\n values: usedEntity?.values ?? ({} as M),\n setFieldValue: () => {\n throw new Error(\"Cannot update values in read-only detail view\");\n },\n save: () => {\n throw new Error(\"Cannot save in read-only detail view\");\n },\n submit: () => {\n throw new Error(\"Cannot submit in read-only detail view\");\n },\n collection,\n path,\n entity: usedEntity,\n savingError: undefined,\n formex: formexStub\n };\n }, [entityId, layout, usedEntity, collection, path]);\n\n // Plugin slots\n const formActionTopProps: PluginFormActionProps = useMemo(() => ({\n entityId,\n parentCollectionSlugs,\n parentEntityIds,\n path,\n status: \"existing\",\n collection: collection!,\n context,\n formContext: readOnlyFormContext as FormContext<Record<string, unknown>> | undefined,\n openEntityMode: layout,\n disabled: true\n }), [entityId, parentCollectionSlugs, parentEntityIds, path, collection, context, readOnlyFormContext, layout]);\n const pluginActionsTop = useSlot(\"form.actions.top\", formActionTopProps);\n\n // Resolve formView.Builder if provided\n const formViewConfig = (collection as CollectionConfig<M> & { formView?: FormViewConfig<M> }).formView;\n const FormViewBuilder = formViewConfig?.Builder ? resolveComponentRef<EntityCustomViewParams>(formViewConfig.Builder as ComponentRef<EntityCustomViewParams>) : null;\n\n // Title resolution\n const titlePropertyKey = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);\n const rawTitle = usedEntity?.values && titlePropertyKey ? getValueInPath(usedEntity.values, titlePropertyKey) : undefined;\n const title = rawTitle !== undefined && rawTitle !== null\n ? resolveTitleToString(rawTitle)\n : (collection.singularName ?? collection.name);\n\n // Non-action custom views\n const nonActionCustomViews = useMemo(() =>\n resolvedEntityViews.filter(e => !e.includeActions),\n [resolvedEntityViews]\n );\n\n const customViewsView = customViews && nonActionCustomViews\n .map((customView) => {\n if (!customView) return null;\n const Builder = resolveComponentRef<EntityCustomViewParams>(customView.Builder);\n if (!Builder) return null;\n if (!entityId) return null;\n\n const isActive = activeTab === customView.key;\n const hasBeenMounted = mountedTabsRef.current.has(customView.key);\n if (!isActive && !hasBeenMounted) return null;\n\n return <div\n className={cls(defaultBorderMixin,\n \"relative flex-1 w-full h-full overflow-auto\",\n { \"hidden\": !isActive }\n )}\n key={`custom_view_${customView.key}`}\n role=\"tabpanel\">\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n {readOnlyFormContext && <Builder\n collection={collection}\n parentCollectionSlugs={parentCollectionSlugs}\n parentEntityIds={parentEntityIds}\n entity={usedEntity}\n modifiedValues={usedEntity?.values}\n formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}\n />}\n </Suspense>\n </ErrorBoundary>\n </div>;\n }).filter(Boolean);\n\n const globalLoading = dataLoading && !usedEntity;\n\n // JSON view\n const jsonTabMounted = mountedTabsRef.current.has(JSON_TAB_VALUE);\n const jsonView = (activeTab === JSON_TAB_VALUE || jsonTabMounted) ? <div\n className={cls(\"relative flex-1 h-full overflow-auto w-full\",\n { \"hidden\": activeTab !== JSON_TAB_VALUE })}\n key={\"json_view\"}\n role=\"tabpanel\">\n <ErrorBoundary>\n <JsonPreviewBinding values={usedEntity?.values ?? {}} />\n </ErrorBoundary>\n </div> : null;\n\n // History view\n const historyView = includeHistoryView && activeTab === HISTORY_TAB_VALUE ? <div\n className={\"relative flex-1 h-full overflow-auto w-full\"}\n key={\"history_view\"}\n role=\"tabpanel\">\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n <EntityHistoryView\n collection={collection}\n entity={usedEntity}\n formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}\n modifiedValues={usedEntity?.values}\n />\n </Suspense>\n </ErrorBoundary>\n </div> : null;\n\n // Subcollection views\n const subCollectionsViews = subcollections && subcollections.map((subcollection) => {\n const subcollectionId = subcollection.slug;\n const newFullPath = usedEntity ? `${path}/${usedEntity?.id}/${removeInitialAndTrailingSlashes(getCollectionDataPath(subcollection))}` : undefined;\n\n if (activeTab !== subcollectionId) return null;\n return (\n <div\n className={\"relative flex-1 h-full overflow-auto w-full\"}\n key={`subcol_${subcollectionId}`}\n role=\"tabpanel\">\n {globalLoading && <CircularProgressCenter />}\n {!globalLoading &&\n (usedEntity && newFullPath\n ? <ResolvedCollectionView\n path={newFullPath}\n parentCollectionSlugs={[...parentCollectionSlugs, collection.slug]}\n parentEntityIds={[...parentEntityIds, String(usedEntity?.id)]}\n updateUrl={false}\n {...subcollection}\n openEntityMode={layout} />\n : <div className=\"flex items-center justify-center w-full h-full p-3\">\n <Typography variant={\"label\"}>\n {t(\"save_entity_before_subcollections\") ?? \"You need to save your entity before adding additional collections\"}\n </Typography>\n </div>)\n }\n </div>\n );\n }).filter(Boolean);\n\n const onSideTabClick = useCallback((value: string) => {\n userHasChangedTab.current = true;\n setSelectedTab(value);\n onTabChange?.({\n path,\n entityId,\n selectedTab: value === MAIN_TAB_VALUE ? undefined : value,\n collection\n });\n }, [onTabChange, path, entityId, collection]);\n\n const propertyDetailView = () => {\n // formView.Builder replaces the default property display\n if (FormViewBuilder && usedEntity) {\n return <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n <FormViewBuilder\n collection={collection}\n parentCollectionSlugs={parentCollectionSlugs}\n parentEntityIds={parentEntityIds}\n entity={usedEntity}\n modifiedValues={usedEntity?.values}\n formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}\n />\n </Suspense>\n </ErrorBoundary>;\n }\n\n return (\n <>\n {usedEntity && <EntityViewBinding\n entity={usedEntity}\n collection={collection}\n path={path}\n />}\n </>\n );\n };\n\n // Tabs\n const subcollectionTabs = subcollections && subcollections.map((subcollection) => {\n const icon = getIcon(subcollection.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className=\"text-sm min-w-[90px]\"\n value={subcollection.slug}\n key={`entity_detail_collection_tab_${subcollection.name}`}>\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {subcollection.name}\n </span>\n </Tab>\n );\n });\n\n const customViewTabsStart = resolvedEntityViews.filter(view => view.position === \"start\")\n .map((view) => {\n const icon = getIcon(view.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className={!view.tabComponent ? \"text-sm min-w-[90px]\" : undefined}\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.tabComponent ?? (\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {view.name}\n </span>\n )}\n </Tab>\n );\n });\n const customViewTabsEnd = resolvedEntityViews.filter(view => !view.position || view.position === \"end\")\n .map((view) => {\n const icon = getIcon(view.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className={!view.tabComponent ? \"text-sm min-w-[90px]\" : undefined}\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.tabComponent ?? (\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {view.name}\n </span>\n )}\n </Tab>\n );\n });\n\n const shouldShowTopBar = Boolean(barActions) || hasAdditionalViews || layout === \"side_panel\" || layout === \"dialog\";\n\n const fullScreenButton = !barActions && (layout === \"side_panel\" || layout === \"split\" || layout === \"dialog\") && entityId ? (\n <Tooltip title={\"Open full screen\"}>\n <IconButton\n size=\"small\"\n onClick={() => {\n const entityUrl = urlController.buildUrlCollectionPath(`${path}/${entityId}`);\n navigate(`${entityUrl}#full`);\n }}\n >\n <Maximize2Icon size={iconSize.smallest} />\n </IconButton>\n </Tooltip>\n ) : null;\n\n // Edit button — only rendered when the user has edit permissions\n const editButton = canEdit && onEditClick ? (\n <Button\n variant=\"filled\"\n color=\"primary\"\n size=\"small\"\n startIcon={<PencilIcon size={iconSize.smallest} />}\n onClick={onEditClick}>\n {t(\"edit_entity\")}\n </Button>\n ) : null;\n\n // Main content view with title and properties\n const mainView = <div\n className={cls(\n \"flex-1 flex flex-row w-full overflow-y-auto justify-center\",\n !mainViewVisible ? \"hidden\" : \"\"\n )}>\n <div\n className={cls(\"relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit\")}>\n <div className={cls(\n \"flex flex-col w-full\",\n layout === \"dialog\"\n ? \"pt-4 pb-12 px-6 sm:px-8\"\n : \"pt-12 pb-16 px-4 sm:px-8 md:px-10\"\n )}>\n {/* Title and entity path */}\n <div className={\"w-full flex flex-col items-start my-4 lg:my-6\"}>\n <div className=\"flex items-center justify-between w-full\">\n <Typography\n className={cls(\"my-4 grow line-clamp-1\", collection.hideIdFromForm ? \"mb-6\" : \"\")}\n variant={\"h4\"}>\n {title}\n </Typography>\n {editButton}\n </div>\n\n <Alert color={\"base\"} outerClassName={\"w-full\"} size={\"small\"}>\n <code\n className={\"text-xs select-all text-text-secondary dark:text-text-secondary-dark\"}>\n {usedEntity?.path ?? path}/{entityId}\n </code>\n </Alert>\n </div>\n\n {/* Property detail display */}\n <div className=\"mt-12 flex flex-col gap-8\">\n {propertyDetailView()}\n </div>\n\n <div className=\"h-16\" />\n </div>\n\n {/* Side action bar for large screens */}\n {canEdit && onEditClick && layout === \"full_screen\" && <div\n className={cls(\n \"overflow-auto h-full hidden @6xl:flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l\",\n defaultBorderMixin\n )}>\n <Button\n fullWidth={true}\n variant=\"filled\"\n color=\"primary\"\n startIcon={<PencilIcon size={iconSize.small} />}\n onClick={onEditClick}>\n {t(\"edit_entity\")}\n </Button>\n </div>}\n </div>\n </div>;\n\n let result = <div className=\"relative flex flex-col h-full w-full bg-white dark:bg-surface-800\">\n\n {shouldShowTopBar && <div\n className={cls(\"h-[52px] items-center flex overflow-hidden w-full border-b pl-2 pr-2 flex bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n\n {fullScreenButton}\n\n {barActions?.({\n path,\n entityId,\n values: usedEntity?.values ?? {},\n status: \"existing\"\n })}\n\n {pluginActionsTop}\n\n {hasAdditionalViews && <div className={\"flex-1 flex justify-end min-w-0 shrink-0\"}>\n <Tabs\n className={\"!w-fit max-w-full\"}\n value={activeTab}\n onValueChange={(value) => {\n onSideTabClick(value);\n }}>\n\n {includeJsonView && <Tab\n disabled={!hasAdditionalViews}\n value={JSON_TAB_VALUE}\n className={\"text-sm\"}>\n <CodeIcon size={iconSize.smallest} />\n </Tab>}\n\n {includeHistoryView && <Tab\n disabled={!hasAdditionalViews}\n value={HISTORY_TAB_VALUE}\n className={\"text-sm\"}>\n <HistoryIcon size={iconSize.smallest} />\n </Tab>}\n\n <Tab\n disabled={!hasAdditionalViews}\n value={MAIN_TAB_VALUE}\n className={\"text-sm min-w-[90px]\"}>\n <span className=\"flex items-center gap-1.5\">\n {getIcon(collection.icon, undefined, undefined, \"smallest\")}\n {collection.singularName ?? collection.name}\n </span>\n </Tab>\n\n {customViewTabsStart}\n {customViewTabsEnd}\n {subcollectionTabs}\n </Tabs>\n </div>}\n </div>}\n\n {globalLoading\n ? <DetailViewSkeleton collection={collection} />\n : mainView}\n\n {jsonView}\n {historyView}\n {customViewsView}\n {subCollectionsViews}\n\n </div>;\n\n if (plugins && plugins.length > 0) {\n result = (\n <PluginProviderStack\n plugins={plugins}\n scope=\"form\"\n scopeProps={{\n status: \"existing\",\n path,\n collection,\n entity: usedEntity,\n context,\n formContext: readOnlyFormContext\n }}>\n {result}\n </PluginProviderStack>\n );\n }\n\n return result;\n}\n\nfunction DetailViewSkeleton({ collection }: { collection: CollectionConfig<Record<string, unknown>> }) {\n return (\n <div className=\"flex-1 flex flex-row w-full overflow-y-auto justify-center\">\n <div className=\"relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit\">\n <div className=\"flex flex-col w-full pt-12 pb-16 px-4 sm:px-8 md:px-10\">\n <div className=\"w-full flex flex-col items-start my-4 lg:my-6\">\n <div className={`py-1 my-4 w-2/3 ${collection.hideIdFromForm ? \"mb-6\" : \"\"}`}>\n <Skeleton height={28} className=\"w-full rounded-md\" />\n </div>\n <Skeleton height={32} className=\"w-full rounded-md\" />\n </div>\n <div className=\"mt-12 flex flex-col gap-8\">\n <div className=\"flex flex-wrap gap-x-4 w-full space-y-8\">\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CollectionSize, Entity, EntityTableController, SelectionController } from \"@rebasepro/types\";\nimport { EditViewBinding } from \"../EditViewBinding\";\nimport { DetailViewBinding } from \"../DetailViewBinding\";\nimport {\n cls,\n defaultBorderMixin,\n ResizablePanels\n} from \"@rebasepro/ui\";\nimport { useLargeLayout, UnsavedChangesDialog, useNavigationBlocker } from \"@rebasepro/app\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { useUrlController } from \"../../hooks/navigation/contexts/UrlContext\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { withViewMode } from \"../../util/view_mode\";\n\nexport type SplitListViewProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n tableController: EntityTableController<M>;\n onEntityClick?: (entity: Entity<M>) => void;\n onNewClick?: () => void;\n selectionController?: SelectionController<M>;\n selectionEnabled?: boolean;\n highlightedEntities?: Entity<M>[];\n emptyComponent?: React.ReactNode;\n onScroll?: (props: {\n scrollDirection: \"forward\" | \"backward\";\n scrollOffset: number;\n scrollUpdateWasRequested: boolean;\n }) => void;\n initialScroll?: number;\n size?: CollectionSize;\n path: string;\n parentCollectionSlugs?: string[], parentEntityIds?: string[];\n /**\n * The entity ID to show in the detail panel.\n * Comes from the URL path (e.g. /c/authors/14 → selectedEntityId = \"14\").\n * When undefined, no detail panel is shown.\n */\n selectedEntityId?: string | number;\n /**\n * When provided, the detail panel will open this tab (e.g. a subcollection slug).\n * Used by the router to pass the subcollection tab from the URL.\n */\n selectedTab?: string;\n /**\n * Toolbar to render above the content in the left panel.\n */\n toolbar?: React.ReactNode;\n /**\n * The collection view to render on the left side.\n */\n children: React.ReactNode;\n};\n\nconst PANEL_SIZE_KEY = \"rebase_split_list_panel_size\";\n\n/**\n * Whether the element accepts text, and therefore owns the keystroke.\n * Covers native fields plus the ARIA roles custom editors expose.\n */\nfunction isTextEntryTarget(target: HTMLElement | null): boolean {\n if (!target) return false;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (target.isContentEditable) return true;\n return Boolean(target.closest('[contenteditable=\"true\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"searchbox\"]'));\n}\n\n/**\n * Whether a bare letter shortcut may act on this target. Only the list side of\n * the split owns them — inside the detail panel a keystroke belongs to the form.\n */\nfunction isListShortcutTarget(target: HTMLElement | null, detailPanel: HTMLElement | null): boolean {\n if (!target || target === document.body) return true;\n return !detailPanel?.contains(target);\n}\n\nfunction getSavedPanelSize(path: string): number {\n try {\n const saved = localStorage.getItem(`${PANEL_SIZE_KEY}_${path}`);\n if (saved !== null) {\n const val = parseFloat(saved);\n if (!isNaN(val) && val > 0 && val < 100) return val;\n }\n } catch { /* ignore */ }\n return 30;\n}\n\nfunction savePanelSize(path: string, size: number) {\n try {\n localStorage.setItem(`${PANEL_SIZE_KEY}_${path}`, size.toString());\n } catch { /* ignore */ }\n}\n\n/**\n * Master-detail split view.\n * Shows the list on the left and the entity edit view on the right.\n *\n * Animation approach:\n * - The list always renders at full width.\n * - When a detail opens, the list shrinks to `panelSize%` and the detail slides in.\n * - On close, the reverse plays.\n *\n * State management:\n * - The selected entity is driven by the URL path (e.g. /c/authors/14).\n * `selectedEntityId` comes from props via RebaseRoute, NOT from internal state.\n * - Clicking a entity navigates to /c/authors/{id} via the standard onEntityClick handler.\n * - Closing the detail navigates back to /c/authors.\n */\nexport function SplitListView<M extends Record<string, unknown> = Record<string, unknown>>({\n collection,\n tableController,\n onEntityClick: externalOnEntityClick,\n onNewClick: externalOnNewClick,\n selectionController,\n selectionEnabled = true,\n highlightedEntities,\n emptyComponent,\n onScroll,\n initialScroll,\n size = \"m\",\n path,\n parentCollectionSlugs, parentEntityIds,\n selectedEntityId,\n selectedTab,\n toolbar,\n children\n}: SplitListViewProps<M>) {\n const largeLayout = useLargeLayout();\n const collectionRegistryController = useCollectionRegistryController();\n const location = useLocation();\n const isEditMode = location.pathname.endsWith(\"/edit\") || location.pathname.split(\"/\").pop() === \"edit\";\n const navigate = useNavigate();\n const urlController = useUrlController();\n\n const showDetail = selectedEntityId !== undefined;\n\n // ── Unsaved changes ──\n // The detail form lives inside the split layout, so every way out of it\n // (Escape, j/k, clicking another row, the browser back button) is a plain\n // router navigation. A ref — not state — because the blocker predicate must\n // observe the change synchronously, before the navigation it is guarding.\n const dirty = useRef(false);\n const detailPanelRef = useRef<HTMLDivElement>(null);\n const setDirty = useCallback((modified: boolean) => {\n dirty.current = modified;\n }, []);\n\n // The form remounts per entity, so its dirty state must not leak into the next one.\n useEffect(() => {\n dirty.current = false;\n }, [selectedEntityId]);\n\n const blocker = useNavigationBlocker(useCallback(({\n currentLocation,\n nextLocation\n }) => {\n if (!dirty.current) return false;\n if (currentLocation.pathname === nextLocation.pathname) return false;\n // Side panel overlays (e.g. following a relation) render above the form\n // and leave it mounted — nothing is lost in either direction.\n const nextHash = nextLocation.hash;\n if (nextHash === \"#side\" || nextHash === \"#new_side\") return false;\n const currentHash = currentLocation.hash;\n if (currentHash === \"#side\" || currentHash === \"#new_side\") return false;\n return true;\n }, []));\n\n // Panel size state with persistence\n const [panelSize, setPanelSize] = useState(() => getSavedPanelSize(path));\n\n useEffect(() => {\n savePanelSize(path, panelSize);\n }, [panelSize, path]);\n\n // ── Animation state ──\n // We track the \"rendered\" entity to keep the detail panel mounted during the exit animation.\n const [renderedEntityId, setRenderedEntityId] = useState<string | number | undefined>(selectedEntityId);\n const [animationPhase, setAnimationPhase] = useState<\"idle\" | \"entering\" | \"entered\" | \"exiting\">(\n selectedEntityId !== undefined ? \"entered\" : \"idle\"\n );\n const animationTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Transition duration (ms) — keep in sync with CSS\n const TRANSITION_DURATION = 150;\n\n useEffect(() => {\n if (animationTimer.current) {\n clearTimeout(animationTimer.current);\n animationTimer.current = null;\n }\n\n if (selectedEntityId !== undefined) {\n // Opening or switching entity\n setRenderedEntityId(selectedEntityId);\n if (animationPhase === \"idle\" || animationPhase === \"exiting\") {\n // Fresh open — trigger enter\n setAnimationPhase(\"entering\");\n // Use requestAnimationFrame to ensure the \"entering\" class is painted\n // before transitioning to \"entered\".\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimationPhase(\"entered\");\n });\n });\n }\n // If already entered (switching entities), keep \"entered\"\n } else {\n // Closing\n if (animationPhase === \"entered\" || animationPhase === \"entering\") {\n setAnimationPhase(\"exiting\");\n animationTimer.current = setTimeout(() => {\n setAnimationPhase(\"idle\");\n setRenderedEntityId(undefined);\n }, TRANSITION_DURATION);\n }\n }\n\n return () => {\n if (animationTimer.current) clearTimeout(animationTimer.current);\n };\n }, [selectedEntityId]); // Intentionally only depend on selectedEntityId\n\n // Build a URL below this collection, preserving the active view mode.\n const buildUrl = useCallback((subPath: string) => {\n return withViewMode(urlController.buildUrlCollectionPath(subPath));\n }, [urlController]);\n\n // Close the detail panel: navigate back to the collection path\n const handleCloseDetail = useCallback(() => {\n navigate(buildUrl(path));\n }, [navigate, buildUrl, path]);\n\n // ── Keyboard navigation ──\n const entityIds = useMemo(\n () => tableController.data.map((e: Entity<M>) => e.id),\n [tableController.data]\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n\n // Radix overlays own the keyboard while they are open — including Escape.\n if (document.querySelector('[role=\"dialog\"][data-state=\"open\"]')) return;\n\n if (e.key === \"Escape\") {\n if (!selectedEntityId) return;\n // First Escape leaves the field (which may also be dismissing its\n // own dropdown), a second one closes the panel. Closing straight\n // from a focused field would discard an in-progress edit.\n if (isTextEntryTarget(target)) {\n target?.blur();\n e.preventDefault();\n return;\n }\n handleCloseDetail();\n e.preventDefault();\n return;\n }\n\n // Record navigation only belongs to the list side. Inside the detail\n // panel these keys are the form's — arrows move between fields, and a\n // bare letter is input for widgets that aren't native fields (rich\n // text, code editors, comboboxes).\n if (!isListShortcutTarget(target, detailPanelRef.current)) return;\n if (isTextEntryTarget(target)) return;\n\n // Arrow down / j → next entity\n if ((e.key === \"ArrowDown\" || e.key === \"j\") && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n if (entityIds.length === 0) return;\n\n if (selectedEntityId === undefined) {\n const firstEntity = tableController.data[0];\n if (firstEntity) externalOnEntityClick?.(firstEntity);\n } else {\n const currentIndex = entityIds.indexOf(selectedEntityId);\n if (currentIndex >= 0 && currentIndex < entityIds.length - 1) {\n const nextEntity = tableController.data[currentIndex + 1];\n if (nextEntity) externalOnEntityClick?.(nextEntity);\n }\n }\n return;\n }\n\n // Arrow up / k → previous entity\n if ((e.key === \"ArrowUp\" || e.key === \"k\") && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n if (entityIds.length === 0) return;\n\n if (selectedEntityId === undefined) {\n const lastEntity = tableController.data[tableController.data.length - 1];\n if (lastEntity) externalOnEntityClick?.(lastEntity);\n } else {\n const currentIndex = entityIds.indexOf(selectedEntityId);\n if (currentIndex > 0) {\n const prevEntity = tableController.data[currentIndex - 1];\n if (prevEntity) externalOnEntityClick?.(prevEntity);\n }\n }\n return;\n }\n\n // n → new entity\n if (e.key === \"n\" && !e.metaKey && !e.ctrlKey && !e.altKey) {\n externalOnNewClick?.();\n e.preventDefault();\n return;\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [selectedEntityId, handleCloseDetail, externalOnEntityClick, externalOnNewClick, entityIds, tableController.data]);\n\n const usedParentCollectionIds = parentCollectionSlugs ?? collectionRegistryController.getParentCollectionSlugs(path);\n const usedParentEntityIds = parentEntityIds ?? collectionRegistryController.getParentEntityIds(path);\n\n const isDetailVisible = animationPhase !== \"idle\";\n\n // ── Unified Layout: animated split using ResizablePanels ──\n\n const listPanel = (\n <div\n className={cls(\n \"flex flex-col h-full min-w-0 transition-all ease-out w-full\",\n (!largeLayout && isDetailVisible)\n ? \"opacity-0 -translate-x-1/3 pointer-events-none\"\n : \"opacity-100 translate-x-0\"\n )}\n style={{ transitionDuration: `${TRANSITION_DURATION}ms` }}\n >\n {/* Toolbar stays fixed above the scrollable area */}\n {toolbar}\n {/* Scrollable content: title + insights + list rows */}\n <div className=\"flex-1 overflow-y-auto overflow-x-hidden min-h-0\">\n {children}\n </div>\n </div>\n );\n\n const detailPanel = renderedEntityId !== undefined ? (\n <div\n ref={detailPanelRef}\n className={cls(\n \"flex-1 flex flex-col min-w-0 h-full transition-all ease-out w-full\",\n animationPhase === \"entered\"\n ? \"opacity-100 translate-x-0\"\n : (largeLayout ? \"opacity-0 translate-x-8\" : \"opacity-0 translate-x-1/3\")\n )}\n style={{ transitionDuration: `${TRANSITION_DURATION}ms` }}\n >\n <ErrorBoundary>\n {collection.defaultEntityAction === \"view\" && !isEditMode\n ? <DetailViewBinding\n key={String(renderedEntityId)}\n path={path}\n collection={collection as CollectionConfig<Record<string, unknown>>}\n entityId={renderedEntityId}\n parentCollectionSlugs={usedParentCollectionIds}\n parentEntityIds={usedParentEntityIds}\n selectedTab={selectedTab}\n layout=\"split\"\n onEditClick={() => {\n navigate(buildUrl(`${path}/${renderedEntityId}/edit`));\n }}\n onTabChange={(params) => {\n const newSelectedTab = params.selectedTab;\n navigate(buildUrl(\n newSelectedTab\n ? `${path}/${renderedEntityId}/${newSelectedTab}`\n : `${path}/${renderedEntityId}`\n ));\n }}\n />\n : <EditViewBinding\n key={String(renderedEntityId)}\n path={path}\n collection={collection as CollectionConfig<Record<string, unknown>>}\n entityId={renderedEntityId}\n parentCollectionSlugs={usedParentCollectionIds}\n parentEntityIds={usedParentEntityIds}\n selectedTab={selectedTab}\n layout=\"split\"\n onValuesModified={setDirty}\n onSaved={() => {\n setDirty(false);\n navigate(buildUrl(`${path}/${renderedEntityId}`), { replace: true });\n }}\n navigateBack={() => {\n navigate(buildUrl(`${path}/${renderedEntityId}`));\n }}\n onTabChange={(params) => {\n const newSelectedTab = params.selectedTab;\n navigate(buildUrl(\n newSelectedTab\n ? `${path}/${renderedEntityId}/${newSelectedTab}`\n : `${path}/${renderedEntityId}`\n ));\n }}\n />\n }\n </ErrorBoundary>\n </div>\n ) : <></>;\n\n return (\n <>\n <ResizablePanels\n stacked={!largeLayout}\n firstPanel={listPanel}\n secondPanel={detailPanel}\n showSecondPanel={isDetailVisible}\n panelSizePercent={animationPhase === \"entering\" ? 100 : panelSize}\n onPanelSizeChange={setPanelSize}\n minPanelSizePx={240}\n />\n\n <UnsavedChangesDialog\n open={blocker?.state === \"blocked\"}\n handleOk={() => {\n dirty.current = false;\n blocker?.proceed?.();\n }}\n handleCancel={() => blocker?.reset?.()}\n body={<>You have unsaved changes in this <b>{collection.singularName ?? collection.name}</b>.</>}/>\n </>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Entity } from \"@rebasepro/types\";\nimport { Checkbox, Chip, cls, defaultBorderMixin, Markdown } from \"@rebasepro/ui\";\nimport { PropertyPreview } from \"../../preview\";\nimport { useAuthController, useCustomizationController } from \"@rebasepro/app\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { BoardItemViewProps } from \"@rebasepro/ui\";\nimport { useCollectionSlotKeys, resolveEntitySlots } from \"./usePreviewSlots\";\n\nexport type BoardCardBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = BoardItemViewProps<Entity<M>> & {\n collection: CollectionConfig<M>;\n onClick?: (entity: Entity<M>) => void;\n selected?: boolean;\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void;\n selectionEnabled?: boolean;\n};\n\n/**\n * Compact card component for displaying a entity in a Kanban board.\n * Uses the shared slot system for consistent preview rendering.\n *\n * Selection UX: The checkbox overlays on top of the image/icon thumbnail area,\n * revealed on card hover or when the card is selected. This keeps the card\n * layout clean while providing intuitive selection affordance.\n */\nfunction BoardCardBindingInner<M extends Record<string, unknown> = Record<string, unknown>>({\n item,\n isDragging,\n isGroupedOver,\n style,\n collection,\n onClick,\n selected,\n onSelectionChange,\n selectionEnabled = false\n}: BoardCardBindingProps<M>) {\n const entity = item.data;\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n const slotKeys = useCollectionSlotKeys(\n collection as CollectionConfig<Record<string, unknown>>,\n authController,\n customizationController.propertyConfigs\n );\n\n const slots = useMemo(\n () => resolveEntitySlots(\n entity as Entity<Record<string, unknown>>,\n collection as CollectionConfig<Record<string, unknown>>,\n slotKeys\n ),\n [entity, collection, slotKeys]\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Cmd+click (Mac) or Ctrl+click (Windows) toggles selection\n if ((e.metaKey || e.ctrlKey) && selectionEnabled) {\n e.preventDefault();\n e.stopPropagation();\n onSelectionChange?.(entity, !selected);\n return;\n }\n if (onClick) {\n e.stopPropagation();\n onClick(entity);\n }\n }, [entity, onClick, onSelectionChange, selected, selectionEnabled]);\n\n const handleThumbnailClick = useCallback((e: React.MouseEvent) => {\n if (!selectionEnabled) return;\n e.stopPropagation();\n e.preventDefault();\n onSelectionChange?.(entity, !selected);\n }, [entity, onSelectionChange, selected, selectionEnabled]);\n\n const handleSelectionChange = useCallback((checked: boolean) => {\n onSelectionChange?.(entity, checked);\n }, [entity, onSelectionChange]);\n\n // Memoize className computations\n const backgroundColor = useMemo((): string => {\n if (isDragging) {\n return \"bg-surface-100 dark:bg-surface-800\";\n }\n if (isGroupedOver) {\n return \"bg-surface-200 dark:bg-surface-700\";\n }\n return \"bg-white dark:bg-surface-800 hover:bg-surface-50 dark:hover:bg-surface-700\";\n }, [isDragging, isGroupedOver]);\n\n const borderColor = useMemo((): string =>\n isDragging ? \"ring-2 ring-primary\" : \"\", [isDragging]);\n\n // Memoize the card className — use CSS group for hover-reveal of checkbox\n const cardClassName = useMemo(() => cls(\n \"group/card p-2 flex items-start border rounded-lg cursor-pointer transition-all duration-200\",\n defaultBorderMixin,\n borderColor,\n backgroundColor,\n selected\n ? \"ring-2 ring-primary bg-primary/[0.03] dark:bg-primary/[0.06]\"\n : \"hover:shadow-sm\"\n ), [borderColor, backgroundColor, selected]);\n\n return (\n <div\n style={style}\n className=\"py-1\"\n data-is-dragging={isDragging}\n data-testid={item.id}\n onClick={handleClick}\n >\n <div className={cardClassName}>\n {/* Thumbnail area with selection overlay */}\n <div\n className=\"relative w-10 h-10 rounded-md shrink-0 mr-2\"\n onClick={handleThumbnailClick}\n >\n {/* Image or fallback icon */}\n {slots.image ? (\n <div className={cls(\n \"w-10 h-10 rounded-md overflow-hidden transition-opacity duration-200\",\n selectionEnabled && \"group-hover/card:opacity-30\",\n selected && \"opacity-0\"\n )}>\n <PropertyPreview\n property={slots.image.property}\n propertyKey={slots.image.propertyKey}\n size=\"small\"\n value={slots.image.value}\n fill={true}\n />\n </div>\n ) : (\n <div className={cls(\n \"w-10 h-10 rounded-md bg-surface-100 dark:bg-surface-900 flex items-center justify-center transition-opacity duration-200\",\n selectionEnabled && \"group-hover/card:opacity-30\",\n selected && \"opacity-0\"\n )}>\n <IconForView\n collectionOrView={collection}\n color=\"disabled\"\n size=\"small\"\n />\n </div>\n )}\n\n {/* Selection checkbox overlay — always in the DOM, visibility controlled by CSS */}\n <div className={cls(\n \"absolute inset-0 flex items-center justify-center rounded-md transition-[opacity,background-color] duration-200\",\n !selectionEnabled && \"invisible pointer-events-none\",\n selectionEnabled && (selected\n ? \"opacity-100 bg-primary/10 dark:bg-primary/20\"\n : \"opacity-0 group-hover/card:opacity-100\")\n )}>\n <div className={cls(\n \"transition-transform duration-200\",\n selected\n ? \"scale-100\"\n : \"scale-75 group-hover/card:scale-100\"\n )}>\n <Checkbox\n checked={selected ?? false}\n onCheckedChange={handleSelectionChange}\n size=\"small\"\n padding={false}\n />\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {/* Title slot */}\n <div className=\"line-clamp-2 text-sm font-medium\">\n {slots.title ? (\n <PropertyPreview\n propertyKey={slots.title.propertyKey}\n value={slots.title.value}\n property={slots.title.property}\n size=\"small\"\n />\n ) : (\n <span className=\"text-surface-500\">{entity.id}</span>\n )}\n </div>\n {/* Subtitle / Description */}\n {slots.subtitle ? (\n <div className=\"text-xs text-surface-500 mt-1 line-clamp-3 opacity-80\">\n {typeof slots.subtitle.value === \"string\" ? (\n <Markdown source={slots.subtitle.value} size=\"small\" />\n ) : (\n <PropertyPreview\n propertyKey={slots.subtitle.propertyKey}\n value={slots.subtitle.value}\n property={slots.subtitle.property}\n size=\"small\"\n />\n )}\n </div>\n ) : (\n <div className=\"text-xs text-surface-500 font-mono truncate mt-1\">\n {entity.id}\n </div>\n )}\n {/* Relation chips slot */}\n {slots.relations.length > 0 && (\n <div className=\"flex items-center gap-1 mt-1 overflow-hidden max-w-full flex-wrap\">\n {slots.relations.map((rel) => (\n rel.items.map((item) => (\n <Chip\n key={`${rel.propertyKey}-${item.id}`}\n size=\"smallest\"\n colorScheme={rel.colorScheme}\n className=\"!text-[10px] !leading-tight !py-0 shrink-0 max-w-[90px] truncate\"\n >\n {item.displayName}\n </Chip>\n ))\n ))}\n {slots.relations.some(r => r.totalCount > r.items.length) && (\n <span className=\"text-[10px] text-surface-400 dark:text-surface-500 shrink-0\">\n +{slots.relations.reduce((acc, r) => acc + Math.max(0, r.totalCount - r.items.length), 0)}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// Memoized to prevent unnecessary re-renders when other cards in the board change\nexport const BoardCardBinding = memo(BoardCardBindingInner) as typeof BoardCardBindingInner;\n\n/**\n * Wrapper component that adapts BoardCardBinding to BoardItemViewProps interface\n */\nexport function createBoardCardBindingComponent<M extends Record<string, unknown>>(\n collection: CollectionConfig<M>,\n options: {\n onClick?: (entity: Entity<M>) => void;\n isEntitySelected?: (entity: Entity<M>) => boolean;\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void;\n selectionEnabled?: boolean;\n }\n): React.ComponentType<BoardItemViewProps<Entity<M>>> {\n return function BoardCardBindingWrapper(props: BoardItemViewProps<Entity<M>>) {\n return (\n <BoardCardBinding\n {...props}\n collection={collection}\n onClick={options.onClick}\n selected={options.isEntitySelected?.(props.item.data)}\n onSelectionChange={options.onSelectionChange}\n selectionEnabled={options.selectionEnabled}\n />\n );\n };\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { Entity, FilterValues } from \"@rebasepro/types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getRelationIncludeParams, useData, useRebaseContext } from \"@rebasepro/app\";\n\nconst DEFAULT_PAGE_SIZE = 20;\n\n/**\n * Shallow equality for entity value records.\n * Handles primitives and reference equality for nested values.\n * Avoids JSON.stringify allocation on every comparison.\n */\nfunction shallowEqualValues(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\n/**\n * Data state for a single board column\n */\nexport interface BoardColumnData<M extends Record<string, unknown> = Record<string, unknown>> {\n /** Entities loaded for this column */\n entities: Entity<M>[];\n /** Whether the column is currently loading data */\n loading: boolean;\n /** Whether there are more items to load */\n hasMore: boolean;\n /** Error if loading failed */\n error?: Error;\n /** Total count of entities in this column */\n totalCount?: number;\n}\n\n/**\n * Controller for managing per-column data in a Kanban board\n */\nexport interface BoardDataController<M extends Record<string, unknown> = any, COLUMN extends string = string> {\n /** Data state for each column */\n columnData: Record<COLUMN, BoardColumnData<M>>;\n /** Load more items for a specific column */\n loadMoreColumn: (column: COLUMN) => void;\n /** Refresh data for a specific column */\n refreshColumn: (column: COLUMN) => void;\n /** Refresh all columns */\n refreshAll: () => void;\n /** Update column counts and optionally move item optimistically */\n moveItemOptimistically: (itemId: string, sourceColumn: COLUMN, targetColumn: COLUMN, newValues?: Record<string, any>, newIndex?: number) => void;\n /** Decrement column counts (for optimistic updates when deleting items) */\n decrementColumnCounts: (columnDeltas: Record<COLUMN, number>) => void;\n /** Whether any column is loading */\n loading: boolean;\n /** Any error from any column */\n error?: Error;\n}\n\nexport interface UseBoardDataControllerProps<M extends Record<string, unknown> = Record<string, unknown>> {\n /** Full path to the collection */\n fullPath: string;\n /** The entity collection configuration */\n collection: CollectionConfig<M>;\n /** Property key used for column assignment */\n columnProperty: string;\n /** Array of column values (enum values from columnProperty) */\n columns: string[];\n /** Property key used for ordering within columns */\n orderProperty?: string;\n /** Number of items to load per page per column */\n pageSize?: number;\n /** Text search string to filter entities */\n searchString?: string;\n /** Additional filter values */\n filterValues?: FilterValues<string>;\n}\n\n/**\n * Hook that manages per-column data loading for the Kanban board.\n * Each column gets its own independent query to the data source.\n */\nexport function useBoardDataController<M extends Record<string, unknown> = any, COLUMN extends string = string>({\n fullPath,\n collection,\n columnProperty,\n columns,\n orderProperty,\n pageSize = DEFAULT_PAGE_SIZE,\n searchString,\n filterValues\n}: UseBoardDataControllerProps<M>): BoardDataController<M, COLUMN> {\n\n const context = useRebaseContext();\n const dataClient = useData();\n // v4: use fullPath directly instead of resolveIdsFrom\n const resolvedPath = fullPath;\n\n // Stable refs for objects that shouldn't trigger re-subscriptions\n const dataClientRef = useRef(dataClient);\n const collectionRef = useRef(collection);\n const contextRef = useRef(context);\n dataClientRef.current = dataClient;\n collectionRef.current = collection;\n contextRef.current = context;\n\n // Store filter/order params in refs so they're accessible without causing re-subscriptions\n const filterValuesRef = useRef(filterValues);\n const columnPropertyRef = useRef(columnProperty);\n const orderPropertyRef = useRef(orderProperty);\n const searchStringRef = useRef(searchString);\n const resolvedPathRef = useRef(resolvedPath);\n filterValuesRef.current = filterValues;\n columnPropertyRef.current = columnProperty;\n orderPropertyRef.current = orderProperty;\n searchStringRef.current = searchString;\n resolvedPathRef.current = resolvedPath;\n\n // Track item count per column for pagination\n const [columnItemCounts, setColumnItemCounts] = useState<Record<string, number>>(() => {\n const initial: Record<string, number> = {};\n columns.forEach(col => {\n initial[col] = pageSize;\n });\n return initial;\n });\n\n // Per-column data state\n const [columnData, setColumnData] = useState<Record<string, BoardColumnData<M>>>(() => {\n const initial: Record<string, BoardColumnData<M>> = {};\n columns.forEach(col => {\n initial[col] = {\n entities: [],\n loading: true,\n hasMore: true,\n error: undefined,\n totalCount: undefined\n };\n });\n return initial;\n });\n\n // Track cleanup functions for subscriptions\n const unsubscribersRef = useRef<Record<string, () => void>>({});\n\n // Flag to prevent race conditions during cleanup\n const isCleaningUpRef = useRef(false);\n\n // Track items that are currently in an optimistic state (awaiting DB sync)\n const pendingItemsRef = useRef<Record<string, { entity: Entity<M>, expectedValues: Record<string, any> }>>({});\n\n // Stable keys for dependency comparison\n const columnsKey = useMemo(() => [...columns].sort().join(\",\"), [columns]);\n const filterKey = useMemo(() => JSON.stringify(filterValues), [filterValues]);\n\n // Track previous column item counts to detect which column changed\n const prevColumnItemCountsRef = useRef<Record<string, number>>(columnItemCounts);\n\n // Version counter to trigger full re-subscription when params change (not just load-more)\n const [subscriptionVersion, setSubscriptionVersion] = useState(0);\n\n // Trigger full re-subscription when key params change\n useEffect(() => {\n setSubscriptionVersion(v => v + 1);\n }, [columnsKey, resolvedPath, columnProperty, orderProperty, searchString, filterKey, pageSize]);\n\n // Cleanup subscriptions on unmount\n useEffect(() => {\n return () => {\n isCleaningUpRef.current = true;\n Object.values(unsubscribersRef.current).forEach(unsub => unsub?.());\n unsubscribersRef.current = {};\n };\n }, []);\n\n /**\n * Check if a column value is excluded by the active filter on the columnProperty.\n * E.g. if the user sets \"Status IN (Open, In Progress)\", this returns true\n * for \"Waiting on Customer\" since that column should show as empty.\n */\n const isColumnExcludedByFilter = useCallback((column: string, filterValues?: FilterValues<string>, colProperty?: string): boolean => {\n if (!filterValues || !colProperty) return false;\n const filterForColumn = filterValues[colProperty as keyof typeof filterValues];\n if (!filterForColumn || !Array.isArray(filterForColumn)) return false;\n\n const [op, val] = filterForColumn as [string, unknown];\n\n if (op === \"==\" && typeof val === \"string\") {\n return column !== val;\n }\n if (op === \"!=\" && typeof val === \"string\") {\n return column === val;\n }\n if (op === \"in\" && Array.isArray(val)) {\n return !val.map(String).includes(column);\n }\n if (op === \"not-in\" && Array.isArray(val)) {\n return val.map(String).includes(column);\n }\n\n return false;\n }, []);\n\n // Helper function to subscribe to a single column - uses refs to avoid dependency issues\n const subscribeToColumn = useCallback((column: string, itemCount: number) => {\n // Skip if we're in the middle of cleanup\n if (isCleaningUpRef.current) return;\n\n const currentDataClient = dataClientRef.current;\n const currentCollection = collectionRef.current;\n const currentContext = contextRef.current;\n const currentFilterValues = filterValuesRef.current;\n const currentColumnProperty = columnPropertyRef.current;\n const currentOrderProperty = orderPropertyRef.current;\n const currentSearchString = searchStringRef.current;\n const currentResolvedPath = resolvedPathRef.current;\n\n // If the column is excluded by the active filter on the column property,\n // set it as empty immediately without querying.\n const excluded = isColumnExcludedByFilter(column, currentFilterValues, currentColumnProperty);\n if (excluded) {\n setColumnData(prev => ({\n ...prev,\n [column]: {\n entities: [],\n loading: false,\n hasMore: false,\n error: undefined,\n totalCount: 0\n }\n }));\n return;\n }\n\n // Build filter map for this column — pass FilterValues directly\n const whereFilter: FilterValues<string> = {\n ...(currentFilterValues ?? {}),\n [currentColumnProperty]: [\"==\", column]\n };\n\n const orderByParam: [string, \"asc\" | \"desc\"] | undefined = currentOrderProperty ? [currentOrderProperty, \"asc\"] : undefined;\n\n // Mark column as loading\n setColumnData(prev => ({\n ...prev,\n [column]: {\n ...prev[column],\n loading: true,\n error: undefined\n }\n }));\n\n // onUpdate callback\n const onUpdate = async (entities: Entity<M>[]) => {\n // Skip updates if we're cleaning up\n if (isCleaningUpRef.current) return;\n\n const pendingMap = pendingItemsRef.current;\n\n // Apply pending updates to incoming entities\n const mergedEntities = entities.map(e => {\n const pending = pendingMap[String(e.id)];\n if (pending) {\n // Check if DB entity has caught up to the expected column and order\n const expectedCol = pending.expectedValues[currentColumnProperty];\n const expectedOrder = currentOrderProperty ? pending.expectedValues[currentOrderProperty] : undefined;\n\n let caughtUp = true;\n if (e.values?.[currentColumnProperty] !== expectedCol) {\n caughtUp = false;\n }\n if (currentOrderProperty && e.values?.[currentOrderProperty] !== expectedOrder) {\n caughtUp = false;\n }\n\n if (caughtUp) {\n // DB has caught up, clear pending state\n delete pendingMap[String(e.id)];\n return e; // Use the real DB entity\n }\n\n // DB hasn't caught up, overlay expected values\n return { ...e,\nvalues: { ...e.values,\n...pending.expectedValues } };\n }\n return e;\n });\n\n // Add any pending items that belong to this column but aren't in the incoming entities yet\n // (e.g. backend hasn't moved them to this column yet)\n Object.values(pendingMap).forEach(pending => {\n if (pending.expectedValues[currentColumnProperty] === column) {\n if (!mergedEntities.some(e => String(e.id) === String(pending.entity.id))) {\n mergedEntities.push(pending.entity);\n }\n }\n });\n\n // Always filter in memory to only show entities that belong to this specific column.\n // This is required because text search returns all matches, and collection_entity_patch\n // may contain entities that have just been moved out of this column.\n let processed = mergedEntities.filter(e => e.values?.[currentColumnProperty] === column);\n\n // Sort locally if orderProperty is defined. This ensures that collection_entity_patch\n // insertions (which prepend by default in websocket.ts) are correctly placed.\n if (currentOrderProperty) {\n processed = [...processed].sort((a, b) => {\n const valA = a.values?.[currentOrderProperty] as string | undefined | null;\n const valB = b.values?.[currentOrderProperty] as string | undefined | null;\n\n const isAEmpty = valA === undefined || valA === null || valA === \"\";\n const isBEmpty = valB === undefined || valB === null || valB === \"\";\n\n if (isAEmpty && isBEmpty) return 0;\n if (isAEmpty) return 1;\n if (isBEmpty) return -1;\n\n return valA < valB ? -1 : valA > valB ? 1 : 0;\n });\n }\n\n // Apply afterRead callbacks if any.\n // afterRead operates on flat rows; unwrap the Entity view-model\n // before invoking and re-wrap the processed row after.\n if (currentCollection.callbacks?.afterRead) {\n try {\n processed = await Promise.all(\n processed.map(async (entity) => {\n const processedRow = await currentCollection.callbacks!.afterRead!({\n collection: currentCollection,\n path: currentResolvedPath,\n row: { id: entity.id, ...entity.values },\n context: currentContext\n });\n return {\n ...entity,\n values: processedRow as M\n };\n })\n );\n } catch (e) {\n console.error(\"Error in afterRead callback:\", e);\n }\n }\n\n const newHasMore = entities.length >= itemCount;\n\n // Compare with current state — skip update if identical to avoid UI flash\n setColumnData(prev => {\n const existing = prev[column];\n if (existing && !existing.loading && existing.entities.length === processed.length) {\n // Quick structural equality check: same IDs in same order with same values\n let identical = true;\n for (let i = 0; i < processed.length; i++) {\n const a = existing.entities[i];\n const b = processed[i];\n if (a.id !== b.id) {\n identical = false;\n break;\n }\n // Shallow-compare values to avoid JSON.stringify allocations\n // entity.values are flat records from the DB, so shallow suffices\n if (!shallowEqualValues(a.values, b.values)) {\n identical = false;\n break;\n }\n }\n if (identical && existing.hasMore === newHasMore) {\n // Data is the same — return previous reference to prevent re-render\n return prev;\n }\n }\n\n return {\n ...prev,\n [column]: {\n entities: processed,\n loading: false,\n hasMore: newHasMore,\n error: undefined,\n totalCount: prev[column]?.totalCount // Keep existing count\n }\n };\n });\n };\n\n const onError = (error: Error) => {\n // Skip error handling if we're cleaning up\n if (isCleaningUpRef.current) return;\n\n console.error(`Error loading column ${column}:`, error);\n setColumnData(prev => ({\n ...prev,\n [column]: {\n ...prev[column],\n entities: [],\n loading: false,\n hasMore: false,\n error\n }\n }));\n };\n\n // Set up listener or fetch\n const accessor = currentDataClient.collection(currentResolvedPath);\n\n // Eagerly include relations to avoid N+1 fetches.\n const includeParams = getRelationIncludeParams(currentCollection);\n\n if (accessor.listen) {\n const unsubscribe = accessor.listen({\n where: whereFilter,\n limit: itemCount,\n orderBy: orderByParam,\n include: includeParams\n }, res => onUpdate(res.data as Entity<M>[]), onError);\n unsubscribersRef.current[column] = unsubscribe;\n } else {\n accessor.find({\n where: whereFilter,\n limit: itemCount,\n orderBy: orderByParam,\n include: includeParams\n })\n .then(res => onUpdate(res.data as Entity<M>[]))\n .catch(onError);\n }\n }, []); // No dependencies - uses refs for all values\n\n // Main effect for all column subscriptions - runs when subscriptionVersion changes (i.e., key params change)\n useEffect(() => {\n // Mark that we're setting up new subscriptions\n isCleaningUpRef.current = false;\n\n // Clean up all existing subscriptions synchronously\n const existingUnsubscribers = { ...unsubscribersRef.current };\n unsubscribersRef.current = {};\n Object.values(existingUnsubscribers).forEach(unsub => {\n try {\n unsub?.();\n } catch (e) {\n // Ignore cleanup errors\n }\n });\n\n const currentDataClient = dataClientRef.current;\n const currentCollection = collectionRef.current;\n const currentFilterValues = filterValuesRef.current;\n const currentColumnProperty = columnPropertyRef.current;\n const currentSearchString = searchStringRef.current;\n const currentResolvedPath = resolvedPathRef.current;\n const currentColumns = columns;\n const currentColumnItemCounts = columnItemCounts;\n\n // Small delay to ensure Firestore has cleaned up previous listeners\n const timeoutId = setTimeout(() => {\n if (isCleaningUpRef.current) return;\n\n currentColumns.forEach(column => {\n const itemCount = currentColumnItemCounts[column] ?? pageSize;\n subscribeToColumn(column, itemCount);\n\n // Skip count query for columns excluded by the filter — subscribeToColumn\n // already set them to totalCount: 0.\n if (isColumnExcludedByFilter(column, currentFilterValues, currentColumnProperty)) {\n return;\n }\n\n // Count query for column (for display in column header)\n const accessor = currentDataClient.collection(currentResolvedPath);\n if (accessor.count) {\n\n const whereFilter: FilterValues<string> = {\n ...(currentFilterValues ?? {}),\n [currentColumnProperty]: [\"==\", column]\n };\n\n accessor.count({\n where: whereFilter\n }).then(count => {\n if (isCleaningUpRef.current) return;\n setColumnData(prev => ({\n ...prev,\n [column]: {\n ...prev[column],\n totalCount: count\n }\n }));\n }).catch(e => {\n console.warn(`Failed to get count for column ${column}:`, e);\n });\n }\n });\n\n // Update the ref after subscribing all\n prevColumnItemCountsRef.current = { ...currentColumnItemCounts };\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n isCleaningUpRef.current = true;\n const unsubscribers = { ...unsubscribersRef.current };\n unsubscribersRef.current = {};\n Object.values(unsubscribers).forEach(unsub => {\n try {\n unsub?.();\n } catch (e) {\n // Ignore cleanup errors\n }\n });\n };\n\n }, [subscriptionVersion, subscribeToColumn, pageSize]);\n\n // Track which subscription version last updated the counts\n const lastProcessedVersionRef = useRef(subscriptionVersion);\n\n // Separate effect to handle individual column load-more WITHOUT triggering full re-subscription\n useEffect(() => {\n // If subscriptionVersion changed, the main effect will handle everything\n // Skip this effect to avoid race conditions\n if (subscriptionVersion !== lastProcessedVersionRef.current) {\n lastProcessedVersionRef.current = subscriptionVersion;\n prevColumnItemCountsRef.current = { ...columnItemCounts };\n return;\n }\n\n const prevCounts = prevColumnItemCountsRef.current;\n\n columns.forEach(column => {\n const prevCount = prevCounts[column] ?? pageSize;\n const newCount = columnItemCounts[column] ?? pageSize;\n\n // Only re-subscribe if this specific column's count increased (load more)\n if (newCount > prevCount && !isCleaningUpRef.current) {\n // Unsubscribe only this column\n if (unsubscribersRef.current[column]) {\n try {\n unsubscribersRef.current[column]();\n } catch (e) {\n // Ignore cleanup errors\n }\n delete unsubscribersRef.current[column];\n }\n // Re-subscribe with new limit after a small delay\n setTimeout(() => {\n if (!isCleaningUpRef.current) {\n subscribeToColumn(column, newCount);\n }\n }, 0);\n }\n });\n\n // Update the ref\n prevColumnItemCountsRef.current = { ...columnItemCounts };\n }, [columnItemCounts, columns, pageSize, subscribeToColumn, subscriptionVersion]);\n\n const loadMoreColumn = useCallback((column: COLUMN) => {\n setColumnItemCounts(prev => ({\n ...prev,\n [column]: (prev[column] ?? pageSize) + pageSize\n }));\n }, [pageSize]);\n\n const refreshColumn = useCallback((column: COLUMN) => {\n // Force re-subscribe by resetting to initial count\n setColumnItemCounts(prev => ({\n ...prev,\n [column]: pageSize\n }));\n }, [pageSize]);\n\n const refreshAll = useCallback(() => {\n const reset: Record<string, number> = {};\n columns.forEach(col => {\n reset[col] = pageSize;\n });\n setColumnItemCounts(reset);\n }, [columns, pageSize]);\n\n // Optimistic update for when moving an item\n const moveItemOptimistically = useCallback((itemId: string, sourceColumn: COLUMN, targetColumn: COLUMN, newValues?: Record<string, any>, newIndex?: number) => {\n setColumnData(prev => {\n const updated = { ...prev };\n let itemToMove: Entity<M> | undefined;\n\n const sourceEntities = [...(updated[sourceColumn]?.entities || [])];\n const itemIndex = sourceEntities.findIndex(e => String(e.id) === itemId);\n\n if (itemIndex !== -1) {\n itemToMove = sourceEntities[itemIndex];\n sourceEntities.splice(itemIndex, 1);\n }\n\n if (itemToMove) {\n const newValuesMerged = {\n ...itemToMove.values,\n ...(newValues || {})\n };\n\n const updatedEntity = {\n ...itemToMove,\n values: newValuesMerged\n };\n\n // Store in pending items ref\n pendingItemsRef.current[String(updatedEntity.id)] = {\n entity: updatedEntity,\n expectedValues: newValuesMerged\n };\n\n const targetEntities = sourceColumn === targetColumn ? sourceEntities : [...(updated[targetColumn]?.entities || [])];\n\n if (newIndex !== undefined && newIndex >= 0 && newIndex <= targetEntities.length) {\n targetEntities.splice(newIndex, 0, updatedEntity);\n } else {\n targetEntities.push(updatedEntity);\n if (orderPropertyRef.current) {\n const orderProp = orderPropertyRef.current;\n targetEntities.sort((a, b) => {\n const valA = a.values?.[orderProp] as string | undefined | null;\n const valB = b.values?.[orderProp] as string | undefined | null;\n\n // Handle nulls/empty strings to match Postgres NULLS LAST (ASC) behavior\n const isAEmpty = valA === undefined || valA === null || valA === \"\";\n const isBEmpty = valB === undefined || valB === null || valB === \"\";\n\n if (isAEmpty && isBEmpty) return 0;\n if (isAEmpty) return 1; // A is null, B is not -> A goes after B\n if (isBEmpty) return -1; // B is null, A is not -> A goes before B\n\n return valA < valB ? -1 : valA > valB ? 1 : 0;\n });\n }\n }\n\n updated[sourceColumn] = {\n ...updated[sourceColumn],\n entities: sourceColumn === targetColumn ? targetEntities : sourceEntities,\n totalCount: sourceColumn === targetColumn\n ? updated[sourceColumn].totalCount\n : Math.max(0, (updated[sourceColumn].totalCount ?? 0) - 1)\n };\n\n if (sourceColumn !== targetColumn) {\n updated[targetColumn] = {\n ...updated[targetColumn],\n entities: targetEntities,\n totalCount: (updated[targetColumn].totalCount ?? 0) + 1\n };\n }\n\n } else if (sourceColumn !== targetColumn) {\n // If item not found locally but counts need update\n if (updated[sourceColumn]?.totalCount !== undefined) {\n updated[sourceColumn] = {\n ...updated[sourceColumn],\n totalCount: Math.max(0, (updated[sourceColumn].totalCount ?? 0) - 1)\n };\n }\n if (updated[targetColumn]?.totalCount !== undefined) {\n updated[targetColumn] = {\n ...updated[targetColumn],\n totalCount: (updated[targetColumn].totalCount ?? 0) + 1\n };\n }\n }\n\n return updated;\n });\n }, []);\n\n // Optimistic update for column counts when deleting items\n const decrementColumnCounts = useCallback((columnDeltas: Record<COLUMN, number>) => {\n setColumnData(prev => {\n const updated = { ...prev };\n\n for (const [column, delta] of Object.entries(columnDeltas) as [COLUMN, number][]) {\n if (updated[column]?.totalCount !== undefined) {\n updated[column] = {\n ...updated[column],\n totalCount: Math.max(0, (updated[column].totalCount ?? 0) - delta)\n };\n }\n }\n\n return updated;\n });\n }, []);\n\n // Aggregate loading and error state\n const loading = useMemo(() => {\n return Object.values(columnData).some((col) => col.loading);\n }, [columnData]);\n\n const error = useMemo(() => {\n const errors = Object.values(columnData)\n .map((col) => col.error)\n .filter(Boolean);\n return errors[0];\n }, [columnData]);\n\n return useMemo(() => ({\n columnData: columnData as Record<COLUMN, BoardColumnData<M>>,\n loadMoreColumn,\n refreshColumn,\n refreshAll,\n moveItemOptimistically,\n decrementColumnCounts,\n loading,\n error\n }), [\n columnData,\n loadMoreColumn,\n refreshColumn,\n refreshAll,\n moveItemOptimistically,\n decrementColumnCounts,\n loading,\n error\n ]);\n}\n","import { useCallback, useMemo } from \"react\";\nimport { setIn } from \"@rebasepro/forms\";\nimport { CollectionConfig, RebaseData, RebaseContext, AnalyticsController, Entity } from \"@rebasepro/types\";\nimport { saveEntityWithCallbacks, SaveEntityWithCallbacksProps } from \"@rebasepro/app\";\nimport { BoardItem } from \"@rebasepro/ui\";\nimport { BoardDataController } from \"../useBoardDataController\";\nimport { generateKeyBetween } from \"fractional-indexing\";\n\nexport interface UseKanbanDragAndDropParams<M extends Record<string, unknown>> {\n collection: CollectionConfig<M>;\n fullPath: string;\n columnProperty: string;\n orderProperty?: string;\n dataClient: RebaseData;\n context: RebaseContext;\n boardDataController: BoardDataController<M>;\n analyticsController: AnalyticsController;\n}\n\nexport function useKanbanDragAndDrop<M extends Record<string, unknown>>({\n collection,\n fullPath,\n columnProperty,\n orderProperty,\n dataClient,\n context,\n boardDataController,\n analyticsController\n}: UseKanbanDragAndDropParams<M>) {\n\n // Handle item reorder and column changes.\n // Uses string-based fractional indexing via `generateKeyBetween`\n // to compute a single new sort key for the moved item.\n // Only one DB write per drag — the moved item gets its new key.\n const handleItemsReorder = useCallback(async (\n items: BoardItem<Entity<M>>[],\n moveInfo?: { itemId: string; sourceColumn: string; targetColumn: string; }\n ) => {\n const entity = items.find(item => item.id === moveInfo?.itemId)?.data;\n if (!entity || !moveInfo) return;\n\n analyticsController.onAnalyticsEvent?.(\"kanban_card_moved\", {\n path: fullPath,\n entityId: entity.id,\n sourceColumn: moveInfo.sourceColumn,\n targetColumn: moveInfo.targetColumn\n });\n\n const isColumnChange = moveInfo.sourceColumn !== moveInfo.targetColumn;\n\n // If no orderProperty and not a column change, nothing to do\n if (!orderProperty && !isColumnChange) return;\n\n // Build updated values\n let updatedValues: Record<string, unknown> = {};\n\n // Calculate new order key using string fractional indexing\n if (orderProperty) {\n // Get items in the target column in their new visual order\n // 'items' passed from Board.tsx is exactly the array of items in the target column\n const targetColumnItems = items;\n\n const movedIndex = targetColumnItems.findIndex(item => item.id === moveInfo.itemId);\n\n // Get the order keys of the neighbours\n const prevKey = movedIndex > 0\n ? (targetColumnItems[movedIndex - 1].data.values?.[orderProperty] as string | null) ?? null\n : null;\n const nextKey = movedIndex < targetColumnItems.length - 1\n ? (targetColumnItems[movedIndex + 1].data.values?.[orderProperty] as string | null) ?? null\n : null;\n\n try {\n const a = prevKey;\n let b = nextKey;\n if (a !== null && b !== null && a >= b) {\n // Handle duplicate or out-of-order keys to prevent fractional-indexing crash\n b = null;\n }\n const newKey = generateKeyBetween(a, b);\n updatedValues = setIn(updatedValues, orderProperty, newKey) as Record<string, unknown>;\n } catch (e) {\n // Fallback: if keys are somehow invalid, generate from scratch\n console.warn(\"fractional-indexing error, falling back:\", e);\n const newKey = generateKeyBetween(null, null);\n updatedValues = setIn(updatedValues, orderProperty, newKey) as Record<string, unknown>;\n }\n }\n\n // Update column if it changed\n if (isColumnChange) {\n updatedValues = setIn(updatedValues, columnProperty, moveInfo.targetColumn) as Record<string, unknown>;\n }\n\n // Apply optimistic UI update to boardDataController's internal state\n // This ensures the backend state matches the dragged UI state instantly\n // and prevents the Board component from reverting the dragged item\n if (boardDataController.moveItemOptimistically) {\n const targetIndex = items.findIndex(item => item.id === moveInfo.itemId);\n boardDataController.moveItemOptimistically(\n moveInfo.itemId,\n moveInfo.sourceColumn,\n moveInfo.targetColumn,\n updatedValues,\n targetIndex !== -1 ? targetIndex : undefined\n );\n }\n\n const saveProps: SaveEntityWithCallbacksProps<Record<string, unknown>> = {\n path: entity.path,\n entityId: entity.id,\n values: updatedValues as M,\n previousValues: entity.values,\n collection,\n status: \"existing\"\n };\n\n try {\n await saveEntityWithCallbacks({\n ...saveProps,\n collection,\n data: dataClient,\n context,\n afterSave: () => {},\n afterSaveError: (e: Error) => {\n console.error(\"Failed to save entity after reorder:\", e);\n if (boardDataController.refreshAll) {\n boardDataController.refreshAll();\n }\n }\n });\n } catch (e) {\n console.error(\"Error saving entity:\", e);\n if (boardDataController.refreshAll) {\n boardDataController.refreshAll();\n }\n }\n }, [collection, columnProperty, orderProperty, context, dataClient, boardDataController, analyticsController, fullPath]);\n\n return useMemo(() => ({ handleItemsReorder }), [handleItemsReorder]);\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Entity, EntityTableController, EnumValueConfig, SelectionController } from \"@rebasepro/types\";\nimport { BoardCardBinding } from \"./BoardCardBinding\";\nimport {\n Button,\n ChipColorKey,\n ChipColorScheme,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n getColorSchemeForSeed,\n IconButton,\n iconSize,\n RefreshCwIcon,\n Tooltip,\n Typography,\n KanbanView,\n BoardItem,\n BoardItemViewProps,\n ColumnLoadingState\n} from \"@rebasepro/ui\";\nimport { resolveEnumValues } from \"@rebasepro/common\";\nimport { getPropertyInPath } from \"../../util/property_utils\";\nimport {\n saveEntityWithCallbacks,\n SaveEntityWithCallbacksProps,\n useAuthController,\n useCustomizationController,\n useData,\n useRebaseContext,\n useTranslation,\n useSlot\n} from \"@rebasepro/app\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\nimport { setIn } from \"@rebasepro/forms\";\nimport { useBoardDataController } from \"./useBoardDataController\";\nimport { useKanbanDragAndDrop } from \"./hooks/useKanbanDragAndDrop\";\nimport { useSidePanel } from \"../../hooks/useSidePanel\";\nimport { generateNKeysBetween } from \"fractional-indexing\";\n\nexport type CollectionBoardViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n tableController: EntityTableController<M>;\n fullPath: string;\n parentCollectionSlugs?: string[], parentEntityIds?: string[];\n columnProperty: string;\n onEntityClick?: (entity: Entity<M>) => void;\n selectionController?: SelectionController<M>;\n selectionEnabled?: boolean;\n highlightedEntities?: Entity<M>[];\n emptyComponent?: React.ReactNode;\n /** Called when entities are deleted - used for optimistic count updates */\n deletedEntities?: Entity<M>[];\n};\n\n/**\n * Kanban board view for displaying entities grouped by a string enum property.\n */\nexport function CollectionBoardViewBinding<M extends Record<string, unknown> = Record<string, unknown>>({\n collection,\n tableController,\n fullPath,\n parentCollectionSlugs = [],\n parentEntityIds = [],\n columnProperty,\n onEntityClick,\n selectionController,\n selectionEnabled = true,\n highlightedEntities,\n emptyComponent,\n deletedEntities\n}: CollectionBoardViewBindingProps<M>) {\n const customizationController = useCustomizationController();\n const context = useRebaseContext();\n const dataClient = useData();\n const sidePanelController = useSidePanel();\n const analyticsController = useAnalyticsController();\n const { t } = useTranslation();\n const plugins = customizationController.plugins ?? [];\n\n // State for backfill dialog\n const [showBackfillDialog, setShowBackfillDialog] = useState(false);\n const [backfillLoading, setBackfillLoading] = useState(false);\n\n // v4: use collection directly without resolving\n\n // Get orderProperty from collection config, but validate it exists as a real property\n const rawOrderProperty = collection.orderProperty;\n const orderProperty = useMemo(() => {\n if (!rawOrderProperty) return undefined;\n // Check if the property actually exists in the collection\n const property = getPropertyInPath(collection.properties, rawOrderProperty);\n if (!property) {\n console.warn(`orderProperty \"${rawOrderProperty}\" is defined but does not exist in the collection properties. Treating as unconfigured.`);\n return undefined;\n }\n return rawOrderProperty;\n }, [rawOrderProperty, collection.properties]);\n\n // Get columns from the property's enumValues\n const {\n enumColumns,\n columnLabels,\n columnColors\n } = useMemo(() => {\n const property = getPropertyInPath(collection.properties, columnProperty);\n if (!property || !(\"type\" in property) || property.type !== \"string\") {\n return {\n enumColumns: [] as string[],\n columnLabels: {} as Record<string, string>\n };\n }\n const stringProperty = property;\n if (!stringProperty.enum) {\n return {\n enumColumns: [] as string[],\n columnLabels: {} as Record<string, string>\n };\n }\n const enumValues = resolveEnumValues(stringProperty.enum);\n if (!enumValues) {\n return {\n enumColumns: [] as string[],\n columnLabels: {} as Record<string, string>\n };\n }\n const cols = enumValues.map((ev: EnumValueConfig) => String(ev.id));\n const labels = enumValues.reduce((acc: Record<string, string>, ev: EnumValueConfig) => {\n acc[String(ev.id)] = ev.label;\n return acc;\n }, {});\n const colors = enumValues.reduce((acc: Record<string, ChipColorKey | ChipColorScheme | undefined>, ev: EnumValueConfig) => {\n acc[String(ev.id)] = ev.color ?? getColorSchemeForSeed(String(ev.id));\n return acc;\n }, {});\n return {\n enumColumns: cols,\n columnLabels: labels,\n columnColors: colors\n };\n }, [collection, columnProperty]);\n\n // Track if user has manually reordered columns in this session\n const [hasUserReordered, setHasUserReordered] = useState(false);\n // Column order is derived from the property's enumValues order\n // Local state tracks session reordering before it's persisted\n const [localColumnsOrder, setLocalColumnsOrder] = useState<string[]>(enumColumns);\n\n useEffect(() => {\n if (!hasUserReordered) {\n // Sync with enumColumns when property changes\n setLocalColumnsOrder(enumColumns);\n } else {\n // User has reordered - only add any missing columns\n const missingColumns = enumColumns.filter(c => !localColumnsOrder.includes(c));\n if (missingColumns.length > 0) {\n setLocalColumnsOrder(prev => [...prev, ...missingColumns]);\n }\n }\n }, [enumColumns, hasUserReordered]);\n\n const columns = localColumnsOrder;\n\n // Use the new per-column data controller\n const boardDataController = useBoardDataController<M>({\n fullPath,\n collection,\n columnProperty,\n columns,\n orderProperty,\n pageSize: 30,\n searchString: tableController.searchString,\n filterValues: tableController.filterValues\n });\n\n // Aggregate loading and error state\n const dataLoading = boardDataController.loading;\n const dataLoadingError = boardDataController.error;\n\n // Track previously processed deleted entities to avoid double-counting\n const processedDeletedRef = useRef<Set<string>>(new Set());\n\n // Optimistic update for column counts when entities are deleted\n useEffect(() => {\n if (!deletedEntities || deletedEntities.length === 0) return;\n\n // Calculate column deltas from deleted entities\n const deltas: Record<string, number> = {};\n deletedEntities.forEach(entity => {\n // Skip if we've already processed this entity\n if (processedDeletedRef.current.has(String(entity.id))) return;\n processedDeletedRef.current.add(String(entity.id));\n\n const col = entity.values?.[columnProperty];\n if (col && typeof col === \"string\") {\n deltas[col] = (deltas[col] ?? 0) + 1;\n }\n });\n\n if (Object.keys(deltas).length > 0) {\n boardDataController.decrementColumnCounts(deltas);\n }\n }, [deletedEntities, columnProperty, boardDataController]);\n\n // Build all entities from all columns for operations that need the full list\n const allEntities = useMemo(() => {\n const entities: Entity<M>[] = [];\n const seenIds = new Set<string>();\n columns.forEach(col => {\n const colData = boardDataController.columnData[col];\n if (colData?.entities) {\n colData.entities.forEach((entity: Entity<M>) => {\n const idStr = String(entity.id);\n if (!seenIds.has(idStr)) {\n seenIds.add(idStr);\n entities.push(entity);\n }\n });\n }\n });\n return entities;\n }, [boardDataController.columnData, columns]);\n\n const allowColumnReorder = useMemo(() => {\n return plugins.some(plugin => plugin.hooks?.onKanbanColumnsReorder);\n }, [plugins]);\n\n const handleColumnReorder = useCallback((newColumns: string[]) => {\n analyticsController.onAnalyticsEvent?.(\"kanban_column_reorder\", {\n path: fullPath,\n columnProperty\n });\n setHasUserReordered(true);\n setLocalColumnsOrder(newColumns);\n plugins\n .filter(plugin => plugin.hooks?.onKanbanColumnsReorder)\n .forEach(plugin => {\n plugin.hooks!.onKanbanColumnsReorder!({\n fullPath,\n parentCollectionSlugs,\nparentEntityIds,\n collection,\n kanbanColumnProperty: columnProperty,\n newColumnsOrder: newColumns\n });\n });\n }, [plugins, fullPath, parentCollectionSlugs, parentEntityIds, collection, columnProperty, analyticsController]);\n\n // Collection-level count queries to detect missing order property\n // Just TWO counts: total and ordered (for the entire collection, not per column)\n const [missingOrderCount, setMissingOrderCount] = useState<number>(0);\n\n const dataClientRef = useRef(dataClient);\n const collectionRef = useRef(collection);\n dataClientRef.current = dataClient;\n collectionRef.current = collection;\n\n useEffect(() => {\n const currentDataClient = dataClientRef.current;\n const accessor = currentDataClient.collection(fullPath);\n\n if (!orderProperty || !accessor.count) {\n setMissingOrderCount(0);\n return;\n }\n\n // Count 1: Total documents in collection\n // Count 2: Documents with orderProperty != null\n let totalCount = 0;\n let orderedCount = 0;\n let completed = 0;\n\n accessor.count().then(count => {\n totalCount = count;\n completed++;\n if (completed === 2) {\n setMissingOrderCount(Math.max(0, totalCount - orderedCount));\n }\n }).catch(e => console.warn(\"Failed to get total count:\", e));\n\n accessor.count({\n where: { [orderProperty]: [\"!=\", null] }\n }).then(count => {\n orderedCount = count;\n completed++;\n if (completed === 2) {\n setMissingOrderCount(Math.max(0, totalCount - orderedCount));\n }\n }).catch(e => console.warn(\"Failed to get ordered count:\", e));\n }, [orderProperty, fullPath]); // Only re-run when these primitives change\n\n // Check if items need backfill (have no orderProperty values)\n const itemsNeedBackfill = useMemo(() => {\n if (!orderProperty || dataLoading) return false;\n // Use collection-level count detection\n if (missingOrderCount > 0) return true;\n // Fallback to checking loaded entities\n return allEntities.some((entity: Entity<M>) => {\n const orderValue = entity.values?.[orderProperty];\n return orderValue === undefined || orderValue === null;\n });\n }, [allEntities, orderProperty, dataLoading, missingOrderCount]);\n\n // Create a lookup map of entity ID → column from boardDataController data\n // This ensures items stay in the column they were fetched for, not re-evaluated from entity.values\n const entityColumnMap = useMemo(() => {\n const map: Record<string, string> = {};\n columns.forEach(col => {\n const colData = boardDataController.columnData[col];\n if (colData?.entities) {\n colData.entities.forEach((entity: Entity<M>) => {\n map[String(entity.id)] = col;\n });\n }\n });\n return map;\n }, [columns, boardDataController.columnData]);\n\n // Convert entities to board items per column (data already sorted by orderProperty from controller)\n const boardItems: BoardItem<Entity<M>>[] = useMemo(() => {\n return allEntities.map((entity: Entity<M>) => ({\n id: String(entity.id),\n data: entity\n }));\n }, [allEntities]);\n\n // Column loading state from the board data controller\n const columnLoadingState: ColumnLoadingState = useMemo(() => {\n const state: ColumnLoadingState = {};\n columns.forEach(col => {\n const colData = boardDataController.columnData[col];\n state[col] = {\n loading: colData?.loading ?? true,\n hasMore: colData?.hasMore ?? false,\n itemCount: colData?.entities?.length ?? 0,\n totalCount: colData?.totalCount\n };\n });\n return state;\n }, [columns, boardDataController.columnData]);\n\n // Use the lookup map to assign columns - ensures items stay in the column they were fetched for\n const assignColumn = useCallback((item: BoardItem<Entity<M>>): string => {\n const column = entityColumnMap[item.id];\n if (column) return column;\n // Fallback: read from entity values (for newly created items or edge cases)\n const value = item.data.values?.[columnProperty];\n if (value && columns.includes(String(value))) return String(value);\n return columns[0] || \"\";\n }, [entityColumnMap, columnProperty, columns]);\n\n const { handleItemsReorder } = useKanbanDragAndDrop({\n collection,\n fullPath,\n columnProperty,\n orderProperty,\n dataClient,\n context,\n boardDataController,\n analyticsController\n });\n\n // Backfill order values for all entities\n const handleBackfill = useCallback(async () => {\n if (!orderProperty) {\n return;\n }\n analyticsController.onAnalyticsEvent?.(\"kanban_backfill_order\", {\n path: fullPath\n });\n setBackfillLoading(true);\n\n try {\n // Fetch ALL documents from collection (not relying on loaded entities)\n const allDocsRes = await dataClient.collection(fullPath).find({\n limit: 10000 // Fetch all\n });\n const allDocs = allDocsRes.data as Entity<M>[];\n\n // Find entities missing order property\n const entitiesToUpdate = allDocs.filter((entity: Entity<M>) => {\n const orderValue = entity.values?.[orderProperty];\n return orderValue === undefined || orderValue === null;\n });\n\n // Generate string fractional keys for all entities that need them\n const keys = generateNKeysBetween(null, null, entitiesToUpdate.length);\n const updates: Promise<void>[] = [];\n entitiesToUpdate.forEach((entity: Entity<M>, index: number) => {\n const updatedValues = setIn({ ...entity.values }, orderProperty, keys[index]);\n\n const saveProps: SaveEntityWithCallbacksProps<Record<string, unknown>> = {\n path: entity.path,\n entityId: entity.id,\n values: updatedValues as M,\n previousValues: entity.values,\n collection,\n status: \"existing\"\n };\n\n updates.push(\n saveEntityWithCallbacks({\n ...saveProps,\n collection,\n data: dataClient,\n context,\n afterSave: () => {},\n afterSaveError: (e) => console.error(\"Backfill save failed:\", e)\n }).then(() => {})\n );\n });\n\n await Promise.all(updates);\n setShowBackfillDialog(false);\n\n // Reset missing count to hide banner\n setMissingOrderCount(0);\n\n // Refresh the board data\n boardDataController.refreshAll();\n } catch (e) {\n console.error(\"Backfill error:\", e);\n } finally {\n setBackfillLoading(false);\n }\n }, [orderProperty, fullPath, collection, dataClient, context, boardDataController, analyticsController]);\n\n const handleEntityClick = useCallback((entity: Entity<M>) => {\n onEntityClick?.(entity);\n }, [onEntityClick]);\n\n const handleSelectionChange = useCallback((entity: Entity<M>, selected: boolean) => {\n selectionController?.toggleEntitySelection(entity, selected);\n }, [selectionController]);\n\n const isEntitySelected = useCallback((entity: Entity<M>) => {\n return selectionController?.isEntitySelected(entity) ?? false;\n }, [selectionController]);\n\n // Store latest callbacks in refs so the stable ItemComponent always\n // reads fresh values without changing its own identity.\n const handleEntityClickRef = useRef(handleEntityClick);\n handleEntityClickRef.current = handleEntityClick;\n const isEntitySelectedRef = useRef(isEntitySelected);\n isEntitySelectedRef.current = isEntitySelected;\n const handleSelectionChangeRef = useRef(handleSelectionChange);\n handleSelectionChangeRef.current = handleSelectionChange;\n const selectionEnabledRef = useRef(selectionEnabled);\n selectionEnabledRef.current = selectionEnabled;\n\n // Stable callback wrappers — identity never changes, delegates to refs.\n const stableOnClick = useCallback((entity: Entity<M>) => {\n handleEntityClickRef.current(entity);\n }, []);\n const stableOnSelectionChange = useCallback((entity: Entity<M>, sel: boolean) => {\n handleSelectionChangeRef.current(entity, sel);\n }, []);\n\n // Build a single, truly stable component reference.\n // Uses refs for ALL dynamic values so the component type never changes.\n // When ItemComponent identity changes, React.memo'd SortableItem remounts\n // the card → DOM is destroyed/recreated → CSS :hover state is lost → flicker.\n const ItemComponent = useMemo(() => {\n const Comp = (props: BoardItemViewProps<Entity<M>>) => (\n <BoardCardBinding\n {...props}\n collection={collectionRef.current as CollectionConfig<M>}\n onClick={stableOnClick}\n selected={isEntitySelectedRef.current(props.item.data)}\n onSelectionChange={stableOnSelectionChange}\n selectionEnabled={selectionEnabledRef.current}\n />\n );\n Comp.displayName = \"KanbanItemComponent\";\n return Comp;\n }, []);\n\n // Get KanbanSetupComponent from plugin slots\n const kanbanSetupSlots = useSlot(\"kanban.setup\", {\n collection,\n fullPath,\n parentCollectionSlugs,\n parentEntityIds\n });\n\n\n // Get AddKanbanColumnComponent from plugin slots\n const addKanbanColumnSlots = useSlot(\"kanban.add-column\", {\n collection,\n fullPath,\n parentCollectionSlugs,\nparentEntityIds,\n columnProperty\n });\n\n\n // Check for loading error\n const hasError = Boolean(dataLoadingError);\n const errorMessage = dataLoadingError?.message || \"\";\n const indexUrl = errorMessage.match(/https:\\/\\/console\\.firebase\\.google\\.com[^\\s]+/)?.[0];\n\n // Error: no enum properties available for Kanban columns\n if (!columnProperty || enumColumns.length === 0) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-8 gap-4\">\n <Typography variant=\"h6\">\n {t(\"kanban_view_not_available\")}\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\" className=\"text-center max-w-md\">\n {t(\"kanban_view_requires_enum\")}\n </Typography>\n {kanbanSetupSlots.length > 0 && kanbanSetupSlots[0]}\n </div>\n );\n }\n\n // Note: Empty state is not shown for Kanban view - we show the board with empty columns instead\n // The emptyComponent is handled per-column in BoardColumn\n\n // No columns\n if (columns.length === 0) {\n return (\n <div className=\"h-full flex items-center justify-center p-8\">\n <Typography variant=\"label\" color=\"secondary\">\n {t(\"no_enum_values_configured\", { property: columnProperty })}\n </Typography>\n </div>\n );\n }\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Error banner - only show when no data loaded */}\n {hasError && allEntities.length === 0 && (\n <div\n className=\"flex items-center gap-4 px-4 py-3 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800\">\n <Typography variant=\"body2\" className=\"text-red-700 dark:text-red-300 flex-1\">\n <strong>Error:</strong>{\" \"}\n {indexUrl\n ? \"A Firestore index is required for this query.\"\n : errorMessage}\n </Typography>\n <Tooltip title={t(\"refresh_data\")}>\n <IconButton\n size=\"small\"\n onClick={() => boardDataController.refreshAll()}\n >\n <RefreshCwIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n {indexUrl && (\n <Button\n size=\"small\"\n variant=\"filled\"\n color=\"error\"\n onClick={() => window.open(indexUrl, \"_blank\")}\n >\n {t(\"create_index\")}\n </Button>\n )}\n </div>\n )}\n\n {/* Warning: orderProperty not configured - drag reorder won't persist */}\n {!orderProperty && !dataLoading && (\n <div\n className=\"flex items-center justify-between gap-4 px-4 py-2 bg-amber-50 dark:bg-amber-900/20 border-b border-amber-200 dark:border-amber-800\">\n <Typography variant=\"body2\" color=\"secondary\">\n {t(\"kanban_order_not_configured\")}\n </Typography>\n {kanbanSetupSlots.length > 0 && kanbanSetupSlots[0]}\n </div>\n )}\n\n {/* Backfill info bar - non-blocking */}\n {itemsNeedBackfill && !dataLoading && (\n <div\n className=\"flex items-center justify-between gap-4 px-4 py-2 bg-amber-50 dark:bg-amber-900/20 border-b border-amber-200 dark:border-amber-800\">\n <Typography variant=\"body2\" color=\"secondary\">\n {t(\"items_need_backfill\")}\n </Typography>\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={() => setShowBackfillDialog(true)}\n >\n {t(\"initialize\")}\n </Button>\n </div>\n )}\n\n {/* Main board */}\n <div className=\"flex-1 overflow-auto no-scrollbar\">\n <KanbanView\n data={boardItems}\n columns={columns}\n columnLabels={columnLabels}\n columnColors={columnColors}\n assignColumn={assignColumn}\n allowColumnReorder={allowColumnReorder}\n onColumnReorder={handleColumnReorder}\n onItemsReorder={handleItemsReorder}\n ItemComponent={ItemComponent}\n columnLoadingState={columnLoadingState}\n onLoadMoreColumn={(column) => boardDataController.loadMoreColumn(column)}\n onAddItemToColumn={(column) => {\n analyticsController.onAnalyticsEvent?.(\"kanban_new_entity_in_column\", {\n path: fullPath,\n column\n });\n sidePanelController.open({\n path: fullPath,\n collection,\n entityId: undefined,\n updateUrl: true,\n formProps: {\n initialDirtyValues: {\n [columnProperty]: column\n } as Partial<M>\n }\n });\n }}\n AddColumnComponent={addKanbanColumnSlots.length > 0 ? addKanbanColumnSlots[0] : undefined}\n />\n </div>\n\n {/* Backfill dialog */}\n <Dialog open={showBackfillDialog} onOpenChange={setShowBackfillDialog}>\n <DialogTitle hidden>{t(\"initialize_kanban_order\")}</DialogTitle>\n <DialogContent>\n <Typography variant=\"h6\" className=\"mb-4\">{t(\"initialize_kanban_order\")}</Typography>\n <Typography variant=\"body2\">\n {t(\"initialize_kanban_order_desc\")}\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={() => setShowBackfillDialog(false)} disabled={backfillLoading}>\n {t(\"cancel\")}\n </Button>\n <Button onClick={handleBackfill} disabled={backfillLoading}>\n {backfillLoading ? <CircularProgress size=\"smallest\"/> : t(\"initialize\")}\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n );\n}\n","\nimport React, { useMemo } from \"react\";\nimport { CollectionSize, ViewMode } from \"@rebasepro/types\";\nimport {\n Button,\n ColumnsIcon,\n iconSize,\n KanbanIcon,\n LayoutGridIcon,\n ListIcon,\n Popover,\n Select,\n SelectItem,\n TableIcon,\n ToggleButtonGroup,\n ToggleButtonOption\n} from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\n\nexport type KanbanPropertyOption = {\n key: string;\n label: string;\n};\n\nexport type ViewModeToggleProps = {\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n /**\n * Which view modes are enabled for this collection.\n * Only these modes will appear in the toggle.\n * Defaults to all three: [\"table\", \"cards\", \"kanban\"].\n */\n enabledViews?: ViewMode[];\n /**\n * Current size for card/table views\n */\n size?: CollectionSize;\n /**\n * Callback when size changes\n */\n onSizeChanged?: (size: CollectionSize) => void;\n /**\n * Controlled open state for the popover\n */\n open?: boolean;\n /**\n * Callback when popover open state changes\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Available properties that can be used for kanban columns (enum properties)\n */\n kanbanPropertyOptions?: KanbanPropertyOption[];\n /**\n * Currently selected property for kanban columns\n */\n selectedKanbanProperty?: string;\n /**\n * Callback when the kanban column property changes\n */\n onKanbanPropertyChange?: (property: string) => void;\n}\n\nconst ALL_VIEW_MODES: ViewMode[] = [\"list\", \"table\", \"cards\", \"kanban\"];\n\nexport function ViewModeToggle({\n viewMode = \"table\",\n onViewModeChange,\n enabledViews = ALL_VIEW_MODES,\n size,\n onSizeChanged,\n open,\n onOpenChange,\n kanbanPropertyOptions,\n selectedKanbanProperty,\n onKanbanPropertyChange\n}: ViewModeToggleProps) {\n\n const { t } = useTranslation();\n\n\n // Get icon for current view mode\n const getViewModeIcon = () => {\n if (viewMode === \"kanban\") return <KanbanIcon size={iconSize.smallest}/>;\n if (viewMode === \"cards\") return <LayoutGridIcon size={iconSize.smallest}/>;\n if (viewMode === \"table\") return <TableIcon size={iconSize.smallest}/>;\n return <ListIcon size={iconSize.smallest}/>;\n };\n\n const getViewModeName = () => {\n if (viewMode === \"kanban\") return t(\"board\");\n if (viewMode === \"cards\") return t(\"cards\");\n if (viewMode === \"table\") return t(\"table_view_mode\");\n return t(\"list\");\n };\n\n const showSizeSelector = size && onSizeChanged && (viewMode === \"list\" || viewMode === \"table\" || viewMode === \"cards\");\n const showKanbanPropertySelector = viewMode === \"kanban\" &&\n kanbanPropertyOptions &&\n kanbanPropertyOptions.length > 0 &&\n onKanbanPropertyChange;\n\n // Build toggle options\n const viewModeOptions: ToggleButtonOption<ViewMode>[] = useMemo(() => {\n const allOptions: ToggleButtonOption<ViewMode>[] = [\n {\n value: \"list\",\n label: t(\"list\"),\n icon: <ListIcon size={iconSize.smallest}/>\n },\n {\n value: \"table\",\n label: t(\"table_view_mode\"),\n icon: <TableIcon size={iconSize.smallest}/>\n },\n {\n value: \"cards\",\n label: t(\"cards\"),\n icon: <LayoutGridIcon size={iconSize.smallest}/>\n },\n {\n value: \"kanban\",\n label: t(\"board\"),\n icon: <KanbanIcon size={iconSize.smallest}/>\n }\n ];\n\n return allOptions;\n }, [t]);\n\n // ── Guard (after hooks to preserve Rules of Hooks) ──────────────\n if (!onViewModeChange) {\n return null;\n }\n\n return (\n <div className=\"overflow-visible\">\n <Popover\n open={open}\n onOpenChange={onOpenChange}\n modal={false}\n trigger={\n <Button size=\"small\">\n {getViewModeIcon()}\n <span className=\"ml-1 text-sm\">{getViewModeName()}</span>\n </Button>\n }\n >\n <div className=\"p-3 flex flex-col gap-3 min-w-[240px]\">\n {/* View mode toggle using ToggleButtonGroup */}\n {viewModeOptions.length > 1 && (\n <ToggleButtonGroup\n value={viewMode}\n onValueChange={onViewModeChange}\n options={viewModeOptions}\n />\n )}\n\n {/* Size selector */}\n {showSizeSelector && (\n <div className=\"flex flex-row items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300\">\n <ColumnsIcon size={iconSize.smallest}/>\n <span>{t(\"size_label\")}</span>\n </div>\n <Select\n value={size}\n size=\"small\"\n className=\"w-20\"\n onValueChange={(v) => onSizeChanged?.(v as CollectionSize)}\n renderValue={(v) => <span className=\"font-medium\">{v.toUpperCase()}</span>}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((s) => (\n <SelectItem key={s} value={s} className=\"font-medium text-center\">\n {s.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n\n {/* KanbanIcon column property selector */}\n {showKanbanPropertySelector && (\n <div className=\"flex flex-row items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300\">\n <KanbanIcon size={iconSize.smallest}/>\n <span>{t(\"group_by\")}</span>\n </div>\n <Select\n value={selectedKanbanProperty}\n size=\"small\"\n className=\"w-32\"\n onValueChange={(v) => onKanbanPropertyChange?.(v)}\n renderValue={(v) => {\n const option = kanbanPropertyOptions?.find(o => o.key === v);\n return <span className=\"font-medium truncate\">{option?.label ?? v}</span>;\n }}\n >\n {kanbanPropertyOptions?.map((option) => (\n <SelectItem key={option.key} value={option.key}>\n {option.label}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n </div>\n </Popover>\n </div>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { Entity, CollectionCallbacks } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle } from \"@rebasepro/ui\";\nimport {\n deleteEntityWithCallbacks,\n useAuthController,\n useCustomizationController,\n useData,\n useSnackbarController,\n useTranslation\n} from \"@rebasepro/app\";\nimport { useCMSContext } from \"../hooks\";\nimport { EntityViewBinding } from \"./EntityViewBinding\";\n\nexport interface DeleteEntityDialogProps<M extends Record<string, unknown>> {\n entityOrEntitiesToDelete?: Entity<M> | Entity<M>[],\n path: string,\n collection: CollectionConfig<M>\n open: boolean;\n onClose: () => void;\n callbacks?: CollectionCallbacks<M>,\n\n onEntityDelete?(path: string, entity: Entity<M>): void;\n\n onMultipleEntitiesDelete?(path: string, entities: Entity<M>[]): void;\n}\n\nexport function DeleteEntityDialog<M extends Record<string, unknown>>({\n entityOrEntitiesToDelete,\n collection,\n onClose,\n open,\n callbacks,\n onEntityDelete,\n onMultipleEntitiesDelete,\n path\n}: DeleteEntityDialogProps<M>) {\n const authController = useAuthController();\n const dataClient = useData();\n const customizationController = useCustomizationController();\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n const context = useCMSContext();\n const entityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1\n ? entityOrEntitiesToDelete[0]\n : entityOrEntitiesToDelete;\n\n const multipleEntities = Array.isArray(entityOrEntities);\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const onDeleteSuccess = useCallback((entity: Entity<any>) => {\n console.debug(\"Deleted\", entity);\n }, []);\n\n const onDeleteFailure = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n title: t(\"error_deleting\"),\n message: e?.message\n });\n\n console.error(\"Error deleting entity\");\n console.error(e);\n }, [collection.name]);\n\n const performDelete = useCallback((entity: Entity<M>): Promise<boolean> =>\n deleteEntityWithCallbacks({\n data: dataClient,\n entity,\n collection: collection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n context\n }), [dataClient, collection, callbacks, onDeleteSuccess, onDeleteFailure, context]);\n\n const handleOk = useCallback(async () => {\n if (entityOrEntities) {\n\n setLoading(true);\n\n if (multipleEntities) {\n Promise.all((entityOrEntities as Entity<M>[]).map(performDelete)).then((results) => {\n\n setLoading(false);\n\n if (onMultipleEntitiesDelete && entityOrEntities)\n onMultipleEntitiesDelete(path, entityOrEntities as Entity<M>[]);\n\n if (results.every(Boolean)) {\n snackbarController.open({\n type: \"success\",\n message: t(\"multiple_deleted\", { collection: collection.name })\n });\n } else if (results.some(Boolean)) {\n snackbarController.open({\n type: \"warning\",\n message: t(\"some_entities_deleted\", { collection: collection.name })\n });\n } else {\n snackbarController.open({\n type: \"error\",\n message: t(\"error_deleting_entities\", { collection: collection.name })\n });\n }\n onClose();\n });\n\n } else {\n performDelete(entityOrEntities as Entity<M>).then((success) => {\n setLoading(false);\n if (success) {\n if (onEntityDelete && entityOrEntities)\n onEntityDelete(path, entityOrEntities as Entity<M>);\n snackbarController.open({\n type: \"success\",\n message: t(\"deleted\", { name: collection.singularName ?? collection.name })\n });\n onClose();\n }\n });\n }\n }\n }, [entityOrEntities, multipleEntities, performDelete, onMultipleEntitiesDelete, path, onClose, snackbarController, collection.name, onEntityDelete]);\n\n let content: React.ReactNode;\n if (entityOrEntities && multipleEntities) {\n content = <>{t(\"multiple_entities\")}</>;\n } else {\n const entity = entityOrEntities as Entity<M> | undefined;\n content = entity\n ? <EntityViewBinding\n entity={entity}\n collection={collection}\n path={path}/>\n : <></>;\n }\n\n const dialogTitle = multipleEntities\n ? <><b>{collection.name}</b>: {t(\"confirm_multiple_delete\")}</>\n : t(\"delete_entity_confirm_title\", { entityName: collection.singularName ?? collection.name });\n\n return (\n <Dialog\n maxWidth={multipleEntities ? \"lg\" : \"2xl\"}\n aria-labelledby=\"delete-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n <DialogTitle id=\"delete-dialog-title\">\n {dialogTitle}\n </DialogTitle>\n <DialogContent fullHeight={true}>\n {!multipleEntities && <div className={\"p-4\"}>{content}</div>}\n </DialogContent>\n <DialogActions>\n\n {loading && <CircularProgress size={\"smallest\"}/>}\n\n <Button onClick={handleCancel}\n disabled={loading}\n variant=\"text\">\n {t(\"cancel\")}\n </Button>\n <Button\n autoFocus\n disabled={loading}\n onClick={handleOk}\n variant=\"filled\">\n {t(\"ok\")}\n </Button>\n </DialogActions>\n\n </Dialog>\n );\n}\n","export function addRecentId(collectionId: string, id: string | number) {\n const recentIds = getRecentIds(collectionId);\n const newRecentIds = [id, ...recentIds.filter(i => i !== id)];\n if (newRecentIds.length > 5) {\n newRecentIds.pop();\n }\n saveSearchedIdsLocally(collectionId, newRecentIds);\n return newRecentIds;\n}\n\nexport function saveSearchedIdsLocally(collectionId: string, ids: (string | number)[]) {\n localStorage.setItem(\"recent_id_searches::\" + collectionId, JSON.stringify(ids));\n}\n\nexport function getRecentIds(collectionId: string): (string | number)[] {\n const stored = localStorage.getItem(\"recent_id_searches::\" + collectionId);\n if (!stored) return [];\n return JSON.parse(stored);\n}\n","import React, { useState } from \"react\";\nimport {\n Alert,\n Button,\n CheckCircleIcon,\n CopyIcon,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n MailIcon,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { useSnackbarController, useTranslation } from \"@rebasepro/app\";\nimport { UserCreationResult } from \"@rebasepro/types\";\n\nexport function CreationResultDialog({\n result,\n onClose\n}: {\n result: UserCreationResult;\n onClose: () => void;\n}) {\n const { t } = useTranslation();\n const snackbarController = useSnackbarController();\n const [copied, setCopied] = useState(false);\n\n const handleCopyPassword = async () => {\n if (!result.temporaryPassword) return;\n try {\n await navigator.clipboard.writeText(result.temporaryPassword);\n setCopied(true);\n snackbarController.open({\n type: \"success\",\n message: t(\"password_copied\") ?? \"Password copied to clipboard\"\n });\n setTimeout(() => setCopied(false), 3000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = result.temporaryPassword;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 3000);\n }\n };\n\n if (result.invitationSent) {\n // Invitation sent via email\n return (\n <Dialog open={true} onOpenChange={(open) => !open ? onClose() : undefined} maxWidth=\"xl\">\n <DialogTitle variant=\"h5\" gutterBottom={false}>\n <div className=\"flex items-center gap-3\">\n <MailIcon/>\n {t(\"invitation_sent_title\") ?? \"Invitation Sent\"}\n </div>\n </DialogTitle>\n <DialogContent>\n <div className=\"flex flex-col gap-4 py-2\">\n <Alert color=\"success\">\n <Typography>\n {(t(\"invitation_sent\") ?? \"An invitation email has been sent to {{email}}. They can use the link to set their password.\")\n .replace(\"{{email}}\", result.user.email ?? \"\")}\n </Typography>\n </Alert>\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"filled\" onClick={onClose}>\n {t(\"ok\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (result.temporaryPassword) {\n // No email — show temporary password\n return (\n <Dialog open={true} onOpenChange={(open) => !open ? onClose() : undefined} maxWidth=\"xl\">\n <DialogTitle variant=\"h5\" gutterBottom={false}>\n {t(\"temporary_password\") ?? \"Temporary Password\"}\n </DialogTitle>\n <DialogContent>\n <div className=\"flex flex-col gap-4 py-2\">\n <Alert color=\"warning\">\n <Typography variant=\"body2\">\n {result.emailDeliveryFailed\n ? (t(\"temporary_password_email_failed_description\") ??\n \"The email could not be delivered. Share this temporary password with the user securely. It will not be shown again.\")\n : (t(\"temporary_password_description\") ??\n \"Email is not configured. Share this temporary password with the user securely. It will not be shown again.\")}\n </Typography>\n </Alert>\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-1\">\n {t(\"email\")}\n </Typography>\n <Typography>\n {result.user.email}\n </Typography>\n </div>\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-1\">\n {t(\"temporary_password\") ?? \"Temporary Password\"}\n </Typography>\n <div className=\"flex items-center gap-2 mt-1\">\n <code className=\"flex-grow bg-surface-100 dark:bg-surface-900 border border-surface-300 dark:border-surface-600 rounded px-3 py-2 font-mono text-base select-all\">\n {result.temporaryPassword}\n </code>\n <Tooltip title={t(\"copy_password\") ?? \"Copy password\"} asChild>\n <IconButton onClick={handleCopyPassword}>\n {copied ? <CheckCircleIcon className=\"text-green-600\"/> : <CopyIcon/>}\n </IconButton>\n </Tooltip>\n </div>\n </div>\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"filled\" onClick={onClose}>\n {t(\"ok\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n // Shouldn't happen, but fallback\n return null;\n}\n","import {\n Alert,\n Button,\n CopyIcon,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n iconSize,\n KeyRoundIcon,\n Label,\n LoadingButton,\n PencilIcon,\n RadioGroup,\n RadioGroupItem,\n TextField,\n Trash2Icon,\n Typography\n} from \"@rebasepro/ui\";\nimport type { EntityAction, User, UserCreationResult } from \"@rebasepro/types\";\nimport {\n useAuthController,\n useRebaseClient,\n useSnackbarController,\n useTranslation\n} from \"@rebasepro/app\";\nimport { DeleteEntityDialog } from \"../DeleteEntityDialog\";\nimport { addRecentId } from \"../CollectionViewBinding/utils\";\nimport { navigateToEntity } from \"../../util/navigation_utils\";\nimport { resolveDefaultSelectedView } from \"@rebasepro/common\";\nimport { CreationResultDialog } from \"../admin/CreationResultDialog\";\nimport React, { useState } from \"react\";\n\nexport const editEntityAction: EntityAction = {\n icon: <PencilIcon size={iconSize.smallest}/>,\n key: \"edit\",\n name: \"Edit\",\n collapsed: false,\n isEnabled: ({ entity }) => Boolean(entity),\n onClick({\n entity,\n collection,\n path,\n context,\n sidePanelController,\n highlightEntity,\n unhighlightEntity,\n openEntityMode\n }): Promise<void> {\n\n if (!entity) {\n throw new Error(\"INTERNAL: editEntityAction: Entity is undefined\");\n }\n\n if (!sidePanelController) {\n throw new Error(\"INTERNAL: editEntityAction: sidePanelController is undefined\");\n }\n\n highlightEntity?.(entity);\n\n context?.analyticsController?.onAnalyticsEvent?.(\"entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n\n if (collection) {\n addRecentId(collection.slug, entity.id);\n }\n\n const newFullIdPath = path ?? collection?.slug ?? entity.path;\n const defaultSelectedView = collection?.defaultEntityAction === \"view\"\n ? \"edit\"\n : resolveDefaultSelectedView(\n collection ? collection.defaultSelectedView : undefined,\n {\n status: \"existing\",\n entityId: entity.id\n }\n );\n if (!context?.urlController) {\n throw new Error(\"INTERNAL: editEntityAction: urlController is undefined\");\n }\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: entity.id,\n path: newFullIdPath,\n sidePanelController,\n onClose: () => unhighlightEntity?.(entity),\n navigation: context.urlController,\n selectedTab: defaultSelectedView\n });\n\n return Promise.resolve(undefined);\n }\n}\n\nexport const copyEntityAction: EntityAction = {\n icon: <CopyIcon size={iconSize.smallest}/>,\n name: \"Copy\",\n key: \"copy\",\n isEnabled: ({ entity }) => Boolean(entity),\n onClick({\n entity,\n collection,\n context,\n path,\n sidePanelController,\n highlightEntity,\n unhighlightEntity,\n openEntityMode\n }): Promise<void> {\n if (!entity) {\n throw new Error(\"INTERNAL: copyEntityAction: Entity is undefined\");\n }\n if (!sidePanelController) {\n throw new Error(\"INTERNAL: copyEntityAction: sidePanelController is undefined\");\n }\n highlightEntity?.(entity);\n context?.analyticsController?.onAnalyticsEvent?.(\"copy_entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n\n const usedPath = path ?? collection?.slug ?? entity.path;\n if (!context?.urlController) {\n throw new Error(\"INTERNAL: copyEntityAction: urlController is undefined\");\n }\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: entity.id,\n path: usedPath,\n copy: true,\n sidePanelController,\n onClose: () => unhighlightEntity?.(entity),\n navigation: context.urlController\n });\n\n return Promise.resolve(undefined);\n }\n}\n\nexport const deleteEntityAction: EntityAction = {\n icon: <Trash2Icon size={iconSize.smallest}/>,\n name: \"Delete\",\n key: \"delete\",\n isEnabled: ({ entity }) => Boolean(entity),\n onClick({\n entity,\n path,\n collection,\n context,\n selectionController,\n onCollectionChange,\n navigateBack,\n openEntityMode\n }): Promise<void> {\n if (!entity) {\n throw new Error(\"INTERNAL: deleteEntityAction: Entity is undefined\");\n }\n if (!context?.dialogsController) {\n throw new Error(\"INTERNAL: deleteEntityAction: context.dialogsController is undefined\");\n }\n const { closeDialog } = context.dialogsController.open({\n key: \"delete_entity_dialog_\" + entity.id,\n Component: ({ open }) => {\n if (!collection || !path)\n throw new Error(\"deleteEntityAction: Collection is undefined\");\n return <DeleteEntityDialog\n entityOrEntitiesToDelete={entity}\n path={path}\n collection={collection}\n callbacks={collection.callbacks}\n open={open}\n onEntityDelete={() => {\n context?.analyticsController?.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path\n });\n selectionController?.setSelectedEntities(selectionController.selectedEntities.filter(e => e.id !== entity.id));\n onCollectionChange?.();\n // In full-screen mode, navigateBack would go to the deleted entity's\n // detail URL, which no longer exists. Navigate to the parent collection instead.\n if (openEntityMode === \"full_screen\" && context?.urlController) {\n const collectionUrl = context.urlController.buildUrlCollectionPath(path);\n context.urlController.navigate(collectionUrl, { replace: true });\n } else {\n navigateBack?.();\n }\n }}\n onClose={closeDialog}/>;\n }\n });\n return Promise.resolve(undefined);\n }\n}\n\nexport function ResetPasswordActionDialog({\n user,\n open,\n onClose\n}: {\n user: User;\n open: boolean;\n onClose: () => void;\n}) {\n const client = useRebaseClient<{ baseUrl?: string }>();\n const { getAuthToken } = useAuthController();\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n const [creationResult, setCreationResult] = useState<UserCreationResult | null>(null);\n const [mode, setMode] = useState<\"email\" | \"manual\">(\"email\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n // Strength rules are enforced server side, and are overridable through auth\n // hooks, so only the match is checked here; the server's message is surfaced.\n const passwordsMatch = password === confirmPassword;\n const canSubmit = mode === \"email\" || (password.length > 0 && passwordsMatch);\n\n const handleConfirm = async () => {\n if (mode === \"manual\" && !passwordsMatch) {\n setError(t(\"passwords_dont_match\") || \"Passwords don't match\");\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const baseUrl = client?.baseUrl || \"\";\n const token = await getAuthToken?.();\n const response = await fetch(`${baseUrl}/api/admin/users/${user.uid}/reset-password`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(token ? { \"Authorization\": `Bearer ${token}` } : {})\n },\n body: JSON.stringify(mode === \"manual\" ? { password } : {})\n });\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throw new Error(errorBody.error?.message || errorBody.message || \"Failed to reset password\");\n }\n const data = await response.json();\n snackbarController.open({\n type: \"success\",\n message: t(\"reset_password_success\") || \"Password reset successfully\"\n });\n // Setting a password directly returns neither an invitation nor a\n // temporary password, so there is no result to show.\n if (data.invitationSent || data.temporaryPassword) {\n setCreationResult({\n user,\n invitationSent: data.invitationSent ?? false,\n temporaryPassword: data.temporaryPassword,\n emailDeliveryFailed: data.emailDeliveryFailed ?? false\n });\n } else {\n onClose();\n }\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : (t(\"error_resetting_password\") || \"Error resetting password\"));\n } finally {\n setLoading(false);\n }\n };\n\n if (creationResult) {\n return (\n <CreationResultDialog\n result={creationResult}\n onClose={() => {\n setCreationResult(null);\n onClose();\n }}\n />\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={(o) => !o ? onClose() : undefined} maxWidth=\"xl\">\n <DialogTitle variant=\"h5\" gutterBottom={false}>\n {t(\"reset_password\") || \"Reset Password\"}\n </DialogTitle>\n <DialogContent>\n <div className=\"flex flex-col gap-4 py-2\">\n <Typography variant=\"body2\" color=\"secondary\">\n {user.email}\n </Typography>\n\n <RadioGroup value={mode} onValueChange={(v) => {\n setMode(v as \"email\" | \"manual\");\n setError(null);\n }}>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"email\" id=\"reset-password-mode-email\"/>\n <Label htmlFor=\"reset-password-mode-email\">\n {t(\"reset_password_send_email\") || \"Send a password reset email\"}\n </Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"manual\" id=\"reset-password-mode-manual\"/>\n <Label htmlFor=\"reset-password-mode-manual\">\n {t(\"reset_password_set_manually\") || \"Set a password manually\"}\n </Label>\n </div>\n </RadioGroup>\n\n {mode === \"manual\" && <>\n <TextField\n type=\"password\"\n value={password}\n autoFocus\n autoComplete=\"new-password\"\n label={t(\"new_password\") || \"New password\"}\n onChange={(e) => {\n setPassword(e.target.value);\n setError(null);\n }}\n />\n <TextField\n type=\"password\"\n value={confirmPassword}\n autoComplete=\"new-password\"\n error={confirmPassword.length > 0 && !passwordsMatch}\n label={t(\"confirm_password\") || \"Confirm password\"}\n onChange={(e) => {\n setConfirmPassword(e.target.value);\n setError(null);\n }}\n />\n <Typography variant=\"caption\" color=\"secondary\">\n {t(\"reset_password_set_manually_description\") ||\n \"The password is updated immediately and no email is sent. Share it with the user securely.\"}\n </Typography>\n </>}\n\n {error && <Alert color=\"error\">\n <Typography variant=\"body2\">{error}</Typography>\n </Alert>}\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={onClose} disabled={loading}>\n {t(\"cancel\")}\n </Button>\n <LoadingButton variant=\"filled\" onClick={handleConfirm} loading={loading} disabled={!canSubmit}>\n {t(\"reset_password\") || \"Reset Password\"}\n </LoadingButton>\n </DialogActions>\n </Dialog>\n );\n}\n\nexport const resetPasswordAction: EntityAction = {\n icon: <KeyRoundIcon size={iconSize.smallest}/>,\n name: \"Reset Password\",\n key: \"reset_password\",\n collapsed: false,\n showActionsInListView: true,\n isEnabled: ({ entity }) => Boolean(entity),\n onClick({\n entity,\n context\n }): Promise<void> {\n if (!entity) {\n throw new Error(\"INTERNAL: resetPasswordAction: Entity is undefined\");\n }\n if (!context?.dialogsController) {\n throw new Error(\"INTERNAL: resetPasswordAction: context.dialogsController is undefined\");\n }\n\n const user: User = {\n uid: entity.id as string,\n email: entity.values?.email as string,\n displayName: entity.values?.displayName as string || null,\n photoURL: entity.values?.photoURL as string || null,\n providerId: entity.values?.providerId as string || \"custom\",\n isAnonymous: entity.values?.isAnonymous as boolean || false,\n roles: entity.values?.roles as string[] || []\n };\n\n const { closeDialog } = context!.dialogsController.open({\n key: \"reset_password_dialog_\" + entity.id,\n Component: ({ open }) => (\n <ResetPasswordActionDialog\n user={user}\n open={open}\n onClose={closeDialog}\n />\n )\n });\n return Promise.resolve(undefined);\n }\n};\n\n","import React, { useCallback, useEffect } from \"react\";\n\n/** Tracks events originating inside the inner (non-draggable) area. */\nconst innerClicked = new WeakSet<MouseEvent>();\n\ninterface DraggableProps {\n containerRef: React.RefObject<HTMLDivElement | null>,\n innerRef: React.RefObject<HTMLDivElement | null>,\n x?: number;\n y?: number;\n onMove: (params: { x: number, y: number }) => void,\n}\n\nexport function useDraggable({\n containerRef,\n innerRef,\n x,\n y,\n onMove\n}: DraggableProps) {\n\n let relX = 0;\n let relY = 0;\n\n const listeningRef = React.useRef(false);\n\n const onMouseDown = useCallback((event: MouseEvent) => {\n if (event.button !== 0 || !containerRef.current || event.defaultPrevented || innerClicked.has(event)) {\n return;\n }\n\n const {\n x,\n y\n } = containerRef.current.getBoundingClientRect();\n\n relX = event.screenX - x;\n relY = event.screenY - y;\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"selectstart\", onSelect);\n listeningRef.current = true;\n // event.stopPropagation();\n }, [containerRef, onMove]);\n\n const onMouseDownInner = useCallback((event: MouseEvent) => {\n innerClicked.add(event);\n }, [])\n\n const onSelect = useCallback((event: Event) => {\n event.preventDefault()\n event.stopPropagation();\n }, [])\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"selectstart\", onSelect);\n event.stopPropagation();\n listeningRef.current = false;\n };\n\n const onMouseMove = (event: MouseEvent) => {\n if ((event.target as HTMLElement)?.localName === \"input\" || !listeningRef.current)\n return;\n onMove({\n x: event.screenX - relX,\n y: event.screenY - relY\n }\n );\n event.stopPropagation();\n };\n\n const update = () => {\n if (containerRef.current) {\n containerRef.current.style.top = `${y}px`;\n containerRef.current.style.left = `${x}px`;\n }\n };\n\n useEffect(() => {\n const current = containerRef.current;\n const innerCurrent = innerRef.current;\n if (!current || !innerCurrent)\n return;\n if (innerCurrent)\n innerCurrent.addEventListener(\"mousedown\", onMouseDownInner);\n if (current)\n current.addEventListener(\"mousedown\", onMouseDown);\n update();\n return () => {\n if (current)\n current.removeEventListener(\"mousedown\", onMouseDown);\n if (innerCurrent)\n innerCurrent.removeEventListener(\"mousedown\", onMouseDownInner);\n };\n }, [containerRef, innerRef, onMouseDownInner, onMouseDown]);\n\n}\n","import { useLayoutEffect, useState } from \"react\";\n\ninterface WindowSize {\n width: number,\n height: number\n}\n\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>({ width: 0,\nheight: 0 });\n useLayoutEffect(() => {\n function updateSize() {\n setSize({ width: window.innerWidth,\nheight: window.innerHeight });\n }\n\n window.addEventListener(\"resize\", updateSize);\n updateSize();\n return () => window.removeEventListener(\"resize\", updateSize);\n }, []);\n return size;\n}\n","import type { Properties } from \"@rebasepro/types\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport type { FormContext, PropertyFieldBindingProps } from \"../../../../types/fields\";\nimport type { Property } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { Button, DialogActions, IconButton, Portal, Typography, XIcon } from \"@rebasepro/ui\";\n\nimport { Entity, EntityValues } from \"@rebasepro/types\";\nimport { PluginProviderStack } from \"@rebasepro/app\";\nimport { Formex, FormexController, useCreateFormex } from \"@rebasepro/forms\";\nimport { useDraggable } from \"./useDraggable\";\nimport { CustomFieldValidator, getEntitySchema } from \"../../../../form/validation\";\nimport { useWindowSize } from \"./useWindowSize\";\nimport { getPropertyInPath } from \"../../../../util/property_utils\";\nimport { PropertyFieldBinding, zodToFormErrors } from \"../../../../form\";\nimport { useAuthController, useCustomizationController, useData, useRebaseContext } from \"@rebasepro/app\";\nimport type { OnCellValueChangeParams } from \"@rebasepro/app\";\nimport { isReadOnly } from \"@rebasepro/common\";\n\ninterface PopupFormFieldProps<M extends Record<string, unknown>> {\n customFieldValidator?: CustomFieldValidator;\n path: string;\n entityId: string | number;\n tableKey: string;\n propertyKey?: Extract<keyof M, string>;\n collection?: CollectionConfig<any>;\n cellRect?: DOMRect;\n open: boolean;\n onClose: () => void;\n container: HTMLElement | null;\n /**\n * Callback when the value of a cell has been edited\n * @param params\n */\n onCellValueChange?: (params: OnCellValueChangeParams<any, any>) => Promise<void> | void;\n}\n\nexport function PopupFormField<M extends Record<string, unknown>>(props: PopupFormFieldProps<M>) {\n if (!props.open) return null;\n return <PopupFormFieldLoading {...props}/>;\n\n}\n\nexport function PopupFormFieldLoading<M extends Record<string, unknown>>({\n tableKey,\n entityId,\n customFieldValidator,\n propertyKey,\n collection: inputCollection,\n path,\n cellRect,\n open,\n onClose,\n onCellValueChange,\n container\n}: PopupFormFieldProps<M>) {\n const dataClient = useData();\n const [entity, setEntity] = useState<Entity<M> | undefined>(undefined);\n useEffect(() => {\n if (entityId && inputCollection) {\n dataClient.collection(path).findById(entityId).then((result) => setEntity(result as Entity<M> | undefined));\n }\n }, [entityId, inputCollection, dataClient, path]);\n\n if (!entity) return null;\n return <PopupFormFieldInternal {...{\n tableKey,\n entityId,\n customFieldValidator,\n propertyKey,\n collection: inputCollection,\n path,\n cellRect,\n open,\n onClose,\n onCellValueChange,\n container\n }} entity={entity}/>;\n}\n\nexport function PopupFormFieldInternal<M extends Record<string, unknown>>({\n tableKey,\n entityId,\n customFieldValidator,\n propertyKey,\n collection,\n path,\n cellRect,\n open,\n onClose,\n onCellValueChange,\n container,\n entity\n}: PopupFormFieldProps<M> & {\n entity?: Entity<M>\n}) {\n\n const rebaseContext = useRebaseContext();\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n const [savingError, setSavingError] = React.useState<any>();\n const [popupLocation, setPopupLocation] = useState<{\n x: number,\n y: number\n }>();\n\n const windowSize = useWindowSize();\n\n const draggableRef = React.useRef<HTMLDivElement>(null);\n const innerRef = React.useRef<HTMLDivElement>(null);\n\n const initialPositionSet = React.useRef<boolean>(false);\n\n const getInitialLocation = useCallback(() => {\n if (!cellRect) throw Error(\"getInitialLocation error\");\n\n return {\n x: cellRect.left < windowSize.width - cellRect.right\n ? cellRect.x + cellRect.width / 2\n : cellRect.x - cellRect.width / 2,\n y: cellRect.top < windowSize.height - cellRect.bottom\n ? cellRect.y + cellRect.height / 2\n : cellRect.y - cellRect.height / 2\n };\n }, [cellRect, windowSize.height, windowSize.width]);\n\n const normalizePosition = useCallback((\n pos: { x: number, y: number },\n draggableBoundingRect: DOMRect,\n currentWindowSize: { width: number, height: number }\n ) => {\n if (!draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {\n return pos;\n }\n return {\n x: Math.max(0, Math.min(pos.x, currentWindowSize.width - draggableBoundingRect.width)),\n y: Math.max(0, Math.min(pos.y, currentWindowSize.height - draggableBoundingRect.height))\n };\n }, []);\n\n const updatePopupLocation = useCallback((newPositionCandidate?: {\n x: number,\n y: number\n }) => {\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!cellRect || !draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {\n return;\n }\n const basePosition = newPositionCandidate ?? getInitialLocation();\n const newNormalizedPosition = normalizePosition(basePosition, draggableBoundingRect, windowSize);\n\n if (!popupLocation || newNormalizedPosition.x !== popupLocation.x || newNormalizedPosition.y !== popupLocation.y) {\n setPopupLocation(newNormalizedPosition);\n }\n }, [cellRect, getInitialLocation, normalizePosition, popupLocation, windowSize]);\n\n useDraggable({\n containerRef: draggableRef,\n innerRef,\n x: popupLocation?.x,\n y: popupLocation?.y,\n onMove: updatePopupLocation\n });\n\n useEffect(\n () => {\n initialPositionSet.current = false;\n },\n [propertyKey, entity]\n );\n\n useLayoutEffect(\n () => {\n if (!cellRect || initialPositionSet.current) return;\n // Ensure draggableRef is available and has dimensions before initial positioning\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {\n // If not ready, perhaps wait or log. For now, just return.\n // This might need a retry mechanism or ensure content is rendered first.\n return;\n }\n updatePopupLocation();\n initialPositionSet.current = true;\n },\n [cellRect, updatePopupLocation] // Removed initialPositionSet.current from deps as it's a ref\n );\n\n useLayoutEffect(\n () => {\n updatePopupLocation(popupLocation);\n },\n [windowSize, cellRect, updatePopupLocation, popupLocation]\n );\n\n const validationSchema = useMemo(() => {\n if (!collection || !entityId) return;\n return getEntitySchema(\n entityId,\n propertyKey && collection.properties[propertyKey as string]\n ? { [propertyKey]: collection.properties[propertyKey as string] } as Properties\n : {} as Properties,\n customFieldValidator);\n }, [collection, entityId, propertyKey, customFieldValidator]);\n\n const adaptResize = useCallback(() => {\n // When the popup resizes, we want to re-evaluate its position\n // based on its current location and new dimensions.\n return updatePopupLocation(popupLocation);\n }, [popupLocation, updatePopupLocation]);\n\n // Setup ResizeObserver\n useEffect(() => {\n const element = draggableRef.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n adaptResize();\n });\n\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n observer.disconnect();\n };\n }, [adaptResize, draggableRef]);\n\n const saveValue = async (values: M) => {\n setSavingError(null);\n if (collection && entity && onCellValueChange && propertyKey) {\n return onCellValueChange({\n value: values[propertyKey as string],\n propertyKey: propertyKey as string,\n data: entity,\n setError: setSavingError,\n onValueUpdated: () => {\n }\n });\n }\n return Promise.resolve();\n };\n\n const formex = useCreateFormex<M>({\n initialValues: (entity?.values ?? {}) as EntityValues<M>,\n validation: async (values) => {\n if (!validationSchema) return {};\n const result = await validationSchema.safeParseAsync(values);\n if (result.success) return {};\n return zodToFormErrors(result.error) as Record<string, string>;\n },\n validateOnInitialRender: true,\n onSubmit: (values, actions) => {\n saveValue(values)\n .then(() => {\n formex.resetForm({\n values: values\n })\n onClose();\n })\n .finally(() => actions.setSubmitting(false));\n }\n });\n\n const {\n values,\n isSubmitting,\n setFieldValue,\n handleSubmit\n } = formex;\n\n const disabled = isSubmitting;\n\n const formContext: FormContext<M> = {\n collection: collection,\n entityId,\n values,\n path,\n setFieldValue,\n save: saveValue,\n submit: handleSubmit,\n formex,\n status: \"existing\",\n openEntityMode: \"side_panel\",\n disabled: false\n };\n\n const property: Property | undefined = propertyKey && getPropertyInPath(collection?.properties ?? {} as Properties, propertyKey as string);\n const fieldProps: PropertyFieldBindingProps<M> | undefined = propertyKey && property\n ? {\n propertyKey: propertyKey as string,\n disabled: isSubmitting || isReadOnly(property) || !!property.ui?.disabled,\n property,\n includeDescription: false,\n underlyingValueHasChanged: false,\n context: formContext,\n partOfArray: false,\n minimalistView: true,\n autoFocus: open\n }\n : undefined;\n\n let internalForm = <>\n <div\n key={`popup_form_${tableKey}_${entityId}_${propertyKey}`}\n className=\"w-[700px] max-w-full max-h-[85vh]\">\n <form\n onSubmit={handleSubmit}\n noValidate>\n\n <div\n className=\"mb-1 p-4 flex flex-col relative\">\n <div\n ref={innerRef}\n className=\"cursor-auto\"\n style={{ cursor: \"auto !important\" }}>\n {fieldProps &&\n <PropertyFieldBinding {...fieldProps}/>}\n </div>\n </div>\n\n <DialogActions>\n <Button\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n >\n Save\n </Button>\n </DialogActions>\n\n </form>\n\n </div>\n\n </>;\n\n const plugins = customizationController.plugins;\n if (plugins && plugins.length > 0) {\n internalForm = (\n <PluginProviderStack\n plugins={plugins}\n scope=\"form\"\n scopeProps={{\n status: \"existing\",\n path,\n collection,\n entity,\n context: rebaseContext,\n currentEntityId: entityId,\n formContext\n }}>\n {internalForm}\n </PluginProviderStack>\n );\n }\n const form = <div\n className={`text-surface-900 dark:text-white overflow-auto rounded-xs rounded-md bg-white dark:bg-surface-800 ${!open ? \"hidden\" : \"\"} cursor-grab max-w-[100vw]`}>\n\n {internalForm}\n\n {savingError &&\n <Typography color={\"error\"}>\n {savingError.message}\n </Typography>\n }\n </div>;\n\n const draggable = (\n <div\n key={`draggable_${propertyKey as string}_${entityId}_${open}`}\n style={{\n boxShadow: \"0 0 0 2px rgba(128,128,128,0.2)\"\n }}\n className={`inline-block fixed z-20 shadow-outline rounded-md bg-white dark:bg-surface-800 ${!open ? \"invisible\" : \"visible\"\n } cursor-grab overflow-visible`}\n ref={draggableRef}>\n\n {/* ElementResizeListener removed from here */}\n\n <div\n className=\"overflow-hidden\">\n\n {form}\n\n <div\n className=\"absolute -top-3.5 -right-3.5 bg-surface-500 rounded-full\"\n style={{\n width: \"32px\",\n height: \"32px\"\n }}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onClose();\n }}>\n <XIcon className=\"text-white\"/>\n </IconButton>\n </div>\n </div>\n\n </div>\n );\n\n return (\n <Portal.Root asChild\n container={container}>\n <Formex value={formex as FormexController<Record<string, unknown>>}>\n {draggable}\n </Formex>\n </Portal.Root>\n );\n\n}\n","import { Button, FilterXIcon, iconSize, Tooltip } from \"@rebasepro/ui\";\nimport { EntityTableController } from \"@rebasepro/types\";\nimport { useTranslation } from \"@rebasepro/app\";\n\nexport function ClearFilterSortButton({\n tableController,\n enabled\n}: {\n enabled: boolean;\n tableController: EntityTableController\n}) {\n const { t } = useTranslation();\n\n if (!enabled) {\n return null;\n }\n\n const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;\n const sortIsSet = !!tableController.sortBy && tableController.sortBy.length > 0;\n\n if ((filterIsSet || sortIsSet) && (tableController.clearFilter || tableController.setSortBy)) {\n let label;\n if (filterIsSet && sortIsSet) {\n label = t(\"clear_filter_sort\");\n } else if (filterIsSet) {\n label = t(\"clear_filter\");\n } else {\n label = t(\"clear_sort\");\n }\n return (\n <Tooltip title={label}>\n <Button\n size={\"small\"}\n variant={\"text\"}\n aria-label={label}\n onClick={() => {\n tableController.clearFilter?.();\n tableController.setSortBy?.(undefined);\n }}\n >\n <FilterXIcon size={iconSize.small}/>\n </Button>\n </Tooltip>\n );\n }\n return null;\n}\n","\nimport type { Property } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { FilterValues, WhereFilterOp } from \"@rebasepro/types\";\nimport { Button, cls, defaultBorderMixin, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from \"@rebasepro/ui\";\nimport { FilterIcon, VirtualTableWhereFilterOp } from \"@rebasepro/ui\";\nimport { resolveFilterOperators } from \"@rebasepro/common\";\nimport { useCollectionScope, useTranslation } from \"@rebasepro/app\";\nimport { FilterFieldBinding } from \"../SelectableTable/filters/FilterFieldBinding\";\n\n/**\n * `WhereFilterOp` is declared twice: once in `@rebasepro/types` as the canonical\n * operator set every driver translates, and once in `@rebasepro/ui` for the\n * table's own props. That is deliberate — `ui` is a standalone design system and\n * depends on no Rebase package, so it cannot import the canonical one (and a\n * type-only import would not help: `ui` emits declarations with `tsc`, which\n * references external types rather than inlining them, so its published `.d.ts`\n * would demand `@rebasepro/types` from every consumer).\n *\n * This file is where the two meet and get cast into each other, so it is where\n * their agreement is checked. Adding an operator to one and not the other stops\n * this line compiling instead of silently producing a filter the table can build\n * and no driver can run — or one a driver supports and the table cannot offer.\n */\ntype MutuallyAssignable<A, B> = [A] extends [B] ? ([B] extends [A] ? true : never) : never;\nconst _whereFilterOpDefinitionsAgree: MutuallyAssignable<WhereFilterOp, VirtualTableWhereFilterOp> = true;\nvoid _whereFilterOpDefinitionsAgree;\n\nexport interface FiltersDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n properties: Record<string, Property>;\n filterValues: FilterValues<any> | undefined;\n setFilterValues: (filterValues?: FilterValues<any>) => void;\n fixedFilter?: FilterValues<any>;\n}\n\n/**\n * Dialog that displays all filterable properties from a collection\n * and allows setting filter values for each.\n */\nexport function FiltersDialog({\n open,\n onOpenChange,\n properties,\n filterValues,\n setFilterValues,\n fixedFilter\n}: FiltersDialogProps) {\n const { t } = useTranslation();\n // Engine of the collection this dialog filters — read from the\n // surrounding CollectionScopeProvider mounted by the collection view.\n const engine = useCollectionScope()?.engine;\n // Local state for filters being edited\n const [localFilters, setLocalFilters] = useState<FilterValues<any>>(filterValues ?? {});\n\n // Track hidden state for reference fields (when reference dialog is open)\n const [hiddenFields, setHiddenFields] = useState<Record<string, boolean>>({});\n\n // Reset local state when dialog opens\n React.useEffect(() => {\n if (open) {\n setLocalFilters(filterValues ?? {});\n }\n }, [open, filterValues]);\n\n // Get list of filterable properties\n const filterableProperties = useMemo(() => {\n return Object.entries(properties).filter(([key, property]) => {\n if (!property) return false;\n // Force filter properties should not be editable\n if (fixedFilter && key in fixedFilter) return false;\n const isArray = property.type === \"array\";\n const ofProp = isArray && \"of\" in property ? property.of : undefined;\n const baseProperty = isArray ? (Array.isArray(ofProp) ? ofProp[0] : ofProp) as Property | undefined : property;\n if (!baseProperty) return false;\n // A property is filterable when it has a custom filter field, or\n // when at least one operator survives the engine ∩ type ∩\n // property-narrowing resolution.\n if (baseProperty.ui?.Filter) return true;\n return resolveFilterOperators({ property: baseProperty, isArray, engine }).length > 0;\n });\n }, [properties, fixedFilter, engine]);\n\n const handleFilterChange = useCallback((propertyKey: string, value?: [VirtualTableWhereFilterOp, any]) => {\n setLocalFilters(prev => {\n const newFilters = { ...prev };\n if (value) {\n newFilters[propertyKey] = value as [WhereFilterOp, any];\n } else {\n delete newFilters[propertyKey];\n }\n return newFilters;\n });\n }, []);\n\n const handleApply = useCallback(() => {\n const hasFilters = Object.keys(localFilters).length > 0;\n setFilterValues(hasFilters ? { ...localFilters,\n...fixedFilter } : (fixedFilter || undefined));\n onOpenChange(false);\n }, [localFilters, setFilterValues, fixedFilter, onOpenChange]);\n\n const handleClearAll = useCallback(() => {\n setLocalFilters({});\n }, []);\n\n const setHiddenForField = useCallback((propertyKey: string, hidden: boolean) => {\n setHiddenFields(prev => ({\n ...prev,\n [propertyKey]: hidden\n }));\n }, []);\n\n // Check if any reference field's dialog is currently open (should hide this dialog)\n const isAnyFieldHidden = Object.values(hiddenFields).some(hidden => hidden);\n const activeFilterCount = Object.keys(localFilters).length;\n\n const renderFilterField = useCallback((propertyKey: string, property: Property) => {\n const filterValue = localFilters[propertyKey] as [WhereFilterOp, any] | undefined;\n const setValue = (value?: [WhereFilterOp, any]) => handleFilterChange(propertyKey, value as [VirtualTableWhereFilterOp, any] | undefined);\n\n return (\n <FilterFieldBinding\n propertyKey={propertyKey}\n property={property}\n engine={engine}\n value={filterValue}\n setValue={setValue}\n hidden={hiddenFields[propertyKey] ?? false}\n setHidden={(hidden) => setHiddenForField(propertyKey, hidden)}\n />\n );\n }, [localFilters, handleFilterChange, hiddenFields, setHiddenForField, engine]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={onOpenChange}\n maxWidth=\"3xl\"\n fullWidth\n containerClassName={isAnyFieldHidden ? \"hidden\" : undefined}\n >\n <DialogTitle className=\"flex items-center gap-2\" variant=\"h6\">\n {t(\"filters\")}\n {activeFilterCount > 0 && (\n <span className=\"ml-2 px-2 py-0.5 text-xs rounded-full bg-primary text-white\">\n {activeFilterCount}\n </span>\n )}\n </DialogTitle>\n\n <DialogContent >\n {filterableProperties.length === 0 ? (\n <Typography color=\"secondary\" className=\"py-8 text-center\">\n {t(\"no_filterable_properties\")}\n </Typography>\n ) : (\n <table className=\"w-full border-collapse\">\n <tbody>\n {filterableProperties.map(([propertyKey, property], index) => {\n const hasFilter = propertyKey in localFilters;\n\n return (\n <tr key={propertyKey} className={cls(\n index > 0 && \"border-t\",\n defaultBorderMixin\n )}>\n {/* Property name on the left */}\n <td className=\"py-3 pr-4 align-middle w-[160px]\">\n <Typography\n variant=\"body2\"\n className={cls(\n \"font-medium\",\n hasFilter && \"text-primary\"\n )}\n >\n {property.name || propertyKey}\n </Typography>\n </td>\n\n {/* FilterIcon field on the right */}\n <td className=\"py-3\">\n {renderFilterField(propertyKey, property)}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n </DialogContent>\n\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={handleClearAll}\n disabled={activeFilterCount === 0}\n >\n {t(\"clear_all\")}\n </Button>\n <div className=\"flex-grow\"/>\n <Button\n variant=\"text\"\n onClick={() => onOpenChange(false)}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n variant=\"filled\"\n onClick={handleApply}\n >\n {t(\"apply_filters\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { CheckIcon, ChevronsUpDownIcon, cls, FilterChip, Menu, MenuItem, Tooltip } from \"@rebasepro/ui\";\nimport type { EntityTableController, FilterValues, FilterPreset } from \"@rebasepro/types\";\n\nexport interface FilterPresetsButtonProps<M extends Record<string, unknown>> {\n filterPresets: FilterPreset<Extract<keyof M, string> | (string & {})>[];\n tableController: EntityTableController<M>;\n compact?: boolean;\n}\n\n/**\n * Maximum number of presets shown as inline toggle chips before the\n * rest are collapsed into an overflow menu.\n */\nconst MAX_VISIBLE_PRESETS = 4;\n\n/** Max characters for a chip label before truncation. */\nconst MAX_LABEL_LENGTH = 22;\n\n// ─── Helpers ────────────────────────────────────────────────────────\n\n/**\n * Deep equality without JSON.stringify.\n * Handles primitives, arrays, Dates, and plain objects recursively.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === \"object\" && typeof b === \"object\") {\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bKeys = Object.keys(b as Record<string, unknown>);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(k =>\n deepEqual(\n (a as Record<string, unknown>)[k],\n (b as Record<string, unknown>)[k]\n )\n );\n }\n return false;\n}\n\n/**\n * Check if a preset's filters are a subset of the controller's\n * current filter values (key-by-key deep comparison on the tuples).\n */\nfunction isPresetActive(\n preset: FilterPreset<string>,\n controllerFilters: Record<string, unknown> | undefined\n): boolean {\n if (!controllerFilters) return false;\n const entries = Object.entries(preset.filterValues);\n if (entries.length === 0) return false;\n for (const [key, presetTuple] of entries) {\n const controllerTuple = controllerFilters[key];\n if (!controllerTuple || !presetTuple) return false;\n if (!deepEqual(presetTuple, controllerTuple)) return false;\n }\n return true;\n}\n\n/**\n * Generate a human-readable label from filter keys when no explicit label is provided.\n */\nfunction generateLabel(filterValues: FilterValues<string>): string {\n const keys = Object.keys(filterValues);\n if (keys.length === 0) return \"Filter\";\n if (keys.length === 1) return keys[0].replace(/_/g, \" \");\n if (keys.length === 2) return keys.map(k => k.replace(/_/g, \" \")).join(\" + \");\n return `${keys[0].replace(/_/g, \" \")} +${keys.length - 1}`;\n}\n\n/**\n * Truncate a label if it exceeds MAX_LABEL_LENGTH.\n */\nfunction truncateLabel(label: string): { display: string; truncated: boolean } {\n if (label.length <= MAX_LABEL_LENGTH) return { display: label,\ntruncated: false };\n return { display: label.slice(0, MAX_LABEL_LENGTH - 1) + \"…\",\ntruncated: true };\n}\n\n// ─── Overflow Menu ──────────────────────────────────────────────────\n\ninterface OverflowMenuProps {\n presets: { preset: FilterPreset<string>; originalIndex: number }[];\n activeSet: Set<number>;\n onToggle: (index: number) => void;\n}\n\nfunction OverflowMenu({ presets, activeSet, onToggle }: OverflowMenuProps) {\n const activeCount = presets.filter(p => activeSet.has(p.originalIndex)).length;\n\n const trigger = (\n <FilterChip\n active={activeCount > 0}\n icon={<ChevronsUpDownIcon size={12} />}\n >\n +{presets.length}\n </FilterChip>\n );\n\n return (\n <Menu trigger={trigger} side=\"bottom\" align=\"start\">\n <div className=\"min-w-[180px] max-w-[300px] max-h-[320px] overflow-y-auto\">\n {presets.map(({ preset, originalIndex }) => {\n const rawLabel = preset.label ?? generateLabel(preset.filterValues as FilterValues<string>);\n const active = activeSet.has(originalIndex);\n\n return (\n <MenuItem\n key={originalIndex}\n dense\n onClick={() => onToggle(originalIndex)}\n className={cls(active && \"bg-primary/10 dark:bg-primary/20\")}\n >\n <span className=\"flex items-center gap-2 w-full min-w-0\">\n {active && <CheckIcon size={14} className=\"text-primary shrink-0\" />}\n <span className={cls(\"truncate\", active ? \"text-primary font-medium\" : \"\")}>\n {rawLabel}\n </span>\n </span>\n </MenuItem>\n );\n })}\n </div>\n </Menu>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────\n\n/**\n * Filter Presets — displayed as inline toggle chips in the collection toolbar.\n *\n * Active state is **derived** from the controller's actual filter values,\n * not tracked locally. A chip is \"active\" when ALL of its filter entries\n * match the current controller state (deep value comparison, no JSON.stringify).\n *\n * This means:\n * - Toggling a preset on adds its filters to the controller.\n * - Toggling it off removes its filter keys.\n * - Changing filters via the dialog automatically deactivates unmatched chips.\n * - Clearing all filters deactivates all chips.\n * - Multiple presets can be active simultaneously.\n */\nexport function FilterPresetsButton<M extends Record<string, unknown>>({\n filterPresets,\n tableController,\n compact\n}: FilterPresetsButtonProps<M>) {\n\n // ── Derive active state from controller ─────────────────────────\n const activeSet = useMemo(() => {\n const set = new Set<number>();\n if (!filterPresets.length || !tableController.setFilterValues) return set;\n for (let i = 0; i < filterPresets.length; i++) {\n if (isPresetActive(\n filterPresets[i] as FilterPreset<string>,\n tableController.filterValues as Record<string, unknown> | undefined\n )) {\n set.add(i);\n }\n }\n return set;\n }, [filterPresets, tableController.filterValues, tableController.setFilterValues]);\n\n // ── Toggle handler ──────────────────────────────────────────────\n const handleToggle = useCallback((index: number) => {\n const preset = filterPresets[index] as FilterPreset<string>;\n const currentFilters = { ...(tableController.filterValues ?? {}) } as Record<string, [string, unknown]>;\n const wasActive = isPresetActive(preset, currentFilters);\n\n if (wasActive) {\n // Toggle OFF: remove this preset's filter keys\n for (const key of Object.keys(preset.filterValues)) {\n delete currentFilters[key];\n }\n // Re-apply overlapping keys from other still-active presets\n for (let i = 0; i < filterPresets.length; i++) {\n if (i === index) continue;\n const other = filterPresets[i] as FilterPreset<string>;\n if (isPresetActive(other, currentFilters)) {\n Object.assign(currentFilters, other.filterValues);\n }\n }\n } else {\n // Toggle ON: merge this preset's filters on top\n Object.assign(currentFilters, preset.filterValues);\n }\n\n // Apply\n if (Object.keys(currentFilters).length === 0) {\n if (tableController.clearFilter) {\n tableController.clearFilter();\n } else {\n tableController.setFilterValues?.(\n {} as FilterValues<Extract<keyof M, string> | (string & {})>\n );\n }\n tableController.setSortBy?.(undefined);\n } else {\n tableController.setFilterValues?.(\n currentFilters as FilterValues<Extract<keyof M, string> | (string & {})>\n );\n\n // Resolve sort: use the toggled preset's sort if toggling on,\n // otherwise find sort from remaining active presets\n if (!wasActive && preset.sort) {\n tableController.setSortBy?.(\n preset.sort as [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"]\n );\n } else if (wasActive) {\n let remainingSort: [string, \"asc\" | \"desc\"] | undefined;\n for (let i = 0; i < filterPresets.length; i++) {\n if (i === index) continue;\n const other = filterPresets[i] as FilterPreset<string>;\n if (isPresetActive(other, currentFilters) && other.sort) {\n remainingSort = other.sort;\n }\n }\n tableController.setSortBy?.(\n remainingSort as [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"] | undefined\n );\n }\n }\n }, [filterPresets, tableController]);\n\n // ── Guard (after hooks to preserve Rules of Hooks) ──────────────\n if (!filterPresets.length || !tableController.setFilterValues) return null;\n\n // ── Split visible vs overflow ───────────────────────────────────\n const maxVisible = compact ? 2 : MAX_VISIBLE_PRESETS;\n const needsOverflow = filterPresets.length > maxVisible;\n const visibleCount = needsOverflow ? maxVisible - 1 : filterPresets.length;\n\n const visiblePresets = filterPresets.slice(0, visibleCount);\n const overflowPresets = needsOverflow\n ? filterPresets.slice(visibleCount).map((preset, i) => ({\n preset: preset as FilterPreset<string>,\n originalIndex: visibleCount + i\n }))\n : [];\n\n const hasOverflow = overflowPresets.length > 0;\n\n return (\n <div className=\"flex items-center gap-1 min-w-0 overflow-hidden\">\n {/* Scrollable chip area — on narrow screens chips scroll,\n on desktop there's enough space so no scroll occurs.\n py-0.5 gives the inset shadow breathing room inside the clip area. */}\n <div\n className=\"flex items-center gap-1 min-w-0 overflow-x-auto py-0.5\"\n style={{ scrollbarWidth: \"none\" }}\n >\n {visiblePresets.map((preset, index) => {\n const rawLabel = preset.label ?? generateLabel(preset.filterValues as FilterValues<string>);\n const { display, truncated } = truncateLabel(rawLabel);\n const active = activeSet.has(index);\n\n const chip = (\n <FilterChip\n key={index}\n active={active}\n onClick={() => handleToggle(index)}\n size=\"small\"\n >\n {display}\n </FilterChip>\n );\n\n if (truncated) {\n return <Tooltip key={index} title={rawLabel}>{chip}</Tooltip>;\n }\n return chip;\n })}\n </div>\n\n {/* Overflow button — always pinned outside the scroll area */}\n {hasOverflow && (\n <OverflowMenu\n presets={overflowPresets}\n activeSet={activeSet}\n onToggle={handleToggle}\n />\n )}\n </div>\n );\n}\n","import type { Properties } from \"@rebasepro/types\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useState, useCallback } from \"react\";\nimport { useAuthController, useLargeLayout, useTranslation, useSlot } from \"@rebasepro/app\";\nimport { CollectionActionsProps, EntityTableController, SelectionController } from \"@rebasepro/types\";\nimport { ErrorBoundary, iconSize } from \"@rebasepro/ui\";\nimport { ArrowLeftIcon, Badge, Button, cls, FilterIcon, IconButton, Tooltip } from \"@rebasepro/ui\";\nimport { ClearFilterSortButton } from \"../ClearFilterSortButton\";\nimport { FiltersDialog } from \"./FiltersDialog\";\nimport { FilterPresetsButton } from \"./FilterPresetsButton\";\nimport { toArray } from \"@rebasepro/utils\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useUrlController } from \"../../hooks/navigation/contexts/UrlContext\";\nimport { useCMSContext } from \"../../hooks/useCMSContext\";\nimport { withViewMode } from \"../../util/view_mode\";\n\nexport type CollectionViewStartActionsProps<M extends Record<string, unknown>> = {\n collection: CollectionConfig<M>;\n path: string;\n relativePath: string;\n parentCollectionSlugs: string[], parentEntityIds: string[];\n selectionController: SelectionController<M>;\n tableController: EntityTableController<M>;\n collectionEntitiesCount?: number;\n /**\n * Resolved properties from the collection for the filters dialog\n */\n resolvedProperties?: Properties;\n compact?: boolean;\n openNewDocument: (defaultValues?: Record<string, unknown>) => void;\n}\n\nexport function CollectionViewStartActions<M extends Record<string, unknown>>({\n collection,\n relativePath,\n parentCollectionSlugs, parentEntityIds,\n path,\n selectionController,\n tableController,\n collectionEntitiesCount,\n resolvedProperties,\n compact,\n openNewDocument\n}: CollectionViewStartActionsProps<M>) {\n\n const context = useCMSContext();\n const largeLayout = useLargeLayout();\n const { t } = useTranslation();\n\n const navigate = useNavigate();\n const urlController = useUrlController();\n\n // Filters dialog state\n const [filtersDialogOpen, setFiltersDialogOpen] = useState(false);\n\n // Count active filters (excluding force filters)\n const filterValues = tableController.filterValues;\n const fixedFilter = collection.fixedFilter;\n const activeFilterCount = filterValues\n ? Object.keys(filterValues).filter(key => !fixedFilter || !(key in fixedFilter)).length\n : 0;\n\n const actionProps: CollectionActionsProps<M> = {\n path,\n relativePath,\n parentCollectionSlugs,\nparentEntityIds,\n collection,\n selectionController,\n context,\n tableController,\n collectionEntitiesCount,\n openNewDocument\n };\n\n const handleBackClick = useCallback(() => {\n navigate(withViewMode(urlController.buildUrlCollectionPath(path)));\n }, [navigate, urlController, path]);\n\n const backButton = compact && (\n <Tooltip title={t(\"back\")} key={\"back_tooltip\"}>\n <IconButton\n size=\"small\"\n onClick={handleBackClick}\n className=\"mr-1\"\n >\n <ArrowLeftIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n );\n\n const filtersButton = resolvedProperties && tableController.setFilterValues && (\n <Tooltip title={t(\"filters\")}\n key={\"filters_tooltip\"}>\n <Badge\n color=\"primary\"\n invisible={activeFilterCount === 0}\n >\n {largeLayout && !compact ? (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setFiltersDialogOpen(true)}\n startIcon={<FilterIcon size={iconSize.small}/>}\n className={cls(activeFilterCount > 0 && \"text-primary\")}\n >\n {activeFilterCount > 0 ? `(${activeFilterCount})` : t(\"filters\")}\n </Button>\n ) : (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setFiltersDialogOpen(true)}\n className={cls(activeFilterCount > 0 && \"text-primary\")}\n >\n <FilterIcon size={iconSize.small}/>\n </Button>\n )}\n </Badge>\n </Tooltip>\n );\n\n const filterPresetsButton = collection.filterPresets?.length ? (\n <FilterPresetsButton\n key={\"filter_presets\"}\n filterPresets={collection.filterPresets}\n tableController={tableController}\n compact={compact}\n />\n ) : null;\n\n const actions: React.ReactNode[] = [\n backButton,\n filtersButton,\n <ClearFilterSortButton\n key={\"clear_filter\"}\n tableController={tableController}\n enabled={!collection.fixedFilter}/>,\n filterPresetsButton\n ];\n\n const pluginActionsStart = useSlot(\"collection.actions.start\", actionProps);\n\n return (\n <>\n {actions}\n {pluginActionsStart}\n\n {/* Filters Dialog */}\n {resolvedProperties && tableController.setFilterValues && (\n <FiltersDialog\n open={filtersDialogOpen}\n onOpenChange={setFiltersDialogOpen}\n properties={resolvedProperties}\n filterValues={tableController.filterValues}\n setFilterValues={(filterValues) => tableController.setFilterValues?.(filterValues ?? {})}\n fixedFilter={collection.fixedFilter}\n />\n )}\n </>\n );\n}\n\n","import type { AdditionalFieldDelegate, EntityAction, CollectionConfig, Property } from \"@rebasepro/types\";\nimport {\n CollectionSize,\n Entity,\n EntityReference,\n EntityTableController,\n FilterValues,\n getCollectionDataPath,\n PartialCollectionConfig,\n ViewMode\n} from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\n\nimport { deepEqual as equal } from \"fast-equals\"\nimport { CollectionRowActions, CollectionTableBinding } from \"../CollectionTableBinding\";\nimport { CollectionTableToolbar } from \"../CollectionTableBinding/internal/CollectionTableToolbar\";\nimport { getSubcollections } from \"@rebasepro/common\";\nimport { useCollectionInlineEditor } from \"./hooks/useCollectionInlineEditor\";\nimport { navigateToEntity } from \"../../util/navigation_utils\";\nimport { mergeEntityActions } from \"../../util/entity_actions\";\nimport { resolveEntityAction } from \"../../util/resolutions\";\nimport { getPropertyInPath } from \"../../util/property_utils\";\nimport { ReferencePreview } from \"../../preview\";\nimport {\n CollectionScopeProvider,\n OnColumnResizeParams,\n useAnalyticsController,\n useAuthController,\n useColumnIds,\n useComponentOverride,\n useCustomizationController,\n useData,\n useDataTableController,\n useLargeLayout,\n usePermissions,\n useScrollRestoration,\n useSlot,\n useTranslation,\n useUserConfigurationPersistence\n} from \"@rebasepro/app\";\nimport { CollectionViewActions } from \"./CollectionViewActions\";\nimport { CollectionCardViewBinding } from \"./CollectionCardViewBinding\";\nimport { CollectionListViewBinding } from \"./CollectionListViewBinding\";\nimport { SplitListView } from \"./SplitListView\";\nimport { CollectionBoardViewBinding } from \"./CollectionBoardViewBinding\";\nimport { KanbanPropertyOption, ViewModeToggle } from \"./ViewModeToggle\";\nimport {\n ArrowRightToLineIcon,\n Button,\n cls,\n ErrorBoundary,\n focusedDisabled,\n IconButton,\n iconSize,\n PlusIcon,\n Popover,\n SearchIcon,\n TextField,\n Tooltip,\n Typography,\n VirtualTableColumn\n} from \"@rebasepro/ui\";\nimport { getSubcollectionColumnId } from \"../CollectionTableBinding/internal/common\";\nimport { copyEntityAction, deleteEntityAction, editEntityAction } from \"../common/default_entity_actions\";\nimport { PopupFormField } from \"../CollectionTableBinding/internal/popup_field/PopupFormField\";\nimport { GetPropertyForProps } from \"../CollectionTableBinding/CollectionTableBindingProps\";\nimport { DeleteEntityDialog } from \"../DeleteEntityDialog\";\nimport { useSelectionController } from \"./useSelectionController\";\nimport { CollectionViewStartActions } from \"./CollectionViewStartActions\";\nimport { addRecentId, getRecentIds } from \"./utils\";\nimport { isViewMode, OpenEntityMode, resolveOpenEntityMode, VIEW_MODE_PARAM } from \"../../util/view_mode\";\nimport { mergeDeep } from \"@rebasepro/utils\";\nimport { useBreadcrumbsController } from \"../../hooks/useBreadcrumbsController\";\nimport { useCMSContext } from \"../../hooks/useCMSContext\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useSidePanel } from \"../../hooks/useSidePanel\";\nimport { useUrlController } from \"../../hooks/navigation/contexts/UrlContext\";\n\nconst EMPTY_ARRAY: never[] = [];\n\n/**\n * @group Components\n */\nexport type CollectionViewBindingProps<M extends Record<string, unknown>> = {\n /**\n * Complete path where this collection is located.\n * It defaults to the collection path if not provided.\n */\n path?: string;\n /**\n * Full path using navigation ids.\n */\n idPath?: string;\n /**\n * If this is a subcollection, specify the parent collection ids.\n */\n parentCollectionSlugs?: string[], parentEntityIds?: string[];\n /**\n * Whether this is a subcollection or not.\n */\n isSubCollection?: boolean;\n\n className?: string;\n\n /**\n * If true, this view will store its filter and sorting status in the url params\n */\n updateUrl?: boolean;\n\n /**\n * When provided, the split view will render this entity's detail panel.\n * Used by the router to pass the entity ID from the URL path.\n */\n selectedEntityId?: string | number;\n\n /**\n * When provided, the split view will open this tab (e.g. a subcollection slug)\n * in the entity detail panel. Used by the router to pass the subcollection from the URL.\n */\n selectedTab?: string;\n\n} & CollectionConfig<M>;\n\n/**\n * This component is in charge of binding a driver path with an {@link CollectionConfig}\n * where it's configuration is defined. It includes an infinite scrolling table\n * and a 'Add' new entities button,\n *\n * This component is the default one used for displaying entity collections\n * and is in charge of generating all the specific actions and customization\n * of the lower level {@link CollectionTableBinding}\n *\n * Please **note** that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you need a lower level implementation with more granular options, you\n * can use {@link CollectionTableBinding}.\n *\n * If you need a generic table that is not bound to the driver or entities and\n * properties at all, you can check {@link VirtualTable}\n *\n * @param path\n * @param collection\n\n * @group Components\n */\nconst CollectionViewBindingInner = React.memo(\n function CollectionViewBindingInner<M extends Record<string, unknown>>({\n path: pathProp,\n\n parentCollectionSlugs, parentEntityIds,\n isSubCollection,\n className,\n updateUrl,\n selectedEntityId: selectedEntityIdProp,\n selectedTab: selectedTabProp,\n ...collectionProp\n }: CollectionViewBindingProps<M>\n ) {\n\n const { t } = useTranslation();\n const context = useCMSContext();\n const collectionRegistry = useCollectionRegistryController();\n const urlController = useUrlController();\n const breadcrumbs = useBreadcrumbsController();\n const path = pathProp ?? getCollectionDataPath(collectionProp);\n const dataClient = useData();\n const sidePanelController = useSidePanel();\n const authController = useAuthController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const analyticsController = useAnalyticsController();\n const customizationController = useCustomizationController();\n const { canCreate, canEdit, canDelete } = usePermissions();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const scrollRestoration = useScrollRestoration();\n\n const collection = useMemo(() => {\n const registryCollection = collectionRegistry.getCollection(path) || collectionProp;\n const userOverride = userConfigPersistence?.getCollectionConfig<M>(path);\n return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as CollectionConfig<M>;\n }, [collectionProp, path, userConfigPersistence, collectionRegistry]);\n\n const collectionRef = React.useRef(collection);\n useEffect(() => {\n collectionRef.current = collection;\n }, [collection]);\n\n const canCreateEntities = canCreate(collection, path);\n const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);\n const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);\n\n const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);\n\n // Track recently deleted entities for optimistic Kanban count updates\n const [deletedEntities, setDeletedEntities] = React.useState<Entity<M>[]>([]);\n\n // number of entities in the collection (undefined = loading)\n const [docsCount, setDocsCount] = useState<number | null | undefined>(null);\n\n // Optimistic state for column order to prevent UI flickering during persistence\n const [localPropertiesOrder, setLocalPropertiesOrder] = useState<string[] | undefined>(collection.propertiesOrder);\n\n // Sync local state with collection's propertiesOrder when it changes from external sources\n useEffect(() => {\n setLocalPropertiesOrder(collection.propertiesOrder);\n }, [collection.propertiesOrder]);\n\n const unselectNavigatedEntity = useCallback(() => {\n const currentSelection = highlightedEntity;\n setTimeout(() => {\n if (currentSelection === highlightedEntity)\n setHighlightedEntity(undefined);\n }, 2400);\n }, [highlightedEntity]);\n\n const checkInlineEditing = useCallback((entity?: Entity<M>): boolean => {\n const collection = collectionRef.current;\n if (!canEdit(collection, path, entity ?? null)) {\n return false;\n }\n return collection.inlineEditing === undefined || collection.inlineEditing;\n }, [canEdit, path]);\n\n const selectionEnabled = collection.selectionEnabled === undefined || collection.selectionEnabled;\n const hoverRow = !checkInlineEditing();\n\n const [popOverOpen, setPopOverOpen] = useState(false);\n\n // View mode priority: URL > saved user config > collection.defaultViewMode\n const defaultViewMode = collection.defaultViewMode ?? \"list\";\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Read view from React Router's searchParams (reactive on back/forward)\n const urlView = useMemo((): ViewMode | null => {\n const v = searchParams.get(VIEW_MODE_PARAM);\n return isViewMode(v) ? v : null;\n }, [searchParams]);\n\n // Get saved view from local persistence\n const getSavedView = useCallback((): ViewMode | null => {\n const saved = userConfigPersistence?.getCollectionConfig<M>(path)?.defaultViewMode;\n return (saved as ViewMode) ?? null;\n }, [userConfigPersistence, path]);\n\n const [viewMode, setViewModeState] = useState<ViewMode>(() => {\n // Priority: URL > saved config > collection default\n if (urlView) return urlView;\n const savedView = getSavedView();\n if (savedView) return savedView;\n return defaultViewMode;\n });\n\n const openEntityMode = resolveOpenEntityMode({\n collection,\n viewMode\n });\n\n // Sync URL with current view on init (if view came from saved config)\n useEffect(() => {\n if (!urlView && viewMode !== defaultViewMode) {\n // View came from saved config but URL doesn't have it - update URL without push\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(VIEW_MODE_PARAM, viewMode);\n return next;\n }, { replace: true });\n }\n }, []); // Only on mount\n\n // Update URL when view mode changes (user action)\n const setViewMode = useCallback((newMode: ViewMode) => {\n setViewModeState(newMode);\n\n // Update URL with __view param via React Router\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n if (newMode === defaultViewMode) {\n next.delete(VIEW_MODE_PARAM);\n } else {\n next.set(VIEW_MODE_PARAM, newMode);\n }\n return next;\n });\n }, [defaultViewMode, setSearchParams]);\n\n // Sync viewMode state when URL changes via back/forward navigation\n useEffect(() => {\n if (urlView) {\n setViewModeState(urlView);\n } else {\n const savedView = getSavedView();\n setViewModeState(savedView ?? defaultViewMode);\n }\n }, [urlView, getSavedView, defaultViewMode]);\n\n // List view size state - controls row height and info density\n const [listSize, setListSize] = useState<CollectionSize>(collection.defaultSize ?? \"m\");\n\n // Card view size state - controls the grid column count\n const [cardSize, setCardSize] = useState<CollectionSize>(collection.defaultSize ?? \"m\");\n\n // Table view size state - controls row height\n const [tableSize, setTableSize] = useState<CollectionSize>(collection.defaultSize ?? \"m\");\n\n const selectionController = useSelectionController<M>();\n const usedSelectionController = collection.selectionController ?? selectionController;\n const {\n selectedEntities,\n setSelectedEntities\n } = usedSelectionController;\n\n const tableController = useDataTableController<M>({\n path,\n collection,\n lastDeleteTimestamp,\n scrollRestoration,\n updateUrl\n });\n\n const tableKey = React.useRef<string>(Math.random().toString(36));\n const popupCell = tableController.popupCell as {\n entityId: string | number;\n propertyKey: Extract<keyof M, string>;\n cellRect?: DOMRect;\n } | undefined;\n\n const onPopupClose = useCallback(() => {\n tableController.setPopupCell?.(undefined);\n }, [tableController.setPopupCell]);\n\n const onEntityClick = useCallback((clickedEntity: Entity<M>) => {\n const collection = collectionRef.current;\n setHighlightedEntity(clickedEntity);\n analyticsController.onAnalyticsEvent?.(\"edit_entity_clicked\", {\n path: clickedEntity.path,\n entityId: clickedEntity.id\n });\n\n if (collection) {\n addRecentId(collection.slug, clickedEntity.id);\n }\n\n const entityPath = path ?? clickedEntity.path;\n navigateToEntity({\n navigation: urlController,\n path: entityPath,\n sidePanelController,\n openEntityMode,\n collection,\n entityId: clickedEntity.id,\n replace: openEntityMode === \"split\" && selectedEntityIdProp !== undefined\n });\n\n }, [sidePanelController, openEntityMode, selectedEntityIdProp, path, urlController, analyticsController]);\n\n const onNewClick = useCallback(() => {\n const collection = collectionRef.current;\n analyticsController.onAnalyticsEvent?.(\"new_entity_click\", {\n path: path\n });\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: undefined,\n path: path,\n sidePanelController,\n navigation: urlController,\n onClose: unselectNavigatedEntity\n })\n }, [path, sidePanelController]);\n\n const openNewDocument = useCallback((defaultValues?: Record<string, unknown>) => {\n const collection = collectionRef.current;\n analyticsController.onAnalyticsEvent?.(\"new_entity_click\", {\n path: path\n });\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: undefined,\n defaultValues,\n path: path,\n sidePanelController,\n navigation: urlController,\n onClose: unselectNavigatedEntity\n });\n }, [path, sidePanelController, openEntityMode, urlController, unselectNavigatedEntity]);\n\n const onMultipleDeleteClick = () => {\n analyticsController.onAnalyticsEvent?.(\"multiple_delete_dialog_open\", {\n path: path\n });\n setDeleteEntityClicked(selectedEntities);\n };\n\n const internalOnEntityDelete = (_path: string, entity: Entity<M>) => {\n analyticsController.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path: path\n });\n setSelectedEntities((selectedEntities) => selectedEntities.filter((e) => e.id !== entity.id));\n setDeletedEntities(prev => [...prev, entity]);\n setLastDeleteTimestamp(Date.now());\n };\n\n const internalOnMultipleEntitiesDelete = (_path: string, entities: Entity<M>[]) => {\n analyticsController.onAnalyticsEvent?.(\"multiple_entities_deleted\", {\n path: path\n });\n setSelectedEntities([]);\n setDeleteEntityClicked(undefined);\n setDeletedEntities(prev => [...prev, ...entities]);\n setLastDeleteTimestamp(Date.now());\n };\n\n const pluginAddColumnComponents = useSlot(\"collection.add-column\", {\n path,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\nparentEntityIds: parentEntityIds ?? EMPTY_ARRAY,\n collection,\n tableController\n });\n\n const pluginToolbarWidgets = useSlot(\"collection.toolbar\", {\n path,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\nparentEntityIds: parentEntityIds ?? EMPTY_ARRAY,\n collection: collection,\n tableController: tableController,\n selectionController: usedSelectionController\n });\n\n const pluginEmptyStates = useSlot(\"collection.empty-state\", {\n path,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\nparentEntityIds: parentEntityIds ?? EMPTY_ARRAY,\n collection,\n canCreate: canCreateEntities,\n onNewClick\n });\n\n const pluginInsights = useSlot(\"collection.insights\", {\n path,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\nparentEntityIds: parentEntityIds ?? EMPTY_ARRAY,\n collection\n });\n\n const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialCollectionConfig<M>) => {\n if (userConfigPersistence) {\n const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);\n const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);\n userConfigPersistence.onCollectionModified(path, updatedConfig);\n }\n }, [userConfigPersistence]);\n\n const onColumnResize = useCallback(({\n width,\n key\n }: OnColumnResizeParams) => {\n\n const collection = collectionRef.current;\n // Only for property columns\n if (!getPropertyInPath(collection.properties, key)) return;\n const localCollection = buildPropertyWidthOverwrite(key, width) as PartialCollectionConfig<M>;\n onCollectionModifiedForUser(path, localCollection);\n }, [onCollectionModifiedForUser, path]);\n\n const onListSizeChanged = useCallback((size: CollectionSize) => {\n setListSize(size);\n if (userConfigPersistence)\n onCollectionModifiedForUser(path, { defaultSize: size })\n }, [onCollectionModifiedForUser, path, userConfigPersistence]);\n\n const onTableSizeChanged = useCallback((size: CollectionSize) => {\n setTableSize(size);\n if (userConfigPersistence)\n onCollectionModifiedForUser(path, { defaultSize: size })\n }, [onCollectionModifiedForUser, path, userConfigPersistence]);\n\n // View mode change: update URL + save to local persistence\n const onViewModeChange = useCallback((mode: ViewMode) => {\n analyticsController.onAnalyticsEvent?.(\"view_mode_changed\", {\n path: path,\n from: viewMode,\n to: mode\n });\n setViewMode(mode);\n // Save to local persistence for next visit\n if (userConfigPersistence) {\n onCollectionModifiedForUser(path, { defaultViewMode: mode } as PartialCollectionConfig<M>);\n }\n }, [setViewMode, userConfigPersistence, onCollectionModifiedForUser, path, analyticsController, viewMode]);\n\n const createEnabled = canCreate(collection, path);\n\n const { onValueChange, uniqueFieldValidator } = useCollectionInlineEditor({\n path,\n collection,\n dataClient,\n context\n });\n\n // In v4, collections are already resolved, so we use collection directly\n const resolvedCollection = collection;\n\n // Check if Kanban view is available (needs kanban.columnProperty with enum)\n const kanbanEnabled = useMemo(() => {\n if (!collection.kanban?.columnProperty) return false;\n const property = getPropertyInPath(resolvedCollection.properties, collection.kanban.columnProperty);\n if (!property || property.type !== \"string\") return false;\n return Boolean(\"enum\" in property && property.enum);\n }, [collection.kanban?.columnProperty, resolvedCollection.properties]);\n\n // Compute the effective enabled views:\n // - Start from collection.enabledViews (defaults to all three)\n // - Filter out kanban if no enum properties exist\n const hasEnumProperty = useMemo(() => {\n return Object.values(resolvedCollection.properties).some((p: Property) => p.type === \"string\" && \"enum\" in p && p.enum);\n }, [resolvedCollection.properties]);\n\n const enabledViews: ViewMode[] = useMemo(() => {\n const configured = collection.enabledViews ?? [\"list\", \"table\", \"cards\", \"kanban\"];\n if (!hasEnumProperty) {\n return configured.filter(v => v !== \"kanban\");\n }\n return configured;\n }, [collection.enabledViews, hasEnumProperty]);\n\n // Compute available enum properties for kanban column selection\n const kanbanPropertyOptions: KanbanPropertyOption[] = useMemo(() => {\n const options: KanbanPropertyOption[] = [];\n const properties = resolvedCollection.properties;\n\n for (const [key, property] of Object.entries(properties)) {\n const prop = property;\n if (prop && prop.type === \"string\" && \"enum\" in prop && prop.enum) {\n options.push({\n key,\n label: prop.name || key\n });\n }\n }\n\n return options;\n }, [resolvedCollection.properties]);\n\n // Get saved kanban property from user config\n const getSavedKanbanProperty = useCallback((): string | undefined => {\n const saved = userConfigPersistence?.getCollectionConfig<M>(path);\n return (saved as Record<string, unknown>)?.kanbanColumnProperty as string | undefined;\n }, [userConfigPersistence, path]);\n\n // Selected kanban property state - priority: saved config > collection default > first available\n const [selectedKanbanProperty, setSelectedKanbanProperty] = useState<string>(() => {\n const saved = getSavedKanbanProperty();\n if (saved && kanbanPropertyOptions.some(o => o.key === saved)) return saved;\n if (collection.kanban?.columnProperty) return collection.kanban.columnProperty;\n return kanbanPropertyOptions[0]?.key ?? \"\";\n });\n\n // Update selected property if options change and current selection is no longer valid\n useEffect(() => {\n if (kanbanPropertyOptions.length > 0 && !kanbanPropertyOptions.some(o => o.key === selectedKanbanProperty)) {\n const saved = getSavedKanbanProperty();\n if (saved && kanbanPropertyOptions.some(o => o.key === saved)) {\n setSelectedKanbanProperty(saved);\n } else if (collection.kanban?.columnProperty && kanbanPropertyOptions.some(o => o.key === collection.kanban?.columnProperty)) {\n setSelectedKanbanProperty(collection.kanban.columnProperty);\n } else {\n setSelectedKanbanProperty(kanbanPropertyOptions[0]?.key ?? \"\");\n }\n }\n }, [kanbanPropertyOptions, selectedKanbanProperty, getSavedKanbanProperty, collection.kanban?.columnProperty]);\n\n // Handle kanban property change\n const onKanbanPropertyChange = useCallback((property: string) => {\n analyticsController.onAnalyticsEvent?.(\"kanban_property_changed\", {\n path: path,\n property\n });\n setSelectedKanbanProperty(property);\n // Save to local persistence\n if (userConfigPersistence) {\n onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as PartialCollectionConfig<M>);\n }\n }, [userConfigPersistence, onCollectionModifiedForUser, path, analyticsController]);\n\n const getPropertyFor = useCallback(({\n propertyKey,\n entity\n }: GetPropertyForProps<M>) => {\n let property: Property | undefined = getPropertyInPath(collection.properties, propertyKey);\n\n // we might not find the property in the collection if combining property builders and map spread\n if (!property) {\n // these 2 properties are coming from the resolved collection with default values\n property = getPropertyInPath(resolvedCollection.properties, propertyKey);\n }\n\n\n // In v4, properties are already resolved, so we return them directly\n return property ?? null;\n }, [collection.properties, resolvedCollection.properties]);\n\n // Use a collection with local propertiesOrder for optimistic UI updates\n const collectionWithLocalOrder = useMemo(() => {\n if (localPropertiesOrder && localPropertiesOrder !== resolvedCollection.propertiesOrder) {\n return {\n ...resolvedCollection,\n propertiesOrder: localPropertiesOrder\n };\n }\n return resolvedCollection;\n }, [resolvedCollection, localPropertiesOrder]);\n\n const displayedColumnIds = useColumnIds(collectionWithLocalOrder, true);\n\n const additionalFields = useMemo(() => {\n // v4: use getSubcollections helper to access subcollections\n const subcollectionsList = getSubcollections(collection);\n const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: CollectionConfig) => {\n return {\n key: getSubcollectionColumnId(subcollection),\n name: subcollection.name,\n width: 200,\n dependencies: [],\n Builder: ({ entity }: { entity: Entity }) => (\n <Button\n className={\"max-w-full truncate justify-start\"}\n startIcon={<ArrowRightToLineIcon size={iconSize.small}/>}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: entity.id,\n selectedTab: subcollection.slug,\n path: path,\n navigation: urlController,\n sidePanelController\n })\n }}>\n {subcollection.name}\n </Button>\n )\n };\n }) ?? EMPTY_ARRAY;\n\n return [\n ...(collection.additionalFields ?? EMPTY_ARRAY),\n ...subcollectionColumns\n ];\n }, [collection, path, sidePanelController]);\n\n const updateLastDeleteTimestamp = useCallback(() => {\n setLastDeleteTimestamp(Date.now());\n }, []);\n\n const largeLayout = useLargeLayout();\n\n const isSplitLayout = openEntityMode === \"split\";\n const isCompact = isSplitLayout && selectedEntityIdProp !== undefined;\n const activeSelectionEnabled = !isCompact && selectionEnabled;\n\n const getActionsForEntity = useCallback(({\n entity,\n customEntityActions\n }: {\n entity?: Entity<M>,\n customEntityActions?: EntityAction[]\n }): EntityAction[] => {\n const deleteEnabled = entity ? canDelete(collection, path, entity) : true;\n const disableActions = collection.disableDefaultActions ?? [];\n const actions: EntityAction[] = [];\n if (!disableActions.includes(\"edit\")) {\n actions.push(editEntityAction);\n }\n if (createEnabled && !disableActions.includes(\"copy\"))\n actions.push(copyEntityAction);\n if (deleteEnabled && !disableActions.includes(\"delete\"))\n actions.push(deleteEntityAction);\n if (customEntityActions)\n return mergeEntityActions(actions, customEntityActions);\n return actions;\n }, [canDelete, collection, path, createEnabled]);\n\n const getIdColumnWidth = useCallback(() => {\n const entityActions = getActionsForEntity({});\n const collapsedActions = entityActions.filter(a => a.collapsed !== false);\n const uncollapsedActions = entityActions.filter(a => a.collapsed === false);\n const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);\n return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);\n }, [getActionsForEntity, largeLayout]);\n\n const tableRowActionsBuilder = useCallback(({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n\n const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));\n const customEntityActions = (collection.entityActions ?? EMPTY_ARRAY)\n .map(action => resolveEntityAction(action, customizationController.entityActions))\n .filter(Boolean) as EntityAction<M>[];\n\n const actions = getActionsForEntity({\n entity,\n customEntityActions\n });\n\n return (\n <CollectionRowActions\n entity={entity}\n width={width}\n frozen={frozen}\n isSelected={isSelected}\n selectionEnabled={activeSelectionEnabled}\n size={size}\n highlightEntity={setHighlightedEntity}\n unhighlightEntity={unselectNavigatedEntity}\n collection={collection}\n path={path}\n actions={actions}\n hideId={collection?.hideIdFromCollection}\n onCollectionChange={updateLastDeleteTimestamp}\n selectionController={usedSelectionController}\n openEntityMode={openEntityMode}\n />\n );\n\n }, [updateLastDeleteTimestamp, usedSelectionController]);\n\n // Update breadcrumb count when count changes\n const updateCountRef = React.useRef(breadcrumbs.updateCount);\n updateCountRef.current = breadcrumbs.updateCount;\n useEffect(() => {\n updateCountRef.current(path, docsCount);\n }, [docsCount, path]);\n\n // EntitiesCount fetches count and updates breadcrumb - no visual rendering needed here\n const countFetcher = <EntitiesCount\n path={path}\n collection={collection}\n filter={tableController.filterValues}\n sortBy={tableController.sortBy}\n onCountChange={setDocsCount}\n />;\n\n const { resolvedSlots } = customizationController;\n\n // Pre-compute header action slot contributions (avoid useSlot inside callback)\n const headerActionContributions = useMemo(() => resolvedSlots\n .filter(s => s.slot === \"collection.header.action\")\n .sort((a, b) => (a.order ?? 50) - (b.order ?? 50)), [resolvedSlots]);\n\n const buildAdditionalHeaderWidget = useCallback(({\n property,\n propertyKey,\n onHover\n }: {\n property: Property,\n propertyKey: string,\n onHover: boolean\n }) => {\n const collection = collectionRef.current;\n const headerSlotProps = {\n property,\n propertyKey,\n onHover,\n path,\n collection: collection as CollectionConfig,\n tableController: tableController as EntityTableController,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\nparentEntityIds: parentEntityIds ?? EMPTY_ARRAY\n };\n return <>{headerActionContributions.map((s, i) => (\n <ErrorBoundary key={`header_action_${propertyKey}_${i}`}>\n <s.Component {...headerSlotProps} {...(s.props ?? {})}/>\n </ErrorBoundary>\n ))}</>;\n }, [headerActionContributions, path, parentCollectionSlugs]);\n\n const addColumnComponentInternal = pluginAddColumnComponents.length > 0\n ? function () {\n return (\n <div className=\"flex flex-row items-center gap-2\">\n {pluginAddColumnComponents}\n </div>\n );\n }\n : undefined;\n\n const onColumnsOrderChange = useCallback((newColumns: VirtualTableColumn[]) => {\n // Extract property keys from the new column order\n // Filter to only include actual property columns (not frozen columns, not additional fields, etc.)\n // Deduplicate to clean up any previously duplicated keys\n const seenKeys = new Set<string>();\n const newPropertiesOrder = newColumns\n .filter(col => !col.frozen && getPropertyInPath(collection.properties, col.key))\n .map(col => col.key)\n .filter(key => {\n if (seenKeys.has(key)) return false;\n seenKeys.add(key);\n return true;\n });\n\n // Optimistically update local state to prevent UI flickering\n setLocalPropertiesOrder(newPropertiesOrder);\n\n // Call each plugin's onColumnsReorder callback\n if (customizationController?.plugins) {\n customizationController.plugins\n .filter(plugin => plugin.hooks?.onColumnsReorder)\n .forEach(plugin => {\n plugin.hooks!.onColumnsReorder!({\n fullPath: path,\n parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,\n parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,\n collection,\n newPropertiesOrder\n });\n });\n }\n\n // Save to user configuration persistence (local storage)\n if (userConfigPersistence) {\n onCollectionModifiedForUser(path, { propertiesOrder: newPropertiesOrder } as PartialCollectionConfig<M>);\n }\n }, [collection, setLocalPropertiesOrder, customizationController, path, parentCollectionSlugs, parentEntityIds, userConfigPersistence, onCollectionModifiedForUser]);\n\n // Popover open state managed at parent level to prevent closing when view changes\n const [viewModePopoverOpen, setViewModePopoverOpen] = useState(false);\n\n // Create ViewModeToggle once to prevent remounting when view changes\n const viewModeToggleElement = (\n <ViewModeToggle\n viewMode={viewMode}\n onViewModeChange={onViewModeChange}\n enabledViews={enabledViews}\n size={viewMode === \"list\" ? listSize : viewMode === \"table\" ? tableSize : viewMode === \"cards\" ? cardSize : undefined}\n onSizeChanged={viewMode === \"list\" ? onListSizeChanged : viewMode === \"table\" ? onTableSizeChanged : viewMode === \"cards\" ? setCardSize : undefined}\n open={viewModePopoverOpen}\n onOpenChange={setViewModePopoverOpen}\n kanbanPropertyOptions={kanbanPropertyOptions}\n selectedKanbanProperty={selectedKanbanProperty}\n onKanbanPropertyChange={onKanbanPropertyChange}\n />\n );\n\n // Compute plugin-provided error view for collection loading errors\n const pluginErrorViews = useSlot(\"collection.error\", {\n path,\n collection,\n parentCollectionSlugs,\nparentEntityIds,\n error: tableController.dataLoadingError as Error\n });\n const pluginErrorView = tableController.dataLoadingError && pluginErrorViews.length > 0\n ? pluginErrorViews[0]\n : null;\n\n // Shared empty state — plugin slot takes priority, then override, then default\n const isSearching = !!tableController.searchString;\n const isFilteredOrSorted = tableController.filterValues !== undefined || tableController.sortBy !== undefined || isSearching;\n const ResolvedEmptyState = useComponentOverride(\"Collection.EmptyState\", DefaultCollectionEmptyState);\n const ResolvedCollectionActions = useComponentOverride(\"Collection.Actions\", CollectionViewActions);\n const ResolvedCollectionTable = useComponentOverride(\"Collection.Table\", CollectionTableBinding) as typeof CollectionTableBinding;\n const emptyComponent = pluginEmptyStates.length > 0\n ? <>{pluginEmptyStates}</>\n : <ResolvedEmptyState\n canCreate={canCreateEntities && !isFilteredOrSorted}\n onNewClick={onNewClick}\n isSearching={isSearching}\n searchString={tableController.searchString ?? \"\"}\n />;\n\n const toolbarNode = (\n <CollectionTableToolbar\n compact={isCompact}\n loading={tableController.dataLoading}\n onTextSearch={tableController.setSearchString}\n initialSearchText={tableController.searchString}\n viewModeToggle={viewModeToggleElement}\n actionsStart={<CollectionViewStartActions\n parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}\n collection={collection}\n tableController={tableController}\n path={path}\n relativePath={getCollectionDataPath(collection)}\n selectionController={usedSelectionController}\n collectionEntitiesCount={docsCount ?? undefined}\n resolvedProperties={resolvedCollection.properties}\n openNewDocument={openNewDocument}\n compact={isCompact}/>}\n actions={\n <ResolvedCollectionActions\n parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}\n collection={collection}\n tableController={tableController}\n onMultipleDeleteClick={onMultipleDeleteClick}\n onNewClick={onNewClick}\n openNewDocument={openNewDocument}\n path={path}\n relativePath={getCollectionDataPath(collection)}\n selectionController={usedSelectionController}\n selectionEnabled={activeSelectionEnabled}\n collectionEntitiesCount={docsCount ?? undefined}\n compact={isCompact}\n >\n {pluginToolbarWidgets}\n </ResolvedCollectionActions>\n }\n />\n ); const innerView = viewMode === \"kanban\" ? (\n <CollectionBoardViewBinding\n key={`kanban-view-${path}-${selectedKanbanProperty}`}\n collection={collection}\n tableController={tableController}\n fullPath={path}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n columnProperty={selectedKanbanProperty}\n onEntityClick={onEntityClick}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n highlightedEntities={highlightedEntity ? [highlightedEntity] : []}\n deletedEntities={deletedEntities}\n emptyComponent={emptyComponent}\n />\n ) : viewMode === \"cards\" ? (\n <CollectionCardViewBinding\n key={`cards-view-${path}`}\n collection={collection}\n tableController={tableController}\n onEntityClick={onEntityClick}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n highlightedEntities={highlightedEntity ? [highlightedEntity] : []}\n onScroll={tableController.onScroll}\n initialScroll={tableController.initialScroll}\n size={cardSize}\n emptyComponent={emptyComponent}\n />\n ) : viewMode === \"list\" ? (\n <CollectionListViewBinding\n key={`list-view-${path}`}\n collection={collection}\n tableController={tableController}\n onEntityClick={onEntityClick}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n highlightedEntities={highlightedEntity ? [highlightedEntity] : []}\n size={listSize}\n emptyComponent={emptyComponent}\n selectedEntityId={selectedEntityIdProp}\n getActionsForEntity={getActionsForEntity}\n path={path}\n openEntityMode={openEntityMode}\n />\n ) : (\n <ResolvedCollectionTable\n key={`collection_table_${path}`}\n hideToolbar={true}\n additionalFields={additionalFields}\n tableController={tableController}\n enablePopupIcon={true}\n displayedColumnIds={displayedColumnIds}\n onSizeChanged={onTableSizeChanged}\n onEntityClick={onEntityClick}\n onColumnResize={onColumnResize}\n onValueChange={onValueChange}\n tableRowActionsBuilder={tableRowActionsBuilder}\n uniqueFieldValidator={uniqueFieldValidator}\n selectionController={usedSelectionController}\n highlightedEntities={highlightedEntity ? [highlightedEntity] : []}\n defaultSize={tableSize}\n properties={resolvedCollection.properties}\n getPropertyFor={getPropertyFor}\n onScroll={tableController.onScroll}\n initialScroll={tableController.initialScroll}\n emptyComponent={emptyComponent}\n hoverRow={hoverRow}\n inlineEditing={checkInlineEditing()}\n AdditionalHeaderWidget={buildAdditionalHeaderWidget}\n AddColumnComponent={addColumnComponentInternal}\n getIdColumnWidth={getIdColumnWidth}\n additionalIDHeaderWidget={<EntityIdHeaderWidget\n path={path}\n idPath={path}\n collection={collection}\n openEntityMode={openEntityMode}/>}\n openEntityMode={openEntityMode}\n onColumnsOrderChange={onColumnsOrderChange}\n />\n );\n\n const detailOpen = selectedEntityIdProp !== undefined;\n\n // List view gets a centered, titled reading surface. Opening a detail\n // panel collapses the title and drops the centering so the list can\n // shrink into the master column.\n const collectionSurface = viewMode === \"list\"\n ? (\n <div\n className={cls(\n \"flex flex-col w-full\",\n detailOpen ? \"\" : \"max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4\"\n )}\n >\n {/* Collapsible title — grid-rows for smooth height, transform for GPU */}\n <div\n className={cls(\n \"grid transition-[grid-template-rows,transform,margin] duration-150 ease-out\",\n detailOpen\n ? \"grid-rows-[0fr] -translate-y-2 mt-0 mb-0\"\n : \"grid-rows-[1fr] translate-y-0 mt-12 mb-6\"\n )}\n >\n <div className=\"overflow-hidden flex items-center gap-4\">\n <Typography gutterBottom variant=\"h4\" className=\"grow mb-0\" component=\"h4\">\n {collection.name}\n </Typography>\n </div>\n </div>\n {pluginInsights.length > 0 && (\n <div\n className={cls(\n \"grid transition-[grid-template-rows] duration-150 ease-out\",\n detailOpen ? \"grid-rows-[0fr]\" : \"grid-rows-[1fr]\"\n )}\n >\n <div className=\"overflow-hidden flex-shrink-0\">\n {pluginInsights}\n </div>\n </div>\n )}\n {innerView}\n </div>\n )\n : innerView;\n\n const mainContent = (\n <div className={cls(\"overflow-hidden h-full w-full rounded-md flex flex-col dark:bg-surface-800\", className)}\n ref={containerRef}>\n\n {countFetcher}\n\n {tableController.dataLoadingError && tableController.data.length > 0 && (\n <div className=\"flex items-center gap-4 px-4 py-2 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800 flex-shrink-0\">\n <Typography variant=\"body2\" className=\"text-red-700 dark:text-red-300 flex-1\">\n <strong>Warning:</strong> {tableController.dataLoadingError.message || \"Failed to update data.\"}\n </Typography>\n </div>\n )}\n\n\n {/* When isSplitLayout, SplitListView is ALWAYS mounted — regardless\n of viewMode. The toolbar + current view live in the left panel;\n the right panel (entity detail) shows/hides based on selection.\n This keeps the toolbar's React tree position stable across view\n mode switches, preventing the ViewModeToggle popover from flashing. */}\n {isSplitLayout ? (\n <SplitListView\n key={`split-list-view-${path}`}\n collection={collection}\n tableController={tableController}\n onEntityClick={onEntityClick}\n onNewClick={onNewClick}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n highlightedEntities={highlightedEntity ? [highlightedEntity] : []}\n onScroll={tableController.onScroll}\n initialScroll={tableController.initialScroll}\n size={listSize}\n emptyComponent={emptyComponent}\n path={path}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n selectedEntityId={selectedEntityIdProp}\n selectedTab={selectedTabProp}\n toolbar={toolbarNode}\n >\n {/* The left panel keeps rendering whichever view mode is\n active. Swapping it to a list on selection would make\n a board or card grid vanish on every click. */}\n {collectionSurface}\n </SplitListView>\n ) : (\n <div className=\"flex flex-col w-full h-full\">\n {toolbarNode}\n <div className={cls(\n \"flex-1 flex flex-col\",\n (viewMode === \"list\" || viewMode === \"cards\") && \"overflow-y-auto\"\n )}>\n {collectionSurface}\n </div>\n </div>\n )}\n\n {popupCell && <PopupFormField\n key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}\n open={Boolean(popupCell)}\n onClose={onPopupClose}\n cellRect={popupCell?.cellRect}\n propertyKey={popupCell?.propertyKey}\n collection={collection}\n entityId={popupCell.entityId}\n tableKey={tableKey.current}\n customFieldValidator={uniqueFieldValidator}\n path={path}\n onCellValueChange={onValueChange}\n container={containerRef.current}/>}\n\n {deleteEntityClicked &&\n <DeleteEntityDialog\n entityOrEntitiesToDelete={deleteEntityClicked}\n path={path}\n collection={collection}\n callbacks={collection.callbacks}\n open={Boolean(deleteEntityClicked)}\n onEntityDelete={internalOnEntityDelete}\n onMultipleEntitiesDelete={internalOnMultipleEntitiesDelete}\n onClose={() => setDeleteEntityClicked(undefined)}/>}\n\n </div>\n );\n\n return mainContent;\n }, (a, b) => {\n return equal(a.path, b.path) &&\n equal(a.parentCollectionSlugs, b.parentCollectionSlugs) && equal(a.parentEntityIds, b.parentEntityIds) &&\n equal(a.isSubCollection, b.isSubCollection) &&\n equal(a.className, b.className) &&\n equal(a.properties, b.properties) &&\n equal(a.propertiesOrder, b.propertiesOrder) &&\n equal(a.hideIdFromCollection, b.hideIdFromCollection) &&\n equal(a.inlineEditing, b.inlineEditing) &&\n equal(a.selectionEnabled, b.selectionEnabled) &&\n equal(a.selectionController, b.selectionController) &&\n equal(a.Actions, b.Actions) &&\n equal(a.defaultSize, b.defaultSize) &&\n equal(a.includeJsonView, b.includeJsonView) &&\n equal(a.additionalFields, b.additionalFields) &&\n equal(a.sideDialogWidth, b.sideDialogWidth) &&\n equal(a.openEntityMode, b.openEntityMode) &&\n equal(a.exportable, b.exportable) &&\n equal(a.history, b.history) &&\n equal(a.fixedFilter, b.fixedFilter) &&\n equal(a.selectedEntityId, b.selectedEntityId) &&\n equal(a.selectedTab, b.selectedTab);\n }) as React.FunctionComponent<CollectionViewBindingProps<any>>;\n\nexport const CollectionViewBinding = React.memo(\n function CollectionViewBinding<M extends Record<string, unknown>>(props: CollectionViewBindingProps<M>) {\n const collectionRegistry = useCollectionRegistryController();\n const path = props.path ?? props.slug;\n const collection = collectionRegistry.getCollection(path) ?? props;\n\n const content = <CollectionViewBindingInner {...props} />;\n\n if (collection) {\n return (\n <CollectionScopeProvider collection={collection as CollectionConfig}>\n {content}\n </CollectionScopeProvider>\n );\n }\n return content;\n }\n) as React.FunctionComponent<CollectionViewBindingProps<any>>;\n\n/**\n * Default empty state shown when a collection has no entities.\n * Used as the fallback for the `\"Collection.EmptyState\"` component override.\n *\n * @internal\n */\nfunction DefaultCollectionEmptyState({\n canCreate,\n onNewClick,\n isSearching,\n searchString\n}: {\n canCreate: boolean;\n onNewClick: () => void;\n isSearching: boolean;\n searchString: string;\n}) {\n const { t } = useTranslation();\n if (canCreate) {\n return (\n <div className=\"flex flex-col items-center justify-center\">\n <Typography variant={\"subtitle2\"}>{t(\"so_empty\")}</Typography>\n <Button\n onClick={onNewClick}\n className=\"mt-4\"\n >\n <PlusIcon/>\n {t(\"create_your_first_entry\")}\n </Button>\n </div>\n );\n }\n return (\n <Typography variant={\"label\"}>\n {isSearching\n ? t(\"no_results_search\", { search: searchString })\n : t(\"no_results_filter_sort\")}\n </Typography>\n );\n}\n\n/**\n * Inflight count request deduplication map.\n * Keyed by `path|filterKey|sortByProperty|sortDir` so that concurrent\n * callers (e.g. React StrictMode double-mount) share the same promise.\n */\nconst inflightCountRequests = new Map<string, Promise<number>>();\n\nfunction EntitiesCount({\n path,\n collection,\n filter,\n sortBy,\n onCountChange\n}: {\n path: string,\n collection: CollectionConfig,\n filter?: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"],\n onCountChange?: (count: number | null | undefined) => void,\n}) {\n\n const dataClient = useData();\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n // Use refs for values that should NOT trigger re-fetches\n const dataClientRef = React.useRef(dataClient);\n dataClientRef.current = dataClient;\n const onCountChangeRef = React.useRef(onCountChange);\n onCountChangeRef.current = onCountChange;\n\n // Serialize filter to a stable string to avoid re-fetches on object identity changes\n const filterKey = React.useMemo(() => filter ? JSON.stringify(filter) : \"\", [filter]);\n\n useEffect(() => {\n const accessor = dataClientRef.current.collection(path);\n if (!accessor.count) {\n onCountChangeRef.current?.(undefined);\n return;\n }\n\n let cancelled = false;\n\n // filterValues is already FilterValues — pass directly\n const whereParams = filter && Object.keys(filter).length > 0 ? filter : undefined;\n const orderByParams: [string, \"asc\" | \"desc\"] | undefined = sortByProperty && currentSort ? [String(sortByProperty), currentSort] : undefined;\n\n // Deduplicate inflight count requests (e.g. React StrictMode double-mount)\n const cacheKey = `${path}|${filterKey}|${sortByProperty ?? \"\"}|${currentSort ?? \"\"}`;\n let countPromise = inflightCountRequests.get(cacheKey);\n if (!countPromise) {\n countPromise = accessor.count({\n where: whereParams,\n orderBy: orderByParams\n });\n inflightCountRequests.set(cacheKey, countPromise);\n // Clean up the inflight entry once resolved/rejected\n countPromise.finally(() => inflightCountRequests.delete(cacheKey));\n }\n\n countPromise.then((c) => {\n if (!cancelled) onCountChangeRef.current?.(c);\n }).catch((e) => {\n console.warn(\"Error fetching count\", e);\n if (!cancelled) onCountChangeRef.current?.(undefined);\n });\n\n return () => { cancelled = true; };\n }, [path, filterKey, sortByProperty, currentSort]);\n\n // Count is now displayed in the breadcrumb bar, this component only fetches and reports\n return null;\n}\n\nfunction buildPropertyWidthOverwrite(key: string, width: number): PartialCollectionConfig {\n if (key.includes(\".\")) {\n const [parentKey, ...childKey] = key.split(\".\");\n return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join(\".\"), width) } } as PartialCollectionConfig;\n }\n return { properties: { [key]: { ui: { columnWidth: width } } } } as PartialCollectionConfig;\n}\n\nfunction EntityIdHeaderWidget({\n collection,\n path,\n idPath,\n openEntityMode\n}: {\n collection: CollectionConfig,\n path: string,\n idPath: string,\n /**\n * Resolved by the parent so that finding an entity by id lands it in the\n * same surface a row click would — not a different one.\n */\n openEntityMode: OpenEntityMode\n}) {\n\n const { t } = useTranslation();\n const urlController = useUrlController();\n const [openPopup, setOpenPopup] = React.useState(false);\n const [searchString, setSearchString] = React.useState(\"\");\n const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.slug).map(String));\n const sidePanelController = useSidePanel();\n\n return (\n <Tooltip title={!openPopup ? t(\"find_by_id\") : undefined} asChild={false}>\n <Popover\n open={openPopup}\n onOpenChange={setOpenPopup}\n sideOffset={0}\n align={\"start\"}\n alignOffset={-117}\n trigger={\n <IconButton size={\"small\"}>\n <SearchIcon size={iconSize.small}/>\n </IconButton>\n }>\n <div\n className={cls(\"my-2 rounded-lg bg-surface-50 dark:bg-surface-800 text-surface-900 dark:text-white\")}>\n <form noValidate={true}\n onSubmit={(e) => {\n e.preventDefault();\n if (!searchString) return;\n setOpenPopup(false);\n const entityId = searchString.trim();\n setRecentIds(addRecentId(collection.slug, entityId).map(String));\n navigateToEntity({\n openEntityMode,\n collection,\n entityId,\n path,\n\n sidePanelController,\n navigation: urlController\n })\n }}\n className={\"w-96 max-w-full\"}>\n\n <div className=\"flex p-2 w-full gap-2\">\n <TextField\n autoFocus={openPopup}\n placeholder={t(\"find_entity_by_id\")}\n size=\"small\"\n onChange={(e) => {\n setSearchString(e.target.value);\n }}\n value={searchString}\n className=\"flex-grow\"\n inputClassName={cls(\"rounded-lg bg-white dark:bg-surface-900\", focusedDisabled)}\n />\n <Button variant={\"text\"}\n disabled={!(searchString.trim())}\n type={\"submit\"}\n ><ArrowRightToLineIcon/></Button>\n </div>\n </form>\n {recentIds && recentIds.length > 0 && <div className=\"flex flex-col gap-2 p-2\">\n {recentIds.map(id => (\n <ReferencePreview reference={new EntityReference({ id,\npath })}\n key={id}\n hover={true}\n onClick={() => {\n setOpenPopup(false);\n navigateToEntity({\n openEntityMode,\n collection,\n entityId: id,\n path,\n\n sidePanelController,\n navigation: urlController\n })\n }}\n includeEntityLink={false}\n size={\"small\"}/>\n ))}\n </div>}\n </div>\n </Popover>\n\n </Tooltip>\n );\n}\n","\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport type { FormContext } from \"../types/fields\";\nimport type { EntityAction, EntityActionClickProps, SidePanelController } from \"@rebasepro/types\";\nimport React, { useMemo } from \"react\";\nimport { Entity, getCollectionDataPath, RebaseContext } from \"@rebasepro/types\";\nimport type { EntityFormActionsProps } from \"../types/components/EntityFormActionsProps\";\nimport { copyEntityAction, deleteEntityAction } from \"./common/default_entity_actions\";\nimport { mergeEntityActions } from \"../util/entity_actions\";\nimport { resolveEntityAction } from \"../util/resolutions\";\nimport { Button, CircularProgress, cls, defaultBorderMixin, DialogActions, IconButton, LoadingButton, Tooltip, Typography } from \"@rebasepro/ui\";\nimport { AlertCircleIcon, iconSize } from \"@rebasepro/ui\";\nimport {\n useCustomizationController,\n useSnackbarController,\n useTranslation\n} from \"@rebasepro/app\";\nimport { SideDialogController, useSideDialogContext } from \"./SideDialogs\";\nimport { FormexController } from \"@rebasepro/forms\";\nimport { ErrorTooltip } from \"@rebasepro/app\";\nimport { usePermissions } from \"@rebasepro/app\";\nimport { useCMSContext } from \"../hooks/useCMSContext\";\n\nexport function EditFormActions({\n collection,\n path,\n entity,\n layout,\n savingError,\n formex,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n showDefaultActions = true,\n navigateBack,\n formContext\n}: EntityFormActionsProps) {\n\n const { canCreate, canDelete } = usePermissions();\n const context = useCMSContext();\n const sidePanelController = context.sidePanelController;\n const sideDialogContext = useSideDialogContext();\n const customizationController = useCustomizationController();\n const { t } = useTranslation();\n\n const entityActions = useMemo((): EntityAction[] => {\n const customEntityActions = (collection.entityActions ?? [])\n .map(action => resolveEntityAction(action, customizationController.entityActions))\n .filter(Boolean) as EntityAction[];\n const createEnabled = canCreate(collection, path);\n const deleteEnabled = entity ? canDelete(collection, path, entity) : false;\n const disableActions = collection.disableDefaultActions ?? [];\n const actions: EntityAction[] = [];\n if (createEnabled && !disableActions.includes(\"copy\"))\n actions.push(copyEntityAction);\n if (deleteEnabled && !disableActions.includes(\"delete\"))\n actions.push(deleteEntityAction);\n if (customEntityActions)\n return mergeEntityActions(actions, customEntityActions);\n return actions;\n }, [canCreate, canDelete, collection, path, customizationController.entityActions?.length, entity, collection.disableDefaultActions]);\n\n const formActions = showDefaultActions ? entityActions.filter(a => a.includeInForm === undefined || a.includeInForm) : [];\n\n // HMR reload trigger\n const bottomActions = buildBottomActions({\n savingError,\n entity,\n formActions,\n collection,\n context,\n sidePanelController,\n disabled,\n status,\n sideDialogContext,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n t,\n className: layout === \"responsive\" ? \"@6xl:hidden\" : undefined\n });\n\n const sideActions = buildSideActions({\n savingError,\n entity,\n formActions,\n collection,\n context,\n sidePanelController,\n sideDialogContext,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n t,\n className: layout === \"responsive\" ? \"hidden @6xl:flex\" : undefined\n });\n\n if (layout === \"responsive\") {\n return <>\n {bottomActions}\n {sideActions}\n </>;\n }\n\n return layout === \"bottom\" ? bottomActions : sideActions;\n}\n\ntype ActionsViewProps<M extends Record<string, unknown>> = {\n savingError: Error | undefined,\n entity: Entity<M> | undefined,\n formActions: EntityAction[],\n collection: CollectionConfig,\n context: RebaseContext,\n sidePanelController: SidePanelController,\n disabled: boolean,\n status: \"new\" | \"existing\" | \"copy\",\n sideDialogContext: SideDialogController,\n pluginActions?: React.ReactNode[],\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n navigateBack: () => void;\n formContext: FormContext,\n formex: FormexController<Record<string, unknown>>;\n t: (key: string, vars?: Record<string, string>) => string;\n className?: string;\n};\n\nfunction buildBottomActions<M extends Record<string, unknown>>({\n savingError,\n entity,\n formActions,\n collection,\n context,\n sidePanelController,\n disabled,\n status,\n sideDialogContext,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n t,\n className\n}: ActionsViewProps<M>) {\n\n const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;\n const canClose = openEntityMode === \"side_panel\" || openEntityMode === \"dialog\";\n return <DialogActions\n className={className}\n position={\"absolute\"}>\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>{savingError.message}</Typography>\n </div>\n }\n\n {formActions.length > 0 && <div className=\"grow flex overflow-auto no-scrollbar\">\n {formActions.map((action, index) => {\n\n\n const props = {\n view: \"form\",\n entity,\n path: getCollectionDataPath(collection),\n collection: collection,\n context,\n sidePanelController,\n openEntityMode,\n navigateBack,\n formContext\n } satisfies EntityActionClickProps<Record<string, unknown>>;\n\n const isEnabled = !action.isEnabled || action.isEnabled(props);\n return (\n <EntityActionButton\n key={action.key ?? action.name ?? index}\n action={action}\n enabled={isEnabled}\n props={props}\n />\n );\n })}\n </div>}\n\n {pluginActions}\n\n {hasErrors ?\n <ErrorTooltip title={\"This form has errors\"}>\n <AlertCircleIcon className=\"ml-4 text-red-500\" size={iconSize.smallest}/>\n </ErrorTooltip> : null}\n <Button variant=\"text\"\n color=\"primary\"\n disabled={disabled || formex.isSubmitting}\n type=\"reset\">\n {status === \"existing\" ? t(\"discard\") : t(\"clear\")}\n </Button>\n {collection.defaultEntityAction === \"view\" && status === \"existing\" && (\n <Button variant=\"text\"\n color=\"primary\"\n disabled={disabled}\n onClick={navigateBack}>\n {t(\"back_to_detail\") ?? \"Back to details\"}\n </Button>\n )}\n <Tooltip title={hasErrors ? (t(\"fix_errors_before_saving\") ?? \"Fix highlighted errors before saving\") : undefined}>\n <Button variant={canClose ? \"text\" : \"filled\"}\n color=\"primary\"\n type=\"submit\"\n disabled={disabled || formex.isSubmitting}\n onClick={() => {\n sideDialogContext.setPendingClose(false);\n }}>\n {status === \"existing\" && t(\"save\")}\n {status === \"copy\" && t(\"create_copy\")}\n {status === \"new\" && t(\"create\")}\n </Button>\n </Tooltip>\n {canClose && <LoadingButton variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={formex.isSubmitting}\n disabled={disabled}\n onClick={() => {\n sideDialogContext.setPendingClose?.(true);\n }}>\n {status === \"existing\" && t(\"save_and_close\")}\n {status === \"copy\" && t(\"create_copy_and_close\")}\n {status === \"new\" && t(\"create_and_close\")}\n </LoadingButton>}\n </DialogActions>;\n}\n\nfunction buildSideActions<M extends Record<string, unknown>>({\n savingError,\n entity,\n formActions,\n collection,\n context,\n sidePanelController,\n disabled,\n status,\n sideDialogContext,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n t,\n className\n}: ActionsViewProps<M>) {\n\n const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;\n return <div\n className={cls(\"overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l\", defaultBorderMixin, className)}>\n <Tooltip title={hasErrors ? (t(\"fix_errors_before_saving\") ?? \"Fix highlighted errors before saving\") : undefined}>\n <LoadingButton fullWidth={true}\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={formex.isSubmitting}\n startIcon={hasErrors ? <AlertCircleIcon/> : undefined}\n disabled={disabled || formex.isSubmitting}\n onClick={() => {\n sideDialogContext.setPendingClose?.(false);\n }}>\n {status === \"existing\" && t(\"save\")}\n {status === \"copy\" && t(\"create_copy\")}\n {status === \"new\" && t(\"create\")}\n </LoadingButton>\n </Tooltip>\n\n <Button fullWidth={true} variant=\"text\" disabled={disabled || formex.isSubmitting} type=\"reset\">\n {status === \"existing\" ? t(\"discard\") : t(\"clear\")}\n </Button>\n {collection.defaultEntityAction === \"view\" && status === \"existing\" && (\n <Button fullWidth={true} variant=\"text\" disabled={disabled} onClick={navigateBack}>\n {t(\"back_to_detail\") ?? \"Back to details\"}\n </Button>\n )}\n\n {pluginActions}\n\n {formActions.length > 0 && <div className=\"flex flex-row flex-wrap mt-2\">\n {formActions.map((action, index) => {\n const props = {\n view: \"form\",\n entity,\n path: getCollectionDataPath(collection),\n collection: collection,\n context,\n sidePanelController,\n openEntityMode,\n navigateBack,\n formContext\n } satisfies EntityActionClickProps<Record<string, unknown>>;\n const isEnabled = !action.isEnabled || action.isEnabled(props);\n return (\n <EntityActionButton key={action.key ?? action.name ?? index} action={action} enabled={isEnabled} props={props}/>\n );\n })}\n </div>}\n\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>{savingError.message}</Typography>\n </div>\n }\n </div>;\n}\n\nfunction EntityActionButton({\n action,\n enabled,\n props\n}: {\n action: EntityAction,\n enabled: boolean,\n props: EntityActionClickProps<Record<string, unknown>>\n}) {\n const snackbarController = useSnackbarController();\n const [loading, setLoading] = React.useState(false);\n return <Tooltip\n title={action.name}>\n <IconButton\n color=\"primary\"\n disabled={!enabled}\n onClick={(event) => {\n console.debug(\"Executing action\", action.key, props);\n try {\n event.stopPropagation();\n if (props.entity) {\n const onClick = action.onClick(props);\n // If the action returns a promise, we can handle it\n if (onClick instanceof Promise) {\n setLoading(true);\n onClick\n .catch((error) => {\n console.error(\"Error executing action\", action.key, error);\n snackbarController.open({\n message: `Error executing action: ${error.message}`,\n type: \"error\"\n })\n })\n .finally(() => setLoading(false));\n } else {\n snackbarController.open({\n message: `Action ${action.name} executed successfully`,\n type: \"success\"\n });\n }\n\n }\n } catch (e: unknown) {\n console.error(\"Error executing action\", action.key, e);\n snackbarController.open({\n message: `Error executing action: ${e instanceof Error ? e.message : String(e)}`,\n type: \"error\"\n });\n }\n }}>\n {loading ? <CircularProgress size={\"smallest\"}/> : action.icon}\n </IconButton>\n </Tooltip>;\n}\n","import type { ComponentRef, CollectionConfig, EntityCustomViewParams, FormViewConfig } from \"@rebasepro/types\";\nimport type { FormContext } from \"../types/fields\";\nimport type { PluginFormActionProps } from \"@rebasepro/types\";\nimport React, { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Entity, EntityStatus, getCollectionDataPath } from \"@rebasepro/types\";\nimport { PluginProviderStack, resolveComponentRef, useComponentOverride, CollectionScopeProvider } from \"@rebasepro/app\";\n\nimport { CollectionViewBinding } from \"./CollectionViewBinding/CollectionViewBinding\";\nimport { EntityViewBinding } from \"./EntityViewBinding\";\nimport { CircularProgressCenter, iconSize } from \"@rebasepro/ui\";\nimport {\n CenteredView,\n CircularProgress,\n cls,\n CodeIcon,\n defaultBorderMixin,\n HistoryIcon,\n IconButton,\n Maximize2Icon,\n Skeleton,\n Tab,\n Tabs,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport {\n getSubcollections,\n removeInitialAndTrailingSlashes,\n resolveDefaultSelectedView\n} from \"@rebasepro/common\";\nimport { resolvedSelectedEntityView } from \"../util/resolutions\";\nimport {\n useCustomizationController,\n useFetch,\n useRebaseContext,\n useLargeLayout,\n useSlot,\n getIcon\n} from \"@rebasepro/app\";\nimport { getEntityFromMemoryCache } from \"@rebasepro/app\";\nimport { EntityFormBinding } from \"../form\";\nimport type { EntityFormBindingProps } from \"../form\";\nimport type { OnUpdateParams } from \"../types/components/EntityFormProps\";\nimport { EditFormActions } from \"./EditFormActions\";\nimport { JsonPreviewBinding } from \"../components/JsonPreviewBinding\";\n// Lazy-load history view — only loaded when user clicks the HistoryIcon tab\nconst EntityHistoryView = lazy(() => import(\"../components/history\").then(m => ({ default: m.EntityHistoryView })));\nimport { createFormexStub, getEntityFromCache } from \"@rebasepro/app\";\nimport { usePermissions } from \"@rebasepro/app\";\nimport { useUrlController } from \"../hooks/navigation/contexts/UrlContext\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport { MAIN_TAB_VALUE, JSON_TAB_VALUE, HISTORY_TAB_VALUE } from \"../util/view_constants\";\nexport { MAIN_TAB_VALUE, JSON_TAB_VALUE, HISTORY_TAB_VALUE };\n\nexport type BarActionsParams = {\n values: object,\n status: EntityStatus,\n path: string,\n entityId?: string | number;\n};\n\nexport type OnTabChangeParams<M extends Record<string, unknown>> = {\n path: string;\n entityId?: string | number;\n selectedTab?: string;\n collection: CollectionConfig<M>;\n\n};\n\nexport interface EditViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> {\n /**\n * The CMS path of the entity, e.g. \"users\" or \"products\".\n */\n path: string;\n collection: CollectionConfig<M>;\n entityId?: string | number;\n databaseId?: string;\n copy?: boolean;\n selectedTab?: string;\n parentCollectionSlugs: string[], parentEntityIds: string[];\n onValuesModified?: (modified: boolean, values: M) => void;\n onSaved?: (params: OnUpdateParams) => void;\n onTabChange?: (props: OnTabChangeParams<M>) => void;\n navigateBack?: () => void;\n layout?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n barActions?: (params: BarActionsParams) => React.ReactNode;\n formProps?: Partial<EntityFormBindingProps<M>>,\n /**\n * Pre-populate the form with these values when creating a new entity.\n * Only applied when the form is in \"new\" mode (no entityId).\n * Sourced from SidePanelBindingProps (side panel) or location.state (full screen).\n */\n defaultValues?: Partial<M>;\n}\n\n/**\n * This is the default view that is used as the content of a side panel when\n * a record is opened.\n */\nexport function EditViewBinding<M extends Record<string, unknown>>({\n entityId,\n ...props\n}: EditViewBindingProps<M>) {\n\n const {\n entity,\n dataLoading,\n\n dataLoadingError\n } = useFetch<M>({\n path: props.path,\n entityId: entityId,\n collection: props.collection,\n databaseId: props.databaseId,\n useCache: false\n });\n\n const initialDirtyValues = entityId\n ? getEntityFromMemoryCache(props.path + \"/\" + entityId)\n : (props.defaultValues ?? getEntityFromMemoryCache(props.path + \"#new\"));\n\n const { canEdit: canEditHook } = usePermissions();\n\n const initialStatus = props.copy ? \"copy\" : (entityId ? \"existing\" : \"new\");\n const [status, setStatus] = useState<EntityStatus>(initialStatus);\n\n const canEdit = useMemo(() => {\n if (status === \"new\" || status === \"copy\") {\n return true;\n } else {\n return entity ? canEditHook(props.collection, props.path, entity ?? null) : undefined;\n }\n }, [canEditHook, entity, status, props.collection, props.path]);\n\n if (!dataLoading && dataLoadingError) {\n return <CenteredView>\n <ErrorView error={dataLoadingError} />\n </CenteredView>\n }\n\n if (!dataLoading && !initialDirtyValues && !entity && (status === \"existing\" || status === \"copy\")) {\n console.error(`Entity with id ${entityId} not found in collection ${props.path}`);\n return <CenteredView>\n <Typography variant=\"label\">Entity not found</Typography>\n </CenteredView>;\n }\n\n const content = (\n <EditViewBindingInner<M> {...props}\n entityId={entityId}\n entity={entity}\n initialDirtyValues={initialDirtyValues as Partial<M>}\n dataLoading={dataLoading}\n status={status}\n setStatus={setStatus}\n canEdit={canEdit}\n />\n );\n\n return (\n <CollectionScopeProvider collection={props.collection}>\n {content}\n </CollectionScopeProvider>\n );\n}\n\nexport function EditViewBindingInner<M extends Record<string, unknown>>({\n path,\n entityId,\n selectedTab: selectedTabProp,\n collection,\n parentCollectionSlugs, parentEntityIds,\n onValuesModified,\n onSaved,\n onTabChange,\n navigateBack,\n entity,\n initialDirtyValues,\n dataLoading,\n layout = \"side_panel\",\n barActions,\n status,\n setStatus,\n formProps,\n canEdit\n}: EditViewBindingProps<M> & {\n entity?: Entity<M>,\n initialDirtyValues?: Partial<M>, // dirty cached entity in memory\n dataLoading: boolean,\n status: EntityStatus,\n setStatus: (status: EntityStatus) => void,\n canEdit?: boolean,\n}) {\n\n const ResolvedFormActions = useComponentOverride(\"EditView.FormActions\", EditFormActions);\n const ResolvedEntityForm = useComponentOverride(\"Entity.Form\", EntityFormBinding) as typeof EntityFormBinding;\n const ResolvedCollectionView = useComponentOverride(\"Collection.View\", CollectionViewBinding);\n\n const context = useRebaseContext();\n const urlController = useUrlController();\n const navigate = useNavigate();\n\n const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);\n\n useEffect(() => {\n if (entity)\n setUsedEntity(entity);\n }, [entity]);\n\n const [formContext, setFormContext] = useState<FormContext<M> | undefined>(undefined);\n\n const largeLayout = useLargeLayout();\n\n const customizationController = useCustomizationController();\n const plugins = customizationController.plugins;\n\n const formActionTopProps: PluginFormActionProps = useMemo(() => ({\n entityId,\n parentCollectionSlugs,\nparentEntityIds,\n path: path,\n status,\n collection: collection!,\n context,\n formContext: formContext as FormContext<Record<string, unknown>> | undefined,\n openEntityMode: layout,\n disabled: false\n }), [entityId, parentCollectionSlugs, parentEntityIds, path, status, collection, context, formContext, layout]);\n const pluginActionsTop = useSlot(\"form.actions.top\", formActionTopProps);\n\n const defaultSelectedView = useMemo(() => resolveDefaultSelectedView(\n collection ? collection.defaultSelectedView : undefined,\n {\n status,\n entityId\n }\n ), [collection, status, entityId]);\n\n // Track whether the user has explicitly clicked a tab in this component\n // instance. When false, we fall back to defaultSelectedView (which may\n // resolve asynchronously if the collection loads from the registry after\n // mount). Once true, selectedTabProp=undefined means the user selected\n // the form tab, so we must NOT re-apply defaultSelectedView.\n const userHasChangedTab = useRef(false);\n\n const [selectedTab, setSelectedTab] = useState<string>(() => {\n const val = selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE;\n return val === \"edit\" ? MAIN_TAB_VALUE : val;\n });\n useEffect(() => {\n const val = userHasChangedTab.current\n ? (selectedTabProp ?? MAIN_TAB_VALUE)\n : (selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE);\n const target = val === \"edit\" ? MAIN_TAB_VALUE : val;\n if (target !== selectedTab) {\n setSelectedTab(target);\n }\n }, [selectedTabProp, defaultSelectedView]);\n\n const subcollections = getSubcollections(collection).filter(c => !c.hideFromNavigation);\n const subcollectionsCount = subcollections?.length ?? 0;\n const customViews = collection.entityViews ?? [];\n const customViewsCount = customViews?.length ?? 0;\n const includeJsonView = collection.includeJsonView === undefined ? true : collection.includeJsonView;\n const includeHistoryView = Boolean(collection.history);\n const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0 || includeJsonView || includeHistoryView;\n\n const {\n resolvedEntityViews\n } = resolvedSelectedEntityView(customViews, customizationController, undefined, canEdit);\n\n const validTabValues = useMemo(() => {\n const set = new Set<string>([\n MAIN_TAB_VALUE,\n ...(includeJsonView ? [JSON_TAB_VALUE] : []),\n ...(includeHistoryView ? [HISTORY_TAB_VALUE] : []),\n ...resolvedEntityViews.map(v => v.key),\n ...subcollections.map(s => s.slug)\n ]);\n return set;\n }, [includeJsonView, includeHistoryView, resolvedEntityViews, subcollections]);\n\n const activeTab = validTabValues.has(selectedTab) ? selectedTab : MAIN_TAB_VALUE;\n\n const {\n selectedEntityView,\n selectedSecondaryForm\n } = resolvedSelectedEntityView(customViews, customizationController, activeTab, canEdit);\n\n const actionsAtTheBottom = layout === \"side_panel\" || layout === \"dialog\" || selectedEntityView?.includeActions === \"bottom\";\n\n const mainViewVisible = activeTab === MAIN_TAB_VALUE || Boolean(selectedSecondaryForm);\n\n // Track which custom view tabs have been visited so we keep them mounted\n // (preserving their state) but don't eagerly mount tabs never visited.\n const mountedTabsRef = useRef<Set<string>>(new Set());\n if (activeTab) {\n mountedTabsRef.current.add(activeTab);\n }\n\n // Memoize the read-only fallback form context to avoid recreating it every render\n const readOnlyFormContext = useMemo<FormContext<M> | undefined>(() => {\n if (formContext) return undefined; // not needed when real formContext exists\n if (!entityId) return undefined;\n const formexStub = createFormexStub<M>(usedEntity?.values ?? {} as M);\n return {\n entityId,\n disabled: false,\n readOnly: true,\n openEntityMode: layout,\n status: status,\n values: usedEntity?.values ?? ({} as M),\n setFieldValue: (key: string, value: unknown) => {\n throw new Error(\"You can't update values in read only mode\");\n },\n save: () => {\n throw new Error(\"You can't save in read only mode\");\n },\n submit: () => {\n throw new Error(\"You can't submit in read only mode\");\n },\n collection,\n path: path,\n entity: usedEntity,\n savingError: undefined,\n formex: formexStub\n };\n }, [formContext, entityId, layout, status, usedEntity, collection, path]);\n\n const nonActionCustomViews = useMemo(() =>\n resolvedEntityViews.filter(e => !e.includeActions),\n [resolvedEntityViews]\n );\n\n const customViewsView: React.ReactNode[] | undefined = customViews && nonActionCustomViews\n .map((customView) => {\n\n if (!customView)\n return null;\n const Builder = resolveComponentRef<EntityCustomViewParams>(customView.Builder);\n if (!Builder) {\n console.error(\"INTERNAL: customView.Builder is not defined or could not be resolved\");\n return null;\n }\n\n if (!entityId) {\n return null;\n }\n\n // Only mount tabs that have been visited at least once\n const isActive = activeTab === customView.key;\n const hasBeenMounted = mountedTabsRef.current.has(customView.key);\n if (!isActive && !hasBeenMounted) {\n return null;\n }\n\n const usedFormContext: FormContext<M> = formContext ?? readOnlyFormContext!;\n\n return <div\n className={cls(defaultBorderMixin,\n \"relative flex-1 w-full h-full overflow-auto\",\n { \"hidden\": !isActive }\n )}\n key={`custom_view_${customView.key}`}\n role=\"tabpanel\">\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n {usedFormContext && <Builder\n collection={collection}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n entity={usedEntity}\n modifiedValues={usedFormContext?.formex?.values ?? usedEntity?.values}\n formContext={usedFormContext as FormContext<Record<string, unknown>>}\n />}\n </Suspense>\n </ErrorBoundary>\n </div>;\n }).filter(Boolean);\n\n const globalLoading = (dataLoading && !usedEntity) || (canEdit === undefined && (status === \"existing\" || status === \"copy\"));\n\n // Only mount JSON view when its tab is selected (or was previously selected)\n const jsonTabMounted = mountedTabsRef.current.has(JSON_TAB_VALUE);\n const jsonView = (activeTab === JSON_TAB_VALUE || jsonTabMounted) ? <div\n className={cls(\"relative flex-1 h-full overflow-auto w-full\",\n { \"hidden\": activeTab !== JSON_TAB_VALUE })}\n key={\"json_view\"}\n role=\"tabpanel\">\n <ErrorBoundary>\n <JsonPreviewBinding\n values={formContext?.values ?? entity?.values ?? {}} />\n </ErrorBoundary>\n </div> : null;\n\n // Only mount history view when its tab is actually selected\n const historyView = includeHistoryView && activeTab === HISTORY_TAB_VALUE ? <div\n className={\"relative flex-1 h-full overflow-auto w-full\"}\n key={\"history_view\"}\n role=\"tabpanel\">\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n <EntityHistoryView\n collection={collection}\n entity={usedEntity}\n formContext={formContext as FormContext<Record<string, unknown>>}\n modifiedValues={formContext?.values ?? usedEntity?.values}\n />\n </Suspense>\n </ErrorBoundary>\n </div> : null;\n\n const subCollectionsViews = subcollections && subcollections.map((subcollection) => {\n const subcollectionId = subcollection.slug;\n const newFullPath = usedEntity ? `${path}/${usedEntity?.id}/${removeInitialAndTrailingSlashes(getCollectionDataPath(subcollection))}` : undefined;\n\n if (activeTab !== subcollectionId) return null;\n return (\n <div\n className={\"relative flex-1 h-full overflow-auto w-full\"}\n key={`subcol_${subcollectionId}`}\n role=\"tabpanel\">\n\n {globalLoading && <CircularProgressCenter />}\n\n {!globalLoading &&\n (usedEntity && newFullPath\n ? <ResolvedCollectionView\n path={newFullPath}\n parentCollectionSlugs={[...parentCollectionSlugs, collection.slug]}\n parentEntityIds={[...parentEntityIds, String(usedEntity?.id)]}\n updateUrl={false}\n {...subcollection}\n openEntityMode={layout} />\n : <div className=\"flex items-center justify-center w-full h-full p-3\">\n <Typography variant={\"label\"}>\n You need to save your entity before\n adding additional collections\n </Typography>\n </div>)\n }\n\n </div>\n );\n }).filter(Boolean);\n\n const onSideTabClick = useCallback((value: string) => {\n userHasChangedTab.current = true;\n setSelectedTab(value);\n if (status === \"existing\") {\n onTabChange?.({\n path: path,\n entityId,\n selectedTab: value === MAIN_TAB_VALUE ? undefined : value,\n collection\n });\n }\n }, [status, onTabChange, path, entityId, collection]);\n\n // Resolve formView.Builder if provided\n const formViewConfig = (collection as CollectionConfig<M> & { formView?: FormViewConfig<M> }).formView;\n const FormViewBuilder = formViewConfig?.Builder ? resolveComponentRef<EntityCustomViewParams>(formViewConfig.Builder as ComponentRef<EntityCustomViewParams>) : null;\n const formViewIncludeActions = formViewConfig?.includeActions !== false;\n\n const entityReadOnlyView = !canEdit && entity ? <div\n className={cls(\"flex-1 flex flex-row w-full overflow-y-auto justify-center\", (canEdit || !mainViewVisible || selectedSecondaryForm) ? \"hidden\" : \"\")}>\n <div\n className={cls(\"relative flex flex-col max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit\")}>\n <Typography className={\"mt-16 mb-8 mx-8\"} variant={\"h4\"}>\n {collection.singularName ?? collection.name}\n </Typography>\n {FormViewBuilder && readOnlyFormContext ? (\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n <FormViewBuilder\n collection={collection}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n entity={usedEntity}\n modifiedValues={usedEntity?.values}\n formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}\n />\n </Suspense>\n </ErrorBoundary>\n ) : (\n <EntityViewBinding\n className={\"px-8 h-full overflow-auto\"}\n entity={entity}\n path={path}\n collection={collection} />\n )}\n <div className=\"h-16\" />\n </div>\n </div> : null;\n\n const entityView = FormViewBuilder ? (\n // formView.Builder replaces the default form\n <div className={cls(\n \"relative flex-1 w-full h-full overflow-auto\",\n (!mainViewVisible || !canEdit) && !selectedSecondaryForm ? \"hidden\" : \"\"\n )}>\n <ErrorBoundary>\n <Suspense fallback={<CircularProgressCenter />}>\n {(formContext ?? readOnlyFormContext) && <FormViewBuilder\n collection={collection}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n entity={usedEntity}\n modifiedValues={(formContext ?? readOnlyFormContext)?.formex?.values ?? usedEntity?.values}\n formContext={(formContext ?? readOnlyFormContext) as FormContext<Record<string, unknown>>}\n />}\n </Suspense>\n </ErrorBoundary>\n </div>\n ) : (\n <ResolvedEntityForm<M>\n collection={collection}\n path={path}\n entityId={entityId ?? usedEntity?.id}\n onValuesModified={onValuesModified}\n entity={entity}\n initialDirtyValues={initialDirtyValues}\n openEntityMode={layout}\n forceActionsAtTheBottom={actionsAtTheBottom}\n initialStatus={status}\n className={cls((!mainViewVisible || !canEdit) && !selectedSecondaryForm ? \"hidden\" : \"\", formProps?.className)}\n EntityFormActionsComponent={ResolvedFormActions as React.FC<typeof ResolvedFormActions extends React.ComponentType<infer P> ? P : never>}\n disabled={!canEdit}\n navigateBack={navigateBack}\n {...formProps}\n onEntityChange={(entity) => {\n setUsedEntity(entity);\n formProps?.onEntityChange?.(entity);\n }}\n onStatusChange={(status) => {\n setStatus(status);\n formProps?.onStatusChange?.(status);\n }}\n onFormContextReady={(formContext) => {\n setFormContext(formContext);\n formProps?.onFormContextReady?.(formContext);\n }}\n onSaved={(params) => {\n const res = {\n ...params,\n selectedTab: MAIN_TAB_VALUE === activeTab ? undefined : activeTab\n };\n onSaved?.(res);\n formProps?.onSaved?.(res);\n }}\n Builder={resolveComponentRef(selectedSecondaryForm?.Builder as ComponentRef<EntityCustomViewParams<M>> | undefined) as React.ComponentType<EntityCustomViewParams<M>> | undefined}\n />\n );\n\n const subcollectionTabs = subcollections && subcollections.map((subcollection) => {\n const icon = getIcon(subcollection.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className=\"text-sm min-w-[90px]\"\n value={subcollection.slug}\n key={`entity_detail_collection_tab_${subcollection.name}`}>\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {subcollection.name}\n </span>\n </Tab>\n );\n });\n\n const customViewTabsStart = resolvedEntityViews.filter(view => view.position === \"start\")\n .map((view) => {\n const icon = getIcon(view.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className={!view.tabComponent ? \"text-sm min-w-[90px]\" : undefined}\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.tabComponent ?? (\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {view.name}\n </span>\n )}\n </Tab>\n );\n });\n const customViewTabsEnd = resolvedEntityViews.filter(view => !view.position || view.position === \"end\")\n .map((view) => {\n const icon = getIcon(view.icon, undefined, undefined, \"smallest\");\n return (\n <Tab\n className={!view.tabComponent ? \"text-sm min-w-[90px]\" : undefined}\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.tabComponent ?? (\n <span className=\"flex items-center gap-1.5\">\n {icon}\n {view.name}\n </span>\n )}\n </Tab>\n );\n });\n\n const shouldShowTopBar = Boolean(barActions) || hasAdditionalViews || layout === \"side_panel\" || layout === \"dialog\";\n\n const fullScreenButton = !barActions && (layout === \"side_panel\" || layout === \"split\" || layout === \"dialog\") && entityId ? (\n <Tooltip title={\"Open full screen\"}>\n <IconButton\n size=\"small\"\n onClick={() => {\n const editSuffix = collection.defaultEntityAction === \"view\" ? \"/edit\" : \"\";\n const entityUrl = urlController.buildUrlCollectionPath(`${path}/${entityId}${editSuffix}`);\n navigate(`${entityUrl}#full`);\n }}\n >\n <Maximize2Icon size={iconSize.smallest} />\n </IconButton>\n </Tooltip>\n ) : null;\n\n\n let result = <div className=\"relative flex flex-col h-full w-full bg-white dark:bg-surface-800\">\n\n {shouldShowTopBar && <div\n className={cls(\"h-[52px] items-center flex overflow-hidden w-full border-b pl-2 pr-2 flex bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n\n {fullScreenButton}\n\n {barActions?.({\n path,\n entityId,\n values: formContext?.values ?? usedEntity?.values ?? {},\n status\n })}\n\n\n {pluginActionsTop}\n\n {hasAdditionalViews && <div className={\"flex-1 flex justify-end min-w-0 shrink-0\"}>\n <Tabs\n className={\"!w-fit max-w-full\"}\n value={activeTab}\n onValueChange={(value) => {\n onSideTabClick(value);\n }}>\n\n {includeJsonView && <Tab\n disabled={!hasAdditionalViews}\n value={JSON_TAB_VALUE}\n className={\"text-sm\"}>\n <CodeIcon size={iconSize.smallest} />\n </Tab>}\n\n {includeHistoryView && <Tab\n disabled={!hasAdditionalViews}\n value={HISTORY_TAB_VALUE}\n className={\"text-sm\"}>\n <HistoryIcon size={iconSize.smallest} />\n </Tab>}\n\n <Tab\n disabled={!hasAdditionalViews}\n value={MAIN_TAB_VALUE}\n className={\"text-sm min-w-[90px]\"}>\n <span className=\"flex items-center gap-1.5\">\n {getIcon(collection.icon, undefined, undefined, \"smallest\")}\n {collection.singularName ?? collection.name}\n </span>\n </Tab>\n\n {customViewTabsStart}\n\n {customViewTabsEnd}\n\n {subcollectionTabs}\n </Tabs>\n </div>}\n </div>}\n\n {globalLoading\n ? <EntityFormSkeleton collection={collection} />\n : <>\n {entityReadOnlyView}\n {entityView}\n </>}\n\n {jsonView}\n\n {historyView}\n\n {customViewsView}\n\n {subCollectionsViews}\n\n </div>;\n\n if (plugins && plugins.length > 0) {\n result = (\n <PluginProviderStack\n plugins={plugins}\n scope=\"form\"\n scopeProps={{\n status,\n path,\n collection,\n entity: usedEntity,\n context,\n formContext\n }}>\n {result}\n </PluginProviderStack>\n );\n }\n\n return result;\n}\n\nfunction EntityFormSkeleton({ collection }: { collection: CollectionConfig }) {\n return (\n <div className=\"flex-1 flex flex-row w-full overflow-y-auto justify-center\">\n <div className=\"relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit\">\n <div className=\"flex flex-col w-full pt-12 pb-16 px-4 sm:px-8 md:px-10\">\n\n <div className=\"flex flex-row gap-4 self-end sticky top-4 z-10\">\n <Skeleton height={24} className=\"w-8 rounded-full\" />\n </div>\n\n <div className=\"w-full flex flex-col items-start my-4 lg:my-6\">\n <div className={`py-1 my-4 w-2/3 ${collection.hideIdFromForm ? \"mb-6\" : \"\"}`}>\n <Skeleton height={28} className=\"w-full rounded-md\" />\n </div>\n <Skeleton height={32} className=\"w-full rounded-md\" />\n </div>\n\n <div className=\"mt-12 flex flex-col gap-8\">\n <div className=\"flex flex-wrap gap-x-4 w-full space-y-8\">\n\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n\n <div className=\"relative w-full\">\n <Skeleton height={60} className=\"w-full rounded-md\" />\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport type { SidePanelBindingProps } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { OnUpdateParams } from \"../types/components/EntityFormProps\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { IconButton, Maximize2Icon, XIcon } from \"@rebasepro/ui\";\nimport { EditViewBinding } from \"./EditViewBinding\";\nimport { DetailViewBinding } from \"./DetailViewBinding\";\nimport { useSideDialogContext } from \"./SideDialogs\";\nimport { useNavigate } from \"react-router-dom\";\nimport { saveEntityToMemoryCache, useComponentOverride } from \"@rebasepro/app\";\nimport { useCollectionRegistryController } from \"../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useSidePanel } from \"../hooks/useSidePanel\";\nimport { useUrlController } from \"../hooks/navigation/contexts/UrlContext\";\nimport { resolveDefaultSelectedView } from \"@rebasepro/common\";\n\n/**\n * This is the component in charge of rendering the side dialog used\n * for editing entities. Use the {@link useSidePanel} to open\n * and control the dialogs.\n * This component needs a parent {@link Rebase}\n * {@link useSidePanel}\n * @group Components\n */\nexport function SidePanelBinding(props: SidePanelBindingProps) {\n\n const {\n allowFullScreen = true,\n path,\n entityId,\n selectedTab,\n formProps\n } = props;\n\n const ResolvedDetailView = useComponentOverride(\"DetailView\", DetailViewBinding);\n\n const {\n blocked,\n setBlocked,\n setBlockedNavigationMessage,\n close\n } = useSideDialogContext();\n\n const navigate = useNavigate();\n\n const sidePanelController = useSidePanel();\n const collectionRegistryController = useCollectionRegistryController();\n const sideDialogsController = useSideDialogContext();\n const urlController = useUrlController();\n\n const onClose = () => {\n if (props.onClose) {\n props.onClose();\n }\n\n setBlocked(false);\n close(true);\n }\n\n const onUpdate = (params: OnUpdateParams) => {\n if (props.onUpdate) {\n props.onUpdate(params);\n }\n setEditInDialog(false);\n if (params.status !== \"existing\") {\n // A newly created entity replaces the panel with its own address,\n // which already leaves the edit view behind.\n sidePanelController.replace({\n path: params.path,\n entityId: params.entityId,\n selectedTab: params.selectedTab,\n updateUrl: collection?.openEntityMode !== \"dialog\",\n collection: params.collection\n });\n } else {\n closeEditView();\n }\n\n if (sideDialogsController.pendingClose) {\n sideDialogsController.setPendingClose(false);\n onClose();\n }\n\n }\n\n const parentCollectionSlugs = useMemo(() => {\n return collectionRegistryController.getParentCollectionSlugs(path);\n }, [collectionRegistryController, path]);\n\n const parentEntityIds = useMemo(() => {\n return collectionRegistryController.getParentEntityIds(path);\n }, [collectionRegistryController, path]);\n\n const collection = collectionRegistryController.getCollection(path) ?? props.collection;\n\n // Dialog mode deliberately stays out of the URL, so it is the only case that\n // needs local edit state. Everywhere else `edit` is a path segment, which\n // keeps refresh and the back button working the same way they do in split.\n const isDialogMode = collection?.openEntityMode === \"dialog\";\n const [editInDialog, setEditInDialog] = useState(false);\n const showEditInPanel = isDialogMode ? editInDialog : selectedTab === \"edit\";\n const isDetailMode = collection?.defaultEntityAction === \"view\" && !showEditInPanel && Boolean(entityId);\n\n // Reset edit mode when switching entities\n useEffect(() => {\n setEditInDialog(false);\n }, [entityId]);\n\n const openEditView = useCallback(() => {\n if (isDialogMode || !entityId) {\n setEditInDialog(true);\n return;\n }\n sidePanelController.replace({\n path,\n entityId,\n selectedTab: \"edit\",\n updateUrl: true,\n collection\n });\n }, [isDialogMode, entityId, path, collection, sidePanelController]);\n\n const closeEditView = useCallback(() => {\n if (isDialogMode || !entityId) {\n setEditInDialog(false);\n return;\n }\n sidePanelController.replace({\n path,\n entityId,\n selectedTab: undefined,\n updateUrl: true,\n collection\n });\n }, [isDialogMode, entityId, path, collection, sidePanelController]);\n\n // One-time correction: when the side panel opens without the correct\n // selectedTab but the resolved collection (from the registry) has a\n // defaultSelectedView, update the panel width and URL to match.\n // This handles cases where defaultSelectedView is set via the collection\n // editor / Studio and is not available on the collection object the\n // caller passed to sidePanelController.open().\n const hasCorrectedDefaultView = useRef(false);\n useEffect(() => {\n hasCorrectedDefaultView.current = false;\n }, [entityId]);\n useEffect(() => {\n if (hasCorrectedDefaultView.current) return;\n if (selectedTab) return; // Already has a tab — no correction needed\n if (!entityId || !collection?.defaultSelectedView) return;\n\n const effectiveDefault = resolveDefaultSelectedView(\n collection.defaultSelectedView,\n { status: \"existing\",\nentityId }\n );\n if (effectiveDefault && effectiveDefault !== \"edit\") {\n hasCorrectedDefaultView.current = true;\n sidePanelController.replace({\n path,\n entityId,\n selectedTab: effectiveDefault,\n updateUrl: collection.openEntityMode !== \"dialog\",\n collection\n });\n }\n }, [selectedTab, entityId, collection, path, sidePanelController]);\n\n // Note: beforeunload is handled by useUnsavedChangesDialog in SideDialogView,\n // which listens to the same `blocked` state via SideDialogContext.\n\n const onValuesModified = useCallback((modified: boolean) => {\n setBlockedNavigationMessage(modified\n ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>\n : undefined)\n setBlocked(modified);\n }, [collection?.name, setBlocked, setBlockedNavigationMessage]);\n\n if (!props || !collection) {\n return <div className={\"w-full\"}/>;\n }\n\n return (\n <>\n <ErrorBoundary>\n {isDetailMode\n ? <ResolvedDetailView\n path={path}\n layout={collection?.openEntityMode === \"dialog\" ? \"dialog\" : \"side_panel\"}\n collection={collection as CollectionConfig}\n entityId={entityId!}\n parentCollectionSlugs={parentCollectionSlugs}\n parentEntityIds={parentEntityIds}\n onEditClick={openEditView}\n barActions={({\n status,\n values\n }) => <div className=\"flex gap-1\">\n <IconButton\n className=\"self-center\"\n size={\"small\"}\n onClick={onClose}>\n <XIcon/>\n </IconButton>\n {allowFullScreen && <IconButton\n className=\"self-center\"\n size={\"small\"}\n onClick={() => {\n if (entityId) {\n const fullScreenUrl = urlController.buildUrlCollectionPath(`${path}/${entityId}`);\n navigate(fullScreenUrl, { state: null });\n }\n }}>\n <Maximize2Icon/>\n </IconButton>}\n </div>}\n onTabChange={({\n entityId: tabEntityId,\n selectedTab,\n collection: paramCollection\n }) => {\n if (collection?.openEntityMode === \"dialog\" || paramCollection?.openEntityMode === \"dialog\") {\n return;\n }\n if (tabEntityId) {\n sidePanelController.replace({\n path,\n entityId: tabEntityId,\n selectedTab,\n updateUrl: true,\n collection: paramCollection ?? collection\n });\n }\n }}\n />\n : <EditViewBinding\n {...props}\n layout={collection?.openEntityMode === \"dialog\" ? \"dialog\" : \"side_panel\"}\n collection={collection as CollectionConfig}\n parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}\n onValuesModified={onValuesModified}\n onSaved={onUpdate}\n navigateBack={closeEditView}\n barActions={({\n status,\n values\n }) => <div className=\"flex gap-1\">\n <IconButton\n className=\"self-center\"\n size={\"small\"}\n onClick={onClose}>\n <XIcon/>\n </IconButton>\n {allowFullScreen && <IconButton\n className=\"self-center\"\n size={\"small\"}\n onClick={() => {\n const key = (status === \"new\" || status === \"copy\") ? path + \"#new\" : path + \"/\" + entityId;\n saveEntityToMemoryCache(key, values);\n setBlocked(false);\n setBlockedNavigationMessage(undefined);\n if (entityId) {\n const fullScreenUrl = urlController.buildUrlCollectionPath(`${path}/${entityId}`);\n navigate(fullScreenUrl, { state: null });\n } else {\n const fullScreenUrl = urlController.buildUrlCollectionPath(path);\n navigate(fullScreenUrl + \"#new\", { state: null });\n }\n }}>\n <Maximize2Icon/>\n </IconButton>}\n </div>}\n onTabChange={({\n entityId: tabEntityId,\n selectedTab,\n collection: paramCollection\n }) => {\n if (collection?.openEntityMode === \"dialog\" || paramCollection?.openEntityMode === \"dialog\") {\n return;\n }\n if (tabEntityId) {\n sidePanelController.replace({\n path,\n entityId: tabEntityId,\n selectedTab,\n updateUrl: true,\n collection: paramCollection ?? collection\n });\n }\n }}\n formProps={formProps}\n />\n }\n </ErrorBoundary>\n\n </>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport type { CustomizationController, SidePanelBindingProps, SideDialogPanelProps, SideDialogsController, SidePanelController, UrlController, NavigationStateController, Property } from \"@rebasepro/types\";\nimport { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport { AuthController, CollectionRegistryController } from \"@rebasepro/types\";\nimport { useLocation } from \"react-router-dom\";\nimport {\n getNavigationEntriesFromPath,\n NavigationViewInternal,\n removeInitialAndTrailingSlashes,\n removeTrailingSlash,\n resolveDefaultSelectedView\n} from \"@rebasepro/common\";\nimport { resolvedSelectedEntityView } from \"../util/resolutions\";\nimport { ADDITIONAL_TAB_WIDTH, CONTAINER_FULL_WIDTH, FORM_CONTAINER_WIDTH } from \"@rebasepro/app\";\nimport { useCustomizationController, useLargeLayout, useComponentOverride, CollectionScopeProvider } from \"@rebasepro/app\";\nimport { JSON_TAB_VALUE, HISTORY_TAB_VALUE } from \"../components/EditViewBinding\";\nimport React from \"react\";\nimport { SidePanelBinding } from \"../components/SidePanelBinding\";\n\n/**\n * Thin wrapper that resolves the Entity.SidePanel component override.\n * Because the JSX is created inside `propsToSidePanel` (a plain function,\n * not a React component), we need this wrapper so the hook is called at the\n * top level of a React component per the Rules of Hooks.\n */\nfunction ResolvedSidePanelBindingInner(props: SidePanelBindingProps) {\n const Resolved = useComponentOverride(\"Entity.SidePanel\", SidePanelBinding);\n return <Resolved {...props}/>;\n}\n\nfunction ResolvedSidePanelBinding(props: SidePanelBindingProps) {\n if (props.collection) {\n return (\n <CollectionScopeProvider collection={props.collection}>\n <ResolvedSidePanelBindingInner {...props}/>\n </CollectionScopeProvider>\n );\n }\n return <ResolvedSidePanelBindingInner {...props}/>;\n}\n\nconst NEW_URL_HASH = \"new_side\";\nconst SIDE_URL_HASH = \"side\";\n\nexport function getEntityViewWidth(props: SidePanelBindingProps<any>, small: boolean, customizationController: CustomizationController): string {\n if (small) return CONTAINER_FULL_WIDTH;\n\n const {\n selectedSecondaryForm\n } = resolvedSelectedEntityView(props.collection?.entityViews, customizationController, props.selectedTab);\n\n const shouldUseSmallLayout = !props.selectedTab || props.selectedTab === \"edit\" || props.selectedTab === JSON_TAB_VALUE || props.selectedTab === HISTORY_TAB_VALUE || Boolean(selectedSecondaryForm);\n\n let resolvedWidth: string | undefined;\n if (props.width) {\n resolvedWidth = typeof props.width === \"number\" ? `${props.width}px` : props.width;\n } else if (props.collection?.sideDialogWidth) {\n resolvedWidth = typeof props.collection.sideDialogWidth === \"number\" ? `${props.collection.sideDialogWidth}px` : props.collection.sideDialogWidth;\n }\n\n if (!shouldUseSmallLayout) {\n return `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedWidth ?? FORM_CONTAINER_WIDTH})`\n } else {\n if (resolvedWidth) {\n return resolvedWidth\n } else if (!props.collection) {\n return FORM_CONTAINER_WIDTH;\n } else {\n return calculateCollectionDesiredWidth(props.collection);\n }\n }\n}\n\nconst collectionViewWidthCache: { [key: string]: string } = {};\n\nfunction calculateCollectionDesiredWidth(collection: CollectionConfig<any>): string {\n if (collectionViewWidthCache[collection.slug]) {\n return collectionViewWidthCache[collection.slug];\n }\n\n let result = FORM_CONTAINER_WIDTH\n if (collection?.properties) {\n const values = Object.values(collection.properties).map((p: Property) => getNestedPropertiesDepth(p));\n const maxDepth = Math.max(...values);\n if (maxDepth < 3) {\n result = FORM_CONTAINER_WIDTH;\n } else {\n result = 768 + 32 * (maxDepth - 2) + \"px\";\n }\n }\n collectionViewWidthCache[collection.slug] = result;\n return result;\n}\n\nfunction getNestedPropertiesDepth(property: Property, accumulator = 0): number {\n if (property.type === \"map\" && property.properties) {\n const values = Object.values(property.properties).flatMap((childProperty) => getNestedPropertiesDepth(childProperty as Readonly<Property>, accumulator + 1));\n return Math.max(...values);\n } else if (property.type === \"array\" && property.oneOf) {\n return accumulator + 3;\n } else if (property.type === \"array\" && property.of) {\n if (Array.isArray(property.of)) {\n return Math.max(...property.of.map((p) => getNestedPropertiesDepth(p, accumulator + 1)));\n } else {\n return getNestedPropertiesDepth(property.of, accumulator + 1);\n }\n } else {\n return accumulator + 1;\n }\n}\n\nexport const useBuildSidePanel = (collectionRegistryController: CollectionRegistryController,\n urlController: UrlController,\n navigationStateController: NavigationStateController,\n sideDialogsController: SideDialogsController,\n authController: AuthController\n): SidePanelController => {\n\n const location = useLocation();\n const initialised = useRef<boolean>(false);\n const currentPanelKeysRef = useRef<string[]>([]);\n const customizationController = useCustomizationController();\n\n const smallLayout = !useLargeLayout();\n\n useEffect(() => {\n\n const newFlag = location.hash === `#${NEW_URL_HASH}`;\n const sideFlag = location.hash === `#${SIDE_URL_HASH}`;\n\n if (!navigationStateController.loading) {\n if ((newFlag || sideFlag) && urlController.isUrlCollectionPath(location.pathname)) {\n const entityOrCollectionPath = urlController.urlPathToDataPath(location.pathname);\n const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, collectionRegistryController.collections ?? [], newFlag);\n for (let i = 0; i < panelsFromUrl.length; i++) {\n const props = panelsFromUrl[i];\n if (i === 0)\n sideDialogsController.replace(propsToSidePanel(props, urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, smallLayout, customizationController, authController, location.search));\n else\n sideDialogsController.open(propsToSidePanel(props, urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, smallLayout, customizationController, authController, location.search))\n }\n }\n initialised.current = true;\n }\n }, [navigationStateController.loading]);\n\n // sync panels if URL changes with #side\n // Use a ref for currentPanelKeys so this effect only fires on URL changes,\n // not on panel state changes. This prevents a race condition with React Router 7\n // where close() clears panels before the URL updates, causing the effect to\n // re-open the panel from the stale #side hash.\n currentPanelKeysRef.current = sideDialogsController.sidePanels.map(p => p.key);\n useEffect(() => {\n if (initialised.current) {\n const sideFlag = location.hash === `#${SIDE_URL_HASH}`;\n if (sideFlag) {\n const currentKeys = currentPanelKeysRef.current;\n const entityOrCollectionPath = urlController.urlPathToDataPath(location.pathname);\n const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, collectionRegistryController.collections ?? [], false);\n // if we have more panels than determined by the url, we ignore the url. We might have references open\n if (panelsFromUrl.length <= currentKeys.length) {\n return;\n }\n const lastPanel = panelsFromUrl[panelsFromUrl.length - 1];\n const panelProps = propsToSidePanel(lastPanel, urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, smallLayout, customizationController, authController, location.search);\n const lastCurrentPanel = currentKeys.length > 0 ? currentKeys[currentKeys.length - 1] : undefined;\n if (!lastCurrentPanel || lastCurrentPanel !== panelProps.key) {\n sideDialogsController.replace(panelProps);\n }\n }\n }\n }, [location.pathname, location.hash]);\n\n // update side panels to match browser size\n // Only update panel widths on layout change — don't recreate components.\n // Recreating components would unmount/remount SidePanelBinding, losing\n // scroll position, unsaved form state, and triggering unnecessary data fetches.\n useEffect(() => {\n const updatedSidePanels = sideDialogsController.sidePanels.map(sidePanelProps => {\n if (sidePanelProps.additional) {\n const entityProps = sidePanelProps.additional as SidePanelBindingProps;\n const newWidth = getEntityViewWidth(entityProps, smallLayout, customizationController);\n if (sidePanelProps.width !== newWidth) {\n return { ...sidePanelProps,\nwidth: newWidth };\n }\n }\n return sidePanelProps;\n });\n sideDialogsController.setSidePanels(updatedSidePanels);\n }, [smallLayout]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n const open = useCallback((props: SidePanelBindingProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy a entity you need to provide a entityId\");\n }\n\n const defaultSelectedView = resolveDefaultSelectedView(\n props.collection ? props.collection.defaultSelectedView : undefined,\n {\n status: props.copy ? \"copy\" : (props.entityId ? \"existing\" : \"new\"),\n entityId: props.entityId\n }\n );\n\n sideDialogsController.open(\n propsToSidePanel({\n ...props,\n selectedTab: props.selectedTab ?? defaultSelectedView\n },\n urlController.buildUrlCollectionPath,\n urlController.resolveDatabasePathsFrom,\n smallLayout,\n customizationController,\n authController,\n location.search\n ));\n\n }, [sideDialogsController, urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, smallLayout, authController.user, location.search]);\n\n const replace = useCallback((props: SidePanelBindingProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy a entity you need to provide a entityId\");\n }\n\n sideDialogsController.replace(propsToSidePanel(props, urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, smallLayout, customizationController, authController, location.search));\n\n }, [urlController.buildUrlCollectionPath, urlController.resolveDatabasePathsFrom, sideDialogsController, smallLayout, authController.user, location.search]);\n\n return useMemo(() => ({\n close,\n open,\n replace\n }), [close, open, replace]);\n};\n\nexport function buildSidePanelsFromUrl(path: string, collections: CollectionConfig[], newFlag: boolean): SidePanelBindingProps<any>[] {\n\n const navigationViewsForPath: NavigationViewInternal<any>[] = getNavigationEntriesFromPath({\n path,\n collections\n });\n\n let sidePanel: SidePanelBindingProps<any> | undefined = undefined;\n let lastCollectionPath = \"\";\n let lastCollectionId: string | undefined = undefined;\n for (let i = 0; i < navigationViewsForPath.length; i++) {\n const navigationEntry = navigationViewsForPath[i];\n\n if (navigationEntry.type === \"collection\") {\n lastCollectionPath = navigationEntry.slug;\n lastCollectionId = navigationEntry.collection.slug;\n }\n\n const previousEntry = navigationViewsForPath[i - 1];\n if (navigationEntry.type === \"entity\") {\n sidePanel = {\n path: navigationEntry.slug,\n entityId: navigationEntry.entityId,\n copy: false,\n collection: navigationEntry.parentCollection,\n width: navigationEntry.parentCollection?.sideDialogWidth\n };\n } else if (navigationEntry.type === \"custom_view\") {\n if (previousEntry?.type === \"entity\") {\n if (sidePanel)\n sidePanel.selectedTab = navigationEntry.view.key;\n }\n } else if (navigationEntry.type === \"collection\") {\n if (previousEntry?.type === \"entity\") {\n if (sidePanel)\n sidePanel.selectedTab = navigationEntry.collection.slug;\n }\n }\n\n }\n\n // `edit` is not a registered view, so the navigation parser skips it. Pick it\n // up from the raw path so that reloading an edit URL reopens the edit form\n // rather than silently dropping the user back on the detail view.\n if (sidePanel && !sidePanel.selectedTab && removeTrailingSlash(path).endsWith(\"/edit\")) {\n sidePanel.selectedTab = \"edit\";\n }\n\n // When the URL doesn't contain a tab segment but the collection has a\n // defaultSelectedView, resolve it so the panel opens with the correct\n // width and the URL is updated on the next replace() cycle.\n if (sidePanel && !sidePanel.selectedTab && sidePanel.collection) {\n const defaultView = resolveDefaultSelectedView(\n sidePanel.collection.defaultSelectedView,\n {\n status: sidePanel.copy ? \"copy\" : (sidePanel.entityId ? \"existing\" : \"new\"),\n entityId: sidePanel.entityId\n }\n );\n if (defaultView) {\n sidePanel.selectedTab = defaultView;\n }\n }\n\n if (newFlag) {\n sidePanel = {\n path: lastCollectionPath,\n copy: false\n }\n }\n\n return sidePanel ? [sidePanel] : [];\n}\n\nconst propsToSidePanel = (props: SidePanelBindingProps,\n buildUrlCollectionPath: (path: string) => string,\n resolveIdsFrom: (pathWithAliases: string) => string,\n smallLayout: boolean,\n customizationController: CustomizationController,\n authController: AuthController,\n locationSearch: string\n): SideDialogPanelProps => {\n\n const collectionPath = removeInitialAndTrailingSlashes(props.path);\n\n // When updateUrl is explicitly false, don't generate URL paths — the dialog\n // opens as an overlay without affecting the browser URL / router.\n const shouldUpdateUrl = props.updateUrl !== false;\n\n const urlPath = shouldUpdateUrl\n ? (props.entityId\n ? buildUrlCollectionPath(`${collectionPath}/${props.entityId}${props.selectedTab ? \"/\" + props.selectedTab : \"\"}${locationSearch}#${SIDE_URL_HASH}`)\n : buildUrlCollectionPath(`${collectionPath}${locationSearch}#${NEW_URL_HASH}`))\n : undefined;\n\n const parentUrlPath = shouldUpdateUrl\n ? buildUrlCollectionPath(collectionPath)\n : undefined;\n\n const resolvedPanelProps: SidePanelBindingProps<any> = {\n ...props,\n formProps: props.formProps\n };\n\n const entityViewWidth = getEntityViewWidth(props, smallLayout, customizationController);\n return {\n key: `${props.path}/${props.entityId}`,\n component: <ResolvedSidePanelBinding {...resolvedPanelProps}/>,\n urlPath: urlPath,\n parentUrlPath: parentUrlPath,\n width: entityViewWidth,\n onClose: props.onClose,\n additional: resolvedPanelProps\n };\n}\n","import type { CollectionConfig, EntityCustomView } from \"@rebasepro/types\";\nimport { Entity, RebaseContext, User } from \"@rebasepro/types\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { getNavigationEntriesFromPath } from \"@rebasepro/common\";\nimport { useCMSContext } from \"./useCMSContext\";\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport type ResolvedNavigationEntry<M extends Record<string, unknown>> =\n | ResolvedNavigationEntity<M>\n | ResolvedNavigationCollection<M>\n | ResolvedNavigationEntityCustom<M>;\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationEntity<M extends Record<string, unknown>> {\n type: \"entity\";\n entity: Entity<M>;\n entityId: string | number;\n path: string;\n parentCollection: CollectionConfig<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationCollection<M extends Record<string, unknown>> {\n type: \"collection\";\n path: string;\n collection: CollectionConfig<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\ninterface ResolvedNavigationEntityCustom<M extends Record<string, unknown>> {\n type: \"custom_view\";\n path: string;\n view: EntityCustomView<M>;\n}\n\n/**\n * Use this function to retrieve an array of navigation entries (resolved\n * collection, entity or entity custom_view) for the given path. You need to pass the app context\n * that you receive in different callbacks, such as the save hooks.\n *\n * It will take into account the `navigation` provided at the `Rebase` level.\n *\n * @param path\n * @param context\n * @group Hooks and utilities\n */\nexport function resolveNavigationFrom<M extends Record<string, unknown>, USER extends User>({\n path,\n context\n}: {\n path: string,\n context: RebaseContext<USER>\n}): Promise<ResolvedNavigationEntry<M>[]> {\n\n const data = context.data;\n const { navigationStateController, collectionRegistryController } = context;\n\n if (!navigationStateController || !collectionRegistryController) {\n throw Error(\"Calling resolveNavigationFrom, but main navigation has not yet been initialised\");\n }\n\n const navigationEntries = getNavigationEntriesFromPath({\n path,\n collections: collectionRegistryController.collections ?? []\n });\n\n const resultPromises: Promise<ResolvedNavigationEntry<any>>[] = navigationEntries\n .map((entry) => {\n if (entry.type === \"collection\") {\n return Promise.resolve(entry);\n } else if (entry.type === \"entity\") {\n const collection = collectionRegistryController.getCollection(entry.slug);\n if (!collection) {\n throw Error(`No collection defined in the navigation for the entity with path ${entry.slug}`);\n }\n // `context.data` is the flat SDK layer; re-wrap the row into the\n // Entity view-model the navigation entry expects. The address is\n // the one we just fetched by — reading it back off the row would\n // find nothing, since a row is only its columns.\n return data.collection(entry.slug).findById(entry.entityId)\n .then((row) => {\n if (!row) return undefined;\n const entity = { id: entry.entityId, path: entry.slug, values: row };\n return { ...entry,\nentity };\n });\n } else if (entry.type === \"custom_view\") {\n return Promise.resolve(entry);\n } else {\n throw Error(\"Unmapped element in useEntitiesFromPath\");\n }\n })\n .filter(v => Boolean(v)) as Promise<ResolvedNavigationEntry<any>>[];\n\n return Promise.all(resultPromises);\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFromProps {\n path: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFrom<M extends Record<string, unknown>> {\n data?: ResolvedNavigationEntry<M>[]\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\n/**\n * Use this hook to retrieve an array of navigation entries (resolved\n * collection or entity) for the given path. You can use this hook\n * in any React component that lives under `Rebase`\n * @group Hooks and utilities\n */\nexport function useResolvedNavigationFrom<M extends Record<string, unknown>>(\n {\n path\n }: NavigationFromProps): NavigationFrom<M> {\n\n const context = useCMSContext();\n const { navigationStateController, collectionRegistryController } = context;\n\n const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n if (navigationStateController && collectionRegistryController) {\n setDataLoading(true);\n setDataLoadingError(undefined);\n resolveNavigationFrom<M, User>({ path,\ncontext })\n .then(setData)\n .catch((e) => setDataLoadingError(e))\n .finally(() => setDataLoading(false));\n }\n\n }, [path, context]);\n\n return useMemo(() => {\n if (!navigationStateController) {\n return { dataLoading: true };\n }\n return { data,\ndataLoading,\ndataLoadingError };\n }, [navigationStateController, data, dataLoading, dataLoadingError]);\n}\n","import { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\nimport { useApiConfig } from \"@rebasepro/app\";\n\nexport interface HistoryEntryData {\n id: string;\n table_name: string;\n entity_id: string;\n action: \"create\" | \"update\" | \"delete\";\n changed_fields: string[] | null;\n values: Record<string, unknown> | null;\n previous_values: Record<string, unknown> | null;\n updated_by: string | null;\n updated_at: string;\n}\n\nexport interface UseEntityHistoryResult {\n entries: HistoryEntryData[];\n total: number;\n isLoading: boolean;\n hasMore: boolean;\n error?: Error;\n loadMore: () => void;\n revert: (historyId: string) => Promise<Record<string, unknown>>;\n}\n\n/**\n * Hook to fetch entity history from the backend REST API.\n * Replaces the old subcollection-based approach with a proper API call.\n */\nexport function useHistory(params: {\n slug: string;\n entityId: string | number | undefined;\n enabled?: boolean;\n pageSize?: number;\n}): UseEntityHistoryResult {\n const { slug, entityId, enabled = true, pageSize = 10 } = params;\n const apiConfig = useApiConfig();\n\n const [entries, setEntries] = useState<HistoryEntryData[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const [offset, setOffset] = useState(0);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n\n // Track the current entity identity so we can detect stale responses\n const currentEntityRef = useRef<string | undefined>(undefined);\n\n const fetchEntries = useCallback(async (\n currentOffset: number,\n signal?: AbortSignal\n ) => {\n if (!apiConfig?.apiUrl || !entityId || !enabled) return;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const token = await apiConfig.getAuthToken?.();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\"\n };\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n\n const url = `${apiConfig.apiUrl}/api/data/${slug}/${entityId}/history?limit=${pageSize}&offset=${currentOffset}`;\n const response = await fetch(url, { headers,\nsignal });\n\n // Check if the request was aborted or the entity changed while in-flight\n if (signal?.aborted) return;\n const entityKey = `${slug}/${entityId}`;\n if (currentEntityRef.current !== entityKey) return;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));\n throw new Error(errorData.error?.message || `Failed to fetch history (${response.status})`);\n }\n\n const result = await response.json();\n\n if (currentOffset === 0) {\n setEntries(result.data);\n } else {\n setEntries(prev => [...prev, ...result.data]);\n }\n\n setTotal(result.meta.total);\n setHasMore(result.meta.hasMore);\n } catch (err) {\n // Don't set error state for intentional aborts\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n }, [apiConfig, slug, entityId, enabled, pageSize]);\n\n // Single unified effect: reset state when entity changes, fetch when offset changes.\n // Uses AbortController to cancel stale requests on entity change or unmount.\n useEffect(() => {\n const entityKey = `${slug}/${entityId}`;\n const isNewEntity = currentEntityRef.current !== entityKey;\n\n if (isNewEntity) {\n // Reset state for new entity\n currentEntityRef.current = entityKey;\n setEntries([]);\n setTotal(0);\n setHasMore(true);\n setOffset(0);\n }\n\n if (!enabled || !entityId) return;\n\n const abortController = new AbortController();\n // When entity changed, always fetch from offset 0\n const effectiveOffset = isNewEntity ? 0 : offset;\n fetchEntries(effectiveOffset, abortController.signal);\n\n return () => {\n abortController.abort();\n };\n }, [fetchEntries, offset, enabled, entityId, slug, refreshTrigger]);\n\n const loadMore = useCallback(() => {\n if (!isLoading && hasMore && offset + entries.length < total) {\n setOffset(prev => prev + pageSize);\n }\n }, [isLoading, hasMore, pageSize, offset, entries.length, total]);\n\n const revert = useCallback(async (historyId: string): Promise<Record<string, unknown>> => {\n if (!apiConfig?.apiUrl || !entityId) {\n throw new Error(\"Cannot revert: missing API configuration or entity ID\");\n }\n\n const token = await apiConfig.getAuthToken?.();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\"\n };\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n\n const url = `${apiConfig.apiUrl}/api/data/${slug}/${entityId}/history/${historyId}/revert`;\n const response = await fetch(url, { method: \"POST\",\nheaders });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));\n throw new Error(errorData.error?.message || `Failed to revert (${response.status})`);\n }\n\n const result = await response.json();\n\n // Refresh the history list after revert by resetting the entity ref\n // and triggering the effect.\n currentEntityRef.current = undefined;\n setRefreshTrigger(prev => prev + 1);\n\n // Return the reverted entity data so callers can update the form\n return result.data as Record<string, unknown>;\n }, [apiConfig, slug, entityId]);\n\n return useMemo(() => ({\n entries,\n total,\n isLoading,\n hasMore,\n error,\n loadMore,\n revert\n }), [entries, total, isLoading, hasMore, error, loadMore, revert]);\n}\n","import type { CollectionConfig, DataSourceDefinition } from \"@rebasepro/types\";\nimport { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\nimport { CollectionRegistry, getParentReferencesFromPath as commonGetParentReferencesFromPath, removeInitialAndTrailingSlashes, getSubcollections } from \"@rebasepro/common\";\nimport { EntityReference, UserConfigurationPersistence, CollectionRegistryController } from \"@rebasepro/types\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\nexport function useBuildCollectionRegistryController(props: {\n userConfigPersistence?: UserConfigurationPersistence,\n dataSources?: Record<string, DataSourceDefinition>\n}): CollectionRegistryController & {\n collectionRegistryRef: React.MutableRefObject<CollectionRegistry>;\n} {\n const { userConfigPersistence, dataSources } = props;\n const collectionRegistryRef = useRef<CollectionRegistry>(new CollectionRegistry(undefined, dataSources));\n // Keep the registry's data sources in sync (used to resolve engine during\n // normalization). Applied synchronously before the async registration\n // effect in useResolvedCollections runs.\n if (dataSources) collectionRegistryRef.current.setDataSources(dataSources);\n const [initialised, setInitialised] = useState(false);\n\n const getCollection = useCallback((\n slugOrPath: string,\n includeUserOverride = false\n ): CollectionConfig | undefined => {\n\n const registry = collectionRegistryRef.current;\n\n const cleanedPath = removeInitialAndTrailingSlashes(slugOrPath);\n if (!cleanedPath) return undefined;\n\n const pathSegments = cleanedPath.split(\"/\");\n\n let collectionPath = pathSegments.join(\"/\");\n // If the path has an even number of segments, it points to a entity, so we get the parent collection\n if (pathSegments.length > 0 && pathSegments.length % 2 === 0) {\n collectionPath = pathSegments.slice(0, -1).join(\"/\");\n }\n\n if (!collectionPath) return undefined;\n\n let collection: CollectionConfig | undefined;\n try {\n collection = registry.resolvePathToCollections(collectionPath).finalCollection;\n } catch (e) {\n console.debug(`Could not resolve path to collection: ${collectionPath}`, e);\n return undefined;\n }\n\n if (!collection) {\n return undefined;\n }\n\n\n const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(slugOrPath) : undefined;\n const overriddenCollection = collection ? mergeDeep(collection, userOverride ?? {}) : undefined;\n\n if (!overriddenCollection) return undefined;\n\n let result: Partial<CollectionConfig> | undefined = overriddenCollection;\n const subcollections = \"subcollections\" in overriddenCollection ? overriddenCollection.subcollections : undefined;\n const callbacks = overriddenCollection.callbacks;\n result = {\n ...result,\n callbacks: result?.callbacks ?? callbacks\n };\n // Preserve subcollections if they exist\n if (subcollections && \"subcollections\" in result) {\n (result as Record<string, unknown>).subcollections = (result as Record<string, unknown>).subcollections ?? subcollections;\n }\n\n return { ...overriddenCollection,\n...result } as CollectionConfig;\n\n }, [userConfigPersistence]);\n\n const getRawCollection = useCallback((slugOrPath: string): CollectionConfig | undefined => {\n const registry = collectionRegistryRef.current;\n if (registry === undefined) return undefined;\n\n const cleanedPath = removeInitialAndTrailingSlashes(slugOrPath);\n if (!cleanedPath) return undefined;\n\n const pathSegments = cleanedPath.split(\"/\");\n\n return registry.getRaw(pathSegments.join(\"/\")) as CollectionConfig | undefined;\n }, []);\n\n const getParentReferencesFromPath = useCallback((path: string): EntityReference[] => {\n const registry = collectionRegistryRef.current;\n if (!registry) {\n return [];\n }\n const cleanedPath = removeInitialAndTrailingSlashes(path);\n const pathSegments = cleanedPath.split(\"/\");\n\n return commonGetParentReferencesFromPath({\n path: pathSegments.join(\"/\"),\n collections: registry.getCollections()\n });\n }, []);\n\n const getParentCollectionSlugs = useCallback((path: string): string[] => {\n const registry = collectionRegistryRef.current;\n if (!registry) {\n return [];\n }\n const cleanedPath = removeInitialAndTrailingSlashes(path);\n const strings = cleanedPath.split(\"/\");\n const oddPathSegments = strings.filter((_, i) => i % 2 === 0);\n oddPathSegments.pop();\n\n const result: string[][] = [];\n\n for (let i = 1; i <= oddPathSegments.length; i++) {\n result.push(oddPathSegments.slice(0, i));\n }\n\n const getCollectionFromPaths = (pathSegments: string[]): CollectionConfig | undefined => {\n if (!pathSegments?.length) return undefined;\n const testPath = pathSegments.reduce((acc, segment, idx) => {\n if (idx === 0) return segment;\n return `${acc}/fake_id/${segment}`;\n }, \"\");\n try {\n return registry.resolvePathToCollections(testPath).finalCollection;\n } catch (e) {\n return undefined;\n }\n };\n\n return result.map(r => getCollectionFromPaths(r)?.slug).filter(Boolean) as string[];\n }, []);\n\n const getParentEntityIds = useCallback((path: string): string[] => {\n const cleanedPath = removeInitialAndTrailingSlashes(path);\n const strings = cleanedPath.split(\"/\");\n const evenPathSegments = strings.filter((_, i) => i % 2 !== 0);\n if (strings.length % 2 === 0) {\n evenPathSegments.pop();\n }\n return evenPathSegments;\n }, []);\n\n const convertIdsToPaths = useCallback((ids: string[]): string[] => {\n const registry = collectionRegistryRef.current;\n if (!registry) return [];\n let currentCollections: CollectionConfig[] = registry.getCollections();\n const paths: string[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const collection: CollectionConfig | undefined = currentCollections.find(c => c.slug === id);\n if (!collection)\n throw Error(`Collection with id ${id} not found`);\n paths.push(collection.slug);\n currentCollections = getSubcollections(collection) ?? [];\n }\n return paths;\n }, []);\n\n const collections = collectionRegistryRef.current.getCollections();\n\n // Determine initialised automatically based on whether collections exist,\n // though the NavigationStateController also plays a role in overall init\n useEffect(() => {\n if (!initialised && collections.length > 0) {\n setInitialised(true);\n }\n }, [initialised, collections.length]);\n\n return useMemo(() => ({\n collections,\n initialised,\n getCollection,\n getRawCollection,\n getParentReferencesFromPath,\n getParentCollectionSlugs,\n getParentEntityIds,\n convertIdsToPaths,\n collectionRegistryRef\n }), [\n collections,\n initialised,\n getCollection,\n getRawCollection,\n getParentReferencesFromPath,\n getParentCollectionSlugs,\n getParentEntityIds,\n convertIdsToPaths\n ]);\n}\n","import type {\n AppView,\n AppViewsBuilder,\n AuthCollectionConfig,\n EntityAction,\n CollectionConfig,\n CollectionConfigsBuilder,\n RebaseContext,\n RebasePlugin,\n UserCreationResult\n} from \"@rebasepro/types\";\nimport { type AuthController, type User, type RebaseData } from \"@rebasepro/types\";\nimport { canReadCollection } from \"@rebasepro/common\";\nimport { resetPasswordAction } from \"../../components/common/default_entity_actions\";\nimport { CreationResultDialog } from \"../../components/admin/CreationResultDialog\";\nimport React from \"react\";\n\n/**\n * Check whether a `RebaseCallContext` is actually the full frontend\n * `RebaseContext` (which carries `dialogsController`).\n */\nfunction isRebaseContext(ctx: unknown): ctx is RebaseContext {\n return typeof ctx === \"object\" && ctx !== null && \"dialogsController\" in ctx;\n}\n\nexport function filterOutNotAllowedCollections(resolvedCollections: CollectionConfig[], authController: AuthController): CollectionConfig[] {\n return resolvedCollections\n .filter((c) => canReadCollection(c, authController))\n .map((c) => {\n if (!c.childCollections) return c;\n return {\n ...c,\n childCollections: () => filterOutNotAllowedCollections(c.childCollections!() ?? [], authController)\n };\n });\n}\n\nexport function applyPluginModifyCollection(resolvedCollections: CollectionConfig[], modifyCollection: (collection: CollectionConfig) => CollectionConfig): CollectionConfig[] {\n return resolvedCollections.map((collection): CollectionConfig => {\n const modifiedCollection = modifyCollection(collection);\n if (modifiedCollection.childCollections) {\n return {\n ...modifiedCollection,\n childCollections: () => applyPluginModifyCollection(modifiedCollection.childCollections!() ?? [], modifyCollection)\n };\n }\n return modifiedCollection;\n });\n}\n\n/**\n * Auto-inject auth-specific entity actions and callbacks for collections\n * with `auth: true` or `auth: { enabled: true }`.\n *\n * Injections:\n * 1. **resetPasswordAction** — adds the entity action unless explicitly disabled,\n * or unless the auth adapter reports no `adminPasswordReset` support. Custom\n * adapters mount their own admin routes and may not implement\n * `POST /admin/users/:userId/reset-password`; injecting the action anyway\n * would show a button that can only ever 404.\n * 2. **afterSave callback** — shows the `CreationResultDialog` when a new user\n * is created with `invitationSent` or `temporaryPassword` in the response\n *\n * Skips injection if the collection already has the action/callback present.\n */\nfunction injectAuthCollectionConfig(\n collections: CollectionConfig[],\n adminPasswordResetSupported: boolean\n): CollectionConfig[] {\n return collections.map((collection) => {\n const authProp = collection.auth;\n if (!authProp) return collection;\n\n const isAuth = authProp === true || (typeof authProp === \"object\" && authProp.enabled === true);\n if (!isAuth) return collection;\n\n const authConfig: AuthCollectionConfig | undefined = typeof authProp === \"object\" ? authProp : undefined;\n\n let result = collection;\n\n // ─── Entity Action injection (resetPassword) ─────────────────────\n const resetPref = authConfig?.actions?.resetPassword;\n let actionToInject: EntityAction | undefined;\n\n if (resetPref === false) {\n actionToInject = undefined;\n } else if (typeof resetPref === \"object\") {\n // An explicitly supplied action is the collection author's own; they\n // own its backend, so the adapter capability doesn't apply.\n actionToInject = resetPref;\n } else if (!adminPasswordResetSupported) {\n actionToInject = undefined;\n } else {\n actionToInject = resetPasswordAction;\n }\n\n if (actionToInject) {\n const injectedAction = actionToInject;\n const existing = result.entityActions ?? [];\n const alreadyHas = existing.some(\n (a) => a.key != null && a.key === injectedAction.key\n );\n if (!alreadyHas) {\n result = {\n ...result,\n entityActions: [...existing, injectedAction]\n };\n }\n }\n\n // ─── afterSave callback (creation result dialog) ─────────────────\n const existingAfterSave = result.callbacks?.afterSave;\n result = {\n ...result,\n callbacks: {\n ...result.callbacks,\n afterSave: async (props) => {\n await existingAfterSave?.(props);\n\n const { values, status, context } = props;\n if (status !== \"new\" && status !== \"copy\") return;\n\n const hasCreationInfo = values.invitationSent !== undefined || values.temporaryPassword !== undefined;\n if (!hasCreationInfo || !isRebaseContext(context) || !context.dialogsController) return;\n\n const { dialogsController } = context;\n\n const creationResult: UserCreationResult = {\n user: {\n uid: String(props.id),\n email: typeof values.email === \"string\" ? values.email : \"\",\n displayName: typeof values.displayName === \"string\" ? values.displayName : \"\",\n roles: Array.isArray(values.roles) ? values.roles as string[] : [],\n photoURL: typeof values.photoURL === \"string\"\n ? values.photoURL\n : typeof values.photoUrl === \"string\"\n ? values.photoUrl\n : null,\n providerId: \"password\",\n isAnonymous: false\n },\n invitationSent: !!values.invitationSent,\n temporaryPassword: typeof values.temporaryPassword === \"string\" ? values.temporaryPassword : undefined,\n emailDeliveryFailed: !!values.emailDeliveryFailed\n };\n\n const { closeDialog } = dialogsController.open({\n key: \"user_creation_result\",\n Component: () => (\n React.createElement(CreationResultDialog, {\n result: creationResult,\n onClose: () => closeDialog()\n })\n )\n });\n }\n }\n };\n\n return result;\n });\n}\n\nexport async function resolveCollections(\n collections: undefined | CollectionConfig[] | CollectionConfigsBuilder,\n authController: AuthController,\n data: RebaseData,\n plugins: RebasePlugin[] | undefined\n): Promise<CollectionConfig[]> {\n let resolvedCollections: CollectionConfig[] = [];\n if (typeof collections === \"function\") {\n resolvedCollections = await collections({\n user: authController.user,\n authController,\n data\n });\n } else if (Array.isArray(collections)) {\n resolvedCollections = collections;\n }\n\n if (plugins) {\n for (const plugin of plugins) {\n if (plugin.hooks?.modifyCollection) {\n resolvedCollections = applyPluginModifyCollection(resolvedCollections, plugin.hooks.modifyCollection);\n }\n\n if (plugin.hooks?.injectCollections) {\n resolvedCollections = plugin.hooks.injectCollections(resolvedCollections);\n }\n }\n }\n\n // Auto-inject auth entity actions and callbacks (resetPassword, creation dialog, etc.)\n resolvedCollections = injectAuthCollectionConfig(\n resolvedCollections,\n authController.capabilities?.adminPasswordReset ?? true\n );\n\n resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);\n return resolvedCollections;\n}\n\nexport async function resolveAppViews(\n baseViews: AppView[] | AppViewsBuilder | undefined,\n authController: AuthController,\n data: RebaseData,\n plugins?: RebasePlugin[]\n): Promise<AppView[]> {\n let resolvedViews: AppView[] = [];\n if (typeof baseViews === \"function\") {\n resolvedViews = await baseViews({\n user: authController.user,\n authController,\n data\n }) ?? [];\n } else if (Array.isArray(baseViews)) {\n resolvedViews = baseViews;\n }\n\n // Inject views from plugins\n if (plugins) {\n for (const plugin of plugins) {\n if (plugin.views && plugin.views.length > 0) {\n resolvedViews = [...resolvedViews, ...plugin.views];\n }\n }\n }\n\n // Detect duplicate view slugs (dev warning)\n if (process.env.NODE_ENV !== 'production') {\n const slugCounts = new Map<string, number>();\n resolvedViews.forEach(v => {\n slugCounts.set(v.slug, (slugCounts.get(v.slug) ?? 0) + 1);\n });\n slugCounts.forEach((count, slug) => {\n if (count > 1) {\n console.warn(\n `[Rebase] Duplicate view slug \"${slug}\" detected (${count} views). ` +\n `Last-write-wins. Ensure unique slugs across CMS views and plugins.`\n );\n }\n });\n }\n\n // Filter by roles — applies to CMS, plugin, and builder-returned views\n resolvedViews = filterViewsByRole(resolvedViews, authController);\n\n return resolvedViews;\n}\n\n/**\n * Filter views by the `roles` field on AppView.\n * When `roles` is set, the view is only included if the current user\n * has at least one of the listed roles. Views without `roles` (or with\n * an empty array) are always included.\n */\nfunction filterViewsByRole(views: AppView[], authController: AuthController): AppView[] {\n const userRoles = authController.user?.roles ?? [];\n return views.filter(view => {\n if (!view.roles || view.roles.length === 0) return true;\n return view.roles.some(role => userRoles.includes(role));\n });\n}\n","import type { AppView, CollectionConfig, RebasePlugin, NavigationGroupMapping } from \"@rebasepro/types\";\n\nimport { getSubcollections } from \"@rebasepro/common\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nexport const NAVIGATION_DEFAULT_GROUP_NAME = \"Views\";\nexport const NAVIGATION_ADMIN_GROUP_NAME = \"Admin\";\n\nexport function getGroup(collectionOrView: CollectionConfig | AppView) {\n const trimmed = collectionOrView.group?.trim();\n if (!trimmed || trimmed === \"\") {\n return NAVIGATION_DEFAULT_GROUP_NAME;\n }\n return trimmed;\n}\n\nexport function computeNavigationGroups({\n navigationGroupMappings,\n collections,\n views,\n plugins\n}: {\n navigationGroupMappings?: NavigationGroupMapping[],\n collections?: CollectionConfig[],\n views?: AppView[],\n plugins?: RebasePlugin[]\n}): NavigationGroupMapping[] {\n\n // Deep clone the input groups upfront to avoid mutating the caller's data\n let result = navigationGroupMappings\n ? navigationGroupMappings.map(g => ({\n name: g.name,\n entries: [...g.entries],\n ...(g.collapsedByDefault !== undefined && { collapsedByDefault: g.collapsedByDefault })\n }))\n : navigationGroupMappings;\n\n // Merge plugin navigation entries\n if (plugins) {\n result = plugins.reduce((acc, plugin) => {\n if (plugin.hooks?.navigationEntries) {\n plugin.hooks.navigationEntries.forEach((entry) => {\n const {\n name,\n entries\n } = entry;\n const existingGroup = acc.find(g => g.name === name);\n if (existingGroup) {\n existingGroup.entries.push(...entries);\n } else {\n acc.push({\n name,\n entries: [...entries]\n });\n }\n });\n\n }\n return acc;\n }, result ?? []);\n }\n\n // Track all entries that are already assigned to groups\n const assignedEntries = new Set<string>();\n if (result) {\n result.forEach(group => {\n group.entries.forEach(entry => assignedEntries.add(entry));\n });\n }\n\n // Find collections and views that are NOT in any persisted group\n const unassignedGroupMap: Record<string, string[]> = {};\n\n // Check collections\n (collections ?? []).forEach(collection => {\n if (collection.hideFromNavigation) return;\n const entry = collection.slug;\n if (!assignedEntries.has(entry)) {\n const groupName = getGroup(collection);\n if (!unassignedGroupMap[groupName]) unassignedGroupMap[groupName] = [];\n unassignedGroupMap[groupName].push(entry);\n }\n });\n\n // Check views\n (views ?? []).forEach(view => {\n if (view.hideFromNavigation) return;\n const entry = Array.isArray(view.slug) ? view.slug[0] : view.slug;\n if (!assignedEntries.has(entry)) {\n const groupName = getGroup(view);\n if (!unassignedGroupMap[groupName]) unassignedGroupMap[groupName] = [];\n unassignedGroupMap[groupName].push(entry);\n }\n });\n\n // Merge unassigned entries into existing groups or create new groups\n Object.entries(unassignedGroupMap).forEach(([groupName, entries]) => {\n if (result) {\n const existingGroup = result.find(g => g.name === groupName);\n if (existingGroup) {\n existingGroup.entries.push(...entries);\n } else {\n result.push({\n name: groupName,\n entries\n });\n }\n }\n });\n\n if (!result) {\n // No persisted data at all - create from scratch\n result = [];\n const groupMap: Record<string, string[]> = {};\n\n // Add collections\n (collections ?? []).forEach(collection => {\n if (collection.hideFromNavigation) return;\n const name = getGroup(collection);\n const entry = collection.slug;\n if (!groupMap[name]) groupMap[name] = [];\n groupMap[name].push(entry);\n });\n\n // Add views\n (views ?? []).forEach(view => {\n if (view.hideFromNavigation) return;\n const name = getGroup(view);\n const entry = Array.isArray(view.slug) ? view.slug[0] : view.slug;\n if (!groupMap[name]) groupMap[name] = [];\n groupMap[name].push(entry);\n });\n\n // Convert groupMap to result array\n result = Object.entries(groupMap).map(([name, entries]) => ({\n name,\n entries\n }));\n }\n\n // Remove duplicates in entries\n result.forEach(group => {\n group.entries = [...new Set(group.entries)];\n });\n\n return result;\n}\n\nexport function areCollectionListsEqual(a: CollectionConfig[], b: CollectionConfig[], visitedSlugs: string[] = []) {\n if (a.length !== b.length) {\n return false;\n }\n const aCopy = [...a];\n const bCopy = [...b];\n const aSorted = aCopy.sort((x, y) => x.slug.localeCompare(y.slug));\n const bSorted = bCopy.sort((x, y) => x.slug.localeCompare(y.slug));\n return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index], visitedSlugs));\n}\n\nexport function areCollectionsEqual(a: CollectionConfig, b: CollectionConfig, visitedSlugs: string[] = []) {\n if (a.slug !== b.slug) {\n return false;\n }\n if (visitedSlugs.includes(a.slug)) {\n return true;\n }\n const newVisited = [...visitedSlugs, a.slug];\n\n if (!areCollectionListsEqual(getSubcollections(a), getSubcollections(b), newVisited)) {\n return false;\n }\n const restAWithoutFunctions = Object.fromEntries(\n Object.entries(a).filter(([k, v]) => typeof v !== \"function\" && k !== \"subcollections\")\n );\n const restBWithoutFunctions = Object.fromEntries(\n Object.entries(b).filter(([k, v]) => typeof v !== \"function\" && k !== \"subcollections\")\n );\n return equal(restAWithoutFunctions, restBWithoutFunctions);\n}\n","import { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\n\nexport type UseAsyncResolverResult<T> = {\n data: T;\n loading: boolean;\n error: Error | undefined;\n refresh: () => void;\n};\n\n/**\n * Generic hook that resolves an async value with loading/error/refresh\n * state management, cancellation on unmount or deps change, and\n * ref-based change detection to prevent unnecessary state updates.\n *\n * Extracted from the common pattern in useResolvedCollections and\n * useResolvedViews.\n */\nexport function useAsyncResolver<T>({\n resolver,\n initialValue,\n isEqual,\n deps,\n disabled,\n}: {\n /** Async function that resolves the data */\n resolver: () => Promise<T>;\n /** Initial value before first resolution */\n initialValue: T;\n /** Equality check to prevent unnecessary state updates */\n isEqual: (a: T, b: T) => boolean;\n /** Effect dependencies — when these change, resolver re-runs */\n deps: React.DependencyList;\n /** When true, skip resolution */\n disabled?: boolean;\n}): UseAsyncResolverResult<T> {\n\n const [data, setData] = useState<T>(initialValue);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n\n const refresh = useCallback(() => {\n setRefreshTrigger(prev => prev + 1);\n }, []);\n\n // Ref for change detection — avoids state updates when data hasn't changed\n const dataRef = useRef<T>(initialValue);\n\n // Store resolver in a ref so we always call the latest version\n // without adding it to effect deps (it's typically a new closure each render)\n const resolverRef = useRef(resolver);\n resolverRef.current = resolver;\n\n // Same for isEqual\n const isEqualRef = useRef(isEqual);\n isEqualRef.current = isEqual;\n\n useEffect(() => {\n if (disabled) return;\n\n let cancelled = false;\n\n (async () => {\n try {\n const result = await resolverRef.current();\n\n if (cancelled) return;\n\n // Only update state if data actually changed\n if (!isEqualRef.current(dataRef.current, result)) {\n dataRef.current = result;\n setData(result);\n }\n\n setError(undefined);\n } catch (e) {\n if (!cancelled) {\n console.error(e);\n setError(e as Error);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [...deps, refreshTrigger, disabled]);\n\n return useMemo(() => ({\n data,\n loading,\n error,\n refresh\n }), [data, loading, error, refresh]);\n}\n","import type { CollectionConfig, RebasePlugin } from \"@rebasepro/types\";\nimport { useRef, useMemo } from \"react\";\n\nimport { AuthController, CollectionRegistryController, RebaseData, User } from \"@rebasepro/types\";\nimport type { CollectionConfigsBuilder } from \"@rebasepro/types\";\nimport { CollectionRegistry } from \"@rebasepro/common\";\n\n\nimport { resolveCollections } from \"./useNavigationResolution\";\nimport { areCollectionListsEqual } from \"./utils\";\nimport { useAsyncResolver } from \"./useAsyncResolver\";\n\nexport type UseResolvedCollectionsProps<EC extends CollectionConfig, USER extends User> = {\n authController: AuthController<USER>;\n collections?: EC[] | CollectionConfigsBuilder<EC>;\n data: RebaseData;\n plugins?: RebasePlugin[];\n disabled?: boolean;\n collectionRegistryController: CollectionRegistryController<EC> & { collectionRegistryRef: React.MutableRefObject<CollectionRegistry> };\n\n};\n\nexport type UseResolvedCollectionsResult = {\n collections: CollectionConfig[];\n loading: boolean;\n error: Error | undefined;\n refresh: () => void;\n};\n\n/**\n * Hook that resolves collection props (which may be async builders or arrays)\n * into concrete CollectionConfig[], and registers them with the CollectionRegistry.\n *\n * When userManagement is provided, the default users collection is always\n * prepended. Developer collections override via generic slug-based dedup\n * (Map keyed by slug, last-write-wins). No hardcoded string checks.\n *\n * Uses refs for potentially-unstable dependencies (driver, authController,\n * plugins) to avoid re-triggering effects when their object identity changes.\n */\nexport function useResolvedCollections<EC extends CollectionConfig, USER extends User>(\n props: UseResolvedCollectionsProps<EC, USER>\n): UseResolvedCollectionsResult {\n\n const {\n authController,\n collections: collectionsProp,\n data,\n plugins,\n disabled,\n collectionRegistryController\n } = props;\n\n // Stable identity string for the user — avoids re-triggering when the\n // authController object reference changes but uid/roles are the same.\n const userIdentity = authController.user\n ? `${authController.user.uid}:${(authController.user.roles ?? []).sort().join(',')}`\n : null;\n\n // Use refs for values that may be new objects each render but shouldn't\n // re-trigger the effect. The effect reads them at execution time.\n const dataRef = useRef(data);\n dataRef.current = data;\n const authControllerRef = useRef(authController);\n authControllerRef.current = authController;\n const pluginsRef = useRef(plugins);\n pluginsRef.current = plugins;\n\n const { data: collections, loading, error, refresh } = useAsyncResolver<CollectionConfig[]>({\n resolver: async () => {\n const resolved = await resolveCollections(\n collectionsProp,\n authControllerRef.current,\n dataRef.current,\n pluginsRef.current\n );\n\n const deduped = [...resolved];\n\n // Register with the CollectionRegistry; returns true if changed\n const changed = collectionRegistryController.collectionRegistryRef.current.registerMultiple(deduped);\n\n if (changed) {\n console.debug(\"Collections have changed\", deduped);\n }\n\n return deduped;\n },\n initialValue: [],\n isEqual: areCollectionListsEqual,\n deps: [collectionsProp, userIdentity, disabled],\n disabled: disabled || authController.initialLoading,\n });\n\n return useMemo(() => ({\n collections,\n loading,\n error,\n refresh\n }), [collections, loading, error, refresh]);\n}\n","\nimport type { AppView, AppViewsBuilder, EffectiveRoleController, RebasePlugin } from \"@rebasepro/types\";\nimport { useMemo, useRef } from \"react\";\n\n/**\n * Compare two view arrays by their slug identity.\n * Returns true when the sets of slugs are identical (same order, same values).\n * This avoids deepEqual on React elements, which have unstable internal refs.\n */\nfunction viewSlugsEqual(a: AppView[] | undefined, b: AppView[] | undefined): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].slug !== b[i].slug) return false;\n }\n return true;\n}\n\nimport type { AuthController, RebaseData, User } from \"@rebasepro/types\";\n\nimport { resolveAppViews } from \"./useNavigationResolution\";\nimport { useAsyncResolver } from \"./useAsyncResolver\";\n\nexport type UseResolvedViewsProps<USER extends User> = {\n authController: AuthController<USER>;\n views?: AppView[] | AppViewsBuilder;\n adminViews?: AppView[] | AppViewsBuilder;\n data: RebaseData;\n plugins?: RebasePlugin[];\n adminMode?: \"content\" | \"studio\" | \"settings\";\n effectiveRoleController?: EffectiveRoleController;\n};\n\nexport type UseResolvedViewsResult = {\n views: AppView[] | undefined;\n adminViews: AppView[] | undefined;\n loading: boolean;\n error: Error | undefined;\n refresh: () => void;\n};\n\n/**\n * Combined result type for the async resolver — holds both views and\n * adminViews so they can be resolved together in a single async call.\n */\ntype ResolvedViewsData = {\n views: AppView[] | undefined;\n adminViews: AppView[] | undefined;\n};\n\n/**\n * Equality check for the combined views data.\n * Compares both views and adminViews by slug identity.\n */\nfunction areResolvedViewsEqual(a: ResolvedViewsData, b: ResolvedViewsData): boolean {\n return viewSlugsEqual(a.views, b.views) && viewSlugsEqual(a.adminViews, b.adminViews);\n}\n\n/**\n * Hook that resolves view and admin view props (which may be async builders or arrays)\n * into concrete AppView[].\n *\n * Uses refs for potentially-unstable dependencies (driver, authController,\n * plugins) to avoid re-triggering effects when their object identity changes.\n */\nexport function useResolvedViews<USER extends User>(\n props: UseResolvedViewsProps<USER>\n): UseResolvedViewsResult {\n\n const {\n authController,\n views: viewsProp,\n adminViews: adminViewsProp,\n data,\n plugins,\n adminMode = \"content\",\n effectiveRoleController\n } = props;\n\n // Stable identity string for the user — avoids re-triggering when the\n // authController object reference changes but uid/roles are the same.\n const userIdentity = authController.user\n ? `${authController.user.uid}:${(authController.user.roles ?? []).sort().join(',')}`\n : null;\n\n // Use refs for values that may be new objects each render but shouldn't\n // re-trigger the effect. The effect reads them at execution time.\n const dataRef = useRef(data);\n dataRef.current = data;\n const authControllerRef = useRef(authController);\n authControllerRef.current = authController;\n const pluginsRef = useRef(plugins);\n pluginsRef.current = plugins;\n\n // Build the resolved auth controller (with effective role override for studio mode)\n const resolvedAuthController = useMemo(() => {\n if (adminMode === \"studio\" && effectiveRoleController?.effectiveRole && authController.user) {\n return {\n ...authController,\n user: {\n ...authController.user,\n roles: [effectiveRoleController.effectiveRole]\n }\n };\n }\n return authController;\n }, [adminMode, effectiveRoleController?.effectiveRole, authController]);\n\n // Store resolvedAuthController in a ref for effect access without re-triggering\n const resolvedAuthControllerRef = useRef(resolvedAuthController);\n resolvedAuthControllerRef.current = resolvedAuthController;\n\n const initialLoading = resolvedAuthController.initialLoading;\n\n const { data: resolvedData, loading, error, refresh } = useAsyncResolver<ResolvedViewsData>({\n resolver: async () => {\n const [newViews, newAdminViews] = await Promise.all([\n resolveAppViews(viewsProp, resolvedAuthControllerRef.current, dataRef.current, pluginsRef.current),\n resolveAppViews(adminViewsProp, resolvedAuthControllerRef.current, dataRef.current)\n ]);\n return { views: newViews, adminViews: newAdminViews };\n },\n initialValue: { views: undefined, adminViews: undefined },\n isEqual: areResolvedViewsEqual,\n deps: [viewsProp, adminViewsProp, adminMode, userIdentity],\n disabled: initialLoading,\n });\n\n return useMemo(() => ({\n views: resolvedData.views,\n adminViews: resolvedData.adminViews,\n loading,\n error,\n refresh\n }), [resolvedData, loading, error, refresh]);\n}\n","import type { AppView, UrlController, CollectionConfig, RebasePlugin, NavigationEntry, NavigationGroupMapping, NavigationResult } from \"@rebasepro/types\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nimport { CollectionRegistryController } from \"@rebasepro/types\";\nimport { CollectionRegistry } from \"@rebasepro/common\";\n\nimport { computeNavigationGroups, getGroup, NAVIGATION_ADMIN_GROUP_NAME, NAVIGATION_DEFAULT_GROUP_NAME } from \"./utils\";\n\nexport type UseTopLevelNavigationProps = {\n collections: CollectionConfig[];\n views: AppView[] | undefined;\n adminViews: AppView[] | undefined;\n plugins?: RebasePlugin[];\n navigationGroupMappings?: NavigationGroupMapping[];\n viewsOrder?: string[];\n urlController: UrlController;\n adminMode?: \"content\" | \"studio\" | \"settings\";\n collectionRegistryController: CollectionRegistryController & { collectionRegistryRef: React.MutableRefObject<CollectionRegistry> };\n};\n\nexport type UseTopLevelNavigationResult = {\n topLevelNavigation: NavigationResult | undefined;\n};\n\n/**\n * Hook that computes the top-level NavigationResult from resolved collections,\n * views, and admin views. Pure computation — no async, no effects.\n *\n * The `onNavigationEntriesUpdate` callback is embedded in the result for API\n * compatibility, but its reference is stable via useCallback.\n */\nexport function useTopLevelNavigation(\n props: UseTopLevelNavigationProps\n): UseTopLevelNavigationResult {\n\n const {\n collections,\n views,\n adminViews,\n plugins,\n navigationGroupMappings,\n viewsOrder,\n urlController,\n adminMode,\n collectionRegistryController\n } = props;\n\n const pluginGroups = useMemo(() => {\n const allPluginGroups = plugins?.flatMap(plugin => plugin.hooks?.navigationEntries ? plugin.hooks.navigationEntries.map(e => e.name) : []) ?? [];\n return [...new Set(allPluginGroups)];\n }, [plugins]);\n\n // Stable reference to the drag-and-drop update callback.\n // We use a ref-based approach internally so the callback identity doesn't\n // change when collections/views change (which would cause NavigationResult\n // equality to always fail).\n const onNavigationEntriesOrderUpdate = useCallback((entries: NavigationGroupMapping[]) => {\n if (!plugins) {\n return;\n }\n // remove all groups that have no entries\n const filteredEntries = entries.filter(entry => entry.entries.length > 0);\n\n // Persist to backend via plugins\n if (plugins.some((plugin: RebasePlugin) => plugin.hooks?.onNavigationEntriesUpdate)) {\n plugins.forEach((plugin: RebasePlugin) => {\n if (plugin.hooks?.onNavigationEntriesUpdate) {\n plugin.hooks.onNavigationEntriesUpdate(filteredEntries);\n }\n });\n }\n }, [plugins]);\n\n const topLevelNavigationRef = useRef<NavigationResult | undefined>(undefined);\n\n const topLevelNavigation = useMemo(() => {\n // Don't compute until we have collections and views resolved\n if (!views && !adminViews && collections.length === 0) {\n return undefined;\n }\n\n const finalNavigationGroupMappings: NavigationGroupMapping[] = computeNavigationGroups({\n navigationGroupMappings,\n collections,\n views: views,\n plugins\n });\n\n const allPluginNavigationEntries = finalNavigationGroupMappings.map((g) => g.entries).flat() ?? [];\n const navigationEntriesOrder = ([...new Set(allPluginNavigationEntries)]);\n\n let navigationEntries: NavigationEntry[] = [\n ...(collections ?? []).reduce((acc, collection) => {\n if (collection.hideFromNavigation) return acc;\n\n const pathKey = collection.slug;\n let groupName = getGroup(collection);\n\n if (finalNavigationGroupMappings) {\n for (const pluginGroupDef of finalNavigationGroupMappings) {\n if (pluginGroupDef.entries.includes(pathKey)) {\n groupName = pluginGroupDef.name;\n break;\n }\n }\n }\n\n acc.push({\n id: `collection:${pathKey}`,\n url: urlController.buildUrlCollectionPath(pathKey),\n type: \"collection\",\n name: collection.name.trim(),\n slug: pathKey,\n collection,\n description: collection.description?.trim(),\n group: groupName ?? NAVIGATION_DEFAULT_GROUP_NAME\n });\n return acc;\n }, [] as NavigationEntry[]),\n\n ...(views ?? []).reduce((acc, view) => {\n if (view.hideFromNavigation) return acc;\n\n const pathKey = view.slug;\n let groupName = getGroup(view);\n\n if (finalNavigationGroupMappings) {\n for (const pluginGroupDef of finalNavigationGroupMappings) {\n if (pluginGroupDef.entries.includes(pathKey)) {\n groupName = pluginGroupDef.name;\n break;\n }\n }\n }\n\n const basePathKey = Array.isArray(pathKey) ? pathKey[0] : pathKey;\n acc.push({\n id: `view:${pathKey}`,\n url: urlController.buildAppUrlPath(basePathKey),\n name: view.name.trim(),\n type: \"view\",\n slug: view.slug,\n view,\n description: view.description?.trim(),\n group: groupName ?? NAVIGATION_DEFAULT_GROUP_NAME\n });\n return acc;\n }, [] as NavigationEntry[]),\n\n ...(adminViews ?? []).reduce((acc, adminView) => {\n if (adminView.hideFromNavigation) return acc;\n\n const pathKey = adminView.slug;\n let groupName = adminView.group?.trim() || NAVIGATION_ADMIN_GROUP_NAME;\n\n if (finalNavigationGroupMappings) {\n for (const pluginGroupDef of finalNavigationGroupMappings) {\n if (pluginGroupDef.entries.includes(pathKey)) {\n groupName = pluginGroupDef.name;\n break;\n }\n }\n }\n\n acc.push({\n id: `admin:${pathKey}`,\n url: urlController.buildAppUrlPath(pathKey),\n name: adminView.name.trim(),\n type: \"admin\",\n slug: adminView.slug,\n view: adminView,\n description: adminView.description?.trim(),\n group: groupName\n });\n return acc;\n }, [] as NavigationEntry[])\n ];\n\n const groupOrderValue = (groupName?: string): number => {\n if (groupName === NAVIGATION_ADMIN_GROUP_NAME || groupName === \"Settings\" || groupName === \"Admin\") return 1;\n return 0;\n };\n\n const usedViewsOrder = viewsOrder ?? navigationEntriesOrder;\n navigationEntries = navigationEntries.sort((a, b) => {\n // Primary: group priority (admin/settings last)\n const groupDiff = groupOrderValue(a.group) - groupOrderValue(b.group);\n if (groupDiff !== 0) return groupDiff;\n\n // Secondary: explicit view order (if provided)\n if (usedViewsOrder) {\n const getSortPath = (navEntry: NavigationEntry) => typeof navEntry.slug === \"string\" ? navEntry.slug : navEntry.slug[0];\n const aIndex = usedViewsOrder.indexOf(getSortPath(a));\n const bIndex = usedViewsOrder.indexOf(getSortPath(b));\n if (aIndex !== -1 || bIndex !== -1) {\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n }\n }\n\n return 0;\n });\n\n const collectedGroupsFromEntries = navigationEntries\n .map(e => e.group)\n .filter(Boolean) as string[];\n\n const groupsFromMappings = finalNavigationGroupMappings.map(g => g.name);\n const additionalGroups = collectedGroupsFromEntries.filter(g => !groupsFromMappings.includes(g));\n\n const allDefinedGroups = [\n ...(pluginGroups ?? []),\n ...groupsFromMappings,\n ...additionalGroups\n ];\n\n const uniqueGroupsArray = [...new Set(allDefinedGroups)];\n const lastGroups = uniqueGroupsArray.filter(g => g === NAVIGATION_ADMIN_GROUP_NAME || g === \"Settings\" || g === \"Admin\");\n const otherGroups = uniqueGroupsArray.filter(g => g !== NAVIGATION_ADMIN_GROUP_NAME && g !== \"Settings\" && g !== \"Admin\");\n const uniqueGroups = [...otherGroups, ...lastGroups] as string[];\n\n const computedTopLevelNav = {\n allowDragAndDrop: plugins?.some((plugin: RebasePlugin) => plugin.hooks?.allowDragAndDrop) ?? false,\n navigationEntries,\n groups: uniqueGroups,\n onNavigationEntriesUpdate: onNavigationEntriesOrderUpdate\n };\n\n // Cache the newly computed navigation result and return the cached reference\n // if it is deeply equal to the previous one, to prevent reference churn.\n const isNavEqual = topLevelNavigationRef.current &&\n equal(topLevelNavigationRef.current.navigationEntries, computedTopLevelNav.navigationEntries) &&\n equal(topLevelNavigationRef.current.groups, computedTopLevelNav.groups) &&\n topLevelNavigationRef.current.allowDragAndDrop === computedTopLevelNav.allowDragAndDrop;\n\n if (isNavEqual) {\n return topLevelNavigationRef.current;\n }\n\n topLevelNavigationRef.current = computedTopLevelNav;\n return computedTopLevelNav;\n }, [\n collections,\n views,\n adminViews,\n navigationGroupMappings,\n urlController.buildAppUrlPath,\n urlController.buildUrlCollectionPath,\n pluginGroups,\n plugins,\n adminMode,\n viewsOrder,\n onNavigationEntriesOrderUpdate\n ]);\n\n return useMemo(() => ({\n topLevelNavigation\n }), [topLevelNavigation]);\n}\n","import type { AppView, CollectionConfig, NavigationResult, RebasePlugin, NavigationStateController, UrlController, NavigationGroupMapping } from \"@rebasepro/types\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\nimport { AuthController, RebaseData, CollectionRegistryController, User } from \"@rebasepro/types\";\nimport type { CollectionConfigsBuilder, AppViewsBuilder, EffectiveRoleController } from \"@rebasepro/types\";\nimport { CollectionRegistry } from \"@rebasepro/common\";\n\n\nimport { useResolvedCollections } from \"./useResolvedCollections\";\nimport { useResolvedViews } from \"./useResolvedViews\";\nimport { useTopLevelNavigation } from \"./useTopLevelNavigation\";\n\nexport type BuildNavigationStateProps<EC extends CollectionConfig, USER extends User> = {\n authController: AuthController<USER>;\n collections?: EC[] | CollectionConfigsBuilder<EC>;\n views?: AppView[] | AppViewsBuilder;\n adminViews?: AppView[] | AppViewsBuilder;\n data: RebaseData;\n plugins?: RebasePlugin[];\n navigationGroupMappings?: NavigationGroupMapping[];\n disabled?: boolean;\n viewsOrder?: string[];\n collectionRegistryController: CollectionRegistryController<EC> & { collectionRegistryRef: React.MutableRefObject<CollectionRegistry> };\n urlController: UrlController;\n adminMode?: \"content\" | \"studio\" | \"settings\";\n effectiveRoleController?: EffectiveRoleController;\n\n};\n\n/**\n * Main hook that resolves collections, views, and admin views into a\n * NavigationStateController. This is a thin composition of three focused hooks:\n *\n * - useResolvedCollections: resolves collection props and registers with CollectionRegistry\n * - useResolvedViews: resolves view/admin view props\n * - useTopLevelNavigation: computes the NavigationResult from resolved data\n *\n * The NavigationStateController type is preserved as a public API.\n */\nexport function useBuildNavigationStateController<EC extends CollectionConfig, USER extends User>(\n props: BuildNavigationStateProps<EC, USER>\n): NavigationStateController {\n\n const {\n authController,\n collections: collectionsProp,\n views: viewsProp,\n adminViews: adminViewsProp,\n viewsOrder,\n plugins,\n data,\n disabled,\n navigationGroupMappings,\n collectionRegistryController,\n urlController,\n adminMode = \"content\",\n effectiveRoleController\n } = props;\n\n const {\n collections,\n loading: collectionsLoading,\n error: collectionsError,\n refresh: refreshCollections\n } = useResolvedCollections({\n authController,\n collections: collectionsProp,\n data,\n plugins,\n disabled,\n collectionRegistryController\n });\n\n const {\n views,\n adminViews,\n loading: viewsLoading,\n error: viewsError,\n refresh: refreshViews\n } = useResolvedViews({\n authController,\n views: viewsProp,\n adminViews: adminViewsProp,\n data,\n plugins,\n adminMode,\n effectiveRoleController\n });\n\n // Step 3: Compute top-level navigation (pure derived state)\n const { topLevelNavigation } = useTopLevelNavigation({\n collections,\n views,\n adminViews,\n plugins,\n navigationGroupMappings,\n viewsOrder,\n urlController,\n adminMode,\n collectionRegistryController\n });\n\n // Expose a combined refresh function with microtask batching\n const pendingRefreshRef = useRef(false);\n const refreshNavigation = useCallback(() => {\n if (pendingRefreshRef.current) return;\n pendingRefreshRef.current = true;\n queueMicrotask(() => {\n pendingRefreshRef.current = false;\n refreshCollections();\n refreshViews();\n });\n }, [refreshCollections, refreshViews]);\n\n return useMemo(() => ({\n views,\n adminViews,\n topLevelNavigation,\n loading: collectionsLoading || viewsLoading,\n navigationLoadingError: collectionsError ?? viewsError,\n refreshNavigation\n }), [\n views,\n adminViews,\n topLevelNavigation,\n collectionsLoading,\n viewsLoading,\n collectionsError,\n viewsError,\n refreshNavigation\n ]);\n}\n","import type { UrlController, NavigateOptions } from \"@rebasepro/types\";\nimport { useCallback, useMemo } from \"react\";\nimport { removeInitialAndTrailingSlashes, resolveCollectionPathIds } from \"@rebasepro/common\";\nimport { CollectionRegistryController } from \"@rebasepro/types\";\nimport { useNavigate } from \"react-router-dom\";\n\nexport function useBuildUrlController(props: {\n basePath: string,\n baseCollectionPath: string,\n collectionRegistryController: CollectionRegistryController\n}): UrlController {\n\n const { basePath, baseCollectionPath, collectionRegistryController } = props;\n const navigate = useNavigate();\n\n const homeUrl = basePath === \"/\" ? \"/\" : `/${removeInitialAndTrailingSlashes(basePath)}`;\n\n const buildUrlCollectionPath = useCallback((path: string): string => {\n const fullPath = basePath === \"/\" ? `${baseCollectionPath}/${path}` : `${basePath}${baseCollectionPath}/${path}`;\n return fullPath.replace(/\\/\\//g, \"/\");\n }, [basePath, baseCollectionPath]);\n\n const buildAppUrlPath = useCallback((path: string): string => {\n const fullPath = basePath === \"/\" ? `/${path}` : `${basePath}/${path}`;\n return fullPath.replace(/\\/\\//g, \"/\");\n }, [basePath]);\n\n const urlPathToDataPath = useCallback((cmsPath: string): string => {\n let path = cmsPath;\n if (basePath !== \"/\" && path.startsWith(basePath)) {\n path = path.replace(basePath, \"\");\n }\n if (path.startsWith(baseCollectionPath)) {\n path = path.replace(baseCollectionPath, \"\");\n }\n return removeInitialAndTrailingSlashes(path);\n }, [basePath, baseCollectionPath]);\n\n const isUrlCollectionPath = useCallback((urlPath: string): boolean => {\n let path = urlPath;\n if (basePath !== \"/\" && path.startsWith(basePath)) {\n path = path.replace(basePath, \"\");\n }\n return path === baseCollectionPath || path.startsWith(baseCollectionPath + \"/\");\n }, [basePath, baseCollectionPath]);\n\n const resolveDatabasePathsFrom = useCallback((path: string): string => {\n return resolveCollectionPathIds(path, collectionRegistryController.collections ?? []);\n }, [collectionRegistryController]);\n\n const navigateTo = useCallback((to: string, options?: NavigateOptions) => {\n navigate(to, options);\n }, [navigate]);\n\n return useMemo(() => ({\n basePath,\n baseCollectionPath,\n urlPathToDataPath,\n homeUrl,\n isUrlCollectionPath,\n buildUrlCollectionPath,\n buildAppUrlPath,\n resolveDatabasePathsFrom,\n navigate: navigateTo\n }), [basePath, baseCollectionPath, urlPathToDataPath, homeUrl, isUrlCollectionPath, buildUrlCollectionPath, buildAppUrlPath, resolveDatabasePathsFrom, navigateTo]);\n}\n","import type { SideDialogPanelProps } from \"../hooks/useSideDialogsController\";\nimport React, { useCallback, useContext, useEffect, useState, useMemo } from \"react\";\nimport { useSideDialogsController } from \"../hooks\";\nimport { Sheet, Dialog } from \"@rebasepro/ui\";\nimport { useUnsavedChangesDialog, UnsavedChangesDialog } from \"@rebasepro/app\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport type { SidePanelBindingProps } from \"@rebasepro/types\";\n\n\nexport type SideDialogController = {\n blocked: boolean,\n setBlocked: (blocked: boolean) => void,\n setBlockedNavigationMessage: (message?: React.ReactNode) => void,\n width?: string,\n close: (force?: boolean) => void;\n pendingClose: boolean,\n setPendingClose: (pendingClose: boolean) => void\n}\n\nconst SideDialogContext = React.createContext<SideDialogController>({\n width: \"\",\n blocked: false,\n setBlocked: (blocked: boolean) => {\n },\n setBlockedNavigationMessage: (message?: React.ReactNode) => {\n },\n close: () => {\n },\n pendingClose: false,\n setPendingClose: () => {\n\n }\n});\n\n/**\n * This hook is used to access the properties of a particular side dialog,\n * in contrast with {@link useSideDialogsController} which handles the\n * state of all the dialogs.\n */\nexport const useSideDialogContext = () => useContext<SideDialogController>(SideDialogContext);\n\n/**\n * This is the component in charge of rendering the side dialogs used\n * for editing entities. Use the {@link useSidePanel} to open\n * and control the dialogs.\n * This component needs a parent {@link Rebase}\n * {@link useSideDialogsController}\n * @group Components\n */\nexport function SideDialogs() {\n\n const sideDialogsController = useSideDialogsController();\n\n const sidePanels = sideDialogsController.sidePanels;\n\n // A trailing `undefined` slot (\"ghost panel\") is always appended so that\n // close animations work correctly. Index-based keys ensure that when the\n // last real panel is removed, the ghost inherits key=0 — re-using the\n // same SideDialogView instance so the Sheet smoothly transitions from\n // open → closed rather than unmounting instantly.\n const panels: (SideDialogPanelProps | undefined)[] = [...sidePanels];\n panels.push(undefined);\n\n return <>\n {\n panels.map((panel, index) =>\n <SideDialogView\n key={`side_dialog_${index}`}\n panel={panel}\n panelIndex={index}\n offsetPosition={sidePanels.length - index - 1}\n isTopPanel={index === sidePanels.length - 1}/>)\n }\n </>;\n}\n\nfunction SideDialogView({\n offsetPosition,\n panel,\n panelIndex,\n isTopPanel\n}: {\n offsetPosition: number,\n panel?: SideDialogPanelProps,\n panelIndex: number,\n isTopPanel: boolean\n}) {\n\n // was the closing of the dialog requested by the drawer\n const [drawerCloseRequested, setDrawerCloseRequested] = useState<boolean>(false);\n const [blocked, setBlocked] = useState(false);\n const [blockedNavigationMessage, setBlockedNavigationMessage] = useState<React.ReactNode | undefined>();\n\n const [pendingClose, setPendingClose] = useState(false);\n\n const widthRef = React.useRef<string | undefined>(panel?.width);\n const width = widthRef.current;\n\n const sideDialogsController = useSideDialogsController();\n\n // Prevent non-topmost dialogs from being dismissed by outside clicks.\n // When stacked Sheets exist, clicking the overlay of the topmost dialog\n // would otherwise propagate and dismiss lower dialogs too.\n const preventDismiss = useCallback((e: Event) => {\n e.preventDefault();\n }, []);\n\n const { dialogProps, triggerDialog } = useUnsavedChangesDialog(\n blocked,\n () => setBlocked(false)\n );\n\n useEffect(() => {\n if (panel)\n widthRef.current = panel.width;\n }, [panel])\n\n const handleDrawerCloseOk = () => {\n setBlocked(false);\n setDrawerCloseRequested(false);\n sideDialogsController.close();\n panel?.onClose?.();\n };\n\n const handleDrawerCloseCancel = () => {\n setDrawerCloseRequested(false);\n };\n\n const onCloseRequest = useCallback((force?: boolean) => {\n if (blocked && !force) {\n setDrawerCloseRequested(true);\n triggerDialog();\n } else {\n sideDialogsController.close();\n panel?.onClose?.();\n }\n }, [blocked, triggerDialog, sideDialogsController, panel]);\n\n const contextValue = useMemo(() => ({\n blocked,\n setBlocked,\n setBlockedNavigationMessage,\n width,\n close: onCloseRequest,\n pendingClose,\n setPendingClose\n }), [blocked, setBlockedNavigationMessage, width, onCloseRequest, pendingClose]);\n\n const additionalProps = panel?.additional as SidePanelBindingProps | undefined;\n const isDialogMode = additionalProps?.collection?.openEntityMode === \"dialog\";\n\n return (\n <SideDialogContext.Provider value={contextValue}>\n\n {isDialogMode ? (\n <Dialog\n open={Boolean(panel)}\n onOpenChange={(open) => {\n if (!open) {\n onCloseRequest();\n }\n }}\n maxWidth=\"4xl\"\n scrollable={false}\n >\n {panel && (\n <div className=\"flex flex-col h-[75vh] min-h-[500px] min-w-[55vw] max-w-full overflow-hidden\">\n <ErrorBoundary>\n {panel.component}\n </ErrorBoundary>\n </div>\n )}\n </Dialog>\n ) : (\n <Sheet\n open={Boolean(panel)}\n includeBackgroundOverlay={true}\n overlayStyle={{ zIndex: 40 + panelIndex * 10 }}\n style={{ zIndex: 45 + panelIndex * 10 }}\n onOpenChange={(open) => {\n if (!open) {\n onCloseRequest();\n }\n }}\n onPointerDownOutside={!isTopPanel ? preventDismiss : undefined}\n onInteractOutside={!isTopPanel ? preventDismiss : undefined}\n title={\"Side dialog \" + panel?.key}\n >\n {panel &&\n <div\n className={\"transform max-w-[100vw] lg:max-w-[95vw] flex flex-col h-full transition-all duration-250 ease-in-out bg-white dark:bg-surface-800 \"}\n style={{\n width: panel.width,\n transform: `translateX(-${offsetPosition * 200}px)`\n }}\n >\n <ErrorBoundary>\n {panel.component}\n </ErrorBoundary>\n </div>}\n\n {!panel && <div style={{ width }}/>}\n\n </Sheet>\n )}\n\n <UnsavedChangesDialog\n {...dialogProps}\n handleOk={() => {\n dialogProps.handleOk();\n if (drawerCloseRequested) {\n handleDrawerCloseOk();\n }\n }}\n handleCancel={() => {\n dialogProps.handleCancel();\n if (drawerCloseRequested) {\n handleDrawerCloseCancel();\n }\n }}\n body={blockedNavigationMessage || \"There are unsaved changes\"}/>\n\n </SideDialogContext.Provider>\n\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CollectionSize, Entity, FilterValues } from \"@rebasepro/types\";\n\nimport {\n CollectionRowActions,\n CollectionTableBinding\n} from \"../CollectionTableBinding\";\nimport {\n CollectionScopeProvider,\n useAuthController,\n useCustomizationController,\n useData,\n useDataTableController,\n useLargeLayout,\n usePermissions\n} from \"@rebasepro/app\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { Button, DialogActions, PlusIcon, Typography } from \"@rebasepro/ui\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { useSelectionController } from \"../CollectionViewBinding/useSelectionController\";\n\nimport { useColumnIds } from \"@rebasepro/app\";\nimport { useSideDialogContext } from \"../SideDialogs\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\nimport { useUrlController } from \"../../hooks/navigation/contexts/UrlContext\";\nimport { useSidePanel } from \"../../hooks/useSidePanel\";\n\n/**\n * @group Components\n */\nexport interface SelectionProps<M extends Record<string, unknown>> {\n\n /**\n * Allow multiple selection of values\n */\n multiselect?: boolean;\n\n /**\n * Entity collection config\n */\n collection?: CollectionConfig<M>;\n\n /**\n * Absolute path of the collection.\n * May be not set if this hook is being used in a component and the path is\n * dynamic. If not set, the dialog won't open.\n */\n path: string;\n\n /**\n * If you are opening the dialog for the first time, you can select some\n * entity ids to be displayed first.\n */\n selectedEntityIds?: (string | number)[];\n\n /**\n * If `multiselect` is set to `false`, you will get the selected entity\n * in this callback.\n * @param entity\n * @callback\n */\n onSingleEntitySelected?(entity: Entity<any> | null): void;\n\n /**\n * If `multiselect` is set to `true`, you will get the selected entities\n * in this callback.\n * @param entities\n * @callback\n */\n onMultipleEntitiesSelected?(entities: Entity<any>[]): void;\n\n /**\n * Allow selection of entities that pass the given filter only.\n */\n fixedFilter?: FilterValues<string>;\n\n /**\n * Use this description to indicate the user what to do in this dialog.\n */\n description?: React.ReactNode;\n\n /**\n * Maximum number of entities that can be selected.\n */\n maxSelection?: number;\n\n}\n\n/**\n * This component allows to select entities from a given collection.\n * You probably want to open this dialog as a side view using {@link useSelectionTableBinding}\n * @group Components\n */\nexport function SelectionTableBinding<M extends Record<string, unknown>>(\n props: SelectionProps<M>\n) {\n if (!props.collection) {\n return <ErrorView\n error={\"Could not find collection\"}/>\n }\n return <SelectionTableBindingInternal {...props} collection={props.collection} />;\n}\n\nfunction SelectionTableBindingInternal<M extends Record<string, unknown>>(\n {\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n multiselect,\n collection,\n path: pathInput,\n selectedEntityIds: selectedEntityIdsProp,\n description,\n fixedFilter,\n maxSelection\n }: SelectionProps<M> & { collection: CollectionConfig<M> }) {\n\n const sideDialogContext = useSideDialogContext();\n const sidePanelController = useSidePanel();\n const urlController = useUrlController();\n const analyticsController = useAnalyticsController();\n\n const path = urlController.resolveDatabasePathsFrom(pathInput);\n\n const dataClient = useData();\n\n const [entitiesDisplayedFirst, setEntitiesDisplayedFirst] = useState<Entity<any>[]>([]);\n\n const selectionController = useSelectionController();\n\n // Track whether the selection has been initialized to avoid\n // firing onMultipleEntitiesSelected during the initial mount/fetch.\n const selectionInitializedRef = useRef(false);\n\n // Propagate selection changes to the parent callback.\n // This runs after the selectionController state updates, ensuring\n // we always send the correct, non-stale selection to the parent.\n useEffect(() => {\n if (!selectionInitializedRef.current) return;\n if (onMultipleEntitiesSelected) {\n onMultipleEntitiesSelected(selectionController.selectedEntities);\n }\n }, [selectionController.selectedEntities]);\n\n /**\n * Fetch initially selected ids\n */\n useEffect(() => {\n let unmounted = false;\n const selectedEntityIds = selectedEntityIdsProp?.map(id => id?.toString()).filter(Boolean);\n if (selectedEntityIds && selectedEntityIds.length > 0 && collection) {\n Promise.all(\n selectedEntityIds.map((entityId) =>\n dataClient.collection(path).findById(entityId))\n )\n .then((entities) => {\n if (!unmounted) {\n const result = entities.filter((e): e is Entity<any> => !!e);\n selectionController.setSelectedEntities(result);\n setEntitiesDisplayedFirst(result);\n // Mark initialized after the initial fetch completes\n selectionInitializedRef.current = true;\n }\n });\n } else {\n selectionController.setSelectedEntities([]);\n setEntitiesDisplayedFirst([]);\n selectionInitializedRef.current = true;\n }\n return () => {\n unmounted = true;\n };\n }, [dataClient, path, selectedEntityIdsProp, collection, selectionController.setSelectedEntities]);\n\n const onClear = () => {\n analyticsController.onAnalyticsEvent?.(\"reference_selection_clear\", {\n path\n });\n selectionController.setSelectedEntities([]);\n if (!multiselect && onSingleEntitySelected) {\n onSingleEntitySelected(null);\n }\n };\n\n const onEntityClick = useCallback((entity: Entity<any>) => {\n if (!multiselect && onSingleEntitySelected) {\n analyticsController.onAnalyticsEvent?.(\"reference_selected_single\", {\n path,\n entityId: entity.id\n });\n onSingleEntitySelected(entity);\n sideDialogContext.close(false);\n } else {\n // For multiselect, delegate to the selection controller's toggle.\n // The useEffect above will propagate the change to onMultipleEntitiesSelected.\n analyticsController.onAnalyticsEvent?.(\"reference_selection_toggle\", {\n path,\n entityId: entity.id\n });\n const selectedEntities = selectionController.selectedEntities;\n if (selectedEntities.map((e) => e.id).indexOf(entity.id) > -1) {\n selectionController.setSelectedEntities(\n selectedEntities.filter((item: Entity<any>) => item.id !== entity.id)\n );\n } else {\n if (maxSelection && selectedEntities.length >= maxSelection) return;\n selectionController.setSelectedEntities([...selectedEntities, entity]);\n }\n }\n }, [multiselect, onSingleEntitySelected, analyticsController, path, sideDialogContext, selectionController, maxSelection]);\n\n // create a new entity from within the reference dialog\n const onNewClick = () => {\n analyticsController.onAnalyticsEvent?.(\"reference_selection_new_entity\", {\n path\n });\n sidePanelController.open({\n path: path,\n collection,\n updateUrl: true,\n onUpdate: ({ entity }) => {\n setEntitiesDisplayedFirst([entity, ...entitiesDisplayedFirst]);\n onEntityClick(entity);\n },\n closeOnSave: true\n });\n };\n\n const tableRowActionsBuilder = ({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n const selectedEntities = selectionController.selectedEntities;\n const isSelected = selectedEntities && selectedEntities.map(e => e.id).indexOf(entity.id) > -1;\n return <CollectionRowActions\n width={width}\n frozen={frozen}\n entity={entity}\n size={size}\n isSelected={isSelected}\n selectionEnabled={multiselect}\n hideId={collection?.hideIdFromCollection}\n path={path}\n selectionController={selectionController}\n openEntityMode={\"side_panel\"}\n />;\n\n };\n\n const onDone = useCallback((event: React.SyntheticEvent) => {\n event.stopPropagation();\n sideDialogContext.close(false);\n }, [sideDialogContext]);\n\n const displayedColumnIds = useColumnIds(collection, false);\n\n const tableController = useDataTableController<M>({\n path,\n collection,\n entitiesDisplayedFirst,\n fixedFilter,\n updateUrl: false\n });\n\n return (\n\n <CollectionScopeProvider collection={collection}>\n <div className=\"flex flex-col h-full\">\n\n <div className=\"grow\">\n {entitiesDisplayedFirst &&\n <CollectionTableBinding\n additionalFields={collection.additionalFields}\n displayedColumnIds={displayedColumnIds}\n onEntityClick={onEntityClick}\n tableController={tableController}\n enablePopupIcon={false}\n tableRowActionsBuilder={tableRowActionsBuilder}\n openEntityMode={\"side_panel\"}\n title={<Typography variant={\"subtitle2\"} className={\"flex flex-row gap-2\"}>\n <IconForView\n size={\"small\"}\n collectionOrView={collection}\n className={\"text-surface-300 dark:text-surface-600\"}/>\n {collection.singularName\n ? `Select ${collection.singularName}`\n : `Select from ${collection.name}`}\n </Typography>}\n defaultSize={collection.defaultSize}\n properties={collection.properties}\n fixedFilter={fixedFilter}\n inlineEditing={false}\n selectionController={selectionController}\n actions={<EntitySelectionDialogActions\n collection={collection}\n path={path}\n onNewClick={onNewClick}\n onClear={onClear}/>\n }\n />}\n </div>\n <DialogActions translucent={false}>\n {description &&\n <Typography variant={\"body2\"}\n className=\"grow text-left\">\n {description}\n </Typography>}\n <Button\n onClick={onDone}\n variant=\"filled\">\n Done\n </Button>\n </DialogActions>\n </div>\n </CollectionScopeProvider>\n\n );\n\n}\n\nfunction EntitySelectionDialogActions({\n collection,\n path,\n onClear,\n onNewClick\n}: {\n collection: CollectionConfig<any>,\n path: string,\n onClear: () => void,\n onNewClick: () => void\n}) {\n\n const { canCreate } = usePermissions();\n\n const largeLayout = useLargeLayout();\n\n const onClick: MouseEventHandler<HTMLButtonElement> | undefined = onNewClick\n ? (e) => {\n e.preventDefault();\n onNewClick();\n }\n : undefined;\n const addButton = canCreate(collection, path) &&\n onClick && (largeLayout\n ? <Button\n onClick={onClick}\n startIcon={<PlusIcon/>}>\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n onClick={onClick}>\n <PlusIcon/>\n </Button>);\n\n return (\n <>\n <Button onClick={onClear}\n variant={\"text\"}>\n Clear\n </Button>\n {addButton}\n </>\n );\n}\n","import { SelectionProps, SelectionTableBinding } from \"../components/ReferenceTable/SelectionTableBinding\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport { useCallback, useMemo } from \"react\";\nimport { useSideDialogsController } from \"./useSideDialogsController\";\nimport { useCollectionRegistryController } from \"./navigation/contexts/CollectionRegistryContext\";\n\n/**\n * This hook is used to open a side dialog that allows the selection\n * of entities under a given path.\n * You can use it in custom views for selecting entities.\n * You need to specify the path of the target collection at least.\n * If your collection is not defined in your top collection configuration\n * (in your `Rebase` component), you need to specify explicitly.\n * This is the same hook used internally when a reference property is defined.\n * @group Hooks and utilities\n */\nexport function useSelectionDialog<M extends Record<string, unknown>>(referenceDialogProps: Omit<SelectionProps<M>, \"path\"> & {\n path?: string | false;\n onClose?: () => void;\n}): { open: () => void; close: () => void } {\n\n const navigation = useCollectionRegistryController();\n const sideDialogsController = useSideDialogsController();\n\n const open = useCallback(() => {\n if (referenceDialogProps.path) {\n let usedCollection = referenceDialogProps.collection;\n if (!usedCollection)\n usedCollection = navigation.getCollection(referenceDialogProps.path) as CollectionConfig<M> | undefined;\n if (!usedCollection)\n throw Error(\"Not able to resolve the collection in useSelectionDialog. Make sure a collection is registered in path \" + referenceDialogProps.path);\n sideDialogsController.open({\n key: `reference_${referenceDialogProps.path}`,\n component:\n <SelectionTableBinding\n collection={usedCollection}\n {...referenceDialogProps as SelectionProps<M>}/>,\n width: \"90vw\",\n onClose: () => {\n referenceDialogProps.onClose?.();\n }\n });\n } else {\n throw Error(\"useReferenceDialog: You are trying to open a reference dialog, but have not declared the `path`\")\n }\n }, [navigation, referenceDialogProps, sideDialogsController]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n return useMemo(() => ({\n open,\n close\n }), [open, close]);\n\n}\n","import { useSelectionDialog } from \"../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport type { FieldProps } from \"../../types/fields\";\nimport type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { Entity, EntityReference } from \"@rebasepro/types\";\nimport { ReferencePreview } from \"../../preview\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { ArrayContainer, ArrayEntryParams } from \"../../components/ArrayContainer\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { getReferenceFrom } from \"@rebasepro/common\";\n\nimport { useTranslation, ErrorView } from \"@rebasepro/app\";\nimport { Button, cls, ExpandablePanel, fieldBackgroundMixin, PencilIcon, Typography } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\n\ntype ArrayOfReferencesFieldProps = FieldProps<ArrayProperty, EntityReference[]>;\n\n/**\n * This field allows selecting multiple references.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayOfReferencesFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n disabled,\n isSubmitting,\n minimalistView: minimalistViewProp,\n property,\n includeDescription,\n setValue,\n setFieldValue\n}: ArrayOfReferencesFieldProps) {\n\n const minimalistView = minimalistViewProp || property.ui?.minimalistView;\n const { t } = useTranslation();\n\n const ofProperty = property.of as Property;\n if (ofProperty.type !== \"reference\") {\n throw Error(\"ArrayOfReferencesField expected a property containing references\");\n }\n\n const expanded = property.ui?.expanded === undefined ? true : property.ui?.expanded;\n const selectedEntityIds = value && Array.isArray(value) ? value.map((ref) => ref.id) : [];\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const collectionRegistryController = useCollectionRegistryController();\n const collection: CollectionConfig | undefined = useMemo(() => {\n return ofProperty.path ? collectionRegistryController.getCollection(ofProperty.path) : undefined;\n }, [ofProperty.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);\n }\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<Record<string, unknown>>[]) => {\n const refs = entities.map(e => getReferenceFrom(e));\n setValue(refs);\n }, [setValue]);\n\n const referenceDialogController = useSelectionDialog({\n multiselect: true,\n path: ofProperty.path,\n collection,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n fixedFilter: ofProperty.fixedFilter\n }\n );\n\n const onEntryClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n };\n\n const buildEntry = useCallback(({\n index,\n internalId,\n storedProps,\n storeProps\n }: ArrayEntryParams) => {\n const entryValue = value && value.length > index ? value[index] : undefined;\n if (!entryValue)\n return <div>Internal ERROR</div>;\n return (\n <ReferencePreview\n key={internalId}\n disabled={!ofProperty.path}\n previewProperties={ofProperty.ui?.previewProperties}\n size={\"medium\"}\n onClick={onEntryClick}\n hover={!disabled}\n reference={entryValue}\n includeId={ofProperty.includeId}\n includeEntityLink={ofProperty.includeEntityLink}\n />\n );\n }, [ofProperty.path, ofProperty.ui?.previewProperties, value]);\n\n const title = (<>\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 flex grow text-text-secondary dark:text-text-secondary-dark\"}/>\n {Array.isArray(value) && <Typography variant={\"caption\"} className={\"px-4\"}>({value.length})</Typography>}\n </>);\n\n const body = <>\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <div className={\"group\"}>\n\n <ArrayContainer droppableId={propertyKey}\n value={value}\n disabled={isSubmitting}\n buildEntry={buildEntry}\n canAddElements={false}\n addLabel={property.name ? t(\"add_reference_to\", { name: property.name }) : t(\"add_reference\")}\n newDefaultEntry={property.of && \"defaultValue\" in property.of ? property.of?.defaultValue : null}\n onValueChange={(value) => setFieldValue(propertyKey, value)}\n />\n\n <Button\n className=\"ml-3.5 my-4 justify-center text-left\"\n variant=\"text\"\n disabled={isSubmitting}\n onClick={onEntryClick}>\n <PencilIcon size={16}/>\n {t(\"edit\")} {property.name}\n </Button>\n </div>}\n </>;\n\n return (\n <>\n\n {!minimalistView &&\n <ExpandablePanel\n titleClassName={fieldBackgroundMixin}\n innerClassName={cls(\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\", fieldBackgroundMixin)}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {minimalistView && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import type { FieldProps, FormContext, PropertyFieldBindingProps } from \"../../types/fields\";\nimport type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React, { useEffect, useState } from \"react\";\n\nimport { Field, useFormex } from \"@rebasepro/forms\";\n\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { EnumValuesChip } from \"../../preview\";\n\n;\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE, getDefaultValueFor } from \"@rebasepro/common\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { ArrayContainer, ArrayEntryParams } from \"../../components/ArrayContainer\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\n/**\n * If the `oneOf` property is specified, this fields render each array entry as\n * a `type` select and the corresponding field widget to the selected `type.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function BlockFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n minimalistView: minimalistViewProp,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<ArrayProperty>) {\n\n const minimalistView = minimalistViewProp || property.ui?.minimalistView;\n const { t } = useTranslation();\n\n if (!property.oneOf)\n throw Error(\"ArrayOneOfField misconfiguration. Property `oneOf` not set\");\n\n const expanded = property.ui?.expanded === undefined ? true : property.ui?.expanded;\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n const buildEntry = ({\n index,\n internalId,\n storedProps,\n storeProps\n }: ArrayEntryParams) => {\n\n return <BlockEntry\n key={`array_one_of_${internalId}`}\n name={`${propertyKey}.${index}`}\n index={index}\n value={value[index]}\n typeField={property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE}\n valueField={property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE}\n properties={property.oneOf!.properties}\n autoFocus={internalId === lastAddedId}\n context={context}\n storeProps={storeProps}\n storedProps={storedProps}/>;\n };\n\n const title = (\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n const firstOneOfKey = Object.keys(property.oneOf.properties)[0];\n const body = <ArrayContainer value={value}\n className={\"flex flex-col gap-3\"}\n droppableId={propertyKey}\n addLabel={property.name ? t(\"add_to_field\", { fieldName: property.name }) : t(\"add_entry\")}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.ui?.disabled)}\n canAddElements={!property.ui?.disabled}\n onValueChange={(value) => setFieldValue(propertyKey, value)}\n newDefaultEntry={{\n [property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE]: firstOneOfKey,\n [property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE]: getDefaultValueFor(property.oneOf.properties[firstOneOfKey])\n }}/>;\n return (\n\n <>\n\n {!minimalistView &&\n <ExpandablePanel\n innerClassName={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {minimalistView && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface BlockEntryProps {\n name: string;\n index: number;\n value: Record<string, unknown>;\n /**\n * Name of the field to use as the discriminator for type\n * Defaults to `type`\n */\n typeField: string;\n /**\n * Name of the field to use as the value\n * Defaults to `value`\n */\n valueField: string;\n\n autoFocus: boolean;\n /**\n * Record of properties, where the key is the `type` and the value\n * is the corresponding property\n */\n properties: Record<string, Property>;\n\n /**\n * Additional values related to the state of the form or the entity\n */\n context: FormContext;\n\n storedProps?: object,\n storeProps: (props: object) => void\n\n}\n\nfunction BlockEntry({\n name,\n index,\n value,\n typeField,\n valueField,\n properties,\n autoFocus,\n context,\n storedProps,\n storeProps\n }: BlockEntryProps) {\n\n const type = value && (value[typeField] as string | undefined);\n const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);\n\n const formex = useFormex();\n const { t } = useTranslation();\n\n useEffect(() => {\n if (!type) {\n // Auto-fix empty blocks silently — set the default type WITHOUT\n // marking as touched so the form doesn't become dirty on mount.\n const defaultType = Object.keys(properties)[0];\n const newSelectedProperty = defaultType ? properties[defaultType] : undefined;\n setTypeInternal(defaultType);\n formex.setFieldValue(typeFieldName, defaultType);\n formex.setFieldValue(valueFieldName, newSelectedProperty ? getDefaultValueFor(newSelectedProperty) : null);\n }\n }, []);\n\n useEffect(() => {\n if (type !== typeInternal) {\n setTypeInternal(type);\n }\n }, [type]);\n\n const propertyInternal = typeInternal ? properties[typeInternal] : undefined;\n\n const property = storedProps && typeof propertyInternal === \"object\" ? mergeDeep(propertyInternal, storedProps) : propertyInternal;\n\n const enumValuesConfigs = Object.entries(properties)\n .map(([key, property]) => ({\n id: key,\n label: property.name ?? key\n }));\n\n const typeFieldName = `${name}.${typeField}`;\n const valueFieldName = `${name}.${valueField}`;\n\n const fieldProps: PropertyFieldBindingProps | undefined = property\n ? {\n propertyKey: valueFieldName,\n property,\n context,\n autoFocus,\n partOfArray: false,\n partOfBlock: true,\n minimalistView: true,\n onPropertyChange: storeProps\n }\n : undefined;\n\n const updateType = (newType: string | undefined) => {\n const newSelectedProperty = newType ? properties[newType] : undefined;\n setTypeInternal(newType);\n formex.setFieldTouched(typeFieldName, true);\n formex.setFieldValue(typeFieldName, newType);\n formex.setFieldValue(valueFieldName, newSelectedProperty ? getDefaultValueFor(newSelectedProperty) : null);\n };\n\n return (\n <div className={cls(paperMixin, \"bg-transparent p-2\")}>\n\n <Field\n name={typeFieldName}\n >\n {(fieldProps) => {\n const value1 = fieldProps.field.value !== undefined && fieldProps.field.value !== null ? fieldProps.field.value as string : \"\";\n return (\n <>\n <Select\n className=\"mb-2\"\n placeholder={<Typography variant={\"caption\"}\n className={\"px-4 py-2 font-medium\"}>{t(\"type\")}</Typography>}\n size={\"medium\"}\n fullWidth={true}\n position={\"item-aligned\"}\n value={value1}\n renderValue={(enumKey: string) =>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n }\n onValueChange={(value) => {\n updateType(value);\n }}>\n {enumValuesConfigs.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n </SelectItem>)\n )}\n </Select>\n </>\n );\n }\n }\n </Field>\n\n {fieldProps && (\n // It is important to use this key to force a re-render of the field on type change\n <PropertyFieldBinding key={`form_control_${name}_${typeInternal}`} {...fieldProps}/>\n )}\n\n </div>\n );\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { DateProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\n;\n\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { useCustomizationController } from \"@rebasepro/app\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { DateTimeField } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\n\ntype DateTimeFieldProps = FieldProps<DateProperty>;\n\n/**\n * Field that allows selecting a date\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function DateTimeFieldBinding({\n propertyKey,\n value,\n setValue,\n autoFocus,\n error,\n showError,\n disabled,\n touched,\n property,\n includeDescription\n}: DateTimeFieldProps) {\n\n const { locale } = useCustomizationController();\n const internalValue = value || null;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n <DateTimeField\n value={internalValue}\n onChange={(dateValue) => setValue(dateValue)}\n mode={property.mode}\n clearable={property.ui?.clearable}\n locale={locale}\n error={showError}\n disabled={disabled}\n label={<LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n className={showError ? \"text-red-500 dark:text-red-500\" : \"text-text-secondary dark:text-text-secondary-dark\"}\n title={property.name ?? propertyKey}/>}\n />\n </PropertyIdCopyTooltip>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { MapProperty } from \"@rebasepro/types\";\nimport React, { useEffect, useState } from \"react\";\nimport { DataType, GeoPoint } from \"@rebasepro/types\";\n\nimport { ArrayContainer } from \"../../components/ArrayContainer\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport {\n BooleanSwitchWithLabel,\n Button,\n ChevronDownIcon,\n cls,\n DateTimeField,\n defaultBorderMixin,\n ExpandablePanel,\n IconButton,\n iconSize,\n Menu,\n MenuItem,\n MinusIcon,\n PlusIcon,\n TextField,\n Typography\n} from \"@rebasepro/ui\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { useCustomizationController, useTranslation } from \"@rebasepro/app\";\nimport { getIn } from \"@rebasepro/forms\";\nimport { getDefaultValueFortype } from \"@rebasepro/common\";\n\ntype MapEditViewRowState = [number, {\n key: string,\n type: DataType\n}];\n\n/**\n * Field that allows edition of key value pairs.\n *\n * @group Form fields\n */\nexport function KeyValueFieldBinding({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n setValue,\n minimalistView,\n includeDescription,\n underlyingValueHasChanged,\n autoFocus,\n context\n }: FieldProps<MapProperty>) {\n\n const expanded = (property.ui?.expanded === undefined ? true : property.ui?.expanded) || autoFocus;\n\n if (!property.keyValue) {\n throw Error(`Your property ${propertyKey} needs to have the 'keyValue' prop in order to use this field binding`);\n }\n\n const initialValues = getIn(context.formex.initialValues, propertyKey) as Record<string, unknown> | undefined;\n\n const mapFormView = <MapEditView value={value}\n setValue={setValue}\n disabled={disabled}\n initialValue={initialValues}\n fieldName={property.name ?? propertyKey}/>;\n\n const title = <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>;\n\n return (\n <>\n\n {!minimalistView && <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n innerClassName={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>{mapFormView}</ExpandablePanel>}\n\n {minimalistView && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface MapEditViewParams<T extends Record<string, unknown>> {\n value?: T;\n initialValue?: T;\n setValue: (value: (T | null)) => void;\n fieldName?: string,\n disabled?: boolean\n}\n\nfunction MapEditView<T extends Record<string, unknown>>({\n value,\n initialValue,\n setValue,\n fieldName,\n disabled\n }: MapEditViewParams<T>) {\n const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(\n Object.keys(initialValue ?? {}).map((key) => [getRandomId(), {\n key,\n type: gettype(initialValue?.[key]) ?? \"string\"\n }])\n );\n const { t } = useTranslation();\n\n useEffect(() => {\n const currentKeys = internalState.map(([id, { key }]) => key);\n const newKeys = Object.entries(value ?? {}).filter(([key, v]) => v !== undefined).map(([key]) => key);\n const keysToAdd = newKeys.filter((key) => !currentKeys.includes(key));\n const keysToRemove = currentKeys.filter((key) => !newKeys.includes(key));\n const newRowIds = [...internalState];\n keysToAdd.forEach((key) => {\n newRowIds.push([getRandomId(), {\n key,\n type: gettype(value?.[key]) ?? \"string\"\n }]);\n });\n keysToRemove.forEach((key) => {\n const index = newRowIds.findIndex(([id, { key: k }]) => k === key);\n newRowIds.splice(index, 1);\n });\n setInternalState(newRowIds);\n }, [value]);\n\n const updatetype = (id: number, type: DataType) => {\n if (!id) {\n console.warn(\"No key selected for data type update\");\n return;\n }\n setInternalState(internalState.map((row) => {\n if (row[0] === id) {\n return [row[0], {\n key: row[1].key,\n type\n }];\n }\n return row;\n }));\n setValue({\n ...(value ?? {} as T),\n [internalState.find((row) => row[0] === id)?.[1].key ?? \"\"]: getDefaultValueFortype(type)\n })\n };\n\n return <div className=\"py-1 flex flex-col gap-1\">\n {internalState\n .map(([id, {\n key: fieldKey,\n type\n }], index) => {\n const entryValue = fieldKey ? value?.[fieldKey] : \"\";\n const onFieldKeyChange = (newKey: string) => {\n\n setInternalState(internalState.map((currentId) => {\n if (currentId[0] === id) {\n return [id, {\n key: newKey ?? \"\",\n type: currentId[1].type\n }];\n }\n return currentId;\n }));\n\n if (typeof value === \"object\" && newKey in value) {\n // if the key is already there, don't delete the previous value\n return;\n }\n\n const newValue = { ...(value ?? {}) } as T;\n if (typeof initialValue === \"object\" && fieldKey in initialValue) {\n (newValue as Record<string, unknown>)[fieldKey] = undefined; // set to undefined to remove from the object, the driver will remove it from the backend\n } else {\n delete (newValue as Record<string, unknown>)[fieldKey];\n }\n setValue({\n ...newValue,\n [newKey ?? \"\"]: entryValue\n });\n };\n return <MapKeyValueRow id={id}\n key={id}\n fieldKey={fieldKey}\n value={value ?? {} as T}\n onDeleteClick={() => {\n const newValue = { ...(value ?? {}) as T };\n if (initialValue && fieldKey in initialValue) {\n (newValue as Record<string, unknown>)[fieldKey] = undefined;\n } else {\n delete (newValue as Record<string, unknown>)[fieldKey];\n }\n setInternalState(internalState.filter((currentId) => currentId[0] !== id));\n setValue({\n ...newValue\n });\n }}\n onFieldKeyChange={onFieldKeyChange}\n setValue={setValue}\n entryValue={entryValue}\n type={type}\n disabled={disabled}\n updatetype={updatetype}/>;\n }\n )}\n\n <Button variant={\"text\"}\n size={\"small\"}\n className=\"w-full\"\n disabled={disabled}\n startIcon={<PlusIcon/>}\n onClick={(e) => {\n e.preventDefault();\n setValue({\n ...(value ?? {} as T),\n \"\": null\n });\n setInternalState([...internalState, [getRandomId(), {\n key: \"\",\n type: \"string\"\n }]]);\n }\n }>\n {fieldName ? t(\"add_to_field\", { fieldName }) : t(\"add\")}\n </Button>\n\n </div>;\n}\n\nfunction MapKeyValueRow<T extends Record<string, unknown>>({\n id,\n fieldKey,\n value,\n onFieldKeyChange,\n onDeleteClick,\n setValue,\n entryValue,\n type,\n updatetype,\n disabled\n }: {\n id: number,\n fieldKey: string,\n value: T,\n onFieldKeyChange: (newKey: string) => void,\n onDeleteClick: () => void,\n setValue: (value: (T | null)) => void,\n entryValue: unknown,\n type: DataType,\n disabled?: boolean,\n updatetype: (id: number, type: DataType) => void\n}) {\n\n const { locale } = useCustomizationController();\n const { t } = useTranslation();\n\n function buildInput(entryValue: unknown, fieldKey: string, type: DataType) {\n if (type === \"string\" || type === \"number\") {\n return <TextField\n key={type}\n placeholder={\"value\"}\n value={entryValue as string | number | undefined}\n type={type === \"number\" ? \"number\" : \"text\"}\n size={\"medium\"}\n disabled={disabled || !fieldKey}\n onChange={(event) => {\n if (type === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue({\n ...value,\n [fieldKey]: null\n });\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue({\n ...value,\n [fieldKey]: numberValue\n });\n } else {\n setValue({\n ...value,\n [fieldKey]: null\n });\n }\n } else {\n setValue({\n ...value,\n [fieldKey]: event.target.value\n });\n }\n }}/>;\n } else if (type === \"date\") {\n return <DateTimeField value={entryValue as Date | null | undefined}\n size={\"medium\"}\n locale={locale}\n disabled={disabled || !fieldKey}\n onChange={(date) => {\n setValue({\n ...value,\n [fieldKey]: date\n });\n }}/>;\n } else if (type === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue as boolean | null}\n size={\"medium\"}\n position={\"start\"}\n disabled={disabled || !fieldKey}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}/>;\n } else if (type === \"array\") {\n const arrayValue = (entryValue as string[]) || [];\n return <div\n className={cls(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <ArrayContainer value={arrayValue}\n newDefaultEntry={\"\"}\n droppableId={id.toString()}\n addLabel={fieldKey ? t(\"add_to_field\", { fieldName: fieldKey }) : t(\"add\")}\n size={\"small\"}\n disabled={disabled || !fieldKey}\n canAddElements={true}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}\n buildEntry={({\n index,\n internalId\n }) => {\n return <ArrayKeyValueRow\n index={index}\n id={internalId}\n value={arrayValue[index]}\n disabled={disabled || !fieldKey}\n setValue={(newValue) => {\n const newArrayValue = [...arrayValue] as unknown[];\n newArrayValue[index] = newValue;\n setValue({\n ...value,\n [fieldKey]: newArrayValue\n });\n }}\n />\n }}/>\n </div>;\n } else if (type === \"map\") {\n return <div\n className={cls(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={entryValue as Record<string, unknown> | undefined}\n fieldName={fieldKey}\n setValue={(updatedValue) => {\n setValue({\n ...value,\n [fieldKey]: updatedValue\n });\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${type} not supported yet`}\n </Typography>;\n }\n }\n\n function doUpdatetype(type: DataType) {\n updatetype(id, type);\n }\n\n return (<>\n <Typography key={id.toString()}\n component={\"div\"}\n className=\"font-mono flex flex-row gap-1\">\n <div className=\"w-[300px] max-w-[30%]\">\n <TextField\n value={fieldKey}\n placeholder={\"key\"}\n disabled={disabled || (entryValue !== undefined && entryValue !== null && entryValue !== \"\")}\n size={\"medium\"}\n onChange={(event) => {\n onFieldKeyChange(event.target.value);\n }}/>\n </div>\n\n <div className=\"grow\">\n {(type !== \"map\" && type !== \"array\") && buildInput(entryValue, fieldKey, type)}\n </div>\n <div className={\"flex flex-col\"}>\n <Menu\n trigger={<IconButton size={\"smallest\"}>\n <ChevronDownIcon size={iconSize.small}/>\n </IconButton>}\n >\n <MenuItem dense\n onClick={() => doUpdatetype(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"date\")}>date</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"array\")}>array</MenuItem>\n </Menu>\n\n <IconButton aria-label=\"delete\"\n size={\"smallest\"}\n onClick={onDeleteClick}>\n <MinusIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </Typography>\n\n {(type === \"map\" || type === \"array\") && buildInput(entryValue, fieldKey, type)}\n\n </>\n\n );\n}\n\nfunction ArrayKeyValueRow<T>({\n id,\n index,\n value,\n setValue\n }: {\n id: number,\n index: number,\n value: T,\n setValue: (value: T | null) => void,\n disabled?: boolean,\n}) {\n\n const { locale } = useCustomizationController();\n const [selectedtype, setSelectedtype] = useState<DataType>(gettype(value) ?? \"string\");\n\n function doUpdatetype(type: DataType) {\n setSelectedtype(type);\n }\n\n function buildInput(entryValue: unknown, type: DataType) {\n if (type === \"string\" || type === \"number\") {\n return <TextField value={entryValue as string | number | undefined}\n type={type === \"number\" ? \"number\" : \"text\"}\n size={\"medium\"}\n onChange={(event) => {\n if (type === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n }}/>;\n } else if (type === \"date\") {\n return <DateTimeField value={entryValue as Date | null | undefined}\n size={\"medium\"}\n locale={locale}\n onChange={(date) => {\n setValue(date as T);\n }}/>;\n } else if (type === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue as boolean | null}\n size={\"small\"}\n position={\"start\"}\n onValueChange={(v) => {\n setValue(v as T);\n }}/>;\n } else if (type === \"array\") {\n return <Typography variant={\"caption\"}>\n Arrays of arrays are not supported.\n </Typography>;\n } else if (type === \"map\") {\n const mapValue = (entryValue && typeof entryValue === \"object\") ? (entryValue as Record<string, unknown>) : undefined;\n return <div className={cls(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={mapValue}\n setValue={(updatedValue) => {\n setValue(updatedValue as T | null);\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${type} not supported yet`}\n </Typography>;\n }\n }\n\n return (<>\n <Typography key={id.toString()}\n component={\"div\"}\n className=\"font-mono flex min-h-12 flex-row gap-1 items-center\">\n\n <div className=\"grow\">\n {selectedtype !== \"map\" && buildInput(value, selectedtype)}\n </div>\n\n <Menu\n trigger={<IconButton size={\"small\"}\n className=\"h-7 w-7\">\n <ChevronDownIcon/>\n </IconButton>}>\n <MenuItem dense\n onClick={() => doUpdatetype(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdatetype(\"date\")}>date</MenuItem>\n </Menu>\n\n </Typography>\n\n {selectedtype === \"map\" && buildInput(value, selectedtype)}\n\n </>\n\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\nfunction gettype(value: unknown): DataType | undefined {\n if (typeof value === \"string\" || value === null) {\n return \"string\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (Array.isArray(value)) {\n return \"array\";\n } else if (value instanceof Date) {\n return \"date\";\n } else if (value && typeof value === \"object\" && \"isEntityReference\" in value && typeof (value as Record<string, unknown>).isEntityReference === \"function\" && (value as Record<string, (...args: unknown[]) => unknown>).isEntityReference()) {\n return \"reference\";\n } else if (value instanceof GeoPoint) {\n return \"geopoint\";\n } else if (typeof value === \"object\") {\n return \"map\";\n }\n\n return undefined;\n}\n","import type { FieldProps, PropertyFieldBindingProps } from \"../../types/fields\";\nimport type { MapProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n;\nimport { useTranslation } from \"@rebasepro/app\";\n\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { isHidden, isReadOnly } from \"@rebasepro/common\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { cls, ExpandablePanel } from \"@rebasepro/ui\";\n\n/**\n * Field that renders the children property fields\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MapFieldBinding({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n partOfArray,\n minimalistView: minimalistViewProp,\n includeDescription,\n autoFocus,\n context,\n onPropertyChange\n}: FieldProps<MapProperty>) {\n\n const expanded = property.ui?.expanded === undefined ? true : property.ui?.expanded;\n const minimalistView = minimalistViewProp || property.ui?.minimalistView;\n const { t } = useTranslation();\n\n if (!property.properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property '${propertyKey}'${property.name ? ` (\"${property.name}\")` : \"\"}`);\n }\n\n const mapProperties = property.properties;\n\n const mapFormView = <>\n <div\n className={cls(\"py-1 flex flex-col space-y-2\", minimalistView && property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined)}>\n {Object.entries(mapProperties)\n .filter(([_, property]) => !isHidden(property))\n .map(([entryKey, childProperty], index) => {\n const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.ui?.disabled);\n const fieldBindingProps: PropertyFieldBindingProps<Record<string, unknown>> = {\n propertyKey: `${propertyKey}.${entryKey}`,\n disabled: disabled || thisDisabled,\n property: childProperty,\n includeDescription,\n context,\n partOfArray: false,\n minimalistView: false,\n autoFocus: autoFocus && index === 0,\n onPropertyChange: function (updatedProperty) {\n onPropertyChange?.({\n properties: {\n [entryKey]: updatedProperty\n }\n } as Partial<MapProperty>);\n }\n };\n\n return (\n <div key={`map-${propertyKey}-${index}`} className={\"relative\"}>\n <ErrorBoundary>\n <PropertyFieldBinding\n {...fieldBindingProps}/>\n </ErrorBoundary>\n </div>\n );\n }\n )\n }\n </div>\n\n\n </>\n ;\n\n return (\n <ErrorBoundary>\n\n {!minimalistView && <ExpandablePanel initiallyExpanded={expanded}\n onExpandedChange={(expanded: boolean) => {\n onPropertyChange?.({\n ui: { ...property.ui,\nexpanded }\n });\n }}\n className={property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined}\n innerClassName={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2 bg-white dark:bg-surface-900\"}\n title={<LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>}>\n {mapFormView}\n </ExpandablePanel>}\n\n {minimalistView && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError ?? false}\n error={error && !partOfArray ? error : undefined}\n disabled={disabled}\n property={property}/>\n\n </ErrorBoundary>\n );\n}\n\n","import React, { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { useAuthController, useStorageSource } from \"@rebasepro/app\";\nimport { useStorageSources } from \"@rebasepro/app\";\nimport { resolveStorageSource } from \"@rebasepro/common\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport type { FieldProps } from \"../../types/fields\";\nimport type { ArrayProperty, StringProperty } from \"@rebasepro/types\";\nimport {\n cls,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n IconButton,\n Skeleton,\n XIcon\n} from \"@rebasepro/ui\";\nimport type { RichTextEditorProps } from \"../../editor\";\nimport { resolveStorageFilenameString, resolveStoragePathString } from \"@rebasepro/common\";\nimport { randomString } from \"@rebasepro/utils\";\n\n// Lazy-load ProseMirror editor + markdown parser/serializer (~300KB)\n// Only fetched when a markdown field is actually rendered.\nconst RichTextEditor = lazy(() => import(\"../../editor\").then(m => ({ default: m.RichTextEditor })));\nconst loadMarkdownUtils = () => import(\"../../editor/markdown\");\nlet _markdownUtils: Awaited<ReturnType<typeof loadMarkdownUtils>> | null = null;\nconst getMarkdownUtils = async () => {\n if (!_markdownUtils) _markdownUtils = await loadMarkdownUtils();\n return _markdownUtils;\n};\n\ninterface MarkdownEditorFieldProps {\n highlight?: { from: number, to: number };\n editorProps?: Partial<RichTextEditorProps>\n}\n\n/**\n * Normalize markdown for comparison purposes: collapse whitespace,\n * normalize line endings, trim lines. This is NOT for display.\n */\nfunction normalizeMarkdown(md: string | null | undefined): string {\n if (!md) return \"\";\n return md\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .replace(/[ \\t]+$/gm, \"\")\n .trim();\n}\n\n/**\n * Compute the canonical form of a markdown string by doing a full\n * parse → serialize roundtrip through ProseMirror. This gives us\n * the exact output the editor will produce for a given input,\n * so we can compare against it to avoid false dirty states.\n *\n * Falls back to normalizeMarkdown if the ProseMirror module hasn't loaded yet.\n */\nfunction canonicalizeMarkdown(md: string | null | undefined): string {\n if (!md) return \"\";\n if (!_markdownUtils) return normalizeMarkdown(md);\n try {\n const doc = _markdownUtils.parser.parse(md);\n if (!doc) return normalizeMarkdown(md);\n return normalizeMarkdown(_markdownUtils.serializer.serialize(doc));\n } catch {\n return normalizeMarkdown(md);\n }\n}\n\nexport function MarkdownEditorFieldBinding({\n property,\n propertyKey,\n value,\n setValue,\n includeDescription,\n showError,\n error,\n minimalistView,\n disabled: disabledProp,\n isSubmitting,\n context,\n customProps\n}: FieldProps<StringProperty, MarkdownEditorFieldProps>) {\n\n const authController = useAuthController();\n const disabled = disabledProp || isSubmitting;\n const highlight = customProps?.highlight;\n const editorProps = customProps?.editorProps;\n const defaultStorageSource = useStorageSource();\n const storage = property.storage;\n const storageSources = useStorageSources();\n\n // Resolve the correct storage source for this property.\n // Mirrors the resolution in useStorageUploadController.\n const storageSource = useMemo(() => resolveStorageSource({\n sourceKey: storage?.storageSource,\n sources: storageSources.sources,\n defaultSource: defaultStorageSource\n }), [storage?.storageSource, storageSources.sources, defaultStorageSource]);\n\n const entityValues = context.values;\n const entityId = context.entityId;\n const path = context.path;\n\n const [fieldVersion, setFieldVersion] = useState(0);\n const internalValue = useRef<string | null>(value);\n\n // Eagerly load ProseMirror markdown utils when the field first mounts\n useEffect(() => {\n getMarkdownUtils().then(() => {\n // Update canonical ref with the proper round-tripped value now that ProseMirror is loaded\n canonicalRef.current = canonicalizeMarkdown(value);\n });\n }, []);\n\n // Compute the canonical (round-tripped) form of the initial value ONCE.\n // This is what ProseMirror will produce after parse → serialize, so any\n // future serialization that matches this canonical form is NOT a real change.\n const canonicalInitialValue = useMemo(\n () => canonicalizeMarkdown(value),\n\n [] // intentionally only on mount\n );\n // Track it in a ref so the callback always has the latest\n const canonicalRef = useRef(canonicalInitialValue);\n\n const onContentChange = useCallback((content: string) => {\n const normalizedContent = normalizeMarkdown(content);\n\n // Compare against the canonical roundtripped form of the initial value.\n // This eliminates ALL false positives from parse→serialize normalization\n // differences (trailing nodes, bullet chars, whitespace, etc.).\n if (normalizedContent === canonicalRef.current) {\n return;\n }\n // Also compare against the current form value to avoid redundant updates\n if (normalizedContent === normalizeMarkdown(value)) {\n return;\n }\n internalValue.current = content;\n setValue(content);\n }, [setValue, value]);\n\n useEffect(() => {\n if (internalValue.current !== value) {\n internalValue.current = value;\n canonicalRef.current = canonicalizeMarkdown(value);\n setFieldVersion(v => v + 1);\n }\n }, [value]);\n\n const fileNameBuilder = useCallback(async (file: File) => {\n if (storage?.fileName) {\n const fileName = await resolveStorageFilenameString({\n input: storage.fileName,\n storage,\n values: entityValues,\n entityId,\n path,\n property: property,\n file,\n propertyKey\n });\n if (!fileName || fileName.length === 0) {\n throw Error(\"You need to return a valid filename\");\n }\n return fileName;\n }\n return randomString() + \"_\" + file.name;\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const storagePathBuilder = useCallback((file: File) => {\n if (!storage) return \"/\";\n return resolveStoragePathString({\n input: storage.storagePath,\n storage,\n values: entityValues,\n entityId,\n path,\n property,\n file,\n propertyKey\n }) ?? \"/\";\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const editor = <Suspense fallback={<Skeleton height={200} className=\"w-full rounded-md\"/>}>\n <RichTextEditor\n content={value}\n onMarkdownContentChange={onContentChange}\n version={context.formex.version + fieldVersion}\n highlight={highlight}\n disabled={disabled}\n handleImageUpload={async (file: File) => {\n const storagePath = storagePathBuilder(file);\n const fileName = await fileNameBuilder(file);\n const key = `${storagePath}/${fileName}`.replace(/^\\/+/, \"\").replace(/\\/+/g, \"/\");\n const result = await storageSource.putObject({\n file,\n key\n });\n const downloadConfig = await storageSource.getSignedUrl(result.key);\n const url = downloadConfig.url;\n if (!url) {\n throw new Error(\"Error uploading image\");\n }\n return url;\n }}\n {...editorProps}\n />\n </Suspense>;\n\n if (minimalistView)\n return editor;\n\n return (\n <>\n <div className=\"flex items-center w-full\">\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n <div className=\"flex-grow\"/>\n {property.ui?.clearable && !disabled && (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }}\n >\n <XIcon/>\n </IconButton>\n )}\n </div>\n <div\n className={cls(\"rounded-md\", fieldBackgroundMixin, disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin)}>\n {editor}\n </div>\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n property={property}/>\n </>\n\n );\n\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { ArrayProperty, Property } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\n\n;\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { enumToObjectEntries, getLabelOrConfigFrom } from \"@rebasepro/common\";\nimport { iconSize, MultiSelect, MultiSelectItem, XIcon } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * This fields renders a dropdown with multiple selection.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MultiSelectFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n property,\n includeDescription,\n size = \"large\",\n autoFocus\n}: FieldProps<ArrayProperty, unknown, Record<string, unknown>>) {\n\n const of = property.of;\n if (!of) {\n throw Error(\"Using wrong component ArrayEnumSelect\");\n }\n\n if (Array.isArray(of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (of.type !== \"string\" && of.type !== \"number\") {\n throw Error(\"Field misconfiguration: array field of type string or number\");\n }\n\n const enumValues = of.enum ? enumToObjectEntries(of.enum) : undefined;\n if (!enumValues) {\n console.error(property);\n throw Error(\"Field misconfiguration: array field of type string or number needs to have enumValues\");\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = !!value && Array.isArray(value);\n\n const renderValue = useCallback((enumKey: string, list: boolean) => {\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValues, enumKey) : undefined;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"medium\"}\n key={enumKey}>\n {enumValue?.label ?? enumKey}\n {!list && <button\n className=\"ml-1 ring-offset-background rounded-full outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setValue((value ?? []).filter((v: string | number) => v !== enumKey));\n }}\n >\n <XIcon size={iconSize.smallest}/>\n </button>}\n </EnumValuesChip>;\n }, [enumValues, setValue, value]);\n\n return (\n <>\n <MultiSelect\n className={\"w-full mt-2\"}\n size={size}\n value={validValue ? value.map((v) => v?.toString()) : []}\n disabled={disabled}\n modalPopover={true}\n label={<LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n onValueChange={(updatedValue: string[]) => {\n let newValue;\n if (of && (of as Property)?.type === \"number\") {\n newValue = updatedValue ? (updatedValue as string[]).map((e) => parseFloat(e)) : [];\n } else {\n newValue = updatedValue;\n }\n return setValue(newValue);\n }}>\n {enumValues.map((enumValue) => String(enumValue.id)).map((enumKey) => (\n <MultiSelectItem key={enumKey} value={enumKey}>\n {renderValue(enumKey, true)}\n </MultiSelectItem>))}\n </MultiSelect>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import { useSelectionDialog } from \"../../hooks/useSelectionDialog\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport type { FieldProps } from \"../../types/fields\";\nimport type { Property, ReferenceProperty } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo } from \"react\";\n\nimport { Entity, EntityReference } from \"@rebasepro/types\";\nimport { ErrorView } from \"@rebasepro/app\";\nimport { ReadOnlyFieldBinding } from \"./ReadOnlyFieldBinding\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { EntityPreviewContainer } from \"../../components/EntityPreviewBinding\";\nimport { ReferencePreview } from \"../../preview\";\nimport { IconForView } from \"@rebasepro/app\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { getReferenceFrom } from \"@rebasepro/common\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { cls } from \"@rebasepro/ui\";\nimport { useCollectionRegistryController } from \"../../hooks/navigation/contexts/CollectionRegistryContext\";\n\n/**\n * Field that opens a reference selection dialog.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReferenceFieldBinding(props: FieldProps<ReferenceProperty>) {\n\n if (typeof props.property.path !== \"string\") {\n return <ReadOnlyFieldBinding {...props as FieldProps<Property>}/>\n }\n\n return <ReferenceFieldBindingInternal {...props}/>;\n\n}\n\nfunction ReferenceFieldBindingInternal({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n isSubmitting,\n disabled,\n minimalistView,\n touched,\n autoFocus,\n property,\n includeDescription,\n size = \"medium\"\n}: FieldProps<ReferenceProperty>) {\n if (!property.path) {\n throw new Error(\"Property path is required for ReferenceFieldBinding\");\n }\n\n const refValue = value as EntityReference | null | undefined;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = refValue && typeof refValue === \"object\" && \"isEntityReference\" in refValue && refValue.isEntityReference();\n\n const collectionRegistryController = useCollectionRegistryController();\n const collection: CollectionConfig | undefined = useMemo(() => {\n return property.path ? collectionRegistryController.getCollection(property.path) : undefined;\n }, [property.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${property.path}`);\n }\n\n const onSingleEntitySelected = useCallback((e: Entity<Record<string, unknown>> | null) => {\n const ref = e ? getReferenceFrom(e) : null;\n setValue(ref);\n }, [setValue, propertyKey]);\n\n const referenceDialogController = useSelectionDialog({\n multiselect: false,\n path: property.path,\n collection,\n onSingleEntitySelected,\n selectedEntityIds: validValue && refValue ? [refValue.id] : undefined,\n fixedFilter: property.fixedFilter\n }\n );\n\n const onEntryClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n };\n\n return (\n <>\n {!minimalistView && <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <>\n\n {refValue && <ReferencePreview\n disabled={!property.path}\n previewProperties={property.ui?.previewProperties}\n hover={!disabled}\n size={size}\n onClick={disabled || isSubmitting ? undefined : onEntryClick}\n reference={refValue}\n includeEntityLink={property.includeEntityLink}\n includeId={property.includeId}\n />}\n\n {!refValue && <div className=\"justify-center text-left\">\n <EntityPreviewContainer className={cls(\"px-6 h-16 text-sm font-medium flex items-center gap-6\",\n disabled || isSubmitting\n ? \"text-surface-accent-500\"\n : \"cursor-pointer text-surface-accent-700 dark:text-surface-accent-300 hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\")}\n onClick={onEntryClick}\n size={\"medium\"}>\n <IconForView collectionOrView={collection}\n className={\"text-surface-300 dark:text-surface-600\"}/>\n {`Edit ${property.name}`.toUpperCase()}\n </EntityPreviewContainer>\n </div>}\n </>}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n\n}\n","import type { FieldProps, PropertyFieldBindingProps } from \"../../types/fields\";\nimport type { ArrayProperty } from \"@rebasepro/types\";\nimport React, { useState } from \"react\";\n;\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { ArrayContainer, ArrayEntryParams } from \"../../components/ArrayContainer\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { getArrayResolvedProperties, getDefaultValueFor } from \"@rebasepro/common\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel, Typography } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { useAuthController, useTranslation } from \"@rebasepro/app\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\n/**\n * Generic array field that allows reordering and renders the child property\n * as nodes.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function RepeatFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n minimalistView: minimalistViewProp,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n}: FieldProps<ArrayProperty>) {\n\n const authController = useAuthController();\n const { t } = useTranslation();\n if (property.type !== \"array\" || !property.of || Array.isArray(property.of)) {\n throw Error(\"RepeatFieldBinding misconfiguration. Property `type` is not `array`\");\n }\n\n const minimalistView = minimalistViewProp || property.ui?.minimalistView;\n\n if (!property.of)\n throw Error(\"RepeatFieldBinding misconfiguration. Property `of` not set\");\n\n const resolvedProperties = getArrayResolvedProperties({\n propertyValue: value,\n propertyKey,\n property,\n ignoreMissingFields: false,\n authController\n })\n\n const expanded = property.ui?.expanded === undefined ? true : property.ui?.expanded;\n const ofProperty = property.of;\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const buildEntry = ({\n index,\n internalId,\n storedProps,\n storeProps\n }: ArrayEntryParams) => {\n const childProperty = (resolvedProperties as Record<number, typeof ofProperty>)?.[index] ?? ofProperty;\n const fieldProps: PropertyFieldBindingProps = {\n propertyKey: `${propertyKey}.${index}`,\n disabled,\n property: storedProps ? mergeDeep(childProperty, storedProps) : childProperty,\n onPropertyChange: storeProps,\n includeDescription,\n underlyingValueHasChanged,\n context,\n partOfArray: true,\n minimalistView: false,\n autoFocus: internalId === lastAddedId\n };\n return <ErrorBoundary>\n <PropertyFieldBinding {...fieldProps} index={index}/>\n </ErrorBoundary>;\n };\n\n const canAddElements = !property.ui?.disabled && !isSubmitting && !disabled && (property.canAddElements || property.canAddElements === undefined);\n const sortable = property.sortable === undefined ? true : property.sortable;\n const arrayContainer = <ArrayContainer droppableId={propertyKey}\n addLabel={property.name ? t(\"add_to_field\", { fieldName: property.name }) : t(\"add_entry\")}\n value={(value as unknown[]) ?? []}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.ui?.disabled)}\n canAddElements={canAddElements}\n sortable={sortable}\n newDefaultEntry={getDefaultValueFor(property.of)}\n onValueChange={(value) => setFieldValue(propertyKey, value)}\n className={property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined}\n />;\n\n const title = (<>\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 flex grow text-text-secondary dark:text-text-secondary-dark\"}/>\n {Array.isArray(value) && <Typography variant={\"caption\"} className={\"px-4\"}>({value.length})</Typography>}\n </>);\n\n return (\n\n <>\n\n {!minimalistView && <ExpandablePanel initiallyExpanded={expanded}\n innerClassName={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n title={title}>\n {arrayContainer}\n </ExpandablePanel>}\n\n {minimalistView && arrayContainer}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { NumberProperty, StringProperty } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\n\n;\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { cls, IconButton, Select, SelectItem, XIcon } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\nimport { resolveEnumValues } from \"@rebasepro/common\";\n\n/**\n * If `enumValues` are set in the string config, this field renders a select\n * where each option is a colored chip.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function SelectFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n includeDescription,\n size = \"large\"\n}: FieldProps<StringProperty | NumberProperty>) {\n\n const enumValues = resolveEnumValues(property.enum ?? []);\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n return (\n <>\n\n <Select\n value={value !== undefined && value != null ? value.toString() : \"\"}\n disabled={disabled}\n size={size}\n fullWidth={true}\n position=\"item-aligned\"\n inputClassName={cls(\"w-full\")}\n label={\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5 my-0\"}\n />\n </PropertyIdCopyTooltip>}\n endAdornment={\n property.ui?.clearable && !disabled && <IconButton\n size=\"small\"\n onClick={handleClearClick}>\n <XIcon/>\n </IconButton>\n }\n onValueChange={(updatedValue: string) => {\n const newValue = updatedValue\n ? (property.type === \"number\" ? parseFloat(updatedValue) : updatedValue)\n : null;\n return setValue(newValue);\n }}\n renderValue={(enumKey: string) => {\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size}/>;\n }}\n >\n {enumValues && enumValues.map((option) => {\n return <SelectItem\n key={option.id}\n value={String(option.id)}>\n <EnumValuesChip\n enumKey={String(option.id)}\n enumValues={enumValues}\n size={size}/>\n </SelectItem>\n })}\n </Select>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import type { StringProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { PropertyPreview } from \"../../preview\";\n\nimport { cls, IconButton, paperMixin, Tooltip } from \"@rebasepro/ui\";\nimport { ErrorBoundary, FileTextIcon, MinusIcon } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/app\";\n\ninterface StorageItemPreviewProps {\n name: string;\n property: StringProperty;\n value: string,\n onRemove: (value: string) => void;\n size: PreviewSize;\n disabled: boolean;\n placeholder?: boolean;\n className?: string;\n}\n\nexport function StorageItemPreview({\n name,\n property,\n value,\n onRemove,\n disabled,\n size,\n placeholder,\n className\n}: StorageItemPreviewProps) {\n const { t } = useTranslation();\n\n return (\n <div className={cls(\n \"relative border-box flex items-center justify-center\",\n size === \"large\" ? \"min-w-[220px] min-h-[220px] max-w-[220px]\" : \"min-w-[118px] min-h-[118px] max-w-[118px]\",\n paperMixin,\n className)}>\n\n {!placeholder && !disabled &&\n <div\n className=\"absolute rounded-full -top-2 -right-2 z-10 bg-white dark:bg-surface-900\">\n\n <Tooltip\n asChild={true}\n title={t(\"remove\")}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onRemove(value);\n }}>\n <MinusIcon/>\n </IconButton>\n </Tooltip>\n </div>\n }\n\n {!placeholder && value &&\n <ErrorBoundary>\n <PropertyPreview propertyKey={name}\n value={value}\n property={property}\n interactive={false}\n size={size}/>\n </ErrorBoundary>\n }\n\n {placeholder &&\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"flex flex-col items-center justify-center w-full h-full\">\n <FileTextIcon className=\"text-surface-700 dark:text-surface-300\"/>\n </div>\n }\n\n </div>\n );\n\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { ArrayProperty, StringProperty } from \"@rebasepro/types\";\nimport React, { useCallback, useState } from \"react\";\n\nimport { StorageConfig } from \"@rebasepro/types\";\nimport type { PreviewSize } from \"../../types/components/PropertyPreviewProps\";\nimport { useDropzone } from \"react-dropzone\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\n\nimport { isReadOnly } from \"@rebasepro/common\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { useAuthController, useSnackbarController, useStorageSource, useTranslation } from \"@rebasepro/app\";\nimport { StorageSourceContext } from \"@rebasepro/app\";\nimport {\n closestCenter,\n DndContext,\n DragEndEvent,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors\n} from \"@dnd-kit/core\";\nimport {\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { StorageFieldItem, useStorageUploadController } from \"@rebasepro/app\";\nimport { StorageUploadProgress } from \"../components/StorageUploadProgress\";\nimport { StorageItemPreview } from \"../components/StorageItemPreview\";\nimport {\n cls,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n Typography\n} from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\nconst dropZoneClasses = \"box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst disabledClasses = fieldBackgroundDisabledMixin;\nconst nonActiveDropClasses = fieldBackgroundHoverMixin\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500\"\n\nexport function StorageUploadFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n minimalistView,\n property,\n includeDescription,\n context,\n isSubmitting\n }: FieldProps<StringProperty | ArrayProperty>) {\n\n const authController = useAuthController();\n\n const storageSource = useStorageSource();\n const disabled = isReadOnly(property) || !!property.ui?.disabled || isSubmitting || context.disabled;\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported,\n resolvedStorageSource\n } = useStorageUploadController({\n entityValues: context.values,\n entityId: context.entityId,\n path: context.path,\n property,\n propertyKey,\n value: value as string | string[] | null,\n storageSource,\n disabled: disabled ?? false,\n onChange: setValue\n });\n\n useClearRestoreValue<string | string[]>({\n property,\n value: value as string | string[] | null,\n setValue\n });\n\n return (\n\n <>\n\n {!minimalistView &&\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n\n <StorageSourceContext.Provider value={resolvedStorageSource}>\n <StorageUpload\n value={internalValue}\n name={propertyKey}\n disabled={disabled ?? false}\n autoFocus={autoFocus ?? false}\n property={property}\n onChange={setValue}\n setInternalValue={setInternalValue}\n onFilesAdded={onFilesAdded}\n onFileUploadComplete={onFileUploadComplete}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}/>\n </StorageSourceContext.Provider>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface SortableStorageItemProps {\n id: number;\n entry: StorageFieldItem;\n property: StringProperty;\n name: string;\n metadata?: Record<string, unknown>;\n storagePathBuilder: (file: File) => string;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: Record<string, unknown>) => Promise<void>;\n onClear: (clearedStoragePathOrDownloadUrl: string) => void;\n disabled: boolean;\n isSortable: boolean; // Kept for consistency, though dnd-kit handles sortability via context\n}\n\nfunction SortableStorageItem({\n id,\n entry,\n property,\n metadata,\n storagePathBuilder,\n onFileUploadComplete,\n onClear,\n disabled\n }: SortableStorageItemProps) {\n\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : undefined\n };\n\n const getImageSizeNumber = (previewSize: PreviewSize): number => {\n switch (previewSize) {\n case \"small\":\n return 40;\n case \"medium\":\n return 118;\n case \"large\":\n return 220;\n default:\n return 118;\n }\n };\n\n let child: React.ReactNode;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <StorageItemPreview\n name={`storage_preview_${entry.storagePathOrDownloadUrl}`}\n property={property}\n disabled={disabled}\n value={entry.storagePathOrDownloadUrl}\n onRemove={() => onClear(entry.storagePathOrDownloadUrl!)}\n size={entry.size as PreviewSize}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={getImageSizeNumber(entry.size as PreviewSize)}\n simple={false}\n />\n );\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n className={cls(\"rounded-md m-1\")}\n tabIndex={-1}\n >\n {child}\n </div>\n );\n}\n\nfunction FileDropComponent({\n storage,\n disabled,\n onFilesAdded,\n multipleFilesSupported,\n autoFocus,\n internalValue,\n property,\n onClear,\n metadata,\n storagePathBuilder,\n onFileUploadComplete,\n name,\n helpText,\n isDndItemDragging\n }: {\n storage: StorageConfig,\n disabled: boolean,\n onFilesAdded: (acceptedFiles: File[]) => Promise<void>,\n multipleFilesSupported: boolean,\n autoFocus: boolean,\n internalValue: StorageFieldItem[],\n property: StringProperty,\n onClear: (clearedStoragePathOrDownloadUrl: string) => void,\n metadata?: Record<string, unknown>,\n storagePathBuilder: (file: File) => string,\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: Record<string, unknown>) => Promise<void>,\n name: string,\n helpText: string,\n isDndItemDragging?: boolean\n}) {\n\n const snackbarContext = useSnackbarController();\n\n const {\n getRootProps,\n getInputProps,\n isDragActive, // This is for files dragged from OS\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.reduce((acc, ext) => ({\n ...acc,\n [ext]: []\n }), {}) : undefined,\n disabled: disabled || isDndItemDragging,\n noDragEventsBubbling: true,\n maxSize: storage.maxSize,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n console.error(\"Error uploading file: \", error);\n if (error.code === \"file-too-large\") {\n snackbarContext.open({\n type: \"error\",\n message: `Error uploading file: File is larger than ${storage.maxSize} bytes`\n });\n } else if (error.code === \"file-invalid-type\") {\n snackbarContext.open({\n type: \"error\",\n message: \"Error uploading file: File type is not supported\"\n });\n }\n }\n }\n }\n }\n );\n\n return (\n <div\n {...getRootProps()}\n className={cls(\n fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n disabled ? \"text-surface-accent-600 dark:text-surface-accent-500\" : \"\",\n dropZoneClasses,\n multipleFilesSupported && internalValue.length ? \"\" : \"flex\",\n {\n [nonActiveDropClasses]: !isDragActive,\n [activeDropClasses]: isDragActive, // OS file drag active\n [rejectDropClasses]: isDragReject, // OS file drag reject\n [acceptDropClasses]: isDragAccept, // OS file drag accept\n [disabledClasses]: disabled || isDndItemDragging // Visually disable if internal drag\n })}\n >\n <div\n className={cls(\"flex items-center p-1 px-4 no-scrollbar\",\n multipleFilesSupported && internalValue.length ? \"overflow-auto\" : \"\",\n multipleFilesSupported && internalValue.length ? \"min-h-[180px]\" : \"min-h-[250px]\"\n )}\n >\n <input\n autoFocus={autoFocus}\n {...getInputProps()}/>\n\n {internalValue.map((entry) => (\n <SortableStorageItem\n key={entry.id}\n id={entry.id}\n entry={entry}\n property={property}\n name={name}\n metadata={metadata}\n storagePathBuilder={storagePathBuilder}\n onFileUploadComplete={onFileUploadComplete}\n onClear={onClear}\n disabled={disabled}\n isSortable={multipleFilesSupported}\n />\n ))}\n\n {/* Placeholder for empty dropzone text is handled by the outer Typography */}\n </div>\n\n <div\n className=\"flex-grow min-h-[38px] box-border m-2 text-center\">\n <Typography align={\"center\"}\n variant={\"label\"}\n className={disabled ? \"text-surface-accent-600 dark:text-surface-accent-500\" : \"\"}>\n {helpText}\n </Typography>\n </div>\n </div>\n );\n}\n\nexport interface StorageUploadProps {\n value: StorageFieldItem[];\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n property: StringProperty | ArrayProperty;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n disabled: boolean;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => Promise<void>; // Updated from useStorageUploadController\n storagePathBuilder: (file: File) => string;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: Record<string, unknown>) => Promise<void>;\n}\n\nexport function StorageUpload({\n property,\n name,\n value, // This is internalValue from useStorageUploadController\n setInternalValue,\n onChange,\n multipleFilesSupported,\n onFileUploadComplete,\n disabled,\n onFilesAdded,\n autoFocus,\n storage,\n storagePathBuilder\n }: StorageUploadProps) {\n\n if (multipleFilesSupported) {\n const arrayProperty = property as ArrayProperty;\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Storage field using array must be of data type string\");\n }\n if (arrayProperty.of.type !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: Record<string, unknown> | undefined = storage?.metadata;\n const [isDndItemDragging, setIsDndItemDragging] = useState(false);\n\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n if (!multipleFilesSupported || fromIndex === toIndex) return;\n const newValue = [...value];\n const item = newValue[fromIndex];\n newValue.splice(fromIndex, 1);\n newValue.splice(toIndex, 0, item);\n setInternalValue(newValue);\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n onChange(fieldValue);\n }, [multipleFilesSupported, onChange, setInternalValue, value]);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5 // Start dragging after 5px movement\n }\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates\n })\n );\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setIsDndItemDragging(true);\n }, []);\n\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n setIsDndItemDragging(false);\n const {\n active,\n over\n } = event;\n if (over && active.id !== over.id) {\n const oldIndex = value.findIndex(item => item.id === active.id);\n const newIndex = value.findIndex(item => item.id === over.id);\n if (oldIndex !== -1 && newIndex !== -1) {\n moveItem(oldIndex, newIndex);\n }\n }\n }, [value, moveItem]);\n\n const onClear = useCallback((clearedStoragePathOrDownloadUrl: string) => {\n let newValue: StorageFieldItem[];\n if (multipleFilesSupported) {\n newValue = value.filter(v => v.storagePathOrDownloadUrl !== clearedStoragePathOrDownloadUrl);\n onChange(newValue.filter(v => !!v.storagePathOrDownloadUrl).map(v => v.storagePathOrDownloadUrl as string));\n } else {\n newValue = [];\n onChange(null);\n }\n setInternalValue(newValue);\n }, [value, multipleFilesSupported, onChange, setInternalValue]);\n\n const { t } = useTranslation();\n const helpText = multipleFilesSupported\n ? t(\"drag_drop_multiple\")\n : t(\"drag_drop_single\");\n\n const renderProperty: StringProperty = multipleFilesSupported\n ? (property as ArrayProperty).of as StringProperty\n : property as StringProperty;\n\n const fileDropProps = {\n storage,\n disabled,\n onFilesAdded,\n multipleFilesSupported,\n autoFocus,\n internalValue: value, // Pass current internalValue\n property: renderProperty,\n onClear,\n metadata,\n storagePathBuilder,\n onFileUploadComplete,\n name,\n helpText,\n isDndItemDragging // Pass this down\n };\n\n if (multipleFilesSupported) {\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={(value ?? []).map(v => v.id)} strategy={horizontalListSortingStrategy}>\n <FileDropComponent {...fileDropProps}/>\n </SortableContext>\n </DndContext>\n );\n } else {\n // For single file, no D&D context is needed\n return <FileDropComponent {...fileDropProps} isDndItemDragging={false}/>;\n }\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { BooleanProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\n;\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { BooleanSwitchWithLabel } from \"@rebasepro/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\n\n/**\n * Simple boolean switch biding to a boolean property.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport const SwitchFieldBinding = function SwitchFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n disabled,\n size = \"large\",\n property,\n includeDescription\n }: FieldProps<BooleanProperty>) {\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n <BooleanSwitchWithLabel\n value={value as boolean | null}\n onValueChange={(v) => setValue(v)}\n error={showError}\n className={property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined}\n label={<LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}/>}\n disabled={disabled}\n autoFocus={autoFocus}\n size={size}\n />\n </PropertyIdCopyTooltip>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n </>\n\n );\n};\n","import type { FieldProps } from \"../../types/fields\";\nimport type { NumberProperty, StringProperty } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\n\nimport {\n cls,\n Collapse,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n IconButton,\n TextareaAutosize,\n TextField,\n XIcon\n} from \"@rebasepro/ui\";\nimport { PreviewType } from \"@rebasepro/types\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { PropertyPreview } from \"../../preview\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\nimport { getIconForProperty } from \"../../util/property_utils\";\n\n/**\n * Generic text field.\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TextFieldBinding<T extends string | number>({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n property,\n includeDescription,\n size = \"large\"\n }: FieldProps<StringProperty | NumberProperty>) {\n\n let multiline: boolean | undefined;\n let url: boolean | PreviewType | undefined;\n if (property.type === \"string\") {\n multiline = property.ui?.multiline;\n url = property.ui?.url;\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const displayValue = (value !== undefined && value !== null) ? String(value) : \"\";\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (inputType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n };\n\n const isMultiline = Boolean(multiline);\n\n let inputType: \"number\" | \"email\" | \"url\" | undefined = undefined;\n if (property.type === \"number\") {\n inputType = \"number\";\n } else if (property.type === \"string\") {\n if (property.email) inputType = \"email\";\n else if (property.ui?.url) inputType = \"url\";\n }\n\n const label = (\n <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required || property.isId === true}\n title={property.name ?? propertyKey}/>\n );\n return (<>\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n {isMultiline ? (\n <div className={cls(\n \"rounded-md relative max-w-full min-h-[64px]\",\n fieldBackgroundMixin,\n fieldBackgroundHoverMixin,\n showError && error ? \"border border-red-500 dark:border-red-600\" : \"\",\n property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined\n )}>\n <div\n className=\"pointer-events-none absolute top-1 text-xs font-medium px-3 text-text-secondary dark:text-text-secondary-dark\">\n {label}\n </div>\n <TextareaAutosize\n value={displayValue}\n onChange={onChange}\n autoFocus={autoFocus}\n disabled={disabled}\n className={cls(\n \"rounded-md resize-none w-full outline-none p-[32px] text-base bg-transparent min-h-[64px] px-3 pt-8\",\n disabled && \"outline-none opacity-50 text-surface-accent-600 dark:text-surface-accent-500\",\n showError && error ? \"text-red-500 dark:text-red-600\" : \"\"\n )}\n />\n {property.ui?.clearable && (\n <div\n className=\"flex flex-row justify-center items-center absolute h-full right-0 top-0 mr-4\">\n <IconButton onClick={handleClearClick}>\n <XIcon/>\n </IconButton>\n </div>\n )}\n </div>\n ) : (\n <TextField\n size={size}\n value={displayValue}\n onChange={onChange}\n autoFocus={autoFocus}\n className={property.ui?.widthPercentage !== undefined ? \"mt-8\" : undefined}\n label={<LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required || property.isId === true}\n title={property.name ?? propertyKey}/>}\n type={inputType}\n disabled={disabled}\n endAdornment={\n property.ui?.clearable && <IconButton\n onClick={handleClearClick}>\n <XIcon/>\n </IconButton>\n }\n error={showError ? !!error : undefined}\n inputClassName={error ? \"text-red-500 dark:text-red-600\" : \"\"}/>\n )}\n </PropertyIdCopyTooltip>\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n {url && <Collapse\n className=\"mt-1 ml-1\"\n in={Boolean(value)}>\n <PropertyPreview\n value={value}\n property={property}\n size={size}/>\n </Collapse>}\n\n </>\n );\n\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { VectorProperty } from \"@rebasepro/types\";\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport {\n Button,\n CheckIcon,\n EyeIcon,\n EyeOffIcon,\n IconButton,\n PencilIcon,\n TextField,\n Trash2Icon\n} from \"@rebasepro/ui\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\nimport { getIconForProperty } from \"../../util/property_utils\";\n\n/**\n * Custom field binding to render vector fields (e.g. for high-dimensional embeddings).\n * Shows a compact metadata card by default, and lets users expand values or edit them.\n *\n * Automatically parses inputs to number arrays and packages them into the canonical\n * Vector object structure expected by Rebase driver.\n * @group Form fields\n */\nexport function VectorFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n property,\n includeDescription,\n size = \"large\"\n}: FieldProps<VectorProperty>) {\n const isVectorObject = (val: unknown): val is { value: number[] } => {\n return typeof val === \"object\" && val !== null && \"value\" in val;\n };\n\n // Extract array value from the custom { __type: \"Vector\", value: number[] } wrapper\n const arrayValue = isVectorObject(value)\n ? value.value\n : (Array.isArray(value) ? value : []);\n\n const [textValue, setTextValue] = useState(() => arrayValue.join(\", \"));\n const [isEditing, setIsEditing] = useState(false);\n const [showValues, setShowValues] = useState(false);\n\n useEffect(() => {\n setTextValue(arrayValue.join(\", \"));\n }, [JSON.stringify(arrayValue)]);\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n setTextValue(\"\");\n }, [setValue]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const raw = event.target.value;\n setTextValue(raw);\n\n // Parse comma-separated string to number array\n const numbers = raw\n .split(\",\")\n .map(str => str.trim())\n .filter(str => str !== \"\")\n .map(Number);\n\n setValue({\n __type: \"Vector\",\n value: numbers\n });\n };\n\n const label = (\n <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n />\n );\n\n const isPopulated = arrayValue.length > 0;\n\n return (\n <div className=\"flex flex-col gap-2 w-full mt-2\">\n {/* Field Label */}\n <div className=\"flex items-center justify-between mb-1\">\n {label}\n </div>\n\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n <div className=\"w-full\">\n {!isEditing ? (\n /* Compact Preview Card */\n <div className=\"flex flex-col gap-3 p-4 rounded-xl border border-surface-200 dark:border-surface-700 bg-surface-50/50 dark:bg-surface-800/20 backdrop-blur-sm transition-all duration-200 hover:border-surface-300 dark:hover:border-surface-600\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2.5\">\n {/* Status Dot */}\n <div className={`w-2.5 h-2.5 rounded-full ${isPopulated ? \"bg-emerald-500 animate-pulse\" : \"bg-surface-300 dark:bg-surface-600\"}`} />\n <span className=\"text-sm font-semibold text-text-primary dark:text-text-primary-dark\">\n {isPopulated ? `${arrayValue.length} Dimensions` : \"Empty Vector\"}\n </span>\n {isPopulated && (\n <span className=\"text-xs text-text-secondary dark:text-text-secondary-dark px-2 py-0.5 rounded-full bg-surface-100 dark:bg-surface-800 font-medium\">\n Embedding\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {isPopulated && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setShowValues(!showValues)}\n startIcon={showValues ? <EyeOffIcon size={14} /> : <EyeIcon size={14} />}\n >\n {showValues ? \"Hide values\" : \"Show values\"}\n </Button>\n )}\n {!disabled && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setIsEditing(true)}\n startIcon={<PencilIcon size={14} />}\n >\n {isPopulated ? \"Edit values\" : \"Add values\"}\n </Button>\n )}\n {isPopulated && !disabled && (\n <IconButton size=\"small\" onClick={handleClearClick} className=\"text-text-secondary hover:text-red-500\">\n <Trash2Icon size={14} />\n </IconButton>\n )}\n </div>\n </div>\n\n {/* Collapsible scrollable numbers list */}\n {showValues && isPopulated && (\n <div className=\"mt-1 p-3 rounded-lg bg-surface-100/50 dark:bg-surface-900/40 border border-surface-200/50 dark:border-surface-800/50 max-h-36 overflow-y-auto font-mono text-[11px] leading-relaxed text-text-secondary dark:text-text-secondary-dark break-all selection:bg-primary-100 dark:selection:bg-primary-900/40\">\n {arrayValue.join(\", \")}\n </div>\n )}\n </div>\n ) : (\n /* Editing View: Text Input */\n <div className=\"flex flex-col gap-2 p-4 rounded-xl border border-primary-500/30 dark:border-primary-400/20 bg-surface-50/20 dark:bg-surface-800/10\">\n <TextField\n size={size}\n value={textValue}\n onChange={onChange}\n autoFocus={true}\n placeholder={`e.g., 0.15, -0.42, 0.88 (Requires ${property.dimensions} dimensions)`}\n disabled={disabled}\n error={showError ? !!error : undefined}\n inputClassName={error ? \"text-red-500 dark:text-red-600 font-mono text-xs\" : \"font-mono text-xs\"}\n />\n <div className=\"flex justify-end gap-2 mt-2\">\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setIsEditing(false)}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n size=\"small\"\n onClick={() => setIsEditing(false)}\n startIcon={<CheckIcon size={14} />}\n >\n Done\n </Button>\n </div>\n </div>\n )}\n </div>\n </PropertyIdCopyTooltip>\n\n <FieldHelperText\n includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}\n />\n </div>\n );\n}\n","import { useSelectionDialog } from \"../../hooks/useSelectionDialog\";\nimport type { FieldProps } from \"../../types/fields\";\nimport type { RelationProperty } from \"@rebasepro/types\";\nimport { Entity, getCollectionDataPath, getDataSourceCapabilities } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { ArrayContainer, ArrayEntryParams } from \"../../components/ArrayContainer\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { getRelationFrom, resolveRelationProperty } from \"@rebasepro/common\";\n\nimport { ErrorView, useTranslation } from \"@rebasepro/app\";\nimport { Button, cls, ExpandablePanel, fieldBackgroundMixin, PencilIcon, Typography } from \"@rebasepro/ui\";\nimport { RelationPreview } from \"../../preview\";\n\n/**\n * This field allows selecting multiple references.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MultipleRelationFieldBinding({\n propertyKey,\n value: valueProp,\n error,\n showError,\n disabled,\n isSubmitting,\n property,\n includeDescription,\n setValue,\n setFieldValue,\n context\n}: FieldProps<RelationProperty>) {\n\n const value = Array.isArray(valueProp) ? valueProp : [];\n const { t } = useTranslation();\n\n if (property.type !== \"relation\") {\n throw Error(\"RelationFieldBinding expected a property containing a relation\");\n }\n\n const parentCollection = context.collection;\n const capabilities = parentCollection ? getDataSourceCapabilities(parentCollection.engine) : undefined;\n if (!parentCollection || !capabilities?.supportsRelations || !(\"relations\" in parentCollection) || !parentCollection.relations) {\n throw Error(\"RelationFieldBinding expected a collection with relations support\");\n }\n const resolvedProperty = resolveRelationProperty(property, parentCollection.relations, propertyKey)\n const relation = resolvedProperty.relation;\n if (!relation)\n throw Error(\n \"Property relation is required for MultipleRelationFieldBinding\"\n )\n\n const selectedEntityIds = value && Array.isArray(value) ? value.map((ref) => ref.id) : [];\n const collection = relation.target();\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<Record<string, unknown>>[]) => {\n setValue(entities.map(e => getRelationFrom(e)));\n }, [setValue]);\n\n const referenceDialogController = useSelectionDialog({\n multiselect: true,\n path: getCollectionDataPath(collection),\n collection,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n fixedFilter: property.fixedFilter\n }\n );\n\n const onEntryClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n };\n\n const buildEntry = useCallback(({\n index,\n internalId,\n storedProps,\n storeProps\n }: ArrayEntryParams) => {\n const entryValue = value && Array.isArray(value) && value.length > index ? value[index] : undefined;\n if (!entryValue)\n return <div>Internal ERROR</div>;\n return (\n <RelationPreview\n key={internalId}\n previewProperties={property.ui?.previewProperties}\n size={\"medium\"}\n onClick={onEntryClick}\n hover={!disabled}\n relation={entryValue}\n includeId={property.includeId}\n includeEntityLink={property.includeEntityLink}\n />\n );\n }, [relation, property.ui?.previewProperties, value]);\n\n const title = (<>\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 flex grow text-text-secondary dark:text-text-secondary-dark\"}/>\n {Array.isArray(value) && <Typography variant={\"caption\"} className={\"px-4\"}>({value.length})</Typography>}\n </>);\n\n const body = <>\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <div className={\"group\"}>\n\n <ArrayContainer droppableId={propertyKey}\n value={value}\n disabled={isSubmitting}\n buildEntry={buildEntry}\n canAddElements={false}\n addLabel={property.name ? t(\"add_reference_to\", { name: property.name }) : t(\"add_reference\")}\n newDefaultEntry={null}\n onValueChange={(value) => setFieldValue(propertyKey, value)}\n />\n\n <Button\n className=\"ml-3.5 my-4 justify-center text-left\"\n variant=\"text\"\n color=\"primary\"\n disabled={isSubmitting}\n onClick={onEntryClick}>\n <PencilIcon size={16}/>\n {t(\"edit\")} {property.name}\n </Button>\n </div>}\n </>;\n\n return (\n <>\n\n <ExpandablePanel\n titleClassName={fieldBackgroundMixin}\n innerClassName={cls(\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\", fieldBackgroundMixin)}\n title={title}>\n {body}\n </ExpandablePanel>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import { useSelectionDialog } from \"../../hooks/useSelectionDialog\";\nimport type { FieldProps } from \"../../types/fields\";\nimport type { RelationProperty } from \"@rebasepro/types\";\nimport { Entity, getCollectionDataPath, getDataSourceCapabilities, Relation } from \"@rebasepro/types\";\nimport React, { useCallback } from \"react\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIconAndTooltip } from \"../components/LabelWithIconAndTooltip\";\nimport { EntityPreviewContainer } from \"../../components/EntityPreviewBinding\";\nimport { ErrorView, IconForView } from \"@rebasepro/app\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { getRelationFrom, normalizeToEntityRelation, resolveRelationProperty } from \"@rebasepro/common\";\nimport { cls } from \"@rebasepro/ui\";\nimport { RelationPreview } from \"../../preview\";\nimport { RelationSelector } from \"../../components/RelationSelector\";\nimport { MultipleRelationFieldBinding } from \"./MultipleRelationFieldBinding\";\n\nexport function RelationFieldBinding(props: FieldProps<RelationProperty>) {\n const { property, propertyKey, context } = props;\n\n if (property.type !== \"relation\") {\n throw Error(\"RelationFieldBinding expected a property containing a relation\");\n }\n const collection = context.collection;\n const capabilities = collection ? getDataSourceCapabilities(collection.engine) : undefined;\n if (!collection || !capabilities?.supportsRelations || !(\"relations\" in collection) || !collection.relations) {\n throw Error(\"RelationFieldBinding expected a collection with relations support\");\n }\n const resolvedProperty = resolveRelationProperty(property, collection.relations, propertyKey);\n const relation = resolvedProperty.relation;\n\n const manyRelation = relation?.cardinality === \"many\";\n const widget = property.ui?.widget ?? \"select\";\n\n if (widget === \"select\" && relation) {\n return <RelationSelectorBinding {...props} relation={relation} manyRelation={manyRelation} />;\n }\n\n if (manyRelation) {\n return <MultipleRelationFieldBinding {...props} />;\n }\n\n return <SingleRelationFieldBinding {...props} relation={relation} />;\n}\n\nfunction RelationSelectorBinding({\n propertyKey,\n value,\n size,\n error,\n showError,\n disabled,\n isSubmitting,\n property,\n includeDescription,\n setValue,\n relation,\n manyRelation\n}: FieldProps<RelationProperty> & { relation: Relation; manyRelation: boolean }) {\n const normalizedSingle = (!manyRelation && value && !Array.isArray(value)) ? normalizeToEntityRelation(value) : null;\n const singleValue = normalizedSingle ?? null;\n const multipleValue = (manyRelation && Array.isArray(value)) ? value : [];\n\n const selectorSize: \"small\" | \"medium\" | undefined = size === \"large\" ? \"medium\" : size;\n\n return (\n <div className=\"\">\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n\n <RelationSelector\n relation={relation}\n value={manyRelation ? multipleValue : singleValue}\n onValueChange={(newVal) => {\n if (manyRelation) {\n setValue(Array.isArray(newVal) ? newVal : []);\n } else {\n setValue(!Array.isArray(newVal) ? (newVal ?? null) : null);\n }\n }}\n disabled={disabled || isSubmitting}\n fixedFilter={property.fixedFilter}\n size={selectorSize}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n </div>\n );\n}\n\nfunction SingleRelationFieldBinding({\n propertyKey,\n value,\n size,\n error,\n showError,\n disabled,\n isSubmitting,\n property,\n includeDescription,\n setValue,\n relation\n}: FieldProps<RelationProperty> & { relation: Relation | undefined }) {\n const normalizedValue = value && !Array.isArray(value) ? normalizeToEntityRelation(value) : null;\n const validValue = !!normalizedValue;\n\n const collection = relation?.target();\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the relation: ${propertyKey}`);\n }\n\n const onSingleEntitySelected = useCallback((e: Entity<Record<string, unknown>> | null) => {\n setValue(e ? getRelationFrom(e) : null);\n }, [setValue]);\n\n const referenceDialogController = useSelectionDialog({\n multiselect: false,\n path: getCollectionDataPath(collection),\n collection,\n onSingleEntitySelected,\n selectedEntityIds: validValue && normalizedValue ? [normalizedValue.id] : undefined,\n fixedFilter: property.fixedFilter\n });\n\n const onEntryClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n };\n\n const usedRelation = Array.isArray(value) ? undefined : normalizedValue ?? undefined;\n\n return (\n <>\n <LabelWithIconAndTooltip\n propertyKey={propertyKey}\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name ?? propertyKey}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <>\n\n {usedRelation && <RelationPreview\n disabled={!usedRelation}\n previewProperties={property.ui?.previewProperties}\n hover={!disabled}\n size={size}\n onClick={disabled || isSubmitting ? undefined : onEntryClick}\n relation={usedRelation}\n includeEntityLink={property.includeEntityLink}\n includeId={property.includeId}\n />}\n\n {!value && <div className=\"justify-center text-left\">\n <EntityPreviewContainer className={cls(\"px-6 h-16 text-sm font-medium flex items-center gap-6\",\n disabled || isSubmitting\n ? \"text-surface-accent-500\"\n : \"cursor-pointer text-surface-accent-700 dark:text-surface-accent-300 hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\")}\n onClick={onEntryClick}\n size={\"medium\"}>\n <IconForView collectionOrView={collection}\n className={\"text-surface-300 dark:text-surface-600\"}/>\n {`Edit ${property.name}`.toUpperCase()}\n </EntityPreviewContainer>\n </div>}\n </>}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n </>\n );\n}\n","import type { FieldProps } from \"../../types/fields\";\nimport type { StringProperty } from \"@rebasepro/types\";\nimport React from \"react\";\n\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { LabelWithIcon } from \"../components/LabelWithIcon\";\nimport { getIconForProperty } from \"../../util/property_utils\";\nimport { PropertyIdCopyTooltip } from \"../../components/PropertyIdCopyTooltip\";\nimport { UserSelector } from \"../../components/UserSelector\";\n\ntype UserSelectProps = FieldProps<StringProperty>;\n\n/**\n * Field binding for selecting a user from the internal user management system.\n * Renders a searchable popover dropdown with user information including name and email,\n * with server-side search and pagination support.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function UserSelectFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n includeDescription,\n size = \"large\"\n }: UserSelectProps) {\n\n const selectorSize: \"small\" | \"medium\" | undefined = size === \"large\" ? \"medium\" : size;\n\n return (\n <>\n <PropertyIdCopyTooltip propertyKey={propertyKey}>\n <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5 my-0\"}\n />\n </PropertyIdCopyTooltip>\n\n <UserSelector\n value={value as string | null | undefined}\n onValueChange={(userId) => {\n setValue(userId);\n }}\n disabled={disabled}\n clearable={property.ui?.clearable}\n size={selectorSize}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","\nimport type { DefaultFieldConfig } from \"../types/fields\";\nimport type { ArrayProperty, NumberProperty, Property, PropertyConfig, StringProperty, VectorProperty } from \"@rebasepro/types\";\nimport { ArrayCustomShapedFieldBinding } from \"../form/field_bindings/ArrayCustomShapedFieldBinding\";\nimport { ArrayOfReferencesFieldBinding } from \"../form/field_bindings/ArrayOfReferencesFieldBinding\";\nimport { BlockFieldBinding } from \"../form/field_bindings/BlockFieldBinding\";\nimport { DateTimeFieldBinding } from \"../form/field_bindings/DateTimeFieldBinding\";\nimport { KeyValueFieldBinding } from \"../form/field_bindings/KeyValueFieldBinding\";\nimport { MapFieldBinding } from \"../form/field_bindings/MapFieldBinding\";\nimport { MarkdownEditorFieldBinding } from \"../form/field_bindings/MarkdownEditorFieldBinding\";\nimport { MultiSelectFieldBinding } from \"../form/field_bindings/MultiSelectFieldBinding\";\nimport { ReferenceFieldBinding } from \"../form/field_bindings/ReferenceFieldBinding\";\nimport { RepeatFieldBinding } from \"../form/field_bindings/RepeatFieldBinding\";\nimport { SelectFieldBinding } from \"../form/field_bindings/SelectFieldBinding\";\nimport { StorageUploadFieldBinding } from \"../form/field_bindings/StorageUploadFieldBinding\";\nimport { SwitchFieldBinding } from \"../form/field_bindings/SwitchFieldBinding\";\nimport { TextFieldBinding } from \"../form/field_bindings/TextFieldBinding\";\nimport { VectorFieldBinding } from \"../form/field_bindings/VectorFieldBinding\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\n\nimport {\n AlignLeftIcon,\n CalendarIcon,\n FlagIcon,\n FolderUpIcon,\n GlobeIcon,\n HashIcon,\n LinkIcon,\n ListIcon,\n ListOrderedIcon,\n MailIcon,\n QuoteIcon,\n RepeatIcon,\n Rows3Icon,\n TextIcon,\n UploadIcon,\n UserCheckIcon,\n UserIcon,\n VoteIcon\n} from \"@rebasepro/ui\";\nimport { RelationFieldBinding } from \"../form/field_bindings/RelationFieldBinding\";\nimport { UserSelectFieldBinding } from \"../form/field_bindings/UserSelectFieldBinding\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\n/**\n * Every `Field` below is a getter on purpose — do not inline it back to\n * `Field: SomeBinding`.\n *\n * This module and the field bindings form an import cycle: we import the\n * bindings, the container bindings (map, repeat, block, custom-shaped array)\n * import `PropertyFieldBinding` to render their children, and that imports\n * `getFieldConfig` from here. Enter the cycle at a binding rather than here and\n * this object is built while that binding's module is still initialising.\n *\n * As a plain value the binding would be read at that moment. It happens to\n * survive today only because every binding is declared `export function`, which\n * hoists; rewriting a single one as `export const` would make the read a\n * temporal dead zone ReferenceError at import time, surfacing as a blank screen\n * far from its cause. The getter defers the read to first access, long after\n * every module has initialised, so declaration style stops mattering.\n */\nexport const DEFAULT_FIELD_CONFIGS: Record<DefaultFieldConfig, PropertyConfig> = {\n text_field: {\n key: \"text_field\",\n name: \"Text field\",\n description: \"Simple short text\",\n Icon: TextIcon,\n color: \"#2d7ff9\",\n property: {\n type: \"string\",\n ui: { get Field() { return TextFieldBinding; } }\n }\n },\n multiline: {\n key: \"multiline\",\n name: \"Multiline\",\n description: \"Text with multiple lines\",\n Icon: AlignLeftIcon,\n color: \"#2d7ff9\",\n property: {\n type: \"string\",\n ui: { multiline: true,\nget Field() { return TextFieldBinding; } }\n }\n },\n markdown: {\n key: \"markdown\",\n name: \"Markdown\",\n description: \"Text with advanced markdown syntax\",\n Icon: QuoteIcon,\n color: \"#2d7ff9\",\n property: {\n type: \"string\",\n ui: { markdown: true,\nget Field() { return MarkdownEditorFieldBinding; } }\n }\n },\n url: {\n key: \"url\",\n name: \"Url\",\n description: \"Text with URL validation\",\n Icon: GlobeIcon,\n color: \"#154fb3\",\n property: {\n type: \"string\",\n ui: { url: true,\nget Field() { return TextFieldBinding; } }\n }\n },\n email: {\n key: \"email\",\n name: \"Email\",\n description: \"Text with email validation\",\n Icon: MailIcon,\n color: \"#154fb3\",\n property: {\n type: \"string\",\n email: true,\n ui: { get Field() { return TextFieldBinding; } }\n }\n },\n switch: {\n key: \"switch\",\n name: \"Switch\",\n description: \"Boolean true or false field (or yes or no, 0 or 1...)\",\n Icon: FlagIcon,\n color: \"#20d9d2\",\n property: {\n type: \"boolean\",\n ui: { get Field() { return SwitchFieldBinding; } }\n }\n },\n select: {\n key: \"select\",\n name: \"Select/enum\",\n description: \"Select one text value from within an enumeration\",\n Icon: ListIcon,\n color: \"#4223c9\",\n property: {\n type: \"string\",\n enum: [],\n ui: { get Field() { return SelectFieldBinding; } }\n }\n },\n multi_select: {\n key: \"multi_select\",\n name: \"Multi select (enum)\",\n description: \"Select multiple text values from within an enumeration\",\n Icon: ListIcon,\n color: \"#4223c9\",\n property: {\n type: \"array\",\n of: {\n type: \"string\",\n enum: []\n },\n ui: { get Field() { return MultiSelectFieldBinding; } }\n }\n },\n user_select: {\n key: \"user_select\",\n name: \"User select\",\n description: \"Select a user from the user management system. Store the user ID.\",\n Icon: UserIcon,\n property: {\n type: \"string\",\n ui: { get Field() { return UserSelectFieldBinding; } }\n }\n },\n number_input: {\n key: \"number_input\",\n name: \"Number input\",\n description: \"Simple number field with validation\",\n Icon: HashIcon,\n color: \"#bec920\",\n property: {\n type: \"number\",\n ui: { get Field() { return TextFieldBinding; } }\n }\n },\n number_select: {\n key: \"number_select\",\n name: \"Number select\",\n description: \"Select a number value from within an enumeration\",\n Icon: ListOrderedIcon,\n color: \"#bec920\",\n property: {\n type: \"number\",\n enum: [],\n ui: { get Field() { return SelectFieldBinding; } }\n }\n },\n multi_number_select: {\n key: \"multi_number_select\",\n name: \"Multiple number select\",\n description: \"Select multiple number values from within an enumeration\",\n Icon: ListOrderedIcon,\n color: \"#bec920\",\n property: {\n type: \"array\",\n of: {\n type: \"number\",\n enum: []\n },\n ui: { get Field() { return MultiSelectFieldBinding; } }\n }\n },\n file_upload: {\n key: \"file_upload\",\n name: \"File upload\",\n description: \"Input for uploading single files\",\n Icon: UploadIcon,\n color: \"#f92d9a\",\n property: {\n type: \"string\",\n storage: {\n storagePath: \"{path}\"\n },\n ui: { get Field() { return StorageUploadFieldBinding; } }\n }\n },\n multi_file_upload: {\n key: \"multi_file_upload\",\n name: \"Multiple file upload\",\n description: \"Input for uploading multiple files\",\n Icon: FolderUpIcon,\n color: \"#f92d9a\",\n property: {\n type: \"array\",\n of: {\n type: \"string\",\n storage: {\n storagePath: \"{path}\"\n }\n },\n ui: { get Field() { return StorageUploadFieldBinding; } }\n }\n },\n reference: {\n key: \"reference\",\n name: \"Reference\",\n description: \"The value refers to a different collection (it is saved as a reference)\",\n Icon: LinkIcon,\n color: \"#ff0042\",\n property: {\n type: \"reference\",\n ui: { get Field() { return ReferenceFieldBinding; } }\n }\n },\n multi_references: {\n key: \"multi_references\",\n name: \"Multiple references\",\n description: \"Multiple values that refer to a different collection\",\n Icon: LinkIcon,\n color: \"#ff0042\",\n property: {\n type: \"array\",\n of: {\n type: \"reference\"\n },\n ui: { get Field() { return ArrayOfReferencesFieldBinding; } }\n }\n },\n relation: {\n key: \"relation\",\n name: \"Relation\",\n description: \"Multiple values that refer to a different collection\",\n Icon: LinkIcon,\n color: \"#ff0042\",\n property: {\n relationName: \"\",\n type: \"relation\",\n ui: { get Field() { return RelationFieldBinding; } }\n }\n },\n date_time: {\n key: \"date_time\",\n name: \"Date/time\",\n description: \"A date time select field\",\n Icon: CalendarIcon,\n color: \"#8b46ff\",\n property: {\n type: \"date\",\n ui: { get Field() { return DateTimeFieldBinding; } }\n }\n },\n group: {\n key: \"group\",\n name: \"Group\",\n description: \"Group of multiple fields\",\n Icon: VoteIcon,\n color: \"#ff9408\",\n property: {\n type: \"map\",\n properties: {},\n ui: { get Field() { return MapFieldBinding; } }\n }\n },\n key_value: {\n key: \"key_value\",\n name: \"Key-value\",\n description: \"Flexible field that allows the user to add multiple key-value pairs\",\n Icon: VoteIcon,\n color: \"#ff9408\",\n property: {\n type: \"map\",\n keyValue: true,\n ui: { get Field() { return KeyValueFieldBinding; } }\n }\n },\n repeat: {\n key: \"repeat\",\n name: \"Repeat/list\",\n description: \"A field that gets repeated multiple times (e.g. multiple text fields)\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n type: \"array\",\n of: {\n type: \"string\"\n },\n ui: { get Field() { return RepeatFieldBinding; } }\n }\n },\n custom_array: {\n key: \"custom_array\",\n name: \"Custom array\",\n description: \"A field that saved its value as an array of custom objects\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n type: \"array\",\n ui: { get Field() { return ArrayCustomShapedFieldBinding; } }\n }\n },\n block: {\n key: \"block\",\n name: \"Block\",\n description: \"A complex field that allows the user to compose different fields together, with a key/value format\",\n Icon: Rows3Icon,\n color: \"#ff9408\",\n property: {\n type: \"array\",\n oneOf: {\n properties: {}\n },\n ui: { get Field() { return BlockFieldBinding; } }\n }\n },\n vector_input: {\n key: \"vector_input\",\n name: \"Vector input\",\n description: \"Vector array for embeddings\",\n Icon: HashIcon,\n color: \"#bec920\",\n property: {\n type: \"vector\",\n dimensions: 1536,\n ui: { get Field() { return VectorFieldBinding; } }\n }\n }\n};\n\nexport function getDefaultFieldConfig(property: Property): PropertyConfig | undefined {\n const fieldId = getDefaultFieldId(property);\n if (!fieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n return DEFAULT_FIELD_CONFIGS[fieldId];\n}\n\nexport function getFieldConfig(property: Property, propertyConfigs: Record<string, PropertyConfig>): PropertyConfig | undefined {\n const fieldId = getFieldId(property);\n const defaultFieldId = getDefaultFieldId(property);\n if (!defaultFieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n const defaultFieldConfig = defaultFieldId ? DEFAULT_FIELD_CONFIGS[defaultFieldId] : undefined;\n const customField = fieldId && propertyConfigs ? propertyConfigs[fieldId] : undefined;\n return mergeDeep(defaultFieldConfig ?? {}, customField ?? {} as PropertyConfig);\n}\n\nexport function getDefaultFieldId(property: Property) {\n if (property.type === \"string\") {\n if (property.ui?.markdown) {\n return \"markdown\";\n } else if (property.ui?.multiline) {\n return \"multiline\";\n } else if (property.storage) {\n return \"file_upload\";\n } else if (property.ui?.url) {\n return \"url\";\n } else if (property.email) {\n return \"email\";\n } else if (property.enum) {\n return \"select\";\n } else if (property.userSelect) {\n return \"user_select\";\n } else {\n return \"text_field\";\n }\n } else if (property.type === \"number\") {\n if (property.enum) {\n return \"number_select\";\n }\n return \"number_input\";\n } else if (property.type === \"map\") {\n if (property.keyValue)\n return \"key_value\";\n return \"group\";\n } else if (property.type === \"array\") {\n const of = (property as ArrayProperty).of;\n const oneOf = (property as ArrayProperty).oneOf;\n if (oneOf) {\n return \"block\";\n } else if (Array.isArray(of)) {\n return \"custom_array\";\n } else if (isPropertyBuilder(of)) {\n return \"repeat\";\n } else if (of) {\n const ofProperty = of as Property;\n if (ofProperty.type === \"string\" && (ofProperty as StringProperty).enum) {\n return \"multi_select\";\n } else if (ofProperty.type === \"number\" && (ofProperty as NumberProperty).enum) {\n return \"multi_number_select\";\n } else if (ofProperty.type === \"string\" && (ofProperty as StringProperty).storage) {\n return \"multi_file_upload\";\n } else if (ofProperty.type === \"reference\") {\n return \"multi_references\";\n } else if (of?.type === \"relation\") {\n throw new Error(\"The 'relation' type is not supported inside arrays. Use 'reference' instead.\");\n } else {\n return \"repeat\";\n }\n } else {\n return \"repeat\";\n }\n } else if (property.type === \"boolean\") {\n return \"switch\";\n } else if (property.type === \"date\") {\n return \"date_time\";\n } else if (property.type === \"relation\") {\n return \"relation\";\n } else if (property.type === \"reference\") {\n return \"reference\";\n } else if (property.type === \"vector\") {\n return \"vector_input\";\n } else if (property.type === \"binary\") {\n return \"text_field\";\n }\n\n console.error(\"Unsupported field config mapping\", property);\n return undefined;\n}\n\nexport function getFieldId(property: Property): string | undefined {\n if (property.propertyConfig)\n return property.propertyConfig;\n return getDefaultFieldId(property);\n}\n","import type { CollectionConfig, FieldProps as CoreFieldProps } from \"@rebasepro/types\";\nimport type { FieldProps, PropertyFieldBindingProps } from \"../types/fields\";\nimport type { RebasePlugin, PluginFieldBuilderParams, Property } from \"@rebasepro/types\";\nimport React, { ComponentType, ReactElement, Suspense, useCallback, useRef } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport { resolveComponentRef } from \"@rebasepro/app\";\n\nimport { Field, FormexFieldProps, getIn } from \"@rebasepro/forms\";\n\n;\nimport { ReadOnlyFieldBinding } from \"./field_bindings/ReadOnlyFieldBinding\";\n\nimport { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from \"@rebasepro/common\";\nimport { useAuthController, useCustomizationController } from \"@rebasepro/app\";\nimport { Typography } from \"@rebasepro/ui\";\nimport { getFieldConfig, getFieldId } from \"../components/field_configs\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\n/**\n * This component renders a form field creating the corresponding configuration\n * from a property. For example if bound to a string property, it will generate\n * a text field.\n *\n * You can use it when you are creating a custom field, and need to\n * render additional fields mapped to properties. This is useful if you\n * need to build a complex property mapping, like an array where each index\n * is a different property.\n *\n * Please note that if you build a custom field in a component, the\n * **validation** passed in the property will have no effect. You need to set\n * the validation in the `CollectionConfig` definition.\n *\n * @param propertyKey You can use nested names such as `address.street` or `friends[2]`\n * @param property\n * @param context\n * @param includeDescription\n * @param underlyingValueHasChanged\n * @param disabled\n * @param tableMode\n * @param partOfArray\n * @param autoFocus\n * @group Form custom fields\n */\nexport const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a: PropertyFieldBindingProps<Record<string, unknown>>, b: PropertyFieldBindingProps<Record<string, unknown>>) => {\n if (a.propertyKey !== b.propertyKey) {\n return false;\n }\n if (a.index !== b.index) {\n return false;\n }\n\n if (a.size !== b.size) {\n return false;\n }\n const aIsBuilder = isPropertyBuilder(a.property);\n const bIsBuilder = isPropertyBuilder(b.property);\n\n const baseCheck = (aIsBuilder === bIsBuilder || equal(a.property, b.property)) &&\n a.disabled === b.disabled;\n if (!baseCheck) {\n return false;\n }\n\n if (shouldPropertyReRender(b.property)) {\n return false;\n }\n\n return false;\n}) as typeof PropertyFieldBindingInternal;\n\nfunction PropertyFieldBindingInternal<M extends Record<string, unknown> = Record<string, unknown>>\n({\n propertyKey,\n property,\n context,\n includeDescription,\n underlyingValueHasChanged,\n disabled: disabledProp,\n partOfArray,\n partOfBlock,\n minimalistView,\n autoFocus,\n index,\n size,\n onPropertyChange\n }: PropertyFieldBindingProps<M>): ReactElement<PropertyFieldBindingProps<M>> {\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n return (\n <Field\n key={propertyKey}\n name={propertyKey}\n >\n {(fieldProps) => {\n\n let Component: ComponentType<FieldProps<Property, any, any>> | undefined;\n const resolvedProperty = resolveProperty({\n propertyKey,\n property: property,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n propertyConfigs: customizationController.propertyConfigs,\n index,\n authController\n }) as Property | null;\n\n const readOnly = resolvedProperty ? isReadOnly(resolvedProperty) : true;\n const disabled = disabledProp || readOnly || Boolean(resolvedProperty?.ui?.disabled) || context.disabled;\n\n if (resolvedProperty === null || isHidden(resolvedProperty)) {\n return <></>;\n } else if (readOnly) {\n Component = ReadOnlyFieldBinding;\n } else if (resolvedProperty.ui?.Field) {\n const resolved = resolveComponentRef(resolvedProperty.ui.Field);\n if (resolved) {\n Component = resolved as ComponentType<FieldProps<Property, any, any>>;\n }\n } else {\n const propertyConfig = getFieldConfig(resolvedProperty, customizationController.propertyConfigs);\n if (!propertyConfig) {\n throw new Error(`INTERNAL: Could not find field config for property ${propertyKey}`);\n }\n const configProperty = resolveProperty({\n propertyKey,\n property: propertyConfig.property as Property,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n propertyConfigs: customizationController.propertyConfigs,\n index,\n authController\n }) as Property | null;\n Component = resolveComponentRef(configProperty?.ui?.Field) as ComponentType<FieldProps<Property, any, any>> | undefined;\n }\n if (!Component) {\n console.warn(`No field component found for property ${propertyKey}`);\n console.warn(\"Property:\", property);\n return (\n <div className={\"w-full\"}>\n {`Currently the field ${resolvedProperty.type} is not supported`}\n </div>\n );\n }\n\n const componentProps: ResolvedPropertyFieldBindingProps<M> = {\n propertyKey,\n property: resolvedProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled,\n partOfArray,\n partOfBlock,\n minimalistView,\n autoFocus,\n size,\n onPropertyChange\n };\n\n return <FieldInternal\n Component={Component as ComponentType<FieldProps<Property, any, any>>}\n componentProps={componentProps}\n formexFieldProps={fieldProps as FormexFieldProps<unknown, Record<string, unknown>>}/>;\n }}\n </Field>\n );\n\n}\n\ntype ResolvedPropertyFieldBindingProps<M extends Record<string, unknown> = Record<string, unknown>> =\n Omit<PropertyFieldBindingProps<M>, \"property\">\n & {\n property: Property\n};\n\nfunction FieldInternal<CustomProps, M extends Record<string, unknown>>\n({\n Component,\n componentProps: {\n propertyKey,\n property,\n includeDescription,\n underlyingValueHasChanged,\n partOfArray,\n partOfBlock,\n minimalistView,\n autoFocus,\n context,\n disabled,\n size,\n onPropertyChange\n },\n formexFieldProps\n }:\n {\n Component: ComponentType<FieldProps<Property, any, any>>,\n componentProps: ResolvedPropertyFieldBindingProps<M>,\n formexFieldProps: FormexFieldProps<unknown, Record<string, unknown>>\n }) {\n\n const { plugins } = useCustomizationController();\n\n const customFieldProps: unknown = property.ui?.customProps;\n const value = formexFieldProps.field.value;\n const error = getIn(formexFieldProps.form.errors, propertyKey) as string | string[] | undefined;\n const touched = getIn(formexFieldProps.form.touched, propertyKey) as boolean | undefined;\n\n const showError = Boolean(error &&\n (formexFieldProps.form.submitCount > 0 || property.validation?.unique) &&\n (!Array.isArray(error) || !!error.filter((e: unknown) => !!e).length));\n\n const WrappedComponent: ComponentType<FieldProps<Property, any, any>> | null = useWrappedComponent<unknown, any>({\n path: context.path,\n collection: context.collection,\n propertyKey: propertyKey,\n property: property,\n Component: Component as ComponentType<FieldProps<Property, unknown, M>>,\n plugins: plugins\n });\n const UsedComponent: ComponentType<FieldProps<Property, any, any>> = WrappedComponent ?? Component;\n\n const isSubmitting = formexFieldProps.form.isSubmitting;\n\n const setValue = useCallback((value: unknown | null, shouldValidate?: boolean) => {\n formexFieldProps.form.setFieldTouched(propertyKey, true, false);\n formexFieldProps.form.setFieldValue(propertyKey, value, shouldValidate);\n }, []);\n\n const setFieldValue = useCallback((otherPropertyKey: string, value: unknown | null, shouldValidate?: boolean) => {\n formexFieldProps.form.setFieldTouched(propertyKey, true, false);\n formexFieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);\n }, []);\n\n const cmsFieldProps: FieldProps<Property, CustomProps, M> = {\n propertyKey,\n value,\n setValue,\n setFieldValue,\n error: error as string | undefined,\n touched,\n showError,\n isSubmitting,\n includeDescription: includeDescription ?? true,\n property: property as Property,\n disabled: disabled ?? false,\n underlyingValueHasChanged: underlyingValueHasChanged ?? false,\n partOfArray: partOfArray ?? false,\n partOfBlock: partOfBlock ?? false,\n minimalistView: minimalistView ?? false,\n autoFocus: autoFocus ?? false,\n customProps: customFieldProps as CustomProps,\n context,\n size,\n onPropertyChange\n };\n\n return (\n <ErrorBoundary>\n <Suspense fallback={null}>\n <UsedComponent {...cmsFieldProps}/>\n </Suspense>\n\n {underlyingValueHasChanged && !isSubmitting &&\n <Typography variant={\"caption\"} className={\"ml-3.5\"}>\n This value has been updated elsewhere\n </Typography>}\n\n </ErrorBoundary>);\n\n}\n\nconst shouldPropertyReRender = (property: Property, plugins?: RebasePlugin[]): boolean => {\n if (plugins?.some((plugin) => plugin.fieldBuilder)) {\n return true;\n }\n if (isPropertyBuilder(property)) {\n return true;\n }\n const defAProperty = property as Property;\n const rerenderThisProperty = Boolean(defAProperty.ui?.Field);\n if (defAProperty.type === \"map\" && defAProperty.properties) {\n return Boolean(rerenderThisProperty || Object.values(defAProperty.properties).some((childProperty) => shouldPropertyReRender(childProperty as Property, plugins)));\n } else {\n return Boolean(rerenderThisProperty);\n }\n}\n\ninterface UseWrappedComponentParams<M extends Record<string, unknown> = Record<string, unknown>> {\n path?: string,\n collection?: CollectionConfig<M>,\n propertyKey: string,\n property: Property,\n Component: ComponentType<FieldProps<Property, unknown, M>>,\n plugins?: RebasePlugin[]\n}\n\nfunction useWrappedComponent<T, M extends Record<string, unknown> = Record<string, unknown>>(\n {\n path,\n collection,\n propertyKey,\n property,\n Component,\n plugins\n }: UseWrappedComponentParams<M>\n): ComponentType<FieldProps<Property, unknown, M>> | null {\n\n const wrapperRef = useRef<ComponentType<FieldProps<Property, unknown, M>> | null>((() => {\n let Wrapper: ComponentType<FieldProps<Property, unknown, M>> | null = null;\n if (plugins) {\n plugins.forEach((plugin) => {\n const fieldId = getFieldId(property);\n if (fieldId && plugin.fieldBuilder) {\n const params: PluginFieldBuilderParams = {\n fieldConfigId: fieldId,\n propertyKey,\n property,\n Field: Component as unknown as ComponentType<CoreFieldProps<Property, unknown, Record<string, unknown>>>,\n plugin,\n path,\n collection: collection as CollectionConfig | undefined\n };\n const enabled = plugin.fieldBuilder.enabled?.(params);\n if (enabled === undefined || enabled)\n Wrapper = (plugin.fieldBuilder.wrap(params) as unknown as ComponentType<FieldProps<Property, unknown, M>> | null) ?? Wrapper;\n }\n if (!fieldId) {\n console.warn(\"INTERNAL: Field id not found for property\", property);\n }\n });\n }\n return Wrapper;\n })());\n\n return wrapperRef.current;\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { useFormex } from \"@rebasepro/forms\";\n\nexport const ErrorFocus = ({ containerRef }:\n {\n containerRef?: React.RefObject<HTMLDivElement | null>\n }) => {\n const {\n isValidating,\n errors,\n version\n } = useFormex();\n\n const prevVersion = useRef(version);\n\n useEffect(() => {\n\n if (version === prevVersion.current) {\n return;\n }\n\n const keys = Object.keys(errors);\n\n // Whenever there are errors and the form has been submitted and is not validating\n if (!isValidating && keys.length > 0) {\n const errorElement = containerRef?.current?.querySelector<HTMLDivElement>(\n `#form_field_${keys[0]}`\n );\n\n if (errorElement) {\n errorElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\"\n });\n const input = errorElement.querySelector(\"input\");\n if (input) input.focus();\n }\n prevVersion.current = version;\n }\n }, [isValidating, errors, containerRef, version]);\n\n // This component does not render anything by itself.\n return null;\n};\n","\nimport { type CollectionConfig, getCollectionDataPath } from \"@rebasepro/types\";\nimport type { FormContext } from \"../types/fields\";\nimport type { EntityAction } from \"@rebasepro/types\";\nimport React from \"react\";\nimport { Entity } from \"@rebasepro/types\";\nimport type { EntityFormActionsProps } from \"../types/components/EntityFormActionsProps\";\nimport {\n AlertCircleIcon,\n Button,\n cls,\n defaultBorderMixin,\n DialogActions,\n IconButton,\n LoadingButton,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { FormexController } from \"@rebasepro/forms\";\n\nexport function EntityFormActions({\n path,\n collection,\n entity,\n layout,\n savingError,\n formex,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext\n}: EntityFormActionsProps) {\n\n const bottomActionsProps = {\n path,\n savingError,\n entity,\n collection,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n className: layout === \"responsive\" ? \"@6xl:hidden\" : undefined\n };\n\n const sideActionsProps = {\n path,\n savingError,\n entity,\n collection,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n className: layout === \"responsive\" ? \"hidden @6xl:flex\" : undefined\n };\n\n const bottomActions = buildBottomActions(bottomActionsProps);\n const sideActions = buildSideActions(sideActionsProps);\n\n if (layout === \"responsive\") {\n return <>\n {bottomActions}\n {sideActions}\n </>;\n }\n\n return layout === \"bottom\" ? bottomActions : sideActions;\n}\n\ntype ActionsViewProps<M extends Record<string, unknown>> = {\n path: string,\n savingError: Error | undefined,\n entity: Entity<M> | undefined,\n formActions?: EntityAction[],\n collection: CollectionConfig,\n disabled: boolean,\n status: \"new\" | \"existing\" | \"copy\",\n pluginActions?: React.ReactNode[],\n openEntityMode?: \"side_panel\" | \"full_screen\" | \"split\" | \"dialog\";\n navigateBack: () => void;\n formContext: FormContext,\n formex: FormexController<Record<string, unknown>>;\n className?: string;\n};\n\nfunction buildBottomActions<M extends Record<string, unknown>>({\n savingError,\n entity,\n path,\n formActions,\n collection,\n disabled,\n status,\n pluginActions,\n openEntityMode,\n navigateBack,\n formContext,\n formex,\n className\n}: ActionsViewProps<M>) {\n\n const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;\n\n return <DialogActions position={\"absolute\"} className={className}>\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>{savingError.message}</Typography>\n </div>\n }\n {entity && (formActions ?? []).length > 0 && <div className=\"grow flex overflow-auto no-scrollbar\">\n {(formActions ?? []).map(action => (\n <IconButton\n key={action.name}\n color=\"primary\"\n onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.stopPropagation();\n if (entity)\n action.onClick({\n view: \"form\",\n entity,\n path: path ?? getCollectionDataPath(collection),\n collection: collection,\n context: undefined,\n sidePanelController: undefined,\n openEntityMode: openEntityMode,\n navigateBack,\n formContext\n });\n }}>\n {action.icon}\n </IconButton>\n ))}\n </div>}\n {pluginActions}\n <Button variant=\"text\" disabled={disabled || formex.isSubmitting}\n color={\"primary\"}\n type=\"reset\">\n {status === \"existing\" ? \"Discard\" : \"Clear\"}\n </Button>\n <Tooltip title={hasErrors ? \"Fix highlighted errors before saving\" : undefined}>\n <LoadingButton variant={\"filled\"}\n color=\"primary\"\n type=\"submit\"\n loading={formex.isSubmitting}\n disabled={disabled || formex.isSubmitting}\n startIcon={hasErrors ? <AlertCircleIcon/> : undefined}>\n {status === \"existing\" && \"Save\"}\n {status === \"copy\" && \"Create copy\"}\n {status === \"new\" && \"Create\"}\n </LoadingButton>\n </Tooltip>\n\n </DialogActions>;\n}\n\nfunction buildSideActions<M extends Record<string, unknown>>({\n savingError,\n entity,\n formActions,\n path,\n openEntityMode,\n collection,\n disabled,\n status,\n pluginActions,\n formex,\n className\n}: ActionsViewProps<M>) {\n\n const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;\n\n return <div\n className={cls(\"overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l\", defaultBorderMixin, className)}>\n <Tooltip title={hasErrors ? \"Fix highlighted errors before saving\" : undefined}>\n <LoadingButton fullWidth={true}\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={formex.isSubmitting}\n startIcon={hasErrors ? <AlertCircleIcon/> : undefined}\n disabled={disabled || formex.isSubmitting}>\n {status === \"existing\" && \"Save\"}\n {status === \"copy\" && \"Create copy\"}\n {status === \"new\" && \"Create\"}\n </LoadingButton>\n </Tooltip>\n <Button fullWidth={true} variant=\"text\" disabled={disabled || formex.isSubmitting} type=\"reset\">\n {status === \"existing\" ? \"Discard\" : \"Clear\"}\n </Button>\n\n {pluginActions}\n\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>{savingError.message}</Typography>\n </div>\n }\n </div>;\n}\n","\nimport type { Properties } from \"@rebasepro/types\";\nimport React, { useState } from \"react\";\nimport {\n AlertTriangleIcon,\n Button,\n CheckIcon,\n ChevronDownIcon,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n EyeIcon,\n iconSize,\n Menu,\n MenuItem,\n Typography,\n XCircleIcon\n} from \"@rebasepro/ui\";\nimport { FormexController } from \"@rebasepro/forms\";\nimport { useSnackbarController, useTranslation } from \"@rebasepro/app\";\nimport { flattenKeys, removeEntityFromCache } from \"@rebasepro/app\";\n;\nimport { PropertyCollectionView } from \"../../components/PropertyCollectionView\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\ninterface LocalChangesMenuProps<M extends Record<string, unknown>> {\n cacheKey: string;\n cachedData: Partial<M>;\n formex: FormexController<M>;\n onClearLocalChanges?: () => void;\n properties: Properties;\n}\n\nexport function LocalChangesMenu<M extends Record<string, unknown>>({\n cachedData,\n formex,\n onClearLocalChanges,\n cacheKey,\n properties\n}: LocalChangesMenuProps<M>) {\n\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const [previewDialogOpen, setPreviewDialogOpen] = useState(false);\n const [open, setOpen] = useState(false);\n\n const handleOpenMenu = () => setOpen(true);\n const handleCloseMenu = () => setOpen(false);\n\n const handlePreview = () => {\n setPreviewDialogOpen(true);\n handleCloseMenu();\n };\n\n const handleApply = () => {\n const mergedValues = mergeDeep(formex.values, cachedData, true);\n const touched = { ...formex.touched };\n const cachedKeys = flattenKeys(cachedData);\n cachedKeys.forEach((key) => {\n touched[key] = true;\n });\n\n formex.setTouched(touched);\n formex.setValues(mergedValues);\n snackbarController.open({\n type: \"info\",\n message: t(\"local_changes_applied\")\n });\n handleCloseMenu();\n onClearLocalChanges?.();\n };\n\n const handleDiscard = () => {\n removeEntityFromCache(cacheKey);\n snackbarController.open({\n type: \"info\",\n message: t(\"local_changes_discarded\")\n });\n handleCloseMenu();\n onClearLocalChanges?.();\n };\n\n return (\n <>\n <Menu\n trigger={\n <Button\n size={\"small\"}\n className={\n \"font-semibold text-xs rounded-full px-4 py-1 bg-yellow-200 dark:bg-yellow-900 hover:bg-yellow-300 dark:hover:bg-yellow-800 text-yellow-800 dark:text-yellow-200\"\n }\n onClick={handleOpenMenu}\n >\n <AlertTriangleIcon size={iconSize.smallest} className={\"mr-1 text-yellow-600 dark:text-yellow-400\"}/>\n {t(\"unsaved_local_changes\")}\n <ChevronDownIcon size={iconSize.smallest}/>\n </Button>\n }\n open={open}\n onOpenChange={setOpen}\n >\n <div className={\"max-w-xs px-4 py-4 text-sm text-gray-700 dark:text-gray-300\"}>\n {t(\"unsaved_local_changes_description\")}\n </div>\n <MenuItem dense onClick={handlePreview}><EyeIcon size={iconSize.small}/>{t(\"preview_changes\")}</MenuItem>\n <MenuItem dense onClick={handleApply}><CheckIcon size={iconSize.small}/>{t(\"apply_changes\")}</MenuItem>\n <MenuItem dense onClick={handleDiscard}><XCircleIcon size={iconSize.small}/>{t(\"discard_local_changes\")}</MenuItem>\n </Menu>\n\n <Dialog\n open={previewDialogOpen}\n onOpenChange={setPreviewDialogOpen}\n maxWidth={\"4xl\"}\n >\n <DialogTitle variant={\"h6\"}>{t(\"preview_local_changes\")}</DialogTitle>\n <DialogContent className={\"my-4\"}>\n <Typography variant={\"body2\"} className={\"mb-4\"}>\n {t(\"preview_local_changes_description\")}\n </Typography>\n <div className={`border rounded-lg ${defaultBorderMixin}`} style={{\n maxHeight: 520,\n overflow: \"auto\"\n }}>\n <div className=\"p-4\">\n <PropertyCollectionView data={cachedData}\n properties={properties as Properties}/>\n </div>\n </div>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPreviewDialogOpen(false)}>{t(\"close\")}</Button>\n <Button\n variant={\"filled\"}\n onClick={() => {\n handleApply();\n setPreviewDialogOpen(false);\n }}\n >\n {t(\"apply_changes\")}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import type { CollectionConfig, PropertyConfig } from \"@rebasepro/types\";\nimport type { AuthController, Entity, EntityStatus, EntityValues } from \"@rebasepro/types\";\nimport { deepEqual as equal } from \"fast-equals\";\nimport { getIn, setIn } from \"@rebasepro/forms\";\nimport { getDefaultValuesFor } from \"@rebasepro/common\";\nimport { isObject, mergeDeep } from \"@rebasepro/utils\";\nimport { z } from \"zod\";\n\n// extract touched values for nested touched trees and map to current values\nexport function extractTouchedValues(values: unknown, touched: Record<string, boolean>): Record<string, unknown> {\n let acc: Record<string, unknown> = {};\n if (!touched || typeof touched !== \"object\") {\n return acc;\n }\n\n Object.entries(touched).forEach(([key, value]) => {\n if (value) {\n acc = setIn(acc, key, getIn(values, key)) as Record<string, unknown>;\n }\n })\n\n return acc;\n}\n\n/**\n * Recursively removes empty plain objects `{}` and empty arrays `[]` from a value tree.\n * This prevents ghost containers created by `setIn` intermediate path construction\n * (e.g. `{ address: {} }` when only `address.city` was touched but value is undefined)\n * from falsely triggering the unsaved local changes indicator.\n */\n/**\n * Check if a value is semantically empty (null, undefined, or empty string).\n */\nfunction isSemanticEmpty(v: unknown): boolean {\n return v === null || v === undefined || v === \"\";\n}\n\nexport function removeEmptyContainers(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n const cleaned = obj.map(removeEmptyContainers);\n // Keep arrays even if they contain only nulls/undefined — that's intentional data\n return cleaned;\n }\n if (obj && typeof obj === \"object\" && Object.getPrototypeOf(obj) === Object.prototype) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n const cleaned = removeEmptyContainers((obj as Record<string, unknown>)[key]);\n // Skip empty plain objects\n if (cleaned && typeof cleaned === \"object\" && !Array.isArray(cleaned)\n && Object.getPrototypeOf(cleaned) === Object.prototype\n && Object.keys(cleaned).length === 0) {\n continue;\n }\n result[key] = cleaned;\n }\n // After cleaning, check if all remaining values are semantically empty\n // (null, undefined, or \"\"). This catches ghost objects like {type: \"\", value: null}\n // created by oneOf block initialization that aren't meaningful changes.\n if (Object.keys(result).length > 0 && Object.values(result).every(isSemanticEmpty)) {\n return {};\n }\n return result;\n }\n return obj;\n}\n\nexport function getChanges<T extends object>(source: Partial<T>, comparison: Partial<T>): Partial<T> {\n const changes: Partial<T> = {};\n\n if (!source) {\n return {};\n }\n if (!comparison) {\n return source;\n }\n\n const allKeys = Array.from(new Set([...Object.keys(source), ...Object.keys(comparison)]));\n\n for (const key of allKeys) {\n const sourceValue = (source as Record<string, unknown>)[key];\n const comparisonValue = (comparison as Record<string, unknown>)[key];\n\n if (equal(sourceValue, comparisonValue)) {\n continue;\n }\n\n const sourceHasKey = source && typeof source === \"object\" && Object.prototype.hasOwnProperty.call(source, key);\n const comparisonHasKey = comparison && typeof comparison === \"object\" && Object.prototype.hasOwnProperty.call(comparison, key);\n\n if (comparisonHasKey && !sourceHasKey) {\n (changes as Record<string, unknown>)[key] = undefined;\n } else if (Array.isArray(sourceValue)) {\n const comparisonArray = Array.isArray(comparisonValue) ? comparisonValue : [];\n if (sourceValue.length !== comparisonArray.length) {\n (changes as Record<string, unknown>)[key] = sourceValue;\n continue;\n }\n const hasChanges = sourceValue.some((item, index) => !equal(item, comparisonArray[index]));\n if (hasChanges) {\n (changes as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue) && sourceValue && isObject(comparisonValue) && comparisonValue) {\n const nestedChanges = getChanges(sourceValue, comparisonValue);\n if (Object.keys(nestedChanges).length > 0) {\n (changes as Record<string, unknown>)[key] = nestedChanges;\n }\n } else {\n (changes as Record<string, unknown>)[key] = sourceValue;\n }\n }\n\n return changes;\n}\n\nexport function getInitialEntityValues<M extends Record<string, unknown>>(\n authController: AuthController,\n collection: CollectionConfig,\n path: string,\n status: \"new\" | \"existing\" | \"copy\",\n entity: Entity<M> | undefined,\n propertyConfigs?: Record<string, PropertyConfig>\n): Partial<EntityValues<M>> {\n const properties = collection.properties;\n if ((status === \"existing\" || status === \"copy\") && entity) {\n let values: Partial<EntityValues<M>>;\n if (!collection.alwaysApplyDefaultValues) {\n values = entity.values ?? getDefaultValuesFor(properties);\n } else {\n const defaultValues = getDefaultValuesFor(properties);\n values = mergeDeep(defaultValues, entity.values ?? {});\n }\n // When copying, clear ID fields so the database generates new IDs\n if (status === \"copy\") {\n const result = { ...values };\n for (const [key, property] of Object.entries(properties)) {\n if (property && \"isId\" in property && property.isId) {\n delete (result as Record<string, unknown>)[key];\n }\n }\n return result;\n }\n return values;\n } else if (status === \"new\") {\n return getDefaultValuesFor(properties);\n } else {\n console.error({\n status,\n entity\n });\n throw new Error(\"Form has not been initialised with the correct parameters\");\n }\n}\n\nexport function zodToFormErrors(zodError: z.ZodError): Record<string, string> {\n let errors: Record<string, string> = {};\n for (const issue of zodError.issues) {\n const path = issue.path.join(\".\");\n if (path && !getIn(errors, path)) {\n errors = setIn(errors, path, issue.message) as Record<string, string>;\n }\n }\n return errors;\n}\n","import type { CollectionConfig, EntityCustomViewParams, AdditionalFieldDelegateProps } from \"@rebasepro/types\";\nimport type { FormContext, PropertyFieldBindingProps } from \"../types/fields\";\nimport type { PropertyConfig } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Entity, EntityStatus, EntityValues } from \"@rebasepro/types\";\nimport type { EntityFormProps, OnUpdateParams } from \"../types/components/EntityFormProps\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nimport { ErrorBoundary } from \"@rebasepro/ui\";\nimport { AlignLeftIcon, CheckIcon, LoaderIcon, PencilIcon, useDebouncedCallback } from \"@rebasepro/ui\";\nimport { getDefaultValuesFor, isHidden, isReadOnly } from \"@rebasepro/common\";\n\nimport { useCustomizationController } from \"@rebasepro/app\";\nimport { getFormFieldKeys } from \"@rebasepro/app\";\nimport { Alert, Button, Chip, cls, Dialog, DialogActions, DialogContent, DialogTitle, iconSize, paperMixin, Tooltip, Typography } from \"@rebasepro/ui\";\nimport { Formex, FormexController, useCreateFormex } from \"@rebasepro/forms\";\n\nimport { FormEntry } from \"./components/FormEntry\";\nimport { FormLayout } from \"./components/FormLayout\";\nimport { LabelWithIconAndTooltip } from \"./components/LabelWithIconAndTooltip\";\nimport { PropertyFieldBinding } from \"./PropertyFieldBinding\";\nimport { flattenKeys } from \"@rebasepro/app\";\nimport { ErrorFocus } from \"./components/ErrorFocus\";\nimport { CustomFieldValidator, getEntitySchema } from \"./validation\";\nimport { EntityFormActions } from \"./EntityFormActions\";\nimport type { EntityFormActionsProps } from \"../types/components/EntityFormActionsProps\";\nimport { LocalChangesMenu } from \"./components/LocalChangesMenu\";\n\nimport { getEntityTitlePropertyKey, resolveTitleToString } from \"../util/previews\";\nimport { getValueInPath, mergeDeep } from \"@rebasepro/utils\";\nimport {\n getChanges,\n zodToFormErrors\n} from \"./form_utils\";\n\n/**\n * Headless entity form component.\n *\n * Renders a form for a entity collection without any CMS or backend dependencies.\n * All backend concerns (save, caching, analytics, plugin slots) are provided via\n * callback props. For CMS-connected usage, use {@link EntityFormBinding} instead.\n *\n * @group Components\n */\nexport function EntityForm<M extends Record<string, unknown>>({\n path,\n entityId: entityIdProp,\n collection,\n onValuesModified,\n onIdChange,\n onSaved,\n entity,\n initialDirtyValues,\n onFormContextReady,\n forceActionsAtTheBottom,\n initialStatus,\n className,\n onStatusChange,\n onEntityChange,\n openEntityMode = \"full_screen\",\n formex: formexProp,\n disabled: disabledProp,\n Builder,\n EntityFormActionsComponent = EntityFormActions,\n showDefaultActions = true,\n showEntityPath = true,\n navigateBack: navigateBackProp,\n children,\n // Headless callback props\n onSubmit: onSubmitProp,\n onValuesChangeDeferred: onValuesChangeDeferredProp,\n onReset: onResetProp,\n uniqueFieldValidator: uniqueFieldValidatorProp,\n // Slots\n beforeFields,\n afterFields,\n pluginActions: pluginActionsProp,\n // Local changes (managed externally)\n computedInitialValues,\n hasLocalChanges: hasLocalChangesProp,\n localChangesData,\n manualApplyLocalChanges,\n localChangesCacheKey,\n onClearLocalChanges\n}: EntityFormProps<M>) {\n\n const customizationController = useCustomizationController();\n\n const navigateBack = useCallback(() => {\n if (navigateBackProp) {\n navigateBackProp();\n }\n }, [navigateBackProp]);\n\n const [status, setStatus] = useState<EntityStatus>(initialStatus);\n\n const updateStatus = (status: EntityStatus) => {\n setStatus(status);\n onStatusChange?.(status);\n };\n\n const [valuesToBeSaved, setValuesToBeSaved] = useState<EntityValues<M> | undefined>(undefined);\n useDebouncedCallback(valuesToBeSaved, () => {\n if (valuesToBeSaved && onSubmitProp) {\n setIsSavingAutoSave(true);\n Promise.resolve(onSubmitProp(valuesToBeSaved, formex))\n .finally(() => setIsSavingAutoSave(false));\n }\n }, false, 2000);\n\n const [underlyingChanges] = useState<Partial<EntityValues<M>>>({});\n\n const initialEntityId: string | number | undefined = useMemo(() => {\n if (status === \"new\" || status === \"copy\") {\n return undefined;\n } else {\n return entityIdProp;\n }\n }, [entityIdProp, status]);\n\n const [entityId, setEntityId] = useState<string | number | undefined>(initialEntityId);\n const [entityIdError, setEntityIdError] = useState<boolean>(false);\n const [savingError, setSavingError] = useState<Error | undefined>();\n const [isSavingAutoSave, setIsSavingAutoSave] = useState<boolean>(false);\n const [discardDialogOpen, setDiscardDialogOpen] = useState<boolean>(false);\n\n const autoSave = collection.formAutoSave;\n\n // Use externally computed initial values if provided, otherwise compute from entity + collection\n const baseInitialValues = useMemo(() => {\n if (computedInitialValues !== undefined) {\n return computedInitialValues;\n }\n // Fallback: compute from entity/collection (requires authController from context)\n // In headless mode without computedInitialValues, use entity values or defaults\n if ((status === \"existing\" || status === \"copy\") && entity) {\n return entity.values ?? getDefaultValuesFor(collection.properties);\n }\n return getDefaultValuesFor(collection.properties);\n }, [computedInitialValues, collection.properties, status, entity]);\n\n const [localChangesCleared, setLocalChangesCleared] = useState<boolean>(false);\n\n const hasLocalChanges = hasLocalChangesProp !== undefined\n ? (hasLocalChangesProp && !localChangesCleared)\n : false;\n\n const onSubmit = (values: EntityValues<M>, formexController: FormexController<EntityValues<M>>) => {\n\n setSavingError(undefined);\n setEntityIdError(false);\n\n if (status === \"existing\") {\n if (!entity?.id) throw Error(\"Form misconfiguration when saving, no id for existing entity\");\n } else if (status !== \"new\" && status !== \"copy\") {\n throw Error(\"New FormType added, check EntityForm\");\n }\n\n if (!onSubmitProp) {\n console.warn(\"EntityForm: no onSubmit callback provided. Form submission has no effect.\");\n formexController.setSubmitting(false);\n return;\n }\n\n return Promise.resolve(save(values))\n ?.then((savedEntity) => {\n if (savedEntity) {\n formexController.resetForm({\n values: savedEntity.values || values,\n submitCount: 0,\n touched: {}\n });\n }\n })\n .finally(() => {\n formexController.setSubmitting(false);\n });\n };\n\n const [initialValues, initialDirty] = useMemo(() => {\n const initialValues = initialDirtyValues ? mergeDeep(baseInitialValues, initialDirtyValues) : baseInitialValues;\n const initialDirty = Boolean(initialDirtyValues) && initialDirtyValues && Object.keys(initialDirtyValues).length > 0;\n return [initialValues, initialDirty];\n }, [baseInitialValues, initialDirtyValues]);\n\n const internalFormex = useCreateFormex<M>({\n initialValues: initialValues as M,\n initialDirty,\n debugId: `EntityForm:${path}/${entityIdProp}`,\n initialTouched: initialDirtyValues ?\n flattenKeys(initialDirtyValues!)\n .reduce((previousValue, currentValue) => ({\n ...previousValue,\n [currentValue]: true\n }), {})\n : {},\n onSubmit,\n onReset: () => {\n onResetProp?.();\n onValuesModified?.(false, initialValues as M);\n },\n onValuesChangeDeferred: onValuesChangeDeferredProp,\n validation: async (values): Promise<Record<string, string>> => {\n if (!validationSchema) return {};\n const result = await validationSchema.safeParseAsync(values);\n if (result.success) return {};\n return zodToFormErrors(result.error);\n }\n });\n const formex: FormexController<M> = formexProp ?? internalFormex;\n\n useEffect(() => {\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isUndo = (e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === \"z\";\n const isRedo =\n ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === \"z\") ||\n ((e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === \"y\");\n const isSave = (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === \"s\";\n\n if (isSave && !disabled && formex.dirty) {\n e.preventDefault();\n formex.handleSubmit();\n } else if (isUndo && formex.canUndo) {\n e.preventDefault();\n formex.undo();\n } else if (isRedo && formex.canRedo) {\n e.preventDefault();\n formex.redo();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n\n }, [formex]);\n\n const afterSave = (updatedEntity: Entity<M>) => {\n onResetProp?.();\n onValuesModified?.(false, updatedEntity.values);\n onEntityChange?.(updatedEntity);\n updateStatus(\"existing\");\n setEntityId(updatedEntity.id);\n\n if (onSaved) {\n onSaved({\n entity: updatedEntity,\n status,\n path,\n entityId: updatedEntity.id,\n collection\n });\n }\n };\n\n const lastSavedValues = useRef<EntityValues<M> | undefined>(entity?.values);\n const save = async (values: EntityValues<M>): Promise<Entity<M> | void> => {\n const valuesToSave = status === \"existing\"\n ? getChanges(values, entity?.values || {}) as EntityValues<M>\n : values;\n\n if (status === \"existing\" && Object.keys(valuesToSave).length === 0 && entity) {\n return Promise.resolve(entity);\n }\n\n lastSavedValues.current = values;\n\n if (!onSubmitProp) {\n return;\n }\n\n const autoSaveEnabled = autoSave ?? false;\n\n if (autoSaveEnabled) {\n setValuesToBeSaved(values);\n return Promise.resolve();\n }\n\n return Promise.resolve(onSubmitProp(valuesToSave as M, formex))\n .then((result) => {\n if (result) {\n afterSave(result as Entity<M>);\n }\n return result as Entity<M> | void;\n })\n .catch(e => {\n console.error(e);\n setSavingError(e);\n });\n };\n\n const disabled = formex.isSubmitting || Boolean(disabledProp);\n\n const formContext: FormContext<M> = {\n setFieldValue: useCallback((key: string, value: unknown) => formex.setFieldValue(key, value), []),\n values: formex.values,\n collection,\n entityId: entityId as string,\n path,\n save,\n submit: formex.handleSubmit,\n formex,\n entity,\n savingError,\n status,\n openEntityMode,\n disabled\n };\n\n useEffect(() => {\n onFormContextReady?.(formContext);\n }, [formex.version, collection, entityId, path]);\n\n const actionsDisabled = disabled || formex.isSubmitting || (status === \"existing\" && !formex.dirty) || Boolean(disabledProp);\n\n const titlePropertyKey = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);\n const rawTitle = formex.values && titlePropertyKey ? getValueInPath(formex.values, titlePropertyKey) : undefined;\n const title = rawTitle !== undefined && rawTitle !== null\n ? resolveTitleToString(rawTitle)\n : (collection.singularName ?? collection.name);\n\n const modified = formex.dirty;\n\n useEffect(() => {\n if (!autoSave) {\n onValuesModified?.(modified, formex.values);\n }\n }, [formex.dirty]);\n\n // Default no-op unique field validator — always passes\n const defaultUniqueFieldValidator: CustomFieldValidator = useCallback(async () => true, []);\n\n const uniqueFieldValidator: CustomFieldValidator = useMemo(() => {\n if (uniqueFieldValidatorProp) {\n return uniqueFieldValidatorProp as CustomFieldValidator;\n }\n return defaultUniqueFieldValidator;\n }, [uniqueFieldValidatorProp, defaultUniqueFieldValidator]);\n\n const validationSchema = useMemo(() => getEntitySchema(\n entityId,\n collection.properties,\n uniqueFieldValidator),\n [entityId, collection.properties, uniqueFieldValidator]);\n\n useOnAutoSave(autoSave, formex, lastSavedValues, save);\n\n useEffect(() => {\n if (!autoSave && !formex.isSubmitting && underlyingChanges && entity) {\n // we update the form fields from the driver data\n // if they were not touched\n Object.entries(underlyingChanges).forEach(([key, value]) => {\n const formValue = formex.values[key];\n if (!equal(value, formValue) && !formex.touched[key]) {\n console.debug(\"Updated value from the driver:\", key, value);\n formex.setFieldValue(key, value !== undefined ? value : null);\n }\n });\n }\n }, [formex.isSubmitting, autoSave, underlyingChanges, entity, formex.values, formex.touched, formex.setFieldValue]);\n\n const formFieldKeys = getFormFieldKeys(collection);\n\n const formFields = () => {\n\n if (Builder) {\n return <Builder\n collection={collection}\n entity={entity}\n modifiedValues={formex.values}\n formContext={formContext}\n />;\n }\n const isNewEntity = status === \"new\" || status === \"copy\";\n let firstFocusableIndex = -1;\n\n return (\n <FormLayout>\n {formFieldKeys.map((key) => {\n const property = collection.properties?.[key];\n if (property) {\n\n const underlyingValueHasChanged: boolean =\n !!underlyingChanges &&\n Object.keys(underlyingChanges).includes(key) &&\n formex.touched[key];\n const isNew = status === \"new\" || status === \"copy\";\n const isStringOrNumber = property.type === \"string\" || property.type === \"number\";\n const isIdAndAuto = isStringOrNumber && \"isId\" in property && typeof property.isId === \"string\" && property.isId !== \"manual\";\n const disabled = disabledProp || (!autoSave && formex.isSubmitting) || isReadOnly(property) || Boolean(property.ui?.disabled) || (!isNew && \"isId\" in property && Boolean(property.isId)) || (isNew && isIdAndAuto);\n const hidden = isHidden(property);\n if (hidden) return null;\n const widthPercentage = property.ui?.widthPercentage ?? 100;\n\n const shouldAutoFocus = isNewEntity && !disabled && firstFocusableIndex === -1;\n if (shouldAutoFocus) firstFocusableIndex = 0;\n\n const cmsFormFieldProps: PropertyFieldBindingProps<M> = {\n propertyKey: key,\n disabled,\n property,\n includeDescription: Boolean(property.description),\n underlyingValueHasChanged: underlyingValueHasChanged && !autoSave,\n context: formContext,\n partOfArray: false,\n minimalistView: false,\n autoFocus: shouldAutoFocus\n };\n\n return (\n <FormEntry propertyKey={key}\n widthPercentage={widthPercentage}\n key={`field_${key}`}>\n <PropertyFieldBinding {...cmsFormFieldProps}/>\n </FormEntry>\n );\n }\n\n const additionalField = collection.additionalFields?.find(f => f.key === key);\n if (additionalField && entity) {\n const AdditionalFieldBuilder = additionalField.Builder;\n if (!AdditionalFieldBuilder && !additionalField.value) {\n throw new Error(\"When using additional fields you need to provide a Builder or a value\");\n }\n const additionalFieldContext = formContext as unknown as AdditionalFieldDelegateProps['context'];\n const child = AdditionalFieldBuilder\n ? <AdditionalFieldBuilder entity={entity} context={additionalFieldContext}/>\n : <div className={\"w-full\"}>\n {additionalField.value?.({\n entity,\n context: additionalFieldContext\n })?.toString()}\n </div>;\n\n return (\n <div key={`additional_${key}`} className={\"w-full\"}>\n <LabelWithIconAndTooltip\n propertyKey={key}\n icon={<AlignLeftIcon size={iconSize.small}/>}\n title={additionalField.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n <div\n className={cls(paperMixin, \"w-full min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar\")}>\n <ErrorBoundary>\n {child}\n </ErrorBoundary>\n </div>\n </div>\n );\n }\n\n console.warn(`Property ${key} not found in collection ${collection.name} in properties or additional fields. Skipping.`);\n return null;\n }).filter(Boolean)}\n </FormLayout>\n );\n };\n\n const formRef = useRef<HTMLDivElement>(null);\n\n const hasFormErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;\n\n const formView = <ErrorBoundary>\n <>\n {beforeFields}\n\n {!Builder && <div className={\"w-full flex flex-col items-start my-4 lg:my-6\"}>\n <Typography\n className={\"my-4 grow line-clamp-1 \" + (collection.hideIdFromForm ? \"mb-6\" : \"\")}\n variant={\"h4\"}>\n {title ?? collection.singularName ?? collection.name}\n </Typography>\n\n {!entity?.values && initialStatus === \"existing\" &&\n <Alert color={\"warning\"} size={\"small\"} outerClassName={\"w-full mb-4 text-xs\"}>\n This entity does not exist yet\n </Alert>}\n\n {showEntityPath && <Alert color={\"base\"} outerClassName={\"w-full\"} size={\"small\"}>\n <code\n className={\"text-xs select-all text-text-secondary dark:text-text-secondary-dark\"}>\n {entity?.path ?? path}/{entityId}\n </code>\n </Alert>}\n </div>}\n\n {children}\n\n {initialEntityId && !entity && initialStatus !== \"new\" && <Alert color={\"info\"} size={\"small\"}>\n This entity does not exist yet\n </Alert>}\n\n {hasFormErrors && <Alert color={\"error\"} size={\"small\"} outerClassName={\"w-full mt-2\"}>\n Please fix the highlighted errors before saving.\n </Alert>}\n\n {formContext && <>\n <div className=\"mt-12 flex flex-col gap-8\" ref={formRef}>\n {formFields()}\n <ErrorFocus containerRef={formRef}/>\n </div>\n </>}\n\n {afterFields}\n\n {forceActionsAtTheBottom && <div className=\"h-16\"/>}\n\n <Dialog open={discardDialogOpen} onOpenChange={setDiscardDialogOpen} maxWidth={\"sm\"}>\n <DialogTitle>{status === \"existing\" ? \"Discard changes?\" : \"Clear form?\"}</DialogTitle>\n <DialogContent>\n <Typography>\n {status === \"existing\"\n ? \"All unsaved changes will be lost. This cannot be undone.\"\n : \"All entered values will be cleared. This cannot be undone.\"}\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button variant={\"text\"} onClick={() => setDiscardDialogOpen(false)}>\n Cancel\n </Button>\n <Button variant={\"filled\"} color={\"error\"} onClick={() => {\n setDiscardDialogOpen(false);\n formex.resetForm({ values: baseInitialValues as M });\n }}>\n {status === \"existing\" ? \"Discard\" : \"Clear\"}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n </ErrorBoundary>;\n\n useEffect(() => {\n if (entityId && onIdChange)\n onIdChange(entityId);\n }, [entityId, onIdChange]);\n\n if (!collection || !path) {\n throw Error(\"INTERNAL: Collection and path must be defined in form context\");\n }\n\n const EntityFormActionsRender = EntityFormActionsComponent as React.FC<EntityFormActionsProps>;\n\n const dialogActions = <EntityFormActionsRender\n collection={collection}\n path={path}\n entity={entity}\n layout={forceActionsAtTheBottom ? \"bottom\" : \"responsive\"}\n savingError={savingError}\n formex={formex as FormexController<Record<string, unknown>>}\n disabled={actionsDisabled}\n status={status}\n pluginActions={pluginActionsProp ?? []}\n openEntityMode={openEntityMode}\n showDefaultActions={showDefaultActions}\n navigateBack={navigateBack}\n formContext={formContext as FormContext<Record<string, unknown>>}\n />;\n\n return (\n <Formex value={formex}>\n <form\n onSubmit={formex.handleSubmit}\n onReset={(e) => {\n e.preventDefault();\n if (formex.dirty) {\n setDiscardDialogOpen(true);\n } else {\n formex.resetForm({ values: baseInitialValues as M });\n }\n }}\n noValidate\n className={cls(\"@container flex-1 flex flex-row w-full overflow-y-auto justify-center\", className)}>\n <div\n id={`form_${path}`}\n className={cls(\"relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit\")}>\n\n <div className={cls(\n \"flex flex-col w-full\",\n openEntityMode === \"dialog\"\n ? \"pt-4 pb-12 px-6 sm:px-8\"\n : \"pt-12 pb-16 px-4 sm:px-8 md:px-10\"\n )}>\n <div\n className={\"flex flex-row gap-4 justify-end h-0 overflow-visible sticky top-4 z-10\"}>\n\n {manualApplyLocalChanges && hasLocalChanges && localChangesCacheKey &&\n <LocalChangesMenu<M>\n cacheKey={localChangesCacheKey}\n properties={collection.properties}\n cachedData={localChangesData as Partial<M>}\n formex={formex}\n onClearLocalChanges={() => {\n setLocalChangesCleared(true);\n onClearLocalChanges?.();\n }}\n />}\n\n {isSavingAutoSave\n ? <Tooltip title={\"Saving…\"}>\n <Chip size={\"small\"} className={\"py-1\"} colorScheme={\"blueDarker\"}>\n <LoaderIcon size={iconSize.smallest} className={\"animate-spin\"}/>\n </Chip>\n </Tooltip>\n : formex.dirty\n ? <Tooltip title={\"Form has been modified\"}>\n <Chip size={\"small\"} className={\"py-1\"} colorScheme={\"orangeDarker\"}>\n <PencilIcon size={iconSize.smallest}/>\n </Chip>\n </Tooltip>\n : <Tooltip title={\"Form is in sync\"}>\n <Chip size={\"small\"} className={\"py-1\"}>\n <CheckIcon size={iconSize.smallest}/>\n </Chip>\n </Tooltip>}\n </div>\n\n {formView}\n\n </div>\n\n </div>\n\n {dialogActions}\n\n </form>\n\n </Formex>\n );\n}\n\nfunction useOnAutoSave<M extends Record<string, unknown>>(autoSave: undefined | boolean, formex: FormexController<M>, lastSavedValues: React.MutableRefObject<EntityValues<M> | undefined>, save: (values: EntityValues<M>) => Promise<Entity<M> | void>) {\n useEffect(() => {\n if (!autoSave) return;\n if (formex.values && !equal(formex.values, lastSavedValues.current)) {\n save(formex.values);\n }\n }, [autoSave, formex.values]);\n}\n","import type { CollectionConfig, PluginFormActionProps } from \"@rebasepro/types\";\nimport type { FormContext } from \"../types/fields\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { AnalyticsEvent, Entity, EntityStatus, EntityValues } from \"@rebasepro/types\";\nimport type { EntityFormProps, OnUpdateParams } from \"../types/components/EntityFormProps\";\nimport type { EntityFormActionsProps } from \"../types/components/EntityFormActionsProps\";\n\nimport { getLocalChangesBackup } from \"@rebasepro/common\";\n\nimport {\n saveEntityWithCallbacks,\n useAuthController,\n useCustomizationController,\n useData,\n useSnackbarController,\n useTranslation,\n useSlot\n} from \"@rebasepro/app\";\nimport { FormexController } from \"@rebasepro/forms\";\nimport { useAnalyticsController } from \"@rebasepro/app\";\n\nimport {\n getEntityFromCache,\n removeEntityFromCache,\n removeEntityFromMemoryCache,\n saveEntityToCache\n} from \"@rebasepro/app\";\n\nimport { useCollectionRegistryController } from \"../hooks/navigation/contexts/CollectionRegistryContext\";\nimport { useSidePanel } from \"../hooks/useSidePanel\";\nimport { useCMSContext } from \"../hooks/useCMSContext\";\nimport { EntityForm } from \"./EntityForm\";\nimport {\n extractTouchedValues,\n removeEmptyContainers,\n getChanges,\n getInitialEntityValues,\n} from \"./form_utils\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\n/**\n * Props for the CMS-connected EntityFormBinding wrapper.\n * Extends EntityFormProps — you can pass all the same props as EntityForm,\n * but the binding provides CMS context (save, caching, analytics, plugin slots)\n * automatically.\n */\nexport type EntityFormBindingProps<M extends Record<string, unknown>> = Omit<EntityFormProps<M>,\n | \"onSubmit\"\n | \"onValuesChangeDeferred\"\n | \"onReset\"\n | \"uniqueFieldValidator\"\n | \"beforeFields\"\n | \"afterFields\"\n | \"pluginActions\"\n | \"computedInitialValues\"\n | \"hasLocalChanges\"\n | \"localChangesData\"\n | \"manualApplyLocalChanges\"\n | \"localChangesCacheKey\"\n | \"onClearLocalChanges\"\n>;\n\n/**\n * CMS-connected wrapper around EntityForm.\n *\n * Provides all backend concerns that the headless EntityForm delegates via callbacks:\n * - Save via the data layer (`saveEntityWithCallbacks`)\n * - Unique field validation via the data layer\n * - Entity caching (local changes backup/restore)\n * - Plugin slots (form.before, form.after, form.actions)\n * - Snackbar notifications on save success/error\n * - Analytics events\n * - Navigation via side entity controller\n *\n * Use this component inside the CMS (`<RebaseShell>`).\n * For headless usage outside the CMS, use `EntityForm` directly.\n *\n * @group Components\n */\nexport function EntityFormBinding<M extends Record<string, unknown>>({\n path,\n entityId: entityIdProp,\n collection,\n entity,\n initialStatus,\n onSaved,\n onValuesModified,\n onEntityChange,\n onStatusChange,\n openEntityMode = \"full_screen\",\n navigateBack: navigateBackProp,\n initialDirtyValues,\n ...restProps\n}: EntityFormBindingProps<M>) {\n\n const { t } = useTranslation();\n const sidePanelController = useSidePanel();\n const collectionRegistryController = useCollectionRegistryController();\n const authController = useAuthController();\n const dataClient = useData();\n const snackbarController = useSnackbarController();\n const customizationController = useCustomizationController();\n const context = useCMSContext();\n const analyticsController = useAnalyticsController();\n\n const [status, setStatus] = useState<EntityStatus>(initialStatus);\n const [entityId, setEntityId] = useState<string | number | undefined>(() => {\n if (status === \"new\" || status === \"copy\") return undefined;\n return entityIdProp;\n });\n\n // --- Compute initial values with local changes ---\n const baseInitialValues = useMemo(\n () => getInitialEntityValues(authController, collection, path, status, entity, customizationController.propertyConfigs),\n [authController, collection, path, status, entity, customizationController.propertyConfigs]\n );\n\n const localChangesBackup = getLocalChangesBackup(collection);\n const autoApplyLocalChanges = localChangesBackup === \"auto_apply\";\n const manualApplyLocalChanges = localChangesBackup === \"manual_apply\";\n\n const localChangesDataRaw = useMemo(() => entityId\n ? getEntityFromCache(path + \"/\" + entityId)\n : getEntityFromCache(path + \"#new\"), [entityId, path]);\n\n const [localChangesCleared, setLocalChangesCleared] = useState<boolean>(false);\n\n const computedInitialValues = useMemo(() => {\n const withLocalChanges = autoApplyLocalChanges && localChangesDataRaw\n ? mergeDeep(baseInitialValues, localChangesDataRaw as Partial<M>)\n : baseInitialValues;\n return initialDirtyValues ? mergeDeep(withLocalChanges, initialDirtyValues) : withLocalChanges;\n }, [autoApplyLocalChanges, localChangesDataRaw, baseInitialValues, initialDirtyValues]);\n\n const localChangesData = useMemo(() => {\n if (!localChangesDataRaw) return undefined;\n const changes = getChanges(localChangesDataRaw, computedInitialValues);\n const cleaned = removeEmptyContainers(changes);\n if (cleaned && typeof cleaned === \"object\" && Object.keys(cleaned).length === 0) {\n return undefined;\n }\n return cleaned;\n }, [localChangesDataRaw, computedInitialValues]);\n\n const hasLocalChanges = !localChangesCleared && !!localChangesData && Object.keys(localChangesData as object).length > 0;\n\n const localChangesCacheKey = useMemo(() => {\n return (status === \"new\" || status === \"copy\") ? path + \"#new\" : path + \"/\" + entityId;\n }, [status, path, entityId]);\n\n // --- Navigate back ---\n const navigateBack = useCallback(() => {\n if (navigateBackProp) {\n navigateBackProp();\n return;\n }\n if (openEntityMode === \"side_panel\" || openEntityMode === \"dialog\") {\n sidePanelController.close();\n } else {\n window.history.back();\n }\n }, [navigateBackProp, openEntityMode, sidePanelController]);\n\n // --- Cache operations ---\n const clearDirtyCache = useCallback(() => {\n if (status === \"new\" || status === \"copy\") {\n removeEntityFromMemoryCache(path + \"#new\");\n removeEntityFromCache(path + \"#new\");\n } else {\n removeEntityFromMemoryCache(path + \"/\" + entityId);\n removeEntityFromCache(path + \"/\" + entityId);\n }\n }, [status, path, entityId]);\n\n const onReset = useCallback(() => {\n clearDirtyCache();\n }, [clearDirtyCache]);\n\n const onValuesChangeDeferred = useCallback((values: M, controller: FormexController<M>) => {\n const key = (status === \"new\" || status === \"copy\") ? path + \"#new\" : path + \"/\" + entityId;\n if (controller.dirty) {\n const touchedValues = removeEmptyContainers(extractTouchedValues(values, controller.touched));\n if (touchedValues && Object.keys(touchedValues).length > 0) {\n saveEntityToCache(key, touchedValues);\n } else {\n removeEntityFromCache(key);\n }\n }\n }, [status, path, entityId]);\n\n // --- Save via data layer ---\n const onSubmit = useCallback(async (values: M, formex: FormexController<M>): Promise<Entity<M> | void> => {\n try {\n const savedEntity = await saveEntityWithCallbacks<M>({\n path,\n entityId,\n values,\n previousValues: entity?.values,\n collection,\n status,\n data: dataClient,\n context,\n afterSave: (updatedEntity: Entity<M>) => {\n clearDirtyCache();\n onValuesModified?.(false, updatedEntity.values);\n onEntityChange?.(updatedEntity);\n setStatus(\"existing\");\n setEntityId(updatedEntity.id);\n onStatusChange?.(\"existing\");\n\n if (onSaved) {\n onSaved({\n entity: updatedEntity,\n status,\n path,\n entityId: updatedEntity.id,\n collection\n });\n }\n },\n afterSaveError: (e: Error) => {\n snackbarController.open({\n type: \"error\",\n title: t(\"error_saving_entity\"),\n message: e?.message\n });\n console.error(\"Error saving entity\", path, entityId, e);\n }\n });\n\n const autoSave = collection.formAutoSave;\n if (!autoSave) {\n snackbarController.open({\n type: \"success\",\n message: `${collection.singularName ?? collection.name}: ${t(\"saved_correctly\")}`\n });\n }\n\n const eventName: AnalyticsEvent = status === \"new\"\n ? \"new_entity_saved\"\n : (status === \"copy\" ? \"entity_copied\" : (status === \"existing\" ? \"entity_edited\" : \"unmapped_event\"));\n analyticsController.onAnalyticsEvent?.(eventName, { path });\n\n return savedEntity;\n } catch (e: unknown) {\n console.error(e);\n throw e;\n }\n }, [path, entityId, entity, collection, status, dataClient, context, clearDirtyCache, onValuesModified, onEntityChange, onSaved, onStatusChange, snackbarController, analyticsController, t]);\n\n // --- Unique field validation via data layer ---\n const uniqueFieldValidator = useCallback(async ({\n name,\n value\n }: { name: string; value: unknown }) => {\n try {\n const accessor = dataClient.collection(path);\n const { data } = await accessor.find({\n where: { [name]: [\"==\", value] },\n limit: 2\n });\n const otherEntities = entityId ? data.filter(e => e.id !== entityId) : data;\n return otherEntities.length === 0;\n } catch (e: unknown) {\n console.error(\"Error checking unique field\", e);\n return true;\n }\n }, [dataClient, path, entityId]);\n\n // --- Plugin slots ---\n const parentCollectionSlugs = collectionRegistryController.getParentCollectionSlugs(path);\n const parentEntityIds = collectionRegistryController.getParentEntityIds(path);\n\n // Build a minimal formContext for plugin slot props — the full one is built inside EntityForm\n const formActionProps: PluginFormActionProps = useMemo(() => ({\n entityId,\n parentCollectionSlugs,\n parentEntityIds,\n path,\n status,\n collection: collection as CollectionConfig,\n context,\n formContext: undefined as unknown as FormContext<Record<string, unknown>>,\n openEntityMode,\n disabled: false\n }), [entityId, parentCollectionSlugs, parentEntityIds, path, status, collection, context, openEntityMode]);\n\n const pluginFormActions = useSlot(\"form.actions\", formActionProps);\n const pluginFormBefore = useSlot(\"form.before\", formActionProps);\n const pluginFormAfter = useSlot(\"form.after\", formActionProps);\n\n return (\n <EntityForm<M>\n {...restProps}\n path={path}\n entityId={entityIdProp}\n collection={collection}\n entity={entity}\n initialStatus={initialStatus}\n initialDirtyValues={initialDirtyValues}\n onSaved={onSaved}\n onValuesModified={onValuesModified}\n onEntityChange={onEntityChange}\n onStatusChange={onStatusChange}\n openEntityMode={openEntityMode}\n navigateBack={navigateBack}\n // Headless callbacks\n onSubmit={onSubmit}\n onValuesChangeDeferred={onValuesChangeDeferred}\n onReset={onReset}\n uniqueFieldValidator={uniqueFieldValidator}\n // Slots\n beforeFields={pluginFormBefore}\n afterFields={pluginFormAfter}\n pluginActions={pluginFormActions ?? []}\n // Local changes\n computedInitialValues={computedInitialValues as Partial<M>}\n hasLocalChanges={hasLocalChanges}\n localChangesData={localChangesData as Partial<M>}\n manualApplyLocalChanges={manualApplyLocalChanges}\n localChangesCacheKey={localChangesCacheKey}\n onClearLocalChanges={() => setLocalChangesCleared(true)}\n />\n );\n}\n","import { useContext } from \"react\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { ConfigControllerContext } from \"./ConfigControllerProvider\";\n\n/**\n * Use this hook to access the configuration controller.\n * You can use it to get the list of collections, and to save/delete collections.\n */\nexport const useCollectionsConfigController = (): CollectionsConfigController => useContext(ConfigControllerContext);\n","/**\n * Conversion utilities between the full Rebase types and their\n * JSON-serializable counterparts.\n *\n * - `toSerializableCollectionConfig` / `toSerializableProperty` — strip non-serializable fields\n * - `fromSerializableCollectionConfig` / `fromSerializableProperty` — reconstruct original types\n *\n * @module\n */\n\nimport type {\n ArrayProperty,\n BaseUIConfig,\n BinaryProperty,\n BooleanProperty,\n DateProperty,\n CollectionConfig,\n GeopointProperty,\n MapProperty,\n NumberProperty,\n Properties,\n Property,\n ReferenceProperty,\n RelationProperty,\n StorageConfig,\n StringProperty,\n VectorProperty,\n} from \"@rebasepro/types\";\n\nimport type {\n SerializableArrayProperty,\n SerializableBaseProperty,\n SerializableBaseUIConfig,\n SerializableBinaryProperty,\n SerializableBooleanProperty,\n SerializableCollectionConfig,\n SerializableDateProperty,\n SerializableDateValidation,\n SerializableGeopointProperty,\n SerializableMapProperty,\n SerializableNumberProperty,\n SerializableProperties,\n SerializableProperty,\n SerializableReferenceProperty,\n SerializableRelationProperty,\n SerializableStorageConfig,\n SerializableStringProperty,\n SerializableStringValidation,\n SerializableVectorProperty,\n} from \"./serializable_types\";\n\n// ═══════════════════════════════════════════════════════════════════════\n// PROPERTY CONVERSION: Original → Serializable\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Strip non-serializable fields from a `BaseUIConfig`.\n * Removes `Field` and `Preview` (ComponentRef).\n */\nfunction toSerializableUIConfig(ui: BaseUIConfig | undefined): SerializableBaseUIConfig | undefined {\n if (!ui) return undefined;\n const { Field, Preview, ...rest } = ui as BaseUIConfig & Record<string, unknown>;\n // Only return if there are remaining fields\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rest)) {\n if (key !== \"Field\" && key !== \"Preview\" && value !== undefined) {\n result[key] = value;\n }\n }\n return Object.keys(result).length > 0 ? result as SerializableBaseUIConfig : undefined;\n}\n\n/**\n * Convert a `StorageConfig` to its serializable form.\n * Drops function variants of `storagePath`, `fileName`, and all function fields.\n */\nfunction toSerializableStorageConfig(storage: StorageConfig | undefined): SerializableStorageConfig | undefined {\n if (!storage) return undefined;\n\n // storagePath must be a string for serialization\n const storagePath = typeof storage.storagePath === \"string\" ? storage.storagePath : undefined;\n if (!storagePath) return undefined;\n\n const result: SerializableStorageConfig = { storagePath };\n\n if (storage.acceptedFiles) result.acceptedFiles = storage.acceptedFiles;\n if (storage.imageResize) result.imageResize = storage.imageResize;\n if (storage.metadata) result.metadata = storage.metadata;\n if (typeof storage.fileName === \"string\") result.fileName = storage.fileName;\n if (storage.includeBucketUrl !== undefined) result.includeBucketUrl = storage.includeBucketUrl;\n if (storage.storeUrl !== undefined) result.storeUrl = storage.storeUrl;\n if (storage.maxSize !== undefined) result.maxSize = storage.maxSize;\n if (storage.storageSource !== undefined) result.storageSource = storage.storageSource;\n // processFile, postProcess, previewUrl are intentionally dropped (functions)\n\n return result;\n}\n\n/**\n * Convert a RegExp or string `matches` validation to a plain string.\n */\nfunction serializeMatches(matches: string | RegExp | undefined): string | undefined {\n if (matches === undefined) return undefined;\n if (typeof matches === \"string\") return matches;\n return matches.source;\n}\n\n/**\n * Resolve a relation target to a string slug.\n * Functions are called to extract the target; CollectionConfig objects\n * use their slug.\n */\nfunction resolveRelationTarget(target: RelationProperty[\"target\"]): string | undefined {\n if (!target) return undefined;\n if (typeof target === \"string\") return target;\n if (typeof target === \"function\") {\n try {\n const resolved = target();\n if (typeof resolved === \"string\") return resolved;\n if (resolved && typeof resolved === \"object\" && \"slug\" in resolved) {\n return (resolved as CollectionConfig).slug;\n }\n } catch {\n // If the lazy resolver throws (e.g., circular dependency not yet ready), return undefined\n }\n }\n return undefined;\n}\n\n/**\n * Strip non-serializable base property fields.\n * Returns a clean object with only the common serializable fields from BaseProperty.\n * Validation is intentionally excluded — each property type handles its own.\n */\nfunction toSerializableBaseFields(property: Property): Omit<SerializableBaseProperty, \"validation\"> {\n const result: Partial<Omit<SerializableBaseProperty, \"validation\">> = {\n name: property.name,\n };\n\n if (property.description) result.description = property.description;\n if (property.propertyConfig) result.propertyConfig = property.propertyConfig;\n if (property.columnName) result.columnName = property.columnName;\n if (property.defaultValue !== undefined) result.defaultValue = property.defaultValue;\n if (property.conditions) result.conditions = property.conditions;\n if (property.metadata) result.metadata = property.metadata;\n // dynamicProps and callbacks are intentionally dropped (functions)\n\n const ui = toSerializableUIConfig(property.ui);\n if (ui) result.ui = ui;\n\n return result as Omit<SerializableBaseProperty, \"validation\">;\n}\n\n/**\n * Convert a single `Property` to its JSON-serializable form.\n * Strips functions, converts RegExp to string, Date to ISO string.\n */\nexport function toSerializableProperty(property: Property): SerializableProperty {\n const base = toSerializableBaseFields(property);\n\n switch (property.type) {\n case \"string\": {\n const sp = property as StringProperty;\n const result: SerializableStringProperty = {\n ...base,\n type: \"string\",\n };\n if (sp.columnType) result.columnType = sp.columnType;\n if (sp.isId !== undefined) result.isId = sp.isId;\n if (sp.enum) result.enum = sp.enum;\n if (sp.userSelect) result.userSelect = sp.userSelect;\n if (sp.email) result.email = sp.email;\n\n // Convert validation.matches from RegExp to string\n if (sp.validation) {\n const { matches, ...restValidation } = sp.validation;\n const serializedValidation: SerializableStringValidation = { ...restValidation };\n const matchStr = serializeMatches(matches);\n if (matchStr !== undefined) serializedValidation.matches = matchStr;\n result.validation = serializedValidation;\n }\n\n // Storage: convert to serializable form\n const storage = toSerializableStorageConfig(sp.storage);\n if (storage) result.storage = storage;\n\n return result;\n }\n\n case \"number\": {\n const np = property as NumberProperty;\n const result: SerializableNumberProperty = {\n ...base,\n type: \"number\",\n };\n if (np.columnType) result.columnType = np.columnType;\n if (np.validation) result.validation = np.validation;\n if (np.isId !== undefined) result.isId = np.isId;\n if (np.enum) result.enum = np.enum;\n return result;\n }\n\n case \"boolean\": {\n const bp = property as BooleanProperty;\n const result: SerializableBooleanProperty = {\n ...base,\n type: \"boolean\",\n };\n if (bp.validation) result.validation = bp.validation;\n return result;\n }\n\n case \"date\": {\n const dp = property as DateProperty;\n const result: SerializableDateProperty = {\n ...base,\n type: \"date\",\n };\n if (dp.columnType) result.columnType = dp.columnType;\n if (dp.mode) result.mode = dp.mode;\n if (dp.timezone) result.timezone = dp.timezone;\n if (dp.autoValue) result.autoValue = dp.autoValue;\n\n // Convert Date validation min/max to ISO strings\n if (dp.validation) {\n const serializedValidation: SerializableDateValidation = {};\n if (dp.validation.required !== undefined) serializedValidation.required = dp.validation.required;\n if (dp.validation.requiredMessage) serializedValidation.requiredMessage = dp.validation.requiredMessage;\n if (dp.validation.unique) serializedValidation.unique = dp.validation.unique;\n if (dp.validation.uniqueInArray) serializedValidation.uniqueInArray = dp.validation.uniqueInArray;\n if (dp.validation.min instanceof Date) {\n serializedValidation.min = dp.validation.min.toISOString();\n } else if (typeof dp.validation.min === \"string\") {\n serializedValidation.min = dp.validation.min;\n }\n if (dp.validation.max instanceof Date) {\n serializedValidation.max = dp.validation.max.toISOString();\n } else if (typeof dp.validation.max === \"string\") {\n serializedValidation.max = dp.validation.max;\n }\n result.validation = serializedValidation;\n }\n return result;\n }\n\n case \"geopoint\": {\n const gp = property as GeopointProperty;\n const result: SerializableGeopointProperty = {\n ...base,\n type: \"geopoint\",\n };\n if (gp.validation) result.validation = gp.validation;\n return result;\n }\n\n case \"reference\": {\n const rp = property as ReferenceProperty;\n const result: SerializableReferenceProperty = {\n ...base,\n type: \"reference\",\n };\n if (rp.isId !== undefined) result.isId = rp.isId;\n if (rp.path) result.path = rp.path;\n if (rp.fixedFilter) result.fixedFilter = rp.fixedFilter;\n if (rp.includeId !== undefined) result.includeId = rp.includeId;\n if (rp.includeEntityLink !== undefined) result.includeEntityLink = rp.includeEntityLink;\n return result;\n }\n\n case \"relation\": {\n const rl = property as RelationProperty;\n const result: SerializableRelationProperty = {\n ...base,\n type: \"relation\",\n };\n if (rl.isId !== undefined) result.isId = rl.isId;\n // Resolve target to string\n const target = resolveRelationTarget(rl.target);\n if (target) result.target = target;\n if (rl.cardinality) result.cardinality = rl.cardinality;\n if (rl.direction) result.direction = rl.direction;\n if (rl.inverseRelationName) result.inverseRelationName = rl.inverseRelationName;\n if (rl.localKey) result.localKey = rl.localKey;\n if (rl.foreignKeyOnTarget) result.foreignKeyOnTarget = rl.foreignKeyOnTarget;\n if (rl.through) result.through = rl.through;\n if (rl.joinPath) result.joinPath = rl.joinPath;\n if (rl.onUpdate) result.onUpdate = rl.onUpdate;\n if (rl.onDelete) result.onDelete = rl.onDelete;\n if (rl.relationName) result.relationName = rl.relationName;\n if (rl.fixedFilter) result.fixedFilter = rl.fixedFilter;\n if (rl.includeId !== undefined) result.includeId = rl.includeId;\n if (rl.includeEntityLink !== undefined) result.includeEntityLink = rl.includeEntityLink;\n if (rl.widget) result.widget = rl.widget;\n // overrides and relation (resolved) are dropped\n return result;\n }\n\n case \"array\": {\n const ap = property as ArrayProperty;\n const result: SerializableArrayProperty = {\n ...base,\n type: \"array\",\n };\n if (ap.columnType) result.columnType = ap.columnType;\n if (ap.validation) result.validation = ap.validation;\n if (ap.sortable !== undefined) result.sortable = ap.sortable;\n if (ap.canAddElements !== undefined) result.canAddElements = ap.canAddElements;\n\n // Recursively serialize the \"of\" property\n if (ap.of) {\n if (Array.isArray(ap.of)) {\n result.of = ap.of.map(toSerializableProperty);\n } else {\n result.of = toSerializableProperty(ap.of);\n }\n }\n\n // Recursively serialize oneOf properties\n if (ap.oneOf) {\n result.oneOf = {\n properties: toSerializableProperties(ap.oneOf.properties),\n };\n if (ap.oneOf.propertiesOrder) result.oneOf.propertiesOrder = ap.oneOf.propertiesOrder;\n if (ap.oneOf.typeField) result.oneOf.typeField = ap.oneOf.typeField;\n if (ap.oneOf.valueField) result.oneOf.valueField = ap.oneOf.valueField;\n }\n return result;\n }\n\n case \"map\": {\n const mp = property as MapProperty;\n const result: SerializableMapProperty = {\n ...base,\n type: \"map\",\n };\n if (mp.columnType) result.columnType = mp.columnType;\n if (mp.validation) result.validation = mp.validation;\n if (mp.propertiesOrder) result.propertiesOrder = mp.propertiesOrder;\n if (mp.previewProperties) result.previewProperties = mp.previewProperties;\n if (mp.keyValue) result.keyValue = mp.keyValue;\n\n // Recursively serialize nested properties\n if (mp.properties) {\n result.properties = toSerializableProperties(mp.properties);\n }\n return result;\n }\n\n case \"vector\": {\n const vp = property as VectorProperty;\n const result: SerializableVectorProperty = {\n ...base,\n type: \"vector\",\n dimensions: vp.dimensions,\n };\n if (vp.validation) result.validation = vp.validation;\n return result;\n }\n\n case \"binary\": {\n const bp = property as BinaryProperty;\n const result: SerializableBinaryProperty = {\n ...base,\n type: \"binary\",\n };\n if (bp.validation) result.validation = bp.validation;\n return result;\n }\n\n default:\n // Exhaustive check: if new types are added, this will produce a compile error\n return base as SerializableProperty;\n }\n}\n\n/**\n * Convert a `Properties` record to its serializable form.\n */\nexport function toSerializableProperties(properties: Properties): SerializableProperties {\n const result: SerializableProperties = {};\n for (const [key, property] of Object.entries(properties)) {\n result[key] = toSerializableProperty(property);\n }\n return result;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// COLLECTION CONVERSION: Original → Serializable\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Convert an `CollectionConfig` to its JSON-serializable form.\n *\n * Strips all non-serializable fields (functions, React nodes, class instances)\n * while preserving the structural schema that the collection editor works with.\n *\n * The result is safe for `JSON.stringify()` and database storage.\n */\nexport function toSerializableCollectionConfig(collection: CollectionConfig): SerializableCollectionConfig {\n const result: SerializableCollectionConfig = {\n slug: collection.slug,\n name: collection.name,\n properties: toSerializableProperties(collection.properties),\n };\n\n // String fields\n if (collection.singularName) result.singularName = collection.singularName;\n if (collection.description) result.description = collection.description;\n if (collection.group) result.group = collection.group;\n if (collection.engine) result.engine = collection.engine;\n if (collection.dataSource) result.dataSource = collection.dataSource;\n if (collection.databaseId) result.databaseId = collection.databaseId;\n if (collection.titleProperty) result.titleProperty = collection.titleProperty as string;\n if (collection.ownerId) result.ownerId = collection.ownerId;\n if (collection.metadata) result.metadata = collection.metadata;\n if (collection.table) result.table = collection.table;\n if (\"schema\" in collection && collection.schema) result.schema = collection.schema as string;\n if (collection.orderProperty) result.orderProperty = collection.orderProperty as string;\n\n // Icon: only keep string variant\n if (typeof collection.icon === \"string\") result.icon = collection.icon;\n\n // Array fields\n if (collection.propertiesOrder) result.propertiesOrder = collection.propertiesOrder as string[];\n if (collection.previewProperties) result.previewProperties = collection.previewProperties;\n if (collection.listProperties) result.listProperties = collection.listProperties;\n if (collection.enabledViews) result.enabledViews = collection.enabledViews;\n if (collection.disableDefaultActions) result.disableDefaultActions = collection.disableDefaultActions;\n if (collection.securityRules) result.securityRules = collection.securityRules;\n\n // Enum-like fields\n if (collection.openEntityMode) result.openEntityMode = collection.openEntityMode;\n if (collection.defaultEntityAction) result.defaultEntityAction = collection.defaultEntityAction;\n if (collection.defaultViewMode) result.defaultViewMode = collection.defaultViewMode;\n if (collection.defaultSize) result.defaultSize = collection.defaultSize;\n if (collection.localChangesBackup !== undefined) result.localChangesBackup = collection.localChangesBackup;\n\n // Kanban\n if (collection.kanban) result.kanban = collection.kanban as SerializableCollectionConfig[\"kanban\"];\n\n // Filters and sorting\n if (collection.fixedFilter) result.fixedFilter = collection.fixedFilter as SerializableCollectionConfig[\"fixedFilter\"];\n if (collection.defaultFilter) result.defaultFilter = collection.defaultFilter as SerializableCollectionConfig[\"defaultFilter\"];\n if (collection.filterPresets) result.filterPresets = collection.filterPresets as SerializableCollectionConfig[\"filterPresets\"];\n if (collection.sort) result.sort = collection.sort as SerializableCollectionConfig[\"sort\"];\n\n // Numeric / boolean flags\n if (collection.pagination !== undefined) result.pagination = collection.pagination;\n if (collection.selectionEnabled !== undefined) result.selectionEnabled = collection.selectionEnabled;\n if (collection.inlineEditing !== undefined) result.inlineEditing = collection.inlineEditing;\n if (collection.hideFromNavigation !== undefined) result.hideFromNavigation = collection.hideFromNavigation;\n if (collection.hideIdFromForm !== undefined) result.hideIdFromForm = collection.hideIdFromForm;\n if (collection.hideIdFromCollection !== undefined) result.hideIdFromCollection = collection.hideIdFromCollection;\n if (collection.formAutoSave !== undefined) result.formAutoSave = collection.formAutoSave;\n if (collection.alwaysApplyDefaultValues !== undefined) result.alwaysApplyDefaultValues = collection.alwaysApplyDefaultValues;\n if (collection.includeJsonView !== undefined) result.includeJsonView = collection.includeJsonView;\n if (collection.history !== undefined) result.history = collection.history;\n if (collection.sideDialogWidth !== undefined) result.sideDialogWidth = collection.sideDialogWidth;\n\n // Exportable: only keep boolean variant\n if (typeof collection.exportable === \"boolean\") result.exportable = collection.exportable;\n\n // Auth: only keep boolean variant\n if (typeof collection.auth === \"boolean\") result.auth = collection.auth;\n\n // defaultSelectedView: only keep string variant\n if (typeof collection.defaultSelectedView === \"string\") result.defaultSelectedView = collection.defaultSelectedView;\n\n return result;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// PROPERTY CONVERSION: Serializable → Original\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Convert a serializable property back to the original `Property` type.\n *\n * This is a mostly pass-through operation since serializable properties\n * are a subset of the original types. The main conversions are:\n * - `validation.matches` (string) stays as string (compatible with Property)\n * - `validation.min/max` on dates: ISO strings → Date objects\n */\nexport function fromSerializableProperty(serialized: SerializableProperty): Property {\n switch (serialized.type) {\n case \"date\": {\n const sp = serialized as SerializableDateProperty;\n const { validation: dateValidation, ...dateRest } = sp;\n const result: Record<string, unknown> = { ...dateRest, type: \"date\" };\n // Convert ISO string dates back to Date objects\n if (dateValidation) {\n const convertedValidation: Record<string, unknown> = { ...dateValidation };\n if (typeof dateValidation.min === \"string\") {\n convertedValidation.min = new Date(dateValidation.min);\n }\n if (typeof dateValidation.max === \"string\") {\n convertedValidation.max = new Date(dateValidation.max);\n }\n result.validation = convertedValidation;\n }\n return result as unknown as DateProperty;\n }\n\n case \"array\": {\n const sp = serialized as SerializableArrayProperty;\n const result = { ...sp } as unknown as ArrayProperty;\n // Recursively convert \"of\" property\n if (sp.of) {\n if (Array.isArray(sp.of)) {\n result.of = sp.of.map(fromSerializableProperty);\n } else {\n result.of = fromSerializableProperty(sp.of);\n }\n }\n // Recursively convert oneOf properties\n if (sp.oneOf) {\n result.oneOf = {\n ...sp.oneOf,\n properties: fromSerializableProperties(sp.oneOf.properties),\n };\n }\n return result;\n }\n\n case \"map\": {\n const sp = serialized as SerializableMapProperty;\n const result = { ...sp } as unknown as MapProperty;\n // Recursively convert nested properties\n if (sp.properties) {\n result.properties = fromSerializableProperties(sp.properties);\n }\n return result;\n }\n\n case \"string\": {\n const sp = serialized as SerializableStringProperty;\n const result = { ...sp } as unknown as StringProperty;\n return result;\n }\n\n default:\n // For all other types, the serializable form is already a valid Property\n return serialized as unknown as Property;\n }\n}\n\n/**\n * Convert a `SerializableProperties` record back to `Properties`.\n */\nexport function fromSerializableProperties(serialized: SerializableProperties): Properties {\n const result: Properties = {};\n for (const [key, property] of Object.entries(serialized)) {\n result[key] = fromSerializableProperty(property);\n }\n return result;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// COLLECTION CONVERSION: Serializable → Original\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Convert a `SerializableCollectionConfig` back to an `CollectionConfig`.\n *\n * The result will NOT contain any of the non-serializable fields\n * (callbacks, entityActions, etc.) — those must be re-attached by the\n * consumer if needed.\n */\nexport function fromSerializableCollectionConfig(serialized: SerializableCollectionConfig): CollectionConfig {\n const { properties, ...rest } = serialized;\n\n return {\n ...rest,\n properties: fromSerializableProperties(properties),\n } as CollectionConfig;\n}\n","import { DataType, CollectionConfig } from \"@rebasepro/types\";\n\n\n/**\n * Valid dataType values for properties\n */\nconst VALID_DATA_TYPES = [\n \"string\",\n \"number\",\n \"boolean\",\n \"date\",\n \"geopoint\",\n \"reference\",\n \"relation\",\n \"array\",\n \"map\",\n \"vector\",\n \"binary\"\n] as const;\n\n\n/**\n * Validation error with path and message\n */\nexport interface CollectionValidationError {\n path: string;\n message: string;\n}\n\n/**\n * Result of collection JSON validation\n */\nexport interface CollectionValidationResult {\n valid: boolean;\n errors: CollectionValidationError[];\n collection?: CollectionConfig;\n}\n\n/**\n * Validates a property object recursively\n */\nfunction validateProperty(\n property: Record<string, unknown>,\n path: string,\n errors: CollectionValidationError[]\n): void {\n if (typeof property !== \"object\" || property === null) {\n errors.push({\n path,\n message: \"Property must be an object\"\n });\n return;\n }\n\n // Check type\n if (!property.type) {\n errors.push({\n path: `${path}.type`,\n message: \"Required field is missing\"\n });\n } else if (!VALID_DATA_TYPES.includes(property.type as DataType)) {\n errors.push({\n path: `${path}.type`,\n message: `Invalid value \"${property.type}\", expected one of: ${VALID_DATA_TYPES.join(\", \")}`\n });\n }\n\n // Validate name if present\n if (property.name !== undefined && typeof property.name !== \"string\") {\n errors.push({\n path: `${path}.name`,\n message: \"Must be a string\"\n });\n }\n\n // Validate array \"of\" property\n if (property.type === \"array\") {\n if (property.of) {\n if (Array.isArray(property.of)) {\n property.of.forEach((ofProp: Record<string, unknown>, index: number) => {\n validateProperty(ofProp, `${path}.of[${index}]`, errors);\n });\n } else {\n validateProperty(property.of as Record<string, unknown>, `${path}.of`, errors);\n }\n }\n // oneOf validation\n if (property.oneOf) {\n if (typeof property.oneOf !== \"object\") {\n errors.push({\n path: `${path}.oneOf`,\n message: \"Must be an object\"\n });\n } else if ((property.oneOf as Record<string, unknown>).properties) {\n validateProperties((property.oneOf as Record<string, unknown>).properties as Record<string, unknown>, `${path}.oneOf.properties`, errors);\n }\n }\n }\n\n // Validate map properties\n if (property.type === \"map\" && property.properties) {\n validateProperties(property.properties as Record<string, unknown>, `${path}.properties`, errors);\n }\n\n // Validate reference path\n if (property.type === \"reference\") {\n if (property.path !== undefined && typeof property.path !== \"string\") {\n errors.push({\n path: `${path}.path`,\n message: \"Must be a string\"\n });\n }\n }\n\n // Validate relation property\n if (property.type === \"relation\") {\n if (property.target !== undefined && typeof property.target !== \"string\" && typeof property.target !== \"function\") {\n errors.push({\n path: `${path}.target`,\n message: \"Must be a string (collection slug) or a function\"\n });\n }\n if (property.cardinality !== undefined && property.cardinality !== \"one\" && property.cardinality !== \"many\") {\n errors.push({\n path: `${path}.cardinality`,\n message: \"Must be either 'one' or 'many'\"\n });\n }\n if (property.direction !== undefined && property.direction !== \"owning\" && property.direction !== \"inverse\") {\n errors.push({\n path: `${path}.direction`,\n message: \"Must be either 'owning' or 'inverse'\"\n });\n }\n if (property.localKey !== undefined && typeof property.localKey !== \"string\") {\n errors.push({\n path: `${path}.localKey`,\n message: \"Must be a string\"\n });\n }\n if (property.foreignKeyOnTarget !== undefined && typeof property.foreignKeyOnTarget !== \"string\") {\n errors.push({\n path: `${path}.foreignKeyOnTarget`,\n message: \"Must be a string\"\n });\n }\n if (property.through !== undefined) {\n if (typeof property.through !== \"object\" || property.through === null) {\n errors.push({\n path: `${path}.through`,\n message: \"Must be an object\"\n });\n } else {\n const throughObj = property.through as Record<string, unknown>;\n if (throughObj.table !== undefined && typeof throughObj.table !== \"string\") {\n errors.push({\n path: `${path}.through.table`,\n message: \"Must be a string\"\n });\n }\n if (throughObj.sourceColumn !== undefined && typeof throughObj.sourceColumn !== \"string\") {\n errors.push({\n path: `${path}.through.sourceColumn`,\n message: \"Must be a string\"\n });\n }\n if (throughObj.targetColumn !== undefined && typeof throughObj.targetColumn !== \"string\") {\n errors.push({\n path: `${path}.through.targetColumn`,\n message: \"Must be a string\"\n });\n }\n }\n }\n if (property.onUpdate !== undefined && typeof property.onUpdate !== \"string\") {\n errors.push({\n path: `${path}.onUpdate`,\n message: \"Must be a string\"\n });\n }\n if (property.onDelete !== undefined && typeof property.onDelete !== \"string\") {\n errors.push({\n path: `${path}.onDelete`,\n message: \"Must be a string\"\n });\n }\n }\n\n // Validate vector property\n if (property.type === \"vector\") {\n if (property.dimensions !== undefined && (typeof property.dimensions !== \"number\" || isNaN(property.dimensions) || property.dimensions <= 0)) {\n errors.push({\n path: `${path}.dimensions`,\n message: \"Must be a positive number\"\n });\n }\n }\n\n // Validate storage config for string\n if (property.type === \"string\" && property.storage) {\n if (typeof property.storage !== \"object\") {\n errors.push({\n path: `${path}.storage`,\n message: \"Must be an object\"\n });\n }\n }\n\n // Validate enum if present\n if (property.enum !== undefined) {\n if (!Array.isArray(property.enum) && typeof property.enum !== \"object\") {\n errors.push({\n path: `${path}.enum`,\n message: \"Must be an array or object\"\n });\n }\n }\n}\n\n/**\n * Validates a properties object (collection of property definitions)\n */\nfunction validateProperties(\n properties: Record<string, unknown>,\n path: string,\n errors: CollectionValidationError[]\n): void {\n if (typeof properties !== \"object\" || properties === null) {\n errors.push({\n path,\n message: \"Must be an object\"\n });\n return;\n }\n\n for (const [key, property] of Object.entries(properties)) {\n validateProperty(property as Record<string, unknown>, `${path}.${key}`, errors);\n }\n}\n\n/**\n * Validates optional collection fields\n */\nfunction validateOptionalFields(\n collection: Record<string, unknown>,\n errors: CollectionValidationError[]\n): void {\n // String fields\n const stringFields = [\n \"singularName\",\n \"description\",\n \"group\",\n \"databaseId\"\n ];\n for (const field of stringFields) {\n if (collection[field] !== undefined && typeof collection[field] !== \"string\") {\n errors.push({\n path: field,\n message: \"Must be a string\"\n });\n }\n }\n\n // Boolean fields\n const booleanFields = [\n\n \"selectionEnabled\",\n \"inlineEditing\",\n \"hideFromNavigation\",\n \"hideIdFromForm\",\n \"hideIdFromCollection\",\n \"formAutoSave\",\n \"alwaysApplyDefaultValues\",\n \"includeJsonView\",\n \"history\"\n ];\n for (const field of booleanFields) {\n if (collection[field] !== undefined && typeof collection[field] !== \"boolean\") {\n errors.push({\n path: field,\n message: \"Must be a boolean\"\n });\n }\n }\n\n // Icon can be string or object (React node)\n if (collection.icon !== undefined &&\n typeof collection.icon !== \"string\" &&\n typeof collection.icon !== \"object\") {\n errors.push({\n path: \"icon\",\n message: \"Must be a string (icon key) or object\"\n });\n }\n\n // propertiesOrder must be array of strings\n if (collection.propertiesOrder !== undefined) {\n if (!Array.isArray(collection.propertiesOrder)) {\n errors.push({\n path: \"propertiesOrder\",\n message: \"Must be an array of strings\"\n });\n } else if (!collection.propertiesOrder.every((item: unknown) => typeof item === \"string\")) {\n errors.push({\n path: \"propertiesOrder\",\n message: \"All items must be strings\"\n });\n }\n }\n\n // subcollections must be array\n if (collection.subcollections !== undefined) {\n if (!Array.isArray(collection.subcollections)) {\n errors.push({\n path: \"subcollections\",\n message: \"Must be an array\"\n });\n } else {\n collection.subcollections.forEach((sub: Record<string, unknown>, index: number) => {\n const subErrors: CollectionValidationError[] = [];\n validateCollectionObject(sub, subErrors);\n subErrors.forEach(err => {\n errors.push({\n path: `subcollections[${index}].${err.path}`,\n message: err.message\n });\n });\n });\n }\n }\n\n // defaultViewMode validation\n const validViewModes = [\"table\", \"cards\", \"kanban\"];\n if (collection.defaultViewMode !== undefined) {\n if (!validViewModes.includes(collection.defaultViewMode as string)) {\n errors.push({\n path: \"defaultViewMode\",\n message: `Invalid value, expected one of: ${validViewModes.join(\", \")}`\n });\n }\n }\n\n // kanban config validation\n if (collection.kanban !== undefined) {\n if (typeof collection.kanban !== \"object\" || collection.kanban === null) {\n errors.push({\n path: \"kanban\",\n message: \"Must be an object\"\n });\n } else if ((collection.kanban as Record<string, unknown>).columnProperty !== undefined &&\n typeof (collection.kanban as Record<string, unknown>).columnProperty !== \"string\") {\n errors.push({\n path: \"kanban.columnProperty\",\n message: \"Must be a string\"\n });\n }\n }\n}\n\n/**\n * Validates a collection object\n */\nfunction validateCollectionObject(\n collection: Record<string, unknown>,\n errors: CollectionValidationError[]\n): void {\n // Required fields\n if (!collection.id) {\n errors.push({\n path: \"id\",\n message: \"Required field is missing\"\n });\n } else if (typeof collection.id !== \"string\") {\n errors.push({\n path: \"id\",\n message: \"Must be a string\"\n });\n }\n\n if (!collection.name) {\n errors.push({\n path: \"name\",\n message: \"Required field is missing\"\n });\n } else if (typeof collection.name !== \"string\") {\n errors.push({\n path: \"name\",\n message: \"Must be a string\"\n });\n }\n\n if (!collection.path) {\n errors.push({\n path: \"path\",\n message: \"Required field is missing\"\n });\n } else if (typeof collection.path !== \"string\") {\n errors.push({\n path: \"path\",\n message: \"Must be a string\"\n });\n }\n\n // Properties validation\n if (collection.properties !== undefined) {\n validateProperties(collection.properties as Record<string, unknown>, \"properties\", errors);\n }\n\n // Optional fields\n validateOptionalFields(collection, errors);\n}\n\n/**\n * Validates a JSON string representing a collection configuration.\n * Returns detailed validation errors if the JSON is invalid or doesn't match\n * the expected collection schema.\n */\nexport function validateCollectionJson(jsonString: string): CollectionValidationResult {\n const errors: CollectionValidationError[] = [];\n\n // Try to parse JSON\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonString);\n } catch (e: unknown) {\n // Try to extract line/column info from the error\n const message_ = e instanceof Error ? e.message : String(e);\n const match = message_.match(/position (\\d+)/);\n let message = \"Invalid JSON syntax\";\n if (match) {\n const position = parseInt(match[1], 10);\n const lines = jsonString.substring(0, position).split(\"\\n\");\n const line = lines.length;\n const column = lines[lines.length - 1].length + 1;\n message = `Invalid JSON syntax at line ${line}, column ${column}: ${message_}`;\n } else {\n message = `Invalid JSON syntax: ${message_}`;\n }\n return {\n valid: false,\n errors: [{\n path: \"\",\n message\n }]\n };\n }\n\n // Validate collection structure\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n valid: false,\n errors: [{\n path: \"\",\n message: \"Collection must be an object\"\n }]\n };\n }\n\n validateCollectionObject(parsed as Record<string, unknown>, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n collection: errors.length === 0 ? parsed as unknown as CollectionConfig : undefined\n };\n}\n","import { CollectionConfig } from \"@rebasepro/types\";\n\nexport interface GenerateCollectionRequest {\n /** User's natural language description of what they want */\n prompt: string;\n\n /** Other collections in the project (for context/relationships). Limit to 30. */\n existingCollections: Partial<CollectionConfig>[];\n\n /** Optional for generate, required for modifications. If provided, modifies this collection */\n existingCollection?: Partial<CollectionConfig>;\n}\n\n/** Operation types for modifying a collection */\nexport type CollectionOperationType = \"add\" | \"modify\" | \"delete\";\n\n/** A single operation describing what changed */\nexport interface CollectionOperation {\n op: CollectionOperationType;\n path: string;\n value?: unknown;\n}\n\n/** Result from collection generation, including optional delta operations */\nexport interface GenerateCollectionResult {\n collection: CollectionConfig;\n operations?: CollectionOperation[];\n}\n\n/**\n * Callback type for generating or modifying a collection.\n * The plugin is API-agnostic - consumers implement the actual API call.\n */\nexport type CollectionGenerationCallback = (\n request: GenerateCollectionRequest\n) => Promise<GenerateCollectionResult>;\n\nexport class CollectionGenerationApiError extends Error {\n public code?: string;\n\n constructor(message: string, code?: string) {\n super(message);\n this.code = code;\n this.name = \"CollectionGenerationApiError\";\n }\n}\n\n/**\n * Default endpoint for AI collection generation\n */\nexport const DEFAULT_COLLECTION_GENERATION_ENDPOINT = \"https://api.rebase.pro/collections/generate\";\n\n/**\n * Props for building a collection generation callback\n */\nexport interface BuildCollectionGenerationCallbackProps {\n /**\n * Function to get the auth token.\n * This is typically `authController.getAuthToken` from `@rebasepro/client`\n * (or `@rebasepro/firebase` if using Firebase).\n */\n getAuthToken: () => Promise<string>;\n\n /**\n * Optional custom API endpoint for collection generation.\n * Defaults to the Rebase SaaS API endpoint.\n */\n apiEndpoint?: string;\n}\n\n/**\n * Build a callback for AI collection generation.\n * This helper allows self-hosted Rebase users to enable the AI collection\n * generation feature.\n *\n * @example\n * ```tsx\n * import { RebaseAdmin } from \"@rebasepro/admin\";\n * import { buildCollectionGenerationCallback } from \"@rebasepro/admin/collection_editor\";\n * import { useFirebaseAuthController } from \"@rebasepro/firebase\";\n *\n * const authController = useFirebaseAuthController({ firebaseApp });\n *\n * export function App() {\n * return (\n * <RebaseAdmin\n * collectionEditor={{\n * generateCollection: buildCollectionGenerationCallback({\n * getAuthToken: authController.getAuthToken\n * })\n * }}\n * />\n * );\n * }\n * ```\n */\nexport function buildCollectionGenerationCallback({\n getAuthToken,\n apiEndpoint = DEFAULT_COLLECTION_GENERATION_ENDPOINT\n}: BuildCollectionGenerationCallbackProps): CollectionGenerationCallback {\n return async (request) => {\n const token = await getAuthToken();\n const response = await fetch(apiEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify(request)\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new CollectionGenerationApiError(\n errorData.error || \"Failed to generate collection\",\n errorData.code\n );\n }\n\n const data = await response.json();\n return {\n collection: data.data.collection,\n operations: data.data.operations\n };\n };\n}\n","export function idToPropertiesPath(id: string): string {\n return \"properties.\" + id.replaceAll(\".\", \".properties.\");\n}\n\nexport function namespaceToPropertiesPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".properties\"\n : \"properties\";\n}\n\nexport function namespaceToPropertiesOrderPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".propertiesOrder\"\n : \"propertiesOrder\";\n}\n\nexport function getFullId(propertyKey: string, propertyNamespace?: string): string {\n return propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n}\n\nexport function getFullIdPath(propertyKey: string, propertyNamespace?: string): string {\n const keyWithNamespace = propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n return idToPropertiesPath(keyWithNamespace);\n}\n"],"mappings":"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"}
|