@firecms/core 3.0.0-3.0.0-beta.4.pre.1.0

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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/components/ArrayContainer.d.ts +40 -0
  4. package/dist/components/CircularProgressCenter.d.ts +11 -0
  5. package/dist/components/DeleteConfirmationDialog.d.ts +9 -0
  6. package/dist/components/DeleteEntityDialog.d.ts +12 -0
  7. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +31 -0
  8. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +27 -0
  9. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +99 -0
  10. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +18 -0
  11. package/dist/components/EntityCollectionTable/column_utils.d.ts +16 -0
  12. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +19 -0
  13. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +33 -0
  14. package/dist/components/EntityCollectionTable/index.d.ts +6 -0
  15. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +18 -0
  16. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +26 -0
  17. package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +9 -0
  18. package/dist/components/EntityCollectionTable/internal/common.d.ts +4 -0
  19. package/dist/components/EntityCollectionTable/internal/default_entity_actions.d.ts +6 -0
  20. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +5 -0
  21. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +23 -0
  22. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +13 -0
  23. package/dist/components/EntityCollectionTable/internal/popup_field/useWindowSize.d.ts +6 -0
  24. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +36 -0
  25. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +14 -0
  26. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  27. package/dist/components/EntityPreview.d.ts +29 -0
  28. package/dist/components/EntityView.d.ts +11 -0
  29. package/dist/components/ErrorBoundary.d.ts +11 -0
  30. package/dist/components/ErrorTooltip.d.ts +2 -0
  31. package/dist/components/ErrorView.d.ts +19 -0
  32. package/dist/components/FieldCaption.d.ts +4 -0
  33. package/dist/components/FireCMSAppBar.d.ts +26 -0
  34. package/dist/components/FireCMSLogo.d.ts +7 -0
  35. package/dist/components/HomePage/DefaultHomePage.d.ts +21 -0
  36. package/dist/components/HomePage/FavouritesView.d.ts +3 -0
  37. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  38. package/dist/components/HomePage/NavigationCardBinding.d.ts +17 -0
  39. package/dist/components/HomePage/NavigationGroup.d.ts +4 -0
  40. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  41. package/dist/components/HomePage/index.d.ts +5 -0
  42. package/dist/components/NotFoundPage.d.ts +1 -0
  43. package/dist/components/PropertyConfigBadge.d.ts +4 -0
  44. package/dist/components/PropertyIdCopyTooltipContent.d.ts +3 -0
  45. package/dist/components/ReferenceTable/ReferenceSelectionTable.d.ts +58 -0
  46. package/dist/components/ReferenceWidget.d.ts +28 -0
  47. package/dist/components/SearchIconsView.d.ts +5 -0
  48. package/dist/components/SelectableTable/SelectableTable.d.ts +75 -0
  49. package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
  50. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -0
  51. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +11 -0
  52. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +14 -0
  53. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +13 -0
  54. package/dist/components/VirtualTable/VirtualTable.d.ts +11 -0
  55. package/dist/components/VirtualTable/VirtualTableCell.d.ts +14 -0
  56. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +27 -0
  57. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  58. package/dist/components/VirtualTable/VirtualTableProps.d.ts +214 -0
  59. package/dist/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  60. package/dist/components/VirtualTable/common.d.ts +2 -0
  61. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +11 -0
  62. package/dist/components/VirtualTable/fields/VirtualTableInput.d.ts +8 -0
  63. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.d.ts +8 -0
  64. package/dist/components/VirtualTable/fields/VirtualTableSelect.d.ts +15 -0
  65. package/dist/components/VirtualTable/fields/VirtualTableSwitch.d.ts +7 -0
  66. package/dist/components/VirtualTable/index.d.ts +2 -0
  67. package/dist/components/VirtualTable/types.d.ts +34 -0
  68. package/dist/components/common/index.d.ts +5 -0
  69. package/dist/components/common/types.d.ts +60 -0
  70. package/dist/components/common/useColumnsIds.d.ts +4 -0
  71. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +32 -0
  72. package/dist/components/common/useDebouncedData.d.ts +9 -0
  73. package/dist/components/common/useTableSearchHelper.d.ts +12 -0
  74. package/dist/components/index.d.ts +25 -0
  75. package/dist/contexts/AnalyticsContext.d.ts +3 -0
  76. package/dist/contexts/AuthControllerContext.d.ts +3 -0
  77. package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
  78. package/dist/contexts/DataSourceContext.d.ts +3 -0
  79. package/dist/contexts/DialogsProvider.d.ts +4 -0
  80. package/dist/contexts/ModeController.d.ts +4 -0
  81. package/dist/contexts/NavigationContext.d.ts +3 -0
  82. package/dist/contexts/SideDialogsControllerContext.d.ts +3 -0
  83. package/dist/contexts/SideEntityControllerContext.d.ts +3 -0
  84. package/dist/contexts/SnackbarProvider.d.ts +2 -0
  85. package/dist/contexts/StorageSourceContext.d.ts +3 -0
  86. package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  87. package/dist/contexts/index.d.ts +3 -0
  88. package/dist/core/Drawer.d.ts +23 -0
  89. package/dist/core/EntityEditView.d.ts +22 -0
  90. package/dist/core/EntitySidePanel.d.ts +10 -0
  91. package/dist/core/FireCMS.d.ts +14 -0
  92. package/dist/core/NavigationRoutes.d.ts +21 -0
  93. package/dist/core/Scaffold.d.ts +55 -0
  94. package/dist/core/SideDialogs.d.ts +23 -0
  95. package/dist/core/SideEntityView.d.ts +7 -0
  96. package/dist/core/field_configs.d.ts +7 -0
  97. package/dist/core/index.d.ts +8 -0
  98. package/dist/form/EntityForm.d.ts +77 -0
  99. package/dist/form/PropertyFieldBinding.d.ts +30 -0
  100. package/dist/form/components/CustomIdField.d.ts +10 -0
  101. package/dist/form/components/ErrorFocus.d.ts +4 -0
  102. package/dist/form/components/FieldHelperText.d.ts +12 -0
  103. package/dist/form/components/FormikArrayContainer.d.ts +18 -0
  104. package/dist/form/components/LabelWithIcon.d.ts +14 -0
  105. package/dist/form/components/StorageItemPreview.d.ts +14 -0
  106. package/dist/form/components/StorageUploadProgress.d.ts +10 -0
  107. package/dist/form/components/index.d.ts +3 -0
  108. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +9 -0
  109. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +11 -0
  110. package/dist/form/field_bindings/BlockFieldBinding.d.ts +10 -0
  111. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +11 -0
  112. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +7 -0
  113. package/dist/form/field_bindings/MapFieldBinding.d.ts +9 -0
  114. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +9 -0
  115. package/dist/form/field_bindings/MultiSelectBinding.d.ts +9 -0
  116. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +10 -0
  117. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +9 -0
  118. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +10 -0
  119. package/dist/form/field_bindings/SelectFieldBinding.d.ts +12 -0
  120. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +29 -0
  121. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +12 -0
  122. package/dist/form/field_bindings/TextFieldBinding.d.ts +12 -0
  123. package/dist/form/index.d.ts +21 -0
  124. package/dist/form/useClearRestoreValue.d.ts +13 -0
  125. package/dist/form/validation.d.ts +25 -0
  126. package/dist/hooks/data/delete.d.ts +37 -0
  127. package/dist/hooks/data/save.d.ts +42 -0
  128. package/dist/hooks/data/useCollectionFetch.d.ts +50 -0
  129. package/dist/hooks/data/useDataOrder.d.ts +12 -0
  130. package/dist/hooks/data/useDataSource.d.ts +6 -0
  131. package/dist/hooks/data/useEntityFetch.d.ts +28 -0
  132. package/dist/hooks/index.d.ts +22 -0
  133. package/dist/hooks/useAnalyticsController.d.ts +5 -0
  134. package/dist/hooks/useAuthController.d.ts +11 -0
  135. package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  136. package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  137. package/dist/hooks/useBuildModeController.d.ts +6 -0
  138. package/dist/hooks/useBuildNavigationController.d.ts +24 -0
  139. package/dist/hooks/useClipboard.d.ts +57 -0
  140. package/dist/hooks/useCustomizationController.d.ts +11 -0
  141. package/dist/hooks/useDialogsController.d.ts +11 -0
  142. package/dist/hooks/useFireCMSContext.d.ts +11 -0
  143. package/dist/hooks/useLargeLayout.d.ts +1 -0
  144. package/dist/hooks/useModeController.d.ts +20 -0
  145. package/dist/hooks/useNavigationController.d.ts +9 -0
  146. package/dist/hooks/useProjectLog.d.ts +8 -0
  147. package/dist/hooks/useReferenceDialog.d.ts +18 -0
  148. package/dist/hooks/useResolvedNavigationFrom.d.ts +72 -0
  149. package/dist/hooks/useSideDialogsController.d.ts +18 -0
  150. package/dist/hooks/useSideEntityController.d.ts +12 -0
  151. package/dist/hooks/useSnackbarController.d.ts +42 -0
  152. package/dist/hooks/useStorageSource.d.ts +6 -0
  153. package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
  154. package/dist/index.d.ts +8 -0
  155. package/dist/index.es.js +16602 -0
  156. package/dist/index.es.js.map +1 -0
  157. package/dist/index.umd.js +589 -0
  158. package/dist/index.umd.js.map +1 -0
  159. package/dist/internal/common.d.ts +3 -0
  160. package/dist/internal/useBuildCustomizationController.d.ts +2 -0
  161. package/dist/internal/useBuildDataSource.d.ts +26 -0
  162. package/dist/internal/useBuildSideDialogsController.d.ts +2 -0
  163. package/dist/internal/useBuildSideEntityController.d.ts +4 -0
  164. package/dist/internal/useLocaleConfig.d.ts +1 -0
  165. package/dist/internal/useRestoreScroll.d.ts +6 -0
  166. package/dist/internal/useUnsavedChangesDialog.d.ts +14 -0
  167. package/dist/preview/PropertyPreview.d.ts +7 -0
  168. package/dist/preview/PropertyPreviewProps.d.ts +43 -0
  169. package/dist/preview/components/ArrayEnumPreview.d.ts +11 -0
  170. package/dist/preview/components/AsyncPreviewComponent.d.ts +11 -0
  171. package/dist/preview/components/BooleanPreview.d.ts +11 -0
  172. package/dist/preview/components/DatePreview.d.ts +7 -0
  173. package/dist/preview/components/EmptyValue.d.ts +4 -0
  174. package/dist/preview/components/EnumValuesChip.d.ts +13 -0
  175. package/dist/preview/components/ImagePreview.d.ts +12 -0
  176. package/dist/preview/components/ReferencePreview.d.ts +16 -0
  177. package/dist/preview/components/StorageThumbnail.d.ts +13 -0
  178. package/dist/preview/components/UrlComponentPreview.d.ts +12 -0
  179. package/dist/preview/index.d.ts +23 -0
  180. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +5 -0
  181. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +5 -0
  182. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +5 -0
  183. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +5 -0
  184. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +5 -0
  185. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +5 -0
  186. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +5 -0
  187. package/dist/preview/property_previews/MapPropertyPreview.d.ts +8 -0
  188. package/dist/preview/property_previews/NumberPropertyPreview.d.ts +6 -0
  189. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +14 -0
  190. package/dist/preview/property_previews/StringPropertyPreview.d.ts +6 -0
  191. package/dist/preview/util.d.ts +7 -0
  192. package/dist/types/analytics.d.ts +1 -0
  193. package/dist/types/analytics_controller.d.ts +7 -0
  194. package/dist/types/appcheck.d.ts +26 -0
  195. package/dist/types/auth.d.ts +47 -0
  196. package/dist/types/collections.d.ts +467 -0
  197. package/dist/types/customization_controller.d.ts +47 -0
  198. package/dist/types/datasource.d.ts +262 -0
  199. package/dist/types/dialogs_controller.d.ts +32 -0
  200. package/dist/types/entities.d.ts +58 -0
  201. package/dist/types/entity_actions.d.ts +35 -0
  202. package/dist/types/entity_callbacks.d.ts +185 -0
  203. package/dist/types/entity_link_builder.d.ts +7 -0
  204. package/dist/types/entity_overrides.d.ts +6 -0
  205. package/dist/types/export_import.d.ts +21 -0
  206. package/dist/types/fields.d.ts +180 -0
  207. package/dist/types/firecms.d.ts +132 -0
  208. package/dist/types/firecms_context.d.ts +70 -0
  209. package/dist/types/index.d.ts +29 -0
  210. package/dist/types/local_config_persistence.d.ts +21 -0
  211. package/dist/types/locales.d.ts +4 -0
  212. package/dist/types/modify_collections.d.ts +5 -0
  213. package/dist/types/navigation.d.ts +179 -0
  214. package/dist/types/permissions.d.ts +67 -0
  215. package/dist/types/plugins.d.ts +171 -0
  216. package/dist/types/properties.d.ts +681 -0
  217. package/dist/types/property_config.d.ts +42 -0
  218. package/dist/types/resolved_entities.d.ts +98 -0
  219. package/dist/types/side_dialogs_controller.d.ts +57 -0
  220. package/dist/types/side_entity_controller.d.ts +83 -0
  221. package/dist/types/storage.d.ts +82 -0
  222. package/dist/types/user.d.ts +36 -0
  223. package/dist/util/arrays.d.ts +1 -0
  224. package/dist/util/builders.d.ts +64 -0
  225. package/dist/util/collections.d.ts +11 -0
  226. package/dist/util/common.d.ts +2 -0
  227. package/dist/util/dates.d.ts +1 -0
  228. package/dist/util/entities.d.ts +28 -0
  229. package/dist/util/enums.d.ts +7 -0
  230. package/dist/util/flatten_object.d.ts +3 -0
  231. package/dist/util/hash.d.ts +1 -0
  232. package/dist/util/icon_list.d.ts +1 -0
  233. package/dist/util/icon_synonyms.d.ts +1950 -0
  234. package/dist/util/icons.d.ts +13 -0
  235. package/dist/util/index.d.ts +23 -0
  236. package/dist/util/join_collections.d.ts +9 -0
  237. package/dist/util/make_properties_editable.d.ts +3 -0
  238. package/dist/util/navigation_from_path.d.ts +24 -0
  239. package/dist/util/navigation_utils.d.ts +20 -0
  240. package/dist/util/objects.d.ts +10 -0
  241. package/dist/util/os.d.ts +2 -0
  242. package/dist/util/parent_references_from_path.d.ts +6 -0
  243. package/dist/util/paths.d.ts +14 -0
  244. package/dist/util/permissions.d.ts +5 -0
  245. package/dist/util/plurals.d.ts +18 -0
  246. package/dist/util/property_utils.d.ts +23 -0
  247. package/dist/util/references.d.ts +4 -0
  248. package/dist/util/regexp.d.ts +7 -0
  249. package/dist/util/resolutions.d.ts +64 -0
  250. package/dist/util/storage.d.ts +3 -0
  251. package/dist/util/strings.d.ts +6 -0
  252. package/dist/util/useDebouncedCallback.d.ts +1 -0
  253. package/dist/util/useStorageUploadController.d.ts +36 -0
  254. package/dist/util/useTraceUpdate.d.ts +1 -0
  255. package/package.json +122 -0
  256. package/src/components/ArrayContainer.tsx +334 -0
  257. package/src/components/CircularProgressCenter.tsx +26 -0
  258. package/src/components/DeleteConfirmationDialog.tsx +47 -0
  259. package/src/components/DeleteEntityDialog.tsx +213 -0
  260. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +170 -0
  261. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +325 -0
  262. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +145 -0
  263. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +461 -0
  264. package/src/components/EntityCollectionTable/column_utils.tsx +74 -0
  265. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +155 -0
  266. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +313 -0
  267. package/src/components/EntityCollectionTable/index.tsx +12 -0
  268. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +116 -0
  269. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +257 -0
  270. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +70 -0
  271. package/src/components/EntityCollectionTable/internal/common.tsx +70 -0
  272. package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +126 -0
  273. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +59 -0
  274. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +408 -0
  275. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +97 -0
  276. package/src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx +20 -0
  277. package/src/components/EntityCollectionView/EntityCollectionView.tsx +804 -0
  278. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +132 -0
  279. package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
  280. package/src/components/EntityPreview.tsx +218 -0
  281. package/src/components/EntityView.tsx +84 -0
  282. package/src/components/ErrorBoundary.tsx +40 -0
  283. package/src/components/ErrorTooltip.tsx +11 -0
  284. package/src/components/ErrorView.tsx +52 -0
  285. package/src/components/FieldCaption.tsx +13 -0
  286. package/src/components/FireCMSAppBar.tsx +165 -0
  287. package/src/components/FireCMSLogo.tsx +73 -0
  288. package/src/components/HomePage/DefaultHomePage.tsx +214 -0
  289. package/src/components/HomePage/FavouritesView.tsx +64 -0
  290. package/src/components/HomePage/NavigationCard.tsx +69 -0
  291. package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
  292. package/src/components/HomePage/NavigationGroup.tsx +39 -0
  293. package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
  294. package/src/components/HomePage/index.tsx +5 -0
  295. package/src/components/NotFoundPage.tsx +25 -0
  296. package/src/components/PropertyConfigBadge.tsx +17 -0
  297. package/src/components/PropertyIdCopyTooltipContent.tsx +28 -0
  298. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +379 -0
  299. package/src/components/ReferenceWidget.tsx +145 -0
  300. package/src/components/SearchIconsView.tsx +75 -0
  301. package/src/components/SelectableTable/SelectableTable.tsx +329 -0
  302. package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
  303. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +49 -0
  304. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +109 -0
  305. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +179 -0
  306. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +158 -0
  307. package/src/components/VirtualTable/VirtualTable.tsx +405 -0
  308. package/src/components/VirtualTable/VirtualTableCell.tsx +50 -0
  309. package/src/components/VirtualTable/VirtualTableHeader.tsx +266 -0
  310. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +131 -0
  311. package/src/components/VirtualTable/VirtualTableProps.tsx +269 -0
  312. package/src/components/VirtualTable/VirtualTableRow.tsx +53 -0
  313. package/src/components/VirtualTable/common.tsx +18 -0
  314. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +37 -0
  315. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +91 -0
  316. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +82 -0
  317. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +130 -0
  318. package/src/components/VirtualTable/fields/VirtualTableSwitch.tsx +32 -0
  319. package/src/components/VirtualTable/index.tsx +2 -0
  320. package/src/components/VirtualTable/types.tsx +44 -0
  321. package/src/components/common/index.ts +5 -0
  322. package/src/components/common/types.tsx +63 -0
  323. package/src/components/common/useColumnsIds.tsx +100 -0
  324. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +225 -0
  325. package/src/components/common/useDebouncedData.ts +49 -0
  326. package/src/components/common/useTableSearchHelper.ts +47 -0
  327. package/src/components/index.tsx +36 -0
  328. package/src/contexts/AnalyticsContext.tsx +4 -0
  329. package/src/contexts/AuthControllerContext.tsx +4 -0
  330. package/src/contexts/CustomizationControllerContext.tsx +4 -0
  331. package/src/contexts/DataSourceContext.tsx +4 -0
  332. package/src/contexts/DialogsProvider.tsx +52 -0
  333. package/src/contexts/ModeController.tsx +13 -0
  334. package/src/contexts/NavigationContext.tsx +4 -0
  335. package/src/contexts/SideDialogsControllerContext.tsx +4 -0
  336. package/src/contexts/SideEntityControllerContext.tsx +4 -0
  337. package/src/contexts/SnackbarProvider.tsx +12 -0
  338. package/src/contexts/StorageSourceContext.tsx +4 -0
  339. package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
  340. package/src/contexts/index.ts +3 -0
  341. package/src/core/Drawer.tsx +191 -0
  342. package/src/core/EntityEditView.tsx +561 -0
  343. package/src/core/EntitySidePanel.tsx +91 -0
  344. package/src/core/FireCMS.tsx +198 -0
  345. package/src/core/NavigationRoutes.tsx +127 -0
  346. package/src/core/Scaffold.tsx +281 -0
  347. package/src/core/SideDialogs.tsx +156 -0
  348. package/src/core/SideEntityView.tsx +38 -0
  349. package/src/core/field_configs.tsx +400 -0
  350. package/src/core/index.tsx +12 -0
  351. package/src/form/EntityForm.tsx +728 -0
  352. package/src/form/PropertyFieldBinding.tsx +306 -0
  353. package/src/form/components/CustomIdField.tsx +139 -0
  354. package/src/form/components/ErrorFocus.tsx +51 -0
  355. package/src/form/components/FieldHelperText.tsx +58 -0
  356. package/src/form/components/FormikArrayContainer.tsx +44 -0
  357. package/src/form/components/LabelWithIcon.tsx +33 -0
  358. package/src/form/components/StorageItemPreview.tsx +68 -0
  359. package/src/form/components/StorageUploadProgress.tsx +105 -0
  360. package/src/form/components/index.tsx +3 -0
  361. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +86 -0
  362. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +149 -0
  363. package/src/form/field_bindings/BlockFieldBinding.tsx +245 -0
  364. package/src/form/field_bindings/DateTimeFieldBinding.tsx +67 -0
  365. package/src/form/field_bindings/KeyValueFieldBinding.tsx +558 -0
  366. package/src/form/field_bindings/MapFieldBinding.tsx +138 -0
  367. package/src/form/field_bindings/MarkdownFieldBinding.tsx +695 -0
  368. package/src/form/field_bindings/MultiSelectBinding.tsx +114 -0
  369. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +69 -0
  370. package/src/form/field_bindings/ReferenceFieldBinding.tsx +123 -0
  371. package/src/form/field_bindings/RepeatFieldBinding.tsx +105 -0
  372. package/src/form/field_bindings/SelectFieldBinding.tsx +99 -0
  373. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +447 -0
  374. package/src/form/field_bindings/SwitchFieldBinding.tsx +60 -0
  375. package/src/form/field_bindings/TextFieldBinding.tsx +109 -0
  376. package/src/form/index.tsx +43 -0
  377. package/src/form/useClearRestoreValue.tsx +35 -0
  378. package/src/form/validation.ts +412 -0
  379. package/src/hooks/data/delete.ts +101 -0
  380. package/src/hooks/data/save.ts +170 -0
  381. package/src/hooks/data/useCollectionFetch.tsx +162 -0
  382. package/src/hooks/data/useDataOrder.ts +26 -0
  383. package/src/hooks/data/useDataSource.tsx +14 -0
  384. package/src/hooks/data/useEntityFetch.tsx +129 -0
  385. package/src/hooks/index.tsx +27 -0
  386. package/src/hooks/useAnalyticsController.tsx +8 -0
  387. package/src/hooks/useAuthController.tsx +14 -0
  388. package/src/hooks/useBrowserTitleAndIcon.tsx +25 -0
  389. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +67 -0
  390. package/src/hooks/useBuildModeController.tsx +60 -0
  391. package/src/hooks/useBuildNavigationController.tsx +433 -0
  392. package/src/hooks/useClipboard.tsx +158 -0
  393. package/src/hooks/useCustomizationController.tsx +14 -0
  394. package/src/hooks/useDialogsController.tsx +14 -0
  395. package/src/hooks/useFireCMSContext.tsx +99 -0
  396. package/src/hooks/useLargeLayout.tsx +100 -0
  397. package/src/hooks/useModeController.tsx +24 -0
  398. package/src/hooks/useNavigationController.tsx +12 -0
  399. package/src/hooks/useProjectLog.tsx +39 -0
  400. package/src/hooks/useReferenceDialog.tsx +56 -0
  401. package/src/hooks/useResolvedNavigationFrom.tsx +160 -0
  402. package/src/hooks/useSideDialogsController.tsx +21 -0
  403. package/src/hooks/useSideEntityController.tsx +15 -0
  404. package/src/hooks/useSnackbarController.tsx +75 -0
  405. package/src/hooks/useStorageSource.tsx +14 -0
  406. package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
  407. package/src/index.ts +8 -0
  408. package/src/internal/common.tsx +5 -0
  409. package/src/internal/useBuildCustomizationController.tsx +5 -0
  410. package/src/internal/useBuildDataSource.ts +363 -0
  411. package/src/internal/useBuildSideDialogsController.tsx +125 -0
  412. package/src/internal/useBuildSideEntityController.tsx +172 -0
  413. package/src/internal/useLocaleConfig.tsx +18 -0
  414. package/src/internal/useRestoreScroll.tsx +48 -0
  415. package/src/internal/useUnsavedChangesDialog.tsx +106 -0
  416. package/src/preview/PropertyPreview.tsx +225 -0
  417. package/src/preview/PropertyPreviewProps.tsx +59 -0
  418. package/src/preview/components/ArrayEnumPreview.tsx +39 -0
  419. package/src/preview/components/AsyncPreviewComponent.tsx +47 -0
  420. package/src/preview/components/BooleanPreview.tsx +24 -0
  421. package/src/preview/components/DatePreview.tsx +26 -0
  422. package/src/preview/components/EmptyValue.tsx +10 -0
  423. package/src/preview/components/EnumValuesChip.tsx +38 -0
  424. package/src/preview/components/ImagePreview.tsx +106 -0
  425. package/src/preview/components/ReferencePreview.tsx +166 -0
  426. package/src/preview/components/StorageThumbnail.tsx +84 -0
  427. package/src/preview/components/UrlComponentPreview.tsx +79 -0
  428. package/src/preview/index.ts +27 -0
  429. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +82 -0
  430. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +52 -0
  431. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +54 -0
  432. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +55 -0
  433. package/src/preview/property_previews/ArrayOneOfPreview.tsx +67 -0
  434. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +28 -0
  435. package/src/preview/property_previews/ArrayPropertyPreview.tsx +68 -0
  436. package/src/preview/property_previews/MapPropertyPreview.tsx +146 -0
  437. package/src/preview/property_previews/NumberPropertyPreview.tsx +27 -0
  438. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +283 -0
  439. package/src/preview/property_previews/StringPropertyPreview.tsx +60 -0
  440. package/src/preview/util.ts +31 -0
  441. package/src/types/analytics.ts +35 -0
  442. package/src/types/analytics_controller.tsx +10 -0
  443. package/src/types/appcheck.ts +29 -0
  444. package/src/types/auth.tsx +59 -0
  445. package/src/types/collections.ts +548 -0
  446. package/src/types/customization_controller.tsx +58 -0
  447. package/src/types/datasource.ts +389 -0
  448. package/src/types/dialogs_controller.tsx +33 -0
  449. package/src/types/entities.ts +80 -0
  450. package/src/types/entity_actions.tsx +43 -0
  451. package/src/types/entity_callbacks.ts +229 -0
  452. package/src/types/entity_link_builder.ts +8 -0
  453. package/src/types/entity_overrides.tsx +7 -0
  454. package/src/types/export_import.ts +26 -0
  455. package/src/types/fields.tsx +220 -0
  456. package/src/types/firecms.tsx +153 -0
  457. package/src/types/firecms_context.tsx +83 -0
  458. package/src/types/index.ts +29 -0
  459. package/src/types/local_config_persistence.tsx +23 -0
  460. package/src/types/locales.ts +81 -0
  461. package/src/types/modify_collections.tsx +6 -0
  462. package/src/types/navigation.ts +215 -0
  463. package/src/types/permissions.ts +81 -0
  464. package/src/types/plugins.tsx +207 -0
  465. package/src/types/properties.ts +851 -0
  466. package/src/types/property_config.tsx +72 -0
  467. package/src/types/resolved_entities.ts +148 -0
  468. package/src/types/side_dialogs_controller.tsx +68 -0
  469. package/src/types/side_entity_controller.tsx +97 -0
  470. package/src/types/storage.ts +96 -0
  471. package/src/types/user.ts +37 -0
  472. package/src/util/arrays.ts +3 -0
  473. package/src/util/builders.ts +139 -0
  474. package/src/util/collections.ts +72 -0
  475. package/src/util/common.tsx +2 -0
  476. package/src/util/dates.ts +1 -0
  477. package/src/util/entities.ts +196 -0
  478. package/src/util/enums.ts +56 -0
  479. package/src/util/flatten_object.ts +45 -0
  480. package/src/util/hash.ts +11 -0
  481. package/src/util/icon_list.ts +17 -0
  482. package/src/util/icon_synonyms.ts +1950 -0
  483. package/src/util/icons.tsx +56 -0
  484. package/src/util/index.ts +23 -0
  485. package/src/util/join_collections.ts +172 -0
  486. package/src/util/make_properties_editable.ts +29 -0
  487. package/src/util/navigation_from_path.ts +107 -0
  488. package/src/util/navigation_utils.ts +111 -0
  489. package/src/util/objects.ts +168 -0
  490. package/src/util/os.ts +13 -0
  491. package/src/util/parent_references_from_path.ts +56 -0
  492. package/src/util/paths.ts +27 -0
  493. package/src/util/permissions.ts +83 -0
  494. package/src/util/plurals.ts +190 -0
  495. package/src/util/property_utils.tsx +130 -0
  496. package/src/util/references.ts +51 -0
  497. package/src/util/regexp.ts +32 -0
  498. package/src/util/resolutions.ts +399 -0
  499. package/src/util/storage.ts +92 -0
  500. package/src/util/strings.ts +63 -0
  501. package/src/util/useDebouncedCallback.ts +25 -0
  502. package/src/util/useStorageUploadController.tsx +243 -0
  503. package/src/util/useTraceUpdate.tsx +23 -0
@@ -0,0 +1,363 @@
1
+ import { useCallback } from "react";
2
+ import {
3
+ DataSource,
4
+ DataSourceDelegate,
5
+ DeleteEntityProps,
6
+ Entity,
7
+ EntityCollection,
8
+ EntityReference,
9
+ EntityValues,
10
+ FetchCollectionProps,
11
+ FetchEntityProps,
12
+ FilterValues,
13
+ GeoPoint,
14
+ ListenCollectionProps,
15
+ ListenEntityProps,
16
+ NavigationController,
17
+ PropertyConfig,
18
+ ResolvedProperties,
19
+ SaveEntityProps
20
+ } from "../types";
21
+ import { resolveCollection, updateDateAutoValues } from "../util";
22
+
23
+ /**
24
+ * Use this hook to build a {@link DataSource} based on Firestore
25
+ * @param firebaseApp
26
+ * @group Firebase
27
+ */
28
+ export function useBuildDataSource({
29
+ delegate,
30
+ propertyConfigs,
31
+ navigationController
32
+ }: {
33
+ delegate: DataSourceDelegate,
34
+ propertyConfigs?: Record<string, PropertyConfig>;
35
+ navigationController: NavigationController;
36
+ }): DataSource {
37
+
38
+ return {
39
+
40
+ /**
41
+ * Fetch entities in a Firestore path
42
+ * @param path
43
+ * @param collection
44
+ * @param filter
45
+ * @param limit
46
+ * @param startAfter
47
+ * @param searchString
48
+ * @param orderBy
49
+ * @param order
50
+ * @return Function to cancel subscription
51
+ * @see useCollectionFetch if you need this functionality implemented as a hook
52
+ * @group Firestore
53
+ */
54
+ fetchCollection: useCallback(<M extends Record<string, any>>({
55
+ path,
56
+ collection: collectionProp,
57
+ filter,
58
+ limit,
59
+ startAfter,
60
+ searchString,
61
+ orderBy,
62
+ order
63
+ }: FetchCollectionProps<M>
64
+ ): Promise<Entity<M>[]> => {
65
+ return delegate.fetchCollection<M>({
66
+ path,
67
+ filter,
68
+ limit,
69
+ startAfter,
70
+ searchString,
71
+ orderBy,
72
+ order
73
+ });
74
+ }, [delegate]),
75
+
76
+ /**
77
+ * Listen to a entities in a given path
78
+ * @param path
79
+ * @param collection
80
+ * @param onError
81
+ * @param filter
82
+ * @param limit
83
+ * @param startAfter
84
+ * @param searchString
85
+ * @param orderBy
86
+ * @param order
87
+ * @param onUpdate
88
+ * @return Function to cancel subscription
89
+ * @see useCollectionFetch if you need this functionality implemented as a hook
90
+ * @group Firestore
91
+ */
92
+ listenCollection: delegate.listenCollection
93
+ // eslint-disable-next-line react-hooks/rules-of-hooks
94
+ ? useCallback(<M extends Record<string, any>>(
95
+ {
96
+ path,
97
+ collection: collectionProp,
98
+ filter,
99
+ limit,
100
+ startAfter,
101
+ searchString,
102
+ orderBy,
103
+ order,
104
+ onUpdate,
105
+ onError
106
+ }: ListenCollectionProps<M>
107
+ ): () => void => {
108
+
109
+ const collection = collectionProp ?? navigationController.getCollection(path);
110
+ const isCollectionGroup = Boolean(collection?.collectionGroup) ?? false;
111
+ if (!delegate.listenCollection)
112
+ throw Error("useBuildDataSource delegate not initialised");
113
+
114
+ return delegate.listenCollection<M>({
115
+ path,
116
+ filter,
117
+ limit,
118
+ startAfter,
119
+ searchString,
120
+ orderBy,
121
+ order,
122
+ onUpdate,
123
+ onError,
124
+ isCollectionGroup,
125
+ collection
126
+ });
127
+ }, [delegate, navigationController.getCollection])
128
+ : undefined,
129
+
130
+ /**
131
+ * Retrieve an entity given a path and a collection
132
+ * @param path
133
+ * @param entityId
134
+ * @param collection
135
+ * @group Firestore
136
+ */
137
+ fetchEntity: useCallback(<M extends Record<string, any>>({
138
+ path,
139
+ entityId
140
+ }: FetchEntityProps<M>
141
+ ): Promise<Entity<M> | undefined> => delegate.fetchEntity({
142
+ path,
143
+ entityId
144
+ }), [delegate]),
145
+
146
+ /**
147
+ *
148
+ * @param path
149
+ * @param entityId
150
+ * @param collection
151
+ * @param onUpdate
152
+ * @param onError
153
+ * @return Function to cancel subscription
154
+ * @group Firestore
155
+ */
156
+ listenEntity: delegate.listenEntity
157
+ // eslint-disable-next-line react-hooks/rules-of-hooks
158
+ ? useCallback(<M extends Record<string, any>>(
159
+ {
160
+ path,
161
+ entityId,
162
+ collection,
163
+ onUpdate,
164
+ onError
165
+ }: ListenEntityProps<M>): () => void => {
166
+ if (!delegate.listenEntity)
167
+ throw Error("useBuildDataSource delegate not initialised");
168
+
169
+ return delegate.listenEntity<M>({
170
+ path,
171
+ entityId,
172
+ onUpdate,
173
+ onError
174
+ })
175
+ }, [delegate.listenEntity]) : undefined,
176
+
177
+ /**
178
+ * Save entity to the specified path. Note that Firestore does not allow
179
+ * undefined values.
180
+ * @param path
181
+ * @param entityId
182
+ * @param values
183
+ * @param schemaId
184
+ * @param collection
185
+ * @param status
186
+ * @group Firestore
187
+ */
188
+ saveEntity: useCallback(<M extends Record<string, any>>(
189
+ {
190
+ path,
191
+ entityId,
192
+ values,
193
+ collection: collectionProp,
194
+ status
195
+ }: SaveEntityProps<M>): Promise<Entity<M>> => {
196
+
197
+ const collection = collectionProp ?? navigationController.getCollection(path);
198
+
199
+ const resolvedCollection = collection
200
+ ? resolveCollection<M>({
201
+ collection,
202
+ path,
203
+ entityId,
204
+ fields: propertyConfigs
205
+ })
206
+ : undefined;
207
+
208
+ const properties: ResolvedProperties<M> | undefined = resolvedCollection?.properties;
209
+
210
+ const firestoreValues = cmsToDelegateModel(
211
+ values,
212
+ delegate.buildReference,
213
+ delegate.buildGeoPoint,
214
+ delegate.buildDate,
215
+ delegate.buildDeleteFieldValue
216
+ );
217
+ const updatedFirestoreValues: EntityValues<M> = properties
218
+ ? updateDateAutoValues(
219
+ {
220
+ inputValues: firestoreValues,
221
+ properties,
222
+ status,
223
+ timestampNowValue: delegate.currentTime(),
224
+ setDateToMidnight: delegate.setDateToMidnight
225
+ })
226
+ : firestoreValues;
227
+
228
+ return delegate.saveEntity({
229
+ path,
230
+ entityId,
231
+ values: updatedFirestoreValues,
232
+ status
233
+ }).then((res) => {
234
+ return {
235
+ id: res.id,
236
+ path: res.path,
237
+ values: delegate.delegateToCMSModel(updatedFirestoreValues)
238
+ } as Entity<M>;
239
+ });
240
+ }, [delegate.saveEntity, navigationController.getCollection]),
241
+
242
+ /**
243
+ * Delete an entity
244
+ * @param entity
245
+ * @param collection
246
+ * @group Firestore
247
+ */
248
+ deleteEntity: useCallback(<M extends Record<string, any>>(
249
+ {
250
+ entity
251
+ }: DeleteEntityProps<M>
252
+ ): Promise<void> => {
253
+ return delegate.deleteEntity({ entity });
254
+ }, [delegate.deleteEntity]),
255
+
256
+ /**
257
+ * Check if the given property is unique in the given collection
258
+ * @param path Collection path
259
+ * @param name of the property
260
+ * @param value
261
+ * @param property
262
+ * @param entityId
263
+ * @return `true` if there are no other fields besides the given entity
264
+ * @group Firestore
265
+ */
266
+ checkUniqueField: useCallback((
267
+ path: string,
268
+ name: string,
269
+ value: any,
270
+ entityId?: string
271
+ ): Promise<boolean> => {
272
+ return delegate.checkUniqueField(path, name, value, entityId);
273
+ }, [delegate.checkUniqueField]),
274
+
275
+ generateEntityId: useCallback((path: string): string => {
276
+ return delegate.generateEntityId(path,);
277
+ }, [delegate.generateEntityId]),
278
+
279
+ countEntities: delegate.countEntities ? async ({
280
+ path,
281
+ collection,
282
+ filter,
283
+ order,
284
+ orderBy
285
+ }: {
286
+ path: string,
287
+ collection: EntityCollection<any>,
288
+ filter?: FilterValues<Extract<keyof any, string>>,
289
+ orderBy?: string,
290
+ order?: "desc" | "asc",
291
+ }): Promise<number> => {
292
+ return delegate.countEntities!({
293
+ path,
294
+ filter,
295
+ orderBy,
296
+ order,
297
+ isCollectionGroup: Boolean(collection.collectionGroup) ?? false
298
+ });
299
+ } : undefined,
300
+
301
+ isFilterCombinationValid: useCallback(({
302
+ path,
303
+ filterValues,
304
+ sortBy
305
+ }: {
306
+ path: string,
307
+ filterValues: FilterValues<any>,
308
+ sortBy?: [string, "asc" | "desc"]
309
+ }): boolean => {
310
+ if (!delegate.isFilterCombinationValid)
311
+ return true;
312
+ return delegate.isFilterCombinationValid(
313
+ {
314
+ path,
315
+ filterValues,
316
+ sortBy
317
+ }
318
+ )
319
+ }, [delegate.isFilterCombinationValid])
320
+
321
+ };
322
+
323
+ }
324
+
325
+ /**
326
+ * Recursive function that converts Firestore data types into CMS or plain
327
+ * JS types.
328
+ * FireCMS uses Javascript dates internally instead of Firestore timestamps.
329
+ * This makes it easier to interact with the rest of the libraries and
330
+ * bindings.
331
+ * Also, Firestore references are replaced with {@link EntityReference}
332
+ * @param data
333
+ * @param buildReference
334
+ * @param buildGeoPoint
335
+ * @param buildDate
336
+ * @param buildDelete
337
+ * @group Firestore
338
+ */
339
+ export function cmsToDelegateModel(data: any,
340
+ buildReference: (reference: EntityReference) => any,
341
+ buildGeoPoint: (geoPoint: GeoPoint) => any,
342
+ buildDate: (date: Date) => any,
343
+ buildDelete: () => any
344
+ ): any {
345
+ if (data === undefined) {
346
+ return buildDelete();
347
+ } else if (data === null) {
348
+ return null;
349
+ } else if (Array.isArray(data)) {
350
+ return data.map(v => cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete));
351
+ } else if (data.isEntityReference && data.isEntityReference()) {
352
+ return buildReference(data);
353
+ } else if (data instanceof GeoPoint) {
354
+ return buildGeoPoint(data);
355
+ } else if (data instanceof Date) {
356
+ return buildDate(data);
357
+ } else if (data && typeof data === "object") {
358
+ return Object.entries(data)
359
+ .map(([key, v]) => ({ [key]: cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete) }))
360
+ .reduce((a, b) => ({ ...a, ...b }), {});
361
+ }
362
+ return data;
363
+ }
@@ -0,0 +1,125 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useLocation, useNavigate } from "react-router-dom";
3
+ import { SideDialogPanelProps, SideDialogsController } from "../types";
4
+ import equal from "react-fast-compare"
5
+
6
+ export function useBuildSideDialogsController(): SideDialogsController {
7
+
8
+ const location = useLocation();
9
+ const navigate = useNavigate();
10
+
11
+ const [sidePanels, setSidePanels] = useState<SideDialogPanelProps[]>([]);
12
+ const sidePanelsRef = useRef<SideDialogPanelProps[]>(sidePanels);
13
+
14
+ const routesStore = useRef<Record<string, SideDialogPanelProps>>({});
15
+ const routesCount = useRef<number>(0);
16
+
17
+ const updateSidePanels = (newPanels: SideDialogPanelProps[]) => {
18
+ sidePanelsRef.current = newPanels;
19
+ setSidePanels(newPanels);
20
+ };
21
+
22
+ useEffect(() => {
23
+ const state = location.state as any;
24
+ const panelKeys: string[] = state?.panels ?? [];
25
+ const newPanels = panelKeys
26
+ .map(key => routesStore.current[key])
27
+ .filter(p => Boolean(p)) as SideDialogPanelProps[];
28
+ if (!equal(sidePanelsRef.current.map(p => p.key), newPanels.map(p => p.key)))
29
+ updateSidePanels(newPanels);
30
+ }, [location]);
31
+
32
+ const close = useCallback(() => {
33
+
34
+ if (sidePanels.length === 0)
35
+ return;
36
+
37
+ const lastSidePanel = sidePanels[sidePanels.length - 1];
38
+ const updatedPanels = [...sidePanels.slice(0, -1)];
39
+ updateSidePanels(updatedPanels);
40
+
41
+ if (routesCount.current > 0) {
42
+ if (lastSidePanel.urlPath)
43
+ navigate(-1);
44
+ routesCount.current--;
45
+ } else if (lastSidePanel.parentUrlPath) {
46
+ const baseLocation = (location.state as any)?.base_location ?? location;
47
+ navigate(
48
+ lastSidePanel.parentUrlPath,
49
+ {
50
+ replace: true,
51
+ state: {
52
+ base_location: baseLocation,
53
+ panels: updatedPanels.map(p => p.key)
54
+ }
55
+ }
56
+ );
57
+ }
58
+ }, [sidePanels, navigate, location]);
59
+
60
+ const open = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {
61
+
62
+ const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];
63
+
64
+ newPanels.forEach((panel) => {
65
+ routesStore.current[panel.key] = panel;
66
+ });
67
+ routesCount.current = routesCount.current + newPanels.length;
68
+
69
+ const baseLocation = (location.state as any)?.base_location ?? location;
70
+
71
+ const updatedPanels = [...sidePanels, ...newPanels];
72
+ updateSidePanels(updatedPanels);
73
+
74
+ newPanels.forEach((panel) => {
75
+ if (panel.urlPath) {
76
+ navigate(
77
+ panel.urlPath,
78
+ {
79
+ state: {
80
+ base_location: baseLocation,
81
+ panels: updatedPanels.map(p => p.key)
82
+ }
83
+ }
84
+ );
85
+ }
86
+ });
87
+
88
+ }, [location, navigate, sidePanels]);
89
+
90
+ const replace = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {
91
+
92
+ const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];
93
+ newPanels.forEach((panel) => {
94
+ routesStore.current[panel.key] = panel;
95
+ });
96
+
97
+ const baseLocation = (location.state as any)?.base_location ?? location;
98
+
99
+ const updatedPanels = [...sidePanels.slice(0, -newPanels.length), ...newPanels];
100
+ updateSidePanels(updatedPanels);
101
+
102
+ newPanels.forEach((panel) => {
103
+ if (panel.urlPath) {
104
+ navigate(
105
+ panel.urlPath,
106
+ {
107
+ replace: true,
108
+ state: {
109
+ base_location: baseLocation,
110
+ panels: updatedPanels.map(p => p.key)
111
+ }
112
+ }
113
+ );
114
+ }
115
+ });
116
+
117
+ }, [location, navigate, sidePanels]);
118
+
119
+ return {
120
+ sidePanels,
121
+ close,
122
+ open,
123
+ replace
124
+ };
125
+ }
@@ -0,0 +1,172 @@
1
+ import { useCallback, useEffect, useRef } from "react";
2
+ import {
3
+ EntityCollection,
4
+ EntitySidePanelProps,
5
+ NavigationController,
6
+ SideDialogPanelProps,
7
+ SideDialogsController,
8
+ SideEntityController
9
+ } from "../types";
10
+ import { getNavigationEntriesFromPathInternal, NavigationViewInternal } from "../util/navigation_from_path";
11
+ import { useLocation } from "react-router-dom";
12
+ import { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from "../util";
13
+ import { ADDITIONAL_TAB_WIDTH, CONTAINER_FULL_WIDTH, FORM_CONTAINER_WIDTH } from "./common";
14
+ import { useLargeLayout } from "../hooks";
15
+ import { EntitySidePanel } from "../core/EntitySidePanel";
16
+
17
+ const NEW_URL_HASH = "new";
18
+
19
+ export function getEntityViewWidth(props: EntitySidePanelProps<any>, small: boolean): string {
20
+ if (small) return CONTAINER_FULL_WIDTH;
21
+ const mainViewSelected = !props.selectedSubPath;
22
+ const resolvedWidth: string | undefined = typeof props.width === "number" ? `${props.width}px` : props.width;
23
+ return !mainViewSelected ? `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedWidth ?? FORM_CONTAINER_WIDTH})` : resolvedWidth ?? FORM_CONTAINER_WIDTH
24
+ }
25
+
26
+ export const useBuildSideEntityController = (navigation: NavigationController,
27
+ sideDialogsController: SideDialogsController): SideEntityController => {
28
+
29
+ const location = useLocation();
30
+ const initialised = useRef<boolean>(false);
31
+
32
+ const smallLayout = !useLargeLayout();
33
+
34
+ // only on initialisation, create panels from URL
35
+ useEffect(() => {
36
+ if (!navigation.loading && !initialised.current) {
37
+ if (navigation.isUrlCollectionPath(location.pathname)) {
38
+ const newFlag = location.hash === `#${NEW_URL_HASH}`;
39
+ const entityOrCollectionPath = navigation.urlPathToDataPath(location.pathname);
40
+ const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, navigation.collections ?? [], newFlag);
41
+ for (let i = 0; i < panelsFromUrl.length; i++) {
42
+ const panel = panelsFromUrl[i];
43
+ setTimeout(() => {
44
+ if (i === 0)
45
+ sideDialogsController.replace(propsToSidePanel(panel, navigation, smallLayout));
46
+ else
47
+ sideDialogsController.open(propsToSidePanel(panel, navigation, smallLayout))
48
+ }, 1);
49
+ }
50
+ }
51
+ initialised.current = true;
52
+ }
53
+ }, [location, navigation, sideDialogsController, smallLayout]);
54
+
55
+ const close = useCallback(() => {
56
+ sideDialogsController.close();
57
+ }, [sideDialogsController]);
58
+
59
+ const open = useCallback((props: EntitySidePanelProps<any>) => {
60
+
61
+ if (props.copy && !props.entityId) {
62
+ throw Error("If you want to copy an entity you need to provide an entityId");
63
+ }
64
+
65
+ const defaultSelectedView = resolveDefaultSelectedView(
66
+ props.collection ? props.collection.defaultSelectedView : undefined,
67
+ {
68
+ status: props.copy ? "copy" : (props.entityId ? "existing" : "new"),
69
+ entityId: props.entityId
70
+ }
71
+ );
72
+
73
+ sideDialogsController.open(propsToSidePanel({
74
+ selectedSubPath: defaultSelectedView,
75
+ ...props,
76
+ }, navigation, smallLayout));
77
+
78
+ }, [sideDialogsController, navigation, smallLayout]);
79
+
80
+ const replace = useCallback((props: EntitySidePanelProps<any>) => {
81
+
82
+ if (props.copy && !props.entityId) {
83
+ throw Error("If you want to copy an entity you need to provide an entityId");
84
+ }
85
+
86
+ sideDialogsController.replace(propsToSidePanel(props, navigation, smallLayout));
87
+
88
+ }, [navigation, sideDialogsController, smallLayout]);
89
+
90
+ return {
91
+ close,
92
+ open,
93
+ replace
94
+ };
95
+ };
96
+
97
+ export function buildSidePanelsFromUrl(path: string, collections: EntityCollection[], newFlag: boolean): EntitySidePanelProps<any>[] {
98
+
99
+ const navigationViewsForPath: NavigationViewInternal<any>[] = getNavigationEntriesFromPathInternal({
100
+ path,
101
+ collections
102
+ });
103
+
104
+ const sidePanels: EntitySidePanelProps<any>[] = [];
105
+ let lastCollectionPath = "";
106
+ for (let i = 0; i < navigationViewsForPath.length; i++) {
107
+ const navigationEntry = navigationViewsForPath[i];
108
+
109
+ if (navigationEntry.type === "collection") {
110
+ lastCollectionPath = navigationEntry.path;
111
+ }
112
+
113
+ if (i > 0) { // the first collection is handled by the main navigation
114
+ const previousEntry = navigationViewsForPath[i - 1];
115
+ if (navigationEntry.type === "entity") {
116
+ sidePanels.push({
117
+ path: navigationEntry.path,
118
+ entityId: navigationEntry.entityId,
119
+ copy: false
120
+ }
121
+ );
122
+ } else if (navigationEntry.type === "custom_view") {
123
+ if (previousEntry.type === "entity") {
124
+ const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];
125
+ if (lastSidePanel)
126
+ lastSidePanel.selectedSubPath = navigationEntry.view.key;
127
+ }
128
+ } else if (navigationEntry.type === "collection") {
129
+ if (previousEntry.type === "entity") {
130
+ const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];
131
+ if (lastSidePanel)
132
+ lastSidePanel.selectedSubPath = navigationEntry.collection.id ?? navigationEntry.collection.path;
133
+ }
134
+ }
135
+ }
136
+
137
+ }
138
+
139
+ if (newFlag) {
140
+ sidePanels.push({
141
+ path: lastCollectionPath,
142
+ copy: false
143
+ });
144
+ }
145
+
146
+ return sidePanels;
147
+ }
148
+
149
+ const propsToSidePanel = (props: EntitySidePanelProps<any>, navigation: NavigationController, smallLayout: boolean): SideDialogPanelProps => {
150
+
151
+ const collectionPath = removeInitialAndTrailingSlashes(props.path);
152
+
153
+ const newPath = props.entityId
154
+ ? navigation.buildUrlCollectionPath(`${collectionPath}/${props.entityId}/${props.selectedSubPath || ""}`)
155
+ : navigation.buildUrlCollectionPath(`${collectionPath}#${NEW_URL_HASH}`);
156
+ const resolvedPath = navigation.resolveAliasesFrom(props.path);
157
+
158
+ const resolvedPanelProps: EntitySidePanelProps<any> = {
159
+ ...props,
160
+ path: resolvedPath
161
+ };
162
+
163
+ return ({
164
+ key: `${props.path}/${props.entityId}`,
165
+ component: <EntitySidePanel {...resolvedPanelProps}/>,
166
+ urlPath: newPath,
167
+ parentUrlPath: navigation.buildUrlCollectionPath(collectionPath),
168
+ width: getEntityViewWidth(props, smallLayout),
169
+ onClose: props.onClose
170
+ });
171
+ }
172
+ ;
@@ -0,0 +1,18 @@
1
+ import * as locales from "date-fns/locale";
2
+ // @ts-ignore
3
+ import { registerLocale, setDefaultLocale } from "react-datepicker";
4
+ import { useEffect } from "react";
5
+
6
+ export function useLocaleConfig(locale?: string) {
7
+ useEffect(() => {
8
+ if (!locale) {
9
+ return;
10
+ }
11
+ // @ts-ignore
12
+ const dateFnsLocale = locales[locale];
13
+ if (dateFnsLocale) {
14
+ registerLocale(locale, dateFnsLocale);
15
+ setDefaultLocale(locale);
16
+ }
17
+ }, [locale])
18
+ }