@rebasepro/admin 0.8.0 → 0.9.1-canary.09aaf62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +26 -26
  2. package/dist/{CollectionEditorDialog-BO_aQ-Z4.js → CollectionEditorDialog-DbPpDDwb.js} +40 -18
  3. package/dist/CollectionEditorDialog-DbPpDDwb.js.map +1 -0
  4. package/dist/{PropertyEditView-DKzOpMjR.js → PropertyEditView-DfJbZ67t.js} +81 -73
  5. package/dist/PropertyEditView-DfJbZ67t.js.map +1 -0
  6. package/dist/{RouterCollectionsStudioView-BQTIExjA.js → RouterCollectionsStudioView-C6XQ7Il5.js} +5 -5
  7. package/dist/RouterCollectionsStudioView-C6XQ7Il5.js.map +1 -0
  8. package/dist/collection_editor/_cms_internals.d.ts +3 -3
  9. package/dist/collection_editor/api/generateCollectionApi.d.ts +8 -8
  10. package/dist/collection_editor/extensibility_types.d.ts +3 -3
  11. package/dist/collection_editor/index.d.ts +2 -2
  12. package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
  13. package/dist/collection_editor/serializable_types.d.ts +7 -7
  14. package/dist/collection_editor/serializable_utils.d.ts +8 -8
  15. package/dist/collection_editor/types/collection_editor_controller.d.ts +5 -5
  16. package/dist/collection_editor/types/collection_inference.d.ts +2 -2
  17. package/dist/collection_editor/types/config_controller.d.ts +7 -7
  18. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +2 -2
  19. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +2 -2
  20. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +2 -2
  21. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +2 -2
  22. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +3 -3
  23. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +2 -2
  24. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +4 -4
  25. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +2 -2
  26. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +2 -2
  27. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +4 -4
  28. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +2 -2
  29. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +2 -2
  30. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +2 -2
  31. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +2 -2
  32. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +2 -2
  33. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +5 -5
  34. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +3 -3
  35. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
  36. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
  37. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
  38. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
  39. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
  40. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
  41. package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
  42. package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
  43. package/dist/collection_editor_ui.js +5 -5
  44. package/dist/collection_editor_ui.js.map +1 -1
  45. package/dist/components/CollectionPanel.d.ts +4 -4
  46. package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +3 -3
  47. package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
  48. package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +2 -2
  49. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +2 -2
  50. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +2 -2
  51. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +2 -2
  52. package/dist/components/CollectionTableBinding/index.d.ts +6 -0
  53. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +1 -1
  54. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
  55. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +3 -3
  56. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +1 -1
  57. package/dist/components/{EntityCollectionView/EntityBoardCard.d.ts → CollectionViewBinding/BoardCardBinding.d.ts} +8 -8
  58. package/dist/components/{EntityCollectionView/EntityCollectionBoardView.d.ts → CollectionViewBinding/CollectionBoardViewBinding.d.ts} +4 -4
  59. package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
  60. package/dist/components/{EntityCollectionView/EntityCollectionListView.d.ts → CollectionViewBinding/CollectionListViewBinding.d.ts} +4 -4
  61. package/dist/components/{EntityCollectionView/EntityCollectionViewActions.d.ts → CollectionViewBinding/CollectionViewActions.d.ts} +4 -4
  62. package/dist/components/{EntityCollectionView/EntityCollectionView.d.ts → CollectionViewBinding/CollectionViewBinding.d.ts} +4 -4
  63. package/dist/components/{EntityCollectionView/EntityCollectionViewStartActions.d.ts → CollectionViewBinding/CollectionViewStartActions.d.ts} +4 -4
  64. package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
  65. package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +3 -3
  66. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
  67. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +2 -2
  68. package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
  69. package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
  70. package/dist/components/DeleteEntityDialog.d.ts +4 -4
  71. package/dist/components/{EntityDetailView.d.ts → DetailViewBinding.d.ts} +5 -5
  72. package/dist/components/EditFormActions.d.ts +3 -0
  73. package/dist/components/{EntityEditView.d.ts → EditViewBinding.d.ts} +9 -9
  74. package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +13 -13
  75. package/dist/components/EntityViewBinding.d.ts +13 -0
  76. package/dist/components/{EntityJsonPreview.d.ts → JsonPreviewBinding.d.ts} +1 -1
  77. package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
  78. package/dist/components/RebaseLayout.d.ts +5 -4
  79. package/dist/components/RebaseNavigation.d.ts +1 -1
  80. package/dist/components/RebaseShell.d.ts +1 -0
  81. package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +5 -5
  82. package/dist/components/SelectableTable/SelectableTable.d.ts +6 -6
  83. package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
  84. package/dist/components/SelectableTable/SelectionStore.d.ts +2 -2
  85. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +6 -1
  86. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +7 -1
  87. package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
  88. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +7 -1
  89. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +7 -1
  90. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +7 -1
  91. package/dist/components/SideDialogs.d.ts +1 -1
  92. package/dist/components/SidePanelBinding.d.ts +11 -0
  93. package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +7 -7
  94. package/dist/components/history/EntityHistoryEntry.d.ts +2 -2
  95. package/dist/components/history/LastEditedByIndicator.d.ts +2 -2
  96. package/dist/components/index.d.ts +15 -14
  97. package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
  98. package/dist/data_export/export/ExportCollectionAction.d.ts +3 -3
  99. package/dist/data_import/components/ImportSaveInProgress.d.ts +2 -2
  100. package/dist/editor.js +1 -1
  101. package/dist/editor.js.map +1 -1
  102. package/dist/form/EntityForm.d.ts +1 -1
  103. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  104. package/dist/form/components/LocalChangesMenu.d.ts +1 -1
  105. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  106. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
  107. package/dist/form/form_utils.d.ts +2 -2
  108. package/dist/{history-B3cqBzEV.js → history-GSa4BgDt.js} +7 -7
  109. package/dist/history-GSa4BgDt.js.map +1 -0
  110. package/dist/hooks/index.d.ts +4 -4
  111. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
  112. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +5 -5
  113. package/dist/hooks/navigation/useNavigationResolution.d.ts +4 -4
  114. package/dist/hooks/navigation/useResolvedCollections.d.ts +7 -7
  115. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +2 -2
  116. package/dist/hooks/navigation/utils.d.ts +5 -5
  117. package/dist/hooks/useBuildSidePanel.d.ts +6 -0
  118. package/dist/hooks/useCMSContext.d.ts +2 -2
  119. package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +1 -1
  120. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  121. package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
  122. package/dist/hooks/useSideDialogsController.d.ts +1 -1
  123. package/dist/hooks/useSidePanel.d.ts +11 -0
  124. package/dist/index.d.ts +2 -2
  125. package/dist/index.js +2 -2
  126. package/dist/{src-cxV1ODRG.js → src-B8WuGSPZ.js} +886 -692
  127. package/dist/src-B8WuGSPZ.js.map +1 -0
  128. package/dist/types/components/EntityFormActionsProps.d.ts +2 -2
  129. package/dist/types/components/EntityFormProps.d.ts +3 -3
  130. package/dist/types/components/formex.d.ts +1 -1
  131. package/dist/types/fields.d.ts +2 -2
  132. package/dist/util/dataControllerAdapter.d.ts +2 -5
  133. package/dist/util/navigation_utils.d.ts +6 -6
  134. package/dist/util/previews.d.ts +3 -3
  135. package/dist/util/property_utils.d.ts +2 -2
  136. package/dist/util/{entity_view_constants.d.ts → view_constants.d.ts} +1 -1
  137. package/package.json +12 -17
  138. package/src/collection_editor/ConfigControllerProvider.tsx +11 -11
  139. package/src/collection_editor/_cms_internals.ts +3 -3
  140. package/src/collection_editor/api/generateCollectionApi.ts +8 -8
  141. package/src/collection_editor/extensibility_types.ts +3 -3
  142. package/src/collection_editor/index.ts +3 -3
  143. package/src/collection_editor/pgColumnToProperty.ts +3 -3
  144. package/src/collection_editor/serializable_types.ts +8 -8
  145. package/src/collection_editor/serializable_utils.ts +17 -17
  146. package/src/collection_editor/types/collection_editor_controller.tsx +5 -5
  147. package/src/collection_editor/types/collection_inference.ts +2 -2
  148. package/src/collection_editor/types/config_controller.tsx +7 -7
  149. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +3 -3
  150. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +3 -3
  151. package/src/collection_editor/ui/EditorCollectionAction.tsx +3 -3
  152. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +3 -3
  153. package/src/collection_editor/ui/EditorEntityAction.tsx +3 -3
  154. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
  155. package/src/collection_editor/ui/KanbanSetupAction.tsx +3 -3
  156. package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
  157. package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
  158. package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
  159. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +3 -3
  160. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +6 -6
  161. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +6 -6
  162. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +29 -29
  163. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +5 -5
  164. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +2 -2
  165. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +10 -10
  166. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +38 -7
  167. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +3 -3
  168. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +3 -3
  169. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +3 -3
  170. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +4 -4
  171. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +5 -5
  172. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
  173. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
  174. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
  175. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +7 -7
  176. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +5 -5
  177. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +4 -4
  178. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +9 -9
  179. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +46 -37
  180. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +2 -2
  181. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
  182. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +7 -7
  183. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
  184. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +4 -4
  185. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +4 -4
  186. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
  187. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
  188. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +2 -2
  189. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
  190. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +2 -2
  191. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
  192. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
  193. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
  194. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
  195. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +3 -3
  196. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
  197. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
  198. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
  199. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
  200. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
  201. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
  202. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
  203. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
  204. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
  205. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
  206. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
  207. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
  208. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +2 -2
  209. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +2 -2
  210. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +2 -2
  211. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
  212. package/src/collection_editor/useJsonCollectionsConfigController.tsx +13 -13
  213. package/src/collection_editor/useLocalCollectionsConfigController.tsx +4 -4
  214. package/src/collection_editor/useSafeSnackbarController.ts +1 -1
  215. package/src/collection_editor/validateCollectionJson.ts +3 -3
  216. package/src/components/AdminModeSyncer.tsx +1 -1
  217. package/src/components/ArrayContainer.tsx +1 -1
  218. package/src/components/ClearFilterSortButton.tsx +1 -1
  219. package/src/components/CollectionPanel.tsx +14 -17
  220. package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +8 -8
  221. package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +13 -13
  222. package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +2 -2
  223. package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +1 -1
  224. package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +1 -1
  225. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +7 -7
  226. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +10 -10
  227. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +7 -7
  228. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +1 -1
  229. package/src/components/CollectionTableBinding/index.tsx +14 -0
  230. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +1 -1
  231. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +2 -2
  232. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +1 -1
  233. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +2 -2
  234. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +6 -6
  235. package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +1 -1
  236. package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +17 -17
  237. package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +17 -16
  238. package/src/components/{EntityCollectionView/EntityCollectionCardView.tsx → CollectionViewBinding/CollectionCardViewBinding.tsx} +9 -9
  239. package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +15 -15
  240. package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +7 -7
  241. package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +107 -92
  242. package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +6 -6
  243. package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +12 -12
  244. package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +49 -72
  245. package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +10 -10
  246. package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +1 -1
  247. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +6 -6
  248. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +5 -5
  249. package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +25 -13
  250. package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +9 -9
  251. package/src/components/DefaultAppBar.tsx +3 -3
  252. package/src/components/DefaultDrawer.tsx +3 -3
  253. package/src/components/DeleteEntityDialog.tsx +7 -7
  254. package/src/components/{EntityDetailView.tsx → DetailViewBinding.tsx} +28 -31
  255. package/src/components/DrawerNavigationGroup.tsx +2 -2
  256. package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +16 -16
  257. package/src/components/{EntityEditView.tsx → EditViewBinding.tsx} +34 -37
  258. package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +30 -30
  259. package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +7 -7
  260. package/src/components/HomePage/ContentHomePage.tsx +4 -4
  261. package/src/components/HomePage/FavouritesView.tsx +1 -1
  262. package/src/components/HomePage/NavigationCardBinding.tsx +4 -4
  263. package/src/components/HomePage/NavigationGroup.tsx +1 -1
  264. package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
  265. package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
  266. package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +6 -5
  267. package/src/components/RebaseAuthGate.tsx +2 -2
  268. package/src/components/RebaseLayout.tsx +7 -13
  269. package/src/components/RebaseNavigation.tsx +35 -11
  270. package/src/components/RebaseRouteDefs.tsx +2 -2
  271. package/src/components/RebaseShell.tsx +2 -1
  272. package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +27 -24
  273. package/src/components/ReferenceWidget.tsx +4 -4
  274. package/src/components/RelationSelector.tsx +15 -13
  275. package/src/components/SearchIconsView.tsx +2 -2
  276. package/src/components/SelectableTable/SelectableTable.tsx +35 -88
  277. package/src/components/SelectableTable/SelectableTableContext.tsx +3 -3
  278. package/src/components/SelectableTable/SelectionStore.ts +4 -4
  279. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +10 -2
  280. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +34 -13
  281. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
  282. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +22 -8
  283. package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
  284. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +67 -13
  285. package/src/components/SideDialogs.tsx +4 -4
  286. package/src/components/{EntitySidePanel.tsx → SidePanelBinding.tsx} +20 -20
  287. package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -17
  288. package/src/components/UserSelector.tsx +1 -1
  289. package/src/components/admin/CreationResultDialog.tsx +6 -3
  290. package/src/components/app/Scaffold.tsx +6 -2
  291. package/src/components/common/default_entity_actions.tsx +132 -34
  292. package/src/components/field_configs.tsx +1 -1
  293. package/src/components/history/EntityHistoryEntry.tsx +3 -3
  294. package/src/components/history/EntityHistoryView.tsx +7 -7
  295. package/src/components/history/LastEditedByIndicator.tsx +4 -4
  296. package/src/components/index.ts +16 -15
  297. package/src/contexts/SidePanelControllerContext.tsx +5 -0
  298. package/src/data_export/export/BasicExportAction.tsx +1 -1
  299. package/src/data_export/export/ExportCollectionAction.tsx +5 -5
  300. package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
  301. package/src/data_import/components/ImportFileUpload.tsx +1 -1
  302. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +1 -1
  303. package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
  304. package/src/data_import/import/ImportCollectionAction.tsx +6 -6
  305. package/src/data_import/utils/data.ts +4 -4
  306. package/src/data_import/utils/get_properties_mapping.ts +1 -1
  307. package/src/editor/components/image-bubble.tsx +1 -1
  308. package/src/editor/components/table-bubble.tsx +1 -1
  309. package/src/editor/editor.tsx +1 -1
  310. package/src/editor/selectors/link-selector.tsx +1 -1
  311. package/src/editor/selectors/node-selector.tsx +1 -1
  312. package/src/form/EntityForm.tsx +6 -6
  313. package/src/form/EntityFormActions.tsx +4 -4
  314. package/src/form/EntityFormBinding.tsx +10 -10
  315. package/src/form/PropertyFieldBinding.tsx +7 -7
  316. package/src/form/components/ErrorFocus.tsx +1 -1
  317. package/src/form/components/LocalChangesMenu.tsx +3 -3
  318. package/src/form/components/StorageItemPreview.tsx +1 -1
  319. package/src/form/components/StorageUploadProgress.tsx +3 -3
  320. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +1 -1
  321. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +5 -5
  322. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  323. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  324. package/src/form/field_bindings/KeyValueFieldBinding.tsx +21 -21
  325. package/src/form/field_bindings/MapFieldBinding.tsx +1 -1
  326. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +2 -2
  327. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -3
  328. package/src/form/field_bindings/ReferenceFieldBinding.tsx +7 -7
  329. package/src/form/field_bindings/RelationFieldBinding.tsx +4 -4
  330. package/src/form/field_bindings/RepeatFieldBinding.tsx +1 -1
  331. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +3 -3
  332. package/src/form/form_utils.ts +3 -3
  333. package/src/hooks/index.ts +4 -4
  334. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +2 -2
  335. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +11 -11
  336. package/src/hooks/navigation/useBuildNavigationStateController.tsx +5 -5
  337. package/src/hooks/navigation/useNavigationResolution.ts +28 -13
  338. package/src/hooks/navigation/useResolvedCollections.ts +8 -8
  339. package/src/hooks/navigation/useTopLevelNavigation.ts +2 -2
  340. package/src/hooks/navigation/utils.ts +5 -5
  341. package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +29 -29
  342. package/src/hooks/useCMSContext.tsx +7 -7
  343. package/src/hooks/{useEntityHistory.ts → useHistory.ts} +2 -2
  344. package/src/hooks/useResolvedNavigationFrom.tsx +10 -5
  345. package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
  346. package/src/hooks/useSideDialogsController.tsx +1 -1
  347. package/src/hooks/useSidePanel.tsx +13 -0
  348. package/src/index.ts +15 -15
  349. package/src/preview/PropertyPreview.tsx +2 -2
  350. package/src/preview/components/DatePreview.tsx +1 -1
  351. package/src/preview/components/EnumValuesChip.tsx +1 -1
  352. package/src/preview/components/ImagePreview.tsx +1 -1
  353. package/src/preview/components/ReferencePreview.tsx +11 -11
  354. package/src/preview/components/RelationPreview.tsx +13 -12
  355. package/src/preview/components/StorageThumbnail.tsx +1 -1
  356. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
  357. package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
  358. package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
  359. package/src/routes/RebaseRoute.tsx +12 -12
  360. package/src/types/components/EntityFormActionsProps.tsx +2 -2
  361. package/src/types/components/EntityFormProps.tsx +3 -3
  362. package/src/types/components/formex.tsx +1 -1
  363. package/src/types/fields.tsx +2 -2
  364. package/src/util/dataControllerAdapter.ts +9 -15
  365. package/src/util/navigation_utils.ts +7 -7
  366. package/src/util/previews.ts +7 -5
  367. package/src/util/property_utils.tsx +2 -2
  368. package/src/util/{entity_view_constants.ts → view_constants.ts} +1 -1
  369. package/dist/CollectionEditorDialog-BO_aQ-Z4.js.map +0 -1
  370. package/dist/PropertyEditView-DKzOpMjR.js.map +0 -1
  371. package/dist/RouterCollectionsStudioView-BQTIExjA.js.map +0 -1
  372. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -28
  373. package/dist/components/EntityCollectionTable/index.d.ts +0 -6
  374. package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -21
  375. package/dist/components/EntityEditViewFormActions.d.ts +0 -3
  376. package/dist/components/EntitySidePanel.d.ts +0 -11
  377. package/dist/components/EntityView.d.ts +0 -13
  378. package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
  379. package/dist/history-B3cqBzEV.js.map +0 -1
  380. package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
  381. package/dist/hooks/useSideEntityController.d.ts +0 -11
  382. package/dist/src-cxV1ODRG.js.map +0 -1
  383. package/src/components/EntityCollectionTable/index.tsx +0 -14
  384. package/src/contexts/SideEntityControllerContext.tsx +0 -5
  385. package/src/hooks/useSideEntityController.tsx +0 -13
  386. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
  387. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +0 -0
  388. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +0 -0
  389. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +0 -0
  390. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +0 -0
  391. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +0 -0
  392. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +0 -0
  393. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +0 -0
  394. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
  395. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
  396. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.d.ts +0 -0
  397. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +0 -0
  398. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +0 -0
  399. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
  400. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
  401. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +0 -0
  402. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -0
  403. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
  404. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +0 -0
  405. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
  406. /package/src/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.tsx +0 -0
  407. /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
  408. /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
@@ -1,12 +1,12 @@
1
- import { useEntitySelectionDialog } from "../../../hooks/useEntitySelectionDialog";
2
- import type { EntityCollection } from "@rebasepro/types";
1
+ import { useSelectionDialog } from "../../../hooks/useSelectionDialog";
2
+ import type { CollectionConfig } from "@rebasepro/types";
3
3
  import React, { useMemo, useState } from "react";
4
4
  import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
5
5
  import { Entity, EntityReference } from "@rebasepro/types";
6
6
  import { ReferencePreview } from "../../../preview";
7
7
  import { Button, Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
8
8
  import { getReferenceFrom } from "@rebasepro/common";
9
- import { useTranslation } from "@rebasepro/core";
9
+ import { useTranslation } from "@rebasepro/app";
10
10
  import { useCollectionRegistryController } from "../../../index";
11
11
 
12
12
  interface ReferenceFilterFieldProps {
@@ -20,6 +20,12 @@ interface ReferenceFilterFieldProps {
20
20
  previewProperties?: string[];
21
21
  hidden: boolean;
22
22
  setHidden: (hidden: boolean) => void;
23
+ /**
24
+ * Restrict the offered operators (already resolved against engine
25
+ * capabilities and property config). When omitted, all operators this
26
+ * field can render are offered.
27
+ */
28
+ operators?: readonly VirtualTableWhereFilterOp[];
23
29
  }
24
30
 
25
31
  const operationLabels = {
@@ -44,11 +50,12 @@ export function ReferenceFilterField({
44
50
  path,
45
51
  includeId = true,
46
52
  previewProperties,
47
- setHidden
53
+ setHidden,
54
+ operators
48
55
  }: ReferenceFilterFieldProps) {
49
56
  const { t } = useTranslation();
50
57
 
51
- const possibleOperations: (keyof typeof operationLabels)[] = isArray
58
+ let possibleOperations: (keyof typeof operationLabels)[] = isArray
52
59
  ? ["array-contains"]
53
60
  : ["==", "!=", ">", "<", ">=", "<="];
54
61
 
@@ -58,6 +65,10 @@ export function ReferenceFilterField({
58
65
  possibleOperations.push("in", "not-in");
59
66
  }
60
67
 
68
+ if (operators) {
69
+ possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
70
+ }
71
+
61
72
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
62
73
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
63
74
  const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue as EntityReference | EntityReference[] | undefined | null);
@@ -100,7 +111,7 @@ export function ReferenceFilterField({
100
111
  }
101
112
 
102
113
  const collectionRegistryController = useCollectionRegistryController();
103
- const collection: EntityCollection | undefined = useMemo(() => {
114
+ const collection: CollectionConfig | undefined = useMemo(() => {
104
115
  return path ? collectionRegistryController.getCollection(path) : undefined;
105
116
  }, [path]);
106
117
 
@@ -114,7 +125,7 @@ export function ReferenceFilterField({
114
125
 
115
126
  const multiple = multipleSelectOperations.includes(operation);
116
127
 
117
- const referenceDialogController = useEntitySelectionDialog({
128
+ const referenceDialogController = useSelectionDialog({
118
129
  multiselect: multiple,
119
130
  path,
120
131
  collection,
@@ -147,6 +158,9 @@ export function ReferenceFilterField({
147
158
  );
148
159
  };
149
160
 
161
+ // All renderable operators were filtered out (engine/property narrowing).
162
+ if (possibleOperations.length === 0) return null;
163
+
150
164
  return (
151
165
 
152
166
  <div className="flex w-full flex-row">
@@ -157,7 +171,7 @@ export function ReferenceFilterField({
157
171
  onValueChange={(value) => {
158
172
  updateFilter(value as VirtualTableWhereFilterOp, internalValue);
159
173
  }}
160
- renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>
174
+ renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
161
175
  {possibleOperations.map((op) => (
162
176
  <SelectItem key={op} value={op}>
163
177
  {operationLabels[op]}
@@ -11,6 +11,12 @@ interface RelationFilterFieldProps {
11
11
  relation: Relation; // relation config provided externally
12
12
  hidden: boolean;
13
13
  setHidden: (value: boolean) => void;
14
+ /**
15
+ * Restrict the offered operators (already resolved against engine
16
+ * capabilities and property config). When omitted, all operators this
17
+ * field can render are offered.
18
+ */
19
+ operators?: readonly VirtualTableWhereFilterOp[];
14
20
  }
15
21
 
16
22
  const operationLabels = {
@@ -34,15 +40,20 @@ export function RelationFilterField({
34
40
  relation,
35
41
  name: _name,
36
42
  hidden: _hidden,
37
- setHidden: _setHidden
43
+ setHidden: _setHidden,
44
+ operators
38
45
  }: RelationFilterFieldProps) {
39
46
 
40
47
  const manyRelation = relation.cardinality === "many";
41
48
 
42
- const possibleOperations: (keyof typeof operationLabels)[] = manyRelation
49
+ let possibleOperations: (keyof typeof operationLabels)[] = manyRelation
43
50
  ? ["array-contains", "array-contains-any"]
44
51
  : ["==", "!=", ">", "<", ">=", "<=", "in", "not-in"];
45
52
 
53
+ if (operators) {
54
+ possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
55
+ }
56
+
46
57
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
47
58
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
48
59
  const [internalValue, setInternalValue] = useState<EntityRelation | EntityRelation[] | undefined | null>(fieldValue);
@@ -89,6 +100,9 @@ export function RelationFilterField({
89
100
  updateFilter(operation, newVal);
90
101
  };
91
102
 
103
+ // All renderable operators were filtered out (engine/property narrowing).
104
+ if (possibleOperations.length === 0) return null;
105
+
92
106
  return (
93
107
  <div className="flex flex-row">
94
108
  <div className="">
@@ -98,7 +112,7 @@ export function RelationFilterField({
98
112
  onValueChange={(newOp) => {
99
113
  updateFilter(newOp as VirtualTableWhereFilterOp, internalValue);
100
114
  }}
101
- renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}
115
+ renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}
102
116
  >
103
117
  {possibleOperations.map((op) => (
104
118
  <SelectItem key={op} value={op}>
@@ -11,7 +11,7 @@ import {
11
11
  XIcon
12
12
  } from "@rebasepro/ui";
13
13
  import { EnumValueConfig } from "@rebasepro/types";
14
- import { useTranslation } from "@rebasepro/core";
14
+ import { useTranslation } from "@rebasepro/app";
15
15
 
16
16
  interface StringNumberFilterFieldProps {
17
17
  name: string,
@@ -21,6 +21,12 @@ interface StringNumberFilterFieldProps {
21
21
  isArray?: boolean;
22
22
  enumValues?: EnumValueConfig[];
23
23
  title?: string;
24
+ /**
25
+ * Restrict the offered operators (already resolved against engine
26
+ * capabilities and property config). When omitted, all operators this
27
+ * field can render are offered.
28
+ */
29
+ operators?: readonly VirtualTableWhereFilterOp[];
24
30
  }
25
31
 
26
32
  const operationLabels = {
@@ -34,11 +40,23 @@ const operationLabels = {
34
40
  "not-in": "Not in",
35
41
  "array-contains": "Contains",
36
42
  "array-contains-any": "Any",
37
- "is-null": "Is null"
43
+ "ilike": "Contains",
44
+ "not-ilike": "Not contains",
45
+ "is-null": "Is null",
46
+ "is-not-null": "Is not null"
38
47
  };
39
48
 
40
49
  const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
41
50
 
51
+ /** Operators that match a substring, wrapped in SQL wildcards (`%value%`). */
52
+ const containsOperations = ["ilike", "not-ilike"];
53
+
54
+ /** Strip the surrounding `%` wildcards a contains-filter adds, for display. */
55
+ function unwrapContains(value: unknown): string {
56
+ if (typeof value !== "string") return "";
57
+ return value.replace(/^%/, "").replace(/%$/, "");
58
+ }
59
+
42
60
  export function StringNumberFilterField({
43
61
  name,
44
62
  value,
@@ -46,13 +64,20 @@ export function StringNumberFilterField({
46
64
  type,
47
65
  isArray,
48
66
  enumValues,
49
- title
67
+ title,
68
+ operators
50
69
  }: StringNumberFilterFieldProps) {
51
70
  const { t } = useTranslation();
52
71
 
53
- const possibleOperations: (keyof typeof operationLabels)[] = isArray
72
+ let possibleOperations: (keyof typeof operationLabels)[] = isArray
54
73
  ? ["array-contains"]
55
- : ["==", "!=", ">", "<", ">=", "<=", "is-null"];
74
+ : ["==", "!=", ">", "<", ">=", "<=", "is-null", "is-not-null"];
75
+
76
+ // Case-insensitive substring matching is only meaningful for free-text
77
+ // string columns (not numbers, arrays, or enums).
78
+ if (!isArray && !enumValues && type === "string") {
79
+ possibleOperations.push("ilike", "not-ilike");
80
+ }
56
81
 
57
82
  if (enumValues) {
58
83
  if (isArray) {
@@ -62,18 +87,47 @@ export function StringNumberFilterField({
62
87
  }
63
88
  }
64
89
 
90
+ if (operators) {
91
+ possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
92
+ }
93
+
65
94
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
66
- const [operation, setOperation] = useState<VirtualTableWhereFilterOp | "is-null">(fieldOperation === "==" && fieldValue === null ? "is-null" : fieldOperation);
67
- const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(fieldValue as string | number | string[] | number[] | null | undefined);
95
+ // Read back both the canonical null operators and the legacy `["==", null]` /
96
+ // `["!=", null]` form saved by older filter presets.
97
+ const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(
98
+ fieldOperation === "==" && fieldValue === null ? "is-null"
99
+ : fieldOperation === "!=" && fieldValue === null ? "is-not-null"
100
+ : fieldOperation
101
+ );
102
+ const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(
103
+ containsOperations.includes(fieldOperation) ? unwrapContains(fieldValue) : (fieldValue as string | number | string[] | number[] | null | undefined)
104
+ );
105
+
106
+ const isNullOperation = operation === "is-null" || operation === "is-not-null";
68
107
 
69
- const isNullOperation = operation === "is-null";
108
+ // All renderable operators were filtered out (engine/property narrowing).
109
+ if (possibleOperations.length === 0) return null;
70
110
 
71
- function updateFilter(op: VirtualTableWhereFilterOp | "is-null", val: string | number | string[] | number[] | null | undefined) {
72
- // Handle "is null" operation
73
- if (op === "is-null") {
111
+ function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {
112
+ // Null-testing operators ignore their value.
113
+ if (op === "is-null" || op === "is-not-null") {
74
114
  setOperation(op);
75
115
  setInternalValue(null);
76
- setValue(["==", null]);
116
+ setValue([op, null]);
117
+ return;
118
+ }
119
+
120
+ // Substring matching: keep the raw text in the field, emit it wrapped
121
+ // in SQL wildcards so the backend runs `column ILIKE '%value%'`.
122
+ if (op === "ilike" || op === "not-ilike") {
123
+ const raw = typeof val === "string" ? val : "";
124
+ setOperation(op);
125
+ setInternalValue(raw);
126
+ if (raw.length > 0) {
127
+ setValue([op, `%${raw}%`]);
128
+ } else {
129
+ setValue(undefined);
130
+ }
77
131
  return;
78
132
  }
79
133
 
@@ -121,7 +175,7 @@ export function StringNumberFilterField({
121
175
  fullWidth={true}
122
176
  position={"item-aligned"}
123
177
  onValueChange={(value) => {
124
- updateFilter(value as VirtualTableWhereFilterOp | "is-null", internalValue);
178
+ updateFilter(value as VirtualTableWhereFilterOp, internalValue);
125
179
  }}
126
180
  renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
127
181
  {possibleOperations.map((op) => (
@@ -2,9 +2,9 @@ import type { SideDialogPanelProps } from "../hooks/useSideDialogsController";
2
2
  import React, { useCallback, useContext, useEffect, useState, useMemo } from "react";
3
3
  import { useSideDialogsController } from "../hooks";
4
4
  import { Sheet, Dialog } from "@rebasepro/ui";
5
- import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/core";
5
+ import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/app";
6
6
  import { ErrorBoundary } from "@rebasepro/ui";
7
- import type { EntitySidePanelProps } from "@rebasepro/types";
7
+ import type { SidePanelBindingProps } from "@rebasepro/types";
8
8
 
9
9
 
10
10
  export type SideDialogController = {
@@ -41,7 +41,7 @@ export const useSideDialogContext = () => useContext<SideDialogController>(SideD
41
41
 
42
42
  /**
43
43
  * This is the component in charge of rendering the side dialogs used
44
- * for editing entities. Use the {@link useSideEntityController} to open
44
+ * for editing entities. Use the {@link useSidePanel} to open
45
45
  * and control the dialogs.
46
46
  * This component needs a parent {@link Rebase}
47
47
  * {@link useSideDialogsController}
@@ -146,7 +146,7 @@ function SideDialogView({
146
146
  setPendingClose
147
147
  }), [blocked, setBlockedNavigationMessage, width, onCloseRequest, pendingClose]);
148
148
 
149
- const additionalProps = panel?.additional as EntitySidePanelProps | undefined;
149
+ const additionalProps = panel?.additional as SidePanelBindingProps | undefined;
150
150
  const isDialogMode = additionalProps?.collection?.openEntityMode === "dialog";
151
151
 
152
152
  return (
@@ -1,28 +1,28 @@
1
- import type { EntityCollection } from "@rebasepro/types";
2
- import type { EntitySidePanelProps } from "@rebasepro/types";
1
+ import type { CollectionConfig } from "@rebasepro/types";
2
+ import type { SidePanelBindingProps } from "@rebasepro/types";
3
3
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
 
5
5
  import type { OnUpdateParams } from "../types/components/EntityFormProps";
6
6
  import { ErrorBoundary } from "@rebasepro/ui";
7
7
  import { IconButton, Maximize2Icon, XIcon } from "@rebasepro/ui";
8
- import { EntityEditView } from "./EntityEditView";
9
- import { EntityDetailView } from "./EntityDetailView";
8
+ import { EditViewBinding } from "./EditViewBinding";
9
+ import { DetailViewBinding } from "./DetailViewBinding";
10
10
  import { useSideDialogContext } from "./SideDialogs";
11
11
  import { useNavigate } from "react-router-dom";
12
- import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/core";
13
- import { useCollectionRegistryController, useSideEntityController } from "../index";
12
+ import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/app";
13
+ import { useCollectionRegistryController, useSidePanel } from "../index";
14
14
  import { useUrlController } from "../index";
15
15
  import { resolveDefaultSelectedView } from "@rebasepro/common";
16
16
 
17
17
  /**
18
18
  * This is the component in charge of rendering the side dialog used
19
- * for editing entities. Use the {@link useSideEntityController} to open
19
+ * for editing entities. Use the {@link useSidePanel} to open
20
20
  * and control the dialogs.
21
21
  * This component needs a parent {@link Rebase}
22
- * {@link useSideEntityController}
22
+ * {@link useSidePanel}
23
23
  * @group Components
24
24
  */
25
- export function EntitySidePanel(props: EntitySidePanelProps) {
25
+ export function SidePanelBinding(props: SidePanelBindingProps) {
26
26
 
27
27
  const {
28
28
  allowFullScreen = true,
@@ -32,7 +32,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
32
32
  formProps
33
33
  } = props;
34
34
 
35
- const ResolvedDetailView = useComponentOverride("Entity.DetailView", EntityDetailView);
35
+ const ResolvedDetailView = useComponentOverride("DetailView", DetailViewBinding);
36
36
 
37
37
  const {
38
38
  blocked,
@@ -43,7 +43,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
43
43
 
44
44
  const navigate = useNavigate();
45
45
 
46
- const sideEntityController = useSideEntityController();
46
+ const sidePanelController = useSidePanel();
47
47
  const collectionRegistryController = useCollectionRegistryController();
48
48
  const sideDialogsController = useSideDialogContext();
49
49
  const urlController = useUrlController();
@@ -63,7 +63,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
63
63
  }
64
64
  setShowEditInPanel(false);
65
65
  if (params.status !== "existing") {
66
- sideEntityController.replace({
66
+ sidePanelController.replace({
67
67
  path: params.path,
68
68
  entityId: params.entityId,
69
69
  selectedTab: params.selectedTab,
@@ -102,7 +102,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
102
102
  // defaultSelectedView, update the panel width and URL to match.
103
103
  // This handles cases where defaultSelectedView is set via the collection
104
104
  // editor / Studio and is not available on the collection object the
105
- // caller passed to sideEntityController.open().
105
+ // caller passed to sidePanelController.open().
106
106
  const hasCorrectedDefaultView = useRef(false);
107
107
  useEffect(() => {
108
108
  hasCorrectedDefaultView.current = false;
@@ -119,7 +119,7 @@ entityId }
119
119
  );
120
120
  if (effectiveDefault && effectiveDefault !== "edit") {
121
121
  hasCorrectedDefaultView.current = true;
122
- sideEntityController.replace({
122
+ sidePanelController.replace({
123
123
  path,
124
124
  entityId,
125
125
  selectedTab: effectiveDefault,
@@ -127,7 +127,7 @@ entityId }
127
127
  collection
128
128
  });
129
129
  }
130
- }, [selectedTab, entityId, collection, path, sideEntityController]);
130
+ }, [selectedTab, entityId, collection, path, sidePanelController]);
131
131
 
132
132
  // Note: beforeunload is handled by useUnsavedChangesDialog in SideDialogView,
133
133
  // which listens to the same `blocked` state via SideDialogContext.
@@ -150,7 +150,7 @@ entityId }
150
150
  ? <ResolvedDetailView
151
151
  path={path}
152
152
  layout={collection?.openEntityMode === "dialog" ? "dialog" : "side_panel"}
153
- collection={collection as EntityCollection}
153
+ collection={collection as CollectionConfig}
154
154
  entityId={entityId!}
155
155
  parentCollectionSlugs={parentCollectionSlugs}
156
156
  parentEntityIds={parentEntityIds}
@@ -186,7 +186,7 @@ entityId }
186
186
  return;
187
187
  }
188
188
  if (tabEntityId) {
189
- sideEntityController.replace({
189
+ sidePanelController.replace({
190
190
  path,
191
191
  entityId: tabEntityId,
192
192
  selectedTab,
@@ -196,10 +196,10 @@ entityId }
196
196
  }
197
197
  }}
198
198
  />
199
- : <EntityEditView
199
+ : <EditViewBinding
200
200
  {...props}
201
201
  layout={collection?.openEntityMode === "dialog" ? "dialog" : "side_panel"}
202
- collection={collection as EntityCollection}
202
+ collection={collection as CollectionConfig}
203
203
  parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
204
204
  onValuesModified={onValuesModified}
205
205
  onSaved={onUpdate}
@@ -242,7 +242,7 @@ entityId }
242
242
  return;
243
243
  }
244
244
  if (tabEntityId) {
245
- sideEntityController.replace({
245
+ sidePanelController.replace({
246
246
  path,
247
247
  entityId: tabEntityId,
248
248
  selectedTab,
@@ -1,23 +1,23 @@
1
- import type { SideEntityController } from "@rebasepro/types";
1
+ import type { SidePanelController } from "@rebasepro/types";
2
2
  import React from "react";
3
- import { useBuildSideEntityController } from "../hooks/useBuildSideEntityController";
3
+ import { useBuildSidePanel } from "../hooks/useBuildSidePanel";
4
4
  import { useBuildSideDialogsController } from "../hooks/useBuildSideDialogsController";
5
- import { SideEntityControllerContext } from "../hooks/useSideEntityController";
5
+ import { SidePanelControllerContext } from "../hooks/useSidePanel";
6
6
  import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
7
7
  import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
8
8
  import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
9
9
  import { useCollectionRegistryController, useUrlController } from "../index";
10
10
  import { useNavigationStateController } from "../index";
11
- import { useAuthController, useBridgeRegistration } from "@rebasepro/core";
11
+ import { useAuthController, useBridgeRegistration } from "@rebasepro/app";
12
12
 
13
13
  /**
14
- * Provider that builds the SideEntityController and makes it available
15
- * via the SideEntityControllerContext from @rebasepro/core.
14
+ * Provider that builds the SidePanelController and makes it available
15
+ * via the SidePanelControllerContext from @rebasepro/app.
16
16
  *
17
- * After the CMS extraction refactor, `useBuildSideEntityController` lives
17
+ * After the CMS extraction refactor, `useBuildSidePanel` lives
18
18
  * in the CMS package while the context it feeds into lives in core.
19
19
  * This provider bridges the two: place it inside the `<Rebase>` tree and
20
- * above any component that calls `useSideEntityController()`.
20
+ * above any component that calls `useSidePanel()`.
21
21
  *
22
22
  * Also auto-registers the side entity controller and breadcrumbs into the
23
23
  * self-assembling Studio bridge (when a StudioBridgeRegistryProvider is
@@ -27,25 +27,25 @@ import { useAuthController, useBridgeRegistration } from "@rebasepro/core";
27
27
  * ```tsx
28
28
  * <Rebase ...>
29
29
  * {({ loading }) => (
30
- * <SideEntityProvider>
30
+ * <SidePanelProvider>
31
31
  * <RebaseRoutes>
32
32
  * ...
33
33
  * </RebaseRoutes>
34
- * </SideEntityProvider>
34
+ * </SidePanelProvider>
35
35
  * )}
36
36
  * </Rebase>
37
37
  * ```
38
38
  *
39
39
  * @group Components
40
40
  */
41
- export function SideEntityProvider({ children }: { children: React.ReactNode }) {
41
+ export function SidePanelProvider({ children }: { children: React.ReactNode }) {
42
42
  const collectionRegistryController = useCollectionRegistryController();
43
43
  const urlController = useUrlController();
44
44
  const navigationStateController = useNavigationStateController();
45
45
  const sideDialogsController = useBuildSideDialogsController();
46
46
  const authController = useAuthController();
47
47
 
48
- const sideEntityController = useBuildSideEntityController(
48
+ const sidePanelController = useBuildSidePanel(
49
49
  collectionRegistryController,
50
50
  urlController,
51
51
  navigationStateController,
@@ -56,10 +56,10 @@ export function SideEntityProvider({ children }: { children: React.ReactNode })
56
56
  return (
57
57
  <BreadcrumbsProvider>
58
58
  <SideDialogsControllerContext.Provider value={sideDialogsController}>
59
- <SideEntityControllerContext.Provider value={sideEntityController}>
60
- <BridgeAutoRegistrar sideEntityController={sideEntityController}/>
59
+ <SidePanelControllerContext.Provider value={sidePanelController}>
60
+ <BridgeAutoRegistrar sidePanelController={sidePanelController}/>
61
61
  {children}
62
- </SideEntityControllerContext.Provider>
62
+ </SidePanelControllerContext.Provider>
63
63
  </SideDialogsControllerContext.Provider>
64
64
  </BreadcrumbsProvider>
65
65
  );
@@ -69,9 +69,9 @@ export function SideEntityProvider({ children }: { children: React.ReactNode })
69
69
  * Internal component that auto-registers side entity and breadcrumbs
70
70
  * into the Studio bridge. Must be a child of BreadcrumbsProvider.
71
71
  */
72
- function BridgeAutoRegistrar({ sideEntityController }: { sideEntityController: SideEntityController }) {
72
+ function BridgeAutoRegistrar({ sidePanelController }: { sidePanelController: SidePanelController }) {
73
73
  const breadcrumbs = useBreadcrumbsController();
74
- useBridgeRegistration("sideEntityController", sideEntityController);
74
+ useBridgeRegistration("sidePanelController", sidePanelController);
75
75
  useBridgeRegistration("breadcrumbs", breadcrumbs);
76
76
  return null;
77
77
  }
@@ -21,7 +21,7 @@ import * as React from "react";
21
21
  import { useCallback, useEffect, useRef, useState } from "react";
22
22
  import { Command as CommandPrimitive } from "cmdk";
23
23
  import { User } from "@rebasepro/types";
24
- import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/core";
24
+ import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/app";
25
25
  import { EmptyValue } from "../preview";
26
26
 
27
27
  interface UserSelectorItem {
@@ -13,7 +13,7 @@ import {
13
13
  Tooltip,
14
14
  Typography
15
15
  } from "@rebasepro/ui";
16
- import { useSnackbarController, useTranslation } from "@rebasepro/core";
16
+ import { useSnackbarController, useTranslation } from "@rebasepro/app";
17
17
  import { UserCreationResult } from "@rebasepro/types";
18
18
 
19
19
  export function CreationResultDialog({
@@ -90,8 +90,11 @@ export function CreationResultDialog({
90
90
  <div className="flex flex-col gap-4 py-2">
91
91
  <Alert color="warning">
92
92
  <Typography variant="body2">
93
- {t("temporary_password_description") ??
94
- "Email is not configured. Share this temporary password with the user securely. It will not be shown again."}
93
+ {result.emailDeliveryFailed
94
+ ? (t("temporary_password_email_failed_description") ??
95
+ "The email could not be delivered. Share this temporary password with the user securely. It will not be shown again.")
96
+ : (t("temporary_password_description") ??
97
+ "Email is not configured. Share this temporary password with the user securely. It will not be shown again.")}
95
98
  </Typography>
96
99
  </Alert>
97
100
 
@@ -3,7 +3,7 @@ import { cls, defaultBorderMixin, IconButton, Sheet, Tooltip } from "@rebasepro/
3
3
  import { ChevronLeftIcon, ErrorBoundary, MenuIcon } from "@rebasepro/ui";
4
4
  import { deepEqual as equal } from "fast-equals"
5
5
 
6
- import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/core";
6
+ import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/app";
7
7
  import { AppContext } from "./useApp";
8
8
 
9
9
  export const DRAWER_WIDTH = 280;
@@ -141,8 +141,12 @@ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
141
141
 
142
142
  <div
143
143
  className={cls(defaultBorderMixin, "bg-surface-50 dark:bg-surface-800", "grow overflow-auto m-0", {
144
- "lg:mt-4": !hasAppBar,
145
144
  "mt-1 lg:m-0 lg:mx-2 lg:mb-2 lg:rounded-lg lg:border-t lg:border-x lg:border-solid": padding,
145
+ // No app bar means no DrawerHeader spacer above, so inset the
146
+ // panel by the same amount as its sides and bottom.
147
+ // Must come after the padding classes, which reset lg margins.
148
+ "lg:mt-2": !hasAppBar && padding,
149
+ "lg:mt-4": !hasAppBar && !padding,
146
150
  "border-t": hasAppBar && !padding
147
151
  })}>
148
152