@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,107 @@
1
+ import { EntityCollection, EntityCustomView } from "../types";
2
+ import { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from "./navigation_utils";
3
+ import { resolveEntityView } from "./resolutions";
4
+
5
+ export type NavigationViewInternal<M extends Record<string, any> = any> =
6
+ | NavigationViewEntityInternal<M>
7
+ | NavigationViewCollectionInternal<M>
8
+ | NavigationViewEntityCustomInternal<M>;
9
+
10
+ export interface NavigationViewEntityInternal<M extends Record<string, any>> {
11
+ type: "entity";
12
+ entityId: string;
13
+ path: string;
14
+ parentCollection: EntityCollection<M>;
15
+ }
16
+
17
+ export interface NavigationViewCollectionInternal<M extends Record<string, any>> {
18
+ type: "collection";
19
+ path: string;
20
+ collection: EntityCollection<M>;
21
+ }
22
+
23
+ export interface NavigationViewEntityCustomInternal<M extends Record<string, any>> {
24
+ type: "custom_view";
25
+ path: string;
26
+ view: EntityCustomView<M>;
27
+ }
28
+
29
+ export function getNavigationEntriesFromPathInternal(props: {
30
+ path: string,
31
+ collections: EntityCollection[] | undefined,
32
+ currentFullPath?: string,
33
+ contextEntityViews?: EntityCustomView<any>[]
34
+ }): NavigationViewInternal [] {
35
+
36
+ const {
37
+ path,
38
+ collections = [],
39
+ currentFullPath
40
+ } = props;
41
+
42
+ const subpaths = removeInitialAndTrailingSlashes(path).split("/");
43
+ const subpathCombinations = getCollectionPathsCombinations(subpaths);
44
+
45
+ const result: NavigationViewInternal[] = [];
46
+ for (let i = 0; i < subpathCombinations.length; i++) {
47
+ const subpathCombination = subpathCombinations[i];
48
+
49
+ const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
50
+
51
+ if (collection) {
52
+ const pathOrAlias = collection.id ?? collection.path;
53
+ const collectionPath = currentFullPath && currentFullPath.length > 0
54
+ ? (currentFullPath + "/" + pathOrAlias)
55
+ : pathOrAlias;
56
+
57
+ result.push({
58
+ type: "collection",
59
+ path: collectionPath,
60
+ collection
61
+ });
62
+ const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
63
+ const nextSegments = restOfThePath.length > 0 ? restOfThePath.split("/") : [];
64
+ if (nextSegments.length > 0) {
65
+ const entityId = nextSegments[0];
66
+ const fullPath = collectionPath + "/" + entityId;
67
+ result.push({
68
+ type: "entity",
69
+ entityId,
70
+ path: collectionPath,
71
+ parentCollection: collection
72
+ });
73
+ if (nextSegments.length > 1) {
74
+ const newPath = nextSegments.slice(1).join("/");
75
+ if (!collection) {
76
+ throw Error("collection not found resolving path: " + collection);
77
+ }
78
+ const entityViews = collection.entityViews;
79
+ const customView = entityViews && entityViews
80
+ .map((entry) => resolveEntityView(entry, props.contextEntityViews))
81
+ .filter(Boolean)
82
+ .find((entry) => entry!.key === newPath);
83
+ if (customView) {
84
+ const path = currentFullPath && currentFullPath.length > 0
85
+ ? (currentFullPath + "/" + customView.key)
86
+ : customView.key;
87
+ result.push({
88
+ type: "custom_view",
89
+ path,
90
+ view: customView
91
+ });
92
+ } else if (collection.subcollections) {
93
+ result.push(...getNavigationEntriesFromPathInternal({
94
+ path: newPath,
95
+ collections: collection.subcollections,
96
+ currentFullPath: fullPath,
97
+ contextEntityViews: props.contextEntityViews
98
+ }));
99
+ }
100
+ }
101
+ }
102
+ break;
103
+ }
104
+
105
+ }
106
+ return result;
107
+ }
@@ -0,0 +1,111 @@
1
+ import { EntityCollection } from "../types";
2
+
3
+ export function removeInitialAndTrailingSlashes(s: string): string {
4
+ return removeInitialSlash(removeTrailingSlash(s));
5
+ }
6
+
7
+ export function removeInitialSlash(s: string) {
8
+ if (s.startsWith("/"))
9
+ return s.slice(1);
10
+ else return s;
11
+ }
12
+
13
+ export function removeTrailingSlash(s: string) {
14
+ if (s.endsWith("/"))
15
+ return s.slice(0, -1);
16
+ else return s;
17
+ }
18
+
19
+ export function addInitialSlash(s: string) {
20
+ if (s.startsWith("/"))
21
+ return s;
22
+ else return `/${s}`;
23
+ }
24
+
25
+ export function getLastSegment(path: string) {
26
+ const cleanPath = removeInitialAndTrailingSlashes(path);
27
+ if (cleanPath.includes("/")) {
28
+ const segments = cleanPath.split("/");
29
+ return segments[segments.length - 1];
30
+ }
31
+ return cleanPath;
32
+ }
33
+
34
+ export function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string {
35
+
36
+ const cleanPath = removeInitialAndTrailingSlashes(path);
37
+ const subpaths = cleanPath.split("/");
38
+ if (subpaths.length % 2 === 0) {
39
+ throw Error(`resolveCollectionPathAliases: Collection paths must have an odd number of segments: ${path}`);
40
+ }
41
+
42
+ const aliasedCollection = allCollections.find((col) => col.id === subpaths[0]);
43
+ let resolvedAliased;
44
+ if (aliasedCollection) {
45
+ resolvedAliased = aliasedCollection.path;
46
+ }
47
+
48
+ if (subpaths.length > 1) {
49
+ const segmentCollection = getCollectionByPathOrId(resolvedAliased ?? subpaths[0], allCollections);
50
+ if (!segmentCollection?.subcollections) {
51
+ return cleanPath;
52
+ }
53
+ const restOfThePath = cleanPath.split("/").slice(2).join("/");
54
+ return (resolvedAliased ?? subpaths[0]) + "/" + subpaths[1] + "/" + resolveCollectionPathIds(restOfThePath, segmentCollection.subcollections);
55
+ } else {
56
+ return resolvedAliased ?? cleanPath;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Find the corresponding view at any depth for a given path.
62
+ * Note that path or segments of the paths can be collection aliases.
63
+ * @param pathOrAlias
64
+ * @param collections
65
+ */
66
+ export function getCollectionByPathOrId(pathOrAlias: string, collections: EntityCollection[]): EntityCollection | undefined {
67
+
68
+ const subpaths = removeInitialAndTrailingSlashes(pathOrAlias).split("/");
69
+ if (subpaths.length % 2 === 0) {
70
+ throw Error(`getCollectionByPathOrAlias: Collection paths must have an odd number of segments: ${pathOrAlias}`);
71
+ }
72
+
73
+ const subpathCombinations = getCollectionPathsCombinations(subpaths);
74
+ let result: EntityCollection | undefined;
75
+ for (let i = 0; i < subpathCombinations.length; i++) {
76
+ const subpathCombination = subpathCombinations[i];
77
+ const navigationEntry = collections && collections
78
+ .sort((a, b) => (a.id ?? "").localeCompare(b.id ?? ""))
79
+ .find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
80
+
81
+ if (navigationEntry) {
82
+
83
+ if (subpathCombination === pathOrAlias) {
84
+ result = navigationEntry;
85
+ } else if (navigationEntry.subcollections) {
86
+ const newPath = pathOrAlias.replace(subpathCombination, "").split("/").slice(2).join("/");
87
+ if (newPath.length > 0)
88
+ result = getCollectionByPathOrId(newPath, navigationEntry.subcollections);
89
+ }
90
+ }
91
+ if (result) break;
92
+ }
93
+ return result;
94
+ }
95
+
96
+ /**
97
+ * Get the subcollection combinations from a path:
98
+ * "sites/es/locales" => ["sites/es/locales", "sites"]
99
+ * @param subpaths
100
+ */
101
+ export function getCollectionPathsCombinations(subpaths: string[]): string[] {
102
+ const entries = subpaths.length > 0 && subpaths.length % 2 === 0 ? subpaths.splice(0, subpaths.length - 1) : subpaths;
103
+
104
+ const length = entries.length;
105
+ const result: string[] = [];
106
+ for (let i = length; i > 0; i = i - 2) {
107
+ result.push(entries.slice(0, i).join("/"));
108
+ }
109
+ return result;
110
+
111
+ }
@@ -0,0 +1,168 @@
1
+ import hash from "object-hash";
2
+ import { GeoPoint } from "../types";
3
+
4
+ export const pick: <T>(obj: T, ...args: any[]) => T = (obj: any, ...args: any[]) => ({
5
+ ...args.reduce((res, key) => ({
6
+ ...res,
7
+ [key]: obj[key]
8
+ }), {})
9
+ });
10
+
11
+ export function isObject(item: any) {
12
+ return item && typeof item === "object" && !Array.isArray(item);
13
+ }
14
+
15
+ export function mergeDeep<T extends object>(target: T, source: any): T {
16
+ const targetIsObject = isObject(target);
17
+ const output: T = targetIsObject ? { ...target } : target;
18
+ if (targetIsObject && isObject(source)) {
19
+ Object.keys(source).forEach(key => {
20
+ if (isObject(source[key])) {
21
+ if (!(key in target))
22
+ Object.assign(output, { [key]: source[key] });
23
+ else
24
+ (output as any)[key] = mergeDeep((target as any)[key], source[key]);
25
+ } else {
26
+ Object.assign(output, { [key]: source[key] });
27
+ }
28
+ });
29
+ }
30
+ return output;
31
+ }
32
+
33
+ // export function getValueInPath(o: object | undefined, path: string): any {
34
+ // if (!o) return undefined;
35
+ // if (typeof o === "object") {
36
+ // if (path in o) {
37
+ // return (o as any)[path];
38
+ // }
39
+ // if (path.includes(".")) {
40
+ // const pathSegments = path.split(".");
41
+ // return getValueInPath((o as any)[pathSegments[0]], pathSegments.slice(1).join("."))
42
+ // }
43
+ // }
44
+ // return undefined;
45
+ // }
46
+
47
+ export function getValueInPath(o: object | undefined, path: string): any {
48
+ if (!o) return undefined;
49
+ if (typeof o === "object") {
50
+ if (path in o) {
51
+ return (o as any)[path];
52
+ }
53
+ if (path.includes(".") || path.includes("[")) {
54
+ let pathSegments = path.split(/[.[]/);
55
+ if (path.includes("[")) {
56
+ pathSegments = pathSegments.map(segment => segment.replace("]", ""));
57
+ }
58
+ const firstSegment = pathSegments[0];
59
+ const isArrayAndIndexExists = Array.isArray((o as any)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));
60
+ const nextObject = isArrayAndIndexExists
61
+ ? (o as any)[firstSegment][parseInt(pathSegments[1])]
62
+ : (o as any)[firstSegment];
63
+
64
+ const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(".");
65
+ if (nextPath === "")
66
+ return nextObject;
67
+ return getValueInPath(nextObject, nextPath)
68
+ }
69
+ }
70
+ return undefined;
71
+ }
72
+
73
+ export function removeInPath(o: object, path: string): object | undefined {
74
+ let currentObject = { ...o };
75
+ const parts = path.split(".");
76
+ const last = parts.pop();
77
+ for (const part of parts) {
78
+ currentObject = (currentObject as any)[part]
79
+ }
80
+ if (last)
81
+ delete (currentObject as any)[last];
82
+ return currentObject;
83
+ }
84
+
85
+ export function removeFunctions(o: object | undefined): any {
86
+ if (o === undefined) return undefined;
87
+ if (o === null) return null;
88
+ if (typeof o === "object") {
89
+ return Object.entries(o)
90
+ .filter(([_, value]) => typeof value !== "function")
91
+ .map(([key, value]) => {
92
+ if (Array.isArray(value)) {
93
+ return { [key]: value.map(v => removeFunctions(v)) };
94
+ } else if (typeof value === "object") {
95
+ return { [key]: removeFunctions(value) };
96
+ } else return { [key]: value };
97
+ })
98
+ .reduce((a, b) => ({ ...a, ...b }), {});
99
+ }
100
+ return o;
101
+ }
102
+
103
+ export function getHashValue<T>(v: T) {
104
+ if (!v) return null;
105
+ if (typeof v === "object") {
106
+ if ("id" in v)
107
+ return (v as any).id;
108
+ else if (v instanceof Date)
109
+ return v.toLocaleString();
110
+ else if (v instanceof GeoPoint)
111
+ return hash(v as Record<string, unknown>);
112
+ }
113
+ return hash(v, { ignoreUnknown: true });
114
+ }
115
+
116
+ export function removeUndefined(value: any, removeEmptyStrings?: boolean): any {
117
+ if (typeof value === "function") {
118
+ return value;
119
+ }
120
+ if (Array.isArray(value)) {
121
+ return value.map((v: any) => removeUndefined(v, removeEmptyStrings));
122
+ }
123
+ if (typeof value === "object") {
124
+ const res: object = {};
125
+ if (value === null)
126
+ return value;
127
+ Object.keys(value).forEach((key) => {
128
+ if (!isEmptyObject(value)) {
129
+ const childRes = removeUndefined(value[key], removeEmptyStrings);
130
+ const isString = typeof childRes === "string";
131
+ const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== "");
132
+ if (childRes !== undefined && !isEmptyObject(childRes) && shouldKeepIfString)
133
+ (res as any)[key] = childRes;
134
+ }
135
+ });
136
+ return res;
137
+ }
138
+ return value;
139
+ }
140
+
141
+ export function isEmptyObject(obj: object) {
142
+ return obj &&
143
+ Object.getPrototypeOf(obj) === Object.prototype &&
144
+ Object.keys(obj).length === 0
145
+ }
146
+
147
+ export function removePropsIfExisting(source: any, comparison: any) {
148
+ const isObject = (val: any) => typeof val === "object" && val !== null;
149
+ const isArray = (val: any) => Array.isArray(val);
150
+
151
+ if (!isObject(source) || !isObject(comparison)) {
152
+ return source;
153
+ }
154
+
155
+ const res = isArray(source) ? [...source] : { ...source };
156
+
157
+ Object.keys(comparison).forEach(key => {
158
+ if (key in res) {
159
+ if (isObject(res[key]) && isObject(comparison[key])) {
160
+ res[key] = removePropsIfExisting(res[key], comparison[key]);
161
+ } else if (res[key] === comparison[key]) {
162
+ isArray(res) ? res.splice(key, 1) : delete res[key];
163
+ }
164
+ }
165
+ });
166
+
167
+ return res;
168
+ }
package/src/util/os.ts ADDED
@@ -0,0 +1,13 @@
1
+ export function getOS() {
2
+ let OS = "Unknown";
3
+ if (navigator.userAgent.indexOf("Win") !== -1) OS = "Windows";
4
+ if (navigator.userAgent.indexOf("Mac") !== -1) OS = "MacOS";
5
+ if (navigator.userAgent.indexOf("X11") !== -1) OS = "UNIX";
6
+ if (navigator.userAgent.indexOf("Linux") !== -1) OS = "Linux";
7
+ return OS;
8
+ }
9
+
10
+ export function getAltSymbol() {
11
+ if (getOS() === "MacOS") return "⌥";
12
+ return "Alt";
13
+ }
@@ -0,0 +1,56 @@
1
+ import { EntityCollection, EntityReference } from "../types";
2
+ import { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from "./navigation_utils";
3
+
4
+ export function getParentReferencesFromPath(props: {
5
+ path: string,
6
+ collections: EntityCollection[] | undefined,
7
+ currentFullPath?: string,
8
+ }): EntityReference [] {
9
+
10
+ const {
11
+ path,
12
+ collections = [],
13
+ currentFullPath,
14
+ } = props;
15
+
16
+ const subpaths = removeInitialAndTrailingSlashes(path).split("/");
17
+ const subpathCombinations = getCollectionPathsCombinations(subpaths);
18
+
19
+ const result: EntityReference[] = [];
20
+ for (let i = 0; i < subpathCombinations.length; i++) {
21
+ const subpathCombination = subpathCombinations[i];
22
+
23
+ const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
24
+
25
+ if (collection) {
26
+ const pathOrAlias = collection.id ?? collection.path;
27
+ const collectionPath = currentFullPath && currentFullPath.length > 0
28
+ ? (currentFullPath + "/" + pathOrAlias)
29
+ : pathOrAlias;
30
+
31
+ const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
32
+ const nextSegments = restOfThePath.length > 0 ? restOfThePath.split("/") : [];
33
+ if (nextSegments.length > 0) {
34
+ const entityId = nextSegments[0];
35
+ const fullPath = collectionPath + "/" + entityId;
36
+ result.push(new EntityReference(entityId, collectionPath));
37
+ if (nextSegments.length > 1) {
38
+ const newPath = nextSegments.slice(1).join("/");
39
+ if (!collection) {
40
+ throw Error("collection not found resolving path: " + collection);
41
+ }
42
+ if (collection.subcollections) {
43
+ result.push(...getParentReferencesFromPath({
44
+ path: newPath,
45
+ collections: collection.subcollections,
46
+ currentFullPath: fullPath
47
+ }));
48
+ }
49
+ }
50
+ }
51
+ break;
52
+ }
53
+
54
+ }
55
+ return result;
56
+ }
@@ -0,0 +1,27 @@
1
+ export const COLLECTION_PATH_SEPARATOR = "::";
2
+
3
+ /**
4
+ * Remove the entity ids from a given path
5
+ * `products/B44RG6APH/locales` => `products::locales`
6
+ * @param path
7
+ */
8
+ export function stripCollectionPath(path: string): string {
9
+ return segmentsToStrippedPath(fullPathToCollectionSegments(path));
10
+ }
11
+
12
+ export function segmentsToStrippedPath(paths: string[]) {
13
+ if (paths.length === 1)
14
+ return paths[0];
15
+ return paths.reduce((a, b) => `${a}${COLLECTION_PATH_SEPARATOR}${b}`);
16
+ }
17
+
18
+ /**
19
+ * Extract the collection path routes
20
+ * `products/B44RG6APH/locales` => [`products`, `locales`]
21
+ * @param path
22
+ */
23
+ export function fullPathToCollectionSegments(path: string): string[] {
24
+ return path
25
+ .split("/")
26
+ .filter((e, i) => i % 2 === 0);
27
+ }
@@ -0,0 +1,80 @@
1
+ import { AuthController, Entity, EntityCollection, Permissions, User } from "../types";
2
+
3
+ const DEFAULT_PERMISSIONS = {
4
+ read: true,
5
+ edit: true,
6
+ create: true,
7
+ delete: true
8
+ };
9
+
10
+ export function resolvePermissions<M extends Record<string, any>, UserType extends User>
11
+ (collection: EntityCollection<M>,
12
+ authController: AuthController<UserType>,
13
+ pathSegments: string[],
14
+ entity: Entity<M> | null): Permissions {
15
+
16
+ const permission = collection.permissions;
17
+ if (permission === undefined) {
18
+ return DEFAULT_PERMISSIONS;
19
+ } else if (typeof permission === "object") {
20
+ return permission as Permissions;
21
+ } else if (typeof permission === "function") {
22
+ return permission({
23
+ entity,
24
+ user: authController.user,
25
+ authController,
26
+ collection,
27
+ pathSegments
28
+ });
29
+ }
30
+ console.error("Permissions:", permission);
31
+ throw Error("New type of permission added and not mapped");
32
+ }
33
+
34
+ export function canEditEntity<M extends Record<string, any>, UserType extends User>
35
+ (
36
+ collection: EntityCollection<M>,
37
+ authController: AuthController<UserType>,
38
+ paths: string[],
39
+ entity: Entity<M> | null): boolean {
40
+ return resolvePermissions(collection, authController, paths, entity).edit ?? DEFAULT_PERMISSIONS.edit;
41
+ }
42
+
43
+ export function canCreateEntity<M extends Record<string, any>, UserType extends User>
44
+ (
45
+ collection: EntityCollection<M>,
46
+ authController: AuthController<UserType>,
47
+ paths: string[],
48
+ entity: Entity<M> | null): boolean {
49
+ return resolvePermissions(collection, authController, paths, entity).create ?? DEFAULT_PERMISSIONS.create;
50
+ }
51
+
52
+ export function canDeleteEntity<M extends Record<string, any>, UserType extends User>
53
+ (
54
+ collection: EntityCollection<M>,
55
+ authController: AuthController<UserType>,
56
+ paths: string[],
57
+ entity: Entity<M> | null): boolean {
58
+ return resolvePermissions(collection, authController, paths, entity).delete ?? DEFAULT_PERMISSIONS.delete;
59
+ }
60
+
61
+ // export function resolveCollectionsPermissions(roles: Role[]): Record<string, Permissions> {
62
+ // const collectionIds = Array.from(new Set(roles.flatMap(role => Object.keys(role.collections))));
63
+ // return collectionIds
64
+ // .map((colId) => {
65
+ // const rolesWithCollection = roles.filter((role) => colId in Object.keys(role.collections));
66
+ // return {
67
+ // [colId]: rolesWithCollection
68
+ // .map(role => role.collections[colId])
69
+ // .reduce((permA, permB) => {
70
+ // return {
71
+ // read: permA.read ?? permB.read ?? false,
72
+ // create: permA.create ?? permB.create ?? false,
73
+ // edit: permA.edit ?? permB.edit ?? false,
74
+ // delete: permA.delete ?? permB.delete ?? false
75
+ // };
76
+ // })
77
+ // };
78
+ // })
79
+ // .reduce((a, b) => ({ ...a, ...b }), {});
80
+ // }