@firecms/core 3.0.0-alpha.8 → 3.0.0-alpha.80

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