@firecms/core 3.0.1 → 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 (334) 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/VirtualTableCell.d.ts +6 -0
  32. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
  33. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
  35. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  36. package/dist/components/VirtualTable/types.d.ts +3 -0
  37. package/dist/components/index.d.ts +4 -0
  38. package/dist/contexts/index.d.ts +10 -0
  39. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  40. package/dist/core/index.d.ts +1 -0
  41. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  42. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  43. package/dist/editor/components/editor-bubble.d.ts +8 -0
  44. package/dist/editor/components/image-bubble.d.ts +5 -0
  45. package/dist/editor/components/index.d.ts +16 -0
  46. package/dist/editor/components/table-bubble.d.ts +5 -0
  47. package/dist/editor/editor.d.ts +30 -0
  48. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  49. package/dist/editor/extensions/Image/index.d.ts +6 -0
  50. package/dist/editor/extensions/Image.d.ts +6 -0
  51. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  52. package/dist/editor/extensions/clipboard.d.ts +7 -0
  53. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  54. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  55. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  56. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  57. package/dist/editor/index.d.ts +2 -0
  58. package/dist/editor/markdown.d.ts +5 -0
  59. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  60. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  61. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  62. package/dist/editor/nodeViews/index.d.ts +6 -0
  63. package/dist/editor/plugins/index.d.ts +2 -0
  64. package/dist/editor/plugins/inputrules.d.ts +6 -0
  65. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  66. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  67. package/dist/editor/schema.d.ts +2 -0
  68. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  69. package/dist/editor/selectors/color-selector.d.ts +10 -0
  70. package/dist/editor/selectors/link-selector.d.ts +8 -0
  71. package/dist/editor/selectors/node-selector.d.ts +15 -0
  72. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  73. package/dist/editor/types.d.ts +5 -0
  74. package/dist/editor/useProseMirror.d.ts +16 -0
  75. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  76. package/dist/editor/utils/remove_classes.d.ts +1 -0
  77. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  78. package/dist/form/components/ErrorFocus.d.ts +1 -1
  79. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  81. package/dist/form/validation.d.ts +3 -2
  82. package/dist/hooks/index.d.ts +1 -0
  83. package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
  84. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  85. package/dist/hooks/useCollapsedGroups.d.ts +6 -3
  86. package/dist/hooks/useTranslation.d.ts +17 -0
  87. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  88. package/dist/index.d.ts +5 -0
  89. package/dist/index.es.js +30146 -15178
  90. package/dist/index.es.js.map +1 -1
  91. package/dist/index.umd.js +30032 -15085
  92. package/dist/index.umd.js.map +1 -1
  93. package/dist/internal/useRestoreScroll.d.ts +1 -1
  94. package/dist/locales/de.d.ts +2 -0
  95. package/dist/locales/en.d.ts +10 -0
  96. package/dist/locales/es.d.ts +10 -0
  97. package/dist/locales/fr.d.ts +2 -0
  98. package/dist/locales/hi.d.ts +2 -0
  99. package/dist/locales/it.d.ts +2 -0
  100. package/dist/locales/pt.d.ts +7 -0
  101. package/dist/preview/PropertyPreviewProps.d.ts +5 -0
  102. package/dist/preview/components/DatePreview.d.ts +13 -3
  103. package/dist/preview/components/ImagePreview.d.ts +5 -1
  104. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  105. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  106. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
  107. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
  108. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
  109. package/dist/types/analytics.d.ts +1 -1
  110. package/dist/types/collections.d.ts +88 -2
  111. package/dist/types/customization_controller.d.ts +2 -1
  112. package/dist/types/datasource.d.ts +0 -1
  113. package/dist/types/firecms.d.ts +2 -1
  114. package/dist/types/index.d.ts +1 -0
  115. package/dist/types/navigation.d.ts +2 -2
  116. package/dist/types/plugins.d.ts +69 -1
  117. package/dist/types/properties.d.ts +268 -12
  118. package/dist/types/storage.d.ts +1 -0
  119. package/dist/types/translations.d.ts +669 -0
  120. package/dist/util/__tests__/conditions.test.d.ts +1 -0
  121. package/dist/util/__tests__/objects.test.d.ts +1 -0
  122. package/dist/util/conditions.d.ts +26 -0
  123. package/dist/util/entities.d.ts +2 -3
  124. package/dist/util/index.d.ts +3 -1
  125. package/dist/util/lazy_eager.d.ts +7 -0
  126. package/dist/util/objects.d.ts +1 -0
  127. package/dist/util/property_utils.d.ts +2 -1
  128. package/dist/util/resolutions.d.ts +3 -3
  129. package/dist/util/useStorageUploadController.d.ts +10 -1
  130. package/package.json +51 -12
  131. package/src/app/Scaffold.tsx +20 -19
  132. package/src/components/AIIcon.tsx +41 -0
  133. package/src/components/ArrayContainer.tsx +7 -8
  134. package/src/components/ClearFilterSortButton.tsx +25 -19
  135. package/src/components/ConfirmationDialog.tsx +4 -4
  136. package/src/components/DeleteEntityDialog.tsx +12 -11
  137. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
  138. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
  139. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
  140. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
  141. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  142. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
  143. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
  144. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  145. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  146. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  147. package/src/components/EntityCollectionView/Board.tsx +324 -0
  148. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  149. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  150. package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
  151. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  152. package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
  153. package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
  154. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
  155. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
  156. package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
  157. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
  158. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
  159. package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
  160. package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
  161. package/src/components/EntityCollectionView/board_types.ts +113 -0
  162. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  163. package/src/components/EntityJsonPreview.tsx +2 -1
  164. package/src/components/EntityView.tsx +3 -2
  165. package/src/components/ErrorBoundary.tsx +27 -15
  166. package/src/components/ErrorTooltip.tsx +2 -1
  167. package/src/components/HomePage/DefaultHomePage.tsx +65 -22
  168. package/src/components/HomePage/HomePageDnD.tsx +59 -42
  169. package/src/components/HomePage/NavigationCard.tsx +20 -18
  170. package/src/components/HomePage/NavigationGroup.tsx +20 -17
  171. package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
  172. package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
  173. package/src/components/LanguageToggle.tsx +66 -0
  174. package/src/components/NotFoundPage.tsx +5 -3
  175. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
  176. package/src/components/ReferenceWidget.tsx +5 -6
  177. package/src/components/SearchIconsView.tsx +3 -1
  178. package/src/components/SelectableTable/SelectableTable.tsx +75 -67
  179. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
  180. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
  181. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
  182. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
  183. package/src/components/UnsavedChangesDialog.tsx +6 -6
  184. package/src/components/UserDisplay.tsx +4 -4
  185. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
  186. package/src/components/VirtualTable/VirtualTable.tsx +275 -119
  187. package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
  188. package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
  189. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
  190. package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
  191. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  192. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
  193. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
  194. package/src/components/VirtualTable/types.tsx +3 -0
  195. package/src/components/common/default_entity_actions.tsx +4 -0
  196. package/src/components/common/useColumnsIds.tsx +95 -3
  197. package/src/components/common/useDataSourceTableController.tsx +12 -4
  198. package/src/components/index.tsx +5 -0
  199. package/src/contexts/BreacrumbsContext.tsx +15 -8
  200. package/src/contexts/index.ts +10 -0
  201. package/src/core/DefaultAppBar.tsx +49 -32
  202. package/src/core/DefaultDrawer.tsx +49 -57
  203. package/src/core/DrawerNavigationGroup.tsx +120 -0
  204. package/src/core/DrawerNavigationItem.tsx +4 -3
  205. package/src/core/EntityEditView.tsx +94 -50
  206. package/src/core/EntityEditViewFormActions.tsx +24 -17
  207. package/src/core/EntitySidePanel.tsx +34 -30
  208. package/src/core/FireCMS.tsx +33 -6
  209. package/src/core/SideDialogs.tsx +4 -2
  210. package/src/core/field_configs.tsx +18 -11
  211. package/src/core/index.tsx +1 -0
  212. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  213. package/src/editor/components/editor-bubble-item.tsx +32 -0
  214. package/src/editor/components/editor-bubble.tsx +118 -0
  215. package/src/editor/components/image-bubble.tsx +156 -0
  216. package/src/editor/components/index.ts +14 -0
  217. package/src/editor/components/table-bubble.tsx +165 -0
  218. package/src/editor/editor.tsx +455 -0
  219. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  220. package/src/editor/extensions/Image/index.ts +133 -0
  221. package/src/editor/extensions/Image.ts +159 -0
  222. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  223. package/src/editor/extensions/clipboard.ts +72 -0
  224. package/src/editor/extensions/custom-keymap.ts +24 -0
  225. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  226. package/src/editor/hooks/useProseMirror.ts +124 -0
  227. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  228. package/src/editor/index.ts +2 -0
  229. package/src/editor/markdown.ts +172 -0
  230. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  231. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  232. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  233. package/src/editor/nodeViews/index.ts +35 -0
  234. package/src/editor/plugins/index.ts +58 -0
  235. package/src/editor/plugins/inputrules.ts +82 -0
  236. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  237. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  238. package/src/editor/schema.ts +240 -0
  239. package/src/editor/selectors/ai-selector.tsx +111 -0
  240. package/src/editor/selectors/color-selector.tsx +200 -0
  241. package/src/editor/selectors/link-selector.tsx +118 -0
  242. package/src/editor/selectors/node-selector.tsx +157 -0
  243. package/src/editor/selectors/text-buttons.tsx +86 -0
  244. package/src/editor/types.ts +6 -0
  245. package/src/editor/useProseMirror.ts +126 -0
  246. package/src/editor/utils/prosemirror-utils.ts +108 -0
  247. package/src/editor/utils/remove_classes.ts +17 -0
  248. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  249. package/src/form/EntityForm.tsx +149 -67
  250. package/src/form/EntityFormActions.tsx +19 -12
  251. package/src/form/PropertyFieldBinding.tsx +68 -51
  252. package/src/form/components/ErrorFocus.tsx +3 -3
  253. package/src/form/components/LocalChangesMenu.tsx +13 -13
  254. package/src/form/components/StorageItemPreview.tsx +5 -3
  255. package/src/form/components/StorageUploadProgress.tsx +18 -3
  256. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  257. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
  258. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  259. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
  260. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
  261. package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
  262. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
  263. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  264. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  265. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  266. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  267. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  268. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  269. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  270. package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
  271. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  272. package/src/form/validation.ts +245 -160
  273. package/src/hooks/index.tsx +1 -0
  274. package/src/hooks/useBreadcrumbsController.tsx +18 -0
  275. package/src/hooks/useBuildNavigationController.tsx +91 -41
  276. package/src/hooks/useCollapsedGroups.ts +18 -9
  277. package/src/hooks/useTranslation.ts +31 -0
  278. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  279. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  280. package/src/index.ts +5 -0
  281. package/src/internal/useBuildDataSource.ts +68 -34
  282. package/src/internal/useBuildSideDialogsController.tsx +11 -8
  283. package/src/internal/useBuildSideEntityController.tsx +24 -24
  284. package/src/internal/useRestoreScroll.tsx +26 -14
  285. package/src/locales/de.ts +718 -0
  286. package/src/locales/en.ts +730 -0
  287. package/src/locales/es.ts +730 -0
  288. package/src/locales/fr.ts +718 -0
  289. package/src/locales/hi.ts +718 -0
  290. package/src/locales/it.ts +718 -0
  291. package/src/locales/pt.ts +727 -0
  292. package/src/preview/PropertyPreview.tsx +43 -33
  293. package/src/preview/PropertyPreviewProps.tsx +6 -0
  294. package/src/preview/components/DatePreview.tsx +72 -4
  295. package/src/preview/components/EmptyValue.tsx +1 -1
  296. package/src/preview/components/ImagePreview.tsx +37 -21
  297. package/src/preview/components/ReferencePreview.tsx +2 -1
  298. package/src/preview/components/StorageThumbnail.tsx +16 -12
  299. package/src/preview/components/UrlComponentPreview.tsx +32 -27
  300. package/src/preview/components/UserPreview.tsx +3 -1
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
  303. package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
  304. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  305. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
  306. package/src/routes/CustomCMSRoute.tsx +1 -0
  307. package/src/routes/FireCMSRoute.tsx +87 -65
  308. package/src/types/analytics.ts +10 -0
  309. package/src/types/collections.ts +97 -3
  310. package/src/types/customization_controller.tsx +2 -1
  311. package/src/types/datasource.ts +54 -56
  312. package/src/types/firecms.tsx +2 -1
  313. package/src/types/index.ts +1 -0
  314. package/src/types/navigation.ts +2 -2
  315. package/src/types/plugins.tsx +77 -1
  316. package/src/types/properties.ts +359 -37
  317. package/src/types/storage.ts +2 -1
  318. package/src/types/translations.ts +752 -0
  319. package/src/util/__tests__/conditions.test.ts +506 -0
  320. package/src/util/__tests__/objects.test.ts +196 -0
  321. package/src/util/callbacks.ts +6 -3
  322. package/src/util/collections.ts +51 -6
  323. package/src/util/conditions.ts +339 -0
  324. package/src/util/entities.ts +29 -30
  325. package/src/util/entity_cache.ts +2 -1
  326. package/src/util/index.ts +3 -1
  327. package/src/util/join_collections.ts +10 -8
  328. package/src/util/lazy_eager.tsx +33 -0
  329. package/src/util/objects.ts +46 -13
  330. package/src/util/{references.ts → previews.ts} +16 -2
  331. package/src/util/property_utils.tsx +37 -11
  332. package/src/util/resolutions.ts +62 -58
  333. package/src/util/useStorageUploadController.tsx +23 -29
  334. /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
@@ -38,9 +38,12 @@ import {
38
38
  fieldBackgroundDisabledMixin,
39
39
  fieldBackgroundHoverMixin,
40
40
  fieldBackgroundMixin,
41
- Typography
41
+ Typography,
42
+ IconButton,
43
+ CloseIcon
42
44
  } from "@firecms/ui";
43
45
  import { useClearRestoreValue } from "../useClearRestoreValue";
46
+ import { useTranslation } from "../../hooks/useTranslation";
44
47
 
45
48
  const dropZoneClasses = "box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid";
46
49
  const disabledClasses = fieldBackgroundDisabledMixin;
@@ -52,18 +55,18 @@ const rejectDropClasses = "transition-colors duration-200 ease-[cubic-bezier(0,0
52
55
  type StorageUploadFieldProps = FieldProps<string | string[]>;
53
56
 
54
57
  export function StorageUploadFieldBinding({
55
- propertyKey,
56
- value,
57
- setValue,
58
- error,
59
- showError,
60
- autoFocus,
61
- minimalistView,
62
- property,
63
- includeDescription,
64
- context,
65
- isSubmitting,
66
- }: StorageUploadFieldProps) {
58
+ propertyKey,
59
+ value,
60
+ setValue,
61
+ error,
62
+ showError,
63
+ autoFocus,
64
+ minimalistView,
65
+ property,
66
+ includeDescription,
67
+ context,
68
+ isSubmitting,
69
+ }: StorageUploadFieldProps) {
67
70
 
68
71
  const authController = useAuthController();
69
72
 
@@ -100,7 +103,7 @@ export function StorageUploadFieldBinding({
100
103
  });
101
104
 
102
105
  const resolvedProperty = resolveProperty({
103
- propertyOrBuilder: property as PropertyOrBuilder,
106
+ propertyOrBuilder: property as PropertyOrBuilder<string>,
104
107
  authController
105
108
  }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
106
109
 
@@ -109,12 +112,27 @@ export function StorageUploadFieldBinding({
109
112
  <>
110
113
 
111
114
  {!minimalistView &&
112
- <LabelWithIconAndTooltip
113
- propertyKey={propertyKey}
114
- icon={getIconForProperty(property, "small")}
115
- required={property.validation?.required}
116
- title={property.name}
117
- className={"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>}
115
+ <div className="flex items-center w-full">
116
+ <LabelWithIconAndTooltip
117
+ propertyKey={propertyKey}
118
+ icon={getIconForProperty(property, "small")}
119
+ required={property.validation?.required}
120
+ title={property.name}
121
+ className={"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5"} />
122
+ <div className="flex-grow"/>
123
+ {(property.nullable || property.clearable) && !disabled && (
124
+ <IconButton
125
+ size="small"
126
+ onClick={(e) => {
127
+ e.stopPropagation();
128
+ e.preventDefault();
129
+ setValue(null);
130
+ }}
131
+ >
132
+ <CloseIcon size={"small"}/>
133
+ </IconButton>
134
+ )}
135
+ </div>}
118
136
 
119
137
  <StorageUpload
120
138
  value={internalValue}
@@ -128,14 +146,13 @@ export function StorageUploadFieldBinding({
128
146
  onFileUploadComplete={onFileUploadComplete}
129
147
  storagePathBuilder={storagePathBuilder}
130
148
  storage={storage}
131
- multipleFilesSupported={multipleFilesSupported}/>
149
+ multipleFilesSupported={multipleFilesSupported} />
132
150
 
133
151
  <FieldHelperText includeDescription={includeDescription}
134
- showError={showError}
135
- error={error}
136
- disabled={disabled}
137
- property={property}/>
138
-
152
+ showError={showError}
153
+ error={error}
154
+ disabled={disabled}
155
+ property={property} />
139
156
  </>
140
157
  );
141
158
  }
@@ -154,15 +171,15 @@ interface SortableStorageItemProps {
154
171
  }
155
172
 
156
173
  function SortableStorageItem({
157
- id,
158
- entry,
159
- property,
160
- metadata,
161
- storagePathBuilder,
162
- onFileUploadComplete,
163
- onClear,
164
- disabled,
165
- }: SortableStorageItemProps) {
174
+ id,
175
+ entry,
176
+ property,
177
+ metadata,
178
+ storagePathBuilder,
179
+ onFileUploadComplete,
180
+ onClear,
181
+ disabled,
182
+ }: SortableStorageItemProps) {
166
183
 
167
184
  const {
168
185
  attributes,
@@ -201,7 +218,7 @@ function SortableStorageItem({
201
218
  disabled={disabled}
202
219
  value={entry.storagePathOrDownloadUrl}
203
220
  onRemove={() => onClear(entry.storagePathOrDownloadUrl!)}
204
- size={entry.size}/>
221
+ size={entry.size} />
205
222
  );
206
223
  } else if (entry.file) {
207
224
  child = (
@@ -231,21 +248,21 @@ function SortableStorageItem({
231
248
  }
232
249
 
233
250
  function FileDropComponent({
234
- storage,
235
- disabled,
236
- onFilesAdded,
237
- multipleFilesSupported,
238
- autoFocus,
239
- internalValue,
240
- property,
241
- onClear,
242
- metadata,
243
- storagePathBuilder,
244
- onFileUploadComplete,
245
- name,
246
- helpText,
247
- isDndItemDragging
248
- }: {
251
+ storage,
252
+ disabled,
253
+ onFilesAdded,
254
+ multipleFilesSupported,
255
+ autoFocus,
256
+ internalValue,
257
+ property,
258
+ onClear,
259
+ metadata,
260
+ storagePathBuilder,
261
+ onFileUploadComplete,
262
+ name,
263
+ helpText,
264
+ isDndItemDragging
265
+ }: {
249
266
  storage: StorageConfig,
250
267
  disabled: boolean,
251
268
  onFilesAdded: (acceptedFiles: File[]) => Promise<void>,
@@ -271,33 +288,33 @@ function FileDropComponent({
271
288
  isDragAccept,
272
289
  isDragReject
273
290
  } = useDropzone({
274
- accept: storage.acceptedFiles ? storage.acceptedFiles.reduce((acc, ext) => ({
275
- ...acc,
276
- [ext]: []
277
- }), {}) : undefined,
278
- disabled: disabled || isDndItemDragging,
279
- noDragEventsBubbling: true,
280
- maxSize: storage.maxSize,
281
- onDrop: onFilesAdded,
282
- onDropRejected: (fileRejections) => {
283
- for (const fileRejection of fileRejections) {
284
- for (const error of fileRejection.errors) {
285
- console.error("Error uploading file: ", error);
286
- if (error.code === "file-too-large") {
287
- snackbarContext.open({
288
- type: "error",
289
- message: `Error uploading file: File is larger than ${storage.maxSize} bytes`
290
- });
291
- } else if (error.code === "file-invalid-type") {
292
- snackbarContext.open({
293
- type: "error",
294
- message: "Error uploading file: File type is not supported"
295
- });
296
- }
291
+ accept: storage.acceptedFiles ? storage.acceptedFiles.reduce((acc, ext) => ({
292
+ ...acc,
293
+ [ext]: []
294
+ }), {}) : undefined,
295
+ disabled: disabled || isDndItemDragging,
296
+ noDragEventsBubbling: true,
297
+ maxSize: storage.maxSize,
298
+ onDrop: onFilesAdded,
299
+ onDropRejected: (fileRejections) => {
300
+ for (const fileRejection of fileRejections) {
301
+ for (const error of fileRejection.errors) {
302
+ console.error("Error uploading file: ", error);
303
+ if (error.code === "file-too-large") {
304
+ snackbarContext.open({
305
+ type: "error",
306
+ message: `Error uploading file: File is larger than ${storage.maxSize} bytes`
307
+ });
308
+ } else if (error.code === "file-invalid-type") {
309
+ snackbarContext.open({
310
+ type: "error",
311
+ message: "Error uploading file: File type is not supported"
312
+ });
297
313
  }
298
314
  }
299
315
  }
300
316
  }
317
+ }
301
318
  );
302
319
 
303
320
  return (
@@ -349,8 +366,8 @@ function FileDropComponent({
349
366
  <div
350
367
  className="flex-grow min-h-[38px] box-border m-2 text-center">
351
368
  <Typography align={"center"}
352
- variant={"label"}
353
- className={disabled ? "text-surface-accent-600 dark:text-surface-accent-500" : ""}>
369
+ variant={"label"}
370
+ className={disabled ? "text-surface-accent-600 dark:text-surface-accent-500" : ""}>
354
371
  {helpText}
355
372
  </Typography>
356
373
  </div>
@@ -374,19 +391,20 @@ export interface StorageUploadProps {
374
391
  }
375
392
 
376
393
  export function StorageUpload({
377
- property,
378
- name,
379
- value, // This is internalValue from useStorageUploadController
380
- setInternalValue,
381
- onChange,
382
- multipleFilesSupported,
383
- onFileUploadComplete,
384
- disabled,
385
- onFilesAdded,
386
- autoFocus,
387
- storage,
388
- storagePathBuilder,
389
- }: StorageUploadProps) {
394
+ property,
395
+ name,
396
+ value, // This is internalValue from useStorageUploadController
397
+ setInternalValue,
398
+ onChange,
399
+ multipleFilesSupported,
400
+ onFileUploadComplete,
401
+ disabled,
402
+ onFilesAdded,
403
+ autoFocus,
404
+ storage,
405
+ storagePathBuilder,
406
+ }: StorageUploadProps) {
407
+ const { t } = useTranslation();
390
408
 
391
409
  if (multipleFilesSupported) {
392
410
  const arrayProperty = property as ResolvedArrayProperty<string[]>;
@@ -461,8 +479,8 @@ export function StorageUpload({
461
479
  }, [value, multipleFilesSupported, onChange, setInternalValue]);
462
480
 
463
481
  const helpText = multipleFilesSupported
464
- ? "Drag 'n' drop some files here, or click to select files. Drag to reorder."
465
- : "Drag 'n' drop a file here, or click to select one";
482
+ ? t("drag_drop_multiple")
483
+ : t("drag_drop_single");
466
484
 
467
485
  const renderProperty: ResolvedStringProperty = multipleFilesSupported
468
486
  ? (property as ResolvedArrayProperty<string[]>).of as ResolvedStringProperty
@@ -500,6 +518,6 @@ export function StorageUpload({
500
518
  );
501
519
  } else {
502
520
  // For single file, no D&D context is needed
503
- return <FileDropComponent {...fileDropProps} isDndItemDragging={false}/>;
521
+ return <FileDropComponent {...fileDropProps} isDndItemDragging={false} />;
504
522
  }
505
523
  }
@@ -3,7 +3,7 @@ import React from "react";
3
3
  import { FieldProps } from "../../types";
4
4
  import { getIconForProperty } from "../../util";
5
5
  import { FieldHelperText, LabelWithIcon } from "../components";
6
- import { BooleanSwitchWithLabel } from "@firecms/ui";
6
+ import { BooleanSwitchWithLabel, IconButton, CloseIcon } from "@firecms/ui";
7
7
  import { useClearRestoreValue } from "../useClearRestoreValue";
8
8
  import { PropertyIdCopyTooltip } from "../../components";
9
9
 
@@ -39,19 +39,36 @@ export const SwitchFieldBinding = function SwitchFieldBinding({
39
39
  <>
40
40
 
41
41
  <PropertyIdCopyTooltip propertyKey={propertyKey}>
42
- <BooleanSwitchWithLabel
43
- value={value}
44
- onValueChange={(v) => setValue(v)}
45
- error={showError}
46
- className={property.widthPercentage !== undefined ? "mt-8" : undefined}
47
- label={<LabelWithIcon
48
- icon={getIconForProperty(property, "small")}
49
- required={property.validation?.required}
50
- title={property.name}/>}
51
- disabled={disabled}
52
- autoFocus={autoFocus}
53
- size={size}
54
- />
42
+ <div className="flex items-center">
43
+ <BooleanSwitchWithLabel
44
+ value={value}
45
+ onValueChange={(v) => setValue(v)}
46
+ error={showError}
47
+ className={property.widthPercentage !== undefined ? "mt-8" : undefined}
48
+ label={<LabelWithIcon
49
+ icon={getIconForProperty(property, "small")}
50
+ required={property.validation?.required}
51
+ title={property.name}/>}
52
+ disabled={disabled}
53
+ autoFocus={autoFocus}
54
+ size={size}
55
+ switchAdornment={
56
+ (property.nullable || property.clearable) && !disabled && value !== null && (
57
+ <IconButton
58
+ size="small"
59
+ onClick={(e) => {
60
+ e.stopPropagation();
61
+ e.preventDefault();
62
+ setValue(null);
63
+ }}
64
+ className="mr-2"
65
+ >
66
+ <CloseIcon size={"small"}/>
67
+ </IconButton>
68
+ )
69
+ }
70
+ />
71
+ </div>
55
72
  </PropertyIdCopyTooltip>
56
73
 
57
74
  <FieldHelperText includeDescription={includeDescription}
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback } from "react";
2
2
 
3
- import { CloseIcon, Collapse, IconButton, TextField } from "@firecms/ui";
3
+ import { CloseIcon, Collapse, IconButton, TextField, TextareaAutosize, fieldBackgroundHoverMixin, fieldBackgroundMixin, cls } from "@firecms/ui";
4
4
  import { FieldProps, PreviewType } from "../../types";
5
5
  import { FieldHelperText, LabelWithIcon } from "../components";
6
6
  import { getIconForProperty } from "../../util";
@@ -19,17 +19,17 @@ interface TextFieldBindingProps<T extends string | number> extends FieldProps<T>
19
19
  * @group Form fields
20
20
  */
21
21
  export function TextFieldBinding<T extends string | number>({
22
- propertyKey,
23
- value,
24
- setValue,
25
- error,
26
- showError,
27
- disabled,
28
- autoFocus,
29
- property,
30
- includeDescription,
31
- size = "large"
32
- }: TextFieldBindingProps<T>) {
22
+ propertyKey,
23
+ value,
24
+ setValue,
25
+ error,
26
+ showError,
27
+ disabled,
28
+ autoFocus,
29
+ property,
30
+ includeDescription,
31
+ size = "large"
32
+ }: TextFieldBindingProps<T>) {
33
33
 
34
34
  let multiline: boolean | undefined;
35
35
  let url: boolean | PreviewType | undefined;
@@ -68,46 +68,85 @@ export function TextFieldBinding<T extends string | number>({
68
68
  const isMultiline = Boolean(multiline);
69
69
 
70
70
  const inputType = property.dataType === "number" ? "number" : undefined;
71
+
72
+ const label = (
73
+ <LabelWithIcon
74
+ icon={getIconForProperty(property, "small")}
75
+ required={property.validation?.required}
76
+ title={property.name} />
77
+ );
78
+
71
79
  return (<>
72
- <PropertyIdCopyTooltip propertyKey={propertyKey}>
80
+ <PropertyIdCopyTooltip propertyKey={propertyKey}>
81
+ {isMultiline ? (
82
+ <div className={cls(
83
+ "rounded-md relative max-w-full min-h-[64px]",
84
+ fieldBackgroundMixin,
85
+ fieldBackgroundHoverMixin,
86
+ showError && error ? "border border-red-500 dark:border-red-600" : "",
87
+ property.widthPercentage !== undefined ? "mt-8" : undefined
88
+ )}>
89
+ <div className="pointer-events-none absolute top-1 text-xs font-medium px-3 text-text-secondary dark:text-text-secondary-dark">
90
+ {label}
91
+ </div>
92
+ <TextareaAutosize
93
+ value={value ?? ""}
94
+ onChange={onChange}
95
+ autoFocus={autoFocus}
96
+ disabled={disabled}
97
+ className={cls(
98
+ "rounded-md resize-none w-full outline-none p-[32px] text-base bg-transparent min-h-[64px] px-3 pt-8",
99
+ disabled && "outline-none opacity-50 text-surface-accent-600 dark:text-surface-accent-500",
100
+ showError && error ? "text-red-500 dark:text-red-600" : ""
101
+ )}
102
+ />
103
+ {(property.nullable || property.clearable) && value !== null && value !== undefined && (
104
+ <div className="flex flex-row justify-center items-center absolute h-full right-0 top-0 mr-4">
105
+ <IconButton size="small" onClick={handleClearClick}>
106
+ <CloseIcon size="small" />
107
+ </IconButton>
108
+ </div>
109
+ )}
110
+ </div>
111
+ ) : (
73
112
  <TextField
74
113
  size={size}
75
114
  value={value}
76
115
  onChange={onChange}
77
116
  autoFocus={autoFocus}
78
117
  className={property.widthPercentage !== undefined ? "mt-8" : undefined}
79
- label={<LabelWithIcon
80
- icon={getIconForProperty(property, "small")}
81
- required={property.validation?.required}
82
- title={property.name}/>}
118
+ label={label}
83
119
  type={inputType}
84
- multiline={isMultiline}
85
120
  disabled={disabled}
86
121
  endAdornment={
87
- property.clearable && <IconButton
88
- onClick={handleClearClick}>
89
- <CloseIcon/>
90
- </IconButton>
122
+ (property.nullable || property.clearable) && value !== null && value !== undefined ? (
123
+ <IconButton
124
+ size="small"
125
+ onClick={handleClearClick}>
126
+ <CloseIcon size="small" />
127
+ </IconButton>
128
+ ) : undefined
91
129
  }
92
130
  error={showError ? error : undefined}
93
- inputClassName={error ? "text-red-500 dark:text-red-600" : ""}/>
94
- </PropertyIdCopyTooltip>
95
- <FieldHelperText includeDescription={includeDescription}
96
- showError={showError}
97
- error={error}
98
- disabled={disabled}
99
- property={property}/>
131
+ inputClassName={error ? "text-red-500 dark:text-red-600" : ""} />
132
+ )}
133
+ </PropertyIdCopyTooltip>
134
+ <FieldHelperText includeDescription={includeDescription}
135
+ showError={showError}
136
+ error={error}
137
+ disabled={disabled}
138
+ property={property} />
100
139
 
101
- {url && <Collapse
102
- className="mt-1 ml-1"
103
- in={Boolean(value)}>
104
- <PropertyPreview
105
- value={value}
106
- property={property}
107
- size={size}/>
108
- </Collapse>}
140
+ {url && <Collapse
141
+ className="mt-1 ml-1"
142
+ in={Boolean(value)}>
143
+ <PropertyPreview
144
+ value={value}
145
+ property={property}
146
+ size={size} />
147
+ </Collapse>}
109
148
 
110
- </>
149
+ </>
111
150
  );
112
151
 
113
152
  }
@@ -59,11 +59,13 @@ export function UserSelectFieldBinding({
59
59
  />
60
60
  </PropertyIdCopyTooltip>}
61
61
  endAdornment={
62
- property.clearable && !disabled && value && <IconButton
63
- size="small"
64
- onClick={handleClearClick}>
65
- <CloseIcon size={"small"}/>
66
- </IconButton>
62
+ (property.nullable || property.clearable) && !disabled && value !== null && value !== undefined ? (
63
+ <IconButton
64
+ size="small"
65
+ onClick={handleClearClick}>
66
+ <CloseIcon size={"small"}/>
67
+ </IconButton>
68
+ ) : undefined
67
69
  }
68
70
  onValueChange={(updatedValue: string) => {
69
71
  const newValue = updatedValue || null;