@firecms/core 3.0.0-beta.11 → 3.0.0-beta.12

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 (173) hide show
  1. package/dist/components/ArrayContainer.d.ts +7 -3
  2. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +2 -1
  3. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  4. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +15 -1
  5. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  6. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +4 -0
  7. package/dist/components/PropertyIdCopyTooltip.d.ts +1 -1
  8. package/dist/components/SelectableTable/SelectableTable.d.ts +12 -2
  9. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
  10. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  11. package/dist/components/VirtualTable/VirtualTableProps.d.ts +13 -0
  12. package/dist/components/common/default_entity_actions.d.ts +0 -2
  13. package/dist/components/common/index.d.ts +1 -1
  14. package/dist/components/common/useColumnsIds.d.ts +1 -0
  15. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  16. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  17. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  18. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  19. package/dist/core/EntityEditView.d.ts +29 -21
  20. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  21. package/dist/core/FireCMSRouter.d.ts +4 -0
  22. package/dist/core/NavigationRoutes.d.ts +0 -1
  23. package/dist/core/SideDialogs.d.ts +4 -2
  24. package/dist/core/index.d.ts +2 -1
  25. package/dist/form/EntityForm.d.ts +45 -0
  26. package/dist/form/EntityFormActions.d.ts +17 -0
  27. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  28. package/dist/form/components/FormEntry.d.ts +6 -0
  29. package/dist/form/components/FormLayout.d.ts +5 -0
  30. package/dist/form/components/index.d.ts +2 -0
  31. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  32. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  33. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  34. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  35. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  36. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  37. package/dist/form/index.d.ts +16 -16
  38. package/dist/hooks/data/useEntityFetch.d.ts +2 -1
  39. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  40. package/dist/hooks/useBuildNavigationController.d.ts +4 -1
  41. package/dist/hooks/useModeController.d.ts +1 -2
  42. package/dist/index.es.js +18213 -16819
  43. package/dist/index.es.js.map +1 -1
  44. package/dist/index.umd.js +18164 -16771
  45. package/dist/index.umd.js.map +1 -1
  46. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  47. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  48. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  49. package/dist/routes/FireCMSRoute.d.ts +1 -0
  50. package/dist/routes/HomePageRoute.d.ts +3 -0
  51. package/dist/types/collections.d.ts +30 -10
  52. package/dist/types/datasource.d.ts +2 -2
  53. package/dist/types/dialogs_controller.d.ts +7 -3
  54. package/dist/types/entities.d.ts +1 -1
  55. package/dist/types/entity_actions.d.ts +10 -0
  56. package/dist/types/fields.d.ts +9 -2
  57. package/dist/types/navigation.d.ts +29 -12
  58. package/dist/types/plugins.d.ts +1 -0
  59. package/dist/types/properties.d.ts +18 -3
  60. package/dist/types/side_entity_controller.d.ts +6 -1
  61. package/dist/util/builders.d.ts +1 -1
  62. package/dist/util/entity_actions.d.ts +2 -0
  63. package/dist/util/entity_cache.d.ts +23 -0
  64. package/dist/util/index.d.ts +1 -0
  65. package/dist/util/navigation_from_path.d.ts +6 -1
  66. package/dist/util/navigation_utils.d.ts +12 -1
  67. package/dist/util/resolutions.d.ts +6 -1
  68. package/package.json +19 -21
  69. package/src/components/ArrayContainer.tsx +48 -29
  70. package/src/components/CircularProgressCenter.tsx +1 -1
  71. package/src/components/DeleteEntityDialog.tsx +1 -1
  72. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +40 -19
  73. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +10 -4
  74. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +18 -1
  75. package/src/components/EntityCollectionTable/index.tsx +1 -1
  76. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +3 -3
  77. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +5 -11
  78. package/src/components/EntityCollectionView/EntityCollectionView.tsx +83 -41
  79. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  80. package/src/components/NotFoundPage.tsx +2 -2
  81. package/src/components/PropertyIdCopyTooltip.tsx +2 -3
  82. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +11 -6
  83. package/src/components/SelectableTable/SelectableTable.tsx +18 -3
  84. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +7 -7
  85. package/src/components/UnsavedChangesDialog.tsx +42 -0
  86. package/src/components/VirtualTable/VirtualTable.tsx +19 -2
  87. package/src/components/VirtualTable/VirtualTableProps.tsx +15 -0
  88. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +1 -1
  89. package/src/components/common/default_entity_actions.tsx +26 -37
  90. package/src/components/common/index.ts +1 -1
  91. package/src/components/common/useColumnsIds.tsx +1 -1
  92. package/src/components/common/useDataSourceTableController.tsx +420 -0
  93. package/src/components/common/useDebouncedCallback.tsx +20 -0
  94. package/src/components/common/useScrollRestoration.tsx +68 -0
  95. package/src/contexts/BreacrumbsContext.tsx +38 -0
  96. package/src/contexts/DialogsProvider.tsx +3 -2
  97. package/src/contexts/ModeController.tsx +1 -3
  98. package/src/core/DefaultAppBar.tsx +44 -14
  99. package/src/core/DefaultDrawer.tsx +1 -1
  100. package/src/core/EntityEditView.tsx +278 -1000
  101. package/src/core/EntityEditViewFormActions.tsx +199 -0
  102. package/src/core/EntitySidePanel.tsx +85 -15
  103. package/src/core/FireCMS.tsx +7 -4
  104. package/src/core/FireCMSRouter.tsx +17 -0
  105. package/src/core/NavigationRoutes.tsx +23 -32
  106. package/src/core/SideDialogs.tsx +20 -11
  107. package/src/core/index.tsx +4 -2
  108. package/src/form/EntityForm.tsx +774 -0
  109. package/src/form/EntityFormActions.tsx +169 -0
  110. package/src/form/PropertyFieldBinding.tsx +13 -11
  111. package/src/form/components/FormEntry.tsx +22 -0
  112. package/src/form/components/FormLayout.tsx +16 -0
  113. package/src/form/components/LabelWithIcon.tsx +6 -3
  114. package/src/form/components/StorageUploadProgress.tsx +1 -1
  115. package/src/form/components/index.tsx +2 -0
  116. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +4 -4
  117. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -2
  118. package/src/form/field_bindings/BlockFieldBinding.tsx +4 -2
  119. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -0
  120. package/src/form/field_bindings/MapFieldBinding.tsx +14 -16
  121. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +9 -6
  122. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +1 -1
  123. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -2
  124. package/src/form/field_bindings/ReferenceFieldBinding.tsx +1 -1
  125. package/src/form/field_bindings/RepeatFieldBinding.tsx +5 -2
  126. package/src/form/field_bindings/SelectFieldBinding.tsx +1 -1
  127. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +6 -4
  128. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -0
  129. package/src/form/field_bindings/TextFieldBinding.tsx +1 -0
  130. package/src/form/index.tsx +16 -32
  131. package/src/form/validation.ts +12 -6
  132. package/src/hooks/data/save.ts +1 -1
  133. package/src/hooks/data/useCollectionFetch.tsx +1 -1
  134. package/src/hooks/data/useEntityFetch.tsx +5 -1
  135. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  136. package/src/hooks/useBuildModeController.tsx +15 -28
  137. package/src/hooks/useBuildNavigationController.tsx +70 -24
  138. package/src/hooks/useLargeLayout.tsx +0 -35
  139. package/src/hooks/useModeController.tsx +1 -2
  140. package/src/hooks/useResolvedNavigationFrom.tsx +4 -6
  141. package/src/internal/useBuildSideDialogsController.tsx +3 -2
  142. package/src/internal/useBuildSideEntityController.tsx +124 -83
  143. package/src/internal/useUnsavedChangesDialog.tsx +126 -92
  144. package/src/preview/PropertyPreview.tsx +8 -8
  145. package/src/preview/components/UrlComponentPreview.tsx +17 -18
  146. package/src/preview/property_previews/MapPropertyPreview.tsx +3 -2
  147. package/src/routes/CustomCMSRoute.tsx +21 -0
  148. package/src/routes/FireCMSRoute.tsx +235 -0
  149. package/src/routes/HomePageRoute.tsx +17 -0
  150. package/src/types/collections.ts +38 -13
  151. package/src/types/datasource.ts +2 -1
  152. package/src/types/dialogs_controller.tsx +7 -3
  153. package/src/types/entities.ts +1 -1
  154. package/src/types/entity_actions.tsx +12 -0
  155. package/src/types/fields.tsx +13 -2
  156. package/src/types/navigation.ts +36 -16
  157. package/src/types/plugins.tsx +1 -0
  158. package/src/types/properties.ts +21 -3
  159. package/src/types/side_dialogs_controller.tsx +2 -0
  160. package/src/types/side_entity_controller.tsx +6 -1
  161. package/src/util/builders.ts +5 -3
  162. package/src/util/entity_actions.ts +28 -0
  163. package/src/util/entity_cache.ts +204 -0
  164. package/src/util/index.ts +1 -0
  165. package/src/util/join_collections.ts +3 -0
  166. package/src/util/navigation_from_path.ts +13 -6
  167. package/src/util/navigation_utils.ts +53 -1
  168. package/src/util/objects.ts +4 -1
  169. package/src/util/parent_references_from_path.ts +3 -3
  170. package/src/util/resolutions.ts +26 -5
  171. package/src/util/useStorageUploadController.tsx +39 -21
  172. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  173. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,236 +0,0 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from "react";
2
-
3
- import { useDataSource, useFireCMSContext, useNavigationController } from "../../hooks";
4
- import { useDataOrder } from "../../hooks/data/useDataOrder";
5
- import {
6
- Entity,
7
- EntityCollection,
8
- EntityTableController,
9
- FilterValues,
10
- FireCMSContext,
11
- SelectedCellProps,
12
- User
13
- } from "../../types";
14
- import { useDebouncedData } from "./useDebouncedData";
15
- import equal from "react-fast-compare"
16
-
17
- const DEFAULT_PAGE_SIZE = 50;
18
-
19
- export type DataSourceEntityCollectionTableControllerProps<M extends Record<string, any> = any> = {
20
- /**
21
- * Full path where the data of this table is located
22
- */
23
- fullPath: string;
24
- /**
25
- * The collection that is represented by this config.
26
- */
27
- collection: EntityCollection<M>;
28
- /**
29
- * List of entities that will be displayed on top, no matter the ordering.
30
- * This is used for reference fields selection
31
- */
32
- entitiesDisplayedFirst?: Entity<M>[];
33
-
34
- lastDeleteTimestamp?: number;
35
-
36
- /**
37
- * Force filter to be applied to the table.
38
- */
39
- forceFilter?: FilterValues<string>;
40
- }
41
-
42
- /**
43
- * Use this hook to build a controller for the {@link EntityCollectionTable}.
44
- * This controller is bound to data in a path in your specified datasource.
45
- *
46
- * Note that you can build your own hook returning a {@link EntityTableController}
47
- * if you would like to display different data.
48
- *
49
- * @param fullPath
50
- * @param collection
51
- * @param entitiesDisplayedFirst
52
- * @param lastDeleteTimestamp
53
- * @param forceFilterFromProps
54
- */
55
- export function useDataSourceEntityCollectionTableController<M extends Record<string, any> = any, USER extends User = User>(
56
- {
57
- fullPath,
58
- collection,
59
- entitiesDisplayedFirst,
60
- lastDeleteTimestamp,
61
- forceFilter: forceFilterFromProps,
62
- }: DataSourceEntityCollectionTableControllerProps<M>)
63
- : EntityTableController<M> {
64
-
65
- const {
66
- initialFilter,
67
- initialSort,
68
- forceFilter: forceFilterFromCollection
69
- } = collection;
70
-
71
- const [popupCell, setPopupCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);
72
- const navigation = useNavigationController();
73
- const dataSource = useDataSource(collection);
74
- const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);
75
-
76
- const forceFilter = forceFilterFromProps ?? forceFilterFromCollection;
77
- const paginationEnabled = collection.pagination === undefined || Boolean(collection.pagination);
78
- const pageSize = typeof collection.pagination === "number" ? collection.pagination : DEFAULT_PAGE_SIZE;
79
-
80
- const [searchString, setSearchString] = React.useState<string | undefined>();
81
- const [itemCount, setItemCount] = React.useState<number | undefined>(paginationEnabled ? pageSize : undefined);
82
-
83
- const checkFilterCombination = useCallback((filterValues: FilterValues<any>,
84
- sortBy?: [string, "asc" | "desc"]) => {
85
- if (!dataSource.isFilterCombinationValid)
86
- return true;
87
- return dataSource.isFilterCombinationValid({
88
- path: resolvedPath,
89
- collection,
90
- filterValues,
91
- sortBy
92
- })
93
- }, []);
94
-
95
- const initialSortInternal = useMemo(() => {
96
- if (initialSort && forceFilter && !checkFilterCombination(forceFilter, initialSort)) {
97
- console.warn("Initial sort is not compatible with the force filter. Ignoring initial sort");
98
- return undefined;
99
- }
100
- return initialSort;
101
- }, [initialSort, forceFilter]);
102
-
103
- useEffect(() => {
104
- if (!equal(forceFilter, filterValues)) {
105
- setFilterValues(forceFilter)
106
- }
107
- }, [forceFilter]);
108
-
109
- const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string>> | undefined>(forceFilter ?? initialFilter ?? undefined);
110
- const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string>, "asc" | "desc"] | undefined>(initialSortInternal);
111
-
112
- const sortByProperty = sortBy ? sortBy[0] : undefined;
113
- const currentSort = sortBy ? sortBy[1] : undefined;
114
-
115
- const context: FireCMSContext<USER> = useFireCMSContext();
116
-
117
- const [rawData, setRawData] = useState<Entity<M>[]>([]);
118
-
119
- const [dataLoading, setDataLoading] = useState<boolean>(false);
120
- const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();
121
- const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);
122
-
123
- const clearFilter = useCallback(() => setFilterValues(forceFilter ?? undefined), [forceFilter]);
124
-
125
- const updateFilterValues = useCallback((updatedFilter: FilterValues<Extract<keyof M, string>> | undefined) => {
126
- if (forceFilter) {
127
- console.warn("Filter is not compatible with the force filter. Ignoring filter");
128
- return;
129
- }
130
- if (updatedFilter && Object.keys(updatedFilter).length === 0) {
131
- setFilterValues(undefined);
132
- } else {
133
- setFilterValues(updatedFilter);
134
- }
135
- }, [forceFilter]);
136
-
137
- useEffect(() => {
138
-
139
- setDataLoading(true);
140
-
141
- const onEntitiesUpdate = async (entities: Entity<M>[]) => {
142
- if (collection.callbacks?.onFetch) {
143
- try {
144
- entities = await Promise.all(
145
- entities.map((entity) =>
146
- collection.callbacks!.onFetch!({
147
- collection,
148
- path: resolvedPath,
149
- entity,
150
- context
151
- })));
152
- } catch (e: any) {
153
- console.error(e);
154
- }
155
- }
156
- setDataLoading(false);
157
- setDataLoadingError(undefined);
158
- setRawData(entities.map(e => ({
159
- ...e,
160
- // values: sanitizeData(e.values, resolvedCollection.properties)
161
- })));
162
- setNoMoreToLoad(!itemCount || entities.length < itemCount);
163
- };
164
-
165
- const onError = (error: Error) => {
166
- console.error("ERROR", error);
167
- setDataLoading(false);
168
- setRawData([]);
169
- setDataLoadingError(error);
170
- };
171
-
172
- if (dataSource.listenCollection) {
173
- return dataSource.listenCollection<M>({
174
- path: resolvedPath,
175
- collection,
176
- onUpdate: onEntitiesUpdate,
177
- onError,
178
- searchString,
179
- filter: filterValues,
180
- limit: itemCount,
181
- startAfter: undefined,
182
- orderBy: sortByProperty,
183
- order: currentSort
184
- });
185
- } else {
186
- dataSource.fetchCollection<M>({
187
- path: resolvedPath,
188
- collection,
189
- searchString,
190
- filter: filterValues,
191
- limit: itemCount,
192
- startAfter: undefined,
193
- orderBy: sortByProperty,
194
- order: currentSort
195
- })
196
- .then(onEntitiesUpdate)
197
- .catch(onError);
198
- return () => {
199
- };
200
- }
201
- }, [resolvedPath, itemCount, currentSort, sortByProperty, filterValues, searchString]);
202
-
203
- const orderedData = useDataOrder({
204
- data: rawData,
205
- entitiesDisplayedFirst
206
- });
207
-
208
- // hack to fix Firestore listeners firing with incomplete data
209
- const data = useDebouncedData(orderedData, {
210
- filterValues,
211
- sortBy,
212
- searchString,
213
- lastDeleteTimestamp
214
- });
215
-
216
- return {
217
- data,
218
- dataLoading,
219
- noMoreToLoad,
220
- dataLoadingError,
221
- filterValues,
222
- setFilterValues: updateFilterValues,
223
- sortBy,
224
- setSortBy,
225
- searchString,
226
- setSearchString,
227
- clearFilter,
228
- itemCount,
229
- setItemCount,
230
- paginationEnabled,
231
- pageSize,
232
- checkFilterCombination,
233
- popupCell,
234
- setPopupCell
235
- }
236
- }
File without changes