@firecms/core 3.0.0-alpha.66 → 3.0.0-alpha.67
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/contexts/SnackbarProvider.tsx","../src/contexts/ModeController.tsx","../src/contexts/AuthControllerContext.tsx","../src/util/navigation_utils.ts","../src/types/entities.ts","../src/util/objects.ts","../src/util/common.tsx","../src/util/entities.ts","../src/util/hash.ts","../src/util/chip_utils.ts","../src/util/enums.ts","../src/util/resolutions.ts","../src/util/navigation_from_path.ts","../src/util/collections.ts","../src/util/strings.ts","../src/util/dates.ts","../src/util/paths.ts","../src/util/regexp.ts","../src/util/useDebounce.ts","../src/util/property_utils.tsx","../src/util/permissions.ts","../src/util/icons.tsx","../src/util/plurals.ts","../src/util/references.ts","../src/util/flatten_object.ts","../src/util/make_properties_editable.ts","../src/util/join_collections.ts","../src/util/builders.ts","../src/internal/common.tsx","../src/contexts/DataSourceContext.tsx","../src/hooks/data/useDataSource.tsx","../src/contexts/NavigationContext.tsx","../src/hooks/useNavigationController.tsx","../src/hooks/useAuthController.tsx","../src/contexts/SideDialogsControllerContext.tsx","../src/hooks/useSideDialogsController.tsx","../src/contexts/SideEntityControllerContext.tsx","../src/hooks/useSideEntityController.tsx","../src/contexts/StorageSourceContext.tsx","../src/hooks/useStorageSource.tsx","../src/hooks/useSnackbarController.tsx","../src/contexts/UserConfigurationPersistenceContext.tsx","../src/hooks/useUserConfigurationPersistence.tsx","../src/contexts/DialogsProvider.tsx","../src/hooks/useDialogsController.tsx","../src/hooks/useFireCMSContext.tsx","../src/hooks/data/useCollectionFetch.tsx","../src/hooks/data/useEntityFetch.tsx","../src/hooks/data/save.ts","../src/hooks/data/delete.ts","../src/form/useClearRestoreValue.tsx","../src/hooks/useResolvedNavigationFrom.tsx","../src/hooks/useModeController.tsx","../src/hooks/useClipboard.tsx","../src/hooks/useLargeLayout.tsx","../src/components/ErrorTooltip.tsx","../src/components/ErrorView.tsx","../src/preview/components/EmptyValue.tsx","../src/preview/util.ts","../src/preview/components/ImagePreview.tsx","../src/preview/components/UrlComponentPreview.tsx","../src/preview/property_previews/SkeletonPropertyComponent.tsx","../src/preview/components/StorageThumbnail.tsx","../src/preview/components/EnumValuesChip.tsx","../src/preview/property_previews/StringPropertyPreview.tsx","../src/preview/property_previews/ArrayPropertyPreview.tsx","../src/preview/components/ReferencePreview.tsx","../src/preview/property_previews/ArrayOfReferencesPreview.tsx","../src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx","../src/preview/components/ArrayEnumPreview.tsx","../src/preview/property_previews/ArrayPropertyEnumPreview.tsx","../src/preview/property_previews/ArrayOfStringsPreview.tsx","../src/preview/property_previews/ArrayOneOfPreview.tsx","../src/preview/property_previews/MapPropertyPreview.tsx","../src/preview/components/DatePreview.tsx","../src/preview/components/BooleanPreview.tsx","../src/preview/property_previews/NumberPropertyPreview.tsx","../src/preview/PropertyPreview.tsx","../src/preview/property_previews/ArrayOfMapsPreview.tsx","../src/preview/components/AsyncPreviewComponent.tsx","../src/components/EntityPreview.tsx","../src/components/EntityCollectionTable/internal/common.tsx","../src/components/VirtualTable/fields/VirtualTableInput.tsx","../src/components/VirtualTable/fields/VirtualTableSelect.tsx","../src/components/VirtualTable/fields/VirtualTableNumberInput.tsx","../src/components/VirtualTable/fields/VirtualTableSwitch.tsx","../src/components/VirtualTable/fields/VirtualTableDateField.tsx","../src/components/ErrorBoundary.tsx","../src/util/storage.ts","../src/util/useStorageUploadController.tsx","../src/form/components/StorageUploadProgress.tsx","../src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx","../src/components/EntityCollectionTable/fields/TableStorageUpload.tsx","../src/components/EntityCollectionTable/fields/TableReferenceField.tsx","../src/form/validation.ts","../src/components/VirtualTable/common.tsx","../src/components/EntityCollectionTable/internal/EntityTableCell.tsx","../src/components/EntityCollectionTable/internal/PropertyTableCell.tsx","../src/components/CircularProgressCenter.tsx","../src/components/VirtualTable/VirtualTableHeader.tsx","../src/components/VirtualTable/VirtualTableHeaderRow.tsx","../src/components/VirtualTable/VirtualTableRow.tsx","../src/components/VirtualTable/VirtualTableCell.tsx","../src/components/VirtualTable/VirtualTable.tsx","../src/components/EntityCollectionTable/internal/EntityCollectionRowActions.tsx","../src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx","../src/components/EntityCollectionTable/filters/ReferenceFilterField.tsx","../src/components/EntityCollectionTable/filters/StringNumberFilterField.tsx","../src/components/EntityCollectionTable/filters/BooleanFilterField.tsx","../src/components/EntityCollectionTable/filters/DateTimeFilterField.tsx","../src/components/EntityCollectionView/useColumnsIds.tsx","../src/components/EntityCollectionTable/EntityCollectionTable.tsx","../src/hooks/data/useDataOrder.ts","../src/components/EntityCollectionTable/useDebouncedData.ts","../src/components/EntityCollectionTable/useEntityCollectionTableController.tsx","../src/components/EntityCollectionTable/internal/DeleteEntityDialog.tsx","../src/util/arrays.ts","../src/components/EntityCollectionView/EntityCollectionViewActions.tsx","../src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx","../src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx","../src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx","../src/form/components/FormikArrayContainer.tsx","../src/form/components/SwitchControl.tsx","../src/form/components/FieldHelperText.tsx","../src/form/field_bindings/SelectFieldBinding.tsx","../src/form/field_bindings/MultiSelectBinding.tsx","../src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx","../src/form/components/StorageItemPreview.tsx","../src/form/field_bindings/StorageUploadFieldBinding.tsx","../src/form/field_bindings/TextFieldBinding.tsx","../src/form/field_bindings/SwitchFieldBinding.tsx","../src/form/field_bindings/DateTimeFieldBinding.tsx","../src/form/field_bindings/ReadOnlyFieldBinding.tsx","../src/form/field_bindings/ReferenceFieldBinding.tsx","../src/form/PropertyFieldBinding.tsx","../src/form/field_bindings/MapFieldBinding.tsx","../src/form/field_bindings/KeyValueFieldBinding.tsx","../src/form/field_bindings/RepeatFieldBinding.tsx","../src/form/field_bindings/BlockFieldBinding.tsx","../src/form/field_bindings/MarkdownFieldBinding.tsx","../src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx","../src/form/components/ErrorFocus.tsx","../src/form/components/CustomIdField.tsx","../src/components/EntityCollectionTable/internal/default_entity_actions.tsx","../src/form/EntityForm.tsx","../src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx","../src/components/EntityCollectionView/EntityCollectionView.tsx","../src/components/ReferenceSelectionInner.tsx","../src/components/HomePage/NavigationGroup.tsx","../src/components/HomePage/NavigationCollectionCard.tsx","../src/components/HomePage/FavouritesView.tsx","../src/internal/useRestoreScroll.tsx","../src/components/HomePage/DefaultHomePage.tsx","../src/components/FieldConfigBadge.tsx","../src/components/NotFoundPage.tsx","../src/components/DeleteConfirmationDialog.tsx","../src/components/FireCMSLogo.tsx","../src/components/FireCMSAppBar.tsx","../src/components/ArrayContainer.tsx","../src/components/ReferenceWidget.tsx","../src/components/LabelWithIcon.tsx","../src/hooks/useReferenceDialog.tsx","../src/hooks/useBrowserTitleAndIcon.tsx","../src/internal/EntityView.tsx","../src/internal/useUnsavedChangesDialog.tsx","../src/core/SideDialogs.tsx","../src/core/EntitySidePanel.tsx","../src/internal/useBuildSideEntityController.tsx","../src/internal/useBuildSideDialogsController.tsx","../src/internal/useLocaleConfig.tsx","../src/util/parent_references_from_path.ts","../src/internal/useBuildNavigationController.tsx","../src/internal/useBuildDataSource.ts","../src/core/FireCMS.tsx","../src/core/Drawer.tsx","../src/core/Scaffold.tsx","../src/core/field_configs.tsx","../src/core/NavigationRoutes.tsx","../src/core/useBuildModeController.tsx","../src/core/useBuildLocalConfigurationPersistence.tsx"],"sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { SnackbarProvider as NotistackSnackbarProvider } from \"notistack\";\n\nexport const SnackbarProvider: React.FC<PropsWithChildren<{}>> = ({ children }) => {\n\n return (\n <NotistackSnackbarProvider maxSnack={3}\n autoHideDuration={3500}>\n {children}\n </NotistackSnackbarProvider>\n );\n};\n","import React from \"react\";\nimport { ModeController } from \"../hooks\";\n\nconst DEFAULT_MODE_STATE: ModeController = {\n mode: \"light\",\n setMode: (mode: \"light\" | \"dark\") => {\n },\n toggleMode: () => {\n }\n};\nexport const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);\n\nexport const ModeControllerProvider = ModeControllerContext.Provider;\n","import React from \"react\";\nimport { AuthController } from \"../types\";\n\nexport const AuthControllerContext = React.createContext<AuthController>({} as AuthController);\n","import { EntityCollection } from \"../types\";\n\nexport function removeInitialAndTrailingSlashes(s: string): string {\n return removeInitialSlash(removeTrailingSlash(s));\n}\n\nexport function removeInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s.slice(1);\n else return s;\n}\n\nexport function removeTrailingSlash(s: string) {\n if (s.endsWith(\"/\"))\n return s.slice(0, -1);\n else return s;\n}\n\nexport function addInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s;\n else return `/${s}`;\n}\n\nexport function getLastSegment(path: string) {\n const cleanPath = removeInitialAndTrailingSlashes(path);\n if (cleanPath.includes(\"/\")) {\n const segments = cleanPath.split(\"/\");\n return segments[segments.length - 1];\n }\n return cleanPath;\n}\n\nexport function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string {\n\n const cleanPath = removeInitialAndTrailingSlashes(path);\n const subpaths = cleanPath.split(\"/\");\n if (subpaths.length % 2 === 0) {\n throw Error(`resolveCollectionPathAliases: Collection paths must have an odd number of segments: ${path}`);\n }\n\n const aliasedCollection = allCollections.find((col) => col.id === subpaths[0]);\n let resolvedAliased;\n if (aliasedCollection) {\n resolvedAliased = aliasedCollection.path;\n }\n\n if (subpaths.length > 1) {\n const segmentCollection = getCollectionByPathOrId(resolvedAliased ?? subpaths[0], allCollections);\n if (!segmentCollection?.subcollections) {\n return cleanPath;\n }\n const restOfThePath = cleanPath.split(\"/\").slice(2).join(\"/\");\n return (resolvedAliased ?? subpaths[0]) + \"/\" + subpaths[1] + \"/\" + resolveCollectionPathIds(restOfThePath, segmentCollection.subcollections);\n } else {\n return resolvedAliased ?? cleanPath;\n }\n}\n\n/**\n * Find the corresponding view at any depth for a given path.\n * Note that path or segments of the paths can be collection aliases.\n * @param pathOrAlias\n * @param collections\n */\nexport function getCollectionByPathOrId(pathOrAlias: string, collections: EntityCollection[]): EntityCollection | undefined {\n\n const subpaths = removeInitialAndTrailingSlashes(pathOrAlias).split(\"/\");\n if (subpaths.length % 2 === 0) {\n throw Error(`getCollectionByPathOrAlias: Collection paths must have an odd number of segments: ${pathOrAlias}`);\n }\n\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n let result: EntityCollection | undefined;\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n const navigationEntry = collections && collections\n .sort((a, b) => (a.id ?? \"\").localeCompare(b.id ?? \"\"))\n .find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (navigationEntry) {\n\n if (subpathCombination === pathOrAlias) {\n result = navigationEntry;\n } else if (navigationEntry.subcollections) {\n const newPath = pathOrAlias.replace(subpathCombination, \"\").split(\"/\").slice(2).join(\"/\");\n if (newPath.length > 0)\n result = getCollectionByPathOrId(newPath, navigationEntry.subcollections);\n }\n }\n if (result) break;\n }\n return result;\n}\n\n/**\n * Get the subcollection combinations from a path:\n * \"sites/es/locales\" => [\"sites/es/locales\", \"sites\"]\n * @param subpaths\n */\nexport function getCollectionPathsCombinations(subpaths: string[]): string[] {\n const entries = subpaths.length > 0 && subpaths.length % 2 === 0 ? subpaths.splice(0, subpaths.length - 1) : subpaths;\n\n const length = entries.length;\n const result: string[] = [];\n for (let i = length; i > 0; i = i - 2) {\n result.push(entries.slice(0, i).join(\"/\"));\n }\n return result;\n\n}\n","/**\n * New or existing status\n * @group Models\n */\nexport type EntityStatus = \"new\" | \"existing\" | \"copy\";\n\n/**\n * Representation of an entity fetched from the datasource\n * @group Models\n */\nexport interface Entity<M extends object> {\n\n /**\n * ID of the entity\n */\n id: string;\n\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n path: string;\n\n /**\n * Current values\n */\n values: EntityValues<M>;\n}\n\n/**\n * This type represents a record of key value pairs as described in an\n * entity collection.\n * @group Models\n */\nexport type EntityValues<M extends object> = M;\n\n/**\n * Class used to create a reference to an entity in a different path\n */\nexport class EntityReference<M extends Record<string, any> = any> {\n /**\n * ID of the entity\n */\n readonly id: string;\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n readonly path: string;\n\n constructor(id: string, path: string) {\n this.id = id;\n this.path = path;\n }\n\n get pathWithId() {\n return `${this.path}/${this.id}`;\n }\n}\n\nexport class GeoPoint {\n\n /**\n * The latitude of this GeoPoint instance.\n */\n readonly latitude: number;\n /**\n * The longitude of this GeoPoint instance.\n */\n readonly longitude: number;\n\n constructor(latitude: number, longitude: number) {\n this.latitude = latitude;\n this.longitude = longitude;\n }\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"../types\";\n\nexport const pick: <T>(obj: T, ...args: any[]) => T = (obj: any, ...args: any[]) => ({\n ...args.reduce((res, key) => ({\n ...res,\n [key]: obj[key]\n }), {})\n});\n\nexport function isObject(item: any) {\n return item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function mergeDeep<T extends object>(target: T, source: any): T {\n const targetIsObject = isObject(target);\n const output: T = targetIsObject ? { ...target } : target;\n if (targetIsObject && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target))\n Object.assign(output, { [key]: source[key] });\n else\n (output as any)[key] = mergeDeep((target as any)[key], source[key]);\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n}\n\n// export function getValueInPath(o: object | undefined, path: string): any {\n// if (!o) return undefined;\n// if (typeof o === \"object\") {\n// if (path in o) {\n// return (o as any)[path];\n// }\n// if (path.includes(\".\")) {\n// const pathSegments = path.split(\".\");\n// return getValueInPath((o as any)[pathSegments[0]], pathSegments.slice(1).join(\".\"))\n// }\n// }\n// return undefined;\n// }\n\nexport function getValueInPath(o: object | undefined, path: string): any {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as any)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as any)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? (o as any)[firstSegment][parseInt(pathSegments[1])]\n : (o as any)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject, nextPath)\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n let currentObject = { ...o };\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n currentObject = (currentObject as any)[part]\n }\n if (last)\n delete (currentObject as any)[last];\n return currentObject;\n}\n\nexport function removeFunctions(o: object | undefined): any {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a, ...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T) {\n if (!v) return null;\n if (typeof v === \"object\") {\n if (\"id\" in v)\n return (v as any).id;\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: any, removeEmptyStrings?: boolean): any {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: any) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n const res: object = {};\n if (value === null)\n return value;\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value)) {\n const childRes = removeUndefined(value[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes) && shouldKeepIfString)\n (res as any)[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: any, comparison: any) {\n const isObject = (val: any) => typeof val === \"object\" && val !== null;\n const isArray = (val: any) => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n isArray(res) ? res.splice(key, 1) : delete res[key];\n }\n }\n });\n\n return res;\n}\n","export const DEFAULT_ONE_OF_TYPE = \"type\"\nexport const DEFAULT_ONE_OF_VALUE = \"value\"\n","import {\n CMSType,\n DataType,\n Entity,\n EntityReference,\n EntityStatus,\n EntityValues,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyBuilder,\n PropertyOrBuilder,\n ResolvedProperties,\n ResolvedProperty\n} from \"../types\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"./common\";\n\nexport function isReadOnly(property: Property | ResolvedProperty): boolean {\n if (property.readOnly)\n return true;\n if (property.dataType === \"date\") {\n if (property.autoValue)\n return true;\n }\n if (property.dataType === \"reference\") {\n return !property.path;\n }\n return false;\n}\n\nexport function isHidden(property: Property | ResolvedProperty): boolean {\n return typeof property.disabled === \"object\" && Boolean(property.disabled.hidden);\n}\n\nexport function isPropertyBuilder<T extends CMSType, M extends Record<string, any>>(propertyOrBuilder?: PropertyOrBuilder<T, M> | Property<T> | ResolvedProperty<T>): propertyOrBuilder is PropertyBuilder<T, M> {\n return typeof propertyOrBuilder === \"function\";\n}\n\nexport function getDefaultValuesFor<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties<M>): Partial<EntityValues<M>> {\n if (!properties) return {};\n return Object.entries(properties)\n .map(([key, property]) => {\n const value = getDefaultValueFor(property as PropertyOrBuilder);\n return value === undefined ? {} : { [key]: value };\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;\n}\n\nexport function getDefaultValueFor(property: PropertyOrBuilder) {\n if (isPropertyBuilder(property)) return undefined;\n if (property.dataType === \"map\" && property.properties) {\n const defaultValuesFor = getDefaultValuesFor(property.properties as Properties);\n if (Object.keys(defaultValuesFor).length === 0) return undefined;\n return defaultValuesFor;\n } else if (property.defaultValue) {\n return property.defaultValue;\n } else {\n return getDefaultValueForDataType(property.dataType);\n }\n}\n\nexport function getDefaultValueForDataType(dataType: DataType) {\n if (dataType === \"string\") {\n return null;\n } else if (dataType === \"number\") {\n return null;\n } else if (dataType === \"boolean\") {\n return false;\n } else if (dataType === \"date\") {\n return null;\n } else if (dataType === \"array\") {\n return [];\n } else if (dataType === \"map\") {\n return {};\n } else {\n return null;\n }\n}\n\n/**\n * Update the automatic values in an entity before save\n * @group Datasource\n */\nexport function updateDateAutoValues<M extends Record<string, any>>({\n inputValues,\n properties,\n status,\n timestampNowValue,\n setDateToMidnight\n }:\n {\n inputValues: Partial<EntityValues<M>>,\n properties: ResolvedProperties<M>,\n status: EntityStatus,\n timestampNowValue: any,\n setDateToMidnight: (input?: any) => any | undefined\n }): EntityValues<M> {\n return traverseValuesProperties(\n inputValues,\n properties,\n (inputValue, property) => {\n if (property.dataType === \"date\") {\n let resultDate;\n if (status === \"existing\" && property.autoValue === \"on_update\") {\n resultDate = timestampNowValue;\n } else if ((status === \"new\" || status === \"copy\") &&\n (property.autoValue === \"on_update\" || property.autoValue === \"on_create\")) {\n resultDate = timestampNowValue;\n } else {\n resultDate = inputValue;\n }\n if (property.mode === \"date\")\n resultDate = setDateToMidnight(resultDate);\n return resultDate;\n } else {\n return inputValue;\n }\n }\n ) ?? {} as M;\n}\n\n/**\n * Add missing required fields, expected in the collection, to the values of an entity\n * @param values\n * @param properties\n * @group Datasource\n */\nexport function sanitizeData<M extends Record<string, any>>\n(\n values: EntityValues<M>,\n properties: ResolvedProperties<M>\n) {\n const result: any = values;\n Object.entries(properties)\n .forEach(([key, property]) => {\n if (values && values[key] !== undefined) result[key] = values[key];\n else if ((property as Property).validation?.required) result[key] = null;\n });\n return result;\n}\n\nexport function getReferenceFrom<M extends Record<string, any>>(entity: Entity<M>): EntityReference<M> {\n return new EntityReference(entity.id, entity.path);\n}\n\nexport function traverseValuesProperties<M extends Record<string, any>>(\n inputValues: Partial<EntityValues<M>>,\n properties: ResolvedProperties<M>,\n operation: (value: any, property: Property) => any\n): EntityValues<M> | undefined {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = traverseValueProperty(inputValue, property as Property, operation);\n if (updatedValue === undefined) return undefined;\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;\n const result = { ...inputValues, ...updatedValues };\n if (Object.keys(result).length === 0) return undefined;\n return result;\n}\n\nexport function traverseValueProperty(inputValue: any,\n property: Property,\n operation: (value: any, property: Property) => any): any {\n\n let value;\n if (property.dataType === \"map\" && property.properties) {\n value = traverseValuesProperties(inputValue, property.properties as ResolvedProperties, operation);\n } else if (property.dataType === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n value = inputValue.map((e) => traverseValueProperty(e, property.of as Property, operation));\n } else if (property.oneOf && Array.isArray(inputValue)) {\n const typeField = property.oneOf?.typeField ?? DEFAULT_ONE_OF_TYPE;\n const valueField = property.oneOf?.valueField ?? DEFAULT_ONE_OF_VALUE;\n value = inputValue.map((e) => {\n if (e === null) return null;\n if (typeof e !== \"object\") return e;\n const type = e[typeField];\n const childProperty = property.oneOf?.properties[type];\n if (!type || !childProperty) return e;\n return {\n [typeField]: type,\n [valueField]: traverseValueProperty(e[valueField], childProperty, operation)\n };\n });\n } else {\n value = inputValue;\n }\n } else {\n value = operation(inputValue, property);\n }\n\n return value;\n}\n","export function hashString(str: string): number {\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","import { hashString } from \"./hash\";\nimport { CHIP_COLORS, ChipColorKey, ChipColorScheme } from \"@firecms/ui\";\n\nexport function getColorSchemeForSeed(seed: string): ChipColorScheme {\n const hash: number = hashString(seed);\n const colorKeys = Object.keys(CHIP_COLORS);\n const index = hash % colorKeys.length;\n return CHIP_COLORS[colorKeys[index]];\n}\n\nexport function getColorSchemeForKey(key: ChipColorKey): ChipColorScheme {\n return CHIP_COLORS[key];\n}\n","import { EnumValueConfig, EnumValues } from \"../types\";\nimport { CHIP_COLORS, ChipColorScheme } from \"@firecms/ui\";\nimport { getColorSchemeForSeed } from \"./chip_utils\";\n\nexport function enumToObjectEntries(enumValues: EnumValues): EnumValueConfig[] {\n if (Array.isArray(enumValues)) {\n return enumValues;\n } else {\n return Object.entries(enumValues).map(([id, value]) => {\n if (typeof value === \"string\") {\n return {\n id,\n label: value\n }\n } else {\n return {\n ...value,\n id\n }\n }\n });\n }\n}\n\nexport function getLabelOrConfigFrom(enumValues: EnumValueConfig[], key?: string | number): EnumValueConfig | undefined {\n if (!key) return undefined;\n return enumValues.find((entry) => String(entry.id) === String(key));\n}\n\nexport function getColorScheme(enumValues: EnumValueConfig[], key: string | number): ChipColorScheme | undefined {\n const labelOrConfig = getLabelOrConfigFrom(enumValues, key);\n if (!labelOrConfig?.color)\n return getColorSchemeForSeed(key.toString());\n if (typeof labelOrConfig === \"object\" && \"color\" in labelOrConfig) {\n if (typeof labelOrConfig.color === \"string\")\n return CHIP_COLORS[labelOrConfig.color];\n if (typeof labelOrConfig.color === \"object\")\n return labelOrConfig.color;\n }\n return undefined;\n}\n\nexport function isEnumValueDisabled(labelOrConfig?: string | EnumValueConfig) {\n return typeof labelOrConfig === \"object\" && (labelOrConfig as EnumValueConfig).disabled;\n}\n\nexport function buildEnumLabel(\n labelOrConfig?: string | EnumValueConfig\n): string | undefined {\n if (labelOrConfig === undefined)\n return undefined;\n if (typeof labelOrConfig === \"object\") {\n return labelOrConfig.label;\n } else {\n return labelOrConfig;\n }\n}\n","import {\n ArrayProperty,\n CMSType,\n EntityCollection,\n EntityCustomView,\n EntityValues,\n EnumValueConfig,\n EnumValues,\n NumberProperty,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n ResolvedArrayProperty,\n ResolvedEntityCollection,\n ResolvedNumberProperty,\n ResolvedProperties,\n ResolvedProperty,\n ResolvedStringProperty,\n StringProperty,\n UserConfigurationPersistence\n} from \"../types\";\nimport { getValueInPath, mergeDeep } from \"./objects\";\nimport { getDefaultValuesFor, isPropertyBuilder } from \"./entities\";\nimport { DEFAULT_ONE_OF_TYPE } from \"./common\";\nimport { getIn } from \"formik\";\nimport { enumToObjectEntries } from \"./enums\";\nimport { isDefaultFieldConfigId } from \"../core\";\n\n// import util from \"util\";\n\nexport const resolveCollection = <M extends Record<string, any>, >\n({\n collection,\n path,\n entityId,\n values,\n previousValues,\n userConfigPersistence,\n fields\n }: {\n collection: EntityCollection<M> | ResolvedEntityCollection<M>;\n path: string,\n entityId?: string,\n values?: Partial<EntityValues<M>>,\n previousValues?: Partial<EntityValues<M>>,\n userConfigPersistence?: UserConfigurationPersistence;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedEntityCollection<M> => {\n\n const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);\n const storedProperties = getValueInPath(collectionOverride, \"properties\");\n\n const defaultValues = getDefaultValuesFor(collection.properties);\n const usedValues = values ?? defaultValues;\n const usedPreviousValues = previousValues ?? values ?? defaultValues;\n\n const resolvedProperties = Object.entries(collection.properties)\n .map(([key, propertyOrBuilder]) => {\n const propertyValue = usedValues ? getIn(usedValues, key) : undefined;\n const childResolvedProperty = resolveProperty({\n propertyKey: key,\n propertyOrBuilder: propertyOrBuilder as PropertyOrBuilder | ResolvedProperty,\n values: usedValues,\n previousValues: usedPreviousValues,\n path,\n propertyValue,\n entityId,\n fields\n });\n if (!childResolvedProperty) return {};\n return ({\n [key]: childResolvedProperty\n });\n })\n .filter((a) => a !== null)\n .reduce((a, b) => ({ ...a, ...b }), {}) as ResolvedProperties<M>;\n\n const properties: Properties = mergeDeep(resolvedProperties, storedProperties);\n const cleanedProperties = Object.entries(properties)\n .filter(([_, property]) => Boolean(property?.dataType))\n .map(([id, property]) => ({ [id]: property }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n\n return {\n ...collection,\n properties: cleanedProperties,\n originalCollection: collection\n } as ResolvedEntityCollection<M>;\n\n};\n\n/**\n * Resolve property builders, enums and arrays.\n * @param propertyOrBuilder\n * @param propertyValue\n * @param values\n */\nexport function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({\n propertyOrBuilder,\n propertyValue,\n fromBuilder = false,\n ...props\n }: {\n propertyKey?: string,\n propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>,\n propertyValue?: unknown,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig<any>>;\n}): ResolvedProperty<T> | null {\n\n if (typeof propertyOrBuilder === \"object\" && \"resolved\" in propertyOrBuilder) {\n return propertyOrBuilder as ResolvedProperty<T>;\n }\n\n let resolvedProperty: ResolvedProperty<T> | null = null;\n\n if (!propertyOrBuilder) {\n return null;\n } else if (isPropertyBuilder(propertyOrBuilder)) {\n const path = props.path;\n if (!path)\n throw Error(\"Trying to resolve a property builder without specifying the entity path\");\n\n const result: Property<T> | null = propertyOrBuilder({\n ...props,\n path,\n propertyValue,\n values: props.values ?? {},\n previousValues: props.previousValues ?? props.values ?? {}\n });\n\n if (!result) {\n return null;\n }\n\n resolvedProperty = resolveProperty({\n ...props,\n propertyValue,\n propertyOrBuilder: result,\n fromBuilder: true\n });\n } else {\n const property = propertyOrBuilder as Property<T>;\n if (property.dataType === \"map\" && property.properties) {\n const properties = resolveProperties({\n ...props,\n properties: property.properties,\n propertyValue\n });\n resolvedProperty = {\n ...property,\n resolved: true,\n fromBuilder,\n properties\n } as ResolvedProperty<T>;\n } else if (property.dataType === \"array\") {\n resolvedProperty = resolveArrayProperty({\n property,\n propertyValue,\n fromBuilder,\n ...props\n }) as ResolvedProperty<any>;\n } else if ((property.dataType === \"string\" || property.dataType === \"number\") && property.enumValues) {\n resolvedProperty = resolvePropertyEnum(property, fromBuilder) as ResolvedProperty<any>;\n }\n }\n\n if (!resolvedProperty) {\n resolvedProperty = {\n ...propertyOrBuilder,\n resolved: true,\n fromBuilder\n } as ResolvedProperty<T>;\n }\n\n if (resolvedProperty.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {\n const cmsFields = props.fields;\n if (!cmsFields) {\n throw Error(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property configs were provided. Use the property \\`propertyConfigs\\` in your app config to provide them`);\n }\n const customField: PropertyConfig<any> = cmsFields[resolvedProperty.propertyConfig];\n if (!customField) {\n console.warn(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property config with that key was found. Check the \\`propertyConfigs\\` in your app config`)\n console.warn(\"Available property configs\", cmsFields);\n return null;\n }\n if (customField.property) {\n const configPropertyOrBuilder = customField.property;\n if (\"propertyConfig\" in configPropertyOrBuilder) {\n delete configPropertyOrBuilder.propertyConfig;\n }\n const customFieldProperty = resolveProperty<any>({\n propertyOrBuilder: configPropertyOrBuilder,\n propertyValue,\n ...props\n });\n if (customFieldProperty) {\n resolvedProperty = mergeDeep(customFieldProperty, resolvedProperty);\n }\n }\n\n }\n\n return resolvedProperty\n ? {\n ...resolvedProperty,\n resolved: true\n }\n : null;\n}\n\nexport function resolveArrayProperty<T extends any[], M>({\n propertyKey,\n property,\n propertyValue,\n ...props\n }: {\n propertyKey?: string,\n property: ArrayProperty<T> | ResolvedArrayProperty<T>,\n propertyValue: any,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedArrayProperty {\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder,\n resolvedProperties: property.of.map((p, index) => {\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: p as Property<any>,\n propertyValue: Array.isArray(propertyValue) ? propertyValue[index] : undefined,\n ...props,\n index\n });\n })\n } as ResolvedArrayProperty;\n } else {\n const of = property.of;\n const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)\n ? propertyValue.map((v: any, index: number) => resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: of,\n propertyValue: v,\n ...props,\n index\n })).filter(e => Boolean(e)) as ResolvedProperty[]\n : [];\n const ofProperty = resolveProperty({\n propertyKey: `${propertyKey}`,\n propertyOrBuilder: of,\n propertyValue: undefined,\n ...props\n });\n if (!ofProperty)\n throw Error(\"When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property\")\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder,\n of: ofProperty,\n resolvedProperties\n } as ResolvedArrayProperty;\n }\n } else if (property.oneOf) {\n const typeField = property.oneOf?.typeField ?? DEFAULT_ONE_OF_TYPE;\n const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)\n ? propertyValue.map((v, index) => {\n const type = v && v[typeField];\n const childProperty = property.oneOf?.properties[type];\n if (!type || !childProperty) return null;\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: childProperty,\n propertyValue,\n ...props\n });\n }).filter(e => Boolean(e)) as ResolvedProperty[]\n : [];\n const properties = resolveProperties<any>({\n properties: property.oneOf.properties,\n propertyValue: undefined,\n ...props\n });\n return {\n ...property,\n resolved: true,\n oneOf: {\n ...property.oneOf,\n properties\n },\n fromBuilder: props.fromBuilder,\n resolvedProperties\n } as ResolvedArrayProperty;\n } else if (!property.Field) {\n throw Error(\"The array property needs to declare an 'of' or a 'oneOf' property, or provide a custom `Field`\")\n } else {\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder\n } as ResolvedArrayProperty;\n }\n\n}\n\n/**\n * Resolve enums and arrays for properties\n * @param properties\n * @param value\n */\nexport function resolveProperties<M extends Record<string, any>>({\n properties,\n propertyValue,\n ...props\n }: {\n properties: PropertiesOrBuilders<M>,\n propertyValue: unknown,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedProperties<M> {\n return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)\n .map(([key, property]) => {\n const thisPropertyValue = propertyValue && typeof propertyValue === \"object\" ? getValueInPath(propertyValue, key) : undefined;\n const childResolvedProperty = resolveProperty({\n propertyKey: key,\n propertyOrBuilder: property,\n propertyValue: thisPropertyValue,\n ...props\n });\n if (!childResolvedProperty) return {};\n return {\n [key]: childResolvedProperty\n };\n })\n .filter((a) => a !== null)\n .reduce((a, b) => ({ ...a, ...b }), {}) as ResolvedProperties<M>;\n}\n\n/**\n * Resolve enum aliases for a string or number property\n * @param property\n * @param fromBuilder\n */\nexport function resolvePropertyEnum(property: StringProperty | NumberProperty, fromBuilder?: boolean): ResolvedStringProperty | ResolvedNumberProperty {\n if (typeof property.enumValues === \"object\") {\n return {\n ...property,\n resolved: true,\n enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && value.id && value.label) ?? [],\n fromBuilder: fromBuilder ?? false\n }\n }\n return property as ResolvedStringProperty | ResolvedNumberProperty;\n}\n\nexport function resolveEnumValues(input: EnumValues): EnumValueConfig[] | undefined {\n if (typeof input === \"object\") {\n return Object.entries(input).map(([id, value]) =>\n (typeof value === \"string\"\n ? {\n id,\n label: value\n }\n : value));\n } else if (Array.isArray(input)) {\n return input as EnumValueConfig[];\n } else {\n return undefined;\n }\n}\n\nexport function resolveEntityView(entityView: string | EntityCustomView<any>, contextEntityViews?: EntityCustomView<any>[]): EntityCustomView<any> | undefined {\n if (typeof entityView === \"string\") {\n return contextEntityViews?.find((entry) => entry.key === entityView);\n } else {\n return entityView;\n }\n}\n","import { EntityCollection, EntityCustomView } from \"../types\";\nimport { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from \"./navigation_utils\";\nimport { resolveEntityView } from \"./resolutions\";\n\nexport type NavigationViewInternal<M extends Record<string, any> = any> =\n | NavigationViewEntityInternal<M>\n | NavigationViewCollectionInternal<M>\n | NavigationViewEntityCustomInternal<M>;\n\nexport interface NavigationViewEntityInternal<M extends Record<string, any>> {\n type: \"entity\";\n entityId: string;\n path: string;\n parentCollection: EntityCollection<M>;\n}\n\nexport interface NavigationViewCollectionInternal<M extends Record<string, any>> {\n type: \"collection\";\n path: string;\n collection: EntityCollection<M>;\n}\n\nexport interface NavigationViewEntityCustomInternal<M extends Record<string, any>> {\n type: \"custom_view\";\n path: string;\n view: EntityCustomView<M>;\n}\n\nexport function getNavigationEntriesFromPathInternal(props: {\n path: string,\n collections: EntityCollection[] | undefined,\n currentFullPath?: string,\n contextEntityViews?: EntityCustomView<any>[]\n}): NavigationViewInternal [] {\n\n const {\n path,\n collections = [],\n currentFullPath\n } = props;\n\n const subpaths = removeInitialAndTrailingSlashes(path).split(\"/\");\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n\n const result: NavigationViewInternal[] = [];\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n\n const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (collection) {\n const pathOrAlias = collection.id ?? collection.path;\n const collectionPath = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + pathOrAlias)\n : pathOrAlias;\n\n result.push({\n type: \"collection\",\n path: collectionPath,\n collection\n });\n const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, \"\"));\n const nextSegments = restOfThePath.length > 0 ? restOfThePath.split(\"/\") : [];\n if (nextSegments.length > 0) {\n const entityId = nextSegments[0];\n const fullPath = collectionPath + \"/\" + entityId;\n result.push({\n type: \"entity\",\n entityId,\n path: collectionPath,\n parentCollection: collection\n });\n if (nextSegments.length > 1) {\n const newPath = nextSegments.slice(1).join(\"/\");\n if (!collection) {\n throw Error(\"collection not found resolving path: \" + collection);\n }\n const entityViews = collection.entityViews;\n const customView = entityViews && entityViews\n .map((entry) => resolveEntityView(entry, props.contextEntityViews))\n .filter(Boolean)\n .find((entry) => entry!.key === newPath);\n if (customView) {\n const path = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + customView.key)\n : customView.key;\n result.push({\n type: \"custom_view\",\n path,\n view: customView\n });\n } else if (collection.subcollections) {\n result.push(...getNavigationEntriesFromPathInternal({\n path: newPath,\n collections: collection.subcollections,\n currentFullPath: fullPath,\n contextEntityViews: props.contextEntityViews\n }));\n }\n }\n }\n break;\n }\n\n }\n return result;\n}\n","import {\n DefaultSelectedViewBuilder,\n DefaultSelectedViewParams,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\n\nexport function sortProperties<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, propertiesOrder?: (keyof M)[]): PropertiesOrBuilders<M> {\n try {\n const propertiesKeys = Object.keys(properties);\n const allPropertiesOrder = propertiesOrder ?? propertiesKeys;\n return allPropertiesOrder\n .map((key) => {\n if (properties[key as keyof M]) {\n const property = properties[key] as PropertyOrBuilder;\n if (!isPropertyBuilder(property) && property?.dataType === \"map\" && property.properties) {\n return ({\n [key]: {\n ...property,\n properties: sortProperties(property.properties, property.propertiesOrder)\n }\n });\n } else {\n return ({ [key]: property });\n }\n } else {\n return undefined;\n }\n })\n .filter((a) => a !== undefined)\n .reduce((a: any, b: any) => ({ ...a, ...b }), {}) as PropertiesOrBuilders<M>;\n } catch (e) {\n console.error(\"Error sorting properties\", e);\n return properties;\n }\n}\n\nexport function resolveDefaultSelectedView(\n defaultSelectedView: string | DefaultSelectedViewBuilder | undefined,\n params: DefaultSelectedViewParams\n) {\n if (!defaultSelectedView) {\n return undefined;\n } else if (typeof defaultSelectedView === \"string\") {\n return defaultSelectedView;\n } else {\n return defaultSelectedView(params);\n }\n}\n","const kebabCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toKebabCase = (str: string) => {\n const regExpMatchArray = str.match(kebabCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toSnakeCase = (str: string) => {\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator) // Replace multiple separators with single one\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\");\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug: string): string {\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substr(1);\n });\n } else {\n return slug;\n }\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export const COLLECTION_PATH_SEPARATOR = \"::\";\n\n/**\n * Remove the entity ids from a given path\n * `products/B44RG6APH/locales` => `products::locales`\n * @param path\n */\nexport function stripCollectionPath(path: string): string {\n return segmentsToStrippedPath(fullPathToCollectionSegments(path));\n}\n\nexport function segmentsToStrippedPath(paths: string[]) {\n if (paths.length === 1)\n return paths[0];\n return paths.reduce((a, b) => `${a}${COLLECTION_PATH_SEPARATOR}${b}`);\n}\n\n/**\n * Extract the collection path routes\n * `products/B44RG6APH/locales` => [`products`, `locales`]\n * @param path\n */\nexport function fullPathToCollectionSegments(path: string): string[] {\n return path\n .split(\"/\")\n .filter((e, i) => i % 2 === 0);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","import React from \"react\";\n\nexport function useDebounce<T>(value: T, callback: () => void, immediate: boolean, timeoutMs = 300) {\n\n const pendingUpdate = React.useRef(false);\n const performUpdate = () => {\n callback();\n pendingUpdate.current = false;\n };\n\n const handlerRef = React.useRef<number | undefined>(undefined);\n\n React.useEffect(\n () => {\n pendingUpdate.current = true;\n clearTimeout(handlerRef.current);\n handlerRef.current = setTimeout(performUpdate, timeoutMs) as any;\n return () => {\n if (immediate)\n performUpdate();\n };\n },\n [immediate, value]\n );\n}\n","import React from \"react\";\n\nimport { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperty } from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\nimport { resolveProperty } from \"./resolutions\";\nimport { CircleIcon, FunctionsIcon } from \"@firecms/ui\";\nimport { getFieldConfig } from \"../core\";\n\nexport function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder,\n fields: Record<string, PropertyConfig>) {\n const resolvedProperty = resolveProperty({\n propertyKey: \"ignore\", // TODO\n propertyOrBuilder,\n fields\n });\n if (!resolvedProperty) return null;\n if (resolvedProperty.dataType === \"reference\") {\n return true;\n }\n if (resolvedProperty.dataType === \"array\") {\n if (Array.isArray(resolvedProperty.of)) return false;\n else return resolvedProperty.of?.dataType === \"reference\"\n }\n return false;\n}\n\nexport function getIdIcon(size: \"small\" | \"medium\" | \"large\"): React.ReactNode {\n return <CircleIcon size={size}/>;\n}\n\nexport function getIconForWidget(widget: PropertyConfig | undefined,\n size: \"small\" | \"medium\" | \"large\") {\n const Icon = widget?.Icon ?? CircleIcon;\n return <Icon size={size}/>;\n}\n\nexport function getIconForProperty(\n property: PropertyOrBuilder | ResolvedProperty,\n size: \"small\" | \"medium\" | \"large\" = \"small\",\n fields: Record<string, PropertyConfig> = {}\n): React.ReactNode {\n\n if (isPropertyBuilder(property)) {\n return <FunctionsIcon size={size}/>;\n } else {\n const widget = getFieldConfig(property, fields);\n return getIconForWidget(widget, size);\n }\n}\n\nexport function getColorForProperty(property: PropertyOrBuilder, fields: Record<string, PropertyConfig>): string {\n if (isPropertyBuilder(property)) {\n return \"#888\";\n } else {\n const widget = getFieldConfig(property, fields);\n return widget?.color ?? \"#666\";\n }\n}\n\n/**\n * Get a property in a property tree from a path like\n * `address.street`\n * @param properties\n * @param path\n */\nexport function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, path: string): PropertyOrBuilder<any, M> | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return properties[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = properties[pathSegments[0]];\n if (typeof childProperty === \"object\" && childProperty.dataType === \"map\" && childProperty.properties) {\n return getPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\nexport function getResolvedPropertyInPath(properties: Record<string, ResolvedProperty>, path: string): ResolvedProperty | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return properties[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = properties[pathSegments[0]];\n if (childProperty.dataType === \"map\" && childProperty.properties) {\n return getResolvedPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\n// replace the dot notation with brackets\n// address.street => address[street]\nexport function getBracketNotation(path: string): string {\n return path.replace(/\\.([^.]*)/g, \"[$1]\");\n}\n\n/**\n * Get properties exclusively indexed by their order\n * @param properties\n * @param propertiesOrder\n */\nexport function getPropertiesWithPropertiesOrder<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, propertiesOrder?: Extract<keyof M, string>[]): PropertiesOrBuilders<M> {\n if (!propertiesOrder) return properties;\n const result: PropertiesOrBuilders<any> = {};\n propertiesOrder.filter(Boolean).forEach(path => {\n const property = getPropertyInPath(properties, path);\n if (typeof property === \"object\" && property.dataType === \"map\" && property.properties) {\n result[path] = {\n ...property,\n properties: getPropertiesWithPropertiesOrder(property.properties, property.propertiesOrder ?? [])\n }\n }\n if (property) {\n result[path] = property;\n }\n });\n return result;\n}\n\nexport function getDefaultPropertiesOrder(collection: EntityCollection<any>): string[] {\n if (collection.propertiesOrder) return collection.propertiesOrder;\n return [...Object.keys(collection.properties), ...(collection.additionalFields ?? []).map(field => field.key)];\n}\n","import { AuthController, Entity, EntityCollection, Permissions, User } from \"../types\";\n\nconst DEFAULT_PERMISSIONS = {\n read: true,\n edit: true,\n create: true,\n delete: true\n};\n\nexport function resolvePermissions<M extends Record<string, any>, UserType extends User>\n(collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n pathSegments: string[],\n entity: Entity<M> | null): Permissions {\n\n const permission = collection.permissions;\n if (permission === undefined) {\n return DEFAULT_PERMISSIONS;\n } else if (typeof permission === \"object\") {\n return permission as Permissions;\n } else if (typeof permission === \"function\") {\n return permission({\n entity,\n user: authController.user,\n authController,\n collection,\n pathSegments\n });\n }\n console.error(\"Permissions:\", permission);\n throw Error(\"New type of permission added and not mapped\");\n}\n\nexport function canEditEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n paths: string[],\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, paths, entity).edit ?? DEFAULT_PERMISSIONS.edit;\n}\n\nexport function canCreateEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n paths: string[],\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, paths, entity).create ?? DEFAULT_PERMISSIONS.create;\n}\n\nexport function canDeleteEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n paths: string[],\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, paths, entity).delete ?? DEFAULT_PERMISSIONS.delete;\n}\n\n// export function resolveCollectionsPermissions(roles: Role[]): Record<string, Permissions> {\n// const collectionIds = Array.from(new Set(roles.flatMap(role => Object.keys(role.collections))));\n// return collectionIds\n// .map((colId) => {\n// const rolesWithCollection = roles.filter((role) => colId in Object.keys(role.collections));\n// return {\n// [colId]: rolesWithCollection\n// .map(role => role.collections[colId])\n// .reduce((permA, permB) => {\n// return {\n// read: permA.read ?? permB.read ?? false,\n// create: permA.create ?? permB.create ?? false,\n// edit: permA.edit ?? permB.edit ?? false,\n// delete: permA.delete ?? permB.delete ?? false\n// };\n// })\n// };\n// })\n// .reduce((a, b) => ({ ...a, ...b }), {});\n// }\n","import React from \"react\";\nimport { CMSView, EntityCollection } from \"../types\";\nimport { hashString } from \"./hash\";\nimport { coolIconKeys, Icon, iconKeys } from \"@firecms/ui\";\nimport { slugify } from \"./strings\";\n\nexport function getIcon(iconKey?: string, className?:string): React.ReactElement | undefined {\n if (!iconKey) return undefined;\n iconKey = slugify(iconKey);\n if (!(iconKey in iconKeysMap)) {\n return undefined;\n }\n return iconKey in iconKeysMap ? <Icon iconKey={iconKey} size={\"medium\"} className={className}/> : undefined;\n}\n\nexport function getIconForView(collectionOrView: EntityCollection | CMSView, className?:string): React.ReactElement {\n\n const icon = getIcon(collectionOrView.icon, className);\n if (collectionOrView?.icon && icon)\n return icon;\n\n let slugName = slugify((\"singularName\" in collectionOrView ? collectionOrView.singularName : undefined) ?? collectionOrView.name);\n\n let key: string | undefined;\n if (slugName in iconKeysMap)\n key = slugName;\n\n if (!key) {\n slugName = slugify(collectionOrView.path);\n if (slugName in iconKeysMap)\n key = slugName;\n }\n\n const iconsCount = coolIconKeys.length;\n\n if (!key)\n key = coolIconKeys[hashString(collectionOrView.path) % iconsCount];\n\n return <Icon iconKey={key} size={\"medium\"} className={className}/>;\n}\n\nconst iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {\n acc[key] = key;\n return acc;\n}, {});\n","/**\n * Returns the plural of an English word.\n *\n * @export\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @export\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","import { EntityCollection, PropertyConfig } from \"../types\";\nimport { isReferenceProperty } from \"./property_utils\";\nimport { isPropertyBuilder } from \"./entities\";\n\nexport function getReferencePreviewKeys(targetCollection: EntityCollection<any>,\n fields: Record<string, PropertyConfig>,\n previewProperties?: string[],\n limit = 3) {\n const allProperties = Object.keys(targetCollection.properties);\n let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));\n if (listProperties && listProperties.length > 0) {\n return listProperties;\n } else {\n listProperties = allProperties;\n return listProperties.filter(key => {\n const propertyOrBuilder = targetCollection.properties[key];\n return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(propertyOrBuilder, fields);\n }).slice(0, limit);\n }\n}\n","export function flattenObject(obj: any, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: any, index: number) => {\n Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key], newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: any });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: any[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: any) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","import { Properties, PropertiesOrBuilders } from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\n\nexport function makePropertiesEditable(properties: Properties) {\n Object.keys(properties).forEach((key) => {\n const property = properties[key];\n property.editable = true;\n if (property.dataType === \"map\" && property.properties) {\n makePropertiesEditable(property.properties as Properties);\n }\n });\n return properties;\n}\n\nexport function makePropertiesNonEditable(properties: PropertiesOrBuilders): PropertiesOrBuilders {\n return Object.entries(properties).reduce((acc, [key, property]) => {\n if (!isPropertyBuilder(property) && property.dataType === \"map\" && property.properties) {\n const updated = { ...property, properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders) };\n acc[key] = updated;\n }\n if (isPropertyBuilder(property)) {\n acc[key] = property;\n } else {\n acc[key] = { ...property, editable: false };\n }\n return acc;\n }, {} as PropertiesOrBuilders);\n\n}\n","import {\n EntityCollection,\n MapProperty,\n ModifyCollectionProps,\n PropertiesOrBuilders,\n Property,\n PropertyOrBuilder\n} from \"../types\";\nimport { mergeDeep } from \"./objects\";\nimport { sortProperties } from \"./collections\";\nimport { isPropertyBuilder } from \"./entities\";\n\nfunction applyModifyFunction(modifyCollection: ((props: ModifyCollectionProps) => (EntityCollection | void)) | undefined,\n collection: EntityCollection,\n parentPaths: string[]) {\n if (modifyCollection) {\n const modified = modifyCollection({\n collection,\n parentPaths\n });\n const resCollection = modified ?? collection;\n if (resCollection.subcollections) {\n resCollection.subcollections = resCollection.subcollections.map((subcollection) => {\n return applyModifyFunction(modifyCollection, subcollection, [...parentPaths, collection.path]);\n });\n }\n return resCollection;\n } else {\n return collection;\n }\n}\n\n/**\n *\n */\nexport function joinCollectionLists(targetCollections: EntityCollection[],\n sourceCollections: EntityCollection[] | undefined,\n parentPaths: string[] = [],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void): EntityCollection[] {\n\n // merge collections that are in both lists\n const updatedCollections = (sourceCollections ?? [])\n .map((sourceCol) => {\n const targetCol = targetCollections?.find((collection) => {\n return collection.id === sourceCol.id;\n // return collection.path === codedCollection.path || collection.id && codedCollection.id;\n });\n if (!targetCol) {\n return applyModifyFunction(modifyCollection, sourceCol, parentPaths);\n } else {\n return mergeCollection(targetCol, sourceCol, parentPaths, modifyCollection);\n }\n });\n\n const sourceCollectionIds = updatedCollections.map(c => c.id);\n // fetched collections that are not in the source collections\n const resultStoredCollections = targetCollections\n .filter((col) => {\n return !sourceCollectionIds.includes(col.id);\n })\n .map((col) => {\n if (modifyCollection) {\n return applyModifyFunction(modifyCollection, col, parentPaths);\n } else {\n return col;\n }\n });\n\n return [...updatedCollections, ...resultStoredCollections];\n}\n\n/**\n *\n */\nexport function mergeCollection(target: EntityCollection,\n source: EntityCollection,\n parentPaths: string[] = [],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void\n): EntityCollection {\n\n const subcollectionsMerged = joinCollectionLists(\n target?.subcollections ?? [],\n source?.subcollections ?? [],\n [...parentPaths, target.path],\n modifyCollection\n );\n\n const propertiesMerged: PropertiesOrBuilders = { ...target.properties } as PropertiesOrBuilders;\n Object.keys(source.properties).forEach((key) => {\n const property = target.properties[key] as Property;\n if (property)\n propertiesMerged[key] = mergePropertyOrBuilder(property, source.properties[key] as PropertyOrBuilder);\n else\n propertiesMerged[key] = source.properties[key] as PropertyOrBuilder;\n });\n\n const mergedCollection = mergeDeep(target, source);\n const targetPropertiesOrder = getCollectionKeys(target);\n const sourcePropertiesOrder = getCollectionKeys(source);\n const mergedPropertiesOrder = [...new Set([...sourcePropertiesOrder, ...targetPropertiesOrder])];\n const mergedEntityViews = [...new Set([...(target.entityViews ?? []), ...(source.entityViews ?? [])])];\n\n let resultCollection: EntityCollection = {\n ...mergedCollection,\n subcollections: subcollectionsMerged,\n properties: sortProperties(propertiesMerged, mergedPropertiesOrder),\n propertiesOrder: mergedPropertiesOrder,\n entityViews: mergedEntityViews\n };\n if (modifyCollection) {\n const modifiedCollection = modifyCollection({\n collection: resultCollection,\n parentPaths\n });\n if (modifiedCollection)\n resultCollection = modifiedCollection;\n }\n return resultCollection\n}\n\nfunction mergePropertyOrBuilder(target: PropertyOrBuilder, source: PropertyOrBuilder): PropertyOrBuilder {\n if (isPropertyBuilder(source)) {\n return source;\n } else if (isPropertyBuilder(target)) {\n return target;\n } else {\n const mergedProperty = mergeDeep(target, source);\n const targetEditable = Boolean(target.editable);\n const sourceEditable = Boolean(source.editable);\n if (source.dataType === \"map\" && source.properties) {\n const targetProperties = (\"properties\" in target ? target.properties : {}) as PropertiesOrBuilders;\n const sourceProperties = (\"properties\" in source ? source.properties : {}) as PropertiesOrBuilders;\n const targetPropertiesOrder = \"propertiesOrder\" in target && target.propertiesOrder ? target.propertiesOrder : Object.keys(targetProperties);\n const sourcePropertiesOrder = \"propertiesOrder\" in source && source.propertiesOrder ? source.propertiesOrder : (\"properties\" in source ? Object.keys(source.properties) : []);\n const mergedPropertiesOrder = [...new Set([...targetPropertiesOrder, ...sourcePropertiesOrder])];\n const mergedProperties: PropertiesOrBuilders = { ...targetProperties } as PropertiesOrBuilders;\n Object.keys(source.properties).forEach((key) => {\n const property = targetProperties[key] as Property;\n if (property)\n mergedProperties[key] = mergePropertyOrBuilder(property, sourceProperties[key] as PropertyOrBuilder);\n });\n return {\n ...mergedProperty,\n editable: targetEditable && sourceEditable,\n properties: mergedProperties,\n propertiesOrder: mergedPropertiesOrder\n } as MapProperty;\n }\n return {\n ...mergedProperty,\n editable: targetEditable && sourceEditable\n };\n }\n}\n\nfunction getCollectionKeys(collection: EntityCollection) {\n if (collection.propertiesOrder && collection.propertiesOrder.length > 0) {\n const propertiesOrder = collection.propertiesOrder;\n if (collection.additionalFields) {\n collection.additionalFields.forEach((field) => {\n if (!propertiesOrder.includes(field.key)) {\n propertiesOrder.push(field.key);\n }\n });\n }\n return propertiesOrder;\n }\n return [\n ...Object.keys(collection.properties),\n ...(collection.additionalFields ?? [])?.map(f => f.key)\n ];\n}\n","import {\n AdditionalFieldDelegate,\n ArrayProperty,\n BooleanProperty,\n CMSType,\n DateProperty,\n EntityCallbacks,\n EntityCollection,\n EnumValueConfig,\n EnumValues,\n GeopointProperty,\n MapProperty,\n NumberProperty,\n PropertiesOrBuilders,\n PropertyBuilder,\n PropertyConfig,\n PropertyOrBuilder,\n ReferenceProperty,\n StringProperty,\n User\n} from \"../types\";\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * collection views with all its properties\n * @param collection\n * @group Builder\n */\nexport function buildCollection<M extends Record<string, any> = any,\n UserType extends User = User>(\n collection: EntityCollection<M, UserType>\n): EntityCollection<M, UserType> {\n return collection;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the property keys.\n * @param property\n * @group Builder\n */\nexport function buildProperty<T extends CMSType = CMSType, P extends PropertyOrBuilder<T> = PropertyOrBuilder<T>, M extends Record<string, any> = Record<string, any>>(\n property: P\n):\n P extends StringProperty ? StringProperty :\n P extends NumberProperty ? NumberProperty :\n P extends BooleanProperty ? BooleanProperty :\n P extends DateProperty ? DateProperty :\n P extends GeopointProperty ? GeopointProperty :\n P extends ReferenceProperty ? ReferenceProperty :\n P extends ArrayProperty ? ArrayProperty :\n P extends MapProperty ? MapProperty :\n P extends PropertyBuilder<T, M> ? PropertyBuilder<T, M> : never {\n return property as any;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param properties\n * @group Builder\n */\nexport function buildProperties<M extends Record<string, any>>(\n properties: PropertiesOrBuilders<M>\n): PropertiesOrBuilders<M> {\n return properties;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param propertiesOrBuilder\n * @group Builder\n */\nexport function buildPropertiesOrBuilder<M extends Record<string, any>>(\n propertiesOrBuilder: PropertiesOrBuilders<M>\n): PropertiesOrBuilders<M> {\n return propertiesOrBuilder;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param enumValues\n * @group Builder\n */\nexport function buildEnumValues(\n enumValues: EnumValues\n): EnumValues {\n return enumValues;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param enumValueConfig\n * @group Builder\n */\nexport function buildEnumValueConfig(\n enumValueConfig: EnumValueConfig\n): EnumValueConfig {\n return enumValueConfig;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param callbacks\n * @group Builder\n */\nexport function buildEntityCallbacks<M extends Record<string, any> = any>(\n callbacks: EntityCallbacks<M>\n): EntityCallbacks<M> {\n return callbacks;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * additional field delegates views with all its properties\n * @param additionalFieldDelegate\n * @group Builder\n */\nexport function buildAdditionalFieldDelegate<M extends Record<string, any>, UserType extends User = User>(\n additionalFieldDelegate: AdditionalFieldDelegate<M, UserType>\n): AdditionalFieldDelegate<M, UserType> {\n return additionalFieldDelegate;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * additional field delegates views with all its properties\n * @param propertyConfig\n * @group Builder\n */\nexport function buildFieldConfig<T extends CMSType = CMSType>(\n propertyConfig: PropertyConfig<T>\n): PropertyConfig<T> {\n return propertyConfig;\n}\n","export const CONTAINER_FULL_WIDTH = \"100vw\";\n\nexport const ADDITIONAL_TAB_WIDTH = \"55vw\";\n\nexport const FORM_CONTAINER_WIDTH = \"768px\";\n","import React from \"react\";\nimport { DataSource } from \"../types\";\n\nexport const DataSourceContext = React.createContext<DataSource>({} as DataSource);\n","import { useContext } from \"react\";\nimport { DataSource } from \"../../types\";\nimport { DataSourceContext } from \"../../contexts/DataSourceContext\";\n\n/**\n * Use this hook to get the datasource being used\n * @group Hooks and utilities\n */\nexport const useDataSource = (): DataSource => useContext(DataSourceContext);\n","import React from \"react\";\nimport { NavigationController } from \"../types\";\n\nexport const NavigationContext = React.createContext<NavigationController>({} as NavigationController);\n","import { useContext } from \"react\";\nimport { NavigationController } from \"../types\";\nimport { NavigationContext } from \"../contexts/NavigationContext\";\n\n/**\n * Use this hook to get the navigation of the app.\n * This controller provides the resolved collections for the CMS as well\n * as utility methods.\n *\n * @group Hooks and utilities\n */\nexport const useNavigationController = (): NavigationController => useContext(NavigationContext);\n","import { AuthController, User } from \"../types\";\nimport { useContext } from \"react\";\nimport { AuthControllerContext } from \"../contexts/AuthControllerContext\";\n\n/**\n * Hook to retrieve the AuthContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see AuthController\n * @group Hooks and utilities\n */\nexport const useAuthController = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): AuthControllerType => useContext(AuthControllerContext) as AuthControllerType;\n","import React from \"react\";\nimport { SideDialogsController } from \"../types\";\n\nexport const SideDialogsControllerContext = React.createContext<SideDialogsController>({} as SideDialogsController);\n","import { SideDialogsController } from \"../types\";\nimport { SideDialogsControllerContext } from \"../contexts/SideDialogsControllerContext\";\nimport { useContext } from \"react\";\n\n/**\n * Hook to retrieve the side dialogs' controller.\n *\n * This hook allows you to open and close side dialogs. This is the mechanism\n * used when open a side entity dialog, or when selecting a reference.\n *\n * If you want to open a side entity dialog, you can use the {@link useSideEntityController}\n * hook.\n *\n * If you want to select a reference, you can use the {@link useReferenceDialog}\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @group Hooks and utilities\n */\nexport const useSideDialogsController = (): SideDialogsController => useContext(SideDialogsControllerContext);\n","import React from \"react\";\nimport { SideEntityController } from \"../types\";\n\nexport const SideEntityControllerContext = React.createContext<SideEntityController>({} as SideEntityController);\n","import { SideEntityController } from \"../types\";\nimport { useContext } from \"react\";\nimport { SideEntityControllerContext } from \"../contexts/SideEntityControllerContext\";\n\n/**\n * Use this hook to retrieve an entity controller that allows you to open\n * a side dialog to edit an entity.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see SideEntityController\n * @group Hooks and utilities\n */\nexport const useSideEntityController = (): SideEntityController => useContext(SideEntityControllerContext);\n","import React from \"react\";\nimport { StorageSource } from \"../types\";\n\nexport const StorageSourceContext = React.createContext<StorageSource>({} as StorageSource);\n","import { StorageSource } from \"../types\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { useContext } from \"react\";\n\n/**\n * Use this hook to get the storage source being used\n * @group Hooks and utilities\n */\nexport const useStorageSource = (): StorageSource => useContext(StorageSourceContext);\n","import { useSnackbar } from \"notistack\";\nimport { useCallback, useMemo } from \"react\";\n\n/**\n * Possible snackbar types\n * @group Hooks and utilities\n */\nexport type SnackbarMessageType = \"success\" | \"info\" | \"warning\" | \"error\";\n\n/**\n * Controller to display snackbars\n * @group Hooks and utilities\n */\nexport interface SnackbarController {\n\n /**\n * Close the currently open snackbar\n */\n close: () => void;\n\n /**\n * Display a new snackbar. You need to specify the type and message.\n * You can optionally specify a title\n */\n open: (props: {\n type: SnackbarMessageType;\n message: React.ReactNode;\n autoHideDuration?: number;\n }) => void;\n\n}\n\n/**\n * Hook to retrieve the SnackbarContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see SnackbarController\n * @group Hooks and utilities\n */\nexport const useSnackbarController = () => {\n\n const {\n enqueueSnackbar,\n closeSnackbar\n } = useSnackbar();\n\n const open = useCallback((props: {\n type: SnackbarMessageType;\n // title?: string;\n message: React.ReactNode;\n autoHideDuration?: number;\n }) => {\n const {\n type,\n message,\n autoHideDuration\n } = props;\n enqueueSnackbar({\n message,\n variant: type,\n autoHideDuration\n })\n }, []);\n\n const close = useCallback(() => {\n closeSnackbar();\n }, []);\n\n return useMemo(() => ({\n open,\n close\n }), [open, close]);\n\n};\n","import React from \"react\";\nimport { UserConfigurationPersistence } from \"../types\";\n\nexport const UserConfigurationPersistenceContext = React.createContext<UserConfigurationPersistence | undefined>(undefined);\n","import { UserConfigurationPersistence } from \"../types\";\nimport { useContext } from \"react\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\n\n/**\n * Use this controller to access the configuration that is stored externally,\n * and not defined in code\n *\n * @group Hooks and utilities\n */\nexport const useUserConfigurationPersistence = (): UserConfigurationPersistence | undefined => useContext(UserConfigurationPersistenceContext);\n","import React, { PropsWithChildren, useCallback, useRef, useState } from \"react\";\nimport { DialogControllerEntryProps, DialogsController } from \"../types/dialogs_controller\";\n\nexport const DialogsControllerContext = React.createContext<DialogsController>({} as DialogsController);\n\nexport const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) => {\n\n const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);\n const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);\n\n const updateDialogEntries = (newPanels: DialogControllerEntryProps[]) => {\n dialogEntriesRef.current = newPanels;\n setDialogEntries(newPanels);\n };\n\n const close = useCallback(() => {\n\n if (dialogEntries.length === 0)\n return;\n\n const updatedPanels = [...dialogEntries.slice(0, -1)];\n updateDialogEntries(updatedPanels);\n\n }, [dialogEntries]);\n\n const open = useCallback((dialogEntry: DialogControllerEntryProps) => {\n\n const updatedPanels = [...dialogEntries, dialogEntry];\n updateDialogEntries(updatedPanels);\n\n return {\n closeDialog: () => {\n const updatedPanels = dialogEntriesRef.current.filter(e => e.key !== dialogEntry.key);\n updateDialogEntries(updatedPanels);\n }\n }\n }, [dialogEntries]);\n\n return (\n <DialogsControllerContext.Provider value={{\n open,\n close\n }}>\n {children}\n {dialogEntries.map((entry, i) => <entry.Component\n key={`dialog_${i}`}\n open={true}\n closeDialog={close}\n />)}\n </DialogsControllerContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { DialogsController } from \"../types/dialogs_controller\";\nimport { DialogsControllerContext } from \"../contexts/DialogsProvider\";\n\n/**\n * Use this hook to open a dialog imperatively.\n * Alternatively, you can use dialogs declaratively using the `Dialog` component.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @group Hooks and utilities\n */\nexport const useDialogsController = (): DialogsController => useContext(DialogsControllerContext);\n","import { createContext, useContext } from \"react\";\nimport { AuthController, FireCMSContext, User } from \"../types\";\nimport { useAuthController } from \"./useAuthController\";\nimport { useSideDialogsController } from \"./useSideDialogsController\";\nimport { useNavigationController } from \"./useNavigationController\";\nimport { useSideEntityController } from \"./useSideEntityController\";\nimport { useDataSource } from \"./data/useDataSource\";\nimport { useStorageSource } from \"./useStorageSource\";\nimport { useSnackbarController } from \"./useSnackbarController\";\nimport { useUserConfigurationPersistence } from \"./useUserConfigurationPersistence\";\nimport { useDialogsController } from \"./useDialogsController\";\n\nexport const FireCMSContextInstance = createContext<Partial<FireCMSContext>>({});\n\n/**\n * Hook to retrieve the {@link FireCMSContext}.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS` component.\n *\n * @see FireCMSContext\n * @group Hooks and utilities\n */\nexport const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {\n\n const partialContext = useContext(FireCMSContextInstance) as FireCMSContext<UserType, AuthControllerType>;\n const authController = useAuthController<UserType, AuthControllerType>();\n const sideDialogsController = useSideDialogsController();\n const sideEntityController = useSideEntityController();\n const navigation = useNavigationController();\n const dataSource = useDataSource();\n const storageSource = useStorageSource();\n const snackbarController = useSnackbarController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const dialogsController = useDialogsController();\n\n return {\n ...partialContext,\n authController,\n sideDialogsController,\n sideEntityController,\n navigation,\n dataSource,\n storageSource,\n snackbarController,\n userConfigPersistence,\n dialogsController\n }\n\n};\n","import { useEffect, useState } from \"react\";\nimport { Entity, EntityCollection, FilterValues, FireCMSContext, User } from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useNavigationController } from \"../useNavigationController\";\nimport { useFireCMSContext } from \"../useFireCMSContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionFetchProps<M extends Record<string, any>> {\n\n /**\n * Absolute collection path\n */\n path: string;\n\n /**\n * collection of the entity displayed by this collection\n */\n collection: EntityCollection<M>\n\n /**\n * Number of entities to fetch\n */\n itemCount?: number;\n\n /**\n * Filter the fetched data by the property\n */\n filterValues?: FilterValues<Extract<keyof M, string>>;\n\n /**\n * Sort the results by\n */\n sortBy?: [Extract<keyof M, string>, \"asc\" | \"desc\"];\n\n /**\n * Search string\n */\n searchString?: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionFetchResult<M extends Record<string, any>> {\n data: Entity<M>[];\n dataLoading: boolean;\n noMoreToLoad: boolean;\n dataLoadingError?: Error;\n}\n\n/**\n * This hook is used to fetch collections using a given collection\n * @param path\n * @param collection\n * @param filterValues\n * @param sortBy\n * @param itemCount\n * @param searchString\n * @group Hooks and utilities\n */\nexport function useCollectionFetch<M extends Record<string, any>, UserType extends User>(\n {\n path: inputPath,\n collection,\n filterValues,\n sortBy,\n itemCount,\n searchString\n }: CollectionFetchProps<M>): CollectionFetchResult<M> {\n\n const dataSource = useDataSource();\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [data, setData] = useState<Entity<M>[]>([]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (entities: Entity<M>[]) => {\n if (collection.callbacks?.onFetch) {\n try {\n entities = await Promise.all(\n entities.map((entity) =>\n collection.callbacks!.onFetch!({\n collection,\n path,\n entity,\n context\n })));\n } catch (e: any) {\n console.error(e);\n }\n }\n setDataLoading(false);\n setDataLoadingError(undefined);\n setData(entities.map(e => ({\n ...e,\n // values: sanitizeData(e.values, resolvedCollection.properties)\n })));\n setNoMoreToLoad(!itemCount || entities.length < itemCount);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setData([]);\n setDataLoadingError(error);\n };\n\n if (dataSource.listenCollection) {\n return dataSource.listenCollection<M>({\n path,\n collection,\n onUpdate: onEntitiesUpdate,\n onError,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n });\n } else {\n dataSource.fetchCollection<M>({\n path,\n collection,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n })\n .then(onEntitiesUpdate)\n .catch(onError);\n return () => {\n };\n }\n }, [path, itemCount, currentSort, sortByProperty, filterValues, searchString]);\n\n return {\n data,\n dataLoading,\n dataLoadingError,\n noMoreToLoad\n };\n\n}\n","import { useEffect, useState } from \"react\";\nimport { Entity, EntityCollection, FireCMSContext, User } from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useNavigationController } from \"../useNavigationController\";\nimport { useFireCMSContext } from \"../useFireCMSContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport interface EntityFetchProps<M extends Record<string, any>> {\n path: string;\n entityId?: string;\n collection: EntityCollection<M>;\n useCache?: boolean;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface EntityFetchResult<M extends Record<string, any>> {\n entity?: Entity<M>,\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\nconst CACHE: Record<string, Entity<any> | undefined> = {};\n\n/**\n * This hook is used to fetch an entity.\n * It gives real time updates if the datasource supports it.\n * @param path\n * @param collection\n * @param entityId\n * @param useCache\n * @group Hooks and utilities\n */\n\nexport function useEntityFetch<M extends Record<string, any>, UserType extends User>(\n {\n path: inputPath,\n entityId,\n collection,\n useCache = false\n }: EntityFetchProps<M>): EntityFetchResult<M> {\n\n const dataSource = useDataSource();\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [entity, setEntity] = useState<Entity<M> | undefined>();\n const [dataLoading, setDataLoading] = useState<boolean>(true);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntityUpdate = async (updatedEntity: Entity<M> | undefined) => {\n if (collection.callbacks?.onFetch && updatedEntity) {\n try {\n updatedEntity = await collection.callbacks.onFetch({\n collection,\n path,\n entity: updatedEntity,\n context\n });\n } catch (e: any) {\n console.error(e);\n }\n }\n CACHE[`${path}/${entityId}`] = updatedEntity;\n setEntity(updatedEntity);\n setDataLoading(false);\n setDataLoadingError(undefined);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR fetching entity\", error);\n setDataLoading(false);\n setEntity(undefined);\n setDataLoadingError(error);\n };\n\n if (entityId && useCache && CACHE[`${path}/${entityId}`]) {\n setEntity(CACHE[`${path}/${entityId}`]);\n setDataLoading(false);\n setDataLoadingError(undefined);\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {\n };\n } else if (entityId && path && collection) {\n if (dataSource.listenEntity) {\n return dataSource.listenEntity<M>({\n path,\n entityId,\n collection,\n onUpdate: onEntityUpdate,\n onError\n });\n } else {\n dataSource.fetchEntity<M>({\n path,\n entityId,\n collection\n })\n .then(onEntityUpdate)\n .catch(onError);\n return () => {\n };\n }\n }\n // if no entityId is provided we do nothing\n else {\n onEntityUpdate(undefined);\n return () => {\n };\n }\n }, [entityId, path]);\n\n return {\n entity,\n dataLoading,\n dataLoadingError\n };\n\n}\n","import {\n DataSource,\n Entity,\n EntityCallbacks,\n EntityCollection,\n EntityValues,\n FireCMSContext,\n SaveEntityProps,\n User\n} from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { resolveCollection } from \"../../util\";\n\n/**\n * @group Hooks and utilities\n */\nexport type SaveEntityWithCallbacksProps<M extends Record<string, any>> =\n SaveEntityProps<M> &\n {\n callbacks?: EntityCallbacks<M>;\n onSaveSuccess?: (updatedEntity: Entity<M>) => void,\n onSaveFailure?: (e: Error) => void,\n onPreSaveHookError?: (e: Error) => void,\n onSaveSuccessHookError?: (e: Error) => void\n }\n\n/**\n * This function is in charge of saving an entity to the datasource.\n * It will run all the save callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * If you just want to save the data without running the `onSaveSuccess`,\n * `onSaveFailure` and `onPreSave` callbacks, you can use the `saveEntity` method\n * in the datasource ({@link useDataSource}).\n *\n * @param collection\n * @param path\n * @param entityId\n * @param callbacks\n * @param values\n * @param previousValues\n * @param status\n * @param dataSource\n * @param context\n * @param onSaveSuccess\n * @param onSaveFailure\n * @param onPreSaveHookError\n * @param onSaveSuccessHookError\n * @see useDataSource\n * @group Hooks and utilities\n */\nexport async function saveEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({\n collection,\n path,\n entityId,\n values,\n previousValues,\n status,\n dataSource,\n context,\n onSaveSuccess,\n onSaveFailure,\n onPreSaveHookError,\n onSaveSuccessHookError\n }: SaveEntityWithCallbacksProps<M> & {\n collection: EntityCollection<M>,\n dataSource: DataSource,\n context: FireCMSContext<UserType>,\n }\n): Promise<void> {\n\n let updatedValues: Partial<EntityValues<M>>;\n\n const resolvedPath = context.navigation.resolveAliasesFrom(path);\n\n const callbacks = collection.callbacks;\n if (callbacks?.onPreSave) {\n try {\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: previousValues as EntityValues<M>,\n entityId,\n fields: context.propertyConfigs\n });\n updatedValues = await callbacks.onPreSave({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId,\n values,\n previousValues,\n status,\n context\n });\n } catch (e: any) {\n console.error(e);\n if (onPreSaveHookError)\n onPreSaveHookError(e);\n return;\n }\n } else {\n updatedValues = values;\n }\n\n return dataSource.saveEntity({\n collection,\n path: resolvedPath,\n entityId,\n values: updatedValues,\n previousValues,\n status\n }).then((entity) => {\n try {\n if (callbacks?.onSaveSuccess) {\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: updatedValues as EntityValues<M>,\n entityId,\n fields: context.propertyConfigs\n });\n callbacks.onSaveSuccess({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId: entity.id,\n values: updatedValues,\n previousValues,\n status,\n context\n });\n }\n } catch (e: any) {\n if (onSaveSuccessHookError)\n onSaveSuccessHookError(e);\n }\n if (onSaveSuccess)\n onSaveSuccess(entity);\n })\n .catch((e) => {\n if (callbacks?.onSaveFailure) {\n\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: updatedValues as EntityValues<M>,\n entityId,\n fields: context.propertyConfigs\n });\n callbacks.onSaveFailure({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId,\n values: updatedValues,\n previousValues,\n status,\n context\n });\n }\n if (onSaveFailure) onSaveFailure(e);\n });\n}\n","import {\n DataSource,\n DeleteEntityProps,\n Entity,\n EntityCallbacks,\n EntityOnDeleteProps,\n FireCMSContext,\n ResolvedEntityCollection,\n User\n} from \"../../types\";\n\n/**\n * @group Hooks and utilities\n */\nexport type DeleteEntityWithCallbacksProps<M extends Record<string, any>> =\n DeleteEntityProps<M>\n & {\n callbacks?: EntityCallbacks<M>;\n onDeleteSuccess?: (entity: Entity<M>) => void;\n onDeleteFailure?: (entity: Entity<M>, e: Error) => void;\n onPreDeleteHookError?: (entity: Entity<M>, e: Error) => void;\n onDeleteSuccessHookError?: (entity: Entity<M>, e: Error) => void;\n}\n\n/**\n * This function is in charge of deleting an entity in the datasource.\n * It will run all the delete callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * If you just want to delete any data without running the `onPreDelete`,\n * and `onDelete` callbacks, you can use the `deleteEntity` method\n * in the datasource ({@link useDataSource}).\n *\n * @param dataSource\n * @param entity\n * @param collection\n * @param callbacks\n * @param onDeleteSuccess\n * @param onDeleteFailure\n * @param onPreDeleteHookError\n * @param onDeleteSuccessHookError\n * @param context\n * @group Hooks and utilities\n */\nexport async function deleteEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({\n dataSource,\n entity,\n collection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n onPreDeleteHookError,\n onDeleteSuccessHookError,\n context\n }: DeleteEntityWithCallbacksProps<M> & {\n collection: ResolvedEntityCollection<M>,\n dataSource: DataSource,\n context: FireCMSContext<UserType>\n }\n): Promise<boolean> {\n\n console.debug(\"Deleting entity\", entity.path, entity.id);\n\n const entityDeleteProps: EntityOnDeleteProps<M, UserType> = {\n entity,\n collection,\n entityId: entity.id,\n path: entity.path,\n context\n };\n\n if (callbacks?.onPreDelete) {\n try {\n await callbacks.onPreDelete(entityDeleteProps);\n } catch (e: any) {\n console.error(e);\n if (onPreDeleteHookError)\n onPreDeleteHookError(entity, e);\n return false;\n }\n }\n return dataSource.deleteEntity({\n entity\n }).then(() => {\n onDeleteSuccess && onDeleteSuccess(entity);\n try {\n if (callbacks?.onDelete) {\n callbacks.onDelete(entityDeleteProps);\n }\n return true;\n } catch (e: any) {\n if (onDeleteSuccessHookError)\n onDeleteSuccessHookError(entity, e);\n return false;\n }\n }).catch((e) => {\n if (onDeleteFailure) onDeleteFailure(entity, e);\n return false;\n });\n}\n","import { useEffect, useRef } from \"react\";\nimport { CMSType, ResolvedProperty } from \"../types\";\n\n/**\n * Hook we use to restore a value after it has been cleared\n * @param property\n * @param value\n * @param setValue\n * @ignore\n */\nexport function useClearRestoreValue<T extends CMSType>({\n property,\n value,\n setValue\n }:\n {\n property: ResolvedProperty<T>,\n value: T,\n setValue: (value: T | null, shouldValidate?: boolean) => void\n }) {\n\n const clearedValueRef = useRef<T | null>(null);\n useEffect(() => {\n const shouldClearValueIfDisabled = typeof property.disabled === \"object\" && Boolean(property.disabled.clearOnDisabled);\n if (shouldClearValueIfDisabled) {\n if (value != null) {\n clearedValueRef.current = value;\n setValue(null);\n }\n } else if (clearedValueRef.current) {\n setValue(clearedValueRef.current);\n clearedValueRef.current = null;\n }\n }, [property]);\n}\n","import { Entity, EntityCollection, EntityCustomView, FireCMSContext, User } from \"../types\";\nimport { useEffect, useState } from \"react\";\nimport { getNavigationEntriesFromPathInternal } from \"../util/navigation_from_path\";\nimport { useFireCMSContext } from \"./useFireCMSContext\";\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport type ResolvedNavigationEntry<M extends Record<string, any>> =\n | ResolvedNavigationEntity<M>\n | ResolvedNavigationCollection<M>\n | ResolvedNavigationEntityCustom<M>;\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationEntity<M extends Record<string, any>> {\n type: \"entity\";\n entity: Entity<M>;\n entityId: string;\n path: string;\n parentCollection: EntityCollection<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationCollection<M extends Record<string, any>> {\n type: \"collection\";\n path: string;\n collection: EntityCollection<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\ninterface ResolvedNavigationEntityCustom<M extends Record<string, any>> {\n type: \"custom_view\";\n path: string;\n view: EntityCustomView<M>;\n}\n\n/**\n * Use this function to retrieve an array of navigation entries (resolved\n * collection, entity or entity custom_view) for the given path. You need to pass the app context\n * that you receive in different callbacks, such as the save hooks.\n *\n * It will take into account the `navigation` provided at the `FireCMS` level.\n *\n * @param path\n * @param context\n * @group Hooks and utilities\n */\nexport function resolveNavigationFrom<M extends Record<string, any>, UserType extends User>({\n path,\n context\n }: {\n path: string,\n context: FireCMSContext<UserType>\n}): Promise<ResolvedNavigationEntry<M>[]> {\n\n const dataSource = context.dataSource;\n const navigation = context.navigation;\n\n if (!navigation) {\n throw Error(\"Calling getNavigationFrom, but main navigation has not yet been initialised\");\n }\n\n const navigationEntries = getNavigationEntriesFromPathInternal({\n path,\n collections: navigation.collections ?? []\n });\n\n const resultPromises: Promise<ResolvedNavigationEntry<any>>[] = navigationEntries\n .map((entry) => {\n if (entry.type === \"collection\") {\n return Promise.resolve(entry);\n } else if (entry.type === \"entity\") {\n const collection = navigation.getCollection(entry.path, entry.entityId);\n if (!collection) {\n throw Error(`No collection defined in the navigation for the entity with path ${entry.path}`);\n }\n return dataSource.fetchEntity({\n path: entry.path,\n entityId: entry.entityId,\n collection\n })\n .then((entity) => {\n if (!entity) return undefined;\n return { ...entry, entity };\n });\n } else if (entry.type === \"custom_view\") {\n return Promise.resolve(entry);\n } else {\n throw Error(\"Unmapped element in useEntitiesFromPath\");\n }\n })\n .filter(v => Boolean(v)) as Promise<ResolvedNavigationEntry<any>>[];\n\n return Promise.all(resultPromises);\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFromProps {\n path: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFrom<M extends Record<string, any>> {\n data?: ResolvedNavigationEntry<M>[]\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\n/**\n * Use this hook to retrieve an array of navigation entries (resolved\n * collection or entity) for the given path. You can use this hook\n * in any React component that lives under `FireCMS`\n * @group Hooks and utilities\n */\nexport function useResolvedNavigationFrom<M extends Record<string, any>, UserType extends User>(\n {\n path\n }: NavigationFromProps): NavigationFrom<M> {\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n const navigation = context.navigation;\n if (navigation) {\n setDataLoading(true);\n setDataLoadingError(undefined);\n resolveNavigationFrom<M, UserType>({ path, context })\n .then((res) => {\n setData(res);\n })\n .catch((e) => setDataLoadingError(e))\n .finally(() => setDataLoading(false));\n }\n\n }, [path, context]);\n\n if (!context.navigation) {\n return { dataLoading: true };\n }\n\n return { data, dataLoading, dataLoadingError };\n}\n","import { ModeControllerContext } from \"../contexts/ModeController\";\nimport { useContext } from \"react\";\n\n/**\n * Use this controller to change color mode\n * @group Hooks and utilities\n */\nexport interface ModeController {\n mode: \"light\" | \"dark\";\n setMode: (mode: \"light\" | \"dark\") => void;\n toggleMode: () => void;\n}\n\n/**\n * Hook to retrieve the current mode (\"light\" | \"dark\"), and `setMode`\n * or `toggle` functions to change it.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see ModeController\n * @group Hooks and utilities\n */\nexport const useModeController = () => useContext(ModeControllerContext);\n","// FORKED FROM https://github.com/fayeed/use-clipboard\n\nimport { MutableRefObject, useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardProps {\n /**\n * It's callback function that is called after the `copy` command\n * is executed.\n *\n * @param text: The selected clipboard text.\n */\n onSuccess?: (text: string) => void;\n\n /**\n * Triggers when the hook encounters an error.\n * If passed hook won't throw an error.\n *\n * @param error: cause of the error\n */\n onError?: (error: string) => void;\n\n /**\n * Disables the new clipboard API `navigator.clipboard` even if\n * it is supported.\n */\n disableClipboardAPI?: boolean;\n\n /**\n * revert back the isCopied flag to false again if a value is set.\n */\n copiedDuration?: number;\n}\n\nexport interface useClipboardReturnType {\n /**\n * Use ref to pull the text content from.\n */\n ref: MutableRefObject<any>;\n\n /**\n * Use it to perform the copy operation\n */\n copy: (text?: string) => void;\n\n /**\n * Use it to perform the cut operation\n */\n cut: () => void;\n\n /**\n * Indicates wheater the content was successfully copied or not.\n */\n isCoppied: boolean;\n\n /**\n * Current selected clipboard content.\n */\n clipboard: string;\n\n /**\n * Clears the user clipboard.\n */\n clearClipboard: () => void;\n\n /**\n * Check to see if the browser supports the new `navigator.clipboard` API.\n */\n isSupported: () => boolean;\n}\n\nexport const useClipboard = (\n options?: UseClipboardProps\n): useClipboardReturnType => {\n const { onSuccess, onError, disableClipboardAPI = false, copiedDuration } =\n options || {};\n const ref = useRef<any>(null);\n const [isCoppied, setIsCoppied] = useState(false);\n const [clipboard, setClipbaord] = useState(\"\");\n\n useEffect(() => {\n if (copiedDuration) setTimeout(() => setIsCoppied(false), copiedDuration);\n }, [isCoppied]);\n\n const isSupported = () => navigator.clipboard !== undefined;\n\n const handleError = useCallback((error: string) => {\n if (onError) onError(error);\n else throw new Error(error);\n }, [onError]);\n\n const handleSuccess = useCallback((text: string) => {\n if (onSuccess) onSuccess(text);\n setIsCoppied(true);\n setClipbaord(text);\n }, [onSuccess]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => handleSuccess(text))\n .catch((err) => {\n handleError(err);\n setIsCoppied(false);\n });\n }, [handleError, handleSuccess]);\n\n const clearClipboard = () => {\n if (isSupported()) {\n navigator.clipboard.writeText(\"\");\n }\n };\n\n const copy = (text?: string) =>\n action(\"copy\", typeof text === \"object\" ? undefined : text);\n\n const cut = () => action(\"cut\");\n\n const action = useCallback(\n (operation = \"copy\", text?: string) => {\n const element = ref.current as HTMLElement;\n\n const isInput =\n element &&\n (element.tagName === \"INPUT\" || element.tagName === \"TEXTAREA\");\n\n const input = ref.current as HTMLInputElement;\n\n if (isSupported() && !disableClipboardAPI) {\n if (text) {\n copyToClipboard(text);\n } else if (element) {\n if (isInput) {\n copyToClipboard(input.value);\n\n if (operation === \"cut\") {\n input.value = \"\";\n }\n } else {\n copyToClipboard(element.innerText);\n }\n } else {\n handleError(\"Both the ref & text were undefined\");\n }\n }\n },\n [disableClipboardAPI, copyToClipboard, handleError]\n );\n\n return {\n ref,\n isCoppied,\n clipboard,\n clearClipboard,\n isSupported,\n copy,\n cut\n };\n};\n","import { useEffect, useState } from \"react\";\n\nconst breakpoints = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n \"3xl\": 1920\n}\nexport const useLargeLayout = (breakpoint: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" = \"lg\"): boolean => {\n const [isLargeLayout, setIsLargeLayout] = useState<boolean>(false);\n\n useEffect(() => {\n const handleResize = () => {\n const matched = window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;\n setIsLargeLayout(matched);\n };\n\n // Set initial state\n handleResize();\n\n // Set up event listener for resize events\n window.addEventListener(\"resize\", handleResize);\n\n // Clean up event listener when component unmounts\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n return isLargeLayout;\n};\n","import React from \"react\";\nimport { Tooltip, TooltipProps } from \"@firecms/ui\";\n\nexport function ErrorTooltip(props: TooltipProps) {\n return (\n <Tooltip {...props}\n tooltipClassName={\"!text-red-500 bg-red-50\"}>\n {props.children}\n </Tooltip>\n );\n}\n","import React from \"react\";\nimport { ErrorTooltip } from \"./ErrorTooltip\";\nimport { ErrorIcon, Typography } from \"@firecms/ui\";\n\n/**\n * @group Components\n */\nexport interface ErrorViewProps {\n title?: string;\n error: Error | React.ReactElement | string,\n tooltip?: string\n}\n\n/**\n * Generic error view. Displayed for example when an unexpected value comes\n * from the datasource in a collection view.\n * @param title\n * @param error\n * @param tooltip\n * @constructor\n * @group Components\n */\nexport function ErrorView({\n title,\n error,\n tooltip\n }: ErrorViewProps): React.ReactElement {\n const component = error instanceof Error ? error.message : error;\n console.error(\"ErrorView\", error)\n\n const body = (\n <div\n className=\"flex items-center m-2\">\n <ErrorIcon size={\"small\"} color={\"error\"}/>\n <div className=\"pl-2\">\n {title && <Typography\n variant={\"body2\"}\n className=\"font-medium\">{title}</Typography>}\n <Typography variant={\"body2\"}>{component}</Typography>\n </div>\n </div>\n );\n\n if (tooltip) {\n return (\n <ErrorTooltip title={tooltip}>\n {body}\n </ErrorTooltip>\n );\n }\n return body;\n}\n","import React from \"react\";\n\n/**\n * @group Preview components\n */\nexport function EmptyValue() {\n\n return <div\n className=\"rounded-full bg-gray-200 bg-opacity-30 dark:bg-opacity-20 w-5 h-2 inline-block\"/>;\n}\n","import { CollectionSize } from \"../types\";\nimport { PreviewSize } from \"./PropertyPreviewProps\";\n\nexport const TINY_THUMBNAIL = 40;\nexport const SMALL_THUMBNAIL = 100;\nexport const REGULAR_THUMBNAIL = 200;\n\nexport function getThumbnailMeasure(size: PreviewSize): number {\n if (size === \"tiny\")\n return TINY_THUMBNAIL;\n else if (size === \"small\")\n return SMALL_THUMBNAIL;\n else if (size === \"medium\")\n return REGULAR_THUMBNAIL;\n else throw Error(\"Thumbnail size not mapped\");\n}\n\nexport function getPreviewSizeFrom(size: CollectionSize): PreviewSize {\n switch (size) {\n case \"xs\":\n case \"s\":\n return \"tiny\";\n case \"m\":\n return \"small\";\n case \"l\":\n case \"xl\":\n return \"medium\";\n default:\n throw Error(\"Missing mapping value in getPreviewSizeFrom: \" + size);\n }\n}\n","import React, { CSSProperties, useMemo, useState } from \"react\";\n\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ContentCopyIcon, IconButton, OpenInNewIcon, Tooltip } from \"@firecms/ui\";\n\n/**\n * @group Preview components\n */\nexport interface ImagePreviewProps {\n size: PreviewSize,\n url: string\n}\n\n/**\n * @group Preview components\n */\nexport function ImagePreview({\n size,\n url\n }: ImagePreviewProps) {\n\n const [onHover, setOnHover] = useState(false);\n\n const imageSize = useMemo(() => getThumbnailMeasure(size), [size]);\n\n if (size === \"tiny\") {\n return (\n <img src={url}\n className={\"rounded-md\"}\n key={\"tiny_image_preview_\" + url}\n style={{\n position: \"relative\",\n objectFit: \"cover\",\n width: imageSize,\n height: imageSize,\n maxHeight: \"100%\"\n }}/>\n );\n }\n\n const imageStyle: CSSProperties =\n {\n maxWidth: \"100%\",\n maxHeight: \"100%\"\n };\n\n return (\n <div\n className=\"relative flex items-center justify-center max-w-full max-h-full\"\n style={{\n width: imageSize,\n height: imageSize\n }}\n key={\"image_preview_\" + url}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}>\n\n <img src={url}\n className={\"rounded-md\"}\n style={imageStyle}/>\n\n {onHover && <>\n\n {navigator && <Tooltip title=\"Copy url to clipboard\">\n <div\n className=\"rounded-full absolute bottom-[-4px] right-8\">\n <IconButton\n variant={\"filled\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n return navigator.clipboard.writeText(url);\n }}>\n <ContentCopyIcon className={\"text-gray-500\"}\n size={\"small\"}/>\n </IconButton>\n </div>\n </Tooltip>}\n\n <Tooltip title=\"Open image in new tab\">\n <IconButton\n variant={\"filled\"}\n component={\"a\" as React.ElementType}\n style={{\n position: \"absolute\",\n bottom: -4,\n right: -4\n }}\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n size={\"small\"}\n onClick={(e: any) => e.stopPropagation()}\n >\n <OpenInNewIcon className={\"text-gray-500\"}\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </>\n }\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ImagePreview } from \"./ImagePreview\";\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewType } from \"../../types\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from \"@firecms/ui\";\nimport { EmptyValue } from \"./EmptyValue\";\n\n/**\n * @group Preview components\n */\nexport function UrlComponentPreview({\n url,\n previewType,\n size,\n hint\n }: {\n url: string,\n previewType?: PreviewType,\n size: PreviewSize,\n hint?: string\n}): React.ReactElement {\n\n if (!previewType) {\n if (!url || !url.trim()) return <EmptyValue/>;\n return (\n <a className=\"flex gap-4 break-words items-center font-medium text-primary visited:text-primary dark:visited:text-primary dark:text-primary\"\n href={url}\n rel=\"noopener noreferrer\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n }}\n target=\"_blank\">\n <OpenInNewIcon size={\"small\"}/>\n {url}\n </a>\n );\n }\n\n if (previewType === \"image\") {\n return <ImagePreview url={url}\n size={size}/>;\n } else if (previewType === \"audio\") {\n return <audio controls\n src={url}>\n Your browser does not support the\n <code>audio</code> element.\n </audio>;\n } else if (previewType === \"video\") {\n return <video\n className={`max-w-${size === \"small\" ? \"sm\" : \"md\"}`}\n controls\n >\n <source src={url}/>\n </video>;\n } else {\n return (\n <a\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex flex-col items-center justify-center\"\n style={{\n width: getThumbnailMeasure(size),\n height: getThumbnailMeasure(size)\n }}>\n <DescriptionIcon className=\"flex-grow\"/>\n {hint &&\n <Tooltip title={hint}>\n <Typography\n className=\"max-w-full truncate rtl text-left\"\n variant={\"caption\"}>{hint}</Typography>\n </Tooltip>}\n </a>\n );\n }\n}\n","import {\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedProperties,\n ResolvedProperty,\n ResolvedStringProperty\n} from \"../../types\";\nimport React from \"react\";\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { Skeleton } from \"@firecms/ui\";\n\nexport interface SkeletonPropertyComponentProps {\n property: ResolvedProperty,\n size: PreviewSize\n}\n\n/**\n * @group Preview components\n */\nexport function SkeletonPropertyComponent({\n property,\n size\n }: SkeletonPropertyComponentProps\n) {\n\n if (!property) {\n console.error(\"No property assigned for skeleton component\", property, size);\n }\n\n let content: React.ReactNode | any;\n if (property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (stringProperty.url) {\n content = renderUrlComponent(stringProperty, size);\n } else if (stringProperty.storage) {\n content = renderSkeletonImageThumbnail(size);\n } else {\n content = renderSkeletonText();\n }\n } else if (property.dataType === \"array\") {\n const arrayProperty = property as ResolvedArrayProperty;\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <>{arrayProperty.of.map((p, i) => renderGenericArrayCell(p, i))} </>;\n } else {\n if (arrayProperty.of.dataType === \"map\" && arrayProperty.of.properties) {\n content = renderArrayOfMaps(arrayProperty.of.properties, size, arrayProperty.of.previewProperties);\n } else if (arrayProperty.of.dataType === \"string\") {\n if (arrayProperty.of.enumValues) {\n content = renderArrayEnumTableCell();\n } else if (arrayProperty.of.storage) {\n content = renderGenericArrayCell(arrayProperty.of);\n } else {\n content = renderArrayOfStrings();\n }\n } else {\n content = renderGenericArrayCell(arrayProperty.of);\n }\n }\n }\n\n } else if (property.dataType === \"map\") {\n content = renderMap(property as ResolvedMapProperty, size);\n } else if (property.dataType === \"date\") {\n content = renderSkeletonText();\n } else if (property.dataType === \"reference\") {\n content = renderReference();\n } else if (property.dataType === \"boolean\") {\n content = renderSkeletonText();\n } else {\n content = renderSkeletonText();\n }\n return (content || null);\n}\n\nfunction renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<T>, size: PreviewSize) {\n\n if (!property.properties)\n return <></>;\n\n let mapPropertyKeys: string[];\n if (size === \"medium\") {\n mapPropertyKeys = Object.keys(property.properties);\n } else {\n mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];\n if (size === \"small\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 3);\n else if (size === \"tiny\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 1);\n }\n\n if (size !== \"medium\")\n return (\n <div\n className=\"w-full flex flex-col space-y-4\"\n >\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"small\"}/>}\n </div>\n ))}\n </div>\n );\n\n return (\n <table className=\"table-auto\">\n <tbody>\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n return (\n <tr\n key={`map_preview_table__${index}`}\n className=\"border-b last:border-b-0\">\n <th key={`table-cell-title--${key}`}\n className=\"align-top\"\n style={{ width: \"30%\" }}>\n <p className=\"text-xs text-secondary\">\n {property.properties![key].name}\n </p>\n </th>\n <th key={`table-cell-${key}`}\n style={{ width: \"70%\" }}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"small\"}/>}\n </th>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedProperties<M>, size: PreviewSize, previewProperties?: string[]) {\n let tableProperties = previewProperties;\n if (!tableProperties || !tableProperties.length) {\n tableProperties = Object.keys(properties) as string[];\n if (size)\n tableProperties = tableProperties.slice(0, 3);\n }\n\n return (\n <table className=\"table-auto\">\n <tbody>\n {\n [0, 1, 2].map((value, index) => {\n return (\n <tr key={`table_${value}_${index}`}>\n {tableProperties && tableProperties.map(\n (key) => (\n <th\n key={`table-cell-${key}`}\n >\n <SkeletonPropertyComponent\n property={(properties)[key]}\n size={\"small\"}/>\n </th>\n )\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction renderArrayOfStrings() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) => (\n renderSkeletonText(index)\n ))}\n </div>\n );\n}\n\nfunction renderArrayEnumTableCell() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) =>\n <>\n {renderSkeletonText(index)}\n </>\n )}\n </div>\n );\n}\n\nfunction renderGenericArrayCell(\n property: ResolvedProperty,\n index = 0\n) {\n return (\n\n <div key={\"array_index_\" + index}\n className={\"flex flex-col gap-2\"}>\n\n {\n [0, 1].map((value, index) =>\n <>\n <SkeletonPropertyComponent key={`i_${index}`}\n property={property}\n size={\"small\"}/>\n </>\n )}\n </div>\n );\n}\n\nfunction renderUrlAudioComponent() {\n return (\n <Skeleton width={300}\n height={100}/>\n );\n}\n\nexport function renderSkeletonImageThumbnail(size: PreviewSize) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const imageSize = size === \"tiny\" ? 40 : size === \"small\" ? 100 : 200;\n return (\n <Skeleton width={imageSize}\n height={imageSize}/>\n );\n}\n\nfunction renderUrlVideo(size: PreviewSize) {\n\n return (\n <Skeleton width={size !== \"medium\" ? 300 : 500}\n height={size !== \"medium\" ? 200 : 250}/>\n );\n}\n\nfunction renderReference() {\n return <Skeleton width={200} height={100}/>;\n}\n\nfunction renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = \"medium\") {\n\n if (typeof property.url === \"boolean\") {\n return <div style={{\n display: \"flex\"\n }}>\n {renderSkeletonIcon()}\n {renderSkeletonText()}\n </div>;\n }\n\n return renderUrlFile(size);\n}\n\nfunction renderUrlFile(size: PreviewSize) {\n\n return (\n <div\n className={`w-${getThumbnailMeasure(size)} h-${getThumbnailMeasure(size)}`}>\n {renderSkeletonIcon()}\n </div>\n );\n}\n\nexport function renderSkeletonText(index?: number, width = 120) {\n return <Skeleton width={width} key={`skeleton_${index}`}/>;\n}\n\nexport function renderSkeletonCaptionText(index?: number) {\n return <Skeleton\n height={20}/>;\n}\n\nexport function renderSkeletonIcon() {\n return <Skeleton width={24} height={24}/>;\n}\n","import React, { useEffect } from \"react\";\n\nimport { renderSkeletonImageThumbnail } from \"../property_previews/SkeletonPropertyComponent\";\nimport { UrlComponentPreview } from \"./UrlComponentPreview\";\nimport { useStorageSource } from \"../../hooks\";\nimport { DownloadConfig, FileType } from \"../../types\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ErrorView } from \"../../components\";\n\ntype StorageThumbnailProps = {\n storagePathOrDownloadUrl: string;\n storeUrl: boolean;\n size: PreviewSize;\n};\n\n/**\n * @group Preview components\n */\nexport const StorageThumbnail = React.memo<StorageThumbnailProps>(StorageThumbnailInternal, areEqual) as React.FunctionComponent<StorageThumbnailProps>;\n\nfunction areEqual(prevProps: StorageThumbnailProps, nextProps: StorageThumbnailProps) {\n return prevProps.size === nextProps.size &&\n prevProps.storagePathOrDownloadUrl === nextProps.storagePathOrDownloadUrl &&\n prevProps.storeUrl === nextProps.storeUrl;\n}\n\nconst URL_CACHE: Record<string, DownloadConfig> = {};\n\nexport function StorageThumbnailInternal({\n storeUrl,\n storagePathOrDownloadUrl,\n size\n }: StorageThumbnailProps) {\n\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const storage = useStorageSource();\n\n const [downloadConfig, setDownloadConfig] = React.useState<DownloadConfig>(URL_CACHE[storagePathOrDownloadUrl]);\n\n useEffect(() => {\n if (!storagePathOrDownloadUrl)\n return;\n let unmounted = false;\n storage.getDownloadURL(storagePathOrDownloadUrl)\n .then(function (downloadConfig) {\n if (!unmounted) {\n setDownloadConfig(downloadConfig);\n URL_CACHE[storagePathOrDownloadUrl] = downloadConfig;\n }\n }).catch(setError);\n return () => {\n unmounted = true;\n };\n }, [storagePathOrDownloadUrl]);\n\n if (!storagePathOrDownloadUrl) return null;\n\n const filetype = downloadConfig?.metadata ? getFiletype(downloadConfig?.metadata.contentType) : undefined;\n const previewType = filetype?.startsWith(\"image\")\n ? \"image\"\n : (filetype?.startsWith(\"video\")\n ? \"video\"\n : (filetype?.startsWith(\"audio\") ? \"audio\" : \"file\"));\n\n if (downloadConfig?.fileNotFound)\n return <ErrorView error={\"File not found\"}></ErrorView>\n\n return downloadConfig?.url\n ? <UrlComponentPreview previewType={previewType}\n url={downloadConfig.url}\n size={size}\n hint={storagePathOrDownloadUrl}/>\n : renderSkeletonImageThumbnail(size);\n}\n\nfunction getFiletype(input: string): FileType {\n if (input.startsWith(\"image\")) return \"image/*\";\n else if (input.startsWith(\"video\")) return \"video/*\";\n else if (input.startsWith(\"audio\")) return \"audio/*\";\n else if (input.startsWith(\"application\")) return \"application/*\";\n else if (input.startsWith(\"text\")) return \"text/*\";\n else if (input.startsWith(\"font\")) return \"font/*\";\n else return input;\n}\n","import React from \"react\";\nimport { EnumValues } from \"../../types\";\nimport { buildEnumLabel, enumToObjectEntries, getColorScheme, getLabelOrConfigFrom } from \"../../util/enums\";\nimport { Chip } from \"@firecms/ui\";\n\nexport interface EnumValuesChipProps {\n enumValues?: EnumValues;\n enumKey: string | number;\n size: \"small\" | \"medium\";\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * @group Preview components\n */\nexport function EnumValuesChip({\n enumValues,\n enumKey,\n size,\n className,\n children\n }: EnumValuesChipProps) {\n if (!enumValues) return null;\n const enumValuesConfig = enumToObjectEntries(enumValues);\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValuesConfig, enumKey) : undefined;\n const label = buildEnumLabel(enumValue);\n const colorScheme = getColorScheme(enumValuesConfig, enumKey);\n return <Chip\n className={className}\n colorScheme={colorScheme}\n error={!label}\n outlined={false}\n size={size}>\n {children}\n {!children && (label !== undefined ? label : String(enumKey))}\n </Chip>;\n}\n","import React from \"react\";\n\nimport { resolvePropertyEnum } from \"../../util\";\nimport { EnumValuesChip } from \"../components/EnumValuesChip\";\nimport { getColorSchemeForSeed } from \"../../util/chip_utils\";\nimport { PreviewType } from \"../../types\";\nimport { UrlComponentPreview } from \"../components/UrlComponentPreview\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { ErrorBoundary } from \"../../components\";\nimport { Chip } from \"@firecms/ui\";\n\n/**\n * @group Preview components\n */\nexport function StringPropertyPreview({\n propertyKey,\n value,\n property,\n size\n }: PropertyPreviewProps<string>): React.ReactElement {\n\n if (property.enumValues) {\n const enumKey = value;\n const resolvedProperty = resolvePropertyEnum(property);\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={resolvedProperty.enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>;\n } else if (property.previewAsTag) {\n const colorScheme = getColorSchemeForSeed(propertyKey ?? \"\");\n return (\n <ErrorBoundary>\n <Chip\n colorScheme={colorScheme}\n size={size !== \"medium\" ? \"small\" : \"medium\"}>\n {value}\n </Chip>\n </ErrorBoundary>);\n } else if (property.url) {\n return (\n <UrlComponentPreview size={size}\n url={value}\n previewType={typeof property.url === \"string\" ? property.url as PreviewType : undefined}/>\n );\n } else {\n if (!value) return <></>;\n const lines = value.split(\"\\n\");\n return value && value.includes(\"\\n\")\n ? <div className={\"overflow-x-scroll\"}>\n {lines.map((str, index) =>\n <React.Fragment key={`string_preview_${index}`}>\n <span>{str}</span>\n {index !== lines.length - 1 && <br/>}\n </React.Fragment>)}\n </div>\n : <>\n {value}\n </>;\n }\n}\n","import React from \"react\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyPreview({\n propertyKey,\n value,\n property: inputProperty,\n // entity,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const fireCMSContext = useFireCMSContext();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (!property.of) {\n throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n if (property.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n const values = value;\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className=\"flex flex-col gap-2\">\n {values &&\n values.map((value, index) => {\n const of: ResolvedProperty = property.resolvedProperties[index] ??\n (property.resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));\n return of\n ? <React.Fragment\n key={\"preview_array_\" + index}>\n <div className={cn(defaultBorderMixin, \"m-1 border-b last:border-b-0\")}>\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={propertyKey}\n // entity={entity}\n value={value}\n property={of}\n size={childSize}/>\n </ErrorBoundary>\n </div>\n </React.Fragment>\n : null;\n }\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { Entity, EntityCollection, EntityReference, ResolvedProperty } from \"../../types\";\n\nimport { getReferencePreviewKeys, getValueInPath, resolveCollection } from \"../../util\";\nimport { useEntityFetch, useFireCMSContext, useNavigationController, useSideEntityController } from \"../../hooks\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { SkeletonPropertyComponent } from \"../property_previews/SkeletonPropertyComponent\";\nimport { cn, IconButton, KeyboardTabIcon, Skeleton, Tooltip, Typography } from \"@firecms/ui\";\nimport { ErrorView } from \"../../components\";\n\nexport type ReferencePreviewProps = {\n disabled?: boolean;\n reference: EntityReference,\n size: PreviewSize;\n previewProperties?: string[];\n onClick?: (e: React.SyntheticEvent) => void;\n onHover?: boolean;\n allowEntityNavigation?: boolean;\n};\n\n/**\n * @group Preview components\n */\nexport const ReferencePreview = React.memo<ReferencePreviewProps>(function ReferencePreview(props: ReferencePreviewProps) {\n const reference = props.reference;\n if (!((reference as unknown) instanceof EntityReference)) {\n console.warn(\"Reference preview received value of type\", typeof reference);\n return <ReferencePreviewContainer\n onClick={props.onClick}\n size={props.size}>\n <ErrorView error={\"Unexpected value. Click to edit\"}\n tooltip={JSON.stringify(reference)}/>\n </ReferencePreviewContainer>;\n }\n return <ReferencePreviewInternal {...props} />;\n}, areEqual) as React.FunctionComponent<ReferencePreviewProps>;\n\nfunction areEqual(prevProps: ReferencePreviewProps, nextProps: ReferencePreviewProps) {\n return prevProps.disabled === nextProps.disabled &&\n prevProps.size === nextProps.size &&\n prevProps.onHover === nextProps.onHover &&\n prevProps.reference?.id === nextProps.reference?.id &&\n prevProps.reference?.path === nextProps.reference?.path &&\n prevProps.allowEntityNavigation === nextProps.allowEntityNavigation\n ;\n}\n\nfunction ReferencePreviewInternal<M extends Record<string, any>>({\n disabled,\n reference,\n previewProperties,\n size,\n onHover,\n onClick,\n allowEntityNavigation = true\n }: ReferencePreviewProps) {\n\n const context = useFireCMSContext();\n const navigationController = useNavigationController();\n\n const collection = navigationController.getCollection<EntityCollection<M>>(reference.path);\n if (!collection) {\n if (context.components?.missingReference) {\n return <context.components.missingReference path={reference.path}/>;\n } else {\n throw Error(`Couldn't find the corresponding collection view for the path: ${reference.path}`);\n }\n }\n\n return <ReferencePreviewExisting\n reference={reference}\n collection={collection}\n previewProperties={previewProperties}\n size={size}\n disabled={disabled}\n allowEntityNavigation={allowEntityNavigation}\n onClick={onClick}\n onHover={onHover}/>\n}\n\nfunction ReferencePreviewExisting<M extends Record<string, any> = any>({ reference, collection, previewProperties, size, disabled, allowEntityNavigation, onClick, onHover }: ReferencePreviewProps & {\n collection: EntityCollection<M>\n}) {\n\n const context = useFireCMSContext();\n const sideEntityController = useSideEntityController();\n\n const {\n entity,\n dataLoading,\n dataLoadingError\n } = useEntityFetch({\n path: reference.path,\n entityId: reference.id,\n collection,\n useCache: true\n });\n\n if (entity) {\n referencesCache.set(reference.pathWithId, entity);\n }\n\n const usedEntity = entity ?? referencesCache.get(reference.pathWithId);\n\n const resolvedCollection = useMemo(() => resolveCollection({\n collection,\n path: reference.path,\n values: usedEntity?.values,\n fields: context.propertyConfigs\n }), [collection]);\n\n const listProperties = useMemo(() => getReferencePreviewKeys(resolvedCollection, context.propertyConfigs, previewProperties, size === \"small\" || size === \"medium\" ? 3 : 1),\n [previewProperties, resolvedCollection, size]);\n\n let body: React.ReactNode;\n\n if (!resolvedCollection) {\n return <ErrorView\n error={\"Could not find collection with id \" + resolvedCollection}/>\n }\n\n if (!reference) {\n body = <ErrorView error={\"Reference not set\"}/>;\n } else if (usedEntity && !usedEntity.values) {\n body = <ErrorView error={\"Reference does not exist\"}\n tooltip={reference.path}/>;\n } else {\n body = (\n <>\n <div\n className=\"flex flex-col flex-grow w-full max-w-[calc(100%-52px)] m-1\">\n\n {size !== \"tiny\" && (\n reference\n ? <div className={`${\n size !== \"medium\"\n ? \"block whitespace-nowrap overflow-hidden truncate\"\n : \"\"\n }`}>\n <Typography variant={\"caption\"}\n className={\"font-mono\"}>\n {reference.id}\n </Typography>\n </div>\n : <Skeleton/>)}\n\n {listProperties && listProperties.map((key) => {\n const childProperty = resolvedCollection.properties[key as string];\n if (!childProperty) return null;\n\n return (\n <div key={\"ref_prev_\" + (key as string)}\n className={listProperties.length > 1 ? \"my-0.5\" : \"my-0\"}>\n {\n usedEntity\n ? <PropertyPreview\n propertyKey={key as string}\n value={getValueInPath(usedEntity.values, key)}\n property={childProperty as ResolvedProperty}\n // entity={usedEntity}\n size={\"tiny\"}/>\n : <SkeletonPropertyComponent\n property={childProperty as ResolvedProperty}\n size={\"tiny\"}/>\n }\n </div>\n );\n })}\n\n </div>\n <div className={`my-${size === \"tiny\" ? 2 : 4}`}>\n {!disabled && usedEntity && allowEntityNavigation &&\n <Tooltip title={`See details for ${usedEntity.id}`}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n context.onAnalyticsEvent?.(\"entity_click_from_reference\", {\n path: usedEntity.path,\n entityId: usedEntity.id\n });\n sideEntityController.open({\n entityId: usedEntity.id,\n path: usedEntity.path,\n collection: resolvedCollection,\n updateUrl: true\n });\n }}>\n <KeyboardTabIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n </div>\n </>\n );\n }\n\n return (\n <ReferencePreviewContainer onClick={disabled ? undefined : onClick}\n onHover={disabled ? undefined : onHover}\n size={size}>\n {body}\n </ReferencePreviewContainer>\n );\n}\n\nexport function ReferencePreviewContainer({\n children,\n onHover,\n size,\n onClick\n }: {\n children: React.ReactNode;\n onHover?: boolean;\n size: PreviewSize;\n onClick?: (e: React.SyntheticEvent) => void;\n}) {\n return <Typography variant={\"label\"}\n className={cn(\"bg-opacity-70 bg-gray-100 dark:bg-gray-800 dark:bg-opacity-60\",\n \"w-full\",\n \"flex\",\n \"rounded-md\",\n \"overflow-hidden\",\n onHover ? \"hover:bg-opacity-90 dark:hover:bg-opacity-90\" : \"\",\n size === \"medium\" ? \"p-2\" : \"p-1\",\n size === \"tiny\" ? \"items-center\" : \"\",\n \"transition-colors duration-300 ease-in-out \",\n // onHover ? \"shadow-outline\" : \"\",\n onClick ? \"cursor-pointer\" : \"\")}\n style={{\n // @ts-ignore\n tabindex: 0\n }}\n onClick={(event) => {\n if (onClick) {\n event.preventDefault();\n onClick(event);\n }\n }}>\n\n {children}\n\n </Typography>\n}\n\nconst referencesCache = new Map<string, Entity<any>>();\n","import { ResolvedReferenceProperty } from \"../../types\";\nimport { resolveArrayProperty } from \"../../util\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { ReferencePreview } from \"../components/ReferencePreview\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfReferencesPreview({\n propertyKey,\n value,\n property: inputProperty,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const fireCMSContext = useFireCMSContext();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.dataType !== \"array\" || !property.of || property.of.dataType !== \"reference\")\n throw Error(\"Picked wrong preview component ArrayOfReferencesPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className=\"flex flex-col w-full\">\n {value &&\n value.map((reference, index) => {\n const ofProperty = property.of as ResolvedReferenceProperty;\n return <div className=\"mt-1 mb-1 w-full\"\n key={`preview_array_ref_${propertyKey}_${index}`}>\n <ReferencePreview\n disabled={!ofProperty.path}\n previewProperties={ofProperty.previewProperties}\n size={childSize}\n reference={reference}\n />\n </div>;\n }\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\n\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStorageComponentsPreview({\n propertyKey,\n // entity,\n value,\n property: inputProperty,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const fireCMSContext = useFireCMSContext();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property.dataType !== \"array\" || !property.of || property.of.dataType !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStorageComponentsPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className={\"flex flex-wrap gap-2\"}>\n {value &&\n value.map((v, index) =>\n <ErrorBoundary key={`preview_array_storage_${propertyKey}_${index}`}>\n <PropertyPreview\n propertyKey={propertyKey}\n value={v}\n // entity={entity}\n property={property.of as ResolvedProperty<string>}\n size={childSize}/>\n </ErrorBoundary>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { EnumValueConfig } from \"../../types\";\nimport { EnumValuesChip } from \"./EnumValuesChip\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayEnumPreview({\n name,\n value,\n enumValues,\n size\n }: {\n value: string[] | number[],\n name: string | undefined,\n enumValues: EnumValueConfig[],\n size: PreviewSize\n}) {\n\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {value && value.map((enumKey, index) => {\n return (\n <ErrorBoundary\n key={`preview_array_ref_${name}_${index}`}>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>\n </ErrorBoundary>\n );\n }\n )}\n </div>\n );\n}\n","import { ResolvedNumberProperty, ResolvedStringProperty } from \"../../types\";\nimport { ArrayEnumPreview } from \"../components/ArrayEnumPreview\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyEnumPreview({\n propertyKey,\n value,\n property,\n size\n }: PropertyPreviewProps<string[] | number[]>) {\n\n if (property.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n const ofProperty = property.of as ResolvedStringProperty | ResolvedNumberProperty;\n if (!ofProperty.enumValues)\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n if (!value) return null;\n\n return <ArrayEnumPreview name={propertyKey}\n value={value}\n enumValues={ofProperty.enumValues}\n size={size}/>;\n}\n","import React from \"react\";\nimport { ResolvedStringProperty } from \"../../types\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { PropertyPreviewProps, StringPropertyPreview } from \"../../preview\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStringsPreview({\n propertyKey,\n value,\n property: inputProperty,\n // entity,\n size\n }: PropertyPreviewProps<string[]>) {\n\n const fireCMSContext = useFireCMSContext();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (!property.of || property.dataType !== \"array\" || property.of.dataType !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStringsPreview\");\n\n if (value && !Array.isArray(value)) {\n return <div>{`Unexpected value: ${value}`}</div>;\n }\n const stringProperty = property.of as ResolvedStringProperty;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {value &&\n value.map((v, index) =>\n <div key={`preview_array_strings_${propertyKey}_${index}`}>\n <ErrorBoundary>\n <StringPropertyPreview propertyKey={propertyKey}\n property={stringProperty}\n value={v}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"../../util/common\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOneOfPreview({\n propertyKey,\n value,\n property: inputProperty,\n size,\n // entity\n }: PropertyPreviewProps<any[]>) {\n\n const fireCMSContext = useFireCMSContext();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (property?.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n if (!property?.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n const values = value;\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n const typeField = property.oneOf.typeField ?? DEFAULT_ONE_OF_TYPE;\n const valueField = property.oneOf.valueField ?? DEFAULT_ONE_OF_VALUE;\n const properties = property.oneOf.properties;\n\n return (\n <div className={\"flex flex-col\"}>\n {values &&\n values.map((value, index) =>\n <React.Fragment\n key={\"preview_array_\" + value + \"_\" + index}>\n <div className={cn(defaultBorderMixin, \"m-1 border-b last:border-b-0\")}>\n <ErrorBoundary>\n {value && <PropertyPreview\n propertyKey={propertyKey}\n value={value[valueField]}\n // entity={entity}\n property={(property.resolvedProperties[index] ?? properties[value[typeField]]) as ResolvedProperty<any>}\n size={childSize}/>}\n </ErrorBoundary>\n </div>\n </React.Fragment>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ResolvedMapProperty } from \"../../types\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin, Typography } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function MapPropertyPreview<T extends Record<string, any> = Record<string, any>>({\n propertyKey,\n value,\n property,\n // entity,\n size\n }: PropertyPreviewProps<T>) {\n\n if (property.dataType !== \"map\") {\n throw Error(\"Picked wrong preview component MapPropertyPreview\");\n }\n\n const mapProperty = property as ResolvedMapProperty;\n\n if (!mapProperty.properties || Object.keys(mapProperty.properties ?? {}).length === 0) {\n return (\n <KeyValuePreview value={value}/>\n );\n }\n\n if (!value) return null;\n\n const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)\n\n if (size === \"tiny\")\n return (\n <div className=\"w-full flex flex-col space-y-1 md:space-y-2\">\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n <ErrorBoundary\n key={\"map_preview_\" + mapProperty.name + key + index}>\n <PropertyPreview propertyKey={key}\n value={(value)[key]}\n property={mapProperty.properties![key]}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n </div>\n ))}\n </div>\n );\n\n return (\n <div\n className=\"flex flex-col gap-1 w-full\">\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n const childProperty = mapProperty.properties![key];\n return (\n <div\n key={`map_preview_table_${key}}`}\n className={cn(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"font-mono break-words\"}\n color={\"secondary\"}>\n {childProperty.name}\n </Typography>\n </div>\n <div\n className=\"flex-grow max-w-[75%]\">\n <ErrorBoundary>\n {!(childProperty.dataType === \"map\" || childProperty === \"array\") &&\n <PropertyPreview\n propertyKey={key}\n value={(value)[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>}\n </ErrorBoundary>\n </div>\n </div>\n\n {(childProperty.dataType === \"map\" || childProperty === \"array\") &&\n <div className={cn(defaultBorderMixin, \"border-l pl-4 ml-2 my-2\")}>\n <PropertyPreview\n propertyKey={key}\n value={(value)[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>\n </div>\n }\n </div>\n );\n })}\n </div>\n );\n\n}\n\nexport function KeyValuePreview({ value }: { value: any }) {\n if (typeof value !== \"object\") return null;\n return <div\n className=\"flex flex-col gap-1 w-full\">\n {\n Object.entries(value).map(([key, childValue]) => (\n <div\n key={`map_preview_table_${key}}`}\n className={cn(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n key={`table-cell-title-${key}-${key}`}\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"font-mono break-words\"}\n color={\"secondary\"}>\n {key}\n </Typography>\n </div>\n <div\n className=\"flex-grow max-w-[75%]\">\n {typeof childValue !== \"object\" && <Typography>\n <ErrorBoundary>\n {childValue && childValue.toString()}\n </ErrorBoundary>\n </Typography>}\n </div>\n </div>\n {typeof childValue === \"object\" &&\n <div className={cn(defaultBorderMixin, \"border-l pl-4\")}>\n <KeyValuePreview value={childValue}/>\n </div>\n }\n </div>\n ))\n }\n </div>;\n}\n","import React from \"react\";\n\nimport { format } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport { FireCMSContext } from \"../../types\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { defaultDateFormat } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function DatePreview({\n date\n }: { date: Date }): React.ReactElement {\n\n const appConfig: FireCMSContext<any> | undefined = useFireCMSContext();\n // @ts-ignore\n const dateUtilsLocale = appConfig?.locale ? locales[appConfig?.locale] : undefined;\n const dateFormat: string = appConfig?.dateTimeFormat ?? defaultDateFormat;\n const formattedDate = date ? format(date, dateFormat, { locale: dateUtilsLocale }) : \"\";\n\n return (\n <>\n {formattedDate}\n </>\n );\n}\n","import React from \"react\";\nimport { Checkbox } from \"@firecms/ui\";\n\n/**\n * @group Preview components\n */\nexport function BooleanPreview({ value }: {\n value: boolean\n}): React.ReactElement {\n return <Checkbox checked={value}/>;\n}\n","import React from \"react\";\n\nimport { EnumValuesChip, PropertyPreviewProps } from \"../../preview\";\nimport { enumToObjectEntries } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function NumberPropertyPreview({\n value,\n property,\n size\n }: PropertyPreviewProps<number>): React.ReactElement {\n\n if (property.enumValues) {\n const enumKey = value;\n const enumValues = enumToObjectEntries(property.enumValues);\n if (!enumValues)\n return <>{value}</>;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>;\n } else {\n return <>{value}</>;\n }\n}\n","import React, { createElement } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n CMSType,\n EntityReference,\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedNumberProperty,\n ResolvedStringProperty\n} from \"../types\";\n\nimport { resolveProperty } from \"../util\";\n\nimport { PropertyPreviewProps } from \"./PropertyPreviewProps\";\nimport { useFireCMSContext } from \"../hooks\";\nimport { EmptyValue } from \"./components/EmptyValue\";\nimport { UrlComponentPreview } from \"./components/UrlComponentPreview\";\nimport { StorageThumbnail } from \"./components/StorageThumbnail\";\nimport { Markdown } from \"@firecms/ui\";\nimport { StringPropertyPreview } from \"./property_previews/StringPropertyPreview\";\nimport { ArrayPropertyPreview } from \"./property_previews/ArrayPropertyPreview\";\nimport { ArrayOfReferencesPreview } from \"./property_previews/ArrayOfReferencesPreview\";\nimport { ArrayOfStorageComponentsPreview } from \"./property_previews/ArrayOfStorageComponentsPreview\";\nimport { ArrayPropertyEnumPreview } from \"./property_previews/ArrayPropertyEnumPreview\";\nimport { ArrayOfStringsPreview } from \"./property_previews/ArrayOfStringsPreview\";\nimport { ArrayOneOfPreview } from \"./property_previews/ArrayOneOfPreview\";\nimport { MapPropertyPreview } from \"./property_previews/MapPropertyPreview\";\nimport { ReferencePreview } from \"./components/ReferencePreview\";\nimport { DatePreview } from \"./components/DatePreview\";\nimport { BooleanPreview } from \"./components/BooleanPreview\";\nimport { NumberPropertyPreview } from \"./property_previews/NumberPropertyPreview\";\nimport { ErrorView } from \"../components\";\n\n/**\n * @group Preview components\n */\nexport const PropertyPreview = React.memo(function PropertyPreview<T extends CMSType>(props: PropertyPreviewProps<T>) {\n\n const fireCMSContext = useFireCMSContext();\n let content: React.ReactNode | any;\n const {\n property: inputProperty,\n propertyKey,\n value,\n size,\n height,\n width,\n // entity\n } = props;\n\n const property = resolveProperty({\n propertyKey,\n propertyOrBuilder: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (value === undefined || property === null) {\n content = <EmptyValue/>;\n } else if (property.Preview) {\n content = createElement(property.Preview as React.ComponentType<PropertyPreviewProps>,\n {\n propertyKey,\n value,\n property,\n size,\n height,\n width,\n // entity,\n customProps: property.customProps\n });\n } else if (value === null) {\n content = <EmptyValue/>;\n } else if (property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (typeof value === \"string\") {\n if (stringProperty.url) {\n if (typeof stringProperty.url === \"boolean\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}/>;\n else if (typeof stringProperty.url === \"string\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}\n previewType={stringProperty.url}/>;\n } else if (stringProperty.storage) {\n content = <StorageThumbnail\n storeUrl={property.storage?.storeUrl ?? false}\n size={props.size}\n storagePathOrDownloadUrl={value}/>;\n } else if (stringProperty.markdown) {\n content = <Markdown source={value}/>;\n } else {\n content = <StringPropertyPreview {...props}\n property={stringProperty}\n value={value}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"array\") {\n if (value instanceof Array) {\n const arrayProperty = property as ResolvedArrayProperty;\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n // else if (arrayProperty.of.dataType === \"map\") {\n // content =\n // <ArrayOfMapsPreview propertyKey={propertyKey}\n // property={property as ResolvedArrayProperty}\n // value={value as Record<string, any>[]} // This might be wrong\n // entity={entity}\n // size={size}\n // />;\n // }\n else if (arrayProperty.of.dataType === \"reference\") {\n content = <ArrayOfReferencesPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n } else if (arrayProperty.of.dataType === \"string\") {\n if (arrayProperty.of.enumValues) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n } else if (arrayProperty.of.storage) {\n content = <ArrayOfStorageComponentsPreview\n {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n } else {\n content = <ArrayOfStringsPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n }\n } else if (arrayProperty.of.dataType === \"number\" && arrayProperty.of.enumValues) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n } else {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n } else if (arrayProperty.oneOf) {\n content = <ArrayOneOfPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"map\") {\n if (typeof value === \"object\") {\n content =\n <MapPropertyPreview {...props}\n property={property as ResolvedMapProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"date\") {\n if (value instanceof Date) {\n content = <DatePreview date={value}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"reference\") {\n if (typeof property.path === \"string\") {\n if (value instanceof EntityReference) {\n content = <ReferencePreview\n disabled={!property.path}\n previewProperties={property.previewProperties}\n size={props.size}\n // onClick={props.onClick}\n reference={value as EntityReference}\n />;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else {\n content = <EmptyValue/>;\n }\n\n } else if (property.dataType === \"boolean\") {\n if (typeof value === \"boolean\") {\n content = <BooleanPreview value={value}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"number\") {\n if (typeof value === \"number\") {\n content = <NumberPropertyPreview {...props}\n value={value}\n property={property as ResolvedNumberProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else {\n content = JSON.stringify(value);\n }\n\n return content === undefined || content === null ? <EmptyValue/> : content;\n}, equal);\n\nfunction buildWrongValueType(name: string | undefined, dataType: string, value: any) {\n console.warn(`Unexpected value for property ${name}, of type ${dataType}`, value);\n return (\n <ErrorView title={\"Unexpected value\"}\n error={`${JSON.stringify(value)}`}/>\n );\n}\n","import React from \"react\";\nimport { ErrorBoundary } from \"../../components\";\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { resolveArrayProperty } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfMapsPreview({\n propertyKey,\n value,\n property: inputProperty,\n size,\n // entity\n }: PropertyPreviewProps<Record<string, any>[]>) {\n const fireCMSContext = useFireCMSContext();\n\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.dataType !== \"array\" || !property.of || property.of.dataType !== \"map\")\n throw Error(\"Picked wrong preview component ArrayOfMapsPreview\");\n\n const mapProperty = property.of;\n const properties = mapProperty.properties;\n if (!properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);\n }\n const values = value;\n const previewProperties: string[] | undefined = mapProperty.previewProperties;\n\n if (!values) return null;\n\n let mapProperties = previewProperties;\n if (!mapProperties || !mapProperties.length) {\n mapProperties = Object.keys(properties);\n if (size)\n mapProperties = mapProperties.slice(0, 3);\n }\n\n return (\n <div className=\"table-auto text-xs\">\n <div>\n {values &&\n values.map((v, index) => {\n return (\n <div key={`table_${v}_${index}`}\n className=\"border-b last:border-b-0\">\n {mapProperties && mapProperties.map(\n (key) => (\n <div\n key={`table-cell-${key as string}`}\n className=\"table-cell\"\n >\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={key as string}\n value={(v)[key]}\n property={properties[key as string]}\n // entity={entity}\n size={\"small\"}/>\n </ErrorBoundary>\n </div>\n )\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { Skeleton } from \"@firecms/ui\";\n\nexport interface AsyncPreviewComponentProps {\n builder: Promise<React.ReactNode>;\n}\n\n/**\n * Utility component used to render the result of an async execution.\n * It shows a loading indicator while at it.\n *\n * @group Preview components\n */\nexport const AsyncPreviewComponent = React.memo(function AsyncPreviewComponentInternal<M extends Record<string, any>>(\n {\n builder\n }: AsyncPreviewComponentProps) {\n\n const [loading, setLoading] = useState<boolean>(true);\n const [result, setResult] = useState<React.ReactNode>(null);\n\n useEffect(() => {\n let unmounted = false;\n builder\n .then((res) => {\n if (!unmounted) {\n setLoading(false);\n setResult(res);\n }\n })\n .catch(error => {\n setLoading(false);\n console.error(error);\n });\n return () => {\n unmounted = true;\n };\n }, [builder]);\n\n if (loading)\n return <Skeleton/>;\n\n return <React.Fragment>{result}</React.Fragment>;\n\n }\n);\n","import React, { useMemo } from \"react\";\nimport { PropertyPreview } from \"../preview\";\nimport { Entity, EntityCollection, FireCMSContext, ResolvedEntityCollection, ResolvedProperties } from \"../types\";\nimport { resolveCollection } from \"../util\";\nimport { useFireCMSContext } from \"../hooks\";\nimport { cn, defaultBorderMixin, IconButton, OpenInNewIcon } from \"@firecms/ui\";\n\n/**\n * @group Components\n */\nexport interface EntityPreviewProps<M extends Record<string, any>> {\n entity: Entity<M>;\n collection: EntityCollection<M>;\n path: string;\n className?: string;\n}\n\nexport function EntityPreview<M extends Record<string, any>>(\n {\n entity,\n collection,\n path,\n className\n }: EntityPreviewProps<M>) {\n\n const context = useFireCMSContext();\n const resolvedCollection: ResolvedEntityCollection<M> = useMemo(() => resolveCollection<M>({\n collection,\n path,\n entityId: entity.id,\n values: entity.values,\n fields: context.propertyConfigs\n }), [collection, path, entity]);\n\n const appConfig: FireCMSContext | undefined = useFireCMSContext();\n\n const properties: ResolvedProperties = resolvedCollection.properties;\n\n return (\n <div className={\"w-full \" + className}>\n <div className={\"w-full mb-4\"}>\n <div className={cn(defaultBorderMixin, \"flex justify-between py-2 border-b last:border-b-0\")}>\n <div className=\"flex items-center w-1/4\">\n <span className=\"pl-2 text-sm text-gray-600\">Id</span>\n </div>\n <div className=\"flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center\">\n <span className=\"flex-grow mr-2\">{entity.id}</span>\n {appConfig?.entityLinkBuilder &&\n <a href={appConfig.entityLinkBuilder({ entity })}\n rel=\"noopener noreferrer\"\n target=\"_blank\">\n <IconButton>\n <OpenInNewIcon\n size={\"small\"}/>\n </IconButton>\n </a>}\n </div>\n </div>\n {Object.entries(properties)\n .map(([key, property]) => {\n const value = (entity.values)[key];\n return (\n <div\n key={`reference_previews_${key}`}\n className={cn(defaultBorderMixin, \"flex justify-between py-2 border-b last:border-b-0\")}>\n <div className=\"flex items-center w-1/4\">\n <span className=\"pl-2 text-sm text-gray-600\">{property.name}</span>\n </div>\n <div className=\"flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center\">\n <PropertyPreview\n propertyKey={key}\n value={value}\n // entity={entity}\n property={property}\n size={\"medium\"}/>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n );\n}\n","import { EntityCollection, Property, ResolvedArrayProperty, ResolvedProperty } from \"../../../types\";\n\nexport function getTableCellAlignment(property: Property | ResolvedProperty): \"right\" | \"left\" | \"center\" {\n if (property.dataType === \"boolean\") {\n return \"center\";\n } else if (property.dataType === \"number\") {\n if (property.enumValues)\n return \"left\";\n return \"right\";\n } else if (property.dataType === \"date\") {\n return \"right\";\n } else {\n return \"left\";\n }\n}\n\nexport function getTablePropertyColumnWidth(property: ResolvedProperty): number {\n\n if (property.columnWidth) {\n return property.columnWidth;\n }\n\n if (property.dataType === \"string\") {\n if (property.url) {\n return 280;\n } else if (property.storage) {\n return 160;\n } else if (property.enumValues) {\n return 200;\n } else if (property.multiline) {\n return 300;\n } else if (property.markdown) {\n return 300;\n } else if (property.email) {\n return 200;\n } else {\n return 200;\n }\n } else if (property.dataType === \"array\") {\n const arrayProperty = property as ResolvedArrayProperty;\n if (arrayProperty.of) {\n if (Array.isArray(property.of)) {\n return 300;\n } else {\n return getTablePropertyColumnWidth(arrayProperty.of as ResolvedProperty);\n }\n } else {\n return 300;\n }\n } else if (property.dataType === \"number\") {\n if (property.enumValues) {\n return 200;\n }\n return 140;\n } else if (property.dataType === \"map\") {\n return 360;\n } else if (property.dataType === \"date\") {\n return 200;\n } else if (property.dataType === \"reference\") {\n return 220;\n } else if (property.dataType === \"boolean\") {\n return 140;\n } else {\n return 200;\n }\n}\n\nexport function getSubcollectionColumnId(collection: EntityCollection) {\n return `subcollection:${collection.id ?? collection.path}`;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\n\nimport { useDebounce } from \"../../../util\";\nimport { TextareaAutosize } from \"@firecms/ui\";\n\nexport function VirtualTableInput(props: {\n error: Error | undefined;\n value: string;\n multiline: boolean;\n focused: boolean;\n disabled: boolean;\n updateValue: (newValue: (string | null)) => void;\n}) {\n\n const ref = React.useRef<HTMLTextAreaElement>(null);\n\n const {\n disabled,\n value,\n multiline,\n updateValue,\n focused\n } = props;\n\n const prevValue = useRef<string | null>(value);\n\n const [internalValue, setInternalValue] = useState<typeof value>(value);\n const focusedState = useRef<boolean>(false);\n\n useEffect(() => {\n if (prevValue.current !== value && value !== internalValue)\n setInternalValue(value);\n prevValue.current = value;\n }, [value]);\n\n const doUpdate = React.useCallback(() => {\n const emptyInitialValue = !value;\n if (emptyInitialValue && !internalValue)\n return;\n if (internalValue !== value) {\n prevValue.current = internalValue;\n updateValue(internalValue);\n }\n }, [internalValue, updateValue, value]);\n\n useDebounce(internalValue, doUpdate, !focused, 2000);\n\n useEffect(() => {\n if (ref.current && focused && !focusedState.current) {\n focusedState.current = true;\n ref.current.focus({ preventScroll: true });\n ref.current.selectionStart = ref.current.value.length;\n ref.current.selectionEnd = ref.current.value.length;\n } else {\n focusedState.current = focused;\n }\n }, [focused, ref]);\n\n return (\n <TextareaAutosize\n ref={ref}\n style={{\n padding: 0,\n margin: 0,\n width: \"100%\",\n color: \"unset\",\n fontWeight: \"unset\",\n lineHeight: \"unset\",\n fontSize: \"unset\",\n fontFamily: \"unset\",\n background: \"unset\",\n border: \"unset\",\n resize: \"none\",\n outline: \"none\"\n }}\n value={internalValue ?? \"\"}\n onChange={(evt) => {\n const newValue = evt.target.value as string;\n if (multiline || !newValue.endsWith(\"\\n\"))\n setInternalValue(newValue);\n }}\n onFocus={() => {\n focusedState.current = true;\n }}\n onBlur={() => {\n focusedState.current = false;\n doUpdate();\n }}\n />\n );\n}\n","import { EnumValueConfig } from \"../../../types\";\nimport { ArrayEnumPreview, EnumValuesChip } from \"../../../preview\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { MultiSelect, MultiSelectItem, Select, SelectItem } from \"@firecms/ui\";\n\nexport function VirtualTableSelect(props: {\n name: string;\n enumValues: EnumValueConfig[];\n error: Error | undefined;\n multiple: boolean;\n disabled: boolean;\n small: boolean;\n internalValue: string | number | string[] | number[] | undefined;\n valueType: \"string\" | \"number\";\n updateValue: (newValue: (string | number | string[] | number[] | null)) => void;\n focused: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n name,\n enumValues,\n error,\n internalValue,\n disabled,\n small,\n focused,\n updateValue,\n multiple,\n valueType\n } = props;\n\n const validValue = (Array.isArray(internalValue) && multiple) ||\n (!Array.isArray(internalValue) && !multiple);\n\n const ref = React.useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (ref.current && focused) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n const onChange = useCallback((updatedValue: string | string[]) => {\n if (valueType === \"number\") {\n if (multiple) {\n const newValue = (updatedValue as string[]).map((v) => parseFloat(v));\n updateValue(newValue);\n } else {\n updateValue(parseFloat(updatedValue as string));\n }\n } else if (valueType === \"string\") {\n if (!updatedValue)\n updateValue(null)\n else\n updateValue(updatedValue);\n } else {\n throw Error(\"Missing mapping in TableSelect\");\n }\n }, [multiple, updateValue, valueType]);\n\n const renderValue = (enumKey: string | number, index: number) => {\n if (multiple && Array.isArray(enumKey)) {\n return <ArrayEnumPreview\n key={`${enumKey}-${index}`}\n value={enumKey}\n name={name}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>;\n } else {\n return <EnumValuesChip\n key={`${enumKey}-${index}`}\n enumKey={enumKey}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>;\n }\n };\n return (\n multiple\n ? <MultiSelect\n inputRef={ref}\n containerClassName=\"w-full h-full\"\n className=\"w-full h-full p-0 bg-transparent\"\n position={\"item-aligned\"}\n disabled={disabled}\n padding={false}\n includeFocusOutline={false}\n value={validValue\n ? ((internalValue as any[]).map(v => v.toString()))\n : ([])}\n onMultiValueChange={onChange}\n renderValue={renderValue}>\n {enumValues?.map((enumConfig) => (\n <MultiSelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </MultiSelectItem>\n ))}\n </MultiSelect>\n : <Select\n inputRef={ref}\n className=\"w-full h-full p-0 bg-transparent\"\n position={\"item-aligned\"}\n disabled={disabled}\n multiple={multiple}\n padding={false}\n includeFocusOutline={false}\n value={validValue\n ? (multiple ? (internalValue as any[]).map(v => v.toString()) : internalValue?.toString())\n : (multiple ? [] : \"\")}\n onValueChange={onChange}\n onMultiValueChange={onChange}\n renderValue={renderValue}>\n {enumValues?.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </SelectItem>\n ))}\n </Select>\n\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useDebounce } from \"../../../util\";\n\nexport function VirtualTableNumberInput(props: {\n error: Error | undefined;\n value: number;\n align: \"right\" | \"left\" | \"center\";\n updateValue: (newValue: (number | null)) => void;\n focused: boolean;\n disabled: boolean;\n}) {\n\n const {\n align,\n value,\n updateValue,\n focused,\n } = props;\n const propStringValue = (value && typeof value === \"number\") ? value.toString() : \"\";\n const [internalValue, setInternalValue] = useState<string | null>(propStringValue);\n\n const prevValue = useRef<number | null>(value);\n\n useEffect(() => {\n if (prevValue.current !== value && String(value) !== internalValue)\n setInternalValue(value ? value.toString() : null);\n prevValue.current = value;\n }, [value]);\n\n const doUpdate = React.useCallback(() => {\n if (internalValue !== propStringValue) {\n if (internalValue !== undefined && internalValue !== null) {\n const numberValue = parseFloat(internalValue);\n if (isNaN(numberValue))\n return;\n if (numberValue !== undefined && numberValue !== null)\n updateValue(numberValue);\n } else {\n updateValue(null);\n }\n }\n\n }, [internalValue, value]);\n\n useDebounce(internalValue, doUpdate, !focused, 2000);\n\n useEffect(\n () => {\n if (!focused && propStringValue !== internalValue)\n setInternalValue(value !== undefined && value !== null ? value.toString() : null);\n },\n [value, focused]\n );\n\n const ref = React.useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current && focused) {\n ref.current.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n const regexp = /^-?[0-9]+[,.]?[0-9]*$/;\n\n return (\n <input\n ref={ref}\n className=\"w-full text-right p-0 m-0 bg-transparent border-none resize-none outline-none font-normal leading-normal text-unset\"\n style={{\n textAlign: align\n }}\n value={internalValue ?? \"\"}\n onChange={(evt) => {\n const newValue = evt.target.value.replace(\",\", \".\");\n if (newValue.length === 0)\n setInternalValue(null);\n if (regexp.test(newValue) || newValue.startsWith(\"-\"))\n setInternalValue(newValue);\n }}\n />\n );\n}\n","import React, { useEffect } from \"react\";\nimport { BooleanSwitch } from \"@firecms/ui\";\n\nexport function VirtualTableSwitch(props: {\n error: Error | undefined;\n internalValue?: boolean;\n focused: boolean;\n disabled: boolean;\n updateValue: (newValue: (boolean | null)) => void;\n}) {\n const {\n internalValue,\n updateValue,\n focused\n } = props;\n const ref = React.useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n if (ref.current && focused) {\n ref.current.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n return (\n <BooleanSwitch\n ref={ref}\n size={\"small\"}\n value={Boolean(internalValue)}\n onValueChange={updateValue}\n />\n );\n}\n","import React from \"react\";\nimport { DateTimeField } from \"@firecms/ui\";\nimport { useFireCMSContext } from \"../../../hooks\";\n\nexport function VirtualTableDateField(props: {\n name: string;\n error: Error | undefined;\n mode?: \"date\" | \"date_time\";\n internalValue: Date | undefined | null;\n updateValue: (newValue: (Date | null)) => void;\n focused: boolean;\n disabled: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const { locale } = useFireCMSContext();\n const {\n disabled,\n error,\n mode,\n internalValue,\n updateValue\n } = props;\n\n return (\n <DateTimeField\n value={internalValue ?? undefined}\n onChange={(dateValue) => updateValue(dateValue)}\n size={\"medium\"}\n invisible={true}\n className={\"w-full h-full\"}\n inputClassName={\"w-full h-full\"}\n mode={mode}\n locale={locale}\n />\n );\n}\n","import React, { ErrorInfo, PropsWithChildren } from \"react\";\n\nimport { ErrorIcon, Typography } from \"@firecms/ui\";\n\nexport class ErrorBoundary extends React.Component<PropsWithChildren<Record<string, unknown>>, {\n error: Error | null\n}> {\n constructor(props: any) {\n super(props);\n this.state = { error: null };\n }\n\n // eslint-disable-next-line n/handle-callback-err\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(error);\n // logErrorToMyService(error, errorInfo);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div className=\"flex flex-col m-2\">\n <div className=\"flex items-center m-2\">\n <ErrorIcon color={\"error\"} size={\"small\"}/>\n <div className=\"ml-4\">Error</div>\n </div>\n <Typography variant={\"caption\"}>\n {this.state.error?.message ?? \"See the error in the console\"}\n </Typography>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import {\n EntityValues,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig,\n UploadedFileContext\n} from \"../types\";\nimport { randomString } from \"./strings\";\n\nexport async function resolveFilenameString<M extends object>(\n input: string | ((context: UploadedFileContext) => Promise<string> | string),\n storage: StorageConfig,\n values: EntityValues<M>,\n entityId: string,\n path: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n file: File,\n propertyKey: string): Promise<string> {\n let result;\n if (typeof input === \"function\") {\n result = await input({\n path,\n entityId,\n values,\n property,\n file,\n storage,\n propertyKey\n });\n if (!result)\n console.warn(\"Storage callback returned empty result. Using default name value\")\n } else {\n result = replacePlaceholders(file, input, entityId, propertyKey, path);\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n\nexport function resolveStoragePathString<M extends object>(\n input: string | ((context: UploadedFileContext) => string),\n storage: StorageConfig,\n values: EntityValues<M>,\n entityId: string,\n path: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n file: File,\n propertyKey: string): string {\n let result;\n if (typeof input === \"function\") {\n result = input({\n path,\n entityId,\n values,\n property,\n file,\n storage,\n propertyKey\n });\n if (!result)\n console.warn(\"Storage callback returned empty result. Using default name value\")\n } else {\n result = replacePlaceholders(file, input, entityId, propertyKey, path);\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n\nfunction replacePlaceholders(file: File, input: string, entityId: string, propertyKey: string, path: string) {\n const ext = file.name.split(\".\").pop();\n let result = input.replace(\"{entityId}\", entityId)\n .replace(\"{propertyKey}\", propertyKey)\n .replace(\"{rand}\", randomString())\n .replace(\"{file}\", file.name)\n .replace(\"{file.type}\", file.type)\n .replace(\"{path}\", path);\n if (ext) {\n result = result.replace(\"{file.ext}\", ext);\n const name = file.name.replace(`.${ext}`, \"\");\n result = result.replace(\"{file.name}\", name)\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n","import Resizer from \"react-image-file-resizer\";\nimport equal from \"react-fast-compare\";\n\nimport {\n EntityValues,\n ImageCompression,\n Property,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig,\n StorageSource,\n StringProperty\n} from \"../types\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PreviewSize } from \"../preview\";\nimport { randomString } from \"./strings\";\nimport { resolveFilenameString, resolveStoragePathString } from \"./storage\";\n\n/**\n * Internal representation of an item in the storage\n * It can have two states, having a storagePathOrDownloadUrl set,\n * which means the file has been uploaded, and it is rendered as a preview\n * Or have a pending file being uploaded.\n */\nexport interface StorageFieldItem {\n id: number; // generated on the fly for internal use only\n storagePathOrDownloadUrl?: string;\n file?: File;\n fileName?: string;\n metadata?: any,\n size: PreviewSize\n}\n\nexport function useStorageUploadController<M extends object>({\n entityId,\n entityValues,\n path,\n value,\n property,\n propertyKey,\n storageSource,\n disabled,\n onChange\n }:\n {\n entityId: string,\n entityValues: EntityValues<M>,\n value: string | string[] | null;\n path: string,\n propertyKey: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n storageSource: StorageSource,\n disabled: boolean,\n onChange: (value: string | string[] | null) => void\n }) {\n\n const storage: StorageConfig | undefined = property.dataType === \"string\"\n ? property.storage\n : property.dataType === \"array\" &&\n (property.of as Property).dataType === \"string\"\n ? (property.of as StringProperty).storage\n : undefined;\n\n const multipleFilesSupported = property.dataType === \"array\";\n\n if (!storage)\n throw Error(\"Storage meta must be specified\");\n\n const metadata: Record<string, any> | undefined = storage?.metadata;\n const size = multipleFilesSupported ? \"small\" : \"medium\";\n\n const compression: ImageCompression | undefined = storage?.imageCompression;\n\n const internalInitialValue: StorageFieldItem[] =\n (multipleFilesSupported\n ? (value ?? []) as string[]\n : value ? [value as string] : []).map(entry => (\n {\n id: getRandomId(),\n storagePathOrDownloadUrl: entry,\n metadata,\n size\n }\n ));\n\n const [initialValue, setInitialValue] = useState<string | string[] | null>(value);\n const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);\n\n useEffect(() => {\n if (!equal(initialValue, value)) {\n setInitialValue(value);\n setInternalValue(internalInitialValue);\n }\n }, [internalInitialValue, value, initialValue]);\n\n const fileNameBuilder = useCallback(async (file: File) => {\n if (storage.fileName) {\n const fileName = await resolveFilenameString(storage.fileName, storage, entityValues, entityId, path, property, file, propertyKey);\n if (!fileName || fileName.length === 0) {\n throw Error(\"You need to return a valid filename\");\n }\n return fileName;\n }\n return randomString() + \"_\" + file.name;\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const storagePathBuilder = useCallback((file: File) => {\n return resolveStoragePathString(storage.storagePath, storage, entityValues, entityId, path, property, file, propertyKey) ?? \"/\";\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const onFileUploadComplete = useCallback(async (uploadedPath: string,\n entry: StorageFieldItem,\n metadata?: any) => {\n\n console.debug(\"onFileUploadComplete\", uploadedPath, entry);\n\n let uploadPathOrDownloadUrl: string | null = uploadedPath;\n if (storage.storeUrl) {\n uploadPathOrDownloadUrl = (await storageSource.getDownloadURL(uploadedPath)).url;\n }\n if (storage.postProcess && uploadPathOrDownloadUrl) {\n uploadPathOrDownloadUrl = await storage.postProcess(uploadPathOrDownloadUrl);\n }\n\n if (!uploadPathOrDownloadUrl) {\n console.warn(\"uploadPathOrDownloadUrl is null\")\n return;\n }\n\n let newValue: StorageFieldItem[];\n\n entry.storagePathOrDownloadUrl = uploadPathOrDownloadUrl;\n entry.metadata = metadata;\n newValue = [...internalValue];\n\n newValue = removeDuplicates(newValue);\n setInternalValue(newValue);\n\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n\n if (multipleFilesSupported) {\n onChange(fieldValue);\n } else {\n onChange(fieldValue ? fieldValue[0] : null);\n }\n }, [internalValue, multipleFilesSupported, onChange, storage, storageSource]);\n\n const onFilesAdded = useCallback(async (acceptedFiles: File[]) => {\n\n if (!acceptedFiles.length || disabled)\n return;\n\n let newInternalValue: StorageFieldItem[];\n if (multipleFilesSupported) {\n newInternalValue = [...internalValue,\n ...(await Promise.all(acceptedFiles.map(async file => {\n if (compression && compressionFormat(file)) {\n file = await resizeAndCompressImage(file, compression)\n }\n\n return {\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n } as StorageFieldItem;\n })))];\n } else {\n let file = acceptedFiles[0]\n if (compression && compressionFormat(file)) {\n file = await resizeAndCompressImage(file, compression)\n }\n\n newInternalValue = [{\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n }];\n }\n\n // Remove either storage path or file duplicates\n newInternalValue = removeDuplicates(newInternalValue);\n setInternalValue(newInternalValue);\n }, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size]);\n\n return {\n internalValue,\n setInternalValue,\n storage,\n fileNameBuilder,\n storagePathBuilder,\n onFileUploadComplete,\n onFilesAdded,\n multipleFilesSupported\n }\n}\n\nfunction removeDuplicates(items: StorageFieldItem[]) {\n return items.filter(\n (item, i) => {\n return ((items.map((v) => v.storagePathOrDownloadUrl).indexOf(item.storagePathOrDownloadUrl) === i) || !item.storagePathOrDownloadUrl) &&\n ((items.map((v) => v.file).indexOf(item.file) === i) || !item.file);\n }\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\nconst supportedTypes: Record<string, string> = {\n \"image/jpeg\": \"JPEG\",\n \"image/png\": \"PNG\",\n \"image/webp\": \"WEBP\"\n}\nconst compressionFormat = (file: File) => supportedTypes[file.type] ? supportedTypes[file.type] : null;\n\nconst defaultQuality = 100;\nconst resizeAndCompressImage = (file: File, compression: ImageCompression) => new Promise<File>((resolve) => {\n\n const inputQuality = compression.quality === undefined ? defaultQuality : compression.quality;\n const quality = inputQuality >= 0 ? inputQuality <= 100 ? inputQuality : 100 : 100;\n\n const format = compressionFormat(file);\n if (!format) {\n throw Error(\"resizeAndCompressImage: Unsupported image format\");\n }\n Resizer.imageFileResizer(\n file,\n compression.maxWidth || Number.MAX_VALUE,\n compression.maxHeight || Number.MAX_VALUE,\n format,\n quality,\n 0,\n (file: string | Blob | File | ProgressEvent<FileReader>) => resolve(file as File),\n \"file\"\n )\n});\n","import React, { useCallback } from \"react\";\n\nimport { useSnackbarController, useStorageSource } from \"../../hooks\";\nimport { StorageFieldItem } from \"../../util/useStorageUploadController\";\nimport { ErrorView } from \"../../components\";\nimport { cn, paperMixin, Skeleton } from \"@firecms/ui\";\n\nexport interface StorageUploadItemProps {\n storagePath: string;\n metadata?: any,\n entry: StorageFieldItem,\n onFileUploadComplete: (value: string,\n entry: StorageFieldItem,\n metadata?: any) => Promise<void>;\n imageSize: number;\n simple: boolean;\n}\n\nexport function StorageUploadProgress({\n storagePath,\n entry,\n metadata,\n onFileUploadComplete,\n imageSize,\n simple\n }: StorageUploadItemProps) {\n\n const storage = useStorageSource();\n\n const snackbarController = useSnackbarController();\n\n const [error, setError] = React.useState<Error | undefined>();\n const [loading, setLoading] = React.useState<boolean>(false);\n const mounted = React.useRef(false);\n const uploading = React.useRef(false);\n\n const upload = useCallback((file: File, fileName?: string) => {\n\n if (uploading.current) return;\n uploading.current = true;\n setError(undefined);\n setLoading(true);\n\n storage.uploadFile({\n file,\n fileName,\n path: storagePath,\n metadata\n })\n .then(async ({ path }) => {\n console.debug(\"Upload successful\");\n await onFileUploadComplete(path, entry, metadata);\n if (mounted.current)\n setLoading(false);\n })\n .catch((e) => {\n console.warn(\"Upload error\", e);\n if (mounted.current) {\n setError(e);\n setLoading(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error uploading file: \" + e.message\n });\n }\n })\n .finally(() => {\n uploading.current = false;\n });\n }, [entry, metadata, onFileUploadComplete, storage, storagePath]);\n\n React.useEffect(() => {\n mounted.current = true;\n if (entry.file)\n upload(entry.file, entry.fileName);\n return () => {\n mounted.current = false;\n };\n }, [entry.file, entry.fileName, upload]);\n\n if (simple) {\n return <div className={`m-4 w-${imageSize} h-${imageSize}`}>\n\n {loading && <Skeleton className={`w-${imageSize} h-${imageSize}`}/>}\n\n </div>\n }\n return (\n\n <div className={cn(paperMixin,\n \"relative m-4 border-box flex items-center justify-center\",\n `min-w-[${imageSize}px] min-h-[${imageSize}px]`)}>\n\n {loading &&\n <Skeleton className=\"w-full h-full\"/>}\n\n {error && <ErrorView title={\"Error uploading file\"}\n error={error}/>}\n\n </div>\n\n );\n\n}\n","import { ErrorOutlineIcon, IconButton } from \"@firecms/ui\";\nimport { ErrorTooltip } from \"../../ErrorTooltip\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface EntityTableCellActionsProps {\n showError: false | Error | undefined;\n disabled: boolean;\n showExpandIcon: boolean | undefined;\n selected: boolean | undefined;\n openPopup?: (cellRect: DOMRect | undefined) => void;\n children?: React.ReactNode;\n}\n\nexport function EntityTableCellActions({ showError, disabled, showExpandIcon, selected, openPopup, children }: EntityTableCellActionsProps) {\n\n const ref = useRef<HTMLDivElement>(null);\n const doOpenPopup = useCallback(() => {\n if (openPopup) {\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n openPopup(cellRect);\n }\n }, []);\n\n const iconRef = useRef<HTMLButtonElement>();\n useEffect(() => {\n if (iconRef.current && selected) {\n iconRef.current.focus({ preventScroll: true });\n }\n }, [selected]);\n\n return <>\n {(showError || (!disabled && showExpandIcon)) &&\n <div ref={ref} className=\"absolute top-0.5 right-0.5 flex items-center\">\n {selected && children}\n\n {selected && !disabled && showExpandIcon &&\n <IconButton\n ref={iconRef}\n color={\"inherit\"}\n size={\"small\"}\n onClick={doOpenPopup}>\n <svg\n fill={\"#888\"}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\">\n <path className=\"cls-2\"\n d=\"M20,5a1,1,0,0,0-1-1L14,4h0a1,1,0,0,0,0,2h2.57L13.29,9.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L18,7.42V10a1,1,0,0,0,1,1h0a1,1,0,0,0,1-1Z\"/>\n <path className=\"cls-2\"\n d=\"M10.71,13.29a1,1,0,0,0-1.42,0L6,16.57V14a1,1,0,0,0-1-1H5a1,1,0,0,0-1,1l0,5a1,1,0,0,0,1,1h5a1,1,0,0,0,0-2H7.42l3.29-3.29A1,1,0,0,0,10.71,13.29Z\"/>\n </svg>\n </IconButton>\n }\n\n {showError && <ErrorTooltip\n side={\"left\"}\n className={\"flex items-center justify-center\"}\n style={{ width: 32, height: 32 }}\n title={showError.message}>\n <ErrorOutlineIcon\n size={\"small\"}\n color={\"error\"}\n />\n </ErrorTooltip>\n }\n\n </div>\n }\n </>;\n}\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\n\nimport { Entity, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig } from \"../../../types\";\nimport { useDropzone } from \"react-dropzone\";\nimport { PreviewSize, PropertyPreview } from \"../../../preview\";\nimport { ErrorBoundary } from \"../../ErrorBoundary\";\nimport { useSnackbarController, useStorageSource } from \"../../../hooks\";\nimport { getThumbnailMeasure } from \"../../../preview/util\";\nimport { StorageFieldItem, useStorageUploadController } from \"../../../util/useStorageUploadController\";\nimport { StorageUploadProgress } from \"../../../form/components/StorageUploadProgress\";\nimport { cn, EditIcon, IconButton, Typography } from \"@firecms/ui\";\nimport { EntityTableCellActions } from \"../internal/EntityTableCellActions\";\n\nconst dropZoneClasses = \"max-w-full box-border relative pt-[2px] items-center border border-transparent outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500 bg-green-50 dark:bg-green-900\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500 bg-red-50 dark:bg-red-900\"\n\n/**\n * Field that allows to upload files to Google Cloud Storage.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TableStorageUpload(props: {\n propertyKey: string;\n error: Error | undefined;\n disabled: boolean;\n value: string | string[] | null;\n updateValue: (newValue: (string | string[] | null)) => void;\n selected: boolean;\n focused: boolean;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n entity: Entity<any>;\n path: string;\n previewSize: PreviewSize;\n openPopup?: (cellRect?: DOMRect) => void;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n propertyKey,\n error,\n selected,\n openPopup,\n value,\n disabled,\n property,\n entity,\n path,\n previewSize,\n updateValue\n } = props;\n\n const storageSource = useStorageSource();\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported\n } = useStorageUploadController({\n entityValues: entity.values,\n entityId: entity.id,\n path,\n property,\n propertyKey,\n storageSource,\n onChange: updateValue,\n value,\n disabled\n });\n\n return (\n\n <StorageUpload\n internalValue={internalValue}\n setInternalValue={setInternalValue}\n name={propertyKey}\n disabled={disabled}\n autoFocus={false}\n openPopup={openPopup}\n error={error}\n selected={selected}\n property={property}\n onChange={updateValue}\n entity={entity}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}\n onFilesAdded={onFilesAdded}\n onFileUploadComplete={onFileUploadComplete}\n previewSize={previewSize}/>\n\n );\n}\n\ninterface StorageUploadProps {\n internalValue: StorageFieldItem[];\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n error?: Error;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n selected: boolean;\n disabled: boolean;\n entity: Entity<any>;\n previewSize: PreviewSize;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => void;\n storagePathBuilder: (file: File) => string;\n openPopup?: (cellRect?: DOMRect) => void;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;\n}\n\nfunction StorageUpload({\n property,\n name,\n internalValue,\n setInternalValue,\n openPopup,\n entity,\n selected,\n error,\n onChange,\n multipleFilesSupported,\n previewSize: previewSizeInput,\n disabled,\n autoFocus,\n storage,\n onFilesAdded,\n onFileUploadComplete,\n storagePathBuilder\n }: StorageUploadProps) {\n\n const [onHover, setOnHover] = useState(false);\n\n const previewSize = multipleFilesSupported && previewSizeInput === \"medium\" ? \"small\" : previewSizeInput;\n if (multipleFilesSupported) {\n const arrayProperty = property as ResolvedArrayProperty<string[]>;\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (arrayProperty.of) {\n if (arrayProperty.of.dataType !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: any | undefined = storage?.metadata;\n const hasValue = Boolean(internalValue);\n\n const snackbarContext = useSnackbarController();\n\n const {\n open,\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a, ...b }), {}) : undefined,\n disabled,\n maxSize: storage.maxSize,\n noClick: true,\n noKeyboard: true,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections, event) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n snackbarContext.open({\n type: \"error\",\n message: `Error uploading file: File is larger than ${storage.maxSize} bytes`\n });\n }\n }\n }\n }\n );\n\n const { ...rootProps } = getRootProps();\n\n const helpText = multipleFilesSupported\n ? \"Drag 'n' drop some files here, or click here to edit\"\n : \"Drag 'n' drop a file here, or click here edit\";\n\n const renderProperty = multipleFilesSupported\n ? (property as ResolvedArrayProperty<string[]>).of as ResolvedStringProperty\n : property as ResolvedStringProperty;\n\n const imageSize = useMemo(() => getThumbnailMeasure(previewSize), [previewSize]);\n const showError = !disabled && error;\n\n return (\n <div {...rootProps}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}\n className={cn(dropZoneClasses,\n \"relative w-full h-full flex\",\n `justify-${hasValue ? \"start\" : \"center\"}`,\n isDragActive ? activeDropClasses : \"\",\n isDragAccept ? acceptDropClasses : \"\",\n isDragReject ? rejectDropClasses : \"\"\n )}\n >\n\n <input autoFocus={autoFocus} {...getInputProps()} />\n\n {internalValue.map((entry, index) => {\n let child;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <TableStorageItemPreview\n key={`storage_preview_${index}`}\n property={renderProperty}\n value={entry.storagePathOrDownloadUrl}\n entity={entity}\n size={previewSize}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n key={`storage_progress_${index}`}\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={imageSize}\n simple={true}\n />\n );\n }\n\n return child;\n })\n }\n\n {!internalValue && <div\n className=\"flex-grow m-2 max-w-[200px]\"\n onClick={open}>\n <Typography\n className=\"text-gray-400 dark:text-gray-600\"\n variant={\"body2\"}\n align={\"center\"}>\n {helpText}\n </Typography>\n </div>}\n\n <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={true}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n onClick={open}>\n <EditIcon size={\"small\"} className={\"text-gray-500\"}/>\n </IconButton>\n </EntityTableCellActions>\n\n </div>\n );\n\n}\n\ninterface TableStorageItemPreviewProps {\n property: ResolvedStringProperty;\n value: string,\n size: PreviewSize;\n entity: Entity<any>;\n}\n\nexport function TableStorageItemPreview({\n property,\n value,\n size,\n entity\n }: TableStorageItemPreviewProps) {\n\n return (\n <div\n className={\"relative m-2\"}\n >\n\n {value &&\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={\"ignore\"} // TODO: Fix this\n value={value}\n property={property}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n }\n\n </div>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport { ReferencePreview, ReferencePreviewContainer } from \"../../../preview\";\nimport { CollectionSize, Entity, EntityCollection, EntityReference, FilterValues } from \"../../../types\";\n\nimport { getPreviewSizeFrom } from \"../../../preview/util\";\nimport { getReferenceFrom } from \"../../../util\";\nimport { useFireCMSContext, useNavigationController, useReferenceDialog } from \"../../../hooks\";\nimport { ErrorView } from \"../../ErrorView\";\nimport { Button } from \"@firecms/ui\";\n\ntype TableReferenceFieldProps = {\n name: string;\n disabled: boolean;\n internalValue: EntityReference | EntityReference[] | undefined | null;\n updateValue: (newValue: (EntityReference | EntityReference [] | null)) => void;\n size: CollectionSize;\n multiselect: boolean;\n previewProperties?: string[];\n title?: string;\n path: string;\n forceFilter?: FilterValues<string>;\n};\n\nexport function TableReferenceField(props: TableReferenceFieldProps) {\n\n const context = useFireCMSContext();\n const navigationController = useNavigationController();\n const { path } = props;\n const collection = navigationController.getCollection<EntityCollection>(path);\n if (!collection) {\n if (context.components?.missingReference) {\n return <context.components.missingReference path={path}/>;\n } else {\n throw Error(`Couldn't find the corresponding collection view for the path: ${path}`);\n }\n }\n return <TableReferenceFieldSuccess {...props} collection={collection}/>;\n}\n\nfunction TableReferenceFieldSuccess(props: TableReferenceFieldProps & {\n collection: EntityCollection;\n}) {\n const {\n name,\n internalValue,\n updateValue,\n multiselect,\n path,\n size,\n previewProperties,\n title,\n disabled,\n forceFilter,\n collection\n } = props;\n\n const [onHover, setOnHover] = useState(false);\n\n const hoverTrue = useCallback(() => setOnHover(true), []);\n const hoverFalse = useCallback(() => setOnHover(false), []);\n\n const onSingleEntitySelected = useCallback((entity: Entity<any>) => {\n updateValue(entity ? getReferenceFrom(entity) : null);\n }, [updateValue]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n updateValue(entities.map((e) => getReferenceFrom(e)));\n }, [updateValue]);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue)\n ? internalValue.map((ref) => ref.id)\n : internalValue.id ? [internalValue.id] : [])\n : [];\n\n const referenceDialogController = useReferenceDialog({\n multiselect,\n path,\n collection,\n onMultipleEntitiesSelected,\n onSingleEntitySelected,\n selectedEntityIds,\n forceFilter\n }\n );\n\n const handleOpen = useCallback(() => {\n if (disabled)\n return;\n referenceDialogController.open();\n }, [disabled, referenceDialogController]);\n\n const valueNotSet = !internalValue || (Array.isArray(internalValue) && internalValue.length === 0);\n\n const buildSingleReferenceField = () => {\n if (internalValue instanceof EntityReference)\n return <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}\n reference={internalValue as EntityReference}\n onHover={onHover}\n disabled={!path}\n previewProperties={previewProperties}\n />;\n else\n return <ReferencePreviewContainer\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}>\n <ErrorView title=\"Value is not a reference.\" error={\"Click to edit\"}/>\n </ReferencePreviewContainer>;\n };\n\n const buildMultipleReferenceField = () => {\n if (Array.isArray(internalValue))\n return <>\n {internalValue.map((reference, index) =>\n <div className=\"m-1 w-full\"\n key={`preview_array_ref_${name}_${index}`}>\n <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={\"tiny\"}\n reference={reference}\n onHover={onHover}\n disabled={!path}\n previewProperties={previewProperties}\n />\n </div>\n )\n }\n </>;\n else\n return <ErrorView error={\"Data is not an array of references\"}/>;\n };\n\n if (!collection)\n return <ErrorView error={\"The specified collection does not exist\"}/>;\n\n return (\n <div className=\"w-full\"\n onMouseEnter={hoverTrue}\n onMouseMove={hoverTrue}\n onMouseLeave={hoverFalse}>\n\n {internalValue && !multiselect && buildSingleReferenceField()}\n\n {internalValue && multiselect && buildMultipleReferenceField()}\n\n {valueNotSet &&\n <Button\n onClick={handleOpen}\n size={\"small\"}\n variant=\"outlined\"\n color=\"primary\">\n Edit {title}\n </Button>}\n\n </div>\n );\n}\n","import {\n CMSType,\n EntityReference,\n GeoPoint,\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedProperties,\n ResolvedProperty\n} from \"../types\";\nimport * as yup from \"yup\";\nimport { AnySchema, ArraySchema, BooleanSchema, DateSchema, NumberSchema, ObjectSchema, StringSchema } from \"yup\";\nimport { enumToObjectEntries } from \"../util/enums\";\nimport { getValueInPath, hydrateRegExp, isPropertyBuilder } from \"../util\";\n\n// Add custom unique function for array values\ndeclare module \"yup\" {\n // tslint:disable-next-line\n interface ArraySchema<T> {\n uniqueInArray(mapper: (a: T) => T, message: string): ArraySchema<T>;\n }\n}\nyup.addMethod(yup.array, \"uniqueInArray\", function (\n mapper = (a: any) => a,\n message: string\n) {\n return this.test(\"uniqueInArray\", message, values => {\n return !values || values.length === new Set(values.map(mapper)).size;\n });\n});\n\nexport type CustomFieldValidator = (props: {\n name: string,\n value: any,\n property: ResolvedProperty,\n entityId?: string,\n parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,\n}) => Promise<boolean>;\n\ninterface PropertyContext<T extends CMSType> {\n property: ResolvedProperty<T>,\n parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,\n entityId: string,\n customFieldValidator?: CustomFieldValidator,\n name?: any\n}\n\nexport function getYupEntitySchema<M extends Record<string, any>>(\n entityId: string,\n properties: ResolvedProperties<M>,\n customFieldValidator?: CustomFieldValidator): ObjectSchema<any> {\n const objectSchema: any = {};\n Object.entries(properties as Record<string, ResolvedProperty>)\n .forEach(([name, property]) => {\n objectSchema[name] = mapPropertyToYup({\n property: property as ResolvedProperty<any>,\n customFieldValidator,\n name,\n entityId\n });\n });\n return yup.object().shape(objectSchema);\n}\n\nexport function mapPropertyToYup<T extends CMSType>(propertyContext: PropertyContext<T>): AnySchema<unknown> {\n\n const property = propertyContext.property;\n if (isPropertyBuilder(property)) {\n console.error(\"Error in property\", propertyContext);\n throw Error(\"Trying to create a yup mapping from a property builder. Please use resolved properties only\");\n }\n\n if (property.dataType === \"string\") {\n return getYupStringSchema(propertyContext as PropertyContext<string>);\n } else if (property.dataType === \"number\") {\n return getYupNumberSchema(propertyContext as PropertyContext<number>);\n } else if (property.dataType === \"boolean\") {\n return getYupBooleanSchema(propertyContext as PropertyContext<boolean>);\n } else if (property.dataType === \"map\") {\n return getYupMapObjectSchema(propertyContext as PropertyContext<object>);\n } else if (property.dataType === \"array\") {\n return getYupArraySchema(propertyContext as PropertyContext<any[]>);\n } else if (property.dataType === \"date\") {\n return getYupDateSchema(propertyContext as PropertyContext<Date>);\n } else if (property.dataType === \"geopoint\") {\n return getYupGeoPointSchema(propertyContext as PropertyContext<GeoPoint>);\n } else if (property.dataType === \"reference\") {\n return getYupReferenceSchema(propertyContext as PropertyContext<EntityReference>);\n }\n console.error(\"Unsupported data type in yup mapping\", property)\n throw Error(\"Unsupported data type in yup mapping\");\n}\n\nexport function getYupMapObjectSchema<M extends Record<string, any>>({\n property,\n entityId,\n customFieldValidator,\n name\n }: PropertyContext<M>): ObjectSchema<any> {\n const objectSchema: any = {};\n const validation = property.validation;\n if (property.properties)\n Object.entries(property.properties).forEach(([childName, childProperty]: [string, ResolvedProperty]) => {\n objectSchema[childName] = mapPropertyToYup<any>({\n property: childProperty,\n parentProperty: property as ResolvedMapProperty,\n customFieldValidator,\n name: `${name}[${childName}]`,\n entityId\n });\n });\n\n return yup.object().shape(objectSchema);\n // const object: ObjectSchema<any> = yup.object().shape(objectSchema);\n // return validation?.required\n // ? object.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n // : yup.object().optional().default(undefined).notRequired().nullable(true).test(\n // \"empty-check\",\n // \"Optional map can be empty\",\n // (o: any, testContext: any) => {\n // try {\n // if (!o || Object.keys(o).length === 0) return true;\n // return object.validateSync(o);\n // } catch (e) {\n // testContext.createError(e);\n // console.error(e);\n // return false;\n // }\n // });\n}\n\nfunction getYupStringSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<string>): StringSchema {\n let collection: StringSchema<any> = yup.string();\n const validation = property.validation;\n if (property.enumValues) {\n if (validation?.required)\n collection = collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\");\n const entries = enumToObjectEntries(property.enumValues);\n collection = collection.oneOf(\n (validation?.required ? entries : [...entries, null])\n .map((enumValueConfig) => enumValueConfig?.id ?? null)\n ).nullable(true);\n }\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\", \"This value already exists and should be unique\",\n (value, context) =>\n customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be min ${validation.min} characters long`);\n if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be max ${validation.max} characters long`);\n if (validation.matches) {\n const regExp = typeof validation.matches === \"string\" ? hydrateRegExp(validation.matches) : validation.matches;\n if (regExp) {\n collection = collection.matches(regExp, validation.matchesMessage ? { message: validation.matchesMessage } : undefined)\n }\n }\n if (validation.trim) collection = collection.trim();\n if (validation.lowercase) collection = collection.lowercase();\n if (validation.uppercase) collection = collection.uppercase();\n if (property.email) collection = collection.email(`${property.name} must be an email`);\n if (property.url) collection = collection.url(`${property.name} must be a url`);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupNumberSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<number>): NumberSchema {\n const validation = property.validation;\n let collection: NumberSchema<any> = yup.number().typeError(\"Must be a number\");\n if (validation) {\n collection = validation.required\n ? collection.required(validation.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be higher or equal to ${validation.min}`);\n if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be lower or equal to ${validation.max}`);\n if (validation.lessThan || validation.lessThan === 0) collection = collection.lessThan(validation.lessThan, `${property.name} must be higher than ${validation.lessThan}`);\n if (validation.moreThan || validation.moreThan === 0) collection = collection.moreThan(validation.moreThan, `${property.name} must be lower than ${validation.moreThan}`);\n if (validation.positive) collection = collection.positive(`${property.name} must be positive`);\n if (validation.negative) collection = collection.negative(`${property.name} must be negative`);\n if (validation.integer) collection = collection.integer(`${property.name} must be an integer`);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupGeoPointSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<GeoPoint>): AnySchema {\n let collection: ObjectSchema<any> = yup.object();\n const validation = property.validation;\n if (validation?.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation?.required) {\n collection = collection.required(validation.requiredMessage).nullable(true);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupDateSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<Date>): AnySchema | DateSchema {\n if (property.autoValue) {\n return yup.object().nullable();\n }\n let collection: DateSchema<any> = yup.date();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\")\n : collection.notRequired();\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min) collection = collection.min(validation.min, `${property.name} must be after ${validation.min}`);\n if (validation.max) collection = collection.max(validation.max, `${property.name} must be before ${validation.min}`);\n } else {\n collection = collection.notRequired();\n }\n return collection\n .transform((v: any) => (v instanceof Date ? v : null))\n .nullable();\n}\n\nfunction getYupReferenceSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<EntityReference>): AnySchema {\n let collection: ObjectSchema<any> = yup.object();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupBooleanSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<boolean>): BooleanSchema {\n let collection: BooleanSchema<any> = yup.boolean();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction hasUniqueInArrayModifier(property: ResolvedProperty): boolean | [string, ResolvedProperty][] {\n if (property.validation?.uniqueInArray) {\n return true;\n } else if (property.dataType === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .filter(([key, childProperty]) => childProperty.validation?.uniqueInArray);\n }\n return false;\n}\n\nfunction getYupArraySchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<any[]>): AnySchema<any> {\n\n let arraySchema: ArraySchema<any> = yup.array();\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n const yupProperties = (property.of as ResolvedProperty[]).map((p, index) => ({\n [`${name}[${index}]`]: mapPropertyToYup({\n property: p as ResolvedProperty<any>,\n parentProperty: property,\n entityId\n })\n })).reduce((a, b) => ({ ...a, ...b }), {});\n return yup.array().of(\n yup.mixed().test(\n \"Dynamic object validation\",\n \"Dynamic object validation error\",\n (object, context) => {\n const yupProperty = getValueInPath(yupProperties, context.path);\n return yupProperty.validate(object);\n }\n )\n );\n } else {\n arraySchema = arraySchema.of(mapPropertyToYup({\n property: property.of,\n parentProperty: property,\n entityId\n }));\n const arrayUniqueFields = hasUniqueInArrayModifier(property.of);\n if (arrayUniqueFields) {\n if (typeof arrayUniqueFields === \"boolean\") {\n arraySchema = arraySchema.uniqueInArray(v => v, `${property.name} should have unique values within the array`);\n } else if (Array.isArray(arrayUniqueFields)) {\n arrayUniqueFields.forEach(([name, childProperty]) => {\n arraySchema = arraySchema.uniqueInArray(v => v && v[name], `${property.name} → ${childProperty.name ?? name}: should have unique values within the array`);\n }\n );\n }\n }\n }\n }\n const validation = property.validation;\n\n if (validation) {\n arraySchema = validation.required\n ? arraySchema.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : arraySchema.notRequired().nullable(true);\n if (validation.min || validation.min === 0) arraySchema = arraySchema.min(validation.min, `${property.name} should be min ${validation.min} entries long`);\n if (validation.max) arraySchema = arraySchema.max(validation.max, `${property.name} should be max ${validation.max} entries long`);\n } else {\n arraySchema = arraySchema.notRequired().nullable(true);\n }\n return arraySchema;\n}\n","import { VirtualTableSize } from \"./VirtualTableProps\";\n\nexport function getRowHeight(size: VirtualTableSize): number {\n switch (size) {\n case \"xl\":\n return 400;\n case \"l\":\n return 280;\n case \"m\":\n return 140;\n case \"s\":\n return 80;\n case \"xs\":\n return 54;\n default:\n throw Error(\"Missing mapping for collection size -> height\");\n }\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport useMeasure from \"react-use-measure\";\n\nimport { VirtualTableSize } from \"../../VirtualTable\";\nimport { getRowHeight } from \"../../VirtualTable/common\";\nimport { cn, RemoveCircleIcon, Tooltip } from \"@firecms/ui\";\nimport { useOutsideAlerter } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../../components\";\n\ninterface EntityTableCellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n /**\n * The value is used only to check changes and force re-renders\n */\n value?: any;\n disabled: boolean;\n saved?: boolean;\n error?: Error;\n allowScroll?: boolean;\n align: \"right\" | \"left\" | \"center\";\n size: VirtualTableSize;\n disabledTooltip?: string;\n width: number;\n showExpandIcon?: boolean;\n removePadding?: boolean;\n fullHeight?: boolean;\n selected?: boolean;\n hideOverflow?: boolean;\n onSelect?: (cellRect: DOMRect | undefined) => void;\n}\n\ntype TableCellInnerProps = {\n justifyContent: string;\n scrollable: boolean;\n faded: boolean;\n fullHeight: boolean;\n children: React.ReactNode;\n}\n\nconst TableCellInner = ({\n justifyContent,\n scrollable,\n faded,\n fullHeight,\n children\n }: TableCellInnerProps) => {\n return (\n <div\n className={cn(\"flex flex-col max-h-full w-full\",\n {\n \"items-start\": faded || scrollable\n })}\n style={{\n justifyContent,\n height: fullHeight ? \"100%\" : undefined,\n overflow: scrollable ? \"auto\" : undefined,\n WebkitMaskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined,\n maskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined\n }}\n >\n {children}\n </div>\n );\n};\n\nexport const EntityTableCell = React.memo<EntityTableCellProps>(\n function EntityTableCell({\n children,\n actions,\n size,\n selected,\n disabled,\n disabledTooltip,\n saved,\n error,\n align,\n allowScroll,\n removePadding,\n fullHeight,\n onSelect,\n width,\n hideOverflow = true,\n showExpandIcon = true\n }: EntityTableCellProps) {\n\n const [measureRef, bounds] = useMeasure();\n const ref = useRef<HTMLDivElement>(null);\n useOutsideAlerter(ref, () => {\n if (selected && onSelect) {\n onSelect(undefined);\n }\n }, Boolean(selected && onSelect));\n\n const [isOverflowing, setIsOverflowing] = useState<boolean>(false);\n const maxHeight = useMemo(() => getRowHeight(size), [size]);\n\n const [onHover, setOnHover] = useState(false);\n const [internalSaved, setInternalSaved] = useState(saved);\n\n const showError = !disabled && error;\n\n useEffect(() => {\n if (saved) {\n setInternalSaved(true);\n }\n const handler = setTimeout(() => {\n setInternalSaved(false);\n }, 800);\n return () => {\n clearTimeout(handler);\n };\n }, [saved]);\n\n let p = 0;\n if (!removePadding) {\n switch (size) {\n case \"l\":\n case \"xl\":\n p = 4;\n break;\n case \"m\":\n p = 2;\n break;\n case \"s\":\n default:\n p = 1;\n break;\n }\n }\n\n let justifyContent;\n switch (align) {\n case \"right\":\n justifyContent = \"flex-end\";\n break;\n case \"center\":\n justifyContent = \"center\";\n break;\n case \"left\":\n default:\n justifyContent = \"flex-start\";\n }\n\n // const onClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n // if (event.detail === 3) {\n // doOpenPopup();\n // }\n // }, [doOpenPopup]);\n\n const onSelectCallback = useCallback(() => {\n if (!onSelect) return;\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n if (disabled) {\n onSelect(undefined);\n } else if (!selected && cellRect) {\n onSelect(cellRect);\n }\n }, [ref, onSelect, selected, disabled]);\n\n const onFocus = useCallback((event: React.SyntheticEvent<HTMLDivElement>) => {\n onSelectCallback();\n event.stopPropagation();\n }, [onSelectCallback]);\n\n useEffect(() => {\n if (bounds) {\n const newOverflowingValue = bounds.height > maxHeight;\n if (isOverflowing !== newOverflowingValue)\n setIsOverflowing(newOverflowingValue);\n }\n }, [bounds, isOverflowing, maxHeight]);\n\n const isSelected = !showError && selected;\n\n const scrollable = !disabled && allowScroll && isOverflowing;\n const faded = !disabled && !allowScroll && isOverflowing;\n\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"transition-colors duration-100 ease-in-out\",\n `flex relative h-full rounded-md p-${p} border border-4 border-opacity-75`,\n onHover && !disabled ? \"bg-gray-50 dark:bg-gray-900\" : \"\",\n saved ? \"bg-gray-100 bg-opacity-75 dark:bg-gray-800 dark:bg-opacity-75\" : \"\",\n !isSelected && !internalSaved && !showError ? \"border-transparent\" : \"\",\n hideOverflow ? \"overflow-hidden\" : \"\",\n isSelected ? \"bg-gray-50 dark:bg-gray-900\" : \"\",\n isSelected && !internalSaved ? \"border-primary\" : \"\",\n internalSaved ? \"border-green-500 \" : \"\",\n showError ? \"border-red-500\" : \"\"\n )}\n style={{\n justifyContent,\n alignItems: disabled || !isOverflowing ? \"center\" : undefined,\n width: width ?? \"100%\",\n textAlign: align\n }}\n tabIndex={selected || disabled ? undefined : 0}\n onFocus={onFocus}\n // onClick={onClick}\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n // contain={scrollable ? \"content\" : \"size\"}\n >\n\n <ErrorBoundary>\n\n {fullHeight && !faded && children}\n\n {(!fullHeight || faded) && <TableCellInner\n fullHeight={fullHeight ?? false}\n justifyContent={justifyContent}\n scrollable={scrollable ?? false}\n faded={faded}>\n\n {!fullHeight && <div ref={measureRef}\n style={{\n display: \"flex\",\n width: \"100%\",\n justifyContent,\n height: fullHeight ? \"100%\" : undefined\n }}>\n {children}\n </div>}\n\n </TableCellInner>}\n </ErrorBoundary>\n\n {actions}\n\n {disabled && onHover && disabledTooltip &&\n <div className=\"absolute top-1 right-1 text-xs\">\n <Tooltip title={disabledTooltip}>\n <RemoveCircleIcon size={\"smallest\"} color={\"disabled\"} className={\"text-gray-500\"}/>\n </Tooltip>\n </div>}\n\n </div>\n );\n }, (a, b) =>\n a.error === b.error &&\n a.value === b.value &&\n a.disabled === b.disabled &&\n a.saved === b.saved &&\n a.allowScroll === b.allowScroll &&\n a.align === b.align &&\n a.size === b.size &&\n a.disabledTooltip === b.disabledTooltip &&\n a.width === b.width &&\n a.showExpandIcon === b.showExpandIcon &&\n a.removePadding === b.removePadding &&\n a.fullHeight === b.fullHeight &&\n a.selected === b.selected) as React.FunctionComponent<EntityTableCellProps>;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\nimport {\n CMSType,\n Entity,\n EntityReference,\n ResolvedArrayProperty,\n ResolvedNumberProperty,\n ResolvedProperty,\n ResolvedStringProperty\n} from \"../../../types\";\n\nimport { VirtualTableInput } from \"../../VirtualTable/fields/VirtualTableInput\";\nimport { VirtualTableSelect } from \"../../VirtualTable/fields/VirtualTableSelect\";\nimport { VirtualTableNumberInput } from \"../../VirtualTable/fields/VirtualTableNumberInput\";\nimport { VirtualTableSwitch } from \"../../VirtualTable/fields/VirtualTableSwitch\";\nimport { VirtualTableDateField } from \"../../VirtualTable/fields/VirtualTableDateField\";\n\nimport { TableStorageUpload } from \"../fields/TableStorageUpload\";\nimport { TableReferenceField } from \"../fields/TableReferenceField\";\n\nimport { PropertyPreview } from \"../../../preview\";\nimport { getPreviewSizeFrom } from \"../../../preview/util\";\nimport { isReadOnly } from \"../../../util\";\n\nimport { CustomFieldValidator, mapPropertyToYup } from \"../../../form/validation\";\nimport { useEntityCollectionTableController } from \"../EntityCollectionTable\";\nimport { useClearRestoreValue, useFireCMSContext } from \"../../../hooks\";\n\nimport { EntityTableCell } from \"./EntityTableCell\";\nimport { getRowHeight } from \"../../VirtualTable/common\";\nimport { EntityTableCellActions } from \"./EntityTableCellActions\";\n\nexport interface PropertyTableCellProps<T extends CMSType, M extends Record<string, any>> {\n propertyKey: string;\n columnIndex: number;\n align: \"right\" | \"left\" | \"center\";\n customFieldValidator?: CustomFieldValidator;\n value: T;\n readonly: boolean;\n property: ResolvedProperty<T>;\n height: number;\n width: number;\n entity: Entity<any>;\n path: string;\n disabled: boolean;\n}\n\nfunction isStorageProperty<T>(property: ResolvedProperty) {\n if (property.dataType === \"string\" && (property as ResolvedStringProperty).storage)\n return true;\n if (property.dataType === \"array\") {\n if (Array.isArray(property.of)) {\n return false;\n } else {\n return ((property as ResolvedArrayProperty).of as ResolvedProperty)?.dataType === \"string\" &&\n ((property as ResolvedArrayProperty).of as ResolvedStringProperty)?.storage\n }\n }\n return false;\n}\n\nexport const PropertyTableCell = React.memo<PropertyTableCellProps<any, any>>(\n function PropertyTableCell<T extends CMSType, M extends Record<string, any>>({\n propertyKey,\n customFieldValidator,\n value,\n property,\n align,\n width,\n height,\n path,\n entity,\n readonly,\n disabled: disabledProp\n }: PropertyTableCellProps<T, M>) {\n\n const context = useFireCMSContext();\n\n const {\n onValueChange,\n size,\n selectedCell,\n select,\n setPopupCell\n } = useEntityCollectionTableController();\n\n const selected = selectedCell?.propertyKey === propertyKey &&\n selectedCell?.entity.path === entity.path &&\n selectedCell?.entity.id === entity.id;\n\n const [internalValue, setInternalValue] = useState<any | null>(value);\n const internalValueRef = useRef(value);\n\n const [error, setError] = useState<Error | undefined>();\n const [saved, setSaved] = useState<boolean>(false);\n\n const onValueUpdated = useCallback(() => {\n setSaved(true)\n setTimeout(() => {\n setSaved(false);\n }, 100);\n }, []);\n\n const customField = Boolean(property.Field);\n const customPreview = Boolean(property.Preview);\n const readOnlyProperty = isReadOnly(property);\n const disabledTooltip: string | undefined = typeof property.disabled === \"object\" ? property.disabled.disabledMessage : undefined;\n const disabled = readonly || disabledProp || Boolean(property.disabled);\n\n const validation = useMemo(() => mapPropertyToYup({\n property,\n entityId: entity.id,\n customFieldValidator,\n name: propertyKey\n }), [entity.id, property, propertyKey]);\n\n useEffect(\n () => {\n if (!equal(value, internalValueRef.current)) {\n setError(undefined);\n setInternalValue(value);\n internalValueRef.current = value;\n onValueUpdated();\n }\n },\n [onValueUpdated, value]\n );\n\n const saveValues = (value: any) => {\n if (equal(value, internalValueRef.current))\n return;\n setSaved(false);\n validation\n .validate(value)\n .then(() => {\n setError(undefined);\n internalValueRef.current = value;\n if (onValueChange) {\n onValueChange({\n value,\n propertyKey,\n setError,\n onValueUpdated,\n entity,\n fullPath: path,\n context\n });\n }\n })\n .catch((e) => {\n setError(e);\n });\n };\n\n useEffect(() => {\n validation\n .validate(internalValue)\n .then(() => setError(undefined))\n .catch((e) => {\n setError(e);\n });\n }, [internalValue, validation, propertyKey, property, entity]);\n\n const updateValue = (newValue: any | null) => {\n\n let updatedValue: any;\n if (newValue === undefined) {\n updatedValue = null;\n } else {\n updatedValue = newValue;\n }\n setInternalValue(updatedValue);\n saveValues(updatedValue);\n };\n\n useClearRestoreValue<any>({\n property,\n value: internalValue,\n setValue: updateValue\n });\n\n const onSelect = useCallback((cellRect: DOMRect | undefined) => {\n if (!cellRect) {\n select(undefined);\n } else {\n select({\n width,\n height,\n entity,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>,\n });\n }\n }, [entity, height, propertyKey, select, width]);\n\n const openPopup = (cellRect: DOMRect | undefined) => {\n if (!setPopupCell)\n return;\n if (!cellRect) {\n setPopupCell(undefined);\n } else {\n setPopupCell({\n width,\n height,\n entity,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>\n });\n }\n };\n\n let innerComponent: React.ReactNode | undefined;\n let allowScroll = false;\n let showExpandIcon = false;\n let hideOverflow = true;\n let removePadding = false;\n let fullHeight = false;\n let includeActions = true;\n const showError = !disabled && error;\n\n if (readonly || readOnlyProperty) {\n return <EntityTableCell\n size={size}\n width={width}\n saved={saved}\n key={`${propertyKey}_${entity.path}_${entity.id}`}\n value={internalValue}\n align={align ?? \"left\"}\n fullHeight={false}\n disabledTooltip={disabledTooltip ?? (readOnlyProperty ? \"Read only\" : undefined)}\n disabled={true}>\n <PropertyPreview\n width={width}\n height={getRowHeight(size)}\n propertyKey={propertyKey}\n property={property}\n // entity={entity}\n value={internalValue}\n size={getPreviewSizeFrom(size)}\n />\n </EntityTableCell>;\n }\n\n if (!customField && (!customPreview || selected)) {\n const isAStorageProperty = isStorageProperty(property);\n if (isAStorageProperty) {\n innerComponent = <TableStorageUpload error={error}\n disabled={disabled}\n focused={selected}\n selected={selected}\n openPopup={setPopupCell ? openPopup : undefined}\n property={property as ResolvedStringProperty | ResolvedArrayProperty<string[]>}\n entity={entity}\n path={path}\n value={internalValue}\n previewSize={getPreviewSizeFrom(size)}\n updateValue={updateValue}\n propertyKey={propertyKey as string}\n />;\n includeActions = false;\n showExpandIcon = true;\n fullHeight = true;\n removePadding = true;\n } else if (selected && property.dataType === \"number\") {\n const numberProperty = property as ResolvedNumberProperty;\n if (numberProperty.enumValues) {\n innerComponent = <VirtualTableSelect name={propertyKey as string}\n multiple={false}\n disabled={disabled}\n focused={selected}\n valueType={\"number\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={numberProperty.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n fullHeight = true;\n } else {\n innerComponent = <VirtualTableNumberInput\n align={align}\n error={error}\n focused={selected}\n disabled={disabled}\n value={internalValue as number}\n updateValue={updateValue}\n />;\n allowScroll = true;\n }\n } else if (selected && property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (stringProperty.enumValues) {\n innerComponent = <VirtualTableSelect name={propertyKey as string}\n multiple={false}\n focused={selected}\n disabled={disabled}\n valueType={\"string\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={stringProperty.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n fullHeight = true;\n } else if (!stringProperty.storage) {\n const multiline = Boolean(stringProperty.multiline) || Boolean(stringProperty.markdown);\n innerComponent = <VirtualTableInput error={error}\n disabled={disabled}\n multiline={multiline}\n focused={selected}\n value={internalValue as string}\n updateValue={updateValue}\n />;\n allowScroll = true;\n }\n } else if (property.dataType === \"boolean\") {\n innerComponent = <VirtualTableSwitch error={error}\n disabled={disabled}\n focused={selected}\n internalValue={internalValue as boolean}\n updateValue={updateValue}\n />;\n } else if (property.dataType === \"date\") {\n innerComponent = <VirtualTableDateField name={propertyKey as string}\n error={error}\n disabled={disabled}\n mode={property.mode}\n focused={selected}\n internalValue={internalValue as Date}\n updateValue={updateValue}\n />;\n fullHeight = true;\n hideOverflow = false;\n allowScroll = false;\n } else if (property.dataType === \"reference\") {\n if (typeof property.path === \"string\") {\n innerComponent =\n <TableReferenceField name={propertyKey as string}\n internalValue={internalValue as EntityReference}\n updateValue={updateValue}\n disabled={disabled}\n size={size}\n path={property.path}\n multiselect={false}\n previewProperties={property.previewProperties}\n title={property.name}\n forceFilter={property.forceFilter}\n />;\n }\n allowScroll = false;\n } else if (property.dataType === \"array\") {\n const arrayProperty = (property as ResolvedArrayProperty);\n\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n if (arrayProperty.of && !Array.isArray(arrayProperty.of)) {\n if (arrayProperty.of.dataType === \"string\" || arrayProperty.of.dataType === \"number\") {\n if (selected && arrayProperty.of.enumValues) {\n innerComponent =\n <VirtualTableSelect name={propertyKey as string}\n multiple={true}\n disabled={disabled}\n focused={selected}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n valueType={arrayProperty.of.dataType}\n enumValues={arrayProperty.of.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n allowScroll = true;\n fullHeight = true;\n hideOverflow = false;\n }\n } else if (arrayProperty.of.dataType === \"reference\") {\n if (typeof arrayProperty.of.path === \"string\") {\n innerComponent =\n <TableReferenceField\n name={propertyKey as string}\n disabled={disabled}\n internalValue={internalValue as EntityReference[]}\n updateValue={updateValue}\n size={size}\n multiselect={true}\n path={arrayProperty.of.path}\n previewProperties={arrayProperty.of.previewProperties}\n title={arrayProperty.of.name}\n forceFilter={arrayProperty.of.forceFilter}\n />;\n }\n allowScroll = false;\n }\n }\n\n }\n }\n\n if (!innerComponent) {\n allowScroll = false;\n showExpandIcon = selected && !innerComponent && !disabled && !readOnlyProperty;\n innerComponent = (\n <PropertyPreview\n width={width}\n height={height}\n // entity={entity}\n propertyKey={propertyKey as string}\n value={internalValue}\n property={property}\n size={getPreviewSizeFrom(size)}\n />\n );\n }\n\n return (\n <EntityTableCell\n key={`cell_${propertyKey}_${entity.path}_${entity.id}`}\n size={size}\n width={width}\n onSelect={onSelect}\n selected={selected}\n disabled={disabled || readOnlyProperty}\n disabledTooltip={disabledTooltip ?? \"Disabled\"}\n removePadding={removePadding}\n fullHeight={fullHeight}\n saved={saved}\n error={error}\n align={align}\n allowScroll={allowScroll}\n showExpandIcon={showExpandIcon}\n value={internalValue}\n hideOverflow={hideOverflow}\n actions={includeActions && <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={showExpandIcon}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}/>}\n >\n\n {innerComponent}\n\n </EntityTableCell>\n );\n\n },\n areEqual) as React.FunctionComponent<PropertyTableCellProps<any, any>>;\n\nfunction areEqual(prevProps: PropertyTableCellProps<any, any>, nextProps: PropertyTableCellProps<any, any>) {\n return prevProps.height === nextProps.height &&\n prevProps.propertyKey === nextProps.propertyKey &&\n prevProps.align === nextProps.align &&\n prevProps.width === nextProps.width &&\n equal(prevProps.property, nextProps.property) &&\n equal(prevProps.value, nextProps.value) &&\n equal(prevProps.entity.id, nextProps.entity.id) &&\n equal(prevProps.entity.values, nextProps.entity.values)\n ;\n}\n","import React from \"react\";\nimport { CircularProgress, CircularProgressProps, Typography } from \"@firecms/ui\";\n\n/**\n *\n * @param text\n * @param props\n * @constructor\n * @ignore\n */\nexport function CircularProgressCenter({ text, ...props }: CircularProgressProps & {\n text?: string\n}) {\n return (\n <div\n className=\"flex w-full h-screen max-h-full max-w-full bg-gray-50 dark:bg-gray-900 gap-4\">\n <div className=\"m-auto flex flex-col gap-2 items-center\">\n <CircularProgress {...props}/>\n {text && <Typography\n color={\"secondary\"}\n variant={\"caption\"}\n className=\"text-center\">{text}</Typography>}\n </div>\n </div>\n );\n}\n","import React, { RefObject, useCallback, useEffect, useState } from \"react\";\nimport equal from \"react-fast-compare\";\n\nimport { VirtualTableColumn, VirtualTableSort, VirtualTableWhereFilterOp } from \"./VirtualTableProps\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport {\n ArrowUpwardIcon,\n Badge,\n Button,\n cn,\n defaultBorderMixin,\n FilterListIcon,\n IconButton,\n Popover\n} from \"@firecms/ui\";\n\ninterface FilterFormProps<T> {\n column: VirtualTableColumn<T>;\n onFilterUpdate: (filter?: [VirtualTableWhereFilterOp, any], newOpenFilterState?: boolean) => void;\n filter?: [VirtualTableWhereFilterOp, any];\n onHover: boolean,\n createFilterField: (props: FilterFormFieldProps<T>) => React.ReactNode;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}\n\nexport type FilterFormFieldProps<CustomProps> = {\n id: React.Key,\n filterValue: [VirtualTableWhereFilterOp, any] | undefined,\n setFilterValue: (filterValue?: [VirtualTableWhereFilterOp, any]) => void;\n column: VirtualTableColumn<CustomProps>;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n};\n\ntype VirtualTableHeaderProps<M extends Record<string, any>> = {\n resizeHandleRef: RefObject<HTMLDivElement>;\n columnIndex: number;\n isResizingIndex: number;\n column: VirtualTableColumn<any>;\n onColumnSort: (key: Extract<keyof M, string>) => void;\n filter?: [VirtualTableWhereFilterOp, any];\n sort: VirtualTableSort;\n onFilterUpdate: (column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => void;\n onClickResizeColumn?: (columnIndex: number, column: VirtualTableColumn) => void;\n createFilterField?: (props: FilterFormFieldProps<any>) => React.ReactNode;\n AdditionalHeaderWidget?: (props: { onHover: boolean }) => React.ReactNode;\n};\n\nexport const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(\n function VirtualTableHeader<M extends Record<string, any>>({\n resizeHandleRef,\n columnIndex,\n isResizingIndex,\n sort,\n onColumnSort,\n onFilterUpdate,\n filter,\n column,\n onClickResizeColumn,\n createFilterField,\n AdditionalHeaderWidget\n }: VirtualTableHeaderProps<M>) {\n\n const [onHover, setOnHover] = useState(false);\n\n const [openFilter, setOpenFilter] = React.useState(false);\n const [hidden, setHidden] = React.useState(false);\n\n const handleSettingsClick = useCallback((event: any) => {\n setOpenFilter(true);\n }, []);\n\n const update = useCallback((filterForProperty?: [VirtualTableWhereFilterOp, any], newOpenFilterState?: boolean) => {\n onFilterUpdate(column, filterForProperty);\n if (newOpenFilterState !== undefined)\n setOpenFilter(newOpenFilterState);\n }, [column, onFilterUpdate]);\n\n const thisColumnIsResizing = isResizingIndex === columnIndex;\n const anotherColumnIsResizing = isResizingIndex !== columnIndex && isResizingIndex > 0;\n\n const hovered = !anotherColumnIsResizing && (onHover || thisColumnIsResizing);\n\n return (\n <ErrorBoundary>\n <div\n className={cn(\"flex py-0 px-3 h-full text-xs uppercase font-semibold relative select-none items-center bg-gray-50 dark:bg-gray-900\",\n \"text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200 \",\n \"hover:bg-gray-100 dark:hover:bg-gray-800 hover:bg-opacity-50 dark:hover:bg-opacity-50\",\n column.frozen ? \"sticky left-0 z-10\" : \"relative z-0\"\n )}\n style={{\n // transition: \"color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\n // fontSize: \"0.750rem\",\n left: column.frozen ? 0 : undefined,\n minWidth: column.width,\n maxWidth: column.width\n }}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}\n >\n\n <div className=\"overflow-hidden flex-grow\">\n <div\n className={`flex items-center justify-${column.headerAlign} flex-row`}>\n\n {column.icon && column.icon(onHover || openFilter)}\n\n <div\n className=\"truncate -webkit-box w-full mx-1 overflow-hidden\"\n style={{\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n justifyContent: column.align\n }}>\n {column.title}\n </div>\n\n </div>\n </div>\n <>\n\n {AdditionalHeaderWidget &&\n <AdditionalHeaderWidget onHover={onHover || openFilter}/>}\n\n {column.sortable && (sort || hovered || openFilter) &&\n <Badge color=\"secondary\"\n invisible={!sort}>\n <IconButton\n size={\"small\"}\n className={onHover || openFilter ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n onColumnSort(column.key as Extract<keyof M, string>);\n }}\n >\n {!sort &&\n <ArrowUpwardIcon/>}\n {sort === \"asc\" &&\n <ArrowUpwardIcon/>}\n {sort === \"desc\" &&\n <ArrowUpwardIcon className={\"rotate-180\"}/>}\n </IconButton>\n </Badge>\n }\n </>\n\n {column.filter && createFilterField && <div>\n <Badge color=\"secondary\"\n invisible={!filter}>\n\n <Popover\n open={openFilter}\n onOpenChange={setOpenFilter}\n className={hidden ? \"hidden\" : undefined}\n modal={true}\n trigger={\n <IconButton\n className={onHover || openFilter ? \"bg-white dark:bg-gray-950\" : undefined}\n size={\"small\"}\n onClick={handleSettingsClick}>\n <FilterListIcon size={\"small\"}/>\n </IconButton>}\n >\n <FilterForm column={column}\n filter={filter}\n onHover={onHover}\n onFilterUpdate={update}\n createFilterField={createFilterField}\n hidden={hidden}\n setHidden={setHidden}/>\n\n </Popover>\n\n </Badge>\n\n </div>}\n\n {column.resizable && <div\n ref={resizeHandleRef}\n className={cn(\n \"absolute h-full w-[6px] top-0 right-0 cursor-col-resize\",\n hovered && \"bg-gray-300 dark:bg-gray-700\"\n )}\n onMouseDown={onClickResizeColumn ? () => onClickResizeColumn(columnIndex, column) : undefined}\n />}\n </div>\n\n </ErrorBoundary>\n );\n }, equal) as React.FunctionComponent<VirtualTableHeaderProps<any>>;\n\nfunction FilterForm<M>({\n column,\n onFilterUpdate,\n filter,\n onHover,\n createFilterField,\n hidden,\n setHidden,\n }: FilterFormProps<M>) {\n\n const id = column.key;\n\n const [filterInternal, setFilterInternal] = useState<[VirtualTableWhereFilterOp, any] | undefined>(filter);\n\n useEffect(() => {\n setFilterInternal(filter);\n }, [filter]);\n\n if (!column.filter) return null;\n\n const submit = () => {\n onFilterUpdate(filterInternal, false);\n };\n\n const reset = (e: any) => {\n onFilterUpdate(undefined, false);\n };\n\n const filterIsSet = !!filter;\n\n const filterField = createFilterField({\n id,\n filterValue: filterInternal,\n setFilterValue: setFilterInternal,\n column,\n hidden,\n setHidden\n });\n\n if (!filterField) return null;\n return (\n <div className={\"text-gray-900 dark:text-white\"}>\n <div\n className={cn(defaultBorderMixin, \"py-4 px-6 text-xs font-semibold uppercase border-b\")}>\n {column.title ?? id}\n </div>\n {filterField && <div className=\"m-4\">\n {filterField}\n </div>}\n <div className=\"flex justify-end m-4\">\n <Button\n className=\"mr-4\"\n disabled={!filterIsSet}\n variant={\"text\"}\n color=\"primary\"\n type=\"reset\"\n aria-label=\"filter clear\"\n onClick={reset}>Clear</Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={submit}>Filter</Button>\n </div>\n </div>\n );\n\n}\n","import React, { createRef, useCallback, useEffect, useState } from \"react\";\n\nimport { VirtualTableColumn, VirtualTableWhereFilterOp } from \"./VirtualTableProps\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { VirtualTableHeader } from \"./VirtualTableHeader\";\nimport { VirtualTableContextProps } from \"./types\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\n\nexport const VirtualTableHeaderRow = ({\n columns,\n currentSort,\n onColumnSort,\n onFilterUpdate,\n sortByProperty,\n filter,\n onColumnResize,\n onColumnResizeEnd,\n createFilterField,\n AddColumnComponent\n }: VirtualTableContextProps<any>) => {\n\n const columnRefs = columns.map(() => createRef<HTMLDivElement>());\n const [isResizing, setIsResizing] = useState(-1);\n\n const adjustWidthColumn = useCallback((index: number, width: number, end: boolean) => {\n const column = columns[index];\n const minWidth = 100;\n const maxWidth = 800;\n const newWidth = width > maxWidth ? maxWidth : (width < minWidth ? minWidth : width);\n const params = {\n width: newWidth,\n key: column.key as string,\n column: {\n ...column,\n width: newWidth\n } as VirtualTableColumn\n };\n if (!end)\n onColumnResize(params);\n else\n onColumnResizeEnd(params);\n }, [columns, onColumnResize, onColumnResizeEnd]);\n\n const getEventNewWidth = useCallback((e: MouseEvent) => {\n if (isResizing >= 0) {\n const left = columnRefs[isResizing].current?.parentElement?.getBoundingClientRect().left;\n if (!left) return;\n return e.clientX - left;\n }\n return undefined;\n }, [columnRefs, isResizing]);\n\n const setCursorDocument = useCallback((isResizing: boolean) => {\n document.body.style.cursor = isResizing ? \"col-resize\" : \"auto\";\n }, []);\n\n const handleOnMouseMove = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const newWidth = getEventNewWidth(e);\n if (newWidth)\n adjustWidthColumn(isResizing, newWidth, false);\n }, [adjustWidthColumn, getEventNewWidth, isResizing]);\n\n const handleOnMouseUp = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const newWidth = getEventNewWidth(e);\n if (newWidth)\n adjustWidthColumn(isResizing, newWidth, true);\n setIsResizing(-1);\n setCursorDocument(false);\n }, [adjustWidthColumn, getEventNewWidth, isResizing, setCursorDocument]);\n\n const removeResizingListeners = useCallback(() => {\n document.removeEventListener(\"mousemove\", handleOnMouseMove);\n document.removeEventListener(\"mouseup\", handleOnMouseUp);\n }, [handleOnMouseMove, handleOnMouseUp]);\n\n const attachResizeListeners = useCallback(() => {\n document.addEventListener(\"mousemove\", handleOnMouseMove);\n document.addEventListener(\"mouseup\", handleOnMouseUp);\n }, [handleOnMouseMove, handleOnMouseUp]);\n\n useEffect(() => {\n if (isResizing >= 0) {\n attachResizeListeners();\n } else {\n removeResizingListeners();\n }\n return () => {\n removeResizingListeners();\n };\n }, [attachResizeListeners, isResizing, removeResizingListeners]);\n\n const onClickResizeColumn = useCallback((index: number) => {\n setIsResizing(index);\n setCursorDocument(true);\n }, [setCursorDocument]);\n\n return (\n <div\n className={cn(defaultBorderMixin, \"z-20 sticky min-w-full flex w-fit flex-row top-0 left-0 h-12 border-b bg-gray-50 dark:bg-gray-900\")}>\n {columns.map((c, columnIndex) => {\n const column = columns[columnIndex];\n\n const filterForThisProperty: [VirtualTableWhereFilterOp, any] | undefined =\n column && filter && filter[column.key]\n ? filter[column.key]\n : undefined;\n return <ErrorBoundary key={\"header_\" + column.key}>\n <VirtualTableHeader\n resizeHandleRef={columnRefs[columnIndex]}\n columnIndex={columnIndex}\n isResizingIndex={isResizing}\n onFilterUpdate={onFilterUpdate}\n filter={filterForThisProperty}\n sort={sortByProperty === column.key ? currentSort : undefined}\n onColumnSort={onColumnSort}\n onClickResizeColumn={onClickResizeColumn}\n column={column}\n createFilterField={createFilterField}\n AdditionalHeaderWidget={column.AdditionalHeaderWidget}/>\n </ErrorBoundary>;\n })}\n\n {AddColumnComponent && <AddColumnComponent/>}\n\n </div>\n );\n};\n","import React, { useCallback } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport { getRowHeight } from \"./common\";\nimport { VirtualTableRowProps } from \"./types\";\nimport { cn } from \"@firecms/ui\";\n\nexport const VirtualTableRow = React.memo<VirtualTableRowProps<any>>(\n function VirtualTableRow<T>({\n rowData,\n rowIndex,\n children,\n onRowClick,\n size,\n style,\n hoverRow,\n rowClassName\n }: VirtualTableRowProps<T>) {\n\n const onClick = useCallback((event: React.SyntheticEvent) => {\n console.debug(\"VirtualTableRow click\");\n if (onRowClick)\n onRowClick({\n rowData,\n rowIndex,\n event\n })\n }, [onRowClick, rowData, rowIndex]);\n\n return (\n <div\n className={cn(\n \"flex min-w-full text-sm border-b border-gray-200 dark:border-gray-800 border-opacity-40 dark:border-opacity-40\",\n rowClassName ? rowClassName(rowData) : \"\",\n {\n \"hover:bg-opacity-95\": hoverRow,\n \"cursor-pointer\": onRowClick\n }\n )}\n onClick={onClick}\n style={{\n ...(style),\n height: getRowHeight(size),\n width: \"fit-content\"\n }}\n >\n {children}\n </div>\n );\n\n },\n equal\n);\n","import React from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport { CellRendererParams, VirtualTableColumn } from \"./VirtualTableProps\";\n\ntype VirtualTableCellProps<T extends any> = {\n dataKey: string;\n column: VirtualTableColumn;\n columns: VirtualTableColumn[];\n rowData: any;\n cellData: any;\n rowIndex: any;\n columnIndex: number;\n cellRenderer: (params: CellRendererParams<T>) => React.ReactNode;\n};\n\nexport const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(\n function VirtualTableCell<T extends any>(props: VirtualTableCellProps<T>) {\n return props.rowData && props.cellRenderer(\n {\n cellData: props.cellData,\n rowData: props.rowData,\n rowIndex: props.rowIndex,\n isScrolling: false,\n column: props.column,\n columns: props.columns,\n columnIndex: props.columnIndex,\n width: props.column.width\n } as CellRendererParams<T>\n );\n },\n (a, b) => {\n return equal(a, b);\n }\n);\n","import React, { createContext, forwardRef, RefObject, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\n// @ts-ignore\nimport { FixedSizeList as List } from \"react-window\";\nimport useMeasure from \"react-use-measure\";\n\nimport { CircularProgressCenter } from \"../CircularProgressCenter\";\nimport {\n OnVirtualTableColumnResizeParams,\n VirtualTableColumn,\n VirtualTableFilterValues,\n VirtualTableProps,\n VirtualTableWhereFilterOp\n} from \"./VirtualTableProps\";\n\nimport { getRowHeight } from \"./common\";\nimport { VirtualTableContextProps } from \"./types\";\nimport { VirtualTableHeaderRow } from \"./VirtualTableHeaderRow\";\nimport { VirtualTableRow } from \"./VirtualTableRow\";\nimport { VirtualTableCell } from \"./VirtualTableCell\";\nimport { AssignmentIcon, cn, Markdown, Typography } from \"@firecms/ui\";\n\nconst VirtualListContext = createContext<VirtualTableContextProps<any>>({} as any);\nVirtualListContext.displayName = \"VirtualListContext\";\n\ntype InnerElementProps = {\n children: React.ReactNode,\n style: any\n};\n\n// eslint-disable-next-line react/display-name\nconst innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({\n children,\n ...rest\n }: InnerElementProps, ref) => {\n\n return (\n <VirtualListContext.Consumer>\n {(virtualTableProps) => {\n const customView = virtualTableProps.customView;\n return (\n <>\n <div\n id={\"virtual-table\"}\n style={{\n position: \"relative\",\n height: \"100%\"\n }}>\n <div\n ref={ref}\n {...rest}\n style={{\n ...rest?.style,\n minHeight: \"100%\",\n position: \"relative\"\n }}>\n <VirtualTableHeaderRow {...virtualTableProps}/>\n {!customView && children}\n </div>\n\n </div>\n\n {customView && <div style={{\n position: \"sticky\",\n top: \"56px\",\n flexGrow: 1,\n height: \"calc(100% - 56px)\",\n marginTop: \"calc(56px - 100vh)\",\n left: 0\n }}>{customView}</div>}\n\n </>\n );\n }}\n </VirtualListContext.Consumer>\n );\n })\n;\n\n/**\n * This is a Table component that allows displaying arbitrary data, not\n * necessarily related to entities or properties. It is the component\n * that powers the entity collections but has a generic API, so it\n * can be reused.\n *\n * @group Components\n */\nexport const VirtualTable = React.memo<VirtualTableProps<any>>(\n function VirtualTable<T extends Record<string, any>>({\n data,\n onResetPagination,\n onEndReached,\n size = \"m\",\n columns: columnsProp,\n onRowClick,\n onColumnResize,\n filter: filterInput,\n checkFilterCombination,\n onFilterUpdate,\n sortBy,\n error,\n emptyComponent,\n onSortByUpdate,\n loading,\n cellRenderer,\n hoverRow,\n createFilterField,\n rowClassName,\n className,\n endAdornment,\n AddColumnComponent\n }: VirtualTableProps<T>) {\n\n const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;\n const currentSort: \"asc\" | \"desc\" | undefined = sortBy ? sortBy[1] : undefined;\n\n const [columns, setColumns] = useState(columnsProp);\n\n const tableRef = useRef<HTMLDivElement>(null);\n const endReachCallbackThreshold = useRef<number>(0);\n\n useEffect(() => {\n setColumns(columnsProp);\n }, [columnsProp]);\n\n const [measureRef, bounds] = useMeasure();\n\n const onColumnResizeInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {\n setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));\n }, [columns]);\n\n const onColumnResizeEndInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {\n setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));\n if (onColumnResize) {\n onColumnResize(params);\n }\n }, [columns, onColumnResize]);\n\n // saving the current filter as a ref as a workaround for header closure\n const filterRef = useRef<VirtualTableFilterValues<any> | undefined>();\n\n useEffect(() => {\n filterRef.current = filterInput;\n }, [filterInput]);\n\n const scrollToTop = useCallback(() => {\n endReachCallbackThreshold.current = 0;\n if (tableRef.current) {\n // scrollRef.current = [scrollRef.current[0], 0];\n tableRef.current.scrollTo(tableRef.current?.scrollLeft, 0);\n }\n }, []);\n\n const onColumnSort = useCallback((key: string) => {\n\n const isDesc = sortByProperty === key && currentSort === \"desc\";\n const isAsc = sortByProperty === key && currentSort === \"asc\";\n const newSort = isAsc ? \"desc\" : (isDesc ? undefined : \"asc\");\n const newSortProperty: string | undefined = isDesc ? undefined : key;\n\n const filter = filterRef.current;\n\n const newSortBy: [string, \"asc\" | \"desc\"] | undefined = newSort && newSortProperty ? [newSortProperty, newSort] : undefined;\n if (filter) {\n if (checkFilterCombination && !checkFilterCombination(filter, newSortBy)) {\n if (onFilterUpdate)\n onFilterUpdate(undefined);\n }\n }\n\n if (onResetPagination) {\n onResetPagination();\n }\n\n if (onSortByUpdate) {\n onSortByUpdate(newSortBy);\n }\n\n scrollToTop();\n }, [checkFilterCombination, currentSort, onFilterUpdate, onResetPagination, onSortByUpdate, scrollToTop, sortByProperty]);\n\n const resetSort = useCallback(() => {\n endReachCallbackThreshold.current = 0;\n if (onSortByUpdate)\n onSortByUpdate(undefined);\n }, [onSortByUpdate]);\n\n const maxScroll = Math.max((data?.length ?? 0) * getRowHeight(size) - bounds.height, 0);\n const onEndReachedInternal = useCallback((scrollOffset: number) => {\n if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + 600) {\n endReachCallbackThreshold.current = scrollOffset;\n onEndReached();\n }\n }, [data?.length, onEndReached]);\n\n const onScroll = useCallback(({\n scrollOffset,\n scrollUpdateWasRequested\n }: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean;\n }) => {\n if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - 600))\n onEndReachedInternal(scrollOffset);\n }, [maxScroll, onEndReachedInternal]);\n\n const onFilterUpdateInternal = useCallback((column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => {\n\n endReachCallbackThreshold.current = 0;\n const filter = filterRef.current;\n let newFilterValue: VirtualTableFilterValues<any> = filter ? { ...filter } : {};\n\n if (!filterForProperty) {\n delete newFilterValue[column.key];\n } else {\n newFilterValue[column.key] = filterForProperty;\n }\n const newSortBy: [string, \"asc\" | \"desc\"] | undefined = sortByProperty && currentSort ? [sortByProperty, currentSort] : undefined;\n const isNewFilterCombinationValid = !checkFilterCombination || checkFilterCombination(newFilterValue, newSortBy);\n if (!isNewFilterCombinationValid) {\n newFilterValue = filterForProperty ? { [column.key]: filterForProperty } as VirtualTableFilterValues<Extract<keyof T, string>> : {};\n }\n\n if (onFilterUpdate) onFilterUpdate(newFilterValue);\n\n if (column.key !== sortByProperty) {\n resetSort();\n }\n }, [checkFilterCombination, currentSort, onFilterUpdate, resetSort, sortByProperty]);\n\n const buildErrorView = useCallback(() => (\n <div\n className=\"h-full flex flex-col items-center justify-center sticky left-0\">\n\n <Typography variant={\"h6\"}>\n {\"Error fetching data from the data source\"}\n </Typography>\n\n {error?.message && <Markdown className={\"px-4 break-all\"} source={error.message}/>}\n\n </div>\n ), [error?.message]);\n\n const buildEmptyView = useCallback(() => {\n if (loading)\n return <CircularProgressCenter/>;\n return <div\n className=\"flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full\">\n <AssignmentIcon/>\n {emptyComponent}\n </div>;\n }, [emptyComponent, loading]);\n\n const empty = !loading && (data?.length ?? 0) === 0;\n const customView = error ? buildErrorView() : (empty ? buildEmptyView() : undefined);\n\n return (\n <div\n ref={measureRef}\n className={cn(\"h-full w-full\", className)}>\n <VirtualListContext.Provider\n value={{\n data,\n size,\n cellRenderer,\n columns,\n currentSort,\n onRowClick,\n customView,\n onColumnResize: onColumnResizeInternal,\n onColumnResizeEnd: onColumnResizeEndInternal,\n filter: filterRef.current,\n onColumnSort,\n onFilterUpdate: onFilterUpdateInternal,\n sortByProperty,\n hoverRow: hoverRow ?? false,\n createFilterField,\n rowClassName,\n endAdornment,\n AddColumnComponent\n }}>\n\n <MemoizedList\n outerRef={tableRef}\n key={size}\n width={bounds.width}\n height={bounds.height}\n itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}\n onScroll={onScroll}\n includeAddColumn={Boolean(AddColumnComponent)}\n itemSize={getRowHeight(size)}/>\n\n </VirtualListContext.Provider>\n </div>\n );\n },\n equal\n);\n\nfunction MemoizedList({\n outerRef,\n width,\n height,\n itemCount,\n onScroll,\n itemSize,\n includeAddColumn\n }: {\n outerRef: RefObject<HTMLDivElement>;\n width: number;\n height: number;\n itemCount: number;\n onScroll: (params: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean;\n }) => void;\n itemSize: number;\n includeAddColumn?: boolean;\n}) {\n\n const Row = useCallback(({\n index,\n style\n }: any) => {\n return <VirtualListContext.Consumer>\n {({\n onRowClick,\n data,\n columns,\n size = \"m\",\n cellRenderer,\n hoverRow,\n rowClassName,\n endAdornment\n }) => {\n\n if (endAdornment && index === (data ?? []).length) {\n return <div style={{\n ...style,\n height: \"auto\",\n position: \"sticky\",\n bottom: 0,\n zIndex: 1\n }}>\n {endAdornment}\n </div>;\n }\n\n const rowData = data && data[index];\n return (\n <VirtualTableRow\n key={`row_${index}`}\n rowData={rowData}\n rowIndex={index}\n onRowClick={onRowClick}\n columns={columns}\n hoverRow={hoverRow}\n rowClassName={rowClassName}\n style={{\n ...style,\n top: `calc(${style.top}px + 48px)`\n }}\n size={size}>\n\n {columns.map((column: VirtualTableColumn, columnIndex: number) => {\n const cellData = rowData && rowData[column.key];\n return <VirtualTableCell\n key={`cell_${column.key}`}\n dataKey={column.key}\n cellRenderer={cellRenderer}\n column={column}\n columns={columns}\n rowData={rowData}\n cellData={cellData}\n rowIndex={index}\n columnIndex={columnIndex}/>;\n })}\n\n {includeAddColumn && <div className={\"w-20\"}/>}\n\n </VirtualTableRow>\n );\n }}\n </VirtualListContext.Consumer>;\n }, []);\n\n return <List\n outerRef={outerRef}\n innerElementType={innerElementType}\n width={width}\n height={height}\n overscanCount={4}\n itemCount={itemCount}\n onScroll={onScroll}\n itemSize={itemSize}>\n {Row}\n </List>;\n}\n","import React, { MouseEvent, useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { CollectionSize, Entity, EntityAction, EntityCollection, SelectionController } from \"../../../types\";\nimport { Checkbox, cn, IconButton, Menu, MenuItem, MoreVertIcon, Skeleton, Tooltip, Typography } from \"@firecms/ui\";\nimport { useFireCMSContext, useLargeLayout } from \"../../../hooks\";\n\n/**\n *\n * @param entity\n * @param width\n * @param frozen\n * @param isSelected\n * @param selectionEnabled\n * @param size\n * @param toggleEntitySelection\n * @param onCopyClicked\n * @param onEditClicked\n * @param onDeleteClicked\n * @param hideId\n * @constructor\n *\n * @group Collection components\n */\nexport const EntityCollectionRowActions = React.memo(function EntityCollectionRowActions({\n entity,\n collection,\n fullPath,\n width,\n frozen,\n isSelected,\n selectionEnabled,\n size,\n highlightEntity,\n onCollectionChange,\n unhighlightEntity,\n actions = [],\n hideId,\n selectionController\n }:\n {\n entity: Entity<any>,\n collection?: EntityCollection<any>,\n fullPath?: string,\n width: number,\n frozen?: boolean,\n size: CollectionSize,\n isSelected: boolean,\n selectionEnabled?: boolean,\n actions?: EntityAction[],\n hideId?: boolean,\n onCollectionChange?: () => void,\n selectionController?: SelectionController;\n highlightEntity?: (entity: Entity<any>) => void;\n unhighlightEntity?: (entity: Entity<any>) => void;\n }) {\n\n const largeLayout = useLargeLayout();\n\n const context = useFireCMSContext();\n\n const onCheckedChange = useCallback((checked: boolean) => {\n selectionController?.toggleEntitySelection(entity);\n }, [entity, selectionController?.toggleEntitySelection]);\n\n const onClick = useCallback((event: MouseEvent) => {\n event.stopPropagation();\n selectionController?.toggleEntitySelection(entity);\n }, [entity, selectionController?.toggleEntitySelection]);\n\n const hasActions = actions.length > 0;\n const hasCollapsedActions = actions.some(a => a.collapsed || a.collapsed === undefined);\n\n const collapsedActions = actions.filter(a => a.collapsed || a.collapsed === undefined);\n const uncollapsedActions = actions.filter(a => a.collapsed === false);\n return (\n <div\n onClick={onClick}\n className={cn(\n \"h-full flex items-center justify-center flex-col bg-gray-50 dark:bg-gray-900 bg-opacity-90 dark:bg-opacity-90 z-10\",\n frozen ? \"sticky left-0\" : \"\"\n )}\n style={{\n width,\n position: frozen ? \"sticky\" : \"initial\",\n left: frozen ? 0 : \"initial\",\n contain: \"strict\"\n }}>\n\n {(hasActions || selectionEnabled) &&\n <div className=\"w-34 flex justify-center\">\n\n {uncollapsedActions.map((action, index) => (\n <Tooltip key={index} title={action.name}>\n <IconButton\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n action.onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange\n });\n }}\n size={largeLayout ? \"medium\" : \"small\"}>\n {action.icon}\n </IconButton>\n </Tooltip>\n ))}\n\n {hasCollapsedActions &&\n <Menu\n trigger={<IconButton\n size={largeLayout ? \"medium\" : \"small\"}>\n <MoreVertIcon/>\n </IconButton>}>\n {collapsedActions.map((action, index) => (\n <MenuItem\n key={index}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange\n });\n }}>\n {action.icon}\n {action.name}\n </MenuItem>\n ))}\n </Menu>\n }\n\n {selectionEnabled &&\n <Tooltip title={`Select ${entity.id}`}>\n <Checkbox\n size={largeLayout ? \"medium\" : \"small\"}\n checked={isSelected}\n onCheckedChange={onCheckedChange}\n />\n </Tooltip>}\n\n </div>}\n\n {!hideId && size !== \"xs\" && (\n <div className=\"w-[138px] text-center overflow-hidden truncate\">\n\n {entity\n ? <Typography\n onClick={(event) => {\n event.stopPropagation();\n }}\n className={\"font-mono select-all\"}\n variant={\"caption\"}\n color={\"secondary\"}> {entity.id} </Typography>\n : <Skeleton/>\n }\n </div>\n )}\n\n </div>\n );\n\n}, equal);\n","import React, { useEffect } from \"react\";\n\nimport {\n Button,\n CircularProgress,\n cn,\n defaultBorderMixin,\n FilterListOffIcon,\n SearchBar,\n Select,\n SelectItem\n} from \"@firecms/ui\";\nimport { CollectionSize } from \"../../../types\";\nimport { useLargeLayout } from \"../../../hooks\";\n\ninterface CollectionTableToolbarProps {\n size: CollectionSize;\n filterIsSet: boolean;\n loading: boolean;\n forceFilter: boolean;\n actionsStart?: React.ReactNode;\n actions?: React.ReactNode;\n title?: React.ReactNode,\n onTextSearchClick?: () => void;\n onTextSearch?: (searchString?: string) => void;\n onSizeChanged: (size: CollectionSize) => void;\n clearFilter?: () => void;\n textSearchLoading?: boolean;\n}\n\nexport function CollectionTableToolbar(props: CollectionTableToolbarProps) {\n\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const largeLayout = useLargeLayout();\n\n const searchLoading = React.useRef<boolean>(false);\n\n useEffect(() => {\n if (searchInputRef.current && searchLoading.current && !props.textSearchLoading) {\n searchInputRef.current.focus();\n }\n searchLoading.current = props.textSearchLoading ?? false;\n }, [props.textSearchLoading]);\n\n const clearFilterButton = !props.forceFilter && props.filterIsSet && props.clearFilter &&\n <Button\n variant={\"outlined\"}\n className=\"h-fit-content\"\n aria-label=\"filter clear\"\n onClick={props.clearFilter}\n size=\"small\">\n <FilterListOffIcon/>\n Clear filter\n </Button>;\n\n const sizeSelect = (\n <Select\n value={props.size as string}\n className=\"w-16 h-10\"\n size={\"small\"}\n onValueChange={(v) => props.onSizeChanged(v as CollectionSize)}\n renderValue={(v) => <div className={\"font-medium\"}>{v.toUpperCase()}</div>}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((size) => (\n <SelectItem key={size} value={size} className={\"w-12 font-medium text-center\"}>\n {size.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n );\n\n return (\n <div\n className={cn(defaultBorderMixin, \"no-scrollbar min-h-[56px] overflow-x-auto px-4 bg-gray-50 dark:bg-gray-900 border-b flex flex-row justify-between items-center w-full\")}>\n\n <div className=\"flex items-center gap-2\">\n\n {props.title && <div className={\"hidden lg:block\"}>\n {props.title}\n </div>}\n\n {sizeSelect}\n\n {props.actionsStart}\n\n {clearFilterButton}\n\n </div>\n\n <div className=\"flex items-center gap-2\">\n\n {largeLayout && <div className=\"w-[22px]\">\n {props.loading &&\n <CircularProgress size={\"small\"}/>}\n </div>}\n\n {(props.onTextSearch || props.onTextSearchClick) &&\n <SearchBar\n key={\"search-bar\"}\n inputRef={searchInputRef}\n loading={props.textSearchLoading}\n disabled={Boolean(props.onTextSearchClick)}\n onClick={props.onTextSearchClick}\n onTextSearch={props.onTextSearchClick ? undefined : props.onTextSearch}\n expandable={true}/>}\n\n {props.actions}\n\n </div>\n\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { Entity, EntityCollection, EntityReference } from \"../../../types\";\nimport { ReferencePreview } from \"../../../preview\";\nimport { getReferenceFrom } from \"../../../util\";\nimport { useNavigationController, useReferenceDialog } from \"../../../hooks\";\nimport { Button, Select, SelectItem } from \"@firecms/ui\";\n\ninterface ReferenceFilterFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (filterValue?: [VirtualTableWhereFilterOp, any]) => void;\n isArray?: boolean;\n path?: string;\n title?: string;\n previewProperties?: string[];\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Contains Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function ReferenceFilterField({\n name,\n value,\n setValue,\n isArray,\n path,\n title,\n previewProperties,\n setHidden\n }: ReferenceFilterFieldProps) {\n\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n const [onHover, setOnHover] = React.useState(false);\n\n isArray\n ? possibleOperations.push(\"array-contains-any\")\n : possibleOperations.push(\"in\", \"not-in\");\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined>(fieldValue);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue) ? internalValue.map((ref) => {\n if (!(ref instanceof EntityReference)) {\n return null;\n }\n return ref.id;\n }).filter(Boolean) as string[] : [internalValue.id])\n : [];\n\n function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[]) {\n\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n let newValue = val;\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (newValue instanceof EntityReference ? [newValue] : []) : undefined\n }\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return path ? navigationController.getCollection(path) : undefined;\n }, [path]);\n\n const onSingleEntitySelected = (entity: Entity<any>) => {\n updateFilter(operation, getReferenceFrom(entity));\n };\n\n const onMultipleEntitiesSelected = (entities: Entity<any>[]) => {\n updateFilter(operation, entities.map(e => getReferenceFrom(e)));\n };\n\n const multiple = multipleSelectOperations.includes(operation);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: multiple,\n path,\n collection,\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n onClose: () => {\n setHidden(false);\n }\n }\n );\n\n const doOpenDialog = () => {\n setHidden(true);\n referenceDialogController.open();\n };\n\n const buildEntry = (reference: EntityReference) => {\n return (\n <div\n className=\"mb-0.5\"\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}>\n <ReferencePreview\n disabled={!path}\n previewProperties={previewProperties}\n size={\"medium\"}\n onClick={doOpenDialog}\n reference={reference}\n onHover={onHover}\n allowEntityNavigation={false}\n />\n </div>\n );\n };\n\n return (\n\n <div className=\"flex w-[440px] flex-row\">\n <div className=\"w-[120px]\">\n <Select value={operation}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2 h-full\">\n\n {internalValue && Array.isArray(internalValue) && <div>\n {internalValue.map((ref, index) => buildEntry(ref))}\n </div>}\n {internalValue && !Array.isArray(internalValue) && <div>\n {buildEntry(internalValue)}\n </div>}\n {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&\n <Button onClick={doOpenDialog}\n variant={\"outlined\"}\n className=\"h-full w-full\">\n {multiple ? \"Select references\" : \"Select reference\"}\n </Button>\n }\n </div>\n\n </div>\n );\n\n}\n","import React, { useState } from \"react\";\nimport { EnumValuesChip } from \"../../../preview\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { ClearIcon, IconButton, Select, SelectItem, TextField } from \"@firecms/ui\";\nimport { EnumValueConfig } from \"../../../types\";\n\ninterface StringNumberFilterFieldProps {\n name: string,\n dataType: \"string\" | \"number\";\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n isArray?: boolean;\n enumValues?: EnumValueConfig[];\n title?: string;\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function StringNumberFilterField({\n name,\n value,\n setValue,\n dataType,\n isArray,\n enumValues,\n title\n }: StringNumberFilterFieldProps) {\n\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n if (enumValues)\n isArray\n ? possibleOperations.push(\"array-contains-any\")\n : possibleOperations.push(\"in\", \"not-in\");\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | undefined>(fieldValue);\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | undefined) {\n let newValue = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (typeof val === \"string\" || typeof val === \"number\" ? [val] : []) : \"\";\n }\n\n if (typeof newValue === \"number\" && isNaN(newValue))\n newValue = undefined;\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const multiple = multipleSelectOperations.includes(operation);\n return (\n\n <div className=\"flex w-[440px] items-center\">\n <div className={\"w-[80px]\"}>\n <Select value={operation}\n position={\"item-aligned\"}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2\">\n\n {!enumValues && <TextField\n type={dataType === \"number\" ? \"number\" : undefined}\n value={internalValue !== undefined ? String(internalValue) : \"\"}\n onChange={(evt) => {\n const val = dataType === \"number\"\n ? parseFloat(evt.target.value)\n : evt.target.value;\n updateFilter(operation, val);\n }}\n endAdornment={internalValue && <IconButton\n className=\"absolute right-3 top-2\"\n onClick={(e) => updateFilter(operation, undefined)}>\n <ClearIcon/>\n </IconButton>}\n />}\n\n {enumValues &&\n\n <Select\n position={\"item-aligned\"}\n value={internalValue !== undefined\n ? (Array.isArray(internalValue) ? internalValue.map(e => String(e)) : String(internalValue))\n : isArray ? [] : \"\"}\n onValueChange={(value) => {\n updateFilter(operation, dataType === \"number\" ? parseInt(value as string) : value as string)\n }}\n multiple={multiple}\n endAdornment={internalValue && <IconButton\n className=\"absolute right-3 top-2\"\n onClick={(e) => updateFilter(operation, undefined)}>\n <ClearIcon/>\n </IconButton>}\n renderValue={(enumKey) => <EnumValuesChip\n key={`select_value_${name}_${enumKey}`}\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"small\"}/>}>\n {enumValues.map((enumConfig) => (\n <SelectItem key={`select_value_${name}_${enumConfig.id}`}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={String(enumConfig.id)}\n enumValues={enumValues}\n size={\"small\"}/>\n </SelectItem>\n ))}\n </Select>\n }\n\n </div>\n\n </div>\n );\n\n}\n","import React from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { BooleanSwitchWithLabel } from \"@firecms/ui\";\n\ninterface BooleanFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n title?: string;\n}\n\nexport function BooleanFilterField({\n name,\n title,\n value,\n setValue\n }: BooleanFieldProps) {\n\n function updateFilter(val?: boolean) {\n if (val !== undefined) {\n setValue(\n [\"==\", val]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const valueSetToTrue = value && value[1];\n const valueSet = !!value;\n\n return (\n <div className=\"w-[200px]\">\n <BooleanSwitchWithLabel\n value={valueSetToTrue}\n allowIndeterminate={true}\n onValueChange={(v: boolean | null) => updateFilter(v === null ? undefined : v)}\n label={!valueSet\n ? \"No filter\"\n : valueSetToTrue\n ? `${title} is true`\n : `${title} is false`}\n />\n </div>\n )\n ;\n}\n","import React, { useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { DateTimeField, Select, SelectItem } from \"@firecms/ui\";\nimport { useFireCMSContext } from \"../../../hooks\";\n\ninterface DateTimeFilterFieldProps {\n name: string,\n mode?: \"date\" | \"date_time\",\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n isArray?: boolean;\n title?: string;\n}\n\nconst operationLabels: Record<VirtualTableWhereFilterOp, string> = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n \"not-in\": \"not in\",\n in: \"in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\"];\n\nexport function DateTimeFilterField({\n name,\n isArray,\n mode,\n value,\n setValue,\n title\n }: DateTimeFilterFieldProps) {\n\n const { locale } = useFireCMSContext();\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<Date | undefined>(fieldValue);\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: Date | undefined) {\n let newValue: Date | undefined = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (val ? [val] : []) : \"\";\n }\n\n setOperation(op);\n setInternalValue(newValue === null ? undefined : newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n return (\n\n <div className=\"flex w-[440px] items-center\">\n <div className=\"w-[80px]\">\n <Select value={operation}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2\">\n\n <DateTimeField\n mode={mode}\n size={\"medium\"}\n locale={locale}\n value={internalValue}\n onChange={(dateValue: Date | null) => {\n updateFilter(operation, dateValue === null ? undefined : dateValue);\n }}\n clearable={true}\n />\n\n </div>\n\n </div>\n );\n\n}\n","import { useMemo } from \"react\";\nimport { EntityCollection, ResolvedEntityCollection, ResolvedProperty } from \"../../types\";\nimport { getSubcollectionColumnId } from \"../EntityCollectionTable/internal/common\";\nimport { PropertyColumnConfig } from \"../EntityCollectionTable/EntityCollectionTableProps\";\n\nconst COLLECTION_GROUP_PARENT_ID = \"collectionGroupParent\";\n\nexport function useColumnIds<M extends Record<string, any>>(collection: ResolvedEntityCollection<M>, includeSubcollections: boolean): PropertyColumnConfig[] {\n return useMemo(() => {\n if (collection.propertiesOrder)\n return hideAndExpandKeys(collection, collection.propertiesOrder);\n return getDefaultColumnKeys(collection, includeSubcollections);\n }, [collection, includeSubcollections]);\n}\n\nfunction hideAndExpandKeys<M extends Record<string, any>>(collection: ResolvedEntityCollection<M>, keys: string[]): PropertyColumnConfig[] {\n\n return keys.flatMap((key) => {\n const property = collection.properties[key];\n if (property) {\n if (property.hideFromCollection)\n return [null];\n if (property.disabled && typeof property.disabled === \"object\" && property.disabled.hidden)\n return [null];\n if (property.dataType === \"map\" && property.spreadChildren && property.properties) {\n return getColumnKeysForProperty(property, key);\n }\n return [{\n key,\n disabled: Boolean(property.disabled) || Boolean(property.readOnly)\n }];\n }\n\n const additionalField = collection.additionalFields?.find(field => field.key === key);\n if (additionalField) {\n return [{\n key,\n disabled: true\n }];\n }\n\n if (collection.subcollections) {\n const subCollection = collection.subcollections.find(subCol => getSubcollectionColumnId(subCol) === key);\n if (subCollection) {\n return [{\n key,\n disabled: true\n }];\n }\n }\n\n if (collection.collectionGroup && key === COLLECTION_GROUP_PARENT_ID) {\n return [{\n key,\n disabled: true\n }];\n }\n\n return [null];\n }).filter(Boolean) as PropertyColumnConfig[];\n}\n\nfunction getDefaultColumnKeys<M extends Record<string, any> = any>(collection: ResolvedEntityCollection<M>, includeSubCollections: boolean) {\n const propertyKeys = Object.keys(collection.properties);\n\n const additionalFields = collection.additionalFields ?? [];\n const subCollections: EntityCollection[] = collection.subcollections ?? [];\n\n const columnIds: string[] = [\n ...propertyKeys,\n ...additionalFields.map((field) => field.key)\n ];\n\n if (includeSubCollections) {\n const subCollectionIds = subCollections\n .map((collection) => getSubcollectionColumnId(collection));\n columnIds.push(...subCollectionIds.filter((subColId) => !columnIds.includes(subColId)));\n }\n\n if (collection.collectionGroup) {\n columnIds.push(COLLECTION_GROUP_PARENT_ID);\n }\n\n return hideAndExpandKeys(collection, columnIds);\n}\n\nexport function getColumnKeysForProperty(property: ResolvedProperty, key: string, disabled?: boolean): PropertyColumnConfig[] {\n if (property.dataType === \"map\" && property.spreadChildren && property.properties) {\n return Object.entries(property.properties)\n .flatMap(([childKey, childProperty]) => getColumnKeysForProperty(\n childProperty,\n `${key}.${childKey}`,\n disabled || Boolean(property.disabled) || Boolean(property.readOnly))\n );\n }\n return [{\n key,\n disabled: disabled || Boolean(property.disabled) || Boolean(property.readOnly)\n }];\n}\n","import React, { useCallback, useContext, useEffect, useMemo } from \"react\";\nimport equal from \"react-fast-compare\";\nimport { getTableCellAlignment, getTablePropertyColumnWidth } from \"./internal/common\";\nimport {\n AdditionalFieldDelegate,\n CollectionSize,\n Entity,\n FilterValues,\n FireCMSContext,\n ResolvedProperty,\n SelectedCellProps,\n User\n} from \"../../types\";\nimport { PropertyTableCell } from \"./internal/PropertyTableCell\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { useFireCMSContext, useLargeLayout } from \"../../hooks\";\nimport { CellRendererParams, VirtualTable, VirtualTableColumn } from \"../VirtualTable\";\nimport { enumToObjectEntries, getIconForProperty, getResolvedPropertyInPath, getValueInPath } from \"../../util\";\nimport { getRowHeight } from \"../VirtualTable/common\";\nimport { EntityCollectionRowActions } from \"./internal/EntityCollectionRowActions\";\nimport { EntityCollectionTableController } from \"./types\";\nimport { CollectionTableToolbar } from \"./internal/CollectionTableToolbar\";\nimport { EntityCollectionTableProps } from \"./EntityCollectionTableProps\";\nimport { EntityTableCell } from \"./internal/EntityTableCell\";\nimport { FilterFormFieldProps } from \"../VirtualTable/VirtualTableHeader\";\nimport { ReferenceFilterField } from \"./filters/ReferenceFilterField\";\nimport { StringNumberFilterField } from \"./filters/StringNumberFilterField\";\nimport { BooleanFilterField } from \"./filters/BooleanFilterField\";\nimport { DateTimeFilterField } from \"./filters/DateTimeFilterField\";\nimport { getColumnKeysForProperty } from \"../EntityCollectionView/useColumnsIds\";\nimport { CustomFieldValidator } from \"../../form/validation\";\nimport { renderSkeletonText } from \"../../preview\";\n\nconst DEFAULT_STATE = {} as any;\n\nexport const EntityCollectionTableContext = React.createContext<EntityCollectionTableController<any>>(DEFAULT_STATE);\n\nexport const useEntityCollectionTableController = () => useContext<EntityCollectionTableController<any>>(EntityCollectionTableContext);\n\n/**\n * This component is in charge of rendering a collection table with a high\n * degree of customization. It is in charge of fetching data from\n * the {@link DataSource} and holding the state of filtering and sorting.\n *\n * This component is used internally by {@link EntityCollectionView} and\n * {@link useReferenceDialog}\n *\n * Please note that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you want to bind a {@link EntityCollection} to a table with the default\n * options you see in collections in the top level navigation, you can\n * check {@link EntityCollectionView}\n *\n * If you need a table that is not bound to the datasource or entities and\n * properties at all, you can check {@link VirtualTable}\n *\n * @see EntityCollectionTableProps\n * @see EntityCollectionView\n * @see VirtualTable\n * @group Components\n */\nexport const EntityCollectionTable = React.memo<EntityCollectionTableProps<any>>(\n function EntityCollectionTable<M extends Record<string, any>, UserType extends User>\n ({\n forceFilter,\n actionsStart,\n actions,\n title,\n tableRowActionsBuilder,\n uniqueFieldValidator,\n getPropertyFor,\n onValueChange,\n selectionController,\n highlightedEntities,\n onEntityClick,\n onColumnResize,\n onSizeChanged,\n textSearchEnabled = false,\n hoverRow = true,\n inlineEditing = false,\n additionalFields,\n displayedColumnIds,\n defaultSize,\n properties,\n tableController:\n {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues,\n sortBy,\n setSortBy,\n setSearchString,\n clearFilter,\n itemCount,\n setItemCount,\n pageSize = 50,\n paginationEnabled,\n checkFilterCombination,\n setPopupCell\n },\n filterable = true,\n sortable = true,\n endAdornment,\n AddColumnComponent,\n AdditionalHeaderWidget,\n additionalIDHeaderWidget,\n emptyComponent,\n getIdColumnWidth,\n onTextSearchClick,\n textSearchLoading\n }: EntityCollectionTableProps<M>) {\n\n const largeLayout = useLargeLayout();\n const disabledFilterChange = Boolean(forceFilter);\n const selectedEntities = selectionController?.selectedEntities?.length > 0 ? selectionController?.selectedEntities : highlightedEntities;\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [size, setSize] = React.useState<CollectionSize>(defaultSize ?? \"m\");\n\n const [selectedCell, setSelectedCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n\n const selectedEntityIds = selectedEntities?.map(e => e.id);\n\n const filterIsSet = !!filterValues && Object.keys(filterValues).length > 0;\n\n const loadNextPage = () => {\n if (!paginationEnabled || dataLoading || noMoreToLoad)\n return;\n if (itemCount !== undefined)\n setItemCount?.(itemCount + pageSize);\n };\n\n const resetPagination = useCallback(() => {\n setItemCount?.(pageSize);\n }, [pageSize]);\n\n const onRowClick = useCallback(({ rowData }: {\n rowData: Entity<M>\n }) => {\n console.debug(\"EntityCollectionTable click\");\n if (inlineEditing)\n return;\n return onEntityClick && onEntityClick(rowData);\n }, [onEntityClick, inlineEditing]);\n\n const updateSize = useCallback((size: CollectionSize) => {\n if (onSizeChanged)\n onSizeChanged(size);\n setSize(size);\n }, []);\n\n const onTextSearch = useCallback((newSearchString?: string) => setSearchString?.(newSearchString), []);\n\n const additionalFieldsMap: Record<string, AdditionalFieldDelegate<M, UserType>> = useMemo(() => {\n return (additionalFields\n ? additionalFields\n .map((aC) => ({ [aC.key]: aC as AdditionalFieldDelegate<M, any> }))\n .reduce((a, b) => ({ ...a, ...b }), {})\n : {}) as Record<string, AdditionalFieldDelegate<M, UserType>>;\n }, [additionalFields]);\n\n // on ESC key press\n useEffect(() => {\n const escFunction = (event: any) => {\n if (event.keyCode === 27) {\n unselect();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n });\n\n const select = useCallback((cell?: SelectedCellProps<M>) => {\n setSelectedCell(cell);\n }, []);\n\n const unselect = useCallback(() => {\n setSelectedCell(undefined);\n }, []);\n\n const customFieldValidator: CustomFieldValidator | undefined = uniqueFieldValidator;\n\n const propertyCellRenderer = useCallback(({\n column,\n columnIndex,\n rowData,\n rowIndex\n }: CellRendererParams<any>) => {\n\n const entity: Entity<M> = rowData;\n\n const propertyKey = column.key;\n\n let disabled = column.custom?.disabled;\n const propertyValue = entity.values ? getValueInPath(entity.values, propertyKey) : undefined;\n const property = getPropertyFor?.({\n propertyKey,\n propertyValue,\n entity\n }) ?? column.custom.resolvedProperty;\n if (!property?.disabled) {\n disabled = false;\n }\n\n if (!property) {\n return null;\n }\n\n return (\n <ErrorBoundary>\n {entity\n ? <PropertyTableCell\n key={`property_table_cell_${entity.id}_${propertyKey}`}\n readonly={!inlineEditing}\n align={column.align ?? \"left\"}\n propertyKey={propertyKey as string}\n property={property}\n value={entity?.values ? getValueInPath(entity.values, propertyKey) : undefined}\n customFieldValidator={customFieldValidator}\n columnIndex={columnIndex}\n width={column.width}\n height={getRowHeight(size)}\n entity={entity}\n disabled={disabled}\n path={entity.path}/>\n : renderSkeletonText()\n }\n </ErrorBoundary>);\n\n }, [customFieldValidator, inlineEditing, size, selectedEntityIds]);\n\n const additionalCellRenderer = useCallback(({\n column,\n rowData,\n width\n }: CellRendererParams<any>) => {\n\n const entity: Entity<M> = rowData;\n\n const additionalField = additionalFieldsMap[column.key as string];\n const value = additionalField.dependencies\n ? Object.entries(entity.values)\n .filter(([key, value]) => additionalField.dependencies!.includes(key as Extract<keyof M, string>))\n .reduce((a, b) => ({ ...a, ...b }), {})\n : entity;\n\n const Builder = additionalField.Builder;\n if (!Builder && !additionalField.value) {\n throw new Error(\"When using additional fields you need to provide a Builder or a value\");\n }\n\n const child = Builder\n ? <Builder entity={entity} context={context}/>\n : <>{additionalField.value?.({ entity, context })}</>;\n\n return (\n <EntityTableCell\n key={`additional_table_cell_${entity.id}_${column.key}`}\n width={width}\n size={size}\n value={value}\n selected={false}\n disabled={true}\n align={\"left\"}\n allowScroll={false}\n showExpandIcon={false}\n disabledTooltip={\"This column can't be edited directly\"}\n >\n <ErrorBoundary>\n {child}\n </ErrorBoundary>\n </EntityTableCell>\n );\n\n }, [additionalFieldsMap, size, selectedEntityIds]);\n\n const collectionColumns: VirtualTableColumn[] = useMemo(() => {\n const columnsResult: VirtualTableColumn[] = Object.entries<ResolvedProperty>(properties)\n .flatMap(([key, property]) => getColumnKeysForProperty(property, key))\n .map(({\n key,\n disabled\n }) => {\n const property = getResolvedPropertyInPath(properties, key);\n if (!property)\n throw Error(\"Internal error: no property found in path \" + key);\n const filterable = filterableProperty(property);\n return {\n key: key as string,\n align: getTableCellAlignment(property),\n icon: (hoverOrOpen) => getIconForProperty(property, \"small\"),\n title: property.name ?? key as string,\n sortable: sortable && (forceFilter ? Object.keys(forceFilter).includes(key) : true),\n filter: !disabledFilterChange && filterable,\n width: getTablePropertyColumnWidth(property),\n resizable: true,\n custom: {\n resolvedProperty: property,\n disabled\n },\n AdditionalHeaderWidget: ({ onHover }) => AdditionalHeaderWidget\n ? <AdditionalHeaderWidget property={property} propertyKey={key} onHover={onHover}/>\n : undefined\n };\n });\n\n const additionalTableColumns: VirtualTableColumn[] = additionalFields\n ? additionalFields.map((additionalField) =>\n ({\n key: additionalField.key,\n align: \"left\",\n sortable: false,\n title: additionalField.name,\n width: additionalField.width ?? 200\n }))\n : [];\n return [...columnsResult, ...additionalTableColumns];\n },\n [additionalFields, disabledFilterChange, forceFilter, properties, sortable]);\n\n const idColumn: VirtualTableColumn = useMemo(() => ({\n key: \"id_ewcfedcswdf3\",\n width: getIdColumnWidth?.() ?? (largeLayout ? 160 : 130),\n title: \"ID\",\n resizable: false,\n frozen: largeLayout,\n headerAlign: \"center\",\n align: \"center\",\n AdditionalHeaderWidget: () => additionalIDHeaderWidget\n }), [getIdColumnWidth, largeLayout])\n\n const columns: VirtualTableColumn[] = useMemo(() => [\n idColumn,\n ...displayedColumnIds\n .map((p) => {\n return collectionColumns.find(c => c.key === p.key);\n }).filter(Boolean) as VirtualTableColumn[]\n ], [collectionColumns, displayedColumnIds, idColumn]);\n\n const cellRenderer = useCallback((props: CellRendererParams<any>) => {\n const column = props.column;\n const columns = props.columns;\n const columnKey = column.key;\n if (props.columnIndex === 0) {\n if (tableRowActionsBuilder)\n return tableRowActionsBuilder({\n entity: props.rowData,\n size,\n width: column.width,\n frozen: column.frozen\n });\n else\n return <EntityCollectionRowActions entity={props.rowData}\n width={column.width}\n frozen={column.frozen}\n isSelected={false}\n size={size}/>;\n } else if (additionalFieldsMap[columnKey]) {\n return additionalCellRenderer(props);\n } else if (props.columnIndex < columns.length + 1) {\n return propertyCellRenderer(props);\n } else {\n throw Error(\"Internal: columns not mapped properly\");\n }\n }, [additionalFieldsMap, tableRowActionsBuilder, size, additionalCellRenderer, propertyCellRenderer])\n\n const onFilterUpdate = useCallback((updatedFilterValues?: FilterValues<any>) => {\n setFilterValues?.({ ...updatedFilterValues, ...forceFilter } as FilterValues<any>);\n }, [forceFilter]);\n\n return (\n\n <EntityCollectionTableContext.Provider\n value={{\n setPopupCell: setPopupCell as ((cell?: SelectedCellProps<M>) => void),\n select,\n onValueChange,\n size,\n selectedCell,\n selectedEntityIds\n }}\n >\n\n <div className=\"h-full w-full flex flex-col bg-white dark:bg-gray-950\">\n\n <CollectionTableToolbar\n forceFilter={disabledFilterChange}\n filterIsSet={filterIsSet}\n onTextSearch={textSearchEnabled ? onTextSearch : undefined}\n textSearchLoading={textSearchLoading}\n onTextSearchClick={textSearchEnabled ? onTextSearchClick : undefined}\n clearFilter={clearFilter}\n size={size}\n onSizeChanged={updateSize}\n title={title}\n actionsStart={actionsStart}\n actions={actions}\n loading={dataLoading}/>\n\n <VirtualTable\n data={data}\n columns={columns}\n cellRenderer={cellRenderer}\n onRowClick={inlineEditing ? undefined : (onEntityClick ? onRowClick : undefined)}\n onEndReached={loadNextPage}\n onResetPagination={resetPagination}\n error={dataLoadingError}\n paginationEnabled={paginationEnabled}\n onColumnResize={onColumnResize}\n size={size}\n loading={dataLoading}\n filter={filterValues}\n onFilterUpdate={setFilterValues ? onFilterUpdate : undefined}\n sortBy={sortBy}\n onSortByUpdate={setSortBy as ((sortBy?: [string, \"asc\" | \"desc\"]) => void)}\n hoverRow={hoverRow}\n emptyComponent={emptyComponent}\n checkFilterCombination={checkFilterCombination}\n createFilterField={filterable ? createFilterField : undefined}\n rowClassName={useCallback((entity: Entity<M>) => {\n return selectedEntityIds?.includes(entity.id) ? \"bg-gray-100 bg-opacity-75 dark:bg-gray-800 dark:bg-opacity-75\" : \"\";\n }, [selectedEntityIds])}\n className=\"flex-grow\"\n endAdornment={endAdornment}\n AddColumnComponent={AddColumnComponent}\n />\n\n </div>\n </EntityCollectionTableContext.Provider>\n );\n\n },\n equal\n);\n\nfunction createFilterField({\n id,\n filterValue,\n setFilterValue,\n column,\n hidden,\n setHidden\n }: FilterFormFieldProps<{\n resolvedProperty: ResolvedProperty,\n disabled: boolean,\n}>): React.ReactNode {\n\n if (!column.custom) {\n return null;\n }\n\n const { resolvedProperty } = column.custom;\n\n const isArray = resolvedProperty?.dataType === \"array\";\n const baseProperty: ResolvedProperty = isArray ? resolvedProperty.of : resolvedProperty;\n if (!baseProperty) {\n return null;\n }\n if (baseProperty.dataType === \"reference\") {\n return <ReferenceFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n isArray={isArray}\n path={baseProperty.path}\n title={resolvedProperty?.name}\n previewProperties={baseProperty?.previewProperties}\n hidden={hidden}\n setHidden={setHidden}/>;\n } else if (baseProperty.dataType === \"number\" || baseProperty.dataType === \"string\") {\n const name = baseProperty.name;\n const enumValues = baseProperty.enumValues ? enumToObjectEntries(baseProperty.enumValues) : undefined;\n return <StringNumberFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n dataType={baseProperty.dataType}\n isArray={isArray}\n enumValues={enumValues}\n title={name}/>;\n } else if (baseProperty.dataType === \"boolean\") {\n const name = baseProperty.name;\n return <BooleanFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n title={name}/>;\n\n } else if (baseProperty.dataType === \"date\") {\n const title = baseProperty.name;\n return <DateTimeFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n mode={baseProperty.mode}\n isArray={isArray}\n title={title}/>;\n }\n\n return (\n <div>{`Currently the filter field ${resolvedProperty.dataType} is not supported`}</div>\n );\n}\n\nfunction filterableProperty(property: ResolvedProperty, partOfArray = false): boolean {\n if (partOfArray) {\n return [\"string\", \"number\", \"date\", \"reference\"].includes(property.dataType);\n }\n if (property.dataType === \"array\") {\n if (property.of)\n return filterableProperty(property.of, true);\n else\n return false;\n }\n return [\"string\", \"number\", \"boolean\", \"date\", \"reference\", \"array\"].includes(property.dataType);\n}\n","import { Entity } from \"../../types\";\n\nexport interface DataOrderProps<M extends Record<string, any>> {\n data: Entity<M>[];\n entitiesDisplayedFirst?: Entity<M>[];\n}\n\n/**\n * This hook is used to have some entities at the beginning of data.\n * @param path\n * @param entitiesDisplayedFirst\n * @group Hooks and utilities\n */\nexport function useDataOrder<M extends Record<string, any>>(\n {\n data,\n entitiesDisplayedFirst\n }: DataOrderProps<M>): Entity<M>[] {\n\n if (!entitiesDisplayedFirst)\n return data;\n\n const displayedFirstId = new Set(entitiesDisplayedFirst.map((e) => e.id));\n return [...entitiesDisplayedFirst, ...data.filter((e) => !displayedFirstId.has(e.id))];\n\n}\n","import React from \"react\";\nimport equal from \"react-fast-compare\";\n\n/**\n * Hack to prevent data updates for incomplete callbacks from Firestore\n * triggers.\n * If any deps change, the update is immediate\n * @param data\n * @param deps\n * @param timeoutMs\n */\nexport function useDebouncedData<T>(data: T[], deps: any, timeoutMs = 5000) {\n\n const [deferredData, setDeferredData] = React.useState(data);\n const dataLength = React.useRef(deferredData.length ?? 0);\n const pendingUpdate = React.useRef(false);\n const currentDeps = React.useRef(deps);\n\n const haveDepsChanged = !equal(currentDeps.current, deps);\n const immediateUpdate = data.length >= dataLength.current || haveDepsChanged;\n\n React.useEffect(() => {\n\n const performUpdate = () => {\n if (!equal(deferredData, data)) {\n currentDeps.current = deps;\n dataLength.current = data.length;\n setDeferredData(data);\n }\n pendingUpdate.current = false;\n };\n\n pendingUpdate.current = true;\n\n let handler: any;\n if (immediateUpdate)\n performUpdate()\n else\n handler = setTimeout(performUpdate, timeoutMs);\n\n return () => {\n clearTimeout(handler);\n if (pendingUpdate.current && immediateUpdate)\n performUpdate();\n };\n }, [data, timeoutMs, deps, immediateUpdate]);\n\n return immediateUpdate ? data : deferredData;\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { useDataSource, useFireCMSContext, useNavigationController } from \"../../hooks\";\nimport { useDataOrder } from \"../../hooks/data/useDataOrder\";\nimport {\n Entity,\n EntityCollection,\n FilterValues,\n FireCMSContext,\n SelectedCellProps,\n TableController,\n User\n} from \"../../types\";\nimport { useDebouncedData } from \"./useDebouncedData\";\n\nconst DEFAULT_PAGE_SIZE = 50;\n\nexport type EntityCollectionTableControllerProps<M extends Record<string, any> = any> = {\n fullPath: string;\n collection: EntityCollection<M>;\n /**\n * List of entities that will be displayed on top, no matter the ordering.\n * This is used for reference fields selection\n */\n entitiesDisplayedFirst?: Entity<M>[];\n lastDeleteTimestamp?: number;\n forceFilter?: FilterValues<string>;\n}\n\n/**\n * Use this hook to build a controller for the {@link EntityCollectionTable}\n * @param fullPath\n * @param collection\n * @param entitiesDisplayedFirst\n * @param lastDeleteTimestamp\n * @param forceFilterFromProps\n */\nexport function useEntityCollectionTableController<M extends Record<string, any> = any, UserType extends User = User>(\n {\n fullPath,\n collection,\n entitiesDisplayedFirst,\n lastDeleteTimestamp,\n forceFilter: forceFilterFromProps,\n }: EntityCollectionTableControllerProps<M>)\n : TableController<M> {\n\n const {\n initialFilter,\n initialSort,\n forceFilter: forceFilterFromCollection\n } = collection;\n\n const [popupCell, setPopupCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n const navigation = useNavigationController();\n const dataSource = useDataSource();\n const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);\n\n const forceFilter = forceFilterFromProps ?? forceFilterFromCollection;\n const paginationEnabled = collection.pagination === undefined || Boolean(collection.pagination);\n const pageSize = typeof collection.pagination === \"number\" ? collection.pagination : DEFAULT_PAGE_SIZE;\n\n const [searchString, setSearchString] = React.useState<string | undefined>();\n const [itemCount, setItemCount] = React.useState<number | undefined>(paginationEnabled ? pageSize : undefined);\n\n const initialSortInternal = useMemo(() => {\n if (initialSort && forceFilter && !checkFilterCombination(forceFilter, initialSort)) {\n console.warn(\"Initial sort is not compatible with the force filter. Ignoring initial sort\");\n return undefined;\n }\n return initialSort;\n }, [initialSort, forceFilter]);\n\n const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string>> | undefined>(forceFilter ?? initialFilter ?? undefined);\n const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string>, \"asc\" | \"desc\"] | undefined>(initialSortInternal);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [rawData, setRawData] = useState<Entity<M>[]>([]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n\n const checkFilterCombination = useCallback((filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"]) => {\n if (!dataSource.isFilterCombinationValid)\n return true;\n return dataSource.isFilterCombinationValid({\n path: resolvedPath,\n collection,\n filterValues,\n sortBy\n })\n }, []);\n\n const clearFilter = useCallback(() => setFilterValues(forceFilter ?? undefined), [forceFilter]);\n\n const updateFilterValues = useCallback((updatedFilter: FilterValues<Extract<keyof M, string>> | undefined) => {\n if (forceFilter) {\n console.warn(\"Filter is not compatible with the force filter. Ignoring filter\");\n return;\n }\n if (updatedFilter && Object.keys(updatedFilter).length === 0) {\n setFilterValues(undefined);\n } else {\n setFilterValues(updatedFilter);\n }\n }, [forceFilter]);\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (entities: Entity<M>[]) => {\n if (collection.callbacks?.onFetch) {\n try {\n entities = await Promise.all(\n entities.map((entity) =>\n collection.callbacks!.onFetch!({\n collection,\n path: resolvedPath,\n entity,\n context\n })));\n } catch (e: any) {\n console.error(e);\n }\n }\n setDataLoading(false);\n setDataLoadingError(undefined);\n setRawData(entities.map(e => ({\n ...e,\n // values: sanitizeData(e.values, resolvedCollection.properties)\n })));\n setNoMoreToLoad(!itemCount || entities.length < itemCount);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setRawData([]);\n setDataLoadingError(error);\n };\n\n if (dataSource.listenCollection) {\n return dataSource.listenCollection<M>({\n path: resolvedPath,\n collection,\n onUpdate: onEntitiesUpdate,\n onError,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n });\n } else {\n dataSource.fetchCollection<M>({\n path: resolvedPath,\n collection,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n })\n .then(onEntitiesUpdate)\n .catch(onError);\n return () => {\n };\n }\n }, [resolvedPath, itemCount, currentSort, sortByProperty, filterValues, searchString]);\n\n const orderedData = useDataOrder({\n data: rawData,\n entitiesDisplayedFirst\n });\n\n // hack to fix Firestore listeners firing with incomplete data\n const data = useDebouncedData(orderedData, {\n filterValues,\n sortBy,\n searchString,\n lastDeleteTimestamp\n });\n\n return {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues: updateFilterValues,\n sortBy,\n setSortBy,\n searchString,\n setSearchString,\n clearFilter,\n itemCount,\n setItemCount,\n paginationEnabled,\n pageSize,\n checkFilterCombination,\n popupCell,\n setPopupCell\n }\n}\n","import { Entity, EntityCallbacks, EntityCollection } from \"../../../types\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { deleteEntityWithCallbacks, useDataSource, useFireCMSContext, useSnackbarController } from \"../../../hooks\";\nimport { Button, CircularProgress, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport { resolveCollection } from \"../../../util\";\nimport { EntityPreview } from \"../../EntityPreview\";\n\nexport interface DeleteEntityDialogProps<M extends Record<string, any>> {\n entityOrEntitiesToDelete?: Entity<M> | Entity<M>[],\n path: string,\n collection: EntityCollection<M>\n open: boolean;\n onClose: () => void;\n callbacks?: EntityCallbacks<M>,\n\n onEntityDelete?(path: string, entity: Entity<M>): void;\n\n onMultipleEntitiesDelete?(path: string, entities: Entity<M>[]): void;\n}\n\nexport function DeleteEntityDialog<M extends Record<string, any>>({\n entityOrEntitiesToDelete,\n collection,\n onClose,\n open,\n callbacks,\n onEntityDelete,\n onMultipleEntitiesDelete,\n path\n }: DeleteEntityDialogProps<M>) {\n\n const dataSource = useDataSource();\n console.log(\"dataSource\", dataSource)\n const snackbarController = useSnackbarController();\n const [loading, setLoading] = useState(false);\n\n const [entityOrEntities, setUsedEntityOrEntities] = React.useState<Entity<M> | Entity<M>[]>();\n\n const [multipleEntities, setMultipleEntities] = React.useState<boolean>();\n const context = useFireCMSContext();\n\n React.useEffect(() => {\n if (entityOrEntitiesToDelete) {\n const revisedEntityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1\n ? entityOrEntitiesToDelete[0]\n : entityOrEntitiesToDelete;\n setUsedEntityOrEntities(revisedEntityOrEntities);\n setMultipleEntities(Array.isArray(revisedEntityOrEntities));\n }\n }, [entityOrEntitiesToDelete]);\n\n const resolvedCollection = useMemo(() => resolveCollection<M>({\n collection,\n path,\n fields: context.propertyConfigs\n }), [collection, path]);\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const onDeleteSuccess = useCallback((entity: Entity<any>) => {\n console.debug(\"Deleted\", entity);\n }, []);\n\n const onDeleteFailure = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting: \" + e?.message\n });\n\n console.error(\"Error deleting entity\");\n console.error(e);\n }, [resolvedCollection.name]);\n\n const onPreDeleteHookError = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error before deleting: \" + e?.message\n });\n console.error(e);\n }, [resolvedCollection.name]);\n\n const onDeleteSuccessHookError = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error after deleting: \" + e?.message\n });\n console.error(e);\n }, [resolvedCollection.name]);\n\n const performDelete = useCallback((entity: Entity<M>): Promise<boolean> =>\n deleteEntityWithCallbacks({\n dataSource,\n entity,\n collection: resolvedCollection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n onPreDeleteHookError,\n onDeleteSuccessHookError,\n context\n }), [dataSource, resolvedCollection, callbacks, onDeleteSuccess, onDeleteFailure, onPreDeleteHookError, onDeleteSuccessHookError, context]);\n\n const handleOk = useCallback(async () => {\n if (entityOrEntities) {\n\n setLoading(true);\n\n if (multipleEntities) {\n Promise.all((entityOrEntities as Entity<M>[]).map(performDelete)).then((results) => {\n\n setLoading(false);\n\n if (onMultipleEntitiesDelete && entityOrEntities)\n onMultipleEntitiesDelete(path, entityOrEntities as Entity<M>[]);\n\n if (results.every(Boolean)) {\n snackbarController.open({\n type: \"success\",\n message: `${resolvedCollection.name}: multiple deleted`\n });\n } else if (results.some(Boolean)) {\n snackbarController.open({\n type: \"warning\",\n message: `${resolvedCollection.name}: Some of the entities have been deleted, but not all`\n });\n } else {\n snackbarController.open({\n type: \"error\",\n message: `${resolvedCollection.name}: Error deleting entities`\n });\n }\n onClose();\n });\n\n } else {\n performDelete(entityOrEntities as Entity<M>).then((success) => {\n setLoading(false);\n if (success) {\n if (onEntityDelete && entityOrEntities)\n onEntityDelete(path, entityOrEntities as Entity<M>);\n snackbarController.open({\n type: \"success\",\n message: `${resolvedCollection.singularName ?? resolvedCollection.name} deleted`\n });\n onClose();\n }\n });\n }\n }\n }, [entityOrEntities, multipleEntities, performDelete, onMultipleEntitiesDelete, path, onClose, snackbarController, resolvedCollection.name, onEntityDelete]);\n\n let content: React.ReactNode;\n if (entityOrEntities && multipleEntities) {\n content = <>Multiple entities</>;\n } else {\n const entity = entityOrEntities as Entity<M> | undefined;\n content = entity\n ? <EntityPreview\n entity={entity}\n collection={collection}\n path={path}/>\n : <></>;\n }\n\n const dialogTitle = multipleEntities\n ? <><b>{resolvedCollection.name}</b>: Confirm multiple delete?</>\n : `Would you like to delete this ${resolvedCollection.singularName ?? resolvedCollection.name}?`;\n\n return (\n <Dialog\n maxWidth={\"2xl\"}\n aria-labelledby=\"delete-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n <DialogContent fullHeight={true}>\n <Typography variant={\"subtitle2\"} className={\"p-4\"}>\n {dialogTitle}\n </Typography>\n\n {!multipleEntities && <div className={\"p-4\"}>{content}</div>}\n </DialogContent>\n <DialogActions>\n\n {loading && <CircularProgress size={\"small\"}/>}\n\n <Button onClick={handleCancel}\n disabled={loading}\n variant=\"text\"\n color=\"primary\">\n Cancel\n </Button>\n <Button\n autoFocus\n disabled={loading}\n onClick={handleOk}\n variant=\"filled\"\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n );\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","import React from \"react\";\n\nimport { canCreateEntity, canDeleteEntity, fullPathToCollectionSegments } from \"../../util\";\nimport { useAuthController, useFireCMSContext, useLargeLayout } from \"../../hooks\";\nimport { CollectionActionsProps, EntityCollection, SelectionController, TableController } from \"../../types\";\nimport { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from \"@firecms/ui\";\nimport { toArray } from \"../../util/arrays\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\n\nexport type EntityCollectionViewActionsProps<M extends Record<string, any>> = {\n collection: EntityCollection<M>;\n path: string;\n relativePath: string;\n parentCollectionIds: string[];\n selectionEnabled: boolean;\n onNewClick: () => void;\n onMultipleDeleteClick: () => void;\n selectionController: SelectionController<M>;\n tableController: TableController<M>;\n collectionEntitiesCount: number;\n}\n\nexport function EntityCollectionViewActions<M extends Record<string, any>>({\n collection,\n relativePath,\n parentCollectionIds,\n onNewClick,\n onMultipleDeleteClick,\n selectionEnabled,\n path,\n selectionController,\n tableController,\n collectionEntitiesCount\n }: EntityCollectionViewActionsProps<M>) {\n\n const context = useFireCMSContext();\n const plugins = context.plugins ?? [];\n\n const authController = useAuthController();\n\n const largeLayout = useLargeLayout();\n\n const selectedEntities = selectionController.selectedEntities;\n\n const addButton = canCreateEntity(collection, authController, fullPathToCollectionSegments(path), null) &&\n onNewClick && (largeLayout\n ? <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n startIcon={<AddIcon/>}\n variant=\"filled\"\n color=\"primary\">\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n size=\"medium\"\n variant=\"filled\"\n color=\"primary\"\n >\n <AddIcon/>\n </Button>);\n\n const multipleDeleteEnabled = canDeleteEntity(collection, authController, fullPathToCollectionSegments(path), null);\n\n let multipleDeleteButton: React.ReactNode | undefined;\n if (selectionEnabled) {\n const button = largeLayout\n ? <Button\n variant={\"text\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n startIcon={<DeleteIcon/>}\n onClick={onMultipleDeleteClick}\n color={\"primary\"}\n className=\"lg:w-20\"\n >\n ({selectedEntities?.length})\n </Button>\n : <IconButton\n color={\"primary\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n onClick={onMultipleDeleteClick}>\n <DeleteIcon/>\n </IconButton>;\n multipleDeleteButton =\n <Tooltip\n title={multipleDeleteEnabled ? \"Delete\" : \"You have selected at least one entity you cannot delete\"}>\n {button}\n </Tooltip>\n }\n\n const actionProps: CollectionActionsProps = {\n path,\n relativePath,\n parentCollectionIds,\n collection,\n selectionController,\n context,\n tableController,\n collectionEntitiesCount\n };\n\n const actions = toArray(collection.Actions)\n .map((Action, i) => (\n <ErrorBoundary key={`actions_${i}`}>\n <Action {...actionProps} />\n </ErrorBoundary>\n ));\n\n if (plugins) {\n plugins.forEach((plugin, i) => {\n if (plugin.collections?.CollectionActions) {\n actions.push(...toArray(plugin.collections?.CollectionActions)\n .map((Action, j) => (\n <ErrorBoundary key={`plugin_actions_${i}_${j}`}>\n <Action {...actionProps} {...plugin.collections?.collectionActionsProps}/>\n </ErrorBoundary>\n )));\n }\n });\n }\n\n return (\n <>\n {actions}\n {multipleDeleteButton}\n {addButton}\n </>\n );\n}\n","import React, { useEffect } from \"react\";\n\ninterface DraggableProps {\n containerRef: React.RefObject<HTMLDivElement>,\n innerRef: React.RefObject<HTMLDivElement>,\n // ref: React.RefObject<HTMLDivElement>,\n x?: number;\n y?: number;\n onMove: (params: { x: number, y: number }) => void,\n}\n\nexport function useDraggable({\n containerRef,\n innerRef,\n x,\n y,\n onMove\n }: DraggableProps) {\n\n let relX = 0;\n let relY = 0;\n\n const listeningRef = React.useRef(false);\n\n const onMouseDown = (event: any) => {\n if (event.button !== 0 || !containerRef.current || event.defaultPrevented || event.innerClicked) {\n return;\n }\n\n const {\n x,\n y\n } = containerRef.current.getBoundingClientRect();\n\n relX = event.screenX - x;\n relY = event.screenY - y;\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"selectstart\", onSelect);\n listeningRef.current = true;\n // event.stopPropagation();\n };\n const onMouseDownInner = (event: any) => {\n // @ts-ignore\n event.innerClicked = true;\n };\n\n const onSelect = (event: any) => {\n event.preventDefault()\n event.stopPropagation();\n };\n\n const onMouseUp = (event: any) => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"selectstart\", onSelect);\n event.stopPropagation();\n listeningRef.current = false;\n };\n\n const onMouseMove = (event: any) => {\n if (event.target.localName === \"input\" || !listeningRef.current)\n return;\n onMove({\n x: event.screenX - relX,\n y: event.screenY - relY\n }\n );\n event.stopPropagation();\n };\n\n const update = () => {\n if (containerRef.current) {\n containerRef.current.style.top = `${y}px`;\n containerRef.current.style.left = `${x}px`;\n }\n };\n\n useEffect(() => {\n const current = containerRef.current;\n const innerCurrent = innerRef.current;\n if (!current || !innerCurrent)\n return;\n if (innerCurrent)\n innerCurrent.addEventListener(\"mousedown\", onMouseDownInner);\n if (current)\n current.addEventListener(\"mousedown\", onMouseDown);\n update();\n return () => {\n if (current)\n current.removeEventListener(\"mousedown\", onMouseDown);\n if (innerCurrent)\n innerCurrent.removeEventListener(\"mousedown\", onMouseDownInner);\n };\n });\n\n}\n","import { useLayoutEffect, useState } from \"react\";\n\ninterface WindowSize {\n width: number,\n height: number\n}\n\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n function updateSize() {\n setSize({ width: window.innerWidth, height: window.innerHeight });\n }\n\n window.addEventListener(\"resize\", updateSize);\n updateSize();\n return () => window.removeEventListener(\"resize\", updateSize);\n }, []);\n return size;\n}\n","import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\ninterface Props {\n onResize: (event: Event) => void;\n}\n\nexport const ElementResizeListener: React.FC<Props> = ({ onResize }) => {\n const rafRef = useRef(0);\n const objectRef: RefObject<HTMLObjectElement> = useRef(null);\n const onResizeRef = useRef(onResize);\n\n onResizeRef.current = onResize;\n\n const _onResize = useCallback((e: Event) => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n rafRef.current = requestAnimationFrame(() => {\n onResizeRef.current(e);\n });\n }, []);\n\n const onLoad = useCallback(() => {\n const obj = objectRef.current;\n if (obj && obj.contentDocument && obj.contentDocument.defaultView) {\n obj.contentDocument.defaultView.addEventListener(\"resize\", _onResize);\n }\n }, [_onResize]);\n\n useEffect(() => {\n const obj = objectRef.current;\n return () => {\n if (obj && obj.contentDocument && obj.contentDocument.defaultView) {\n obj.contentDocument.defaultView.removeEventListener(\"resize\", _onResize);\n }\n };\n }, [_onResize]);\n\n return (\n <object\n onLoad={onLoad}\n ref={objectRef}\n tabIndex={-1}\n type={\"text/html\"}\n data={\"about:blank\"}\n title={\"\"}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n height: \"100%\",\n width: \"100%\",\n pointerEvents: \"none\",\n zIndex: -1,\n opacity: 0\n }}\n />\n );\n};\n","import { ArrayContainer } from \"../../components\";\nimport React from \"react\";\n\ninterface ArrayContainerProps<T> {\n value: T[];\n name: string;\n addLabel: string;\n buildEntry: (index: number, internalId: number) => React.ReactNode;\n disabled?: boolean;\n small?: boolean;\n onInternalIdAdded?: (id: number) => void;\n includeAddButton?: boolean;\n newDefaultEntry?: T | null;\n setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;\n}\n\n/**\n * @group Form custom fields\n */\nexport function FormikArrayContainer<T>({\n name,\n addLabel,\n value,\n disabled = false,\n buildEntry,\n small,\n onInternalIdAdded,\n includeAddButton,\n newDefaultEntry = null,\n setFieldValue\n }: ArrayContainerProps<T>) {\n\n return <ArrayContainer droppableId={name}\n addLabel={addLabel}\n value={value}\n disabled={disabled}\n buildEntry={buildEntry}\n size={small ? \"small\" : \"medium\"}\n onInternalIdAdded={onInternalIdAdded}\n includeAddButton={includeAddButton}\n newDefaultEntry={newDefaultEntry}\n onValueChange={(value) => setFieldValue(name, value)}\n />;\n}\n","import React from \"react\";\n\nimport { FieldProps } from \"formik\";\nimport { BooleanSwitchWithLabel, Tooltip } from \"@firecms/ui\";\n\nexport function SwitchControl({\n field,\n form,\n label,\n tooltip,\n disabled,\n size = \"small\",\n allowIndeterminate\n }: FieldProps & {\n label: string,\n tooltip?: string,\n disabled?: boolean,\n size: \"small\" | \"medium\",\n allowIndeterminate?: boolean\n}) {\n\n const formControlLabel = <BooleanSwitchWithLabel\n label={label}\n size={size}\n position={\"start\"}\n value={field.value}\n disabled={disabled}\n allowIndeterminate={allowIndeterminate}\n onValueChange={(checked:boolean | null) => form.setFieldValue(field.name, checked)}/>;\n\n if (tooltip)\n return (\n <Tooltip\n title={tooltip}>\n {formControlLabel}\n </Tooltip>\n );\n return formControlLabel;\n}\n","import { ResolvedProperty } from \"../../types\";\nimport { IconButton, InfoIcon, Tooltip, Typography } from \"@firecms/ui\";\n\n/**\n * Component in charge of rendering the description of a field\n * as well as the error message if any.\n */\nexport function FieldHelperText({\n error,\n showError,\n property,\n includeDescription = true,\n disabled\n }: {\n error: string,\n showError: boolean,\n property: ResolvedProperty,\n includeDescription?: boolean,\n disabled?: boolean,\n }\n) {\n\n const hasDescription = property.description || property.longDescription;\n\n if (!(showError && error) && (!includeDescription || !hasDescription))\n return null;\n\n if (showError && error) {\n return <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500\"}>\n {error}\n </Typography>\n }\n\n const disabledTooltip: string | undefined = typeof property.disabled === \"object\" ? property.disabled.disabledMessage : undefined;\n\n return <div className={\"flex ml-3.5 mt-1\"}>\n <Typography variant={\"caption\"}\n color={disabled ? \"disabled\" : \"secondary\"}\n className={\"flex-grow\"}>\n {disabledTooltip || property.description}\n </Typography>\n\n {property.longDescription &&\n <Tooltip title={property.longDescription}\n side=\"bottom\"\n >\n <IconButton\n size={\"small\"}\n className=\"self-start\">\n\n <InfoIcon color={\"disabled\"}\n size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n </div>\n}\n","import React, { useCallback } from \"react\";\n\nimport { EnumType, FieldProps } from \"../../types\";\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { getIconForProperty } from \"../../util\";\nimport { ClearIcon, cn, IconButton, Select, SelectItem } from \"@firecms/ui\";\n\ntype SelectProps<T extends EnumType> = FieldProps<T>;\n\n/**\n * If `enumValues` are set in the string config, this field renders a select\n * where each option is a colored chip.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function SelectFieldBinding<T extends EnumType>({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n includeDescription\n }: SelectProps<T>) {\n\n const enumValues = property.enumValues;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n return (\n <>\n\n <Select\n value={value ? value.toString() : \"\"}\n disabled={disabled}\n position=\"item-aligned\"\n inputClassName={cn(\"w-full\")}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}\n />}\n endAdornment={\n property.clearable && <IconButton\n onClick={handleClearClick}>\n <ClearIcon/>\n </IconButton>\n }\n onValueChange={(updatedValue: string) => {\n const newValue = updatedValue\n ? (property.dataType === \"number\" ? parseFloat(updatedValue) : updatedValue)\n : null;\n return setValue(newValue as T);\n }}\n renderValue={(enumKey: any) => {\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"medium\"}/>;\n }}\n >\n {enumValues && enumValues.map((option) => {\n return <SelectItem\n key={option.id}\n value={String(option.id)}>\n <EnumValuesChip\n enumKey={String(option.id)}\n enumValues={enumValues}\n size={\"medium\"}/>\n </SelectItem>\n })}\n </Select>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback } from \"react\";\n\nimport { EnumType, FieldProps, ResolvedProperty } from \"../../types\";\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { enumToObjectEntries, getIconForProperty, getLabelOrConfigFrom } from \"../../util\";\nimport { CloseIcon, MultiSelect, MultiSelectItem } from \"@firecms/ui\";\n\n/**\n * This fields renders a dropdown with multiple selection.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MultiSelectBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n property,\n includeDescription,\n autoFocus\n }: FieldProps<EnumType[], any, any>) {\n\n const of: ResolvedProperty<any> | ResolvedProperty<any>[] = property.of;\n if (!of) {\n throw Error(\"Using wrong component ArrayEnumSelect\");\n }\n\n if (Array.isArray(of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (of.dataType !== \"string\" && of.dataType !== \"number\") {\n throw Error(\"Field misconfiguration: array field of type string or number\");\n }\n\n const enumValues = enumToObjectEntries(of.enumValues);\n if (!enumValues) {\n console.error(property);\n throw Error(\"Field misconfiguration: array field of type string or number needs to have enumValues\");\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = !!value && Array.isArray(value);\n\n const renderValue = useCallback((enumKey: string, list: boolean) => {\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValues, enumKey) : undefined;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"medium\"}\n key={enumKey}>\n {enumValue?.label ?? enumKey}\n {!list && <button\n className=\"ml-1 ring-offset-background rounded-full outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setValue(value.filter(v => v !== enumKey));\n }}\n >\n <CloseIcon size=\"smallest\"/>\n </button>}\n </EnumValuesChip>;\n }, [enumValues, setValue, value]);\n\n return (\n <div className=\"mt-0.5 ml-0.5 mt-2\">\n <MultiSelect\n value={validValue ? value.map((v) => v.toString()) : []}\n disabled={disabled}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n renderValue={useCallback((v: string) => renderValue(v, false), [renderValue])}\n onMultiValueChange={(updatedValue: string[]) => {\n let newValue: EnumType[] | null;\n if (of && (of as ResolvedProperty)?.dataType === \"number\") {\n newValue = updatedValue ? (updatedValue as string[]).map((e) => parseFloat(e)) : [];\n } else {\n newValue = updatedValue;\n }\n return setValue(newValue);\n }}>\n {enumValues.map((enumValue) => String(enumValue.id)).map((enumKey) => (\n <MultiSelectItem key={enumKey} value={enumKey}>\n {renderValue(enumKey, true)}\n </MultiSelectItem>))}\n </MultiSelect>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </div>\n );\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { Entity, EntityCollection, EntityReference, FieldProps, ResolvedProperty } from \"../../types\";\nimport { ReferencePreview } from \"../../preview\";\nimport { FieldHelperText, FormikArrayContainer } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { getIconForProperty, getReferenceFrom } from \"../../util\";\n\nimport { useClearRestoreValue, useNavigationController, useReferenceDialog } from \"../../hooks\";\nimport { Button, ExpandablePanel } from \"@firecms/ui\";\nimport { ErrorView } from \"../../components\";\n\ntype ArrayOfReferencesFieldProps = FieldProps<EntityReference[]>;\n\n/**\n * This field allows selecting multiple references.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayOfReferencesFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n disabled,\n isSubmitting,\n tableMode,\n property,\n includeDescription,\n setValue,\n setFieldValue\n }: ArrayOfReferencesFieldProps) {\n\n const ofProperty = property.of as ResolvedProperty;\n if (ofProperty.dataType !== \"reference\") {\n throw Error(\"ArrayOfReferencesField expected a property containing references\");\n }\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n const [onHover, setOnHover] = React.useState(false);\n const selectedEntityIds = value && Array.isArray(value) ? value.map((ref) => ref.id) : [];\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return ofProperty.path ? navigationController.getCollection(ofProperty.path) : undefined;\n }, [ofProperty.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);\n }\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n console.debug(\"onMultipleEntitiesSelected\", entities);\n setValue(entities.map(e => getReferenceFrom(e)));\n }, [setValue]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: true,\n path: ofProperty.path,\n collection,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n forceFilter: ofProperty.forceFilter\n }\n );\n\n const onEntryClick = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n }, [referenceDialogController]);\n\n const buildEntry = useCallback((index: number, internalId: number) => {\n const entryValue = value && value.length > index ? value[index] : undefined;\n if (!entryValue)\n return <div>Internal ERROR</div>;\n return (\n <div\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}>\n <ReferencePreview\n disabled={!ofProperty.path}\n previewProperties={ofProperty.previewProperties}\n size={\"medium\"}\n onClick={onEntryClick}\n reference={entryValue}\n onHover={onHover}\n />\n </div>\n );\n }, [ofProperty.path, ofProperty.previewProperties, onHover, value]);\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n const body = <>\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <>\n\n <FormikArrayContainer value={value}\n addLabel={property.name ? \"Add reference to \" + property.name : \"Add reference\"}\n name={propertyKey}\n buildEntry={buildEntry}\n disabled={isSubmitting}\n setFieldValue={setFieldValue}\n newDefaultEntry={property.of.defaultValue}/>\n\n <Button\n className=\"my-4 justify-center text-left\"\n variant=\"outlined\"\n color=\"primary\"\n disabled={isSubmitting}\n onClick={onEntryClick}>\n Edit {property.name}\n </Button>\n </>}\n </>;\n\n return (\n <>\n\n {!tableMode &&\n <ExpandablePanel\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React from \"react\";\n\nimport { Entity, ResolvedStringProperty } from \"../../types\";\nimport { PreviewSize, PropertyPreview } from \"../../preview\";\n\nimport { cn, IconButton, paperMixin, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\ninterface StorageItemPreviewProps {\n name: string;\n property: ResolvedStringProperty;\n value: string,\n entity: Entity<any>,\n onRemove: (value: string) => void;\n size: PreviewSize;\n disabled: boolean;\n}\n\nexport function StorageItemPreview({\n name,\n property,\n value,\n entity,\n onRemove,\n disabled,\n size\n }: StorageItemPreviewProps) {\n\n return (\n <div className={cn(paperMixin,\n \"relative m-4 border-box flex items-center justify-center\",\n size === \"medium\" ? \"min-w-[220px] min-h-[220px] max-w-[220px]\" : \"min-w-[118px] min-h-[118px] max-w-[118px]\")}>\n\n {!disabled &&\n <div\n className=\"absolute rounded-full -top-2 -right-2 z-10 bg-white dark:bg-gray-900\">\n\n <Tooltip\n title=\"Remove\">\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onRemove(value);\n }}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </div>\n }\n\n {value &&\n <ErrorBoundary>\n <PropertyPreview propertyKey={name}\n value={value}\n property={property}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n }\n\n\n </div>\n );\n\n}\n","import React, { useCallback } from \"react\";\n\nimport {\n ArrayProperty,\n Entity,\n FieldProps,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig\n} from \"../../types\";\nimport { useDropzone } from \"react-dropzone\";\nimport { PreviewSize } from \"../../preview\";\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\n\nimport { getIconForProperty, isReadOnly } from \"../../util\";\nimport { useClearRestoreValue, useSnackbarController, useStorageSource } from \"../../hooks\";\nimport { DragDropContext, Draggable, Droppable } from \"@hello-pangea/dnd\";\nimport { StorageFieldItem, useStorageUploadController } from \"../../util/useStorageUploadController\";\nimport { StorageUploadProgress } from \"../components/StorageUploadProgress\";\nimport { StorageItemPreview } from \"../components/StorageItemPreview\";\nimport {\n cn,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n focusedMixin,\n Typography\n} from \"@firecms/ui\";\n\nconst dropZoneClasses = \"box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst disabledClasses = \"border-dotted-gray\"\nconst nonActiveDropClasses = \"hover:bg-field-hover dark:hover:bg-field-hover-dark\"\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500\"\n\ntype StorageUploadFieldProps = FieldProps<string | string[]>;\n\n/**\n * Field that allows to upload files to Google Cloud Storage.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function StorageUploadFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n tableMode,\n property,\n includeDescription,\n context,\n isSubmitting\n }: StorageUploadFieldProps) {\n\n if (!context.entityId)\n throw new Error(\"StorageUploadFieldBinding: Entity id is null\");\n\n const storageSource = useStorageSource();\n const disabled = isReadOnly(property) || !!property.disabled || isSubmitting;\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported\n } = useStorageUploadController({\n entityValues: context.values,\n entityId: context.entityId,\n path: context.path,\n property,\n propertyKey,\n value,\n storageSource,\n disabled,\n onChange: setValue\n });\n\n useClearRestoreValue<string | string[]>({\n property,\n value,\n setValue\n });\n\n const entity: Entity<any> = {\n id: context.entityId,\n values: context.values,\n path: context.path\n };\n\n return (\n\n <>\n\n {!tableMode &&\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n\n <StorageUpload\n value={internalValue}\n name={propertyKey}\n disabled={disabled}\n autoFocus={autoFocus}\n property={property}\n onChange={setValue}\n setInternalValue={setInternalValue}\n onFilesAdded={onFilesAdded}\n entity={entity}\n onFileUploadComplete={onFileUploadComplete}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\nfunction FileDropComponent({\n storage,\n disabled,\n isDraggingOver,\n onFilesAdded,\n multipleFilesSupported,\n droppableProvided,\n autoFocus,\n internalValue,\n property,\n entity,\n onClear,\n metadata,\n storagePathBuilder,\n onFileUploadComplete,\n size,\n name,\n helpText\n }: {\n storage: StorageConfig,\n disabled: boolean,\n isDraggingOver: boolean,\n droppableProvided: any,\n onFilesAdded: (acceptedFiles: File[]) => void,\n multipleFilesSupported: boolean,\n autoFocus: boolean,\n internalValue: StorageFieldItem[],\n property: ResolvedStringProperty,\n onClear: (clearedStoragePathOrDownloadUrl: string) => void,\n metadata: any,\n entity: Entity<any>;\n storagePathBuilder: (file: File) => string,\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>,\n size: PreviewSize,\n name: string,\n helpText: string\n}) {\n\n const snackbarContext = useSnackbarController();\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a, ...b }), {}) : undefined,\n disabled: disabled || isDraggingOver,\n noDragEventsBubbling: true,\n maxSize: storage.maxSize,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections, event) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n snackbarContext.open({\n type: \"error\",\n message: `Error uploading file: File is larger than ${storage.maxSize} bytes`\n });\n }\n }\n }\n }\n );\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n dropZoneClasses,\n multipleFilesSupported && internalValue.length ? \"\" : \"flex\",\n focusedMixin,\n {\n [nonActiveDropClasses]: !isDragActive,\n [activeDropClasses]: isDragActive,\n [rejectDropClasses]: isDragReject,\n [acceptDropClasses]: isDragAccept,\n [disabledClasses]: disabled\n })}\n >\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={cn(\"flex items-center p-1 no-scrollbar\",\n multipleFilesSupported && internalValue.length ? \"overflow-auto\" : \"\",\n multipleFilesSupported && internalValue.length ? \"min-h-[180px]\" : \"min-h-[250px]\"\n )}\n >\n\n <input\n autoFocus={autoFocus}\n {...getInputProps()} />\n\n {internalValue.map((entry, index) => {\n let child: any;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <StorageItemPreview\n name={`storage_preview_${entry.storagePathOrDownloadUrl}`}\n property={property}\n disabled={disabled}\n entity={entity}\n value={entry.storagePathOrDownloadUrl}\n onRemove={onClear}\n size={entry.size}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={size === \"medium\" ? 220 : 118}\n simple={false}\n />\n );\n }\n\n return (\n <Draggable\n key={`array_field_${name}_${entry.id}`}\n draggableId={`array_field_${name}_${entry.id}`}\n index={index}>\n {(provided, snapshot) => (\n <div\n tabIndex={-1}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className={cn(focusedMixin, \"rounded-md\")}\n style={{\n ...provided.draggableProps.style\n }}\n >\n {child}\n </div>\n )}\n </Draggable>\n );\n })\n }\n\n {droppableProvided.placeholder}\n\n </div>\n\n <div\n className=\"flex-grow min-h-[38px] box-border m-2 text-center\">\n <Typography align={\"center\"}\n variant={\"label\"}>\n {helpText}\n </Typography>\n </div>\n\n </div>\n );\n}\n\nexport interface StorageUploadProps {\n value: StorageFieldItem[];\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n disabled: boolean;\n entity: Entity<any>;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => void;\n storagePathBuilder: (file: File) => string;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;\n}\n\nexport function StorageUpload({\n property,\n name,\n value,\n setInternalValue,\n onChange,\n multipleFilesSupported,\n onFileUploadComplete,\n disabled,\n onFilesAdded,\n autoFocus,\n storage,\n entity,\n storagePathBuilder\n }: StorageUploadProps) {\n\n if (multipleFilesSupported) {\n const arrayProperty = property as ResolvedArrayProperty<string[]>;\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Storage field using array must be of data type string\");\n }\n if (arrayProperty.of.dataType !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: Record<string, unknown> | undefined = storage?.metadata;\n const size = multipleFilesSupported ? \"small\" : \"medium\";\n\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n if (!multipleFilesSupported) return;\n const newValue = [...value];\n const item = newValue[fromIndex];\n newValue.splice(fromIndex, 1);\n newValue.splice(toIndex, 0, item);\n setInternalValue(newValue);\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n onChange(fieldValue);\n }, [multipleFilesSupported, onChange, setInternalValue, value]);\n\n const onDragEnd = useCallback((result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n\n moveItem(result.source.index, result.destination.index);\n\n }, [moveItem])\n\n const onClear = useCallback((clearedStoragePathOrDownloadUrl: string) => {\n if (multipleFilesSupported) {\n const newValue: StorageFieldItem[] = value.filter(v => v.storagePathOrDownloadUrl !== clearedStoragePathOrDownloadUrl);\n onChange(newValue.filter(v => !!v.storagePathOrDownloadUrl).map(v => v.storagePathOrDownloadUrl as string));\n setInternalValue(newValue);\n } else {\n onChange(null);\n setInternalValue([]);\n }\n }, [value, multipleFilesSupported, onChange]);\n\n const helpText = multipleFilesSupported\n ? \"Drag 'n' drop some files here, or click to select files\"\n : \"Drag 'n' drop a file here, or click to select one\";\n\n const renderProperty: ResolvedStringProperty = multipleFilesSupported\n ? (property as ArrayProperty<string[]>).of as ResolvedStringProperty\n : property as ResolvedStringProperty;\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable\n droppableId={`droppable_${name}`}\n direction=\"horizontal\"\n renderClone={(provided, snapshot, rubric) => {\n const entry = value[rubric.source.index];\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={\n provided.draggableProps.style\n }\n className=\"rounded\"\n >\n <StorageItemPreview\n name={`storage_preview_${entry.storagePathOrDownloadUrl}`}\n property={renderProperty}\n disabled={true}\n entity={entity}\n value={entry.storagePathOrDownloadUrl as string}\n onRemove={onClear}\n size={entry.size}/>\n </div>\n );\n }}\n >\n {(provided, snapshot) => {\n return <FileDropComponent storage={storage}\n disabled={disabled}\n isDraggingOver={snapshot.isDraggingOver}\n droppableProvided={provided}\n onFilesAdded={onFilesAdded}\n multipleFilesSupported={multipleFilesSupported}\n autoFocus={autoFocus}\n internalValue={value}\n property={renderProperty}\n entity={entity}\n onClear={onClear}\n metadata={metadata}\n storagePathBuilder={storagePathBuilder}\n onFileUploadComplete={onFileUploadComplete}\n size={size}\n name={name}\n helpText={helpText}/>\n }}\n </Droppable>\n </DragDropContext>\n );\n\n}\n","import React, { useCallback } from \"react\";\n\nimport { FieldProps, PreviewType } from \"../../types\";\nimport { FieldHelperText } from \"../components\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { getIconForProperty } from \"../../util\";\nimport { ClearIcon, Collapse, IconButton, TextField } from \"@firecms/ui\";\nimport { PropertyPreview } from \"../../preview\";\nimport { LabelWithIcon } from \"../../components\";\n\ninterface TextFieldProps<T extends string | number> extends FieldProps<T> {\n allowInfinity?: boolean\n}\n\n/**\n * Generic text field.\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TextFieldBinding<T extends string | number>({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n property,\n includeDescription,\n }: TextFieldProps<T>) {\n\n let multiline: boolean | undefined;\n let url: boolean | PreviewType | undefined;\n if (property.dataType === \"string\") {\n multiline = property.multiline;\n url = property.url;\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (inputType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n };\n\n const isMultiline = Boolean(multiline);\n\n const inputType = property.dataType === \"number\" ? \"number\" : undefined;\n return (\n <>\n <TextField\n value={value}\n onChange={onChange}\n autoFocus={autoFocus}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}/>}\n type={inputType}\n multiline={isMultiline}\n disabled={disabled}\n endAdornment={\n property.clearable && <IconButton\n onClick={handleClearClick}>\n <ClearIcon/>\n </IconButton>\n }\n error={showError ? error : undefined}\n inputClassName={error ? \"text-red-500 dark:text-red-600\" : \"\"}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n {url && <Collapse\n className=\"mt-1 ml-1\"\n in={Boolean(value)}>\n <PropertyPreview value={value}\n property={property}\n size={\"medium\"}/>\n </Collapse>}\n\n </>\n );\n\n}\n","import React from \"react\";\n\nimport { FieldProps } from \"../../types\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { getIconForProperty } from \"../../util\";\nimport { FieldHelperText } from \"../components/FieldHelperText\";\nimport { BooleanSwitchWithLabel } from \"@firecms/ui\";\nimport { LabelWithIcon } from \"../../components\";\n\ntype SwitchFieldProps = FieldProps<boolean>;\n\n/**\n * Simple boolean switch biding to a boolean property.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n disabled,\n touched,\n property,\n includeDescription\n }: SwitchFieldProps, ref) {\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n\n <BooleanSwitchWithLabel\n value={value}\n onValueChange={(v) => setValue(v)}\n error={showError}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}/>}\n disabled={disabled}\n autoFocus={autoFocus}\n size={\"medium\"}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n </>\n\n );\n});\n","import React from \"react\";\n\nimport { FieldProps } from \"../../types\";\n\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { useClearRestoreValue, useFireCMSContext } from \"../../hooks\";\nimport { getIconForProperty } from \"../../util\";\nimport { DateTimeField } from \"@firecms/ui\";\n\ntype DateTimeFieldProps = FieldProps<Date>;\n\n/**\n * Field that allows selecting a date\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function DateTimeFieldBinding({\n propertyKey,\n value,\n setValue,\n autoFocus,\n error,\n showError,\n disabled,\n touched,\n property,\n includeDescription\n }: DateTimeFieldProps) {\n\n const { locale } = useFireCMSContext();\n const internalValue = value || null;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n <DateTimeField\n value={internalValue}\n onChange={(dateValue) => setValue(dateValue)}\n size={\"medium\"}\n mode={property.mode}\n clearable={property.clearable}\n locale={locale}\n label={<LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}\n title={property.name}/>}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React from \"react\";\n\nimport { Entity, FieldProps } from \"../../types\";\n\nimport { PropertyPreview } from \"../../preview\";\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { getIconForProperty } from \"../../util\";\nimport { cn, paperMixin } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n *\n * Simply render the non-editable preview of a field\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReadOnlyFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n tableMode,\n property,\n includeDescription,\n context\n }: FieldProps<any>) {\n\n if (!context.entityId)\n throw new Error(\"ReadOnlyFieldBinding: Entity id is null\");\n\n const entity: Entity<any> = {\n id: context.entityId!,\n values: context.values,\n path: context.path\n };\n\n return (\n\n <>\n\n {!tableMode && <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n }\n\n <div\n className={cn(paperMixin, \"min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar\")}>\n\n <ErrorBoundary>\n <PropertyPreview propertyKey={propertyKey}\n value={value}\n property={property}\n // entity={entity}\n size={\"medium\"}/>\n </ErrorBoundary>\n\n </div>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback, useMemo } from \"react\";\n\nimport { Entity, EntityCollection, EntityReference, FieldProps } from \"../../types\";\nimport { useClearRestoreValue, useNavigationController, useReferenceDialog } from \"../../hooks\";\nimport { ReadOnlyFieldBinding } from \"./ReadOnlyFieldBinding\";\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { ReferencePreview } from \"../../preview\";\nimport { getIconForProperty, getReferenceFrom } from \"../../util\";\nimport { Button } from \"@firecms/ui\";\nimport { ErrorView } from \"../../components\";\n\n/**\n * Field that opens a reference selection dialog.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReferenceFieldBinding<M extends Record<string, any>>(props: FieldProps<EntityReference>) {\n\n if (typeof props.property.path !== \"string\") {\n return <ReadOnlyFieldBinding {...props}/>\n }\n\n return <ReferenceFieldBindingInternal {...props}/>;\n\n}\n\nfunction ReferenceFieldBindingInternal<M extends Record<string, any>>({\n value,\n setValue,\n error,\n showError,\n isSubmitting,\n disabled,\n touched,\n autoFocus,\n property,\n includeDescription,\n context\n }: FieldProps<EntityReference>) {\n if (!property.path) {\n throw new Error(\"Property path is required for ReferenceFieldBinding\");\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = value && value instanceof EntityReference;\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return property.path ? navigationController.getCollection(property.path) : undefined;\n }, [property.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${property.path}`);\n }\n\n const onSingleEntitySelected = useCallback((e: Entity<any> | null) => {\n setValue(e ? getReferenceFrom(e) : null);\n }, [setValue]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: false,\n path: property.path,\n collection,\n onSingleEntitySelected,\n selectedEntityIds: validValue ? [value.id] : undefined,\n forceFilter: property.forceFilter\n }\n );\n\n const onEntryClick = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n }, [referenceDialogController]);\n\n return (\n <>\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <>\n\n {value && <ReferencePreview\n disabled={!property.path}\n previewProperties={property.previewProperties}\n size={\"medium\"}\n onClick={disabled || isSubmitting ? undefined : onEntryClick}\n reference={value}\n />}\n\n {!value && <div className=\"justify-center text-left\">\n <Button variant=\"outlined\"\n color=\"primary\"\n disabled={disabled || isSubmitting}\n onClick={onEntryClick}>\n Edit {property.name}\n </Button>\n </div>}\n </>}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n\n}\n","import React, { ComponentType, ReactElement, useCallback, useRef } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { FastField, Field, FieldProps as FormikFieldProps, getIn } from \"formik\";\n\nimport {\n CMSType,\n EntityCollection,\n FieldProps,\n FireCMSPlugin,\n PluginFieldBuilderParams,\n Property,\n PropertyFieldBindingProps,\n PropertyOrBuilder,\n ResolvedProperty\n} from \"../types\";\nimport { ReadOnlyFieldBinding } from \"./field_bindings/ReadOnlyFieldBinding\";\n\nimport { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from \"../util\";\nimport { useFireCMSContext } from \"../hooks\";\nimport { Typography } from \"@firecms/ui\";\nimport { getFieldConfig, getFieldId } from \"../core\";\nimport { ErrorBoundary } from \"../components\";\n\n/**\n * This component renders a form field creating the corresponding configuration\n * from a property. For example if bound to a string property, it will generate\n * a text field.\n *\n * You can use it when you are creating a custom field, and need to\n * render additional fields mapped to properties. This is useful if you\n * need to build a complex property mapping, like an array where each index\n * is a different property.\n *\n * Please note that if you build a custom field in a component, the\n * **validation** passed in the property will have no effect. You need to set\n * the validation in the `EntityCollection` definition.\n *\n * @param propertyKey You can use nested names such as `address.street` or `friends[2]`\n * @param property\n * @param context\n * @param includeDescription\n * @param underlyingValueHasChanged\n * @param disabled\n * @param tableMode\n * @param partOfArray\n * @param autoFocus\n * @group Form custom fields\n */\nexport const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a: PropertyFieldBindingProps<any>, b: PropertyFieldBindingProps<any>) => {\n if (a.propertyKey !== b.propertyKey) {\n return false;\n }\n const aIsBuilder = isPropertyBuilder(a.property) || a.property.fromBuilder;\n const bIsBuilder = isPropertyBuilder(b.property) || b.property.fromBuilder;\n\n const baseCheck = (aIsBuilder === bIsBuilder || equal(a.property, b.property)) &&\n a.disabled === b.disabled;\n if (!baseCheck) {\n return false;\n }\n\n if (shouldPropertyReRender(b.property)) {\n return false;\n }\n\n return false;\n}) as typeof PropertyFieldBindingInternal;\n\nfunction PropertyFieldBindingInternal<T extends CMSType = CMSType, CustomProps = any, M extends Record<string, any> = Record<string, any>>\n({\n propertyKey,\n property,\n context,\n includeDescription,\n underlyingValueHasChanged,\n disabled,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus,\n }: PropertyFieldBindingProps<T, M>): ReactElement<PropertyFieldBindingProps<T, M>> {\n\n const fireCMSContext = useFireCMSContext();\n\n const shouldAlwaysRerender = shouldPropertyReRender(property, fireCMSContext.plugins);\n // we use the standard Field for user defined fields, since it rebuilds\n // when there are changes in other values, in contrast to FastField\n const FieldComponent = shouldAlwaysRerender ? Field : FastField;\n\n return (\n <FieldComponent\n name={propertyKey}\n >\n {(fieldProps: FormikFieldProps<T>) => {\n\n let Component: ComponentType<FieldProps<T>> | undefined;\n const resolvedProperty: ResolvedProperty<T> | null = resolveProperty({\n propertyKey,\n propertyValue: fieldProps.field.value,\n propertyOrBuilder: property,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n fields: fireCMSContext.propertyConfigs\n });\n\n if (resolvedProperty === null || isHidden(resolvedProperty)) {\n return <></>;\n } else if (isReadOnly(resolvedProperty)) {\n Component = ReadOnlyFieldBinding;\n } else if (resolvedProperty.Field) {\n if (typeof resolvedProperty.Field === \"function\") {\n Component = resolvedProperty.Field as ComponentType<FieldProps<any>>;\n }\n } else {\n const propertyConfig = getFieldConfig(resolvedProperty, fireCMSContext.propertyConfigs);\n if (!propertyConfig) {\n console.log(\"INTERNAL: Could not find field config for property\", { propertyKey, resolvedProperty, fields: fireCMSContext.propertyConfigs, propertyConfig });\n throw new Error(`INTERNAL: Could not find field config for property ${propertyKey}`);\n }\n const configProperty = resolveProperty({\n propertyOrBuilder: propertyConfig.property,\n propertyValue: fieldProps.field.value,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n fields: fireCMSContext.propertyConfigs\n });\n Component = configProperty.Field as ComponentType<FieldProps<T>>;\n }\n if (!Component) {\n console.warn(`No field component found for property ${propertyKey}`);\n console.warn(\"Property:\", property);\n return (\n <div>{`Currently the field ${resolvedProperty.dataType} is not supported`}</div>\n );\n }\n\n const componentProps: ResolvedPropertyFieldBindingProps<T, M> = {\n propertyKey,\n property: resolvedProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus\n };\n\n return <FieldInternal\n Component={Component as ComponentType<FieldProps>}\n componentProps={componentProps}\n fieldProps={fieldProps}/>;\n }}\n </FieldComponent>\n );\n\n}\n\ntype ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>> =\n Omit<PropertyFieldBindingProps<T, M>, \"property\">\n & {\n property: ResolvedProperty<T>\n};\n\nfunction FieldInternal<T extends CMSType, CustomProps, M extends Record<string, any>>\n({\n Component,\n componentProps: {\n propertyKey,\n property,\n includeDescription,\n underlyingValueHasChanged,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus,\n context,\n disabled\n },\n fieldProps\n }:\n {\n Component: ComponentType<FieldProps<T, any, M>>,\n componentProps: ResolvedPropertyFieldBindingProps<T, M>,\n fieldProps: FormikFieldProps<T>\n }) {\n\n const { plugins } = useFireCMSContext();\n\n const customFieldProps: any = property.customProps;\n const value = fieldProps.field.value;\n const initialValue = fieldProps.meta.initialValue;\n const error = getIn(fieldProps.form.errors, propertyKey);\n const touched = getIn(fieldProps.form.touched, propertyKey);\n\n const showError: boolean = error &&\n (fieldProps.form.submitCount > 0 || property.validation?.unique) &&\n (!Array.isArray(error) || !!error.filter((e: any) => !!e).length);\n\n const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent(context.path, context.collection, propertyKey, property, Component, plugins);\n const UsedComponent: ComponentType<FieldProps<T>> = Component;\n\n const isSubmitting = fieldProps.form.isSubmitting;\n\n const setValue = useCallback((value: T | null, shouldValidate?: boolean) => {\n fieldProps.form.setFieldTouched(propertyKey, true, false);\n fieldProps.form.setFieldValue(propertyKey, value, shouldValidate);\n }, []);\n\n const setFieldValue = useCallback((otherPropertyKey: string, value: CMSType | null, shouldValidate?: boolean) => {\n fieldProps.form.setFieldTouched(propertyKey, true, false);\n fieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);\n }, []);\n\n const cmsFieldProps: FieldProps<T, CustomProps, M> = {\n propertyKey,\n value: value as T,\n initialValue,\n setValue,\n setFieldValue,\n error,\n touched,\n showError,\n isSubmitting,\n includeDescription: includeDescription ?? true,\n property: property as ResolvedProperty<T>,\n disabled: disabled ?? false,\n underlyingValueHasChanged: underlyingValueHasChanged ?? false,\n tableMode: tableMode ?? false,\n partOfArray: partOfArray ?? false,\n partOfBlock: partOfBlock ?? false,\n autoFocus: autoFocus ?? false,\n customProps: customFieldProps,\n context\n };\n\n return (\n <ErrorBoundary>\n\n <UsedComponent {...cmsFieldProps}/>\n\n {underlyingValueHasChanged && !isSubmitting &&\n <Typography variant={\"caption\"} className={\"ml-3.5\"}>\n This value has been updated elsewhere\n </Typography>}\n\n </ErrorBoundary>);\n\n}\n\nconst shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty, plugins?: FireCMSPlugin[]): boolean => {\n if (plugins?.some((plugin) => plugin.form?.fieldBuilder)) {\n return true;\n }\n if (isPropertyBuilder(property)) {\n return true;\n }\n const defAProperty = property as Property | ResolvedProperty;\n const rerenderThisProperty = Boolean(defAProperty.Field) || (\"fromBuilder\" in defAProperty && defAProperty.fromBuilder);\n if (defAProperty.dataType === \"map\" && defAProperty.properties) {\n return rerenderThisProperty || Object.values(defAProperty.properties).some((childProperty) => shouldPropertyReRender(childProperty, plugins));\n } else if (defAProperty.dataType === \"array\" && \"resolvedProperties\" in defAProperty) {\n // @ts-ignore\n return rerenderThisProperty || defAProperty.resolvedProperties?.some((childProperty) => childProperty && shouldPropertyReRender(childProperty, plugins));\n } else {\n return rerenderThisProperty;\n }\n}\n\nfunction useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(\n path: string,\n collection: EntityCollection<M>,\n propertyKey: string,\n property: ResolvedProperty<T>,\n Component: ComponentType<FieldProps<T, any, M>>,\n plugins?: FireCMSPlugin[]\n): ComponentType<FieldProps<T, any, M>> | null {\n\n const wrapperRef = useRef<ComponentType<FieldProps<T, any, M>> | null>((() => {\n let Wrapper: ComponentType<FieldProps<T, any, M>> | null = null;\n if (plugins) {\n plugins.forEach((plugin) => {\n const fieldId = getFieldId(property);\n if (fieldId && plugin.form?.fieldBuilder) {\n const params: PluginFieldBuilderParams<T> = {\n fieldConfigId: fieldId,\n propertyKey,\n property,\n Field: Component,\n plugin,\n path,\n collection\n };\n const enabled = plugin.form?.fieldBuilderEnabled?.(params);\n if (enabled === undefined || enabled)\n Wrapper = plugin.form.fieldBuilder(params) || Wrapper;\n }\n if (!fieldId) {\n console.warn(\"INTERNAL: Field id not found for property\", property);\n }\n });\n }\n return Wrapper;\n })());\n\n return wrapperRef.current;\n}\n","import React from \"react\";\nimport { FieldProps, Properties, ResolvedProperties } from \"../../types\";\n\nimport { LabelWithIcon } from \"../../components\";\nimport { getIconForProperty, isHidden, pick } from \"../../util\";\nimport { FieldHelperText } from \"../components\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel, InputLabel, Select, SelectItem } from \"@firecms/ui\";\n\n/**\n * Field that renders the children property fields\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MapFieldBinding<T extends Record<string, any>>({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n setValue,\n partOfBlock,\n tableMode,\n includeDescription,\n underlyingValueHasChanged,\n autoFocus,\n context\n }: FieldProps<T>) {\n\n const pickOnlySomeKeys = property.pickOnlySomeKeys || false;\n const expanded = (property.expanded === undefined ? true : property.expanded) || autoFocus;\n\n if (!property.properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);\n }\n\n let mapProperties: ResolvedProperties;\n if (pickOnlySomeKeys) {\n if (value) {\n mapProperties = pick(property.properties,\n ...Object.keys(value)\n .filter(key => key in property.properties!)\n );\n } else {\n mapProperties = {};\n }\n } else {\n mapProperties = property.properties;\n }\n\n // useClearRestoreValue({\n // property,\n // value,\n // setValue\n // });\n\n const mapFormView = <>\n <div className=\"py-1 flex flex-col space-y-2\">\n {Object.entries(mapProperties)\n .filter(([_, property]) => !isHidden(property))\n .map(([entryKey, childProperty], index) => {\n const fieldProps = {\n propertyKey: `${propertyKey}.${entryKey}`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: autoFocus && index === 0\n };\n return (\n <div key={`map-${propertyKey}-${index}`}>\n <PropertyFieldBinding\n {...fieldProps}/>\n </div>\n );\n }\n )}\n </div>\n\n {/*{pickOnlySomeKeys && buildPickKeysSelect(disabled, property.properties, setValue, value)}*/}\n\n </>;\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n return (\n <>\n\n {!tableMode && !partOfBlock && <ExpandablePanel initiallyExpanded={expanded}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n title={title}>{mapFormView}</ExpandablePanel>}\n\n {(tableMode || partOfBlock) && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\nconst buildPickKeysSelect = (disabled: boolean, properties: Properties, setValue: (value: any) => void, value: any) => {\n\n const keys = Object.keys(properties)\n .filter((key) => !value || !(key in value));\n\n const handleAddProperty = (updatedValue: string | string[]) => {\n setValue({\n ...value,\n [updatedValue as string]: null\n });\n };\n\n if (!keys.length) return <></>;\n\n return <div className={\"m-4\"}>\n <InputLabel>Add property</InputLabel>\n <Select\n value={\"\"}\n disabled={disabled}\n onValueChange={handleAddProperty}\n renderValue={(key) => (properties as Properties)[key].name || key}>\n {keys.map((key) => <SelectItem key={key}\n value={key}>{(properties as Properties)[key].name || key}</SelectItem>)}\n </Select>\n </div>;\n};\n","import React, { useEffect, useState } from \"react\";\nimport { DataType, EntityReference, FieldProps, GeoPoint } from \"../../types\";\n\nimport { ArrayContainer } from \"../../components\";\nimport { FieldHelperText } from \"../components\";\n\nimport { LabelWithIcon } from \"../../components\";\nimport {\n AddIcon,\n ArrowDropDownIcon,\n BooleanSwitchWithLabel,\n Button,\n cn,\n DateTimeField,\n defaultBorderMixin,\n ExpandablePanel,\n IconButton,\n Menu,\n MenuItem,\n RemoveIcon,\n TextField,\n Typography\n} from \"@firecms/ui\";\nimport { getDefaultValueForDataType, getIconForProperty } from \"../../util\";\nimport { useFireCMSContext } from \"../../hooks\";\n\ntype MapEditViewRowState = [number, {\n key: string,\n dataType: DataType\n}];\n\n/**\n * Field that allows edition of key value pairs.\n *\n * @group Form fields\n */\nexport function KeyValueFieldBinding<T extends Record<string, any>>({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n setValue,\n tableMode,\n includeDescription,\n underlyingValueHasChanged,\n autoFocus,\n context\n }: FieldProps<T>) {\n\n const expanded = (property.expanded === undefined ? true : property.expanded) || autoFocus;\n\n if (!property.keyValue) {\n throw Error(`Your property ${propertyKey} needs to have the 'keyValue' prop in order to use this field binding`);\n }\n const mapFormView = <MapEditView value={value}\n setValue={setValue}\n disabled={disabled}\n fieldName={property.name ?? propertyKey}/>;\n\n const title = <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>;\n\n return (\n <>\n\n {!tableMode && <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>{mapFormView}</ExpandablePanel>}\n\n {tableMode && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface MapEditViewParams<T extends Record<string, any>> {\n value?: T;\n setValue: (value: (T | null)) => void;\n fieldName?: string,\n disabled?: boolean\n}\n\nfunction MapEditView<T extends Record<string, any>>({\n value,\n setValue,\n fieldName,\n disabled\n }: MapEditViewParams<T>) {\n const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(\n Object.keys(value ?? {}).map((key) => [getRandomId(), {\n key,\n dataType: getDataType(value?.[key]) ?? \"string\"\n }])\n );\n\n useEffect(() => {\n const currentKeys = internalState.map(([id, { key }]) => key);\n const newKeys = Object.entries(value ?? {}).filter(([key, v]) => v !== undefined).map(([key]) => key);\n const keysToAdd = newKeys.filter((key) => !currentKeys.includes(key));\n const keysToRemove = currentKeys.filter((key) => !newKeys.includes(key));\n const newRowIds = [...internalState];\n keysToAdd.forEach((key) => {\n newRowIds.push([getRandomId(), {\n key,\n dataType: getDataType(value?.[key]) ?? \"string\"\n }]);\n });\n keysToRemove.forEach((key) => {\n const index = newRowIds.findIndex(([id, { key: k }]) => k === key);\n newRowIds.splice(index, 1);\n });\n setInternalState(newRowIds);\n }, [value]);\n\n const originalValue = React.useRef<T>(value ?? {} as T);\n\n const updateDataType = (rowId: number, dataType: DataType) => {\n if (!rowId) {\n console.warn(\"No key selected for data type update\");\n return;\n }\n setInternalState(internalState.map((row) => {\n if (row[0] === rowId) {\n return [row[0], {\n key: row[1].key,\n dataType\n }];\n }\n return row;\n }));\n setValue({\n ...(value ?? {} as T),\n [internalState.find((row) => row[0] === rowId)?.[1].key ?? \"\"]: getDefaultValueForDataType(dataType)\n })\n };\n\n return <div className=\"py-1 flex flex-col gap-1\">\n {internalState\n .map(([rowId, {\n key: fieldKey,\n dataType\n }], index) => {\n const entryValue = fieldKey ? value?.[fieldKey] : \"\";\n const onFieldKeyChange = (newKey: string) => {\n\n setInternalState(internalState.map((currentRowId) => {\n if (currentRowId[0] === rowId) {\n return [rowId, {\n key: newKey ?? \"\",\n dataType: currentRowId[1].dataType\n }];\n }\n return currentRowId;\n }));\n\n if (typeof value === \"object\" && newKey in value) {\n // if the key is already there, don't delete the previous value\n return;\n }\n\n const newValue = { ...(value ?? {}) } as T;\n if (typeof originalValue.current === \"object\" && fieldKey in originalValue.current) {\n // @ts-ignore\n newValue[fieldKey] = undefined; // set to undefined to remove from the object, the datasource will remove it from the backend\n } else {\n // @ts-ignore\n delete newValue[fieldKey];\n }\n setValue({\n ...newValue,\n [newKey ?? \"\"]: entryValue\n });\n };\n return <MapKeyValueRow rowId={rowId}\n key={rowId}\n fieldKey={fieldKey}\n value={value ?? {} as T}\n onDeleteClick={() => {\n const newValue = { ...(value ?? {}) as T };\n if (originalValue.current && fieldKey in originalValue.current) {\n // @ts-ignore\n newValue[fieldKey] = undefined;\n } else {\n // @ts-ignore\n delete newValue[fieldKey];\n }\n setInternalState(internalState.filter((currentRowId) => currentRowId[0] !== rowId));\n setValue({\n ...newValue\n });\n }}\n onFieldKeyChange={onFieldKeyChange}\n setValue={setValue}\n entryValue={entryValue}\n dataType={dataType}\n disabled={disabled}\n updateDataType={updateDataType}/>;\n }\n )}\n\n <Button variant={\"text\"}\n size={\"small\"}\n color=\"primary\"\n className=\"w-full\"\n disabled={disabled}\n startIcon={<AddIcon/>}\n onClick={(e) => {\n e.preventDefault();\n setValue({\n ...(value ?? {} as T),\n \"\": null\n });\n setInternalState([...internalState, [getRandomId(), {\n key: \"\",\n dataType: \"string\"\n }]]);\n }\n }>\n {fieldName ? `Add to ${fieldName}` : \"Add\"}\n </Button>\n\n </div>;\n}\n\nfunction MapKeyValueRow<T extends Record<string, any>>({\n rowId,\n fieldKey,\n value,\n onFieldKeyChange,\n onDeleteClick,\n setValue,\n entryValue,\n dataType,\n updateDataType,\n disabled\n }: {\n rowId: number,\n fieldKey: string,\n value: T,\n onFieldKeyChange: (newKey: string) => void,\n onDeleteClick: () => void,\n setValue: (value: (T | null)) => void,\n entryValue: any,\n dataType: DataType,\n disabled?: boolean,\n updateDataType: (rowId: number, dataType: DataType) => void\n}) {\n\n const { locale } = useFireCMSContext();\n\n function buildInput(entryValue: any, fieldKey: string, dataType: DataType) {\n if (dataType === \"string\" || dataType === \"number\") {\n return <TextField\n key={dataType}\n placeholder={\"value\"}\n value={entryValue}\n type={dataType === \"number\" ? \"number\" : \"text\"}\n size={\"small\"}\n disabled={disabled || !fieldKey}\n onChange={(event) => {\n if (dataType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue({\n ...value,\n [fieldKey]: null\n });\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue({\n ...value,\n [fieldKey]: numberValue\n });\n } else {\n setValue({\n ...value,\n [fieldKey]: null\n });\n }\n } else {\n setValue({\n ...value,\n [fieldKey]: event.target.value\n });\n }\n }}/>;\n } else if (dataType === \"date\") {\n return <DateTimeField value={entryValue}\n size={\"small\"}\n locale={locale}\n disabled={disabled || !fieldKey}\n onChange={(date) => {\n setValue({\n ...value,\n [fieldKey]: date\n });\n }}/>;\n } else if (dataType === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue}\n size={\"small\"}\n position={\"start\"}\n disabled={disabled || !fieldKey}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}/>;\n } else if (dataType === \"array\") {\n return <div\n className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <ArrayContainer value={entryValue}\n newDefaultEntry={\"\"}\n droppableId={rowId.toString()}\n addLabel={fieldKey ? `Add to ${fieldKey}` : \"Add\"}\n size={\"small\"}\n disabled={disabled || !fieldKey}\n includeAddButton={true}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}\n buildEntry={(index, internalId) => {\n return <ArrayKeyValueRow\n index={index}\n id={internalId}\n value={entryValue[index]}\n disabled={disabled || !fieldKey}\n setValue={(newValue) => {\n const newArrayValue = [...entryValue];\n newArrayValue[index] = newValue;\n setValue({\n ...value,\n [fieldKey]: newArrayValue\n });\n }}\n />\n }}/>\n </div>;\n } else if (dataType === \"map\") {\n return <div\n className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={entryValue}\n fieldName={fieldKey}\n setValue={(updatedValue) => {\n setValue({\n ...value,\n [fieldKey]: updatedValue\n });\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${dataType} not supported yet`}\n </Typography>;\n }\n }\n\n function doUpdateDataType(dataType: DataType) {\n updateDataType(rowId, dataType);\n }\n\n return (<>\n <Typography key={rowId.toString()}\n component={\"div\"}\n className=\"font-mono flex flex-row gap-1\">\n <div className=\"w-[200px] max-w-[25%]\">\n <TextField\n value={fieldKey}\n placeholder={\"key\"}\n disabled={disabled || (entryValue !== undefined && entryValue !== null && entryValue !== \"\")}\n size={\"small\"}\n onChange={(event) => {\n onFieldKeyChange(event.target.value);\n }}/>\n </div>\n\n <div className=\"flex-grow\">\n {(dataType !== \"map\" && dataType !== \"array\") && buildInput(entryValue, fieldKey, dataType)}\n </div>\n <Menu\n trigger={<IconButton size={\"small\"}\n className=\"h-7 w-7\">\n <ArrowDropDownIcon/>\n </IconButton>}\n >\n <MenuItem dense\n onClick={() => doUpdateDataType(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"date\")}>date</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"array\")}>array</MenuItem>\n </Menu>\n\n <IconButton aria-label=\"delete\"\n size={\"small\"}\n onClick={onDeleteClick}\n className=\"h-7 w-7\">\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Typography>\n\n {(dataType === \"map\" || dataType === \"array\") && buildInput(entryValue, fieldKey, dataType)}\n\n </>\n\n );\n}\n\nfunction ArrayKeyValueRow<T>({\n id,\n index,\n value,\n setValue\n }: {\n id: number,\n index: number,\n value: T,\n setValue: (value: T | null) => void,\n disabled?: boolean,\n}) {\n\n const { locale } = useFireCMSContext();\n const [selectedDataType, setSelectedDataType] = useState<DataType>(getDataType(value) ?? \"string\");\n\n function doUpdateDataType(dataType: DataType) {\n setSelectedDataType(dataType);\n }\n\n function buildInput(entryValue: any, dataType: DataType) {\n if (dataType === \"string\" || dataType === \"number\") {\n return <TextField value={entryValue}\n type={dataType === \"number\" ? \"number\" : \"text\"}\n size={\"small\"}\n onChange={(event) => {\n if (dataType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n }}/>;\n } else if (dataType === \"date\") {\n return <DateTimeField value={entryValue}\n size={\"small\"}\n locale={locale}\n onChange={(date) => {\n setValue(date as T);\n }}/>;\n } else if (dataType === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue}\n size={\"small\"}\n position={\"start\"}\n onValueChange={(v) => {\n setValue(v as T);\n }}/>;\n } else if (dataType === \"array\") {\n return <Typography variant={\"caption\"}>\n Arrays of arrays are not supported.\n </Typography>;\n } else if (dataType === \"map\") {\n return <div className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={entryValue}\n setValue={(updatedValue) => {\n setValue(updatedValue);\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${dataType} not supported yet`}\n </Typography>;\n }\n }\n\n return (<>\n <Typography key={id.toString()}\n component={\"div\"}\n className=\"font-mono flex min-h-12 flex-row gap-1 items-center\">\n\n <div className=\"flex-grow\">\n {selectedDataType !== \"map\" && buildInput(value, selectedDataType)}\n </div>\n\n <Menu\n trigger={<IconButton size={\"small\"}\n className=\"h-7 w-7\">\n <ArrowDropDownIcon/>\n </IconButton>}>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"date\")}>date</MenuItem>\n </Menu>\n\n </Typography>\n\n {selectedDataType === \"map\" && buildInput(value, selectedDataType)}\n\n </>\n\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\nfunction getDataType(value: any): DataType | undefined {\n if (typeof value === \"string\" || value === null) {\n return \"string\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (Array.isArray(value)) {\n return \"array\";\n } else if (value instanceof Date) {\n return \"date\";\n } else if (value instanceof EntityReference) {\n return \"reference\";\n } else if (value instanceof GeoPoint) {\n return \"geopoint\";\n } else if (typeof value === \"object\") {\n return \"map\";\n }\n\n return undefined;\n}\n","import React, { useState } from \"react\";\nimport { CMSType, FieldProps, ResolvedProperty } from \"../../types\";\nimport { FieldHelperText, FormikArrayContainer } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { getIconForProperty } from \"../../util\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel } from \"@firecms/ui\";\n\n/**\n * Generic array field that allows reordering and renders the child property\n * as nodes.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function RepeatFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T>) {\n\n if (!property.of)\n throw Error(\"RepeatFieldBinding misconfiguration. Property `of` not set\");\n\n if (!property.resolvedProperties || !Array.isArray(property.resolvedProperties))\n throw Error(\"RepeatFieldBinding - Internal error: Expected array in 'property.resolvedProperties'\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n const ofProperty: ResolvedProperty<CMSType[]> = property.of as ResolvedProperty<CMSType[]>;\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const buildEntry = (index: number, internalId: number) => {\n const childProperty = property.resolvedProperties[index] ?? ofProperty;\n const fieldProps = {\n propertyKey: `${propertyKey}.${index}`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: true,\n partOfBlock: false,\n autoFocus: internalId === lastAddedId\n };\n return <PropertyFieldBinding {...fieldProps}/>;\n };\n\n const arrayContainer = <FormikArrayContainer value={value}\n addLabel={property.name ? \"Add entry to \" + property.name : \"Add entry\"}\n name={propertyKey}\n setFieldValue={setFieldValue}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.disabled)}\n includeAddButton={!property.disabled}\n newDefaultEntry={property.of.defaultValue}/>;\n\n const title = (<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>);\n\n return (\n\n <>\n\n {!tableMode && <ExpandablePanel initiallyExpanded={expanded}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n title={title}>\n {arrayContainer}\n </ExpandablePanel>}\n\n {tableMode && arrayContainer}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\n\nimport { FastField, FieldProps as FormikFieldProps, useFormikContext } from \"formik\";\n\nimport { FieldHelperText, FormikArrayContainer } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { useClearRestoreValue } from \"../../hooks\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { FieldProps, FormContext, PropertyFieldBindingProps, PropertyOrBuilder } from \"../../types\";\nimport { getDefaultValueFor, getIconForProperty, } from \"../../util\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"../../util/common\";\nimport { cn, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from \"@firecms/ui\";\n\n/**\n * If the `oneOf` property is specified, this fields render each array entry as\n * a `type` select and the corresponding field widget to the selected `type.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function BlockFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T>) {\n\n if (!property.oneOf)\n throw Error(\"ArrayOneOfField misconfiguration. Property `oneOf` not set\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n const buildEntry = useCallback((index: number, internalId: number) => {\n return <BlockEntry\n key={`array_one_of_${index}`}\n name={`${propertyKey}.${index}`}\n index={index}\n value={value[index]}\n typeField={property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE}\n valueField={property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE}\n properties={property.oneOf!.properties}\n autoFocus={internalId === lastAddedId}\n context={context}/>;\n }, [context, lastAddedId, property.oneOf, propertyKey, value]);\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n const firstOneOfKey = Object.keys(property.oneOf.properties)[0];\n const body = <FormikArrayContainer value={value}\n name={propertyKey}\n addLabel={property.name ? \"Add entry to \" + property.name : \"Add entry\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.disabled)}\n includeAddButton={!property.disabled}\n setFieldValue={setFieldValue}\n newDefaultEntry={{\n [property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE]: firstOneOfKey,\n [property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE]: getDefaultValueFor(property.oneOf.properties[firstOneOfKey])\n }}/>;\n return (\n\n <>\n\n {!tableMode &&\n <ExpandablePanel\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface BlockEntryProps {\n name: string;\n index: number;\n value: any;\n /**\n * Name of the field to use as the discriminator for type\n * Defaults to `type`\n */\n typeField: string;\n /**\n * Name of the field to use as the value\n * Defaults to `value`\n */\n valueField: string;\n\n autoFocus: boolean;\n /**\n * Record of properties, where the key is the `type` and the value\n * is the corresponding property\n */\n properties: Record<string, PropertyOrBuilder>;\n\n /**\n * Additional values related to the state of the form or the entity\n */\n context: FormContext<any>;\n\n}\n\nfunction BlockEntry({\n name,\n index,\n value,\n typeField,\n valueField,\n properties,\n autoFocus,\n context\n }: BlockEntryProps) {\n\n const type = value && value[typeField];\n const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);\n\n const formikContext = useFormikContext();\n\n useEffect(() => {\n if (!type) {\n updateType(Object.keys(properties)[0]);\n }\n }, []);\n\n useEffect(() => {\n if (type !== typeInternal) {\n setTypeInternal(type);\n }\n }, [type]);\n\n const property = typeInternal ? properties[typeInternal] : undefined;\n\n const enumValuesConfigs = Object.entries(properties)\n .map(([key, property]) => ({\n id: key,\n label: property.name ?? key\n }));\n\n const typeFieldName = `${name}.${typeField}`;\n const valueFieldName = `${name}.${valueField}`;\n\n const fieldProps: PropertyFieldBindingProps<any, any> | undefined = property\n ? {\n propertyKey: valueFieldName,\n property,\n context,\n autoFocus,\n partOfArray: false,\n partOfBlock: true,\n tableMode: false\n }\n : undefined;\n\n const updateType = (newType: any) => {\n const newSelectedProperty = newType ? properties[newType] : undefined;\n setTypeInternal(newType);\n formikContext.setFieldTouched(typeFieldName);\n formikContext.setFieldValue(typeFieldName, newType);\n formikContext.setFieldValue(valueFieldName, newSelectedProperty ? getDefaultValueFor(newSelectedProperty) : null);\n };\n\n return (\n <div className={cn(paperMixin, \"bg-transparent p-4 my-4 py-8\")}>\n\n <FastField\n required={true}\n name={typeFieldName}\n >\n {(fieldProps: FormikFieldProps) =>\n (\n <>\n <Select\n className=\"mb-2\"\n placeholder={<Typography variant={\"caption\"}\n className={\"px-4 py-2 font-medium\"}>Type</Typography>}\n size={\"small\"}\n position={\"item-aligned\"}\n value={fieldProps.field.value !== undefined && fieldProps.field.value !== null ? fieldProps.field.value : \"\"}\n renderValue={(enumKey: any) =>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n }\n onValueChange={(value) => {\n updateType(value);\n }}>\n {enumValuesConfigs.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n </SelectItem>)\n )}\n </Select>\n </>\n )\n }\n </FastField>\n\n {fieldProps && (\n // It is important to use this key to force a re-render of the field on type change\n <PropertyFieldBinding key={`form_control_${name}_${typeInternal}`} {...fieldProps}/>\n )}\n\n </div>\n );\n}\n","import React, { useDeferredValue, useEffect, useRef } from \"react\";\n\n// @ts-ignore\nimport MarkdownIt from \"markdown-it\";\nimport MdEditor, { Plugins } from \"react-markdown-editor-lite\";\n\nimport { FieldHelperText } from \"../components\";\nimport { LabelWithIcon } from \"../../components\";\nimport { FieldProps } from \"../../types\";\nimport { getIconForProperty } from \"../../util\";\nimport {\n cn,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n Typography\n} from \"@firecms/ui\";\nimport { useInjectStyles } from \"@firecms/ui\";\n\nconst mdParser = new MarkdownIt();\ntry {\n MdEditor.use(Plugins.AutoResize, {\n min: 100\n })\n MdEditor.unuse(Plugins.FontUnderline)\n MdEditor.unuse(Plugins.Clear);\n} catch (e) {\n // this fails in some tests, we can ignore it\n}\n\n/**\n * Render a markdown field that allows edition and seeing the preview.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MarkdownFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n tableMode,\n includeDescription,\n context\n }: FieldProps<string>) {\n\n const [internalValue, setInternalValue] = React.useState(value);\n const valueRef = useRef(value);\n\n useInjectStyles(\"MarkdownFieldBinding\", markdownCss);\n\n const deferred = useDeferredValue({\n internalValue,\n value\n });\n\n useEffect(() => {\n valueRef.current = value;\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (deferred.internalValue !== valueRef.current)\n setValue(deferred.internalValue);\n }, [deferred]);\n\n return (\n <>\n\n {!tableMode && <Typography variant={\"caption\"}\n className={\"flex-grow\"}>\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n </Typography>}\n\n <MdEditor value={internalValue ?? \"\"}\n className={cn(fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n \"text-base\")}\n readOnly={disabled}\n renderHTML={text => mdParser.render(text)}\n view={{\n menu: true,\n md: true,\n html: false\n }}\n onChange={({\n html,\n text\n }) => {\n setInternalValue(text ?? null);\n }}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n\n}\n\nconst markdownCss = `\n @font-face {\n font-family: rmel-iconfont;\n src: url(data:application/vnd.ms-fontobject;base64,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NS4BJyMOAd0VGwEBGxWRFRsbFWEcFBQcYRUbGxWRFRsBARsCK2EVGxsVkRUbAQEbKRySARsVYRwpGwEBGxWRFRsBHwEbFZEVGwEBGykcYRUbwwEbFWEcKRsBARsVkRUb/qscKRsBARsVkRUbGxUBtRQcYRUbGxWRFRsBARsAAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQANABUAAQAAAAAAAgAHACIAAQAAAAAAAwANACkAAQAAAAAABAANADYAAQAAAAAABQALAEMAAQAAAAAABgANAE4AAQAAAAAACgArAFsAAQAAAAAACwATAIYAAwABBAkAAAAqAJkAAwABBAkAAQAaAMMAAwABBAkAAgAOAN0AAwABBAkAAwAaAOsAAwABBAkABAAaAQUAAwABBAkABQAWAR8AAwABBAkABgAaATUAAwABBAkACgBWAU8AAwABBAkACwAmAaUKQ3JlYXRlZCBieSBpY29uZm9udApybWVsLWljb25mb250UmVndWxhcnJtZWwtaWNvbmZvbnRybWVsLWljb25mb250VmVyc2lvbiAxLjBybWVsLWljb25mb250R2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20ACgBDAHIAZQBhAHQAZQBkACAAYgB5ACAAaQBjAG8AbgBmAG8AbgB0AAoAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABSAGUAZwB1AGwAYQByAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwADdGFiCGtleWJvYXJkBmRlbGV0ZQpjb2RlLWJsb2NrBGNvZGUKdmlzaWJpbGl0eQp2aWV3LXNwbGl0BGxpbmsEcmVkbwR1bmRvBGJvbGQGaXRhbGljDGxpc3Qtb3JkZXJlZA5saXN0LXVub3JkZXJlZAVxdW90ZQ1zdHJpa2V0aHJvdWdoCXVuZGVybGluZQR3cmFwCWZvbnQtc2l6ZQRncmlkBWltYWdlC2V4cGFuZC1sZXNzC2V4cGFuZC1tb3JlD2Z1bGxzY3JlZW4tZXhpdApmdWxsc2NyZWVuAAAAAAA=);\n src: url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzI940+UAAABfAAAAFZjbWFwQOSPXQAAAjwAAAMIZ2x5ZjCJoW0AAAV8AAAPYGhlYWQbUPpPAAAA4AAAADZoaGVhB94DmwAAALwAAAAkaG10eGgAAAAAAAHUAAAAaGxvY2E1+jIAAAAFRAAAADZtYXhwATAAewAAARgAAAAgbmFtZXPc7cIAABTcAAACqXBvc3QnKb+uAAAXiAAAATUAAQAAA4D/gABcBAAAAAAABAAAAQAAAAAAAAAAAAAAAAAAABoAAQAAAAEAAOLjgrdfDzz1AAsEAAAAAADcGNspAAAAANwY2ykAAP//BAADAQAAAAgAAgAAAAAAAAABAAAAGgBvAAwAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQQAAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA523togOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAFAAAAAwAAACwAAAAEAAABzAABAAAAAADGAAMAAQAAACwAAwAKAAABzAAEAJoAAAAWABAAAwAG523pQe087UXtYe117XjtgO2N7aL//wAA523pQe077UTtX+1v7XftgO2M7Z///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFgAWABYAGAAaAB4AKgAsACwALgAAAAEABAAFAAMABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAAIAFAAVABYAFwAYABkAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAATwAAAAAAAAAGQAA520AAOdtAAAAAQAA6UEAAOlBAAAABAAA7TsAAO07AAAABQAA7TwAAO08AAAAAwAA7UQAAO1EAAAABgAA7UUAAO1FAAAABwAA7V8AAO1fAAAACAAA7WAAAO1gAAAACQAA7WEAAO1hAAAACgAA7W8AAO1vAAAACwAA7XAAAO1wAAAADAAA7XEAAO1xAAAADQAA7XIAAO1yAAAADgAA7XMAAO1zAAAADwAA7XQAAO10AAAAEAAA7XUAAO11AAAAEQAA7XcAAO13AAAAEgAA7XgAAO14AAAAEwAA7YAAAO2AAAAAAgAA7YwAAO2MAAAAFAAA7Y0AAO2NAAAAFQAA7Z8AAO2fAAAAFgAA7aAAAO2gAAAAFwAA7aEAAO2hAAAAGAAA7aIAAO2iAAAAGQAAAAAAZgDMAR4BhAG8Af4CZgLIAv4DNANyA6IEQASoBO4FLgVwBcoGCgZqBqQGxAboB0YHsAAAAAUAAAAAA1YC1gALABgAJQA0AEAAABMhMhYUBgchLgE0Nhc+ATchHgEUBiMhIiYDNDY3IR4BFAYjISImNz4BMyEyHgEUDgEjISImJxYUDwEGJjURNDYX1gJUEhkZEv2sEhkZ2gEYEwFgEhkZEv6gEhn0GRICVBIZGRL9rBIZ8wEYEwFgDBQLCxQM/qASGTkICJILHh4LAtUZJRgBARglGfITGAEBGCUZGf6FExgBARglGRnZEhkLFRcUDBqGBhYGlQwMEQEqEQwMAAAAAAwAAAAAA6sCqwAPABMAFwAbAB8AIwAnADMANwA7AD8AQwAAASEOAQcDHgEXIT4BNxEuAQUzFSMVMxUjJzMVIxUzFSsCNTM1IzUzASEiJjQ2MyEyFhQGNyM1MzUjNTMXIzUzNSM1MwNV/VYkMAEBATEkAqokMQEBMf5cVlZWVoBWVlZWKlZWVlYBVf8AEhgYEgEAEhgYGVZWVlaAVlZWVgKrATEk/lYkMQEBMSQBqiQxf1YqVtZWKlZWKlb+gBgkGRkkGKpWKlbWVipWAAMAAAAAAysDAAAPAB8AMwAAJR4BFyE+ATcRLgEnIQ4BBzMhMhYXEQ4BByEuAScRPgElJyYrASIPASMiBhQWMyEyNjQmIwEAATAkAVYkMAEBMCT+qiQwAYABABMXAQEXE/8AExcBARcBKB4LErQSCx5rExcXEwIAERkZEVUkMAEBMCQBqyQwAQEwJBcU/qsRGQEBGREBVRQX1R4NDR4XJxcXJxcAAwAAAAADqwLZABYALQA+AAABFQYPAQYiLwEmND8BJyY0PwE2Mh8BFgU3NjQvASYiDwEGBxUWHwEWMj8BNjQnAScmBgcDBhYfARY2NxM2JicDqwEJsAcRBx4GBpOTBgYeBxEHsAn9D5MGBh8GEgawCQEBCbAHEQceBgYBQikJDwTjAgcIKAkPBOIDBwkBiBANCrAGBh4HEQaTkwYSBh4GBrAKFZMGEQceBgawCg0QDQqwBgYeBhIGAdkPAwcI/YwIEAMOAwcIAnMIDwQAAgAAAAADmgJvABAAIQAAJSc3NjQmIg8BBhQfARYyNjQlNycmNDYyHwEWFA8BBiImNAFzpqYNGSQMxA0NxA4hGgENpqYNGiEOxA0NxA4hGtqmpg4hGg3EDSINxA0aIQ6mpgwkGQ3EDSINxA0ZJAAAAAMAAAAAA7gCrAALABcAIwAAAQ4BBx4BFz4BNy4BAy4BJz4BNx4BFw4BAw4BBx4BFz4BNy4BAgCY6zU165iY6zU165hWcAICcFZWcAICcFY0QwEBQzQ0QwEBQwKsAqSGhqQCAqSGhqT+DgJwVlZwAgJwVlZwAT4BQzQ0QwEBQzQ0QwAAAAUAAAAAA4ACqwALABcAIwAwAEAAABMhMjY0JiMhIgYUFhchPgE0JichDgEUFhMhMjY0JiMhIgYUFiceARchPgE0JichDgElIR4BFxEOAQchLgE1ETQ2qwEAExcXE/8AERkZEQEAExcXE/8AERkZEQEAExcXE/8AERkZGgEZEQEAExcXE/8AERkB1AEAERkBARkR/wATFxcBABcnFxcnF6sBGSIZAQEZIhkBVRcnFxcnF9UTFwEBFyYXAQEXGAEXE/4AERkBARkRAgATFwAAAAADAAAAAAOrAlYAGQAmAEAAAAEjIgYUFjsBHgEXDgEHIyIGFBY7AT4BNy4BBR4BFyE+ATQmJyEOARcjLgEnPgE3MzI2NCYrAQ4BBx4BFzMyNjQmAtWAEhgYEoA3SAEBSDeAEhgYEoBbeAMDeP4lARgSAQASGBgS/wASGFWAN0gBAUg3gBIYGBKAW3gDA3hbgBIYGAJVGCQZAUk2NkkBGSQYAnhbW3jTEhgBARgkGAEBGJIBSTY2SQEZJBgCeFtbeAIYJBkAAQAAAAADrAIrAB4AAAEuAScOAQcGFhcWNjc+ATcyFhcHBhYXMz4BNzUuAQcDEjuWVYfUOAoTFxQjCSuhZz9vLFETEx7uEhgBAjEWAbw0OgECiXIXKggGDxJWaQErJVIWMQIBGBLvHRQTAAAAAQAAAAADsgIrAB4AAAEOAQcnJgYHFR4BFzM+AS8BPgEzHgEXHgE3PgEnLgECFFWWO1EWMQIBGBLuHhQTUi1vPmehKwkkExcTCjnTAisBOjRQFBQd7xIYAQIxFlIlKwFpVhIPBggqF3KJAAAAAwAAAAAC9QK/ABQAHAAkAAABPgE3LgEnIw4BBxEeARchPgE3NCYlMx4BFAYHIxMjNTMeARQGApMhKQECZk7vFBkBARkUAQdJaQI0/tSIHScnHYifn58dJycBihdEJE5mAgEaE/3eExoBAmFJNVLZASY7JgH+74kBJjsmAAEAAAAAAxICvwAcAAABHgEXMwMjDgEUFhczPgE0JicjEzM+ATQmJyMOAQGlASYdIZw7HSYmHeQdJiYdIZw7HSYmHeQdJgJ6HSYB/pQBJjonAQEnOiYBAWwBJjonAQEnAAYAAAAAA5YC1gALABcAIwBBAFIAbgAAASE+ATQmJyEOARQWASEOARQWFyE+ATQmAyEOARQWFyE+ATQmBSMiBhQWOwEVIyIGFBY7ARUjIgYUFjsBMjY3NS4BAzMVHgEyNj0BNCYrASIGFBYXIyIGFBY7AQcGHQEUFjsBMjY0JisBNzY9AS4BAWsCABIYGBL+ABIZGQIS/gASGRkSAgASGBgS/gASGRkSAgASGBj9WFUJDAwJQBUKCwsKFUAJDAwJVQoLAQELXxUBCxMMDAkrCQwMXlUJDAwJN0cFDAlVCgsLCjdIBQELAlUBGCQYAQEYJBj+VQEYJBgBARgkGAEBARgkGAEBGCQY1QwSDBYMEgwWDBIMDAmACQwB1msJDAwJgAkMDBIM1gwSDFQGCAkJDAwSDFQGCAkJDAAAAAAGAAAAAAOLAsAACAARABoAJgAyAD8AABMOARQWMjY0JgMOARQWMjY0JgMOARQWMjY0JhchPgE0JichDgEUFjchPgE0JichDgEUFgMeARchPgE0JichDgG1GyQkNyQkHBskJDckJBwbJCQ2JSSPAgASGBgS/gASGBgSAgASGBgS/gASGBgZARgSAgASGBgS/gASGAHAASQ2JCQ2JAEBASQ2JCQ2JP4BASQ2JCQ2JGoBGCQYAQEYJBj/ARgkGAEBGCQYASoSGAEBGCQYAQEYAAAAAgAAAAADVgJWABYALQAAJTI2PwE2PQEuASsBIgYdARQWFzMHBhYFMjY/ATY9ATQmKwEiBgcVHgEXMwcGFgEyERsHPQkBGBKrEhgYElYsDiABzBAbCDwJGBKrEhgBARgSVSwNIKsRDnkSFMISGBgSqxIYAVgeMwERDnkSFMISGBgSqxIYAVgeMwAAAAADAAAAAAOAAsAACAAZACUAACU+ATc1IxUeAQEeARczFTM1Mz4BNCYnIQ4BAyE+ATQmJyEOARQWAgAkMAGqATD++QEkG5aqlhskJBv+KhskKwKqEhkZEv1WEhkZQAEwJCsrJDACPxskAYCAASQ2JAEBJP56ARgkGAEBGCQYAAAAAAIAAP//AysDAQAbACgAACU+ATcRLgEiBgcRFAYHBi4CNREuASIGBxEeAQceATMhMjY0JiMhIgYCImJ6AgEeLR4BQTUhQTUdAR4tHgEDptQBGBICABIYGBL+ABIYrQ+TZQEXFh4eFv7kN1MMBw8rPCMBIBYeHhb+4HaUdhIZGSQYGAAAAAMAAAAAA3ACxwALAC0AOQAAEyE+ATQmIyEiBhQWBSEiBhQWFyEyFhcWBgcjNS4BDwEGFB8BFjY3NTM+AScuAQUjIgYUFhczPgE0JsACVRIZGRL9qxIYGAIL/gcSGBgSAgYgMwYFMShgARkLTAYGTAwYAVVNYgUIZP5tqxIYGBKrEhgYAnEBGCQYGCQYrBgkGAEnICk5AiIPCgpMBxEHTAoKDyICa05EVf8YJBgBARgkGAAAAAIAAAAAA5YCwAAUACgAAAEUFhczER4BMjY3ETM+ATQmJyEOAQMzFRQWMjY3NTMyNjQmJyEOARQWAWskHJUBJDYkAZUcJCQc/lYcJMBAJDckAUAbJCQb/wAcJCQCgBskAf5AGyQkGwHAASQ2JAEBJP7Q6xskJBvrJDckAQEkNyQACgAAAAADeAL4AA8AFgAaACEAJQApAC0ANAA4AD8AAAEhDgEHER4BFyE+ATcRLgEBIyImPQEzNSM1MzUjNTQ2OwETIzUzNSM1MzUjNTMTIzUzFRQGNyM1MzUjNTMyFhUDLP2oICoBASogAlggKgEBKv4ecQ8WlpaWlhYPceGWlpaWlpa8cZYWFpaWlnEPFgL3ASog/aggKgEBKiACWCAq/V4WD3FLlktxDxb9qJZLlkuW/aiWcQ8W4ZZLlhYPAAAAAgAA//8DgAMAAA8AIAAAJREuASchDgEHER4BFyE+ASUXNzYyHwEWBiMhIiY/AT4BA4ABMCT9qiQwAQEwJAJWJDD9/VmFBxQHlQgMDf4BDgsIagcUVQJWJDABATAk/aokMAEBMPtsqggJxwsXFwuJCAEAAAABAAAAAAM1AjYAEAAAAQcGFBYyPwEXFjI2NC8BJiIB2f4QISwR19cRLCEQ/hAuAib+ESwhENfXECEsEf4QAAAAAQAAAAADNQI2ABIAAAEHJyYnIg4BFh8BFjI/ATY0LgEC1tbXEBcRGw0GDP4RLBH+ECEtAibX1w8BEiAgDP4QEP4QLSABAAAABAAAAAADawLrABAAIQAzAEQAADczFRQWMjY9ATQmKwEiBhQWEyMiBhQWOwEyNj0BNCYiBhUBMjY9ATMyNjQmKwEiBh0BFBYTNTQmIgYdARQWOwEyNjQmI8loHiwdHRacFh0dfmgWHR0WnBYdHSweAWoWHmgWHR0WnBYdHUoeLB0dFpwWHR0WsWgWHR0WnBYdHSweAZ4eLB0dFpwWHR0W/V8dFmgeLB0dFpwWHQI5aBYdHRacFh0dLB4AAAAEAAAAAANUAtQAEQAjADQARgAAEw4BBxUeARczPgE0JisBNTQmJz4BPQEzMjY0JicjDgEHFR4BASMiBhQWFzM+ATc1LgEiBhUDHgE7ARUUFjI2NzUuAScjDgHdFRsBARsVkRUbGxVhHBQUHGEVGxsVkRUbAQEbAithFRsbFZEVGwEBGykckgEbFWEcKRsBARsVkRUbAR8BGxWRFRsBARspHGEVG8MBGxVhHCkbAQEbFZEVG/6rHCkbAQEbFZEVGxsVAbUUHGEVGxsVkRUbAQEbAAAAAAAAEgDeAAEAAAAAAAAAFQAAAAEAAAAAAAEADQAVAAEAAAAAAAIABwAiAAEAAAAAAAMADQApAAEAAAAAAAQADQA2AAEAAAAAAAUACwBDAAEAAAAAAAYADQBOAAEAAAAAAAoAKwBbAAEAAAAAAAsAEwCGAAMAAQQJAAAAKgCZAAMAAQQJAAEAGgDDAAMAAQQJAAIADgDdAAMAAQQJAAMAGgDrAAMAAQQJAAQAGgEFAAMAAQQJAAUAFgEfAAMAAQQJAAYAGgE1AAMAAQQJAAoAVgFPAAMAAQQJAAsAJgGlCkNyZWF0ZWQgYnkgaWNvbmZvbnQKcm1lbC1pY29uZm9udFJlZ3VsYXJybWVsLWljb25mb250cm1lbC1pY29uZm9udFZlcnNpb24gMS4wcm1lbC1pY29uZm9udEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAUgBlAGcAdQBsAGEAcgByAG0AZQBsAC0AaQBjAG8AbgBmAG8AbgB0AHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsAA3RhYghrZXlib2FyZAZkZWxldGUKY29kZS1ibG9jawRjb2RlCnZpc2liaWxpdHkKdmlldy1zcGxpdARsaW5rBHJlZG8EdW5kbwRib2xkBml0YWxpYwxsaXN0LW9yZGVyZWQObGlzdC11bm9yZGVyZWQFcXVvdGUNc3RyaWtldGhyb3VnaAl1bmRlcmxpbmUEd3JhcAlmb250LXNpemUEZ3JpZAVpbWFnZQtleHBhbmQtbGVzcwtleHBhbmQtbW9yZQ9mdWxsc2NyZWVuLWV4aXQKZnVsbHNjcmVlbgAAAAAA) format(\"truetype\")\n }\n\n .rmel-iconfont {\n font-family: rmel-iconfont !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale\n }\n\n .rmel-icon-tab:before {\n content: \"\\\\e76d\"\n }\n\n .rmel-icon-keyboard:before {\n content: \"\\\\ed80\"\n }\n\n .rmel-icon-delete:before {\n content: \"\\\\ed3c\"\n }\n\n .rmel-icon-code-block:before {\n content: \"\\\\e941\"\n }\n\n .rmel-icon-code:before {\n content: \"\\\\ed3b\"\n }\n\n .rmel-icon-visibility:before {\n content: \"\\\\ed44\"\n }\n\n .rmel-icon-view-split:before {\n content: \"\\\\ed45\"\n }\n\n .rmel-icon-link:before {\n content: \"\\\\ed5f\"\n }\n\n .rmel-icon-redo:before {\n content: \"\\\\ed60\"\n }\n\n .rmel-icon-undo:before {\n content: \"\\\\ed61\"\n }\n\n .rmel-icon-bold:before {\n content: \"\\\\ed6f\"\n }\n\n .rmel-icon-italic:before {\n content: \"\\\\ed70\"\n }\n\n .rmel-icon-list-ordered:before {\n content: \"\\\\ed71\"\n }\n\n .rmel-icon-list-unordered:before {\n content: \"\\\\ed72\"\n }\n\n .rmel-icon-quote:before {\n content: \"\\\\ed73\"\n }\n\n .rmel-icon-strikethrough:before {\n content: \"\\\\ed74\"\n }\n\n .rmel-icon-underline:before {\n content: \"\\\\ed75\"\n }\n\n .rmel-icon-wrap:before {\n content: \"\\\\ed77\"\n }\n\n .rmel-icon-font-size:before {\n content: \"\\\\ed78\"\n }\n\n .rmel-icon-grid:before {\n content: \"\\\\ed8c\"\n }\n\n .rmel-icon-image:before {\n content: \"\\\\ed8d\"\n }\n\n .rmel-icon-expand-less:before {\n content: \"\\\\ed9f\"\n }\n\n .rmel-icon-expand-more:before {\n content: \"\\\\eda0\"\n }\n\n .rmel-icon-fullscreen-exit:before {\n content: \"\\\\eda1\"\n }\n\n .rmel-icon-fullscreen:before {\n content: \"\\\\eda2\"\n }\n\n .rc-md-editor {\n padding-bottom: 1px;\n position: relative;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -webkit-flex-direction: column;\n -ms-flex-direction: column;\n flex-direction: column;\n border-radius: 6px;\n }\n\n .rc-md-editor.full {\n width: 100%;\n height: 100% !important;\n position: fixed;\n left: 0;\n top: 0;\n z-index: 1000\n }\n\n .rc-md-editor .editor-container {\n -webkit-box-flex: 1;\n -webkit-flex: 1;\n -ms-flex: 1;\n flex: 1;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n min-height: 0;\n position: relative;\n\n }\n\n .rc-md-editor .editor-container > .section {\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -webkit-flex-shrink: 1;\n -ms-flex-negative: 1;\n flex-shrink: 1;\n -webkit-flex-basis: 1px;\n -ms-flex-preferred-size: 1px;\n flex-basis: 1px;\n padding: 0px 8px;\n border: none\n }\n\n .rc-md-editor .editor-container > .section.in-visible {\n display: none\n }\n\n .rc-md-editor .editor-container > .section > .section-container {\n padding: 8x 16px 16px\n }\n\n .rc-md-editor .editor-container > .section:last-child {\n border-radius: unset\n }\n\n .rc-md-editor .editor-container .sec-md {\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n }\n\n .rc-md-editor .editor-container .sec-md .input {\n background: transparent;\n font-size: 1rem;\n display: block;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow-y: scroll;\n border: none;\n resize: none;\n outline: none;\n min-height: 0;\n color: inherit;\n line-height: 1.7;\n\n }\n\n .rc-md-editor .editor-container .sec-html {\n min-height: 0;\n min-width: 0;\n\n }\n\n .rc-md-editor .editor-container .sec-html .html-wrap {\n height: 100%;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n overflow: auto\n }\n\n .custom-html-style {\n color: inherit\n }\n\n .custom-html-style h1 {\n font-size: 32px;\n padding: 0;\n border: none;\n font-weight: 700;\n margin: 32px 0;\n line-height: 1.2\n }\n\n .custom-html-style h2 {\n font-size: 24px;\n padding: 0;\n border: none;\n font-weight: 700;\n margin: 24px 0;\n line-height: 1.7\n }\n\n .custom-html-style h3 {\n font-size: 18px;\n margin: 18px 0;\n padding: 0;\n line-height: 1.7;\n border: none\n }\n\n .custom-html-style p {\n font-size: 16px;\n line-height: 1.7;\n margin: 8px 0\n }\n\n .custom-html-style a {\n }\n\n .custom-html-style a:hover {\n text-decoration: none\n }\n\n .custom-html-style strong {\n font-weight: 700\n }\n\n .custom-html-style ol, .custom-html-style ul {\n font-size: 16px;\n line-height: 28px;\n padding-left: 36px\n }\n\n .custom-html-style li {\n margin-bottom: 8px;\n line-height: 1.7\n }\n\n .custom-html-style hr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n }\n\n .custom-html-style pre {\n display: block;\n padding: 20px;\n line-height: 28px;\n word-break: break-word\n }\n\n .custom-html-style code, .custom-html-style pre {\n font-size: 16px;\n border-radius: 0;\n overflow-x: auto\n }\n\n .custom-html-style code {\n padding: 3px 0;\n margin: 0;\n word-break: normal\n }\n\n .custom-html-style code:after, .custom-html-style code:before {\n letter-spacing: 0\n }\n\n .custom-html-style blockquote {\n position: relative;\n margin: 16px 0;\n padding: 5px 8px 5px 30px;\n background: none repeat scroll 0 0 ${\"rgb(39 39 41)\"};\n color: inherit;\n border: none;\n border-left: 10px solid #d6dbdf\n }\n\n .custom-html-style img, .custom-html-style video {\n max-width: 100%\n }\n\n .custom-html-style table {\n font-size: 16px;\n line-height: 1.7;\n max-width: 100%;\n overflow: auto;\n\n border-collapse: collapse;\n border-spacing: 0;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .custom-html-style table td, .custom-html-style table th {\n word-break: break-all;\n word-wrap: break-word;\n white-space: normal\n }\n\n .custom-html-style table tr {\n }\n\n .custom-html-style table tr:nth-of-type(2n) {\n background-color: transparent\n }\n\n .custom-html-style table th {\n text-align: center;\n font-weight: 700;\n\n padding: 10px 6px;\n background-color: #f5f7fa;\n word-break: break-word\n }\n\n .custom-html-style table td {\n\n text-align: left;\n padding: 10px 15px;\n word-break: break-word;\n min-width: 60px\n }\n\n .rc-md-editor .drop-wrap {\n display: block;\n position: absolute;\n left: 0;\n top: 28px;\n z-index: 2;\n min-width: 20px;\n padding: 10px 0;\n text-align: center;\n border-style: solid;\n border-width: 1px\n }\n\n .rc-md-editor .drop-wrap.hidden {\n display: none !important\n }\n\n .rc-md-editor .rc-md-navigation {\n min-height: 38px;\n padding: 0 8px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n font-size: 16px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n flex-direction: row;\n -webkit-box-pack: justify;\n -webkit-justify-content: space-between;\n -ms-flex-pack: justify;\n justify-content: space-between;\n color: \"inherit\",\n\n }\n\n .rc-md-editor .rc-md-navigation.in-visible {\n display: none\n }\n\n .rc-md-editor .rc-md-navigation .navigation-nav {\n -webkit-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n font-size: 16px;\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap, .rc-md-editor .rc-md-navigation .navigation-nav {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n flex-direction: row\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap {\n -webkit-flex-wrap: wrap;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button {\n position: relative;\n min-width: 22px;\n height: 28px;\n margin-left: 3px;\n margin-right: -2px;\n display: inline-block;\n cursor: pointer;\n line-height: 28px;\n text-align: center;\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:hover {\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button.disabled {\n cursor: not-allowed\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:first-of-type {\n margin-left: 0\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:last-child {\n margin-right: 0\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .rmel-iconfont {\n font-size: 18px\n }\n\n .rc-md-editor .rc-md-navigation li, .rc-md-editor .rc-md-navigation ul {\n list-style: none;\n margin: 0;\n padding: 0\n }\n\n .rc-md-editor .rc-md-navigation .h1, .rc-md-editor .rc-md-navigation .h2, .rc-md-editor .rc-md-navigation .h3, .rc-md-editor .rc-md-navigation .h4, .rc-md-editor .rc-md-navigation .h5, .rc-md-editor .rc-md-navigation .h6, .rc-md-editor .rc-md-navigation h1, .rc-md-editor .rc-md-navigation h2, .rc-md-editor .rc-md-navigation h3, .rc-md-editor .rc-md-navigation h4, .rc-md-editor .rc-md-navigation h5, .rc-md-editor .rc-md-navigation h6 {\n font-family: inherit;\n font-weight: 500;\n color: inherit;\n padding: 0;\n margin: 0;\n line-height: 1.1\n }\n\n .rc-md-editor .rc-md-navigation h1 {\n font-size: 34px\n }\n\n .rc-md-editor .rc-md-navigation h2 {\n font-size: 30px\n }\n\n .rc-md-editor .rc-md-navigation h3 {\n font-size: 24px\n }\n\n .rc-md-editor .rc-md-navigation h4 {\n font-size: 18px\n }\n\n .rc-md-editor .rc-md-navigation h5 {\n font-size: 16px\n }\n\n .rc-md-editor .rc-md-navigation h6 {\n font-size: 12px\n }\n\n .rc-md-editor .tool-bar {\n position: absolute;\n z-index: 1;\n right: 8px;\n top: 8px\n }\n\n .rc-md-editor .tool-bar .button {\n min-width: 24px;\n height: 28px;\n margin-right: 5px;\n display: inline-block;\n cursor: pointer;\n font-size: 16px;\n line-height: 28px;\n text-align: center;\n color: #999\n }\n\n .rc-md-editor .tool-bar .button:hover {\n color: inherit\n }\n\n .rc-md-editor .rc-md-gray-100 {\n display: block;\n width: 1px;\n }\n\n .rc-md-editor .table-list.wrap {\n position: relative;\n margin: 0 10px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .rc-md-editor .table-list.wrap .list-item {\n position: absolute;\n top: 0;\n left: 0;\n display: inline-block;\n width: 20px;\n height: 20px;\n border-radius: 4px\n }\n\n .rc-md-editor .table-list.wrap .list-item.active {\n }\n\n .rc-md-editor .tab-map-list .list-item {\n width: 120px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .rc-md-editor .tab-map-list .list-item:hover {\n }\n\n .rc-md-editor .tab-map-list .list-item.active {\n font-weight: 700\n }\n\n .rc-md-editor .header-list .list-item {\n width: 100px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n padding: 8px 0\n }\n\n .rc-md-editor .header-list .list-item:hover {\n }\n\n`;\n","import React from \"react\";\nimport { FieldProps } from \"../../types\";\nimport { FieldHelperText } from \"../components\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { useClearRestoreValue, useFireCMSContext } from \"../../hooks\";\nimport { ExpandablePanel } from \"@firecms/ui\";\nimport { getIconForProperty } from \"../../util\";\nimport { LabelWithIcon } from \"../../components\";\n\n/**\n * Array field used for custom\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayCustomShapedFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T, any, any>) {\n\n const { propertyConfigs } = useFireCMSContext();\n if (!Array.isArray(property.resolvedProperties))\n throw Error(\"ArrayCustomShapedFieldBinding misconfiguration. Property `of` not set\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const title = <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}\n title={property.name}/>;\n\n const body = property.resolvedProperties.map((childProperty, index) => {\n const fieldProps = {\n propertyKey: `${propertyKey}[${index}]`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: true,\n partOfBlock: false,\n autoFocus: false\n };\n return <div key={`custom_shaped_array_${index}`} className=\"pb-4\">\n <PropertyFieldBinding {...fieldProps}/>\n </div>;\n });\n\n return (\n\n <>\n\n {!tableMode &&\n <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { useFormikContext } from \"formik\";\n\nexport const ErrorFocus = ({ containerRef }:\n {\n containerRef?: React.RefObject<HTMLDivElement>\n }) => {\n const { isSubmitting, isValidating, errors } = useFormikContext();\n\n useEffect(() => {\n const keys = Object.keys(errors);\n\n // Whenever there are errors and the form is submitting but finished validating.\n if (keys.length > 0 && isSubmitting && !isValidating) {\n const errorElement = containerRef?.current?.querySelector<HTMLDivElement>(\n `#form_field_${keys[0]}`\n );\n\n if (errorElement && containerRef?.current) {\n const scrollableParent = getScrollableParent(containerRef.current);\n if (scrollableParent) {\n const top = errorElement.getBoundingClientRect().top;\n scrollableParent.scrollTo({\n top: scrollableParent.scrollTop + top - 64,\n behavior: \"smooth\"\n });\n }\n const input = errorElement.querySelector(\"input\");\n if (input) input.focus();\n }\n }\n }, [isSubmitting, isValidating, errors, containerRef]);\n\n // This component does not render anything by itself.\n return null;\n};\n\nconst isScrollable = (ele: HTMLElement | null) => {\n const hasScrollableContent = ele && ele.scrollHeight > ele.clientHeight;\n\n const overflowYStyle = ele ? window.getComputedStyle(ele).overflowY : null;\n const isOverflowHidden = overflowYStyle && overflowYStyle.indexOf(\"hidden\") !== -1;\n\n return hasScrollableContent && !isOverflowHidden;\n};\n\nconst getScrollableParent = (ele: HTMLElement | null): HTMLElement | null => {\n return (!ele || ele === document.body)\n ? document.body\n : (isScrollable(ele) ? ele : getScrollableParent(ele.parentNode as HTMLElement));\n};\n","import React, { useMemo } from \"react\";\n\nimport { ErrorMessage } from \"formik\";\n\nimport { Entity, EntityStatus, EnumValueConfig, EnumValues, FireCMSContext } from \"../../types\";\n\nimport { useClipboard, useFireCMSContext, useSnackbarController } from \"../../hooks\";\nimport { enumToObjectEntries } from \"../../util\";\nimport { ContentCopyIcon, IconButton, OpenInNewIcon, Select, SelectItem, TextField, Tooltip } from \"@firecms/ui\";\nimport { EnumValuesChip } from \"../../preview\";\n\nexport function CustomIdField<M extends Record<string, any>>({\n customId,\n entityId,\n status,\n onChange,\n error,\n entity\n }: {\n customId?: boolean | EnumValues | \"optional\"\n entityId?: string\n status: EntityStatus,\n onChange: (id?: string) => void,\n error: boolean,\n entity: Entity<M> | undefined\n}) {\n\n const disabled = status === \"existing\" || !customId;\n const idSetAutomatically = status !== \"existing\" && !customId;\n\n const enumValues: EnumValueConfig[] | undefined = useMemo(() => {\n if (!customId || typeof customId === \"boolean\" || customId === \"optional\")\n return undefined;\n return enumToObjectEntries(customId);\n }, [customId]);\n\n const snackbarController = useSnackbarController();\n const { copy } = useClipboard({\n onSuccess: (text) => snackbarController.open({\n type: \"success\",\n message: `Copied ${text}`\n })\n });\n\n const appConfig: FireCMSContext | undefined = useFireCMSContext();\n\n const fieldProps = {\n label: idSetAutomatically ? \"ID is set automatically\" : \"ID\",\n disabled,\n name: \"id\",\n value: (entity && status === \"existing\" ? entity.id : entityId) ?? \"\",\n endAdornment: entity\n ? (\n <>\n\n <Tooltip title={\"Copy\"}>\n <IconButton onClick={(e) => copy(entity.id)}\n aria-label=\"copy-id\">\n <ContentCopyIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n\n {appConfig?.entityLinkBuilder &&\n <Tooltip title={\"Open in the console\"}>\n <IconButton component={\"a\"}\n href={appConfig.entityLinkBuilder({ entity })}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n onClick={(e) => e.stopPropagation()}\n aria-label=\"go-to-datasource\">\n <OpenInNewIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n </>\n )\n : undefined\n\n };\n\n return (\n <>\n\n {enumValues &&\n <Select\n error={error}\n onValueChange={(v) => onChange(v as string)}\n {...fieldProps}\n renderValue={(option) => {\n const enumConfig = enumValues.find(e => e.id === option);\n if (!enumConfig) return option;\n return `${enumConfig.id} - ${enumConfig.label}`;\n }}\n >\n {enumValues.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={\"medium\"}/>\n </SelectItem>)\n )}\n </Select>}\n\n {!enumValues &&\n <TextField {...fieldProps}\n error={error}\n placeholder={customId === \"optional\" ? \"Autogenerated ID, it can be manually changed\" : (status === \"new\" || status === \"copy\" ? \"ID of the new document\" : \"ID of the document\")}\n onChange={(event) => {\n let value = event.target.value;\n if (value) value = value.trim();\n return onChange(value.length ? value : undefined);\n }}/>}\n\n <ErrorMessage name={\"id\"}\n component=\"div\">\n {(_) => \"You need to specify an ID\"}\n </ErrorMessage>\n\n </>\n );\n}\n","import { EntityAction } from \"../../../types\";\nimport { DeleteEntityDialog } from \"./DeleteEntityDialog\";\nimport { ArchiveIcon, DeleteIcon, FileCopyIcon, KeyboardTabIcon, OpenInNewIcon } from \"@firecms/ui\";\n\nexport const editEntityAction: EntityAction = {\n icon: <KeyboardTabIcon/>,\n name: \"Edit\",\n collapsed: false,\n onClick({\n entity,\n collection,\n context,\n highlightEntity,\n unhighlightEntity\n }): Promise<void> {\n highlightEntity?.(entity);\n context.onAnalyticsEvent?.(\"entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n context.sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n collection,\n updateUrl: true,\n onClose: () => unhighlightEntity?.(entity)\n });\n return Promise.resolve(undefined);\n }\n}\n\nexport const copyEntityAction: EntityAction = {\n icon: <FileCopyIcon/>,\n name: \"Copy\",\n onClick({\n entity,\n collection,\n context,\n highlightEntity,\n unhighlightEntity\n }): Promise<void> {\n highlightEntity?.(entity);\n context.onAnalyticsEvent?.(\"copy_entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n context.sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n copy: true,\n collection,\n updateUrl: true,\n onClose: () => unhighlightEntity?.(entity)\n });\n return Promise.resolve(undefined);\n }\n}\nexport const archiveEntityAction: EntityAction = {\n icon: <ArchiveIcon/>,\n name: \"Archive\",\n onClick({\n entity,\n collection,\n context: {\n dataSource,\n }\n }): Promise<void> {\n // Add your code here\n return Promise.resolve(undefined);\n }\n}\nexport const openWebsiteAction: EntityAction = {\n icon: <OpenInNewIcon/>,\n name: \"See in website\",\n onClick({\n entity,\n collection,\n context,\n }): Promise<void> {\n // open a new tab\n window.open(`https://example.com/${entity.id}`, \"_blank\");\n return Promise.resolve(undefined);\n }\n}\n\nexport const deleteEntityAction: EntityAction = {\n icon: <DeleteIcon/>,\n name: \"Delete\",\n onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n onCollectionChange,\n sideEntityController\n }): Promise<void> {\n const { closeDialog } = context.dialogsController.open({\n key: \"delete_entity_dialog_\" + entity.id,\n Component: ({ open }) => {\n if (!collection || !fullPath)\n throw new Error(\"deleteEntityAction: Collection is undefined\");\n return <DeleteEntityDialog\n entityOrEntitiesToDelete={entity}\n path={fullPath}\n collection={collection}\n callbacks={collection.callbacks}\n open={open}\n onEntityDelete={() => {\n context.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path: fullPath\n });\n selectionController?.setSelectedEntities(selectionController.selectedEntities.filter(e => e.id !== entity.id));\n onCollectionChange?.();\n sideEntityController?.close();\n }}\n onClose={closeDialog}/>;\n }\n })\n return Promise.resolve(undefined);\n }\n}\n","import React, { MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n CMSAnalyticsEvent,\n Entity,\n EntityAction,\n EntityCollection,\n EntityStatus,\n EntityValues,\n FormContext,\n PluginFormActionProps,\n PropertyFieldBindingProps,\n ResolvedEntityCollection\n} from \"../types\";\nimport { Form, Formik, FormikHelpers, FormikProps } from \"formik\";\nimport { PropertyFieldBinding } from \"./PropertyFieldBinding\";\nimport { CustomFieldValidator, getYupEntitySchema } from \"./validation\";\nimport equal from \"react-fast-compare\"\nimport {\n canCreateEntity,\n canDeleteEntity,\n fullPathToCollectionSegments,\n getDefaultValuesFor,\n isHidden,\n isReadOnly,\n resolveCollection\n} from \"../util\";\nimport { useAuthController, useDataSource, useFireCMSContext, useSideEntityController } from \"../hooks\";\nimport { ErrorFocus } from \"./components/ErrorFocus\";\nimport { CustomIdField } from \"./components/CustomIdField\";\nimport { Button, cn, DialogActions, IconButton, Typography } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../components\";\nimport {\n copyEntityAction,\n deleteEntityAction\n} from \"../components/EntityCollectionTable/internal/default_entity_actions\";\n\n/**\n * @group Components\n */\nexport interface EntityFormProps<M extends Record<string, any>> {\n\n /**\n * New or existing status\n */\n status: EntityStatus;\n\n /**\n * Path of the collection this entity is located\n */\n path: string;\n\n /**\n * The collection is used to build the fields of the form\n */\n collection: EntityCollection<M>\n\n /**\n * The updated entity is passed from the parent component when the underlying data\n * has changed in the datasource\n */\n entity?: Entity<M>;\n\n /**\n * The callback function called when Save is clicked and validation is correct\n */\n onEntitySaveRequested: (\n props: EntityFormSaveParams<M>\n ) => Promise<void>;\n\n /**\n * The callback function called when discard is clicked\n */\n onDiscard?: () => void;\n\n /**\n * The callback function when the form is dirty, so the values are different\n * from the original ones\n */\n onModified?: (dirty: boolean) => void;\n\n /**\n * The callback function when the form original values have been modified\n */\n onValuesChanged?: (values?: EntityValues<M>) => void;\n\n /**\n *\n * @param id\n */\n onIdChange?: (id: string) => void;\n\n currentEntityId?: string;\n\n onFormContextChange?: (formContext: FormContext<M>) => void;\n\n hideId?: boolean;\n\n autoSave?: boolean;\n\n onIdUpdateError?: (error: any) => void;\n\n}\n\nexport type EntityFormSaveParams<M extends Record<string, any>> = {\n collection: ResolvedEntityCollection<M>,\n path: string,\n entityId: string | undefined,\n values: EntityValues<M>,\n previousValues?: EntityValues<M>,\n closeAfterSave: boolean,\n autoSave: boolean\n};\n\n/**\n * This is the form used internally by the CMS\n * @param status\n * @param path\n * @param collection\n * @param entity\n * @param onEntitySave\n * @param onDiscard\n * @param onModified\n * @param onValuesChanged\n * @constructor\n * @group Components\n */\nexport const EntityForm = React.memo<EntityFormProps<any>>(EntityFormInternal,\n (a: EntityFormProps<any>, b: EntityFormProps<any>) => {\n return a.status === b.status &&\n a.path === b.path &&\n equal(a.entity?.values, b.entity?.values);\n }) as typeof EntityFormInternal;\n\nfunction EntityFormInternal<M extends Record<string, any>>({\n status,\n path,\n collection: inputCollection,\n entity,\n onEntitySaveRequested,\n onDiscard,\n onModified,\n onValuesChanged,\n onIdChange,\n onFormContextChange,\n hideId,\n autoSave,\n onIdUpdateError\n }: EntityFormProps<M>) {\n\n const context = useFireCMSContext();\n const dataSource = useDataSource();\n const plugins = context.plugins;\n\n const initialResolvedCollection = useMemo(() => resolveCollection({\n collection: inputCollection,\n path,\n values: entity?.values,\n fields: context.propertyConfigs\n }), [entity?.values, path]);\n\n const mustSetCustomId: boolean = (status === \"new\" || status === \"copy\") &&\n (Boolean(initialResolvedCollection.customId) && initialResolvedCollection.customId !== \"optional\");\n\n const initialEntityId = useMemo(() => {\n if (status === \"new\" || status === \"copy\") {\n if (mustSetCustomId) {\n return undefined;\n } else {\n return dataSource.generateEntityId(path);\n }\n } else {\n return entity?.id;\n }\n }, []);\n\n const closeAfterSaveRef = useRef(false);\n\n const baseDataSourceValues: Partial<EntityValues<M>> = useMemo(() => {\n const properties = initialResolvedCollection.properties;\n if ((status === \"existing\" || status === \"copy\") && entity) {\n return entity.values ?? getDefaultValuesFor(properties);\n } else if (status === \"new\") {\n return getDefaultValuesFor(properties);\n } else {\n console.error({\n status,\n entity\n });\n throw new Error(\"Form has not been initialised with the correct parameters\");\n }\n }, [status, initialResolvedCollection, entity]);\n\n const [entityId, setEntityId] = React.useState<string | undefined>(initialEntityId);\n const [entityIdError, setEntityIdError] = React.useState<boolean>(false);\n const [savingError, setSavingError] = React.useState<Error | undefined>();\n\n const initialValuesRef = useRef<EntityValues<M>>(entity?.values ?? baseDataSourceValues as EntityValues<M>);\n const initialValues = initialValuesRef.current;\n const [internalValues, setInternalValues] = useState<EntityValues<M> | undefined>(initialValues);\n\n const doOnValuesChanges = (values?: EntityValues<M>) => {\n setInternalValues(values);\n if (onValuesChanged)\n onValuesChanged(values);\n if (autoSave && values && !equal(values, initialValues)) {\n save(values);\n }\n };\n\n useEffect(() => {\n if (entityId && onIdChange)\n onIdChange(entityId);\n }, [entityId, onIdChange]);\n\n const resolvedCollection = resolveCollection<M>({\n collection: inputCollection,\n path,\n entityId,\n values: internalValues,\n previousValues: initialValues,\n fields: context.propertyConfigs\n });\n\n const onIdUpdate = inputCollection.callbacks?.onIdUpdate;\n useEffect(() => {\n if (onIdUpdate && internalValues && (status === \"new\" || status === \"copy\")) {\n try {\n const updatedId = onIdUpdate({\n collection: resolvedCollection,\n path,\n entityId,\n values: internalValues,\n context\n });\n setEntityId(updatedId);\n } catch (e) {\n onIdUpdateError && onIdUpdateError(e);\n console.error(e);\n }\n }\n }, [entityId, internalValues, status]);\n\n const underlyingChanges: Partial<EntityValues<M>> = useMemo(() => {\n if (initialValues && status === \"existing\") {\n return Object.entries(resolvedCollection.properties)\n .map(([key, property]) => {\n if (isHidden(property)) {\n return {};\n }\n const initialValue = initialValues[key];\n const latestValue = baseDataSourceValues[key];\n if (!equal(initialValue, latestValue)) {\n return { [key]: latestValue };\n }\n return {};\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as Partial<EntityValues<M>>;\n } else {\n return {};\n }\n }, [baseDataSourceValues, resolvedCollection.properties, initialValues, status]);\n\n const save = (values: EntityValues<M>) => {\n return onEntitySaveRequested({\n collection: resolvedCollection,\n path,\n entityId,\n values,\n previousValues: entity?.values,\n closeAfterSave: closeAfterSaveRef.current,\n autoSave: autoSave ?? false\n }).then(_ => {\n const eventName: CMSAnalyticsEvent = status === \"new\"\n ? \"new_entity_saved\"\n : (status === \"copy\" ? \"entity_copied\" : (status === \"existing\" ? \"entity_edited\" : \"unmapped_event\"));\n context.onAnalyticsEvent?.(eventName, { path });\n initialValuesRef.current = values;\n })\n .catch(e => {\n console.error(e);\n setSavingError(e);\n })\n .finally(() => {\n closeAfterSaveRef.current = false;\n });\n };\n\n const saveFormValues = (values: EntityValues<M>, formikActions: FormikHelpers<EntityValues<M>>) => {\n\n if (mustSetCustomId && !entityId) {\n console.error(\"Missing custom Id\");\n setEntityIdError(true);\n formikActions.setSubmitting(false);\n return;\n }\n\n setSavingError(undefined);\n setEntityIdError(false);\n\n if (status === \"existing\") {\n if (!entity?.id) throw Error(\"Form misconfiguration when saving, no id for existing entity\");\n } else if (status === \"new\" || status === \"copy\") {\n if (inputCollection.customId) {\n if (inputCollection.customId !== \"optional\" && !entityId) {\n throw Error(\"Form misconfiguration when saving, entityId should be set\");\n }\n }\n } else {\n throw Error(\"New FormType added, check EntityForm\");\n }\n\n save(values)\n ?.then(_ => {\n formikActions.resetForm({\n values,\n submitCount: 0,\n touched: {}\n });\n })\n .finally(() => {\n formikActions.setSubmitting(false);\n });\n\n };\n\n const uniqueFieldValidator: CustomFieldValidator = useCallback(({\n name,\n value,\n property\n }) => dataSource.checkUniqueField(path, name, value, entityId),\n [dataSource, path, entityId]);\n\n const validationSchema = useMemo(() => entityId\n ? getYupEntitySchema(\n entityId,\n resolvedCollection.properties,\n uniqueFieldValidator)\n : undefined,\n [entityId, resolvedCollection.properties, uniqueFieldValidator]);\n\n const authController = useAuthController();\n\n const getActionsForEntity = useCallback(({ entity, customEntityActions }: { entity?: Entity<M>, customEntityActions?: EntityAction[] }): EntityAction[] => {\n const createEnabled = canCreateEntity(inputCollection, authController, fullPathToCollectionSegments(path), null);\n const deleteEnabled = entity ? canDeleteEntity(inputCollection, authController, fullPathToCollectionSegments(path), entity) : true;\n const actions: EntityAction[] = [];\n if (createEnabled)\n actions.push(copyEntityAction);\n if (deleteEnabled)\n actions.push(deleteEntityAction);\n if (customEntityActions)\n actions.push(...customEntityActions);\n return actions;\n }, [authController, inputCollection, path]);\n\n return (\n <Formik\n initialValues={baseDataSourceValues as M}\n onSubmit={saveFormValues}\n validationSchema={validationSchema}\n validate={(values) => console.debug(\"Validating\", values)}\n onReset={() => onDiscard && onDiscard()}\n >\n {(props) => {\n\n const pluginActions: React.ReactNode[] = [];\n\n const formContext: FormContext<M> = {\n setFieldValue: props.setFieldValue,\n values: props.values,\n collection: resolvedCollection,\n entityId,\n path,\n save\n };\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n if (onFormContextChange) {\n onFormContextChange(formContext);\n }\n }, [onFormContextChange, formContext]);\n\n if (plugins && inputCollection) {\n const actionProps: PluginFormActionProps = {\n entityId,\n path,\n status,\n collection: inputCollection,\n context,\n currentEntityId: entityId,\n formContext\n };\n pluginActions.push(...plugins.map((plugin, i) => (\n plugin.form?.Actions\n ? <plugin.form.Actions\n key={`actions_${plugin.name}`} {...actionProps}/>\n : null\n )).filter(Boolean));\n }\n\n return <div\n className=\"h-full overflow-auto\"\n >\n\n {pluginActions.length > 0 && <div\n className={cn(\"w-full flex justify-end items-center sticky top-0 right-0 left-0 z-10 bg-opacity-60 bg-slate-200 dark:bg-opacity-60 dark:bg-slate-800 backdrop-blur-md\")}>\n {pluginActions}\n </div>}\n\n <div\n className=\"pl-4 pr-4 pt-12 pb-16 md:pl-8\"\n >\n <div\n className={`w-full py-2 flex items-center mt-${4 + (pluginActions ? 8 : 0)} lg:mt-${8 + (pluginActions ? 8 : 0)} mb-8`}>\n\n <Typography\n className={\"mt-4 flex-grow \" + inputCollection.hideIdFromForm ? \"mb-2\" : \"mb-0\"}\n variant={\"h4\"}>{inputCollection.singularName ?? inputCollection.name}\n </Typography>\n </div>\n\n {!hideId &&\n <CustomIdField customId={inputCollection.customId}\n entityId={entityId}\n status={status}\n onChange={setEntityId}\n error={entityIdError}\n entity={entity}/>}\n\n {entityId && <InnerForm\n {...props}\n initialValues={initialValues}\n onModified={onModified}\n onValuesChanged={doOnValuesChanges}\n underlyingChanges={underlyingChanges}\n entity={entity}\n resolvedCollection={resolvedCollection}\n formContext={formContext}\n status={status}\n savingError={savingError}\n closeAfterSaveRef={closeAfterSaveRef}\n autoSave={autoSave}\n entityActions={getActionsForEntity({ entity, customEntityActions: inputCollection.entityActions })}/>}\n\n </div>\n </div>\n }}\n </Formik>\n );\n}\n\nfunction InnerForm<M extends Record<string, any>>(props: FormikProps<M> & {\n onModified: ((modified: boolean) => void) | undefined,\n onValuesChanged?: (changedValues?: EntityValues<M>) => void,\n underlyingChanges: Partial<M>,\n entity: Entity<M> | undefined,\n resolvedCollection: ResolvedEntityCollection<M>,\n formContext: FormContext<M>,\n status: \"new\" | \"existing\" | \"copy\",\n savingError?: Error,\n closeAfterSaveRef: MutableRefObject<boolean>,\n autoSave?: boolean,\n entityActions: EntityAction[]\n}) {\n\n const {\n values,\n onModified,\n onValuesChanged,\n underlyingChanges,\n formContext,\n entity,\n touched,\n setFieldValue,\n resolvedCollection,\n isSubmitting,\n status,\n handleSubmit,\n savingError,\n dirty,\n closeAfterSaveRef,\n autoSave,\n entityActions\n } = props;\n\n const context = useFireCMSContext();\n const formActions = entityActions.filter(a => a.includeInForm === undefined || a.includeInForm);\n const sideEntityController = useSideEntityController();\n\n const modified = dirty;\n useEffect(() => {\n if (onModified)\n onModified(modified);\n if (onValuesChanged)\n onValuesChanged(values);\n }, [modified, values]);\n\n useEffect(() => {\n if (!autoSave && underlyingChanges && entity) {\n // we update the form fields from the Firestore data\n // if they were not touched\n Object.entries(underlyingChanges).forEach(([key, value]) => {\n const formValue = values[key];\n if (!equal(value, formValue) && !touched[key]) {\n console.debug(\"Updated value from the datasource:\", key, value);\n setFieldValue(key, value !== undefined ? value : null);\n }\n });\n }\n }, [autoSave, underlyingChanges, entity, values, touched, setFieldValue]);\n\n const formFields = (\n <div className={\"flex flex-col gap-8\"}>\n {(resolvedCollection.propertiesOrder ?? Object.keys(resolvedCollection.properties))\n .map((key) => {\n\n const property = resolvedCollection.properties[key];\n if (!property) {\n console.warn(`Property ${key} not found in collection ${resolvedCollection.name}`);\n return null;\n }\n\n const underlyingValueHasChanged: boolean =\n !!underlyingChanges &&\n Object.keys(underlyingChanges).includes(key) &&\n !!touched[key];\n\n const disabled = (!autoSave && isSubmitting) || isReadOnly(property) || Boolean(property.disabled);\n const hidden = isHidden(property);\n if (hidden) return null;\n const cmsFormFieldProps: PropertyFieldBindingProps<any, M> = {\n propertyKey: key,\n disabled,\n property,\n includeDescription: property.description || property.longDescription,\n underlyingValueHasChanged: underlyingValueHasChanged && !autoSave,\n context: formContext,\n tableMode: false,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: false\n };\n\n return (\n <div id={`form_field_${key}`}\n key={`field_${resolvedCollection.name}_${key}`}>\n <ErrorBoundary>\n <PropertyFieldBinding {...cmsFormFieldProps}/>\n </ErrorBoundary>\n </div>\n );\n })\n .filter(Boolean)}\n\n </div>\n );\n\n const disabled = isSubmitting || (!modified && status === \"existing\");\n const formRef = React.useRef<HTMLDivElement>(null);\n\n return (\n\n <Form onSubmit={handleSubmit}\n noValidate>\n <div className=\"mt-12\"\n ref={formRef}>\n\n {formFields}\n\n <ErrorFocus containerRef={formRef}/>\n\n </div>\n\n <div className=\"h-14\"/>\n\n {!autoSave && <DialogActions position={\"absolute\"}>\n\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>\n {savingError.message}\n </Typography>\n </div>}\n\n {entity && formActions.length > 0 && <div className=\"flex-grow flex overflow-auto no-scrollbar\">\n {formActions.map(action => (\n <IconButton\n key={action.name}\n color=\"primary\"\n onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.stopPropagation();\n if (entity)\n action.onClick({\n entity,\n fullPath: resolvedCollection.path,\n collection: resolvedCollection,\n context,\n sideEntityController\n });\n }}>\n {action.icon}\n </IconButton>\n ))}\n </div>}\n\n <Button\n variant=\"text\"\n disabled={disabled}\n type=\"reset\"\n >\n {status === \"existing\" ? \"Discard\" : \"Clear\"}\n </Button>\n\n <Button\n variant=\"text\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n onClick={() => {\n closeAfterSaveRef.current = false;\n }}\n >\n {status === \"existing\" && \"Save\"}\n {status === \"copy\" && \"Create copy\"}\n {status === \"new\" && \"Create\"}\n </Button>\n\n <Button\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n onClick={() => {\n closeAfterSaveRef.current = true;\n }}\n >\n {status === \"existing\" && \"Save and close\"}\n {status === \"copy\" && \"Create copy and close\"}\n {status === \"new\" && \"Create and close\"}\n </Button>\n\n </DialogActions>}\n </Form>\n );\n}\n","import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport * as Portal from \"@radix-ui/react-portal\";\n\nimport {\n Entity,\n EntityCollection,\n EntityValues,\n FireCMSPlugin,\n FormContext,\n PropertyFieldBindingProps,\n ResolvedEntityCollection,\n ResolvedProperties,\n ResolvedProperty\n} from \"../../../../types\";\nimport { Form, Formik, FormikProps } from \"formik\";\nimport { useDraggable } from \"./useDraggable\";\nimport { CustomFieldValidator, getYupEntitySchema } from \"../../../../form/validation\";\nimport { useWindowSize } from \"./useWindowSize\";\nimport { ElementResizeListener } from \"./ElementResizeListener\";\nimport { ErrorView, OnCellValueChangeParams } from \"../../../../components\";\nimport { getPropertyInPath, isReadOnly, resolveCollection } from \"../../../../util\";\nimport { Button, ClearIcon, DialogActions, IconButton, Typography } from \"@firecms/ui\";\nimport { PropertyFieldBinding } from \"../../../../form\";\nimport { useDataSource, useFireCMSContext } from \"../../../../hooks\";\n\ninterface PopupFormFieldProps<M extends Record<string, any>> {\n entity?: Entity<M>;\n customFieldValidator?: CustomFieldValidator;\n path: string;\n tableKey: string;\n propertyKey?: Extract<keyof M, string>;\n collection?: EntityCollection<M>;\n cellRect?: DOMRect;\n open: boolean;\n onClose: () => void;\n container: HTMLElement | null;\n /**\n * Callback when the value of a cell has been edited\n * @param params\n */\n onCellValueChange?: (params: OnCellValueChangeParams<any, M>) => Promise<void>;\n}\n\nexport function PopupFormField<M extends Record<string, any>>(props: PopupFormFieldProps<M>) {\n if (!props.open) return null;\n return <PopupFormFieldInternal {...props} />;\n\n}\n\nexport function PopupFormFieldInternal<M extends Record<string, any>>({\n tableKey,\n entity: entityProp,\n customFieldValidator,\n propertyKey,\n collection: inputCollection,\n path,\n cellRect,\n open,\n onClose,\n onCellValueChange,\n container\n }: PopupFormFieldProps<M>) {\n\n const dataSource = useDataSource();\n const fireCMSContext = useFireCMSContext();\n\n const [savingError, setSavingError] = React.useState<any>();\n const [popupLocation, setPopupLocation] = useState<{\n x: number,\n y: number\n }>();\n\n const entityId = entityProp?.id;\n const [entity, setEntity] = useState<Entity<M> | undefined>(entityProp);\n useEffect(() => {\n if (entityId && inputCollection) {\n return dataSource.listenEntity?.({\n path,\n entityId,\n collection: inputCollection,\n onUpdate: (e) => {\n setEntity(e);\n setInternalValue(e?.values);\n }\n });\n } else {\n return () => {\n };\n }\n }, [dataSource, entityId, inputCollection, path, open]);\n\n const [internalValue, setInternalValue] = useState<EntityValues<M> | undefined>(entity?.values);\n\n const collection: ResolvedEntityCollection<M> | undefined = inputCollection\n ? resolveCollection<M>({\n collection: inputCollection,\n path,\n values: internalValue,\n entityId,\n fields: fireCMSContext.propertyConfigs\n })\n : undefined;\n\n const windowSize = useWindowSize();\n\n const draggableRef = React.useRef<HTMLDivElement>(null);\n const innerRef = React.useRef<HTMLDivElement>(null);\n\n const initialPositionSet = React.useRef<boolean>(false);\n\n const getInitialLocation = useCallback(() => {\n if (!cellRect) throw Error(\"getInitialLocation error\");\n\n return {\n x: cellRect.left < windowSize.width - cellRect.right\n ? cellRect.x + cellRect.width / 2\n : cellRect.x - cellRect.width / 2,\n y: cellRect.top < windowSize.height - cellRect.bottom\n ? cellRect.y + cellRect.height / 2\n : cellRect.y - cellRect.height / 2\n };\n }, [cellRect, windowSize.height, windowSize.width]);\n\n const normalizePosition = useCallback(({\n x,\n y\n }: { x: number, y: number }) => {\n\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!draggableBoundingRect)\n throw Error(\"normalizePosition called before draggableBoundingRect is set\");\n\n return {\n x: Math.max(0, Math.min(x, windowSize.width - draggableBoundingRect.width)),\n y: Math.max(0, Math.min(y, windowSize.height - draggableBoundingRect.height))\n };\n }, [windowSize]);\n\n const updatePopupLocation = useCallback((position?: {\n x: number,\n y: number\n }) => {\n\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!cellRect || !draggableBoundingRect) return;\n // const newPosition = normalizePosition(position ?? getInitialLocation());\n const newPosition = position ?? normalizePosition(getInitialLocation());\n if (!popupLocation || newPosition.x !== popupLocation.x || newPosition.y !== popupLocation.y)\n setPopupLocation(newPosition);\n }, [cellRect, getInitialLocation, normalizePosition, popupLocation]);\n\n useDraggable({\n containerRef: draggableRef,\n innerRef,\n x: popupLocation?.x,\n y: popupLocation?.y,\n onMove: updatePopupLocation\n });\n\n useEffect(\n () => {\n initialPositionSet.current = false;\n },\n [propertyKey, entity]\n );\n\n useLayoutEffect(\n () => {\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!cellRect || !draggableBoundingRect || initialPositionSet.current) return;\n updatePopupLocation();\n initialPositionSet.current = true;\n },\n [cellRect, updatePopupLocation, initialPositionSet.current]\n );\n\n useLayoutEffect(\n () => {\n updatePopupLocation(popupLocation);\n },\n [windowSize, cellRect]\n );\n\n const validationSchema = useMemo(() => {\n if (!collection || !entityId) return;\n return getYupEntitySchema(\n entityId,\n propertyKey && collection.properties[propertyKey as string]\n ? { [propertyKey]: collection.properties[propertyKey as string] } as ResolvedProperties<any>\n : {} as ResolvedProperties<any>,\n customFieldValidator);\n }, [collection, entityId, propertyKey, customFieldValidator]);\n\n const adaptResize = useCallback(() => {\n return updatePopupLocation(popupLocation);\n }, [popupLocation, updatePopupLocation]);\n\n const saveValue = async (values: M) => {\n setSavingError(null);\n if (inputCollection && entity && onCellValueChange && propertyKey) {\n return onCellValueChange({\n value: values[propertyKey as string],\n propertyKey: propertyKey as string,\n entity,\n setError: setSavingError,\n onValueUpdated: () => {\n },\n fullPath: path,\n context: fireCMSContext\n });\n }\n return Promise.resolve();\n };\n\n if (!entity)\n return <></>;\n\n const form = entity && (\n <div\n className={`text-gray-900 dark:text-white overflow-auto rounded rounded-md bg-white dark:bg-gray-950 ${!open ? \"hidden\" : \"\"} cursor-grab max-w-[100vw]`}>\n <Formik\n initialValues={(entity?.values ?? {}) as EntityValues<M>}\n enableReinitialize={true}\n validationSchema={validationSchema}\n validateOnMount={true}\n validate={(values) => console.debug(\"Validating\", values)}\n onSubmit={(values, actions) => {\n saveValue(values)\n .then(() => onClose())\n .finally(() => actions.setSubmitting(false));\n }}\n >\n {({\n values,\n setFieldValue,\n handleSubmit,\n isSubmitting\n }: FormikProps<EntityValues<M>>) => {\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n if (!equal(values, internalValue)) {\n setInternalValue(values);\n }\n }, [values]);\n\n if (!entity)\n return <ErrorView\n error={\"PopupFormField misconfiguration\"}/>;\n\n if (!collection)\n return <></>;\n\n const disabled = isSubmitting;\n\n const formContext: FormContext<M> = {\n collection,\n entityId,\n values,\n path,\n setFieldValue,\n save: saveValue\n };\n\n const property: ResolvedProperty<any> | undefined = propertyKey && getPropertyInPath(collection.properties, propertyKey as string);\n const fieldProps: PropertyFieldBindingProps<any, M> | undefined = propertyKey && property\n ? {\n propertyKey: propertyKey as string,\n disabled: isSubmitting || isReadOnly(property) || !!property.disabled,\n property,\n includeDescription: false,\n underlyingValueHasChanged: false,\n context: formContext,\n tableMode: true,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: open\n }\n : undefined;\n\n let internalForm = <>\n <div\n key={`popup_form_${tableKey}_${entityId}_${propertyKey}`}\n className=\"w-[560px] max-w-full max-h-[85vh]\">\n <Form\n onSubmit={handleSubmit}\n noValidate>\n\n <div\n className=\"mb-1 p-4 flex flex-col relative\">\n <div\n ref={innerRef}\n className=\"cursor-auto\"\n style={{ cursor: \"auto !important\" }}>\n {fieldProps &&\n <PropertyFieldBinding {...fieldProps}/>}\n </div>\n </div>\n\n <DialogActions>\n <Button\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n >\n Save\n </Button>\n </DialogActions>\n\n </Form>\n\n </div>\n </>;\n\n const plugins = fireCMSContext.plugins;\n if (plugins) {\n // const formController: FormContext<M> = {\n // values,\n // setFieldValue\n // }\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.form?.provider) {\n internalForm = (\n <plugin.form.provider.Component\n status={\"existing\"}\n path={path}\n collection={collection}\n entity={entity}\n context={fireCMSContext}\n currentEntityId={entityId}\n formContext={formContext}\n {...plugin.form.provider.props}>\n {internalForm}\n </plugin.form.provider.Component>\n );\n }\n });\n }\n return internalForm;\n }}\n </Formik>\n\n {savingError &&\n <Typography color={\"error\"}>\n {savingError.message}\n </Typography>\n }\n </div>\n );\n\n const draggable = (\n <div\n key={`draggable_${propertyKey as string}_${entityId}_${open}`}\n style={{\n boxShadow: \"0 0 0 2px rgba(128,128,128,0.2)\",\n }}\n className={`inline-block fixed z-20 shadow-outline rounded-md bg-white dark:bg-gray-950 ${\n !open ? \"invisible\" : \"visible\"\n } cursor-grab overflow-visible`}\n ref={draggableRef}>\n\n <ElementResizeListener onResize={adaptResize}/>\n\n <div\n className=\"overflow-hidden\">\n\n {form}\n\n <div\n className=\"absolute -top-3.5 -right-3.5 bg-gray-500 rounded-full\"\n style={{\n width: \"32px\",\n height: \"32px\"\n }}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onClose();\n }}>\n <ClearIcon className=\"text-white\"\n size={\"small\"}/>\n </IconButton>\n </div>\n </div>\n\n </div>\n );\n\n return (\n <Portal.Root asChild\n container={container}\n >\n {draggable}\n </Portal.Root>\n );\n\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CollectionSize,\n Entity,\n EntityAction,\n EntityCollection,\n FilterValues,\n PartialEntityCollection,\n PropertyOrBuilder,\n ResolvedProperty,\n SaveEntityProps,\n SelectionController\n} from \"../../types\";\nimport {\n EntityCollectionTable,\n OnCellValueChange,\n OnColumnResizeParams,\n UniqueFieldValidator\n} from \"../EntityCollectionTable\";\n\nimport { EntityCollectionRowActions } from \"../EntityCollectionTable/internal/EntityCollectionRowActions\";\nimport { DeleteEntityDialog } from \"../EntityCollectionTable/internal/DeleteEntityDialog\";\n\nimport {\n canCreateEntity,\n canDeleteEntity,\n canEditEntity,\n fullPathToCollectionSegments,\n getPropertyInPath,\n mergeDeep,\n resolveCollection,\n resolveProperty\n} from \"../../util\";\nimport { ReferencePreview } from \"../../preview\";\nimport {\n saveEntityWithCallbacks,\n useAuthController,\n useDataSource,\n useFireCMSContext,\n useLargeLayout,\n useNavigationController,\n useSideEntityController\n} from \"../../hooks\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { EntityCollectionViewActions } from \"./EntityCollectionViewActions\";\nimport { useEntityCollectionTableController } from \"../EntityCollectionTable/useEntityCollectionTableController\";\nimport {\n AddIcon,\n Button,\n cn,\n IconButton,\n KeyboardTabIcon,\n Markdown,\n Popover,\n SearchIcon,\n Skeleton,\n TextField,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { setIn } from \"formik\";\nimport { getSubcollectionColumnId } from \"../EntityCollectionTable/internal/common\";\nimport { useColumnIds } from \"./useColumnsIds\";\nimport { PopupFormField } from \"../EntityCollectionTable/internal/popup_field/PopupFormField\";\nimport { GetPropertyForProps } from \"../EntityCollectionTable/EntityCollectionTableProps\";\nimport {\n copyEntityAction,\n deleteEntityAction,\n editEntityAction\n} from \"../EntityCollectionTable/internal/default_entity_actions\";\n\nconst COLLECTION_GROUP_PARENT_ID = \"collectionGroupParent\";\n\n/**\n * @group Components\n */\nexport type EntityCollectionViewProps<M extends Record<string, any>> = {\n fullPath: string;\n parentCollectionIds?: string[];\n isSubCollection?: boolean;\n className?: string;\n} & EntityCollection<M>;\n\n/**\n * This component is in charge of binding a datasource path with an {@link EntityCollection}\n * where it's configuration is defined. It includes an infinite scrolling table\n * and a 'Add' new entities button,\n *\n * This component is the default one used for displaying entity collections\n * and is in charge of generating all the specific actions and customization\n * of the lower level {@link EntityCollectionTable}\n *\n * Please **note** that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you need a lower level implementation with more granular options, you\n * can use {@link EntityCollectionTable}.\n *\n * If you need a generic table that is not bound to the datasource or entities and\n * properties at all, you can check {@link VirtualTable}\n *\n * @param fullPath\n * @param collection\n * @constructor\n * @group Components\n */\nexport const EntityCollectionView = React.memo(\n function EntityCollectionView<M extends Record<string, any>>({\n fullPath,\n parentCollectionIds,\n isSubCollection,\n className,\n ...collectionProp\n }: EntityCollectionViewProps<M>\n ) {\n\n const dataSource = useDataSource();\n const navigation = useNavigationController();\n const sideEntityController = useSideEntityController();\n const authController = useAuthController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const context = useFireCMSContext();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const collection = useMemo(() => {\n const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);\n return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;\n }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);\n\n const canCreateEntities = canCreateEntity(collection, authController, fullPathToCollectionSegments(fullPath), null);\n const [selectedNavigationEntity, setSelectedNavigationEntity] = useState<Entity<M> | undefined>(undefined);\n const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);\n\n const [textSearchLoading, setTextSearchLoading] = useState<boolean>(false);\n const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);\n\n // number of entities in the collection\n const [docsCount, setDocsCount] = useState<number>(0);\n\n const unselectNavigatedEntity = useCallback(() => {\n const currentSelection = selectedNavigationEntity;\n setTimeout(() => {\n if (currentSelection === selectedNavigationEntity)\n setSelectedNavigationEntity(undefined);\n }, 2400);\n }, [selectedNavigationEntity]);\n\n const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {\n if (!canEditEntity(collection, authController, fullPathToCollectionSegments(fullPath), entity ?? null)) {\n return false;\n }\n return collection.inlineEditing === undefined || collection.inlineEditing;\n }, [collection, authController, fullPath]);\n\n const selectionEnabled = collection.selectionEnabled === undefined || collection.selectionEnabled;\n const hoverRow = !checkInlineEditing();\n\n const [popOverOpen, setPopOverOpen] = useState(false);\n\n const selectionController = useSelectionController<M>();\n const usedSelectionController = collection.selectionController ?? selectionController;\n const {\n selectedEntities,\n toggleEntitySelection,\n isEntitySelected,\n setSelectedEntities\n } = usedSelectionController;\n\n useEffect(() => {\n setDeleteEntityClicked(undefined);\n }, [selectedEntities]);\n\n const tableController = useEntityCollectionTableController<M>({\n fullPath,\n collection,\n entitiesDisplayedFirst: [],\n lastDeleteTimestamp\n });\n\n const tableKey = React.useRef<string>(Math.random().toString(36));\n const popupCell = tableController.popupCell;\n\n const onPopupClose = useCallback(() => {\n tableController.setPopupCell?.(undefined);\n }, [tableController.setPopupCell]);\n\n const onEntityClick = useCallback((clickedEntity: Entity<M>) => {\n setSelectedNavigationEntity(clickedEntity);\n context.onAnalyticsEvent?.(\"edit_entity_clicked\", {\n path: clickedEntity.path,\n entityId: clickedEntity.id\n });\n return sideEntityController.open({\n entityId: clickedEntity.id,\n path: clickedEntity.path,\n collection,\n updateUrl: true,\n onClose: unselectNavigatedEntity\n });\n }, [fullPath, collection, sideEntityController]);\n\n const onNewClick = useCallback(() => {\n context.onAnalyticsEvent?.(\"new_entity_click\", {\n path: fullPath\n });\n sideEntityController.open({\n path: fullPath,\n collection,\n updateUrl: true,\n onClose: unselectNavigatedEntity\n });\n }, [fullPath, collection, sideEntityController]);\n\n const onSingleDeleteClick = useCallback((selectedEntity: Entity<any>) => {\n context.onAnalyticsEvent?.(\"single_delete_dialog_open\", {\n path: fullPath\n });\n setDeleteEntityClicked(selectedEntity);\n }, [context, fullPath]);\n\n const onMultipleDeleteClick = useCallback(() => {\n context.onAnalyticsEvent?.(\"multiple_delete_dialog_open\", {\n path: fullPath\n });\n setDeleteEntityClicked(selectedEntities);\n }, [context, fullPath, selectedEntities]);\n\n const internalOnEntityDelete = useCallback((_path: string, entity: Entity<M>) => {\n context.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path: fullPath\n });\n setSelectedEntities((selectedEntities) => selectedEntities.filter((e) => e.id !== entity.id));\n setLastDeleteTimestamp(Date.now());\n }, [context, fullPath, setSelectedEntities]);\n\n const internalOnMultipleEntitiesDelete = useCallback((_path: string, entities: Entity<M>[]) => {\n context.onAnalyticsEvent?.(\"multiple_entities_deleted\", {\n path: fullPath\n });\n setSelectedEntities([]);\n setDeleteEntityClicked(undefined);\n setLastDeleteTimestamp(Date.now());\n }, [setSelectedEntities]);\n\n let AddColumnComponent: React.ComponentType<{\n fullPath: string,\n parentCollectionIds: string[],\n collection: EntityCollection;\n }> | undefined\n\n // we are only using the first plugin that implements this\n if (context?.plugins) {\n AddColumnComponent = context.plugins.find(plugin => plugin.collectionView?.AddColumnComponent)?.collectionView?.AddColumnComponent;\n }\n\n const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialEntityCollection<M>) => {\n if (userConfigPersistence) {\n const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);\n const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);\n userConfigPersistence.onCollectionModified(path, updatedConfig);\n }\n }, [userConfigPersistence]);\n\n const onColumnResize = useCallback(({\n width,\n key\n }: OnColumnResizeParams) => {\n // Only for property columns\n if (!getPropertyInPath(collection.properties, key)) return;\n const localCollection = buildPropertyWidthOverwrite(key, width);\n onCollectionModifiedForUser(fullPath, localCollection);\n }, [collection, onCollectionModifiedForUser, fullPath]);\n\n const onSizeChanged = useCallback((size: CollectionSize) => {\n if (userConfigPersistence)\n onCollectionModifiedForUser(fullPath, { defaultSize: size })\n }, [onCollectionModifiedForUser, fullPath, userConfigPersistence]);\n\n const createEnabled = canCreateEntity(collection, authController, fullPathToCollectionSegments(fullPath), null);\n\n const uniqueFieldValidator: UniqueFieldValidator = useCallback(\n ({\n name,\n value,\n property,\n entityId\n }) => dataSource.checkUniqueField(fullPath, name, value, entityId),\n [fullPath]);\n\n const onValueChange: OnCellValueChange<any, any> = ({\n fullPath,\n context,\n value,\n propertyKey,\n onValueUpdated,\n setError,\n entity,\n }) => {\n\n const updatedValues = setIn({ ...entity.values }, propertyKey, value);\n\n const saveProps: SaveEntityProps = {\n path: fullPath,\n entityId: entity.id,\n values: updatedValues,\n previousValues: entity.values,\n collection,\n status: \"existing\"\n };\n\n return saveEntityWithCallbacks({\n ...saveProps,\n collection,\n callbacks: collection.callbacks,\n dataSource,\n context,\n onSaveSuccess: () => onValueUpdated(),\n onSaveFailure: (e: Error) => {\n console.error(\"Save failure\");\n console.error(e);\n setError(e);\n }\n });\n\n };\n\n const resolvedFullPath = navigation.resolveAliasesFrom(fullPath);\n const resolvedCollection = useMemo(() => resolveCollection<M>({\n collection,\n path: fullPath,\n fields: context.propertyConfigs\n }), [collection, fullPath]);\n\n const getPropertyFor = useCallback(({\n propertyKey,\n propertyValue,\n entity\n }: GetPropertyForProps<M>) => {\n let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);\n\n // we might not find the property in the collection if combining property builders and map spread\n if (!propertyOrBuilder) {\n // these 2 properties are coming from the resolved collection with default values\n propertyOrBuilder = getPropertyInPath<M>(resolvedCollection.properties, propertyKey);\n }\n\n return resolveProperty({\n propertyKey,\n propertyOrBuilder,\n path: fullPath,\n propertyValue,\n values: entity.values,\n entityId: entity.id,\n fields: context.propertyConfigs\n });\n }, [collection.properties, context.propertyConfigs, fullPath, resolvedCollection.properties]);\n\n const displayedColumnIds = useColumnIds(resolvedCollection, true);\n\n const additionalFields = useMemo(() => {\n const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = collection.subcollections?.map((subcollection) => {\n return {\n key: getSubcollectionColumnId(subcollection),\n name: subcollection.name,\n width: 200,\n dependencies: [],\n Builder: ({ entity }) => (\n <Button color={\"primary\"}\n variant={\"outlined\"}\n startIcon={<KeyboardTabIcon size={\"small\"}/>}\n onClick={(event: any) => {\n event.stopPropagation();\n sideEntityController.open({\n path: fullPath,\n entityId: entity.id,\n selectedSubPath: subcollection.id ?? subcollection.path,\n collection,\n updateUrl: true\n });\n }}>\n {subcollection.name}\n </Button>\n )\n };\n }) ?? [];\n\n const collectionGroupParentCollections: AdditionalFieldDelegate<M, any>[] = collection.collectionGroup\n ? [{\n key: COLLECTION_GROUP_PARENT_ID,\n name: \"Parent entities\",\n width: 260,\n dependencies: [],\n Builder: ({ entity }) => {\n const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);\n return (\n <>\n {collectionsWithPath.map((reference) => {\n return (\n <ReferencePreview\n key={reference.path + \"/\" + reference.id}\n reference={reference}\n size={\"tiny\"}/>\n );\n })}\n </>\n );\n }\n }]\n : [];\n\n return [\n ...(collection.additionalFields ?? []),\n ...subcollectionColumns,\n ...collectionGroupParentCollections\n ];\n }, [collection, fullPath]);\n\n const updateLastDeleteTimestamp = useCallback(() => {\n setLastDeleteTimestamp(Date.now());\n }, []);\n\n const largeLayout = useLargeLayout();\n\n const getActionsForEntity = useCallback(({ entity, customEntityActions }: {\n entity?: Entity<M>,\n customEntityActions?: EntityAction[]\n }): EntityAction[] => {\n const deleteEnabled = entity ? canDeleteEntity(collection, authController, fullPathToCollectionSegments(fullPath), entity) : true;\n const actions: EntityAction[] = [editEntityAction];\n if (createEnabled)\n actions.push(copyEntityAction);\n if (deleteEnabled)\n actions.push(deleteEntityAction);\n if (customEntityActions)\n actions.push(...customEntityActions);\n return actions;\n }, [authController, collection, createEnabled, fullPath]);\n\n const getIdColumnWidth = useCallback(() => {\n const entityActions = getActionsForEntity({});\n const collapsedActions = entityActions.filter(a => a.collapsed !== false);\n const uncollapsedActions = entityActions.filter(a => a.collapsed === false);\n const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);\n return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);\n }, [largeLayout, getActionsForEntity]);\n\n const tableRowActionsBuilder = useCallback(({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n\n const isSelected = isEntitySelected(entity);\n\n const actions = getActionsForEntity({ entity, customEntityActions: collection.entityActions });\n\n return (\n <EntityCollectionRowActions\n entity={entity}\n width={width}\n frozen={frozen}\n isSelected={isSelected}\n selectionEnabled={selectionEnabled}\n size={size}\n highlightEntity={setSelectedNavigationEntity}\n unhighlightEntity={unselectNavigatedEntity}\n collection={collection}\n fullPath={fullPath}\n actions={actions}\n hideId={collection?.hideIdFromCollection}\n onCollectionChange={updateLastDeleteTimestamp}\n selectionController={usedSelectionController}\n />\n );\n\n }, [isEntitySelected, collection, authController, fullPath, selectionEnabled, toggleEntitySelection, createEnabled]);\n\n const title = <Popover\n open={popOverOpen}\n onOpenChange={setPopOverOpen}\n enabled={Boolean(collection.description)}\n trigger={<div className=\"flex flex-col items-start\">\n <Typography\n variant={\"subtitle1\"}\n className={`leading-none truncate max-w-[160px] lg:max-w-[240px] ${collection.description ? \"cursor-pointer\" : \"cursor-auto\"}`}\n onClick={collection.description\n ? (e) => {\n setPopOverOpen(true);\n e.stopPropagation();\n }\n : undefined}\n >\n {`${collection.name}`}\n </Typography>\n\n <EntitiesCount\n fullPath={fullPath}\n collection={collection}\n filter={tableController.filterValues}\n sortBy={tableController.sortBy}\n onCountChange={setDocsCount}\n />\n\n </div>}\n >\n\n {collection.description && <div className=\"m-4 text-gray-900 dark:text-white\">\n <Markdown source={collection.description}/>\n </div>}\n\n </Popover>;\n\n function buildAdditionalHeaderWidget({\n property,\n propertyKey,\n onHover\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean\n }) {\n if (!context.plugins)\n return null;\n return <>\n {context.plugins.filter(plugin => plugin.collectionView?.HeaderAction)\n .map((plugin, i) => {\n const HeaderAction = plugin.collectionView!.HeaderAction!;\n return <HeaderAction\n onHover={onHover}\n key={`plugin_header_action_${i}`}\n propertyKey={propertyKey}\n property={property}\n fullPath={fullPath}\n collection={collection}\n parentCollectionIds={parentCollectionIds ?? []}/>;\n })}\n </>;\n }\n\n const addColumnComponentInternal = AddColumnComponent\n ? function () {\n if (typeof AddColumnComponent === \"function\")\n return <AddColumnComponent fullPath={fullPath}\n parentCollectionIds={parentCollectionIds ?? []}\n collection={collection}/>;\n return null;\n }\n : undefined;\n\n const [textSearchInitialised, setTextSearchInitialised] = useState<boolean>(false);\n let onTextSearchClick: (() => void) | undefined;\n let textSearchEnabled = Boolean(collection.textSearchEnabled);\n if (context?.plugins) {\n const addTextSearchClickListener = context.plugins?.find(p => Boolean(p.collectionView?.onTextSearchClick));\n\n onTextSearchClick = addTextSearchClickListener\n ? () => {\n setTextSearchLoading(true);\n Promise.all(context.plugins?.map(p => {\n if (p.collectionView?.onTextSearchClick)\n return p.collectionView.onTextSearchClick({ context, path: resolvedFullPath, collection });\n return Promise.resolve(true);\n }) as Promise<boolean>[])\n .then((res) => {\n if (res.every(Boolean)) setTextSearchInitialised(true);\n })\n .finally(() => setTextSearchLoading(false));\n }\n : undefined;\n\n context.plugins?.forEach(p => {\n if (!textSearchEnabled)\n if (p.collectionView?.showTextSearchBar) {\n textSearchEnabled = p.collectionView.showTextSearchBar({ context, path: resolvedFullPath, collection });\n }\n })\n }\n\n return (\n <div className={cn(\"overflow-hidden h-full w-full\", className)}\n ref={containerRef}>\n <EntityCollectionTable\n key={`collection_table_${fullPath}`}\n additionalFields={additionalFields}\n tableController={tableController}\n displayedColumnIds={displayedColumnIds}\n onSizeChanged={onSizeChanged}\n onEntityClick={onEntityClick}\n onColumnResize={onColumnResize}\n onValueChange={onValueChange}\n tableRowActionsBuilder={tableRowActionsBuilder}\n uniqueFieldValidator={uniqueFieldValidator}\n title={title}\n selectionController={usedSelectionController}\n highlightedEntities={selectedNavigationEntity ? [selectedNavigationEntity] : []}\n defaultSize={collection.defaultSize}\n properties={resolvedCollection.properties}\n getPropertyFor={getPropertyFor}\n onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}\n textSearchLoading={textSearchLoading}\n textSearchEnabled={textSearchEnabled}\n actions={<EntityCollectionViewActions\n parentCollectionIds={parentCollectionIds ?? []}\n collection={collection}\n tableController={tableController}\n onMultipleDeleteClick={onMultipleDeleteClick}\n onNewClick={onNewClick}\n path={fullPath}\n relativePath={collection.path}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n collectionEntitiesCount={docsCount}\n />}\n emptyComponent={canCreateEntities && tableController.filterValues === undefined && tableController.sortBy === undefined\n ? <div className=\"flex flex-col items-center justify-center\">\n <Typography variant={\"subtitle2\"}>So empty...</Typography>\n <Button\n color={\"primary\"}\n variant={\"outlined\"}\n onClick={onNewClick}\n className=\"mt-4\"\n >\n <AddIcon/>\n Create your first entity\n </Button>\n </div>\n : <Typography variant={\"label\"}>No results with the applied filter/sort</Typography>\n }\n hoverRow={hoverRow}\n inlineEditing={checkInlineEditing()}\n AdditionalHeaderWidget={buildAdditionalHeaderWidget}\n AddColumnComponent={addColumnComponentInternal}\n getIdColumnWidth={getIdColumnWidth}\n additionalIDHeaderWidget={<EntityIdHeaderWidget\n path={fullPath}\n collection={collection}/>}\n />\n\n <PopupFormField\n key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}\n open={Boolean(popupCell)}\n onClose={onPopupClose}\n cellRect={popupCell?.cellRect}\n propertyKey={popupCell?.propertyKey}\n collection={collection}\n entity={popupCell?.entity}\n tableKey={tableKey.current}\n customFieldValidator={uniqueFieldValidator}\n path={resolvedFullPath}\n onCellValueChange={onValueChange}\n container={containerRef.current}/>\n\n {deleteEntityClicked &&\n <DeleteEntityDialog\n entityOrEntitiesToDelete={deleteEntityClicked}\n path={fullPath}\n collection={collection}\n callbacks={collection.callbacks}\n open={Boolean(deleteEntityClicked)}\n onEntityDelete={internalOnEntityDelete}\n onMultipleEntitiesDelete={internalOnMultipleEntitiesDelete}\n onClose={() => setDeleteEntityClicked(undefined)}/>}\n\n </div>\n );\n }, equal) as React.FunctionComponent<EntityCollectionViewProps<any>>\n\nexport function useSelectionController<M extends Record<string, any>>(): SelectionController<M> {\n\n const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);\n\n const toggleEntitySelection = useCallback((entity: Entity<M>) => {\n let newValue;\n if (selectedEntities.map(e => e.id).includes(entity.id)) {\n newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);\n } else {\n newValue = [...selectedEntities, entity];\n }\n setSelectedEntities(newValue);\n }, [selectedEntities]);\n\n const isEntitySelected = useCallback((entity: Entity<M>) => selectedEntities.map(e => e.id).includes(entity.id), [selectedEntities]);\n\n return {\n selectedEntities,\n setSelectedEntities,\n isEntitySelected,\n toggleEntitySelection\n };\n}\n\nfunction EntitiesCount({\n fullPath,\n collection,\n filter,\n sortBy,\n onCountChange\n }: {\n fullPath: string,\n collection: EntityCollection,\n filter?: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"],\n onCountChange?: (count: number) => void,\n}) {\n\n const dataSource = useDataSource();\n const navigation = useNavigationController();\n const [count, setCount] = useState<number | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);\n\n useEffect(() => {\n dataSource.countEntities({\n path: resolvedPath,\n collection,\n filter,\n orderBy: sortByProperty,\n order: currentSort\n }).then(setCount).catch(setError);\n }, [fullPath, dataSource, resolvedPath, collection, filter, sortByProperty, currentSort]);\n\n useEffect(() => {\n if (onCountChange) {\n onCountChange(count ?? 0);\n }\n }, [onCountChange, count]);\n\n if (error) {\n return null;\n }\n\n return <Typography\n className=\"w-full text-ellipsis block overflow-hidden whitespace-nowrap max-w-xs text-left w-fit-content\"\n variant={\"caption\"}\n color={\"secondary\"}>\n {count !== undefined ? `${count} entities` : <Skeleton className={\"w-full max-w-[80px] mt-1\"}/>}\n </Typography>;\n}\n\nfunction buildPropertyWidthOverwrite(key: string, width: number): PartialEntityCollection {\n if (key.includes(\".\")) {\n const [parentKey, ...childKey] = key.split(\".\");\n return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join(\".\"), width) } } as PartialEntityCollection;\n }\n return { properties: { [key]: { columnWidth: width } } } as PartialEntityCollection;\n}\n\nfunction EntityIdHeaderWidget({\n collection,\n path\n }: {\n collection: EntityCollection,\n path: string\n}) {\n const [openPopup, setOpenPopup] = React.useState(false);\n const [searchString, setSearchString] = React.useState(\"\");\n const sideEntityController = useSideEntityController();\n return (\n <Tooltip title={!openPopup ? \"Find by ID\" : undefined}>\n <Popover\n open={openPopup}\n onOpenChange={setOpenPopup}\n trigger={\n <IconButton size={\"small\"}>\n <SearchIcon size={\"small\"}/>\n </IconButton>\n }\n >\n <form noValidate={true}\n onSubmit={(e) => {\n e.preventDefault();\n if (!searchString) return;\n setOpenPopup(false);\n return sideEntityController.open({\n entityId: searchString,\n path,\n collection,\n updateUrl: true\n });\n }}\n className={\"text-gray-900 dark:text-white w-96 max-w-full\"}>\n\n <div className=\"flex p-4 w-full gap-4\">\n <TextField\n placeholder={\"Find entity by ID\"}\n size={\"small\"}\n onChange={(e) => setSearchString(e.target.value)}\n value={searchString}\n className={\"flex-grow\"}/>\n <Button variant={\"outlined\"}\n disabled={!searchString}\n type={\"submit\"}\n >Go</Button>\n </div>\n </form>\n </Popover>\n\n </Tooltip>\n );\n}\n","import React, { MouseEventHandler, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { CollectionSize, Entity, EntityCollection, FilterValues } from \"../types\";\n\nimport { EntityCollectionTable } from \"./EntityCollectionTable\";\nimport { EntityCollectionRowActions } from \"./EntityCollectionTable/internal/EntityCollectionRowActions\";\nimport {\n useAuthController,\n useDataSource,\n useFireCMSContext,\n useLargeLayout,\n useNavigationController,\n useSideEntityController\n} from \"../hooks\";\nimport { ErrorView } from \"./ErrorView\";\nimport { AddIcon, Button, DialogActions, Typography } from \"@firecms/ui\";\nimport { canCreateEntity, fullPathToCollectionSegments, resolveCollection } from \"../util\";\nimport { useSelectionController } from \"./EntityCollectionView/EntityCollectionView\";\nimport { useEntityCollectionTableController } from \"./EntityCollectionTable/useEntityCollectionTableController\";\nimport { useColumnIds } from \"./EntityCollectionView/useColumnsIds\";\nimport { useSideDialogContext } from \"../core\";\n\n/**\n * @group Components\n */\nexport interface ReferenceSelectionInnerProps<M extends Record<string, any>> {\n\n /**\n * Allow multiple selection of values\n */\n multiselect?: boolean;\n\n /**\n * Entity collection config\n */\n collection?: EntityCollection<M>;\n\n /**\n * Absolute path of the collection.\n * May be not set if this hook is being used in a component and the path is\n * dynamic. If not set, the dialog won't open.\n */\n path: string;\n\n /**\n * If you are opening the dialog for the first time, you can select some\n * entity ids to be displayed first.\n */\n selectedEntityIds?: string[];\n\n /**\n * If `multiselect` is set to `false`, you will get the selected entity\n * in this callback.\n * @param entity\n * @callback\n */\n onSingleEntitySelected?(entity: Entity<any> | null): void;\n\n /**\n * If `multiselect` is set to `true`, you will get the selected entities\n * in this callback.\n * @param entities\n * @callback\n */\n onMultipleEntitiesSelected?(entities: Entity<any>[]): void;\n\n /**\n * Allow selection of entities that pass the given filter only.\n */\n forceFilter?: FilterValues<string>;\n\n /**\n * Use this description to indicate the user what to do in this dialog.\n */\n description?: React.ReactNode;\n\n /**\n * Maximum number of entities that can be selected.\n */\n maxSelection?: number;\n\n}\n\n/**\n * This component allows to select entities from a given collection.\n * You probably want to open this dialog as a side view using {@link useReferenceDialog}\n * @group Components\n */\nexport function ReferenceSelectionInner<M extends Record<string, any>>(\n {\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n multiselect,\n collection,\n path: pathInput,\n selectedEntityIds: selectedEntityIdsProp,\n description,\n forceFilter,\n maxSelection\n }: ReferenceSelectionInnerProps<M>) {\n\n const sideDialogContext = useSideDialogContext();\n const sideEntityController = useSideEntityController();\n const navigation = useNavigationController();\n const context = useFireCMSContext();\n\n const fullPath = navigation.resolveAliasesFrom(pathInput);\n\n const dataSource = useDataSource();\n\n const [entitiesDisplayedFirst, setEntitiesDisplayedFirst] = useState<Entity<any>[]>([]);\n\n const selectionController = useSelectionController();\n\n /**\n * Fetch initially selected ids\n */\n useEffect(() => {\n let unmounted = false;\n const selectedEntityIds = selectedEntityIdsProp?.map(id => id?.toString()).filter(Boolean);\n if (selectedEntityIds && collection) {\n Promise.all(\n selectedEntityIds.map((entityId) =>\n dataSource.fetchEntity({\n path: fullPath,\n entityId,\n collection\n })))\n .then((entities) => {\n if (!unmounted) {\n const result = entities.filter(e => e !== undefined) as Entity<any>[];\n selectionController.setSelectedEntities(result);\n setEntitiesDisplayedFirst(result);\n }\n });\n } else {\n selectionController.setSelectedEntities([]);\n setEntitiesDisplayedFirst([]);\n }\n return () => {\n unmounted = true;\n };\n }, [dataSource, fullPath, selectedEntityIdsProp, collection, selectionController.setSelectedEntities]);\n\n const onClear = () => {\n context.onAnalyticsEvent?.(\"reference_selection_clear\", {\n path: fullPath\n });\n selectionController.setSelectedEntities([]);\n if (!multiselect && onSingleEntitySelected) {\n onSingleEntitySelected(null);\n } else if (onMultipleEntitiesSelected) {\n onMultipleEntitiesSelected([]);\n }\n };\n\n const toggleEntitySelection = (entity: Entity<any>) => {\n console.debug(\"ReferenceSelectionInner toggleEntitySelection\", entity);\n let newValue;\n const selectedEntities = selectionController.selectedEntities;\n\n context.onAnalyticsEvent?.(\"reference_selection_toggle\", {\n path: fullPath,\n entityId: entity.id\n });\n if (selectedEntities) {\n\n if (selectedEntities.map((e) => e.id).indexOf(entity.id) > -1) {\n newValue = selectedEntities.filter((item: Entity<any>) => item.id !== entity.id);\n } else {\n if (maxSelection && selectedEntities.length >= maxSelection)\n return;\n newValue = [...selectedEntities, entity];\n }\n selectionController.setSelectedEntities(newValue);\n\n if (onMultipleEntitiesSelected)\n onMultipleEntitiesSelected(newValue);\n }\n };\n\n const onEntityClick = (entity: Entity<any>) => {\n console.debug(\"ReferenceSelectionInner onEntityClick\", entity);\n\n if (!multiselect && onSingleEntitySelected) {\n context.onAnalyticsEvent?.(\"reference_selected_single\", {\n path: fullPath,\n entityId: entity.id\n });\n onSingleEntitySelected(entity);\n sideDialogContext.close(false);\n } else {\n toggleEntitySelection(entity);\n }\n };\n\n // create a new entity from within the reference dialog\n const onNewClick = () => {\n context.onAnalyticsEvent?.(\"reference_selection_new_entity\", {\n path: fullPath\n });\n sideEntityController.open({\n path: fullPath,\n collection,\n updateUrl: true,\n onUpdate: ({ entity }) => {\n setEntitiesDisplayedFirst([entity, ...entitiesDisplayedFirst]);\n onEntityClick(entity);\n },\n closeOnSave: true\n });\n };\n\n const tableRowActionsBuilder = ({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n const selectedEntities = selectionController.selectedEntities;\n const isSelected = selectedEntities && selectedEntities.map(e => e.id).indexOf(entity.id) > -1;\n return <EntityCollectionRowActions\n width={width}\n frozen={frozen}\n entity={entity}\n size={size}\n isSelected={isSelected}\n selectionEnabled={multiselect}\n hideId={collection?.hideIdFromCollection}\n fullPath={fullPath}\n selectionController={selectionController}/>;\n\n };\n\n const onDone = useCallback((event: React.SyntheticEvent) => {\n event.stopPropagation();\n sideDialogContext.close(false);\n }, [sideDialogContext]);\n\n if (!collection) {\n return <ErrorView\n error={\"Could not find collection with id \" + collection}/>\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const resolvedCollection = useMemo(() => resolveCollection({\n collection: collection,\n path: fullPath,\n values: {},\n fields: context.propertyConfigs\n }), [collection, context.propertyConfigs, fullPath]);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const displayedColumnIds = useColumnIds(resolvedCollection, false);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const tableController = useEntityCollectionTableController<M>({\n fullPath,\n collection,\n entitiesDisplayedFirst,\n forceFilter\n });\n\n return (\n\n <div className=\"flex flex-col h-full\">\n\n <div className=\"flex-grow\">\n {entitiesDisplayedFirst &&\n <EntityCollectionTable\n displayedColumnIds={displayedColumnIds}\n onEntityClick={onEntityClick}\n tableController={tableController}\n tableRowActionsBuilder={tableRowActionsBuilder}\n title={<Typography variant={\"subtitle2\"}>\n {collection.singularName ? `Select ${collection.singularName}` : `Select from ${collection.name}`}\n </Typography>}\n defaultSize={collection.defaultSize}\n properties={resolvedCollection.properties}\n forceFilter={forceFilter}\n inlineEditing={false}\n selectionController={selectionController}\n actions={<ReferenceDialogActions\n collection={collection}\n path={fullPath}\n onNewClick={onNewClick}\n onClear={onClear}/>\n }\n />}\n </div>\n <DialogActions translucent={false}>\n {description &&\n <Typography variant={\"body2\"}\n className=\"flex-grow text-left\">\n {description}\n </Typography>}\n <Button\n onClick={onDone}\n color=\"primary\"\n variant=\"filled\">\n Done\n </Button>\n </DialogActions>\n </div>\n\n );\n\n}\n\nfunction ReferenceDialogActions({\n collection,\n path,\n onClear,\n onNewClick\n }: {\n collection: EntityCollection<any>,\n path: string,\n onClear: () => void,\n onNewClick: () => void\n}) {\n\n const authController = useAuthController();\n\n const largeLayout = useLargeLayout();\n\n const onClick: MouseEventHandler<HTMLButtonElement> | undefined = onNewClick\n ? (e) => {\n e.preventDefault();\n onNewClick();\n }\n : undefined;\n const addButton = canCreateEntity(collection, authController, fullPathToCollectionSegments(path), null) &&\n onClick && (largeLayout\n ? <Button\n onClick={onClick}\n startIcon={<AddIcon/>}\n variant=\"outlined\"\n color=\"primary\">\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n onClick={onClick}\n size=\"medium\"\n variant=\"outlined\"\n color=\"primary\"\n >\n <AddIcon/>\n </Button>);\n\n return (\n <>\n <Button onClick={onClear}\n variant={\"text\"}\n color=\"primary\">\n Clear\n </Button>\n {addButton}\n </>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { ExpandablePanel, Typography } from \"@firecms/ui\";\n\nexport function NavigationGroup({\n children,\n group\n }: PropsWithChildren<{\n group: string | undefined\n}>) {\n const userConfigurationPersistence = useUserConfigurationPersistence();\n return (\n <ExpandablePanel\n invisible={true}\n titleClassName={\"font-medium text-sm text-gray-600 dark:text-gray-400\"}\n className={\"py-4\"}\n initiallyExpanded={!(userConfigurationPersistence?.collapsedGroups ?? []).includes(group ?? \"ungrouped\")}\n onExpandedChange={expanded => {\n if (userConfigurationPersistence) {\n\n if (!expanded) {\n const paths = (userConfigurationPersistence.collapsedGroups ?? []).concat(group ?? \"ungrouped\");\n userConfigurationPersistence.setCollapsedGroups(paths);\n } else {\n userConfigurationPersistence.setCollapsedGroups((userConfigurationPersistence.collapsedGroups ?? []).filter(g => g !== (group ?? \"ungrouped\")));\n }\n }\n }}\n title={<Typography color={\"secondary\"}\n className=\"font-medium ml-1\">\n {group?.toUpperCase() ?? \"Views\".toUpperCase()}\n </Typography>}>\n\n <div className=\"mb-8\">\n {children}\n </div>\n </ExpandablePanel>\n );\n}\n","import { useNavigate } from \"react-router-dom\";\n\nimport { useFireCMSContext } from \"../../hooks\";\nimport { PluginHomePageActionsProps, TopNavigationEntry } from \"../../types\";\nimport { getIconForView } from \"../../util\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { ArrowForwardIcon, Card, cn, IconButton, Markdown, StarBorderIcon, StarIcon, Typography } from \"@firecms/ui\";\n\n/**\n * This is the component used in the home page to render a card for each\n * collection.\n * @group Components\n * @param view\n * @param path\n * @param collection\n * @param url\n * @param name\n * @param description\n * @param onClick\n * @constructor\n */\nexport function NavigationCollectionCard({\n view,\n path,\n collection,\n url,\n name,\n description,\n onClick\n }: TopNavigationEntry & {\n onClick?: () => void\n}) {\n\n const userConfigurationPersistence = useUserConfigurationPersistence();\n const collectionIcon = getIconForView(collection ?? view);\n\n const navigate = useNavigate();\n const context = useFireCMSContext();\n\n const favourite = (userConfigurationPersistence?.favouritePaths ?? []).includes(path);\n\n let actions: React.ReactNode | undefined;\n if (context.plugins && collection) {\n const actionProps: PluginHomePageActionsProps = {\n path,\n collection,\n context\n };\n actions = <>\n {context.plugins.map((plugin, i) => (\n plugin.homePage?.CollectionActions\n ? <plugin.homePage.CollectionActions\n key={`actions_${i}`}\n {...actionProps}\n extraProps={plugin.homePage.extraProps}\n />\n : null\n ))}\n </>\n ;\n }\n\n return (\n <Card\n className={cn(\"h-full p-4 cursor-pointer min-h-[230px]\")}\n onClick={() => {\n onClick?.();\n navigate(url);\n if (userConfigurationPersistence) {\n userConfigurationPersistence.setRecentlyVisitedPaths(\n [path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== path)]\n );\n }\n }}>\n\n <div className=\"flex flex-col items-start h-full\">\n <div\n className=\"flex-grow w-full\">\n\n <div\n className=\"h-10 flex items-center w-full justify-between text-gray-300 dark:text-gray-600\">\n\n {collectionIcon}\n\n <div\n className=\"flex items-center gap-1\"\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }}>\n\n {actions}\n\n {userConfigurationPersistence &&\n <IconButton\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== path)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, path]\n );\n }\n }}>\n {\n favourite\n ? <StarIcon\n size={18}\n className={\"text-secondary\"}/>\n : <StarBorderIcon\n size={18}\n className={\"text-gray-400 dark:text-gray-500\"}/>}\n </IconButton>}\n\n </div>\n\n </div>\n\n <Typography gutterBottom variant=\"h5\"\n component=\"h2\">\n {name}\n </Typography>\n\n {description && <Typography variant=\"body2\"\n color=\"secondary\"\n component=\"div\">\n <Markdown source={description}/>\n </Typography>}\n </div>\n\n <div style={{ alignSelf: \"flex-end\" }}>\n\n <div className={\"p-4\"}>\n <ArrowForwardIcon className=\"text-primary\"/>\n </div>\n </div>\n\n </div>\n\n </Card>);\n}\n","import { useNavigate } from \"react-router-dom\";\nimport { useNavigationController } from \"../../hooks\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { TopNavigationEntry } from \"../../types\";\nimport { Chip, Collapse, StarBorderIcon, StarIcon } from \"@firecms/ui\";\n\nfunction NavigationChip({ entry }: { entry: TopNavigationEntry }) {\n\n const navigate = useNavigate();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favourite = userConfigurationPersistence.favouritePaths.includes(entry.path);\n const onIconClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== entry.path)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, entry.path]\n );\n }\n };\n return <Chip\n key={entry.path}\n onClick={() => navigate(entry.url)}\n icon={\n favourite\n ? <StarIcon\n onClick={onIconClick}\n size={18}\n className={\"text-secondary\"}/>\n : <StarBorderIcon\n onClick={onIconClick}\n size={18}\n className={\"text-gray-400 dark:text-gray-500\"}/>}>\n {entry.name}\n </Chip>;\n}\n\nexport function FavouritesView({ hidden }: { hidden: boolean }) {\n\n const navigationController = useNavigationController();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favouriteCollections = (userConfigurationPersistence?.favouritePaths ?? [])\n .map((path) => navigationController.topLevelNavigation?.navigationEntries.find((entry) => entry.path === path))\n .filter(Boolean) as TopNavigationEntry[];\n\n return <Collapse in={favouriteCollections.length > 0}>\n <div className=\"flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]\">\n {favouriteCollections.map((entry) => <NavigationChip key={entry.path}\n entry={entry}/>)}\n </div>\n </Collapse>;\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nconst scrollsMap: Record<string, number> = {};\n\nexport function useRestoreScroll() {\n\n // const scrollsMap = React.useRef<Record<string, number>>({});\n\n const location = useLocation();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [scroll, setScroll] = React.useState(0);\n const [direction, setDirection] = React.useState<\"up\" | \"down\">(\"down\");\n\n const handleScroll = useCallback(() => {\n if (!containerRef.current || !location.key) return;\n scrollsMap[location.key] = containerRef.current.scrollTop;\n setScroll(containerRef.current.scrollTop);\n setDirection(containerRef.current.scrollTop > scroll ? \"down\" : \"up\");\n }, [containerRef, location.key, scroll]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n if (container)\n container.removeEventListener(\"scroll\", handleScroll);\n };\n }, [containerRef, handleScroll, location]);\n\n useEffect(() => {\n if (!containerRef.current || !scrollsMap[location.key]) return;\n containerRef.current.scrollTo(\n {\n top: scrollsMap[location.key],\n behavior: \"auto\"\n });\n }, [location]);\n\n return {\n containerRef,\n scroll,\n direction\n };\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\n\nimport { useFireCMSContext, useNavigationController } from \"../../hooks\";\nimport { PluginGenericProps, PluginHomePageAdditionalCardsProps } from \"../../types\";\n\nimport { toArray } from \"../../util/arrays\";\nimport { NavigationGroup } from \"./NavigationGroup\";\nimport { NavigationCollectionCard } from \"./NavigationCollectionCard\";\n\n// @ts-ignore\nimport * as JsSearch from \"js-search\";\n\nimport { Container, SearchBar } from \"@firecms/ui\";\nimport { FavouritesView } from \"./FavouritesView\";\nimport { useRestoreScroll } from \"../../internal/useRestoreScroll\";\n\nconst search = new JsSearch.Search(\"url\");\nsearch.addIndex(\"name\");\nsearch.addIndex(\"description\");\nsearch.addIndex(\"group\");\nsearch.addIndex(\"path\");\n\n/**\n * Default entry view for the CMS. This component renders navigation cards\n * for each collection defined in the navigation.\n * @constructor\n * @group Components\n */\nexport function DefaultHomePage({\n additionalActions,\n additionalChildrenStart,\n additionalChildrenEnd\n }: {\n /**\n * Additional actions to be rendered in the home page, close to the search bar.\n */\n additionalActions?: React.ReactNode;\n /**\n * Additional children to be rendered in the beginning of the home page.\n */\n additionalChildrenStart?: React.ReactNode;\n /**\n * Additional children to be rendered at the end of the home page.\n */\n additionalChildrenEnd?: React.ReactNode;\n}) {\n\n const context = useFireCMSContext();\n const navigationController = useNavigationController();\n\n if (!navigationController.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const {\n containerRef,\n scroll,\n direction\n } = useRestoreScroll();\n\n const {\n navigationEntries,\n groups\n } = navigationController.topLevelNavigation;\n\n const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);\n\n const filteredNavigationEntries = filteredUrls\n ? navigationEntries.filter((entry) => filteredUrls.includes(entry.url))\n : navigationEntries;\n\n useEffect(() => {\n search.addDocuments(navigationEntries);\n }, [navigationEntries]);\n\n const updateSearchResults = useCallback(\n (value?: string) => {\n if (!value || value === \"\") {\n setFilteredUrls(null);\n } else {\n const searchResult = search.search(value);\n setFilteredUrls(searchResult.map((e: any) => e.url));\n }\n }, []);\n\n const allGroups: Array<string | undefined> = [...groups];\n if (filteredNavigationEntries.filter(e => !e.group).length > 0 || filteredNavigationEntries.length === 0) {\n allGroups.push(undefined);\n }\n\n let additionalPluginChildrenStart: React.ReactNode | undefined;\n let additionalPluginChildrenEnd: React.ReactNode | undefined;\n let additionalPluginSections: React.ReactNode | undefined;\n if (context.plugins) {\n const sectionProps: PluginGenericProps = {\n context\n };\n additionalPluginSections = <>\n {context.plugins.filter(plugin => plugin.homePage?.includeSection)\n .map((plugin, i) => {\n const section = plugin.homePage!.includeSection!(sectionProps)\n return (\n <NavigationGroup\n group={section.title}\n key={`plugin_section_${plugin.name}`}>\n {section.children}\n </NavigationGroup>\n );\n })}\n </>;\n additionalPluginChildrenStart = <div className={\"flex flex-col gap-2\"}>\n {context.plugins.filter(plugin => plugin.homePage?.additionalChildrenStart)\n .map((plugin, i) => {\n return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenStart}</div>;\n })}\n </div>;\n\n additionalPluginChildrenEnd = <div className={\"flex flex-col gap-2\"}>\n {context.plugins.filter(plugin => plugin.homePage?.additionalChildrenEnd)\n .map((plugin, i) => {\n return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenEnd}</div>;\n })}\n </div>;\n }\n\n return (\n <div id=\"home_page\"\n ref={containerRef}\n className=\"py-2 overflow-auto h-full w-full\">\n <Container maxWidth={\"6xl\"}>\n <div\n className=\"w-full sticky py-4 transition-all duration-400 ease-in-out top-0 z-10 flex flex-row gap-4\"\n style={{ top: direction === \"down\" ? -84 : 0 }}>\n <SearchBar onTextSearch={updateSearchResults}\n placeholder={\"Search collections\"}\n large={false}\n innerClassName={\"w-full\"}\n className={\"w-full flex-grow\"}/>\n {additionalActions}\n </div>\n\n <FavouritesView hidden={Boolean(filteredUrls)}/>\n\n {additionalChildrenStart}\n\n {additionalPluginChildrenStart}\n\n {allGroups.map((group, index) => {\n\n const AdditionalCards: React.ComponentType<PluginHomePageAdditionalCardsProps>[] = [];\n const actionProps: PluginHomePageAdditionalCardsProps = {\n group,\n context\n };\n\n if (context.plugins) {\n context.plugins.forEach(plugin => {\n if (plugin.homePage?.AdditionalCards) {\n AdditionalCards.push(...toArray(plugin.homePage?.AdditionalCards));\n }\n });\n }\n\n const thisGroupCollections = filteredNavigationEntries\n .filter((entry) => entry.group === group || (!entry.group && group === undefined));\n if (thisGroupCollections.length === 0 && AdditionalCards.length === 0)\n return null;\n return (\n <NavigationGroup\n group={group}\n key={`plugin_section_${group}`}>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {thisGroupCollections.map((entry) => (\n <div key={`nav_${entry.group}_${entry.name}`} className=\"col-span-1\">\n <NavigationCollectionCard\n {...entry}\n onClick={() => {\n const event =\n entry.type === \"collection\"\n ? \"home_navigate_to_collection\"\n : entry.type === \"view\"\n ? \"home_navigate_to_view\"\n : \"unmapped_event\";\n context.onAnalyticsEvent?.(event, { path: entry.path });\n }}\n />\n </div>\n ))}\n {AdditionalCards &&\n AdditionalCards.map((AdditionalCard, i) => (\n <div key={`nav_${group}_add_${i}`}>\n <AdditionalCard {...actionProps} />\n </div>\n ))}\n </div>\n </NavigationGroup>\n );\n })}\n\n {additionalPluginSections}\n\n {additionalPluginChildrenEnd}\n\n {additionalChildrenEnd}\n\n </Container>\n </div>\n );\n}\n","import { getIconForWidget } from \"../util\";\nimport { PropertyConfig } from \"../types\";\nimport { getDefaultFieldConfig } from \"../core\";\n\nexport function FieldConfigBadge({ propertyConfig }: { propertyConfig: PropertyConfig | undefined }): React.ReactNode {\n const classes = \"h-8 w-8 p-1 rounded-full shadow text-white\";\n\n const defaultPropertyConfig = typeof propertyConfig?.property === \"object\" ? getDefaultFieldConfig(propertyConfig.property) : undefined;\n\n return <div\n className={classes}\n style={{\n background: propertyConfig?.color ?? defaultPropertyConfig?.color ?? \"#888\"\n }}>\n {propertyConfig?.Icon ? getIconForWidget(propertyConfig, \"medium\") : getIconForWidget(defaultPropertyConfig, \"medium\")}\n </div>\n}\n","import React from \"react\";\nimport { Link as ReactLink } from \"react-router-dom\";\nimport { Button, Typography } from \"@firecms/ui\";\n\nexport function NotFoundPage() {\n\n return (\n <div className=\"flex w-full h-full\">\n <div className=\"m-auto flex items-center flex-col\"\n >\n <Typography variant={\"h4\"} align={\"center\"}\n gutterBottom={true}>\n Page not found\n </Typography>\n <Typography align={\"center\"} gutterBottom={true}>\n This page does not exist or you may not have access to it\n </Typography>\n <Button\n variant={\"text\"}\n component={ReactLink}\n to={\"/\"}>Back to home</Button>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nimport { Button, Dialog, DialogActions, DialogContent, LoadingButton, Typography } from \"@firecms/ui\";\n\nexport function DeleteConfirmationDialog({\n open,\n onAccept,\n onCancel,\n title,\n loading,\n body\n }: {\n open: boolean,\n onAccept: () => void,\n onCancel: () => void,\n loading?: boolean,\n title: React.ReactNode,\n body?: React.ReactNode,\n}) {\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open ? onCancel() : undefined}\n >\n <DialogContent>\n <Typography variant={\"h6\"} className={\"mb-2\"}>{title}</Typography>\n {body}\n </DialogContent>\n\n <DialogActions>\n <Button\n variant={\"text\"}\n onClick={onCancel}\n autoFocus>Cancel</Button>\n\n <LoadingButton\n color=\"primary\"\n type=\"submit\"\n loading={loading}\n onClick={onAccept}\n >\n Ok\n </LoadingButton>\n </DialogActions>\n </Dialog>\n );\n}\n","import React from \"react\";\n\nexport function FireCMSLogo({\n width,\n height,\n className,\n style\n }: {\n width?: string,\n height?: string,\n className?: string,\n style?: React.CSSProperties\n}) {\n return (\n <svg\n width={width ?? \"100%\"} height={height ?? \"100%\"}\n viewBox=\"0 0 599 599\" version=\"1.1\"\n style={style}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <radialGradient cx=\"28.6213569%\" cy=\"43.1133328%\"\n fx=\"28.6213569%\"\n fy=\"43.1133328%\" r=\"71.5003456%\"\n gradientTransform=\"translate(0.286214,0.431133),rotate(3.343450),scale(1.000000,0.996175),translate(-0.286214,-0.431133)\"\n id=\"radialGradient-1\">\n <stop stopColor=\"#FF5B79\" offset=\"0%\"/>\n <stop stopColor=\"#FA5574\" offset=\"28.0930803%\"/>\n <stop stopColor=\"#EC4C51\" offset=\"44.7242531%\"/>\n <stop stopColor=\"#9543C1\" offset=\"71.4578165%\"/>\n <stop stopColor=\"#3857B3\" offset=\"100%\"/>\n </radialGradient>\n <radialGradient cx=\"53.6205516%\" cy=\"47.2473036%\"\n fx=\"53.6205516%\"\n fy=\"47.2473036%\" r=\"50.8229649%\"\n gradientTransform=\"translate(0.536206,0.472473),rotate(90.000000),scale(1.000000,1.206631),translate(-0.536206,-0.472473)\"\n id=\"radialGradient-2\">\n <stop stopColor=\"#68294F\" stopOpacity=\"0\" offset=\"0%\"/>\n <stop stopColor=\"#5E2548\" stopOpacity=\"0.04641108\"\n offset=\"75.3503173%\"/>\n <stop stopColor=\"#0D060B\" stopOpacity=\"0.437431709\"\n offset=\"100%\"/>\n </radialGradient>\n <radialGradient cx=\"53.8605015%\" cy=\"48.1990423%\"\n fx=\"53.8605015%\"\n fy=\"48.1990423%\" r=\"59.9151549%\"\n gradientTransform=\"translate(0.538605,0.481990),rotate(180.000000),scale(1.000000,0.925027),translate(-0.538605,-0.481990)\"\n id=\"radialGradient-3\">\n <stop stopColor=\"#68294F\" stopOpacity=\"0\" offset=\"0%\"/>\n <stop stopColor=\"#5E2548\" stopOpacity=\"0.04641108\"\n offset=\"84.0867343%\"/>\n <stop stopColor=\"#FF0000\" stopOpacity=\"0.567324765\"\n offset=\"100%\"/>\n </radialGradient>\n </defs>\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\"\n fillRule=\"evenodd\">\n <g id=\"firecms_logo\">\n <circle fill=\"url(#radialGradient-1)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n <circle fill=\"url(#radialGradient-2)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n <circle fill=\"url(#radialGradient-3)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n </g>\n </g>\n </svg>\n );\n\n}\n","import React from \"react\";\n\nimport { Link as ReactLink } from \"react-router-dom\";\nimport { ErrorBoundary } from \"../components\";\nimport {\n Avatar,\n cn,\n DarkModeIcon,\n IconButton,\n LightModeIcon,\n LogoutIcon,\n Menu,\n MenuItem,\n Skeleton,\n Typography\n} from \"@firecms/ui\";\nimport { useAuthController, useLargeLayout, useModeController, useNavigationController } from \"../hooks\";\nimport { User } from \"../types\";\n\nexport type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {\n title: string;\n /**\n * A component that gets rendered on the upper side of the main toolbar\n */\n endAdornment?: React.ReactNode;\n\n startAdornment?: React.ReactNode;\n\n dropDownActions?: React.ReactNode;\n\n includeDrawer?: boolean;\n\n drawerOpen: boolean;\n\n className?: string;\n\n style?: React.CSSProperties;\n\n user?: User;\n} & ADDITIONAL_PROPS;\n\n/**\n * This component renders the main app bar of FireCMS.\n * You will likely not need to use this component directly.\n *\n * @param title\n * @param toolbarExtraWidget\n * @param drawerOpen\n * @constructor\n */\nexport const FireCMSAppBar = function FireCMSAppBar({\n title,\n endAdornment,\n startAdornment,\n drawerOpen,\n dropDownActions,\n includeDrawer,\n className,\n style,\n user: userProp\n }: FireCMSAppBarProps) {\n const navigation = useNavigationController();\n\n const authController = useAuthController();\n const {\n mode,\n toggleMode\n } = useModeController();\n\n const largeLayout = useLargeLayout();\n\n const user = userProp ?? authController.user;\n\n let avatarComponent: JSX.Element;\n if (user && user.photoURL) {\n avatarComponent = <Avatar\n src={user.photoURL}/>;\n } else if (user === undefined || authController.initialLoading) {\n avatarComponent = <div className={\"p-1 flex justify-center\"}>\n <Skeleton className={\"w-10 h-10 rounded-full\"}/>\n </div>;\n } else {\n const initial = user?.displayName\n ? user.displayName[0].toUpperCase()\n : (user?.email ? user.email[0].toUpperCase() : \"A\");\n avatarComponent = <Avatar>{initial}</Avatar>;\n }\n\n return (\n <div\n style={style}\n className={cn(\"pr-2\",\n {\n \"ml-[17rem]\": drawerOpen && largeLayout,\n \"ml-16\": includeDrawer && !(drawerOpen && largeLayout) && !startAdornment,\n \"h-16\": true,\n \"z-10\": largeLayout,\n \"transition-all\": true,\n \"ease-in\": true,\n \"duration-75\": true,\n \"w-full\": !includeDrawer,\n \"w-[calc(100%-64px)]\": includeDrawer && !(drawerOpen && largeLayout),\n \"w-[calc(100%-17rem)]\": includeDrawer && (drawerOpen && largeLayout),\n \"duration-150\": drawerOpen && largeLayout,\n fixed: true,\n },\n className)}>\n\n <div className=\"flex flex-row gap-2 px-4 h-full items-center\">\n\n {startAdornment}\n\n {navigation && <div className=\"mr-8 hidden lg:block\">\n <ReactLink\n className=\"visited:text-inherit visited:dark:text-inherit\"\n to={navigation?.basePath ?? \"/\"}\n >\n <Typography variant=\"subtitle1\"\n noWrap\n className={\"ml-2 !font-medium\"}>\n {title}\n </Typography>\n </ReactLink>\n </div>}\n\n <div className={\"flex-grow\"}/>\n\n {endAdornment &&\n <ErrorBoundary>\n {endAdornment}\n </ErrorBoundary>}\n\n <IconButton\n color=\"inherit\"\n aria-label=\"Open drawer\"\n onClick={toggleMode}\n size=\"large\">\n {mode === \"dark\"\n ? <DarkModeIcon/>\n : <LightModeIcon/>}\n </IconButton>\n\n <Menu trigger={avatarComponent}>\n\n {dropDownActions}\n\n {!dropDownActions && <MenuItem onClick={authController.signOut}>\n <LogoutIcon/>\n Log Out\n </MenuItem>}\n\n </Menu>\n\n </div>\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\n\nimport { getHashValue } from \"../util\";\nimport useMeasure from \"react-use-measure\";\nimport {\n AddIcon,\n Button,\n ContentCopyIcon,\n fieldBackgroundHoverMixin,\n IconButton,\n Menu,\n MenuItem,\n MoreVertIcon,\n RemoveIcon,\n Tooltip\n} from \"@firecms/ui\";\n\ninterface ArrayContainerProps<T> {\n droppableId: string;\n value: T[];\n addLabel: string;\n buildEntry: (index: number, internalId: number) => React.ReactNode;\n disabled?: boolean;\n size?: \"small\" | \"medium\";\n onInternalIdAdded?: (id: number) => void;\n includeAddButton?: boolean;\n newDefaultEntry: T;\n onValueChange: (value: T[]) => void\n}\n\nconst buildIdsMap = (value: any[]) =>\n value && Array.isArray(value) && value.length > 0\n ? value.map((v, index) => {\n if (!v) return {};\n return ({\n [getHashValue(v) + index]: getRandomId()\n });\n }).reduce((a, b) => ({ ...a, ...b }), {})\n : {}\n\n/**\n * @group Form custom fields\n */\nexport function ArrayContainer<T>({\n droppableId,\n addLabel,\n value,\n disabled = false,\n buildEntry,\n size,\n onInternalIdAdded,\n includeAddButton,\n newDefaultEntry,\n onValueChange\n }: ArrayContainerProps<T>) {\n\n const hasValue = value && Array.isArray(value) && value.length > 0;\n\n // Used to track the ids that have displayed the initial show animation\n const internalIdsRef = useRef<Record<string, number>>(buildIdsMap(value));\n\n const [internalIds, setInternalIds] = useState<number[]>(\n hasValue\n ? Object.values(internalIdsRef.current)\n : []);\n\n useEffect(() => {\n if (hasValue && value && value.length !== internalIds.length) {\n const newInternalIds = value.map((v, index) => {\n const hashValue = getHashValue(v) + index;\n if (hashValue in internalIdsRef.current) {\n return internalIdsRef.current[hashValue];\n } else {\n const newInternalId = getRandomId();\n internalIdsRef.current[hashValue] = newInternalId;\n return newInternalId;\n }\n });\n setInternalIds(newInternalIds);\n }\n }, [hasValue, internalIds.length, value]);\n\n const insertInEnd = (e: React.SyntheticEvent) => {\n e.preventDefault();\n if (disabled) return;\n const id = getRandomId();\n const newIds: number[] = [...internalIds, id];\n if (onInternalIdAdded)\n onInternalIdAdded(id);\n setInternalIds(newIds);\n onValueChange([...(value ?? []), newDefaultEntry]);\n };\n\n const remove = (index: number) => {\n const newIds = [...internalIds];\n newIds.splice(index, 1);\n setInternalIds(newIds);\n onValueChange(value.filter((_, i) => i !== index));\n };\n\n const copy = (index: number) => {\n const id = getRandomId();\n const copyingItem = value[index];\n const newIds: number[] = [\n ...internalIds.splice(0, index + 1),\n id,\n ...internalIds.splice(index + 1, internalIds.length - index - 1)];\n if (onInternalIdAdded)\n onInternalIdAdded(id);\n setInternalIds(newIds);\n // insert value in index + 1\n onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);\n };\n\n const onDragEnd = (result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const sourceIndex = result.source.index;\n const destinationIndex = result.destination.index;\n\n const newIds = [...internalIds];\n const temp = newIds[sourceIndex];\n newIds[sourceIndex] = newIds[destinationIndex];\n newIds[destinationIndex] = temp;\n setInternalIds(newIds);\n\n onValueChange(arrayMove(value, sourceIndex, destinationIndex));\n };\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={droppableId}\n renderClone={(provided, snapshot, rubric) => {\n const index = rubric.source.index;\n const internalId = internalIds[index];\n return (\n <ArrayContainerItem\n provided={provided}\n internalId={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n isDragging={snapshot.isDragging}\n />\n );\n }}\n >\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}>\n {hasValue && internalIds.map((internalId: number, index: number) => {\n return (\n <Draggable\n key={`array_field_${internalId}`}\n draggableId={`array_field_${internalId}`}\n isDragDisabled={disabled}\n index={index}>\n {(provided, snapshot) => (\n <ArrayContainerItem\n provided={provided}\n internalId={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n isDragging={snapshot.isDragging}\n />\n )}\n </Draggable>\n );\n })}\n\n {droppableProvided.placeholder}\n\n {includeAddButton && <div className=\"py-4 justify-center text-left\">\n <Button\n variant={\"text\"}\n size={size === \"small\" ? \"small\" : \"medium\"}\n color=\"primary\"\n disabled={disabled}\n startIcon={<AddIcon/>}\n onClick={insertInEnd}>\n {addLabel ?? \"Add\"}\n </Button>\n </div>}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n\ntype ArrayContainerItemProps = {\n provided: DraggableProvided,\n index: number,\n internalId: number,\n size?: \"small\" | \"medium\",\n disabled: boolean,\n buildEntry: (index: number, internalId: number) => React.ReactNode,\n remove: (index: number) => void,\n copy: (index: number) => void,\n isDragging: boolean,\n};\n\nexport function ArrayContainerItem({\n provided,\n index,\n internalId,\n size,\n disabled,\n buildEntry,\n remove,\n copy,\n isDragging\n }: ArrayContainerItemProps) {\n\n const [measureRef, bounds] = useMeasure();\n\n const measuring = size !== \"small\" && bounds.height === 0;\n const menuOverflow = size !== \"small\" && bounds.height < 100;\n\n const [onHover, setOnHover] = React.useState(false);\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n return <div\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n ref={provided.innerRef}\n {...provided.draggableProps}\n style={provided.draggableProps.style}\n className={`${\n (isDragging || onHover) ? fieldBackgroundHoverMixin : \"\"\n } mb-1 rounded-md opacity-100`}\n >\n <div\n className=\"flex items-start\">\n <div ref={measureRef}\n className=\"flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark\"\n >\n {buildEntry(index, internalId)}\n </div>\n <ArrayItemOptions direction={size === \"small\" ? \"row\" : \"column\"}\n disabled={disabled}\n remove={remove}\n index={index}\n provided={provided}\n measuring={measuring}\n contentOverflow={menuOverflow}\n copy={copy}/>\n </div>\n </div>;\n}\n\nexport function ArrayItemOptions({\n direction,\n disabled,\n remove,\n index,\n provided,\n copy,\n contentOverflow,\n measuring\n }: {\n direction?: \"row\" | \"column\",\n contentOverflow: boolean,\n measuring: boolean,\n disabled: boolean,\n remove: (index: number) => void,\n index: number,\n provided: any,\n copy: (index: number) => void\n}) {\n\n return <div className={`p-1 flex ${direction === \"row\" ? \"flex-row-reverse\" : \"flex-col\"} items-center`}\n {...provided.dragHandleProps}\n >\n <Tooltip\n side={direction === \"column\" ? \"left\" : undefined}\n title=\"Move\">\n <IconButton\n size=\"small\"\n disabled={disabled}\n className={`cursor-${disabled ? \"inherit\" : \"grab\"}`}>\n {/* TODO: for some reason, the icon as a span does not work with Drag and Drop\n */}\n <svg focusable=\"false\"\n fill={\"currentColor\"}\n aria-hidden=\"true\" viewBox=\"0 0 24 24\">\n <path d=\"M20 9H4v2h16V9zM4 15h16v-2H4v2z\"></path>\n </svg>\n {/*<DragHandleIcon*/}\n {/* size={\"small\"}*/}\n {/* color={disabled ? \"disabled\" : \"inherit\"}/>*/}\n </IconButton>\n </Tooltip>\n\n {!measuring && !contentOverflow && <>\n <Tooltip\n title=\"Remove\"\n side={direction === \"column\" ? \"left\" : undefined}>\n <IconButton\n size=\"small\"\n aria-label=\"remove\"\n disabled={disabled}\n onClick={() => remove(index)}>\n <RemoveIcon\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n\n <Tooltip\n side={direction === \"column\" ? \"left\" : undefined}\n title=\"Copy in this position\">\n <IconButton\n size=\"small\"\n aria-label=\"copy\"\n disabled={disabled}\n onClick={() => copy(index)}>\n <ContentCopyIcon\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </>}\n\n {!measuring && contentOverflow && <>\n\n <Menu\n trigger={<IconButton size={\"small\"}>\n <MoreVertIcon\n size={\"small\"}/>\n </IconButton>}\n >\n\n <MenuItem dense onClick={() => remove(index)}>\n <RemoveIcon size={\"small\"}/>\n Remove\n </MenuItem>\n <MenuItem dense onClick={() => copy(index)}>\n <ContentCopyIcon size={\"small\"}/>\n Copy\n </MenuItem>\n\n </Menu>\n </>}\n </div>;\n}\n\nfunction arrayMove(value: any[], sourceIndex: number, destinationIndex: number) {\n const result = Array.from(value);\n const [removed] = result.splice(sourceIndex, 1);\n result.splice(destinationIndex, 0, removed);\n return result;\n}\n\nexport function getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n","import React, { useCallback, useMemo } from \"react\";\n\nimport { Entity, EntityCollection, EntityReference, FilterValues } from \"../types\";\nimport { getReferenceFrom } from \"../util\";\nimport { PreviewSize, ReferencePreview } from \"../preview\";\nimport { useNavigationController, useReferenceDialog } from \"../hooks\";\nimport { Button, cn } from \"@firecms/ui\";\n\nexport type ReferenceWidgetProps<M extends Record<string, any>> = {\n name?: string,\n multiselect?: boolean,\n value: EntityReference<M> | EntityReference<M>[] | null,\n onReferenceSelected?: (params: {\n reference: EntityReference<M> | null,\n entity: Entity<M> | null\n }) => void,\n onMultipleReferenceSelected?: (params: {\n references: EntityReference<M>[] | null,\n entities: Entity<M>[] | null\n }) => void,\n path: string,\n disabled?: boolean,\n previewProperties?: string[];\n /**\n * Allow selection of entities that pass the given filter only.\n */\n forceFilter?: FilterValues<string>;\n size: PreviewSize;\n className?: string;\n};\n\n/**\n * This field allows selecting reference/s.\n */\nexport function ReferenceWidget<M extends Record<string, any>>({\n name,\n multiselect = false,\n path,\n disabled,\n value,\n onReferenceSelected,\n onMultipleReferenceSelected,\n previewProperties,\n forceFilter,\n size,\n className\n }: ReferenceWidgetProps<M>) {\n\n const navigationController = useNavigationController();\n\n const collection: EntityCollection | undefined = useMemo(() => {\n return navigationController.getCollection(path);\n }, [path, navigationController]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${path}`);\n }\n\n const onSingleEntitySelected = useCallback((entity: Entity<M> | null) => {\n if (disabled)\n return;\n if (onReferenceSelected) {\n const reference = entity ? getReferenceFrom(entity) : null;\n onReferenceSelected?.({ reference, entity });\n }\n }, [disabled, onReferenceSelected]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<M>[]) => {\n if (disabled)\n return;\n if (onMultipleReferenceSelected) {\n const references = entities ? entities.map(e => getReferenceFrom(e)) : null;\n onMultipleReferenceSelected({ references, entities });\n }\n }, [disabled, onReferenceSelected]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect,\n path,\n collection,\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n forceFilter\n }\n );\n\n const clearValue = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (multiselect) {\n onMultipleEntitiesSelected([]);\n } else {\n onSingleEntitySelected(null);\n }\n }, [onReferenceSelected]);\n\n let child: React.ReactNode;\n\n const onEntryClick = () => {\n if (disabled)\n return;\n referenceDialogController.open();\n };\n\n if (Array.isArray(value)) {\n child = <div className={\"flex flex-col gap-4\"}>\n {value.map((ref, index) => {\n return <ReferencePreview\n key={`reference_preview_${index}`}\n onClick={onEntryClick}\n reference={ref}\n disabled={disabled}\n previewProperties={previewProperties}\n size={size}/>\n })}\n </div>\n } else if (value instanceof EntityReference) {\n child = <ReferencePreview\n reference={value}\n onClick={onEntryClick}\n disabled={disabled}\n previewProperties={previewProperties}\n size={size}/>\n\n }\n return <div className={cn(\"text-sm font-medium text-gray-500\",\n \"min-w-80 flex flex-col gap-4\",\n \"relative transition-colors duration-200 ease-in rounded font-medium\",\n disabled ? \"bg-opacity-50\" : \"hover:bg-opacity-75\",\n \"text-opacity-50 dark:text-white dark:text-opacity-50\",\n className\n )}\n >\n\n {child}\n {!value && <div className=\"justify-center text-left\">\n <Button variant=\"outlined\"\n color=\"primary\"\n disabled={disabled}\n onClick={onEntryClick}>\n Edit {name}\n </Button>\n </div>}\n\n </div>;\n}\n","import React from \"react\";\n\ninterface LabelWithIconProps {\n icon: React.ReactNode;\n title?: string;\n small?: boolean;\n className?: string;\n required?: boolean;\n}\n\n/**\n * Render the label of with an icon and the title of a property\n * @group Form custom fields\n */\nexport function LabelWithIcon({\n icon,\n title,\n small,\n className,\n required\n }: LabelWithIconProps) {\n return (\n <span\n className={`inline-flex items-center my-0.5 ${small ? \"gap-1\" : \"gap-2\"} ${className ?? \"\"}`}>\n\n {icon}\n\n <span\n className={`font-medium text-${small ? \"base\" : \"sm\"} origin-top-left transform ${small ? \"translate-x-2 scale-75\" : \"\"}`}>{(title ?? \"\") + (required ? \" *\" : \"\")}</span>\n\n </span>\n );\n}\n","import { useSideDialogsController } from \"./useSideDialogsController\";\nimport { ReferenceSelectionInner, ReferenceSelectionInnerProps } from \"../components\";\nimport { useCallback } from \"react\";\nimport { useNavigationController } from \"./useNavigationController\";\n\n/**\n * This hook is used to open a side dialog that allows the selection\n * of entities under a given path.\n * You can use it in custom views for selecting entities.\n * You need to specify the path of the target collection at least.\n * If your collection is not defined in your top collection configuration\n * (in your `FireCMS` component), you need to specify explicitly.\n * This is the same hook used internally when a reference property is defined.\n * @group Hooks and utilities\n */\nexport function useReferenceDialog<M extends Record<string, any>>(referenceDialogProps: Omit<ReferenceSelectionInnerProps<M>, \"path\"> & {\n path?: string | false;\n onClose?: () => void;\n}): { open: () => void; close: () => void } {\n\n const navigation = useNavigationController();\n const sideDialogsController = useSideDialogsController();\n\n const open = useCallback(() => {\n if (referenceDialogProps.path) {\n let usedCollection = referenceDialogProps.collection;\n if (!usedCollection)\n usedCollection = navigation.getCollection(referenceDialogProps.path);\n if (!usedCollection)\n throw Error(\"Not able to resolve the collection in useReferenceDialog\");\n sideDialogsController.open({\n key: `reference_${referenceDialogProps.path}`,\n component:\n <ReferenceSelectionInner\n collection={usedCollection}\n {...referenceDialogProps as ReferenceSelectionInnerProps<M>}/>,\n width: \"90vw\",\n onClose: () => {\n referenceDialogProps.onClose?.();\n }\n });\n } else {\n throw Error(\"useReferenceDialog: You are trying to open a reference dialog, but have not declared the `path`\")\n }\n }, [navigation, referenceDialogProps, sideDialogsController]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n return {\n open,\n close\n }\n\n}\n","import { useEffect } from \"react\";\n\nconst fireCMSLogo = \"data:image/png;base64,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\\n\";\n\n/**\n * Internal hook to handle the browser title and icon\n * @param name\n * @param logo\n */\nexport function useBrowserTitleAndIcon(name: string, logo?: string) {\n useEffect(() => {\n if (document) {\n document.title = `${name} - FireCMS`;\n let link = document.querySelector(\"link[rel~='icon']\");\n if (!link) {\n link = document.createElement(\"link\");\n // @ts-ignore\n link.rel = \"icon\";\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n }\n // @ts-ignore\n link.href = logo ?? fireCMSLogo;\n }\n }, [name, logo]);\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Entity,\n EntityCollection,\n EntityCustomView,\n EntityStatus,\n EntityValues,\n FireCMSPlugin,\n FormContext,\n User\n} from \"../types\";\nimport { CircularProgressCenter, EntityCollectionView, EntityPreview, ErrorBoundary, } from \"../components\";\nimport {\n canEditEntity,\n fullPathToCollectionSegments,\n removeInitialAndTrailingSlashes,\n resolveDefaultSelectedView,\n resolveEntityView,\n useDebounce\n} from \"../util\";\n\nimport {\n saveEntityWithCallbacks,\n useAuthController,\n useDataSource,\n useEntityFetch,\n useFireCMSContext,\n useSideEntityController,\n useSnackbarController\n} from \"../hooks\";\nimport { EntityForm } from \"../form\";\nimport { CircularProgress, CloseIcon, cn, defaultBorderMixin, IconButton, Tab, Tabs, Typography } from \"@firecms/ui\";\nimport { EntityFormSaveParams } from \"../form/EntityForm\";\nimport { FORM_CONTAINER_WIDTH } from \"./common\";\nimport { useSideDialogContext } from \"../core\";\n\nconst MAIN_TAB_VALUE = \"main_##Q$SC^#S6\";\n\nexport interface EntityViewProps<M extends Record<string, any>> {\n path: string;\n collection: EntityCollection<M>;\n entityId?: string;\n copy?: boolean;\n selectedSubPath?: string;\n parentCollectionIds: string[];\n formWidth?: number | string;\n onValuesAreModified: (modified: boolean) => void;\n onUpdate?: (params: { entity: Entity<any> }) => void;\n onClose?: () => void;\n}\n\n/**\n * This is the default view that is used as the content of a side panel when\n * an entity is opened.\n * You probably don't want to use this view directly since it is bound to the\n * side panel. Instead, you might want to use {@link EntityForm} or {@link EntityCollectionView}\n */\nexport function EntityView<M extends Record<string, any>, UserType extends User>({\n path,\n entityId,\n selectedSubPath,\n copy,\n collection,\n parentCollectionIds,\n onValuesAreModified,\n formWidth,\n onUpdate,\n onClose\n }: EntityViewProps<M>) {\n\n\n if (collection.customId && collection.formAutoSave) {\n console.warn(`The collection ${collection.path} has customId and formAutoSave enabled. This is not supported and formAutoSave will be ignored`);\n }\n\n const [saving, setSaving] = useState(false);\n /**\n * These are the values that are being saved. They are debounced.\n * We use this only when autoSave is enabled.\n */\n const [valuesToBeSaved, setValuesToBeSaved] = useState<EntityValues<M> | undefined>(undefined);\n useDebounce(valuesToBeSaved, () => {\n if (valuesToBeSaved)\n saveEntity({\n entityId: usedEntity?.id,\n collection,\n path,\n values: valuesToBeSaved,\n closeAfterSave: false\n });\n }, false, 2000);\n\n // const largeLayout = useLargeLayout();\n // const largeLayoutTabSelected = useRef(!largeLayout);\n\n const resolvedFormWidth: string = typeof formWidth === \"number\" ? `${formWidth}px` : formWidth ?? FORM_CONTAINER_WIDTH;\n\n const dataSource = useDataSource();\n const sideDialogContext = useSideDialogContext();\n const sideEntityController = useSideEntityController();\n const snackbarController = useSnackbarController();\n const context = useFireCMSContext();\n const authController = useAuthController<UserType>();\n\n const [formContext, setFormContext] = useState<FormContext<M> | undefined>(undefined);\n\n const [status, setStatus] = useState<EntityStatus>(copy ? \"copy\" : (entityId ? \"existing\" : \"new\"));\n\n const modifiedValuesRef = useRef<EntityValues<M> | undefined>(undefined);\n const modifiedValues = modifiedValuesRef.current;\n\n const subcollections = (collection.subcollections ?? []).filter(c => !c.hideFromNavigation);\n const subcollectionsCount = subcollections?.length ?? 0;\n const customViews = collection.entityViews;\n const customViewsCount = customViews?.length ?? 0;\n const autoSave = collection.formAutoSave && !collection.customId;\n\n const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0;\n\n const defaultSelectedView = selectedSubPath ?? resolveDefaultSelectedView(\n collection ? collection.defaultSelectedView : undefined,\n {\n status,\n entityId\n }\n );\n\n const selectedTabRef = useRef<string>(defaultSelectedView ?? MAIN_TAB_VALUE);\n\n const mainViewVisible = selectedTabRef.current === MAIN_TAB_VALUE;\n\n const {\n entity,\n dataLoading,\n // eslint-disable-next-line no-unused-vars\n dataLoadingError\n } = useEntityFetch<M, UserType>({\n path,\n entityId,\n collection,\n useCache: false\n });\n\n const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);\n const [readOnly, setReadOnly] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n if (entity)\n setUsedEntity(entity);\n }, [entity]);\n\n useEffect(() => {\n if (status === \"new\") {\n setReadOnly(false);\n } else {\n const editEnabled = usedEntity ? canEditEntity(collection, authController, fullPathToCollectionSegments(path), usedEntity ?? null) : false;\n if (usedEntity)\n setReadOnly(!editEnabled);\n }\n }, [authController, usedEntity, status]);\n\n // useEffect(() => {\n // if (largeLayoutTabSelected.current === largeLayout)\n // return;\n // // open first tab by default in large layouts\n // if (selectedSubPath !== defaultSelectedView) {\n // console.log(\"Replacing url 1\", defaultSelectedView);\n // sideEntityController.replace({\n // path,\n // entityId,\n // selectedSubPath: defaultSelectedView,\n // updateUrl: true,\n // collection\n // });\n // }\n // largeLayoutTabSelected.current = largeLayout;\n // }, [defaultSelectedView, largeLayout, selectedSubPath]);\n\n const onPreSaveHookError = useCallback((e: Error) => {\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error before saving: \" + e?.message\n });\n console.error(e);\n }, [snackbarController]);\n\n const onSaveSuccessHookError = useCallback((e: Error) => {\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error after saving (entity is saved): \" + e?.message\n });\n console.error(e);\n }, [snackbarController]);\n\n const onSaveSuccess = (updatedEntity: Entity<M>, closeAfterSave: boolean) => {\n\n setSaving(false);\n if (!autoSave)\n snackbarController.open({\n type: \"success\",\n message: `${collection.singularName ?? collection.name}: Saved correctly`\n });\n\n setUsedEntity(updatedEntity);\n setStatus(\"existing\");\n\n onValuesAreModified(false);\n\n if (onUpdate)\n onUpdate({ entity: updatedEntity });\n\n if (closeAfterSave) {\n sideDialogContext.setBlocked(false);\n sideDialogContext.close(true);\n onClose?.();\n } else if (status !== \"existing\") {\n sideEntityController.replace({\n path,\n entityId: updatedEntity.id,\n selectedSubPath: selectedTabRef.current,\n updateUrl: true,\n collection\n });\n }\n\n };\n\n const onSaveFailure = useCallback((e: Error) => {\n\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error saving: \" + e?.message\n });\n\n console.error(\"Error saving entity\", path, entityId);\n console.error(e);\n }, [entityId, path, snackbarController]);\n\n const saveEntity = ({\n values,\n previousValues,\n closeAfterSave,\n entityId,\n collection,\n path\n }: {\n collection: EntityCollection<M>,\n path: string,\n entityId: string | undefined,\n values: M,\n previousValues?: M,\n closeAfterSave: boolean,\n }) => {\n setSaving(true);\n saveEntityWithCallbacks({\n path,\n entityId,\n values,\n previousValues,\n collection,\n status,\n dataSource,\n context,\n onSaveSuccess: (updatedEntity: Entity<M>) => onSaveSuccess(updatedEntity, closeAfterSave),\n onSaveFailure,\n onPreSaveHookError,\n onSaveSuccessHookError\n }).then();\n };\n\n const onSaveEntityRequest = async ({\n collection,\n path,\n entityId,\n values,\n previousValues,\n closeAfterSave,\n autoSave\n }: EntityFormSaveParams<M>): Promise<void> => {\n if (!status)\n return;\n\n if (autoSave) {\n setValuesToBeSaved(values);\n } else {\n saveEntity({\n collection,\n path,\n entityId,\n values,\n previousValues,\n closeAfterSave\n });\n }\n };\n\n const resolvedEntityViews = customViews ? customViews\n .map(e => resolveEntityView(e, context.entityViews))\n .filter(Boolean) as EntityCustomView[]\n : [];\n const customViewsView: React.ReactNode[] | undefined = customViews && resolvedEntityViews\n .map(\n (customView, colIndex) => {\n if (!customView)\n return null;\n if (selectedTabRef.current !== customView.key)\n return null;\n const Builder = customView.Builder;\n if (!Builder) {\n console.error(\"customView.Builder is not defined\");\n return null;\n }\n return <div\n className={cn(defaultBorderMixin,\n \"relative flex-grow w-full h-full overflow-auto \")}\n key={`custom_view_${customView.key}`}\n role=\"tabpanel\">\n <ErrorBoundary>\n {formContext && <Builder\n collection={collection}\n entity={usedEntity}\n modifiedValues={modifiedValues ?? usedEntity?.values}\n formContext={formContext}\n />}\n </ErrorBoundary>\n </div>;\n }\n ).filter(Boolean);\n\n const globalLoading = (dataLoading && !usedEntity) ||\n ((!usedEntity || readOnly === undefined) && (status === \"existing\" || status === \"copy\"));\n\n const loading = globalLoading || saving;\n\n const subCollectionsViews = subcollections && subcollections.map(\n (subcollection, colIndex) => {\n const subcollectionId = subcollection.id ?? subcollection.path;\n const fullPath = usedEntity ? `${path}/${usedEntity?.id}/${removeInitialAndTrailingSlashes(subcollectionId)}` : undefined;\n if (selectedTabRef.current !== subcollectionId)\n return null;\n return (\n <div\n className={\"relative flex-grow h-full overflow-auto w-full\"}\n key={`subcol_${subcollectionId}`}\n role=\"tabpanel\">\n\n {loading && <CircularProgressCenter/>}\n\n {!globalLoading &&\n (usedEntity && fullPath\n ? <EntityCollectionView\n fullPath={fullPath}\n parentCollectionIds={[...parentCollectionIds, collection.id]}\n isSubCollection={true}\n {...subcollection}/>\n : <div\n className=\"flex items-center justify-center w-full h-full p-3\">\n <Typography variant={\"label\"}>\n You need to save your entity before\n adding additional collections\n </Typography>\n </div>)\n }\n\n </div>\n );\n }\n ).filter(Boolean);\n\n const onDiscard = useCallback(() => {\n onValuesAreModified(false);\n }, []);\n\n const onSideTabClick = (value: string) => {\n selectedTabRef.current = value;\n sideEntityController.replace({\n path,\n entityId,\n selectedSubPath: value === MAIN_TAB_VALUE ? undefined : value,\n updateUrl: true,\n collection\n });\n };\n\n const onValuesChanged = useCallback((values?: EntityValues<M>) => {\n modifiedValuesRef.current = values;\n }, []);\n\n // eslint-disable-next-line n/handle-callback-err\n const onIdUpdateError = useCallback((error: any) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error updating id, check the console\"\n });\n }, []);\n\n const onIdChange = useCallback((id: string) => {\n setUsedEntity((prevEntity) => prevEntity\n ? {\n ...prevEntity,\n id\n }\n : undefined);\n }, []);\n\n const onModified = (dirty: boolean) => {\n if (!autoSave)\n onValuesAreModified(dirty);\n }\n\n function buildForm() {\n const plugins = context.plugins;\n let form = <EntityForm\n status={status}\n path={path}\n collection={collection}\n onEntitySaveRequested={onSaveEntityRequest}\n onDiscard={onDiscard}\n onValuesChanged={onValuesChanged}\n onModified={onModified}\n entity={usedEntity}\n onIdChange={onIdChange}\n onFormContextChange={setFormContext}\n hideId={collection.hideIdFromForm}\n autoSave={autoSave}\n onIdUpdateError={onIdUpdateError}\n />;\n if (plugins) {\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.form?.provider) {\n form = (\n <plugin.form.provider.Component\n status={status}\n path={path}\n collection={collection}\n onDiscard={onDiscard}\n onValuesChanged={onValuesChanged}\n onModified={onModified}\n entity={usedEntity}\n context={context}\n formContext={formContext}\n {...plugin.form.provider.props}>\n {form}\n </plugin.form.provider.Component>\n );\n }\n });\n }\n return <ErrorBoundary>{form}</ErrorBoundary>;\n }\n\n const form = (readOnly === undefined)\n ? <></>\n : (!readOnly\n ? buildForm()\n : (\n <>\n <Typography\n className={\"mt-16 mb-8 mx-8\"}\n variant={\"h4\"}>{collection.singularName ?? collection.name}\n </Typography>\n <EntityPreview\n className={\"px-12\"}\n entity={usedEntity as Entity<M>}\n path={path}\n collection={collection}/>\n </>\n ));\n\n const subcollectionTabs = subcollections && subcollections.map(\n (subcollection) =>\n <Tab\n className=\"text-sm min-w-[140px]\"\n value={subcollection.id}\n key={`entity_detail_collection_tab_${subcollection.name}`}>\n {subcollection.name}\n </Tab>\n );\n\n const customViewTabs = resolvedEntityViews.map(\n (view) =>\n\n <Tab\n className=\"text-sm min-w-[140px]\"\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.name}\n </Tab>\n );\n\n return (\n <div\n className=\"flex flex-col h-full w-full transition-width duration-250 ease-in-out\">\n {\n <>\n\n <div\n className={cn(defaultBorderMixin, \"no-scrollbar border-b pl-2 pr-2 pt-1 flex items-end overflow-scroll bg-gray-50 dark:bg-gray-950\")}>\n\n <div\n className=\"pb-1 self-center\">\n <IconButton onClick={() => {\n onClose?.();\n return sideDialogContext.close(false);\n }}\n size=\"large\">\n <CloseIcon/>\n </IconButton>\n </div>\n\n <div className={\"flex-grow\"}/>\n\n {globalLoading && <div\n className=\"self-center\">\n <CircularProgress size={\"small\"}/>\n </div>}\n\n <Tabs\n value={selectedTabRef.current}\n onValueChange={(value) => {\n onSideTabClick(value);\n }}\n className=\"pl-4 pr-4 pt-0\">\n\n <Tab\n disabled={!hasAdditionalViews}\n value={MAIN_TAB_VALUE}\n className={`${\n !hasAdditionalViews ? \"hidden\" : \"\"\n } text-sm min-w-[140px]`}\n >{collection.singularName ?? collection.name}</Tab>\n\n {customViewTabs}\n\n {subcollectionTabs}\n </Tabs>\n\n </div>\n\n <div\n className={\"flex-grow h-full flex overflow-auto flex-row w-full \"}\n style={{\n // width: `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedFormWidth})`,\n // maxWidth: \"100%\",\n // [`@media (max-width: ${resolvedFormWidth})`]: {\n // width: resolvedFormWidth\n // }\n }}>\n\n <div\n role=\"tabpanel\"\n hidden={!mainViewVisible}\n id={`form_${path}`}\n className={\" w-full\"}>\n\n {globalLoading\n ? <CircularProgressCenter/>\n : form}\n\n </div>\n\n {customViewsView}\n\n {subCollectionsViews}\n\n </div>\n\n </>\n }\n\n </div>\n );\n}\n","import React, { useCallback } from \"react\";\nimport { Blocker, Transition } from \"history\";\nimport { UNSAFE_NavigationContext, useNavigate } from \"react-router-dom\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport function useNavigationUnsavedChangesDialog(when: boolean, onSuccess: () => void):\n {\n navigationWasBlocked: boolean,\n handleCancel: () => void,\n handleOk: () => void\n } {\n\n const [nextLocation, setNextLocation] = React.useState<any | undefined>();\n const { navigator } = React.useContext(UNSAFE_NavigationContext);\n\n const navigate = useNavigate();\n\n const handleCancel = () => {\n setNextLocation(undefined);\n };\n\n const handleOk = () => {\n onSuccess();\n setNextLocation(undefined);\n navigate(-1);\n };\n\n const blocker: Blocker = useCallback(({\n action,\n location: nextLocation,\n retry\n }) => {\n switch (action) {\n case \"REPLACE\": {\n retry();\n return;\n }\n case \"POP\": {\n setNextLocation(nextLocation);\n }\n }\n }, []);\n\n React.useEffect(() => {\n if (!when) return;\n if (nextLocation) return;\n if (!(\"block\" in navigator)) return;\n const unblock = (navigator as any).block((tx: Transition) => {\n const autoUnblockingTx = {\n ...tx,\n retry() {\n unblock();\n tx.retry();\n }\n };\n blocker(autoUnblockingTx);\n });\n\n return unblock;\n }, [navigator, blocker, when, nextLocation]);\n\n return {\n navigationWasBlocked: Boolean(nextLocation),\n handleCancel,\n handleOk\n };\n}\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n >\n <DialogContent>\n <Typography variant={\"h6\"}>{title}</Typography>\n\n {body}\n\n <Typography>\n Are you sure you want to leave this page?\n </Typography>\n\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { useSideDialogsController } from \"../hooks\";\nimport { SideDialogPanelProps } from \"../types\";\nimport { Sheet } from \"@firecms/ui\";\nimport { UnsavedChangesDialog, useNavigationUnsavedChangesDialog } from \"../internal/useUnsavedChangesDialog\";\nimport { ErrorBoundary } from \"../components\";\n\nexport type SideDialogContextProps = {\n blocked: boolean,\n setBlocked: (blocked: boolean) => void,\n setBlockedNavigationMessage: (message?: React.ReactNode) => void,\n width?: string,\n close: (force?: boolean) => void\n}\n\nconst SideDialogContext = React.createContext<SideDialogContextProps>({\n width: \"\",\n blocked: false,\n setBlocked: (blocked: boolean) => {\n },\n setBlockedNavigationMessage: (message?: React.ReactNode) => {\n },\n close: () => {\n }\n});\n\n/**\n * This hook is used to access the properties of a particular side dialog,\n * in contrast with {@link useSideDialogsController} which handles the\n * state of all the dialogs.\n */\nexport const useSideDialogContext = () => useContext<SideDialogContextProps>(SideDialogContext);\n\n/**\n * This is the component in charge of rendering the side dialogs used\n * for editing entities. Use the {@link useSideEntityController} to open\n * and control the dialogs.\n * This component needs a parent {@link FireCMS}\n * {@link useSideDialogsController}\n * @group Components\n */\nexport function SideDialogs() {\n\n const sideDialogsController = useSideDialogsController();\n\n const sidePanels = sideDialogsController.sidePanels;\n\n const panels: (SideDialogPanelProps | undefined)[] = [...sidePanels];\n panels.push(undefined);\n\n return <>\n {\n panels.map((panel, index) =>\n <SideDialogView\n key={`side_dialog_${index}`}\n panel={panel}\n offsetPosition={sidePanels.length - index - 1}/>)\n }\n </>;\n}\n\nfunction SideDialogView({\n offsetPosition,\n panel\n }: {\n offsetPosition: number,\n panel?: SideDialogPanelProps\n}) {\n\n // was the closing of the dialog requested by the drawer\n const [drawerCloseRequested, setDrawerCloseRequested] = useState<boolean>(false);\n const [blocked, setBlocked] = useState(false);\n const [blockedNavigationMessage, setBlockedNavigationMessage] = useState<React.ReactNode | undefined>();\n\n const widthRef = React.useRef<string | undefined>(panel?.width);\n const width = widthRef.current;\n\n const sideDialogsController = useSideDialogsController();\n\n const {\n navigationWasBlocked,\n handleOk: handleNavigationOk,\n handleCancel: handleNavigationCancel\n } = useNavigationUnsavedChangesDialog(\n blocked && !drawerCloseRequested,\n () => setBlocked(false)\n );\n\n useEffect(() => {\n if (panel)\n widthRef.current = panel.width;\n }, [panel])\n\n const handleDrawerCloseOk = () => {\n setBlocked(false);\n setDrawerCloseRequested(false);\n sideDialogsController.close();\n panel?.onClose?.();\n };\n\n const handleDrawerCloseCancel = () => {\n setDrawerCloseRequested(false);\n };\n\n const onCloseRequest = (force?: boolean) => {\n if (blocked && !force) {\n setDrawerCloseRequested(true);\n } else {\n sideDialogsController.close();\n panel?.onClose?.();\n }\n };\n\n // const offsetClass = offsetPosition > 0 ? `transform translate-x-${offsetPosition}` : \"\";\n\n return (\n <SideDialogContext.Provider\n value={{\n blocked,\n setBlocked,\n setBlockedNavigationMessage,\n width,\n close: onCloseRequest\n }}>\n\n <Sheet\n open={Boolean(panel)}\n onOpenChange={(open) => !open && onCloseRequest()}\n >\n {panel &&\n <div\n className={\"transform max-w-[100vw] lg:max-w-[95vw] flex flex-col h-full transition-all duration-250 ease-in-out bg-white dark:bg-gray-900 \"}\n style={{\n width: panel.width,\n transform: `translateX(-${offsetPosition * 200}px)`\n }}\n >\n <ErrorBoundary>\n {panel.component}\n </ErrorBoundary>\n </div>}\n\n {!panel && <div style={{ width }}/>}\n\n </Sheet>\n\n <UnsavedChangesDialog\n open={navigationWasBlocked || drawerCloseRequested}\n handleOk={drawerCloseRequested ? handleDrawerCloseOk : handleNavigationOk}\n handleCancel={drawerCloseRequested ? handleDrawerCloseCancel : handleNavigationCancel}\n body={blockedNavigationMessage}/>\n\n </SideDialogContext.Provider>\n\n );\n}\n","import React, { useCallback, useEffect, useMemo } from \"react\";\n\nimport { EntitySidePanelProps } from \"../types\";\nimport { useNavigationController } from \"../hooks\";\n\nimport { ErrorBoundary } from \"../components\";\nimport { EntityView } from \"../internal/EntityView\";\nimport { useSideDialogContext } from \"./SideDialogs\";\n\n/**\n * This is the component in charge of rendering the side dialog used\n * for editing entities. Use the {@link useSideEntityController} to open\n * and control the dialogs.\n * This component needs a parent {@link FireCMS}\n * {@link useSideEntityController}\n * @group Components\n */\nexport function EntitySidePanel(props: EntitySidePanelProps) {\n\n const {\n blocked,\n setBlocked,\n setBlockedNavigationMessage\n } = useSideDialogContext();\n\n const navigationController = useNavigationController();\n\n const parentCollectionIds = useMemo(() => {\n return navigationController.getParentCollectionIds(props.path);\n }, [navigationController, props.path]);\n\n const collection = useMemo(() => {\n if (!props) return undefined;\n let usedCollection = props.collection;\n\n if (!usedCollection) {\n usedCollection = navigationController.getCollection(props.path, props.entityId);\n if (!usedCollection) {\n console.error(\"ERROR: No collection found in path `\", props.path, \"`. Entity id: \", props.entityId);\n throw Error(\"ERROR: No collection found in path `\" + props.path + \"`. Make sure you have defined a collection for this path in the root navigation.\");\n }\n }\n return usedCollection;\n }, [navigationController, props]);\n\n useEffect(() => {\n function beforeunload(e: any) {\n if (blocked && collection) {\n e.preventDefault();\n e.returnValue = `You have unsaved changes in this ${collection.name}. Are you sure you want to leave this page?`;\n }\n }\n\n if (typeof window !== \"undefined\")\n window.addEventListener(\"beforeunload\", beforeunload);\n\n return () => {\n if (typeof window !== \"undefined\")\n window.removeEventListener(\"beforeunload\", beforeunload);\n };\n\n }, [blocked, collection]);\n\n const onValuesAreModified = useCallback((modified: boolean) => {\n setBlocked(modified);\n setBlockedNavigationMessage(modified\n ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>\n : undefined)\n }, [collection?.name, setBlocked, setBlockedNavigationMessage]);\n\n if (!props || !collection) {\n return <div className={\"w-full\"}/>;\n }\n\n return (\n <>\n\n <ErrorBoundary>\n <EntityView\n {...props}\n formWidth={props.width}\n collection={collection}\n parentCollectionIds={parentCollectionIds}\n onValuesAreModified={onValuesAreModified}\n />\n </ErrorBoundary>\n\n </>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport {\n EntityCollection,\n EntitySidePanelProps,\n NavigationController,\n SideDialogPanelProps,\n SideDialogsController,\n SideEntityController\n} from \"../types\";\nimport { getNavigationEntriesFromPathInternal, NavigationViewInternal } from \"../util/navigation_from_path\";\nimport { useLocation } from \"react-router-dom\";\nimport { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from \"../util\";\nimport { ADDITIONAL_TAB_WIDTH, CONTAINER_FULL_WIDTH, FORM_CONTAINER_WIDTH } from \"./common\";\nimport { useLargeLayout } from \"../hooks\";\nimport { EntitySidePanel } from \"../core/EntitySidePanel\";\n\nconst NEW_URL_HASH = \"new\";\n\nexport function getEntityViewWidth(props: EntitySidePanelProps<any>, small: boolean): string {\n if (small) return CONTAINER_FULL_WIDTH;\n const mainViewSelected = !props.selectedSubPath;\n const resolvedWidth: string | undefined = typeof props.width === \"number\" ? `${props.width}px` : props.width;\n return !mainViewSelected ? `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedWidth ?? FORM_CONTAINER_WIDTH})` : resolvedWidth ?? FORM_CONTAINER_WIDTH\n}\n\nexport const useBuildSideEntityController = (navigation: NavigationController,\n sideDialogsController: SideDialogsController): SideEntityController => {\n\n const location = useLocation();\n const initialised = useRef<boolean>(false);\n\n const smallLayout = !useLargeLayout();\n\n // only on initialisation, create panels from URL\n useEffect(() => {\n if (!navigation.loading && !initialised.current) {\n if (navigation.isUrlCollectionPath(location.pathname)) {\n const newFlag = location.hash === `#${NEW_URL_HASH}`;\n const entityOrCollectionPath = navigation.urlPathToDataPath(location.pathname);\n const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, navigation.collections, newFlag);\n for (let i = 0; i < panelsFromUrl.length; i++) {\n const panel = panelsFromUrl[i];\n setTimeout(() => {\n if (i === 0)\n sideDialogsController.replace(propsToSidePanel(panel, navigation, smallLayout));\n else\n sideDialogsController.open(propsToSidePanel(panel, navigation, smallLayout))\n }, 1);\n }\n }\n initialised.current = true;\n }\n }, [location, navigation, sideDialogsController, smallLayout]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n const open = useCallback((props: EntitySidePanelProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy an entity you need to provide an entityId\");\n }\n const defaultSelectedView = resolveDefaultSelectedView(\n props.collection ? props.collection.defaultSelectedView : undefined,\n {\n status: props.copy ? \"copy\" : (props.entityId ? \"existing\" : \"new\"),\n entityId: props.entityId\n }\n );\n\n sideDialogsController.open(propsToSidePanel({ selectedSubPath: defaultSelectedView, ...props }, navigation, smallLayout));\n\n }, [sideDialogsController, navigation, smallLayout]);\n\n const replace = useCallback((props: EntitySidePanelProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy an entity you need to provide an entityId\");\n }\n\n sideDialogsController.replace(propsToSidePanel(props, navigation, smallLayout));\n\n }, [navigation, sideDialogsController, smallLayout]);\n\n return {\n close,\n open,\n replace\n };\n};\n\nexport function buildSidePanelsFromUrl(path: string, collections: EntityCollection[], newFlag: boolean): EntitySidePanelProps<any>[] {\n\n const navigationViewsForPath: NavigationViewInternal<any>[] = getNavigationEntriesFromPathInternal({\n path,\n collections\n });\n\n const sidePanels: EntitySidePanelProps<any>[] = [];\n let lastCollectionPath = \"\";\n for (let i = 0; i < navigationViewsForPath.length; i++) {\n const navigationEntry = navigationViewsForPath[i];\n\n if (navigationEntry.type === \"collection\") {\n lastCollectionPath = navigationEntry.path;\n }\n\n if (i > 0) { // the first collection is handled by the main navigation\n const previousEntry = navigationViewsForPath[i - 1];\n if (navigationEntry.type === \"entity\") {\n sidePanels.push({\n path: navigationEntry.path,\n entityId: navigationEntry.entityId,\n copy: false\n }\n );\n } else if (navigationEntry.type === \"custom_view\") {\n if (previousEntry.type === \"entity\") {\n const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];\n if (lastSidePanel)\n lastSidePanel.selectedSubPath = navigationEntry.view.key;\n }\n } else if (navigationEntry.type === \"collection\") {\n if (previousEntry.type === \"entity\") {\n const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];\n if (lastSidePanel)\n lastSidePanel.selectedSubPath = navigationEntry.collection.id ?? navigationEntry.collection.path;\n }\n }\n }\n\n }\n\n if (newFlag) {\n sidePanels.push({\n path: lastCollectionPath,\n copy: false\n });\n }\n\n return sidePanels;\n}\n\nconst propsToSidePanel = (props: EntitySidePanelProps<any>, navigation: NavigationController, smallLayout: boolean): SideDialogPanelProps => {\n\n const collectionPath = removeInitialAndTrailingSlashes(props.path);\n const newPath = props.entityId\n ? navigation.buildUrlCollectionPath(`${collectionPath}/${props.entityId}/${props.selectedSubPath || \"\"}`)\n : navigation.buildUrlCollectionPath(`${collectionPath}#${NEW_URL_HASH}`);\n\n return ({\n key: `${props.path}/${props.entityId}`,\n component: <EntitySidePanel {...props}/>,\n urlPath: newPath,\n parentUrlPath: navigation.buildUrlCollectionPath(collectionPath),\n width: getEntityViewWidth(props, smallLayout),\n onClose: props.onClose\n });\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { SideDialogPanelProps, SideDialogsController } from \"../types\";\nimport equal from \"react-fast-compare\"\n\nexport function useBuildSideDialogsController(): SideDialogsController {\n\n const location = useLocation();\n const navigate = useNavigate();\n\n const [sidePanels, setSidePanels] = useState<SideDialogPanelProps[]>([]);\n const sidePanelsRef = useRef<SideDialogPanelProps[]>(sidePanels);\n\n const routesStore = useRef<Record<string, SideDialogPanelProps>>({});\n const routesCount = useRef<number>(0);\n\n const updateSidePanels = (newPanels: SideDialogPanelProps[]) => {\n sidePanelsRef.current = newPanels;\n setSidePanels(newPanels);\n };\n\n useEffect(() => {\n const state = location.state as any;\n const panelKeys: string[] = state?.panels ?? [];\n const newPanels = panelKeys\n .map(key => routesStore.current[key])\n .filter(p => Boolean(p)) as SideDialogPanelProps[];\n if (!equal(sidePanelsRef.current.map(p => p.key), newPanels.map(p => p.key)))\n updateSidePanels(newPanels);\n }, [location]);\n\n const close = useCallback(() => {\n\n if (sidePanels.length === 0)\n return;\n\n const lastSidePanel = sidePanels[sidePanels.length - 1];\n const updatedPanels = [...sidePanels.slice(0, -1)];\n updateSidePanels(updatedPanels);\n\n if (routesCount.current > 0) {\n if (lastSidePanel.urlPath)\n navigate(-1);\n routesCount.current--;\n } else if (lastSidePanel.parentUrlPath) {\n const baseLocation = (location.state as any)?.base_location ?? location;\n navigate(\n lastSidePanel.parentUrlPath,\n {\n replace: true,\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n }, [sidePanels, navigate, location]);\n\n const open = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {\n\n const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];\n\n newPanels.forEach((panel) => {\n routesStore.current[panel.key] = panel;\n });\n routesCount.current = routesCount.current + newPanels.length;\n\n const baseLocation = (location.state as any)?.base_location ?? location;\n\n const updatedPanels = [...sidePanels, ...newPanels];\n updateSidePanels(updatedPanels);\n\n newPanels.forEach((panel) => {\n if (panel.urlPath) {\n navigate(\n panel.urlPath,\n {\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n });\n\n }, [location, navigate, sidePanels]);\n\n const replace = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {\n\n const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];\n newPanels.forEach((panel) => {\n routesStore.current[panel.key] = panel;\n });\n\n const baseLocation = (location.state as any)?.base_location ?? location;\n\n const updatedPanels = [...sidePanels.slice(0, -newPanels.length), ...newPanels];\n updateSidePanels(updatedPanels);\n\n newPanels.forEach((panel) => {\n if (panel.urlPath) {\n navigate(\n panel.urlPath,\n {\n replace: true,\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n });\n\n }, [location, navigate, sidePanels]);\n\n return {\n sidePanels,\n close,\n open,\n replace\n };\n}\n","import * as locales from \"date-fns/locale\";\n// @ts-ignore\nimport { registerLocale, setDefaultLocale } from \"react-datepicker\";\nimport { useEffect } from \"react\";\n\nexport function useLocaleConfig(locale?: string) {\n useEffect(() => {\n if (!locale) {\n return;\n }\n // @ts-ignore\n const dateFnsLocale = locales[locale];\n if (dateFnsLocale) {\n registerLocale(locale, dateFnsLocale);\n setDefaultLocale(locale);\n }\n }, [locale])\n}\n","import { EntityCollection, EntityReference } from \"../types\";\nimport { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from \"./navigation_utils\";\n\nexport function getParentReferencesFromPath(props: {\n path: string,\n collections: EntityCollection[] | undefined,\n currentFullPath?: string,\n}): EntityReference [] {\n\n const {\n path,\n collections = [],\n currentFullPath,\n } = props;\n\n const subpaths = removeInitialAndTrailingSlashes(path).split(\"/\");\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n\n const result: EntityReference[] = [];\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n\n const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (collection) {\n const pathOrAlias = collection.id ?? collection.path;\n const collectionPath = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + pathOrAlias)\n : pathOrAlias;\n\n const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, \"\"));\n const nextSegments = restOfThePath.length > 0 ? restOfThePath.split(\"/\") : [];\n if (nextSegments.length > 0) {\n const entityId = nextSegments[0];\n const fullPath = collectionPath + \"/\" + entityId;\n result.push(new EntityReference(entityId, collectionPath));\n if (nextSegments.length > 1) {\n const newPath = nextSegments.slice(1).join(\"/\");\n if (!collection) {\n throw Error(\"collection not found resolving path: \" + collection);\n }\n if (collection.subcollections) {\n result.push(...getParentReferencesFromPath({\n path: newPath,\n collections: collection.subcollections,\n currentFullPath: fullPath\n }));\n }\n }\n }\n break;\n }\n\n }\n return result;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nimport {\n AuthController,\n CMSView,\n CMSViewsBuilder,\n DataSourceDelegate,\n EntityCollection,\n EntityCollectionsBuilder,\n EntityReference,\n FireCMSPlugin,\n NavigationController,\n TopNavigationEntry,\n TopNavigationResult,\n User,\n UserConfigurationPersistence\n} from \"../types\";\nimport {\n getCollectionByPathOrId,\n mergeDeep,\n removeInitialAndTrailingSlashes,\n resolveCollectionPathIds,\n resolvePermissions\n} from \"../util\";\nimport { getParentReferencesFromPath } from \"../util/parent_references_from_path\";\n\nconst DEFAULT_BASE_PATH = \"/\";\nconst DEFAULT_COLLECTION_PATH = \"/c\";\n\ntype BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {\n basePath?: string,\n baseCollectionPath?: string,\n authController: AuthController<UserType>;\n collections?: EC[] | EntityCollectionsBuilder<EC>;\n views?: CMSView[] | CMSViewsBuilder;\n userConfigPersistence?: UserConfigurationPersistence;\n plugins?: FireCMSPlugin[];\n dataSource: DataSourceDelegate;\n};\n\nexport function useBuildNavigationController<EC extends EntityCollection, UserType extends User>({\n basePath = DEFAULT_BASE_PATH,\n baseCollectionPath = DEFAULT_COLLECTION_PATH,\n authController,\n collections: baseCollections,\n views: baseViews,\n userConfigPersistence,\n plugins,\n dataSource\n }: BuildNavigationContextProps<EC, UserType>): NavigationController {\n\n const location = useLocation();\n\n const [collections, setCollections] = useState<EntityCollection[] | undefined>();\n const [views, setViews] = useState<CMSView[] | undefined>();\n const [initialised, setInitialised] = useState<boolean>(false);\n\n const [topLevelNavigation, setTopLevelNavigation] = useState<TopNavigationResult | undefined>(undefined);\n const [navigationLoading, setNavigationLoading] = useState<boolean>(true);\n const [navigationLoadingError, setNavigationLoadingError] = useState<Error | undefined>(undefined);\n\n const cleanBasePath = removeInitialAndTrailingSlashes(basePath);\n const cleanBaseCollectionPath = removeInitialAndTrailingSlashes(baseCollectionPath);\n\n const homeUrl = cleanBasePath ? `/${cleanBasePath}` : \"/\";\n\n const fullCollectionPath = cleanBasePath ? `/${cleanBasePath}/${cleanBaseCollectionPath}` : `/${cleanBaseCollectionPath}`;\n\n const buildCMSUrlPath = useCallback((path: string): string => cleanBasePath ? `/${cleanBasePath}/${encodePath(path)}` : `/${encodePath(path)}`,\n [cleanBasePath]);\n\n const buildUrlCollectionPath = useCallback((path: string): string => `${removeInitialAndTrailingSlashes(baseCollectionPath)}/${encodePath(path)}`,\n [baseCollectionPath]);\n\n const computeTopNavigation = useCallback((collections: EntityCollection[], views: CMSView[]): TopNavigationResult => {\n // return (collection.editable && resolvePermissions(collection, authController, paths).editCollection) ?? DEFAULT_PERMISSIONS.editCollection;\n const navigationEntries: TopNavigationEntry[] = [\n ...(collections ?? []).map(collection => (!collection.hideFromNavigation\n ? {\n url: buildUrlCollectionPath(collection.id ?? collection.path),\n type: \"collection\",\n name: collection.name.trim(),\n path: collection.id ?? collection.path,\n collection,\n description: collection.description?.trim(),\n group: collection.group?.trim()\n }\n : undefined))\n .filter(Boolean) as TopNavigationEntry[],\n ...(views ?? []).map(view =>\n !view.hideFromNavigation\n ? ({\n url: buildCMSUrlPath(Array.isArray(view.path) ? view.path[0] : view.path),\n name: view.name.trim(),\n type: \"view\",\n view,\n description: view.description?.trim(),\n group: view.group?.trim()\n })\n : undefined)\n .filter(Boolean) as TopNavigationEntry[]\n ];\n\n const groups: string[] = Object.values(navigationEntries)\n .map(e => e.group)\n .filter(Boolean)\n .filter((value, index, array) => array.indexOf(value) === index) as string[];\n return {\n navigationEntries,\n groups\n };\n }, [buildCMSUrlPath, buildUrlCollectionPath]);\n\n const refreshNavigation = useCallback(async () => {\n\n if (authController.initialLoading)\n return;\n\n try {\n const [resolvedCollections = [], resolvedViews = []] = await Promise.all([\n resolveCollections(baseCollections, authController, dataSource, plugins),\n resolveCMSViews(baseViews, authController, dataSource)\n ]\n );\n\n setCollections(resolvedCollections);\n setViews(resolvedViews);\n setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews));\n } catch (e) {\n console.error(e);\n setNavigationLoadingError(e as any);\n }\n\n setNavigationLoading(false);\n setInitialised(true);\n }, [baseCollections, authController.user, authController.initialLoading, plugins, baseViews, computeTopNavigation]);\n\n useEffect(() => {\n refreshNavigation();\n }, [refreshNavigation]);\n\n const getCollection = useCallback(<EC extends EntityCollection>(\n idOrPath: string,\n entityId?: string,\n includeUserOverride = false\n ): EC | undefined => {\n\n if (!collections)\n return undefined;\n\n const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);\n\n const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;\n\n const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;\n\n let result: Partial<EntityCollection> | undefined = overriddenCollection;\n\n if (overriddenCollection) {\n const subcollections = overriddenCollection.subcollections;\n const callbacks = overriddenCollection.callbacks;\n const permissions = overriddenCollection.permissions;\n result = {\n ...result,\n subcollections: result?.subcollections ?? subcollections,\n callbacks: result?.callbacks ?? callbacks,\n permissions: result?.permissions ?? permissions\n };\n }\n\n if (!result) return undefined;\n\n return { ...overriddenCollection, ...result } as EC;\n\n }, [\n basePath,\n baseCollectionPath,\n collections,\n ]);\n\n const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {\n let currentCollections = collections;\n if (!currentCollections)\n throw Error(\"Collections have not been initialised yet\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const pathSegment = pathSegments[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === pathSegment || c.path === pathSegment);\n if (!collection)\n return undefined;\n currentCollections = collection.subcollections;\n if (i === pathSegments.length - 1)\n return collection as EC;\n }\n\n return undefined;\n\n }, [collections]);\n\n const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {\n let currentCollections = collections;\n if (!currentCollections)\n throw Error(\"Collections have not been initialised yet\");\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);\n if (!collection)\n return undefined;\n currentCollections = collection.subcollections;\n if (i === ids.length - 1)\n return collection as EC;\n }\n\n return undefined;\n\n }, [collections]);\n\n const isUrlCollectionPath = useCallback(\n (path: string): boolean => removeInitialAndTrailingSlashes(path + \"/\").startsWith(removeInitialAndTrailingSlashes(fullCollectionPath) + \"/\"),\n [fullCollectionPath]);\n\n const urlPathToDataPath = useCallback((path: string): string => {\n if (path.startsWith(fullCollectionPath))\n return path.replace(fullCollectionPath, \"\");\n throw Error(\"Expected path starting with \" + fullCollectionPath);\n }, [fullCollectionPath]);\n\n const buildUrlEditCollectionPath = useCallback(({\n path\n }: {\n path: string\n }): string => {\n return `s/edit/${encodePath(path)}`;\n },\n []);\n\n const resolveAliasesFrom = useCallback((path: string): string => {\n if (!collections)\n throw Error(\"Collections have not been initialised yet\");\n return resolveCollectionPathIds(path, collections);\n }, [collections]);\n\n const state = location.state as any;\n /**\n * The location can be overridden if `base_location` is set in the\n * state field of the current location. This can happen if you open\n * a side entity, like `products`, from a different one, like `users`\n */\n const baseLocation = state && state.base_location ? state.base_location : location;\n\n const getAllParentCollectionsForPath = useCallback((path: string): EntityReference[] => {\n return getParentReferencesFromPath({\n path,\n collections\n });\n }, [collections]);\n\n const getParentCollectionIds = useCallback((path: string): string[] => {\n return getAllParentCollectionsForPath(path).map(r => r.id);\n }, [getAllParentCollectionsForPath])\n\n const convertIdsToPaths = useCallback((ids: string[]): string[] => {\n let currentCollections = collections;\n const paths: string[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);\n if (!collection)\n throw Error(`Collection with id ${id} not found`);\n paths.push(collection.path);\n currentCollections = collection.subcollections;\n }\n return paths;\n }\n , [getCollectionFromIds]);\n\n return useMemo(() => ({\n collections: collections ?? [],\n views: views ?? [],\n loading: !initialised || navigationLoading,\n navigationLoadingError,\n homeUrl,\n basePath,\n baseCollectionPath,\n initialised,\n getCollection,\n getCollectionFromPaths,\n getCollectionFromIds,\n isUrlCollectionPath,\n urlPathToDataPath,\n buildUrlCollectionPath,\n buildUrlEditCollectionPath,\n buildCMSUrlPath,\n resolveAliasesFrom,\n topLevelNavigation,\n baseLocation,\n refreshNavigation,\n getParentReferencesFromPath: getAllParentCollectionsForPath,\n getParentCollectionIds,\n convertIdsToPaths\n }), [baseCollectionPath, baseLocation, basePath, buildCMSUrlPath, buildUrlCollectionPath, buildUrlEditCollectionPath, collections, getAllParentCollectionsForPath, getCollection, getCollectionFromPaths, homeUrl, initialised, isUrlCollectionPath, navigationLoading, navigationLoadingError, refreshNavigation, resolveAliasesFrom, topLevelNavigation, urlPathToDataPath, views]);\n}\n\nexport function getSidePanelKey(path: string, entityId?: string) {\n if (entityId)\n return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;\n else\n return removeInitialAndTrailingSlashes(path);\n}\n\nfunction encodePath(input: string) {\n return encodeURIComponent(removeInitialAndTrailingSlashes(input))\n .replaceAll(\"%2F\", \"/\")\n .replaceAll(\"%23\", \"#\");\n}\n\nfunction filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {\n return resolvedCollections\n .filter((c) => {\n if (!c.permissions) return true;\n const resolvedPermissions = resolvePermissions(c, authController, [c.path], null,)\n return resolvedPermissions.read !== false;\n })\n .map((c) => {\n if (!c.subcollections) return c;\n return {\n ...c,\n subcollections: filterOutNotAllowedCollections(c.subcollections, authController)\n }\n });\n}\n\nasync function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>, authController: AuthController, dataSource: DataSourceDelegate, plugins?: FireCMSPlugin[]) {\n let resolvedCollections: EntityCollection[] = [];\n if (typeof collections === \"function\") {\n resolvedCollections = await collections({\n user: authController.user,\n authController,\n dataSource\n });\n } else if (Array.isArray(collections)) {\n resolvedCollections = collections;\n }\n\n resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);\n\n if (plugins) {\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.collections?.injectCollections) {\n resolvedCollections = plugin.collections?.injectCollections(resolvedCollections ?? []);\n }\n });\n }\n return resolvedCollections;\n}\n\nasync function resolveCMSViews(baseViews: CMSView[] | CMSViewsBuilder | undefined, authController: AuthController, dataSource: DataSourceDelegate) {\n let resolvedViews: CMSView[] = [];\n if (typeof baseViews === \"function\") {\n resolvedViews = await baseViews({\n user: authController.user,\n authController,\n dataSource\n });\n } else if (Array.isArray(baseViews)) {\n resolvedViews = baseViews;\n }\n return resolvedViews;\n}\n","import { useCallback } from \"react\";\nimport {\n DataSource,\n DataSourceDelegate,\n DeleteEntityProps,\n Entity,\n EntityCollection,\n EntityReference,\n EntityValues,\n FetchCollectionProps,\n FetchEntityProps,\n FilterValues,\n GeoPoint,\n ListenCollectionProps,\n ListenEntityProps,\n NavigationController,\n PropertyConfig,\n ResolvedProperties,\n SaveEntityProps\n} from \"../types\";\nimport { resolveCollection, updateDateAutoValues } from \"../util\";\n\n/**\n * Use this hook to build a {@link DataSource} based on Firestore\n * @param firebaseApp\n * @group Firebase\n */\nexport function useBuildDataSource({\n delegate,\n propertyConfigs,\n navigationController\n }: {\n delegate: DataSourceDelegate,\n propertyConfigs?: Record<string, PropertyConfig>;\n navigationController: NavigationController;\n}): DataSource {\n\n return {\n\n /**\n * Fetch entities in a Firestore path\n * @param path\n * @param collection\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n fetchCollection: useCallback(<M extends Record<string, any>>({\n path,\n collection: collectionProp,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order\n }: FetchCollectionProps<M>\n ): Promise<Entity<M>[]> => {\n return delegate.fetchCollection<M>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order\n });\n }, [delegate]),\n\n /**\n * Listen to a entities in a given path\n * @param path\n * @param collection\n * @param onError\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @param onUpdate\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n listenCollection: delegate.listenCollection\n // eslint-disable-next-line react-hooks/rules-of-hooks\n ? useCallback(<M extends Record<string, any>>(\n {\n path,\n collection: collectionProp,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError\n }: ListenCollectionProps<M>\n ): () => void => {\n\n const collection = collectionProp ?? navigationController.getCollection(path);\n const isCollectionGroup = Boolean(collection?.collectionGroup) ?? false;\n if (!delegate.listenCollection)\n throw Error(\"useBuildDataSource delegate not initialised\");\n\n return delegate.listenCollection<M>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError,\n isCollectionGroup,\n collection\n });\n }, [delegate, navigationController.getCollection])\n : undefined,\n\n /**\n * Retrieve an entity given a path and a collection\n * @param path\n * @param entityId\n * @param collection\n * @group Firestore\n */\n fetchEntity: useCallback(<M extends Record<string, any>>({\n path,\n entityId\n }: FetchEntityProps<M>\n ): Promise<Entity<M> | undefined> => delegate.fetchEntity({\n path,\n entityId\n }), [delegate]),\n\n /**\n *\n * @param path\n * @param entityId\n * @param collection\n * @param onUpdate\n * @param onError\n * @return Function to cancel subscription\n * @group Firestore\n */\n listenEntity: delegate.listenEntity\n // eslint-disable-next-line react-hooks/rules-of-hooks\n ? useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!delegate.listenEntity)\n throw Error(\"useBuildDataSource delegate not initialised\");\n\n return delegate.listenEntity<M>({\n path,\n entityId,\n onUpdate,\n onError\n })\n }, [delegate.listenEntity]) : undefined,\n\n /**\n * Save entity to the specified path. Note that Firestore does not allow\n * undefined values.\n * @param path\n * @param entityId\n * @param values\n * @param schemaId\n * @param collection\n * @param status\n * @group Firestore\n */\n saveEntity: useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n values,\n collection: collectionProp,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n\n const collection = collectionProp ?? navigationController.getCollection(path);\n\n const resolvedCollection = collection\n ? resolveCollection<M>({\n collection,\n path,\n entityId,\n fields: propertyConfigs\n })\n : undefined;\n\n const properties: ResolvedProperties<M> | undefined = resolvedCollection?.properties;\n\n const firestoreValues = cmsToDelegateModel(\n values,\n delegate.buildReference,\n delegate.buildGeoPoint,\n delegate.buildDate,\n delegate.buildDeleteFieldValue\n );\n const updatedFirestoreValues: EntityValues<M> = properties\n ? updateDateAutoValues(\n {\n inputValues: firestoreValues,\n properties,\n status,\n timestampNowValue: delegate.currentTime(),\n setDateToMidnight: delegate.setDateToMidnight\n })\n : firestoreValues;\n\n console.debug(\"Saving entity\", path, entityId, updatedFirestoreValues);\n\n return delegate.saveEntity({\n path,\n entityId,\n values: updatedFirestoreValues,\n status\n }).then((res) => {\n return {\n id: res.id,\n path: res.path,\n values: delegate.delegateToCMSModel(updatedFirestoreValues)\n } as Entity<M>;\n });\n }, [delegate.saveEntity, navigationController.getCollection]),\n\n /**\n * Delete an entity\n * @param entity\n * @param collection\n * @group Firestore\n */\n deleteEntity: useCallback(<M extends Record<string, any>>(\n {\n entity\n }: DeleteEntityProps<M>\n ): Promise<void> => {\n return delegate.deleteEntity({ entity });\n }, [delegate.deleteEntity]),\n\n /**\n * Check if the given property is unique in the given collection\n * @param path Collection path\n * @param name of the property\n * @param value\n * @param property\n * @param entityId\n * @return `true` if there are no other fields besides the given entity\n * @group Firestore\n */\n checkUniqueField: useCallback((\n path: string,\n name: string,\n value: any,\n entityId?: string\n ): Promise<boolean> => {\n return delegate.checkUniqueField(path, name, value, entityId);\n }, [delegate.checkUniqueField]),\n\n generateEntityId: useCallback((path: string): string => {\n return delegate.generateEntityId(path,);\n }, [delegate.generateEntityId]),\n\n countEntities: useCallback(async ({\n path,\n collection,\n filter,\n order,\n orderBy\n }: {\n path: string,\n collection: EntityCollection<any>,\n filter?: FilterValues<Extract<keyof any, string>>,\n orderBy?: string,\n order?: \"desc\" | \"asc\",\n }): Promise<number> => {\n return delegate.countEntities({\n path,\n filter,\n orderBy,\n order,\n isCollectionGroup: Boolean(collection.collectionGroup) ?? false\n });\n }, [delegate.countEntities]),\n\n isFilterCombinationValid: useCallback(({\n path,\n filterValues,\n sortBy\n }: {\n path: string,\n filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"]\n }): boolean => {\n if (!delegate.isFilterCombinationValid)\n return true;\n return delegate.isFilterCombinationValid(\n {\n path,\n filterValues,\n sortBy\n }\n )\n }, [delegate.isFilterCombinationValid])\n\n };\n\n}\n\n/**\n * Recursive function that converts Firestore data types into CMS or plain\n * JS types.\n * FireCMS uses Javascript dates internally instead of Firestore timestamps.\n * This makes it easier to interact with the rest of the libraries and\n * bindings.\n * Also, Firestore references are replaced with {@link EntityReference}\n * @param data\n * @group Firestore\n */\nexport function cmsToDelegateModel(data: any,\n buildReference: (reference: EntityReference) => any,\n buildGeoPoint: (geoPoint: GeoPoint) => any,\n buildDate: (date: Date) => any,\n buildDelete: () => any\n): any {\n if (data === undefined) {\n return buildDelete();\n } else if (Array.isArray(data)) {\n return data.map(v => cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete));\n } else if (data instanceof EntityReference) {\n return buildReference(data);\n } else if (data instanceof GeoPoint) {\n return buildGeoPoint(data);\n } else if (data instanceof Date) {\n return buildDate(data);\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => ({ [key]: cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete) }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n }\n return data;\n}\n\n","import React, { useMemo } from \"react\";\n\nimport { EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from \"../types\";\nimport { AuthControllerContext, ModeControllerContext } from \"../contexts\";\nimport { useBuildSideEntityController } from \"../internal/useBuildSideEntityController\";\nimport { FireCMSContextInstance, useFireCMSContext, useModeController } from \"../hooks\";\nimport { useBuildSideDialogsController } from \"../internal/useBuildSideDialogsController\";\nimport { ErrorView } from \"../components\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\nimport { DataSourceContext } from \"../contexts/DataSourceContext\";\nimport { SideEntityControllerContext } from \"../contexts/SideEntityControllerContext\";\nimport { NavigationContext } from \"../contexts/NavigationContext\";\nimport { SideDialogsControllerContext } from \"../contexts/SideDialogsControllerContext\";\nimport { useLocaleConfig } from \"../internal/useLocaleConfig\";\nimport { CenteredView } from \"@firecms/ui\";\nimport { DialogsProvider } from \"../contexts/DialogsProvider\";\nimport { useBuildNavigationController } from \"../internal/useBuildNavigationController\";\nimport { useBuildDataSource } from \"../internal/useBuildDataSource\";\n\n/**\n * If you are using independent components of the CMS\n * you need to wrap them with this main component, so the internal hooks work.\n *\n * This is the main component of FireCMS. It acts as the provider of all the\n * internal contexts and hooks.\n *\n * You only need to use this component if you are building a custom app.\n *\n * @constructor\n * @group Core\n */\nexport function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {\n\n const modeController = useModeController();\n const {\n children,\n entityLinkBuilder,\n userConfigPersistence,\n dateTimeFormat,\n locale,\n authController,\n storageSource,\n dataSourceDelegate,\n plugins,\n onAnalyticsEvent,\n propertyConfigs,\n entityViews,\n components,\n baseCollectionPath,\n basePath,\n collections,\n views\n } = props;\n\n useLocaleConfig(locale);\n\n const navigationController = useBuildNavigationController({\n basePath,\n baseCollectionPath,\n authController,\n collections,\n views,\n userConfigPersistence,\n dataSource: dataSourceDelegate,\n plugins\n });\n\n /**\n * Controller in charge of fetching and persisting data\n */\n const dataSource = useBuildDataSource({\n delegate: dataSourceDelegate,\n propertyConfigs,\n navigationController\n });\n\n const sideDialogsController = useBuildSideDialogsController();\n const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController);\n\n const pluginsLoading = plugins?.some(p => p.loading) ?? false;\n\n const loading = authController.initialLoading || navigationController.loading || pluginsLoading;\n\n const context: Partial<FireCMSContext> = useMemo(() => ({\n entityLinkBuilder,\n dateTimeFormat,\n locale,\n plugins,\n onAnalyticsEvent,\n entityViews: entityViews ?? [],\n propertyConfigs: propertyConfigs ?? {},\n components\n }), [dateTimeFormat, locale, plugins, entityViews, propertyConfigs, components]);\n\n if (navigationController.navigationLoadingError) {\n return (\n <CenteredView maxWidth={\"md\"} fullScreen={true}>\n <ErrorView\n title={\"Error loading navigation\"}\n error={navigationController.navigationLoadingError}/>\n </CenteredView>\n );\n }\n\n if (authController.authError) {\n return (\n <CenteredView maxWidth={\"md\"} fullScreen={true}>\n <ErrorView\n title={\"Error loading auth\"}\n error={authController.authError}/>\n </CenteredView>\n );\n }\n\n return (\n <ModeControllerContext.Provider value={modeController}>\n <FireCMSContextInstance.Provider value={context}>\n <UserConfigurationPersistenceContext.Provider\n value={userConfigPersistence}>\n <StorageSourceContext.Provider\n value={storageSource}>\n <DataSourceContext.Provider\n value={dataSource}>\n <AuthControllerContext.Provider\n value={authController}>\n <SideDialogsControllerContext.Provider\n value={sideDialogsController}>\n <SideEntityControllerContext.Provider\n value={sideEntityController}>\n <NavigationContext.Provider\n value={navigationController}>\n <DialogsProvider>\n <FireCMSInternal\n loading={loading}>\n {children}\n </FireCMSInternal>\n </DialogsProvider>\n </NavigationContext.Provider>\n </SideEntityControllerContext.Provider>\n </SideDialogsControllerContext.Provider>\n </AuthControllerContext.Provider>\n </DataSourceContext.Provider>\n </StorageSourceContext.Provider>\n </UserConfigurationPersistenceContext.Provider>\n </FireCMSContextInstance.Provider>\n </ModeControllerContext.Provider>\n );\n\n}\n\nfunction FireCMSInternal({\n loading,\n children\n }: {\n loading: boolean;\n children: (props: {\n context: FireCMSContext;\n loading: boolean;\n }) => React.ReactNode;\n}) {\n\n const context = useFireCMSContext();\n let childrenResult = children({\n context,\n loading\n });\n\n const plugins = context.plugins;\n if (!loading && plugins) {\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.provider) {\n childrenResult = (\n <plugin.provider.Component {...plugin.provider.props}\n context={context}>\n {childrenResult}\n </plugin.provider.Component>\n );\n }\n });\n }\n\n return <>{childrenResult}</>;\n}\n","import React, { useCallback } from \"react\";\n\nimport { useFireCMSContext, useLargeLayout, useNavigationController } from \"../hooks\";\n\nimport { NavLink } from \"react-router-dom\";\nimport { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from \"../types\";\nimport { getIconForView } from \"../util\";\nimport { cn, Tooltip, Typography } from \"@firecms/ui\";\n\n/**\n * Props used in case you need to override the default drawer\n * @group Core\n */\nexport type DrawerProps<T = {}> = T & {\n hovered: boolean,\n drawerOpen: boolean,\n closeDrawer: () => any,\n}\n\n/**\n * Default drawer used in the CMS\n * @group Core\n */\nexport function Drawer({\n hovered,\n drawerOpen,\n closeDrawer\n }: DrawerProps) {\n\n const context = useFireCMSContext();\n const navigation = useNavigationController();\n\n const tooltipsOpen = hovered && !drawerOpen;\n const largeLayout = useLargeLayout();\n\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in Drawer\");\n\n const {\n navigationEntries,\n groups\n }: TopNavigationResult = navigation.topLevelNavigation;\n\n const ungroupedNavigationViews = Object.values(navigationEntries).filter(e => !e.group);\n\n const buildGroupHeader = useCallback((group?: string) => {\n if (!drawerOpen) return <div className=\"h-4\"/>;\n return <div\n className=\"pt-8 pl-6 pr-8 pb-2 flex flex-row items-center\">\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className=\"font-medium flex-grow\">\n {group ? group.toUpperCase() : \"Views\".toUpperCase()}\n </Typography>\n\n </div>;\n }, [drawerOpen]);\n\n const onClick = (view: TopNavigationEntry) => {\n const eventName: CMSAnalyticsEvent = view.type === \"collection\"\n ? \"drawer_navigate_to_collection\"\n : (view.type === \"view\" ? \"drawer_navigate_to_view\" : \"unmapped_event\");\n context.onAnalyticsEvent?.(eventName, { url: view.url });\n if (!largeLayout)\n closeDrawer();\n };\n\n return (\n <div className={\"flex-grow overflow-scroll no-scrollbar\"}>\n\n {groups.map((group) => (\n <React.Fragment\n key={`drawer_group_${group}`}>\n {buildGroupHeader(group)}\n {Object.values(navigationEntries)\n .filter(e => e.group === group)\n .map((view, index) =>\n <DrawerNavigationItem\n key={`navigation_${index}`}\n icon={getIconForView(view.collection ?? view.view)}\n tooltipsOpen={tooltipsOpen}\n drawerOpen={drawerOpen}\n onClick={() => onClick(view)}\n url={view.url}\n name={view.name}/>)}\n </React.Fragment>\n ))}\n\n {ungroupedNavigationViews.length > 0 && buildGroupHeader()}\n\n {ungroupedNavigationViews.map((view, index) => {\n\n return <DrawerNavigationItem\n key={`navigation_${index}`}\n icon={getIconForView(view.collection ?? view.view)}\n tooltipsOpen={tooltipsOpen}\n onClick={() => onClick(view)}\n drawerOpen={drawerOpen}\n url={view.url}\n name={view.name}/>;\n })}\n\n </div>\n );\n}\n\nexport function DrawerNavigationItem({\n name,\n icon,\n drawerOpen,\n tooltipsOpen,\n url,\n onClick\n }: {\n icon: React.ReactElement,\n name: string,\n tooltipsOpen: boolean,\n drawerOpen: boolean,\n url: string,\n onClick?: () => void,\n}) {\n\n const iconWrap = <div\n className={\"text-gray-600 dark:text-gray-500\"}>\n {icon}\n </div>;\n\n const listItem = <NavLink\n onClick={onClick}\n className={({ isActive }: any) => cn(\"rounded-r-xl truncate\",\n \"hover:bg-gray-200 hover:bg-opacity-75 dark:hover:bg-gray-700 dark:hover:bg-opacity-75 text-gray-800 dark:text-gray-200 hover:text-gray-900 hover:dark:text-gray-100\",\n \"flex flex-row items-center w-full mr-8\",\n drawerOpen ? \"pl-8 h-12\" : \"pl-6 h-11\",\n \"font-medium text-sm\",\n isActive ? \"bg-gray-100 dark:bg-gray-800\" : \"\"\n )}\n to={url}\n >\n\n {iconWrap}\n\n <div\n className={cn(\n drawerOpen ? \"opacity-100\" : \"opacity-0 hidden\",\n \"ml-4 font-inherit text-inherit\"\n )}>\n {name.toUpperCase()}\n </div>\n </NavLink>;\n\n // return listItem;\n if (drawerOpen)\n return listItem;\n else\n return <Tooltip\n open={tooltipsOpen}\n side=\"right\"\n title={name}>\n {listItem}\n </Tooltip>;\n}\n","import React, { PropsWithChildren, useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\nimport { Link } from \"react-router-dom\";\n\nimport { Drawer as DefaultDrawer, DrawerProps } from \"./Drawer\";\nimport { useLargeLayout, useNavigationController } from \"../hooks\";\nimport { CircularProgressCenter, ErrorBoundary, FireCMSAppBar, FireCMSAppBarProps, FireCMSLogo } from \"../components\";\nimport { ChevronLeftIcon, cn, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from \"@firecms/ui\";\n\nexport const DRAWER_WIDTH = 280;\n\n/**\n * @group Core\n */\nexport interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = object> {\n\n /**\n * Name of the app, displayed as the main title and in the tab title\n */\n name: string;\n\n /**\n * Logo to be displayed in the drawer of the CMS\n */\n logo?: string;\n\n includeDrawer?: boolean;\n\n /**\n * In case you need to override the view that gets rendered as a drawer\n * @see DefaultDrawer\n */\n Drawer?: React.ComponentType<DrawerProps<ExtraDrawerProps>>;\n\n /**\n * Additional props passed to the custom Drawer\n */\n drawerProps?: Partial<DrawerProps> & ExtraDrawerProps;\n\n /**\n * Open the drawer on hover\n */\n autoOpenDrawer?: boolean;\n\n /**\n * A component that gets rendered on the upper side of the main toolbar.\n * `toolbarExtraWidget` has no effect if this is set.\n */\n FireCMSAppBarComponent?: React.ComponentType<FireCMSAppBarProps<ExtraAppbarProps>>;\n\n /**\n * Additional props passed to the custom AppBar\n */\n fireCMSAppBarComponentProps?: Partial<FireCMSAppBarProps> & ExtraAppbarProps;\n\n}\n\n/**\n * This view acts as a scaffold for FireCMS.\n *\n * It is in charge of displaying the navigation drawer, top bar and main\n * collection views.\n * This component needs a parent {@link FireCMS}\n *\n * @param props\n * @constructor\n * @group Core\n */\nexport const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(\n function Scaffold(props: PropsWithChildren<ScaffoldProps>) {\n\n const {\n children,\n name,\n logo,\n includeDrawer = true,\n autoOpenDrawer,\n Drawer = DefaultDrawer,\n drawerProps,\n FireCMSAppBarComponent = FireCMSAppBar,\n fireCMSAppBarComponentProps,\n } = props;\n\n const largeLayout = useLargeLayout();\n\n const [drawerOpen, setDrawerOpen] = React.useState(false);\n const [onHover, setOnHover] = React.useState(false);\n\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n const handleDrawerClose = useCallback(() => {\n setDrawerOpen(false);\n }, []);\n\n const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);\n return (\n <div\n className=\"flex h-screen w-screen bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-white overflow-hidden\"\n style={{\n paddingTop: \"env(safe-area-inset-top)\",\n paddingLeft: \"env(safe-area-inset-left)\",\n paddingRight: \"env(safe-area-inset-right)\",\n paddingBottom: \"env(safe-area-inset-bottom)\",\n height: \"100dvh\"\n // \"@supports (height: 100dvh)\": {\n // height: \"100dvh\"\n // }\n }}>\n\n <FireCMSAppBarComponent title={name}\n includeDrawer={includeDrawer}\n drawerOpen={computedDrawerOpen}\n {...fireCMSAppBarComponentProps}/>\n\n <StyledDrawer\n displayed={includeDrawer}\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n open={computedDrawerOpen}\n logo={logo}\n hovered={onHover}\n setDrawerOpen={setDrawerOpen}>\n {includeDrawer && (\n <Drawer\n hovered={onHover}\n drawerOpen={computedDrawerOpen}\n closeDrawer={handleDrawerClose}\n {...drawerProps}/> )}\n </StyledDrawer>\n\n <main\n className=\"flex flex-col flex-grow overflow-auto\">\n <DrawerHeader/>\n <div\n className={cn(defaultBorderMixin, \"flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1\")}>\n\n <ErrorBoundary>\n {children}\n </ErrorBoundary>\n\n </div>\n </main>\n </div>\n );\n },\n equal\n)\n\nconst DrawerHeader = () => {\n return (\n <div className=\"flex flex-col min-h-[68px]\"></div>\n );\n};\n\nfunction StyledDrawer(props: {\n children: React.ReactNode,\n displayed: boolean,\n open: boolean,\n logo?: string,\n hovered: boolean,\n setDrawerOpen: (open: boolean) => void,\n onMouseEnter: () => void,\n onMouseMove: () => void,\n onMouseLeave: () => void\n}) {\n\n const navigation = useNavigationController();\n\n const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);\n const innerDrawer = <div\n className={\"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden\"}\n style={{\n width,\n transition: \"left 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\"\n }}\n >\n\n {!props.open && props.displayed && (\n <Tooltip title=\"Open menu\"\n side=\"right\"\n sideOffset={12}\n className=\"fixed top-2 left-3 !bg-gray-50 dark:!bg-gray-900 rounded-full w-fit\"\n >\n <IconButton\n color=\"inherit\"\n aria-label=\"Open menu\"\n className=\"sticky top-2 left-3 \"\n onClick={() => props.setDrawerOpen(true)}\n size=\"large\"\n >\n <MenuIcon/>\n </IconButton>\n </Tooltip>\n )}\n\n <div className={\"flex flex-col h-full\"}>\n <div\n style={{\n transition: \"padding 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\",\n padding: props.open ? \"32px 96px 0px 24px\" : \"72px 16px 0px\"\n }}\n className={cn(\"cursor-pointer\")}>\n\n <Tooltip title={\"Home\"}\n sideOffset={20}\n side=\"right\">\n <Link\n to={navigation.basePath}>\n {props.logo\n ? <img src={props.logo}\n alt=\"Logo\"\n className={cn(\"max-w-full max-h-full\",\n props.open ?? \"w-[160px] h-[160px]\")}/>\n : <FireCMSLogo/>}\n\n </Link>\n </Tooltip>\n </div>\n\n {props.children}\n </div>\n\n </div>;\n\n const largeLayout = useLargeLayout();\n if (!largeLayout) {\n if (!props.displayed)\n return null;\n return <>\n <IconButton\n color=\"inherit\"\n aria-label=\"Open drawer\"\n onClick={() => props.setDrawerOpen(true)}\n size=\"large\"\n className=\"absolute top-2 left-6\"\n >\n <MenuIcon/>\n </IconButton>\n <Sheet side={\"left\"}\n transparent={true}\n open={props.open}\n onOpenChange={props.setDrawerOpen}\n >\n {innerDrawer}\n </Sheet>\n </>;\n }\n\n return (\n <div\n className=\"relative\"\n onMouseEnter={props.onMouseEnter}\n onMouseMove={props.onMouseMove}\n onMouseLeave={props.onMouseLeave}\n style={{\n width,\n transition: \"left 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 150ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\"\n }}>\n\n {innerDrawer}\n\n <div\n className={`absolute right-0 top-4 ${\n props.open ? \"opacity-100\" : \"opacity-0 invisible\"\n } transition-opacity duration-1000 ease-in-out`}>\n <IconButton\n aria-label=\"Close drawer\"\n onClick={() => props.setDrawerOpen(false)}\n >\n <ChevronLeftIcon/>\n </IconButton>\n </div>\n\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ArrayProperty, FieldProps, Property, PropertyConfig, ResolvedProperty } from \"../types\";\nimport {\n ArrayCustomShapedFieldBinding,\n ArrayOfReferencesFieldBinding,\n BlockFieldBinding,\n DateTimeFieldBinding,\n KeyValueFieldBinding,\n MapFieldBinding,\n MarkdownFieldBinding,\n MultiSelectBinding,\n ReferenceFieldBinding,\n RepeatFieldBinding,\n SelectFieldBinding,\n StorageUploadFieldBinding,\n SwitchFieldBinding,\n TextFieldBinding\n} from \"../form\";\nimport { isPropertyBuilder, mergeDeep } from \"../util\";\n\nimport {\n AddLinkIcon,\n BallotIcon,\n DriveFolderUploadIcon,\n EmailIcon,\n FlagIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n HttpIcon,\n LinkIcon,\n ListAltIcon,\n ListIcon,\n NumbersIcon,\n RepeatIcon,\n ScheduleIcon,\n ShortTextIcon,\n SubjectIcon,\n UploadFileIcon,\n ViewStreamIcon\n} from \"@firecms/ui\";\n\nexport function isDefaultFieldConfigId(id: string) {\n return Object.keys(DEFAULT_FIELD_CONFIGS).includes(id);\n}\n\nexport const DEFAULT_FIELD_CONFIGS: Record<string, PropertyConfig<any>> = {\n text_field: {\n key: \"text_field\",\n name: \"Text field\",\n description: \"Simple short text\",\n Icon: ShortTextIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n Field: TextFieldBinding\n }\n },\n multiline: {\n key: \"multiline\",\n name: \"Multiline\",\n description: \"Text with multiple lines\",\n Icon: SubjectIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n multiline: true,\n Field: TextFieldBinding\n }\n },\n markdown: {\n key: \"markdown\",\n name: \"Markdown\",\n description: \"Text with advanced markdown syntax\",\n Icon: FormatQuoteIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n markdown: true,\n Field: MarkdownFieldBinding\n }\n },\n url: {\n key: \"url\",\n name: \"Url\",\n description: \"Text with URL validation\",\n Icon: HttpIcon,\n color: \"#154fb3\",\n property: {\n dataType: \"string\",\n url: true,\n Field: TextFieldBinding\n }\n },\n email: {\n key: \"email\",\n name: \"Email\",\n description: \"Text with email validation\",\n Icon: EmailIcon,\n color: \"#154fb3\",\n property: {\n dataType: \"string\",\n email: true,\n Field: TextFieldBinding\n }\n },\n select: {\n key: \"select\",\n name: \"Select/enum\",\n description: \"Select one text value from within an enumeration\",\n Icon: ListIcon,\n color: \"#4223c9\",\n property: {\n dataType: \"string\",\n enumValues: [],\n Field: SelectFieldBinding\n }\n },\n multi_select: {\n key: \"multi_select\",\n name: \"Multi select\",\n description: \"Select multiple text values from within an enumeration\",\n Icon: ListAltIcon,\n color: \"#4223c9\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n enumValues: [],\n },\n Field: MultiSelectBinding\n }\n },\n number_input: {\n key: \"number_input\",\n name: \"Number input\",\n description: \"Simple number field with validation\",\n Icon: NumbersIcon,\n color: \"#bec920\",\n property: {\n dataType: \"number\",\n Field: TextFieldBinding\n }\n },\n number_select: {\n key: \"number_select\",\n name: \"Number select\",\n description: \"Select a number value from within an enumeration\",\n Icon: FormatListNumberedIcon,\n color: \"#bec920\",\n property: {\n dataType: \"number\",\n enumValues: [],\n Field: SelectFieldBinding\n }\n },\n multi_number_select: {\n key: \"multi_number_select\",\n name: \"Multiple number select\",\n description: \"Select multiple number values from within an enumeration\",\n Icon: FormatListNumberedIcon,\n color: \"#bec920\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"number\",\n enumValues: [],\n },\n Field: MultiSelectBinding\n }\n },\n file_upload: {\n key: \"file_upload\",\n name: \"File upload\",\n description: \"Input for uploading single files\",\n Icon: UploadFileIcon,\n color: \"#f92d9a\",\n property: {\n dataType: \"string\",\n storage: {\n storagePath: \"{path}\"\n },\n Field: StorageUploadFieldBinding as React.ComponentType<FieldProps<string>>\n }\n },\n multi_file_upload: {\n key: \"multi_file_upload\",\n name: \"Multiple file upload\",\n description: \"Input for uploading multiple files\",\n Icon: DriveFolderUploadIcon,\n color: \"#f92d9a\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"{path}\"\n }\n },\n Field: StorageUploadFieldBinding\n }\n },\n reference: {\n key: \"reference\",\n name: \"Reference\",\n description: \"The value refers to a different collection\",\n Icon: LinkIcon,\n color: \"#ff0042\",\n property: {\n dataType: \"reference\",\n Field: ReferenceFieldBinding\n }\n },\n multi_references: {\n key: \"multi_references\",\n name: \"Multiple references\",\n description: \"Multiple values that refer to a different collection\",\n Icon: AddLinkIcon,\n color: \"#ff0042\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n },\n Field: ArrayOfReferencesFieldBinding\n }\n },\n switch: {\n key: \"switch\",\n name: \"Switch\",\n description: \"Boolean true or false field (or yes or no, 0 or 1...)\",\n Icon: FlagIcon,\n color: \"#20d9d2\",\n property: {\n dataType: \"boolean\",\n Field: SwitchFieldBinding\n }\n },\n date_time: {\n key: \"date_time\",\n name: \"Date/time\",\n description: \"A date time select field\",\n Icon: ScheduleIcon,\n color: \"#8b46ff\",\n property: {\n dataType: \"date\",\n Field: DateTimeFieldBinding\n }\n },\n group: {\n key: \"group\",\n name: \"Group\",\n description: \"Group of multiple fields\",\n Icon: BallotIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"map\",\n properties: {},\n Field: MapFieldBinding\n }\n },\n key_value: {\n key: \"key_value\",\n name: \"Key-value\",\n description: \"Flexible field that allows the user to add multiple key-value pairs\",\n Icon: BallotIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"map\",\n keyValue: true,\n Field: KeyValueFieldBinding\n }\n },\n repeat: {\n key: \"repeat\",\n name: \"Repeat/list\",\n description: \"A field that gets repeated multiple times (e.g. multiple text fields)\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n },\n Field: RepeatFieldBinding\n }\n },\n custom_array: {\n key: \"custom_array\",\n name: \"Custom array\",\n description: \"A field that saved its value as an array of custom objects\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n of: [],\n Field: ArrayCustomShapedFieldBinding\n }\n },\n block: {\n key: \"block\",\n name: \"Block\",\n description: \"A complex field that allows the user to compose different fields together, with a key->value format\",\n Icon: ViewStreamIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n oneOf: {\n properties: {},\n },\n Field: BlockFieldBinding\n }\n }\n};\n\nexport function getDefaultFieldConfig(property: Property | ResolvedProperty): PropertyConfig | undefined {\n const fieldId = getDefaultFieldId(property);\n if (!fieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n return DEFAULT_FIELD_CONFIGS[fieldId];\n}\n\nexport function getFieldConfig(property: Property | ResolvedProperty, propertyConfigs: Record<string, PropertyConfig<any>>): PropertyConfig | undefined {\n const fieldId = getFieldId(property);\n const defaultFieldId = getDefaultFieldId(property);\n if (!defaultFieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n const defaultFieldConfig = DEFAULT_FIELD_CONFIGS[defaultFieldId];\n const customField = fieldId ? propertyConfigs[fieldId] : undefined;\n return mergeDeep(defaultFieldConfig ?? {}, customField ?? {});\n}\n\nexport function getDefaultFieldId(property: Property | ResolvedProperty) {\n if (property.dataType === \"string\") {\n if (property.multiline) {\n return \"multiline\";\n } else if (property.markdown) {\n return \"markdown\";\n } else if (property.storage) {\n return \"file_upload\";\n } else if (property.url) {\n return \"url\";\n } else if (property.email) {\n return \"email\";\n } else if (property.enumValues) {\n return \"select\";\n } else {\n return \"text_field\";\n }\n } else if (property.dataType === \"number\") {\n if (property.enumValues) {\n return \"number_select\";\n }\n return \"number_input\";\n } else if (property.dataType === \"map\") {\n if (property.keyValue)\n return \"key_value\";\n if (property.properties)\n return \"group\";\n } else if (property.dataType === \"array\") {\n const of = (property as ArrayProperty).of;\n const oneOf = (property as ArrayProperty).oneOf;\n if (oneOf) {\n return \"block\";\n } else if (Array.isArray(of)) {\n return \"custom_array\";\n } else if (isPropertyBuilder(of)) {\n return \"repeat\";\n } else if (of?.dataType === \"string\" && of.enumValues) {\n return \"multi_select\";\n } else if (of?.dataType === \"number\" && of.enumValues) {\n return \"multi_number_select\";\n } else if (of?.dataType === \"string\" && of.storage) {\n return \"multi_file_upload\";\n } else if (of?.dataType === \"reference\") {\n return \"multi_references\";\n } else {\n return \"repeat\";\n }\n } else if (property.dataType === \"boolean\") {\n return \"switch\";\n } else if (property.dataType === \"date\") {\n return \"date_time\";\n } else if (property.dataType === \"reference\") {\n return \"reference\";\n }\n\n console.error(\"Unsupported field config mapping\", property);\n return undefined;\n}\n\nexport function getFieldId(property: Property | ResolvedProperty): string | undefined {\n if (property.propertyConfig)\n return property.propertyConfig;\n return getDefaultFieldId(property);\n}\n","import React from \"react\";\n\nimport { Route, Routes, useLocation } from \"react-router-dom\";\nimport { CMSView } from \"../types\";\nimport { DefaultHomePage, EntityCollectionView, NotFoundPage } from \"../components\";\nimport { useNavigationController } from \"../hooks\";\nimport { toArray } from \"../util/arrays\";\n\n/**\n * @group Components\n */\nexport type NavigationRoutesProps = {\n /**\n * In case you need to override the home page\n */\n HomePage?: React.ComponentType;\n\n customRoutes?: React.ReactNode[]\n\n};\n\n/**\n * This component is in charge of rendering\n * all the related routes (entity collection root views, custom views\n * or the home route) related to a {@link NavigationController}.\n * This component needs a parent {@link FireCMS}\n *\n * @constructor\n * @group Components\n */\n\nexport const NavigationRoutes = React.memo<NavigationRoutesProps>(\n function NavigationRoutes({\n HomePage = DefaultHomePage,\n customRoutes\n }: NavigationRoutesProps) {\n\n const location = useLocation();\n const navigation = useNavigationController();\n\n if (!navigation)\n return <></>;\n\n const state = location.state as any;\n\n /**\n * The location can be overridden if `base_location` is set in the\n * state field of the current location. This can happen if you open\n * a side entity, like `products`, from a different one, like `users`\n */\n const baseLocation = state && state.base_location ? state.base_location : location;\n\n const cmsViews: React.ReactNode[] = [];\n if (navigation.views) {\n navigation.views.forEach((cmsView) => {\n if (Array.isArray(cmsView.path))\n cmsViews.push(...cmsView.path.map(path => buildCMSViewRoute(path, cmsView)));\n else\n cmsViews.push(buildCMSViewRoute(cmsView.path, cmsView));\n });\n }\n\n // we reorder collections so that nested paths are included first\n const sortedCollections = [...(navigation.collections ?? [])]\n .sort((a, b) => b.path.length - a.path.length);\n\n const collectionRoutes = sortedCollections\n .map((collection) => {\n const urlPath = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n return <Route path={urlPath + \"/*\"}\n key={`navigation_${collection.id ?? collection.path}`}\n element={\n <EntityCollectionView\n key={`collection_view_${collection.id ?? collection.path}`}\n isSubCollection={false}\n parentCollectionIds={[]}\n fullPath={collection.id ?? collection.path}\n {...collection}\n Actions={toArray(collection.Actions)}/>\n }/>;\n }\n );\n\n const homeRoute = (\n <Route path={\"/\"}\n element={<HomePage/>}/>\n );\n\n const notFoundRoute = <Route path={\"*\"}\n element={\n <NotFoundPage/>\n }/>;\n\n return (\n <Routes location={baseLocation}>\n\n {collectionRoutes}\n\n {cmsViews}\n\n {homeRoute}\n\n {notFoundRoute}\n\n {customRoutes}\n\n </Routes>\n );\n });\n\nconst buildCMSViewRoute = (path: string, cmsView: CMSView) => {\n return <Route\n key={\"navigation_view_\" + path}\n path={path}\n element={cmsView.view}\n />;\n};\n\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { ModeController } from \"../hooks\";\n\n/**\n * Use this hook to build a color mode controller that determines\n * the theme of the CMS\n */\nexport function useBuildModeController(): ModeController {\n\n const prefersDarkModeQuery = typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\");\n const prefersDarkModeStorage: boolean | null = localStorage.getItem(\"prefers-dark-mode\") != null ? localStorage.getItem(\"prefers-dark-mode\") === \"true\" : null;\n const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery;\n const [mode, setMode] = useState<\"light\" | \"dark\">(prefersDarkMode ? \"dark\" : \"light\");\n\n useEffect(() => {\n setMode(prefersDarkMode ? \"dark\" : \"light\");\n setDocumentMode(prefersDarkMode ? \"dark\" : \"light\");\n }, [prefersDarkMode]);\n\n // color-scheme: dark;\n const setDarkMode = useCallback(() => {\n setMode(\"dark\");\n setDocumentMode(\"dark\");\n }, [prefersDarkModeQuery]);\n\n const setLightMode = useCallback(() => {\n setMode(\"light\");\n setDocumentMode(\"light\");\n }, []);\n\n const setDocumentMode = (mode: \"light\" | \"dark\") => {\n document.body.style.setProperty(\"color-scheme\", mode);\n document.documentElement.dataset.theme = mode;\n };\n\n const toggleMode = useCallback(() => {\n\n if (mode === \"light\") {\n if (!prefersDarkModeQuery)\n localStorage.setItem(\"prefers-dark-mode\", \"true\");\n else\n localStorage.removeItem(\"prefers-dark-mode\");\n setDarkMode();\n } else {\n if (prefersDarkModeQuery)\n localStorage.setItem(\"prefers-dark-mode\", \"false\");\n else\n localStorage.removeItem(\"prefers-dark-mode\");\n setLightMode();\n }\n }, [mode, prefersDarkModeQuery]);\n\n return {\n mode,\n setMode,\n toggleMode\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { PartialEntityCollection, UserConfigurationPersistence } from \"../types\";\nimport { mergeDeep, stripCollectionPath } from \"../util\";\n\nexport function useBuildLocalConfigurationPersistence(): UserConfigurationPersistence {\n\n const [configCache, setConfigCache] = useState<Record<string, PartialEntityCollection>>({});\n\n const getCollectionFromStorage = useCallback((storageKey: string) => {\n const item = localStorage.getItem(storageKey);\n return item ? JSON.parse(item) : {};\n }, []);\n\n const getCollectionConfig = useCallback(<M extends Record<string, any>>(path: string): PartialEntityCollection<M> => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n if (configCache[storageKey]) {\n return configCache[storageKey] as PartialEntityCollection<M>;\n }\n return getCollectionFromStorage(storageKey);\n }, [configCache, getCollectionFromStorage]);\n\n const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialEntityCollection<M>) => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n localStorage.setItem(storageKey, JSON.stringify(data));\n setConfigCache((currentCache) => {\n const cachedConfig = currentCache[storageKey];\n const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);\n return (mergeDeep(currentCache, newConfig));\n });\n }, [getCollectionFromStorage]);\n\n const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);\n const [favouritePaths, _setFavouritePaths] = useState<string[]>([]);\n const [collapsedGroups, _setCollapsedGroups] = useState<string[]>([]);\n\n useEffect(() => {\n _setRecentlyVisitedPaths(localStorage.getItem(\"recently_visited_paths\") ? JSON.parse(localStorage.getItem(\"recently_visited_paths\")!) : []);\n _setFavouritePaths(localStorage.getItem(\"favourite_paths\") ? JSON.parse(localStorage.getItem(\"favourite_paths\")!) : []);\n _setCollapsedGroups(localStorage.getItem(\"collapsed_groups\") ? JSON.parse(localStorage.getItem(\"collapsed_groups\")!) : []);\n }, []);\n\n const setRecentlyVisitedPaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"recently_visited_paths\", JSON.stringify(paths));\n _setRecentlyVisitedPaths(paths);\n }, []);\n\n const setFavouritePaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"favourite_paths\", JSON.stringify(paths));\n _setFavouritePaths(paths);\n }, []);\n\n const setCollapsedGroups = useCallback((paths: string[]) => {\n localStorage.setItem(\"collapsed_groups\", JSON.stringify(paths));\n _setCollapsedGroups(paths);\n }, []);\n\n return {\n onCollectionModified,\n getCollectionConfig,\n recentlyVisitedPaths,\n setRecentlyVisitedPaths,\n favouritePaths,\n setFavouritePaths,\n collapsedGroups,\n setCollapsedGroups\n }\n}\n"],"names":["SnackbarProvider","children","jsx","NotistackSnackbarProvider","DEFAULT_MODE_STATE","mode","ModeControllerContext","React","ModeControllerProvider","AuthControllerContext","removeInitialAndTrailingSlashes","s","removeInitialSlash","removeTrailingSlash","addInitialSlash","getLastSegment","path","cleanPath","segments","resolveCollectionPathIds","allCollections","subpaths","aliasedCollection","col","resolvedAliased","segmentCollection","getCollectionByPathOrId","restOfThePath","pathOrAlias","collections","subpathCombinations","getCollectionPathsCombinations","result","i","subpathCombination","navigationEntry","a","b","entry","newPath","entries","length","EntityReference","id","GeoPoint","latitude","longitude","pick","obj","args","res","key","isObject","item","mergeDeep","target","source","targetIsObject","output","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","nextObject","nextPath","removeInPath","currentObject","parts","last","part","removeFunctions","_","value","v","getHashValue","hash","removeUndefined","removeEmptyStrings","isEmptyObject","childRes","isString","shouldKeepIfString","removePropsIfExisting","comparison","val","isArray","DEFAULT_ONE_OF_TYPE","DEFAULT_ONE_OF_VALUE","isReadOnly","property","isHidden","isPropertyBuilder","propertyOrBuilder","getDefaultValuesFor","properties","getDefaultValueFor","defaultValuesFor","getDefaultValueForDataType","dataType","updateDateAutoValues","inputValues","status","timestampNowValue","setDateToMidnight","traverseValuesProperties","inputValue","resultDate","sanitizeData","values","getReferenceFrom","entity","operation","updatedValues","updatedValue","traverseValueProperty","e","typeField","valueField","type","childProperty","hashString","str","chr","getColorSchemeForSeed","seed","colorKeys","CHIP_COLORS","index","enumToObjectEntries","enumValues","getLabelOrConfigFrom","getColorScheme","labelOrConfig","isEnumValueDisabled","buildEnumLabel","resolveCollection","collection","entityId","previousValues","userConfigPersistence","fields","collectionOverride","storedProperties","defaultValues","usedValues","usedPreviousValues","resolvedProperties","propertyValue","getIn","childResolvedProperty","resolveProperty","cleanedProperties","fromBuilder","props","resolvedProperty","resolveProperties","resolveArrayProperty","resolvePropertyEnum","isDefaultFieldConfigId","cmsFields","customField","configPropertyOrBuilder","customFieldProperty","propertyKey","p","of","ofProperty","thisPropertyValue","resolveEnumValues","input","resolveEntityView","entityView","contextEntityViews","getNavigationEntriesFromPathInternal","currentFullPath","collectionPath","nextSegments","fullPath","entityViews","customView","sortProperties","propertiesOrder","propertiesKeys","resolveDefaultSelectedView","defaultSelectedView","params","kebabCaseRegex","toKebabCase","regExpMatchArray","x","snakeCaseRegex","toSnakeCase","randomString","strLength","randomColor","slugify","text","separator","lowercase","from","to","l","unslugify","slug","txt","defaultDateFormat","COLLECTION_PATH_SEPARATOR","stripCollectionPath","segmentsToStrippedPath","fullPathToCollectionSegments","paths","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","useDebounce","callback","immediate","timeoutMs","pendingUpdate","performUpdate","handlerRef","isReferenceProperty","getIdIcon","size","CircleIcon","getIconForWidget","widget","Icon","getIconForProperty","FunctionsIcon","getFieldConfig","getColorForProperty","getPropertyInPath","getResolvedPropertyInPath","getBracketNotation","getPropertiesWithPropertiesOrder","getDefaultPropertiesOrder","field","DEFAULT_PERMISSIONS","resolvePermissions","authController","permission","canEditEntity","canCreateEntity","canDeleteEntity","getIcon","iconKey","className","iconKeysMap","getIconForView","collectionOrView","icon","slugName","iconsCount","coolIconKeys","iconKeys","acc","plural","word","amount","plurals","irregular","w","pattern","replace","reg","singular","singulars","getReferencePreviewKeys","targetCollection","previewProperties","limit","allProperties","listProperties","flattenObject","parentKey","flatObj","newKey","getArrayValuesCount","array","nested","nestedKey","nestedCount","compoundKey","makePropertiesEditable","makePropertiesNonEditable","updated","applyModifyFunction","modifyCollection","parentPaths","resCollection","subcollection","joinCollectionLists","targetCollections","sourceCollections","updatedCollections","sourceCol","targetCol","mergeCollection","sourceCollectionIds","c","resultStoredCollections","subcollectionsMerged","propertiesMerged","mergePropertyOrBuilder","mergedCollection","targetPropertiesOrder","getCollectionKeys","sourcePropertiesOrder","mergedPropertiesOrder","mergedEntityViews","resultCollection","modifiedCollection","mergedProperty","targetEditable","sourceEditable","targetProperties","sourceProperties","mergedProperties","f","buildCollection","buildProperty","buildProperties","buildPropertiesOrBuilder","propertiesOrBuilder","buildEnumValues","buildEnumValueConfig","enumValueConfig","buildEntityCallbacks","callbacks","buildAdditionalFieldDelegate","additionalFieldDelegate","buildFieldConfig","propertyConfig","CONTAINER_FULL_WIDTH","ADDITIONAL_TAB_WIDTH","FORM_CONTAINER_WIDTH","DataSourceContext","useDataSource","useContext","NavigationContext","useNavigationController","useAuthController","SideDialogsControllerContext","useSideDialogsController","SideEntityControllerContext","useSideEntityController","StorageSourceContext","useStorageSource","useSnackbarController","enqueueSnackbar","closeSnackbar","useSnackbar","open","useCallback","message","autoHideDuration","close","useMemo","UserConfigurationPersistenceContext","useUserConfigurationPersistence","DialogsControllerContext","DialogsProvider","dialogEntries","setDialogEntries","useState","dialogEntriesRef","useRef","updateDialogEntries","newPanels","updatedPanels","dialogEntry","jsxs","useDialogsController","FireCMSContextInstance","createContext","useFireCMSContext","partialContext","sideDialogsController","sideEntityController","navigation","dataSource","storageSource","snackbarController","dialogsController","useCollectionFetch","inputPath","filterValues","sortBy","itemCount","searchString","sortByProperty","currentSort","context","data","setData","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","noMoreToLoad","setNoMoreToLoad","useEffect","onEntitiesUpdate","entities","onError","error","CACHE","useEntityFetch","useCache","setEntity","onEntityUpdate","updatedEntity","saveEntityWithCallbacks","onSaveSuccess","onSaveFailure","onPreSaveHookError","onSaveSuccessHookError","resolvedPath","resolvedCollection","deleteEntityWithCallbacks","onDeleteSuccess","onDeleteFailure","onPreDeleteHookError","onDeleteSuccessHookError","entityDeleteProps","useClearRestoreValue","setValue","clearedValueRef","resolveNavigationFrom","resultPromises","useResolvedNavigationFrom","useModeController","useClipboard","options","onSuccess","disableClipboardAPI","copiedDuration","ref","isCoppied","setIsCoppied","clipboard","setClipbaord","isSupported","handleError","handleSuccess","copyToClipboard","err","clearClipboard","copy","action","cut","element","isInput","breakpoints","useLargeLayout","breakpoint","isLargeLayout","setIsLargeLayout","handleResize","matched","ErrorTooltip","Tooltip","ErrorView","title","tooltip","component","body","ErrorIcon","Typography","EmptyValue","TINY_THUMBNAIL","SMALL_THUMBNAIL","REGULAR_THUMBNAIL","getThumbnailMeasure","getPreviewSizeFrom","ImagePreview","url","onHover","setOnHover","imageSize","Fragment","IconButton","ContentCopyIcon","OpenInNewIcon","UrlComponentPreview","previewType","hint","DescriptionIcon","SkeletonPropertyComponent","content","stringProperty","renderUrlComponent","renderSkeletonImageThumbnail","renderSkeletonText","arrayProperty","renderGenericArrayCell","renderArrayOfMaps","renderArrayEnumTableCell","renderArrayOfStrings","renderMap","renderReference","mapPropertyKeys","tableProperties","Skeleton","renderSkeletonIcon","renderUrlFile","width","renderSkeletonCaptionText","StorageThumbnail","StorageThumbnailInternal","areEqual","prevProps","nextProps","URL_CACHE","storeUrl","storagePathOrDownloadUrl","setError","storage","downloadConfig","setDownloadConfig","unmounted","filetype","getFiletype","EnumValuesChip","enumKey","enumValuesConfig","enumValue","label","colorScheme","Chip","StringPropertyPreview","ErrorBoundary","lines","ArrayPropertyPreview","inputProperty","fireCMSContext","childSize","cn","defaultBorderMixin","PropertyPreview","ReferencePreview","reference","ReferencePreviewInternal","ReferencePreviewContainer","disabled","onClick","allowEntityNavigation","ReferencePreviewExisting","referencesCache","usedEntity","KeyboardTabIcon","event","ArrayOfReferencesPreview","ArrayOfStorageComponentsPreview","ArrayEnumPreview","name","ArrayPropertyEnumPreview","ArrayOfStringsPreview","ArrayOneOfPreview","MapPropertyPreview","mapProperty","KeyValuePreview","childValue","DatePreview","date","appConfig","dateUtilsLocale","locales","dateFormat","formattedDate","format","BooleanPreview","Checkbox","NumberPropertyPreview","height","createElement","Markdown","buildWrongValueType","equal","ArrayOfMapsPreview","mapProperties","AsyncPreviewComponent","builder","loading","setLoading","setResult","EntityPreview","getTableCellAlignment","getTablePropertyColumnWidth","getSubcollectionColumnId","VirtualTableInput","multiline","updateValue","focused","prevValue","internalValue","setInternalValue","focusedState","doUpdate","TextareaAutosize","evt","newValue","VirtualTableSelect","small","multiple","valueType","validValue","onChange","renderValue","MultiSelect","enumConfig","MultiSelectItem","Select","SelectItem","VirtualTableNumberInput","align","propStringValue","numberValue","regexp","VirtualTableSwitch","BooleanSwitch","VirtualTableDateField","locale","DateTimeField","dateValue","errorInfo","resolveFilenameString","file","replacePlaceholders","resolveStoragePathString","ext","useStorageUploadController","entityValues","multipleFilesSupported","metadata","compression","internalInitialValue","getRandomId","initialValue","setInitialValue","fileNameBuilder","fileName","storagePathBuilder","onFileUploadComplete","uploadedPath","uploadPathOrDownloadUrl","removeDuplicates","fieldValue","onFilesAdded","acceptedFiles","newInternalValue","compressionFormat","resizeAndCompressImage","items","supportedTypes","defaultQuality","resolve","inputQuality","quality","Resizer","StorageUploadProgress","storagePath","simple","mounted","uploading","upload","paperMixin","EntityTableCellActions","showError","showExpandIcon","selected","openPopup","doOpenPopup","cellRect","iconRef","ErrorOutlineIcon","dropZoneClasses","activeDropClasses","acceptDropClasses","rejectDropClasses","TableStorageUpload","previewSize","StorageUpload","previewSizeInput","autoFocus","hasValue","snackbarContext","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","useDropzone","fileRejections","fileRejection","rootProps","helpText","renderProperty","child","TableStorageItemPreview","EditIcon","TableReferenceField","navigationController","TableReferenceFieldSuccess","multiselect","forceFilter","hoverTrue","hoverFalse","onSingleEntitySelected","onMultipleEntitiesSelected","selectedEntityIds","referenceDialogController","useReferenceDialog","handleOpen","valueNotSet","buildSingleReferenceField","buildMultipleReferenceField","Button","yup","mapper","getYupEntitySchema","customFieldValidator","objectSchema","mapPropertyToYup","propertyContext","getYupStringSchema","getYupNumberSchema","getYupBooleanSchema","getYupMapObjectSchema","getYupArraySchema","getYupDateSchema","getYupGeoPointSchema","getYupReferenceSchema","childName","parentProperty","validation","regExp","hasUniqueInArrayModifier","arraySchema","yupProperties","object","arrayUniqueFields","getRowHeight","TableCellInner","justifyContent","scrollable","faded","fullHeight","EntityTableCell","actions","disabledTooltip","saved","allowScroll","removePadding","onSelect","hideOverflow","measureRef","bounds","useMeasure","useOutsideAlerter","isOverflowing","setIsOverflowing","maxHeight","internalSaved","setInternalSaved","handler","onSelectCallback","onFocus","newOverflowingValue","isSelected","setOnHoverTrue","setOnHoverFalse","RemoveCircleIcon","isStorageProperty","PropertyTableCell","readonly","disabledProp","onValueChange","selectedCell","select","setPopupCell","useEntityCollectionTableController","internalValueRef","setSaved","onValueUpdated","customPreview","readOnlyProperty","saveValues","innerComponent","includeActions","numberProperty","CircularProgressCenter","CircularProgress","VirtualTableHeader","resizeHandleRef","columnIndex","isResizingIndex","sort","onColumnSort","onFilterUpdate","filter","column","onClickResizeColumn","createFilterField","AdditionalHeaderWidget","openFilter","setOpenFilter","hidden","setHidden","handleSettingsClick","update","filterForProperty","newOpenFilterState","thisColumnIsResizing","hovered","Badge","ArrowUpwardIcon","Popover","FilterListIcon","FilterForm","filterInternal","setFilterInternal","submit","reset","filterIsSet","filterField","VirtualTableHeaderRow","columns","onColumnResize","onColumnResizeEnd","AddColumnComponent","columnRefs","createRef","isResizing","setIsResizing","adjustWidthColumn","end","minWidth","maxWidth","newWidth","getEventNewWidth","left","setCursorDocument","handleOnMouseMove","handleOnMouseUp","removeResizingListeners","attachResizeListeners","filterForThisProperty","VirtualTableRow","rowData","rowIndex","onRowClick","style","hoverRow","rowClassName","VirtualTableCell","VirtualListContext","innerElementType","forwardRef","rest","virtualTableProps","VirtualTable","onResetPagination","onEndReached","columnsProp","filterInput","checkFilterCombination","emptyComponent","onSortByUpdate","cellRenderer","endAdornment","setColumns","tableRef","endReachCallbackThreshold","onColumnResizeInternal","onColumnResizeEndInternal","filterRef","scrollToTop","isDesc","newSort","newSortProperty","newSortBy","resetSort","maxScroll","onEndReachedInternal","scrollOffset","onScroll","scrollUpdateWasRequested","onFilterUpdateInternal","newFilterValue","buildErrorView","buildEmptyView","AssignmentIcon","empty","MemoizedList","outerRef","itemSize","includeAddColumn","Row","cellData","List","EntityCollectionRowActions","frozen","selectionEnabled","highlightEntity","onCollectionChange","unhighlightEntity","hideId","selectionController","largeLayout","onCheckedChange","checked","hasActions","hasCollapsedActions","collapsedActions","uncollapsedActions","Menu","MoreVertIcon","MenuItem","CollectionTableToolbar","searchInputRef","searchLoading","clearFilterButton","FilterListOffIcon","sizeSelect","SearchBar","operationLabels","multipleSelectOperations","ReferenceFilterField","possibleOperations","fieldOperation","setOperation","updateFilter","op","prevOpIsArray","newOpIsArray","hasNewValue","doOpenDialog","buildEntry","StringNumberFilterField","TextField","ClearIcon","BooleanFilterField","valueSetToTrue","BooleanSwitchWithLabel","DateTimeFilterField","COLLECTION_GROUP_PARENT_ID","useColumnIds","includeSubcollections","hideAndExpandKeys","getDefaultColumnKeys","keys","getColumnKeysForProperty","subCol","includeSubCollections","propertyKeys","additionalFields","subCollections","columnIds","subCollectionIds","subColId","childKey","DEFAULT_STATE","EntityCollectionTableContext","EntityCollectionTable","actionsStart","tableRowActionsBuilder","uniqueFieldValidator","getPropertyFor","highlightedEntities","onEntityClick","onSizeChanged","textSearchEnabled","inlineEditing","displayedColumnIds","defaultSize","setFilterValues","setSortBy","setSearchString","clearFilter","setItemCount","pageSize","paginationEnabled","filterable","sortable","additionalIDHeaderWidget","getIdColumnWidth","onTextSearchClick","textSearchLoading","disabledFilterChange","selectedEntities","setSize","setSelectedCell","loadNextPage","resetPagination","updateSize","onTextSearch","newSearchString","additionalFieldsMap","aC","escFunction","unselect","cell","propertyCellRenderer","additionalCellRenderer","additionalField","Builder","collectionColumns","columnsResult","filterableProperty","hoverOrOpen","additionalTableColumns","idColumn","columnKey","updatedFilterValues","filterValue","setFilterValue","baseProperty","partOfArray","useDataOrder","entitiesDisplayedFirst","displayedFirstId","useDebouncedData","deps","deferredData","setDeferredData","dataLength","currentDeps","haveDepsChanged","immediateUpdate","DEFAULT_PAGE_SIZE","lastDeleteTimestamp","forceFilterFromProps","initialFilter","initialSort","forceFilterFromCollection","popupCell","initialSortInternal","rawData","setRawData","updateFilterValues","updatedFilter","orderedData","DeleteEntityDialog","entityOrEntitiesToDelete","onClose","onEntityDelete","onMultipleEntitiesDelete","entityOrEntities","setUsedEntityOrEntities","multipleEntities","setMultipleEntities","revisedEntityOrEntities","handleCancel","performDelete","handleOk","results","success","dialogTitle","Dialog","DialogContent","DialogActions","toArray","EntityCollectionViewActions","relativePath","parentCollectionIds","onNewClick","onMultipleDeleteClick","tableController","collectionEntitiesCount","plugins","addButton","AddIcon","multipleDeleteEnabled","multipleDeleteButton","button","DeleteIcon","actionProps","Action","plugin","j","useDraggable","containerRef","innerRef","y","onMove","relX","relY","listeningRef","onMouseDown","onMouseMove","onMouseUp","onMouseDownInner","current","innerCurrent","useWindowSize","useLayoutEffect","ElementResizeListener","onResize","rafRef","objectRef","onResizeRef","_onResize","onLoad","FormikArrayContainer","addLabel","onInternalIdAdded","includeAddButton","newDefaultEntry","setFieldValue","ArrayContainer","SwitchControl","form","allowIndeterminate","formControlLabel","FieldHelperText","includeDescription","hasDescription","InfoIcon","SelectFieldBinding","touched","handleClearClick","LabelWithIcon","option","MultiSelectBinding","list","CloseIcon","ArrayOfReferencesFieldBinding","isSubmitting","tableMode","expanded","onEntryClick","internalId","entryValue","ExpandablePanel","StorageItemPreview","onRemove","RemoveIcon","disabledClasses","nonActiveDropClasses","StorageUploadFieldBinding","FileDropComponent","isDraggingOver","droppableProvided","onClear","fieldBackgroundMixin","fieldBackgroundDisabledMixin","fieldBackgroundHoverMixin","focusedMixin","Draggable","provided","snapshot","moveItem","fromIndex","toIndex","onDragEnd","clearedStoragePathOrDownloadUrl","DragDropContext","Droppable","rubric","TextFieldBinding","inputType","isMultiline","Collapse","SwitchFieldBinding","DateTimeFieldBinding","ReadOnlyFieldBinding","ReferenceFieldBinding","ReferenceFieldBindingInternal","PropertyFieldBinding","PropertyFieldBindingInternal","aIsBuilder","bIsBuilder","shouldPropertyReRender","underlyingValueHasChanged","partOfBlock","FieldComponent","Field","FastField","fieldProps","Component","FieldInternal","customFieldProps","useWrappedComponent","UsedComponent","shouldValidate","otherPropertyKey","defAProperty","rerenderThisProperty","Wrapper","fieldId","getFieldId","enabled","MapFieldBinding","pickOnlySomeKeys","mapFormView","entryKey","KeyValueFieldBinding","MapEditView","fieldName","internalState","setInternalState","getDataType","currentKeys","newKeys","keysToAdd","keysToRemove","newRowIds","k","originalValue","updateDataType","rowId","row","fieldKey","MapKeyValueRow","currentRowId","onFieldKeyChange","onDeleteClick","buildInput","ArrayKeyValueRow","newArrayValue","doUpdateDataType","ArrowDropDownIcon","selectedDataType","setSelectedDataType","RepeatFieldBinding","lastAddedId","setLastAddedId","arrayContainer","BlockFieldBinding","BlockEntry","firstOneOfKey","typeInternal","setTypeInternal","formikContext","useFormikContext","updateType","enumValuesConfigs","typeFieldName","valueFieldName","newType","newSelectedProperty","mdParser","MarkdownIt","MdEditor","Plugins","MarkdownFieldBinding","valueRef","useInjectStyles","markdownCss","deferred","useDeferredValue","html","ArrayCustomShapedFieldBinding","ErrorFocus","isValidating","errors","errorElement","scrollableParent","getScrollableParent","top","isScrollable","ele","hasScrollableContent","overflowYStyle","isOverflowHidden","CustomIdField","customId","idSetAutomatically","ErrorMessage","editEntityAction","copyEntityAction","FileCopyIcon","deleteEntityAction","closeDialog","EntityForm","EntityFormInternal","inputCollection","onEntitySaveRequested","onDiscard","onModified","onValuesChanged","onIdChange","onFormContextChange","autoSave","onIdUpdateError","initialResolvedCollection","mustSetCustomId","initialEntityId","closeAfterSaveRef","baseDataSourceValues","setEntityId","entityIdError","setEntityIdError","savingError","setSavingError","initialValuesRef","initialValues","internalValues","setInternalValues","doOnValuesChanges","save","onIdUpdate","updatedId","underlyingChanges","latestValue","eventName","saveFormValues","formikActions","validationSchema","getActionsForEntity","customEntityActions","createEnabled","deleteEnabled","Formik","pluginActions","formContext","InnerForm","handleSubmit","dirty","entityActions","formActions","modified","formValue","formFields","cmsFormFieldProps","formRef","Form","PopupFormField","PopupFormFieldInternal","tableKey","entityProp","onCellValueChange","container","popupLocation","setPopupLocation","windowSize","draggableRef","initialPositionSet","getInitialLocation","normalizePosition","draggableBoundingRect","updatePopupLocation","position","newPosition","adaptResize","saveValue","internalForm","draggable","Portal","EntityCollectionView","isSubCollection","collectionProp","userOverride","canCreateEntities","selectedNavigationEntity","setSelectedNavigationEntity","deleteEntityClicked","setDeleteEntityClicked","setTextSearchLoading","setLastDeleteTimestamp","docsCount","setDocsCount","unselectNavigatedEntity","currentSelection","checkInlineEditing","popOverOpen","setPopOverOpen","useSelectionController","usedSelectionController","toggleEntitySelection","isEntitySelected","setSelectedEntities","onPopupClose","clickedEntity","selectedEntity","internalOnEntityDelete","_path","internalOnMultipleEntitiesDelete","onCollectionModifiedForUser","partialCollection","currentStoredConfig","updatedConfig","localCollection","buildPropertyWidthOverwrite","setIn","saveProps","resolvedFullPath","subcollectionColumns","collectionGroupParentCollections","collectionsWithPath","updateLastDeleteTimestamp","actionsWidth","EntitiesCount","buildAdditionalHeaderWidget","HeaderAction","addColumnComponentInternal","textSearchInitialised","setTextSearchInitialised","EntityIdHeaderWidget","onCountChange","count","setCount","setOpenPopup","SearchIcon","ReferenceSelectionInner","pathInput","selectedEntityIdsProp","description","maxSelection","sideDialogContext","useSideDialogContext","setEntitiesDisplayedFirst","onDone","ReferenceDialogActions","NavigationGroup","group","userConfigurationPersistence","g","NavigationCollectionCard","view","collectionIcon","navigate","useNavigate","favourite","Card","StarIcon","StarBorderIcon","ArrowForwardIcon","NavigationChip","onIconClick","FavouritesView","favouriteCollections","scrollsMap","useRestoreScroll","location","useLocation","scroll","setScroll","direction","setDirection","handleScroll","search","JsSearch","DefaultHomePage","additionalActions","additionalChildrenStart","additionalChildrenEnd","navigationEntries","groups","filteredUrls","setFilteredUrls","filteredNavigationEntries","updateSearchResults","searchResult","allGroups","additionalPluginChildrenStart","additionalPluginChildrenEnd","additionalPluginSections","sectionProps","section","Container","AdditionalCards","thisGroupCollections","AdditionalCard","FieldConfigBadge","classes","defaultPropertyConfig","getDefaultFieldConfig","NotFoundPage","ReactLink","DeleteConfirmationDialog","onAccept","onCancel","LoadingButton","FireCMSLogo","FireCMSAppBar","startAdornment","drawerOpen","dropDownActions","includeDrawer","userProp","toggleMode","user","avatarComponent","Avatar","initial","DarkModeIcon","LightModeIcon","LogoutIcon","buildIdsMap","droppableId","internalIdsRef","internalIds","setInternalIds","newInternalIds","hashValue","newInternalId","insertInEnd","newIds","remove","copyingItem","sourceIndex","destinationIndex","temp","arrayMove","ArrayContainerItem","droppableSnapshot","isDragging","measuring","menuOverflow","ArrayItemOptions","contentOverflow","removed","ReferenceWidget","onReferenceSelected","onMultipleReferenceSelected","references","required","referenceDialogProps","usedCollection","fireCMSLogo","useBrowserTitleAndIcon","logo","link","MAIN_TAB_VALUE","EntityView","selectedSubPath","onValuesAreModified","formWidth","onUpdate","saving","setSaving","valuesToBeSaved","setValuesToBeSaved","saveEntity","setFormContext","setStatus","modifiedValuesRef","modifiedValues","subcollections","subcollectionsCount","customViews","customViewsCount","hasAdditionalViews","selectedTabRef","mainViewVisible","setUsedEntity","readOnly","setReadOnly","editEnabled","closeAfterSave","onSaveEntityRequest","resolvedEntityViews","customViewsView","colIndex","globalLoading","subCollectionsViews","subcollectionId","onSideTabClick","prevEntity","buildForm","subcollectionTabs","Tab","customViewTabs","Tabs","useNavigationUnsavedChangesDialog","when","nextLocation","setNextLocation","navigator","UNSAFE_NavigationContext","blocker","retry","unblock","tx","autoUnblockingTx","UnsavedChangesDialog","SideDialogContext","blocked","SideDialogs","sidePanels","panels","panel","SideDialogView","offsetPosition","drawerCloseRequested","setDrawerCloseRequested","setBlocked","blockedNavigationMessage","setBlockedNavigationMessage","widthRef","navigationWasBlocked","handleNavigationOk","handleNavigationCancel","handleDrawerCloseOk","handleDrawerCloseCancel","onCloseRequest","force","Sheet","EntitySidePanel","beforeunload","NEW_URL_HASH","getEntityViewWidth","mainViewSelected","resolvedWidth","useBuildSideEntityController","initialised","smallLayout","newFlag","entityOrCollectionPath","panelsFromUrl","buildSidePanelsFromUrl","propsToSidePanel","navigationViewsForPath","lastCollectionPath","previousEntry","lastSidePanel","useBuildSideDialogsController","setSidePanels","sidePanelsRef","routesStore","routesCount","updateSidePanels","baseLocation","panelProps","useLocaleConfig","dateFnsLocale","registerLocale","setDefaultLocale","getParentReferencesFromPath","DEFAULT_BASE_PATH","DEFAULT_COLLECTION_PATH","useBuildNavigationController","basePath","baseCollectionPath","baseCollections","baseViews","setCollections","views","setViews","setInitialised","topLevelNavigation","setTopLevelNavigation","navigationLoading","setNavigationLoading","navigationLoadingError","setNavigationLoadingError","cleanBasePath","cleanBaseCollectionPath","homeUrl","fullCollectionPath","buildCMSUrlPath","encodePath","buildUrlCollectionPath","computeTopNavigation","refreshNavigation","resolvedCollections","resolvedViews","resolveCollections","resolveCMSViews","getCollection","idOrPath","includeUserOverride","baseCollection","overriddenCollection","permissions","getCollectionFromPaths","currentCollections","pathSegment","getCollectionFromIds","ids","isUrlCollectionPath","urlPathToDataPath","buildUrlEditCollectionPath","resolveAliasesFrom","state","getAllParentCollectionsForPath","getParentCollectionIds","r","convertIdsToPaths","filterOutNotAllowedCollections","useBuildDataSource","delegate","propertyConfigs","startAfter","orderBy","order","isCollectionGroup","firestoreValues","cmsToDelegateModel","updatedFirestoreValues","buildReference","buildGeoPoint","buildDate","buildDelete","FireCMS","modeController","entityLinkBuilder","dateTimeFormat","dataSourceDelegate","onAnalyticsEvent","components","pluginsLoading","CenteredView","FireCMSInternal","childrenResult","Drawer","closeDrawer","tooltipsOpen","ungroupedNavigationViews","buildGroupHeader","DrawerNavigationItem","listItem","NavLink","isActive","DRAWER_WIDTH","Scaffold","autoOpenDrawer","DefaultDrawer","drawerProps","FireCMSAppBarComponent","fireCMSAppBarComponentProps","setDrawerOpen","handleDrawerClose","computedDrawerOpen","StyledDrawer","DrawerHeader","innerDrawer","MenuIcon","Link","ChevronLeftIcon","DEFAULT_FIELD_CONFIGS","ShortTextIcon","SubjectIcon","FormatQuoteIcon","HttpIcon","EmailIcon","ListIcon","ListAltIcon","NumbersIcon","FormatListNumberedIcon","UploadFileIcon","DriveFolderUploadIcon","LinkIcon","AddLinkIcon","FlagIcon","ScheduleIcon","BallotIcon","RepeatIcon","ViewStreamIcon","getDefaultFieldId","defaultFieldId","defaultFieldConfig","NavigationRoutes","HomePage","customRoutes","cmsViews","cmsView","buildCMSViewRoute","collectionRoutes","urlPath","Route","Routes","useBuildModeController","prefersDarkModeQuery","prefersDarkMode","setMode","setDocumentMode","setDarkMode","setLightMode","useBuildLocalConfigurationPersistence","configCache","setConfigCache","getCollectionFromStorage","storageKey","getCollectionConfig","onCollectionModified","currentCache","cachedConfig","newConfig","recentlyVisitedPaths","_setRecentlyVisitedPaths","favouritePaths","_setFavouritePaths","collapsedGroups","_setCollapsedGroups","setRecentlyVisitedPaths","setFavouritePaths","setCollapsedGroups"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
|