@firecms/data_import_export 3.0.0-canary.6 → 3.0.0-canary.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/hooks/useImportConfig.tsx","../src/utils/file_to_json.ts","../src/utils/data.ts","../src/utils/get_import_inference_type.ts","../src/utils/get_properties_mapping.ts","../src/components/DataNewPropertiesMapping.tsx","../src/components/ImportFileUpload.tsx","../src/components/ImportNewPropertyFieldPreview.tsx","../src/components/ImportSaveInProgress.tsx","../src/export_import/ImportCollectionAction.tsx","../src/export_import/export.ts","../src/export_import/ExportCollectionAction.tsx","../src/useImportExportPlugin.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Entity, Property } from \"@firecms/core\";\nimport { ImportConfig } from \"../types\";\n\nexport const useImportConfig = (): ImportConfig => {\n\n const [inUse, setInUse] = useState<boolean>(false);\n const [idColumn, setIdColumn] = useState<string | undefined>();\n const [importData, setImportData] = useState<object[]>([]);\n const [entities, setEntities] = useState<Entity<any>[]>([]);\n const [headersMapping, setHeadersMapping] = useState<Record<string, string | null>>({});\n const [originProperties, setOriginProperties] = useState<Record<string, Property>>({});\n\n return {\n inUse,\n setInUse,\n idColumn,\n setIdColumn,\n entities,\n setEntities,\n importData,\n setImportData,\n headersMapping,\n setHeadersMapping,\n originProperties,\n setOriginProperties,\n };\n};\n","import * as XLSX from \"xlsx\";\n\nexport function convertFileToJson(file: File): Promise<object[]> {\n return new Promise((resolve, reject) => {\n // check if file is a JSON file\n if (file.type === \"application/json\") {\n console.debug(\"Converting JSON file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = function (e) {\n const data = e.target?.result as string;\n const jsonData = JSON.parse(data);\n if (!Array.isArray(jsonData)) {\n reject(new Error(\"JSON file should contain an array of objects\"));\n }\n resolve(jsonData);\n };\n reader.readAsText(file);\n } else {\n console.debug(\"Converting Excel file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = function (e) {\n\n const data = new Uint8Array(e.target?.result as ArrayBuffer);\n const workbook = XLSX.read(data,\n {\n type: \"array\",\n codepage: 65001,\n cellDates: true,\n });\n const worksheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[worksheetName];\n const parsedData: Array<any> = XLSX.utils.sheet_to_json(worksheet);\n const cleanedData = parsedData.map(mapJsonParse);\n const jsonData = cleanedData.map(unflattenObject);\n resolve(jsonData);\n };\n reader.readAsArrayBuffer(file);\n }\n });\n}\n\nfunction mapJsonParse(obj: Record<string, any>) {\n return Object.keys(obj).reduce((acc: Record<string, any>, key) => {\n try {\n acc[key] = JSON.parse(obj[key]);\n } catch (e) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\n/**\n * Take an object with keys of type `address.street`, `address.city` and\n * convert it to an object with nested objects like `{ address: { street: ..., city: ... } }`\n * @param flatObj\n */\nexport function unflattenObject(flatObj: { [key: string]: any }) {\n return Object.keys(flatObj).reduce((nestedObj, key) => {\n let currentObj = nestedObj;\n const keyParts = key.split(\".\");\n keyParts.forEach((keyPart, i) => {\n\n if (/^[\\w]+\\[\\d+\\]$/.test(keyPart)) {\n const mainPropertyName = keyPart.slice(0, keyPart.indexOf(\"[\"));\n const index = parseInt(keyPart.slice(keyPart.indexOf(\"[\") + 1, keyPart.indexOf(\"]\")));\n\n if (!currentObj[mainPropertyName]) {\n currentObj[mainPropertyName] = []\n }\n\n if (i !== keyParts.length - 1) {\n currentObj[mainPropertyName][index] = currentObj[mainPropertyName][index] || {};\n currentObj = currentObj[mainPropertyName][index];\n } else {\n currentObj[mainPropertyName][index] = flatObj[key];\n }\n } else if (i !== keyParts.length - 1) {\n currentObj[keyPart] = currentObj[keyPart] || {};\n currentObj = currentObj[keyPart];\n } else {\n currentObj[keyPart] = flatObj[key];\n }\n\n });\n return nestedObj;\n }, {} as { [key: string]: any });\n}\n","import { DataType, Entity, EntityReference, getPropertyInPath, Properties } from \"@firecms/core\";\nimport { unflattenObject } from \"./file_to_json\";\n\ntype DataTypeMapping = {\n from: DataType;\n fromSubtype?: DataType;\n to: DataType;\n toSubtype?: DataType;\n}\n\nexport function convertDataToEntity(data: Record<any, any>,\n idColumn: string | undefined,\n headersMapping: Record<string, string | null>,\n properties: Properties,\n propertiesMapping: Record<string, DataTypeMapping>,\n path: string): Entity<any> {\n const flatObject = flattenEntry(data);\n if (idColumn)\n delete flatObject[idColumn];\n const mappedKeysObject = Object.entries(flatObject)\n .map(([key, value]) => {\n const mappedKey = headersMapping[key] ?? key;\n\n const mappedProperty = getPropertyInPath(properties, mappedKey);\n if (!mappedProperty)\n return {};\n\n const propertyMapping = propertiesMapping[mappedKey];\n let valueResult = value;\n if (propertyMapping) {\n valueResult = processValueMapping(value, propertyMapping);\n }\n return ({\n [mappedKey]: valueResult\n });\n })\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n const values = unflattenObject(mappedKeysObject);\n return {\n id: idColumn ? data[idColumn] : undefined,\n values,\n path\n };\n}\n\nexport function flattenEntry(obj: any, parent = \"\"): any {\n return Object.keys(obj).reduce((acc, key) => {\n const prefixedKey = parent ? `${parent}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null && !Array.isArray(obj[key])) {\n Object.assign(acc, flattenEntry(obj[key], prefixedKey));\n } else {\n // @ts-ignore\n acc[prefixedKey] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\n// export function convertDataEntryValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// }: {\n// key?: string,\n// fullKey: string,\n// value: any,\n// idColumn?: string,\n// headersMapping: Record<string, string | null>,\n// properties: Properties,\n// propertiesMapping: Record<string, DataTypeMapping>\n// }): any {\n//\n// if (value === undefined) return value;\n// if (value === null) return value;\n//\n// if (Array.isArray(value)) {\n// const mappedKey = headersMapping[fullKey] || fullKey;\n// const valueMapping = propertiesMapping[mappedKey];\n// return processValueMapping(value, valueMapping);\n// // return value.map(v => convertDataEntryValue({ value: v, fullKey, idColumn, headersMapping, propertiesMapping }));\n// } else if (typeof value === \"object\") {\n// return convertDataObjectValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// });\n// } else {\n// const mappedKey = headersMapping[fullKey] || fullKey;\n// const valueMapping = propertiesMapping[mappedKey];\n// return processValueMapping(value, valueMapping);\n// }\n// }\n\n// export function convertDataObjectValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// }: {\n// key?: string,\n// fullKey?: string,\n// value: object,\n// idColumn?: string,\n// headersMapping: Record<string, string | null>,\n// properties: Properties,\n// propertiesMapping: Record<string, DataTypeMapping>\n// }): object {\n//\n// if (value instanceof Date) {\n// const mappedKey = fullKey ? headersMapping[fullKey] || fullKey : undefined;\n// const valueMapping = mappedKey ? propertiesMapping[mappedKey] : undefined;\n// return processValueMapping(value, valueMapping);\n// }\n//\n// return Object.entries(value)\n// .map(([childKey, childValue]) => {\n// const childFullKey = fullKey ? `${fullKey}.${childKey}` : childKey;\n// const mappedKey = headersMapping[childFullKey] ?? childFullKey;\n// const mappedKeyLastPart = mappedKey.split(\".\").slice(-1)[0];\n// const property = getPropertyInPath(properties, mappedKey);\n// // if (!property) {\n// // console.log(\"ppp\", { properties, mappedKey, })\n// // return {};\n// // }\n// return ({\n// [mappedKeyLastPart]: convertDataEntryValue({\n// key: childKey,\n// fullKey: childFullKey,\n// value: childValue,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// })\n// });\n// })\n// .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n// }\n\nexport function processValueMapping(value: any, valueMapping?: DataTypeMapping): any {\n if (valueMapping === undefined) return value;\n const {\n from,\n to\n } = valueMapping;\n if (from === \"array\" && to === \"array\" && valueMapping.fromSubtype && valueMapping.toSubtype && Array.isArray(value)) {\n return value.map(v => processValueMapping(v, {\n from: valueMapping.fromSubtype!,\n to: valueMapping.toSubtype!\n }));\n } else if (from === \"string\" && to === \"number\" && typeof value === \"string\") {\n return Number(value);\n } else if (from === \"string\" && to === \"array\" && valueMapping.toSubtype && typeof value === \"string\") {\n return value.split(\",\").map((v: string) => processValueMapping(v, {\n from: \"string\",\n to: valueMapping.toSubtype!\n }));\n } else if (from === \"string\" && to === \"boolean\") {\n return value === \"true\";\n } else if (from === \"number\" && to === \"boolean\") {\n return value === 1;\n } else if (from === \"boolean\" && to === \"number\") {\n return value ? 1 : 0;\n } else if (from === \"boolean\" && to === \"string\") {\n return value ? \"true\" : \"false\";\n } else if (from === \"number\" && to === \"string\" && typeof value === \"number\") {\n return value.toString();\n } else if (from === \"string\" && to === \"array\" && typeof value === \"string\") {\n return value.split(\",\").map((v: string) => v.trim());\n } else if (from === \"string\" && to === \"date\" && typeof value === \"string\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (from === \"date\" && to === \"string\") {\n return value instanceof Date && value.toISOString();\n } else if (from === \"number\" && to === \"date\" && typeof value === \"number\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (from === \"string\" && to === \"reference\" && typeof value === \"string\") {\n // split value into path and entityId (entityId is the last part of the path, after the last /)\n const path = value.split(\"/\").slice(0, -1).join(\"/\");\n const entityId = value.split(\"/\").slice(-1)[0];\n return new EntityReference(entityId, path);\n\n } else if (from === to) {\n return value;\n } else if (from === \"array\" && to === \"string\" && Array.isArray(value)) {\n return value.join(\",\");\n }\n\n return value;\n}\n","import { DataType } from \"@firecms/core\";\n\nexport function getInferenceType(value: any): DataType {\n if (typeof value === \"number\")\n return \"number\";\n else if (typeof value === \"string\")\n return \"string\";\n else if (typeof value === \"boolean\")\n return \"boolean\";\n else if (value instanceof Date)\n return \"date\";\n else if (Array.isArray(value))\n return \"array\";\n return \"map\";\n}\n\n\nfunction isUnixTimestamp(num: number): boolean {\n const numString = num.toString();\n // check if the number has 13 digits\n const isLengthValid = numString.length === 13;\n\n // check if it falls in the expected Unix timestamp range (from 1970 to 2100)\n const isInRange = num >= 0 && num <= 4102444800000;\n\n return isLengthValid && isInRange;\n}\n","import { DataType, getPropertyInPath, Properties, Property } from \"@firecms/core\";\nimport { DataTypeMapping } from \"../types\";\n\nexport function getPropertiesMapping(originProperties: Properties, newProperties: Properties): Record<string, DataTypeMapping> {\n\n function updateMapping(properties: Record<string, Property>, namespace?: string): Record<string, DataTypeMapping> {\n\n const dataMapping: Record<string, DataTypeMapping> = {};\n\n Object.keys(properties).forEach((key) => {\n\n const currentKey = namespace ? `${namespace}.${key}` : key;\n\n const property = getPropertyInPath(properties, key) as Property;\n const inferredProperty = getPropertyInPath(originProperties, currentKey) as Property;\n\n if (property) {\n if (property.dataType === \"map\" && property.properties) {\n const nestedMapping = updateMapping(property.properties as Record<string, Property>, currentKey);\n Object.keys(nestedMapping).forEach((nestedKey) => {\n dataMapping[`${currentKey}.${nestedKey}`] = nestedMapping[nestedKey];\n });\n return;\n }\n\n if (inferredProperty) {\n\n const from = inferredProperty.dataType;\n const to = property.dataType;\n let fromSubtype: DataType | undefined;\n let toSubtype: DataType | undefined;\n\n if (property.dataType === \"array\" && property.of) {\n toSubtype = (property.of as Property).dataType;\n }\n\n if (inferredProperty?.dataType === \"array\" && inferredProperty?.of) {\n fromSubtype = (inferredProperty.of as Property).dataType;\n }\n\n if (from !== to || fromSubtype !== toSubtype) {\n dataMapping[key] = {\n from,\n to,\n fromSubtype,\n toSubtype\n };\n }\n }\n\n }\n\n });\n\n return dataMapping;\n }\n\n return updateMapping(newProperties);\n}\n","import { getPropertyInPath, Property, } from \"@firecms/core\";\nimport {\n ChevronRightIcon,\n Select,\n SelectItem,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Typography\n} from \"@firecms/ui\";\n\nexport interface DataPropertyMappingProps {\n idColumn?: string;\n headersMapping: Record<string, string | null>;\n originProperties: Record<string, Property>;\n destinationProperties: Record<string, Property>;\n onIdPropertyChanged: (value: string) => void;\n buildPropertyView?: (props: {\n isIdColumn: boolean,\n property: Property | null,\n propertyKey: string | null,\n importKey: string\n }) => React.ReactNode;\n}\n\nexport function DataNewPropertiesMapping({\n idColumn,\n headersMapping,\n originProperties,\n destinationProperties,\n onIdPropertyChanged,\n buildPropertyView,\n }: DataPropertyMappingProps) {\n\n return (\n <>\n\n <IdSelectField idColumn={idColumn}\n headersMapping={headersMapping}\n onChange={onIdPropertyChanged}/>\n\n <Table style={{\n tableLayout: \"fixed\"\n }}>\n <TableHeader>\n <TableCell header={true} style={{ width: \"20%\" }}>\n Column in file\n </TableCell>\n <TableCell header={true}>\n </TableCell>\n <TableCell header={true} style={{ width: \"75%\" }}>\n Property\n </TableCell>\n </TableHeader>\n <TableBody>\n {destinationProperties &&\n Object.entries(headersMapping)\n .map(([importKey, mappedKey]) => {\n const propertyKey = headersMapping[importKey];\n const property = mappedKey ? getPropertyInPath(destinationProperties, mappedKey) as Property : null;\n\n const originProperty = getPropertyInPath(originProperties, importKey) as Property | undefined;\n const originDataType = originProperty ? (originProperty.dataType === \"array\" && typeof originProperty.of === \"object\"\n ? `${originProperty.dataType} - ${(originProperty.of as Property).dataType}`\n : originProperty.dataType)\n : undefined;\n return <TableRow key={importKey} style={{ height: \"90px\" }}>\n <TableCell style={{ width: \"20%\" }}>\n <Typography variant={\"body2\"}>{importKey}</Typography>\n {originProperty && <Typography\n variant={\"caption\"}\n color={\"secondary\"}\n >{originDataType}</Typography>}\n </TableCell>\n <TableCell>\n <ChevronRightIcon/>\n </TableCell>\n <TableCell className={importKey === idColumn ? \"text-center\" : undefined}\n style={{ width: \"75%\" }}>\n {buildPropertyView?.({\n isIdColumn: importKey === idColumn,\n property,\n propertyKey,\n importKey\n })\n }\n </TableCell>\n </TableRow>;\n }\n )}\n </TableBody>\n </Table>\n </>\n );\n}\n\nfunction IdSelectField({\n idColumn,\n headersMapping,\n onChange\n }: {\n idColumn?: string,\n headersMapping: Record<string, string | null>;\n onChange: (value: string) => void\n}) {\n return <div>\n <Select\n size={\"small\"}\n value={idColumn ?? \"\"}\n onChange={(event) => {\n onChange(event.target.value as string);\n }}\n renderValue={(value) => {\n return <Typography variant={\"body2\"}>\n {value !== \"\" ? value : \"Autogenerate ID\"}\n </Typography>;\n }}\n label={\"Column that will be used as ID for each document\"}>\n <SelectItem value={\"\"}>Autogenerate ID</SelectItem>\n {Object.entries(headersMapping).map(([key, value]) => {\n return <SelectItem key={key} value={key}>{key}</SelectItem>;\n })}\n </Select>\n </div>;\n}\n","import { FileUpload, UploadIcon } from \"@firecms/ui\";\nimport { convertFileToJson } from \"../utils/file_to_json\";\nimport { useSnackbarController } from \"@firecms/core\";\n\nexport function ImportFileUpload({ onDataAdded }: { onDataAdded: (data: object[]) => void }) {\n const snackbarController = useSnackbarController();\n return <FileUpload\n accept={{\n \"text/*\": [\".csv\", \".xls\", \".xlsx\"],\n \"application/vnd.ms-excel\": [\".xls\", \".xlsx\"],\n \"application/msexcel\": [\".xls\", \".xlsx\"],\n \"application/vnd.ms-office\": [\".xls\", \".xlsx\"],\n \"application/xls\": [\".xls\", \".xlsx\"],\n \"application/x-xls\": [\".xls\", \".xlsx\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xls\", \".xlsx\"],\n \"application/json\": [\".json\"],\n }}\n preventDropOnDocument={true}\n size={\"small\"}\n maxFiles={1}\n uploadDescription={<><UploadIcon/>Drag and drop a file here or click to upload</>}\n onFilesAdded={(files: File[]) => {\n if (files.length > 0) {\n convertFileToJson(files[0])\n .then((jsonData) => {\n onDataAdded(jsonData);\n })\n .catch((error) => {\n console.error(\"Error parsing file\", error);\n snackbarController.open({ type: \"error\", message: error.message });\n });\n }\n }}/>\n}\n","import React from \"react\";\nimport { ErrorBoundary, PropertyConfigBadge, getFieldConfig, Property, useCustomizationController } from \"@firecms/core\";\nimport { EditIcon, IconButton, TextField, } from \"@firecms/ui\";\n\nexport function ImportNewPropertyFieldPreview({\n propertyKey,\n property,\n onEditClick,\n includeName = true,\n onPropertyNameChanged,\n propertyTypeView\n }: {\n propertyKey: string | null,\n property: Property | null\n includeName?: boolean,\n onEditClick?: () => void,\n onPropertyNameChanged?: (propertyKey: string, value: string) => void,\n propertyTypeView?: React.ReactNode\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n return <ErrorBoundary>\n <div\n className=\"flex flex-row w-full items-center\">\n\n <div className={\"mx-4\"}>\n {propertyTypeView ?? <PropertyConfigBadge propertyConfig={widget ?? undefined}/>}\n </div>\n\n <div className=\"w-full flex flex-col grow\">\n\n <div className={\"flex flex-row items-center gap-2\"}>\n {includeName &&\n <TextField\n size={\"small\"}\n className={\"text-base grow\"}\n value={property?.name ?? \"\"}\n onChange={(e) => {\n if (onPropertyNameChanged && propertyKey)\n onPropertyNameChanged(propertyKey, e.target.value);\n }}/>}\n\n <IconButton onClick={onEditClick} size={\"small\"}>\n <EditIcon size={\"small\"}/>\n </IconButton>\n </div>\n\n </div>\n\n\n </div>\n </ErrorBoundary>\n}\n","import { DataSource, Entity, EntityCollection, useDataSource } from \"@firecms/core\";\nimport { CenteredView, CircularProgress, Typography, } from \"@firecms/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { ImportConfig } from \"../types\";\n\nexport function ImportSaveInProgress<C extends EntityCollection>\n({\n path,\n importConfig,\n collection,\n onImportSuccess\n }:\n {\n path: string,\n importConfig: ImportConfig,\n collection: C,\n onImportSuccess: (collection: C) => void\n }) {\n\n console.log(\"ImportSaveInProgress\", path)\n const dataSource = useDataSource();\n\n const savingRef = useRef<boolean>(false);\n\n const [processedEntities, setProcessedEntities] = useState<number>(0);\n\n function save() {\n\n if (savingRef.current)\n return;\n\n savingRef.current = true;\n\n saveDataBatch(\n dataSource,\n collection,\n path,\n importConfig.entities,\n 0,\n 25,\n setProcessedEntities\n ).then(() => {\n onImportSuccess(collection);\n savingRef.current = false;\n });\n }\n\n useEffect(() => {\n save();\n }, []);\n\n return (\n <CenteredView className={\"flex flex-col gap-4 items-center\"}>\n <CircularProgress/>\n\n <Typography variant={\"h6\"}>\n Saving data\n </Typography>\n\n <Typography variant={\"body2\"}>\n {processedEntities}/{importConfig.entities.length} entities saved\n </Typography>\n\n <Typography variant={\"caption\"}>\n Do not close this tab or the import will be interrupted.\n </Typography>\n\n </CenteredView>\n );\n\n}\n\nfunction saveDataBatch(dataSource: DataSource,\n collection: EntityCollection,\n path: string,\n data: Partial<Entity<any>>[],\n offset = 0,\n batchSize = 25,\n onProgressUpdate: (progress: number) => void): Promise<void> {\n\n console.debug(\"Saving imported data\", offset, batchSize);\n\n const batch = data.slice(offset, offset + batchSize);\n return Promise.all(batch.map(d =>\n dataSource.saveEntity({\n path,\n values: d.values,\n entityId: d.id,\n collection,\n status: \"new\"\n })))\n .then(() => {\n if (offset + batchSize < data.length) {\n onProgressUpdate(offset + batchSize);\n return saveDataBatch(dataSource, collection, path, data, offset + batchSize, batchSize, onProgressUpdate);\n }\n onProgressUpdate(data.length);\n return Promise.resolve();\n });\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport {\n CollectionActionsProps,\n EntityCollectionTable,\n PropertyConfigBadge,\n getFieldConfig,\n getPropertiesWithPropertiesOrder,\n getPropertyInPath,\n Property,\n resolveCollection,\n ResolvedProperties,\n useCustomizationController,\n User,\n useSelectionController,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n Button,\n cn,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n FileUploadIcon,\n IconButton,\n Select,\n SelectItem,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { useImportConfig } from \"../hooks\";\nimport { convertDataToEntity, getInferenceType, getPropertiesMapping } from \"../utils\";\nimport { DataNewPropertiesMapping, ImportFileUpload, ImportSaveInProgress } from \"../components\";\nimport { ImportConfig } from \"../types\";\n\ntype ImportState = \"initial\" | \"mapping\" | \"preview\" | \"import_data_saving\";\n\nexport function ImportCollectionAction<M extends Record<string, any>, UserType extends User>({\n collection,\n path,\n collectionEntitiesCount,\n }: CollectionActionsProps<M, UserType>\n) {\n const customizationController = useCustomizationController();\n\n const snackbarController = useSnackbarController();\n\n const [open, setOpen] = React.useState(false);\n\n const [step, setStep] = React.useState<ImportState>(\"initial\");\n\n const importConfig = useImportConfig();\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n setStep(\"initial\");\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onMappingComplete = useCallback(() => {\n setStep(\"preview\");\n }, []);\n\n const onPreviewComplete = useCallback(() => {\n setStep(\"import_data_saving\");\n }, []);\n\n const onDataAdded = async (data: object[]) => {\n importConfig.setImportData(data);\n\n if (data.length > 0) {\n const originProperties = await buildEntityPropertiesFromData(data, getInferenceType);\n importConfig.setOriginProperties(originProperties);\n\n const headersMapping = buildHeadersMappingFromData(data);\n importConfig.setHeadersMapping(headersMapping);\n const firstKey = Object.keys(headersMapping)?.[0];\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n const idColumn = firstKey;\n importConfig.setIdColumn(idColumn);\n }\n }\n setTimeout(() => {\n setStep(\"mapping\");\n }, 100);\n // setStep(\"mapping\");\n };\n\n const resolvedCollection = resolveCollection({\n collection,\n path,\n fields: customizationController.propertyConfigs\n });\n\n const properties = getPropertiesWithPropertiesOrder<M>(resolvedCollection.properties, resolvedCollection.propertiesOrder as Extract<keyof M, string>[]) as ResolvedProperties<M>;\n\n const propertiesAndLevel = Object.entries(properties)\n .flatMap(([key, property]) => getPropertiesAndLevel(key, property, 0));\n const propertiesOrder = (resolvedCollection.propertiesOrder ?? Object.keys(resolvedCollection.properties)) as Extract<keyof M, string>[];\n if (collection.collectionGroup) {\n return null;\n }\n return <>\n\n <Tooltip title={\"Import\"}>\n <IconButton color={\"primary\"} onClick={handleClickOpen}>\n <FileUploadIcon/>\n </IconButton>\n </Tooltip>\n\n <Dialog open={open}\n fullWidth={step === \"preview\"}\n fullHeight={step === \"preview\"}\n maxWidth={step === \"initial\" ? \"lg\" : \"7xl\"}>\n <DialogContent className={\"flex flex-col gap-4 my-4\"} fullHeight={step === \"preview\"}>\n\n {step === \"initial\" && <>\n <Typography variant={\"h6\"}>Import data</Typography>\n <Typography variant={\"body2\"}>Upload a CSV, Excel or JSON file and map it to your existing\n schema</Typography>\n <ImportFileUpload onDataAdded={onDataAdded}/>\n </>}\n\n {step === \"mapping\" && <>\n <Typography variant={\"h6\"}>Map fields</Typography>\n <DataNewPropertiesMapping headersMapping={importConfig.headersMapping}\n idColumn={importConfig.idColumn}\n originProperties={importConfig.originProperties}\n destinationProperties={properties}\n onIdPropertyChanged={(value) => importConfig.setIdColumn(value)}\n buildPropertyView={({\n isIdColumn,\n property,\n propertyKey,\n importKey\n }) => {\n return <PropertyTreeSelect\n selectedPropertyKey={propertyKey ?? \"\"}\n properties={properties}\n propertiesAndLevel={propertiesAndLevel}\n isIdColumn={isIdColumn}\n onIdSelected={() => {\n importConfig.setIdColumn(importKey);\n }}\n onPropertySelected={(newPropertyKey) => {\n\n const newHeadersMapping: Record<string, string | null> = Object.entries(importConfig.headersMapping)\n .map(([currentImportKey, currentPropertyKey]) => {\n if (currentPropertyKey === newPropertyKey) {\n return { [currentImportKey]: null };\n }\n if (currentImportKey === importKey) {\n return { [currentImportKey]: newPropertyKey };\n }\n return { [currentImportKey]: currentPropertyKey };\n })\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n importConfig.setHeadersMapping(newHeadersMapping as Record<string, string>);\n\n if (newPropertyKey === importConfig.idColumn) {\n importConfig.setIdColumn(undefined);\n }\n\n }}\n />;\n }}/>\n </>}\n\n {step === \"preview\" && <ImportDataPreview importConfig={importConfig}\n properties={properties}\n propertiesOrder={propertiesOrder}/>}\n\n {step === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={collection}\n path={path}\n onImportSuccess={(importedCollection) => {\n handleClose();\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n }}\n />}\n\n </DialogContent>\n <DialogActions>\n\n {step === \"mapping\" && <Button onClick={() => setStep(\"initial\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n {step === \"preview\" && <Button onClick={() => setStep(\"mapping\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n {step === \"mapping\" && <Button variant=\"filled\"\n onClick={onMappingComplete}>\n Next\n </Button>}\n\n {step === \"preview\" && <Button variant=\"filled\"\n onClick={onPreviewComplete}>\n Save data\n </Button>}\n\n </DialogActions>\n </Dialog>\n\n </>;\n}\n\nconst internalIDValue = \"__internal_id__\";\n\nfunction PropertyTreeSelect({\n selectedPropertyKey,\n properties,\n onPropertySelected,\n onIdSelected,\n propertiesAndLevel,\n isIdColumn\n }: {\n selectedPropertyKey: string | null;\n properties: Record<string, Property>;\n onPropertySelected: (propertyKey: string | null) => void;\n onIdSelected: () => void;\n propertiesAndLevel: PropertyAndLevel[];\n isIdColumn?: boolean;\n}) {\n\n const selectedProperty = selectedPropertyKey ? getPropertyInPath(properties, selectedPropertyKey) : null;\n\n const renderValue = useCallback((selectedPropertyKey: string) => {\n\n if (selectedPropertyKey === internalIDValue) {\n return <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>;\n }\n\n if (!selectedPropertyKey || !selectedProperty) {\n return <Typography variant={\"body2\"} className={\"p-4\"}>Do not import this property</Typography>;\n }\n\n return <PropertySelectEntry propertyKey={selectedPropertyKey}\n property={selectedProperty as Property}/>;\n }, [selectedProperty]);\n\n const onSelectValueChange = useCallback((value: string) => {\n if (value === internalIDValue) {\n onIdSelected();\n onPropertySelected(null);\n } else if (value === \"\") {\n onPropertySelected(null);\n } else {\n onPropertySelected(value);\n }\n }, []);\n\n return <Select value={isIdColumn ? internalIDValue : (selectedPropertyKey ?? undefined)}\n onValueChange={onSelectValueChange}\n renderValue={renderValue}>\n\n <SelectItem value={\"\"}>\n <Typography variant={\"body2\"} className={\"p-4\"}>Do not import this property</Typography>\n </SelectItem>\n\n <SelectItem value={internalIDValue}>\n <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>\n </SelectItem>\n\n {propertiesAndLevel.map(({\n property,\n level,\n propertyKey\n }) => {\n return <SelectItem value={propertyKey}\n key={propertyKey}\n disabled={property.dataType === \"map\"}>\n <PropertySelectEntry propertyKey={propertyKey}\n property={property}\n level={level}/>\n </SelectItem>;\n })}\n\n </Select>;\n}\n\ntype PropertyAndLevel = {\n property: Property,\n level: number,\n propertyKey: string\n};\n\nfunction getPropertiesAndLevel(key: string, property: Property, level: number): PropertyAndLevel[] {\n const properties: PropertyAndLevel[] = [];\n properties.push({\n property,\n level,\n propertyKey: key\n });\n if (property.dataType === \"map\" && property.properties) {\n Object.entries(property.properties).forEach(([childKey, value]) => {\n properties.push(...getPropertiesAndLevel(`${key}.${childKey}`, value as Property, level + 1));\n });\n }\n return properties;\n}\n\nexport function PropertySelectEntry({\n propertyKey,\n property,\n level = 0\n }: {\n propertyKey: string;\n property: Property;\n level?: number;\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = getFieldConfig(property, propertyConfigs);\n\n return <div\n className=\"flex flex-row w-full text-start items-center h-full\">\n\n {new Array(level).fill(0).map((_, index) =>\n <div className={cn(defaultBorderMixin, \"ml-8 border-l h-12\")} key={index}/>)}\n\n <div className={\"m-4\"}>\n <Tooltip title={widget?.name}>\n <PropertyConfigBadge propertyConfig={widget}/>\n </Tooltip>\n </div>\n\n <div className={\"flex flex-col flex-grow p-2 pl-2\"}>\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property.name\n ? property.name\n : \"\\u00a0\"\n }\n </Typography>\n\n <Typography className=\" pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyKey}\n </Typography>\n </div>\n\n </div>;\n\n}\n\nexport function ImportDataPreview<M extends Record<string, any>>({\n importConfig,\n properties,\n propertiesOrder\n }: {\n importConfig: ImportConfig,\n properties: ResolvedProperties<M>,\n propertiesOrder: Extract<keyof M, string>[]\n}) {\n\n useEffect(() => {\n const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, propertiesMapping, \"TEMP_PATH\"));\n importConfig.setEntities(mappedData);\n }, []);\n\n const selectionController = useSelectionController();\n\n return <EntityCollectionTable\n title={<div>\n <Typography variant={\"subtitle2\"}>Imported data preview</Typography>\n <Typography variant={\"caption\"}>Entities with the same id will be overwritten</Typography>\n </div>}\n tableController={{\n data: importConfig.entities,\n dataLoading: false,\n noMoreToLoad: false\n }}\n endAdornment={<div className={\"h-12\"}/>}\n filterable={false}\n sortable={false}\n selectionController={selectionController}\n displayedColumnIds={propertiesOrder.map(p => ({\n key: p,\n disabled: false\n }))}\n properties={properties}/>\n\n}\n\nfunction buildHeadersMappingFromData(objArr: object[]) {\n const headersMapping: Record<string, string> = {};\n objArr.filter(Boolean).forEach((obj) => {\n Object.keys(obj).forEach((key) => {\n // @ts-ignore\n const child = obj[key];\n if (typeof child === \"object\" && !Array.isArray(child)) {\n Object.entries(buildHeadersMappingFromData([child])).forEach(([subKey, mapping]) => {\n headersMapping[`${key}.${subKey}`] = `${key}.${mapping}`;\n });\n }\n headersMapping[key] = key;\n });\n });\n return headersMapping;\n}\n","import {\n ArrayValuesCount,\n Entity,\n EntityReference,\n getArrayValuesCount,\n getValueInPath,\n ResolvedEntityCollection,\n ResolvedProperties,\n ResolvedProperty\n} from \"@firecms/core\";\n\ninterface Header {\n key: string;\n label: string;\n}\n\nexport function downloadExport<M extends Record<string, any>>(data: Entity<M>[],\n additionalData: Record<string, any>[] | undefined,\n collection: ResolvedEntityCollection<M>,\n flattenArrays: boolean,\n additionalHeaders: string[] | undefined,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n console.debug(\"Downloading export\", { dataLength: data.length, collection, exportType, dateExportType });\n const properties = collection.properties;\n\n if (exportType === \"csv\") {\n const arrayValuesCount = flattenArrays ? getArrayValuesCount(data.map(d => d.values)) : {};\n const headers = getExportHeaders(properties, additionalHeaders, arrayValuesCount);\n const exportableData = getCSVExportableData(data, additionalData, properties, headers, dateExportType);\n const headersData = entryToCSVRow(headers.map(h => h.label));\n const csvData = exportableData.map(entry => entryToCSVRow(entry));\n downloadBlob([headersData, ...csvData], `${collection.name}.csv`, \"text/csv\");\n } else {\n const exportableData = getJsonExportableData(data, additionalData, properties, dateExportType);\n const json = JSON.stringify(exportableData, null, 2);\n downloadBlob([json], `${collection.name}.json`, \"application/json\");\n }\n}\n\nexport function getCSVExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: ResolvedProperties,\n headers: Header[],\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"csv\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index], ...additional };\n });\n }\n\n return mergedData && mergedData.map((entry) => {\n return headers.map((header) => getValueInPath(entry, header.key));\n });\n}\n\nexport function getJsonExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: ResolvedProperties,\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"json\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index], ...additional };\n });\n }\n\n return mergedData;\n}\n\nfunction getExportHeaders<M extends Record<string, any>>(properties: ResolvedProperties<M>,\n additionalHeaders: string[] | undefined,\n arrayValuesCount?: ArrayValuesCount): Header[] {\n\n const headers: Header[] = [\n { label: \"id\", key: \"id\" },\n ...Object.entries(properties)\n .flatMap(([childKey, property]) => {\n if (arrayValuesCount && arrayValuesCount[childKey] > 1) {\n return Array.from({ length: arrayValuesCount[childKey] },\n (_, i) => getHeaders(property as ResolvedProperty, `${childKey}[${i}]`, \"\"))\n .flat();\n } else {\n return getHeaders(property as ResolvedProperty, childKey, \"\");\n }\n })\n ];\n\n if (additionalHeaders) {\n headers.push(...additionalHeaders.map(h => ({ label: h, key: h })));\n }\n\n return headers;\n}\n\n/**\n * Get headers for property. There could be more than one header per property\n * @param property\n * @param propertyKey\n * @param prefix\n */\nfunction getHeaders(property: ResolvedProperty, propertyKey: string, prefix = \"\"): Header[] {\n const currentKey = prefix ? `${prefix}.${propertyKey}` : propertyKey;\n if (property.dataType === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .map(([childKey, p]) => getHeaders(p, childKey, currentKey))\n .flat();\n } else {\n return [{ label: currentKey, key: currentKey }];\n }\n}\n\nfunction processValueForExport(inputValue: any,\n property: ResolvedProperty,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): any {\n\n let value;\n if (property.dataType === \"map\" && property.properties) {\n value = processValuesForExport(inputValue, property.properties as ResolvedProperties, exportType, dateExportType);\n } else if (property.dataType === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n if (Array.isArray(property.of)) {\n value = property.of.map((p, i) => processValueForExport(inputValue[i], p, exportType, dateExportType));\n } else if (property.of.dataType === \"map\") {\n value = exportType === \"csv\"\n ? inputValue.map((e) => JSON.stringify(e))\n : inputValue.map((e) => processValueForExport(e, property.of as ResolvedProperty, exportType, dateExportType));\n ;\n } else {\n value = inputValue.map((e) => processValueForExport(e, property.of as ResolvedProperty, exportType, dateExportType));\n }\n } else {\n value = inputValue;\n }\n } else if (property.dataType === \"reference\" && inputValue.isEntityReference && inputValue.isEntityReference()) {\n const ref = inputValue ? inputValue as EntityReference : undefined;\n value = ref ? ref.pathWithId : null;\n } else if (property.dataType === \"date\" && inputValue instanceof Date) {\n value = inputValue ? (dateExportType === \"timestamp\" ? inputValue.getTime() : inputValue.toISOString()) : null;\n } else {\n value = inputValue;\n }\n\n return value;\n}\n\nfunction processValuesForExport<M extends Record<string, any>>\n(inputValues: Record<keyof M, any>,\n properties: ResolvedProperties<M>,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): Record<keyof M, any> {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = processValueForExport(inputValue, property as ResolvedProperty, exportType, dateExportType);\n if (updatedValue === undefined) return {};\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as Record<keyof M, any>;\n return { ...inputValues, ...updatedValues };\n}\n\nfunction entryToCSVRow(entry: any[]) {\n return entry\n .map((v: any) => {\n if (v === null || v === undefined) return \"\";\n if (Array.isArray(v))\n return \"\\\"\" + JSON.stringify(v).replaceAll(\"\\\"\", \"\\\\\\\"\") + \"\\\"\";\n const s = String(v);\n return \"\\\"\" + s.replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n })\n .join(\",\") + \"\\r\\n\";\n}\n\nexport function downloadBlob(content: BlobPart[], filename: string, contentType: string) {\n const blob = new Blob(content, { type: contentType });\n const url = URL.createObjectURL(blob);\n const pom = document.createElement(\"a\");\n pom.href = url;\n pom.setAttribute(\"download\", filename);\n pom.click();\n}\n","import React, { useCallback } from \"react\";\n\nimport {\n CollectionActionsProps,\n Entity,\n EntityCollection,\n ExportConfig,\n resolveCollection,\n ResolvedEntityCollection,\n useCustomizationController,\n useDataSource,\n useFireCMSContext,\n useNavigationController,\n User\n} from \"@firecms/core\";\nimport {\n Alert,\n BooleanSwitchWithLabel,\n Button,\n CircularProgress,\n cn,\n Dialog,\n DialogActions,\n DialogContent,\n focusedMixin,\n GetAppIcon,\n IconButton,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { downloadExport } from \"./export\";\n\nconst DOCS_LIMIT = 500;\n\nexport function ExportCollectionAction<M extends Record<string, any>, UserType extends User>({\n collection: inputCollection,\n path: inputPath,\n collectionEntitiesCount,\n exportAllowed,\n notAllowedView\n }: CollectionActionsProps<M, UserType, EntityCollection<M, any>> & {\n exportAllowed?: (props: { collectionEntitiesCount: number, path: string, collection: EntityCollection }) => boolean;\n notAllowedView?: React.ReactNode;\n}) {\n\n const customizationController = useCustomizationController();\n\n const exportConfig = typeof inputCollection.exportable === \"object\" ? inputCollection.exportable : undefined;\n\n const dateRef = React.useRef<Date>(new Date());\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const context = useFireCMSContext<UserType>();\n const dataSource = useDataSource();\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const canExport = !exportAllowed || exportAllowed({\n collectionEntitiesCount,\n path,\n collection: inputCollection\n });\n\n const collection: ResolvedEntityCollection<M> = React.useMemo(() => resolveCollection({\n collection: inputCollection,\n path,\n fields: customizationController.propertyConfigs\n }), [inputCollection, path]);\n\n const [dataLoading, setDataLoading] = React.useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = React.useState<Error | undefined>();\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const fetchAdditionalFields = useCallback(async (entities: Entity<M>[]) => {\n\n const additionalExportFields = exportConfig?.additionalFields;\n const additionalFields = collection.additionalFields;\n\n const resolvedExportColumnsValues: Record<string, any>[] = additionalExportFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalExportFields.map(async (column) => {\n return {\n [column.key]: await column.builder({\n entity,\n context\n })\n };\n }))).reduce((a, b) => ({ ...a, ...b }), {});\n }))\n : [];\n\n const resolvedColumnsValues: Record<string, any>[] = additionalFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalFields\n .map(async (field) => {\n if (!field.value)\n return {};\n return {\n [field.key]: await field.value({\n entity,\n context\n })\n };\n }))).reduce((a, b) => ({ ...a, ...b }), {});\n }))\n : [];\n return [...resolvedExportColumnsValues, ...resolvedColumnsValues];\n }, [exportConfig?.additionalFields]);\n\n const doDownload = useCallback(async (collection: ResolvedEntityCollection<M>,\n exportConfig: ExportConfig<any> | undefined) => {\n\n setDataLoading(true);\n dataSource.fetchCollection<M>({\n path,\n collection\n })\n .then(async (data) => {\n setDataLoadingError(undefined);\n const additionalData = await fetchAdditionalFields(data);\n const additionalHeaders = [\n ...exportConfig?.additionalFields?.map(column => column.key) ?? [],\n ...collection.additionalFields?.map(field => field.key) ?? []\n ];\n downloadExport(data, additionalData, collection, flattenArrays, additionalHeaders, exportType, dateExportType);\n })\n .catch((e) => {\n console.error(\"Error loading export data\", e);\n setDataLoadingError(e);\n })\n .finally(() => setDataLoading(false));\n\n }, [dataSource, path, fetchAdditionalFields, flattenArrays, exportType, dateExportType]);\n\n const onOkClicked = useCallback(() => {\n doDownload(collection, exportConfig);\n handleClose();\n }, [doDownload, collection, exportConfig, handleClose]);\n\n return <>\n\n <Tooltip title={\"Export\"}>\n <IconButton color={\"primary\"} onClick={handleClickOpen}>\n <GetAppIcon/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <Typography variant={\"h6\"}>Export data</Typography>\n\n <div>Download the the content of this table as a CSV</div>\n\n {collectionEntitiesCount > DOCS_LIMIT &&\n <Alert color={\"warning\"}>\n <div>\n This collections has a large number\n of documents ({collectionEntitiesCount}).\n </div>\n </Alert>}\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-csv\" type=\"radio\" value=\"csv\" name=\"exportType\"\n checked={exportType === \"csv\"}\n onChange={() => setExportType(\"csv\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-csv\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-gray-300\">CSV</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-json\" type=\"radio\" value=\"json\" name=\"exportType\"\n checked={exportType === \"json\"}\n onChange={() => setExportType(\"json\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-json\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-gray-300\">JSON</label>\n </div>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-timestamp\" type=\"radio\" value=\"timestamp\" name=\"dateExportType\"\n checked={dateExportType === \"timestamp\"}\n onChange={() => setDateExportType(\"timestamp\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-timestamp\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-gray-300\">Dates as\n timestamps ({dateRef.current.getTime()})</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-string\" type=\"radio\" value=\"string\" name=\"dateExportType\"\n checked={dateExportType === \"string\"}\n onChange={() => setDateExportType(\"string\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-string\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-gray-300\">Dates as\n strings ({dateRef.current.toISOString()})</label>\n </div>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n {!canExport && notAllowedView}\n\n </DialogContent>\n\n <DialogActions>\n\n {dataLoading && <CircularProgress size={\"small\"}/>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button variant=\"filled\"\n onClick={onOkClicked}\n disabled={dataLoading || !canExport}>\n Download\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n","import React, { useMemo } from \"react\";\nimport { EntityCollection, FireCMSPlugin } from \"@firecms/core\";\nimport { ImportCollectionAction } from \"./export_import/ImportCollectionAction\";\nimport { ExportCollectionAction } from \"./export_import/ExportCollectionAction\";\n\n/**\n *\n */\nexport function useImportExportPlugin(props?: ImportExportPluginProps): FireCMSPlugin<any, any, any, ImportExportPluginProps> {\n\n return useMemo(() => ({\n name: \"Import/Export\",\n collections: {\n CollectionActions: [ImportCollectionAction, ExportCollectionAction],\n collectionActionsProps: props\n }\n }), [props]);\n}\n\nexport type ImportExportPluginProps = {\n exportAllowed?: (props: ExportAllowedParams) => boolean;\n notAllowedView: React.ReactNode;\n}\nexport type ExportAllowedParams = { collectionEntitiesCount: number, path: string, collection: EntityCollection };\n"],"names":["useImportConfig","inUse","setInUse","useState","idColumn","setIdColumn","importData","setImportData","entities","setEntities","headersMapping","setHeadersMapping","originProperties","setOriginProperties","convertFileToJson","file","resolve","reject","reader","e","data","jsonData","workbook","XLSX","worksheetName","worksheet","mapJsonParse","unflattenObject","obj","acc","key","flatObj","nestedObj","currentObj","keyParts","keyPart","i","mainPropertyName","index","convertDataToEntity","properties","propertiesMapping","path","flatObject","flattenEntry","mappedKeysObject","value","mappedKey","getPropertyInPath","propertyMapping","valueResult","processValueMapping","curr","values","parent","prefixedKey","valueMapping","from","to","v","entityId","EntityReference","getInferenceType","getPropertiesMapping","newProperties","updateMapping","namespace","dataMapping","currentKey","property","inferredProperty","nestedMapping","nestedKey","fromSubtype","toSubtype","DataNewPropertiesMapping","destinationProperties","onIdPropertyChanged","buildPropertyView","jsxs","Fragment","jsx","IdSelectField","Table","TableHeader","TableCell","TableBody","importKey","propertyKey","originProperty","originDataType","TableRow","Typography","ChevronRightIcon","onChange","Select","event","SelectItem","ImportFileUpload","onDataAdded","snackbarController","useSnackbarController","FileUpload","UploadIcon","files","error","ImportNewPropertyFieldPreview","onEditClick","includeName","onPropertyNameChanged","propertyTypeView","propertyConfigs","useCustomizationController","widget","getFieldConfig","ErrorBoundary","PropertyConfigBadge","TextField","IconButton","EditIcon","ImportSaveInProgress","importConfig","collection","onImportSuccess","dataSource","useDataSource","savingRef","useRef","processedEntities","setProcessedEntities","save","saveDataBatch","useEffect","CenteredView","CircularProgress","offset","batchSize","onProgressUpdate","batch","ImportCollectionAction","collectionEntitiesCount","customizationController","open","setOpen","React","step","setStep","handleClickOpen","useCallback","handleClose","onMappingComplete","onPreviewComplete","buildEntityPropertiesFromData","buildHeadersMappingFromData","firstKey","resolvedCollection","resolveCollection","getPropertiesWithPropertiesOrder","propertiesAndLevel","getPropertiesAndLevel","propertiesOrder","Tooltip","FileUploadIcon","Dialog","DialogContent","isIdColumn","PropertyTreeSelect","newPropertyKey","newHeadersMapping","currentImportKey","currentPropertyKey","ImportDataPreview","importedCollection","DialogActions","Button","internalIDValue","selectedPropertyKey","onPropertySelected","onIdSelected","selectedProperty","renderValue","PropertySelectEntry","onSelectValueChange","level","childKey","_","cn","defaultBorderMixin","mappedData","d","selectionController","useSelectionController","EntityCollectionTable","p","objArr","child","subKey","mapping","downloadExport","additionalData","flattenArrays","additionalHeaders","exportType","dateExportType","arrayValuesCount","getArrayValuesCount","headers","getExportHeaders","exportableData","getCSVExportableData","headersData","entryToCSVRow","csvData","entry","downloadBlob","getJsonExportableData","json","mergedData","processValuesForExport","additional","header","getValueInPath","getHeaders","h","prefix","processValueForExport","inputValue","ref","inputValues","updatedValues","updatedValue","a","b","content","filename","contentType","blob","url","pom","DOCS_LIMIT","ExportCollectionAction","inputCollection","inputPath","exportAllowed","notAllowedView","exportConfig","dateRef","setFlattenArrays","setExportType","setDateExportType","context","useFireCMSContext","useNavigationController","canExport","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","fetchAdditionalFields","additionalExportFields","additionalFields","resolvedExportColumnsValues","entity","column","resolvedColumnsValues","field","doDownload","onOkClicked","GetAppIcon","Alert","focusedMixin","BooleanSwitchWithLabel","useImportExportPlugin","props","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/hooks/useImportConfig.tsx","../src/utils/file_to_json.ts","../src/utils/data.ts","../src/utils/get_import_inference_type.ts","../src/utils/get_properties_mapping.ts","../src/components/DataNewPropertiesMapping.tsx","../src/components/ImportFileUpload.tsx","../src/components/ImportNewPropertyFieldPreview.tsx","../src/components/ImportSaveInProgress.tsx","../src/export_import/ImportCollectionAction.tsx","../src/export_import/export.ts","../src/export_import/ExportCollectionAction.tsx","../src/useImportExportPlugin.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Entity, Property } from \"@firecms/core\";\nimport { ImportConfig } from \"../types\";\n\nexport const useImportConfig = (): ImportConfig => {\n\n const [inUse, setInUse] = useState<boolean>(false);\n const [idColumn, setIdColumn] = useState<string | undefined>();\n const [importData, setImportData] = useState<object[]>([]);\n const [entities, setEntities] = useState<Entity<any>[]>([]);\n const [headersMapping, setHeadersMapping] = useState<Record<string, string | null>>({});\n const [originProperties, setOriginProperties] = useState<Record<string, Property>>({});\n\n return {\n inUse,\n setInUse,\n idColumn,\n setIdColumn,\n entities,\n setEntities,\n importData,\n setImportData,\n headersMapping,\n setHeadersMapping,\n originProperties,\n setOriginProperties,\n };\n};\n","import * as XLSX from \"xlsx\";\n\nexport function convertFileToJson(file: File): Promise<object[]> {\n return new Promise((resolve, reject) => {\n // check if file is a JSON file\n if (file.type === \"application/json\") {\n console.debug(\"Converting JSON file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = function (e) {\n const data = e.target?.result as string;\n const jsonData = JSON.parse(data);\n if (!Array.isArray(jsonData)) {\n reject(new Error(\"JSON file should contain an array of objects\"));\n }\n resolve(jsonData);\n };\n reader.readAsText(file);\n } else {\n console.debug(\"Converting Excel file to JSON\", file.name);\n const reader = new FileReader();\n reader.onload = function (e) {\n\n const data = new Uint8Array(e.target?.result as ArrayBuffer);\n const workbook = XLSX.read(data,\n {\n type: \"array\",\n codepage: 65001,\n cellDates: true,\n });\n const worksheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[worksheetName];\n const parsedData: Array<any> = XLSX.utils.sheet_to_json(worksheet);\n const cleanedData = parsedData.map(mapJsonParse);\n const jsonData = cleanedData.map(unflattenObject);\n resolve(jsonData);\n };\n reader.readAsArrayBuffer(file);\n }\n });\n}\n\nfunction mapJsonParse(obj: Record<string, any>) {\n return Object.keys(obj).reduce((acc: Record<string, any>, key) => {\n try {\n acc[key] = JSON.parse(obj[key]);\n } catch (e) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\n/**\n * Take an object with keys of type `address.street`, `address.city` and\n * convert it to an object with nested objects like `{ address: { street: ..., city: ... } }`\n * @param flatObj\n */\nexport function unflattenObject(flatObj: { [key: string]: any }) {\n return Object.keys(flatObj).reduce((nestedObj, key) => {\n let currentObj = nestedObj;\n const keyParts = key.split(\".\");\n keyParts.forEach((keyPart, i) => {\n\n if (/^[\\w]+\\[\\d+\\]$/.test(keyPart)) {\n const mainPropertyName = keyPart.slice(0, keyPart.indexOf(\"[\"));\n const index = parseInt(keyPart.slice(keyPart.indexOf(\"[\") + 1, keyPart.indexOf(\"]\")));\n\n if (!currentObj[mainPropertyName]) {\n currentObj[mainPropertyName] = []\n }\n\n if (i !== keyParts.length - 1) {\n currentObj[mainPropertyName][index] = currentObj[mainPropertyName][index] || {};\n currentObj = currentObj[mainPropertyName][index];\n } else {\n currentObj[mainPropertyName][index] = flatObj[key];\n }\n } else if (i !== keyParts.length - 1) {\n currentObj[keyPart] = currentObj[keyPart] || {};\n currentObj = currentObj[keyPart];\n } else {\n currentObj[keyPart] = flatObj[key];\n }\n\n });\n return nestedObj;\n }, {} as { [key: string]: any });\n}\n","import { DataType, Entity, EntityReference, getPropertyInPath, Properties } from \"@firecms/core\";\nimport { unflattenObject } from \"./file_to_json\";\n\ntype DataTypeMapping = {\n from: DataType;\n fromSubtype?: DataType;\n to: DataType;\n toSubtype?: DataType;\n}\n\nexport function convertDataToEntity(data: Record<any, any>,\n idColumn: string | undefined,\n headersMapping: Record<string, string | null>,\n properties: Properties,\n propertiesMapping: Record<string, DataTypeMapping>,\n path: string): Entity<any> {\n const flatObject = flattenEntry(data);\n if (idColumn)\n delete flatObject[idColumn];\n const mappedKeysObject = Object.entries(flatObject)\n .map(([key, value]) => {\n const mappedKey = headersMapping[key] ?? key;\n\n const mappedProperty = getPropertyInPath(properties, mappedKey);\n if (!mappedProperty)\n return {};\n\n const propertyMapping = propertiesMapping[mappedKey];\n let valueResult = value;\n if (propertyMapping) {\n valueResult = processValueMapping(value, propertyMapping);\n }\n return ({\n [mappedKey]: valueResult\n });\n })\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n const values = unflattenObject(mappedKeysObject);\n let id = idColumn ? data[idColumn] : undefined;\n if (typeof id === \"string\") {\n id = id.trim();\n } else if (typeof id === \"number\") {\n id = id.toString();\n } else if (typeof id === \"boolean\") {\n id = id.toString();\n } else if (id instanceof Date) {\n id = id.toISOString();\n } else if (id && \"toString\" in id) {\n id = id.toString();\n }\n\n return {\n id,\n values,\n path\n };\n}\n\nexport function flattenEntry(obj: any, parent = \"\"): any {\n return Object.keys(obj).reduce((acc, key) => {\n const prefixedKey = parent ? `${parent}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null && !Array.isArray(obj[key])) {\n Object.assign(acc, flattenEntry(obj[key], prefixedKey));\n } else {\n // @ts-ignore\n acc[prefixedKey] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\n// export function convertDataEntryValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// }: {\n// key?: string,\n// fullKey: string,\n// value: any,\n// idColumn?: string,\n// headersMapping: Record<string, string | null>,\n// properties: Properties,\n// propertiesMapping: Record<string, DataTypeMapping>\n// }): any {\n//\n// if (value === undefined) return value;\n// if (value === null) return value;\n//\n// if (Array.isArray(value)) {\n// const mappedKey = headersMapping[fullKey] || fullKey;\n// const valueMapping = propertiesMapping[mappedKey];\n// return processValueMapping(value, valueMapping);\n// // return value.map(v => convertDataEntryValue({ value: v, fullKey, idColumn, headersMapping, propertiesMapping }));\n// } else if (typeof value === \"object\") {\n// return convertDataObjectValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// });\n// } else {\n// const mappedKey = headersMapping[fullKey] || fullKey;\n// const valueMapping = propertiesMapping[mappedKey];\n// return processValueMapping(value, valueMapping);\n// }\n// }\n\n// export function convertDataObjectValue({\n// key,\n// fullKey,\n// value,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// }: {\n// key?: string,\n// fullKey?: string,\n// value: object,\n// idColumn?: string,\n// headersMapping: Record<string, string | null>,\n// properties: Properties,\n// propertiesMapping: Record<string, DataTypeMapping>\n// }): object {\n//\n// if (value instanceof Date) {\n// const mappedKey = fullKey ? headersMapping[fullKey] || fullKey : undefined;\n// const valueMapping = mappedKey ? propertiesMapping[mappedKey] : undefined;\n// return processValueMapping(value, valueMapping);\n// }\n//\n// return Object.entries(value)\n// .map(([childKey, childValue]) => {\n// const childFullKey = fullKey ? `${fullKey}.${childKey}` : childKey;\n// const mappedKey = headersMapping[childFullKey] ?? childFullKey;\n// const mappedKeyLastPart = mappedKey.split(\".\").slice(-1)[0];\n// const property = getPropertyInPath(properties, mappedKey);\n// // if (!property) {\n// // console.log(\"ppp\", { properties, mappedKey, })\n// // return {};\n// // }\n// return ({\n// [mappedKeyLastPart]: convertDataEntryValue({\n// key: childKey,\n// fullKey: childFullKey,\n// value: childValue,\n// idColumn,\n// headersMapping,\n// properties,\n// propertiesMapping\n// })\n// });\n// })\n// .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n// }\n\nexport function processValueMapping(value: any, valueMapping?: DataTypeMapping): any {\n if (valueMapping === undefined) return value;\n const {\n from,\n to\n } = valueMapping;\n if (from === \"array\" && to === \"array\" && valueMapping.fromSubtype && valueMapping.toSubtype && Array.isArray(value)) {\n return value.map(v => processValueMapping(v, {\n from: valueMapping.fromSubtype!,\n to: valueMapping.toSubtype!\n }));\n } else if (from === \"string\" && to === \"number\" && typeof value === \"string\") {\n return Number(value);\n } else if (from === \"string\" && to === \"array\" && valueMapping.toSubtype && typeof value === \"string\") {\n return value.split(\",\").map((v: string) => processValueMapping(v, {\n from: \"string\",\n to: valueMapping.toSubtype!\n }));\n } else if (from === \"string\" && to === \"boolean\") {\n return value === \"true\";\n } else if (from === \"number\" && to === \"boolean\") {\n return value === 1;\n } else if (from === \"boolean\" && to === \"number\") {\n return value ? 1 : 0;\n } else if (from === \"boolean\" && to === \"string\") {\n return value ? \"true\" : \"false\";\n } else if (from === \"number\" && to === \"string\" && typeof value === \"number\") {\n return value.toString();\n } else if (from === \"string\" && to === \"array\" && typeof value === \"string\") {\n return value.split(\",\").map((v: string) => v.trim());\n } else if (from === \"string\" && to === \"date\" && typeof value === \"string\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (from === \"date\" && to === \"string\") {\n return value instanceof Date && value.toISOString();\n } else if (from === \"number\" && to === \"date\" && typeof value === \"number\") {\n try {\n return new Date(value);\n } catch (e) {\n return value;\n }\n } else if (from === \"string\" && to === \"reference\" && typeof value === \"string\") {\n // split value into path and entityId (entityId is the last part of the path, after the last /)\n const path = value.split(\"/\").slice(0, -1).join(\"/\");\n const entityId = value.split(\"/\").slice(-1)[0];\n return new EntityReference(entityId, path);\n\n } else if (from === to) {\n return value;\n } else if (from === \"array\" && to === \"string\" && Array.isArray(value)) {\n return value.join(\",\");\n }\n\n return value;\n}\n","import { DataType } from \"@firecms/core\";\n\nexport function getInferenceType(value: any): DataType {\n if (typeof value === \"number\")\n return \"number\";\n else if (typeof value === \"string\")\n return \"string\";\n else if (typeof value === \"boolean\")\n return \"boolean\";\n else if (value instanceof Date)\n return \"date\";\n else if (Array.isArray(value))\n return \"array\";\n return \"map\";\n}\n\n\nfunction isUnixTimestamp(num: number): boolean {\n const numString = num.toString();\n // check if the number has 13 digits\n const isLengthValid = numString.length === 13;\n\n // check if it falls in the expected Unix timestamp range (from 1970 to 2100)\n const isInRange = num >= 0 && num <= 4102444800000;\n\n return isLengthValid && isInRange;\n}\n","import { DataType, getPropertyInPath, Properties, Property } from \"@firecms/core\";\nimport { DataTypeMapping } from \"../types\";\n\nexport function getPropertiesMapping(originProperties: Properties, newProperties: Properties): Record<string, DataTypeMapping> {\n\n function updateMapping(properties: Record<string, Property>, namespace?: string): Record<string, DataTypeMapping> {\n\n const dataMapping: Record<string, DataTypeMapping> = {};\n\n Object.keys(properties).forEach((key) => {\n\n const currentKey = namespace ? `${namespace}.${key}` : key;\n\n const property = getPropertyInPath(properties, key) as Property;\n const inferredProperty = getPropertyInPath(originProperties, currentKey) as Property;\n\n if (property) {\n if (property.dataType === \"map\" && property.properties) {\n const nestedMapping = updateMapping(property.properties as Record<string, Property>, currentKey);\n Object.keys(nestedMapping).forEach((nestedKey) => {\n dataMapping[`${currentKey}.${nestedKey}`] = nestedMapping[nestedKey];\n });\n return;\n }\n\n if (inferredProperty) {\n\n const from = inferredProperty.dataType;\n const to = property.dataType;\n let fromSubtype: DataType | undefined;\n let toSubtype: DataType | undefined;\n\n if (property.dataType === \"array\" && property.of) {\n toSubtype = (property.of as Property).dataType;\n }\n\n if (inferredProperty?.dataType === \"array\" && inferredProperty?.of) {\n fromSubtype = (inferredProperty.of as Property).dataType;\n }\n\n if (from !== to || fromSubtype !== toSubtype) {\n dataMapping[key] = {\n from,\n to,\n fromSubtype,\n toSubtype\n };\n }\n }\n\n }\n\n });\n\n return dataMapping;\n }\n\n return updateMapping(newProperties);\n}\n","import { getPropertyInPath, Property, } from \"@firecms/core\";\nimport {\n ChevronRightIcon,\n Select,\n SelectItem,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Typography\n} from \"@firecms/ui\";\n\nexport interface DataPropertyMappingProps {\n idColumn?: string;\n headersMapping: Record<string, string | null>;\n originProperties: Record<string, Property>;\n destinationProperties: Record<string, Property>;\n onIdPropertyChanged: (value: string | null) => void;\n buildPropertyView?: (props: {\n isIdColumn: boolean,\n property: Property | null,\n propertyKey: string | null,\n importKey: string\n }) => React.ReactNode;\n}\n\nexport function DataNewPropertiesMapping({\n idColumn,\n headersMapping,\n originProperties,\n destinationProperties,\n onIdPropertyChanged,\n buildPropertyView,\n }: DataPropertyMappingProps) {\n\n return (\n <>\n\n <IdSelectField idColumn={idColumn}\n headersMapping={headersMapping}\n onChange={onIdPropertyChanged}/>\n\n <Table style={{\n tableLayout: \"fixed\"\n }}>\n <TableHeader>\n <TableCell header={true} style={{ width: \"20%\" }}>\n Column in file\n </TableCell>\n <TableCell header={true}>\n </TableCell>\n <TableCell header={true} style={{ width: \"75%\" }}>\n Property\n </TableCell>\n </TableHeader>\n <TableBody>\n {destinationProperties &&\n Object.entries(headersMapping)\n .map(([importKey, mappedKey]) => {\n const propertyKey = headersMapping[importKey];\n const property = mappedKey ? getPropertyInPath(destinationProperties, mappedKey) as Property : null;\n\n const originProperty = getPropertyInPath(originProperties, importKey) as Property | undefined;\n const originDataType = originProperty ? (originProperty.dataType === \"array\" && typeof originProperty.of === \"object\"\n ? `${originProperty.dataType} - ${(originProperty.of as Property).dataType}`\n : originProperty.dataType)\n : undefined;\n return <TableRow key={importKey} style={{ height: \"90px\" }}>\n <TableCell style={{ width: \"20%\" }}>\n <Typography variant={\"body2\"}>{importKey}</Typography>\n {originProperty && <Typography\n variant={\"caption\"}\n color={\"secondary\"}\n >{originDataType}</Typography>}\n </TableCell>\n <TableCell>\n <ChevronRightIcon/>\n </TableCell>\n <TableCell className={importKey === idColumn ? \"text-center\" : undefined}\n style={{ width: \"75%\" }}>\n {buildPropertyView?.({\n isIdColumn: importKey === idColumn,\n property,\n propertyKey,\n importKey\n })\n }\n </TableCell>\n </TableRow>;\n }\n )}\n </TableBody>\n </Table>\n </>\n );\n}\n\nfunction IdSelectField({\n idColumn,\n headersMapping,\n onChange\n }: {\n idColumn?: string,\n headersMapping: Record<string, string | null>;\n onChange: (value: string | null) => void\n}) {\n return <div>\n <Select\n size={\"small\"}\n value={idColumn ?? \"\"}\n onChange={(event) => {\n const value = event.target.value;\n onChange(value === \"none\" ? null : value);\n }}\n renderValue={(value) => {\n return <Typography variant={\"body2\"}>\n {value !== \"\" ? value : \"Autogenerate ID\"}\n </Typography>;\n }}\n label={\"Column that will be used as ID for each document\"}>\n <SelectItem value={\"none\"}>Autogenerate ID</SelectItem>\n {Object.entries(headersMapping).map(([key, value]) => {\n return <SelectItem key={key} value={key}>{key}</SelectItem>;\n })}\n </Select>\n </div>;\n}\n","import { FileUpload, UploadIcon } from \"@firecms/ui\";\nimport { convertFileToJson } from \"../utils/file_to_json\";\nimport { useSnackbarController } from \"@firecms/core\";\n\nexport function ImportFileUpload({ onDataAdded }: { onDataAdded: (data: object[]) => void }) {\n const snackbarController = useSnackbarController();\n return <FileUpload\n accept={{\n \"text/*\": [\".csv\", \".xls\", \".xlsx\"],\n \"application/vnd.ms-excel\": [\".xls\", \".xlsx\"],\n \"application/msexcel\": [\".xls\", \".xlsx\"],\n \"application/vnd.ms-office\": [\".xls\", \".xlsx\"],\n \"application/xls\": [\".xls\", \".xlsx\"],\n \"application/x-xls\": [\".xls\", \".xlsx\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xls\", \".xlsx\"],\n \"application/json\": [\".json\"],\n }}\n preventDropOnDocument={true}\n size={\"small\"}\n maxFiles={1}\n uploadDescription={<><UploadIcon/>Drag and drop a file here or click to upload</>}\n onFilesAdded={(files: File[]) => {\n if (files.length > 0) {\n convertFileToJson(files[0])\n .then((jsonData) => {\n onDataAdded(jsonData);\n })\n .catch((error) => {\n console.error(\"Error parsing file\", error);\n snackbarController.open({ type: \"error\", message: error.message });\n });\n }\n }}/>\n}\n","import React from \"react\";\nimport { ErrorBoundary, PropertyConfigBadge, getFieldConfig, Property, useCustomizationController } from \"@firecms/core\";\nimport { EditIcon, IconButton, TextField, } from \"@firecms/ui\";\n\nexport function ImportNewPropertyFieldPreview({\n propertyKey,\n property,\n onEditClick,\n includeName = true,\n onPropertyNameChanged,\n propertyTypeView\n }: {\n propertyKey: string | null,\n property: Property | null\n includeName?: boolean,\n onEditClick?: () => void,\n onPropertyNameChanged?: (propertyKey: string, value: string) => void,\n propertyTypeView?: React.ReactNode\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n return <ErrorBoundary>\n <div\n className=\"flex flex-row w-full items-center\">\n\n <div className={\"mx-4\"}>\n {propertyTypeView ?? <PropertyConfigBadge propertyConfig={widget ?? undefined}/>}\n </div>\n\n <div className=\"w-full flex flex-col grow\">\n\n <div className={\"flex flex-row items-center gap-2\"}>\n {includeName &&\n <TextField\n size={\"small\"}\n className={\"text-base grow\"}\n value={property?.name ?? \"\"}\n onChange={(e) => {\n if (onPropertyNameChanged && propertyKey)\n onPropertyNameChanged(propertyKey, e.target.value);\n }}/>}\n\n <IconButton onClick={onEditClick} size={\"small\"}>\n <EditIcon size={\"small\"}/>\n </IconButton>\n </div>\n\n </div>\n\n\n </div>\n </ErrorBoundary>\n}\n","import { DataSource, Entity, EntityCollection, useDataSource } from \"@firecms/core\";\nimport { Button, CenteredView, CircularProgress, Typography, } from \"@firecms/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { ImportConfig } from \"../types\";\n\nexport function ImportSaveInProgress<C extends EntityCollection>\n({\n path,\n importConfig,\n collection,\n onImportSuccess\n }:\n {\n path: string,\n importConfig: ImportConfig,\n collection: C,\n onImportSuccess: (collection: C) => void\n }) {\n\n const [errorSaving, setErrorSaving] = useState<Error | undefined>(undefined);\n const dataSource = useDataSource();\n\n const savingRef = useRef<boolean>(false);\n\n const [processedEntities, setProcessedEntities] = useState<number>(0);\n\n function save() {\n\n if (savingRef.current)\n return;\n\n savingRef.current = true;\n\n saveDataBatch(\n dataSource,\n collection,\n path,\n importConfig.entities,\n 0,\n 25,\n setProcessedEntities\n ).then(() => {\n onImportSuccess(collection);\n savingRef.current = false;\n }).catch((e) => {\n setErrorSaving(e);\n savingRef.current = false;\n });\n }\n\n useEffect(() => {\n save();\n }, []);\n\n if (errorSaving) {\n return (\n <CenteredView className={\"flex flex-col gap-4 items-center\"}>\n <Typography variant={\"h6\"}>\n Error saving data\n </Typography>\n\n <Typography variant={\"body2\"} color={\"error\"}>\n {errorSaving.message}\n </Typography>\n <Button\n onClick={save}\n variant={\"outlined\"}>\n Retry\n </Button>\n </CenteredView>\n );\n }\n\n return (\n <CenteredView className={\"flex flex-col gap-4 items-center\"}>\n <CircularProgress/>\n\n <Typography variant={\"h6\"}>\n Saving data\n </Typography>\n\n <Typography variant={\"body2\"}>\n {processedEntities}/{importConfig.entities.length} entities saved\n </Typography>\n\n <Typography variant={\"caption\"}>\n Do not close this tab or the import will be interrupted.\n </Typography>\n\n </CenteredView>\n );\n\n}\n\nfunction saveDataBatch(dataSource: DataSource,\n collection: EntityCollection,\n path: string,\n data: Partial<Entity<any>>[],\n offset = 0,\n batchSize = 25,\n onProgressUpdate: (progress: number) => void): Promise<void> {\n\n console.debug(\"Saving imported data\", offset, batchSize);\n\n const batch = data.slice(offset, offset + batchSize);\n return Promise.all(batch.map(d =>\n dataSource.saveEntity({\n path,\n values: d.values,\n entityId: d.id,\n collection,\n status: \"new\"\n })))\n .then(() => {\n if (offset + batchSize < data.length) {\n onProgressUpdate(offset + batchSize);\n return saveDataBatch(dataSource, collection, path, data, offset + batchSize, batchSize, onProgressUpdate);\n }\n onProgressUpdate(data.length);\n return Promise.resolve();\n });\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport {\n CollectionActionsProps,\n EntityCollectionTable,\n getFieldConfig,\n getPropertiesWithPropertiesOrder,\n getPropertyInPath,\n PropertiesOrBuilders,\n Property,\n PropertyConfigBadge,\n resolveCollection,\n ResolvedProperties,\n slugify,\n useCustomizationController,\n User,\n useSelectionController,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n Button,\n cn,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n FileUploadIcon,\n IconButton,\n Select,\n SelectItem,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { useImportConfig } from \"../hooks\";\nimport { convertDataToEntity, getInferenceType, getPropertiesMapping } from \"../utils\";\nimport { DataNewPropertiesMapping, ImportFileUpload, ImportSaveInProgress } from \"../components\";\nimport { ImportConfig } from \"../types\";\n\ntype ImportState = \"initial\" | \"mapping\" | \"preview\" | \"import_data_saving\";\n\nexport function ImportCollectionAction<M extends Record<string, any>, UserType extends User>({\n collection,\n path,\n collectionEntitiesCount,\n onAnalyticsEvent\n }: CollectionActionsProps<M, UserType> & {\n onAnalyticsEvent?: (event: string, params?: any) => void;\n }\n) {\n\n const customizationController = useCustomizationController();\n\n const snackbarController = useSnackbarController();\n\n const [open, setOpen] = React.useState(false);\n\n const [step, setStep] = React.useState<ImportState>(\"initial\");\n\n const importConfig = useImportConfig();\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n setStep(\"initial\");\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onMappingComplete = useCallback(() => {\n setStep(\"preview\");\n }, []);\n\n const onPreviewComplete = useCallback(() => {\n setStep(\"import_data_saving\");\n }, []);\n\n const onDataAdded = async (data: object[]) => {\n importConfig.setImportData(data);\n\n if (data.length > 0) {\n const originProperties = await buildEntityPropertiesFromData(data, getInferenceType);\n importConfig.setOriginProperties(originProperties);\n\n const headersMapping = buildHeadersMappingFromData(data, collection?.properties);\n importConfig.setHeadersMapping(headersMapping);\n const firstKey = Object.keys(headersMapping)?.[0];\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n importConfig.setIdColumn(firstKey);\n }\n }\n setTimeout(() => {\n setStep(\"mapping\");\n }, 100);\n // setStep(\"mapping\");\n };\n\n const resolvedCollection = resolveCollection({\n collection,\n path,\n fields: customizationController.propertyConfigs\n });\n\n const properties = getPropertiesWithPropertiesOrder<M>(resolvedCollection.properties, resolvedCollection.propertiesOrder as Extract<keyof M, string>[]) as ResolvedProperties<M>;\n\n const propertiesAndLevel = Object.entries(properties)\n .flatMap(([key, property]) => getPropertiesAndLevel(key, property, 0));\n const propertiesOrder = (resolvedCollection.propertiesOrder ?? Object.keys(resolvedCollection.properties)) as Extract<keyof M, string>[];\n if (collection.collectionGroup) {\n return null;\n }\n return <>\n\n <Tooltip title={\"Import\"}>\n <IconButton color={\"primary\"} onClick={handleClickOpen}>\n <FileUploadIcon/>\n </IconButton>\n </Tooltip>\n\n <Dialog open={open}\n fullWidth={step === \"preview\"}\n fullHeight={step === \"preview\"}\n maxWidth={step === \"initial\" ? \"lg\" : \"7xl\"}>\n <DialogContent className={\"flex flex-col gap-4 my-4\"} fullHeight={step === \"preview\"}>\n\n {step === \"initial\" && <>\n <Typography variant={\"h6\"}>Import data</Typography>\n <Typography variant={\"body2\"}>Upload a CSV, Excel or JSON file and map it to your existing\n schema</Typography>\n <ImportFileUpload onDataAdded={onDataAdded}/>\n </>}\n\n {step === \"mapping\" && <>\n <Typography variant={\"h6\"}>Map fields</Typography>\n <DataNewPropertiesMapping headersMapping={importConfig.headersMapping}\n idColumn={importConfig.idColumn}\n originProperties={importConfig.originProperties}\n destinationProperties={properties}\n onIdPropertyChanged={(value) => importConfig.setIdColumn(value ?? undefined)}\n buildPropertyView={({\n isIdColumn,\n property,\n propertyKey,\n importKey\n }) => {\n return <PropertyTreeSelect\n selectedPropertyKey={propertyKey ?? \"\"}\n properties={properties}\n propertiesAndLevel={propertiesAndLevel}\n isIdColumn={isIdColumn}\n onIdSelected={() => {\n importConfig.setIdColumn(importKey);\n }}\n onPropertySelected={(newPropertyKey) => {\n\n const newHeadersMapping: Record<string, string | null> = Object.entries(importConfig.headersMapping)\n .map(([currentImportKey, currentPropertyKey]) => {\n if (currentPropertyKey === newPropertyKey) {\n return { [currentImportKey]: null };\n }\n if (currentImportKey === importKey) {\n return { [currentImportKey]: newPropertyKey };\n }\n return { [currentImportKey]: currentPropertyKey };\n })\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n importConfig.setHeadersMapping(newHeadersMapping as Record<string, string>);\n\n if (newPropertyKey === importConfig.idColumn) {\n importConfig.setIdColumn(undefined);\n }\n\n }}\n />;\n }}/>\n </>}\n\n {step === \"preview\" && <ImportDataPreview importConfig={importConfig}\n properties={properties}\n propertiesOrder={propertiesOrder}/>}\n\n {step === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={collection}\n path={path}\n onImportSuccess={(importedCollection) => {\n handleClose();\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n }}\n />}\n\n </DialogContent>\n <DialogActions>\n\n {step === \"mapping\" && <Button onClick={() => setStep(\"initial\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n {step === \"preview\" && <Button onClick={() => setStep(\"mapping\")}\n variant={\"text\"}>\n Back\n </Button>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n {step === \"mapping\" && <Button variant=\"filled\"\n onClick={onMappingComplete}>\n Next\n </Button>}\n\n {step === \"preview\" && <Button variant=\"filled\"\n onClick={onPreviewComplete}>\n Save data\n </Button>}\n\n </DialogActions>\n </Dialog>\n\n </>;\n}\n\nconst internalIDValue = \"__internal_id__\";\n\nfunction PropertyTreeSelect({\n selectedPropertyKey,\n properties,\n onPropertySelected,\n onIdSelected,\n propertiesAndLevel,\n isIdColumn\n }: {\n selectedPropertyKey: string | null;\n properties: Record<string, Property>;\n onPropertySelected: (propertyKey: string | null) => void;\n onIdSelected: () => void;\n propertiesAndLevel: PropertyAndLevel[];\n isIdColumn?: boolean;\n}) {\n\n const selectedProperty = selectedPropertyKey ? getPropertyInPath(properties, selectedPropertyKey) : null;\n\n const renderValue = useCallback((selectedPropertyKey: string) => {\n\n if (selectedPropertyKey === internalIDValue) {\n return <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>;\n }\n\n if (!selectedPropertyKey || !selectedProperty) {\n return <Typography variant={\"body2\"} className={\"p-4\"}>Do not import this property</Typography>;\n }\n\n return <PropertySelectEntry propertyKey={selectedPropertyKey}\n property={selectedProperty as Property}/>;\n }, [selectedProperty]);\n\n const onSelectValueChange = useCallback((value: string) => {\n if (value === internalIDValue) {\n onIdSelected();\n onPropertySelected(null);\n } else if (value === \"__do_not_import\") {\n onPropertySelected(null);\n } else {\n onPropertySelected(value);\n }\n }, []);\n\n return <Select value={isIdColumn ? internalIDValue : (selectedPropertyKey ?? undefined)}\n onValueChange={onSelectValueChange}\n renderValue={renderValue}>\n\n <SelectItem value={\"__do_not_import\"}>\n <Typography variant={\"body2\"} className={\"p-4\"}>Do not import this property</Typography>\n </SelectItem>\n\n <SelectItem value={internalIDValue}>\n <Typography variant={\"body2\"} className={\"p-4\"}>Use this column as ID</Typography>\n </SelectItem>\n\n {propertiesAndLevel.map(({\n property,\n level,\n propertyKey\n }) => {\n return <SelectItem value={propertyKey}\n key={propertyKey}\n disabled={property.dataType === \"map\"}>\n <PropertySelectEntry propertyKey={propertyKey}\n property={property}\n level={level}/>\n </SelectItem>;\n })}\n\n </Select>;\n}\n\ntype PropertyAndLevel = {\n property: Property,\n level: number,\n propertyKey: string\n};\n\nfunction getPropertiesAndLevel(key: string, property: Property, level: number): PropertyAndLevel[] {\n const properties: PropertyAndLevel[] = [];\n properties.push({\n property,\n level,\n propertyKey: key\n });\n if (property.dataType === \"map\" && property.properties) {\n Object.entries(property.properties).forEach(([childKey, value]) => {\n properties.push(...getPropertiesAndLevel(`${key}.${childKey}`, value as Property, level + 1));\n });\n }\n return properties;\n}\n\nexport function PropertySelectEntry({\n propertyKey,\n property,\n level = 0\n }: {\n propertyKey: string;\n property: Property;\n level?: number;\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n const widget = getFieldConfig(property, propertyConfigs);\n\n return <div\n className=\"flex flex-row w-full text-start items-center h-full\">\n\n {new Array(level).fill(0).map((_, index) =>\n <div className={cn(defaultBorderMixin, \"ml-8 border-l h-12\")} key={index}/>)}\n\n <div className={\"m-4\"}>\n <Tooltip title={widget?.name}>\n <PropertyConfigBadge propertyConfig={widget}/>\n </Tooltip>\n </div>\n\n <div className={\"flex flex-col flex-grow p-2 pl-2\"}>\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property.name\n ? property.name\n : \"\\u00a0\"\n }\n </Typography>\n\n <Typography className=\" pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyKey}\n </Typography>\n </div>\n\n </div>;\n\n}\n\nexport function ImportDataPreview<M extends Record<string, any>>({\n importConfig,\n properties,\n propertiesOrder\n }: {\n importConfig: ImportConfig,\n properties: ResolvedProperties<M>,\n propertiesOrder: Extract<keyof M, string>[],\n}) {\n\n useEffect(() => {\n const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, propertiesMapping, \"TEMP_PATH\"));\n importConfig.setEntities(mappedData);\n }, []);\n\n const selectionController = useSelectionController();\n\n return <EntityCollectionTable\n title={<div>\n <Typography variant={\"subtitle2\"}>Imported data preview</Typography>\n <Typography variant={\"caption\"}>Entities with the same id will be overwritten</Typography>\n </div>}\n tableController={{\n data: importConfig.entities,\n dataLoading: false,\n noMoreToLoad: false\n }}\n endAdornment={<div className={\"h-12\"}/>}\n filterable={false}\n sortable={false}\n selectionController={selectionController}\n displayedColumnIds={propertiesOrder.map(p => ({\n key: p,\n disabled: false\n }))}\n properties={properties}/>\n\n}\n\nfunction buildHeadersMappingFromData(objArr: object[], properties?: PropertiesOrBuilders<any>) {\n const headersMapping: Record<string, string> = {};\n objArr.filter(Boolean).forEach((obj) => {\n Object.keys(obj).forEach((key) => {\n // @ts-ignore\n const child = obj[key];\n if (typeof child === \"object\" && !Array.isArray(child)) {\n const childProperty = properties?.[key];\n const childProperties = childProperty && \"properties\" in childProperty ? childProperty.properties : undefined;\n const childHeadersMapping = buildHeadersMappingFromData([child], childProperties);\n Object.entries(childHeadersMapping).forEach(([subKey, mapping]) => {\n headersMapping[`${key}.${subKey}`] = `${key}.${mapping}`;\n });\n }\n\n if (!properties) {\n headersMapping[key] = key;\n } else if (key in properties) {\n headersMapping[key] = key;\n } else {\n const slug = slugify(key);\n if (slug in properties) {\n headersMapping[key] = slug;\n } else {\n headersMapping[key] = key;\n }\n }\n\n });\n });\n return headersMapping;\n}\n","import {\n ArrayValuesCount,\n Entity,\n EntityReference,\n getArrayValuesCount,\n getValueInPath,\n ResolvedEntityCollection,\n ResolvedProperties,\n ResolvedProperty\n} from \"@firecms/core\";\n\ninterface Header {\n key: string;\n label: string;\n}\n\nexport function downloadExport<M extends Record<string, any>>(data: Entity<M>[],\n additionalData: Record<string, any>[] | undefined,\n collection: ResolvedEntityCollection<M>,\n flattenArrays: boolean,\n additionalHeaders: string[] | undefined,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n console.debug(\"Downloading export\", { dataLength: data.length, collection, exportType, dateExportType });\n const properties = collection.properties;\n\n if (exportType === \"csv\") {\n const arrayValuesCount = flattenArrays ? getArrayValuesCount(data.map(d => d.values)) : {};\n const headers = getExportHeaders(properties, additionalHeaders, arrayValuesCount);\n const exportableData = getCSVExportableData(data, additionalData, properties, headers, dateExportType);\n const headersData = entryToCSVRow(headers.map(h => h.label));\n const csvData = exportableData.map(entry => entryToCSVRow(entry));\n downloadBlob([headersData, ...csvData], `${collection.name}.csv`, \"text/csv\");\n } else {\n const exportableData = getJsonExportableData(data, additionalData, properties, dateExportType);\n const json = JSON.stringify(exportableData, null, 2);\n downloadBlob([json], `${collection.name}.json`, \"application/json\");\n }\n}\n\nexport function getCSVExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: ResolvedProperties,\n headers: Header[],\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"csv\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index], ...additional };\n });\n }\n\n return mergedData && mergedData.map((entry) => {\n return headers.map((header) => getValueInPath(entry, header.key));\n });\n}\n\nexport function getJsonExportableData(data: Entity<any>[],\n additionalData: Record<string, any>[] | undefined,\n properties: ResolvedProperties,\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: any[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"json\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index], ...additional };\n });\n }\n\n return mergedData;\n}\n\nfunction getExportHeaders<M extends Record<string, any>>(properties: ResolvedProperties<M>,\n additionalHeaders: string[] | undefined,\n arrayValuesCount?: ArrayValuesCount): Header[] {\n\n const headers: Header[] = [\n { label: \"id\", key: \"id\" },\n ...Object.entries(properties)\n .flatMap(([childKey, property]) => {\n if (arrayValuesCount && arrayValuesCount[childKey] > 1) {\n return Array.from({ length: arrayValuesCount[childKey] },\n (_, i) => getHeaders(property as ResolvedProperty, `${childKey}[${i}]`, \"\"))\n .flat();\n } else {\n return getHeaders(property as ResolvedProperty, childKey, \"\");\n }\n })\n ];\n\n if (additionalHeaders) {\n headers.push(...additionalHeaders.map(h => ({ label: h, key: h })));\n }\n\n return headers;\n}\n\n/**\n * Get headers for property. There could be more than one header per property\n * @param property\n * @param propertyKey\n * @param prefix\n */\nfunction getHeaders(property: ResolvedProperty, propertyKey: string, prefix = \"\"): Header[] {\n const currentKey = prefix ? `${prefix}.${propertyKey}` : propertyKey;\n if (property.dataType === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .map(([childKey, p]) => getHeaders(p, childKey, currentKey))\n .flat();\n } else {\n return [{ label: currentKey, key: currentKey }];\n }\n}\n\nfunction processValueForExport(inputValue: any,\n property: ResolvedProperty,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): any {\n\n let value;\n if (property.dataType === \"map\" && property.properties) {\n value = processValuesForExport(inputValue, property.properties as ResolvedProperties, exportType, dateExportType);\n } else if (property.dataType === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n if (Array.isArray(property.of)) {\n value = property.of.map((p, i) => processValueForExport(inputValue[i], p, exportType, dateExportType));\n } else if (property.of.dataType === \"map\") {\n value = exportType === \"csv\"\n ? inputValue.map((e) => JSON.stringify(e))\n : inputValue.map((e) => processValueForExport(e, property.of as ResolvedProperty, exportType, dateExportType));\n ;\n } else {\n value = inputValue.map((e) => processValueForExport(e, property.of as ResolvedProperty, exportType, dateExportType));\n }\n } else {\n value = inputValue;\n }\n } else if (property.dataType === \"reference\" && inputValue && inputValue.isEntityReference && inputValue.isEntityReference()) {\n const ref = inputValue ? inputValue as EntityReference : undefined;\n value = ref ? ref.pathWithId : null;\n } else if (property.dataType === \"date\" && inputValue instanceof Date) {\n value = inputValue ? (dateExportType === \"timestamp\" ? inputValue.getTime() : inputValue.toISOString()) : null;\n } else {\n value = inputValue;\n }\n\n return value;\n}\n\nfunction processValuesForExport<M extends Record<string, any>>\n(inputValues: Record<keyof M, any>,\n properties: ResolvedProperties<M>,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): Record<keyof M, any> {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = processValueForExport(inputValue, property as ResolvedProperty, exportType, dateExportType);\n if (updatedValue === undefined) return {};\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as Record<keyof M, any>;\n return { ...inputValues, ...updatedValues };\n}\n\nfunction entryToCSVRow(entry: any[]) {\n return entry\n .map((v: any) => {\n if (v === null || v === undefined) return \"\";\n if (Array.isArray(v))\n return \"\\\"\" + JSON.stringify(v).replaceAll(\"\\\"\", \"\\\\\\\"\") + \"\\\"\";\n const s = String(v);\n return \"\\\"\" + s.replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n })\n .join(\",\") + \"\\r\\n\";\n}\n\nexport function downloadBlob(content: BlobPart[], filename: string, contentType: string) {\n const blob = new Blob(content, { type: contentType });\n const url = URL.createObjectURL(blob);\n const pom = document.createElement(\"a\");\n pom.href = url;\n pom.setAttribute(\"download\", filename);\n pom.click();\n}\n","import React, { useCallback } from \"react\";\n\nimport {\n CollectionActionsProps,\n Entity,\n EntityCollection,\n ExportConfig,\n resolveCollection,\n ResolvedEntityCollection,\n useCustomizationController,\n useDataSource,\n useFireCMSContext,\n useNavigationController,\n User\n} from \"@firecms/core\";\nimport {\n Alert,\n BooleanSwitchWithLabel,\n Button,\n CircularProgress,\n cn,\n Dialog,\n DialogActions,\n DialogContent,\n focusedMixin,\n GetAppIcon,\n IconButton,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { downloadExport } from \"./export\";\n\nconst DOCS_LIMIT = 500;\n\nexport function ExportCollectionAction<M extends Record<string, any>, UserType extends User>({\n collection: inputCollection,\n path: inputPath,\n collectionEntitiesCount,\n exportAllowed,\n notAllowedView\n }: CollectionActionsProps<M, UserType, EntityCollection<M, any>> & {\n exportAllowed?: (props: { collectionEntitiesCount: number, path: string, collection: EntityCollection }) => boolean;\n notAllowedView?: React.ReactNode;\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}) {\n\n const customizationController = useCustomizationController();\n\n const exportConfig = typeof inputCollection.exportable === \"object\" ? inputCollection.exportable : undefined;\n\n const dateRef = React.useRef<Date>(new Date());\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const context = useFireCMSContext<UserType>();\n const dataSource = useDataSource();\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const canExport = !exportAllowed || exportAllowed({\n collectionEntitiesCount,\n path,\n collection: inputCollection\n });\n\n const collection: ResolvedEntityCollection<M> = React.useMemo(() => resolveCollection({\n collection: inputCollection,\n path,\n fields: customizationController.propertyConfigs\n }), [inputCollection, path]);\n\n const [dataLoading, setDataLoading] = React.useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = React.useState<Error | undefined>();\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const fetchAdditionalFields = useCallback(async (entities: Entity<M>[]) => {\n\n const additionalExportFields = exportConfig?.additionalFields;\n const additionalFields = collection.additionalFields;\n\n const resolvedExportColumnsValues: Record<string, any>[] = additionalExportFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalExportFields.map(async (column) => {\n return {\n [column.key]: await column.builder({\n entity,\n context\n })\n };\n }))).reduce((a, b) => ({ ...a, ...b }), {});\n }))\n : [];\n\n const resolvedColumnsValues: Record<string, any>[] = additionalFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalFields\n .map(async (field) => {\n if (!field.value)\n return {};\n return {\n [field.key]: await field.value({\n entity,\n context\n })\n };\n }))).reduce((a, b) => ({ ...a, ...b }), {});\n }))\n : [];\n return [...resolvedExportColumnsValues, ...resolvedColumnsValues];\n }, [exportConfig?.additionalFields]);\n\n const doDownload = useCallback(async (collection: ResolvedEntityCollection<M>,\n exportConfig: ExportConfig<any> | undefined) => {\n\n setDataLoading(true);\n dataSource.fetchCollection<M>({\n path,\n collection\n })\n .then(async (data) => {\n setDataLoadingError(undefined);\n const additionalData = await fetchAdditionalFields(data);\n const additionalHeaders = [\n ...exportConfig?.additionalFields?.map(column => column.key) ?? [],\n ...collection.additionalFields?.map(field => field.key) ?? []\n ];\n downloadExport(data, additionalData, collection, flattenArrays, additionalHeaders, exportType, dateExportType);\n })\n .catch((e) => {\n console.error(\"Error loading export data\", e);\n setDataLoadingError(e);\n })\n .finally(() => setDataLoading(false));\n\n }, [dataSource, path, fetchAdditionalFields, flattenArrays, exportType, dateExportType]);\n\n const onOkClicked = useCallback(() => {\n doDownload(collection, exportConfig);\n handleClose();\n }, [doDownload, collection, exportConfig, handleClose]);\n\n return <>\n\n <Tooltip title={\"Export\"}>\n <IconButton color={\"primary\"} onClick={handleClickOpen}>\n <GetAppIcon/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <Typography variant={\"h6\"}>Export data</Typography>\n\n <div>Download the the content of this table as a CSV</div>\n\n {collectionEntitiesCount > DOCS_LIMIT &&\n <Alert color={\"warning\"}>\n <div>\n This collections has a large number\n of documents ({collectionEntitiesCount}).\n </div>\n </Alert>}\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-csv\" type=\"radio\" value=\"csv\" name=\"exportType\"\n checked={exportType === \"csv\"}\n onChange={() => setExportType(\"csv\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-csv\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-slate-300\">CSV</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-json\" type=\"radio\" value=\"json\" name=\"exportType\"\n checked={exportType === \"json\"}\n onChange={() => setExportType(\"json\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-json\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-slate-300\">JSON</label>\n </div>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <div className=\"flex items-center\">\n <input id=\"radio-timestamp\" type=\"radio\" value=\"timestamp\" name=\"dateExportType\"\n checked={dateExportType === \"timestamp\"}\n onChange={() => setDateExportType(\"timestamp\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-timestamp\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-slate-300\">Dates as\n timestamps ({dateRef.current.getTime()})</label>\n </div>\n <div className=\"flex items-center\">\n <input id=\"radio-string\" type=\"radio\" value=\"string\" name=\"dateExportType\"\n checked={dateExportType === \"string\"}\n onChange={() => setDateExportType(\"string\")}\n className={cn(focusedMixin, \"w-4 text-primary-dark bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600\")}/>\n <label htmlFor=\"radio-string\"\n className=\"p-2 text-sm font-medium text-gray-900 dark:text-slate-300\">Dates as\n strings ({dateRef.current.toISOString()})</label>\n </div>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n {!canExport && notAllowedView}\n\n </DialogContent>\n\n <DialogActions>\n\n {dataLoading && <CircularProgress size={\"small\"}/>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button variant=\"filled\"\n onClick={onOkClicked}\n disabled={dataLoading || !canExport}>\n Download\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n","import React, { useMemo } from \"react\";\nimport { EntityCollection, FireCMSPlugin } from \"@firecms/core\";\nimport { ImportCollectionAction } from \"./export_import/ImportCollectionAction\";\nimport { ExportCollectionAction } from \"./export_import/ExportCollectionAction\";\n\n/**\n *\n */\nexport function useImportExportPlugin(props?: ImportExportPluginProps): FireCMSPlugin<any, any, any, ImportExportPluginProps> {\n\n return useMemo(() => ({\n name: \"Import/Export\",\n collectionView: {\n CollectionActions: [ImportCollectionAction, ExportCollectionAction],\n collectionActionsProps: props\n }\n }), [props]);\n}\n\nexport type ImportExportPluginProps = {\n exportAllowed?: (props: ExportAllowedParams) => boolean;\n notAllowedView: React.ReactNode;\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}\nexport type ExportAllowedParams = { collectionEntitiesCount: number, path: string, collection: EntityCollection };\n"],"names":["useImportConfig","inUse","setInUse","useState","idColumn","setIdColumn","importData","setImportData","entities","setEntities","headersMapping","setHeadersMapping","originProperties","setOriginProperties","convertFileToJson","file","resolve","reject","reader","e","data","jsonData","workbook","XLSX","worksheetName","worksheet","mapJsonParse","unflattenObject","obj","acc","key","flatObj","nestedObj","currentObj","keyParts","keyPart","i","mainPropertyName","index","convertDataToEntity","properties","propertiesMapping","path","flatObject","flattenEntry","mappedKeysObject","value","mappedKey","getPropertyInPath","propertyMapping","valueResult","processValueMapping","curr","values","id","parent","prefixedKey","valueMapping","from","to","v","entityId","EntityReference","getInferenceType","getPropertiesMapping","newProperties","updateMapping","namespace","dataMapping","currentKey","property","inferredProperty","nestedMapping","nestedKey","fromSubtype","toSubtype","DataNewPropertiesMapping","destinationProperties","onIdPropertyChanged","buildPropertyView","jsxs","Fragment","jsx","IdSelectField","Table","TableHeader","TableCell","TableBody","importKey","propertyKey","originProperty","originDataType","TableRow","Typography","ChevronRightIcon","onChange","Select","event","SelectItem","ImportFileUpload","onDataAdded","snackbarController","useSnackbarController","FileUpload","UploadIcon","files","error","ImportNewPropertyFieldPreview","onEditClick","includeName","onPropertyNameChanged","propertyTypeView","propertyConfigs","useCustomizationController","widget","getFieldConfig","ErrorBoundary","PropertyConfigBadge","TextField","IconButton","EditIcon","ImportSaveInProgress","importConfig","collection","onImportSuccess","errorSaving","setErrorSaving","dataSource","useDataSource","savingRef","useRef","processedEntities","setProcessedEntities","save","saveDataBatch","useEffect","CenteredView","Button","CircularProgress","offset","batchSize","onProgressUpdate","batch","d","ImportCollectionAction","collectionEntitiesCount","onAnalyticsEvent","customizationController","open","setOpen","React","step","setStep","handleClickOpen","useCallback","handleClose","onMappingComplete","onPreviewComplete","buildEntityPropertiesFromData","buildHeadersMappingFromData","firstKey","resolvedCollection","resolveCollection","getPropertiesWithPropertiesOrder","propertiesAndLevel","getPropertiesAndLevel","propertiesOrder","Tooltip","FileUploadIcon","Dialog","DialogContent","isIdColumn","PropertyTreeSelect","newPropertyKey","newHeadersMapping","currentImportKey","currentPropertyKey","ImportDataPreview","importedCollection","DialogActions","internalIDValue","selectedPropertyKey","onPropertySelected","onIdSelected","selectedProperty","renderValue","PropertySelectEntry","onSelectValueChange","level","childKey","_","cn","defaultBorderMixin","mappedData","selectionController","useSelectionController","EntityCollectionTable","p","objArr","child","childProperty","childProperties","childHeadersMapping","subKey","mapping","slug","slugify","downloadExport","additionalData","flattenArrays","additionalHeaders","exportType","dateExportType","arrayValuesCount","getArrayValuesCount","headers","getExportHeaders","exportableData","getCSVExportableData","headersData","entryToCSVRow","h","csvData","entry","downloadBlob","getJsonExportableData","json","mergedData","processValuesForExport","additional","header","getValueInPath","getHeaders","prefix","processValueForExport","inputValue","ref","inputValues","updatedValues","updatedValue","a","b","content","filename","contentType","blob","url","pom","DOCS_LIMIT","ExportCollectionAction","inputCollection","inputPath","exportAllowed","notAllowedView","exportConfig","dateRef","setFlattenArrays","setExportType","setDateExportType","context","useFireCMSContext","useNavigationController","canExport","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","fetchAdditionalFields","additionalExportFields","additionalFields","resolvedExportColumnsValues","entity","column","resolvedColumnsValues","field","doDownload","onOkClicked","GetAppIcon","Alert","focusedMixin","BooleanSwitchWithLabel","useImportExportPlugin","props","useMemo"],"mappings":"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"}