@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,60 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+
3
+ import { ModeController } from "./index";
4
+
5
+ /**
6
+ * Use this hook to build a color mode controller that determines
7
+ * the theme of the CMS
8
+ */
9
+ export function useBuildModeController(): ModeController {
10
+
11
+ const prefersDarkModeQuery = typeof window !== "undefined" &&
12
+ window.matchMedia("(prefers-color-scheme: dark)");
13
+ const prefersDarkModeStorage: boolean | null = localStorage.getItem("prefers-dark-mode") != null ? localStorage.getItem("prefers-dark-mode") === "true" : null;
14
+ const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery;
15
+ const [mode, setMode] = useState<"light" | "dark">(prefersDarkMode ? "dark" : "light");
16
+
17
+ useEffect(() => {
18
+ setMode(prefersDarkMode ? "dark" : "light");
19
+ setDocumentMode(prefersDarkMode ? "dark" : "light");
20
+ }, [prefersDarkMode]);
21
+
22
+ // color-scheme: dark;
23
+ const setDarkMode = useCallback(() => {
24
+ setMode("dark");
25
+ setDocumentMode("dark");
26
+ }, [prefersDarkModeQuery]);
27
+
28
+ const setLightMode = useCallback(() => {
29
+ setMode("light");
30
+ setDocumentMode("light");
31
+ }, []);
32
+
33
+ const setDocumentMode = (mode: "light" | "dark") => {
34
+ document.body.style.setProperty("color-scheme", mode);
35
+ document.documentElement.dataset.theme = mode;
36
+ };
37
+
38
+ const toggleMode = useCallback(() => {
39
+
40
+ if (mode === "light") {
41
+ if (!prefersDarkModeQuery)
42
+ localStorage.setItem("prefers-dark-mode", "true");
43
+ else
44
+ localStorage.removeItem("prefers-dark-mode");
45
+ setDarkMode();
46
+ } else {
47
+ if (prefersDarkModeQuery)
48
+ localStorage.setItem("prefers-dark-mode", "false");
49
+ else
50
+ localStorage.removeItem("prefers-dark-mode");
51
+ setLightMode();
52
+ }
53
+ }, [mode, prefersDarkModeQuery]);
54
+
55
+ return {
56
+ mode,
57
+ setMode,
58
+ toggleMode
59
+ };
60
+ }
@@ -0,0 +1,433 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import equal from "react-fast-compare"
3
+
4
+ import {
5
+ AuthController,
6
+ CMSView,
7
+ CMSViewsBuilder,
8
+ DataSourceDelegate,
9
+ EntityCollection,
10
+ EntityCollectionsBuilder,
11
+ EntityReference,
12
+ NavigationController,
13
+ PermissionsBuilder,
14
+ TopNavigationEntry,
15
+ TopNavigationResult,
16
+ User,
17
+ UserConfigurationPersistence
18
+ } from "../types";
19
+ import {
20
+ applyPermissionsFunctionIfEmpty,
21
+ getCollectionByPathOrId,
22
+ mergeDeep,
23
+ removeInitialAndTrailingSlashes,
24
+ resolveCollectionPathIds,
25
+ resolvePermissions
26
+ } from "../util";
27
+ import { getParentReferencesFromPath } from "../util/parent_references_from_path";
28
+
29
+ const DEFAULT_BASE_PATH = "/";
30
+ const DEFAULT_COLLECTION_PATH = "/c";
31
+
32
+ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {
33
+ basePath?: string,
34
+ baseCollectionPath?: string,
35
+ authController: AuthController<UserType>;
36
+ collections?: EC[] | EntityCollectionsBuilder<EC>;
37
+ collectionPermissions?: PermissionsBuilder;
38
+ views?: CMSView[] | CMSViewsBuilder;
39
+ adminViews?: CMSView[] | CMSViewsBuilder;
40
+ viewsOrder?: string[];
41
+ userConfigPersistence?: UserConfigurationPersistence;
42
+ dataSourceDelegate: DataSourceDelegate;
43
+ /**
44
+ * Use this method to inject collections to the CMS.
45
+ * You receive the current collections as a parameter, and you can return
46
+ * a new list of collections.
47
+ * @see {@link joinCollectionLists}
48
+ * @param collections
49
+ */
50
+ injectCollections?: (collections: EntityCollection[]) => EntityCollection[];
51
+ };
52
+
53
+ export function useBuildNavigationController<EC extends EntityCollection, UserType extends User>(props: BuildNavigationContextProps<EC, UserType>): NavigationController {
54
+ const {
55
+ basePath = DEFAULT_BASE_PATH,
56
+ baseCollectionPath = DEFAULT_COLLECTION_PATH,
57
+ authController,
58
+ collections: collectionsProp,
59
+ collectionPermissions,
60
+ views: viewsProp,
61
+ adminViews: adminViewsProp,
62
+ viewsOrder,
63
+ userConfigPersistence,
64
+ dataSourceDelegate,
65
+ injectCollections
66
+ } = props;
67
+
68
+ const collectionsRef = useRef<EntityCollection[] | null>();
69
+ const [collections, setCollections] = useState<EntityCollection[] | undefined>();
70
+ const [views, setViews] = useState<CMSView[] | undefined>();
71
+ const [adminViews, setAdminViews] = useState<CMSView[] | undefined>();
72
+ const [initialised, setInitialised] = useState<boolean>(false);
73
+
74
+ const [topLevelNavigation, setTopLevelNavigation] = useState<TopNavigationResult | undefined>(undefined);
75
+ const [navigationLoading, setNavigationLoading] = useState<boolean>(true);
76
+ const [navigationLoadingError, setNavigationLoadingError] = useState<Error | undefined>(undefined);
77
+
78
+ const cleanBasePath = removeInitialAndTrailingSlashes(basePath);
79
+ const cleanBaseCollectionPath = removeInitialAndTrailingSlashes(baseCollectionPath);
80
+
81
+ const homeUrl = cleanBasePath ? `/${cleanBasePath}` : "/";
82
+
83
+ const fullCollectionPath = cleanBasePath ? `/${cleanBasePath}/${cleanBaseCollectionPath}` : `/${cleanBaseCollectionPath}`;
84
+
85
+ const buildCMSUrlPath = useCallback((path: string): string => cleanBasePath ? `/${cleanBasePath}/${encodePath(path)}` : `/${encodePath(path)}`,
86
+ [cleanBasePath]);
87
+
88
+ const buildUrlCollectionPath = useCallback((path: string): string => `${removeInitialAndTrailingSlashes(baseCollectionPath)}/${encodePath(path)}`,
89
+ [baseCollectionPath]);
90
+
91
+ const computeTopNavigation = useCallback((collections: EntityCollection[], views: CMSView[], adminViews: CMSView[], viewsOrder?: string[]): TopNavigationResult => {
92
+ let navigationEntries: TopNavigationEntry[] = [
93
+ ...(collections ?? []).map(collection => (!collection.hideFromNavigation
94
+ ? ({
95
+ url: buildUrlCollectionPath(collection.id ?? collection.path),
96
+ type: "collection",
97
+ name: collection.name.trim(),
98
+ path: collection.id ?? collection.path,
99
+ collection,
100
+ description: collection.description?.trim(),
101
+ group: collection.group?.trim() ?? "Views"
102
+ } satisfies TopNavigationEntry)
103
+ : undefined))
104
+ .filter(Boolean) as TopNavigationEntry[],
105
+ ...(views ?? []).map(view =>
106
+ !view.hideFromNavigation
107
+ ? ({
108
+ url: buildCMSUrlPath(Array.isArray(view.path) ? view.path[0] : view.path),
109
+ name: view.name.trim(),
110
+ type: "view",
111
+ path: view.path,
112
+ view,
113
+ description: view.description?.trim(),
114
+ group: view.group?.trim() ?? "Views"
115
+ }satisfies TopNavigationEntry)
116
+ : undefined)
117
+ .filter(Boolean) as TopNavigationEntry[],
118
+ ...(adminViews ?? []).map(view =>
119
+ !view.hideFromNavigation
120
+ ? ({
121
+ url: buildCMSUrlPath(Array.isArray(view.path) ? view.path[0] : view.path),
122
+ name: view.name.trim(),
123
+ type: "admin",
124
+ path: view.path,
125
+ view,
126
+ description: view.description?.trim(),
127
+ group: "Admin"
128
+ } satisfies TopNavigationEntry)
129
+ : undefined)
130
+ .filter(Boolean) as TopNavigationEntry[]
131
+ ];
132
+
133
+ if (viewsOrder) {
134
+ navigationEntries = navigationEntries.sort((a, b) => {
135
+ const aIndex = viewsOrder.indexOf(a.path);
136
+ const bIndex = viewsOrder.indexOf(b.path);
137
+ if (aIndex === -1 && bIndex === -1) {
138
+ return 0;
139
+ }
140
+ if (aIndex === -1) {
141
+ return 1;
142
+ }
143
+ if (bIndex === -1) {
144
+ return -1;
145
+ }
146
+ return aIndex - bIndex;
147
+ });
148
+ }
149
+
150
+ const groups: string[] = Object.values(navigationEntries)
151
+ .map(e => e.group)
152
+ .filter(Boolean)
153
+ .filter((value, index, array) => array.indexOf(value) === index) as string[];
154
+
155
+ return {
156
+ navigationEntries,
157
+ groups
158
+ };
159
+ }, [buildCMSUrlPath, buildUrlCollectionPath]);
160
+
161
+ const refreshNavigation = useCallback(async () => {
162
+
163
+ if (authController.initialLoading)
164
+ return;
165
+
166
+ try {
167
+ const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
168
+ resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),
169
+ resolveCMSViews(viewsProp, authController, dataSourceDelegate),
170
+ resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)
171
+ ]
172
+ );
173
+ if (
174
+ !equal(collectionsRef.current, resolvedCollections) ||
175
+ !equal(views, resolvedViews) ||
176
+ !equal(adminViews, resolvedAdminViews) ||
177
+ !equal(topLevelNavigation, computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder))
178
+ ) {
179
+ collectionsRef.current = resolvedCollections;
180
+ setCollections(resolvedCollections);
181
+ setViews(resolvedViews);
182
+ setAdminViews(resolvedAdminViews);
183
+ setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews, resolvedAdminViews, viewsOrder));
184
+ }
185
+ } catch (e) {
186
+ console.error(e);
187
+ setNavigationLoadingError(e as any);
188
+ }
189
+
190
+ setNavigationLoading(false);
191
+ setInitialised(true);
192
+ }, [collectionsProp, collectionPermissions, authController.user, authController.initialLoading, viewsProp, adminViewsProp, computeTopNavigation, injectCollections]);
193
+
194
+ useEffect(() => {
195
+ refreshNavigation();
196
+ }, [refreshNavigation]);
197
+
198
+ const getCollection = useCallback(<EC extends EntityCollection>(
199
+ idOrPath: string,
200
+ entityId?: string,
201
+ includeUserOverride = false
202
+ ): EC | undefined => {
203
+
204
+ if (!collections)
205
+ return undefined;
206
+
207
+ const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
208
+
209
+ const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
210
+
211
+ const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
212
+
213
+ let result: Partial<EntityCollection> | undefined = overriddenCollection;
214
+
215
+ if (overriddenCollection) {
216
+ const subcollections = overriddenCollection.subcollections;
217
+ const callbacks = overriddenCollection.callbacks;
218
+ const permissions = overriddenCollection.permissions;
219
+ result = {
220
+ ...result,
221
+ subcollections: result?.subcollections ?? subcollections,
222
+ callbacks: result?.callbacks ?? callbacks,
223
+ permissions: result?.permissions ?? permissions
224
+ };
225
+ }
226
+
227
+ if (!result) return undefined;
228
+
229
+ return { ...overriddenCollection, ...result } as EC;
230
+
231
+ }, [
232
+ basePath,
233
+ baseCollectionPath,
234
+ collections
235
+ ]);
236
+
237
+ const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
238
+ let currentCollections = collections;
239
+ if (!currentCollections)
240
+ throw Error("Collections have not been initialised yet");
241
+
242
+ for (let i = 0; i < pathSegments.length; i++) {
243
+ const pathSegment = pathSegments[i];
244
+ const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === pathSegment || c.path === pathSegment);
245
+ if (!collection)
246
+ return undefined;
247
+ currentCollections = collection.subcollections;
248
+ if (i === pathSegments.length - 1)
249
+ return collection as EC;
250
+ }
251
+
252
+ return undefined;
253
+
254
+ }, [collections]);
255
+
256
+ const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
257
+ let currentCollections = collections;
258
+ if (!currentCollections)
259
+ throw Error("Collections have not been initialised yet");
260
+
261
+ for (let i = 0; i < ids.length; i++) {
262
+ const id = ids[i];
263
+ const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);
264
+ if (!collection)
265
+ return undefined;
266
+ currentCollections = collection.subcollections;
267
+ if (i === ids.length - 1)
268
+ return collection as EC;
269
+ }
270
+
271
+ return undefined;
272
+
273
+ }, [collections]);
274
+
275
+ const isUrlCollectionPath = useCallback(
276
+ (path: string): boolean => removeInitialAndTrailingSlashes(path + "/").startsWith(removeInitialAndTrailingSlashes(fullCollectionPath) + "/"),
277
+ [fullCollectionPath]);
278
+
279
+ const urlPathToDataPath = useCallback((path: string): string => {
280
+ if (path.startsWith(fullCollectionPath))
281
+ return path.replace(fullCollectionPath, "");
282
+ throw Error("Expected path starting with " + fullCollectionPath);
283
+ }, [fullCollectionPath]);
284
+
285
+ const buildUrlEditCollectionPath = useCallback(({
286
+ path
287
+ }: {
288
+ path: string
289
+ }): string => {
290
+ return `s/edit/${encodePath(path)}`;
291
+ },
292
+ []);
293
+
294
+ const resolveAliasesFrom = useCallback((path: string): string => {
295
+ if (!collections)
296
+ throw Error("Collections have not been initialised yet");
297
+ return resolveCollectionPathIds(path, collections);
298
+ }, [collections]);
299
+
300
+ const getAllParentReferencesForPath = useCallback((path: string): EntityReference[] => {
301
+ return getParentReferencesFromPath({
302
+ path,
303
+ collections
304
+ });
305
+ }, [collections]);
306
+
307
+ const getParentCollectionIds = useCallback((path: string): string[] => {
308
+
309
+ const strings = path.split("/");
310
+ const oddPathSegments = strings.filter((_, i) => i % 2 === 0);
311
+ oddPathSegments.pop();
312
+
313
+ const result: string[][] = [];
314
+
315
+ for (let i = 1; i <= oddPathSegments.length; i++) {
316
+ result.push(oddPathSegments.slice(0, i));
317
+ }
318
+
319
+ // for each odd path segment, get the collection
320
+ return result.map(r => getCollectionFromPaths(r)?.id).filter(Boolean) as string[];
321
+ }, [getAllParentReferencesForPath])
322
+
323
+ const convertIdsToPaths = useCallback((ids: string[]): string[] => {
324
+ let currentCollections = collections;
325
+ const paths: string[] = [];
326
+ for (let i = 0; i < ids.length; i++) {
327
+ const id = ids[i];
328
+ const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);
329
+ if (!collection)
330
+ throw Error(`Collection with id ${id} not found`);
331
+ paths.push(collection.path);
332
+ currentCollections = collection.subcollections;
333
+ }
334
+ return paths;
335
+ }
336
+ , [getCollectionFromIds]);
337
+
338
+ return {
339
+ collections,
340
+ views,
341
+ adminViews,
342
+ loading: !initialised || navigationLoading,
343
+ navigationLoadingError,
344
+ homeUrl,
345
+ basePath,
346
+ baseCollectionPath,
347
+ initialised,
348
+ getCollection,
349
+ getCollectionFromPaths,
350
+ getCollectionFromIds,
351
+ isUrlCollectionPath,
352
+ urlPathToDataPath,
353
+ buildUrlCollectionPath,
354
+ buildUrlEditCollectionPath,
355
+ buildCMSUrlPath,
356
+ resolveAliasesFrom,
357
+ topLevelNavigation,
358
+ refreshNavigation,
359
+ getParentReferencesFromPath: getAllParentReferencesForPath,
360
+ getParentCollectionIds,
361
+ convertIdsToPaths
362
+ };
363
+ }
364
+
365
+ export function getSidePanelKey(path: string, entityId?: string) {
366
+ if (entityId)
367
+ return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;
368
+ else
369
+ return removeInitialAndTrailingSlashes(path);
370
+ }
371
+
372
+ function encodePath(input: string) {
373
+ return encodeURIComponent(removeInitialAndTrailingSlashes(input))
374
+ .replaceAll("%2F", "/")
375
+ .replaceAll("%23", "#");
376
+ }
377
+
378
+ function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
379
+ return resolvedCollections
380
+ .filter((c) => {
381
+ if (!c.permissions) return true;
382
+ const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
383
+ return resolvedPermissions?.read !== false;
384
+ })
385
+ .map((c) => {
386
+ if (!c.subcollections) return c;
387
+ return {
388
+ ...c,
389
+ subcollections: filterOutNotAllowedCollections(c.subcollections, authController)
390
+ }
391
+ });
392
+ }
393
+
394
+ async function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>,
395
+ collectionPermissions: PermissionsBuilder | undefined,
396
+ authController: AuthController,
397
+ dataSource: DataSourceDelegate,
398
+ injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {
399
+ let resolvedCollections: EntityCollection[] = [];
400
+ if (typeof collections === "function") {
401
+ resolvedCollections = await collections({
402
+ user: authController.user,
403
+ authController,
404
+ dataSource
405
+ });
406
+ } else if (Array.isArray(collections)) {
407
+ resolvedCollections = collections;
408
+ }
409
+
410
+ resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
411
+
412
+ resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
413
+
414
+ if (injectCollections) {
415
+ resolvedCollections = injectCollections(resolvedCollections ?? []);
416
+ }
417
+
418
+ return resolvedCollections;
419
+ }
420
+
421
+ async function resolveCMSViews(baseViews: CMSView[] | CMSViewsBuilder | undefined, authController: AuthController, dataSource: DataSourceDelegate) {
422
+ let resolvedViews: CMSView[] = [];
423
+ if (typeof baseViews === "function") {
424
+ resolvedViews = await baseViews({
425
+ user: authController.user,
426
+ authController,
427
+ dataSource
428
+ });
429
+ } else if (Array.isArray(baseViews)) {
430
+ resolvedViews = baseViews;
431
+ }
432
+ return resolvedViews;
433
+ }
@@ -0,0 +1,158 @@
1
+ // FORKED FROM https://github.com/fayeed/use-clipboard
2
+
3
+ import { MutableRefObject, useCallback, useEffect, useRef, useState } from "react";
4
+
5
+ export interface UseClipboardProps {
6
+ /**
7
+ * It's callback function that is called after the `copy` command
8
+ * is executed.
9
+ *
10
+ * @param text: The selected clipboard text.
11
+ */
12
+ onSuccess?: (text: string) => void;
13
+
14
+ /**
15
+ * Triggers when the hook encounters an error.
16
+ * If passed hook won't throw an error.
17
+ *
18
+ * @param error: cause of the error
19
+ */
20
+ onError?: (error: string) => void;
21
+
22
+ /**
23
+ * Disables the new clipboard API `navigator.clipboard` even if
24
+ * it is supported.
25
+ */
26
+ disableClipboardAPI?: boolean;
27
+
28
+ /**
29
+ * revert back the isCopied flag to false again if a value is set.
30
+ */
31
+ copiedDuration?: number;
32
+ }
33
+
34
+ export interface useClipboardReturnType {
35
+ /**
36
+ * Use ref to pull the text content from.
37
+ */
38
+ ref: MutableRefObject<any>;
39
+
40
+ /**
41
+ * Use it to perform the copy operation
42
+ */
43
+ copy: (text?: string) => void;
44
+
45
+ /**
46
+ * Use it to perform the cut operation
47
+ */
48
+ cut: () => void;
49
+
50
+ /**
51
+ * Indicates wheater the content was successfully copied or not.
52
+ */
53
+ isCoppied: boolean;
54
+
55
+ /**
56
+ * Current selected clipboard content.
57
+ */
58
+ clipboard: string;
59
+
60
+ /**
61
+ * Clears the user clipboard.
62
+ */
63
+ clearClipboard: () => void;
64
+
65
+ /**
66
+ * Check to see if the browser supports the new `navigator.clipboard` API.
67
+ */
68
+ isSupported: () => boolean;
69
+ }
70
+
71
+ export const useClipboard = (
72
+ options?: UseClipboardProps
73
+ ): useClipboardReturnType => {
74
+ const { onSuccess, onError, disableClipboardAPI = false, copiedDuration } =
75
+ options || {};
76
+ const ref = useRef<any>(null);
77
+ const [isCoppied, setIsCoppied] = useState(false);
78
+ const [clipboard, setClipbaord] = useState("");
79
+
80
+ useEffect(() => {
81
+ if (copiedDuration) setTimeout(() => setIsCoppied(false), copiedDuration);
82
+ }, [isCoppied]);
83
+
84
+ const isSupported = () => navigator.clipboard !== undefined;
85
+
86
+ const handleError = useCallback((error: string) => {
87
+ if (onError) onError(error);
88
+ else throw new Error(error);
89
+ }, [onError]);
90
+
91
+ const handleSuccess = useCallback((text: string) => {
92
+ if (onSuccess) onSuccess(text);
93
+ setIsCoppied(true);
94
+ setClipbaord(text);
95
+ }, [onSuccess]);
96
+
97
+ const copyToClipboard = useCallback((text: string) => {
98
+ navigator.clipboard
99
+ .writeText(text)
100
+ .then(() => handleSuccess(text))
101
+ .catch((err) => {
102
+ handleError(err);
103
+ setIsCoppied(false);
104
+ });
105
+ }, [handleError, handleSuccess]);
106
+
107
+ const clearClipboard = () => {
108
+ if (isSupported()) {
109
+ navigator.clipboard.writeText("");
110
+ }
111
+ };
112
+
113
+ const copy = (text?: string) =>
114
+ action("copy", typeof text === "object" ? undefined : text);
115
+
116
+ const cut = () => action("cut");
117
+
118
+ const action = useCallback(
119
+ (operation = "copy", text?: string) => {
120
+ const element = ref.current as HTMLElement;
121
+
122
+ const isInput =
123
+ element &&
124
+ (element.tagName === "INPUT" || element.tagName === "TEXTAREA");
125
+
126
+ const input = ref.current as HTMLInputElement;
127
+
128
+ if (isSupported() && !disableClipboardAPI) {
129
+ if (text) {
130
+ copyToClipboard(text);
131
+ } else if (element) {
132
+ if (isInput) {
133
+ copyToClipboard(input.value);
134
+
135
+ if (operation === "cut") {
136
+ input.value = "";
137
+ }
138
+ } else {
139
+ copyToClipboard(element.innerText);
140
+ }
141
+ } else {
142
+ handleError("Both the ref & text were undefined");
143
+ }
144
+ }
145
+ },
146
+ [disableClipboardAPI, copyToClipboard, handleError]
147
+ );
148
+
149
+ return {
150
+ ref,
151
+ isCoppied,
152
+ clipboard,
153
+ clearClipboard,
154
+ isSupported,
155
+ copy,
156
+ cut
157
+ };
158
+ };
@@ -0,0 +1,14 @@
1
+ import { useContext } from "react";
2
+ import { CustomizationController } from "../types/customization_controller";
3
+ import { CustomizationControllerContext } from "../contexts/CustomizationControllerContext";
4
+
5
+ /**
6
+ * Use this hook to retrieve the customization controller.
7
+ * This hook includes all the customization options that can be used
8
+ * to customize the CMS.
9
+ *
10
+ * You will likely not need to use this hook directly.
11
+ *
12
+ * @group Hooks and utilities
13
+ */
14
+ export const useCustomizationController = (): CustomizationController => useContext(CustomizationControllerContext);
@@ -0,0 +1,14 @@
1
+ import { useContext } from "react";
2
+ import { DialogsController } from "../types/dialogs_controller";
3
+ import { DialogsControllerContext } from "../contexts/DialogsProvider";
4
+
5
+ /**
6
+ * Use this hook to open a dialog imperatively.
7
+ * Alternatively, you can use dialogs declaratively using the `Dialog` component.
8
+ *
9
+ * Consider that in order to use this hook you need to have a parent
10
+ * `FireCMS`
11
+ *
12
+ * @group Hooks and utilities
13
+ */
14
+ export const useDialogsController = (): DialogsController => useContext(DialogsControllerContext);