@firecms/core 3.0.0-canary.24 → 3.0.0-canary.241

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 (387) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +34 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +30 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +20 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +8 -5
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  28. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  29. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  30. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  31. package/dist/components/ReferenceWidget.d.ts +3 -1
  32. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  33. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  34. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  36. package/dist/components/VirtualTable/types.d.ts +3 -3
  37. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  38. package/dist/components/common/index.d.ts +2 -1
  39. package/dist/components/common/table_height.d.ts +5 -0
  40. package/dist/components/common/types.d.ts +4 -6
  41. package/dist/components/common/useColumnsIds.d.ts +3 -1
  42. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  43. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  44. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  45. package/dist/components/index.d.ts +5 -2
  46. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  47. package/dist/core/DefaultAppBar.d.ts +29 -0
  48. package/dist/core/DefaultDrawer.d.ts +19 -0
  49. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  50. package/dist/core/EntityEditView.d.ts +40 -11
  51. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  52. package/dist/core/FireCMS.d.ts +3 -3
  53. package/dist/core/FireCMSRouter.d.ts +4 -0
  54. package/dist/core/NavigationRoutes.d.ts +2 -3
  55. package/dist/core/SideDialogs.d.ts +4 -2
  56. package/dist/core/index.d.ts +4 -4
  57. package/dist/form/EntityForm.d.ts +36 -64
  58. package/dist/form/EntityFormActions.d.ts +17 -0
  59. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  60. package/dist/form/components/ErrorFocus.d.ts +1 -1
  61. package/dist/form/components/FieldHelperText.d.ts +3 -3
  62. package/dist/form/components/FormEntry.d.ts +6 -0
  63. package/dist/form/components/FormLayout.d.ts +5 -0
  64. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  65. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  66. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  67. package/dist/form/components/index.d.ts +3 -1
  68. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  74. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  75. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  77. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  80. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  81. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  82. package/dist/form/index.d.ts +16 -18
  83. package/dist/form/useClearRestoreValue.d.ts +2 -2
  84. package/dist/hooks/data/delete.d.ts +4 -4
  85. package/dist/hooks/data/save.d.ts +4 -5
  86. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  87. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/useAuthController.d.ts +1 -1
  90. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  91. package/dist/hooks/useBuildNavigationController.d.ts +7 -12
  92. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  93. package/dist/hooks/useModeController.d.ts +1 -2
  94. package/dist/hooks/useProjectLog.d.ts +8 -2
  95. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  96. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.es.js +21578 -13895
  99. package/dist/index.es.js.map +1 -1
  100. package/dist/index.umd.js +24366 -588
  101. package/dist/index.umd.js.map +1 -1
  102. package/dist/internal/useBuildDataSource.d.ts +3 -17
  103. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  104. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  105. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  106. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  107. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  108. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  109. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  110. package/dist/preview/util.d.ts +3 -3
  111. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  112. package/dist/routes/FireCMSRoute.d.ts +1 -0
  113. package/dist/routes/HomePageRoute.d.ts +3 -0
  114. package/dist/types/auth.d.ts +8 -10
  115. package/dist/types/collections.d.ts +97 -23
  116. package/dist/types/datasource.d.ts +52 -36
  117. package/dist/types/dialogs_controller.d.ts +7 -3
  118. package/dist/types/entities.d.ts +7 -2
  119. package/dist/types/entity_actions.d.ts +28 -4
  120. package/dist/types/entity_callbacks.d.ts +16 -16
  121. package/dist/types/entity_overrides.d.ts +2 -2
  122. package/dist/types/export_import.d.ts +4 -4
  123. package/dist/types/fields.d.ts +74 -42
  124. package/dist/types/firecms.d.ts +8 -3
  125. package/dist/types/firecms_context.d.ts +1 -1
  126. package/dist/types/index.d.ts +0 -1
  127. package/dist/types/navigation.d.ts +41 -14
  128. package/dist/types/permissions.d.ts +4 -4
  129. package/dist/types/plugins.d.ts +36 -12
  130. package/dist/types/properties.d.ts +73 -24
  131. package/dist/types/property_config.d.ts +0 -2
  132. package/dist/types/side_dialogs_controller.d.ts +10 -0
  133. package/dist/types/side_entity_controller.d.ts +10 -1
  134. package/dist/types/storage.d.ts +86 -3
  135. package/dist/types/user.d.ts +1 -0
  136. package/dist/util/builders.d.ts +3 -3
  137. package/dist/util/callbacks.d.ts +2 -0
  138. package/dist/util/createFormexStub.d.ts +2 -0
  139. package/dist/util/entities.d.ts +3 -3
  140. package/dist/util/entity_actions.d.ts +2 -0
  141. package/dist/util/entity_cache.d.ts +23 -0
  142. package/dist/util/icon_list.d.ts +5 -1
  143. package/dist/util/icon_synonyms.d.ts +1 -98
  144. package/dist/util/icons.d.ts +6 -3
  145. package/dist/util/index.d.ts +3 -0
  146. package/dist/util/navigation_from_path.d.ts +6 -1
  147. package/dist/util/navigation_utils.d.ts +15 -3
  148. package/dist/util/objects.d.ts +2 -1
  149. package/dist/util/permissions.d.ts +4 -4
  150. package/dist/util/plurals.d.ts +0 -2
  151. package/dist/util/property_utils.d.ts +4 -4
  152. package/dist/util/references.d.ts +2 -2
  153. package/dist/util/resolutions.d.ts +41 -17
  154. package/dist/util/storage.d.ts +23 -2
  155. package/dist/util/useStorageUploadController.d.ts +3 -3
  156. package/package.json +62 -48
  157. package/src/app/AppBar.tsx +18 -0
  158. package/src/app/Drawer.tsx +24 -0
  159. package/src/app/Scaffold.tsx +253 -0
  160. package/src/app/index.ts +4 -0
  161. package/src/app/useApp.tsx +32 -0
  162. package/src/components/ArrayContainer.tsx +149 -46
  163. package/src/components/CircularProgressCenter.tsx +2 -2
  164. package/src/components/ClearFilterSortButton.tsx +41 -0
  165. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +11 -11
  166. package/src/components/DeleteEntityDialog.tsx +13 -20
  167. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -40
  168. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  169. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  170. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +48 -40
  171. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  172. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  173. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  174. package/src/components/EntityCollectionTable/index.tsx +1 -1
  175. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +32 -37
  176. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  177. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  178. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +84 -80
  179. package/src/components/EntityCollectionView/EntityCollectionView.tsx +229 -117
  180. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  181. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  182. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  183. package/src/components/EntityCollectionView/utils.ts +19 -0
  184. package/src/components/EntityJsonPreview.tsx +66 -0
  185. package/src/components/EntityPreview.tsx +80 -59
  186. package/src/components/EntityView.tsx +13 -10
  187. package/src/components/ErrorView.tsx +4 -4
  188. package/src/components/HomePage/DefaultHomePage.tsx +27 -20
  189. package/src/components/HomePage/FavouritesView.tsx +6 -11
  190. package/src/components/HomePage/NavigationCard.tsx +3 -3
  191. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  192. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  193. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  194. package/src/components/NotFoundPage.tsx +2 -2
  195. package/src/components/PropertyConfigBadge.tsx +9 -3
  196. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  197. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +21 -13
  198. package/src/components/ReferenceWidget.tsx +21 -11
  199. package/src/components/SearchIconsView.tsx +10 -7
  200. package/src/components/SelectableTable/SelectableTable.tsx +157 -145
  201. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  202. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  203. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  204. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  205. package/src/components/UnsavedChangesDialog.tsx +42 -0
  206. package/src/components/VirtualTable/VirtualTable.tsx +130 -51
  207. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  208. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  209. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  210. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  211. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  212. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  213. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  214. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  215. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  216. package/src/components/VirtualTable/types.tsx +2 -3
  217. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +44 -40
  218. package/src/components/common/index.ts +2 -1
  219. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  220. package/src/components/common/types.tsx +4 -6
  221. package/src/components/common/useColumnsIds.tsx +24 -3
  222. package/src/components/common/useDataSourceTableController.tsx +420 -0
  223. package/src/components/common/useDebouncedCallback.tsx +20 -0
  224. package/src/components/common/useScrollRestoration.tsx +68 -0
  225. package/src/components/common/useTableSearchHelper.ts +53 -12
  226. package/src/components/index.tsx +6 -2
  227. package/src/contexts/BreacrumbsContext.tsx +38 -0
  228. package/src/contexts/DialogsProvider.tsx +5 -4
  229. package/src/contexts/ModeController.tsx +1 -3
  230. package/src/contexts/SnackbarProvider.tsx +2 -0
  231. package/src/core/DefaultAppBar.tsx +219 -0
  232. package/src/core/DefaultDrawer.tsx +185 -0
  233. package/src/core/DrawerNavigationItem.tsx +66 -0
  234. package/src/core/EntityEditView.tsx +406 -478
  235. package/src/core/EntityEditViewFormActions.tsx +199 -0
  236. package/src/core/EntitySidePanel.tsx +95 -19
  237. package/src/core/FireCMS.tsx +72 -58
  238. package/src/core/FireCMSRouter.tsx +17 -0
  239. package/src/core/NavigationRoutes.tsx +28 -38
  240. package/src/core/SideDialogs.tsx +22 -12
  241. package/src/core/field_configs.tsx +11 -12
  242. package/src/core/index.tsx +6 -5
  243. package/src/form/EntityForm.tsx +589 -535
  244. package/src/form/EntityFormActions.tsx +169 -0
  245. package/src/form/PropertyFieldBinding.tsx +89 -45
  246. package/src/form/components/CustomIdField.tsx +6 -2
  247. package/src/form/components/FieldHelperText.tsx +4 -4
  248. package/src/form/components/FormEntry.tsx +22 -0
  249. package/src/form/components/FormLayout.tsx +16 -0
  250. package/src/form/components/LabelWithIcon.tsx +30 -19
  251. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  252. package/src/form/components/StorageItemPreview.tsx +22 -12
  253. package/src/form/components/StorageUploadProgress.tsx +4 -5
  254. package/src/form/components/index.tsx +3 -1
  255. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  256. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +48 -35
  257. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  258. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  259. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  260. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  261. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +157 -0
  262. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  263. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  264. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  265. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  266. package/src/form/field_bindings/SelectFieldBinding.tsx +23 -15
  267. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -52
  268. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  269. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  270. package/src/form/index.tsx +16 -37
  271. package/src/form/useClearRestoreValue.tsx +2 -2
  272. package/src/form/validation.ts +13 -23
  273. package/src/hooks/data/delete.ts +6 -5
  274. package/src/hooks/data/save.ts +32 -33
  275. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  276. package/src/hooks/data/useDataSource.tsx +11 -3
  277. package/src/hooks/data/useEntityFetch.tsx +10 -6
  278. package/src/hooks/index.tsx +1 -0
  279. package/src/hooks/useAuthController.tsx +1 -1
  280. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  281. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  282. package/src/hooks/useBuildModeController.tsx +22 -29
  283. package/src/hooks/useBuildNavigationController.tsx +194 -68
  284. package/src/hooks/useFireCMSContext.tsx +3 -33
  285. package/src/hooks/useLargeLayout.tsx +0 -35
  286. package/src/hooks/useModeController.tsx +1 -2
  287. package/src/hooks/useProjectLog.tsx +32 -10
  288. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  289. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  290. package/src/index.ts +1 -0
  291. package/src/internal/useBuildDataSource.ts +79 -85
  292. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  293. package/src/internal/useBuildSideEntityController.tsx +201 -75
  294. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  295. package/src/preview/PropertyPreview.tsx +20 -25
  296. package/src/preview/PropertyPreviewProps.tsx +7 -1
  297. package/src/preview/components/BooleanPreview.tsx +2 -2
  298. package/src/preview/components/EmptyValue.tsx +1 -1
  299. package/src/preview/components/EnumValuesChip.tsx +2 -2
  300. package/src/preview/components/ImagePreview.tsx +26 -37
  301. package/src/preview/components/ReferencePreview.tsx +23 -34
  302. package/src/preview/components/StorageThumbnail.tsx +5 -1
  303. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  304. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  305. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  306. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  307. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  308. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  309. package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
  310. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  311. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  312. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  313. package/src/preview/util.ts +10 -10
  314. package/src/routes/CustomCMSRoute.tsx +21 -0
  315. package/src/routes/FireCMSRoute.tsx +246 -0
  316. package/src/routes/HomePageRoute.tsx +17 -0
  317. package/src/types/auth.tsx +9 -13
  318. package/src/types/collections.ts +118 -28
  319. package/src/types/customization_controller.tsx +0 -1
  320. package/src/types/datasource.ts +61 -43
  321. package/src/types/dialogs_controller.tsx +7 -3
  322. package/src/types/entities.ts +12 -2
  323. package/src/types/entity_actions.tsx +32 -7
  324. package/src/types/entity_callbacks.ts +18 -18
  325. package/src/types/entity_overrides.tsx +2 -2
  326. package/src/types/export_import.ts +4 -4
  327. package/src/types/fields.tsx +85 -46
  328. package/src/types/firecms.tsx +9 -4
  329. package/src/types/firecms_context.tsx +1 -1
  330. package/src/types/index.ts +0 -1
  331. package/src/types/navigation.ts +49 -18
  332. package/src/types/permissions.ts +5 -5
  333. package/src/types/plugins.tsx +42 -14
  334. package/src/types/properties.ts +87 -26
  335. package/src/types/property_config.tsx +0 -2
  336. package/src/types/side_dialogs_controller.tsx +15 -0
  337. package/src/types/side_entity_controller.tsx +11 -1
  338. package/src/types/storage.ts +94 -3
  339. package/src/types/user.ts +2 -0
  340. package/src/util/builders.ts +10 -8
  341. package/src/util/callbacks.ts +119 -0
  342. package/src/util/createFormexStub.tsx +62 -0
  343. package/src/util/entities.ts +9 -6
  344. package/src/util/entity_actions.ts +28 -0
  345. package/src/util/entity_cache.ts +204 -0
  346. package/src/util/enums.ts +1 -1
  347. package/src/util/icon_list.ts +16 -10
  348. package/src/util/icon_synonyms.ts +3 -100
  349. package/src/util/icons.tsx +17 -7
  350. package/src/util/index.ts +3 -0
  351. package/src/util/join_collections.ts +6 -1
  352. package/src/util/make_properties_editable.ts +13 -5
  353. package/src/util/navigation_from_path.ts +18 -7
  354. package/src/util/navigation_utils.ts +141 -25
  355. package/src/util/objects.ts +52 -28
  356. package/src/util/parent_references_from_path.ts +3 -3
  357. package/src/util/permissions.ts +9 -8
  358. package/src/util/plurals.ts +0 -2
  359. package/src/util/property_utils.tsx +17 -6
  360. package/src/util/references.ts +19 -8
  361. package/src/util/resolutions.ts +110 -48
  362. package/src/util/storage.ts +79 -21
  363. package/src/util/strings.ts +2 -2
  364. package/src/util/useStorageUploadController.tsx +91 -28
  365. package/dist/components/FireCMSAppBar.d.ts +0 -26
  366. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  367. package/dist/components/VirtualTable/common.d.ts +0 -2
  368. package/dist/core/Drawer.d.ts +0 -23
  369. package/dist/core/Scaffold.d.ts +0 -55
  370. package/dist/core/SideEntityView.d.ts +0 -7
  371. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  372. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  373. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  374. package/dist/internal/useLocaleConfig.d.ts +0 -1
  375. package/dist/types/appcheck.d.ts +0 -26
  376. package/src/components/FireCMSAppBar.tsx +0 -165
  377. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  378. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  379. package/src/core/Drawer.tsx +0 -191
  380. package/src/core/Scaffold.tsx +0 -281
  381. package/src/core/SideEntityView.tsx +0 -38
  382. package/src/form/components/FormikArrayContainer.tsx +0 -44
  383. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  384. package/src/internal/useBuildCustomizationController.tsx +0 -5
  385. package/src/internal/useLocaleConfig.tsx +0 -18
  386. package/src/types/appcheck.ts +0 -29
  387. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,5 +1,4 @@
1
- import React, { useCallback, useEffect, useRef } from "react";
2
- import equal from "react-fast-compare";
1
+ import React, { useCallback, useEffect, useMemo, useRef } from "react";
3
2
  import {
4
3
  CollectionSize,
5
4
  Entity,
@@ -10,7 +9,7 @@ import {
10
9
  } from "../../types";
11
10
  import { CellRendererParams, VirtualTable, VirtualTableColumn } from "../VirtualTable";
12
11
  import { enumToObjectEntries } from "../../util";
13
- import { OnCellValueChange, OnColumnResizeParams } from "../common/types";
12
+ import { OnCellValueChange, OnColumnResizeParams } from "../common";
14
13
  import { FilterFormFieldProps } from "../VirtualTable/VirtualTableHeader";
15
14
  import { ReferenceFilterField } from "./filters/ReferenceFilterField";
16
15
  import { StringNumberFilterField } from "./filters/StringNumberFilterField";
@@ -18,6 +17,7 @@ import { BooleanFilterField } from "./filters/BooleanFilterField";
18
17
  import { DateTimeFilterField } from "./filters/DateTimeFilterField";
19
18
  import { useOutsideAlerter } from "@firecms/ui";
20
19
  import { SelectableTableContext } from "./SelectableTableContext";
20
+ import { getRowHeight } from "../common/table_height";
21
21
 
22
22
  export type SelectableTableProps<M extends Record<string, any>> = {
23
23
 
@@ -59,7 +59,7 @@ export type SelectableTableProps<M extends Record<string, any>> = {
59
59
 
60
60
  /**
61
61
  * Controller holding the logic for the table
62
- * {@link useDataSourceEntityCollectionTableController}
62
+ * {@link useDataSourceTableController}
63
63
  * {@link EntityTableController}
64
64
  */
65
65
  tableController: EntityTableController<M>;
@@ -76,6 +76,18 @@ export type SelectableTableProps<M extends Record<string, any>> = {
76
76
 
77
77
  size?: CollectionSize;
78
78
 
79
+ initialScroll?: number;
80
+
81
+ /**
82
+ * Callback when the table is scrolled
83
+ * @param props
84
+ */
85
+ onScroll?: (props: {
86
+ scrollDirection: "forward" | "backward",
87
+ scrollOffset: number,
88
+ scrollUpdateWasRequested: boolean
89
+ }) => void;
90
+
79
91
  emptyComponent?: React.ReactNode;
80
92
 
81
93
  endAdornment?: React.ReactNode;
@@ -100,155 +112,154 @@ export type SelectableTableProps<M extends Record<string, any>> = {
100
112
  *
101
113
  * The data displayed in the table is managed by a {@link EntityTableController}.
102
114
  * You can build the default, bound to a path in the datasource, by using the hook
103
- * {@link useDataSourceEntityCollectionTableController}
115
+ * {@link useDataSourceTableController}
104
116
  *
105
117
  * @see EntityCollectionTableProps
106
118
  * @see EntityCollectionView
107
119
  * @see VirtualTable
108
120
  * @group Components
109
121
  */
110
- export const SelectableTable = React.memo<SelectableTableProps<any>>(
111
- function SelectableTable<M extends Record<string, any>>
112
- ({
113
- onValueChange,
114
- cellRenderer,
115
- onEntityClick,
116
- onColumnResize,
117
- hoverRow = true,
118
- size,
119
- inlineEditing = false,
120
- tableController:
121
- {
122
- data,
123
- dataLoading,
124
- noMoreToLoad,
125
- dataLoadingError,
126
- filterValues,
127
- setFilterValues,
128
- sortBy,
129
- setSortBy,
130
- setSearchString,
131
- clearFilter,
132
- itemCount,
133
- setItemCount,
134
- pageSize = 50,
135
- paginationEnabled,
136
- checkFilterCombination,
137
- setPopupCell
138
- },
139
- filterable = true,
140
- emptyComponent,
141
- columns,
142
- forceFilter,
143
- highlightedRow,
144
- endAdornment,
145
- AddColumnComponent
146
- }: SelectableTableProps<M>) {
147
-
148
- const ref = useRef<HTMLDivElement>(null);
149
-
150
- const [selectedCell, setSelectedCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);
151
-
152
- const loadNextPage = () => {
153
- if (!paginationEnabled || dataLoading || noMoreToLoad)
154
- return;
155
- if (itemCount !== undefined)
156
- setItemCount?.(itemCount + pageSize);
122
+ export const SelectableTable = function SelectableTable<M extends Record<string, any>>
123
+ ({
124
+ onValueChange,
125
+ cellRenderer,
126
+ onEntityClick,
127
+ onColumnResize,
128
+ hoverRow = true,
129
+ size = "m",
130
+ inlineEditing = false,
131
+ tableController:
132
+ {
133
+ data,
134
+ dataLoading,
135
+ noMoreToLoad,
136
+ dataLoadingError,
137
+ filterValues,
138
+ setFilterValues,
139
+ sortBy,
140
+ setSortBy,
141
+ itemCount,
142
+ setItemCount,
143
+ pageSize = 50,
144
+ paginationEnabled,
145
+ checkFilterCombination,
146
+ setPopupCell
147
+ },
148
+ filterable = true,
149
+ onScroll,
150
+ initialScroll,
151
+ emptyComponent,
152
+ columns,
153
+ forceFilter,
154
+ highlightedRow,
155
+ endAdornment,
156
+ AddColumnComponent
157
+ }: SelectableTableProps<M>) {
158
+
159
+ const ref = useRef<HTMLDivElement>(null);
160
+
161
+ const [selectedCell, setSelectedCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);
162
+
163
+ const loadNextPage = () => {
164
+ if (!paginationEnabled || dataLoading || noMoreToLoad)
165
+ return;
166
+ if (itemCount !== undefined)
167
+ setItemCount?.(itemCount + pageSize);
168
+ };
169
+
170
+ const resetPagination = useCallback(() => {
171
+ setItemCount?.(pageSize);
172
+ }, [pageSize]);
173
+
174
+ const onRowClick = useCallback(({ rowData }: {
175
+ rowData: Entity<M>
176
+ }) => {
177
+ if (inlineEditing)
178
+ return;
179
+ return onEntityClick && onEntityClick(rowData);
180
+ }, [onEntityClick, inlineEditing]);
181
+
182
+ useOutsideAlerter(ref,
183
+ () => {
184
+ if (selectedCell) {
185
+ unselect();
186
+ }
187
+ },
188
+ Boolean(selectedCell));
189
+
190
+ const select = useCallback((cell?: SelectedCellProps<M>) => {
191
+ setSelectedCell(cell);
192
+ }, []);
193
+
194
+ const unselect = useCallback(() => {
195
+ setSelectedCell(undefined);
196
+ }, []);
197
+
198
+ // on ESC key press
199
+ useEffect(() => {
200
+ const escFunction = (event: any) => {
201
+ if (event.keyCode === 27) {
202
+ unselect();
203
+ }
204
+ };
205
+ document.addEventListener("keydown", escFunction, false);
206
+ return () => {
207
+ document.removeEventListener("keydown", escFunction, false);
157
208
  };
209
+ }, [unselect]);
210
+
211
+ const onFilterUpdate = useCallback((updatedFilterValues?: FilterValues<any>) => {
212
+ setFilterValues?.({ ...updatedFilterValues, ...forceFilter } as FilterValues<any>);
213
+ }, [forceFilter]);
214
+
215
+ const contextValue = useMemo(() => ({
216
+ setPopupCell: setPopupCell as ((cell?: SelectedCellProps<M>) => void),
217
+ select,
218
+ onValueChange,
219
+ size: size ?? "m",
220
+ selectedCell
221
+ }), [setPopupCell, select, onValueChange, size, selectedCell]);
222
+
223
+ return (
224
+ <SelectableTableContext.Provider
225
+ value={contextValue}>
226
+ <div className="h-full w-full flex flex-col bg-white dark:bg-surface-950"
227
+ ref={ref}>
228
+
229
+ <VirtualTable
230
+ data={data}
231
+ columns={columns}
232
+ cellRenderer={cellRenderer}
233
+ onRowClick={inlineEditing ? undefined : (onEntityClick ? onRowClick : undefined)}
234
+ onEndReached={loadNextPage}
235
+ onResetPagination={resetPagination}
236
+ error={dataLoadingError}
237
+ onColumnResize={onColumnResize}
238
+ rowHeight={getRowHeight(size)}
239
+ loading={dataLoading}
240
+ filter={filterValues}
241
+ onFilterUpdate={setFilterValues ? onFilterUpdate : undefined}
242
+ sortBy={sortBy}
243
+ onSortByUpdate={setSortBy as ((sortBy?: [string, "asc" | "desc"]) => void)}
244
+ hoverRow={hoverRow}
245
+ initialScroll={initialScroll}
246
+ onScroll={onScroll}
247
+ checkFilterCombination={checkFilterCombination}
248
+ createFilterField={filterable ? createFilterField : undefined}
249
+ rowClassName={useCallback((entity: Entity<M>) => {
250
+ return highlightedRow?.(entity) ? "bg-surface-100 bg-opacity-75 dark:bg-surface-800 dark:bg-opacity-75" : "";
251
+ }, [highlightedRow])}
252
+ className="flex-grow"
253
+ emptyComponent={emptyComponent}
254
+ endAdornment={endAdornment}
255
+ AddColumnComponent={AddColumnComponent}
256
+ />
257
+
258
+ </div>
259
+ </SelectableTableContext.Provider>
260
+ );
158
261
 
159
- const resetPagination = useCallback(() => {
160
- setItemCount?.(pageSize);
161
- }, [pageSize]);
162
-
163
- const onRowClick = useCallback(({ rowData }: {
164
- rowData: Entity<M>
165
- }) => {
166
- if (inlineEditing)
167
- return;
168
- return onEntityClick && onEntityClick(rowData);
169
- }, [onEntityClick, inlineEditing]);
170
-
171
- useOutsideAlerter(ref,
172
- () => {
173
- if (selectedCell) {
174
- unselect();
175
- }
176
- },
177
- Boolean(selectedCell));
178
-
179
- // on ESC key press
180
- useEffect(() => {
181
- const escFunction = (event: any) => {
182
- if (event.keyCode === 27) {
183
- unselect();
184
- }
185
- };
186
- document.addEventListener("keydown", escFunction, false);
187
- return () => {
188
- document.removeEventListener("keydown", escFunction, false);
189
- };
190
- });
191
-
192
- const select = useCallback((cell?: SelectedCellProps<M>) => {
193
- setSelectedCell(cell);
194
- }, []);
195
-
196
- const unselect = useCallback(() => {
197
- setSelectedCell(undefined);
198
- }, []);
199
-
200
- const onFilterUpdate = useCallback((updatedFilterValues?: FilterValues<any>) => {
201
- setFilterValues?.({ ...updatedFilterValues, ...forceFilter } as FilterValues<any>);
202
- }, [forceFilter]);
203
-
204
- return (
205
- <SelectableTableContext.Provider
206
- value={{
207
- setPopupCell: setPopupCell as ((cell?: SelectedCellProps<M>) => void),
208
- select,
209
- onValueChange,
210
- size: size ?? "m",
211
- selectedCell,
212
- }}
213
- >
214
- <div className="h-full w-full flex flex-col bg-white dark:bg-gray-950"
215
- ref={ref}>
216
-
217
- <VirtualTable
218
- data={data}
219
- columns={columns}
220
- cellRenderer={cellRenderer}
221
- onRowClick={inlineEditing ? undefined : (onEntityClick ? onRowClick : undefined)}
222
- onEndReached={loadNextPage}
223
- onResetPagination={resetPagination}
224
- error={dataLoadingError}
225
- paginationEnabled={paginationEnabled}
226
- onColumnResize={onColumnResize}
227
- size={size}
228
- loading={dataLoading}
229
- filter={filterValues}
230
- onFilterUpdate={setFilterValues ? onFilterUpdate : undefined}
231
- sortBy={sortBy}
232
- onSortByUpdate={setSortBy as ((sortBy?: [string, "asc" | "desc"]) => void)}
233
- hoverRow={hoverRow}
234
- checkFilterCombination={checkFilterCombination}
235
- createFilterField={filterable ? createFilterField : undefined}
236
- rowClassName={useCallback((entity: Entity<M>) => {
237
- return highlightedRow?.(entity) ? "bg-gray-100 bg-opacity-75 dark:bg-gray-800 dark:bg-opacity-75" : "";
238
- }, [highlightedRow])}
239
- className="flex-grow"
240
- emptyComponent={emptyComponent}
241
- endAdornment={endAdornment}
242
- AddColumnComponent={AddColumnComponent}
243
- />
244
-
245
- </div>
246
- </SelectableTableContext.Provider>
247
- );
248
-
249
- },
250
- equal
251
- );
262
+ };
252
263
 
253
264
  function createFilterField({
254
265
  id,
@@ -280,6 +291,7 @@ function createFilterField({
280
291
  isArray={isArray}
281
292
  path={baseProperty.path}
282
293
  title={resolvedProperty?.name}
294
+ includeId={baseProperty.includeId}
283
295
  previewProperties={baseProperty?.previewProperties}
284
296
  hidden={hidden}
285
297
  setHidden={setHidden}/>;
@@ -32,7 +32,7 @@ export function BooleanFilterField({
32
32
  const valueSet = !!value;
33
33
 
34
34
  return (
35
- <div className="w-[200px]">
35
+ <div className="w-[300px]">
36
36
  <BooleanSwitchWithLabel
37
37
  value={valueSetToTrue}
38
38
  allowIndeterminate={true}
@@ -44,6 +44,5 @@ export function BooleanFilterField({
44
44
  : `${title} is false`}
45
45
  />
46
46
  </div>
47
- )
48
- ;
47
+ );
49
48
  }
@@ -1,6 +1,6 @@
1
1
  import React, { useState } from "react";
2
2
  import { VirtualTableWhereFilterOp } from "../../VirtualTable";
3
- import { DateTimeField, Select, SelectItem } from "@firecms/ui";
3
+ import { Checkbox, DateTimeField, Label, Select, SelectItem } from "@firecms/ui";
4
4
  import { useCustomizationController } from "../../../hooks";
5
5
 
6
6
  interface DateTimeFilterFieldProps {
@@ -43,10 +43,10 @@ export function DateTimeFilterField({
43
43
 
44
44
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
45
45
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
46
- const [internalValue, setInternalValue] = useState<Date | undefined>(fieldValue);
46
+ const [internalValue, setInternalValue] = useState<Date | null | undefined>(fieldValue);
47
47
 
48
- function updateFilter(op: VirtualTableWhereFilterOp, val: Date | undefined) {
49
- let newValue: Date | undefined = val;
48
+ function updateFilter(op: VirtualTableWhereFilterOp, val: Date | undefined | null) {
49
+ let newValue: Date | null | undefined = val;
50
50
  const prevOpIsArray = multipleSelectOperations.includes(operation);
51
51
  const newOpIsArray = multipleSelectOperations.includes(op);
52
52
  if (prevOpIsArray !== newOpIsArray) {
@@ -73,9 +73,11 @@ export function DateTimeFilterField({
73
73
 
74
74
  return (
75
75
 
76
- <div className="flex w-[440px] items-center">
76
+ <div className="flex w-[440px]">
77
77
  <div className="w-[80px]">
78
78
  <Select value={operation}
79
+ size={"large"}
80
+ fullWidth={true}
79
81
  onValueChange={(value) => {
80
82
  updateFilter(value as VirtualTableWhereFilterOp, internalValue);
81
83
  }}
@@ -88,19 +90,34 @@ export function DateTimeFilterField({
88
90
  </Select>
89
91
  </div>
90
92
 
91
- <div className="flex-grow ml-2">
93
+ <div className="flex-grow ml-2 flex flex-col gap-2">
92
94
 
93
95
  <DateTimeField
94
96
  mode={mode}
95
- size={"medium"}
97
+ size={"large"}
96
98
  locale={locale}
97
- value={internalValue}
99
+ value={internalValue ?? undefined}
98
100
  onChange={(dateValue: Date | null) => {
99
101
  updateFilter(operation, dateValue === null ? undefined : dateValue);
100
102
  }}
101
103
  clearable={true}
102
104
  />
103
105
 
106
+ <Label
107
+ className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
108
+ htmlFor="null-filter"
109
+ >
110
+ <Checkbox id="null-filter"
111
+ checked={internalValue === null}
112
+ size={"small"}
113
+ onCheckedChange={(checked) => {
114
+ if (internalValue !== null)
115
+ updateFilter(operation, null);
116
+ else updateFilter(operation, undefined);
117
+ }}/>
118
+ Filter for null values
119
+ </Label>
120
+
104
121
  </div>
105
122
 
106
123
  </div>
@@ -4,7 +4,7 @@ import { Entity, EntityCollection, EntityReference } from "../../../types";
4
4
  import { ReferencePreview } from "../../../preview";
5
5
  import { getReferenceFrom } from "../../../util";
6
6
  import { useNavigationController, useReferenceDialog } from "../../../hooks";
7
- import { Button, Select, SelectItem } from "@firecms/ui";
7
+ import { Button, Checkbox, Label, Select, SelectItem } from "@firecms/ui";
8
8
 
9
9
  interface ReferenceFilterFieldProps {
10
10
  name: string,
@@ -13,6 +13,7 @@ interface ReferenceFilterFieldProps {
13
13
  isArray?: boolean;
14
14
  path?: string;
15
15
  title?: string;
16
+ includeId?: boolean;
16
17
  previewProperties?: string[];
17
18
  hidden: boolean;
18
19
  setHidden: (hidden: boolean) => void;
@@ -34,12 +35,11 @@ const operationLabels = {
34
35
  const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
35
36
 
36
37
  export function ReferenceFilterField({
37
- name,
38
38
  value,
39
39
  setValue,
40
40
  isArray,
41
41
  path,
42
- title,
42
+ includeId = true,
43
43
  previewProperties,
44
44
  setHidden
45
45
  }: ReferenceFilterFieldProps) {
@@ -48,13 +48,15 @@ export function ReferenceFilterField({
48
48
  ? ["array-contains"]
49
49
  : ["==", "!=", ">", "<", ">=", "<="];
50
50
 
51
- isArray
52
- ? possibleOperations.push("array-contains-any")
53
- : possibleOperations.push("in", "not-in");
51
+ if (isArray) {
52
+ possibleOperations.push("array-contains-any");
53
+ } else {
54
+ possibleOperations.push("in", "not-in");
55
+ }
54
56
 
55
57
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
56
58
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
57
- const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined>(fieldValue);
59
+ const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue);
58
60
 
59
61
  const selectedEntityIds = internalValue
60
62
  ? (Array.isArray(internalValue) ? internalValue.map((ref) => {
@@ -65,7 +67,7 @@ export function ReferenceFilterField({
65
67
  }).filter(Boolean) as string[] : [internalValue.id])
66
68
  : [];
67
69
 
68
- function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[]) {
70
+ function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {
69
71
 
70
72
  const prevOpIsArray = multipleSelectOperations.includes(operation);
71
73
  const newOpIsArray = multipleSelectOperations.includes(op);
@@ -134,16 +136,19 @@ export function ReferenceFilterField({
134
136
  onClick={doOpenDialog}
135
137
  reference={reference}
136
138
  hover={true}
137
- allowEntityNavigation={false}
139
+ includeId={includeId}
140
+ includeEntityLink={false}
138
141
  />
139
142
  );
140
143
  };
141
144
 
142
145
  return (
143
146
 
144
- <div className="flex w-[440px] flex-row">
145
- <div className="w-[120px]">
147
+ <div className="flex w-[480px] flex-row">
148
+ <div className="w-[140px]">
146
149
  <Select value={operation}
150
+ size={"large"}
151
+ fullWidth={true}
147
152
  onValueChange={(value) => {
148
153
  updateFilter(value as VirtualTableWhereFilterOp, internalValue);
149
154
  }}
@@ -156,21 +161,40 @@ export function ReferenceFilterField({
156
161
  </Select>
157
162
  </div>
158
163
 
159
- <div className="flex-grow ml-2 h-full">
164
+ <div className="flex-grow ml-2 h-full gap-2 flex flex-col w-[340px]">
160
165
 
161
166
  {internalValue && Array.isArray(internalValue) && <div>
162
167
  {internalValue.map((ref, index) => buildEntry(ref))}
163
168
  </div>}
169
+
164
170
  {internalValue && !Array.isArray(internalValue) && <div>
165
171
  {buildEntry(internalValue)}
166
172
  </div>}
173
+
167
174
  {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&
168
175
  <Button onClick={doOpenDialog}
169
176
  variant={"outlined"}
177
+ size={"large"}
170
178
  className="h-full w-full">
171
179
  {multiple ? "Select references" : "Select reference"}
172
180
  </Button>
173
181
  }
182
+
183
+ {!isArray && <Label
184
+ className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
185
+ htmlFor="null-filter"
186
+ >
187
+ <Checkbox id="null-filter"
188
+ checked={internalValue === null}
189
+ size={"small"}
190
+ onCheckedChange={(checked) => {
191
+ if (internalValue !== null)
192
+ updateFilter(operation, null);
193
+ else updateFilter(operation, undefined);
194
+ }}/>
195
+ Filter for null values
196
+ </Label>}
197
+
174
198
  </div>
175
199
 
176
200
  </div>