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

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,45 @@
1
+ import React from "react";
2
+ import { CMSView, EntityCollection } from "../types";
3
+ import { hashString } from "./hash";
4
+ import { coolIconKeys, Icon, iconKeys } from "@firecms/ui";
5
+ import { slugify } from "./strings";
6
+
7
+ export function getIcon(iconKey?: string, className?:string): React.ReactElement | undefined {
8
+ if (!iconKey) return undefined;
9
+ iconKey = slugify(iconKey);
10
+ if (!(iconKey in iconKeysMap)) {
11
+ return undefined;
12
+ }
13
+ return iconKey in iconKeysMap ? <Icon iconKey={iconKey} size={"medium"} className={className}/> : undefined;
14
+ }
15
+
16
+ export function getIconForView(collectionOrView: EntityCollection | CMSView, className?:string): React.ReactElement {
17
+
18
+ const icon = getIcon(collectionOrView.icon, className);
19
+ if (collectionOrView?.icon && icon)
20
+ return icon;
21
+
22
+ let slugName = slugify(("singularName" in collectionOrView ? collectionOrView.singularName : undefined) ?? collectionOrView.name);
23
+
24
+ let key: string | undefined;
25
+ if (slugName in iconKeysMap)
26
+ key = slugName;
27
+
28
+ if (!key) {
29
+ slugName = slugify(collectionOrView.path);
30
+ if (slugName in iconKeysMap)
31
+ key = slugName;
32
+ }
33
+
34
+ const iconsCount = coolIconKeys.length;
35
+
36
+ if (!key)
37
+ key = coolIconKeys[hashString(collectionOrView.path) % iconsCount];
38
+
39
+ return <Icon iconKey={key} size={"medium"} className={className}/>;
40
+ }
41
+
42
+ const iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {
43
+ acc[key] = key;
44
+ return acc;
45
+ }, {});
@@ -0,0 +1,22 @@
1
+ export * from "./collections";
2
+ export * from "./entities";
3
+ export * from "./strings";
4
+ export * from "./dates";
5
+ export * from "./enums";
6
+ export * from "./objects";
7
+ export * from "./paths";
8
+ export * from "./regexp";
9
+ export * from "./navigation_utils";
10
+ export * from "./useDebounce";
11
+ export * from "./property_utils";
12
+ export * from "./resolutions";
13
+ export * from "./permissions";
14
+ export * from "./icon_list";
15
+ export * from "./icon_synonyms";
16
+ export * from "./icons";
17
+ export * from "./plurals";
18
+ export * from "./references";
19
+ export * from "./flatten_object";
20
+ export * from "./make_properties_editable";
21
+ export * from "./join_collections";
22
+ export * from "./builders";
@@ -0,0 +1,172 @@
1
+ import {
2
+ EntityCollection,
3
+ MapProperty,
4
+ ModifyCollectionProps,
5
+ PropertiesOrBuilders,
6
+ Property,
7
+ PropertyOrBuilder
8
+ } from "../types";
9
+ import { mergeDeep } from "./objects";
10
+ import { sortProperties } from "./collections";
11
+ import { isPropertyBuilder } from "./entities";
12
+
13
+ function applyModifyFunction(modifyCollection: ((props: ModifyCollectionProps) => (EntityCollection | void)) | undefined,
14
+ collection: EntityCollection,
15
+ parentPaths: string[]) {
16
+ if (modifyCollection) {
17
+ const modified = modifyCollection({
18
+ collection,
19
+ parentPaths
20
+ });
21
+ const resCollection = modified ?? collection;
22
+ if (resCollection.subcollections) {
23
+ resCollection.subcollections = resCollection.subcollections.map((subcollection) => {
24
+ return applyModifyFunction(modifyCollection, subcollection, [...parentPaths, collection.path]);
25
+ });
26
+ }
27
+ return resCollection;
28
+ } else {
29
+ return collection;
30
+ }
31
+ }
32
+
33
+ /**
34
+ *
35
+ */
36
+ export function joinCollectionLists(targetCollections: EntityCollection[],
37
+ sourceCollections: EntityCollection[] | undefined,
38
+ parentPaths: string[] = [],
39
+ modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void): EntityCollection[] {
40
+
41
+ // merge collections that are in both lists
42
+ const updatedCollections = (sourceCollections ?? [])
43
+ .map((sourceCol) => {
44
+ const targetCol = targetCollections?.find((collection) => {
45
+ return collection.id === sourceCol.id;
46
+ // return collection.path === codedCollection.path || collection.id && codedCollection.id;
47
+ });
48
+ if (!targetCol) {
49
+ return applyModifyFunction(modifyCollection, sourceCol, parentPaths);
50
+ } else {
51
+ return mergeCollection(targetCol, sourceCol, parentPaths, modifyCollection);
52
+ }
53
+ });
54
+
55
+ const sourceCollectionIds = updatedCollections.map(c => c.id);
56
+ // fetched collections that are not in the source collections
57
+ const resultStoredCollections = targetCollections
58
+ .filter((col) => {
59
+ return !sourceCollectionIds.includes(col.id);
60
+ })
61
+ .map((col) => {
62
+ if (modifyCollection) {
63
+ return applyModifyFunction(modifyCollection, col, parentPaths);
64
+ } else {
65
+ return col;
66
+ }
67
+ });
68
+
69
+ return [...updatedCollections, ...resultStoredCollections];
70
+ }
71
+
72
+ /**
73
+ *
74
+ */
75
+ export function mergeCollection(target: EntityCollection,
76
+ source: EntityCollection,
77
+ parentPaths: string[] = [],
78
+ modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void
79
+ ): EntityCollection {
80
+
81
+ const subcollectionsMerged = joinCollectionLists(
82
+ target?.subcollections ?? [],
83
+ source?.subcollections ?? [],
84
+ [...parentPaths, target.path],
85
+ modifyCollection
86
+ );
87
+
88
+ const propertiesMerged: PropertiesOrBuilders = { ...target.properties } as PropertiesOrBuilders;
89
+ Object.keys(source.properties).forEach((key) => {
90
+ const property = target.properties[key] as Property;
91
+ if (property)
92
+ propertiesMerged[key] = mergePropertyOrBuilder(property, source.properties[key] as PropertyOrBuilder);
93
+ else
94
+ propertiesMerged[key] = source.properties[key] as PropertyOrBuilder;
95
+ });
96
+
97
+ const mergedCollection = mergeDeep(target, source);
98
+ const targetPropertiesOrder = getCollectionKeys(target);
99
+ const sourcePropertiesOrder = getCollectionKeys(source);
100
+ const mergedPropertiesOrder = [...new Set([...sourcePropertiesOrder, ...targetPropertiesOrder])];
101
+ const mergedEntityViews = [...new Set([...(target.entityViews ?? []), ...(source.entityViews ?? [])])];
102
+
103
+ let resultCollection: EntityCollection = {
104
+ ...mergedCollection,
105
+ subcollections: subcollectionsMerged,
106
+ properties: sortProperties(propertiesMerged, mergedPropertiesOrder),
107
+ propertiesOrder: mergedPropertiesOrder,
108
+ entityViews: mergedEntityViews
109
+ };
110
+ if (modifyCollection) {
111
+ const modifiedCollection = modifyCollection({
112
+ collection: resultCollection,
113
+ parentPaths
114
+ });
115
+ if (modifiedCollection)
116
+ resultCollection = modifiedCollection;
117
+ }
118
+ return resultCollection
119
+ }
120
+
121
+ function mergePropertyOrBuilder(target: PropertyOrBuilder, source: PropertyOrBuilder): PropertyOrBuilder {
122
+ if (isPropertyBuilder(source)) {
123
+ return source;
124
+ } else if (isPropertyBuilder(target)) {
125
+ return target;
126
+ } else {
127
+ const mergedProperty = mergeDeep(target, source);
128
+ const targetEditable = Boolean(target.editable);
129
+ const sourceEditable = Boolean(source.editable);
130
+ if (source.dataType === "map" && source.properties) {
131
+ const targetProperties = ("properties" in target ? target.properties : {}) as PropertiesOrBuilders;
132
+ const sourceProperties = ("properties" in source ? source.properties : {}) as PropertiesOrBuilders;
133
+ const targetPropertiesOrder = "propertiesOrder" in target && target.propertiesOrder ? target.propertiesOrder : Object.keys(targetProperties);
134
+ const sourcePropertiesOrder = "propertiesOrder" in source && source.propertiesOrder ? source.propertiesOrder : ("properties" in source ? Object.keys(source.properties) : []);
135
+ const mergedPropertiesOrder = [...new Set([...targetPropertiesOrder, ...sourcePropertiesOrder])];
136
+ const mergedProperties: PropertiesOrBuilders = { ...targetProperties } as PropertiesOrBuilders;
137
+ Object.keys(source.properties).forEach((key) => {
138
+ const property = targetProperties[key] as Property;
139
+ if (property)
140
+ mergedProperties[key] = mergePropertyOrBuilder(property, sourceProperties[key] as PropertyOrBuilder);
141
+ });
142
+ return {
143
+ ...mergedProperty,
144
+ editable: targetEditable && sourceEditable,
145
+ properties: mergedProperties,
146
+ propertiesOrder: mergedPropertiesOrder
147
+ } as MapProperty;
148
+ }
149
+ return {
150
+ ...mergedProperty,
151
+ editable: targetEditable && sourceEditable
152
+ };
153
+ }
154
+ }
155
+
156
+ function getCollectionKeys(collection: EntityCollection) {
157
+ if (collection.propertiesOrder && collection.propertiesOrder.length > 0) {
158
+ const propertiesOrder = collection.propertiesOrder;
159
+ if (collection.additionalFields) {
160
+ collection.additionalFields.forEach((field) => {
161
+ if (!propertiesOrder.includes(field.key)) {
162
+ propertiesOrder.push(field.key);
163
+ }
164
+ });
165
+ }
166
+ return propertiesOrder;
167
+ }
168
+ return [
169
+ ...Object.keys(collection.properties),
170
+ ...(collection.additionalFields ?? [])?.map(f => f.key)
171
+ ];
172
+ }
@@ -0,0 +1,29 @@
1
+ import { Properties, PropertiesOrBuilders } from "../types";
2
+ import { isPropertyBuilder } from "./entities";
3
+
4
+ export function makePropertiesEditable(properties: Properties) {
5
+ Object.keys(properties).forEach((key) => {
6
+ const property = properties[key];
7
+ property.editable = true;
8
+ if (property.dataType === "map" && property.properties) {
9
+ makePropertiesEditable(property.properties as Properties);
10
+ }
11
+ });
12
+ return properties;
13
+ }
14
+
15
+ export function makePropertiesNonEditable(properties: PropertiesOrBuilders): PropertiesOrBuilders {
16
+ return Object.entries(properties).reduce((acc, [key, property]) => {
17
+ if (!isPropertyBuilder(property) && property.dataType === "map" && property.properties) {
18
+ const updated = { ...property, properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders) };
19
+ acc[key] = updated;
20
+ }
21
+ if (isPropertyBuilder(property)) {
22
+ acc[key] = property;
23
+ } else {
24
+ acc[key] = { ...property, editable: false };
25
+ }
26
+ return acc;
27
+ }, {} as PropertiesOrBuilders);
28
+
29
+ }
@@ -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
+ }