@rebasepro/cms 0.17.3 → 0.18.0

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 (449) hide show
  1. package/README.md +4 -0
  2. package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
  3. package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
  4. package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
  5. package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
  6. package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
  7. package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
  8. package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
  9. package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
  10. package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
  11. package/dist/collection_editor_ui.d.ts +2 -0
  12. package/dist/collection_editor_ui.js +6 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/DeleteEntityDialog.d.ts +2 -3
  15. package/dist/components/RebaseLayout.d.ts +11 -4
  16. package/dist/components/field_configs.d.ts +1 -1
  17. package/dist/editor/sanitize-html.d.ts +15 -0
  18. package/dist/editor.js +195 -10
  19. package/dist/editor.js.map +1 -1
  20. package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
  21. package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
  22. package/dist/form/components/LabelWithIcon.d.ts +10 -0
  23. package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
  24. package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
  25. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
  26. package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
  27. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
  28. package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
  29. package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
  30. package/dist/index.js +78 -33
  31. package/dist/index.js.map +1 -1
  32. package/dist/util/propertyConfigMapper.d.ts +1 -1
  33. package/dist/util-CfLFggP7.js +57 -0
  34. package/dist/util-CfLFggP7.js.map +1 -0
  35. package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
  36. package/dist/util-DE1WQW6h.js.map +1 -0
  37. package/package.json +42 -34
  38. package/dist/util-DVqnqlLn.js.map +0 -1
  39. package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
  40. package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
  41. package/src/collection_editor/_cms_internals.ts +0 -41
  42. package/src/collection_editor/api/generateCollectionApi.ts +0 -126
  43. package/src/collection_editor/api/index.ts +0 -1
  44. package/src/collection_editor/extensibility_types.ts +0 -168
  45. package/src/collection_editor/index.ts +0 -108
  46. package/src/collection_editor/liveSchemaClient.ts +0 -285
  47. package/src/collection_editor/relation_kinds.ts +0 -44
  48. package/src/collection_editor/serializable_types.ts +0 -535
  49. package/src/collection_editor/serializable_utils.ts +0 -729
  50. package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
  51. package/src/collection_editor/types/collection_inference.ts +0 -18
  52. package/src/collection_editor/types/config_controller.tsx +0 -121
  53. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
  54. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
  55. package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
  56. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
  57. package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
  58. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
  59. package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
  60. package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
  61. package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
  62. package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
  63. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
  64. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
  65. package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
  66. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
  67. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
  68. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
  69. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
  70. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
  71. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
  72. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
  73. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
  74. package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
  75. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
  76. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
  77. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
  78. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
  79. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
  80. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
  81. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
  82. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
  83. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
  84. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
  85. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
  86. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
  87. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
  88. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
  89. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
  90. package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
  92. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
  93. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
  94. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
  95. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
  96. package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
  97. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
  98. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
  99. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
  100. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
  101. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
  102. package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
  103. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
  104. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
  105. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
  106. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
  107. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
  108. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
  109. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
  110. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
  111. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
  112. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
  113. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
  114. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
  115. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
  116. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
  117. package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
  118. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
  119. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
  120. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
  121. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
  122. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
  123. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
  124. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
  125. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
  126. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
  127. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
  128. package/src/collection_editor/ui/collection_editor/util.ts +0 -28
  129. package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
  130. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
  131. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
  132. package/src/collection_editor/useCollectionEditorController.tsx +0 -9
  133. package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
  134. package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
  135. package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
  136. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
  137. package/src/collection_editor/useSafeSnackbarController.ts +0 -9
  138. package/src/collection_editor/validateCollectionJson.ts +0 -440
  139. package/src/collection_editor_ui.ts +0 -21
  140. package/src/components/AdditionalFieldValue.tsx +0 -68
  141. package/src/components/AdminModeSyncer.tsx +0 -56
  142. package/src/components/ArrayContainer.tsx +0 -542
  143. package/src/components/ClearFilterSortButton.tsx +0 -56
  144. package/src/components/CollectionEditorDialogs.tsx +0 -69
  145. package/src/components/CollectionPanel.tsx +0 -179
  146. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
  147. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
  148. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
  149. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
  150. package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
  151. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
  152. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
  153. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
  154. package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
  155. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
  156. package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
  157. package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
  158. package/src/components/CollectionTableBinding/index.tsx +0 -14
  159. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
  160. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
  161. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
  162. package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
  163. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
  164. package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
  165. package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
  166. package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
  167. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
  168. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
  169. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
  170. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
  171. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
  172. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
  173. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
  174. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
  175. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
  176. package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
  177. package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
  178. package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
  179. package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
  180. package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
  181. package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
  182. package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
  183. package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
  184. package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
  185. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
  186. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
  187. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
  188. package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
  189. package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
  190. package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
  191. package/src/components/CollectionViewBinding/utils.ts +0 -22
  192. package/src/components/DefaultAppBar.tsx +0 -264
  193. package/src/components/DefaultDrawer.tsx +0 -593
  194. package/src/components/DeleteEntityDialog.tsx +0 -205
  195. package/src/components/DetailViewBinding.tsx +0 -731
  196. package/src/components/DrawerNavigationGroup.tsx +0 -141
  197. package/src/components/DrawerNavigationItem.tsx +0 -115
  198. package/src/components/EditFormActions.tsx +0 -303
  199. package/src/components/EditViewBinding.tsx +0 -1069
  200. package/src/components/EntityDisplayHeader.tsx +0 -170
  201. package/src/components/EntityIdentityBar.tsx +0 -428
  202. package/src/components/EntityInspector.tsx +0 -156
  203. package/src/components/EntityPreviewBinding.tsx +0 -432
  204. package/src/components/EntityPreviewNesting.tsx +0 -50
  205. package/src/components/EntityViewBinding.tsx +0 -374
  206. package/src/components/FieldCaption.tsx +0 -14
  207. package/src/components/HomePage/ContentHomePage.tsx +0 -586
  208. package/src/components/HomePage/FavouritesView.tsx +0 -60
  209. package/src/components/HomePage/HomePageDnD.tsx +0 -704
  210. package/src/components/HomePage/NavigationCard.tsx +0 -81
  211. package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
  212. package/src/components/HomePage/NavigationGroup.tsx +0 -156
  213. package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
  214. package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
  215. package/src/components/HomePage/index.tsx +0 -5
  216. package/src/components/InlineEntityPreview.tsx +0 -149
  217. package/src/components/JsonPreviewBinding.tsx +0 -66
  218. package/src/components/PropertyCollectionView.tsx +0 -336
  219. package/src/components/PropertyConfigBadge.tsx +0 -28
  220. package/src/components/PropertyIdCopyTooltip.tsx +0 -47
  221. package/src/components/RebaseAuthGate.tsx +0 -44
  222. package/src/components/RebaseCMS.tsx +0 -30
  223. package/src/components/RebaseLayout.tsx +0 -80
  224. package/src/components/RebaseNavigation.tsx +0 -369
  225. package/src/components/RebaseRouteDefs.tsx +0 -127
  226. package/src/components/RebaseShell.tsx +0 -83
  227. package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
  228. package/src/components/ReferenceWidget.tsx +0 -156
  229. package/src/components/RelationSelector.tsx +0 -926
  230. package/src/components/SearchIconsView.tsx +0 -78
  231. package/src/components/SelectableTable/SelectableTable.tsx +0 -309
  232. package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
  233. package/src/components/SelectableTable/SelectionStore.ts +0 -43
  234. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
  235. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
  236. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
  237. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
  238. package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
  239. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
  240. package/src/components/SelectableTable/filters/null_filter.ts +0 -63
  241. package/src/components/SideDialogs.tsx +0 -238
  242. package/src/components/SidePanelBinding.tsx +0 -361
  243. package/src/components/SidePanelProvider.tsx +0 -80
  244. package/src/components/UserSelector.tsx +0 -513
  245. package/src/components/admin/CreationResultDialog.tsx +0 -138
  246. package/src/components/admin/index.ts +0 -1
  247. package/src/components/app/AppBar.tsx +0 -17
  248. package/src/components/app/Drawer.tsx +0 -38
  249. package/src/components/app/Scaffold.tsx +0 -366
  250. package/src/components/app/index.ts +0 -4
  251. package/src/components/app/useApp.tsx +0 -36
  252. package/src/components/common/default_entity_actions.tsx +0 -440
  253. package/src/components/common/index.ts +0 -1
  254. package/src/components/field_configs.tsx +0 -506
  255. package/src/components/history/EntityHistoryEntry.tsx +0 -203
  256. package/src/components/history/EntityHistoryView.tsx +0 -206
  257. package/src/components/history/LastEditedByFormAction.tsx +0 -24
  258. package/src/components/history/LastEditedByIndicator.tsx +0 -95
  259. package/src/components/history/UserChip.tsx +0 -15
  260. package/src/components/history/index.tsx +0 -5
  261. package/src/components/index.ts +0 -63
  262. package/src/contexts/BreacrumbsContext.tsx +0 -45
  263. package/src/contexts/SideDialogsControllerContext.tsx +0 -5
  264. package/src/contexts/SidePanelControllerContext.tsx +0 -5
  265. package/src/data_export/export/BasicExportAction.tsx +0 -142
  266. package/src/data_export/export/ExportCollectionAction.tsx +0 -321
  267. package/src/data_export/export/export.ts +0 -295
  268. package/src/data_export/export/fetch_export_data.ts +0 -90
  269. package/src/data_export/export/index.ts +0 -4
  270. package/src/data_export/index.ts +0 -1
  271. package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
  272. package/src/data_import/components/ImportFileUpload.tsx +0 -42
  273. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
  274. package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
  275. package/src/data_import/components/index.ts +0 -4
  276. package/src/data_import/hooks/index.ts +0 -1
  277. package/src/data_import/hooks/useImportConfig.tsx +0 -34
  278. package/src/data_import/import/ImportCollectionAction.tsx +0 -461
  279. package/src/data_import/import/index.ts +0 -1
  280. package/src/data_import/index.ts +0 -5
  281. package/src/data_import/types/column_mapping.ts +0 -32
  282. package/src/data_import/types/index.ts +0 -1
  283. package/src/data_import/utils/csv.ts +0 -153
  284. package/src/data_import/utils/data.ts +0 -181
  285. package/src/data_import/utils/file_headers.ts +0 -14
  286. package/src/data_import/utils/file_to_json.ts +0 -149
  287. package/src/data_import/utils/get_import_inference_type.ts +0 -33
  288. package/src/data_import/utils/get_properties_mapping.ts +0 -67
  289. package/src/data_import/utils/index.ts +0 -5
  290. package/src/data_import/utils/save_entities.ts +0 -138
  291. package/src/data_import/utils/transforms.ts +0 -70
  292. package/src/editor/components/SlashCommandMenu.tsx +0 -532
  293. package/src/editor/components/editor-bubble-item.tsx +0 -32
  294. package/src/editor/components/editor-bubble.tsx +0 -143
  295. package/src/editor/components/image-bubble.tsx +0 -183
  296. package/src/editor/components/index.ts +0 -14
  297. package/src/editor/components/table-bubble.tsx +0 -233
  298. package/src/editor/editor.tsx +0 -529
  299. package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
  300. package/src/editor/extensions/Image.ts +0 -159
  301. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
  302. package/src/editor/extensions/clipboard.ts +0 -72
  303. package/src/editor/extensions/custom-keymap.ts +0 -25
  304. package/src/editor/extensions/drag-and-drop.tsx +0 -508
  305. package/src/editor/hooks/useProseMirror.ts +0 -126
  306. package/src/editor/hooks/useProseMirrorContext.ts +0 -15
  307. package/src/editor/index.ts +0 -2
  308. package/src/editor/markdown-it-plugins.d.ts +0 -24
  309. package/src/editor/markdown.ts +0 -204
  310. package/src/editor/nodeViews/ImageComponent.tsx +0 -20
  311. package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
  312. package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
  313. package/src/editor/nodeViews/index.ts +0 -35
  314. package/src/editor/plugins/index.ts +0 -58
  315. package/src/editor/plugins/inputrules.ts +0 -82
  316. package/src/editor/plugins/placeholderPlugin.ts +0 -55
  317. package/src/editor/plugins/slashCommandPlugin.ts +0 -65
  318. package/src/editor/schema.ts +0 -339
  319. package/src/editor/selectors/ai-selector.tsx +0 -110
  320. package/src/editor/selectors/color-selector.tsx +0 -199
  321. package/src/editor/selectors/link-selector.tsx +0 -122
  322. package/src/editor/selectors/node-selector.tsx +0 -159
  323. package/src/editor/selectors/text-buttons.tsx +0 -79
  324. package/src/editor/types.ts +0 -6
  325. package/src/editor/useProseMirror.ts +0 -125
  326. package/src/editor/utils/prosemirror-utils.ts +0 -113
  327. package/src/editor/utils/remove_classes.ts +0 -18
  328. package/src/editor/utils/useDebouncedCallback.ts +0 -25
  329. package/src/form/EntityForm.tsx +0 -761
  330. package/src/form/EntityFormActions.tsx +0 -160
  331. package/src/form/EntityFormBinding.tsx +0 -342
  332. package/src/form/PropertyFieldBinding.tsx +0 -348
  333. package/src/form/components/ErrorFocus.tsx +0 -44
  334. package/src/form/components/FieldBlock.tsx +0 -189
  335. package/src/form/components/FieldHelperText.tsx +0 -84
  336. package/src/form/components/FormRail.tsx +0 -153
  337. package/src/form/components/FormSections.tsx +0 -145
  338. package/src/form/components/LabelWithIcon.tsx +0 -43
  339. package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
  340. package/src/form/components/LocalChangesMenu.tsx +0 -147
  341. package/src/form/components/StorageItemPreview.tsx +0 -81
  342. package/src/form/components/StorageUploadProgress.tsx +0 -118
  343. package/src/form/components/index.tsx +0 -6
  344. package/src/form/components/useRailVisible.tsx +0 -47
  345. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
  346. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
  347. package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
  348. package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
  349. package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
  350. package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
  351. package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
  352. package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
  353. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
  354. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
  355. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
  356. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
  357. package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
  358. package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
  359. package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
  360. package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
  361. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
  362. package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
  363. package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
  364. package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
  365. package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
  366. package/src/form/form_utils.ts +0 -243
  367. package/src/form/index.tsx +0 -36
  368. package/src/form/useClearRestoreValue.tsx +0 -36
  369. package/src/form/useUndoableDiscard.ts +0 -39
  370. package/src/form/validation.ts +0 -583
  371. package/src/hooks/index.ts +0 -16
  372. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
  373. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
  374. package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
  375. package/src/hooks/navigation/contexts/index.ts +0 -14
  376. package/src/hooks/navigation/useAsyncResolver.ts +0 -100
  377. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
  378. package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
  379. package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
  380. package/src/hooks/navigation/useNavigationResolution.ts +0 -271
  381. package/src/hooks/navigation/useResolvedCollections.ts +0 -102
  382. package/src/hooks/navigation/useResolvedViews.tsx +0 -139
  383. package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
  384. package/src/hooks/navigation/utils.ts +0 -200
  385. package/src/hooks/useAdminContext.tsx +0 -83
  386. package/src/hooks/useBreadcrumbsController.tsx +0 -17
  387. package/src/hooks/useBuildSideDialogsController.tsx +0 -145
  388. package/src/hooks/useBuildSidePanel.tsx +0 -315
  389. package/src/hooks/useChildViewSource.ts +0 -46
  390. package/src/hooks/useEntityDisplay.tsx +0 -262
  391. package/src/hooks/useEntityDisplayTitle.tsx +0 -49
  392. package/src/hooks/useHistory.ts +0 -178
  393. package/src/hooks/useRecordActions.tsx +0 -69
  394. package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
  395. package/src/hooks/useResolvedUsers.ts +0 -148
  396. package/src/hooks/useSelectionDialog.tsx +0 -58
  397. package/src/hooks/useSideDialogsController.tsx +0 -25
  398. package/src/hooks/useSidePanel.tsx +0 -13
  399. package/src/index.ts +0 -124
  400. package/src/preview/PropertyPreview.tsx +0 -331
  401. package/src/preview/compact_text.ts +0 -68
  402. package/src/preview/components/ArrayEnumPreview.tsx +0 -39
  403. package/src/preview/components/BooleanPreview.tsx +0 -28
  404. package/src/preview/components/DatePreview.tsx +0 -106
  405. package/src/preview/components/EmptyValue.tsx +0 -10
  406. package/src/preview/components/EnumValuesChip.tsx +0 -39
  407. package/src/preview/components/ImagePreview.tsx +0 -144
  408. package/src/preview/components/InlineEntityListPreview.tsx +0 -42
  409. package/src/preview/components/ReferencePreview.tsx +0 -235
  410. package/src/preview/components/RelationPreview.tsx +0 -271
  411. package/src/preview/components/StorageThumbnail.tsx +0 -147
  412. package/src/preview/components/UrlComponentPreview.tsx +0 -116
  413. package/src/preview/components/UserPreview.tsx +0 -30
  414. package/src/preview/components/date_fns_locales.ts +0 -125
  415. package/src/preview/index.ts +0 -26
  416. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
  417. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
  418. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
  419. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
  420. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
  421. package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
  422. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
  423. package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
  424. package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
  425. package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
  426. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
  427. package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
  428. package/src/preview/util.ts +0 -39
  429. package/src/routes/CustomViewRoute.tsx +0 -33
  430. package/src/routes/RebaseRoute.tsx +0 -467
  431. package/src/routes/index.ts +0 -2
  432. package/src/types/components/EntityFormActionsProps.tsx +0 -20
  433. package/src/types/components/EntityFormProps.tsx +0 -119
  434. package/src/types/components/PropertyPreviewProps.tsx +0 -85
  435. package/src/types/components/formex.tsx +0 -2
  436. package/src/types/components/index.ts +0 -3
  437. package/src/types/fields.tsx +0 -340
  438. package/src/types/index.ts +0 -4
  439. package/src/util/dataControllerAdapter.ts +0 -88
  440. package/src/util/entity_actions.ts +0 -28
  441. package/src/util/index.ts +0 -5
  442. package/src/util/navigation_utils.ts +0 -89
  443. package/src/util/number_format.ts +0 -46
  444. package/src/util/previews.ts +0 -131
  445. package/src/util/propertyConfigMapper.ts +0 -134
  446. package/src/util/property_utils.tsx +0 -236
  447. package/src/util/resolutions.ts +0 -96
  448. package/src/util/view_constants.ts +0 -33
  449. package/src/util/view_mode.ts +0 -176
@@ -1,190 +0,0 @@
1
- import React, { Suspense } from "react";
2
- import {
3
- ArrayProperty,
4
- Property,
5
- ReferenceProperty,
6
- RelationProperty,
7
- WhereFilterOp
8
- } from "@rebasepro/types";
9
- import {
10
- FilterFieldBindingProps
11
- } from "@rebasepro/cms-types";
12
- import { enumToObjectEntries } from "@rebasepro/common";
13
- import { resolveFilterOperators } from "@rebasepro/app";
14
- import { useCollectionScope, useComponentOverride, useResolvedComponent } from "@rebasepro/app";
15
- import { StringNumberFilterField } from "./StringNumberFilterField";
16
- import { BooleanFilterField } from "./BooleanFilterField";
17
- import { DateTimeFilterField } from "./DateTimeFilterField";
18
- import { ReferenceFilterField } from "./ReferenceFilterField";
19
- import { RelationFilterField } from "./RelationFilterField";
20
-
21
- export interface FilterFieldBindingInput {
22
- /** Key of the property being filtered (the column id). */
23
- propertyKey: string;
24
- /** The raw property — array properties are unwrapped internally. */
25
- property: Property;
26
- /**
27
- * Engine backing the collection (`collection.engine`). Drives which
28
- * operators the engine can execute. Usually omitted — it is read from
29
- * the surrounding {@link CollectionScopeProvider}; pass it explicitly
30
- * only when rendering outside any collection scope.
31
- */
32
- engine?: string;
33
- value?: [WhereFilterOp, unknown];
34
- setValue: (value?: [WhereFilterOp, unknown]) => void;
35
- /** Coordination flags for fields that open their own dialogs. */
36
- hidden?: boolean;
37
- setHidden?: (hidden: boolean) => void;
38
- }
39
-
40
- /**
41
- * The single entry point for rendering a collection filter field.
42
- * Used by both the table header filters ({@link SelectableTable}) and the
43
- * Filters dialog.
44
- *
45
- * Resolution order:
46
- * 1. `property.admin.Filter` — per-property replacement (rendered even when the
47
- * resolved operator list is empty; the component owns filterability).
48
- * 2. `components["Collection.FilterField"]` — collection-level or app-level
49
- * override (wrap mode supported via `OriginalComponent`).
50
- * 3. Built-in field dispatched by property type.
51
- *
52
- * The operators handed to the field are the intersection of the engine's
53
- * capabilities, the property-type defaults, and `property.admin.filterOperators`
54
- * (see `resolveFilterOperators`). When that intersection is empty and no
55
- * per-property `Filter` is set, nothing is rendered.
56
- *
57
- * @group Components
58
- */
59
- export function FilterFieldBinding({
60
- propertyKey,
61
- property,
62
- engine,
63
- value,
64
- setValue,
65
- hidden,
66
- setHidden
67
- }: FilterFieldBindingInput): React.ReactNode {
68
-
69
- const isArray = property.type === "array";
70
- const ofVal = isArray ? (property as ArrayProperty).of : undefined;
71
- const baseProperty: Property | undefined = isArray
72
- ? (Array.isArray(ofVal) ? ofVal[0] : ofVal) as Property | undefined
73
- : property;
74
-
75
- // Hooks must run unconditionally — before any early return.
76
- const scopeCollection = useCollectionScope();
77
- const ResolvedFilterField = useComponentOverride<FilterFieldBindingProps>("Collection.FilterField", DefaultFilterField);
78
- const PropertyFilter = useResolvedComponent<FilterFieldBindingProps>(baseProperty?.admin?.Filter);
79
-
80
- if (!baseProperty) return null;
81
-
82
- const operators = resolveFilterOperators({
83
- property: baseProperty,
84
- isArray,
85
- engine: engine ?? scopeCollection?.engine
86
- });
87
-
88
- const bindingProps: FilterFieldBindingProps = {
89
- propertyKey,
90
- property: baseProperty,
91
- isArray,
92
- operators,
93
- value,
94
- setValue,
95
- title: property.name,
96
- hidden,
97
- setHidden
98
- };
99
-
100
- // 1. Per-property replacement — always rendered, the dev owns filterability.
101
- if (PropertyFilter) {
102
- return (
103
- <Suspense fallback={null}>
104
- <PropertyFilter {...bindingProps}/>
105
- </Suspense>
106
- );
107
- }
108
-
109
- // 2/3. Override or built-in — only when the property is filterable here.
110
- if (operators.length === 0) return null;
111
-
112
- return <ResolvedFilterField {...bindingProps}/>;
113
- }
114
-
115
- /**
116
- * Built-in filter field dispatch by property type. This is the
117
- * `OriginalComponent` received by `"Collection.FilterField"` overrides in
118
- * wrap mode.
119
- */
120
- function DefaultFilterField({
121
- propertyKey,
122
- property,
123
- isArray,
124
- operators,
125
- value,
126
- setValue,
127
- title,
128
- hidden,
129
- setHidden
130
- }: FilterFieldBindingProps): React.ReactNode {
131
-
132
- if (property.type === "reference") {
133
- const referenceProperty = property as ReferenceProperty;
134
- return <ReferenceFilterField value={value}
135
- setValue={setValue}
136
- name={propertyKey}
137
- isArray={isArray}
138
- operators={operators}
139
- path={referenceProperty.path}
140
- title={title}
141
- includeId={referenceProperty.admin?.includeId}
142
- previewProperties={referenceProperty.admin?.previewProperties}
143
- hidden={hidden ?? false}
144
- setHidden={setHidden ?? (() => undefined)}/>;
145
- }
146
-
147
- if (property.type === "relation") {
148
- const relation = (property as RelationProperty).relation;
149
- if (!relation) return null;
150
- return <RelationFilterField value={value as never}
151
- setValue={setValue}
152
- name={propertyKey}
153
- operators={operators}
154
- relation={relation}
155
- hidden={hidden ?? false}
156
- setHidden={setHidden ?? (() => undefined)}/>;
157
- }
158
-
159
- if (property.type === "number" || property.type === "string") {
160
- const enumValues = property.enum ? enumToObjectEntries(property.enum) : undefined;
161
- return <StringNumberFilterField value={value}
162
- setValue={setValue}
163
- name={propertyKey}
164
- type={property.type}
165
- isArray={isArray}
166
- operators={operators}
167
- enumValues={enumValues}
168
- title={title}/>;
169
- }
170
-
171
- if (property.type === "boolean") {
172
- return <BooleanFilterField value={value}
173
- setValue={setValue}
174
- name={propertyKey}
175
- operators={operators}
176
- title={title}/>;
177
- }
178
-
179
- if (property.type === "date") {
180
- return <DateTimeFilterField value={value}
181
- setValue={setValue}
182
- name={propertyKey}
183
- mode={property.mode}
184
- isArray={isArray}
185
- operators={operators}
186
- title={title}/>;
187
- }
188
-
189
- return null;
190
- }
@@ -1,250 +0,0 @@
1
- import { useSelectionDialog } from "../../../hooks/useSelectionDialog";
2
-
3
- import React, { useId, useMemo, useState } from "react";
4
- import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
5
- import { Entity, EntityReference } from "@rebasepro/types";
6
- import { ReferencePreview } from "../../../preview";
7
- import { Button, Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
8
- import { getReferenceFrom } from "@rebasepro/common";
9
- import { useTranslation } from "@rebasepro/app";
10
- import { useCollectionRegistryController } from "../../../hooks/navigation/contexts/CollectionRegistryContext";
11
- import type { AdminCollection } from "@rebasepro/cms-types";
12
- import { isNullFilterOperator, nullFilterOperatorFor, valueOperatorFor } from "./null_filter";
13
-
14
- interface ReferenceFilterFieldProps {
15
- name: string,
16
- value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];
17
- setValue: (filterValue?: [VirtualTableWhereFilterOp, unknown]) => void;
18
- isArray?: boolean;
19
- path?: string;
20
- title?: string;
21
- includeId?: boolean;
22
- previewProperties?: string[];
23
- hidden: boolean;
24
- setHidden: (hidden: boolean) => void;
25
- /**
26
- * Restrict the offered operators (already resolved against engine
27
- * capabilities and property config). When omitted, all operators this
28
- * field can render are offered.
29
- */
30
- operators?: readonly VirtualTableWhereFilterOp[];
31
- }
32
-
33
- const operationLabels = {
34
- "==": "==",
35
- "!=": "!=",
36
- ">": ">",
37
- "<": "<",
38
- ">=": ">=",
39
- "<=": "<=",
40
- in: "In",
41
- "not-in": "Not in",
42
- "array-contains": "Contains",
43
- "array-contains-any": "Contains Any",
44
- "is-null": "Is null",
45
- "is-not-null": "Is not null"
46
- };
47
-
48
- const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
49
-
50
- export function ReferenceFilterField({
51
- value,
52
- setValue,
53
- isArray,
54
- path,
55
- includeId = true,
56
- previewProperties,
57
- setHidden,
58
- operators
59
- }: ReferenceFilterFieldProps) {
60
- const { t } = useTranslation();
61
-
62
- let possibleOperations: (keyof typeof operationLabels)[] = isArray
63
- ? ["array-contains"]
64
- : ["==", "!=", ">", "<", ">=", "<="];
65
-
66
- if (isArray) {
67
- possibleOperations.push("array-contains-any");
68
- } else {
69
- possibleOperations.push("in", "not-in");
70
- }
71
-
72
- // The null checks take no operand, so they apply either way.
73
- possibleOperations.push("is-null", "is-not-null");
74
-
75
- if (operators) {
76
- possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
77
- }
78
-
79
- const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
80
- const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
81
- const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue as EntityReference | EntityReference[] | undefined | null);
82
-
83
- const selectedEntityIds = internalValue
84
- ? (Array.isArray(internalValue) ? internalValue.map((ref) => {
85
- if (!(ref?.isEntityReference && ref?.isEntityReference())) {
86
- return null;
87
- }
88
- return ref.id;
89
- }).filter(Boolean) as string[] : [internalValue.id])
90
- : [];
91
-
92
- function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {
93
-
94
- const prevOpIsArray = multipleSelectOperations.includes(operation);
95
- const newOpIsArray = multipleSelectOperations.includes(op);
96
- let newValue = val;
97
- if (prevOpIsArray !== newOpIsArray) {
98
- newValue = newOpIsArray
99
- ? (newValue && !Array.isArray(newValue) && newValue.isEntityReference?.() ? [newValue] : [])
100
- : undefined;
101
- }
102
-
103
- setOperation(op);
104
- setInternalValue(newValue);
105
-
106
- // A null check takes no operand, so it is complete on its own — the
107
- // value gate below would otherwise clear the filter the moment one is
108
- // chosen from the dropdown, where there is no value to accompany it.
109
- if (isNullFilterOperator(op)) {
110
- setValue([op, null]);
111
- return;
112
- }
113
-
114
- const hasNewValue = newValue !== null && Array.isArray(newValue)
115
- ? newValue.length > 0
116
- : newValue !== undefined;
117
- if (op && hasNewValue) {
118
- setValue(
119
- [op, newValue]
120
- );
121
- } else {
122
- setValue(
123
- undefined
124
- );
125
- }
126
- }
127
-
128
- const collectionRegistryController = useCollectionRegistryController();
129
- const collection: AdminCollection | undefined = useMemo(() => {
130
- return path ? collectionRegistryController.getCollection(path) : undefined;
131
- }, [path]);
132
-
133
- const onSingleEntitySelected = (entity: Entity<Record<string, unknown>>) => {
134
- updateFilter(operation, getReferenceFrom(entity));
135
- };
136
-
137
- const onMultipleEntitiesSelected = (entities: Entity<Record<string, unknown>>[]) => {
138
- updateFilter(operation, entities.map(e => getReferenceFrom(e)));
139
- };
140
-
141
- const multiple = multipleSelectOperations.includes(operation);
142
- const nullFiltered = isNullFilterOperator(operation);
143
-
144
- // The filters dialog renders every filterable property at once, and this
145
- // id was the literal string "null-filter" — so clicking any label toggled
146
- // whichever checkbox the document matched first, never the one clicked.
147
- const nullFilterId = useId();
148
-
149
- const referenceDialogController = useSelectionDialog({
150
- multiselect: multiple,
151
- path,
152
- collection,
153
- onSingleEntitySelected,
154
- onMultipleEntitiesSelected,
155
- selectedEntityIds,
156
- onClose: () => {
157
- setHidden(false);
158
- }
159
- }
160
- );
161
-
162
- const doOpenDialog = () => {
163
- setHidden(true);
164
- referenceDialogController.open();
165
- };
166
-
167
- const buildEntry = (reference: EntityReference) => {
168
- return (
169
- <ReferencePreview
170
- disabled={!path}
171
- previewProperties={previewProperties}
172
- size={"medium"}
173
- onClick={doOpenDialog}
174
- reference={reference}
175
- hover={true}
176
- includeId={includeId}
177
- includeEntityLink={false}
178
- />
179
- );
180
- };
181
-
182
- // All renderable operators were filtered out (engine/property narrowing).
183
- if (possibleOperations.length === 0) return null;
184
-
185
- return (
186
-
187
- <div className="flex w-full flex-row">
188
- <div className="w-[100px]">
189
- <Select value={operation}
190
- size={"medium"}
191
- fullWidth={true}
192
- onValueChange={(value) => {
193
- updateFilter(value as VirtualTableWhereFilterOp, internalValue);
194
- }}
195
- renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
196
- {possibleOperations.map((op) => (
197
- <SelectItem key={op} value={op}>
198
- {operationLabels[op]}
199
- </SelectItem>
200
- ))}
201
- </Select>
202
- </div>
203
-
204
- <div className="grow ml-2 h-full gap-2 flex flex-col">
205
-
206
- {internalValue && Array.isArray(internalValue) && <div>
207
- {internalValue.map((ref, index) => buildEntry(ref))}
208
- </div>}
209
-
210
- {internalValue && !Array.isArray(internalValue) && <div>
211
- {buildEntry(internalValue)}
212
- </div>}
213
-
214
- {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&
215
- <Button onClick={doOpenDialog}
216
-
217
- size={"medium"}
218
- className="h-full w-full">
219
- {multiple ? t("select_references") : t("select_reference")}
220
- </Button>
221
- }
222
-
223
- {/*
224
- * Switches the operator to the matching null check rather
225
- * than pairing a null value with whatever operator is
226
- * selected. Only the operator travels to the driver, and a
227
- * null *operand* means different things to different ones —
228
- * Mongo rejects `$in: null` outright. See
229
- * `nullFilterOperatorFor`.
230
- */}
231
- {!isArray && <Label
232
- 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"
233
- htmlFor={nullFilterId}
234
- >
235
- <Checkbox id={nullFilterId}
236
- checked={nullFiltered}
237
- size={"small"}
238
- onCheckedChange={() => {
239
- if (!nullFiltered) updateFilter(nullFilterOperatorFor(operation), null);
240
- else updateFilter(valueOperatorFor(operation, possibleOperations) ?? operation, undefined);
241
- }}/>
242
- {t("filter_for_null_values")}
243
- </Label>}
244
-
245
- </div>
246
-
247
- </div>
248
- );
249
-
250
- }
@@ -1,238 +0,0 @@
1
- import React, { useId, useMemo, useState } from "react";
2
- import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
3
- import { EntityRelation, Relation } from "@rebasepro/types";
4
- import { Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
5
- import { RelationSelector } from "../../RelationSelector";
6
- import { isNullFilterOperator, nullFilterOperatorFor, valueOperatorFor } from "./null_filter";
7
-
8
- /** Whether an authored relation yields many rows. Derived from its kind. */
9
- function relationCardinality(relation: { kind?: string; cardinality?: string } | undefined): "one" | "many" | undefined {
10
- if (!relation) return undefined;
11
- if (relation.kind === "via") return relation.cardinality as "one" | "many" | undefined;
12
- if (relation.kind === "hasMany" || relation.kind === "manyToMany") return "many";
13
- if (relation.kind === "belongsTo" || relation.kind === "hasOne") return "one";
14
- return relation.cardinality as "one" | "many" | undefined;
15
- }
16
-
17
-
18
- interface RelationFilterFieldProps {
19
- name: string,
20
- value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null];
21
- setValue: (value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null]) => void;
22
- relation: Relation; // relation config provided externally
23
- hidden: boolean;
24
- setHidden: (value: boolean) => void;
25
- /**
26
- * Restrict the offered operators (already resolved against engine
27
- * capabilities and property config). When omitted, all operators this
28
- * field can render are offered.
29
- */
30
- operators?: readonly VirtualTableWhereFilterOp[];
31
- }
32
-
33
- const operationLabels = {
34
- "==": "==",
35
- "!=": "!=",
36
- ">": ">",
37
- "<": "<",
38
- ">=": ">=",
39
- "<=": "<=",
40
- in: "In",
41
- "not-in": "Not in",
42
- "array-contains": "Contains",
43
- "array-contains-any": "Contains Any",
44
- "is-null": "Is empty",
45
- "is-not-null": "Is not empty"
46
- };
47
-
48
- const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
49
-
50
- /**
51
- * What this field can render, before `operators` narrows it.
52
- *
53
- * Every relation gets the whole set. The value selector is told how many
54
- * values to take by the *operator* — see the `multiple` prop passed below —
55
- * so a to-many relation can be asked `== <one tag>` as readily as
56
- * `in <several>`, and the question of what shape the relation stores never
57
- * enters into it.
58
- *
59
- * That is a change: this list used to be split by the value the selector
60
- * produced, because the selector took its multiplicity from the relation's
61
- * cardinality and so a to-many one could only ever emit a list. Every
62
- * single-value operator had to be withheld to keep an array from reaching
63
- * `==`. `ReferenceFilterField` never had the problem — it has always sized its
64
- * dialog from the operator — which is what made the split look like a
65
- * property of relations rather than a limitation of one component.
66
- *
67
- * The array operators are the exception, and belong only to a to-many link,
68
- * which is the only one that *is* a list. On a to-one relation the filter
69
- * compiles to a comparison on a scalar foreign key, and `@>` against one is a
70
- * type error rather than an empty result.
71
- */
72
- const RELATION_OPERATIONS: (keyof typeof operationLabels)[] =
73
- ["==", "!=", ">", "<", ">=", "<=", "in", "not-in", "is-null", "is-not-null"];
74
- const LIST_ONLY_OPERATIONS: (keyof typeof operationLabels)[] =
75
- ["array-contains", "array-contains-any"];
76
-
77
- /**
78
- * The operators this field will actually put on screen.
79
- *
80
- * Exported because the failure mode is silence: when the intersection of what
81
- * the field can render and what the engine can run comes out empty, the field
82
- * returns null and the filter control the table header offered opens onto
83
- * nothing. That is a rendering outcome no unit test of either side alone
84
- * catches, so the intersection itself is the thing worth pinning.
85
- */
86
- export function renderableRelationOperators(
87
- relation: { kind?: string; cardinality?: string } | undefined,
88
- operators?: readonly VirtualTableWhereFilterOp[]
89
- ): (keyof typeof operationLabels)[] {
90
- const possible = relationCardinality(relation) === "many"
91
- ? [...RELATION_OPERATIONS, ...LIST_ONLY_OPERATIONS]
92
- : RELATION_OPERATIONS;
93
- if (!operators) return possible;
94
- return possible.filter(op => (operators as readonly string[]).includes(op));
95
- }
96
-
97
- export function RelationFilterField({
98
- value,
99
- setValue,
100
- relation,
101
- name: _name,
102
- hidden: _hidden,
103
- setHidden: _setHidden,
104
- operators
105
- }: RelationFilterFieldProps) {
106
-
107
- const manyRelation = relationCardinality(relation) === "many";
108
-
109
- // The filters dialog renders every filterable property at once, and the
110
- // checkbox's id was the literal string "null-filter" — so clicking any
111
- // label toggled whichever checkbox the document matched first. Harmless
112
- // while one relation per table could show it; not once every relation can.
113
- const nullFilterId = useId();
114
-
115
- const possibleOperations = renderableRelationOperators(relation, operators);
116
-
117
- const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
118
- const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
119
- const [internalValue, setInternalValue] = useState<EntityRelation | EntityRelation[] | undefined | null>(fieldValue);
120
-
121
- function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityRelation | EntityRelation[] | null) {
122
-
123
- const prevOpIsArray = multipleSelectOperations.includes(operation);
124
- const newOpIsArray = multipleSelectOperations.includes(op);
125
- let newValue = val;
126
- if (prevOpIsArray !== newOpIsArray) {
127
- newValue = newOpIsArray ? (newValue instanceof EntityRelation ? [newValue] : []) : undefined;
128
- }
129
-
130
- setOperation(op);
131
- setInternalValue(newValue);
132
-
133
- // A null check takes no operand, so it is complete on its own — the
134
- // value gate below would otherwise clear the filter the moment one is
135
- // chosen from the dropdown, where there is no value to accompany it.
136
- if (isNullFilterOperator(op)) {
137
- setValue([op, null]);
138
- return;
139
- }
140
-
141
- const hasNewValue = newValue !== null && Array.isArray(newValue)
142
- ? newValue.length > 0
143
- : newValue !== undefined;
144
- if (op && hasNewValue) {
145
- setValue([op, newValue ?? null]);
146
- } else {
147
- setValue(undefined);
148
- }
149
- }
150
-
151
- const multiple = multipleSelectOperations.includes(operation);
152
- const nullFiltered = isNullFilterOperator(operation);
153
-
154
- const relationSelectorValue = useMemo(() => {
155
- if (internalValue === null || internalValue === undefined) return undefined;
156
- if (Array.isArray(internalValue)) return internalValue.map(ref => new EntityRelation(ref.id, ref.path));
157
- return new EntityRelation(internalValue.id, internalValue.path);
158
- }, [internalValue]);
159
-
160
- const handleRelationSelectorChange = (newVal?: EntityRelation | EntityRelation[] | null) => {
161
- if (newVal === null) {
162
- updateFilter(operation, null);
163
- return;
164
- }
165
- if (newVal === undefined) {
166
- updateFilter(operation, undefined);
167
- return;
168
- }
169
- updateFilter(operation, newVal);
170
- };
171
-
172
- // All renderable operators were filtered out (engine/property narrowing).
173
- if (possibleOperations.length === 0) return null;
174
-
175
- return (
176
- <div className="flex flex-row">
177
- <div className="">
178
- <Select
179
- value={operation}
180
- fullWidth={true}
181
- onValueChange={(newOp) => {
182
- updateFilter(newOp as VirtualTableWhereFilterOp, internalValue);
183
- }}
184
- renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}
185
- >
186
- {possibleOperations.map((op) => (
187
- <SelectItem key={op} value={op}>
188
- {operationLabels[op]}
189
- </SelectItem>
190
- ))}
191
- </Select>
192
- </div>
193
-
194
- <div className="grow ml-2 h-full gap-2 flex flex-col w-[340px]">
195
- <RelationSelector
196
- relation={relation}
197
- // The operator, not the relation, decides how many values
198
- // are being asked for — `updateFilter` already coerces the
199
- // held value on the same test, so the two cannot disagree.
200
- multiple={multiple}
201
- value={relationSelectorValue}
202
- onValueChange={handleRelationSelectorChange}
203
- disabled={nullFiltered}
204
- size={"medium"}
205
- />
206
-
207
- {/*
208
- * Shown for a to-many relation too. It used to be hidden
209
- * there because the only operators offered were the array
210
- * ones, which have no null to ask about — but "posts with no
211
- * tags" is the question a filter on a link is most often
212
- * for, and the driver answers it with `NOT EXISTS`.
213
- *
214
- * It switches the operator to the matching null check rather
215
- * than pairing a null value with whatever operator is
216
- * selected. Only the operator travels to the driver, and
217
- * `is-null` is a thing every engine implements; a null
218
- * *operand* is not — see `nullFilterOperatorFor`.
219
- */}
220
- <Label
221
- 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"
222
- htmlFor={nullFilterId}
223
- >
224
- <Checkbox
225
- id={nullFilterId}
226
- checked={nullFiltered}
227
- size={"small"}
228
- onCheckedChange={() => {
229
- if (!nullFiltered) updateFilter(nullFilterOperatorFor(operation), null);
230
- else updateFilter(valueOperatorFor(operation, possibleOperations) ?? operation, undefined);
231
- }}
232
- />
233
- {manyRelation ? "Filter for empty relations" : "Filter for null values"}
234
- </Label>
235
- </div>
236
- </div>
237
- );
238
- }