@firecms/core 3.0.0 → 3.1.0-canary.02232f4

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 (340) hide show
  1. package/README.md +1 -1
  2. package/dist/components/AIIcon.d.ts +16 -0
  3. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +7 -1
  4. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  5. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +14 -0
  6. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +6 -0
  7. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +5 -4
  8. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +6 -0
  9. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
  10. package/dist/components/EntityCollectionView/Board.d.ts +2 -0
  11. package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
  12. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
  13. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
  14. package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
  15. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +26 -0
  16. package/dist/components/EntityCollectionView/EntityCard.d.ts +19 -0
  17. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +20 -0
  18. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +31 -0
  19. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +2 -2
  20. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +7 -3
  21. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +14 -0
  22. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
  23. package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
  24. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +60 -0
  25. package/dist/components/ErrorBoundary.d.ts +4 -2
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
  27. package/dist/components/LanguageToggle.d.ts +1 -0
  28. package/dist/components/SelectableTable/SelectableTable.d.ts +5 -1
  29. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -1
  30. package/dist/components/UnsavedChangesDialog.d.ts +1 -0
  31. package/dist/components/VirtualTable/VirtualTable.performance.test.d.ts +1 -0
  32. package/dist/components/VirtualTable/VirtualTableCell.d.ts +6 -0
  33. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
  34. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
  36. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  37. package/dist/components/VirtualTable/types.d.ts +3 -0
  38. package/dist/components/index.d.ts +4 -0
  39. package/dist/contexts/index.d.ts +10 -0
  40. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  41. package/dist/core/index.d.ts +1 -0
  42. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  43. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  44. package/dist/editor/components/editor-bubble.d.ts +8 -0
  45. package/dist/editor/components/image-bubble.d.ts +5 -0
  46. package/dist/editor/components/index.d.ts +16 -0
  47. package/dist/editor/components/table-bubble.d.ts +5 -0
  48. package/dist/editor/editor.d.ts +30 -0
  49. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  50. package/dist/editor/extensions/Image/index.d.ts +6 -0
  51. package/dist/editor/extensions/Image.d.ts +6 -0
  52. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  53. package/dist/editor/extensions/clipboard.d.ts +7 -0
  54. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  55. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  56. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  57. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  58. package/dist/editor/index.d.ts +2 -0
  59. package/dist/editor/markdown.d.ts +5 -0
  60. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  61. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  62. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  63. package/dist/editor/nodeViews/index.d.ts +6 -0
  64. package/dist/editor/plugins/index.d.ts +2 -0
  65. package/dist/editor/plugins/inputrules.d.ts +6 -0
  66. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  67. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  68. package/dist/editor/schema.d.ts +2 -0
  69. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  70. package/dist/editor/selectors/color-selector.d.ts +10 -0
  71. package/dist/editor/selectors/link-selector.d.ts +8 -0
  72. package/dist/editor/selectors/node-selector.d.ts +15 -0
  73. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  74. package/dist/editor/types.d.ts +5 -0
  75. package/dist/editor/useProseMirror.d.ts +16 -0
  76. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  77. package/dist/editor/utils/remove_classes.d.ts +1 -0
  78. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  79. package/dist/form/components/ErrorFocus.d.ts +1 -1
  80. package/dist/form/components/LocalChangesMenu.d.ts +2 -2
  81. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  84. package/dist/form/validation.d.ts +3 -2
  85. package/dist/hooks/index.d.ts +1 -0
  86. package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
  87. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  88. package/dist/hooks/useCollapsedGroups.d.ts +6 -3
  89. package/dist/hooks/useTranslation.d.ts +17 -0
  90. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.es.js +31028 -16080
  93. package/dist/index.es.js.map +1 -1
  94. package/dist/index.umd.js +29955 -15028
  95. package/dist/index.umd.js.map +1 -1
  96. package/dist/internal/useRestoreScroll.d.ts +1 -1
  97. package/dist/locales/de.d.ts +2 -0
  98. package/dist/locales/en.d.ts +10 -0
  99. package/dist/locales/es.d.ts +10 -0
  100. package/dist/locales/fr.d.ts +2 -0
  101. package/dist/locales/hi.d.ts +2 -0
  102. package/dist/locales/it.d.ts +2 -0
  103. package/dist/locales/pt.d.ts +7 -0
  104. package/dist/preview/PropertyPreviewProps.d.ts +5 -0
  105. package/dist/preview/components/DatePreview.d.ts +13 -3
  106. package/dist/preview/components/ImagePreview.d.ts +5 -1
  107. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  108. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  109. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
  110. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
  111. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
  112. package/dist/types/analytics.d.ts +1 -1
  113. package/dist/types/collections.d.ts +88 -2
  114. package/dist/types/customization_controller.d.ts +2 -1
  115. package/dist/types/datasource.d.ts +0 -1
  116. package/dist/types/entities.d.ts +1 -0
  117. package/dist/types/firecms.d.ts +2 -1
  118. package/dist/types/index.d.ts +1 -0
  119. package/dist/types/navigation.d.ts +2 -2
  120. package/dist/types/plugins.d.ts +69 -1
  121. package/dist/types/properties.d.ts +277 -12
  122. package/dist/types/storage.d.ts +9 -0
  123. package/dist/types/translations.d.ts +669 -0
  124. package/dist/util/__tests__/conditions.test.d.ts +1 -0
  125. package/dist/util/__tests__/objects.test.d.ts +1 -0
  126. package/dist/util/conditions.d.ts +26 -0
  127. package/dist/util/entities.d.ts +2 -3
  128. package/dist/util/index.d.ts +3 -1
  129. package/dist/util/lazy_eager.d.ts +7 -0
  130. package/dist/util/objects.d.ts +1 -0
  131. package/dist/util/property_utils.d.ts +2 -1
  132. package/dist/util/resolutions.d.ts +3 -3
  133. package/dist/util/useStorageUploadController.d.ts +11 -2
  134. package/package.json +52 -12
  135. package/src/app/Scaffold.tsx +20 -19
  136. package/src/components/AIIcon.tsx +41 -0
  137. package/src/components/ArrayContainer.tsx +7 -8
  138. package/src/components/ClearFilterSortButton.tsx +25 -19
  139. package/src/components/ConfirmationDialog.tsx +4 -4
  140. package/src/components/DeleteEntityDialog.tsx +12 -11
  141. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
  142. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
  143. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
  144. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
  145. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  146. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
  147. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
  148. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  149. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  150. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  151. package/src/components/EntityCollectionView/Board.tsx +324 -0
  152. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  153. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  154. package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
  155. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  156. package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
  157. package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
  158. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
  159. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
  160. package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
  161. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
  162. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
  163. package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
  164. package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
  165. package/src/components/EntityCollectionView/board_types.ts +113 -0
  166. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  167. package/src/components/EntityJsonPreview.tsx +2 -1
  168. package/src/components/EntityPreview.tsx +1 -1
  169. package/src/components/EntityView.tsx +3 -2
  170. package/src/components/ErrorBoundary.tsx +27 -15
  171. package/src/components/ErrorTooltip.tsx +2 -1
  172. package/src/components/HomePage/DefaultHomePage.tsx +65 -22
  173. package/src/components/HomePage/HomePageDnD.tsx +59 -42
  174. package/src/components/HomePage/NavigationCard.tsx +20 -18
  175. package/src/components/HomePage/NavigationGroup.tsx +20 -17
  176. package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
  177. package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
  178. package/src/components/LanguageToggle.tsx +66 -0
  179. package/src/components/NotFoundPage.tsx +5 -3
  180. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
  181. package/src/components/ReferenceWidget.tsx +5 -6
  182. package/src/components/SearchIconsView.tsx +3 -1
  183. package/src/components/SelectableTable/SelectableTable.tsx +75 -67
  184. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
  185. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
  186. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
  187. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
  188. package/src/components/UnsavedChangesDialog.tsx +6 -6
  189. package/src/components/UserDisplay.tsx +4 -4
  190. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +387 -0
  191. package/src/components/VirtualTable/VirtualTable.tsx +277 -121
  192. package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
  193. package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
  194. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
  195. package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
  196. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  197. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
  198. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
  199. package/src/components/VirtualTable/types.tsx +3 -0
  200. package/src/components/common/default_entity_actions.tsx +4 -0
  201. package/src/components/common/useColumnsIds.tsx +95 -3
  202. package/src/components/common/useDataSourceTableController.tsx +12 -4
  203. package/src/components/index.tsx +5 -0
  204. package/src/contexts/BreacrumbsContext.tsx +15 -8
  205. package/src/contexts/index.ts +10 -0
  206. package/src/core/DefaultAppBar.tsx +49 -32
  207. package/src/core/DefaultDrawer.tsx +49 -57
  208. package/src/core/DrawerNavigationGroup.tsx +120 -0
  209. package/src/core/DrawerNavigationItem.tsx +4 -3
  210. package/src/core/EntityEditView.tsx +94 -50
  211. package/src/core/EntityEditViewFormActions.tsx +24 -17
  212. package/src/core/EntitySidePanel.tsx +34 -30
  213. package/src/core/FireCMS.tsx +33 -6
  214. package/src/core/SideDialogs.tsx +4 -2
  215. package/src/core/field_configs.tsx +18 -11
  216. package/src/core/index.tsx +1 -0
  217. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  218. package/src/editor/components/editor-bubble-item.tsx +32 -0
  219. package/src/editor/components/editor-bubble.tsx +118 -0
  220. package/src/editor/components/image-bubble.tsx +156 -0
  221. package/src/editor/components/index.ts +14 -0
  222. package/src/editor/components/table-bubble.tsx +165 -0
  223. package/src/editor/editor.tsx +455 -0
  224. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  225. package/src/editor/extensions/Image/index.ts +133 -0
  226. package/src/editor/extensions/Image.ts +159 -0
  227. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  228. package/src/editor/extensions/clipboard.ts +72 -0
  229. package/src/editor/extensions/custom-keymap.ts +24 -0
  230. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  231. package/src/editor/hooks/useProseMirror.ts +124 -0
  232. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  233. package/src/editor/index.ts +2 -0
  234. package/src/editor/markdown.ts +172 -0
  235. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  236. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  237. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  238. package/src/editor/nodeViews/index.ts +35 -0
  239. package/src/editor/plugins/index.ts +58 -0
  240. package/src/editor/plugins/inputrules.ts +82 -0
  241. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  242. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  243. package/src/editor/schema.ts +240 -0
  244. package/src/editor/selectors/ai-selector.tsx +111 -0
  245. package/src/editor/selectors/color-selector.tsx +200 -0
  246. package/src/editor/selectors/link-selector.tsx +118 -0
  247. package/src/editor/selectors/node-selector.tsx +157 -0
  248. package/src/editor/selectors/text-buttons.tsx +86 -0
  249. package/src/editor/types.ts +6 -0
  250. package/src/editor/useProseMirror.ts +126 -0
  251. package/src/editor/utils/prosemirror-utils.ts +108 -0
  252. package/src/editor/utils/remove_classes.ts +17 -0
  253. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  254. package/src/form/EntityForm.tsx +150 -75
  255. package/src/form/EntityFormActions.tsx +19 -12
  256. package/src/form/PropertyFieldBinding.tsx +68 -51
  257. package/src/form/components/ErrorFocus.tsx +3 -3
  258. package/src/form/components/LocalChangesMenu.tsx +19 -19
  259. package/src/form/components/StorageItemPreview.tsx +5 -3
  260. package/src/form/components/StorageUploadProgress.tsx +22 -6
  261. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  262. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
  263. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  264. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
  265. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
  266. package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
  267. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
  268. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  269. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  270. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  271. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  272. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  273. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  274. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  275. package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
  276. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  277. package/src/form/validation.ts +245 -160
  278. package/src/hooks/index.tsx +1 -0
  279. package/src/hooks/useBreadcrumbsController.tsx +18 -0
  280. package/src/hooks/useBuildNavigationController.tsx +91 -41
  281. package/src/hooks/useCollapsedGroups.ts +18 -9
  282. package/src/hooks/useTranslation.ts +31 -0
  283. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  284. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  285. package/src/index.ts +5 -0
  286. package/src/internal/useBuildDataSource.ts +68 -34
  287. package/src/internal/useBuildSideDialogsController.tsx +11 -8
  288. package/src/internal/useBuildSideEntityController.tsx +24 -24
  289. package/src/internal/useRestoreScroll.tsx +26 -14
  290. package/src/locales/de.ts +718 -0
  291. package/src/locales/en.ts +730 -0
  292. package/src/locales/es.ts +730 -0
  293. package/src/locales/fr.ts +718 -0
  294. package/src/locales/hi.ts +718 -0
  295. package/src/locales/it.ts +718 -0
  296. package/src/locales/pt.ts +727 -0
  297. package/src/preview/PropertyPreview.tsx +43 -33
  298. package/src/preview/PropertyPreviewProps.tsx +6 -0
  299. package/src/preview/components/DatePreview.tsx +72 -4
  300. package/src/preview/components/EmptyValue.tsx +1 -1
  301. package/src/preview/components/ImagePreview.tsx +37 -21
  302. package/src/preview/components/ReferencePreview.tsx +8 -2
  303. package/src/preview/components/StorageThumbnail.tsx +16 -12
  304. package/src/preview/components/UrlComponentPreview.tsx +32 -27
  305. package/src/preview/components/UserPreview.tsx +3 -1
  306. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
  307. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
  308. package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
  309. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  310. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
  311. package/src/routes/CustomCMSRoute.tsx +1 -0
  312. package/src/routes/FireCMSRoute.tsx +87 -65
  313. package/src/types/analytics.ts +10 -0
  314. package/src/types/collections.ts +97 -3
  315. package/src/types/customization_controller.tsx +2 -1
  316. package/src/types/datasource.ts +54 -56
  317. package/src/types/entities.ts +10 -0
  318. package/src/types/firecms.tsx +2 -1
  319. package/src/types/index.ts +1 -0
  320. package/src/types/navigation.ts +2 -2
  321. package/src/types/plugins.tsx +77 -1
  322. package/src/types/properties.ts +369 -37
  323. package/src/types/storage.ts +11 -1
  324. package/src/types/translations.ts +752 -0
  325. package/src/util/__tests__/conditions.test.ts +506 -0
  326. package/src/util/__tests__/objects.test.ts +196 -0
  327. package/src/util/callbacks.ts +6 -3
  328. package/src/util/collections.ts +51 -6
  329. package/src/util/conditions.ts +339 -0
  330. package/src/util/entities.ts +29 -30
  331. package/src/util/entity_cache.ts +2 -1
  332. package/src/util/index.ts +3 -1
  333. package/src/util/join_collections.ts +10 -8
  334. package/src/util/lazy_eager.tsx +33 -0
  335. package/src/util/objects.ts +46 -13
  336. package/src/util/{references.ts → previews.ts} +16 -2
  337. package/src/util/property_utils.tsx +37 -11
  338. package/src/util/resolutions.ts +62 -58
  339. package/src/util/useStorageUploadController.tsx +34 -30
  340. /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
@@ -2,10 +2,22 @@ import React from "react";
2
2
 
3
3
  import { canCreateEntity, canDeleteEntity } from "../../util";
4
4
  import { useAuthController, useCustomizationController, useFireCMSContext, useLargeLayout } from "../../hooks";
5
- import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
6
- import { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from "@firecms/ui";
5
+ import {
6
+ CollectionActionsProps,
7
+ EntityCollection,
8
+ EntityTableController,
9
+ SelectionController
10
+ } from "../../types";
11
+ import {
12
+ AddIcon,
13
+ Button,
14
+ DeleteIcon,
15
+ IconButton,
16
+ Tooltip
17
+ } from "@firecms/ui";
7
18
  import { toArray } from "../../util/arrays";
8
19
  import { ErrorBoundary } from "../ErrorBoundary";
20
+ import { useTranslation } from "../../hooks/useTranslation";
9
21
 
10
22
  export type EntityCollectionViewActionsProps<M extends Record<string, any>> = {
11
23
  collection: EntityCollection<M>;
@@ -17,26 +29,26 @@ export type EntityCollectionViewActionsProps<M extends Record<string, any>> = {
17
29
  onMultipleDeleteClick: () => void;
18
30
  selectionController: SelectionController<M>;
19
31
  tableController: EntityTableController<M>;
20
- collectionEntitiesCount: number;
32
+ collectionEntitiesCount?: number;
21
33
  }
22
34
 
23
35
  export function EntityCollectionViewActions<M extends Record<string, any>>({
24
- collection,
25
- relativePath,
26
- parentCollectionIds,
27
- onNewClick,
28
- onMultipleDeleteClick,
29
- selectionEnabled,
30
- path,
31
- selectionController,
32
- tableController,
33
- collectionEntitiesCount
34
- }: EntityCollectionViewActionsProps<M>) {
36
+ collection,
37
+ relativePath,
38
+ parentCollectionIds,
39
+ onNewClick,
40
+ onMultipleDeleteClick,
41
+ selectionEnabled,
42
+ path,
43
+ selectionController,
44
+ tableController,
45
+ collectionEntitiesCount,
46
+ }: EntityCollectionViewActionsProps<M>) {
35
47
 
36
48
  const context = useFireCMSContext();
37
-
38
49
  const customizationController = useCustomizationController();
39
50
  const plugins = customizationController.plugins ?? [];
51
+ const { t } = useTranslation();
40
52
 
41
53
  const authController = useAuthController();
42
54
 
@@ -49,10 +61,10 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
49
61
  ? <Button
50
62
  id={`add_entity_${path}`}
51
63
  onClick={onNewClick}
52
- startIcon={<AddIcon/>}
64
+ startIcon={<AddIcon size={"small"} />}
53
65
  variant="filled"
54
66
  color="primary">
55
- Add {collection.singularName ?? collection.name}
67
+ {t("add")} {collection.singularName ?? collection.name}
56
68
  </Button>
57
69
  : <Button
58
70
  id={`add_entity_${path}`}
@@ -60,7 +72,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
60
72
  variant="filled"
61
73
  color="primary"
62
74
  >
63
- <AddIcon/>
75
+ <AddIcon size={"small"} />
64
76
  </Button>);
65
77
 
66
78
  const multipleDeleteEnabled = canDeleteEntity(collection, authController, path, null);
@@ -71,7 +83,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
71
83
  ? <Button
72
84
  variant={"text"}
73
85
  disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
74
- startIcon={<DeleteIcon size={"small"}/>}
86
+ startIcon={<DeleteIcon size={"small"} />}
75
87
  onClick={onMultipleDeleteClick}
76
88
  color={"primary"}
77
89
  className="lg:w-20"
@@ -83,15 +95,16 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
83
95
  color={"primary"}
84
96
  disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
85
97
  onClick={onMultipleDeleteClick}>
86
- <DeleteIcon size={"small"}/>
98
+ <DeleteIcon size={"small"} />
87
99
  </IconButton>;
88
100
  multipleDeleteButton =
89
101
  <Tooltip
90
- title={multipleDeleteEnabled ? "Delete" : "You have selected at least one entity you cannot delete"}>
102
+ title={multipleDeleteEnabled ? t("delete_selected") : t("cannot_delete_selected")}>
91
103
  {button}
92
104
  </Tooltip>
93
105
  }
94
106
 
107
+
95
108
  const actionProps: CollectionActionsProps = {
96
109
  path,
97
110
  relativePath,
@@ -116,7 +129,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
116
129
  actions.push(...toArray(plugin.collectionView?.CollectionActions)
117
130
  .map((Action, j) => (
118
131
  <ErrorBoundary key={`plugin_actions_${i}_${j}`}>
119
- <Action {...actionProps} {...plugin.collectionView?.collectionActionsProps}/>
132
+ <Action {...actionProps} {...plugin.collectionView?.collectionActionsProps} />
120
133
  </ErrorBoundary>
121
134
  )));
122
135
  }
@@ -1,9 +1,18 @@
1
- import React from "react";
2
- import { useCustomizationController, useFireCMSContext } from "../../hooks";
3
- import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
1
+ import React, { useState } from "react";
2
+ import { useCustomizationController, useFireCMSContext, useLargeLayout } from "../../hooks";
3
+ import {
4
+ CollectionActionsProps,
5
+ EntityCollection,
6
+ EntityTableController,
7
+ ResolvedProperty,
8
+ SelectionController
9
+ } from "../../types";
4
10
  import { toArray } from "../../util/arrays";
5
11
  import { ErrorBoundary } from "../ErrorBoundary";
6
12
  import { ClearFilterSortButton } from "../ClearFilterSortButton";
13
+ import { FiltersDialog } from "./FiltersDialog";
14
+ import { Badge, Button, cls, FilterListIcon, IconButton, Tooltip } from "@firecms/ui";
15
+ import { useTranslation } from "../../hooks/useTranslation";
7
16
 
8
17
  export type EntityCollectionViewStartActionsProps<M extends Record<string, any>> = {
9
18
  collection: EntityCollection<M>;
@@ -12,23 +21,39 @@ export type EntityCollectionViewStartActionsProps<M extends Record<string, any>>
12
21
  parentCollectionIds: string[];
13
22
  selectionController: SelectionController<M>;
14
23
  tableController: EntityTableController<M>;
15
- collectionEntitiesCount: number;
24
+ collectionEntitiesCount?: number;
25
+ /**
26
+ * Resolved properties from the collection for the filters dialog
27
+ */
28
+ resolvedProperties?: Record<string, ResolvedProperty>;
16
29
  }
17
30
 
18
31
  export function EntityCollectionViewStartActions<M extends Record<string, any>>({
19
- collection,
20
- relativePath,
21
- parentCollectionIds,
22
- path,
23
- selectionController,
24
- tableController,
25
- collectionEntitiesCount
26
- }: EntityCollectionViewStartActionsProps<M>) {
32
+ collection,
33
+ relativePath,
34
+ parentCollectionIds,
35
+ path,
36
+ selectionController,
37
+ tableController,
38
+ collectionEntitiesCount,
39
+ resolvedProperties
40
+ }: EntityCollectionViewStartActionsProps<M>) {
27
41
 
28
42
  const context = useFireCMSContext();
29
-
30
43
  const customizationController = useCustomizationController();
31
44
  const plugins = customizationController.plugins ?? [];
45
+ const largeLayout = useLargeLayout();
46
+ const { t } = useTranslation();
47
+
48
+ // Filters dialog state
49
+ const [filtersDialogOpen, setFiltersDialogOpen] = useState(false);
50
+
51
+ // Count active filters (excluding force filters)
52
+ const filterValues = tableController.filterValues;
53
+ const forceFilter = collection.forceFilter;
54
+ const activeFilterCount = filterValues
55
+ ? Object.keys(filterValues).filter(key => !forceFilter || !(key in forceFilter)).length
56
+ : 0;
32
57
 
33
58
  const actionProps: CollectionActionsProps = {
34
59
  path,
@@ -40,11 +65,44 @@ export function EntityCollectionViewStartActions<M extends Record<string, any>>(
40
65
  tableController,
41
66
  collectionEntitiesCount
42
67
  };
68
+
69
+ // Filters button
70
+ const filtersButton = resolvedProperties && tableController.setFilterValues && (
71
+ <Tooltip title={t("filters")}
72
+ key={"filters_tooltip"}>
73
+ <Badge
74
+ color="primary"
75
+ invisible={activeFilterCount === 0}
76
+ >
77
+ {largeLayout ? (
78
+ <Button
79
+ variant="text"
80
+ size="small"
81
+ onClick={() => setFiltersDialogOpen(true)}
82
+ startIcon={<FilterListIcon size="small" />}
83
+ className={cls(activeFilterCount > 0 && "text-primary")}
84
+ >
85
+ {t("filters")}{activeFilterCount > 0 ? ` (${activeFilterCount})` : ""}
86
+ </Button>
87
+ ) : (
88
+ <IconButton
89
+ size="small"
90
+ onClick={() => setFiltersDialogOpen(true)}
91
+ className={cls(activeFilterCount > 0 && "text-primary")}
92
+ >
93
+ <FilterListIcon size="small" />
94
+ </IconButton>
95
+ )}
96
+ </Badge>
97
+ </Tooltip>
98
+ );
99
+
43
100
  const actions: React.ReactNode[] = [
101
+ filtersButton,
44
102
  <ClearFilterSortButton
45
103
  key={"clear_filter"}
46
104
  tableController={tableController}
47
- enabled={!collection.forceFilter}/>
105
+ enabled={!collection.forceFilter} />
48
106
  ];
49
107
 
50
108
  if (plugins) {
@@ -53,7 +111,7 @@ export function EntityCollectionViewStartActions<M extends Record<string, any>>(
53
111
  actions.push(...toArray(plugin.collectionView?.CollectionActionsStart)
54
112
  .map((Action, j) => (
55
113
  <ErrorBoundary key={`plugin_actions_${i}_${j}`}>
56
- <Action {...actionProps} {...plugin.collectionView?.collectionActionsStartProps}/>
114
+ <Action {...actionProps} {...plugin.collectionView?.collectionActionsStartProps} />
57
115
  </ErrorBoundary>
58
116
  )));
59
117
  }
@@ -63,6 +121,19 @@ export function EntityCollectionViewStartActions<M extends Record<string, any>>(
63
121
  return (
64
122
  <>
65
123
  {actions}
124
+
125
+ {/* Filters Dialog */}
126
+ {resolvedProperties && tableController.setFilterValues && (
127
+ <FiltersDialog
128
+ open={filtersDialogOpen}
129
+ onOpenChange={setFiltersDialogOpen}
130
+ properties={resolvedProperties}
131
+ filterValues={tableController.filterValues}
132
+ setFilterValues={(filterValues) => tableController.setFilterValues?.(filterValues ?? {})}
133
+ forceFilter={collection.forceFilter}
134
+ />
135
+ )}
66
136
  </>
67
137
  );
68
138
  }
139
+
@@ -0,0 +1,252 @@
1
+ import React, { useCallback, useMemo, useState } from "react";
2
+ import {
3
+ FilterValues,
4
+ ResolvedProperty,
5
+ WhereFilterOp
6
+ } from "../../types";
7
+ import {
8
+ Button,
9
+ cls,
10
+ defaultBorderMixin,
11
+ Dialog,
12
+ DialogActions,
13
+ DialogContent,
14
+ DialogTitle,
15
+ FilterListIcon,
16
+ Typography
17
+ } from "@firecms/ui";
18
+ import { useTranslation } from "../../hooks/useTranslation";
19
+ import { StringNumberFilterField } from "../SelectableTable/filters/StringNumberFilterField";
20
+ import { BooleanFilterField } from "../SelectableTable/filters/BooleanFilterField";
21
+ import { DateTimeFilterField } from "../SelectableTable/filters/DateTimeFilterField";
22
+ import { ReferenceFilterField } from "../SelectableTable/filters/ReferenceFilterField";
23
+ import { VirtualTableWhereFilterOp } from "../VirtualTable";
24
+ import { enumToObjectEntries } from "../../util";
25
+
26
+ export interface FiltersDialogProps {
27
+ open: boolean;
28
+ onOpenChange: (open: boolean) => void;
29
+ properties: Record<string, ResolvedProperty>;
30
+ filterValues: FilterValues<any> | undefined;
31
+ setFilterValues: (filterValues?: FilterValues<any>) => void;
32
+ forceFilter?: FilterValues<any>;
33
+ }
34
+
35
+ /**
36
+ * Dialog that displays all filterable properties from a collection
37
+ * and allows setting filter values for each.
38
+ */
39
+ export function FiltersDialog({
40
+ open,
41
+ onOpenChange,
42
+ properties,
43
+ filterValues,
44
+ setFilterValues,
45
+ forceFilter
46
+ }: FiltersDialogProps) {
47
+ const { t } = useTranslation();
48
+
49
+ // Local state for filters being edited
50
+ const [localFilters, setLocalFilters] = useState<FilterValues<any>>(filterValues ?? {});
51
+
52
+ // Track hidden state for reference fields (when reference dialog is open)
53
+ const [hiddenFields, setHiddenFields] = useState<Record<string, boolean>>({});
54
+
55
+ // Reset local state when dialog opens
56
+ React.useEffect(() => {
57
+ if (open) {
58
+ setLocalFilters(filterValues ?? {});
59
+ }
60
+ }, [open, filterValues]);
61
+
62
+ // Get list of filterable properties
63
+ const filterableProperties = useMemo(() => {
64
+ return Object.entries(properties).filter(([key, property]) => {
65
+ if (!property) return false;
66
+ // Force filter properties should not be editable
67
+ if (forceFilter && key in forceFilter) return false;
68
+ // Check if property type is filterable
69
+ const baseProperty = property.dataType === "array" ? property.of : property;
70
+ if (!baseProperty) return false;
71
+ return ["string", "number", "boolean", "date", "reference"].includes(baseProperty.dataType);
72
+ });
73
+ }, [properties, forceFilter]);
74
+
75
+ const handleFilterChange = useCallback((propertyKey: string, value?: [VirtualTableWhereFilterOp, any]) => {
76
+ setLocalFilters(prev => {
77
+ const newFilters = { ...prev };
78
+ if (value) {
79
+ newFilters[propertyKey] = value as [WhereFilterOp, any];
80
+ } else {
81
+ delete newFilters[propertyKey];
82
+ }
83
+ return newFilters;
84
+ });
85
+ }, []);
86
+
87
+ const handleApply = useCallback(() => {
88
+ const hasFilters = Object.keys(localFilters).length > 0;
89
+ setFilterValues(hasFilters ? { ...localFilters, ...forceFilter } : (forceFilter || undefined));
90
+ onOpenChange(false);
91
+ }, [localFilters, setFilterValues, forceFilter, onOpenChange]);
92
+
93
+ const handleClearAll = useCallback(() => {
94
+ setLocalFilters({});
95
+ }, []);
96
+
97
+ const setHiddenForField = useCallback((propertyKey: string, hidden: boolean) => {
98
+ setHiddenFields(prev => ({
99
+ ...prev,
100
+ [propertyKey]: hidden
101
+ }));
102
+ }, []);
103
+
104
+ // Check if any reference field's dialog is currently open (should hide this dialog)
105
+ const isAnyFieldHidden = Object.values(hiddenFields).some(hidden => hidden);
106
+ const activeFilterCount = Object.keys(localFilters).length;
107
+
108
+ const renderFilterField = useCallback((propertyKey: string, property: ResolvedProperty) => {
109
+ const isArray = property.dataType === "array";
110
+ const baseProperty: ResolvedProperty = isArray ? property.of : property;
111
+
112
+ if (!baseProperty) return null;
113
+
114
+ const filterValue = localFilters[propertyKey] as [VirtualTableWhereFilterOp, any] | undefined;
115
+ const setValue = (value?: [VirtualTableWhereFilterOp, any]) => handleFilterChange(propertyKey, value);
116
+
117
+ if (baseProperty.dataType === "reference") {
118
+ return (
119
+ <ReferenceFilterField
120
+ value={filterValue}
121
+ setValue={setValue}
122
+ name={propertyKey}
123
+ isArray={isArray}
124
+ path={baseProperty.path}
125
+ title={property.name}
126
+ includeId={baseProperty.includeId}
127
+ previewProperties={baseProperty.previewProperties}
128
+ hidden={hiddenFields[propertyKey] ?? false}
129
+ setHidden={(hidden) => setHiddenForField(propertyKey, hidden)}
130
+ />
131
+ );
132
+ } else if (baseProperty.dataType === "number" || baseProperty.dataType === "string") {
133
+ const enumValues = baseProperty.enumValues ? enumToObjectEntries(baseProperty.enumValues) : undefined;
134
+ return (
135
+ <StringNumberFilterField
136
+ value={filterValue}
137
+ setValue={setValue}
138
+ name={propertyKey}
139
+ dataType={baseProperty.dataType}
140
+ isArray={isArray}
141
+ enumValues={enumValues}
142
+ title={property.name}
143
+ />
144
+ );
145
+ } else if (baseProperty.dataType === "boolean") {
146
+ return (
147
+ <BooleanFilterField
148
+ value={filterValue}
149
+ setValue={setValue}
150
+ name={propertyKey}
151
+ title={property.name}
152
+ />
153
+ );
154
+ } else if (baseProperty.dataType === "date") {
155
+ return (
156
+ <DateTimeFilterField
157
+ value={filterValue}
158
+ setValue={setValue}
159
+ name={propertyKey}
160
+ mode={baseProperty.mode}
161
+ isArray={isArray}
162
+ title={property.name}
163
+ />
164
+ );
165
+ }
166
+
167
+ return null;
168
+ }, [localFilters, handleFilterChange, hiddenFields, setHiddenForField]);
169
+
170
+ return (
171
+ <Dialog
172
+ open={open}
173
+ onOpenChange={onOpenChange}
174
+ maxWidth="3xl"
175
+ fullWidth
176
+ containerClassName={isAnyFieldHidden ? "hidden" : undefined}
177
+ >
178
+ <DialogTitle className="flex items-center gap-2">
179
+ <Typography variant="h6">{t("filters")}</Typography>
180
+ {activeFilterCount > 0 && (
181
+ <span className="ml-2 px-2 py-0.5 text-xs rounded-full bg-primary text-white">
182
+ {activeFilterCount}
183
+ </span>
184
+ )}
185
+ </DialogTitle>
186
+
187
+ <DialogContent >
188
+ {filterableProperties.length === 0 ? (
189
+ <Typography color="secondary" className="py-8 text-center">
190
+ {t("no_filterable_properties")}
191
+ </Typography>
192
+ ) : (
193
+ <table className="w-full border-collapse">
194
+ <tbody>
195
+ {filterableProperties.map(([propertyKey, property], index) => {
196
+ const hasFilter = propertyKey in localFilters;
197
+
198
+ return (
199
+ <tr key={propertyKey} className={cls(
200
+ index > 0 && "border-t",
201
+ defaultBorderMixin
202
+ )}>
203
+ {/* Property name on the left */}
204
+ <td className="py-3 pr-4 align-middle w-[160px]">
205
+ <Typography
206
+ variant="body2"
207
+ className={cls(
208
+ "font-medium",
209
+ hasFilter && "text-primary"
210
+ )}
211
+ >
212
+ {property.name || propertyKey}
213
+ </Typography>
214
+ </td>
215
+
216
+ {/* Filter field on the right */}
217
+ <td className="py-3">
218
+ {renderFilterField(propertyKey, property)}
219
+ </td>
220
+ </tr>
221
+ );
222
+ })}
223
+ </tbody>
224
+ </table>
225
+ )}
226
+ </DialogContent>
227
+
228
+ <DialogActions>
229
+ <Button
230
+ variant="text"
231
+ onClick={handleClearAll}
232
+ disabled={activeFilterCount === 0}
233
+ >
234
+ {t("clear")}
235
+ </Button>
236
+ <div className="flex-grow" />
237
+ <Button
238
+ variant="text"
239
+ onClick={() => onOpenChange(false)}
240
+ >
241
+ {t("cancel")}
242
+ </Button>
243
+ <Button
244
+ variant="filled"
245
+ onClick={handleApply}
246
+ >
247
+ {t("apply_filters")}
248
+ </Button>
249
+ </DialogActions>
250
+ </Dialog>
251
+ );
252
+ }