@firecms/core 3.0.0-alpha.7 → 3.0.0-alpha.70

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 (460) hide show
  1. package/README.md +1 -1
  2. package/dist/components/ArrayContainer.d.ts +42 -0
  3. package/dist/components/CircularProgressCenter.d.ts +11 -0
  4. package/dist/components/DeleteConfirmationDialog.d.ts +9 -0
  5. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +30 -0
  6. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +106 -0
  7. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +15 -0
  8. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +33 -0
  9. package/dist/components/EntityCollectionTable/filters/BooleanFilterField.d.ts +9 -0
  10. package/dist/components/EntityCollectionTable/filters/DateTimeFilterField.d.ts +11 -0
  11. package/dist/components/EntityCollectionTable/filters/ReferenceFilterField.d.ts +14 -0
  12. package/dist/components/EntityCollectionTable/filters/StringNumberFilterField.d.ts +13 -0
  13. package/dist/components/EntityCollectionTable/index.d.ts +4 -0
  14. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +18 -0
  15. package/dist/components/EntityCollectionTable/internal/DeleteEntityDialog.d.ts +12 -0
  16. package/dist/components/EntityCollectionTable/internal/EntityCollectionRowActions.d.ts +35 -0
  17. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +26 -0
  18. package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +9 -0
  19. package/dist/components/EntityCollectionTable/internal/PropertyTableCell.d.ts +18 -0
  20. package/dist/components/EntityCollectionTable/internal/common.d.ts +4 -0
  21. package/dist/components/EntityCollectionTable/internal/default_entity_actions.d.ts +6 -0
  22. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +5 -0
  23. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +23 -0
  24. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +13 -0
  25. package/dist/components/EntityCollectionTable/internal/popup_field/useWindowSize.d.ts +6 -0
  26. package/dist/components/EntityCollectionTable/types.d.ts +39 -0
  27. package/dist/components/EntityCollectionTable/useDebouncedData.d.ts +9 -0
  28. package/dist/components/EntityCollectionTable/useEntityCollectionTableController.d.ts +21 -0
  29. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +37 -0
  30. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +14 -0
  31. package/dist/components/EntityCollectionView/useColumnsIds.d.ts +4 -0
  32. package/dist/components/EntityPreview.d.ts +11 -0
  33. package/dist/components/ErrorBoundary.d.ts +11 -0
  34. package/dist/components/ErrorTooltip.d.ts +2 -0
  35. package/dist/components/ErrorView.d.ts +19 -0
  36. package/dist/components/FieldConfigBadge.d.ts +4 -0
  37. package/dist/components/FireCMSAppBar.d.ts +26 -0
  38. package/dist/components/FireCMSLogo.d.ts +7 -0
  39. package/dist/components/HomePage/DefaultHomePage.d.ts +21 -0
  40. package/dist/components/HomePage/FavouritesView.d.ts +3 -0
  41. package/dist/components/HomePage/NavigationCollectionCard.d.ts +17 -0
  42. package/dist/components/HomePage/NavigationGroup.d.ts +4 -0
  43. package/dist/components/HomePage/index.d.ts +3 -0
  44. package/dist/components/LabelWithIcon.d.ts +14 -0
  45. package/dist/components/NotFoundPage.d.ts +1 -0
  46. package/dist/components/ReferenceSelectionInner.d.ts +58 -0
  47. package/dist/components/ReferenceWidget.d.ts +28 -0
  48. package/dist/components/VirtualTable/VirtualTable.d.ts +11 -0
  49. package/dist/components/VirtualTable/VirtualTableCell.d.ts +14 -0
  50. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +27 -0
  51. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  52. package/dist/components/VirtualTable/VirtualTableProps.d.ts +215 -0
  53. package/dist/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  54. package/dist/components/VirtualTable/common.d.ts +2 -0
  55. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +11 -0
  56. package/dist/components/VirtualTable/fields/VirtualTableInput.d.ts +8 -0
  57. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.d.ts +8 -0
  58. package/dist/components/VirtualTable/fields/VirtualTableSelect.d.ts +15 -0
  59. package/dist/components/VirtualTable/fields/VirtualTableSwitch.d.ts +7 -0
  60. package/dist/components/VirtualTable/index.d.ts +2 -0
  61. package/dist/components/VirtualTable/types.d.ts +34 -0
  62. package/dist/components/index.d.ts +20 -0
  63. package/dist/contexts/AuthControllerContext.d.ts +3 -0
  64. package/dist/contexts/DataSourceContext.d.ts +3 -0
  65. package/dist/contexts/DialogsProvider.d.ts +4 -0
  66. package/dist/contexts/ModeController.d.ts +4 -0
  67. package/dist/contexts/NavigationContext.d.ts +3 -0
  68. package/dist/contexts/SideDialogsControllerContext.d.ts +3 -0
  69. package/dist/contexts/SideEntityControllerContext.d.ts +3 -0
  70. package/dist/contexts/SnackbarProvider.d.ts +2 -0
  71. package/dist/contexts/StorageSourceContext.d.ts +3 -0
  72. package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  73. package/dist/contexts/index.d.ts +3 -0
  74. package/dist/core/Drawer.d.ts +23 -0
  75. package/dist/core/EntitySidePanel.d.ts +10 -0
  76. package/dist/core/FireCMS.d.ts +14 -0
  77. package/dist/core/NavigationRoutes.d.ts +21 -0
  78. package/dist/core/Scaffold.d.ts +52 -0
  79. package/dist/core/SideDialogs.d.ts +23 -0
  80. package/dist/core/field_configs.d.ts +7 -0
  81. package/dist/core/index.d.ts +10 -0
  82. package/dist/core/useBuildLocalConfigurationPersistence.d.ts +2 -0
  83. package/dist/core/useBuildModeController.d.ts +6 -0
  84. package/dist/form/EntityForm.d.ts +75 -0
  85. package/dist/form/PropertyFieldBinding.d.ts +30 -0
  86. package/dist/form/components/CustomIdField.d.ts +9 -0
  87. package/dist/form/components/ErrorFocus.d.ts +4 -0
  88. package/dist/form/components/FieldHelperText.d.ts +12 -0
  89. package/dist/form/components/FormikArrayContainer.d.ts +18 -0
  90. package/dist/form/components/StorageItemPreview.d.ts +13 -0
  91. package/dist/form/components/StorageUploadProgress.d.ts +10 -0
  92. package/dist/form/components/SubmitListener.d.ts +1 -0
  93. package/dist/form/components/SwitchControl.d.ts +8 -0
  94. package/dist/form/components/index.d.ts +3 -0
  95. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +9 -0
  96. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +11 -0
  97. package/dist/form/field_bindings/BlockFieldBinding.d.ts +10 -0
  98. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +11 -0
  99. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +7 -0
  100. package/dist/form/field_bindings/MapFieldBinding.d.ts +9 -0
  101. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +9 -0
  102. package/dist/form/field_bindings/MultiSelectBinding.d.ts +9 -0
  103. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +10 -0
  104. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +9 -0
  105. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +10 -0
  106. package/dist/form/field_bindings/SelectFieldBinding.d.ts +12 -0
  107. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +28 -0
  108. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +12 -0
  109. package/dist/form/field_bindings/TextFieldBinding.d.ts +12 -0
  110. package/dist/form/index.d.ts +20 -0
  111. package/dist/form/useClearRestoreValue.d.ts +13 -0
  112. package/dist/form/validation.d.ts +25 -0
  113. package/dist/hooks/data/delete.d.ts +37 -0
  114. package/dist/hooks/data/save.d.ts +42 -0
  115. package/dist/hooks/data/useCollectionFetch.d.ts +50 -0
  116. package/dist/hooks/data/useDataOrder.d.ts +12 -0
  117. package/dist/hooks/data/useDataSource.d.ts +6 -0
  118. package/dist/hooks/data/useEntityFetch.d.ts +28 -0
  119. package/dist/hooks/index.d.ts +19 -0
  120. package/dist/hooks/useAuthController.d.ts +11 -0
  121. package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  122. package/dist/hooks/useClipboard.d.ts +57 -0
  123. package/dist/hooks/useDialogsController.d.ts +11 -0
  124. package/dist/hooks/useFireCMSContext.d.ts +12 -0
  125. package/dist/hooks/useLargeLayout.d.ts +1 -0
  126. package/dist/hooks/useModeController.d.ts +20 -0
  127. package/dist/hooks/useNavigationController.d.ts +9 -0
  128. package/dist/hooks/useReferenceDialog.d.ts +18 -0
  129. package/dist/hooks/useResolvedNavigationFrom.d.ts +72 -0
  130. package/dist/hooks/useSideDialogsController.d.ts +18 -0
  131. package/dist/hooks/useSideEntityController.d.ts +12 -0
  132. package/dist/hooks/useSnackbarController.d.ts +41 -0
  133. package/dist/hooks/useStorageSource.d.ts +6 -0
  134. package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
  135. package/dist/index.d.ts +8 -0
  136. package/dist/index.es.js +12415 -25618
  137. package/dist/index.es.js.map +1 -1
  138. package/dist/index.umd.js +5 -1027
  139. package/dist/index.umd.js.map +1 -1
  140. package/dist/internal/EntityView.d.ts +22 -0
  141. package/dist/internal/common.d.ts +3 -0
  142. package/dist/internal/useBuildDataSource.d.ts +22 -0
  143. package/dist/internal/useBuildNavigationController.d.ts +14 -0
  144. package/dist/internal/useBuildSideDialogsController.d.ts +2 -0
  145. package/dist/internal/useBuildSideEntityController.d.ts +4 -0
  146. package/dist/internal/useLocaleConfig.d.ts +1 -0
  147. package/dist/internal/useRestoreScroll.d.ts +6 -0
  148. package/dist/internal/useUnsavedChangesDialog.d.ts +14 -0
  149. package/dist/preview/PropertyPreview.d.ts +7 -0
  150. package/dist/preview/PropertyPreviewProps.d.ts +43 -0
  151. package/dist/preview/components/ArrayEnumPreview.d.ts +11 -0
  152. package/dist/preview/components/AsyncPreviewComponent.d.ts +11 -0
  153. package/dist/preview/components/BooleanPreview.d.ts +7 -0
  154. package/dist/preview/components/DatePreview.d.ts +7 -0
  155. package/dist/preview/components/EmptyValue.d.ts +4 -0
  156. package/dist/preview/components/EnumValuesChip.d.ts +13 -0
  157. package/dist/preview/components/ImagePreview.d.ts +12 -0
  158. package/dist/preview/components/ReferencePreview.d.ts +22 -0
  159. package/dist/preview/components/StorageThumbnail.d.ts +13 -0
  160. package/dist/preview/components/UrlComponentPreview.d.ts +12 -0
  161. package/dist/preview/index.d.ts +23 -0
  162. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +5 -0
  163. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +5 -0
  164. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +5 -0
  165. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +5 -0
  166. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +5 -0
  167. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +5 -0
  168. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +5 -0
  169. package/dist/preview/property_previews/MapPropertyPreview.d.ts +8 -0
  170. package/dist/preview/property_previews/NumberPropertyPreview.d.ts +6 -0
  171. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +14 -0
  172. package/dist/preview/property_previews/StringPropertyPreview.d.ts +6 -0
  173. package/dist/preview/util.d.ts +7 -0
  174. package/dist/types/analytics.d.ts +1 -0
  175. package/dist/types/appcheck.d.ts +26 -0
  176. package/dist/types/auth.d.ts +40 -0
  177. package/dist/types/collections.d.ts +451 -0
  178. package/dist/types/datasource.d.ts +262 -0
  179. package/dist/types/dialogs_controller.d.ts +32 -0
  180. package/dist/types/entities.d.ts +57 -0
  181. package/dist/types/entity_actions.d.ts +35 -0
  182. package/dist/types/entity_callbacks.d.ts +171 -0
  183. package/dist/types/entity_link_builder.d.ts +7 -0
  184. package/dist/types/export_import.d.ts +21 -0
  185. package/dist/types/fields.d.ts +181 -0
  186. package/dist/types/firecms.d.ts +151 -0
  187. package/dist/types/firecms_context.d.ts +110 -0
  188. package/dist/types/index.d.ts +26 -0
  189. package/dist/types/local_config_persistence.d.ts +21 -0
  190. package/dist/types/locales.d.ts +4 -0
  191. package/dist/types/modify_collections.d.ts +5 -0
  192. package/dist/types/navigation.d.ts +178 -0
  193. package/dist/types/permissions.d.ts +63 -0
  194. package/dist/types/plugins.d.ts +179 -0
  195. package/dist/types/properties.d.ts +681 -0
  196. package/dist/types/property_config.d.ts +42 -0
  197. package/dist/types/resolved_entities.d.ts +98 -0
  198. package/dist/types/side_dialogs_controller.d.ts +57 -0
  199. package/dist/types/side_entity_controller.d.ts +83 -0
  200. package/dist/types/storage.d.ts +82 -0
  201. package/dist/types/user.d.ts +36 -0
  202. package/dist/util/arrays.d.ts +1 -0
  203. package/dist/util/builders.d.ts +64 -0
  204. package/dist/util/chip_utils.d.ts +3 -0
  205. package/dist/util/collections.d.ts +3 -0
  206. package/dist/util/common.d.ts +2 -0
  207. package/dist/util/dates.d.ts +1 -0
  208. package/dist/util/entities.d.ts +28 -0
  209. package/dist/util/enums.d.ts +7 -0
  210. package/dist/util/flatten_object.d.ts +3 -0
  211. package/dist/util/hash.d.ts +1 -0
  212. package/dist/util/icons.d.ts +4 -0
  213. package/dist/util/index.d.ts +20 -0
  214. package/dist/util/join_collections.d.ts +9 -0
  215. package/dist/util/make_properties_editable.d.ts +3 -0
  216. package/dist/util/navigation_from_path.d.ts +24 -0
  217. package/dist/util/navigation_utils.d.ts +20 -0
  218. package/dist/util/objects.d.ts +10 -0
  219. package/dist/util/os.d.ts +2 -0
  220. package/dist/util/parent_references_from_path.d.ts +6 -0
  221. package/dist/util/paths.d.ts +14 -0
  222. package/dist/util/permissions.d.ts +5 -0
  223. package/dist/util/plurals.d.ts +18 -0
  224. package/dist/util/property_utils.d.ts +23 -0
  225. package/dist/util/references.d.ts +2 -0
  226. package/dist/util/regexp.d.ts +7 -0
  227. package/dist/util/resolutions.d.ts +64 -0
  228. package/dist/util/storage.d.ts +3 -0
  229. package/dist/util/strings.d.ts +6 -0
  230. package/dist/util/useDebounce.d.ts +1 -0
  231. package/dist/util/useStorageUploadController.d.ts +36 -0
  232. package/dist/util/useTraceUpdate.d.ts +1 -0
  233. package/package.json +114 -142
  234. package/src/components/ArrayContainer.tsx +369 -0
  235. package/src/components/CircularProgressCenter.tsx +26 -0
  236. package/src/components/DeleteConfirmationDialog.tsx +47 -0
  237. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +520 -0
  238. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +150 -0
  239. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +159 -0
  240. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +313 -0
  241. package/src/components/EntityCollectionTable/filters/BooleanFilterField.tsx +49 -0
  242. package/src/components/EntityCollectionTable/filters/DateTimeFilterField.tsx +109 -0
  243. package/src/components/EntityCollectionTable/filters/ReferenceFilterField.tsx +187 -0
  244. package/src/components/EntityCollectionTable/filters/StringNumberFilterField.tsx +159 -0
  245. package/src/components/EntityCollectionTable/index.tsx +16 -0
  246. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +113 -0
  247. package/src/components/EntityCollectionTable/internal/DeleteEntityDialog.tsx +207 -0
  248. package/src/components/EntityCollectionTable/internal/EntityCollectionRowActions.tsx +174 -0
  249. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +264 -0
  250. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +70 -0
  251. package/src/components/EntityCollectionTable/internal/PropertyTableCell.tsx +460 -0
  252. package/src/components/EntityCollectionTable/internal/common.tsx +70 -0
  253. package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +122 -0
  254. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +59 -0
  255. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +401 -0
  256. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +97 -0
  257. package/src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx +20 -0
  258. package/src/components/EntityCollectionTable/types.tsx +44 -0
  259. package/src/components/EntityCollectionTable/useDebouncedData.ts +49 -0
  260. package/src/components/EntityCollectionTable/useEntityCollectionTableController.tsx +213 -0
  261. package/src/components/EntityCollectionView/EntityCollectionView.tsx +815 -0
  262. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +131 -0
  263. package/src/components/EntityCollectionView/useColumnsIds.tsx +100 -0
  264. package/src/components/EntityPreview.tsx +83 -0
  265. package/src/components/ErrorBoundary.tsx +40 -0
  266. package/src/components/ErrorTooltip.tsx +11 -0
  267. package/src/components/ErrorView.tsx +52 -0
  268. package/src/components/FieldConfigBadge.tsx +17 -0
  269. package/src/components/FireCMSAppBar.tsx +157 -0
  270. package/src/components/FireCMSLogo.tsx +73 -0
  271. package/src/components/HomePage/DefaultHomePage.tsx +209 -0
  272. package/src/components/HomePage/FavouritesView.tsx +64 -0
  273. package/src/components/HomePage/NavigationCollectionCard.tsx +145 -0
  274. package/src/components/HomePage/NavigationGroup.tsx +39 -0
  275. package/src/components/HomePage/index.tsx +3 -0
  276. package/src/components/LabelWithIcon.tsx +33 -0
  277. package/src/components/NotFoundPage.tsx +25 -0
  278. package/src/components/ReferenceSelectionInner.tsx +364 -0
  279. package/src/components/ReferenceWidget.tsx +145 -0
  280. package/src/components/VirtualTable/VirtualTable.tsx +402 -0
  281. package/src/components/VirtualTable/VirtualTableCell.tsx +36 -0
  282. package/src/components/VirtualTable/VirtualTableHeader.tsx +260 -0
  283. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +131 -0
  284. package/src/components/VirtualTable/VirtualTableProps.tsx +270 -0
  285. package/src/components/VirtualTable/VirtualTableRow.tsx +54 -0
  286. package/src/components/VirtualTable/common.tsx +18 -0
  287. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +37 -0
  288. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +91 -0
  289. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +82 -0
  290. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +130 -0
  291. package/src/components/VirtualTable/fields/VirtualTableSwitch.tsx +32 -0
  292. package/src/components/VirtualTable/index.tsx +2 -0
  293. package/src/components/VirtualTable/types.tsx +44 -0
  294. package/src/components/index.tsx +30 -0
  295. package/src/contexts/AuthControllerContext.tsx +4 -0
  296. package/src/contexts/DataSourceContext.tsx +4 -0
  297. package/src/contexts/DialogsProvider.tsx +52 -0
  298. package/src/contexts/ModeController.tsx +13 -0
  299. package/src/contexts/NavigationContext.tsx +4 -0
  300. package/src/contexts/SideDialogsControllerContext.tsx +4 -0
  301. package/src/contexts/SideEntityControllerContext.tsx +4 -0
  302. package/src/contexts/SnackbarProvider.tsx +12 -0
  303. package/src/contexts/StorageSourceContext.tsx +4 -0
  304. package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
  305. package/src/contexts/index.ts +3 -0
  306. package/src/core/Drawer.tsx +161 -0
  307. package/src/core/EntitySidePanel.tsx +90 -0
  308. package/src/core/FireCMS.tsx +184 -0
  309. package/src/core/NavigationRoutes.tsx +118 -0
  310. package/src/core/Scaffold.tsx +278 -0
  311. package/src/core/SideDialogs.tsx +156 -0
  312. package/src/core/field_configs.tsx +400 -0
  313. package/src/core/index.tsx +14 -0
  314. package/src/core/useBuildLocalConfigurationPersistence.tsx +67 -0
  315. package/src/core/useBuildModeController.tsx +60 -0
  316. package/src/form/EntityForm.tsx +647 -0
  317. package/src/form/PropertyFieldBinding.tsx +311 -0
  318. package/src/form/components/CustomIdField.tsx +124 -0
  319. package/src/form/components/ErrorFocus.tsx +51 -0
  320. package/src/form/components/FieldHelperText.tsx +58 -0
  321. package/src/form/components/FormikArrayContainer.tsx +44 -0
  322. package/src/form/components/StorageItemPreview.tsx +66 -0
  323. package/src/form/components/StorageUploadProgress.tsx +104 -0
  324. package/src/form/components/SubmitListener.tsx +32 -0
  325. package/src/form/components/SwitchControl.tsx +39 -0
  326. package/src/form/components/index.tsx +3 -0
  327. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +88 -0
  328. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +153 -0
  329. package/src/form/field_bindings/BlockFieldBinding.tsx +245 -0
  330. package/src/form/field_bindings/DateTimeFieldBinding.tsx +66 -0
  331. package/src/form/field_bindings/KeyValueFieldBinding.tsx +560 -0
  332. package/src/form/field_bindings/MapFieldBinding.tsx +142 -0
  333. package/src/form/field_bindings/MarkdownFieldBinding.tsx +696 -0
  334. package/src/form/field_bindings/MultiSelectBinding.tsx +115 -0
  335. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +70 -0
  336. package/src/form/field_bindings/ReferenceFieldBinding.tsx +122 -0
  337. package/src/form/field_bindings/RepeatFieldBinding.tsx +103 -0
  338. package/src/form/field_bindings/SelectFieldBinding.tsx +100 -0
  339. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +438 -0
  340. package/src/form/field_bindings/SwitchFieldBinding.tsx +61 -0
  341. package/src/form/field_bindings/TextFieldBinding.tsx +108 -0
  342. package/src/form/index.tsx +42 -0
  343. package/src/form/useClearRestoreValue.tsx +35 -0
  344. package/src/form/validation.ts +409 -0
  345. package/src/hooks/data/delete.ts +101 -0
  346. package/src/hooks/data/save.ts +165 -0
  347. package/src/hooks/data/useCollectionFetch.tsx +162 -0
  348. package/src/hooks/data/useDataOrder.ts +26 -0
  349. package/src/hooks/data/useDataSource.tsx +9 -0
  350. package/src/hooks/data/useEntityFetch.tsx +129 -0
  351. package/src/hooks/index.tsx +23 -0
  352. package/src/hooks/useAuthController.tsx +14 -0
  353. package/src/hooks/useBrowserTitleAndIcon.tsx +25 -0
  354. package/src/hooks/useClipboard.tsx +158 -0
  355. package/src/hooks/useDialogsController.tsx +14 -0
  356. package/src/hooks/useFireCMSContext.tsx +50 -0
  357. package/src/hooks/useLargeLayout.tsx +34 -0
  358. package/src/hooks/useModeController.tsx +24 -0
  359. package/src/hooks/useNavigationController.tsx +12 -0
  360. package/src/hooks/useReferenceDialog.tsx +56 -0
  361. package/src/hooks/useResolvedNavigationFrom.tsx +160 -0
  362. package/src/hooks/useSideDialogsController.tsx +21 -0
  363. package/src/hooks/useSideEntityController.tsx +15 -0
  364. package/src/hooks/useSnackbarController.tsx +76 -0
  365. package/src/hooks/useStorageSource.tsx +9 -0
  366. package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
  367. package/src/index.ts +8 -0
  368. package/src/internal/EntityView.tsx +576 -0
  369. package/src/internal/common.tsx +5 -0
  370. package/src/internal/useBuildDataSource.ts +360 -0
  371. package/src/internal/useBuildNavigationController.tsx +371 -0
  372. package/src/internal/useBuildSideDialogsController.tsx +125 -0
  373. package/src/internal/useBuildSideEntityController.tsx +160 -0
  374. package/src/internal/useLocaleConfig.tsx +18 -0
  375. package/src/internal/useRestoreScroll.tsx +48 -0
  376. package/src/internal/useUnsavedChangesDialog.tsx +106 -0
  377. package/src/preview/PropertyPreview.tsx +222 -0
  378. package/src/preview/PropertyPreviewProps.tsx +59 -0
  379. package/src/preview/components/ArrayEnumPreview.tsx +39 -0
  380. package/src/preview/components/AsyncPreviewComponent.tsx +47 -0
  381. package/src/preview/components/BooleanPreview.tsx +11 -0
  382. package/src/preview/components/DatePreview.tsx +27 -0
  383. package/src/preview/components/EmptyValue.tsx +10 -0
  384. package/src/preview/components/EnumValuesChip.tsx +38 -0
  385. package/src/preview/components/ImagePreview.tsx +106 -0
  386. package/src/preview/components/ReferencePreview.tsx +249 -0
  387. package/src/preview/components/StorageThumbnail.tsx +84 -0
  388. package/src/preview/components/UrlComponentPreview.tsx +79 -0
  389. package/src/preview/index.ts +27 -0
  390. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +82 -0
  391. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +52 -0
  392. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +54 -0
  393. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +55 -0
  394. package/src/preview/property_previews/ArrayOneOfPreview.tsx +67 -0
  395. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +28 -0
  396. package/src/preview/property_previews/ArrayPropertyPreview.tsx +68 -0
  397. package/src/preview/property_previews/MapPropertyPreview.tsx +144 -0
  398. package/src/preview/property_previews/NumberPropertyPreview.tsx +27 -0
  399. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +283 -0
  400. package/src/preview/property_previews/StringPropertyPreview.tsx +60 -0
  401. package/src/preview/util.ts +31 -0
  402. package/src/types/analytics.ts +34 -0
  403. package/src/types/appcheck.ts +29 -0
  404. package/src/types/auth.tsx +49 -0
  405. package/src/types/collections.ts +530 -0
  406. package/src/types/datasource.ts +389 -0
  407. package/src/types/dialogs_controller.tsx +33 -0
  408. package/src/types/entities.ts +76 -0
  409. package/src/types/entity_actions.tsx +39 -0
  410. package/src/types/entity_callbacks.ts +209 -0
  411. package/src/types/entity_link_builder.ts +8 -0
  412. package/src/types/export_import.ts +26 -0
  413. package/src/types/fields.tsx +220 -0
  414. package/src/types/firecms.tsx +175 -0
  415. package/src/types/firecms_context.tsx +128 -0
  416. package/src/types/index.ts +26 -0
  417. package/src/types/local_config_persistence.tsx +23 -0
  418. package/src/types/locales.ts +81 -0
  419. package/src/types/modify_collections.tsx +6 -0
  420. package/src/types/navigation.ts +214 -0
  421. package/src/types/permissions.ts +76 -0
  422. package/src/types/plugins.tsx +217 -0
  423. package/src/types/properties.ts +851 -0
  424. package/src/types/property_config.tsx +72 -0
  425. package/src/types/resolved_entities.ts +148 -0
  426. package/src/types/side_dialogs_controller.tsx +68 -0
  427. package/src/types/side_entity_controller.tsx +96 -0
  428. package/src/types/storage.ts +96 -0
  429. package/src/types/user.ts +37 -0
  430. package/src/util/arrays.ts +3 -0
  431. package/src/util/builders.ts +139 -0
  432. package/src/util/chip_utils.ts +13 -0
  433. package/src/util/collections.ts +50 -0
  434. package/src/util/common.tsx +2 -0
  435. package/src/util/dates.ts +1 -0
  436. package/src/util/entities.ts +196 -0
  437. package/src/util/enums.ts +57 -0
  438. package/src/util/flatten_object.ts +45 -0
  439. package/src/util/hash.ts +11 -0
  440. package/src/util/icons.tsx +45 -0
  441. package/src/util/index.ts +20 -0
  442. package/src/util/join_collections.ts +172 -0
  443. package/src/util/make_properties_editable.ts +29 -0
  444. package/src/util/navigation_from_path.ts +107 -0
  445. package/src/util/navigation_utils.ts +111 -0
  446. package/src/util/objects.ts +168 -0
  447. package/src/util/os.ts +13 -0
  448. package/src/util/parent_references_from_path.ts +56 -0
  449. package/src/util/paths.ts +27 -0
  450. package/src/util/permissions.ts +80 -0
  451. package/src/util/plurals.ts +190 -0
  452. package/src/util/property_utils.tsx +130 -0
  453. package/src/util/references.ts +20 -0
  454. package/src/util/regexp.ts +32 -0
  455. package/src/util/resolutions.ts +399 -0
  456. package/src/util/storage.ts +92 -0
  457. package/src/util/strings.ts +62 -0
  458. package/src/util/useDebounce.ts +25 -0
  459. package/src/util/useStorageUploadController.tsx +243 -0
  460. package/src/util/useTraceUpdate.tsx +23 -0
@@ -0,0 +1,409 @@
1
+ import {
2
+ CMSType,
3
+ EntityReference,
4
+ GeoPoint,
5
+ ResolvedArrayProperty,
6
+ ResolvedMapProperty,
7
+ ResolvedProperties,
8
+ ResolvedProperty
9
+ } from "../types";
10
+ import * as yup from "yup";
11
+ import { AnySchema, ArraySchema, BooleanSchema, DateSchema, NumberSchema, ObjectSchema, StringSchema } from "yup";
12
+ import { enumToObjectEntries } from "../util/enums";
13
+ import { getValueInPath, hydrateRegExp, isPropertyBuilder } from "../util";
14
+
15
+ // Add custom unique function for array values
16
+ declare module "yup" {
17
+ // tslint:disable-next-line
18
+ interface ArraySchema<T> {
19
+ uniqueInArray(mapper: (a: T) => T, message: string): ArraySchema<T>;
20
+ }
21
+ }
22
+ yup.addMethod(yup.array, "uniqueInArray", function (
23
+ mapper = (a: any) => a,
24
+ message: string
25
+ ) {
26
+ return this.test("uniqueInArray", message, values => {
27
+ return !values || values.length === new Set(values.map(mapper)).size;
28
+ });
29
+ });
30
+
31
+ export type CustomFieldValidator = (props: {
32
+ name: string,
33
+ value: any,
34
+ property: ResolvedProperty,
35
+ entityId?: string,
36
+ parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,
37
+ }) => Promise<boolean>;
38
+
39
+ interface PropertyContext<T extends CMSType> {
40
+ property: ResolvedProperty<T>,
41
+ parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,
42
+ entityId: string,
43
+ customFieldValidator?: CustomFieldValidator,
44
+ name?: any
45
+ }
46
+
47
+ export function getYupEntitySchema<M extends Record<string, any>>(
48
+ entityId: string,
49
+ properties: ResolvedProperties<M>,
50
+ customFieldValidator?: CustomFieldValidator): ObjectSchema<any> {
51
+ const objectSchema: any = {};
52
+ Object.entries(properties as Record<string, ResolvedProperty>)
53
+ .forEach(([name, property]) => {
54
+ objectSchema[name] = mapPropertyToYup({
55
+ property: property as ResolvedProperty<any>,
56
+ customFieldValidator,
57
+ name,
58
+ entityId
59
+ });
60
+ });
61
+ return yup.object().shape(objectSchema);
62
+ }
63
+
64
+ export function mapPropertyToYup<T extends CMSType>(propertyContext: PropertyContext<T>): AnySchema<unknown> {
65
+
66
+ const property = propertyContext.property;
67
+ if (isPropertyBuilder(property)) {
68
+ console.error("Error in property", propertyContext);
69
+ throw Error("Trying to create a yup mapping from a property builder. Please use resolved properties only");
70
+ }
71
+
72
+ if (property.dataType === "string") {
73
+ return getYupStringSchema(propertyContext as PropertyContext<string>);
74
+ } else if (property.dataType === "number") {
75
+ return getYupNumberSchema(propertyContext as PropertyContext<number>);
76
+ } else if (property.dataType === "boolean") {
77
+ return getYupBooleanSchema(propertyContext as PropertyContext<boolean>);
78
+ } else if (property.dataType === "map") {
79
+ return getYupMapObjectSchema(propertyContext as PropertyContext<object>);
80
+ } else if (property.dataType === "array") {
81
+ return getYupArraySchema(propertyContext as PropertyContext<any[]>);
82
+ } else if (property.dataType === "date") {
83
+ return getYupDateSchema(propertyContext as PropertyContext<Date>);
84
+ } else if (property.dataType === "geopoint") {
85
+ return getYupGeoPointSchema(propertyContext as PropertyContext<GeoPoint>);
86
+ } else if (property.dataType === "reference") {
87
+ return getYupReferenceSchema(propertyContext as PropertyContext<EntityReference>);
88
+ }
89
+ console.error("Unsupported data type in yup mapping", property)
90
+ throw Error("Unsupported data type in yup mapping");
91
+ }
92
+
93
+ export function getYupMapObjectSchema<M extends Record<string, any>>({
94
+ property,
95
+ entityId,
96
+ customFieldValidator,
97
+ name
98
+ }: PropertyContext<M>): ObjectSchema<any> {
99
+ const objectSchema: any = {};
100
+ const validation = property.validation;
101
+ if (property.properties)
102
+ Object.entries(property.properties).forEach(([childName, childProperty]: [string, ResolvedProperty]) => {
103
+ objectSchema[childName] = mapPropertyToYup<any>({
104
+ property: childProperty,
105
+ parentProperty: property as ResolvedMapProperty,
106
+ customFieldValidator,
107
+ name: `${name}[${childName}]`,
108
+ entityId
109
+ });
110
+ });
111
+
112
+ return yup.object().shape(objectSchema);
113
+ // const object: ObjectSchema<any> = yup.object().shape(objectSchema);
114
+ // return validation?.required
115
+ // ? object.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
116
+ // : yup.object().optional().default(undefined).notRequired().nullable(true).test(
117
+ // "empty-check",
118
+ // "Optional map can be empty",
119
+ // (o: any, testContext: any) => {
120
+ // try {
121
+ // if (!o || Object.keys(o).length === 0) return true;
122
+ // return object.validateSync(o);
123
+ // } catch (e) {
124
+ // testContext.createError(e);
125
+ // console.error(e);
126
+ // return false;
127
+ // }
128
+ // });
129
+ }
130
+
131
+ function getYupStringSchema({
132
+ property,
133
+ parentProperty,
134
+ customFieldValidator,
135
+ name,
136
+ entityId
137
+ }: PropertyContext<string>): StringSchema {
138
+ let collection: StringSchema<any> = yup.string();
139
+ const validation = property.validation;
140
+ if (property.enumValues) {
141
+ if (validation?.required)
142
+ collection = collection.required(validation?.requiredMessage ? validation.requiredMessage : "Required");
143
+ const entries = enumToObjectEntries(property.enumValues);
144
+ collection = collection.oneOf(
145
+ (validation?.required ? entries : [...entries, null])
146
+ .map((enumValueConfig) => enumValueConfig?.id ?? null)
147
+ ).nullable(true);
148
+ }
149
+ if (validation) {
150
+ collection = validation.required
151
+ ? collection.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
152
+ : collection.notRequired().nullable(true);
153
+ if (validation.unique && customFieldValidator && name)
154
+ collection = collection.test("unique", "This value already exists and should be unique",
155
+ (value, context) =>
156
+ customFieldValidator({
157
+ name,
158
+ property,
159
+ parentProperty,
160
+ value,
161
+ entityId
162
+ }));
163
+ if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be min ${validation.min} characters long`);
164
+ if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be max ${validation.max} characters long`);
165
+ if (validation.matches) {
166
+ const regExp = typeof validation.matches === "string" ? hydrateRegExp(validation.matches) : validation.matches;
167
+ if (regExp) {
168
+ collection = collection.matches(regExp, validation.matchesMessage ? { message: validation.matchesMessage } : undefined)
169
+ }
170
+ }
171
+ if (validation.trim) collection = collection.trim();
172
+ if (validation.lowercase) collection = collection.lowercase();
173
+ if (validation.uppercase) collection = collection.uppercase();
174
+ if (property.email) collection = collection.email(`${property.name} must be an email`);
175
+ if (property.url) collection = collection.url(`${property.name} must be a url`);
176
+ } else {
177
+ collection = collection.notRequired().nullable(true);
178
+ }
179
+ return collection;
180
+ }
181
+
182
+ function getYupNumberSchema({
183
+ property,
184
+ parentProperty,
185
+ customFieldValidator,
186
+ name,
187
+ entityId
188
+ }: PropertyContext<number>): NumberSchema {
189
+ const validation = property.validation;
190
+ let collection: NumberSchema<any> = yup.number().typeError("Must be a number");
191
+ if (validation) {
192
+ collection = validation.required
193
+ ? collection.required(validation.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
194
+ : collection.notRequired().nullable(true);
195
+ if (validation.unique && customFieldValidator && name)
196
+ collection = collection.test("unique",
197
+ "This value already exists and should be unique",
198
+ (value) => customFieldValidator({
199
+ name,
200
+ property,
201
+ parentProperty,
202
+ value,
203
+ entityId
204
+ }));
205
+ if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be higher or equal to ${validation.min}`);
206
+ if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be lower or equal to ${validation.max}`);
207
+ if (validation.lessThan || validation.lessThan === 0) collection = collection.lessThan(validation.lessThan, `${property.name} must be higher than ${validation.lessThan}`);
208
+ if (validation.moreThan || validation.moreThan === 0) collection = collection.moreThan(validation.moreThan, `${property.name} must be lower than ${validation.moreThan}`);
209
+ if (validation.positive) collection = collection.positive(`${property.name} must be positive`);
210
+ if (validation.negative) collection = collection.negative(`${property.name} must be negative`);
211
+ if (validation.integer) collection = collection.integer(`${property.name} must be an integer`);
212
+ } else {
213
+ collection = collection.notRequired().nullable(true);
214
+ }
215
+ return collection;
216
+ }
217
+
218
+ function getYupGeoPointSchema({
219
+ property,
220
+ parentProperty,
221
+ customFieldValidator,
222
+ name,
223
+ entityId
224
+ }: PropertyContext<GeoPoint>): AnySchema {
225
+ let collection: ObjectSchema<any> = yup.object();
226
+ const validation = property.validation;
227
+ if (validation?.unique && customFieldValidator && name)
228
+ collection = collection.test("unique",
229
+ "This value already exists and should be unique",
230
+ (value) => customFieldValidator({
231
+ name,
232
+ property,
233
+ parentProperty,
234
+ value,
235
+ entityId
236
+ }));
237
+ if (validation?.required) {
238
+ collection = collection.required(validation.requiredMessage).nullable(true);
239
+ } else {
240
+ collection = collection.notRequired().nullable(true);
241
+ }
242
+ return collection;
243
+ }
244
+
245
+ function getYupDateSchema({
246
+ property,
247
+ parentProperty,
248
+ customFieldValidator,
249
+ name,
250
+ entityId
251
+ }: PropertyContext<Date>): AnySchema | DateSchema {
252
+ if (property.autoValue) {
253
+ return yup.object().nullable();
254
+ }
255
+ let collection: DateSchema<any> = yup.date();
256
+ const validation = property.validation;
257
+ if (validation) {
258
+ collection = validation.required
259
+ ? collection.required(validation?.requiredMessage ? validation.requiredMessage : "Required")
260
+ : collection.notRequired();
261
+ if (validation.unique && customFieldValidator && name)
262
+ collection = collection.test("unique",
263
+ "This value already exists and should be unique",
264
+ (value) => customFieldValidator({
265
+ name,
266
+ property,
267
+ parentProperty,
268
+ value,
269
+ entityId
270
+ }));
271
+ if (validation.min) collection = collection.min(validation.min, `${property.name} must be after ${validation.min}`);
272
+ if (validation.max) collection = collection.max(validation.max, `${property.name} must be before ${validation.min}`);
273
+ } else {
274
+ collection = collection.notRequired();
275
+ }
276
+ return collection
277
+ .transform((v: any) => (v instanceof Date ? v : null))
278
+ .nullable();
279
+ }
280
+
281
+ function getYupReferenceSchema({
282
+ property,
283
+ parentProperty,
284
+ customFieldValidator,
285
+ name,
286
+ entityId
287
+ }: PropertyContext<EntityReference>): AnySchema {
288
+ let collection: ObjectSchema<any> = yup.object();
289
+ const validation = property.validation;
290
+ if (validation) {
291
+ collection = validation.required
292
+ ? collection.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
293
+ : collection.notRequired().nullable(true);
294
+ if (validation.unique && customFieldValidator && name)
295
+ collection = collection.test("unique",
296
+ "This value already exists and should be unique",
297
+ (value) => customFieldValidator({
298
+ name,
299
+ property,
300
+ parentProperty,
301
+ value,
302
+ entityId
303
+ }));
304
+ } else {
305
+ collection = collection.notRequired().nullable(true);
306
+ }
307
+ return collection;
308
+ }
309
+
310
+ function getYupBooleanSchema({
311
+ property,
312
+ parentProperty,
313
+ customFieldValidator,
314
+ name,
315
+ entityId
316
+ }: PropertyContext<boolean>): BooleanSchema {
317
+ let collection: BooleanSchema<any> = yup.boolean();
318
+ const validation = property.validation;
319
+ if (validation) {
320
+ collection = validation.required
321
+ ? collection.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
322
+ : collection.notRequired().nullable(true);
323
+ if (validation.unique && customFieldValidator && name)
324
+ collection = collection.test("unique",
325
+ "This value already exists and should be unique",
326
+ (value) => customFieldValidator({
327
+ name,
328
+ property,
329
+ parentProperty,
330
+ value,
331
+ entityId
332
+ }));
333
+ } else {
334
+ collection = collection.notRequired().nullable(true);
335
+ }
336
+ return collection;
337
+ }
338
+
339
+ function hasUniqueInArrayModifier(property: ResolvedProperty): boolean | [string, ResolvedProperty][] {
340
+ if (property.validation?.uniqueInArray) {
341
+ return true;
342
+ } else if (property.dataType === "map" && property.properties) {
343
+ return Object.entries(property.properties)
344
+ .filter(([key, childProperty]) => childProperty.validation?.uniqueInArray);
345
+ }
346
+ return false;
347
+ }
348
+
349
+ function getYupArraySchema({
350
+ property,
351
+ parentProperty,
352
+ customFieldValidator,
353
+ name,
354
+ entityId
355
+ }: PropertyContext<any[]>): AnySchema<any> {
356
+
357
+ let arraySchema: ArraySchema<any> = yup.array();
358
+
359
+ if (property.of) {
360
+ if (Array.isArray(property.of)) {
361
+ const yupProperties = (property.of as ResolvedProperty[]).map((p, index) => ({
362
+ [`${name}[${index}]`]: mapPropertyToYup({
363
+ property: p as ResolvedProperty<any>,
364
+ parentProperty: property,
365
+ entityId
366
+ })
367
+ })).reduce((a, b) => ({ ...a, ...b }), {});
368
+ return yup.array().of(
369
+ yup.mixed().test(
370
+ "Dynamic object validation",
371
+ "Dynamic object validation error",
372
+ (object, context) => {
373
+ const yupProperty = getValueInPath(yupProperties, context.path);
374
+ return yupProperty.validate(object);
375
+ }
376
+ )
377
+ );
378
+ } else {
379
+ arraySchema = arraySchema.of(mapPropertyToYup({
380
+ property: property.of,
381
+ parentProperty: property,
382
+ entityId
383
+ }));
384
+ const arrayUniqueFields = hasUniqueInArrayModifier(property.of);
385
+ if (arrayUniqueFields) {
386
+ if (typeof arrayUniqueFields === "boolean") {
387
+ arraySchema = arraySchema.uniqueInArray(v => v, `${property.name} should have unique values within the array`);
388
+ } else if (Array.isArray(arrayUniqueFields)) {
389
+ arrayUniqueFields.forEach(([name, childProperty]) => {
390
+ arraySchema = arraySchema.uniqueInArray(v => v && v[name], `${property.name} → ${childProperty.name ?? name}: should have unique values within the array`);
391
+ }
392
+ );
393
+ }
394
+ }
395
+ }
396
+ }
397
+ const validation = property.validation;
398
+
399
+ if (validation) {
400
+ arraySchema = validation.required
401
+ ? arraySchema.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
402
+ : arraySchema.notRequired().nullable(true);
403
+ if (validation.min || validation.min === 0) arraySchema = arraySchema.min(validation.min, `${property.name} should be min ${validation.min} entries long`);
404
+ if (validation.max) arraySchema = arraySchema.max(validation.max, `${property.name} should be max ${validation.max} entries long`);
405
+ } else {
406
+ arraySchema = arraySchema.notRequired().nullable(true);
407
+ }
408
+ return arraySchema;
409
+ }
@@ -0,0 +1,101 @@
1
+ import {
2
+ DataSource,
3
+ DeleteEntityProps,
4
+ Entity,
5
+ EntityCallbacks,
6
+ EntityOnDeleteProps,
7
+ FireCMSContext,
8
+ ResolvedEntityCollection,
9
+ User
10
+ } from "../../types";
11
+
12
+ /**
13
+ * @group Hooks and utilities
14
+ */
15
+ export type DeleteEntityWithCallbacksProps<M extends Record<string, any>> =
16
+ DeleteEntityProps<M>
17
+ & {
18
+ callbacks?: EntityCallbacks<M>;
19
+ onDeleteSuccess?: (entity: Entity<M>) => void;
20
+ onDeleteFailure?: (entity: Entity<M>, e: Error) => void;
21
+ onPreDeleteHookError?: (entity: Entity<M>, e: Error) => void;
22
+ onDeleteSuccessHookError?: (entity: Entity<M>, e: Error) => void;
23
+ }
24
+
25
+ /**
26
+ * This function is in charge of deleting an entity in the datasource.
27
+ * It will run all the delete callbacks specified in the collection.
28
+ * It is also possible to attach callbacks on save success or error, and callback
29
+ * errors.
30
+ *
31
+ * If you just want to delete any data without running the `onPreDelete`,
32
+ * and `onDelete` callbacks, you can use the `deleteEntity` method
33
+ * in the datasource ({@link useDataSource}).
34
+ *
35
+ * @param dataSource
36
+ * @param entity
37
+ * @param collection
38
+ * @param callbacks
39
+ * @param onDeleteSuccess
40
+ * @param onDeleteFailure
41
+ * @param onPreDeleteHookError
42
+ * @param onDeleteSuccessHookError
43
+ * @param context
44
+ * @group Hooks and utilities
45
+ */
46
+ export async function deleteEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({
47
+ dataSource,
48
+ entity,
49
+ collection,
50
+ callbacks,
51
+ onDeleteSuccess,
52
+ onDeleteFailure,
53
+ onPreDeleteHookError,
54
+ onDeleteSuccessHookError,
55
+ context
56
+ }: DeleteEntityWithCallbacksProps<M> & {
57
+ collection: ResolvedEntityCollection<M>,
58
+ dataSource: DataSource,
59
+ context: FireCMSContext<UserType>
60
+ }
61
+ ): Promise<boolean> {
62
+
63
+ console.debug("Deleting entity", entity.path, entity.id);
64
+
65
+ const entityDeleteProps: EntityOnDeleteProps<M, UserType> = {
66
+ entity,
67
+ collection,
68
+ entityId: entity.id,
69
+ path: entity.path,
70
+ context
71
+ };
72
+
73
+ if (callbacks?.onPreDelete) {
74
+ try {
75
+ await callbacks.onPreDelete(entityDeleteProps);
76
+ } catch (e: any) {
77
+ console.error(e);
78
+ if (onPreDeleteHookError)
79
+ onPreDeleteHookError(entity, e);
80
+ return false;
81
+ }
82
+ }
83
+ return dataSource.deleteEntity({
84
+ entity
85
+ }).then(() => {
86
+ onDeleteSuccess && onDeleteSuccess(entity);
87
+ try {
88
+ if (callbacks?.onDelete) {
89
+ callbacks.onDelete(entityDeleteProps);
90
+ }
91
+ return true;
92
+ } catch (e: any) {
93
+ if (onDeleteSuccessHookError)
94
+ onDeleteSuccessHookError(entity, e);
95
+ return false;
96
+ }
97
+ }).catch((e) => {
98
+ if (onDeleteFailure) onDeleteFailure(entity, e);
99
+ return false;
100
+ });
101
+ }
@@ -0,0 +1,165 @@
1
+ import {
2
+ DataSource,
3
+ Entity,
4
+ EntityCallbacks,
5
+ EntityCollection,
6
+ EntityValues,
7
+ FireCMSContext,
8
+ SaveEntityProps,
9
+ User
10
+ } from "../../types";
11
+ import { useDataSource } from "./useDataSource";
12
+ import { resolveCollection } from "../../util";
13
+
14
+ /**
15
+ * @group Hooks and utilities
16
+ */
17
+ export type SaveEntityWithCallbacksProps<M extends Record<string, any>> =
18
+ SaveEntityProps<M> &
19
+ {
20
+ callbacks?: EntityCallbacks<M>;
21
+ onSaveSuccess?: (updatedEntity: Entity<M>) => void,
22
+ onSaveFailure?: (e: Error) => void,
23
+ onPreSaveHookError?: (e: Error) => void,
24
+ onSaveSuccessHookError?: (e: Error) => void
25
+ }
26
+
27
+ /**
28
+ * This function is in charge of saving an entity to the datasource.
29
+ * It will run all the save callbacks specified in the collection.
30
+ * It is also possible to attach callbacks on save success or error, and callback
31
+ * errors.
32
+ *
33
+ * If you just want to save the data without running the `onSaveSuccess`,
34
+ * `onSaveFailure` and `onPreSave` callbacks, you can use the `saveEntity` method
35
+ * in the datasource ({@link useDataSource}).
36
+ *
37
+ * @param collection
38
+ * @param path
39
+ * @param entityId
40
+ * @param callbacks
41
+ * @param values
42
+ * @param previousValues
43
+ * @param status
44
+ * @param dataSource
45
+ * @param context
46
+ * @param onSaveSuccess
47
+ * @param onSaveFailure
48
+ * @param onPreSaveHookError
49
+ * @param onSaveSuccessHookError
50
+ * @see useDataSource
51
+ * @group Hooks and utilities
52
+ */
53
+ export async function saveEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({
54
+ collection,
55
+ path,
56
+ entityId,
57
+ values,
58
+ previousValues,
59
+ status,
60
+ dataSource,
61
+ context,
62
+ onSaveSuccess,
63
+ onSaveFailure,
64
+ onPreSaveHookError,
65
+ onSaveSuccessHookError
66
+ }: SaveEntityWithCallbacksProps<M> & {
67
+ collection: EntityCollection<M>,
68
+ dataSource: DataSource,
69
+ context: FireCMSContext<UserType>,
70
+ }
71
+ ): Promise<void> {
72
+
73
+ let updatedValues: Partial<EntityValues<M>>;
74
+
75
+ const resolvedPath = context.navigation.resolveAliasesFrom(path);
76
+
77
+ const callbacks = collection.callbacks;
78
+ if (callbacks?.onPreSave) {
79
+ try {
80
+ const resolvedCollection = resolveCollection<M>({
81
+ collection,
82
+ path,
83
+ values: previousValues as EntityValues<M>,
84
+ entityId,
85
+ fields: context.propertyConfigs
86
+ });
87
+ updatedValues = await callbacks.onPreSave({
88
+ collection: resolvedCollection,
89
+ path,
90
+ resolvedPath,
91
+ entityId,
92
+ values,
93
+ previousValues,
94
+ status,
95
+ context
96
+ });
97
+ } catch (e: any) {
98
+ console.error(e);
99
+ if (onPreSaveHookError)
100
+ onPreSaveHookError(e);
101
+ return;
102
+ }
103
+ } else {
104
+ updatedValues = values;
105
+ }
106
+
107
+ return dataSource.saveEntity({
108
+ collection,
109
+ path: resolvedPath,
110
+ entityId,
111
+ values: updatedValues,
112
+ previousValues,
113
+ status
114
+ }).then((entity) => {
115
+ try {
116
+ if (callbacks?.onSaveSuccess) {
117
+ const resolvedCollection = resolveCollection<M>({
118
+ collection,
119
+ path,
120
+ values: updatedValues as EntityValues<M>,
121
+ entityId,
122
+ fields: context.propertyConfigs
123
+ });
124
+ callbacks.onSaveSuccess({
125
+ collection: resolvedCollection,
126
+ path,
127
+ resolvedPath,
128
+ entityId: entity.id,
129
+ values: updatedValues,
130
+ previousValues,
131
+ status,
132
+ context
133
+ });
134
+ }
135
+ } catch (e: any) {
136
+ if (onSaveSuccessHookError)
137
+ onSaveSuccessHookError(e);
138
+ }
139
+ if (onSaveSuccess)
140
+ onSaveSuccess(entity);
141
+ })
142
+ .catch((e) => {
143
+ if (callbacks?.onSaveFailure) {
144
+
145
+ const resolvedCollection = resolveCollection<M>({
146
+ collection,
147
+ path,
148
+ values: updatedValues as EntityValues<M>,
149
+ entityId,
150
+ fields: context.propertyConfigs
151
+ });
152
+ callbacks.onSaveFailure({
153
+ collection: resolvedCollection,
154
+ path,
155
+ resolvedPath,
156
+ entityId,
157
+ values: updatedValues,
158
+ previousValues,
159
+ status,
160
+ context
161
+ });
162
+ }
163
+ if (onSaveFailure) onSaveFailure(e);
164
+ });
165
+ }