@firecms/core 3.0.0-beta.7 → 3.0.0-beta.9
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/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +17 -0
- package/dist/app/Scaffold.d.ts +30 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +2 -1
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +0 -1
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +1 -1
- package/dist/components/EntityPreview.d.ts +1 -1
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +14 -6
- package/dist/components/common/useColumnsIds.d.ts +2 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +3 -8
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +2 -1
- package/dist/core/EntityEditView.d.ts +18 -4
- package/dist/core/FireCMS.d.ts +1 -1
- package/dist/core/NavigationRoutes.d.ts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/FormikArrayContainer.d.ts +2 -1
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +1 -0
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +3 -5
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/useProjectLog.d.ts +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +14434 -11300
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +19987 -587
- package/dist/index.umd.js.map +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +1 -1
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/types/auth.d.ts +2 -2
- package/dist/types/collections.d.ts +26 -3
- package/dist/types/datasource.d.ts +53 -30
- package/dist/types/entities.d.ts +1 -0
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/fields.d.ts +47 -41
- package/dist/types/navigation.d.ts +1 -0
- package/dist/types/plugins.d.ts +11 -3
- package/dist/types/properties.d.ts +25 -20
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +75 -0
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icons.d.ts +3 -2
- package/dist/util/index.d.ts +1 -0
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +1 -1
- package/dist/util/resolutions.d.ts +15 -1
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +18 -29
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +25 -0
- package/src/{core → app}/Scaffold.tsx +71 -122
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +15 -10
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +11 -18
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +2 -2
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +4 -2
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -14
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +12 -4
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +17 -19
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +5 -6
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +33 -29
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityPreview.tsx +30 -31
- package/src/components/ErrorView.tsx +1 -1
- package/src/components/HomePage/DefaultHomePage.tsx +24 -18
- package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +7 -6
- package/src/components/SearchIconsView.tsx +5 -2
- package/src/components/SelectableTable/SelectableTable.tsx +2 -4
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +1 -1
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +54 -7
- package/src/components/VirtualTable/VirtualTable.tsx +36 -10
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableProps.tsx +17 -8
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -3
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +14 -28
- package/src/components/common/useColumnsIds.tsx +13 -0
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +12 -12
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +2 -1
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +28 -30
- package/src/core/DefaultDrawer.tsx +183 -0
- package/src/core/DrawerNavigationItem.tsx +31 -27
- package/src/core/EntityEditView.tsx +712 -145
- package/src/core/EntitySidePanel.tsx +0 -1
- package/src/core/FireCMS.tsx +2 -2
- package/src/core/NavigationRoutes.tsx +4 -4
- package/src/core/SideDialogs.tsx +1 -0
- package/src/core/field_configs.tsx +5 -5
- package/src/core/index.tsx +2 -2
- package/src/form/PropertyFieldBinding.tsx +53 -19
- package/src/form/components/CustomIdField.tsx +4 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormikArrayContainer.tsx +4 -1
- package/src/form/components/LabelWithIcon.tsx +27 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +20 -10
- package/src/form/components/StorageUploadProgress.tsx +0 -1
- package/src/form/components/index.tsx +1 -0
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +26 -15
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +28 -25
- package/src/form/field_bindings/BlockFieldBinding.tsx +13 -11
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +48 -42
- package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +9 -14
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +27 -18
- package/src/form/field_bindings/RepeatFieldBinding.tsx +32 -19
- package/src/form/field_bindings/SelectFieldBinding.tsx +17 -10
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +33 -43
- package/src/form/field_bindings/SwitchFieldBinding.tsx +9 -5
- package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
- package/src/form/index.tsx +4 -9
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +2 -1
- package/src/hooks/data/save.ts +5 -2
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/useBuildNavigationController.tsx +10 -3
- package/src/hooks/useProjectLog.tsx +18 -7
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +69 -74
- package/src/internal/useBuildSideDialogsController.tsx +1 -0
- package/src/internal/useBuildSideEntityController.tsx +17 -4
- package/src/internal/useUnsavedChangesDialog.tsx +3 -1
- package/src/preview/PropertyPreview.tsx +7 -4
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +24 -34
- package/src/preview/components/ReferencePreview.tsx +2 -12
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -2
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
- package/src/preview/property_previews/MapPropertyPreview.tsx +1 -1
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
- package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
- package/src/preview/util.ts +2 -2
- package/src/types/auth.tsx +2 -2
- package/src/types/collections.ts +29 -4
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +62 -43
- package/src/types/entities.ts +2 -0
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/fields.tsx +51 -45
- package/src/types/navigation.ts +1 -0
- package/src/types/plugins.tsx +12 -3
- package/src/types/properties.ts +25 -19
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/storage.ts +82 -0
- package/src/util/entities.ts +5 -4
- package/src/util/icon_list.ts +14 -9
- package/src/util/icons.tsx +8 -2
- package/src/util/index.ts +1 -0
- package/src/util/objects.ts +17 -7
- package/src/util/permissions.ts +1 -0
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/references.ts +3 -0
- package/src/util/resolutions.ts +43 -11
- package/src/util/storage.ts +79 -21
- package/src/util/useStorageUploadController.tsx +33 -7
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/core/Drawer.d.ts +0 -16
- package/dist/core/Scaffold.d.ts +0 -51
- package/dist/form/EntityForm.d.ts +0 -77
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
- package/src/core/Drawer.tsx +0 -139
- package/src/form/EntityForm.tsx +0 -736
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useMemo } from "react";
|
|
2
2
|
|
|
3
3
|
import { ImagePreview } from "./ImagePreview";
|
|
4
4
|
import { getThumbnailMeasure } from "../util";
|
|
5
5
|
import { PreviewType } from "../../types";
|
|
6
6
|
import { PreviewSize } from "../PropertyPreviewProps";
|
|
7
|
-
import { DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
|
|
7
|
+
import { cls, DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
|
|
8
8
|
import { EmptyValue } from "./EmptyValue";
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -14,12 +14,15 @@ export function UrlComponentPreview({
|
|
|
14
14
|
url,
|
|
15
15
|
previewType,
|
|
16
16
|
size,
|
|
17
|
-
hint
|
|
17
|
+
hint,
|
|
18
|
+
interactive = true
|
|
18
19
|
}: {
|
|
19
20
|
url: string,
|
|
20
21
|
previewType?: PreviewType,
|
|
21
22
|
size: PreviewSize,
|
|
22
|
-
hint?: string
|
|
23
|
+
hint?: string,
|
|
24
|
+
// for video controls
|
|
25
|
+
interactive?: boolean
|
|
23
26
|
}): React.ReactElement {
|
|
24
27
|
|
|
25
28
|
if (!previewType) {
|
|
@@ -43,17 +46,13 @@ export function UrlComponentPreview({
|
|
|
43
46
|
size={size}/>;
|
|
44
47
|
} else if (previewType === "audio") {
|
|
45
48
|
return <audio controls
|
|
49
|
+
className={"max-w-100%"}
|
|
46
50
|
src={url}>
|
|
47
51
|
Your browser does not support the
|
|
48
52
|
<code>audio</code> element.
|
|
49
53
|
</audio>;
|
|
50
54
|
} else if (previewType === "video") {
|
|
51
|
-
return <
|
|
52
|
-
className={`max-w-${size === "small" ? "sm" : "md"}`}
|
|
53
|
-
controls
|
|
54
|
-
>
|
|
55
|
-
<source src={url}/>
|
|
56
|
-
</video>;
|
|
55
|
+
return <VideoPreview size={size} src={url} interactive={interactive}/>;
|
|
57
56
|
} else {
|
|
58
57
|
return (
|
|
59
58
|
<a
|
|
@@ -66,7 +65,7 @@ export function UrlComponentPreview({
|
|
|
66
65
|
width: getThumbnailMeasure(size),
|
|
67
66
|
height: getThumbnailMeasure(size)
|
|
68
67
|
}}>
|
|
69
|
-
<DescriptionIcon className="
|
|
68
|
+
<DescriptionIcon className="text-gray-700 dark:text-gray-300"/>
|
|
70
69
|
{hint &&
|
|
71
70
|
<Tooltip title={hint}>
|
|
72
71
|
<Typography
|
|
@@ -77,3 +76,37 @@ export function UrlComponentPreview({
|
|
|
77
76
|
);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
79
|
+
|
|
80
|
+
function VideoPreview({
|
|
81
|
+
size,
|
|
82
|
+
src,
|
|
83
|
+
interactive
|
|
84
|
+
}: { size: PreviewSize, src: string, interactive: boolean }) {
|
|
85
|
+
|
|
86
|
+
const imageSize = useMemo(() => {
|
|
87
|
+
if (size === "smallest")
|
|
88
|
+
return "140px";
|
|
89
|
+
else if (size === "small")
|
|
90
|
+
return "240px";
|
|
91
|
+
else if (size === "medium")
|
|
92
|
+
return "100%";
|
|
93
|
+
else throw new Error("Invalid size");
|
|
94
|
+
}, [size]);
|
|
95
|
+
|
|
96
|
+
const videoProps = {
|
|
97
|
+
controls: interactive
|
|
98
|
+
};
|
|
99
|
+
return <video
|
|
100
|
+
style={{
|
|
101
|
+
position: "relative",
|
|
102
|
+
objectFit: "cover",
|
|
103
|
+
width: imageSize,
|
|
104
|
+
minWidth: "140px",
|
|
105
|
+
// height: imageSize,
|
|
106
|
+
maxHeight: "100%"
|
|
107
|
+
}}
|
|
108
|
+
{...videoProps}
|
|
109
|
+
className={cls("max-w-100% rounded", { "pointer-events-none": !interactive })}>
|
|
110
|
+
<source src={src}/>
|
|
111
|
+
</video>;
|
|
112
|
+
}
|
|
@@ -54,7 +54,7 @@ export function ArrayOfMapsPreview({
|
|
|
54
54
|
values.map((v, index) => {
|
|
55
55
|
return (
|
|
56
56
|
<div key={`table_${v}_${index}`}
|
|
57
|
-
className="border-b last:border-b-0">
|
|
57
|
+
className="border-b last:border-b-0 py-2">
|
|
58
58
|
{mapProperties && mapProperties.map(
|
|
59
59
|
(key) => (
|
|
60
60
|
<div
|
|
@@ -28,7 +28,7 @@ export function ArrayOfReferencesPreview({
|
|
|
28
28
|
if (property?.dataType !== "array" || !property.of || property.of.dataType !== "reference")
|
|
29
29
|
throw Error("Picked wrong preview component ArrayOfReferencesPreview");
|
|
30
30
|
|
|
31
|
-
const childSize: PreviewSize = size === "medium" ? "small" : "
|
|
31
|
+
const childSize: PreviewSize = size === "medium" ? "small" : "smallest";
|
|
32
32
|
|
|
33
33
|
return (
|
|
34
34
|
<div className="flex flex-col w-full">
|
|
@@ -33,7 +33,7 @@ export function ArrayOfStorageComponentsPreview({
|
|
|
33
33
|
if (property.dataType !== "array" || !property.of || property.of.dataType !== "string")
|
|
34
34
|
throw Error("Picked wrong preview component ArrayOfStorageComponentsPreview");
|
|
35
35
|
|
|
36
|
-
const childSize: PreviewSize = size === "medium" ? "small" : "
|
|
36
|
+
const childSize: PreviewSize = size === "medium" ? "small" : "smallest";
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
39
|
<div className={"flex flex-wrap gap-2"}>
|
|
@@ -37,7 +37,7 @@ export function ArrayOneOfPreview({
|
|
|
37
37
|
|
|
38
38
|
if (!values) return null;
|
|
39
39
|
|
|
40
|
-
const childSize: PreviewSize = size === "medium" ? "small" : "
|
|
40
|
+
const childSize: PreviewSize = size === "medium" ? "small" : "smallest";
|
|
41
41
|
|
|
42
42
|
const typeField = property.oneOf.typeField ?? DEFAULT_ONE_OF_TYPE;
|
|
43
43
|
const valueField = property.oneOf.valueField ?? DEFAULT_ONE_OF_VALUE;
|
|
@@ -49,7 +49,7 @@ export function ArrayOneOfPreview({
|
|
|
49
49
|
values.map((value, index) =>
|
|
50
50
|
<React.Fragment
|
|
51
51
|
key={"preview_array_" + value + "_" + index}>
|
|
52
|
-
<div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
|
|
52
|
+
<div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0 py-2")}>
|
|
53
53
|
<ErrorBoundary>
|
|
54
54
|
{value && <PropertyPreview
|
|
55
55
|
propertyKey={propertyKey}
|
|
@@ -37,7 +37,7 @@ export function ArrayPropertyPreview({
|
|
|
37
37
|
|
|
38
38
|
if (!values) return null;
|
|
39
39
|
|
|
40
|
-
const childSize: PreviewSize = size === "medium" ? "small" : "
|
|
40
|
+
const childSize: PreviewSize = size === "medium" ? "small" : "smallest";
|
|
41
41
|
|
|
42
42
|
return (
|
|
43
43
|
<div className="flex flex-col gap-2">
|
|
@@ -34,7 +34,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
|
|
|
34
34
|
|
|
35
35
|
const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)
|
|
36
36
|
|
|
37
|
-
if (size === "
|
|
37
|
+
if (size === "smallest")
|
|
38
38
|
return (
|
|
39
39
|
<div className="w-full flex flex-col space-y-1 md:space-y-2">
|
|
40
40
|
{mapPropertyKeys.map((key, index) => (
|
|
@@ -87,7 +87,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
87
87
|
mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];
|
|
88
88
|
if (size === "small")
|
|
89
89
|
mapPropertyKeys = mapPropertyKeys.slice(0, 3);
|
|
90
|
-
else if (size === "
|
|
90
|
+
else if (size === "smallest")
|
|
91
91
|
mapPropertyKeys = mapPropertyKeys.slice(0, 1);
|
|
92
92
|
}
|
|
93
93
|
|
|
@@ -226,7 +226,7 @@ function renderUrlAudioComponent() {
|
|
|
226
226
|
|
|
227
227
|
export function renderSkeletonImageThumbnail(size: PreviewSize) {
|
|
228
228
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
229
|
-
const imageSize = size === "
|
|
229
|
+
const imageSize = size === "smallest" ? 40 : size === "small" ? 100 : 200;
|
|
230
230
|
return (
|
|
231
231
|
<Skeleton width={imageSize}
|
|
232
232
|
height={imageSize}/>
|
|
@@ -45,14 +45,14 @@ export function StringPropertyPreview({
|
|
|
45
45
|
if (!value) return <></>;
|
|
46
46
|
const lines = value.split("\n");
|
|
47
47
|
return value && value.includes("\n")
|
|
48
|
-
? <div className={cls("overflow-x-scroll", size === "
|
|
48
|
+
? <div className={cls("overflow-x-scroll", size === "smallest" ? "text-sm" : "")}>
|
|
49
49
|
{lines.map((str, index) =>
|
|
50
50
|
<React.Fragment key={`string_preview_${index}`}>
|
|
51
51
|
<span>{str}</span>
|
|
52
52
|
{index !== lines.length - 1 && <br/>}
|
|
53
53
|
</React.Fragment>)}
|
|
54
54
|
</div>
|
|
55
|
-
: (size === "
|
|
55
|
+
: (size === "smallest"
|
|
56
56
|
? <span className={"text-sm"}>{value}</span>
|
|
57
57
|
: <>{value}</>
|
|
58
58
|
);
|
package/src/preview/util.ts
CHANGED
|
@@ -6,7 +6,7 @@ export const SMALL_THUMBNAIL = 100;
|
|
|
6
6
|
export const REGULAR_THUMBNAIL = 200;
|
|
7
7
|
|
|
8
8
|
export function getThumbnailMeasure(size: PreviewSize): number {
|
|
9
|
-
if (size === "
|
|
9
|
+
if (size === "smallest")
|
|
10
10
|
return TINY_THUMBNAIL;
|
|
11
11
|
else if (size === "small")
|
|
12
12
|
return SMALL_THUMBNAIL;
|
|
@@ -19,7 +19,7 @@ export function getPreviewSizeFrom(size: CollectionSize): PreviewSize {
|
|
|
19
19
|
switch (size) {
|
|
20
20
|
case "xs":
|
|
21
21
|
case "s":
|
|
22
|
-
return "
|
|
22
|
+
return "smallest";
|
|
23
23
|
case "m":
|
|
24
24
|
return "small";
|
|
25
25
|
case "l":
|
package/src/types/auth.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import { StorageSource } from "./storage";
|
|
|
9
9
|
* to do it as the result of a hook.
|
|
10
10
|
* @group Hooks and utilities
|
|
11
11
|
*/
|
|
12
|
-
export type AuthController<UserType extends User = any, ExtraData
|
|
12
|
+
export type AuthController<UserType extends User = any, ExtraData = any> = {
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* The user currently logged in
|
|
@@ -38,7 +38,7 @@ export type AuthController<UserType extends User = any, ExtraData extends any =
|
|
|
38
38
|
/**
|
|
39
39
|
* Sign out
|
|
40
40
|
*/
|
|
41
|
-
signOut: () => void
|
|
41
|
+
signOut: () => Promise<void>;
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* Error initializing the authentication
|
package/src/types/collections.ts
CHANGED
|
@@ -51,6 +51,12 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
|
|
|
51
51
|
*/
|
|
52
52
|
path: string;
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Optional database id of this collection. If not specified, the default
|
|
56
|
+
* database id will be used.
|
|
57
|
+
*/
|
|
58
|
+
databaseId?: string;
|
|
59
|
+
|
|
54
60
|
/**
|
|
55
61
|
* If this collection is a top level navigation entry, you can set this
|
|
56
62
|
* property to `true` to indicate that this collection is a collection group.
|
|
@@ -61,7 +67,8 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
|
|
|
61
67
|
* Icon key to use in this collection.
|
|
62
68
|
* You can use any of the icons in the Material specs:
|
|
63
69
|
* https://fonts.google.com/icons
|
|
64
|
-
* e.g. 'account_tree' or 'person'
|
|
70
|
+
* e.g. 'account_tree' or 'person'.
|
|
71
|
+
* Find all the icons in https://firecms.co/docs/icons
|
|
65
72
|
*/
|
|
66
73
|
icon?: string;
|
|
67
74
|
|
|
@@ -82,7 +89,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
|
|
|
82
89
|
* as the title in entity related views and references.
|
|
83
90
|
* If not specified, the first property simple text property will be used.
|
|
84
91
|
*/
|
|
85
|
-
titleProperty?: keyof M
|
|
92
|
+
titleProperty?: keyof M;
|
|
86
93
|
|
|
87
94
|
/**
|
|
88
95
|
* Can this collection be edited by the end user.
|
|
@@ -304,6 +311,11 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
|
|
|
304
311
|
* Width of the side dialog (in pixels) when opening an entity in this collection.
|
|
305
312
|
*/
|
|
306
313
|
sideDialogWidth?: number | string;
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Default preview properties displayed when this collection is referenced to.
|
|
317
|
+
*/
|
|
318
|
+
previewProperties?: string[];
|
|
307
319
|
}
|
|
308
320
|
|
|
309
321
|
/**
|
|
@@ -362,14 +374,13 @@ export interface CollectionActionsProps<M extends Record<string, any> = any, Use
|
|
|
362
374
|
/**
|
|
363
375
|
* Use this controller to retrieve the selected entities or modify them in
|
|
364
376
|
* an {@link EntityCollection}
|
|
365
|
-
* If you want to pass a `SelectionController` to
|
|
366
377
|
* @group Models
|
|
367
378
|
*/
|
|
368
379
|
export type SelectionController<M extends Record<string, any> = any> = {
|
|
369
380
|
selectedEntities: Entity<M>[];
|
|
370
381
|
setSelectedEntities: Dispatch<SetStateAction<Entity<M>[]>>;
|
|
371
382
|
isEntitySelected: (entity: Entity<M>) => boolean;
|
|
372
|
-
toggleEntitySelection: (entity: Entity<M
|
|
383
|
+
toggleEntitySelection: (entity: Entity<M>, newSelectedState?: boolean) => void;
|
|
373
384
|
}
|
|
374
385
|
|
|
375
386
|
/**
|
|
@@ -477,8 +488,22 @@ export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
|
|
|
477
488
|
*/
|
|
478
489
|
export type EntityCustomView<M extends Record<string, any> = any> =
|
|
479
490
|
{
|
|
491
|
+
/**
|
|
492
|
+
* Key of this custom view.
|
|
493
|
+
*/
|
|
480
494
|
key: string,
|
|
495
|
+
/**
|
|
496
|
+
* Name of this custom view.
|
|
497
|
+
*/
|
|
481
498
|
name: string,
|
|
499
|
+
/**
|
|
500
|
+
* If set to true, the actions of the entity will be included in the
|
|
501
|
+
* bottom of the panel (save buttons, delete buttons, etc.)
|
|
502
|
+
*/
|
|
503
|
+
includeActions?: boolean;
|
|
504
|
+
/**
|
|
505
|
+
* Builder for rendering the custom view
|
|
506
|
+
*/
|
|
482
507
|
Builder?: React.ComponentType<EntityCustomViewParams<M>>;
|
|
483
508
|
}
|
|
484
509
|
|
package/src/types/datasource.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Entity,
|
|
1
|
+
import { Entity, EntityStatus, EntityValues } from "./entities";
|
|
2
2
|
import { EntityCollection, FilterValues } from "./collections";
|
|
3
3
|
import { ResolvedEntityCollection } from "./resolved_entities";
|
|
4
|
+
import { FireCMSContext } from "./firecms_context";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* @group Datasource
|
|
@@ -17,6 +18,7 @@ export interface FetchEntityProps<M extends Record<string, any> = any> {
|
|
|
17
18
|
export type ListenEntityProps<M extends Record<string, any> = any> =
|
|
18
19
|
FetchEntityProps<M>
|
|
19
20
|
& {
|
|
21
|
+
databaseId?: string;
|
|
20
22
|
onUpdate: (entity: Entity<M>) => void,
|
|
21
23
|
onError?: (error: Error) => void,
|
|
22
24
|
}
|
|
@@ -62,12 +64,12 @@ export interface SaveEntityProps<M extends Record<string, any> = any> {
|
|
|
62
64
|
*/
|
|
63
65
|
export interface DeleteEntityProps<M extends Record<string, any> = any> {
|
|
64
66
|
entity: Entity<M>;
|
|
67
|
+
collection?: EntityCollection<M> | ResolvedEntityCollection<M>;
|
|
65
68
|
}
|
|
66
69
|
|
|
67
70
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* A Firestore implementation of this interface can be found in {@link useFirestoreDataSource}
|
|
71
|
+
* Component in charge of communicating with the data source.
|
|
72
|
+
* Usually you won't need to implement this interface, but a {@link DataSourceDelegate} instead.
|
|
71
73
|
* @group Datasource
|
|
72
74
|
*/
|
|
73
75
|
export interface DataSource {
|
|
@@ -181,7 +183,8 @@ export interface DataSource {
|
|
|
181
183
|
*/
|
|
182
184
|
deleteEntity<M extends Record<string, any> = any>(
|
|
183
185
|
{
|
|
184
|
-
entity
|
|
186
|
+
entity,
|
|
187
|
+
collection
|
|
185
188
|
}: DeleteEntityProps<M>
|
|
186
189
|
): Promise<void>;
|
|
187
190
|
|
|
@@ -190,7 +193,7 @@ export interface DataSource {
|
|
|
190
193
|
* @param path Collection path
|
|
191
194
|
* @param name of the property
|
|
192
195
|
* @param value
|
|
193
|
-
* @param
|
|
196
|
+
* @param collection
|
|
194
197
|
* @param entityId
|
|
195
198
|
* @return `true` if there are no other fields besides the given entity
|
|
196
199
|
*/
|
|
@@ -198,13 +201,14 @@ export interface DataSource {
|
|
|
198
201
|
path: string,
|
|
199
202
|
name: string,
|
|
200
203
|
value: any,
|
|
201
|
-
entityId?: string
|
|
204
|
+
entityId?: string,
|
|
205
|
+
collection?: EntityCollection
|
|
202
206
|
): Promise<boolean>;
|
|
203
207
|
|
|
204
208
|
/**
|
|
205
209
|
* Generate an id for a new entity
|
|
206
210
|
*/
|
|
207
|
-
generateEntityId(path: string): string;
|
|
211
|
+
generateEntityId(path: string, collection: EntityCollection): string;
|
|
208
212
|
|
|
209
213
|
/**
|
|
210
214
|
* Count the number of entities in a collection
|
|
@@ -217,6 +221,18 @@ export interface DataSource {
|
|
|
217
221
|
*/
|
|
218
222
|
isFilterCombinationValid?(props: FilterCombinationValidProps): boolean;
|
|
219
223
|
|
|
224
|
+
/**
|
|
225
|
+
* Called when the user clicks on the search bar in a collection view.
|
|
226
|
+
* Useful for initializing a text search index.
|
|
227
|
+
* @param props
|
|
228
|
+
*/
|
|
229
|
+
initTextSearch?: (props: {
|
|
230
|
+
context: FireCMSContext,
|
|
231
|
+
path: string,
|
|
232
|
+
collection: EntityCollection,
|
|
233
|
+
parentCollectionIds?: string[]
|
|
234
|
+
}) => Promise<boolean>;
|
|
235
|
+
|
|
220
236
|
}
|
|
221
237
|
|
|
222
238
|
export type FilterCombinationValidProps = {
|
|
@@ -226,21 +242,29 @@ export type FilterCombinationValidProps = {
|
|
|
226
242
|
sortBy?: [string, "asc" | "desc"];
|
|
227
243
|
};
|
|
228
244
|
|
|
229
|
-
export type SaveEntityDelegateProps<M extends Record<string, any> = any> =
|
|
245
|
+
export type SaveEntityDelegateProps<M extends Record<string, any> = any> = SaveEntityProps<M>;
|
|
230
246
|
|
|
231
|
-
export type FetchCollectionDelegateProps<M extends Record<string, any> = any> =
|
|
232
|
-
Omit<FetchCollectionProps<M>, "collection">
|
|
233
|
-
& {
|
|
234
|
-
isCollectionGroup?: boolean
|
|
235
|
-
};
|
|
247
|
+
export type FetchCollectionDelegateProps<M extends Record<string, any> = any> = FetchCollectionProps<M>;
|
|
236
248
|
|
|
237
|
-
export type ListenCollectionDelegateProps<M extends Record<string, any> = any> =
|
|
238
|
-
ListenCollectionProps<M>
|
|
239
|
-
& {
|
|
240
|
-
isCollectionGroup?: boolean;
|
|
241
|
-
};
|
|
249
|
+
export type ListenCollectionDelegateProps<M extends Record<string, any> = any> = ListenCollectionProps<M>;
|
|
242
250
|
|
|
243
251
|
export interface DataSourceDelegate {
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Key that identifies this data source delegate
|
|
255
|
+
*/
|
|
256
|
+
key: string;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* If the data source has been initialised
|
|
260
|
+
*/
|
|
261
|
+
initialised?: boolean;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* If the user is authenticated to use the data source
|
|
265
|
+
*/
|
|
266
|
+
authenticated?: boolean;
|
|
267
|
+
|
|
244
268
|
/**
|
|
245
269
|
* Fetch data from a collection
|
|
246
270
|
* @param path
|
|
@@ -298,7 +322,7 @@ export interface DataSourceDelegate {
|
|
|
298
322
|
fetchEntity<M extends Record<string, any> = any>({
|
|
299
323
|
path,
|
|
300
324
|
entityId,
|
|
301
|
-
}:
|
|
325
|
+
}: FetchEntityProps<M>): Promise<Entity<M> | undefined>;
|
|
302
326
|
|
|
303
327
|
/**
|
|
304
328
|
* Get realtime updates on one entity.
|
|
@@ -314,13 +338,13 @@ export interface DataSourceDelegate {
|
|
|
314
338
|
entityId,
|
|
315
339
|
onUpdate,
|
|
316
340
|
onError
|
|
317
|
-
}:
|
|
341
|
+
}: ListenEntityProps<M>): () => void;
|
|
318
342
|
|
|
319
343
|
/**
|
|
320
344
|
* Save entity to the specified path
|
|
321
345
|
* @param path
|
|
322
|
-
* @param
|
|
323
|
-
* @param
|
|
346
|
+
* @param entityId
|
|
347
|
+
* @param values
|
|
324
348
|
* @param status
|
|
325
349
|
*/
|
|
326
350
|
saveEntity<M extends Record<string, any> = any>({
|
|
@@ -343,14 +367,15 @@ export interface DataSourceDelegate {
|
|
|
343
367
|
* @param name of the property
|
|
344
368
|
* @param value
|
|
345
369
|
* @param entityId
|
|
370
|
+
* @param collection
|
|
346
371
|
* @return `true` if there are no other fields besides the given entity
|
|
347
372
|
*/
|
|
348
|
-
checkUniqueField(path: string, name: string, value: any, entityId?: string): Promise<boolean>;
|
|
373
|
+
checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection): Promise<boolean>;
|
|
349
374
|
|
|
350
375
|
/**
|
|
351
376
|
* Generate an id for a new entity
|
|
352
377
|
*/
|
|
353
|
-
generateEntityId(path: string): string;
|
|
378
|
+
generateEntityId(path: string, collection?: EntityCollection): string;
|
|
354
379
|
|
|
355
380
|
/**
|
|
356
381
|
* Count the number of entities in a collection
|
|
@@ -361,32 +386,26 @@ export interface DataSourceDelegate {
|
|
|
361
386
|
* Check if the given filter combination is valid
|
|
362
387
|
* @param props
|
|
363
388
|
*/
|
|
364
|
-
isFilterCombinationValid?(props: Omit<FilterCombinationValidProps, "collection">
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
* Convert a FireCMS reference to a reference that can be used by the datasource
|
|
368
|
-
* @param reference
|
|
369
|
-
*/
|
|
370
|
-
// buildReference: (reference: EntityReference) => any,
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Convert a FireCMS GeoPoint to a GeoPoint that can be used by the datasource
|
|
374
|
-
* @param geoPoint
|
|
375
|
-
*/
|
|
376
|
-
// buildGeoPoint: (geoPoint: GeoPoint) => any,
|
|
389
|
+
isFilterCombinationValid?(props: Omit<FilterCombinationValidProps, "collection"> & {
|
|
390
|
+
databaseId?: string
|
|
391
|
+
}): boolean;
|
|
377
392
|
|
|
378
393
|
/**
|
|
379
394
|
* Get the object to generate the current time in the datasource
|
|
380
395
|
*/
|
|
381
|
-
currentTime()
|
|
382
|
-
|
|
383
|
-
// buildDate: (date: Date) => any;
|
|
384
|
-
|
|
385
|
-
// buildDeleteFieldValue: () => any;
|
|
396
|
+
currentTime?: () => any;
|
|
386
397
|
|
|
387
398
|
delegateToCMSModel: (data: any) => any;
|
|
388
399
|
|
|
389
400
|
cmsToDelegateModel: (data: any) => any;
|
|
390
401
|
|
|
391
402
|
setDateToMidnight: (input?: any) => any;
|
|
403
|
+
|
|
404
|
+
initTextSearch?: (props: {
|
|
405
|
+
context: FireCMSContext,
|
|
406
|
+
path: string,
|
|
407
|
+
databaseId?: string,
|
|
408
|
+
collection: EntityCollection,
|
|
409
|
+
parentCollectionIds?: string[]
|
|
410
|
+
}) => Promise<boolean>;
|
|
392
411
|
}
|
package/src/types/entities.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DataSource } from "./datasource";
|
|
1
|
+
import { DataSource, DataSourceDelegate } from "./datasource";
|
|
2
2
|
import { StorageSource } from "./storage";
|
|
3
3
|
|
|
4
4
|
export type EntityOverrides = {
|
|
5
|
-
|
|
5
|
+
dataSourceDelegate?: DataSourceDelegate;
|
|
6
6
|
storageSource?: StorageSource;
|
|
7
7
|
};
|