@firecms/core 3.1.0-canary.1df3b2c → 3.1.0-canary.501d471
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.
- package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
- package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
- package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +5 -10
- package/dist/components/ErrorBoundary.d.ts +4 -2
- package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
- package/dist/components/LanguageToggle.d.ts +1 -0
- package/dist/components/UnsavedChangesDialog.d.ts +1 -0
- package/dist/components/VirtualTable/VirtualTableHeader.d.ts +2 -1
- package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +6 -1
- package/dist/components/VirtualTable/types.d.ts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/core/DrawerNavigationGroup.d.ts +2 -2
- package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
- package/dist/editor/components/editor-bubble-item.d.ts +8 -0
- package/dist/editor/components/editor-bubble.d.ts +8 -0
- package/dist/editor/components/image-bubble.d.ts +5 -0
- package/dist/editor/components/index.d.ts +16 -0
- package/dist/editor/components/table-bubble.d.ts +5 -0
- package/dist/editor/editor.d.ts +30 -0
- package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
- package/dist/editor/extensions/Image/index.d.ts +6 -0
- package/dist/editor/extensions/Image.d.ts +6 -0
- package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
- package/dist/editor/extensions/clipboard.d.ts +7 -0
- package/dist/editor/extensions/custom-keymap.d.ts +1 -0
- package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
- package/dist/editor/hooks/useProseMirror.d.ts +13 -0
- package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
- package/dist/editor/index.d.ts +2 -0
- package/dist/editor/markdown.d.ts +5 -0
- package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
- package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
- package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
- package/dist/editor/nodeViews/index.d.ts +6 -0
- package/dist/editor/plugins/index.d.ts +2 -0
- package/dist/editor/plugins/inputrules.d.ts +6 -0
- package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
- package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
- package/dist/editor/schema.d.ts +2 -0
- package/dist/editor/selectors/ai-selector.d.ts +0 -0
- package/dist/editor/selectors/color-selector.d.ts +10 -0
- package/dist/editor/selectors/link-selector.d.ts +8 -0
- package/dist/editor/selectors/node-selector.d.ts +15 -0
- package/dist/editor/selectors/text-buttons.d.ts +1 -0
- package/dist/editor/types.d.ts +5 -0
- package/dist/editor/useProseMirror.d.ts +16 -0
- package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
- package/dist/editor/utils/remove_classes.d.ts +1 -0
- package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useBuildNavigationController.d.ts +0 -1
- package/dist/hooks/useCollapsedGroups.d.ts +3 -3
- package/dist/hooks/useTranslation.d.ts +17 -0
- package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.es.js +29682 -18363
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +29681 -18382
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useRestoreScroll.d.ts +1 -1
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/en.d.ts +10 -0
- package/dist/locales/es.d.ts +10 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/hi.d.ts +2 -0
- package/dist/locales/it.d.ts +2 -0
- package/dist/locales/pt.d.ts +7 -0
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/collections.d.ts +46 -0
- package/dist/types/customization_controller.d.ts +2 -1
- package/dist/types/firecms.d.ts +2 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/navigation.d.ts +2 -2
- package/dist/types/plugins.d.ts +23 -0
- package/dist/types/properties.d.ts +9 -8
- package/dist/types/storage.d.ts +1 -0
- package/dist/types/translations.d.ts +669 -0
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/index.d.ts +1 -0
- package/dist/util/lazy_eager.d.ts +7 -0
- package/dist/util/objects.d.ts +1 -0
- package/dist/util/resolutions.d.ts +2 -2
- package/dist/util/useStorageUploadController.d.ts +10 -1
- package/package.json +49 -13
- package/src/app/Scaffold.tsx +7 -5
- package/src/components/AIIcon.tsx +3 -1
- package/src/components/ArrayContainer.tsx +6 -4
- package/src/components/ClearFilterSortButton.tsx +6 -3
- package/src/components/ConfirmationDialog.tsx +4 -2
- package/src/components/DeleteEntityDialog.tsx +10 -7
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +3 -1
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
- package/src/components/EntityCollectionView/BoardSortableList.tsx +3 -1
- package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
- package/src/components/EntityCollectionView/EntityBoardCard.tsx +1 -1
- package/src/components/EntityCollectionView/EntityCard.tsx +4 -0
- package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +39 -46
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +17 -25
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +71 -31
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -3
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -2
- package/src/components/EntityCollectionView/FiltersDialog.tsx +8 -5
- package/src/components/EntityCollectionView/ViewModeToggle.tsx +37 -37
- package/src/components/EntityJsonPreview.tsx +2 -1
- package/src/components/EntityView.tsx +3 -2
- package/src/components/ErrorBoundary.tsx +27 -15
- package/src/components/HomePage/DefaultHomePage.tsx +19 -13
- package/src/components/HomePage/HomePageDnD.tsx +3 -1
- package/src/components/HomePage/NavigationGroup.tsx +3 -1
- package/src/components/HomePage/RenameGroupDialog.tsx +15 -13
- package/src/components/LanguageToggle.tsx +66 -0
- package/src/components/NotFoundPage.tsx +5 -3
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +9 -7
- package/src/components/ReferenceWidget.tsx +3 -2
- package/src/components/SearchIconsView.tsx +3 -1
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +11 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +15 -2
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +11 -0
- package/src/components/UnsavedChangesDialog.tsx +6 -4
- package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
- package/src/components/VirtualTable/VirtualTable.tsx +121 -116
- package/src/components/VirtualTable/VirtualTableHeader.tsx +59 -56
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +9 -4
- package/src/components/VirtualTable/VirtualTableProps.tsx +7 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +3 -3
- package/src/components/VirtualTable/types.tsx +1 -0
- package/src/components/common/default_entity_actions.tsx +4 -0
- package/src/components/common/useDataSourceTableController.tsx +12 -4
- package/src/components/index.tsx +1 -0
- package/src/core/DefaultAppBar.tsx +15 -11
- package/src/core/DefaultDrawer.tsx +8 -2
- package/src/core/DrawerNavigationGroup.tsx +5 -3
- package/src/core/EntityEditView.tsx +54 -8
- package/src/core/EntityEditViewFormActions.tsx +24 -17
- package/src/core/EntitySidePanel.tsx +34 -30
- package/src/core/FireCMS.tsx +33 -6
- package/src/core/field_configs.tsx +18 -11
- package/src/editor/components/SlashCommandMenu.tsx +516 -0
- package/src/editor/components/editor-bubble-item.tsx +32 -0
- package/src/editor/components/editor-bubble.tsx +118 -0
- package/src/editor/components/image-bubble.tsx +156 -0
- package/src/editor/components/index.ts +14 -0
- package/src/editor/components/table-bubble.tsx +165 -0
- package/src/editor/editor.tsx +455 -0
- package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
- package/src/editor/extensions/Image/index.ts +133 -0
- package/src/editor/extensions/Image.ts +159 -0
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
- package/src/editor/extensions/clipboard.ts +72 -0
- package/src/editor/extensions/custom-keymap.ts +24 -0
- package/src/editor/extensions/drag-and-drop.tsx +480 -0
- package/src/editor/hooks/useProseMirror.ts +124 -0
- package/src/editor/hooks/useProseMirrorContext.ts +15 -0
- package/src/editor/index.ts +2 -0
- package/src/editor/markdown.ts +172 -0
- package/src/editor/nodeViews/ImageComponent.tsx +20 -0
- package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
- package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
- package/src/editor/nodeViews/index.ts +35 -0
- package/src/editor/plugins/index.ts +58 -0
- package/src/editor/plugins/inputrules.ts +82 -0
- package/src/editor/plugins/placeholderPlugin.ts +55 -0
- package/src/editor/plugins/slashCommandPlugin.ts +61 -0
- package/src/editor/schema.ts +240 -0
- package/src/editor/selectors/ai-selector.tsx +111 -0
- package/src/editor/selectors/color-selector.tsx +200 -0
- package/src/editor/selectors/link-selector.tsx +118 -0
- package/src/editor/selectors/node-selector.tsx +157 -0
- package/src/editor/selectors/text-buttons.tsx +86 -0
- package/src/editor/types.ts +6 -0
- package/src/editor/useProseMirror.ts +126 -0
- package/src/editor/utils/prosemirror-utils.ts +108 -0
- package/src/editor/utils/remove_classes.ts +17 -0
- package/src/editor/utils/useDebouncedCallback.ts +25 -0
- package/src/form/EntityForm.tsx +149 -67
- package/src/form/EntityFormActions.tsx +19 -12
- package/src/form/PropertyFieldBinding.tsx +10 -8
- package/src/form/components/ErrorFocus.tsx +3 -3
- package/src/form/components/LocalChangesMenu.tsx +13 -13
- package/src/form/components/StorageItemPreview.tsx +3 -2
- package/src/form/components/StorageUploadProgress.tsx +18 -3
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -9
- package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -24
- package/src/form/field_bindings/MapFieldBinding.tsx +27 -11
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +74 -37
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
- package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
- package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
- package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
- package/src/form/field_bindings/TextFieldBinding.tsx +10 -7
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useBuildNavigationController.tsx +49 -22
- package/src/hooks/useCollapsedGroups.ts +7 -6
- package/src/hooks/useTranslation.ts +31 -0
- package/src/hooks/useValidateAuthenticator.tsx +1 -1
- package/src/i18n/FireCMSi18nProvider.tsx +160 -0
- package/src/index.ts +5 -0
- package/src/internal/useBuildDataSource.ts +1 -2
- package/src/internal/useBuildSideEntityController.tsx +22 -20
- package/src/locales/de.ts +718 -0
- package/src/locales/en.ts +730 -0
- package/src/locales/es.ts +730 -0
- package/src/locales/fr.ts +718 -0
- package/src/locales/hi.ts +718 -0
- package/src/locales/it.ts +718 -0
- package/src/locales/pt.ts +727 -0
- package/src/preview/PropertyPreview.tsx +4 -2
- package/src/preview/components/ReferencePreview.tsx +2 -1
- package/src/preview/components/UrlComponentPreview.tsx +4 -2
- package/src/preview/components/UserPreview.tsx +3 -1
- package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
- package/src/routes/FireCMSRoute.tsx +63 -54
- package/src/types/analytics.ts +10 -0
- package/src/types/collections.ts +49 -0
- package/src/types/customization_controller.tsx +2 -1
- package/src/types/firecms.tsx +2 -1
- package/src/types/index.ts +1 -0
- package/src/types/navigation.ts +2 -2
- package/src/types/plugins.tsx +26 -0
- package/src/types/properties.ts +12 -10
- package/src/types/storage.ts +2 -1
- package/src/types/translations.ts +752 -0
- package/src/util/entities.ts +1 -1
- package/src/util/index.ts +1 -0
- package/src/util/join_collections.ts +10 -8
- package/src/util/lazy_eager.tsx +33 -0
- package/src/util/objects.ts +15 -0
- package/src/util/previews.ts +2 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/resolutions.ts +5 -3
- package/src/util/useStorageUploadController.tsx +23 -29
package/src/util/entities.ts
CHANGED
|
@@ -33,7 +33,7 @@ export function isHidden(property: Property | ResolvedProperty): boolean {
|
|
|
33
33
|
return typeof property.disabled === "object" && Boolean(property.disabled.hidden);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export function isPropertyBuilder<T extends CMSType, M extends Record<string, any
|
|
36
|
+
export function isPropertyBuilder<T extends CMSType = CMSType, M extends Record<string, any> = any>(propertyOrBuilder?: PropertyOrBuilder<T, M> | Property | ResolvedProperty): propertyOrBuilder is PropertyBuilder<T, M> {
|
|
37
37
|
return typeof propertyOrBuilder === "function";
|
|
38
38
|
}
|
|
39
39
|
|
package/src/util/index.ts
CHANGED
|
@@ -11,8 +11,8 @@ import { sortProperties } from "./collections";
|
|
|
11
11
|
import { isPropertyBuilder } from "./entities";
|
|
12
12
|
|
|
13
13
|
function applyModifyFunction(modifyCollection: ((props: ModifyCollectionProps) => (EntityCollection | void)) | undefined,
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
collection: EntityCollection,
|
|
15
|
+
parentPaths: string[]) {
|
|
16
16
|
if (modifyCollection) {
|
|
17
17
|
const modified = modifyCollection({
|
|
18
18
|
collection,
|
|
@@ -34,9 +34,9 @@ function applyModifyFunction(modifyCollection: ((props: ModifyCollectionProps) =
|
|
|
34
34
|
*
|
|
35
35
|
*/
|
|
36
36
|
export function joinCollectionLists(targetCollections: EntityCollection[],
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
sourceCollections: EntityCollection[] | undefined,
|
|
38
|
+
parentPaths: string[] = [],
|
|
39
|
+
modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void): EntityCollection[] {
|
|
40
40
|
|
|
41
41
|
// merge collections that are in both lists
|
|
42
42
|
const updatedCollections = (sourceCollections ?? [])
|
|
@@ -73,9 +73,9 @@ export function joinCollectionLists(targetCollections: EntityCollection[],
|
|
|
73
73
|
*
|
|
74
74
|
*/
|
|
75
75
|
export function mergeCollection(target: EntityCollection,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
source: EntityCollection,
|
|
77
|
+
parentPaths: string[] = [],
|
|
78
|
+
modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void
|
|
79
79
|
): EntityCollection {
|
|
80
80
|
|
|
81
81
|
const subcollectionsMerged = joinCollectionLists(
|
|
@@ -125,6 +125,8 @@ export function mergeCollection(target: EntityCollection,
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
function mergePropertyOrBuilder(target: PropertyOrBuilder, source: PropertyOrBuilder): PropertyOrBuilder {
|
|
128
|
+
if (!source) return target;
|
|
129
|
+
if (!target) return source;
|
|
128
130
|
if (isPropertyBuilder(source)) {
|
|
129
131
|
return source;
|
|
130
132
|
} else if (isPropertyBuilder(target)) {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns a React.lazy component that is also preloaded immediately using
|
|
5
|
+
* requestIdleCallback or setTimeout.
|
|
6
|
+
* This ensures that chunks are split, but fetched in the background before they are actually needed.
|
|
7
|
+
*/
|
|
8
|
+
export function lazyEager<T extends React.ComponentType<any>>(
|
|
9
|
+
factory: () => Promise<any>,
|
|
10
|
+
exportName: string = "default"
|
|
11
|
+
): React.LazyExoticComponent<T> {
|
|
12
|
+
let promise: Promise<any> | null = null;
|
|
13
|
+
|
|
14
|
+
const load = () => {
|
|
15
|
+
if (!promise) {
|
|
16
|
+
promise = factory().then((module) => {
|
|
17
|
+
const component = module[exportName] || module.default || module;
|
|
18
|
+
return { default: component };
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return promise;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
if (typeof window !== "undefined") {
|
|
25
|
+
if ("requestIdleCallback" in window) {
|
|
26
|
+
(window as any).requestIdleCallback(load);
|
|
27
|
+
} else {
|
|
28
|
+
setTimeout(load, 500);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return React.lazy(load);
|
|
33
|
+
}
|
package/src/util/objects.ts
CHANGED
|
@@ -279,3 +279,18 @@ export function removePropsIfExisting(source: any, comparison: any) {
|
|
|
279
279
|
|
|
280
280
|
return res;
|
|
281
281
|
}
|
|
282
|
+
|
|
283
|
+
export function jsonStringifyReplacer(key: string, value: any) {
|
|
284
|
+
if (value && typeof value === "object") {
|
|
285
|
+
if (value instanceof Date) {
|
|
286
|
+
return value.toISOString();
|
|
287
|
+
}
|
|
288
|
+
if ("_seconds" in value && "_nanoseconds" in value && typeof value._seconds === "number" && typeof value._nanoseconds === "number") {
|
|
289
|
+
return new Date(value._seconds * 1000 + value._nanoseconds / 1000000).toISOString();
|
|
290
|
+
}
|
|
291
|
+
if ("seconds" in value && "nanoseconds" in value && typeof value.seconds === "number" && typeof value.nanoseconds === "number") {
|
|
292
|
+
return new Date(value.seconds * 1000 + value.nanoseconds / 1000000).toISOString();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return value;
|
|
296
|
+
}
|
package/src/util/previews.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuthController, EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
1
|
+
import { AuthController, EntityCollection, Property, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
2
2
|
import { isReferenceProperty } from "./property_utils";
|
|
3
3
|
import { isPropertyBuilder } from "./entities";
|
|
4
4
|
import { getFieldConfig } from "../core";
|
|
@@ -33,7 +33,7 @@ export function getEntityTitlePropertyKey<M extends Record<string, any>>(collect
|
|
|
33
33
|
for (const key in collection.properties) {
|
|
34
34
|
const property = collection.properties[key];
|
|
35
35
|
if (!isPropertyBuilder(property)) {
|
|
36
|
-
const field = getFieldConfig(property, propertyConfigs);
|
|
36
|
+
const field = getFieldConfig(property as Property, propertyConfigs);
|
|
37
37
|
if (field?.key === "text_field") {
|
|
38
38
|
return key;
|
|
39
39
|
}
|
|
@@ -18,7 +18,7 @@ export function isReferenceProperty(
|
|
|
18
18
|
authController: AuthController,
|
|
19
19
|
propertyOrBuilder: PropertyOrBuilder,
|
|
20
20
|
fields: Record<string, PropertyConfig>) {
|
|
21
|
-
const resolvedProperty = resolveProperty({
|
|
21
|
+
const resolvedProperty: ResolvedProperty<any> | null = resolveProperty({
|
|
22
22
|
propertyKey: "ignore", // TODO
|
|
23
23
|
propertyOrBuilder,
|
|
24
24
|
propertyConfigs: fields,
|
package/src/util/resolutions.ts
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
Properties,
|
|
14
14
|
PropertiesOrBuilders,
|
|
15
15
|
Property,
|
|
16
|
+
PropertyBuilder,
|
|
16
17
|
PropertyConfig,
|
|
17
18
|
PropertyOrBuilder,
|
|
18
19
|
ResolvedArrayProperty,
|
|
@@ -62,6 +63,7 @@ export const resolveCollection = <M extends Record<string, any>,>
|
|
|
62
63
|
const usedPreviousValues = previousValues ?? values ?? defaultValues;
|
|
63
64
|
|
|
64
65
|
const resolvedProperties = Object.entries(collection.properties)
|
|
66
|
+
.filter(([, propertyOrBuilder]) => propertyOrBuilder != null)
|
|
65
67
|
.map(([key, propertyOrBuilder]) => {
|
|
66
68
|
const childResolvedProperty = resolveProperty({
|
|
67
69
|
propertyKey: key,
|
|
@@ -108,7 +110,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
108
110
|
...props
|
|
109
111
|
}: {
|
|
110
112
|
propertyKey?: string,
|
|
111
|
-
propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T
|
|
113
|
+
propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T> | PropertyOrBuilder | Property | ResolvedProperty | undefined,
|
|
112
114
|
values?: Partial<M>,
|
|
113
115
|
previousValues?: Partial<M>,
|
|
114
116
|
path?: string,
|
|
@@ -120,7 +122,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
120
122
|
authController: AuthController;
|
|
121
123
|
}): ResolvedProperty<T> | null {
|
|
122
124
|
|
|
123
|
-
if (typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
|
|
125
|
+
if (propertyOrBuilder !== null && typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
|
|
124
126
|
return propertyOrBuilder as ResolvedProperty<T>;
|
|
125
127
|
}
|
|
126
128
|
|
|
@@ -134,7 +136,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
134
136
|
throw Error("Trying to resolve a property builder without specifying the entity path");
|
|
135
137
|
|
|
136
138
|
const usedPropertyValue = props.propertyKey ? getIn(props.values, props.propertyKey) : undefined;
|
|
137
|
-
const result: Property<T> | null = propertyOrBuilder({
|
|
139
|
+
const result: Property<T> | null = (propertyOrBuilder as PropertyBuilder<T, M>)({
|
|
138
140
|
...props,
|
|
139
141
|
path,
|
|
140
142
|
propertyValue: usedPropertyValue,
|
|
@@ -207,43 +207,37 @@ export function useStorageUploadController<M extends object>({
|
|
|
207
207
|
console.error("Error processing file with custom code. Attempting to continue uploading.", e);
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
|
+
let newInternalValue: StorageFieldItem[] = [...internalValue];
|
|
210
211
|
|
|
211
|
-
let
|
|
212
|
-
|
|
213
|
-
if (multipleFilesSupported) {
|
|
214
|
-
newInternalValue = [...internalValue,
|
|
215
|
-
...(await Promise.all(acceptedFiles.map(async file => {
|
|
216
|
-
if ((imageResize || legacyCompression) && isImageFile(file)) {
|
|
217
|
-
file = await resizeImage(file, imageResize, legacyCompression);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return {
|
|
221
|
-
id: getRandomId(),
|
|
222
|
-
file,
|
|
223
|
-
fileName: await fileNameBuilder(file),
|
|
224
|
-
metadata,
|
|
225
|
-
size
|
|
226
|
-
} as StorageFieldItem;
|
|
227
|
-
})))];
|
|
228
|
-
} else {
|
|
229
|
-
let file = acceptedFiles[0];
|
|
212
|
+
for (let file of acceptedFiles) {
|
|
230
213
|
if ((imageResize || legacyCompression) && isImageFile(file)) {
|
|
231
214
|
file = await resizeImage(file, imageResize, legacyCompression);
|
|
232
215
|
}
|
|
233
216
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
217
|
+
if (multipleFilesSupported) {
|
|
218
|
+
newInternalValue.push({
|
|
219
|
+
id: getRandomId(),
|
|
220
|
+
file,
|
|
221
|
+
fileName: await fileNameBuilder(file),
|
|
222
|
+
metadata,
|
|
223
|
+
size
|
|
224
|
+
} as StorageFieldItem);
|
|
225
|
+
} else {
|
|
226
|
+
newInternalValue = [{
|
|
227
|
+
id: getRandomId(),
|
|
228
|
+
file,
|
|
229
|
+
fileName: await fileNameBuilder(file),
|
|
230
|
+
metadata,
|
|
231
|
+
size
|
|
232
|
+
}];
|
|
233
|
+
break; // Only keep the first file
|
|
234
|
+
}
|
|
241
235
|
}
|
|
242
236
|
|
|
243
237
|
// Remove either storage path or file duplicates
|
|
244
238
|
newInternalValue = removeDuplicates(newInternalValue);
|
|
245
239
|
setInternalValue(newInternalValue);
|
|
246
|
-
}, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size, imageResize, legacyCompression]);
|
|
240
|
+
}, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size, imageResize, legacyCompression, processFile]);
|
|
247
241
|
|
|
248
242
|
return {
|
|
249
243
|
internalValue,
|
|
@@ -300,7 +294,7 @@ function getRandomId() {
|
|
|
300
294
|
/**
|
|
301
295
|
* Check if a file is an image type supported for resizing
|
|
302
296
|
*/
|
|
303
|
-
function isImageFile(file: File): boolean {
|
|
297
|
+
export function isImageFile(file: File): boolean {
|
|
304
298
|
return file.type === "image/jpeg" ||
|
|
305
299
|
file.type === "image/png" ||
|
|
306
300
|
file.type === "image/webp";
|
|
@@ -310,7 +304,7 @@ function isImageFile(file: File): boolean {
|
|
|
310
304
|
* Resize and compress an image using compressorjs.
|
|
311
305
|
* Supports both the new imageResize API and legacy imageCompression for backward compatibility.
|
|
312
306
|
*/
|
|
313
|
-
async function resizeImage(
|
|
307
|
+
export async function resizeImage(
|
|
314
308
|
file: File,
|
|
315
309
|
imageResize?: StorageConfig["imageResize"],
|
|
316
310
|
legacyCompression?: ImageResize
|