@firecms/collection_editor 3.0.0-canary.92 → 3.0.0-canary.94

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.umd.js","sources":["../src/ui/collection_editor/CollectionYupValidation.tsx","../src/ui/collection_editor/CollectionDetailsForm.tsx","../src/ui/collection_editor/util.ts","../src/ui/collection_editor/EnumForm.tsx","../src/ui/collection_editor/SwitchControl.tsx","../src/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ValidationPanel.tsx","../src/ui/collection_editor/properties/EnumPropertyField.tsx","../src/ui/collection_editor/properties/StoragePropertyField.tsx","../src/utils/entities.ts","../src/ui/collection_editor/PropertyFieldPreview.tsx","../src/ui/collection_editor/PropertyTree.tsx","../src/ui/collection_editor/properties/MapPropertyField.tsx","../src/ui/collection_editor/properties/RepeatPropertyField.tsx","../src/ui/collection_editor/properties/CommonPropertyFields.tsx","../src/ui/collection_editor/properties/StringPropertyField.tsx","../src/ui/collection_editor/properties/BooleanPropertyField.tsx","../src/ui/collection_editor/properties/BlockPropertyField.tsx","../src/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx","../src/ui/collection_editor/properties/NumberPropertyField.tsx","../src/ui/collection_editor/properties/ReferencePropertyField.tsx","../src/ui/collection_editor/properties/DateTimePropertyField.tsx","../src/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx","../src/ui/collection_editor/properties/KeyValuePropertyField.tsx","../src/ui/collection_editor/utils/update_property_for_widget.ts","../src/ui/collection_editor/PropertySelectItem.tsx","../src/ui/collection_editor/properties/UrlPropertyField.tsx","../src/ui/collection_editor/utils/supported_fields.tsx","../src/ui/collection_editor/PropertyEditView.tsx","../src/ui/collection_editor/utils/strings.ts","../src/ui/collection_editor/GetCodeDialog.tsx","../src/ui/collection_editor/CollectionPropertiesEditorForm.tsx","../src/ui/collection_editor/UnsavedChangesDialog.tsx","../src/ui/collection_editor/EntityCustomViewsSelectDialog.tsx","../src/ui/collection_editor/SubcollectionsEditTab.tsx","../src/ui/collection_editor/templates/products_template.ts","../src/ui/collection_editor/templates/blog_template.ts","../src/ui/collection_editor/templates/users_template.ts","../src/ui/collection_editor/templates/pages_template.ts","../src/ui/collection_editor/CollectionEditorWelcomeView.tsx","../src/ui/collection_editor/import/CollectionEditorImportMapping.tsx","../src/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx","../src/ui/collection_editor/import/clean_import_data.ts","../src/ui/collection_editor/CollectionEditorDialog.tsx","../src/ConfigControllerProvider.tsx","../src/useCollectionEditorController.tsx","../src/ui/EditorCollectionAction.tsx","../src/useCollectionsConfigController.tsx","../src/ui/HomePageEditorCollectionAction.tsx","../src/ui/CollectionViewHeaderAction.tsx","../src/ui/PropertyAddColumnComponent.tsx","../src/ui/NewCollectionButton.tsx","../src/ui/EditorCollectionActionStart.tsx","../src/ui/NewCollectionCard.tsx","../src/useCollectionEditorPlugin.tsx","../src/utils/collections.ts","../src/ui/MissingReferenceWidget.tsx"],"sourcesContent":["import * as Yup from \"yup\";\n\nexport const YupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\"),\n path: Yup.string().required(\"Required\")\n});\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, FieldCaption, IconForView, SearchIconsView, singular, toSnakeCase, } from \"@firecms/core\";\nimport {\n Autocomplete,\n AutocompleteItem,\n BooleanSwitchWithLabel,\n Chip,\n ClearIcon,\n cls,\n Container,\n DebouncedTextField,\n Dialog,\n ExpandablePanel,\n IconButton,\n Select,\n SelectItem,\n SettingsIcon,\n TextField,\n Tooltip,\n Typography,\n useAutoComplete\n} from \"@firecms/ui\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\n\nexport function CollectionDetailsForm({\n isNewCollection,\n reservedGroups,\n existingPaths,\n existingIds,\n groups,\n parentCollection\n }: {\n isNewCollection: boolean,\n reservedGroups?: string[];\n existingPaths?: string[];\n existingIds?: string[];\n groups: string[] | null;\n parentCollection?: EntityCollection;\n parentCollectionIds?: string[];\n}) {\n\n const groupRef = React.useRef<HTMLInputElement>(null);\n const {\n values,\n setFieldValue,\n handleChange,\n touched,\n errors,\n setFieldTouched,\n isSubmitting,\n submitCount\n } = useFormex<EntityCollection>();\n\n const [iconDialogOpen, setIconDialogOpen] = useState(false);\n const [advancedPanelExpanded, setAdvancedPanelExpanded] = useState(false);\n\n const updateName = (name: string) => {\n setFieldValue(\"name\", name);\n\n const pathTouched = getIn(touched, \"path\");\n if (!pathTouched && isNewCollection && name) {\n setFieldValue(\"path\", toSnakeCase(name));\n }\n\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && isNewCollection && name) {\n setFieldValue(\"id\", toSnakeCase(name));\n }\n\n const singularNameTouched = getIn(touched, \"singularName\");\n if (!singularNameTouched && isNewCollection && name) {\n setFieldValue(\"singularName\", singular(name));\n }\n\n };\n\n useEffect(() => {\n if (errors.id) {\n setAdvancedPanelExpanded(true);\n }\n }, [errors.id]);\n\n const collectionIcon = <IconForView collectionOrView={values}/>;\n\n const groupOptions = groups?.filter((group) => !reservedGroups?.includes(group));\n\n const {\n inputFocused,\n autoCompleteOpen,\n setAutoCompleteOpen\n } = useAutoComplete({\n ref: groupRef\n });\n\n const isSubcollection = !!parentCollection;\n\n let customIdValue: \"true\" | \"false\" | \"optional\" | \"code_defined\" | undefined;\n if (typeof values.customId === \"object\") {\n customIdValue = \"code_defined\";\n } else if (values.customId === true) {\n customIdValue = \"true\";\n } else if (values.customId === false) {\n customIdValue = \"false\";\n } else if (values.customId === \"optional\") {\n customIdValue = \"optional\";\n }\n\n const showErrors = submitCount > 0;\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div>\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={!isNewCollection ? \"h5\" : \"h4\"} className={\"flex-grow\"}>\n {isNewCollection ? \"New collection\" : `${values?.name} collection`}\n </Typography>\n <Tooltip title={\"Change icon\"}>\n <IconButton\n shape={\"square\"}\n onClick={() => setIconDialogOpen(true)}>\n {collectionIcon}\n </IconButton>\n </Tooltip>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n </div>\n <div className={\"grid grid-cols-12 gap-4\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n value={values.name ?? \"\"}\n onChange={(e: any) => updateName(e.target.value)}\n label={\"Name\"}\n required\n error={showErrors && Boolean(errors.name)}/>\n <FieldCaption error={touched.name && Boolean(errors.name)}>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of in this collection, usually a plural name (e.g. Products)\"}\n </FieldCaption>\n </div>\n\n <div className={cls(\"col-span-12 \", isSubcollection ? \"\" : \"sm:col-span-8\")}>\n <Field name={\"path\"}\n as={DebouncedTextField}\n label={\"Path\"}\n disabled={!isNewCollection}\n required\n error={showErrors && Boolean(errors.path)}/>\n\n <FieldCaption error={touched.path && Boolean(errors.path)}>\n {touched.path && Boolean(errors.path)\n ? errors.path\n : isSubcollection ? \"Relative path to the parent (no need to include the parent path)\" : \"Path that this collection is stored in, in the database\"}\n </FieldCaption>\n\n </div>\n\n {!isSubcollection && <div className={\"col-span-12 sm:col-span-4 relative\"}>\n\n <TextField error={showErrors && Boolean(errors.group)}\n disabled={isSubmitting}\n value={values.group ?? \"\"}\n autoComplete=\"off\"\n onChange={(event) => setFieldValue(\"group\", event.target.value)}\n name={\"group\"}\n inputRef={groupRef}\n label=\"Group\"/>\n <Autocomplete\n open={autoCompleteOpen && (groupOptions ?? []).length > 0}\n setOpen={setAutoCompleteOpen}>\n {groupOptions?.map((group, index) => {\n return <AutocompleteItem\n key={index + \"_\" + group}\n onClick={() => {\n setAutoCompleteOpen(false);\n setFieldValue(\"group\", group ?? null);\n }}\n >\n <div className={\"flex-grow\"}>\n {group}\n </div>\n </AutocompleteItem>;\n })}\n </Autocomplete>\n <FieldCaption>\n {showErrors && Boolean(errors.group) ? errors.group : \"Group of the collection\"}\n </FieldCaption>\n </div>}\n\n <div className={\"col-span-12\"}>\n <ExpandablePanel\n expanded={advancedPanelExpanded}\n onExpandedChange={setAdvancedPanelExpanded}\n title={\n <div className=\"flex flex-row text-gray-500\">\n <SettingsIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Advanced\n </Typography>\n </div>}\n initiallyExpanded={false}>\n <div className={\"grid grid-cols-12 gap-4 p-4\"}>\n\n <div className={\"col-span-12\"}>\n <Field name={\"id\"}\n as={DebouncedTextField}\n disabled={!isNewCollection}\n label={\"Collection id\"}\n error={showErrors && Boolean(errors.id)}/>\n <FieldCaption error={touched.id && Boolean(errors.id)}>\n {touched.id && Boolean(errors.id) ? errors.id : \"This id identifies this collection. Typically the same as the path.\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.singularName)}\n name={\"singularName\"}\n aria-describedby={\"singularName-helper\"}\n onChange={(e) => {\n setFieldTouched(\"singularName\", true);\n return handleChange(e);\n }}\n value={values.singularName ?? \"\"}\n label={\"Singular name\"}/>\n <FieldCaption error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define a singular name for your entities\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.sideDialogWidth)}\n name={\"sideDialogWidth\"}\n type={\"number\"}\n aria-describedby={\"sideDialogWidth-helper\"}\n onChange={(e) => {\n setFieldTouched(\"sideDialogWidth\", true);\n const value = e.target.value;\n if (!value) {\n setFieldValue(\"sideDialogWidth\", null);\n } else if (!isNaN(Number(value))) {\n setFieldValue(\"sideDialogWidth\", Number(value));\n }\n }}\n endAdornment={<IconButton\n size={\"small\"}\n onClick={() => {\n setFieldValue(\"sideDialogWidth\", null);\n }}\n disabled={!values.sideDialogWidth}>\n <ClearIcon size={\"small\"}/>\n </IconButton>}\n value={values.sideDialogWidth ?? \"\"}\n label={\"Side dialog width\"}/>\n <FieldCaption error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define the width (in pixels) of entities side dialog. Default is 768px\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.description)}\n name=\"description\"\n value={values.description ?? \"\"}\n onChange={handleChange}\n multiline\n rows={2}\n aria-describedby=\"description-helper-text\"\n label=\"Description\"\n />\n <FieldCaption error={showErrors && Boolean(errors.description)}>\n {showErrors && Boolean(errors.description) ? errors.description : \"Description of the collection, you can use markdown\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <Select\n name=\"defaultSize\"\n label=\"Default row size\"\n position={\"item-aligned\"}\n onChange={handleChange}\n value={values.defaultSize ?? \"\"}\n renderValue={(value: any) => value.toUpperCase()}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((value) => (\n <SelectItem\n key={`size-select-${value}`}\n value={value}>\n {value.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <Select\n name=\"customId\"\n label=\"Document IDs generation\"\n position={\"item-aligned\"}\n disabled={customIdValue === \"code_defined\"}\n onValueChange={(v) => {\n if (v === \"code_defined\")\n throw new Error(\"This should not happen\");\n else if (v === \"true\")\n setFieldValue(\"customId\", true);\n else if (v === \"false\")\n setFieldValue(\"customId\", false);\n else if (v === \"optional\")\n setFieldValue(\"customId\", \"optional\");\n }}\n value={customIdValue ?? \"\"}\n renderValue={(value: any) => {\n if (value === \"code_defined\")\n return \"Code defined\";\n else if (value === \"true\")\n return \"Users must define an ID\";\n else if (value === \"optional\")\n return \"Users can define an ID, but it is not required\";\n else\n return \"Document ID is generated automatically\";\n }}\n >\n <SelectItem value={\"false\"}>\n Document ID is generated automatically\n </SelectItem>\n <SelectItem value={\"true\"}>\n Users must define an ID\n </SelectItem>\n <SelectItem value={\"optional\"}>\n Users can define an ID, but it is not required\n </SelectItem>\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Collection group\"\n onValueChange={(v) => setFieldValue(\"collectionGroup\", v)}\n value={values.collectionGroup ?? false}\n />\n <FieldCaption>\n A collection group consists of all collections with the same path. This allows\n you\n to query over multiple collections at once.\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Enable text search for this collection\"\n onValueChange={(v) => setFieldValue(\"textSearchEnabled\", v)}\n value={values.textSearchEnabled ?? false}\n />\n <FieldCaption>\n Allow text search for this collection. If you have not specified a text search\n delegate, this will use the built-in local text search. This is not recommended\n for large collections, as it may incur in performance and cost issues.\n </FieldCaption>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n </div>\n\n <div style={{ height: \"52px\" }}/>\n\n <Dialog\n open={iconDialogOpen}\n onOpenChange={setIconDialogOpen}\n maxWidth={\"xl\"}\n fullWidth\n >\n <div className={\"p-4 overflow-auto min-h-[200px]\"}>\n <SearchIconsView selectedIcon={values.icon}\n onIconSelected={(icon: string) => {\n setIconDialogOpen(false);\n setFieldValue(\"icon\", icon);\n }}/>\n </div>\n\n </Dialog>\n\n </Container>\n </div>\n );\n}\n","export function idToPropertiesPath(id: string): string {\n return \"properties.\" + id.replaceAll(\".\", \".properties.\");\n}\n\nexport function namespaceToPropertiesPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".properties\"\n : \"properties\";\n}\n\nexport function namespaceToPropertiesOrderPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".propertiesOrder\"\n : \"propertiesOrder\";\n}\n\nexport function getFullId(propertyKey: string, propertyNamespace?: string): string {\n return propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n}\n\nexport function getFullIdPath(propertyKey: string, propertyNamespace?: string): string {\n const keyWithNamespace = propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n return idToPropertiesPath(keyWithNamespace);\n}\n","import React, { useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { ArrayContainer, EnumValueConfig, EnumValues, FieldCaption, } from \"@firecms/core\";\nimport {\n AutoAwesomeIcon,\n Badge,\n Button,\n CircularProgress,\n DebouncedTextField,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n ListIcon,\n Paper,\n SettingsIcon,\n Typography\n} from \"@firecms/ui\";\nimport { extractEnumFromValues } from \"@firecms/schema_inference\";\nimport { Field, Formex, getIn, useCreateFormex, useFormex } from \"@firecms/formex\";\n\ntype EnumFormProps = {\n enumValues: EnumValueConfig[];\n onValuesChanged?: (enumValues: EnumValueConfig[]) => void;\n onError?: (error: boolean) => void;\n updateIds: boolean;\n disabled: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<string[]>;\n};\n\nexport function EnumForm({\n enumValues,\n onValuesChanged,\n onError,\n updateIds,\n disabled,\n allowDataInference,\n getData\n }: EnumFormProps) {\n\n const formex = useCreateFormex<{\n enumValues: EnumValueConfig[]\n }>({\n initialValues: { enumValues },\n validateOnChange: true,\n validation: (values) => {\n const errors: any = {};\n if (values.enumValues) {\n values.enumValues.forEach((enumValue, index) => {\n if (!enumValue?.label) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].label = \"You must specify a label for this enum value entry\";\n }\n if (!enumValue?.id) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].id = \"You must specify an ID for this enum value entry\";\n }\n });\n }\n const hasError = Boolean(errors?.enumValues && Object.keys(errors?.enumValues).length > 0);\n onError?.(hasError);\n return errors;\n }\n });\n\n const { values, errors } = formex;\n\n useEffect(() => {\n if (onValuesChanged) {\n onValuesChanged(values.enumValues);\n }\n }, [values.enumValues]);\n\n return <Formex value={formex}>\n <EnumFormFields enumValuesPath={\"enumValues\"}\n values={values}\n errors={errors}\n shouldUpdateId={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}/>\n </Formex>\n\n}\n\ntype EnumFormFieldsProps = {\n values: {\n enumValues: EnumValueConfig[]\n };\n errors: any;\n enumValuesPath: string;\n shouldUpdateId: boolean;\n disabled: boolean;\n getData?: () => Promise<string[]>;\n allowDataInference?: boolean;\n};\n\n// const EnumFormFields = React.memo(\nfunction EnumFormFields({\n values,\n errors,\n disabled,\n enumValuesPath,\n shouldUpdateId,\n allowDataInference,\n getData,\n }: EnumFormFieldsProps) {\n\n const {\n setFieldValue\n } = useFormex();\n\n const [lastInternalIdAdded, setLastInternalIdAdded] = React.useState<number | undefined>();\n const [editDialogIndex, setEditDialogIndex] = React.useState<number | undefined>();\n const [inferring, setInferring] = React.useState(false);\n\n const inferredValuesRef = React.useRef(new Set());\n const inferredValues = inferredValuesRef.current;\n\n const buildEntry = (index: number, internalId: number) => {\n const justAdded = lastInternalIdAdded === internalId;\n const entryError = errors?.enumValues && errors?.enumValues[index];\n return <EnumEntry index={index}\n disabled={disabled}\n enumValuesPath={enumValuesPath}\n autoFocus={justAdded}\n entryError={entryError}\n shouldUpdateId={shouldUpdateId || justAdded}\n onDialogOpen={() => setEditDialogIndex(index)}\n inferredEntry={inferredValues.has(values.enumValues[index]?.id as string)}\n key={`${internalId}`}/>;\n };\n\n const inferValues = async () => {\n if (!getData)\n return;\n setInferring(true);\n getData?.().then((data) => {\n if (!data)\n return;\n\n const flatData = data.flat();\n\n const fieldData = Array.from(new Set(flatData));\n\n const currentEnumValues = values.enumValues;\n const foundEnumValues = extractEnumFromValues(fieldData);\n\n // add only new enum values\n const newEnumValues = foundEnumValues.filter((enumValue) => {\n return !currentEnumValues?.some((v: any) => v.id === enumValue.id);\n });\n\n newEnumValues.forEach((enumValue) => {\n inferredValues.add(enumValue.id);\n });\n setFieldValue(enumValuesPath, [...newEnumValues, ...currentEnumValues], true);\n }).catch(e => {\n console.error(e);\n })\n .finally(() => setInferring(false));\n }\n\n return (\n <div className={\"col-span-12\"}>\n <div className=\"ml-3.5 flex flex-row items-center\">\n <ListIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2 grow\">\n Values\n </Typography>\n {allowDataInference &&\n <Button loading={inferring}\n disabled={disabled || inferring}\n variant={\"text\"}\n size={\"small\"}\n onClick={inferValues}>\n {inferring ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n Infer values from data\n </Button>}\n </div>\n\n <Paper className=\"p-4 m-1\">\n\n <ArrayContainer droppableId={enumValuesPath}\n addLabel={\"Add enum value\"}\n value={values.enumValues}\n disabled={disabled}\n size={\"small\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastInternalIdAdded}\n includeAddButton={true}\n onValueChange={(value) => setFieldValue(enumValuesPath, value)}\n newDefaultEntry={{ id: \"\", label: \"\" }}/>\n\n <EnumEntryDialog index={editDialogIndex}\n open={editDialogIndex !== undefined}\n enumValuesPath={enumValuesPath}\n onClose={() => setEditDialogIndex(undefined)}/>\n </Paper>\n </div>\n );\n}\n\ntype EnumEntryProps = {\n index: number,\n enumValuesPath: string,\n shouldUpdateId: boolean,\n autoFocus: boolean,\n onDialogOpen: () => void;\n disabled: boolean;\n inferredEntry?: boolean;\n entryError?: { label?: string, id?: string }\n};\n\nconst EnumEntry = React.memo(\n function EnumEntryInternal({\n index,\n shouldUpdateId: updateId,\n enumValuesPath,\n autoFocus,\n onDialogOpen,\n disabled,\n inferredEntry,\n entryError\n }: EnumEntryProps) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<EnumValues>();\n\n const shouldUpdateIdRef = React.useRef(!getIn(values, `${enumValuesPath}[${index}].id`));\n const shouldUpdateId = updateId || shouldUpdateIdRef.current;\n\n const idValue = getIn(values, `${enumValuesPath}[${index}].id`);\n const labelValue = getIn(values, `${enumValuesPath}[${index}].label`);\n\n const currentLabelRef = React.useRef(labelValue);\n\n React.useEffect(() => {\n if ((currentLabelRef.current === idValue || !idValue) && shouldUpdateId) {\n setFieldValue(`${enumValuesPath}[${index}].id`, labelValue);\n }\n currentLabelRef.current = labelValue;\n }, [labelValue]);\n\n return (\n <>\n <div className={\"flex w-full align-center justify-center\"}>\n <Field name={`${enumValuesPath}[${index}].label`}\n as={DebouncedTextField}\n className={\"flex-grow\"}\n required\n disabled={disabled}\n size=\"small\"\n autoFocus={autoFocus}\n autoComplete=\"off\"\n endAdornment={inferredEntry && <AutoAwesomeIcon size={\"small\"}/>}\n error={Boolean(entryError?.label)}/>\n\n {!disabled &&\n <Badge color={\"error\"} invisible={!entryError?.id}>\n <IconButton\n size=\"small\"\n aria-label=\"edit\"\n className={\"m-1\"}\n onClick={() => onDialogOpen()}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Badge>}\n\n </div>\n\n {entryError?.label && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.label}\n </Typography>}\n\n {entryError?.id && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.id}\n </Typography>}\n\n </>);\n },\n function areEqual(prevProps: EnumEntryProps, nextProps: EnumEntryProps) {\n return prevProps.index === nextProps.index &&\n prevProps.enumValuesPath === nextProps.enumValuesPath &&\n prevProps.shouldUpdateId === nextProps.shouldUpdateId &&\n prevProps.inferredEntry === nextProps.inferredEntry &&\n equal(prevProps.entryError, nextProps.entryError) &&\n prevProps.autoFocus === nextProps.autoFocus;\n }\n);\n\nfunction EnumEntryDialog({\n index,\n open,\n onClose,\n enumValuesPath\n }: {\n index?: number;\n open: boolean;\n enumValuesPath: string;\n onClose: () => void;\n}) {\n\n const {\n errors,\n } = useFormex<EnumValues>();\n\n const idError = index !== undefined ? getIn(errors, `${enumValuesPath}[${index}].id`) : undefined;\n return <Dialog\n maxWidth=\"md\"\n aria-labelledby=\"enum-edit-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n\n <DialogContent>\n {index !== undefined &&\n <div>\n <Field name={`${enumValuesPath}[${index}].id`}\n as={DebouncedTextField}\n required\n label={\"ID\"}\n size=\"small\"\n autoComplete=\"off\"\n error={Boolean(idError)}/>\n\n <FieldCaption error={Boolean(idError)}>\n {idError ?? \"Value saved in the data source\"}\n </FieldCaption>\n </div>}\n </DialogContent>\n\n <DialogActions>\n <Button\n autoFocus\n variant=\"outlined\"\n onClick={onClose}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n}\n\n","import React from \"react\";\n\nimport { BooleanSwitchWithLabel, Tooltip } from \"@firecms/ui\";\nimport { FormexFieldProps } from \"@firecms/formex\";\n\nexport function SwitchControl({\n field,\n form,\n label,\n tooltip,\n disabled,\n size = \"small\",\n allowIndeterminate\n }: FormexFieldProps & {\n label: string,\n tooltip?: string,\n disabled?: boolean,\n size?: \"small\" | \"medium\",\n allowIndeterminate?: boolean\n}) {\n\n const formControlLabel = <BooleanSwitchWithLabel\n label={label}\n size={size}\n position={\"start\"}\n value={field.value}\n disabled={disabled}\n allowIndeterminate={allowIndeterminate}\n onValueChange={(checked:boolean | null) => form.setFieldValue(field.name, checked)}/>;\n\n if (tooltip)\n return (\n <Tooltip\n title={tooltip}>\n {formControlLabel}\n </Tooltip>\n );\n return formControlLabel;\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function GeneralPropertyValidation({ disabled }: {\n required?: boolean;\n disabled: boolean;\n}) {\n\n const { values, handleChange } = useFormex();\n\n const validationRequired = \"validation.required\";\n const validationRequiredMessage = \"validation.requiredMessage\";\n const validationUnique = \"validation.unique\";\n const validationUniqueInArray = \"validation.uniqueInArray\";\n\n return (\n <>\n <div className={\"col-span-6\"}>\n <Field name={validationRequired}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Required\"}\n tooltip={\"You won't be able to save this entity if this value is not set\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-6\"}>\n\n <Field name={validationUnique}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Unique\"}\n tooltip={\"There cannot be multiple entities with the same value\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n {getIn(values, validationRequired) && <div className={\"col-span-12\"}>\n <DebouncedTextField\n disabled={disabled}\n value={getIn(values, validationRequiredMessage)}\n label={\"Required message\"}\n name={validationRequiredMessage}\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, serializeRegExp } from \"@firecms/core\";\nimport { DebouncedTextField, } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function StringPropertyValidation({\n length,\n lowercase,\n matches,\n max,\n min,\n trim,\n uppercase,\n disabled,\n showErrors\n }: {\n length?: boolean;\n min?: boolean;\n max?: boolean;\n trim?: boolean;\n matches?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors\n } = useFormex();\n\n const validationLength = \"validation.length\";\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationTrim = \"validation.trim\";\n const validationMatches = \"validation.matches\";\n const validationLowercase = \"validation.lowercase\";\n const validationUppercase = \"validation.uppercase\";\n\n const matchesError = getIn(errors, validationMatches);\n\n const matchesValue = getIn(values, validationMatches);\n const matchesStringValue = typeof matchesValue === \"string\" ? matchesValue : serializeRegExp(matchesValue);\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n\n {lowercase && <div className={\"col-span-4\"}>\n <Field name={validationLowercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Lowercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {uppercase && <div className={\"col-span-4\"}>\n <Field name={validationUppercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Uppercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {trim && <div className={\"col-span-4\"}>\n <Field name={validationTrim}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Trim\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n </div>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n {length && <div className={\"col-span-4\"}>\n <DebouncedTextField\n value={getIn(values, validationLength)}\n label={\"Exact length\"}\n name={validationLength}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {min && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {max && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n </div>\n\n {matches && <div className={\"col-span-12\"}>\n <Field name={validationMatches}\n as={DebouncedTextField}\n label={\"Matches regex\"}\n size=\"small\"\n disabled={disabled}\n value={matchesStringValue}\n error={Boolean(matchesError)}/>\n <FieldCaption error={Boolean(matchesError)}>\n {matchesError ? \"Not a valid regexp\" : \"e.g. /^\\\\d+$/ for digits only\"}\n </FieldCaption>\n </div>}\n\n </div>\n );\n\n}\n","import React from \"react\";\n\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\n\nexport function ArrayPropertyValidation({\n max = true,\n min = true,\n disabled\n }: {\n min?: boolean;\n max?: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n {min && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n disabled={disabled}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n {max && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n disabled={disabled}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { ExpandablePanel, RuleIcon, Typography } from \"@firecms/ui\";\n\nexport function ValidationPanel({\n children\n }: PropsWithChildren<{}>) {\n\n return (\n <ExpandablePanel\n initiallyExpanded={false}\n asField={true}\n className=\"p-4\"\n title={\n <div className=\"flex flex-row text-gray-500\">\n <RuleIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Validation\n </Typography>\n </div>\n }>\n\n {children}\n\n </ExpandablePanel>\n )\n}\n","import React, { useMemo } from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { EnumValueConfig, resolveEnumValues, useSnackbarController } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { EnumForm } from \"../EnumForm\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { PropertyWithId } from \"../PropertyEditView\";\n\nexport function EnumPropertyField({\n multiselect,\n updateIds,\n disabled,\n showErrors,\n allowDataInference,\n getData\n }: {\n multiselect: boolean;\n updateIds: boolean;\n disabled: boolean;\n showErrors: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<object[]>;\n}) {\n\n const {\n values,\n setFieldError,\n setFieldValue\n } = useFormex<PropertyWithId>();\n\n const snackbarContext = useSnackbarController();\n\n const enumValuesPath = multiselect ? \"of.enumValues\" : \"enumValues\";\n\n const defaultValue = getIn(values, \"defaultValue\");\n\n const valuesEnumValues = getIn(values, enumValuesPath);\n const enumValues: EnumValueConfig[] = useMemo(() => {\n if (!valuesEnumValues || typeof valuesEnumValues === \"boolean\")\n return [] as EnumValueConfig[];\n return resolveEnumValues(valuesEnumValues) ?? [] as EnumValueConfig[];\n }, [valuesEnumValues]);\n\n const onValuesChanged = (value: EnumValueConfig[]) => {\n if (!values)\n return;\n setFieldValue(enumValuesPath, value);\n if (!multiselect) {\n const enumIds = value.filter(v => Boolean(v?.id)).map((v: any) => v.id);\n if (defaultValue && !enumIds.includes(defaultValue)) {\n setFieldValue(\"defaultValue\", undefined);\n snackbarContext.open({\n type: \"warning\",\n message: \"Default value was cleared\"\n })\n }\n }\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <EnumForm enumValues={enumValues}\n updateIds={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n onError={(hasError) => {\n setFieldError(enumValuesPath, hasError ? \"This enum property is missing some values\" : undefined);\n }}\n getData={getData\n ? () => getData()\n .then(res => res.map(entry => values.id && getIn(entry, values.id)).filter(Boolean))\n : undefined}\n onValuesChanged={onValuesChanged}/>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiselect &&\n <StringPropertyValidation disabled={disabled}\n showErrors={showErrors}/>}\n {multiselect &&\n <ArrayPropertyValidation disabled={disabled}/>}\n </ValidationPanel>\n\n </div>\n\n {!multiselect && <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n setFieldValue(\"defaultValue\", value);\n }}\n label={\"Default value\"}\n value={defaultValue ?? \"\"}>\n {enumValues\n .filter((enumValue) => Boolean(enumValue?.id))\n .map((enumValue) => (\n <SelectItem key={enumValue.id}\n value={enumValue.id?.toString()}>\n {enumValue.label}\n </SelectItem>\n ))}\n </Select>\n\n </div>}\n </>\n );\n}\n","import React from \"react\";\nimport {\n Button,\n Checkbox,\n DebouncedTextField,\n ExpandablePanel,\n FileUploadIcon,\n MultiSelect,\n MultiSelectItem,\n Typography\n} from \"@firecms/ui\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nconst fileTypes: Record<string, string> = {\n \"image/*\": \"Images\",\n \"video/*\": \"Videos\",\n \"audio/*\": \"Audio files\",\n \"application/*\": \"Files (pdf, zip, csv, excel...)\",\n \"text/*\": \"Text files\"\n}\n\nexport function StoragePropertyField({\n multiple,\n existing,\n disabled\n }: {\n multiple: boolean;\n existing: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex();\n\n const baseStoragePath = multiple ? \"of.storage\" : \"storage\";\n const acceptedFiles = `${baseStoragePath}.acceptedFiles`;\n\n const metadata = `${baseStoragePath}.metadata`;\n const fileName = `${baseStoragePath}.fileName`;\n const maxSize = `${baseStoragePath}.maxSize`;\n const storagePath = `${baseStoragePath}.storagePath`;\n const storeUrl = `${baseStoragePath}.storeUrl`;\n\n const fileNameValue = getIn(values, fileName) ?? \"{rand}_{file}\";\n const storagePathValue = getIn(values, storagePath) ?? \"/\";\n const maxSizeValue = getIn(values, maxSize);\n\n const storedValue = getIn(values, acceptedFiles);\n const fileTypesValue: string[] | undefined = Array.isArray(storedValue) ? storedValue : undefined;\n const allFileTypesSelected = !fileTypesValue || fileTypesValue.length === 0;\n\n const handleTypesChange = (value: string[]) => {\n if (!value) setFieldValue(acceptedFiles, undefined);\n else if (value.includes(\"all\")) setFieldValue(acceptedFiles, undefined);\n else if (value.length >= Object.keys(fileTypes).length) setFieldValue(acceptedFiles, undefined);\n else if (allFileTypesSelected)\n setFieldValue(acceptedFiles, Object.keys(fileTypes).filter((v) => !value.includes(v)));\n else setFieldValue(acceptedFiles, value);\n };\n\n const hasFilenameCallback = typeof fileNameValue === \"function\";\n const hasStoragePathCallback = typeof storagePathValue === \"function\";\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ExpandablePanel\n title={\n <div className=\"flex flex-row text-gray-500\">\n <FileUploadIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n File upload config\n </Typography>\n </div>\n }>\n\n <div className={\"grid grid-cols-12 gap-2 p-4\"}>\n\n <div className={\"col-span-12\"}>\n\n <MultiSelect\n disabled={disabled}\n name={acceptedFiles}\n value={fileTypesValue ?? []}\n onMultiValueChange={handleTypesChange}\n label={allFileTypesSelected ? undefined : \"Allowed file types\"}\n renderValues={(selected) => {\n if (!selected || selected.length === 0) return \"All file types allowed\";\n return selected.map((v: string) => fileTypes[v])\n .filter((v: string) => Boolean(v))\n .join(\", \");\n }}>\n\n <MultiSelectItem key={\"all\"} value={\"all\"} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={!fileTypesValue}/>\n All\n </MultiSelectItem>\n\n {Object.entries(fileTypes).map(([value, label]) => (\n <MultiSelectItem key={value} value={value} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={allFileTypesSelected || fileTypesValue.indexOf(value) > -1}/>\n <div className={\"flex-grow\"}>\n {label}\n </div>\n <Button size={\"small\"}\n variant={\"outlined\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n return setFieldValue(acceptedFiles, [value]);\n }}>\n Only\n </Button>\n </MultiSelectItem>\n ))}\n\n </MultiSelect>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={fileName}\n as={DebouncedTextField}\n label={\"File name\"}\n size={\"small\"}\n disabled={hasFilenameCallback || disabled}\n value={hasFilenameCallback ? \"-\" : fileNameValue}\n />\n </div>\n <div className={\"col-span-12\"}>\n <Field name={storagePath}\n as={DebouncedTextField}\n label={\"Storage path\"}\n disabled={hasStoragePathCallback || disabled}\n size={\"small\"}\n value={hasStoragePathCallback ? \"-\" : storagePathValue}\n />\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n <p>You can use the following placeholders in\n the file name\n and storage path values:</p>\n <ul>\n <li>{\"{file} - Full name of the uploaded file\"}</li>\n <li>{\"{file.name} - Name of the uploaded file without extension\"}</li>\n <li>{\"{file.ext} - Extension of the uploaded file\"}</li>\n <li>{\"{entityId} - ID of the entity\"}</li>\n <li>{\"{propertyKey} - ID of this field\"}</li>\n <li>{\"{path} - Path of this entity\"}</li>\n <li>{\"{rand} - Random value used to avoid name collisions\"}</li>\n </ul>\n </Typography>\n\n <Field name={storeUrl}\n type=\"checkbox\">\n {({\n field,\n form\n }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Save URL instead of storage path\"}\n disabled={existing || disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n Turn this setting on, if you prefer to save\n the download\n URL of the uploaded file instead of the\n storage path.\n You can only change this prop upon creation.\n </Typography>\n </div>\n\n <div className={\"col-span-12\"}>\n <DebouncedTextField name={maxSize}\n type={\"number\"}\n label={\"Max size (in bytes)\"}\n size={\"small\"}\n value={maxSizeValue !== undefined && maxSizeValue !== null ? maxSizeValue.toString() : \"\"}\n onChange={(e) => {\n const value = e.target.value;\n if (value === \"\") setFieldValue(maxSize, undefined);\n else setFieldValue(maxSize, parseInt(value));\n }}\n />\n </div>\n\n </div>\n </ExpandablePanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiple && <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n </div>}\n {multiple && <div className={\"col-span-12\"}>\n <ArrayPropertyValidation disabled={disabled}/>\n </div>}\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { isPropertyBuilder, Properties, PropertiesOrBuilders, Property, PropertyOrBuilder } from \"@firecms/core\";\n\nexport function editableProperty(property: PropertyOrBuilder | PropertyOrBuilder): boolean {\n if (isPropertyBuilder(property))\n return false;\n if (isPropertyBuilder(property as PropertyOrBuilder))\n return false;\n else {\n const eProperty = property as Property;\n if (eProperty.dataType === \"array\" && typeof eProperty.of === \"function\")\n return false;\n else if (eProperty.dataType === \"array\" && Array.isArray(eProperty.of))\n return false;\n return Boolean(eProperty.editable);\n }\n}\n\nexport function removeNonEditableProperties(properties: PropertiesOrBuilders<any>): Properties {\n return Object.entries(properties)\n .filter(([_, property]) => editableProperty(property))\n .map(([key, propertyOrBuilder]) => {\n const property = propertyOrBuilder as Property;\n if (!editableProperty(property)) {\n return undefined;\n } else if (property.dataType === \"map\" && property.properties) {\n return {\n [key]: {\n ...property,\n properties: removeNonEditableProperties(property.properties as PropertiesOrBuilders)\n }\n };\n } else {\n return { [key]: property };\n }\n })\n .filter((e) => Boolean(e))\n .reduce((a, b) => ({ ...a, ...b }), {}) as Properties;\n}\n","import {\n ErrorBoundary,\n PropertyConfigBadge,\n getFieldConfig,\n isPropertyBuilder,\n Property,\n PropertyOrBuilder,\n useCustomizationController,\n} from \"@firecms/core\";\nimport {\n cardClickableMixin,\n cardMixin,\n cardSelectedMixin,\n cls,\n FunctionsIcon,\n Paper,\n RemoveCircleIcon,\n Typography,\n} from \"@firecms/ui\";\n\nimport { editableProperty } from \"../../utils/entities\";\n\nexport function PropertyFieldPreview({\n property,\n onClick,\n hasError,\n includeName,\n includeEditButton,\n selected\n }: {\n property: Property,\n hasError?: boolean,\n selected?: boolean,\n includeName?: boolean,\n includeEditButton?: boolean;\n onClick?: () => void\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = getFieldConfig(property, propertyConfigs);\n const disabled = !editableProperty(property);\n\n const borderColorClass = hasError\n ? \"border-red-500 dark:border-red-500 border-opacity-100 dark:border-opacity-100 ring-0 dark:ring-0\"\n : (selected ? \"border-primary\" : \"border-transparent\");\n\n return <ErrorBoundary>\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"m-4\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <Paper\n className={cls(\n \"border\",\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n borderColorClass\n )}\n >\n\n <div className=\"w-full flex flex-col\">\n\n {includeName &&\n <ErrorBoundary>\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 </ErrorBoundary>}\n\n <div className=\"flex flex-row items-center\">\n <ErrorBoundary>\n <Typography className=\"flex-grow pr-2\"\n variant={includeName ? \"body2\" : \"subtitle1\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>\n </ErrorBoundary>\n <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>\n\n </div>\n </div>\n\n {includeEditButton && <Typography variant={\"button\"}>\n EDIT\n </Typography>}\n\n </Paper>\n </div>\n </ErrorBoundary>\n}\n\nexport function NonEditablePropertyPreview({\n name,\n selected,\n onClick,\n property\n }: {\n name: string,\n selected: boolean,\n onClick?: () => void,\n property?: PropertyOrBuilder\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = !isPropertyBuilder(property) && property ? getFieldConfig(property, propertyConfigs) : undefined;\n\n return (\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"relative m-4\"}>\n {propertyConfig && <PropertyConfigBadge propertyConfig={propertyConfig}/>}\n {!propertyConfig && <div\n className={\"h-8 w-8 p-1 rounded-full shadow text-white bg-gray-500\"}>\n <FunctionsIcon color={\"inherit\"} size={\"medium\"}/>\n </div>}\n <RemoveCircleIcon color={\"disabled\"} size={\"small\"} className={\"absolute -right-2 -top-2\"}/>\n </div>\n <Paper\n className={cls(\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n selected ? \"border-primary\" : \"border-transparent\")}\n >\n\n <div className=\"w-full flex flex-col\">\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property?.name\n ? property.name\n : name\n }\n </Typography>\n\n <div className=\"flex flex-row items-center\">\n {propertyConfig && <Typography className=\"flex-grow pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>}\n\n {property && !isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>}\n\n {property && isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This property is defined as a property builder in code\n </Typography>\n </ErrorBoundary>}\n\n {!property && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This field is defined as an additional field in code\n </Typography>\n </ErrorBoundary>}\n\n </div>\n\n {/*<div className=\"flex flex-row text-xs\">*/}\n {/* <Typography className=\"flex-grow pr-2\"*/}\n {/* variant=\"body2\"*/}\n {/* component=\"span\"*/}\n {/* color=\"secondary\">*/}\n {/* This field can only be edited in code*/}\n {/* </Typography>*/}\n {/*</div>*/}\n </div>\n\n </Paper>\n </div>)\n}\n","import React from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CMSType,\n ErrorBoundary,\n isPropertyBuilder,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"@firecms/core\";\nimport { AutoAwesomeIcon, defaultBorderMixin, DragHandleIcon, IconButton, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { NonEditablePropertyPreview, PropertyFieldPreview } from \"./PropertyFieldPreview\";\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\nimport { getFullId, getFullIdPath } from \"./util\";\nimport { editableProperty } from \"../../utils/entities\";\n\nexport const PropertyTree = React.memo(\n function PropertyTree<M extends {\n [Key: string]: CMSType\n }>({\n namespace,\n selectedPropertyKey,\n onPropertyClick,\n properties,\n propertiesOrder: propertiesOrderProp,\n additionalFields,\n errors,\n onPropertyMove,\n onPropertyRemove,\n className,\n inferredPropertyKeys,\n collectionEditable\n }: {\n namespace?: string;\n selectedPropertyKey?: string;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n properties: PropertiesOrBuilders<M>;\n propertiesOrder?: string[];\n additionalFields?: AdditionalFieldDelegate<M>[];\n errors: Record<string, any>;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n className?: string;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n }) {\n\n const propertiesOrder = propertiesOrderProp ?? Object.keys(properties);\n\n const onDragEnd = (result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const startIndex = result.source.index;\n const endIndex = result.destination.index;\n\n const newPropertiesOrder = Array.from(propertiesOrder);\n const [removed] = newPropertiesOrder.splice(startIndex, 1);\n newPropertiesOrder.splice(endIndex, 0, removed);\n if (onPropertyMove)\n onPropertyMove(newPropertiesOrder, namespace);\n }\n\n return (\n <>\n\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`droppable_${namespace}`}>\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={className}>\n {propertiesOrder && propertiesOrder\n .map((propertyKey: string, index: number) => {\n const property = properties[propertyKey] as PropertyOrBuilder;\n const additionalField = additionalFields?.find(field => field.key === propertyKey);\n\n if (!property && !additionalField) {\n console.warn(`Property ${propertyKey} not found in properties or additionalFields`);\n return null;\n }\n return (\n <Draggable\n key={`array_field_${namespace}_${propertyKey}}`}\n draggableId={`array_field_${namespace}_${propertyKey}}`}\n index={index}>\n {(provided, snapshot) => {\n return (\n <ErrorBoundary>\n <PropertyTreeEntry\n propertyKey={propertyKey as string}\n propertyOrBuilder={property}\n additionalField={additionalField}\n provided={provided}\n errors={errors}\n namespace={namespace}\n inferredPropertyKeys={inferredPropertyKeys}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n onPropertyClick={snapshot.isDragging ? undefined : onPropertyClick}\n selectedPropertyKey={selectedPropertyKey}\n collectionEditable={collectionEditable}\n />\n </ErrorBoundary>\n );\n }}\n </Draggable>);\n }).filter(Boolean)}\n\n {droppableProvided.placeholder}\n\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n </>\n );\n },\n (prevProps, nextProps) => {\n\n const isSelected = nextProps.selectedPropertyKey?.startsWith(nextProps.namespace ?? \"\");\n const wasSelected = prevProps.selectedPropertyKey?.startsWith(prevProps.namespace ?? \"\");\n if (isSelected || wasSelected)\n return false;\n\n return equal(prevProps.properties, nextProps.properties) &&\n prevProps.propertiesOrder === nextProps.propertiesOrder &&\n equal(prevProps.additionalFields, nextProps.additionalFields) &&\n equal(prevProps.errors, nextProps.errors) &&\n equal(prevProps.onPropertyClick, nextProps.onPropertyClick) &&\n // equal(prevProps.onPropertyMove, nextProps.onPropertyMove) &&\n // equal(prevProps.onPropertyRemove, nextProps.onPropertyRemove) &&\n prevProps.namespace === nextProps.namespace &&\n prevProps.collectionEditable === nextProps.collectionEditable;\n }\n);\n\nexport function PropertyTreeEntry({\n propertyKey,\n namespace,\n propertyOrBuilder,\n additionalField,\n provided,\n selectedPropertyKey,\n errors,\n onPropertyClick,\n onPropertyMove,\n onPropertyRemove,\n inferredPropertyKeys,\n collectionEditable\n }: {\n propertyKey: string;\n namespace?: string;\n propertyOrBuilder: PropertyOrBuilder;\n additionalField?: AdditionalFieldDelegate<any>;\n selectedPropertyKey?: string;\n provided: DraggableProvided;\n errors: Record<string, any>;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n}) {\n\n const isPropertyInferred = inferredPropertyKeys?.includes(namespace ? `${namespace}.${propertyKey}` : propertyKey);\n const fullId = getFullId(propertyKey, namespace);\n const fullIdPath = getFullIdPath(propertyKey, namespace);\n const hasError = fullIdPath in errors;\n\n let subtree;\n if (typeof propertyOrBuilder === \"object\") {\n const property = propertyOrBuilder;\n if (property.dataType === \"map\" && property.properties) {\n subtree = <PropertyTree\n selectedPropertyKey={selectedPropertyKey}\n namespace={fullId}\n properties={property.properties}\n propertiesOrder={property.propertiesOrder}\n errors={errors}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n collectionEditable={collectionEditable}\n />\n }\n }\n\n // const hasError = fullId ? getIn(errors, idToPropertiesPath(fullId)) : false;\n const selected = selectedPropertyKey === fullId;\n const editable = propertyOrBuilder && ((collectionEditable && !isPropertyBuilder(propertyOrBuilder)) || editableProperty(propertyOrBuilder));\n\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className=\"relative -ml-8\"\n >\n {subtree && <div\n className={\"absolute border-l \" + defaultBorderMixin}\n style={{\n left: \"32px\",\n top: \"64px\",\n bottom: \"16px\"\n }}/>}\n\n {!isPropertyBuilder(propertyOrBuilder) && !additionalField && editable\n ? <PropertyFieldPreview\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n includeName={true}\n selected={selected}\n hasError={hasError}/>\n : <NonEditablePropertyPreview name={propertyKey}\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n selected={selected}/>}\n\n <div className=\"absolute top-2 right-2 flex flex-row \">\n\n {isPropertyInferred && <Tooltip title={\"Inferred property\"}>\n <AutoAwesomeIcon size=\"small\" className={\"p-2\"}/>\n </Tooltip>}\n\n {onPropertyRemove && <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n color=\"inherit\"\n onClick={() => onPropertyRemove(propertyKey, namespace)}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n {onPropertyMove && <Tooltip title={\"Move\"}>\n <IconButton\n component={\"span\"}\n size=\"small\"\n >\n <DragHandleIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n </div>\n\n {subtree && <div className={\"ml-16\"}>{subtree}</div>}\n </div>\n );\n\n}\n","import React, { useState } from \"react\";\nimport { FieldCaption, MapProperty, Property, PropertyConfig, } from \"@firecms/core\";\nimport { AddIcon, BooleanSwitchWithLabel, Button, Paper, Typography } from \"@firecms/ui\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\n\nexport function MapPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<MapProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const propertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const onPropertyCreated = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const currentPropertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"propertiesOrder\", newPropertiesOrder, false);\n\n setPropertyDialogOpen(false);\n };\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n const propertiesPath = idToPropertiesPath(fullId);\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n\n setFieldValue(propertiesPath, undefined, false);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const empty = !propertiesOrder || propertiesOrder.length < 1;\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className=\"flex justify-between items-end my-4\">\n <Typography variant={\"subtitle2\"}>Properties in this group</Typography>\n <Button\n color=\"primary\"\n variant={\"outlined\"}\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this group\"}\n </Button>\n </div>\n <Paper className=\"p-2 pl-8\">\n <PropertyTree\n properties={values.properties ?? {}}\n propertiesOrder={propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={(propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={onPropertyMove}/>\n\n {empty &&\n <Typography variant={\"label\"}\n className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this group\n </Typography>}\n </Paper>\n </div>\n\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n size={\"small\"}\n label=\"Spread children as columns\"\n onValueChange={(v) => setFieldValue(\"spreadChildren\", v)}\n value={values.spreadChildren ?? false}\n />\n <FieldCaption>\n Set this flag to true if you want to display the children of this group as individual columns.\n </FieldCaption>\n </div>\n\n <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n getData={getData}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyCreated}\n existingPropertyKeys={selectedPropertyKey ? undefined : propertiesOrder}\n propertyConfigs={propertyConfigs}\n />\n\n </>);\n}\n","import React, { useState } from \"react\";\nimport { ArrayProperty, getFieldConfig, Property, PropertyConfig } from \"@firecms/core\";\nimport { Button, Paper, Typography } from \"@firecms/ui\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { PropertyFieldPreview } from \"../PropertyFieldPreview\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function RepeatPropertyField({\n showErrors,\n existing,\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n showErrors: boolean,\n existing: boolean,\n disabled: boolean,\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState(false);\n const ofProperty = getIn(values, \"of\");\n const ofPropertyError = getIn(touched, \"of\") && getIn(errors, \"of\");\n\n const onPropertyChanged = ({ id, property, namespace }:\n { id?: string, property: Property, namespace?: string }) => {\n setFieldValue(\"of\", property);\n };\n\n const widget = ofProperty && getFieldConfig(ofProperty, propertyConfigs);\n return (\n <>\n <div className={\"col-span-12\"}>\n <Typography variant={\"subtitle2\"}>\n Repeat component\n </Typography>\n <Field\n name={\"of\"}\n value={ofProperty}\n // validate={(property: Property) => {\n // return property?.dataType ? undefined : \"You need to specify a repeat field\";\n // }}\n >\n {({}) => (\n <Paper className=\"p-2 mt-4\">\n\n {ofProperty && <PropertyFieldPreview\n property={ofProperty}\n onClick={disabled ? undefined : () => setPropertyDialogOpen(true)}\n includeName={false}\n includeEditButton={true}\n selected={false}\n hasError={false}/>}\n\n {!disabled && !ofProperty && <Button variant={\"text\"}\n size={\"large\"}\n color={ofPropertyError ? \"error\" : \"primary\"}\n onClick={() => setPropertyDialogOpen(true)}>\n Edit {`${widget ? widget.name : \"repeat component\"}`}\n </Button>}\n\n <PropertyFormDialog\n inArray={true}\n open={propertyDialogOpen}\n existingProperty={existing}\n getData={getData}\n autoUpdateId={!existing}\n autoOpenTypeSelect={!existing}\n onOkClicked={() => setPropertyDialogOpen(false)}\n allowDataInference={allowDataInference}\n property={ofProperty}\n includeIdAndName={false}\n onPropertyChanged={onPropertyChanged}\n forceShowErrors={showErrors}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />\n </Paper>\n )}\n </Field>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <ArrayPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { PropertyWithId } from \"../PropertyEditView\";\nimport React from \"react\";\nimport { FieldCaption, toSnakeCase, unslugify } from \"@firecms/core\";\n\ntype CommonPropertyFieldsProps = {\n showErrors: boolean,\n disabledId: boolean,\n disabled: boolean;\n isNewProperty: boolean;\n autoUpdateId: boolean;\n};\n\nexport const CommonPropertyFields = React.forwardRef<HTMLDivElement, CommonPropertyFieldsProps>(\n function CommonPropertyFields({\n showErrors,\n disabledId,\n disabled,\n autoUpdateId,\n isNewProperty\n }, ref) {\n\n const {\n errors,\n values,\n setFieldValue,\n setFieldTouched,\n touched,\n validate\n } = useFormex<PropertyWithId>();\n\n const name = \"name\";\n const nameError = showErrors && getIn(errors, name);\n\n const id = \"id\";\n const idError = showErrors && getIn(errors, id);\n\n const description = \"description\";\n const descriptionError = showErrors && getIn(errors, description);\n\n return (\n <div className={\"flex flex-col gap-2 col-span-12\"}>\n\n <div>\n <Field\n name={name}\n inputRef={ref}\n as={DebouncedTextField}\n value={values[name]}\n onChange={(e: any) => {\n const newNameValue = e.target.value;\n const idTouched = getIn(touched, id);\n if (!idTouched && autoUpdateId) {\n setFieldValue(id, newNameValue ? toSnakeCase(newNameValue) : \"\", false)\n }\n setFieldValue(name, newNameValue, true);\n setFieldTouched(name, true);\n }}\n style={{ fontSize: 20 }}\n placeholder={\"Field name\"}\n required\n disabled={disabled}\n error={Boolean(nameError)}/>\n\n <FieldCaption error={Boolean(nameError)}>\n {nameError}\n </FieldCaption>\n </div>\n\n <div>\n <Field\n name={id}\n as={DebouncedTextField}\n label={\"ID\"}\n value={values[id]}\n onChange={(e: any) => {\n const newIdValue = e.target.value;\n const nameTouched = getIn(touched, name);\n if (!nameTouched && autoUpdateId) {\n setFieldValue(name, newIdValue ? unslugify(newIdValue) : \"\")\n }\n setFieldValue(id, newIdValue, true);\n setFieldTouched(id, true);\n }}\n disabled={disabledId || disabled}\n required\n size=\"small\"\n error={Boolean(idError)}/>\n <FieldCaption error={Boolean(idError)}>\n {idError}\n </FieldCaption>\n </div>\n\n <div>\n <Field name={description}\n as={DebouncedTextField}\n label={\"Description\"}\n disabled={disabled}\n error={Boolean(descriptionError)}/>\n <FieldCaption error={Boolean(descriptionError)}>\n {descriptionError}\n </FieldCaption>\n </div>\n\n </div>\n );\n\n }\n);\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { TextField } from \"@firecms/ui\";\n\nexport function StringPropertyField({\n widgetId,\n disabled,\n showErrors\n }: {\n widgetId: \"text_field\" | \"multiline\" | \"markdown\" | \"email\";\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n {widgetId === \"text_field\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n matches={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"multiline\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"markdown\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n\n {widgetId === \"email\" &&\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>}\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\n\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nexport function BooleanPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n const { values } = useFormex();\n const defaultValue = getIn(values, \"defaultValue\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <Field\n name={\"defaultValue\"}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={defaultValue === null || defaultValue === undefined ? \"Default value not set\" : (\"Default value is \" + defaultValue.toString())}\n disabled={disabled}\n allowIndeterminate={true} field={field}\n form={form}/>\n }}\n </Field>\n\n </div>\n </>\n );\n}\n","import React, { useState } from \"react\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { ArrayProperty, Property, PropertyConfig } from \"@firecms/core\";\n\nexport function BlockPropertyField({\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const onPropertyChanged = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n\n setFieldValue(\"oneOf.properties\", {\n ...(values.oneOf?.properties ?? {}),\n [id]: property\n }, false);\n const currentPropertiesOrder = values.oneOf?.propertiesOrder ?? Object.keys(values.oneOf?.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"oneOf.propertiesOrder\", newPropertiesOrder, false);\n setPropertyDialogOpen(false);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.oneOf?.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(`oneOf.${idToPropertiesPath(fullId)}`, undefined, false);\n const propertiesOrderPath = `oneOf.${namespaceToPropertiesOrderPath(namespace)}`;\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const addChildButton = <Button\n autoFocus\n color=\"primary\"\n\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this block\"}\n </Button>;\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(`oneOf.${namespaceToPropertiesOrderPath(namespace)}`, propertiesOrder, false);\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className={\"flex justify-between items-end mt-8 mb-4\"}>\n <Typography variant={\"subtitle2\"}>Properties in this\n block</Typography>\n {addChildButton}\n </div>\n <Paper className=\"p-2 pl-8\">\n\n <PropertyTree\n properties={values.oneOf?.properties ?? {}}\n propertiesOrder={values.oneOf?.propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={disabled\n ? undefined\n : (propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={disabled\n ? undefined\n : onPropertyMove}/>\n\n {!disabled && !values.oneOf?.propertiesOrder?.length &&\n <div className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this block\n </div>}\n\n </Paper>\n </div>\n\n {!disabled && <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n getData={getData}\n allowDataInference={allowDataInference}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n collectionEditable={collectionEditable}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyChanged}\n existingPropertyKeys={selectedPropertyKey ? undefined : values.oneOf?.propertiesOrder}\n propertyConfigs={propertyConfigs}/>}\n\n </>);\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function NumberPropertyValidation({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationLessThan = \"validation.lessThan\";\n const validationMoreThan = \"validation.moreThan\";\n const validationPositive = \"validation.positive\";\n const validationNegative = \"validation.negative\";\n const validationInteger = \"validation.integer\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min value\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max value\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationLessThan)}\n label={\"Less than\"}\n name={validationLessThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationMoreThan)}\n label={\"More than\"}\n name={validationMoreThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-4\"}>\n <Field name={validationPositive}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Positive value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationNegative}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Negative value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationInteger}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Integer value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { NumberPropertyValidation } from \"./validation/NumberPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { TextField } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nexport function NumberPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <NumberPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n type={\"number\"}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : parseFloat(e.target.value));\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, IconForView, NumberProperty, StringProperty, useNavigationController } from \"@firecms/core\";\nimport { CircularProgress, Select, SelectGroup, SelectItem, Typography, } from \"@firecms/ui\";\n\nexport function ReferencePropertyField({\n existing,\n multiple,\n disabled,\n showErrors\n }: {\n existing: boolean,\n multiple: boolean,\n disabled: boolean,\n showErrors: boolean\n}) {\n\n const {\n values,\n handleChange,\n errors,\n } = useFormex<StringProperty | NumberProperty>();\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const pathPath = multiple ? \"of.path\" : \"path\";\n const pathValue: string | undefined = getIn(values, pathPath);\n const pathError: string | undefined = showErrors && getIn(errors, pathPath);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Field name={pathPath}\n pathPath={pathPath}\n type=\"select\"\n disabled={(existing && Boolean(pathValue)) || disabled}\n value={pathValue}\n error={pathError}\n handleChange={handleChange}\n as={CollectionsSelect}/>\n\n </div>\n\n </>\n );\n}\n\nexport function CollectionsSelect({\n disabled,\n pathPath,\n value,\n handleChange,\n error,\n ...props\n }: {\n disabled: boolean,\n pathPath: string,\n value?: string,\n handleChange: (event: any) => void,\n error?: string\n}) {\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const collections = navigation?.collections ?? [];\n\n const groups: string[] = Array.from(new Set(\n Object.values(collections).map(e => e.group).filter(Boolean) as string[]\n ).values());\n\n const ungroupedCollections = collections.filter((col) => !col.group);\n\n return (\n <>\n <Select\n error={Boolean(error)}\n disabled={disabled}\n value={value ?? \"\"}\n position={\"item-aligned\"}\n name={pathPath}\n onChange={handleChange}\n label={\"Target collection\"}\n renderValue={(selected) => {\n const selectedCollection = collections.find(collection => collection.id === selected || collection.path === selected);\n if (!selectedCollection) return null;\n return (\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={selectedCollection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {selectedCollection?.name.toUpperCase()}\n </Typography>\n </div>)\n }}\n {...props}>\n\n {groups.flatMap((group) => (\n <SelectGroup label={group || \"Views\"}\n key={`group_${group}`}>\n {\n collections.filter(collection => collection.group === group)\n .map((collection) => {\n return <SelectItem\n key={`${collection.id ?? collection.path}-${group}`}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>\n ))}\n\n {ungroupedCollections && <SelectGroup label={\"Views\"}>\n {ungroupedCollections\n .map((collection) => {\n return <SelectItem key={collection.id ?? collection.path}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>}\n\n </Select>\n\n <FieldCaption>\n You can only edit the reference collection upon field\n creation.\n </FieldCaption>\n </>\n );\n}\n","import React from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, NumberProperty, StringProperty } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function DateTimePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n errors,\n touched,\n setFieldValue\n } = useFormex<StringProperty | NumberProperty>();\n\n const modePath = \"mode\";\n const modeValue: string | undefined = getIn(values, modePath);\n const modeError: string | undefined = getIn(touched, modePath) && getIn(errors, modePath);\n\n const autoValuePath = \"autoValue\";\n const autoValueValue: string | undefined = getIn(values, autoValuePath);\n const autoValueError: string | undefined = getIn(touched, autoValuePath) && getIn(errors, autoValuePath);\n\n return (\n <>\n <div className={\"flex flex-col col-span-12\"}>\n <Select name={modePath}\n value={modeValue ?? \"date\"}\n error={Boolean(modeError)}\n onValueChange={(v) => setFieldValue(modePath, v)}\n label={\"Mode\"}\n renderValue={(v) => {\n switch (v) {\n case \"date_time\":\n return \"Date/Time\";\n case \"date\":\n return \"Date\";\n default:\n return \"\";\n }\n }}\n disabled={disabled}>\n <SelectItem value={\"date_time\"}> Date/Time </SelectItem>\n <SelectItem value={\"date\"}> Date </SelectItem>\n </Select>\n <FieldCaption error={Boolean(modeError)}>\n {modeError}\n </FieldCaption>\n\n <Select name={autoValuePath}\n disabled={disabled}\n value={autoValueValue ?? \"\"}\n onValueChange={(v) => setFieldValue(autoValuePath, v === \"none\" ? null : v)}\n renderValue={(v) => {\n switch (v) {\n case \"on_create\":\n return \"On create\";\n case \"on_update\":\n return \"On any update\";\n default:\n return \"None\";\n }\n }}\n error={Boolean(autoValueError)}\n label={\"Automatic value\"}>\n <SelectItem value={\"none\"}> None </SelectItem>\n <SelectItem value={\"on_create\"}> On create </SelectItem>\n <SelectItem value={\"on_update\"}> On any update </SelectItem>\n </Select>\n <FieldCaption error={Boolean(autoValueError)}>\n {autoValueError ?? \"Update this field automatically when creating or updating the entity\"}\n </FieldCaption>\n\n </div>\n\n <div className={\"col-span-12\"}>\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n </div>\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps } from \"@firecms/formex\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function AdvancedPropertyValidation({ disabled }: {\n disabled: boolean\n}) {\n\n const columnWidth = \"columnWidth\";\n const hideFromCollection = \"hideFromCollection\";\n const readOnly = \"readOnly\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <div className={\"col-span-12\"}>\n <Field type=\"checkbox\" name={hideFromCollection}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Hide from collection\"}\n disabled={disabled}\n form={form}\n tooltip={\"Hide this field from the collection view. It will still be visible in the form view\"}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={readOnly}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Read only\"}\n disabled={disabled}\n tooltip={\"Is this a read only field. Display only as a preview\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\n\nexport function KeyValuePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import {\n ArrayProperty,\n BooleanProperty,\n DateProperty,\n MapProperty,\n mergeDeep,\n NumberProperty,\n Property,\n PropertyConfig,\n StringProperty\n} from \"@firecms/core\";\n\nexport function updatePropertyFromWidget(propertyData: any,\n selectedWidgetId: string | undefined,\n propertyConfigs: Record<string, PropertyConfig>): Property {\n\n let updatedProperty;\n if (selectedWidgetId === \"text_field\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"text_field\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multiline\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"multiline\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n multiline: true,\n storage: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"markdown\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"markdown\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: true,\n email: undefined,\n url: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"url\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"url\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: true,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"email\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"email\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: true,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: propertyData.enumValues ?? []\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"number_input\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_input\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: undefined\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: propertyData.enumValues ?? []\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"multi_number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"number\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: {\n storagePath: \"/\"\n }\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n storage: propertyData.of?.storage ?? {\n storagePath: \"/\"\n }\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"group\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"group\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: false,\n properties: propertyData.properties ?? {}\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"key_value\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"key_value\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: true,\n properties: undefined\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"reference\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"reference\",\n propertyConfig: \"reference\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies Property\n );\n } else if (selectedWidgetId === \"multi_references\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_references\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"reference\"\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"switch\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"boolean\",\n propertyConfig: \"switch\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies BooleanProperty\n );\n } else if (selectedWidgetId === \"date_time\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"date\",\n propertyConfig: \"date_time\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n mode: \"date_time\"\n } satisfies DateProperty\n );\n } else if (selectedWidgetId === \"repeat\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"repeat\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"block\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"block\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n oneOf: {\n properties: {}\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId && propertyConfigs[selectedWidgetId]) {\n updatedProperty = {\n ...propertyConfigs[selectedWidgetId].property,\n propertyConfig: selectedWidgetId\n };\n }\n\n return updatedProperty;\n}\n","import { PropertyConfigBadge, PropertyConfig } from \"@firecms/core\";\nimport { cls, SelectItem, Typography } from \"@firecms/ui\";\n\nexport interface PropertySelectItemProps {\n value: string;\n optionDisabled: boolean;\n propertyConfig: PropertyConfig;\n existing: boolean;\n}\n\nexport function PropertySelectItem({ value, optionDisabled, propertyConfig, existing }: PropertySelectItemProps) {\n return <SelectItem value={value}\n disabled={optionDisabled}\n className={\"flex flex-row items-center\"}>\n <div\n className={cls(\n \"flex flex-row items-center text-base min-h-[52px]\",\n optionDisabled ? \"w-full\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <div>\n <div>{propertyConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"max-w-sm\"}>\n {existing && optionDisabled ? \"You can only switch to widgets that use the same data type\" : propertyConfig.description}\n </Typography>\n </div>\n </div>\n </SelectItem>\n}\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { Select, SelectItem, TextField } from \"@firecms/ui\";\n\nexport function UrlPropertyField({\n disabled,\n showErrors\n }: {\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n const urlValue = getIn(values, \"url\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n if (value === \"[NONE]\")\n setFieldValue(\"url\", true);\n else\n setFieldValue(\"url\", value);\n }}\n label={\"Preview type\"}\n renderValue={(value: string) => {\n switch (value) {\n case \"image\":\n return \"Image\";\n case \"video\":\n return \"Video\";\n case \"audio\":\n return \"Audio\";\n default:\n return \"Display URL\";\n }\n }}\n value={urlValue ?? \"[NONE]\"}>\n <SelectItem value={\"[NONE]\"}>\n Display URL\n </SelectItem>\n <SelectItem value={\"image\"}>\n Image\n </SelectItem>\n <SelectItem value={\"video\"}>\n Video\n </SelectItem>\n <SelectItem value={\"audio\"}>\n Audio\n </SelectItem>\n </Select>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import { DEFAULT_FIELD_CONFIGS, PropertyConfigId, PropertyConfig } from \"@firecms/core\";\n\nexport const supportedFieldsIds: PropertyConfigId[] = [\n \"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference\",\n \"multi_references\",\n \"switch\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"block\"\n];\n\nexport const supportedFields: Record<string, PropertyConfig> = Object.entries(DEFAULT_FIELD_CONFIGS)\n .filter(([id]) => supportedFieldsIds.includes(id as PropertyConfigId))\n .map(([id, config]) => ({ [id]: config }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n","import React, { useDeferredValue, useEffect, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { Formex, FormexController, getIn, useCreateFormex } from \"@firecms/formex\";\nimport {\n DEFAULT_FIELD_CONFIGS,\n DeleteConfirmationDialog,\n PropertyConfigId,\n getFieldConfig,\n getFieldId,\n isPropertyBuilder,\n isValidRegExp,\n mergeDeep,\n Property,\n PropertyConfig,\n PropertyConfigBadge,\n} from \"@firecms/core\";\nimport {\n Button,\n cls,\n DeleteIcon,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n InfoLabel,\n Select,\n Typography\n} from \"@firecms/ui\";\nimport { EnumPropertyField } from \"./properties/EnumPropertyField\";\nimport { StoragePropertyField } from \"./properties/StoragePropertyField\";\nimport { MapPropertyField } from \"./properties/MapPropertyField\";\nimport { RepeatPropertyField } from \"./properties/RepeatPropertyField\";\nimport { CommonPropertyFields } from \"./properties/CommonPropertyFields\";\nimport { StringPropertyField } from \"./properties/StringPropertyField\";\nimport { BooleanPropertyField } from \"./properties/BooleanPropertyField\";\nimport { BlockPropertyField } from \"./properties/BlockPropertyField\";\nimport { NumberPropertyField } from \"./properties/NumberPropertyField\";\nimport { ReferencePropertyField } from \"./properties/ReferencePropertyField\";\nimport { DateTimePropertyField } from \"./properties/DateTimePropertyField\";\nimport { AdvancedPropertyValidation } from \"./properties/advanced/AdvancedPropertyValidation\";\nimport { editableProperty } from \"../../utils/entities\";\nimport { KeyValuePropertyField } from \"./properties/KeyValuePropertyField\";\nimport { updatePropertyFromWidget } from \"./utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"./PropertySelectItem\";\nimport { UrlPropertyField } from \"./properties/UrlPropertyField\";\nimport { supportedFields } from \"./utils/supported_fields\";\n\nexport type PropertyWithId = Property & {\n id?: string\n};\n\nexport type OnPropertyChangedParams = {\n id?: string,\n property: Property,\n namespace?: string,\n previousId?: string\n};\n\nexport type PropertyFormProps = {\n includeIdAndName?: boolean;\n existingProperty: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n inArray: boolean;\n propertyKey?: string;\n propertyNamespace?: string;\n property?: Property;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onPropertyChangedImmediate?: boolean;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n initialErrors?: Record<string, any>;\n existingPropertyKeys?: string[];\n forceShowErrors?: boolean;\n allowDataInference: boolean;\n getData?: () => Promise<object[]>;\n getController?: (formex: FormexController<PropertyWithId>) => void;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport const PropertyForm = React.memo(\n function PropertyForm(props: PropertyFormProps) {\n\n const {\n includeIdAndName = true,\n autoOpenTypeSelect,\n existingProperty,\n autoUpdateId,\n inArray,\n propertyKey,\n existingPropertyKeys,\n propertyNamespace,\n property,\n onPropertyChanged,\n onPropertyChangedImmediate = true,\n onDelete,\n onError,\n initialErrors,\n forceShowErrors,\n allowDataInference,\n getController,\n getData,\n propertyConfigs,\n collectionEditable\n } = props;\n\n const initialValue: PropertyWithId = {\n id: \"\",\n name: \"\"\n } as PropertyWithId;\n\n const disabled = (Boolean(property && !editableProperty(property)) && !collectionEditable);\n\n const lastSubmittedProperty = useRef<OnPropertyChangedParams | undefined>(property ? {\n id: propertyKey,\n previousId: propertyKey,\n property\n } : undefined);\n\n const doOnPropertyChanged = ({\n id,\n property\n }: OnPropertyChangedParams) => {\n const params = {\n id,\n previousId: lastSubmittedProperty.current?.id,\n property,\n namespace: propertyNamespace\n };\n lastSubmittedProperty.current = params;\n onPropertyChanged?.(params);\n };\n\n const formexController = useCreateFormex<PropertyWithId>({\n initialValues: property\n ? { id: propertyKey, ...property } as PropertyWithId\n : initialValue,\n initialErrors,\n validateOnChange: true,\n validateOnInitialRender: true,\n onSubmit: (newPropertyWithId, controller) => {\n console.debug(\"onSubmit\", newPropertyWithId);\n const {\n id,\n ...property\n } = newPropertyWithId;\n doOnPropertyChanged({\n id,\n property: { ...property, editable: property.editable ?? true }\n });\n if (!existingProperty)\n controller.resetForm({ values: initialValue });\n },\n validation: (values) => {\n const errors: Record<string, any> = {};\n if (includeIdAndName) {\n if (!values.name) {\n errors.name = \"Required\";\n } else {\n const nameError = validateName(values.name);\n if (nameError)\n errors.name = nameError;\n }\n if (!values.id) {\n errors.id = \"Required\";\n } else {\n const idError = validateId(values.id, existingPropertyKeys);\n if (idError)\n errors.id = idError;\n }\n }\n\n if (values.dataType === \"string\") {\n if (values.validation?.matches && !isValidRegExp(values.validation?.matches.toString())) {\n errors.validation = {\n matches: \"Invalid regular expression\"\n }\n }\n }\n if (values.dataType === \"reference\" && !values.path) {\n errors.path = \"You must specify a target collection for the field\";\n }\n if (values.propertyConfig === \"repeat\") {\n if (!(values as any).of) {\n errors.of = \"You need to specify a repeat field\";\n }\n }\n if (values.propertyConfig === \"block\") {\n if (!(values as any).oneOf) {\n errors.oneOf = \"You need to specify the properties of this block\";\n }\n }\n return errors;\n }\n });\n\n useEffect(() => {\n getController?.(formexController);\n }, [formexController, getController]);\n\n return <Formex value={formexController}>\n <PropertyEditFormFields\n onPropertyChanged={onPropertyChangedImmediate\n ? doOnPropertyChanged\n : undefined}\n onDelete={onDelete}\n includeIdAndTitle={includeIdAndName}\n propertyNamespace={propertyNamespace}\n onError={onError}\n showErrors={forceShowErrors || formexController.submitCount > 0}\n existing={existingProperty}\n autoUpdateId={autoUpdateId}\n inArray={inArray}\n autoOpenTypeSelect={autoOpenTypeSelect}\n disabled={disabled}\n getData={getData}\n allowDataInference={allowDataInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n {...formexController}/>\n </Formex>;\n }, (a, b) =>\n a.getData === b.getData &&\n a.propertyKey === b.propertyKey &&\n a.propertyNamespace === b.propertyNamespace &&\n a.includeIdAndName === b.includeIdAndName &&\n a.autoOpenTypeSelect === b.autoOpenTypeSelect &&\n a.autoUpdateId === b.autoUpdateId &&\n a.existingPropertyKeys === b.existingPropertyKeys &&\n a.existingProperty === b.existingProperty\n);\n\nexport function PropertyFormDialog({\n open,\n onCancel,\n onOkClicked,\n onPropertyChanged,\n getData,\n collectionEditable,\n ...formProps\n }: PropertyFormProps & {\n open?: boolean;\n onOkClicked?: () => void;\n onCancel?: () => void;\n}) {\n const formexRef = useRef<FormexController<PropertyWithId>>();\n const getController = (helpers: FormexController<PropertyWithId>) => {\n formexRef.current = helpers;\n };\n\n return <Dialog\n open={open ?? false}\n maxWidth={\"xl\"}\n fullWidth={true}\n >\n <form noValidate={true}\n autoComplete={\"off\"}\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n formexRef.current?.handleSubmit(e)\n }}>\n <DialogContent>\n <PropertyForm {...formProps}\n onPropertyChanged={(params) => {\n onPropertyChanged?.(params);\n onOkClicked?.();\n }}\n collectionEditable={collectionEditable}\n onPropertyChangedImmediate={false}\n getController={getController}\n getData={getData}\n />\n </DialogContent>\n\n <DialogActions>\n\n {onCancel && <Button\n variant={\"text\"}\n onClick={() => {\n onCancel();\n formexRef.current?.resetForm();\n }}>\n Cancel\n </Button>}\n\n <Button variant=\"outlined\"\n type={\"submit\"}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n </form>\n </Dialog>;\n\n}\n\nfunction PropertyEditFormFields({\n values,\n errors,\n setValues,\n existing,\n autoUpdateId = false,\n autoOpenTypeSelect,\n includeIdAndTitle,\n onPropertyChanged,\n onDelete,\n propertyNamespace,\n onError,\n showErrors,\n disabled,\n inArray,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n includeIdAndTitle?: boolean;\n existing: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n propertyNamespace?: string;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n showErrors: boolean;\n inArray: boolean;\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n} & FormexController<PropertyWithId>) {\n\n const [selectOpen, setSelectOpen] = useState(autoOpenTypeSelect);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [selectedFieldConfigId, setSelectedFieldConfigId] = useState<string | undefined>(values?.dataType ? getFieldId(values) : undefined);\n\n const allSupportedFields = Object.entries(supportedFields).concat(Object.entries(propertyConfigs));\n\n const displayedWidgets = inArray\n ? allSupportedFields.filter(([_, propertyConfig]) => !isPropertyBuilder(propertyConfig.property) && propertyConfig.property?.dataType !== \"array\")\n : allSupportedFields;\n\n const deferredValues = useDeferredValue(values);\n const nameFieldRef = useRef<HTMLInputElement>(null);\n\n const lastSubmittedProperty = useRef<object>(values);\n\n const selectedWidgetError = showErrors && getIn(errors, \"selectedWidget\");\n\n useEffect(() => {\n if (onPropertyChanged) {\n if ((!includeIdAndTitle || deferredValues.id)) {\n const {\n id,\n ...property\n } = deferredValues;\n if (!equal(deferredValues, lastSubmittedProperty.current)) {\n onPropertyChanged({\n id,\n property,\n namespace: propertyNamespace\n });\n lastSubmittedProperty.current = deferredValues;\n }\n }\n }\n }, [deferredValues, includeIdAndTitle, propertyNamespace]);\n\n useEffect(() => {\n if (values?.id && onError) {\n onError(values?.id, propertyNamespace, errors);\n }\n }, [errors, propertyNamespace, values?.id]);\n\n const onWidgetSelectChanged = (newSelectedWidgetId: PropertyConfigId) => {\n setSelectedFieldConfigId(newSelectedWidgetId);\n setValues(updatePropertyFromWidget(values, newSelectedWidgetId, propertyConfigs));\n // Ugly hack to autofocus the name field\n setTimeout(() => {\n nameFieldRef.current?.focus();\n }, 0);\n };\n\n let childComponent;\n if (selectedFieldConfigId === \"text_field\" ||\n selectedFieldConfigId === \"multiline\" ||\n selectedFieldConfigId === \"markdown\" ||\n selectedFieldConfigId === \"email\") {\n childComponent =\n <StringPropertyField widgetId={selectedFieldConfigId}\n disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"url\") {\n childComponent =\n <UrlPropertyField disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"select\" ||\n selectedFieldConfigId === \"number_select\") {\n childComponent = <EnumPropertyField\n multiselect={false}\n allowDataInference={allowDataInference}\n updateIds={!existing}\n disabled={disabled}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"multi_select\" ||\n selectedFieldConfigId === \"multi_number_select\") {\n childComponent = <EnumPropertyField\n multiselect={true}\n updateIds={!existing}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"switch\") {\n childComponent = <BooleanPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"number_input\") {\n childComponent = <NumberPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"group\") {\n childComponent =\n <MapPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"block\") {\n childComponent =\n <BlockPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"reference\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"date_time\") {\n childComponent = <DateTimePropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_references\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"repeat\") {\n childComponent =\n <RepeatPropertyField showErrors={showErrors}\n existing={existing}\n getData={getData}\n allowDataInference={allowDataInference}\n disabled={disabled}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"key_value\") {\n childComponent =\n <KeyValuePropertyField disabled={disabled}/>;\n } else {\n childComponent = null;\n }\n\n return (\n <>\n {disabled && <InfoLabel mode={\"warn\"}>\n <Typography>This property can&apos;t be edited</Typography>\n <Typography variant={\"caption\"}>\n You may not have permission to\n edit it or it is defined in code with no <code>editable</code> flag\n </Typography>\n </InfoLabel>}\n\n <div className=\"flex mt-2 justify-between\">\n <div className={\"w-full flex flex-col gap-2\"}>\n <Select\n // className={\"w-full\"}\n error={Boolean(selectedWidgetError)}\n value={selectedFieldConfigId ?? \"\"}\n placeholder={\"Select a property widget\"}\n open={selectOpen}\n onOpenChange={setSelectOpen}\n position={\"item-aligned\"}\n disabled={disabled}\n renderValue={(value) => {\n if (!value) {\n return <em>Select a property\n widget</em>;\n }\n const key = value as PropertyConfigId;\n const propertyConfig = DEFAULT_FIELD_CONFIGS[key] ?? propertyConfigs[key];\n const baseProperty = propertyConfig.property;\n const baseFieldConfig = baseProperty && !isPropertyBuilder(baseProperty) ? getFieldConfig(baseProperty, propertyConfigs) : undefined;\n const optionDisabled = isPropertyBuilder(baseProperty) || (existing && baseProperty.dataType !== values?.dataType);\n const computedFieldConfig = baseFieldConfig ? mergeDeep(baseFieldConfig, propertyConfig) : propertyConfig;\n return <div\n onClick={(e) => {\n if (optionDisabled) {\n e.stopPropagation();\n e.preventDefault();\n }\n }}\n className={cls(\n \"flex items-center\",\n optionDisabled ? \"w-full pointer-events-none opacity-50\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={computedFieldConfig}/>\n </div>\n <div className={\"flex flex-col items-start text-base text-left\"}>\n <div>{computedFieldConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}>\n {optionDisabled ? \"You can only switch to widgets that use the same data type\" : computedFieldConfig.description}\n </Typography>\n </div>\n </div>\n }}\n onValueChange={(value) => {\n onWidgetSelectChanged(value as PropertyConfigId);\n }}>\n {displayedWidgets.map(([key, propertyConfig]) => {\n const baseProperty = propertyConfig.property;\n const optionDisabled = existing && !isPropertyBuilder(baseProperty) && baseProperty.dataType !== values?.dataType;\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={optionDisabled}\n propertyConfig={propertyConfig}\n existing={existing}/>;\n })}\n </Select>\n\n {selectedWidgetError &&\n <Typography variant=\"caption\"\n className={\"ml-3.5\"}\n color={\"error\"}>Required</Typography>}\n\n {/*<Typography variant=\"caption\" className={\"ml-3.5\"}>Define your own custom properties and*/}\n {/* components</Typography>*/}\n\n </div>\n\n {onDelete && values?.id &&\n <IconButton\n variant={\"ghost\"}\n className=\"m-4\"\n disabled={disabled}\n onClick={() => setDeleteDialogOpen(true)}>\n <DeleteIcon/>\n </IconButton>}\n </div>\n\n <div className={\"grid grid-cols-12 gap-y-12 mt-8 mb-8\"}>\n {includeIdAndTitle &&\n <CommonPropertyFields showErrors={showErrors}\n disabledId={existing}\n isNewProperty={!existing}\n disabled={disabled}\n autoUpdateId={autoUpdateId}\n ref={nameFieldRef}/>}\n\n {childComponent}\n\n <div className={\"col-span-12\"}>\n <AdvancedPropertyValidation disabled={disabled}/>\n </div>\n </div>\n\n {onDelete &&\n <DeleteConfirmationDialog open={deleteDialogOpen}\n onAccept={() => onDelete(values?.id, propertyNamespace)}\n onCancel={() => setDeleteDialogOpen(false)}\n title={<div>Delete this property?</div>}\n body={\n <div> This will <b>not delete any\n data</b>, only modify the\n collection.</div>\n }/>}\n\n </>\n );\n}\n\nconst idRegEx = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nfunction validateId(value?: string, existingPropertyKeys?: string[]) {\n\n let error;\n if (!value) {\n error = \"You must specify an id for the field\";\n }\n if (value && !value.match(idRegEx)) {\n error = \"The id can only contain letters, numbers and underscores (_), and not start with a number\";\n }\n if (value && existingPropertyKeys && existingPropertyKeys.includes(value)) {\n error = \"There is another field with this ID already\";\n }\n return error;\n}\n\nfunction validateName(value: string) {\n let error;\n if (!value) {\n error = \"You must specify a title for the field\";\n }\n return error;\n}\n","export function camelCase(str: string): string {\n if (!str) return \"\";\n return (str.slice(0, 1).toLowerCase() + str.slice(1))\n .replace(/([-_ ]){1,}/g, \" \")\n .split(/[-_ ]/)\n .reduce((cur, acc) => {\n return cur + acc[0].toUpperCase() + acc.substring(1);\n }, \"\");\n}\n","import { EntityCollection, useSnackbarController } from \"@firecms/core\";\nimport { Button, ContentCopyIcon, Dialog, DialogActions, DialogContent, Typography, } from \"@firecms/ui\";\nimport React from \"react\";\nimport JSON5 from \"json5\";\nimport { Highlight, themes } from \"prism-react-renderer\"\nimport { camelCase } from \"./utils/strings\";\n\nexport function GetCodeDialog({\n collection,\n onOpenChange,\n open\n }: { onOpenChange: (open: boolean) => void, collection: any, open: any }) {\n\n const snackbarController = useSnackbarController();\n\n const code = collection\n ? \"import { EntityCollection } from \\\"firecms\\\";\\n\\nconst \" + (collection?.name ? camelCase(collection.name) : \"my\") + \"Collection:EntityCollection = \" + JSON5.stringify(collectionToCode(collection), null, \"\\t\")\n : \"No collection selected\";\n return <Dialog open={open}\n onOpenChange={onOpenChange}\n maxWidth={\"4xl\"}>\n <DialogContent>\n <Typography variant={\"h6\"} className={\"my-4\"}>\n Code for {collection.name}\n </Typography>\n <Typography variant={\"body2\"} className={\"my-4 mb-8\"}>\n If you want to customise the collection in code, you can add this collection code to your CMS\n app configuration.\n More info in the <a\n rel=\"noopener noreferrer\"\n href={\"https://firecms.co/docs/customization_quickstart\"}>docs</a>.\n </Typography>\n <Highlight\n theme={themes.vsDark}\n code={code}\n language=\"typescript\"\n >\n {({\n className,\n style,\n tokens,\n getLineProps,\n getTokenProps\n }) => (\n <pre style={style} className={\"p-4 rounded text-sm\"}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n\n </DialogContent>\n <DialogActions>\n <Button\n variant={\"text\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n snackbarController.open({\n type: \"success\",\n message: `Copied`\n })\n return navigator.clipboard.writeText(code);\n }}>\n <ContentCopyIcon size={\"small\"}/>\n Copy to clipboard\n </Button>\n <Button onClick={() => onOpenChange(false)}>Close</Button>\n </DialogActions>\n </Dialog>;\n}\n\nfunction collectionToCode(collection: EntityCollection): object {\n\n const propertyCleanup = (property: any) => {\n\n const updatedProperty = {\n ...property\n };\n\n delete updatedProperty.fromBuilder;\n delete updatedProperty.resolved;\n delete updatedProperty.propertiesOrder;\n delete updatedProperty.editable;\n\n if (updatedProperty.type === \"map\") {\n return {\n ...updatedProperty,\n properties: updatedProperty.properties.map(propertyCleanup)\n }\n }\n return updatedProperty;\n }\n\n return {\n id: collection.id,\n name: collection.name,\n singularName: collection.singularName,\n path: collection.path,\n description: collection.description,\n editable: true,\n collectionGroup: collection.collectionGroup,\n icon: collection.icon,\n group: collection.group,\n customId: collection.customId,\n initialFilter: collection.initialFilter,\n initialSort: collection.initialSort,\n properties: Object.entries(collection.properties ?? {})\n .map(([key, value]) => ({\n [key]: propertyCleanup(value)\n }))\n .reduce((a, b) => ({ ...a, ...b }), {}),\n subcollections: (collection.subcollections ?? []).map(collectionToCode)\n }\n\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport {\n EntityCollection,\n ErrorBoundary,\n isPropertyBuilder,\n makePropertiesEditable,\n Properties,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n useLargeLayout,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n AddIcon,\n AutoAwesomeIcon,\n Button,\n CircularProgress,\n cls,\n CodeIcon,\n DebouncedTextField,\n defaultBorderMixin,\n IconButton,\n Paper,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\n\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"./util\";\nimport { OnPropertyChangedParams, PropertyForm, PropertyFormDialog } from \"./PropertyEditView\";\nimport { PropertyTree } from \"./PropertyTree\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { GetCodeDialog } from \"./GetCodeDialog\";\n\ntype CollectionEditorFormProps = {\n showErrors: boolean;\n isNewCollection: boolean;\n propertyErrorsRef?: React.MutableRefObject<any>;\n onPropertyError: (propertyKey: string, namespace: string | undefined, error?: Record<string, any>) => void;\n setDirty?: (dirty: boolean) => void;\n reservedGroups?: string[];\n extraIcon: React.ReactNode;\n getUser?: (uid: string) => User | null;\n getData?: () => Promise<object[]>;\n doCollectionInference: (collection: PersistedCollection) => Promise<Partial<EntityCollection> | null> | undefined;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport function CollectionPropertiesEditorForm({\n showErrors,\n isNewCollection,\n propertyErrorsRef,\n onPropertyError,\n setDirty,\n reservedGroups,\n extraIcon,\n getUser,\n getData,\n doCollectionInference,\n propertyConfigs,\n collectionEditable\n }: CollectionEditorFormProps) {\n\n const {\n values,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n errors,\n dirty\n } = useFormex<PersistedCollection>();\n\n const snackbarController = useSnackbarController();\n\n const largeLayout = useLargeLayout();\n const asDialog = !largeLayout\n\n // index of the selected property within the namespace\n const [selectedPropertyIndex, setSelectedPropertyIndex] = useState<number | undefined>();\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n const [codeDialogOpen, setCodeDialogOpen] = useState<boolean>(false);\n\n const [inferringProperties, setInferringProperties] = useState<boolean>(false);\n\n const [newPropertyDialogOpen, setNewPropertyDialogOpen] = useState<boolean>(false);\n const [inferredPropertyKeys, setInferredPropertyKeys] = useState<string[]>([]);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n useEffect(() => {\n if (setDirty)\n setDirty(dirty);\n }, [dirty]);\n\n const inferPropertiesFromData = doCollectionInference\n ? (): void => {\n if (!doCollectionInference)\n return;\n\n setInferringProperties(true);\n // @ts-ignore\n doCollectionInference(values)\n .then((newCollection) => {\n\n if (newCollection)\n makePropertiesEditable(newCollection.properties as Properties);\n\n if (!newCollection) {\n snackbarController.open({\n type: \"error\",\n message: \"Could not infer properties from data\"\n });\n return;\n }\n // find properties in the new collection, not present in the current one\n const newPropertyKeys = (newCollection.properties ? Object.keys(newCollection.properties) : [])\n .filter((propertyKey) => !values.properties[propertyKey]);\n if (newPropertyKeys.length === 0) {\n snackbarController.open({\n type: \"info\",\n message: \"No new properties found in existing data\"\n });\n return;\n }\n // add them to the current collection\n const updatedProperties = {\n ...newPropertyKeys.reduce((acc, propertyKey) => {\n acc[propertyKey] = (newCollection.properties ?? {})[propertyKey];\n return acc;\n }, {} as {\n [key: string]: PropertyOrBuilder\n }),\n ...values.properties\n };\n const updatedPropertiesOrder = [\n ...newPropertyKeys,\n ...(values.propertiesOrder ?? [])\n ];\n setFieldValue(\"properties\", updatedProperties, false);\n\n updatePropertiesOrder(updatedPropertiesOrder);\n\n setInferredPropertyKeys(newPropertyKeys);\n })\n .finally(() => {\n setInferringProperties(false);\n })\n }\n : undefined;\n\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"] ?? getIn(values, namespaceToPropertiesOrderPath());\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n };\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(idToPropertiesPath(fullId), undefined, false);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n if (currentPropertiesOrder) {\n const newPropertiesOrder = currentPropertiesOrder.filter((p) => p !== propertyKey);\n updatePropertiesOrder(newPropertiesOrder, namespace);\n }\n\n setNewPropertyDialogOpen(false);\n\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n const onPropertyCreated = ({\n id,\n property\n }: {\n id?: string,\n property: Property\n }) => {\n if (!id) {\n throw Error(\"Need to include an ID when creating a new property\")\n }\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const newPropertiesOrder = [...(values.propertiesOrder ?? Object.keys(values.properties)), id];\n updatePropertiesOrder(newPropertiesOrder);\n\n setNewPropertyDialogOpen(false);\n if (largeLayout) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n console.debug(\"onPropertyChanged, id change\", {\n id,\n property,\n previousId,\n namespace\n })\n\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n if (id) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n console.debug(\"onPropertyChanged\", {\n id,\n property,\n previousId,\n namespace,\n propertyPath\n })\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n\n };\n\n const onPropertyErrorInternal = (id: string, namespace?: string, error?: Record<string, any>) => {\n const propertyPath = id ? getFullId(id, namespace) : undefined;\n console.debug(\"onPropertyErrorInternal\", {\n id,\n namespace,\n error,\n propertyPath\n });\n if (propertyPath) {\n const hasError = error && Object.keys(error).length > 0;\n onPropertyError(id, namespace, hasError ? error : undefined);\n setFieldError(idToPropertiesPath(propertyPath), hasError ? \"Property error\" : undefined);\n }\n }\n\n const closePropertyDialog = () => {\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n };\n\n const initialErrors = selectedPropertyKey && propertyErrorsRef?.current?.properties ? propertyErrorsRef.current.properties[selectedPropertyKey] : undefined;\n\n const emptyCollection = values?.propertiesOrder === undefined || values.propertiesOrder.length === 0;\n\n const usedPropertiesOrder = (values.propertiesOrder\n ? values.propertiesOrder\n : Object.keys(values.properties)) as string[];\n\n const owner = useMemo(() => values.ownerId && getUser ? getUser(values.ownerId) : null, [getUser, values.ownerId]);\n\n const onPropertyClick = (propertyKey: string, namespace?: string) => {\n console.debug(\"CollectionEditor: onPropertyClick\", {\n propertyKey,\n namespace\n });\n setSelectedPropertyIndex(usedPropertiesOrder.indexOf(propertyKey));\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n };\n\n const body = (\n <div className={\"grid grid-cols-12 gap-2 h-full bg-gray-50 dark:bg-gray-900\"}>\n <div className={cls(\n \"p-4 md:p-8 pb-20 md:pb-20\",\n \"col-span-12 lg:col-span-5 h-full overflow-auto\",\n !asDialog && \"border-r \" + defaultBorderMixin\n )}>\n\n <div className=\"flex my-2\">\n\n <div className=\"flex-grow mb-4\">\n\n <Field\n name={\"name\"}\n as={DebouncedTextField}\n invisible={true}\n className=\"-ml-1\"\n inputClassName=\"text-2xl font-headers\"\n placeholder={\"Collection name\"}\n size={\"small\"}\n required\n error={Boolean(errors?.name)}/>\n\n {owner &&\n <Typography variant={\"body2\"}\n className={\"ml-2\"}\n color={\"secondary\"}>\n Created by {owner.displayName}\n </Typography>}\n </div>\n\n {extraIcon && <div className=\"ml-4\">\n {extraIcon}\n </div>}\n\n <div className=\"ml-1 mt-2 flex flex-row gap-2\">\n <Tooltip title={\"Get the code for this collection\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={() => setCodeDialogOpen(true)}>\n <CodeIcon/>\n </IconButton>\n </Tooltip>\n {inferPropertiesFromData && <Tooltip title={\"Add new properties based on data\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={inferPropertiesFromData}>\n {inferringProperties ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n </IconButton>\n </Tooltip>}\n <Tooltip title={\"Add new property\"}>\n <Button\n variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}>\n <AddIcon/>\n </Button>\n </Tooltip>\n </div>\n </div>\n\n <ErrorBoundary>\n <PropertyTree\n className={\"pl-8\"}\n inferredPropertyKeys={inferredPropertyKeys}\n selectedPropertyKey={selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined}\n properties={values.properties}\n additionalFields={values.additionalFields}\n propertiesOrder={usedPropertiesOrder}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={isNewCollection ? deleteProperty : undefined}\n collectionEditable={collectionEditable}\n errors={errors}/>\n </ErrorBoundary>\n\n <Button className={\"mt-8 w-full\"}\n color=\"primary\"\n variant={\"outlined\"}\n size={\"large\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}>\n Add new property\n </Button>\n </div>\n\n {!asDialog &&\n <div className={\"col-span-12 lg:col-span-7 p-4 md:py-8 md:px-4 h-full overflow-auto pb-20 md:pb-20\"}>\n <Paper\n className=\"sticky top-8 p-4 min-h-full border border-transparent w-full flex flex-col justify-center \">\n\n {selectedPropertyFullId &&\n selectedProperty &&\n !isPropertyBuilder(selectedProperty) &&\n <PropertyForm\n inArray={false}\n key={`edit_view_${selectedPropertyIndex}`}\n existingProperty={!isNewCollection}\n autoUpdateId={false}\n allowDataInference={!isNewCollection}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />}\n\n {!selectedProperty &&\n <div className={\"w-full flex flex-col items-center justify-center h-full gap-4\"}>\n <Typography variant={\"label\"} className=\"\">\n {emptyCollection\n ? \"Now you can add your first property\"\n : \"Select a property to edit it\"}\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n >\n <AddIcon/>\n Add new property\n </Button>\n </div>}\n\n {selectedProperty && isPropertyBuilder(selectedProperty) &&\n <Typography variant={\"label\"} className=\"flex items-center justify-center\">\n {\"This property is defined as a property builder in code\"}\n </Typography>}\n </Paper>\n </div>}\n\n {asDialog && <PropertyFormDialog\n inArray={false}\n open={selectedPropertyIndex !== undefined}\n key={`edit_view_${selectedPropertyIndex}`}\n autoUpdateId={!selectedProperty}\n allowDataInference={!isNewCollection}\n existingProperty={true}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n onOkClicked={asDialog\n ? closePropertyDialog\n : undefined\n }/>}\n\n </div>);\n\n return (<>\n\n {body}\n\n {/* This is the dialog used for new properties*/}\n <PropertyFormDialog\n inArray={false}\n existingProperty={false}\n autoOpenTypeSelect={true}\n autoUpdateId={true}\n forceShowErrors={showErrors}\n open={newPropertyDialogOpen}\n onCancel={() => setNewPropertyDialogOpen(false)}\n onPropertyChanged={onPropertyCreated}\n getData={getData}\n allowDataInference={!isNewCollection}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n existingPropertyKeys={values.propertiesOrder as string[]}/>\n\n <ErrorBoundary>\n <GetCodeDialog\n collection={values}\n open={codeDialogOpen}\n onOpenChange={setCodeDialogOpen}/>\n </ErrorBoundary>\n </>\n );\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogContent>\n <Typography variant={\"h6\"}>\n {title ?? \"Unsaved changes\"}\n </Typography>\n\n {body && <Typography>\n {body}\n </Typography>}\n <Typography>\n Are you sure?\n </Typography>\n\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import { useCustomizationController } from \"@firecms/core\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport React from \"react\";\n\nexport function EntityCustomViewsSelectDialog({ open, onClose }: { open: boolean, onClose: (selectedViewKey?: string) => void }) {\n const {\n entityViews,\n } = useCustomizationController();\n\n return <Dialog\n maxWidth={\"md\"}\n open={open}>\n <DialogContent className={\"flex flex-col gap-4\"}>\n <Typography variant={\"h6\"}>\n Select view\n </Typography>\n {entityViews?.map((view) => {\n return <Button\n key={view.key}\n onClick={() => onClose(view.key)}\n fullWidth\n variant={\"text\"}\n >\n {view.name} ({view.key})\n </Button>;\n })}\n {(entityViews ?? []).length === 0 &&\n <Typography variant={\"body2\"}>\n No custom views defined\n </Typography>\n }\n </DialogContent>\n <DialogActions>\n <Button variant={\"outlined\"} onClick={() => onClose()}>Cancel</Button>\n </DialogActions>\n </Dialog>\n}\n","import React from \"react\";\nimport {\n DeleteConfirmationDialog,\n EntityCollection,\n EntityCustomView,\n resolveEntityView,\n useCustomizationController,\n User\n} from \"@firecms/core\";\nimport {\n AddIcon,\n Alert,\n Button,\n Container,\n DeleteIcon,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { CollectionEditorDialog } from \"./CollectionEditorDialog\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { EntityCustomViewsSelectDialog } from \"./EntityCustomViewsSelectDialog\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function SubcollectionsEditTab({\n collection,\n parentCollection,\n configController,\n collectionInference,\n getUser,\n parentCollectionIds\n }: {\n collection: PersistedCollection,\n parentCollection?: EntityCollection,\n configController: CollectionsConfigController;\n collectionInference?: CollectionInference;\n getUser?: (uid: string) => User | null;\n parentCollectionIds?: string[];\n}) {\n\n const { entityViews: contextEntityViews } = useCustomizationController();\n\n const [subcollectionToDelete, setSubcollectionToDelete] = React.useState<string | undefined>();\n const [addEntityViewDialogOpen, setAddEntityViewDialogOpen] = React.useState<boolean>(false);\n const [viewToDelete, setViewToDelete] = React.useState<string | undefined>();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n editedCollectionId?: string,\n }>();\n\n const {\n values,\n setFieldValue,\n } = useFormex<EntityCollection>();\n\n const subcollections = collection.subcollections ?? [];\n const resolvedEntityViews = values.entityViews?.filter(e => typeof e === \"string\")\n .map(e => resolveEntityView(e, contextEntityViews))\n .filter(Boolean) as EntityCustomView[] ?? [];\n const hardCodedEntityViews = collection.entityViews?.filter(e => typeof e !== \"string\") as EntityCustomView[] ?? [];\n const totalEntityViews = resolvedEntityViews.length + hardCodedEntityViews.length;\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"2xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n <div className={\"flex flex-col gap-16\"}>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Subcollections of {values.name}\n </Typography>\n\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n {subcollections && subcollections.length > 0 && <Table>\n <TableBody>\n {subcollections.map((subcollection) => (\n <TableRow key={subcollection.path}\n onClick={() => setCurrentDialog({\n isNewCollection: false,\n editedCollectionId: subcollection.id\n })}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {subcollection.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setSubcollectionToDelete(subcollection.id);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>}\n\n <Button\n onClick={() => {\n setCurrentDialog({\n isNewCollection: true\n });\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add subcollection\n </Button>\n\n </Paper>\n\n </div>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Custom views\n </Typography>\n\n {totalEntityViews === 0 &&\n <Alert action={<Button variant=\"text\"\n size={\"small\"}\n href={\"https://firecms.co/docs/cloud/quickstart\"}\n component={\"a\"}\n rel=\"noopener noreferrer\"\n target=\"_blank\">More info</Button>}>\n Define your own custom views by uploading them with the CLI.\n </Alert>\n }\n\n {<>\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n <Table>\n <TableBody>\n {resolvedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setViewToDelete(view.key);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n {hardCodedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n <Typography variant={\"caption\"} className={\"flex-grow\"}>\n This view is defined in code with\n key <code>{view.key}</code>\n </Typography>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n <Button\n onClick={() => {\n setAddEntityViewDialogOpen(true);\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add custom entity view\n </Button>\n </Paper>\n\n </>}\n\n\n </div>\n\n </div>\n </Container>\n\n <div style={{ height: \"52px\" }}/>\n\n {subcollectionToDelete &&\n <DeleteConfirmationDialog open={Boolean(subcollectionToDelete)}\n onAccept={() => {\n const props = {\n id: subcollectionToDelete,\n parentCollectionIds: [...(parentCollectionIds ?? []), collection.id]\n };\n console.debug(\"Deleting subcollection\", props)\n configController.deleteCollection(props);\n setSubcollectionToDelete(undefined);\n }}\n onCancel={() => setSubcollectionToDelete(undefined)}\n title={<>Delete this subcollection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>}\n {viewToDelete &&\n <DeleteConfirmationDialog open={Boolean(viewToDelete)}\n onAccept={() => {\n setFieldValue(\"entityViews\", values.entityViews?.filter(e => e !== viewToDelete));\n setViewToDelete(undefined);\n }}\n onCancel={() => setViewToDelete(undefined)}\n title={<>Remove this view?</>}\n body={<>This will <b>not\n delete any data</b>, only\n the view in the CMS</>}/>}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={configController}\n parentCollection={collection}\n collectionInference={collectionInference}\n parentCollectionIds={[...parentCollectionIds ?? [], values.id]}\n isNewCollection={false}\n {...currentDialog}\n getUser={getUser}\n handleClose={() => {\n setCurrentDialog(undefined);\n }}/>\n\n <EntityCustomViewsSelectDialog\n open={addEntityViewDialogOpen}\n onClose={(selectedViewKey) => {\n if (selectedViewKey) {\n setFieldValue(\"entityViews\", [...(values.entityViews ?? []), selectedViewKey]);\n }\n setAddEntityViewDialogOpen(false);\n }}/>\n </div>\n );\n}\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const productsCollectionTemplate: EntityCollection = {\n id: \"products\",\n path: \"products\",\n name: \"Products\",\n singularName: \"Product\",\n icon: \"shopping_cart\",\n description: \"List of the products currently sold in your shop\",\n properties: makePropertiesEditable({\n name: {\n dataType: \"string\",\n name: \"Name\",\n description: \"Name of this product\",\n validation: {\n required: true\n }\n },\n brand: {\n dataType: \"string\",\n name: \"Brand\",\n validation: {\n required: true\n }\n },\n description: {\n dataType: \"string\",\n name: \"Description\",\n description: \"Description of this product, supports markdown\",\n markdown: true\n },\n main_image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n },\n description: \"Upload field for images\"\n },\n available: {\n dataType: \"boolean\",\n name: \"Available\",\n columnWidth: 100,\n description: \"Is this product available in the website\"\n },\n price: {\n dataType: \"number\",\n name: \"Price\",\n validation: {\n requiredMessage: \"You must set a positive price\",\n min: 0\n }\n },\n images: {\n dataType: \"array\",\n name: \"Images\",\n hideFromCollection: true,\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n },\n related_products: {\n dataType: \"array\",\n name: \"Related products\",\n description: \"Products related to this one\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n metadata: {\n name: \"Metadata\",\n description: \"This is an example of a map property\",\n dataType: \"map\",\n keyValue: true\n },\n added_on: {\n dataType: \"date\",\n name: \"Added on\",\n autoValue: \"on_create\"\n }\n })\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const blogCollectionTemplate:EntityCollection = {\n id: \"blog\",\n path: \"blog\",\n name: \"Blog\",\n singularName: \"Blog entry\",\n icon: \"article\",\n description: \"A collection of blog entries\",\n defaultSize: \"l\",\n properties: makePropertiesEditable({\n name: {\n name: \"Name\",\n validation: { required: true },\n dataType: \"string\"\n },\n header_image: {\n name: \"Header image\",\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n content: {\n name: \"Content\",\n description: \"Content blocks for the blog entry\",\n validation: { required: true },\n dataType: \"array\",\n oneOf: {\n typeField: \"type\",\n valueField: \"value\",\n properties: {\n text: {\n dataType: \"string\",\n name: \"Text\",\n markdown: true\n },\n quote: {\n dataType: \"string\",\n name: \"Quote\",\n multiline: true\n },\n images: {\n name: \"Images\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n description: \"This fields allows uploading multiple images at once and reordering\"\n },\n products: {\n name: \"Products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\",\n previewProperties: [\"name\", \"main_image\"]\n }\n }\n },\n propertiesOrder: [\"text\", \"quote\", \"images\", \"products\"]\n }\n },\n created_on: {\n name: \"Created on\",\n dataType: \"date\",\n autoValue: \"on_create\"\n },\n status: {\n name: \"Status\",\n validation: { required: true },\n dataType: \"string\",\n enumValues: {\n published: {\n id: \"published\",\n label: \"Published\",\n },\n draft: \"Draft\"\n },\n defaultValue: \"draft\"\n },\n publish_date: {\n name: \"Publish date\",\n dataType: \"date\",\n clearable: true\n },\n reviewed: {\n name: \"Reviewed\",\n dataType: \"boolean\"\n },\n tags: {\n name: \"Tags\",\n description: \"Example of generic array\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n previewAsTag: true\n }\n }\n }),\n initialFilter: {\n status: [\"==\", \"published\"]\n }\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const usersCollectionTemplate: EntityCollection = {\n id: \"users\",\n path: \"users\",\n name: \"Users\",\n singularName: \"User\",\n description: \"Registered users in the app/web\",\n icon: \"person\",\n properties: makePropertiesEditable({\n displayName: {\n name: \"Display name\",\n dataType: \"string\"\n },\n email: {\n name: \"Email\",\n dataType: \"string\",\n email: true\n },\n emailVerified: {\n name: \"Email verified\",\n dataType: \"boolean\"\n },\n phone: {\n name: \"Phone\",\n dataType: \"string\"\n },\n favourite_products: {\n name: \"Favourite products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n photoURL: {\n name: \"Photo URL\",\n dataType: \"string\",\n url: \"image\"\n }\n }),\n};\n","import { EntityCollection } from \"@firecms/core\";\n\nexport const pagesCollectionTemplate: EntityCollection = {\n id: \"pages\",\n path: \"pages\",\n name: \"Pages\",\n singularName: \"Page\",\n icon: \"insert_drive_file\",\n description: \"List of website pages that can be edited here\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Page Title\",\n validation: { required: true }\n },\n slug: {\n dataType: \"string\",\n name: \"URL Slug\",\n validation: {\n required: true,\n unique: true,\n matches: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n matchesMessage: \"Must be lowercase, alphanumeric, and hyphenated\"\n }\n },\n hero_section: {\n dataType: \"map\",\n name: \"Hero Section\",\n properties: {\n headline: {\n dataType: \"string\",\n name: \"Headline\",\n validation: { required: true }\n },\n subhead: {\n dataType: \"string\",\n name: \"Subheadline\"\n },\n background_image: {\n dataType: \"string\",\n name: \"Background Image\",\n storage: {\n storagePath: \"page_hero/images\",\n acceptedFiles: [\"image/*\"],\n }\n },\n call_to_action: {\n dataType: \"string\",\n name: \"Call to Action\"\n },\n call_to_action_link: {\n dataType: \"string\",\n name: \"CTA Link\",\n url: true\n }\n }\n },\n content: {\n dataType: \"array\",\n name: \"Content\",\n oneOf: {\n properties: {\n section: {\n dataType: \"map\",\n name: \"Section\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Section Title\",\n validation: { required: true }\n },\n content: {\n dataType: \"string\",\n name: \"Section Content\",\n markdown: true\n },\n image: {\n dataType: \"string\",\n name: \"Section Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n link: {\n dataType: \"string\",\n name: \"Section Link\",\n url: true\n }\n }\n },\n image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n slider: {\n dataType: \"array\",\n name: \"Slider\",\n of: {\n dataType: \"map\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Title\",\n validation: { required: true }\n },\n image: {\n dataType: \"string\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n }\n }\n },\n }\n }\n },\n sidebar: {\n dataType: \"map\",\n name: \"Sidebar\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Sidebar Title\",\n validation: { required: false }\n },\n content: {\n dataType: \"string\",\n name: \"Sidebar Content\",\n markdown: true\n }\n }\n },\n seo_metadata: {\n dataType: \"map\",\n name: \"SEO Metadata\",\n properties: {\n meta_title: {\n dataType: \"string\",\n name: \"Meta Title\"\n },\n meta_description: {\n dataType: \"string\",\n name: \"Meta Description\"\n },\n focus_keywords: {\n dataType: \"array\",\n name: \"Focus Keywords\",\n of: {\n dataType: \"string\"\n }\n }\n }\n },\n footer_override: {\n dataType: \"string\",\n name: \"Footer Override\",\n markdown: true\n },\n publish_date: {\n dataType: \"date\",\n name: \"Publish Date\",\n validation: { required: true }\n },\n last_updated: {\n dataType: \"date\",\n name: \"Last Updated\",\n autoValue: \"on_update\"\n },\n is_published: {\n dataType: \"boolean\",\n name: \"Is Published\",\n columnWidth: 100,\n description: \"Should this page be live on the site?\"\n },\n author_uid: {\n dataType: \"reference\",\n name: \"Author\",\n path: \"users\"\n }\n }\n};\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, unslugify, } from \"@firecms/core\";\nimport { Button, Card, Chip, CircularProgress, cls, Container, Icon, Tooltip, Typography, } from \"@firecms/ui\";\n\nimport { productsCollectionTemplate } from \"./templates/products_template\";\nimport { blogCollectionTemplate } from \"./templates/blog_template\";\nimport { usersCollectionTemplate } from \"./templates/users_template\";\nimport { ImportFileUpload } from \"@firecms/data_import_export\";\nimport { pagesCollectionTemplate } from \"./templates/pages_template\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function CollectionEditorWelcomeView({\n path,\n pathSuggestions,\n parentCollection,\n onContinue,\n existingCollectionPaths\n }: {\n path: string;\n pathSuggestions?: (path: string) => Promise<string[]>;\n parentCollection?: EntityCollection;\n onContinue: (importData?: object[], propertiesOrder?: string[]) => void;\n existingCollectionPaths?: string[];\n}) {\n\n const [loadingPathSuggestions, setLoadingPathSuggestions] = useState(false);\n const [filteredPathSuggestions, setFilteredPathSuggestions] = useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions && existingCollectionPaths) {\n setLoadingPathSuggestions(true);\n pathSuggestions(path)\n .then(suggestions => {\n const filteredSuggestions = suggestions.filter(s => !(existingCollectionPaths ?? []).find(c => c.trim().toLowerCase() === s.trim().toLowerCase()));\n setFilteredPathSuggestions(filteredSuggestions);\n })\n .finally(() => setLoadingPathSuggestions(false));\n }\n }, [existingCollectionPaths, path, pathSuggestions]);\n\n // const {\n // values,\n // setFieldValue,\n // setValues,\n // handleChange,\n // touched,\n // errors,\n // setFieldTouched,\n // isSubmitting,\n // submitCount\n // } = useFormex<EntityCollection>();\n\n const {\n values,\n setFieldValue,\n setValues,\n submitCount\n } = useFormex<EntityCollection>();\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={\"h4\"} className={\"flex-grow\"}>\n New collection\n </Typography>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Use one of the existing paths in your database:\n </Typography>\n <div className={\"flex flex-wrap gap-x-2 gap-y-1 items-center my-2 min-h-7\"}>\n\n {loadingPathSuggestions && !filteredPathSuggestions && <CircularProgress size={\"small\"}/>}\n\n {filteredPathSuggestions?.map((suggestion, index) => (\n <Chip key={suggestion}\n colorScheme={\"cyanLighter\"}\n onClick={() => {\n setFieldValue(\"name\", unslugify(suggestion));\n setFieldValue(\"id\", suggestion);\n setFieldValue(\"path\", suggestion);\n setFieldValue(\"properties\", undefined);\n onContinue();\n }}\n size=\"small\">\n {suggestion}\n </Chip>\n ))}\n\n {!loadingPathSuggestions && (filteredPathSuggestions ?? [])?.length === 0 &&\n <Typography variant={\"caption\"}>\n No suggestions\n </Typography>\n }\n\n </div>\n\n </div>\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Select a template:\n </Typography>\n\n <div className={\"flex gap-4\"}>\n <TemplateButton title={\"Products\"}\n subtitle={\"A collection of products with images, prices and stock\"}\n icon={<Icon size={\"small\"} iconKey={productsCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(productsCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Users\"}\n subtitle={\"A collection of users with emails, names and roles\"}\n icon={<Icon size={\"small\"} iconKey={usersCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(usersCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Blog posts\"}\n subtitle={\"A collection of blog posts with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={blogCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(blogCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Pages\"}\n subtitle={\"A collection of pages with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={pagesCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(pagesCollectionTemplate);\n onContinue();\n }}/>\n </div>\n\n </div>\n\n {!parentCollection && <div>\n\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className={\"mb-2\"}>\n ● Create a collection from a file (csv, json, xls, xslx...)\n </Typography>\n\n <ImportFileUpload onDataAdded={(data, propertiesOrder) => onContinue(data, propertiesOrder)}/>\n\n </div>}\n\n <div>\n\n <Button variant={\"text\"} onClick={() => onContinue()} className={\"my-2\"}>\n Continue from scratch\n </Button>\n </div>\n\n {/*<div style={{ height: \"52px\" }}/>*/}\n\n </Container>\n </div>\n );\n}\n\nexport function TemplateButton({\n title,\n subtitle,\n icon,\n onClick\n }: {\n title: string,\n icon: React.ReactNode,\n subtitle: string,\n onClick?: () => void\n}) {\n\n return (\n <Tooltip title={subtitle}>\n <Card\n onClick={onClick}\n className={cls(\n \"my-2 rounded-md border mx-0 p-6 px-4 focus:outline-none transition ease-in-out duration-150 flex flex-row gap-4 items-center\",\n \"text-gray-700 dark:text-slate-300\",\n \"hover:border-primary-dark hover:text-primary-dark dark:hover:text-primary focus:ring-primary hover:ring-1 hover:ring-primary\",\n \"border-gray-400 dark:border-gray-600 \"\n )}\n >\n {icon}\n <div className={\"flex flex-col items-start\"}>\n\n <Typography variant={\"subtitle1\"}>\n {title}\n </Typography>\n {/*<Typography>*/}\n {/* {subtitle}*/}\n {/*</Typography>*/}\n\n </div>\n </Card>\n </Tooltip>\n );\n\n}\n","import {\n DataNewPropertiesMapping,\n getInferenceType,\n ImportConfig,\n ImportNewPropertyFieldPreview\n} from \"@firecms/data_import_export\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { getFieldConfig, getFieldId, Properties, Property, PropertyConfig, PropertyConfigBadge, } from \"@firecms/core\";\nimport { Container, Select, Tooltip, Typography } from \"@firecms/ui\";\nimport React, { useState } from \"react\";\nimport { OnPropertyChangedParams, PropertyFormDialog, PropertyWithId } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PersistedCollection } from \"../../../types/persisted_collection\";\nimport { updatePropertyFromWidget } from \"../utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"../PropertySelectItem\";\nimport { supportedFields } from \"../utils/supported_fields\";\nimport { buildPropertyFromData } from \"@firecms/schema_inference\";\n\nexport function CollectionEditorImportMapping({\n importConfig,\n propertyConfigs,\n collectionEditable\n }:\n {\n importConfig: ImportConfig,\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean\n }) {\n\n // const {\n // values,\n // setFieldValue,\n // setFieldTouched,\n // setValues,\n // submitCount\n // } = useFormex();\n\n const {\n setFieldValue,\n setFieldTouched,\n values\n } = useFormex<PersistedCollection>();\n const [selectedProperty, setSelectedProperty] = useState<PropertyWithId | undefined>(undefined);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n const propertyKey = selectedProperty ? selectedProperty.id : undefined;\n const property = selectedProperty || undefined;\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // setSelectedProperty(property);\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n // replace previousId with id in headersMapping\n const newHeadersMapping = { ...importConfig.headersMapping };\n Object.keys(newHeadersMapping).forEach((key) => {\n if (newHeadersMapping[key] === previousId) {\n newHeadersMapping[key] = id ?? \"\";\n }\n });\n importConfig.setHeadersMapping(newHeadersMapping);\n\n // if (id) {\n // setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n // setSelectedPropertyKey(id);\n // }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n };\n const onPropertyTypeChanged = async ({\n id,\n importKey,\n property,\n namespace\n }: OnPropertyChangedParams & {\n importKey: string\n }) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // we try to infer the rest of the properties of a property, from the type and the data\n const propertyData = importConfig.importData.map((d) => getIn(d, importKey));\n const inferredNewProperty = {\n ...buildPropertyFromData(propertyData, property, getInferenceType),\n editable: true\n };\n\n if (propertyPath) {\n if (inferredNewProperty) {\n setFieldValue(propertyPath, inferredNewProperty, false);\n } else {\n setFieldValue(propertyPath, property, false);\n }\n setFieldTouched(propertyPath, true, false);\n }\n };\n\n return (\n\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"6xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <Typography variant=\"h6\" className={\"my-4 ml-3.5\"}>Data property mapping</Typography>\n\n <DataNewPropertiesMapping importConfig={importConfig}\n destinationProperties={values.properties as Properties}\n buildPropertyView={({\n property,\n propertyKey,\n importKey,\n isIdColumn\n }) => {\n if (isIdColumn) {\n return <Typography> This column will be used as ID</Typography>\n }\n\n return <ImportNewPropertyFieldPreview\n property={property}\n propertyKey={propertyKey}\n onPropertyNameChanged={(propertyKey: string, value: string) => setFieldValue(`properties.${propertyKey}.name`, value, false)}\n onEditClick={() => {\n if (!propertyKey || !property) return;\n setSelectedProperty({\n ...property,\n id: propertyKey,\n editable: true\n });\n }}\n propertyTypeView={<PropertySelect property={property}\n disabled={false}\n onPropertyChanged={(props) => onPropertyTypeChanged({\n ...props,\n importKey\n })}\n propertyKey={propertyKey}\n propertyConfigs={propertyConfigs}/>}\n />;\n }}/>\n </Container>\n\n <PropertyFormDialog\n open={selectedProperty !== undefined}\n propertyKey={propertyKey}\n property={property}\n inArray={false}\n autoUpdateId={false}\n onPropertyChanged={onPropertyChanged}\n allowDataInference={false}\n collectionEditable={collectionEditable}\n onOkClicked={() => {\n setSelectedProperty(undefined);\n }}\n onCancel={() => {\n setSelectedProperty(undefined);\n }}\n autoOpenTypeSelect={false}\n existingProperty={false}\n propertyConfigs={propertyConfigs}/>\n\n <div style={{ height: \"52px\" }}/>\n </div>\n );\n\n}\n\nfunction PropertySelect({\n property,\n onPropertyChanged,\n propertyKey,\n propertyConfigs,\n disabled\n }: {\n property: Property | null,\n propertyKey: string | null,\n onPropertyChanged: ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => void,\n propertyConfigs: Record<string, PropertyConfig>,\n disabled?: boolean\n}) {\n\n const fieldId = property ? getFieldId(property) : null;\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n const [selectOpen, setSelectOpen] = useState(false);\n\n return <Tooltip title={property && widget ? `${widget?.name} - ${property.dataType}` : undefined}\n open={selectOpen ? false : undefined}>\n <Select\n open={selectOpen}\n onOpenChange={setSelectOpen}\n invisible={true}\n className={\"w-full\"}\n disabled={disabled}\n error={!widget}\n value={fieldId ?? \"\"}\n placeholder={\"Select a property widget\"}\n position={\"item-aligned\"}\n renderValue={(value) => {\n if (!widget) return null;\n return <PropertyConfigBadge propertyConfig={widget}/>\n }}\n onValueChange={(newSelectedWidgetId) => {\n const newProperty = updatePropertyFromWidget(property, newSelectedWidgetId, propertyConfigs)\n if (!propertyKey) return;\n onPropertyChanged({\n id: propertyKey,\n property: newProperty,\n previousId: propertyKey,\n namespace: undefined\n });\n }}>\n {Object.entries(supportedFields).map(([key, widget]) => {\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={false}\n propertyConfig={widget}\n existing={false}/>;\n })\n }\n </Select>\n </Tooltip>;\n}\n","import { convertDataToEntity, ImportConfig } from \"@firecms/data_import_export\";\nimport { CircularProgressCenter, EntityCollectionTable, Properties, useSelectionController } from \"@firecms/core\";\nimport { useEffect, useState } from \"react\";\nimport { Typography } from \"@firecms/ui\";\n\nexport function CollectionEditorImportDataPreview({\n importConfig,\n properties,\n propertiesOrder\n }: {\n importConfig: ImportConfig,\n properties: Properties,\n propertiesOrder: string[]\n}) {\n\n const [loading, setLoading] = useState<boolean>(false);\n\n async function loadEntities() {\n // const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties, importConfig.headersMapping);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, \"TEMP_PATH\", importConfig.defaultValues));\n importConfig.setEntities(mappedData);\n }\n\n useEffect(() => {\n loadEntities().finally(() => setLoading(false));\n }, []);\n\n const selectionController = useSelectionController();\n if (loading)\n return <CircularProgressCenter/>\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 enablePopupIcon={false}/>\n\n}\n","import { Properties, slugify } from \"@firecms/core\";\nimport { ImportConfig } from \"@firecms/data_import_export\";\n\nexport function cleanPropertiesFromImport(properties: Properties, parentSlug = \"\"): {\n headersMapping: ImportConfig[\"headersMapping\"],\n properties: Properties,\n idColumn?: ImportConfig[\"idColumn\"],\n} {\n\n const result = Object.keys(properties).reduce((acc, key) => {\n const property = properties[key];\n const slug = slugify(key);\n const fullSlug = parentSlug ? `${parentSlug}.${slug}` : slug;\n\n if (property.dataType === \"map\" && property.properties) {\n const slugifiedResult = cleanPropertiesFromImport(property.properties as Properties, fullSlug);\n return {\n headersMapping: { ...acc.headersMapping, [key]: fullSlug },\n properties: {\n ...acc.properties,\n [slug]: {\n ...property,\n properties: slugifiedResult.properties,\n propertiesOrder: Object.keys(slugifiedResult.properties)\n }\n }\n }\n }\n\n const updatedProperties = {\n ...acc.properties,\n [slug]: property\n } as Properties;\n\n const headersMapping = { ...acc.headersMapping, [key]: fullSlug } as Record<string, string>;\n\n return {\n headersMapping,\n properties: updatedProperties,\n }\n }, { headersMapping: {}, properties: {} });\n\n const firstKey = Object.keys(result.headersMapping)?.[0];\n let idColumn: string | undefined;\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n idColumn = firstKey;\n }\n\n return {\n ...result,\n idColumn\n };\n}\n","import * as React from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CircularProgressCenter,\n Entity,\n EntityCollection,\n ErrorView,\n isPropertyBuilder,\n MapProperty,\n mergeDeep,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n randomString,\n removeInitialAndTrailingSlashes,\n removeUndefined,\n TopNavigationResult,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n ArrowBackIcon,\n Button,\n cls,\n coolIconKeys,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n IconButton,\n LoadingButton,\n Tab,\n Tabs\n} from \"@firecms/ui\";\nimport { YupSchema } from \"./CollectionYupValidation\";\nimport { CollectionDetailsForm } from \"./CollectionDetailsForm\";\nimport { CollectionPropertiesEditorForm } from \"./CollectionPropertiesEditorForm\";\nimport { UnsavedChangesDialog } from \"./UnsavedChangesDialog\";\nimport { SubcollectionsEditTab } from \"./SubcollectionsEditTab\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { CollectionEditorWelcomeView } from \"./CollectionEditorWelcomeView\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { getInferenceType, ImportSaveInProgress, useImportConfig } from \"@firecms/data_import_export\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { CollectionEditorImportMapping } from \"./import/CollectionEditorImportMapping\";\nimport { CollectionEditorImportDataPreview } from \"./import/CollectionEditorImportDataPreview\";\nimport { cleanPropertiesFromImport } from \"./import/clean_import_data\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { Formex, FormexController, useCreateFormex } from \"@firecms/formex\";\nimport { getFullIdPath } from \"./util\";\n\nexport interface CollectionEditorDialogProps {\n open: boolean;\n isNewCollection: boolean;\n initialValues?: {\n group?: string,\n path?: string,\n name?: string,\n }\n editedCollectionId?: string;\n fullPath?: string; // full path of this particular collection, like `products/123/locales`\n parentCollectionIds?: string[]; // path ids of the parent collection, like [`products`]\n handleClose: (collection?: EntityCollection) => void;\n configController: CollectionsConfigController;\n reservedGroups?: string[];\n collectionInference?: CollectionInference;\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n pathSuggestions?: (path?: string) => Promise<string[]>;\n getUser?: (uid: string) => User | null;\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n parentCollection?: PersistedCollection;\n existingEntities?: Entity<any>[];\n}\n\nexport function CollectionEditorDialog(props: CollectionEditorDialogProps) {\n\n const open = props.open;\n\n const [formDirty, setFormDirty] = React.useState<boolean>(false);\n const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] = React.useState<boolean>(false);\n\n const handleCancel = () => {\n if (!formDirty) {\n props.handleClose(undefined);\n } else {\n setUnsavedChangesDialogOpen(true);\n }\n };\n\n useEffect(() => {\n if (!open) {\n setFormDirty(false);\n setUnsavedChangesDialogOpen(false);\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n fullWidth={true}\n fullHeight={true}\n scrollable={false}\n maxWidth={\"7xl\"}\n onOpenChange={(open) => !open ? handleCancel() : undefined}\n >\n {open && <CollectionEditor {...props}\n handleCancel={handleCancel}\n setFormDirty={setFormDirty}/>}\n\n <UnsavedChangesDialog\n open={unsavedChangesDialogOpen}\n handleOk={() => props.handleClose(undefined)}\n handleCancel={() => setUnsavedChangesDialogOpen(false)}\n body={\"There are unsaved changes in this collection\"}/>\n\n </Dialog>\n );\n}\n\ntype EditorView = \"welcome\"\n | \"details\"\n | \"import_data_mapping\"\n | \"import_data_preview\"\n | \"import_data_saving\"\n | \"properties\"\n | \"loading\"\n | \"extra_view\"\n | \"subcollections\";\n\nexport function CollectionEditor(props: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void\n}) {\n const { propertyConfigs } = useCustomizationController();\n const navigation = useNavigationController();\n const authController = useAuthController();\n\n const {\n topLevelNavigation,\n collections\n } = navigation;\n\n const initialValuesProp = props.initialValues;\n const includeTemplates = !initialValuesProp?.path && (props.parentCollectionIds ?? []).length === 0;\n const collectionsInThisLevel = (props.parentCollection ? props.parentCollection.subcollections : collections) ?? [];\n const existingPaths = collectionsInThisLevel.map(col => col.path.trim().toLowerCase());\n const existingIds = collectionsInThisLevel.map(col => col.id?.trim().toLowerCase()).filter(Boolean) as string[];\n const [collection, setCollection] = React.useState<PersistedCollection<any> | undefined>();\n const [initialLoadingCompleted, setInitialLoadingCompleted] = React.useState(false);\n\n useEffect(() => {\n try {\n if (navigation.initialised) {\n if (props.editedCollectionId) {\n setCollection(navigation.getCollectionFromPaths([...(props.parentCollectionIds ?? []), props.editedCollectionId]));\n } else {\n setCollection(undefined);\n }\n setInitialLoadingCompleted(true);\n }\n } catch (e) {\n console.error(e);\n }\n }, [props.editedCollectionId, props.parentCollectionIds, navigation.initialised, navigation.getCollectionFromPaths]);\n\n if (!topLevelNavigation) {\n throw Error(\"Internal: Navigation not ready in collection editor\");\n }\n\n const {\n groups\n }: TopNavigationResult = topLevelNavigation;\n\n const initialCollection = collection\n ? {\n ...collection,\n id: collection.id ?? collection.path ?? randomString(16)\n }\n : undefined;\n\n const initialValues: PersistedCollection<any> = initialCollection\n ? applyPropertyConfigs(initialCollection, propertyConfigs)\n : {\n id: initialValuesProp?.path ?? randomString(16),\n path: initialValuesProp?.path ?? \"\",\n name: initialValuesProp?.name ?? \"\",\n group: initialValuesProp?.group ?? \"\",\n properties: {} as PropertiesOrBuilders,\n propertiesOrder: [],\n icon: coolIconKeys[Math.floor(Math.random() * coolIconKeys.length)],\n ownerId: authController.user?.uid ?? \"\"\n };\n\n if (!initialLoadingCompleted) {\n return <CircularProgressCenter/>;\n }\n\n if (!props.isNewCollection && (!navigation.initialised || !initialLoadingCompleted)) {\n return <CircularProgressCenter/>;\n }\n\n return <CollectionEditorInternal\n {...props}\n initialValues={initialValues}\n existingPaths={existingPaths}\n existingIds={existingIds}\n includeTemplates={includeTemplates}\n collection={collection}\n setCollection={setCollection}\n groups={groups}\n propertyConfigs={propertyConfigs}/>\n\n}\n\nfunction CollectionEditorInternal<M extends Record<string, any>>({\n isNewCollection,\n configController,\n editedCollectionId,\n parentCollectionIds,\n fullPath,\n collectionInference,\n handleClose,\n reservedGroups,\n extraView,\n handleCancel,\n setFormDirty,\n pathSuggestions,\n getUser,\n parentCollection,\n getData,\n existingPaths,\n existingIds,\n includeTemplates,\n collection,\n setCollection,\n initialValues,\n propertyConfigs,\n groups,\n existingEntities\n }: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void,\n initialValues: PersistedCollection<M>,\n existingPaths: string[],\n existingIds: string[],\n includeTemplates: boolean,\n collection: PersistedCollection<M> | undefined,\n setCollection: (collection: PersistedCollection<M>) => void,\n propertyConfigs: Record<string, PropertyConfig<any>>,\n groups: string[],\n }\n) {\n\n const importConfig = useImportConfig();\n const navigation = useNavigationController();\n const snackbarController = useSnackbarController();\n\n // Use this ref to store which properties have errors\n const propertyErrorsRef = useRef({});\n\n const initialView = isNewCollection ? (includeTemplates ? \"welcome\" : \"details\") : \"properties\";\n const [currentView, setCurrentView] = useState<EditorView>(initialView); // this view can edit either the details view or the properties one\n\n const [error, setError] = React.useState<Error | undefined>();\n\n const saveCollection = (updatedCollection: PersistedCollection<M>): Promise<boolean> => {\n const id = updatedCollection.id || updatedCollection.path;\n return configController.saveCollection({\n id,\n collectionData: updatedCollection,\n previousId: editedCollectionId,\n parentCollectionIds\n })\n .then(() => {\n setError(undefined);\n return true;\n })\n .catch((e) => {\n setError(e);\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n };\n\n const setNextMode = () => {\n if (currentView === \"details\") {\n if (importConfig.inUse) {\n setCurrentView(\"import_data_saving\");\n } else if (extraView) {\n setCurrentView(\"extra_view\");\n } else {\n setCurrentView(\"properties\");\n }\n } else if (currentView === \"welcome\") {\n setCurrentView(\"details\");\n } else if (currentView === \"import_data_mapping\") {\n setCurrentView(\"import_data_preview\");\n } else if (currentView === \"import_data_preview\") {\n setCurrentView(\"details\");\n } else if (currentView === \"extra_view\") {\n setCurrentView(\"properties\");\n } else {\n setCurrentView(\"details\");\n }\n\n };\n\n const doCollectionInference = (collection: PersistedCollection<any>) => {\n if (!collectionInference) return undefined;\n return collectionInference?.(collection.path, collection.collectionGroup ?? false, parentCollectionIds ?? []);\n };\n\n const inferCollectionFromData = async (newCollection: PersistedCollection<M>) => {\n\n try {\n if (!doCollectionInference) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n\n setCurrentView(\"loading\");\n\n const inferredCollection = await doCollectionInference?.(newCollection);\n\n if (!inferredCollection) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n const values = {\n ...(newCollection ?? {})\n };\n\n if (Object.keys(inferredCollection.properties ?? {}).length > 0) {\n values.properties = inferredCollection.properties as PropertiesOrBuilders<M>;\n values.propertiesOrder = inferredCollection.propertiesOrder as Extract<keyof M, string>[];\n }\n\n if (!values.propertiesOrder) {\n values.propertiesOrder = Object.keys(values.properties) as Extract<keyof M, string>[];\n return values;\n }\n\n setCollection(values);\n console.debug(\"Inferred collection\", {\n newCollection: newCollection ?? {},\n values\n });\n return values;\n } catch (e: any) {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error inferring collection: \" + (e.message ?? \"Details in the console\")\n });\n return newCollection;\n }\n };\n\n const onSubmit = (newCollectionState: PersistedCollection<M>, formexController: FormexController<PersistedCollection<M>>) => {\n console.debug(\"Submitting collection\", newCollectionState);\n try {\n\n if (!isNewCollection) {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n handleClose(newCollectionState);\n });\n return;\n }\n\n if (currentView === \"welcome\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"details\") {\n if (extraView || importConfig.inUse) {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n } else if (isNewCollection) {\n inferCollectionFromData(newCollectionState)\n .then((values) => {\n formexController.resetForm({\n values: values ?? newCollectionState,\n touched: {\n path: true,\n name: true\n }\n });\n }).finally(() => {\n setNextMode();\n });\n } else {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n }\n } else if (currentView === \"extra_view\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"import_data_mapping\") {\n setNextMode();\n } else if (currentView === \"import_data_preview\") {\n setNextMode();\n } else if (currentView === \"properties\") {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n setNextMode();\n handleClose(newCollectionState);\n });\n } else {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n }\n } catch (e: any) {\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n console.error(e);\n formexController.resetForm({ values: newCollectionState });\n }\n };\n\n const validation = (col: PersistedCollection) => {\n\n let errors: Record<string, any> = {};\n const schema = (currentView === \"properties\" || currentView === \"subcollections\" || currentView === \"details\") && YupSchema;\n if (schema) {\n try {\n schema.validateSync(col, { abortEarly: false });\n } catch (e: any) {\n e.inner.forEach((err: any) => {\n errors[err.path] = err.message;\n });\n }\n }\n if (currentView === \"properties\") {\n errors = { ...errors, ...propertyErrorsRef.current };\n }\n if (currentView === \"details\") {\n const pathError = validatePath(col.path, isNewCollection, existingPaths, col.id);\n if (pathError) {\n errors.path = pathError;\n }\n const idError = validateId(col.id, isNewCollection, existingPaths, existingIds);\n if (idError) {\n errors.id = idError;\n }\n }\n return errors;\n };\n\n const formController = useCreateFormex<PersistedCollection<M>>({\n initialValues,\n onSubmit,\n validation\n });\n\n const {\n values,\n setFieldValue,\n isSubmitting,\n dirty,\n submitCount\n } = formController;\n\n // TODO: getting data is only working in root collections with this code\n const path = values.path;\n const updatedFullPath = fullPath?.includes(\"/\") ? fullPath?.split(\"/\").slice(0, -1).join(\"/\") + \"/\" + path : path; // TODO: this path is wrong\n const pathError = validatePath(path, isNewCollection, existingPaths, values.id);\n\n const parentPaths = !pathError && parentCollectionIds ? navigation.convertIdsToPaths(parentCollectionIds) : undefined;\n const resolvedPath = !pathError ? navigation.resolveAliasesFrom(updatedFullPath) : undefined;\n const getDataWithPath = resolvedPath && getData ? async () => {\n const data = await getData(resolvedPath, parentPaths ?? []);\n if (existingEntities) {\n const existingData = existingEntities.map(e => e.values);\n data.push(...existingData);\n }\n return data;\n } : undefined;\n\n useEffect(() => {\n setFormDirty(dirty);\n }, [dirty]);\n\n function onImportDataSet(data: object[], propertiesOrder?: string[]) {\n importConfig.setInUse(true);\n buildEntityPropertiesFromData(data, getInferenceType)\n .then((properties) => {\n const res = cleanPropertiesFromImport(properties);\n\n importConfig.setIdColumn(res.idColumn);\n importConfig.setImportData(data);\n importConfig.setHeadersMapping(res.headersMapping);\n const filteredHeadingsOrder = ((propertiesOrder ?? [])\n .filter((key) => res.headersMapping[key]) as string[]) ?? Object.keys(res.properties);\n importConfig.setHeadingsOrder(filteredHeadingsOrder);\n importConfig.setOriginProperties(res.properties);\n\n const mappedHeadings = (propertiesOrder ?? []).map((key) => res.headersMapping[key]).filter(Boolean) as string[] ?? Object.keys(res.properties);\n setFieldValue(\"properties\", res.properties);\n setFieldValue(\"propertiesOrder\", mappedHeadings);\n });\n }\n\n const validValues = Boolean(values.name) && Boolean(values.id);\n\n const onImportMappingComplete = () => {\n const updatedProperties = { ...values.properties };\n if (importConfig.idColumn)\n delete updatedProperties[importConfig.idColumn];\n setFieldValue(\"properties\", updatedProperties);\n // setFieldValue(\"propertiesOrder\", Object.values(importConfig.headersMapping));\n setNextMode();\n };\n\n const editable = collection?.editable === undefined || collection?.editable === true;\n const collectionEditable = editable || isNewCollection;\n\n return <DialogContent fullHeight={true}>\n <Formex value={formController}>\n\n <>\n {!isNewCollection && <Tabs value={currentView}\n className={cls(defaultBorderMixin, \"justify-end bg-gray-50 dark:bg-gray-950 border-b\")}\n onValueChange={(v) => setCurrentView(v as EditorView)}>\n <Tab value={\"details\"}>\n Details\n </Tab>\n <Tab value={\"properties\"}>\n Properties\n </Tab>\n <Tab value={\"subcollections\"}>\n Additional views\n </Tab>\n </Tabs>}\n\n <form noValidate\n onSubmit={formController.handleSubmit}\n className={cls(\n isNewCollection ? \"h-full\" : \"h-[calc(100%-48px)]\",\n \"flex-grow flex flex-col relative\")}>\n\n {currentView === \"loading\" &&\n <CircularProgressCenter/>}\n\n {currentView === \"extra_view\" &&\n path &&\n extraView?.View &&\n <extraView.View path={path}/>}\n\n {currentView === \"welcome\" &&\n <CollectionEditorWelcomeView\n path={path}\n onContinue={(importData, propertiesOrder) => {\n // console.log(\"Import data\", importData, propertiesOrder)\n if (importData) {\n onImportDataSet(importData, propertiesOrder);\n setCurrentView(\"import_data_mapping\");\n } else {\n setCurrentView(\"details\");\n }\n }}\n existingCollectionPaths={existingPaths}\n parentCollection={parentCollection}\n pathSuggestions={pathSuggestions}/>}\n\n {currentView === \"import_data_mapping\" && importConfig &&\n <CollectionEditorImportMapping importConfig={importConfig}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>}\n\n {currentView === \"import_data_preview\" && importConfig &&\n <CollectionEditorImportDataPreview importConfig={importConfig}\n properties={values.properties as Properties}\n propertiesOrder={values.propertiesOrder as string[]}/>}\n\n {currentView === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={values}\n path={path}\n onImportSuccess={async (importedCollection) => {\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n await saveCollection(values);\n handleClose(importedCollection);\n }}\n />}\n\n {currentView === \"details\" &&\n <CollectionDetailsForm\n existingPaths={existingPaths}\n existingIds={existingIds}\n groups={groups}\n parentCollectionIds={parentCollectionIds}\n parentCollection={parentCollection}\n isNewCollection={isNewCollection}/>}\n\n {currentView === \"subcollections\" && collection &&\n <SubcollectionsEditTab\n parentCollection={parentCollection}\n configController={configController}\n getUser={getUser}\n collectionInference={collectionInference}\n parentCollectionIds={parentCollectionIds}\n collection={collection}/>}\n\n {currentView === \"properties\" &&\n <CollectionPropertiesEditorForm\n showErrors={submitCount > 0}\n isNewCollection={isNewCollection}\n reservedGroups={reservedGroups}\n onPropertyError={(propertyKey, namespace, error) => {\n const current = removeUndefined({\n ...propertyErrorsRef.current,\n [getFullIdPath(propertyKey, namespace)]: removeUndefined(error, true)\n }, true);\n propertyErrorsRef.current = current;\n formController.validate();\n }}\n getUser={getUser}\n getData={getDataWithPath}\n doCollectionInference={doCollectionInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n extraIcon={extraView?.icon &&\n <IconButton\n color={\"primary\"}\n onClick={() => setCurrentView(\"extra_view\")}>\n {extraView.icon}\n </IconButton>}/>\n }\n\n {currentView !== \"welcome\" && <DialogActions\n position={\"absolute\"}>\n {error && <ErrorView error={error}/>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_mapping\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n importConfig.setInUse(false);\n return setCurrentView(\"welcome\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_preview\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n setCurrentView(\"import_data_mapping\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"details\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"welcome\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && currentView === \"properties\" && <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"details\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n <Button variant={\"text\"}\n onClick={() => {\n handleCancel();\n }}>\n Cancel\n </Button>\n\n {isNewCollection && currentView === \"import_data_mapping\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={onImportMappingComplete}\n >\n Next\n </Button>}\n\n {isNewCollection && currentView === \"import_data_preview\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={() => {\n setNextMode();\n }}\n >\n Next\n </Button>}\n\n {isNewCollection && (currentView === \"details\" || currentView === \"properties\") &&\n <LoadingButton\n variant={\"filled\"}\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || (currentView === \"details\" && !validValues)}\n startIcon={currentView === \"properties\"\n ? <DoneIcon/>\n : undefined}\n >\n {currentView === \"details\" && \"Next\"}\n {currentView === \"properties\" && \"Create collection\"}\n </LoadingButton>}\n\n {!isNewCollection && <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n >\n Update collection\n </LoadingButton>}\n\n </DialogActions>}\n </form>\n </>\n\n </Formex>\n\n </DialogContent>\n\n}\n\nfunction applyPropertyConfigs<M extends Record<string, any> = any>(collection: PersistedCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): PersistedCollection<M> {\n const {\n properties,\n ...rest\n } = collection;\n const propertiesResult: PropertiesOrBuilders<any> = {};\n if (properties) {\n Object.keys(properties).forEach((key) => {\n propertiesResult[key] = applyPropertiesConfig(properties[key] as PropertyOrBuilder, propertyConfigs);\n });\n }\n\n return {\n ...rest,\n properties: propertiesResult\n };\n}\n\nfunction applyPropertiesConfig(property: PropertyOrBuilder, propertyConfigs: Record<string, PropertyConfig<any>>) {\n let internalProperty = property;\n if (propertyConfigs && typeof internalProperty === \"object\" && internalProperty.propertyConfig) {\n const propertyConfig = propertyConfigs[internalProperty.propertyConfig];\n if (propertyConfig && isPropertyBuilder(propertyConfig.property)) {\n internalProperty = propertyConfig.property;\n } else {\n\n if (propertyConfig) {\n internalProperty = mergeDeep(propertyConfig.property, internalProperty);\n }\n\n if (!isPropertyBuilder(internalProperty) && internalProperty.dataType === \"map\" && internalProperty.properties) {\n const properties: Record<string, PropertyOrBuilder> = {};\n Object.keys(internalProperty.properties).forEach((key) => {\n properties[key] = applyPropertiesConfig(((internalProperty as MapProperty).properties as Properties)[key] as Property, propertyConfigs);\n });\n internalProperty = {\n ...internalProperty,\n properties\n };\n }\n\n }\n }\n return internalProperty;\n\n}\n\nconst validatePath = (value: string, isNewCollection: boolean, existingPaths: string[], idValue?: string) => {\n let error;\n if (!value) {\n error = \"You must specify a path in the database for this collection\";\n }\n // if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n // error = \"There is already a collection which uses this path as an id\";\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()) && !idValue)\n error = \"There is already a collection with the specified path. If you want to have multiple collections referring to the same database path, make sure the have different ids\";\n\n const subpaths = removeInitialAndTrailingSlashes(value).split(\"/\");\n if (subpaths.length % 2 === 0) {\n error = `Collection paths must have an odd number of segments: ${value}`;\n }\n return error;\n};\n\nconst validateId = (value: string, isNewCollection: boolean, existingPaths: string[], existingIds: string[]) => {\n if (!value) return undefined;\n let error;\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection that uses this value as a path\";\n if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection which uses this id\";\n // if (error) {\n // setAdvancedPanelExpanded(true);\n // }\n return error;\n};\n","import React, { PropsWithChildren, useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport {\n Entity,\n Property,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport { CollectionEditorDialog } from \"./ui/collection_editor/CollectionEditorDialog\";\nimport { useNavigate } from \"react-router\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { PropertyFormDialog } from \"./ui/collection_editor/PropertyEditView\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\n\nexport const ConfigControllerContext = React.createContext<CollectionsConfigController>({} as any);\nexport const CollectionEditorContext = React.createContext<CollectionEditorController>({} as any);\n\nexport interface ConfigControllerProviderProps {\n /**\n * Controller for managing the collections' config.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Callback used to infer the schema from the data.\n */\n collectionInference?: CollectionInference;\n\n /**\n * Use this builder to define the permissions for the configuration per user.\n */\n configPermissions?: CollectionEditorPermissionsBuilder;\n\n /**\n * Groups that cannot be used to create new collections.\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n getPathSuggestions?: (path?: string) => Promise<string[]>;\n\n getUser?: (uid: string) => User | null\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\nexport const ConfigControllerProvider = React.memo(\n function ConfigControllerProvider({\n children,\n collectionConfigController,\n configPermissions,\n reservedGroups,\n collectionInference,\n extraView,\n getPathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }: PropsWithChildren<ConfigControllerProviderProps>) {\n\n const navigation = useNavigationController();\n const navigate = useNavigate();\n const snackbarController = useSnackbarController();\n const { propertyConfigs } = useCustomizationController();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n parentCollection?: PersistedCollection,\n editedCollectionId?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n initialValues?: {\n path?: string,\n group?: string,\n name?: string\n },\n redirect: boolean,\n existingEntities?: Entity<any>[]\n }>();\n\n const [currentPropertyDialog, setCurrentPropertyDialog] = React.useState<{\n propertyKey?: string,\n property?: Property,\n namespace?: string,\n parentCollection?: PersistedCollection,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n fullPath?: string,\n parentCollectionIds: string[],\n collectionEditable: boolean;\n existingEntities?: Entity<any>[]\n }>();\n\n const defaultConfigPermissions: CollectionEditorPermissionsBuilder = useCallback(() => ({\n createCollections: true,\n editCollections: true,\n deleteCollections: true\n }), []);\n\n const editCollection = ({\n id,\n fullPath,\n parentCollectionIds,\n parentCollection,\n existingEntities\n }: {\n id?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection,\n existingEntities?: Entity<any>[]\n }) => {\n console.debug(\"Edit collection\", id, fullPath, parentCollectionIds, parentCollection);\n onAnalyticsEvent?.(\"edit_collection\", {\n id,\n fullPath\n });\n setCurrentDialog({\n editedCollectionId: id,\n fullPath,\n parentCollectionIds,\n isNewCollection: false,\n parentCollection,\n redirect: false,\n existingEntities\n });\n };\n\n const editProperty = ({\n propertyKey,\n property,\n editedCollectionId,\n currentPropertiesOrder,\n parentCollectionIds,\n collection,\n existingEntities\n }: {\n propertyKey?: string,\n property?: Property,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n parentCollectionIds: string[],\n collection: PersistedCollection,\n existingEntities?: Entity<any>[]\n }) => {\n console.debug(\"Edit property\", propertyKey, property, editedCollectionId, currentPropertiesOrder, parentCollectionIds, collection);\n onAnalyticsEvent?.(\"edit_property\", {\n propertyKey,\n editedCollectionId\n });\n // namespace is all the path until the last dot\n const namespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(0, propertyKey.lastIndexOf(\".\"))\n : undefined;\n const propertyKeyWithoutNamespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(propertyKey.lastIndexOf(\".\") + 1)\n : propertyKey;\n setCurrentPropertyDialog({\n propertyKey: propertyKeyWithoutNamespace,\n property,\n namespace,\n currentPropertiesOrder,\n editedCollectionId,\n parentCollectionIds,\n collectionEditable: collection?.editable ?? false,\n existingEntities\n });\n };\n\n const createCollection = ({\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n }: {\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n initialValues?: {\n group?: string,\n path?: string,\n name?: string\n },\n redirect: boolean,\n sourceClick?: string\n }) => {\n console.debug(\"Create collection\", {\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n });\n onAnalyticsEvent?.(\"create_collection\", {\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n });\n setCurrentDialog({\n isNewCollection: true,\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect\n });\n };\n\n return (\n <ConfigControllerContext.Provider value={collectionConfigController}>\n <CollectionEditorContext.Provider\n value={{\n editCollection,\n createCollection,\n editProperty,\n configPermissions: configPermissions ?? defaultConfigPermissions,\n getPathSuggestions\n }}>\n\n {children}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={collectionConfigController}\n isNewCollection={false}\n collectionInference={collectionInference}\n {...currentDialog}\n getData={getData}\n reservedGroups={reservedGroups}\n extraView={extraView}\n pathSuggestions={getPathSuggestions}\n getUser={getUser}\n handleClose={(collection) => {\n if (currentDialog?.redirect) {\n if (collection && currentDialog?.isNewCollection && !currentDialog.parentCollectionIds.length) {\n const url = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n navigate(url);\n }\n }\n setCurrentDialog(undefined);\n }}/>\n\n {/* Used for editing properties*/}\n <PropertyFormDialog\n open={Boolean(currentPropertyDialog)}\n includeIdAndName={true}\n existingProperty={Boolean(currentPropertyDialog?.propertyKey)}\n autoUpdateId={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n autoOpenTypeSelect={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n inArray={false}\n collectionEditable={currentPropertyDialog?.collectionEditable ?? false}\n getData={getData && currentPropertyDialog?.editedCollectionId\n ? () => {\n console.debug(\"get data for property\", currentPropertyDialog?.editedCollectionId);\n const resolvedPath = navigation.resolveAliasesFrom(currentPropertyDialog.editedCollectionId!)\n return getData(resolvedPath, []);\n }\n : undefined}\n onPropertyChanged={({\n id,\n property\n }) => {\n if (!currentPropertyDialog) return;\n if (!id) return;\n const newProperty = !(currentPropertyDialog.propertyKey);\n return collectionConfigController.saveProperty({\n path: currentPropertyDialog?.editedCollectionId,\n property,\n propertyKey: id,\n newPropertiesOrder: newProperty && currentPropertyDialog.currentPropertiesOrder ? [...currentPropertyDialog.currentPropertiesOrder, id] : undefined,\n namespace: currentPropertyDialog.namespace,\n parentCollectionIds: currentPropertyDialog.parentCollectionIds\n })\n .catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onPropertyChangedImmediate={false}\n onDelete={() => {\n if (!currentPropertyDialog?.propertyKey) return;\n const newPropertiesOrder = currentPropertyDialog?.currentPropertiesOrder?.filter(p => p !== currentPropertyDialog?.propertyKey);\n return collectionConfigController.deleteProperty({\n path: currentPropertyDialog?.editedCollectionId,\n propertyKey: currentPropertyDialog?.propertyKey,\n namespace: currentPropertyDialog?.namespace,\n newPropertiesOrder,\n parentCollectionIds: currentPropertyDialog?.parentCollectionIds\n })\n .then(() => {\n setCurrentPropertyDialog(undefined);\n }).catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onError={() => {\n }}\n onOkClicked={() => {\n setCurrentPropertyDialog(undefined);\n }}\n onCancel={() => {\n setCurrentPropertyDialog(undefined);\n }}\n initialErrors={{}}\n forceShowErrors={false}\n existingPropertyKeys={[]}\n allowDataInference={true}\n propertyConfigs={propertyConfigs}\n property={currentPropertyDialog?.property}\n propertyKey={currentPropertyDialog?.propertyKey}/>\n\n </CollectionEditorContext.Provider>\n\n </ConfigControllerContext.Provider>\n );\n }, equal);\n","import { useContext } from \"react\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorContext } from \"./ConfigControllerProvider\";\n\n/**\n * Hook to access the collection editor controller.\n * The methods in this controller can be used to open the collection editor dialog.\n */\nexport const useCollectionEditorController = (): CollectionEditorController => useContext(CollectionEditorContext);\n","import { CollectionActionsProps, useAuthController, useNavigationController } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionAction({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n const collectionEditorController = useCollectionEditorController();\n\n const parentCollection = navigationController.getCollectionFromIds(parentCollectionIds);\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n const editorButton = <Tooltip\n title={canEditCollection ? \"Edit collection\" : \"You don't have permissions to edit this collection\"}>\n <IconButton\n color={\"primary\"}\n disabled={!canEditCollection}\n onClick={canEditCollection\n ? () => collectionEditorController?.editCollection({\n id: collection.id,\n fullPath,\n parentCollectionIds,\n parentCollection: parentCollection as PersistedCollection,\n existingEntities: tableController?.data ?? []\n })\n : undefined}>\n <SettingsIcon/>\n </IconButton>\n </Tooltip>;\n\n return <>\n {editorButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import { useContext } from \"react\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { ConfigControllerContext } from \"./ConfigControllerProvider\";\n\n/**\n * Use this hook to access the configuration controller.\n * You can use it to get the list of collections, and to save/delete collections.\n */\nexport const useCollectionsConfigController = (): CollectionsConfigController => useContext(ConfigControllerContext);\n","import {\n DeleteConfirmationDialog,\n PluginHomePageActionsProps,\n useAuthController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { DeleteIcon, IconButton, Menu, MenuItem, MoreVertIcon, SettingsIcon, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useState } from \"react\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\n\nexport function HomePageEditorCollectionAction({\n path,\n collection\n }: PluginHomePageActionsProps) {\n\n const snackbarController = useSnackbarController();\n const authController = useAuthController();\n const configController = useCollectionsConfigController();\n const collectionEditorController = useCollectionEditorController();\n\n const permissions = collectionEditorController.configPermissions({\n user: authController.user,\n collection\n });\n\n const onEditCollectionClicked = () => {\n collectionEditorController?.editCollection({\n id: collection.id,\n parentCollectionIds: []\n });\n };\n\n const [deleteRequested, setDeleteRequested] = useState(false);\n\n const deleteCollection = () => {\n configController?.deleteCollection({ id: collection.id }).then(() => {\n setDeleteRequested(false);\n snackbarController.open({\n message: \"Collection deleted\",\n type: \"success\"\n });\n });\n };\n\n return <>\n\n <div>\n {permissions.deleteCollections &&\n <Menu\n trigger={<IconButton>\n <MoreVertIcon size={\"small\"}/>\n </IconButton>}\n >\n <MenuItem\n dense={true}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setDeleteRequested(true);\n }}>\n <DeleteIcon/>\n Delete\n </MenuItem>\n\n </Menu>\n\n }\n\n {permissions.editCollections &&\n <IconButton\n onClick={(event) => {\n onEditCollectionClicked();\n }}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>}\n </div>\n\n <DeleteConfirmationDialog\n open={deleteRequested}\n onAccept={deleteCollection}\n onCancel={() => setDeleteRequested(false)}\n title={<>Delete this collection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>\n </>;\n\n}\n","import { EntityTableController, ResolvedProperty } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip } from \"@firecms/ui\";\nimport React from \"react\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function CollectionViewHeaderAction({\n propertyKey,\n onHover,\n property,\n fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean,\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n tableController: EntityTableController;\n}) {\n\n const collectionEditorController = useCollectionEditorController();\n\n return (\n <Tooltip title={\"Edit\"}>\n <IconButton\n className={onHover ? \"bg-white dark:bg-gray-950\" : \"hidden\"}\n onClick={() => {\n collectionEditorController.editProperty({\n propertyKey,\n property,\n editedCollectionId: collection.id,\n parentCollectionIds,\n collection,\n existingEntities: tableController.data ?? []\n });\n }}\n size={\"small\"}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n )\n}\n","import { EntityTableController, getDefaultPropertiesOrder, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Tooltip } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function PropertyAddColumnComponent({\n fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: {\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n tableController: EntityTableController;\n}) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n return (\n <Tooltip title={canEditCollection ? \"Add new property\" : \"You don't have permission to add new properties\"}>\n <div\n className={\"p-0.5 w-20 h-full flex items-center justify-center cursor-pointer bg-gray-100 bg-opacity-40 hover:bg-gray-100 dark:bg-gray-950 dark:bg-opacity-40 dark:hover:bg-gray-950\"}\n // className={onHover ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n collectionEditorController.editProperty({\n editedCollectionId: collection.id,\n parentCollectionIds,\n currentPropertiesOrder: getDefaultPropertiesOrder(collection),\n collection,\n existingEntities: tableController.data\n });\n }}>\n <AddIcon color={\"inherit\"}/>\n </div>\n </Tooltip>\n )\n}\n","import { AddIcon, Button } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionButton() {\n const collectionEditorController = useCollectionEditorController();\n return <div className={\"bg-gray-50 dark:bg-gray-900 min-w-fit rounded\"}>\n <Button className={\"min-w-fit\"}\n variant={\"outlined\"}\n onClick={() => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_button\"\n })}>\n <AddIcon/>\n New collection\n </Button>\n </div>\n}\n","import equal from \"react-fast-compare\"\n\nimport { CollectionActionsProps, mergeDeep, useAuthController, useSnackbarController } from \"@firecms/core\";\nimport { Button, SaveIcon, Tooltip, UndoIcon, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionActionStart({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const configController = useCollectionsConfigController();\n const snackbarController = useSnackbarController();\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n let saveDefaultFilterButton = null;\n if (!equal(getObjectOrNull(tableController.filterValues), getObjectOrNull(collection.initialFilter)) ||\n !equal(getObjectOrNull(tableController.sortBy), getObjectOrNull(collection.initialSort))) {\n saveDefaultFilterButton = <>\n <Tooltip\n title={tableController.sortBy || tableController.filterValues ? \"Save default filter and sort\" : \"Clear default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"outlined\"}\n onClick={() => configController\n ?.saveCollection({\n id: collection.id,\n parentCollectionIds,\n collectionData: mergeDeep(collection as PersistedCollection,\n {\n initialFilter: tableController.filterValues ?? null,\n initialSort: tableController.sortBy ?? null\n })\n }).then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"Default config saved\"\n });\n })}>\n <SaveIcon/>\n </Button>\n </Tooltip>\n\n {(collection.initialFilter || collection.initialSort) && <Tooltip\n title={\"Reset to default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"text\"}\n onClick={() => {\n tableController.clearFilter?.();\n if (collection?.initialFilter)\n tableController.setFilterValues?.(collection?.initialFilter);\n if (collection?.initialSort)\n tableController.setSortBy?.(collection?.initialSort);\n }}>\n <UndoIcon/>\n </Button>\n </Tooltip>}\n </>;\n }\n\n return <>\n {canEditCollection && saveDefaultFilterButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import { PluginHomePageAdditionalCardsProps, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Card, cls, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionCard({\n group,\n context\n }: PluginHomePageAdditionalCardsProps) {\n\n if (!context.navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <Card className={cls(\"h-full p-4 min-h-[124px]\")}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: group ? { group } : undefined,\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n\n <div\n className=\"flex items-center justify-center h-full w-full flex-grow flex-col\">\n <AddIcon color=\"primary\" size={\"large\"}/>\n <Typography color=\"primary\"\n variant={\"caption\"}\n className={\"font-medium\"}>{\"Add new collection\".toUpperCase()}</Typography>\n\n {!canCreateCollections &&\n <Typography variant={\"caption\"}>You don&apos;t have permissions to create\n collections</Typography>\n }\n </div>\n\n </Card>\n );\n}\n","import React from \"react\";\nimport { FireCMSPlugin, useAuthController, useNavigationController, User } from \"@firecms/core\";\nimport { ConfigControllerProvider } from \"./ConfigControllerProvider\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { EditorCollectionAction } from \"./ui/EditorCollectionAction\";\nimport { HomePageEditorCollectionAction } from \"./ui/HomePageEditorCollectionAction\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { CollectionViewHeaderAction } from \"./ui/CollectionViewHeaderAction\";\nimport { PropertyAddColumnComponent } from \"./ui/PropertyAddColumnComponent\";\nimport { NewCollectionButton } from \"./ui/NewCollectionButton\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"./useCollectionEditorController\";\nimport { EditorCollectionActionStart } from \"./ui/EditorCollectionActionStart\";\nimport { NewCollectionCard } from \"./ui/NewCollectionCard\";\n\nexport interface CollectionConfigControllerProps<EC extends PersistedCollection = PersistedCollection, UserType extends User = User> {\n\n /**\n * Firebase app where the configuration is saved.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Define what actions can be performed on the configuration.\n */\n configPermissions?: CollectionEditorPermissionsBuilder<UserType, EC>;\n\n /**\n * The words you define here will not be allowed to be used as group\n * names when creating collections.\n * e.g. [\"admin\"]\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n getPathSuggestions?: (path?: string) => Promise<string[]>;\n\n collectionInference?: CollectionInference;\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n getUser?: (uid: string) => UserType | null;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\n/**\n * Use this hook to initialise the Collection Editor plugin.\n * This is likely the only hook you will need to use.\n * @param firebaseApp Firebase app where your project data lives.\n * @param configPermissions\n * @param reservedGroups\n * @param extraView\n * @param getData\n * @param getUser\n * @param collectionInference\n */\nexport function useCollectionEditorPlugin<EC extends PersistedCollection = PersistedCollection, UserType extends User = User>\n({\n collectionConfigController,\n configPermissions,\n reservedGroups,\n extraView,\n getPathSuggestions,\n getUser,\n collectionInference,\n getData,\n onAnalyticsEvent\n }: CollectionConfigControllerProps<EC, UserType>): FireCMSPlugin<any, any, PersistedCollection> {\n\n return {\n key: \"collection_editor\",\n loading: collectionConfigController.loading,\n provider: {\n Component: ConfigControllerProvider,\n props: {\n collectionConfigController,\n configPermissions,\n collectionInference,\n reservedGroups,\n extraView,\n getPathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }\n },\n homePage: {\n additionalActions: <NewCollectionButton/>,\n additionalChildrenStart: <IntroWidget/>,\n // additionalChildrenEnd: <RootCollectionSuggestions introMode={introMode}/>,\n CollectionActions: HomePageEditorCollectionAction,\n AdditionalCards: NewCollectionCard,\n },\n collectionView: {\n CollectionActionsStart: EditorCollectionActionStart,\n CollectionActions: EditorCollectionAction,\n HeaderAction: CollectionViewHeaderAction,\n AddColumnComponent: PropertyAddColumnComponent\n }\n };\n}\n\nexport function IntroWidget({}: {}) {\n\n const navigation = useNavigationController();\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n if (!navigation.initialised || (navigation.collections ?? []).length > 0) {\n return null;\n }\n\n return (\n <Paper\n className={\"my-4 px-4 py-6 flex flex-col bg-white dark:bg-slate-800 gap-2\"}>\n <Typography variant={\"subtitle2\"} className={\"uppercase\"}>No collections found</Typography>\n <Typography>\n Start building collections in FireCMS easily. Map them to your existing\n database data, import from files, or use our templates.\n </Typography>\n {canCreateCollections && <Button\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n <AddIcon/>Create your first collection\n </Button>}\n <Typography variant={\"caption\"} color={\"secondary\"}>\n You can also define collections programmatically.\n </Typography>\n </Paper>\n );\n}\n","import {\n EntityCollection,\n joinCollectionLists,\n makePropertiesEditable,\n ModifyCollectionProps,\n Properties\n} from \"@firecms/core\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\n/**\n * Function in charge of merging collections defined in code with those stored in the backend.\n */\nexport const mergeCollections = (baseCollections: EntityCollection[],\n backendCollections: PersistedCollection[],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void\n) => {\n\n const markAsEditable = (c: PersistedCollection) => {\n makePropertiesEditable(c.properties as Properties);\n c.subcollections?.forEach(markAsEditable);\n };\n const storedCollections = backendCollections ?? [];\n storedCollections.forEach(markAsEditable);\n\n console.debug(\"Collections specified in code:\", baseCollections);\n console.debug(\"Collections stored in the backend\", storedCollections);\n const result = joinCollectionLists(baseCollections, storedCollections, [], modifyCollection);\n console.debug(\"Collections after joining:\", result);\n return result;\n}\n","import { ErrorView, unslugify, useNavigationController } from \"@firecms/core\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { Button } from \"@firecms/ui\";\n\nexport function MissingReferenceWidget({ path: pathProp }: {\n path: string\n}) {\n const navigation = useNavigationController();\n const path = getLastSegment(pathProp);\n const parentCollectionIds = navigation.getParentCollectionIds(pathProp);\n const collectionEditor = useCollectionEditorController();\n return <div className={\"p-1 flex flex-col items-center\"}>\n <ErrorView error={\"No collection for path: \" + path}/>\n <Button className={\"mx-2\"} variant={\"outlined\"}\n size={\"small\"}\n onClick={() => {\n collectionEditor.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds,\n redirect: false,\n sourceClick: \"missing_reference\"\n });\n }}>\n Create\n </Button>\n </div>;\n}\n\nfunction getParentPathSegments(path: string): string[] {\n const segments = path.split(\"/\");\n return segments.filter((segment, index) => index % 2 === 0 && index !== segments.length - 1);\n}\n\nfunction getLastSegment(path: string): string {\n const segments = path.split(\"/\");\n return segments[segments.length - 1];\n}\n"],"names":["Yup","useFormex","useState","getIn","toSnakeCase","singular","useEffect","jsx","IconForView","useAutoComplete","Container","jsxs","Typography","Tooltip","IconButton","Chip","TextField","FieldCaption","cls","Field","DebouncedTextField","Autocomplete","AutocompleteItem","ExpandablePanel","SettingsIcon","ClearIcon","Select","SelectItem","BooleanSwitchWithLabel","Dialog","SearchIconsView","formex","useCreateFormex","values","errors","Formex","extractEnumFromValues","ListIcon","Button","CircularProgress","AutoAwesomeIcon","Paper","ArrayContainer","Fragment","Badge","open","DialogContent","DialogActions","serializeRegExp","RuleIcon","useSnackbarController","useMemo","resolveEnumValues","FileUploadIcon","MultiSelect","MultiSelectItem","Checkbox","isPropertyBuilder","useCustomizationController","getFieldConfig","ErrorBoundary","PropertyConfigBadge","cardMixin","cardClickableMixin","cardSelectedMixin","FunctionsIcon","RemoveCircleIcon","PropertyTree","DragDropContext","Droppable","Draggable","defaultBorderMixin","RemoveIcon","DragHandleIcon","propertiesOrder","AddIcon","CommonPropertyFields","unslugify","useNavigationController","SelectGroup","mergeDeep","DEFAULT_FIELD_CONFIGS","PropertyForm","useRef","property","validateId","isValidRegExp","getFieldId","useDeferredValue","InfoLabel","DeleteIcon","DeleteConfirmationDialog","Highlight","themes","ContentCopyIcon","useLargeLayout","makePropertiesEditable","CodeIcon","resolveEntityView","Table","TableBody","TableRow","TableCell","Alert","Icon","ImportFileUpload","Card","namespace","buildPropertyFromData","getInferenceType","DataNewPropertiesMapping","propertyKey","ImportNewPropertyFieldPreview","widget","convertDataToEntity","useSelectionController","CircularProgressCenter","EntityCollectionTable","slugify","React","useAuthController","randomString","coolIconKeys","useImportConfig","collection","pathError","buildEntityPropertiesFromData","Tabs","Tab","ImportSaveInProgress","error","removeUndefined","ErrorView","ArrowBackIcon","LoadingButton","DoneIcon","removeInitialAndTrailingSlashes","ConfigControllerProvider","useNavigate","useCallback","useContext","Menu","MoreVertIcon","MenuItem","getDefaultPropertiesOrder","SaveIcon","UndoIcon","joinCollectionLists"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/ui/collection_editor/CollectionYupValidation.tsx","../src/ui/collection_editor/CollectionDetailsForm.tsx","../src/ui/collection_editor/util.ts","../src/ui/collection_editor/EnumForm.tsx","../src/ui/collection_editor/SwitchControl.tsx","../src/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ValidationPanel.tsx","../src/ui/collection_editor/properties/EnumPropertyField.tsx","../src/ui/collection_editor/properties/StoragePropertyField.tsx","../src/utils/entities.ts","../src/ui/collection_editor/PropertyFieldPreview.tsx","../src/ui/collection_editor/PropertyTree.tsx","../src/ui/collection_editor/properties/MapPropertyField.tsx","../src/ui/collection_editor/properties/RepeatPropertyField.tsx","../src/ui/collection_editor/properties/CommonPropertyFields.tsx","../src/ui/collection_editor/properties/StringPropertyField.tsx","../src/ui/collection_editor/properties/BooleanPropertyField.tsx","../src/ui/collection_editor/properties/BlockPropertyField.tsx","../src/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx","../src/ui/collection_editor/properties/NumberPropertyField.tsx","../src/ui/collection_editor/properties/ReferencePropertyField.tsx","../src/ui/collection_editor/properties/DateTimePropertyField.tsx","../src/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx","../src/ui/collection_editor/properties/KeyValuePropertyField.tsx","../src/ui/collection_editor/utils/update_property_for_widget.ts","../src/ui/collection_editor/PropertySelectItem.tsx","../src/ui/collection_editor/properties/UrlPropertyField.tsx","../src/ui/collection_editor/utils/supported_fields.tsx","../src/ui/collection_editor/PropertyEditView.tsx","../src/ui/collection_editor/utils/strings.ts","../src/ui/collection_editor/GetCodeDialog.tsx","../src/ui/collection_editor/CollectionPropertiesEditorForm.tsx","../src/ui/collection_editor/UnsavedChangesDialog.tsx","../src/ui/collection_editor/EntityCustomViewsSelectDialog.tsx","../src/ui/collection_editor/SubcollectionsEditTab.tsx","../src/ui/collection_editor/templates/products_template.ts","../src/ui/collection_editor/templates/blog_template.ts","../src/ui/collection_editor/templates/users_template.ts","../src/ui/collection_editor/templates/pages_template.ts","../src/ui/collection_editor/CollectionEditorWelcomeView.tsx","../src/ui/collection_editor/import/CollectionEditorImportMapping.tsx","../src/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx","../src/ui/collection_editor/import/clean_import_data.ts","../src/ui/collection_editor/CollectionEditorDialog.tsx","../src/ConfigControllerProvider.tsx","../src/useCollectionEditorController.tsx","../src/ui/EditorCollectionAction.tsx","../src/useCollectionsConfigController.tsx","../src/ui/HomePageEditorCollectionAction.tsx","../src/ui/CollectionViewHeaderAction.tsx","../src/ui/PropertyAddColumnComponent.tsx","../src/ui/NewCollectionButton.tsx","../src/ui/EditorCollectionActionStart.tsx","../src/ui/NewCollectionCard.tsx","../src/useCollectionEditorPlugin.tsx","../src/utils/collections.ts","../src/ui/MissingReferenceWidget.tsx"],"sourcesContent":["import * as Yup from \"yup\";\n\nexport const YupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\"),\n path: Yup.string().required(\"Required\")\n});\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, FieldCaption, IconForView, SearchIconsView, singular, toSnakeCase, } from \"@firecms/core\";\nimport {\n Autocomplete,\n AutocompleteItem,\n BooleanSwitchWithLabel,\n Chip,\n ClearIcon,\n cls,\n Container,\n DebouncedTextField,\n Dialog,\n ExpandablePanel,\n IconButton,\n Select,\n SelectItem,\n SettingsIcon,\n TextField,\n Tooltip,\n Typography,\n useAutoComplete\n} from \"@firecms/ui\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\n\nexport function CollectionDetailsForm({\n isNewCollection,\n reservedGroups,\n existingPaths,\n existingIds,\n groups,\n parentCollection\n }: {\n isNewCollection: boolean,\n reservedGroups?: string[];\n existingPaths?: string[];\n existingIds?: string[];\n groups: string[] | null;\n parentCollection?: EntityCollection;\n parentCollectionIds?: string[];\n}) {\n\n const groupRef = React.useRef<HTMLInputElement>(null);\n const {\n values,\n setFieldValue,\n handleChange,\n touched,\n errors,\n setFieldTouched,\n isSubmitting,\n submitCount\n } = useFormex<EntityCollection>();\n\n const [iconDialogOpen, setIconDialogOpen] = useState(false);\n const [advancedPanelExpanded, setAdvancedPanelExpanded] = useState(false);\n\n const updateName = (name: string) => {\n setFieldValue(\"name\", name);\n\n const pathTouched = getIn(touched, \"path\");\n if (!pathTouched && isNewCollection && name) {\n setFieldValue(\"path\", toSnakeCase(name));\n }\n\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && isNewCollection && name) {\n setFieldValue(\"id\", toSnakeCase(name));\n }\n\n const singularNameTouched = getIn(touched, \"singularName\");\n if (!singularNameTouched && isNewCollection && name) {\n setFieldValue(\"singularName\", singular(name));\n }\n\n };\n\n useEffect(() => {\n if (errors.id) {\n setAdvancedPanelExpanded(true);\n }\n }, [errors.id]);\n\n const collectionIcon = <IconForView collectionOrView={values}/>;\n\n const groupOptions = groups?.filter((group) => !reservedGroups?.includes(group));\n\n const {\n inputFocused,\n autoCompleteOpen,\n setAutoCompleteOpen\n } = useAutoComplete({\n ref: groupRef\n });\n\n const isSubcollection = !!parentCollection;\n\n let customIdValue: \"true\" | \"false\" | \"optional\" | \"code_defined\" | undefined;\n if (typeof values.customId === \"object\") {\n customIdValue = \"code_defined\";\n } else if (values.customId === true) {\n customIdValue = \"true\";\n } else if (values.customId === false) {\n customIdValue = \"false\";\n } else if (values.customId === \"optional\") {\n customIdValue = \"optional\";\n }\n\n const showErrors = submitCount > 0;\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div>\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={!isNewCollection ? \"h5\" : \"h4\"} className={\"flex-grow\"}>\n {isNewCollection ? \"New collection\" : `${values?.name} collection`}\n </Typography>\n <Tooltip title={\"Change icon\"}>\n <IconButton\n shape={\"square\"}\n onClick={() => setIconDialogOpen(true)}>\n {collectionIcon}\n </IconButton>\n </Tooltip>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n </div>\n <div className={\"grid grid-cols-12 gap-4\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n value={values.name ?? \"\"}\n onChange={(e: any) => updateName(e.target.value)}\n label={\"Name\"}\n required\n error={showErrors && Boolean(errors.name)}/>\n <FieldCaption error={touched.name && Boolean(errors.name)}>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of in this collection, usually a plural name (e.g. Products)\"}\n </FieldCaption>\n </div>\n\n <div className={cls(\"col-span-12 \", isSubcollection ? \"\" : \"sm:col-span-8\")}>\n <Field name={\"path\"}\n as={DebouncedTextField}\n label={\"Path\"}\n disabled={!isNewCollection}\n required\n error={showErrors && Boolean(errors.path)}/>\n\n <FieldCaption error={touched.path && Boolean(errors.path)}>\n {touched.path && Boolean(errors.path)\n ? errors.path\n : isSubcollection ? \"Relative path to the parent (no need to include the parent path)\" : \"Path that this collection is stored in, in the database\"}\n </FieldCaption>\n\n </div>\n\n {!isSubcollection && <div className={\"col-span-12 sm:col-span-4 relative\"}>\n\n <TextField error={showErrors && Boolean(errors.group)}\n disabled={isSubmitting}\n value={values.group ?? \"\"}\n autoComplete=\"off\"\n onChange={(event) => setFieldValue(\"group\", event.target.value)}\n name={\"group\"}\n inputRef={groupRef}\n label=\"Group\"/>\n <Autocomplete\n open={autoCompleteOpen && (groupOptions ?? []).length > 0}\n setOpen={setAutoCompleteOpen}>\n {groupOptions?.map((group, index) => {\n return <AutocompleteItem\n key={index + \"_\" + group}\n onClick={() => {\n setAutoCompleteOpen(false);\n setFieldValue(\"group\", group ?? null);\n }}\n >\n <div className={\"flex-grow\"}>\n {group}\n </div>\n </AutocompleteItem>;\n })}\n </Autocomplete>\n <FieldCaption>\n {showErrors && Boolean(errors.group) ? errors.group : \"Group of the collection\"}\n </FieldCaption>\n </div>}\n\n <div className={\"col-span-12\"}>\n <ExpandablePanel\n expanded={advancedPanelExpanded}\n onExpandedChange={setAdvancedPanelExpanded}\n title={\n <div className=\"flex flex-row text-gray-500\">\n <SettingsIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Advanced\n </Typography>\n </div>}\n initiallyExpanded={false}>\n <div className={\"grid grid-cols-12 gap-4 p-4\"}>\n\n <div className={\"col-span-12\"}>\n <Field name={\"id\"}\n as={DebouncedTextField}\n disabled={!isNewCollection}\n label={\"Collection id\"}\n error={showErrors && Boolean(errors.id)}/>\n <FieldCaption error={touched.id && Boolean(errors.id)}>\n {touched.id && Boolean(errors.id) ? errors.id : \"This id identifies this collection. Typically the same as the path.\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.singularName)}\n name={\"singularName\"}\n aria-describedby={\"singularName-helper\"}\n onChange={(e) => {\n setFieldTouched(\"singularName\", true);\n return handleChange(e);\n }}\n value={values.singularName ?? \"\"}\n label={\"Singular name\"}/>\n <FieldCaption error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define a singular name for your entities\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.sideDialogWidth)}\n name={\"sideDialogWidth\"}\n type={\"number\"}\n aria-describedby={\"sideDialogWidth-helper\"}\n onChange={(e) => {\n setFieldTouched(\"sideDialogWidth\", true);\n const value = e.target.value;\n if (!value) {\n setFieldValue(\"sideDialogWidth\", null);\n } else if (!isNaN(Number(value))) {\n setFieldValue(\"sideDialogWidth\", Number(value));\n }\n }}\n endAdornment={<IconButton\n size={\"small\"}\n onClick={() => {\n setFieldValue(\"sideDialogWidth\", null);\n }}\n disabled={!values.sideDialogWidth}>\n <ClearIcon size={\"small\"}/>\n </IconButton>}\n value={values.sideDialogWidth ?? \"\"}\n label={\"Side dialog width\"}/>\n <FieldCaption error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define the width (in pixels) of entities side dialog. Default is 768px\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.description)}\n name=\"description\"\n value={values.description ?? \"\"}\n onChange={handleChange}\n multiline\n rows={2}\n aria-describedby=\"description-helper-text\"\n label=\"Description\"\n />\n <FieldCaption error={showErrors && Boolean(errors.description)}>\n {showErrors && Boolean(errors.description) ? errors.description : \"Description of the collection, you can use markdown\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <Select\n name=\"defaultSize\"\n label=\"Default row size\"\n position={\"item-aligned\"}\n onChange={handleChange}\n value={values.defaultSize ?? \"\"}\n renderValue={(value: any) => value.toUpperCase()}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((value) => (\n <SelectItem\n key={`size-select-${value}`}\n value={value}>\n {value.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <Select\n name=\"customId\"\n label=\"Document IDs generation\"\n position={\"item-aligned\"}\n disabled={customIdValue === \"code_defined\"}\n onValueChange={(v) => {\n if (v === \"code_defined\")\n throw new Error(\"This should not happen\");\n else if (v === \"true\")\n setFieldValue(\"customId\", true);\n else if (v === \"false\")\n setFieldValue(\"customId\", false);\n else if (v === \"optional\")\n setFieldValue(\"customId\", \"optional\");\n }}\n value={customIdValue ?? \"\"}\n renderValue={(value: any) => {\n if (value === \"code_defined\")\n return \"Code defined\";\n else if (value === \"true\")\n return \"Users must define an ID\";\n else if (value === \"optional\")\n return \"Users can define an ID, but it is not required\";\n else\n return \"Document ID is generated automatically\";\n }}\n >\n <SelectItem value={\"false\"}>\n Document ID is generated automatically\n </SelectItem>\n <SelectItem value={\"true\"}>\n Users must define an ID\n </SelectItem>\n <SelectItem value={\"optional\"}>\n Users can define an ID, but it is not required\n </SelectItem>\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Collection group\"\n onValueChange={(v) => setFieldValue(\"collectionGroup\", v)}\n value={values.collectionGroup ?? false}\n />\n <FieldCaption>\n A collection group consists of all collections with the same path. This allows\n you\n to query over multiple collections at once.\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Enable text search for this collection\"\n onValueChange={(v) => setFieldValue(\"textSearchEnabled\", v)}\n value={values.textSearchEnabled ?? false}\n />\n <FieldCaption>\n Allow text search for this collection. If you have not specified a text search\n delegate, this will use the built-in local text search. This is not recommended\n for large collections, as it may incur in performance and cost issues.\n </FieldCaption>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n </div>\n\n <div style={{ height: \"52px\" }}/>\n\n <Dialog\n open={iconDialogOpen}\n onOpenChange={setIconDialogOpen}\n maxWidth={\"xl\"}\n fullWidth\n >\n <div className={\"p-4 overflow-auto min-h-[200px]\"}>\n <SearchIconsView selectedIcon={values.icon}\n onIconSelected={(icon: string) => {\n setIconDialogOpen(false);\n setFieldValue(\"icon\", icon);\n }}/>\n </div>\n\n </Dialog>\n\n </Container>\n </div>\n );\n}\n","export function idToPropertiesPath(id: string): string {\n return \"properties.\" + id.replaceAll(\".\", \".properties.\");\n}\n\nexport function namespaceToPropertiesPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".properties\"\n : \"properties\";\n}\n\nexport function namespaceToPropertiesOrderPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".propertiesOrder\"\n : \"propertiesOrder\";\n}\n\nexport function getFullId(propertyKey: string, propertyNamespace?: string): string {\n return propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n}\n\nexport function getFullIdPath(propertyKey: string, propertyNamespace?: string): string {\n const keyWithNamespace = propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n return idToPropertiesPath(keyWithNamespace);\n}\n","import React, { useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { ArrayContainer, EnumValueConfig, EnumValues, FieldCaption, } from \"@firecms/core\";\nimport {\n AutoAwesomeIcon,\n Badge,\n Button,\n CircularProgress,\n DebouncedTextField,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n ListIcon,\n Paper,\n SettingsIcon,\n Typography\n} from \"@firecms/ui\";\nimport { extractEnumFromValues } from \"@firecms/schema_inference\";\nimport { Field, Formex, getIn, useCreateFormex, useFormex } from \"@firecms/formex\";\n\ntype EnumFormProps = {\n enumValues: EnumValueConfig[];\n onValuesChanged?: (enumValues: EnumValueConfig[]) => void;\n onError?: (error: boolean) => void;\n updateIds: boolean;\n disabled: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<string[]>;\n};\n\nexport function EnumForm({\n enumValues,\n onValuesChanged,\n onError,\n updateIds,\n disabled,\n allowDataInference,\n getData\n }: EnumFormProps) {\n\n const formex = useCreateFormex<{\n enumValues: EnumValueConfig[]\n }>({\n initialValues: { enumValues },\n validateOnChange: true,\n validation: (values) => {\n const errors: any = {};\n if (values.enumValues) {\n values.enumValues.forEach((enumValue, index) => {\n if (!enumValue?.label) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].label = \"You must specify a label for this enum value entry\";\n }\n if (!enumValue?.id) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].id = \"You must specify an ID for this enum value entry\";\n }\n });\n }\n const hasError = Boolean(errors?.enumValues && Object.keys(errors?.enumValues).length > 0);\n onError?.(hasError);\n return errors;\n }\n });\n\n const { values, errors } = formex;\n\n useEffect(() => {\n if (onValuesChanged) {\n onValuesChanged(values.enumValues);\n }\n }, [values.enumValues]);\n\n return <Formex value={formex}>\n <EnumFormFields enumValuesPath={\"enumValues\"}\n values={values}\n errors={errors}\n shouldUpdateId={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}/>\n </Formex>\n\n}\n\ntype EnumFormFieldsProps = {\n values: {\n enumValues: EnumValueConfig[]\n };\n errors: any;\n enumValuesPath: string;\n shouldUpdateId: boolean;\n disabled: boolean;\n getData?: () => Promise<string[]>;\n allowDataInference?: boolean;\n};\n\n// const EnumFormFields = React.memo(\nfunction EnumFormFields({\n values,\n errors,\n disabled,\n enumValuesPath,\n shouldUpdateId,\n allowDataInference,\n getData,\n }: EnumFormFieldsProps) {\n\n const {\n setFieldValue\n } = useFormex();\n\n const [lastInternalIdAdded, setLastInternalIdAdded] = React.useState<number | undefined>();\n const [editDialogIndex, setEditDialogIndex] = React.useState<number | undefined>();\n const [inferring, setInferring] = React.useState(false);\n\n const inferredValuesRef = React.useRef(new Set());\n const inferredValues = inferredValuesRef.current;\n\n const buildEntry = (index: number, internalId: number) => {\n const justAdded = lastInternalIdAdded === internalId;\n const entryError = errors?.enumValues && errors?.enumValues[index];\n return <EnumEntry index={index}\n disabled={disabled}\n enumValuesPath={enumValuesPath}\n autoFocus={justAdded}\n entryError={entryError}\n shouldUpdateId={shouldUpdateId || justAdded}\n onDialogOpen={() => setEditDialogIndex(index)}\n inferredEntry={inferredValues.has(values.enumValues[index]?.id as string)}\n key={`${internalId}`}/>;\n };\n\n const inferValues = async () => {\n if (!getData)\n return;\n setInferring(true);\n getData?.().then((data) => {\n if (!data)\n return;\n\n const flatData = data.flat();\n\n const fieldData = Array.from(new Set(flatData));\n\n const currentEnumValues = values.enumValues;\n const foundEnumValues = extractEnumFromValues(fieldData);\n\n // add only new enum values\n const newEnumValues = foundEnumValues.filter((enumValue) => {\n return !currentEnumValues?.some((v: any) => v.id === enumValue.id);\n });\n\n newEnumValues.forEach((enumValue) => {\n inferredValues.add(enumValue.id);\n });\n setFieldValue(enumValuesPath, [...newEnumValues, ...currentEnumValues], true);\n }).catch(e => {\n console.error(e);\n })\n .finally(() => setInferring(false));\n }\n\n return (\n <div className={\"col-span-12\"}>\n <div className=\"ml-3.5 flex flex-row items-center\">\n <ListIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2 grow\">\n Values\n </Typography>\n {allowDataInference &&\n <Button loading={inferring}\n disabled={disabled || inferring}\n variant={\"text\"}\n size={\"small\"}\n onClick={inferValues}>\n {inferring ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n Infer values from data\n </Button>}\n </div>\n\n <Paper className=\"p-4 m-1\">\n\n <ArrayContainer droppableId={enumValuesPath}\n addLabel={\"Add enum value\"}\n value={values.enumValues}\n disabled={disabled}\n size={\"small\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastInternalIdAdded}\n includeAddButton={true}\n onValueChange={(value) => setFieldValue(enumValuesPath, value)}\n newDefaultEntry={{ id: \"\", label: \"\" }}/>\n\n <EnumEntryDialog index={editDialogIndex}\n open={editDialogIndex !== undefined}\n enumValuesPath={enumValuesPath}\n onClose={() => setEditDialogIndex(undefined)}/>\n </Paper>\n </div>\n );\n}\n\ntype EnumEntryProps = {\n index: number,\n enumValuesPath: string,\n shouldUpdateId: boolean,\n autoFocus: boolean,\n onDialogOpen: () => void;\n disabled: boolean;\n inferredEntry?: boolean;\n entryError?: { label?: string, id?: string }\n};\n\nconst EnumEntry = React.memo(\n function EnumEntryInternal({\n index,\n shouldUpdateId: updateId,\n enumValuesPath,\n autoFocus,\n onDialogOpen,\n disabled,\n inferredEntry,\n entryError\n }: EnumEntryProps) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<EnumValues>();\n\n const shouldUpdateIdRef = React.useRef(!getIn(values, `${enumValuesPath}[${index}].id`));\n const shouldUpdateId = updateId || shouldUpdateIdRef.current;\n\n const idValue = getIn(values, `${enumValuesPath}[${index}].id`);\n const labelValue = getIn(values, `${enumValuesPath}[${index}].label`);\n\n const currentLabelRef = React.useRef(labelValue);\n\n React.useEffect(() => {\n if ((currentLabelRef.current === idValue || !idValue) && shouldUpdateId) {\n setFieldValue(`${enumValuesPath}[${index}].id`, labelValue);\n }\n currentLabelRef.current = labelValue;\n }, [labelValue]);\n\n return (\n <>\n <div className={\"flex w-full align-center justify-center\"}>\n <Field name={`${enumValuesPath}[${index}].label`}\n as={DebouncedTextField}\n className={\"flex-grow\"}\n required\n disabled={disabled}\n size=\"small\"\n autoFocus={autoFocus}\n autoComplete=\"off\"\n endAdornment={inferredEntry && <AutoAwesomeIcon size={\"small\"}/>}\n error={Boolean(entryError?.label)}/>\n\n {!disabled &&\n <Badge color={\"error\"} invisible={!entryError?.id}>\n <IconButton\n size=\"small\"\n aria-label=\"edit\"\n className={\"m-1\"}\n onClick={() => onDialogOpen()}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Badge>}\n\n </div>\n\n {entryError?.label && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.label}\n </Typography>}\n\n {entryError?.id && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.id}\n </Typography>}\n\n </>);\n },\n function areEqual(prevProps: EnumEntryProps, nextProps: EnumEntryProps) {\n return prevProps.index === nextProps.index &&\n prevProps.enumValuesPath === nextProps.enumValuesPath &&\n prevProps.shouldUpdateId === nextProps.shouldUpdateId &&\n prevProps.inferredEntry === nextProps.inferredEntry &&\n equal(prevProps.entryError, nextProps.entryError) &&\n prevProps.autoFocus === nextProps.autoFocus;\n }\n);\n\nfunction EnumEntryDialog({\n index,\n open,\n onClose,\n enumValuesPath\n }: {\n index?: number;\n open: boolean;\n enumValuesPath: string;\n onClose: () => void;\n}) {\n\n const {\n errors,\n } = useFormex<EnumValues>();\n\n const idError = index !== undefined ? getIn(errors, `${enumValuesPath}[${index}].id`) : undefined;\n return <Dialog\n maxWidth=\"md\"\n aria-labelledby=\"enum-edit-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n\n <DialogContent>\n {index !== undefined &&\n <div>\n <Field name={`${enumValuesPath}[${index}].id`}\n as={DebouncedTextField}\n required\n label={\"ID\"}\n size=\"small\"\n autoComplete=\"off\"\n error={Boolean(idError)}/>\n\n <FieldCaption error={Boolean(idError)}>\n {idError ?? \"Value saved in the data source\"}\n </FieldCaption>\n </div>}\n </DialogContent>\n\n <DialogActions>\n <Button\n autoFocus\n variant=\"outlined\"\n onClick={onClose}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n}\n\n","import React from \"react\";\n\nimport { BooleanSwitchWithLabel, Tooltip } from \"@firecms/ui\";\nimport { FormexFieldProps } from \"@firecms/formex\";\n\nexport function SwitchControl({\n field,\n form,\n label,\n tooltip,\n disabled,\n size = \"small\",\n allowIndeterminate\n }: FormexFieldProps & {\n label: string,\n tooltip?: string,\n disabled?: boolean,\n size?: \"small\" | \"medium\",\n allowIndeterminate?: boolean\n}) {\n\n const formControlLabel = <BooleanSwitchWithLabel\n label={label}\n size={size}\n position={\"start\"}\n value={field.value}\n disabled={disabled}\n allowIndeterminate={allowIndeterminate}\n onValueChange={(checked:boolean | null) => form.setFieldValue(field.name, checked)}/>;\n\n if (tooltip)\n return (\n <Tooltip\n title={tooltip}>\n {formControlLabel}\n </Tooltip>\n );\n return formControlLabel;\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function GeneralPropertyValidation({ disabled }: {\n required?: boolean;\n disabled: boolean;\n}) {\n\n const { values, handleChange } = useFormex();\n\n const validationRequired = \"validation.required\";\n const validationRequiredMessage = \"validation.requiredMessage\";\n const validationUnique = \"validation.unique\";\n const validationUniqueInArray = \"validation.uniqueInArray\";\n\n return (\n <>\n <div className={\"col-span-6\"}>\n <Field name={validationRequired}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Required\"}\n tooltip={\"You won't be able to save this entity if this value is not set\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-6\"}>\n\n <Field name={validationUnique}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Unique\"}\n tooltip={\"There cannot be multiple entities with the same value\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n {getIn(values, validationRequired) && <div className={\"col-span-12\"}>\n <DebouncedTextField\n disabled={disabled}\n value={getIn(values, validationRequiredMessage)}\n label={\"Required message\"}\n name={validationRequiredMessage}\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, serializeRegExp } from \"@firecms/core\";\nimport { DebouncedTextField, } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function StringPropertyValidation({\n length,\n lowercase,\n matches,\n max,\n min,\n trim,\n uppercase,\n disabled,\n showErrors\n }: {\n length?: boolean;\n min?: boolean;\n max?: boolean;\n trim?: boolean;\n matches?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors\n } = useFormex();\n\n const validationLength = \"validation.length\";\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationTrim = \"validation.trim\";\n const validationMatches = \"validation.matches\";\n const validationLowercase = \"validation.lowercase\";\n const validationUppercase = \"validation.uppercase\";\n\n const matchesError = getIn(errors, validationMatches);\n\n const matchesValue = getIn(values, validationMatches);\n const matchesStringValue = typeof matchesValue === \"string\" ? matchesValue : serializeRegExp(matchesValue);\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n\n {lowercase && <div className={\"col-span-4\"}>\n <Field name={validationLowercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Lowercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {uppercase && <div className={\"col-span-4\"}>\n <Field name={validationUppercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Uppercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {trim && <div className={\"col-span-4\"}>\n <Field name={validationTrim}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Trim\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n </div>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n {length && <div className={\"col-span-4\"}>\n <DebouncedTextField\n value={getIn(values, validationLength)}\n label={\"Exact length\"}\n name={validationLength}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {min && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {max && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n </div>\n\n {matches && <div className={\"col-span-12\"}>\n <Field name={validationMatches}\n as={DebouncedTextField}\n label={\"Matches regex\"}\n size=\"small\"\n disabled={disabled}\n value={matchesStringValue}\n error={Boolean(matchesError)}/>\n <FieldCaption error={Boolean(matchesError)}>\n {matchesError ? \"Not a valid regexp\" : \"e.g. /^\\\\d+$/ for digits only\"}\n </FieldCaption>\n </div>}\n\n </div>\n );\n\n}\n","import React from \"react\";\n\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\n\nexport function ArrayPropertyValidation({\n max = true,\n min = true,\n disabled\n }: {\n min?: boolean;\n max?: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n {min && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n disabled={disabled}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n {max && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n disabled={disabled}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { ExpandablePanel, RuleIcon, Typography } from \"@firecms/ui\";\n\nexport function ValidationPanel({\n children\n }: PropsWithChildren<{}>) {\n\n return (\n <ExpandablePanel\n initiallyExpanded={false}\n asField={true}\n className=\"p-4\"\n title={\n <div className=\"flex flex-row text-gray-500\">\n <RuleIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Validation\n </Typography>\n </div>\n }>\n\n {children}\n\n </ExpandablePanel>\n )\n}\n","import React, { useMemo } from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { EnumValueConfig, resolveEnumValues, useSnackbarController } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { EnumForm } from \"../EnumForm\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { PropertyWithId } from \"../PropertyEditView\";\n\nexport function EnumPropertyField({\n multiselect,\n updateIds,\n disabled,\n showErrors,\n allowDataInference,\n getData\n }: {\n multiselect: boolean;\n updateIds: boolean;\n disabled: boolean;\n showErrors: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<object[]>;\n}) {\n\n const {\n values,\n setFieldError,\n setFieldValue\n } = useFormex<PropertyWithId>();\n\n const snackbarContext = useSnackbarController();\n\n const enumValuesPath = multiselect ? \"of.enumValues\" : \"enumValues\";\n\n const defaultValue = getIn(values, \"defaultValue\");\n\n const valuesEnumValues = getIn(values, enumValuesPath);\n const enumValues: EnumValueConfig[] = useMemo(() => {\n if (!valuesEnumValues || typeof valuesEnumValues === \"boolean\")\n return [] as EnumValueConfig[];\n return resolveEnumValues(valuesEnumValues) ?? [] as EnumValueConfig[];\n }, [valuesEnumValues]);\n\n const onValuesChanged = (value: EnumValueConfig[]) => {\n if (!values)\n return;\n setFieldValue(enumValuesPath, value);\n if (!multiselect) {\n const enumIds = value.filter(v => Boolean(v?.id)).map((v: any) => v.id);\n if (defaultValue && !enumIds.includes(defaultValue)) {\n setFieldValue(\"defaultValue\", undefined);\n snackbarContext.open({\n type: \"warning\",\n message: \"Default value was cleared\"\n })\n }\n }\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <EnumForm enumValues={enumValues}\n updateIds={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n onError={(hasError) => {\n setFieldError(enumValuesPath, hasError ? \"This enum property is missing some values\" : undefined);\n }}\n getData={getData\n ? () => getData()\n .then(res => res.map(entry => values.id && getIn(entry, values.id)).filter(Boolean))\n : undefined}\n onValuesChanged={onValuesChanged}/>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiselect &&\n <StringPropertyValidation disabled={disabled}\n showErrors={showErrors}/>}\n {multiselect &&\n <ArrayPropertyValidation disabled={disabled}/>}\n </ValidationPanel>\n\n </div>\n\n {!multiselect && <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n setFieldValue(\"defaultValue\", value);\n }}\n label={\"Default value\"}\n value={defaultValue ?? \"\"}>\n {enumValues\n .filter((enumValue) => Boolean(enumValue?.id))\n .map((enumValue) => (\n <SelectItem key={enumValue.id}\n value={enumValue.id?.toString()}>\n {enumValue.label}\n </SelectItem>\n ))}\n </Select>\n\n </div>}\n </>\n );\n}\n","import React from \"react\";\nimport {\n Button,\n Checkbox,\n DebouncedTextField,\n ExpandablePanel,\n FileUploadIcon,\n MultiSelect,\n MultiSelectItem,\n Typography\n} from \"@firecms/ui\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nconst fileTypes: Record<string, string> = {\n \"image/*\": \"Images\",\n \"video/*\": \"Videos\",\n \"audio/*\": \"Audio files\",\n \"application/*\": \"Files (pdf, zip, csv, excel...)\",\n \"text/*\": \"Text files\"\n}\n\nexport function StoragePropertyField({\n multiple,\n existing,\n disabled\n }: {\n multiple: boolean;\n existing: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex();\n\n const baseStoragePath = multiple ? \"of.storage\" : \"storage\";\n const acceptedFiles = `${baseStoragePath}.acceptedFiles`;\n\n const metadata = `${baseStoragePath}.metadata`;\n const fileName = `${baseStoragePath}.fileName`;\n const maxSize = `${baseStoragePath}.maxSize`;\n const storagePath = `${baseStoragePath}.storagePath`;\n const storeUrl = `${baseStoragePath}.storeUrl`;\n\n const fileNameValue = getIn(values, fileName) ?? \"{rand}_{file}\";\n const storagePathValue = getIn(values, storagePath) ?? \"/\";\n const maxSizeValue = getIn(values, maxSize);\n\n const storedValue = getIn(values, acceptedFiles);\n const fileTypesValue: string[] | undefined = Array.isArray(storedValue) ? storedValue : undefined;\n const allFileTypesSelected = !fileTypesValue || fileTypesValue.length === 0;\n\n const handleTypesChange = (value: string[]) => {\n if (!value) setFieldValue(acceptedFiles, undefined);\n else if (value.includes(\"all\")) setFieldValue(acceptedFiles, undefined);\n else if (value.length >= Object.keys(fileTypes).length) setFieldValue(acceptedFiles, undefined);\n else if (allFileTypesSelected)\n setFieldValue(acceptedFiles, Object.keys(fileTypes).filter((v) => !value.includes(v)));\n else setFieldValue(acceptedFiles, value);\n };\n\n const hasFilenameCallback = typeof fileNameValue === \"function\";\n const hasStoragePathCallback = typeof storagePathValue === \"function\";\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ExpandablePanel\n title={\n <div className=\"flex flex-row text-gray-500\">\n <FileUploadIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n File upload config\n </Typography>\n </div>\n }>\n\n <div className={\"grid grid-cols-12 gap-2 p-4\"}>\n\n <div className={\"col-span-12\"}>\n\n <MultiSelect\n disabled={disabled}\n name={acceptedFiles}\n value={fileTypesValue ?? []}\n onMultiValueChange={handleTypesChange}\n label={allFileTypesSelected ? undefined : \"Allowed file types\"}\n renderValues={(selected) => {\n if (!selected || selected.length === 0) return \"All file types allowed\";\n return selected.map((v: string) => fileTypes[v])\n .filter((v: string) => Boolean(v))\n .join(\", \");\n }}>\n\n <MultiSelectItem key={\"all\"} value={\"all\"} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={!fileTypesValue}/>\n All\n </MultiSelectItem>\n\n {Object.entries(fileTypes).map(([value, label]) => (\n <MultiSelectItem key={value} value={value} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={allFileTypesSelected || fileTypesValue.indexOf(value) > -1}/>\n <div className={\"flex-grow\"}>\n {label}\n </div>\n <Button size={\"small\"}\n variant={\"outlined\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n return setFieldValue(acceptedFiles, [value]);\n }}>\n Only\n </Button>\n </MultiSelectItem>\n ))}\n\n </MultiSelect>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={fileName}\n as={DebouncedTextField}\n label={\"File name\"}\n size={\"small\"}\n disabled={hasFilenameCallback || disabled}\n value={hasFilenameCallback ? \"-\" : fileNameValue}\n />\n </div>\n <div className={\"col-span-12\"}>\n <Field name={storagePath}\n as={DebouncedTextField}\n label={\"Storage path\"}\n disabled={hasStoragePathCallback || disabled}\n size={\"small\"}\n value={hasStoragePathCallback ? \"-\" : storagePathValue}\n />\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n <p>You can use the following placeholders in\n the file name\n and storage path values:</p>\n <ul>\n <li>{\"{file} - Full name of the uploaded file\"}</li>\n <li>{\"{file.name} - Name of the uploaded file without extension\"}</li>\n <li>{\"{file.ext} - Extension of the uploaded file\"}</li>\n <li>{\"{entityId} - ID of the entity\"}</li>\n <li>{\"{propertyKey} - ID of this field\"}</li>\n <li>{\"{path} - Path of this entity\"}</li>\n <li>{\"{rand} - Random value used to avoid name collisions\"}</li>\n </ul>\n </Typography>\n\n <Field name={storeUrl}\n type=\"checkbox\">\n {({\n field,\n form\n }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Save URL instead of storage path\"}\n disabled={existing || disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n Turn this setting on, if you prefer to save\n the download\n URL of the uploaded file instead of the\n storage path.\n You can only change this prop upon creation.\n </Typography>\n </div>\n\n <div className={\"col-span-12\"}>\n <DebouncedTextField name={maxSize}\n type={\"number\"}\n label={\"Max size (in bytes)\"}\n size={\"small\"}\n value={maxSizeValue !== undefined && maxSizeValue !== null ? maxSizeValue.toString() : \"\"}\n onChange={(e) => {\n const value = e.target.value;\n if (value === \"\") setFieldValue(maxSize, undefined);\n else setFieldValue(maxSize, parseInt(value));\n }}\n />\n </div>\n\n </div>\n </ExpandablePanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiple && <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n </div>}\n {multiple && <div className={\"col-span-12\"}>\n <ArrayPropertyValidation disabled={disabled}/>\n </div>}\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { isPropertyBuilder, Properties, PropertiesOrBuilders, Property, PropertyOrBuilder } from \"@firecms/core\";\n\nexport function editableProperty(property: PropertyOrBuilder | PropertyOrBuilder): boolean {\n if (isPropertyBuilder(property))\n return false;\n if (isPropertyBuilder(property as PropertyOrBuilder))\n return false;\n else {\n const eProperty = property as Property;\n if (eProperty.dataType === \"array\" && typeof eProperty.of === \"function\")\n return false;\n else if (eProperty.dataType === \"array\" && Array.isArray(eProperty.of))\n return false;\n return Boolean(eProperty.editable);\n }\n}\n\nexport function removeNonEditableProperties(properties: PropertiesOrBuilders<any>): Properties {\n return Object.entries(properties)\n .filter(([_, property]) => editableProperty(property))\n .map(([key, propertyOrBuilder]) => {\n const property = propertyOrBuilder as Property;\n if (!editableProperty(property)) {\n return undefined;\n } else if (property.dataType === \"map\" && property.properties) {\n return {\n [key]: {\n ...property,\n properties: removeNonEditableProperties(property.properties as PropertiesOrBuilders)\n }\n };\n } else {\n return { [key]: property };\n }\n })\n .filter((e) => Boolean(e))\n .reduce((a, b) => ({ ...a, ...b }), {}) as Properties;\n}\n","import {\n ErrorBoundary,\n PropertyConfigBadge,\n getFieldConfig,\n isPropertyBuilder,\n Property,\n PropertyOrBuilder,\n useCustomizationController,\n} from \"@firecms/core\";\nimport {\n cardClickableMixin,\n cardMixin,\n cardSelectedMixin,\n cls,\n FunctionsIcon,\n Paper,\n RemoveCircleIcon,\n Typography,\n} from \"@firecms/ui\";\n\nimport { editableProperty } from \"../../utils/entities\";\n\nexport function PropertyFieldPreview({\n property,\n onClick,\n hasError,\n includeName,\n includeEditButton,\n selected\n }: {\n property: Property,\n hasError?: boolean,\n selected?: boolean,\n includeName?: boolean,\n includeEditButton?: boolean;\n onClick?: () => void\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = getFieldConfig(property, propertyConfigs);\n const disabled = !editableProperty(property);\n\n const borderColorClass = hasError\n ? \"border-red-500 dark:border-red-500 border-opacity-100 dark:border-opacity-100 ring-0 dark:ring-0\"\n : (selected ? \"border-primary\" : \"border-transparent\");\n\n return <ErrorBoundary>\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"m-4\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <Paper\n className={cls(\n \"border\",\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n borderColorClass\n )}\n >\n\n <div className=\"w-full flex flex-col\">\n\n {includeName &&\n <ErrorBoundary>\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 </ErrorBoundary>}\n\n <div className=\"flex flex-row items-center\">\n <ErrorBoundary>\n <Typography className=\"flex-grow pr-2\"\n variant={includeName ? \"body2\" : \"subtitle1\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>\n </ErrorBoundary>\n <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>\n\n </div>\n </div>\n\n {includeEditButton && <Typography variant={\"button\"}>\n EDIT\n </Typography>}\n\n </Paper>\n </div>\n </ErrorBoundary>\n}\n\nexport function NonEditablePropertyPreview({\n name,\n selected,\n onClick,\n property\n }: {\n name: string,\n selected: boolean,\n onClick?: () => void,\n property?: PropertyOrBuilder\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = !isPropertyBuilder(property) && property ? getFieldConfig(property, propertyConfigs) : undefined;\n\n return (\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"relative m-4\"}>\n {propertyConfig && <PropertyConfigBadge propertyConfig={propertyConfig}/>}\n {!propertyConfig && <div\n className={\"h-8 w-8 p-1 rounded-full shadow text-white bg-gray-500\"}>\n <FunctionsIcon color={\"inherit\"} size={\"medium\"}/>\n </div>}\n <RemoveCircleIcon color={\"disabled\"} size={\"small\"} className={\"absolute -right-2 -top-2\"}/>\n </div>\n <Paper\n className={cls(\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n selected ? \"border-primary\" : \"border-transparent\")}\n >\n\n <div className=\"w-full flex flex-col\">\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property?.name\n ? property.name\n : name\n }\n </Typography>\n\n <div className=\"flex flex-row items-center\">\n {propertyConfig && <Typography className=\"flex-grow pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>}\n\n {property && !isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>}\n\n {property && isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This property is defined as a property builder in code\n </Typography>\n </ErrorBoundary>}\n\n {!property && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This field is defined as an additional field in code\n </Typography>\n </ErrorBoundary>}\n\n </div>\n\n {/*<div className=\"flex flex-row text-xs\">*/}\n {/* <Typography className=\"flex-grow pr-2\"*/}\n {/* variant=\"body2\"*/}\n {/* component=\"span\"*/}\n {/* color=\"secondary\">*/}\n {/* This field can only be edited in code*/}\n {/* </Typography>*/}\n {/*</div>*/}\n </div>\n\n </Paper>\n </div>)\n}\n","import React from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CMSType,\n ErrorBoundary,\n isPropertyBuilder,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"@firecms/core\";\nimport { AutoAwesomeIcon, defaultBorderMixin, DragHandleIcon, IconButton, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { NonEditablePropertyPreview, PropertyFieldPreview } from \"./PropertyFieldPreview\";\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\nimport { getFullId, getFullIdPath } from \"./util\";\nimport { editableProperty } from \"../../utils/entities\";\n\nexport const PropertyTree = React.memo(\n function PropertyTree<M extends {\n [Key: string]: CMSType\n }>({\n namespace,\n selectedPropertyKey,\n onPropertyClick,\n properties,\n propertiesOrder: propertiesOrderProp,\n additionalFields,\n errors,\n onPropertyMove,\n onPropertyRemove,\n className,\n inferredPropertyKeys,\n collectionEditable\n }: {\n namespace?: string;\n selectedPropertyKey?: string;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n properties: PropertiesOrBuilders<M>;\n propertiesOrder?: string[];\n additionalFields?: AdditionalFieldDelegate<M>[];\n errors: Record<string, any>;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n className?: string;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n }) {\n\n const propertiesOrder = propertiesOrderProp ?? Object.keys(properties);\n\n const onDragEnd = (result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const startIndex = result.source.index;\n const endIndex = result.destination.index;\n\n const newPropertiesOrder = Array.from(propertiesOrder);\n const [removed] = newPropertiesOrder.splice(startIndex, 1);\n newPropertiesOrder.splice(endIndex, 0, removed);\n if (onPropertyMove)\n onPropertyMove(newPropertiesOrder, namespace);\n }\n\n return (\n <>\n\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`droppable_${namespace}`}>\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={className}>\n {propertiesOrder && propertiesOrder\n .map((propertyKey: string, index: number) => {\n const property = properties[propertyKey] as PropertyOrBuilder;\n const additionalField = additionalFields?.find(field => field.key === propertyKey);\n\n if (!property && !additionalField) {\n console.warn(`Property ${propertyKey} not found in properties or additionalFields`);\n return null;\n }\n return (\n <Draggable\n key={`array_field_${namespace}_${propertyKey}}`}\n draggableId={`array_field_${namespace}_${propertyKey}}`}\n index={index}>\n {(provided, snapshot) => {\n return (\n <ErrorBoundary>\n <PropertyTreeEntry\n propertyKey={propertyKey as string}\n propertyOrBuilder={property}\n additionalField={additionalField}\n provided={provided}\n errors={errors}\n namespace={namespace}\n inferredPropertyKeys={inferredPropertyKeys}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n onPropertyClick={snapshot.isDragging ? undefined : onPropertyClick}\n selectedPropertyKey={selectedPropertyKey}\n collectionEditable={collectionEditable}\n />\n </ErrorBoundary>\n );\n }}\n </Draggable>);\n }).filter(Boolean)}\n\n {droppableProvided.placeholder}\n\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n </>\n );\n },\n (prevProps, nextProps) => {\n\n const isSelected = nextProps.selectedPropertyKey?.startsWith(nextProps.namespace ?? \"\");\n const wasSelected = prevProps.selectedPropertyKey?.startsWith(prevProps.namespace ?? \"\");\n if (isSelected || wasSelected)\n return false;\n\n return equal(prevProps.properties, nextProps.properties) &&\n prevProps.propertiesOrder === nextProps.propertiesOrder &&\n equal(prevProps.additionalFields, nextProps.additionalFields) &&\n equal(prevProps.errors, nextProps.errors) &&\n equal(prevProps.onPropertyClick, nextProps.onPropertyClick) &&\n // equal(prevProps.onPropertyMove, nextProps.onPropertyMove) &&\n // equal(prevProps.onPropertyRemove, nextProps.onPropertyRemove) &&\n prevProps.namespace === nextProps.namespace &&\n prevProps.collectionEditable === nextProps.collectionEditable;\n }\n);\n\nexport function PropertyTreeEntry({\n propertyKey,\n namespace,\n propertyOrBuilder,\n additionalField,\n provided,\n selectedPropertyKey,\n errors,\n onPropertyClick,\n onPropertyMove,\n onPropertyRemove,\n inferredPropertyKeys,\n collectionEditable\n }: {\n propertyKey: string;\n namespace?: string;\n propertyOrBuilder: PropertyOrBuilder;\n additionalField?: AdditionalFieldDelegate<any>;\n selectedPropertyKey?: string;\n provided: DraggableProvided;\n errors: Record<string, any>;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n}) {\n\n const isPropertyInferred = inferredPropertyKeys?.includes(namespace ? `${namespace}.${propertyKey}` : propertyKey);\n const fullId = getFullId(propertyKey, namespace);\n const fullIdPath = getFullIdPath(propertyKey, namespace);\n const hasError = fullIdPath in errors;\n\n let subtree;\n if (typeof propertyOrBuilder === \"object\") {\n const property = propertyOrBuilder;\n if (property.dataType === \"map\" && property.properties) {\n subtree = <PropertyTree\n selectedPropertyKey={selectedPropertyKey}\n namespace={fullId}\n properties={property.properties}\n propertiesOrder={property.propertiesOrder}\n errors={errors}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n collectionEditable={collectionEditable}\n />\n }\n }\n\n // const hasError = fullId ? getIn(errors, idToPropertiesPath(fullId)) : false;\n const selected = selectedPropertyKey === fullId;\n const editable = propertyOrBuilder && ((collectionEditable && !isPropertyBuilder(propertyOrBuilder)) || editableProperty(propertyOrBuilder));\n\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className=\"relative -ml-8\"\n >\n {subtree && <div\n className={\"absolute border-l \" + defaultBorderMixin}\n style={{\n left: \"32px\",\n top: \"64px\",\n bottom: \"16px\"\n }}/>}\n\n {!isPropertyBuilder(propertyOrBuilder) && !additionalField && editable\n ? <PropertyFieldPreview\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n includeName={true}\n selected={selected}\n hasError={hasError}/>\n : <NonEditablePropertyPreview name={propertyKey}\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n selected={selected}/>}\n\n <div className=\"absolute top-2 right-2 flex flex-row \">\n\n {isPropertyInferred && <Tooltip title={\"Inferred property\"}>\n <AutoAwesomeIcon size=\"small\" className={\"p-2\"}/>\n </Tooltip>}\n\n {onPropertyRemove && <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n color=\"inherit\"\n onClick={() => onPropertyRemove(propertyKey, namespace)}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n {onPropertyMove && <Tooltip title={\"Move\"}>\n <IconButton\n component={\"span\"}\n size=\"small\"\n >\n <DragHandleIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n </div>\n\n {subtree && <div className={\"ml-16\"}>{subtree}</div>}\n </div>\n );\n\n}\n","import React, { useState } from \"react\";\nimport { FieldCaption, MapProperty, Property, PropertyConfig, } from \"@firecms/core\";\nimport { AddIcon, BooleanSwitchWithLabel, Button, Paper, Typography } from \"@firecms/ui\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\n\nexport function MapPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<MapProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const propertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const onPropertyCreated = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const currentPropertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"propertiesOrder\", newPropertiesOrder, false);\n\n setPropertyDialogOpen(false);\n };\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n const propertiesPath = idToPropertiesPath(fullId);\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n\n setFieldValue(propertiesPath, undefined, false);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const empty = !propertiesOrder || propertiesOrder.length < 1;\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className=\"flex justify-between items-end my-4\">\n <Typography variant={\"subtitle2\"}>Properties in this group</Typography>\n <Button\n color=\"primary\"\n variant={\"outlined\"}\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this group\"}\n </Button>\n </div>\n <Paper className=\"p-2 pl-8\">\n <PropertyTree\n properties={values.properties ?? {}}\n propertiesOrder={propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={(propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={onPropertyMove}/>\n\n {empty &&\n <Typography variant={\"label\"}\n className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this group\n </Typography>}\n </Paper>\n </div>\n\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n size={\"small\"}\n label=\"Spread children as columns\"\n onValueChange={(v) => setFieldValue(\"spreadChildren\", v)}\n value={values.spreadChildren ?? false}\n />\n <FieldCaption>\n Set this flag to true if you want to display the children of this group as individual columns.\n </FieldCaption>\n </div>\n\n <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n getData={getData}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyCreated}\n existingPropertyKeys={selectedPropertyKey ? undefined : propertiesOrder}\n propertyConfigs={propertyConfigs}\n />\n\n </>);\n}\n","import React, { useState } from \"react\";\nimport { ArrayProperty, getFieldConfig, Property, PropertyConfig } from \"@firecms/core\";\nimport { Button, Paper, Typography } from \"@firecms/ui\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { PropertyFieldPreview } from \"../PropertyFieldPreview\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function RepeatPropertyField({\n showErrors,\n existing,\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n showErrors: boolean,\n existing: boolean,\n disabled: boolean,\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState(false);\n const ofProperty = getIn(values, \"of\");\n const ofPropertyError = getIn(touched, \"of\") && getIn(errors, \"of\");\n\n const onPropertyChanged = ({ id, property, namespace }:\n { id?: string, property: Property, namespace?: string }) => {\n setFieldValue(\"of\", property);\n };\n\n const widget = ofProperty && getFieldConfig(ofProperty, propertyConfigs);\n return (\n <>\n <div className={\"col-span-12\"}>\n <Typography variant={\"subtitle2\"}>\n Repeat component\n </Typography>\n <Field\n name={\"of\"}\n value={ofProperty}\n // validate={(property: Property) => {\n // return property?.dataType ? undefined : \"You need to specify a repeat field\";\n // }}\n >\n {({}) => (\n <Paper className=\"p-2 mt-4\">\n\n {ofProperty && <PropertyFieldPreview\n property={ofProperty}\n onClick={disabled ? undefined : () => setPropertyDialogOpen(true)}\n includeName={false}\n includeEditButton={true}\n selected={false}\n hasError={false}/>}\n\n {!disabled && !ofProperty && <Button variant={\"text\"}\n size={\"large\"}\n color={ofPropertyError ? \"error\" : \"primary\"}\n onClick={() => setPropertyDialogOpen(true)}>\n Edit {`${widget ? widget.name : \"repeat component\"}`}\n </Button>}\n\n <PropertyFormDialog\n inArray={true}\n open={propertyDialogOpen}\n existingProperty={existing}\n getData={getData}\n autoUpdateId={!existing}\n autoOpenTypeSelect={!existing}\n onOkClicked={() => setPropertyDialogOpen(false)}\n allowDataInference={allowDataInference}\n property={ofProperty}\n includeIdAndName={false}\n onPropertyChanged={onPropertyChanged}\n forceShowErrors={showErrors}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />\n </Paper>\n )}\n </Field>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <ArrayPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { PropertyWithId } from \"../PropertyEditView\";\nimport React from \"react\";\nimport { FieldCaption, toSnakeCase, unslugify } from \"@firecms/core\";\n\ntype CommonPropertyFieldsProps = {\n showErrors: boolean,\n disabledId: boolean,\n disabled: boolean;\n isNewProperty: boolean;\n autoUpdateId: boolean;\n};\n\nexport const CommonPropertyFields = React.forwardRef<HTMLDivElement, CommonPropertyFieldsProps>(\n function CommonPropertyFields({\n showErrors,\n disabledId,\n disabled,\n autoUpdateId,\n isNewProperty\n }, ref) {\n\n const {\n errors,\n values,\n setFieldValue,\n setFieldTouched,\n touched,\n validate\n } = useFormex<PropertyWithId>();\n\n const name = \"name\";\n const nameError = showErrors && getIn(errors, name);\n\n const id = \"id\";\n const idError = showErrors && getIn(errors, id);\n\n const description = \"description\";\n const descriptionError = showErrors && getIn(errors, description);\n\n return (\n <div className={\"flex flex-col gap-2 col-span-12\"}>\n\n <div>\n <Field\n name={name}\n inputRef={ref}\n as={DebouncedTextField}\n value={values[name]}\n onChange={(e: any) => {\n const newNameValue = e.target.value;\n const idTouched = getIn(touched, id);\n if (!idTouched && autoUpdateId) {\n setFieldValue(id, newNameValue ? toSnakeCase(newNameValue) : \"\", false)\n }\n setFieldValue(name, newNameValue, true);\n setFieldTouched(name, true);\n }}\n style={{ fontSize: 20 }}\n placeholder={\"Field name\"}\n required\n disabled={disabled}\n error={Boolean(nameError)}/>\n\n <FieldCaption error={Boolean(nameError)}>\n {nameError}\n </FieldCaption>\n </div>\n\n <div>\n <Field\n name={id}\n as={DebouncedTextField}\n label={\"ID\"}\n value={values[id]}\n onChange={(e: any) => {\n const newIdValue = e.target.value;\n const nameTouched = getIn(touched, name);\n if (!nameTouched && autoUpdateId) {\n setFieldValue(name, newIdValue ? unslugify(newIdValue) : \"\")\n }\n setFieldValue(id, newIdValue, true);\n setFieldTouched(id, true);\n }}\n disabled={disabledId || disabled}\n required\n size=\"small\"\n error={Boolean(idError)}/>\n <FieldCaption error={Boolean(idError)}>\n {idError}\n </FieldCaption>\n </div>\n\n <div>\n <Field name={description}\n as={DebouncedTextField}\n label={\"Description\"}\n disabled={disabled}\n error={Boolean(descriptionError)}/>\n <FieldCaption error={Boolean(descriptionError)}>\n {descriptionError}\n </FieldCaption>\n </div>\n\n </div>\n );\n\n }\n);\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { TextField } from \"@firecms/ui\";\n\nexport function StringPropertyField({\n widgetId,\n disabled,\n showErrors\n }: {\n widgetId: \"text_field\" | \"multiline\" | \"markdown\" | \"email\";\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n {widgetId === \"text_field\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n matches={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"multiline\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"markdown\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n\n {widgetId === \"email\" &&\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>}\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\n\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nexport function BooleanPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n const { values } = useFormex();\n const defaultValue = getIn(values, \"defaultValue\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <Field\n name={\"defaultValue\"}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={defaultValue === null || defaultValue === undefined ? \"Default value not set\" : (\"Default value is \" + defaultValue.toString())}\n disabled={disabled}\n allowIndeterminate={true} field={field}\n form={form}/>\n }}\n </Field>\n\n </div>\n </>\n );\n}\n","import React, { useState } from \"react\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { ArrayProperty, Property, PropertyConfig } from \"@firecms/core\";\n\nexport function BlockPropertyField({\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const onPropertyChanged = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n\n setFieldValue(\"oneOf.properties\", {\n ...(values.oneOf?.properties ?? {}),\n [id]: property\n }, false);\n const currentPropertiesOrder = values.oneOf?.propertiesOrder ?? Object.keys(values.oneOf?.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"oneOf.propertiesOrder\", newPropertiesOrder, false);\n setPropertyDialogOpen(false);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.oneOf?.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(`oneOf.${idToPropertiesPath(fullId)}`, undefined, false);\n const propertiesOrderPath = `oneOf.${namespaceToPropertiesOrderPath(namespace)}`;\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const addChildButton = <Button\n autoFocus\n color=\"primary\"\n\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this block\"}\n </Button>;\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(`oneOf.${namespaceToPropertiesOrderPath(namespace)}`, propertiesOrder, false);\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className={\"flex justify-between items-end mt-8 mb-4\"}>\n <Typography variant={\"subtitle2\"}>Properties in this\n block</Typography>\n {addChildButton}\n </div>\n <Paper className=\"p-2 pl-8\">\n\n <PropertyTree\n properties={values.oneOf?.properties ?? {}}\n propertiesOrder={values.oneOf?.propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={disabled\n ? undefined\n : (propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={disabled\n ? undefined\n : onPropertyMove}/>\n\n {!disabled && !values.oneOf?.propertiesOrder?.length &&\n <div className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this block\n </div>}\n\n </Paper>\n </div>\n\n {!disabled && <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n getData={getData}\n allowDataInference={allowDataInference}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n collectionEditable={collectionEditable}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyChanged}\n existingPropertyKeys={selectedPropertyKey ? undefined : values.oneOf?.propertiesOrder}\n propertyConfigs={propertyConfigs}/>}\n\n </>);\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function NumberPropertyValidation({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationLessThan = \"validation.lessThan\";\n const validationMoreThan = \"validation.moreThan\";\n const validationPositive = \"validation.positive\";\n const validationNegative = \"validation.negative\";\n const validationInteger = \"validation.integer\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min value\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max value\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationLessThan)}\n label={\"Less than\"}\n name={validationLessThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationMoreThan)}\n label={\"More than\"}\n name={validationMoreThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-4\"}>\n <Field name={validationPositive}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Positive value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationNegative}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Negative value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationInteger}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Integer value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { NumberPropertyValidation } from \"./validation/NumberPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { TextField } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nexport function NumberPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <NumberPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n type={\"number\"}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : parseFloat(e.target.value));\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, IconForView, NumberProperty, StringProperty, useNavigationController } from \"@firecms/core\";\nimport { CircularProgress, Select, SelectGroup, SelectItem, Typography, } from \"@firecms/ui\";\n\nexport function ReferencePropertyField({\n existing,\n multiple,\n disabled,\n showErrors\n }: {\n existing: boolean,\n multiple: boolean,\n disabled: boolean,\n showErrors: boolean\n}) {\n\n const {\n values,\n handleChange,\n errors,\n } = useFormex<StringProperty | NumberProperty>();\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const pathPath = multiple ? \"of.path\" : \"path\";\n const pathValue: string | undefined = getIn(values, pathPath);\n const pathError: string | undefined = showErrors && getIn(errors, pathPath);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Field name={pathPath}\n pathPath={pathPath}\n type=\"select\"\n disabled={(existing && Boolean(pathValue)) || disabled}\n value={pathValue}\n error={pathError}\n handleChange={handleChange}\n as={CollectionsSelect}/>\n\n </div>\n\n </>\n );\n}\n\nexport function CollectionsSelect({\n disabled,\n pathPath,\n value,\n handleChange,\n error,\n ...props\n }: {\n disabled: boolean,\n pathPath: string,\n value?: string,\n handleChange: (event: any) => void,\n error?: string\n}) {\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const collections = navigation?.collections ?? [];\n\n const groups: string[] = Array.from(new Set(\n Object.values(collections).map(e => e.group).filter(Boolean) as string[]\n ).values());\n\n const ungroupedCollections = collections.filter((col) => !col.group);\n\n return (\n <>\n <Select\n error={Boolean(error)}\n disabled={disabled}\n value={value ?? \"\"}\n position={\"item-aligned\"}\n name={pathPath}\n onChange={handleChange}\n label={\"Target collection\"}\n renderValue={(selected) => {\n const selectedCollection = collections.find(collection => collection.id === selected || collection.path === selected);\n if (!selectedCollection) return null;\n return (\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={selectedCollection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {selectedCollection?.name.toUpperCase()}\n </Typography>\n </div>)\n }}\n {...props}>\n\n {groups.flatMap((group) => (\n <SelectGroup label={group || \"Views\"}\n key={`group_${group}`}>\n {\n collections.filter(collection => collection.group === group)\n .map((collection) => {\n return <SelectItem\n key={`${collection.id ?? collection.path}-${group}`}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>\n ))}\n\n {ungroupedCollections && <SelectGroup label={\"Views\"}>\n {ungroupedCollections\n .map((collection) => {\n return <SelectItem key={collection.id ?? collection.path}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>}\n\n </Select>\n\n <FieldCaption>\n You can only edit the reference collection upon field\n creation.\n </FieldCaption>\n </>\n );\n}\n","import React from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, NumberProperty, StringProperty } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function DateTimePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n errors,\n touched,\n setFieldValue\n } = useFormex<StringProperty | NumberProperty>();\n\n const modePath = \"mode\";\n const modeValue: string | undefined = getIn(values, modePath);\n const modeError: string | undefined = getIn(touched, modePath) && getIn(errors, modePath);\n\n const autoValuePath = \"autoValue\";\n const autoValueValue: string | undefined = getIn(values, autoValuePath);\n const autoValueError: string | undefined = getIn(touched, autoValuePath) && getIn(errors, autoValuePath);\n\n return (\n <>\n <div className={\"flex flex-col col-span-12\"}>\n <Select name={modePath}\n value={modeValue ?? \"date\"}\n error={Boolean(modeError)}\n onValueChange={(v) => setFieldValue(modePath, v)}\n label={\"Mode\"}\n renderValue={(v) => {\n switch (v) {\n case \"date_time\":\n return \"Date/Time\";\n case \"date\":\n return \"Date\";\n default:\n return \"\";\n }\n }}\n disabled={disabled}>\n <SelectItem value={\"date_time\"}> Date/Time </SelectItem>\n <SelectItem value={\"date\"}> Date </SelectItem>\n </Select>\n <FieldCaption error={Boolean(modeError)}>\n {modeError}\n </FieldCaption>\n\n <Select name={autoValuePath}\n disabled={disabled}\n value={autoValueValue ?? \"\"}\n onValueChange={(v) => setFieldValue(autoValuePath, v === \"none\" ? null : v)}\n renderValue={(v) => {\n switch (v) {\n case \"on_create\":\n return \"On create\";\n case \"on_update\":\n return \"On any update\";\n default:\n return \"None\";\n }\n }}\n error={Boolean(autoValueError)}\n label={\"Automatic value\"}>\n <SelectItem value={\"none\"}> None </SelectItem>\n <SelectItem value={\"on_create\"}> On create </SelectItem>\n <SelectItem value={\"on_update\"}> On any update </SelectItem>\n </Select>\n <FieldCaption error={Boolean(autoValueError)}>\n {autoValueError ?? \"Update this field automatically when creating or updating the entity\"}\n </FieldCaption>\n\n </div>\n\n <div className={\"col-span-12\"}>\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n </div>\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps } from \"@firecms/formex\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function AdvancedPropertyValidation({ disabled }: {\n disabled: boolean\n}) {\n\n const columnWidth = \"columnWidth\";\n const hideFromCollection = \"hideFromCollection\";\n const readOnly = \"readOnly\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <div className={\"col-span-12\"}>\n <Field type=\"checkbox\" name={hideFromCollection}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Hide from collection\"}\n disabled={disabled}\n form={form}\n tooltip={\"Hide this field from the collection view. It will still be visible in the form view\"}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={readOnly}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Read only\"}\n disabled={disabled}\n tooltip={\"Is this a read only field. Display only as a preview\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\n\nexport function KeyValuePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import {\n ArrayProperty,\n BooleanProperty,\n DateProperty,\n MapProperty,\n mergeDeep,\n NumberProperty,\n Property,\n PropertyConfig,\n StringProperty\n} from \"@firecms/core\";\n\nexport function updatePropertyFromWidget(propertyData: any,\n selectedWidgetId: string | undefined,\n propertyConfigs: Record<string, PropertyConfig>): Property {\n\n let updatedProperty;\n if (selectedWidgetId === \"text_field\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"text_field\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multiline\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"multiline\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n multiline: true,\n storage: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"markdown\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"markdown\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: true,\n email: undefined,\n url: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"url\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"url\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: true,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"email\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"email\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: true,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: propertyData.enumValues ?? []\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"number_input\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_input\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: undefined\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: propertyData.enumValues ?? []\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"multi_number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"number\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: {\n storagePath: \"/\"\n }\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n storage: propertyData.of?.storage ?? {\n storagePath: \"/\"\n }\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"group\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"group\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: false,\n properties: propertyData.properties ?? {}\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"key_value\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"key_value\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: true,\n properties: undefined\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"reference\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"reference\",\n propertyConfig: \"reference\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies Property\n );\n } else if (selectedWidgetId === \"multi_references\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_references\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"reference\"\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"switch\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"boolean\",\n propertyConfig: \"switch\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies BooleanProperty\n );\n } else if (selectedWidgetId === \"date_time\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"date\",\n propertyConfig: \"date_time\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n mode: \"date_time\"\n } satisfies DateProperty\n );\n } else if (selectedWidgetId === \"repeat\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"repeat\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"block\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"block\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n oneOf: {\n properties: {}\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId && propertyConfigs[selectedWidgetId]) {\n updatedProperty = {\n ...propertyConfigs[selectedWidgetId].property,\n propertyConfig: selectedWidgetId\n };\n }\n\n return updatedProperty;\n}\n","import { PropertyConfigBadge, PropertyConfig } from \"@firecms/core\";\nimport { cls, SelectItem, Typography } from \"@firecms/ui\";\n\nexport interface PropertySelectItemProps {\n value: string;\n optionDisabled: boolean;\n propertyConfig: PropertyConfig;\n existing: boolean;\n}\n\nexport function PropertySelectItem({ value, optionDisabled, propertyConfig, existing }: PropertySelectItemProps) {\n return <SelectItem value={value}\n disabled={optionDisabled}\n className={\"flex flex-row items-center\"}>\n <div\n className={cls(\n \"flex flex-row items-center text-base min-h-[52px]\",\n optionDisabled ? \"w-full\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <div>\n <div>{propertyConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"max-w-sm\"}>\n {existing && optionDisabled ? \"You can only switch to widgets that use the same data type\" : propertyConfig.description}\n </Typography>\n </div>\n </div>\n </SelectItem>\n}\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { Select, SelectItem, TextField } from \"@firecms/ui\";\n\nexport function UrlPropertyField({\n disabled,\n showErrors\n }: {\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n const urlValue = getIn(values, \"url\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n if (value === \"[NONE]\")\n setFieldValue(\"url\", true);\n else\n setFieldValue(\"url\", value);\n }}\n label={\"Preview type\"}\n renderValue={(value: string) => {\n switch (value) {\n case \"image\":\n return \"Image\";\n case \"video\":\n return \"Video\";\n case \"audio\":\n return \"Audio\";\n default:\n return \"Display URL\";\n }\n }}\n value={urlValue ?? \"[NONE]\"}>\n <SelectItem value={\"[NONE]\"}>\n Display URL\n </SelectItem>\n <SelectItem value={\"image\"}>\n Image\n </SelectItem>\n <SelectItem value={\"video\"}>\n Video\n </SelectItem>\n <SelectItem value={\"audio\"}>\n Audio\n </SelectItem>\n </Select>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import { DEFAULT_FIELD_CONFIGS, PropertyConfigId, PropertyConfig } from \"@firecms/core\";\n\nexport const supportedFieldsIds: PropertyConfigId[] = [\n \"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference\",\n \"multi_references\",\n \"switch\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"block\"\n];\n\nexport const supportedFields: Record<string, PropertyConfig> = Object.entries(DEFAULT_FIELD_CONFIGS)\n .filter(([id]) => supportedFieldsIds.includes(id as PropertyConfigId))\n .map(([id, config]) => ({ [id]: config }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n","import React, { useDeferredValue, useEffect, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { Formex, FormexController, getIn, useCreateFormex } from \"@firecms/formex\";\nimport {\n DEFAULT_FIELD_CONFIGS,\n DeleteConfirmationDialog,\n PropertyConfigId,\n getFieldConfig,\n getFieldId,\n isPropertyBuilder,\n isValidRegExp,\n mergeDeep,\n Property,\n PropertyConfig,\n PropertyConfigBadge,\n} from \"@firecms/core\";\nimport {\n Button,\n cls,\n DeleteIcon,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n InfoLabel,\n Select,\n Typography\n} from \"@firecms/ui\";\nimport { EnumPropertyField } from \"./properties/EnumPropertyField\";\nimport { StoragePropertyField } from \"./properties/StoragePropertyField\";\nimport { MapPropertyField } from \"./properties/MapPropertyField\";\nimport { RepeatPropertyField } from \"./properties/RepeatPropertyField\";\nimport { CommonPropertyFields } from \"./properties/CommonPropertyFields\";\nimport { StringPropertyField } from \"./properties/StringPropertyField\";\nimport { BooleanPropertyField } from \"./properties/BooleanPropertyField\";\nimport { BlockPropertyField } from \"./properties/BlockPropertyField\";\nimport { NumberPropertyField } from \"./properties/NumberPropertyField\";\nimport { ReferencePropertyField } from \"./properties/ReferencePropertyField\";\nimport { DateTimePropertyField } from \"./properties/DateTimePropertyField\";\nimport { AdvancedPropertyValidation } from \"./properties/advanced/AdvancedPropertyValidation\";\nimport { editableProperty } from \"../../utils/entities\";\nimport { KeyValuePropertyField } from \"./properties/KeyValuePropertyField\";\nimport { updatePropertyFromWidget } from \"./utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"./PropertySelectItem\";\nimport { UrlPropertyField } from \"./properties/UrlPropertyField\";\nimport { supportedFields } from \"./utils/supported_fields\";\n\nexport type PropertyWithId = Property & {\n id?: string\n};\n\nexport type OnPropertyChangedParams = {\n id?: string,\n property: Property,\n namespace?: string,\n previousId?: string\n};\n\nexport type PropertyFormProps = {\n includeIdAndName?: boolean;\n existingProperty: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n inArray: boolean;\n propertyKey?: string;\n propertyNamespace?: string;\n property?: Property;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onPropertyChangedImmediate?: boolean;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n initialErrors?: Record<string, any>;\n existingPropertyKeys?: string[];\n forceShowErrors?: boolean;\n allowDataInference: boolean;\n getData?: () => Promise<object[]>;\n getController?: (formex: FormexController<PropertyWithId>) => void;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport const PropertyForm = React.memo(\n function PropertyForm(props: PropertyFormProps) {\n\n const {\n includeIdAndName = true,\n autoOpenTypeSelect,\n existingProperty,\n autoUpdateId,\n inArray,\n propertyKey,\n existingPropertyKeys,\n propertyNamespace,\n property,\n onPropertyChanged,\n onPropertyChangedImmediate = true,\n onDelete,\n onError,\n initialErrors,\n forceShowErrors,\n allowDataInference,\n getController,\n getData,\n propertyConfigs,\n collectionEditable\n } = props;\n\n const initialValue: PropertyWithId = {\n id: \"\",\n name: \"\"\n } as PropertyWithId;\n\n const disabled = (Boolean(property && !editableProperty(property)) && !collectionEditable);\n\n const lastSubmittedProperty = useRef<OnPropertyChangedParams | undefined>(property ? {\n id: propertyKey,\n previousId: propertyKey,\n property\n } : undefined);\n\n const doOnPropertyChanged = ({\n id,\n property\n }: OnPropertyChangedParams) => {\n const params = {\n id,\n previousId: lastSubmittedProperty.current?.id,\n property,\n namespace: propertyNamespace\n };\n lastSubmittedProperty.current = params;\n onPropertyChanged?.(params);\n };\n\n const formexController = useCreateFormex<PropertyWithId>({\n initialValues: property\n ? { id: propertyKey, ...property } as PropertyWithId\n : initialValue,\n initialErrors,\n validateOnChange: true,\n validateOnInitialRender: true,\n onSubmit: (newPropertyWithId, controller) => {\n console.debug(\"onSubmit\", newPropertyWithId);\n const {\n id,\n ...property\n } = newPropertyWithId;\n doOnPropertyChanged({\n id,\n property: { ...property, editable: property.editable ?? true }\n });\n if (!existingProperty)\n controller.resetForm({ values: initialValue });\n },\n validation: (values) => {\n const errors: Record<string, any> = {};\n if (includeIdAndName) {\n if (!values.name) {\n errors.name = \"Required\";\n } else {\n const nameError = validateName(values.name);\n if (nameError)\n errors.name = nameError;\n }\n if (!values.id) {\n errors.id = \"Required\";\n } else {\n const idError = validateId(values.id, existingPropertyKeys);\n if (idError)\n errors.id = idError;\n }\n }\n\n if (values.dataType === \"string\") {\n if (values.validation?.matches && !isValidRegExp(values.validation?.matches.toString())) {\n errors.validation = {\n matches: \"Invalid regular expression\"\n }\n }\n }\n if (values.dataType === \"reference\" && !values.path) {\n errors.path = \"You must specify a target collection for the field\";\n }\n if (values.propertyConfig === \"repeat\") {\n if (!(values as any).of) {\n errors.of = \"You need to specify a repeat field\";\n }\n }\n if (values.propertyConfig === \"block\") {\n if (!(values as any).oneOf) {\n errors.oneOf = \"You need to specify the properties of this block\";\n }\n }\n return errors;\n }\n });\n\n useEffect(() => {\n getController?.(formexController);\n }, [formexController, getController]);\n\n return <Formex value={formexController}>\n <PropertyEditFormFields\n onPropertyChanged={onPropertyChangedImmediate\n ? doOnPropertyChanged\n : undefined}\n onDelete={onDelete}\n includeIdAndTitle={includeIdAndName}\n propertyNamespace={propertyNamespace}\n onError={onError}\n showErrors={forceShowErrors || formexController.submitCount > 0}\n existing={existingProperty}\n autoUpdateId={autoUpdateId}\n inArray={inArray}\n autoOpenTypeSelect={autoOpenTypeSelect}\n disabled={disabled}\n getData={getData}\n allowDataInference={allowDataInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n {...formexController}/>\n </Formex>;\n }, (a, b) =>\n a.getData === b.getData &&\n a.propertyKey === b.propertyKey &&\n a.propertyNamespace === b.propertyNamespace &&\n a.includeIdAndName === b.includeIdAndName &&\n a.autoOpenTypeSelect === b.autoOpenTypeSelect &&\n a.autoUpdateId === b.autoUpdateId &&\n a.existingPropertyKeys === b.existingPropertyKeys &&\n a.existingProperty === b.existingProperty\n);\n\nexport function PropertyFormDialog({\n open,\n onCancel,\n onOkClicked,\n onPropertyChanged,\n getData,\n collectionEditable,\n ...formProps\n }: PropertyFormProps & {\n open?: boolean;\n onOkClicked?: () => void;\n onCancel?: () => void;\n}) {\n const formexRef = useRef<FormexController<PropertyWithId>>();\n const getController = (helpers: FormexController<PropertyWithId>) => {\n formexRef.current = helpers;\n };\n\n return <Dialog\n open={open ?? false}\n maxWidth={\"xl\"}\n fullWidth={true}\n >\n <form noValidate={true}\n autoComplete={\"off\"}\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n formexRef.current?.handleSubmit(e)\n }}>\n <DialogContent>\n <PropertyForm {...formProps}\n onPropertyChanged={(params) => {\n onPropertyChanged?.(params);\n onOkClicked?.();\n }}\n collectionEditable={collectionEditable}\n onPropertyChangedImmediate={false}\n getController={getController}\n getData={getData}\n />\n </DialogContent>\n\n <DialogActions>\n\n {onCancel && <Button\n variant={\"text\"}\n onClick={() => {\n onCancel();\n formexRef.current?.resetForm();\n }}>\n Cancel\n </Button>}\n\n <Button variant=\"outlined\"\n type={\"submit\"}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n </form>\n </Dialog>;\n\n}\n\nfunction PropertyEditFormFields({\n values,\n errors,\n setValues,\n existing,\n autoUpdateId = false,\n autoOpenTypeSelect,\n includeIdAndTitle,\n onPropertyChanged,\n onDelete,\n propertyNamespace,\n onError,\n showErrors,\n disabled,\n inArray,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n includeIdAndTitle?: boolean;\n existing: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n propertyNamespace?: string;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n showErrors: boolean;\n inArray: boolean;\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n} & FormexController<PropertyWithId>) {\n\n const [selectOpen, setSelectOpen] = useState(autoOpenTypeSelect);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [selectedFieldConfigId, setSelectedFieldConfigId] = useState<string | undefined>(values?.dataType ? getFieldId(values) : undefined);\n\n const allSupportedFields = Object.entries(supportedFields).concat(Object.entries(propertyConfigs));\n\n const displayedWidgets = inArray\n ? allSupportedFields.filter(([_, propertyConfig]) => !isPropertyBuilder(propertyConfig.property) && propertyConfig.property?.dataType !== \"array\")\n : allSupportedFields;\n\n const deferredValues = useDeferredValue(values);\n const nameFieldRef = useRef<HTMLInputElement>(null);\n\n const lastSubmittedProperty = useRef<object>(values);\n\n const selectedWidgetError = showErrors && getIn(errors, \"selectedWidget\");\n\n useEffect(() => {\n if (onPropertyChanged) {\n if ((!includeIdAndTitle || deferredValues.id)) {\n const {\n id,\n ...property\n } = deferredValues;\n if (!equal(deferredValues, lastSubmittedProperty.current)) {\n onPropertyChanged({\n id,\n property,\n namespace: propertyNamespace\n });\n lastSubmittedProperty.current = deferredValues;\n }\n }\n }\n }, [deferredValues, includeIdAndTitle, propertyNamespace]);\n\n useEffect(() => {\n if (values?.id && onError) {\n onError(values?.id, propertyNamespace, errors);\n }\n }, [errors, propertyNamespace, values?.id]);\n\n const onWidgetSelectChanged = (newSelectedWidgetId: PropertyConfigId) => {\n setSelectedFieldConfigId(newSelectedWidgetId);\n setValues(updatePropertyFromWidget(values, newSelectedWidgetId, propertyConfigs));\n // Ugly hack to autofocus the name field\n setTimeout(() => {\n nameFieldRef.current?.focus();\n }, 0);\n };\n\n let childComponent;\n if (selectedFieldConfigId === \"text_field\" ||\n selectedFieldConfigId === \"multiline\" ||\n selectedFieldConfigId === \"markdown\" ||\n selectedFieldConfigId === \"email\") {\n childComponent =\n <StringPropertyField widgetId={selectedFieldConfigId}\n disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"url\") {\n childComponent =\n <UrlPropertyField disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"select\" ||\n selectedFieldConfigId === \"number_select\") {\n childComponent = <EnumPropertyField\n multiselect={false}\n allowDataInference={allowDataInference}\n updateIds={!existing}\n disabled={disabled}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"multi_select\" ||\n selectedFieldConfigId === \"multi_number_select\") {\n childComponent = <EnumPropertyField\n multiselect={true}\n updateIds={!existing}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"switch\") {\n childComponent = <BooleanPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"number_input\") {\n childComponent = <NumberPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"group\") {\n childComponent =\n <MapPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"block\") {\n childComponent =\n <BlockPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"reference\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"date_time\") {\n childComponent = <DateTimePropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_references\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"repeat\") {\n childComponent =\n <RepeatPropertyField showErrors={showErrors}\n existing={existing}\n getData={getData}\n allowDataInference={allowDataInference}\n disabled={disabled}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"key_value\") {\n childComponent =\n <KeyValuePropertyField disabled={disabled}/>;\n } else {\n childComponent = null;\n }\n\n return (\n <>\n {disabled && <InfoLabel mode={\"warn\"}>\n <Typography>This property can&apos;t be edited</Typography>\n <Typography variant={\"caption\"}>\n You may not have permission to\n edit it or it is defined in code with no <code>editable</code> flag\n </Typography>\n </InfoLabel>}\n\n <div className=\"flex mt-2 justify-between\">\n <div className={\"w-full flex flex-col gap-2\"}>\n <Select\n // className={\"w-full\"}\n error={Boolean(selectedWidgetError)}\n value={selectedFieldConfigId ?? \"\"}\n placeholder={\"Select a property widget\"}\n open={selectOpen}\n onOpenChange={setSelectOpen}\n position={\"item-aligned\"}\n disabled={disabled}\n renderValue={(value) => {\n if (!value) {\n return <em>Select a property\n widget</em>;\n }\n const key = value as PropertyConfigId;\n const propertyConfig = DEFAULT_FIELD_CONFIGS[key] ?? propertyConfigs[key];\n const baseProperty = propertyConfig.property;\n const baseFieldConfig = baseProperty && !isPropertyBuilder(baseProperty) ? getFieldConfig(baseProperty, propertyConfigs) : undefined;\n const optionDisabled = isPropertyBuilder(baseProperty) || (existing && baseProperty.dataType !== values?.dataType);\n const computedFieldConfig = baseFieldConfig ? mergeDeep(baseFieldConfig, propertyConfig) : propertyConfig;\n return <div\n onClick={(e) => {\n if (optionDisabled) {\n e.stopPropagation();\n e.preventDefault();\n }\n }}\n className={cls(\n \"flex items-center\",\n optionDisabled ? \"w-full pointer-events-none opacity-50\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={computedFieldConfig}/>\n </div>\n <div className={\"flex flex-col items-start text-base text-left\"}>\n <div>{computedFieldConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}>\n {optionDisabled ? \"You can only switch to widgets that use the same data type\" : computedFieldConfig.description}\n </Typography>\n </div>\n </div>\n }}\n onValueChange={(value) => {\n onWidgetSelectChanged(value as PropertyConfigId);\n }}>\n {displayedWidgets.map(([key, propertyConfig]) => {\n const baseProperty = propertyConfig.property;\n const optionDisabled = existing && !isPropertyBuilder(baseProperty) && baseProperty.dataType !== values?.dataType;\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={optionDisabled}\n propertyConfig={propertyConfig}\n existing={existing}/>;\n })}\n </Select>\n\n {selectedWidgetError &&\n <Typography variant=\"caption\"\n className={\"ml-3.5\"}\n color={\"error\"}>Required</Typography>}\n\n {/*<Typography variant=\"caption\" className={\"ml-3.5\"}>Define your own custom properties and*/}\n {/* components</Typography>*/}\n\n </div>\n\n {onDelete && values?.id &&\n <IconButton\n variant={\"ghost\"}\n className=\"m-4\"\n disabled={disabled}\n onClick={() => setDeleteDialogOpen(true)}>\n <DeleteIcon/>\n </IconButton>}\n </div>\n\n <div className={\"grid grid-cols-12 gap-y-12 mt-8 mb-8\"}>\n {includeIdAndTitle &&\n <CommonPropertyFields showErrors={showErrors}\n disabledId={existing}\n isNewProperty={!existing}\n disabled={disabled}\n autoUpdateId={autoUpdateId}\n ref={nameFieldRef}/>}\n\n {childComponent}\n\n <div className={\"col-span-12\"}>\n <AdvancedPropertyValidation disabled={disabled}/>\n </div>\n </div>\n\n {onDelete &&\n <DeleteConfirmationDialog open={deleteDialogOpen}\n onAccept={() => onDelete(values?.id, propertyNamespace)}\n onCancel={() => setDeleteDialogOpen(false)}\n title={<div>Delete this property?</div>}\n body={\n <div> This will <b>not delete any\n data</b>, only modify the\n collection.</div>\n }/>}\n\n </>\n );\n}\n\nconst idRegEx = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nfunction validateId(value?: string, existingPropertyKeys?: string[]) {\n\n let error;\n if (!value) {\n error = \"You must specify an id for the field\";\n }\n if (value && !value.match(idRegEx)) {\n error = \"The id can only contain letters, numbers and underscores (_), and not start with a number\";\n }\n if (value && existingPropertyKeys && existingPropertyKeys.includes(value)) {\n error = \"There is another field with this ID already\";\n }\n return error;\n}\n\nfunction validateName(value: string) {\n let error;\n if (!value) {\n error = \"You must specify a title for the field\";\n }\n return error;\n}\n","export function camelCase(str: string): string {\n if (!str) return \"\";\n return (str.slice(0, 1).toLowerCase() + str.slice(1))\n .replace(/([-_ ]){1,}/g, \" \")\n .split(/[-_ ]/)\n .reduce((cur, acc) => {\n return cur + acc[0].toUpperCase() + acc.substring(1);\n }, \"\");\n}\n","import { EntityCollection, useSnackbarController } from \"@firecms/core\";\nimport { Button, ContentCopyIcon, Dialog, DialogActions, DialogContent, Typography, } from \"@firecms/ui\";\nimport React from \"react\";\nimport JSON5 from \"json5\";\nimport { Highlight, themes } from \"prism-react-renderer\"\nimport { camelCase } from \"./utils/strings\";\n\nexport function GetCodeDialog({\n collection,\n onOpenChange,\n open\n }: { onOpenChange: (open: boolean) => void, collection: any, open: any }) {\n\n const snackbarController = useSnackbarController();\n\n const code = collection\n ? \"import { EntityCollection } from \\\"firecms\\\";\\n\\nconst \" + (collection?.name ? camelCase(collection.name) : \"my\") + \"Collection:EntityCollection = \" + JSON5.stringify(collectionToCode(collection), null, \"\\t\")\n : \"No collection selected\";\n return <Dialog open={open}\n onOpenChange={onOpenChange}\n maxWidth={\"4xl\"}>\n <DialogContent>\n <Typography variant={\"h6\"} className={\"my-4\"}>\n Code for {collection.name}\n </Typography>\n <Typography variant={\"body2\"} className={\"my-4 mb-8\"}>\n If you want to customise the collection in code, you can add this collection code to your CMS\n app configuration.\n More info in the <a\n rel=\"noopener noreferrer\"\n href={\"https://firecms.co/docs/customization_quickstart\"}>docs</a>.\n </Typography>\n <Highlight\n theme={themes.vsDark}\n code={code}\n language=\"typescript\"\n >\n {({\n className,\n style,\n tokens,\n getLineProps,\n getTokenProps\n }) => (\n <pre style={style} className={\"p-4 rounded text-sm\"}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n\n </DialogContent>\n <DialogActions>\n <Button\n variant={\"text\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n snackbarController.open({\n type: \"success\",\n message: `Copied`\n })\n return navigator.clipboard.writeText(code);\n }}>\n <ContentCopyIcon size={\"small\"}/>\n Copy to clipboard\n </Button>\n <Button onClick={() => onOpenChange(false)}>Close</Button>\n </DialogActions>\n </Dialog>;\n}\n\nfunction collectionToCode(collection: EntityCollection): object {\n\n const propertyCleanup = (property: any) => {\n\n const updatedProperty = {\n ...property\n };\n\n delete updatedProperty.fromBuilder;\n delete updatedProperty.resolved;\n delete updatedProperty.propertiesOrder;\n delete updatedProperty.editable;\n\n if (updatedProperty.type === \"map\") {\n return {\n ...updatedProperty,\n properties: updatedProperty.properties.map(propertyCleanup)\n }\n }\n return updatedProperty;\n }\n\n return {\n id: collection.id,\n name: collection.name,\n singularName: collection.singularName,\n path: collection.path,\n description: collection.description,\n editable: true,\n collectionGroup: collection.collectionGroup,\n icon: collection.icon,\n group: collection.group,\n customId: collection.customId,\n initialFilter: collection.initialFilter,\n initialSort: collection.initialSort,\n properties: Object.entries(collection.properties ?? {})\n .map(([key, value]) => ({\n [key]: propertyCleanup(value)\n }))\n .reduce((a, b) => ({ ...a, ...b }), {}),\n subcollections: (collection.subcollections ?? []).map(collectionToCode)\n }\n\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport {\n EntityCollection,\n ErrorBoundary,\n isPropertyBuilder,\n makePropertiesEditable,\n Properties,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n useLargeLayout,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n AddIcon,\n AutoAwesomeIcon,\n Button,\n CircularProgress,\n cls,\n CodeIcon,\n DebouncedTextField,\n defaultBorderMixin,\n IconButton,\n Paper,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\n\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"./util\";\nimport { OnPropertyChangedParams, PropertyForm, PropertyFormDialog } from \"./PropertyEditView\";\nimport { PropertyTree } from \"./PropertyTree\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { GetCodeDialog } from \"./GetCodeDialog\";\n\ntype CollectionEditorFormProps = {\n showErrors: boolean;\n isNewCollection: boolean;\n propertyErrorsRef?: React.MutableRefObject<any>;\n onPropertyError: (propertyKey: string, namespace: string | undefined, error?: Record<string, any>) => void;\n setDirty?: (dirty: boolean) => void;\n reservedGroups?: string[];\n extraIcon: React.ReactNode;\n getUser?: (uid: string) => User | null;\n getData?: () => Promise<object[]>;\n doCollectionInference: (collection: PersistedCollection) => Promise<Partial<EntityCollection> | null> | undefined;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport function CollectionPropertiesEditorForm({\n showErrors,\n isNewCollection,\n propertyErrorsRef,\n onPropertyError,\n setDirty,\n reservedGroups,\n extraIcon,\n getUser,\n getData,\n doCollectionInference,\n propertyConfigs,\n collectionEditable\n }: CollectionEditorFormProps) {\n\n const {\n values,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n errors,\n dirty\n } = useFormex<PersistedCollection>();\n\n const snackbarController = useSnackbarController();\n\n const largeLayout = useLargeLayout();\n const asDialog = !largeLayout\n\n // index of the selected property within the namespace\n const [selectedPropertyIndex, setSelectedPropertyIndex] = useState<number | undefined>();\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n const [codeDialogOpen, setCodeDialogOpen] = useState<boolean>(false);\n\n const [inferringProperties, setInferringProperties] = useState<boolean>(false);\n\n const [newPropertyDialogOpen, setNewPropertyDialogOpen] = useState<boolean>(false);\n const [inferredPropertyKeys, setInferredPropertyKeys] = useState<string[]>([]);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n useEffect(() => {\n if (setDirty)\n setDirty(dirty);\n }, [dirty]);\n\n const inferPropertiesFromData = doCollectionInference\n ? (): void => {\n if (!doCollectionInference)\n return;\n\n setInferringProperties(true);\n // @ts-ignore\n doCollectionInference(values)\n .then((newCollection) => {\n\n if (newCollection)\n makePropertiesEditable(newCollection.properties as Properties);\n\n if (!newCollection) {\n snackbarController.open({\n type: \"error\",\n message: \"Could not infer properties from data\"\n });\n return;\n }\n // find properties in the new collection, not present in the current one\n const newPropertyKeys = (newCollection.properties ? Object.keys(newCollection.properties) : [])\n .filter((propertyKey) => !values.properties[propertyKey]);\n if (newPropertyKeys.length === 0) {\n snackbarController.open({\n type: \"info\",\n message: \"No new properties found in existing data\"\n });\n return;\n }\n // add them to the current collection\n const updatedProperties = {\n ...newPropertyKeys.reduce((acc, propertyKey) => {\n acc[propertyKey] = (newCollection.properties ?? {})[propertyKey];\n return acc;\n }, {} as {\n [key: string]: PropertyOrBuilder\n }),\n ...values.properties\n };\n const updatedPropertiesOrder = [\n ...newPropertyKeys,\n ...(values.propertiesOrder ?? [])\n ];\n setFieldValue(\"properties\", updatedProperties, false);\n\n updatePropertiesOrder(updatedPropertiesOrder);\n\n setInferredPropertyKeys(newPropertyKeys);\n })\n .finally(() => {\n setInferringProperties(false);\n })\n }\n : undefined;\n\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"] ?? getIn(values, namespaceToPropertiesOrderPath());\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n };\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n const deleteProperty = (propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(idToPropertiesPath(fullId), undefined, false);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n if (currentPropertiesOrder) {\n const newPropertiesOrder = currentPropertiesOrder.filter((p) => p !== propertyKey);\n updatePropertiesOrder(newPropertiesOrder, namespace);\n }\n\n setNewPropertyDialogOpen(false);\n\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n const onPropertyCreated = ({\n id,\n property\n }: {\n id?: string,\n property: Property\n }) => {\n if (!id) {\n throw Error(\"Need to include an ID when creating a new property\")\n }\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const newPropertiesOrder = [...(values.propertiesOrder ?? Object.keys(values.properties)), id];\n updatePropertiesOrder(newPropertiesOrder);\n\n setNewPropertyDialogOpen(false);\n if (largeLayout) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n console.debug(\"onPropertyChanged, id change\", {\n id,\n property,\n previousId,\n namespace\n })\n\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n if (id) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n console.debug(\"onPropertyChanged\", {\n id,\n property,\n previousId,\n namespace,\n propertyPath\n })\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n\n };\n\n const onPropertyErrorInternal = (id: string, namespace?: string, error?: Record<string, any>) => {\n const propertyPath = id ? getFullId(id, namespace) : undefined;\n console.debug(\"onPropertyErrorInternal\", {\n id,\n namespace,\n error,\n propertyPath\n });\n if (propertyPath) {\n const hasError = error && Object.keys(error).length > 0;\n onPropertyError(id, namespace, hasError ? error : undefined);\n setFieldError(idToPropertiesPath(propertyPath), hasError ? \"Property error\" : undefined);\n }\n }\n\n const closePropertyDialog = () => {\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n };\n\n const initialErrors = selectedPropertyKey && propertyErrorsRef?.current?.properties ? propertyErrorsRef.current.properties[selectedPropertyKey] : undefined;\n\n const emptyCollection = values?.propertiesOrder === undefined || values.propertiesOrder.length === 0;\n\n const usedPropertiesOrder = (values.propertiesOrder\n ? values.propertiesOrder\n : Object.keys(values.properties)) as string[];\n\n const owner = useMemo(() => values.ownerId && getUser ? getUser(values.ownerId) : null, [getUser, values.ownerId]);\n\n const onPropertyClick = (propertyKey: string, namespace?: string) => {\n console.debug(\"CollectionEditor: onPropertyClick\", {\n propertyKey,\n namespace\n });\n setSelectedPropertyIndex(usedPropertiesOrder.indexOf(propertyKey));\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n };\n\n const body = (\n <div className={\"grid grid-cols-12 gap-2 h-full bg-gray-50 dark:bg-gray-900\"}>\n <div className={cls(\n \"p-4 md:p-8 pb-20 md:pb-20\",\n \"col-span-12 lg:col-span-5 h-full overflow-auto\",\n !asDialog && \"border-r \" + defaultBorderMixin\n )}>\n\n <div className=\"flex my-2\">\n\n <div className=\"flex-grow mb-4\">\n\n <Field\n name={\"name\"}\n as={DebouncedTextField}\n invisible={true}\n className=\"-ml-1\"\n inputClassName=\"text-2xl font-headers\"\n placeholder={\"Collection name\"}\n size={\"small\"}\n required\n error={Boolean(errors?.name)}/>\n\n {owner &&\n <Typography variant={\"body2\"}\n className={\"ml-2\"}\n color={\"secondary\"}>\n Created by {owner.displayName}\n </Typography>}\n </div>\n\n {extraIcon && <div className=\"ml-4\">\n {extraIcon}\n </div>}\n\n <div className=\"ml-1 mt-2 flex flex-row gap-2\">\n <Tooltip title={\"Get the code for this collection\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={() => setCodeDialogOpen(true)}>\n <CodeIcon/>\n </IconButton>\n </Tooltip>\n {inferPropertiesFromData && <Tooltip title={\"Add new properties based on data\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={inferPropertiesFromData}>\n {inferringProperties ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n </IconButton>\n </Tooltip>}\n <Tooltip title={\"Add new property\"}>\n <Button\n variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}>\n <AddIcon/>\n </Button>\n </Tooltip>\n </div>\n </div>\n\n <ErrorBoundary>\n <PropertyTree\n className={\"pl-8\"}\n inferredPropertyKeys={inferredPropertyKeys}\n selectedPropertyKey={selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined}\n properties={values.properties}\n additionalFields={values.additionalFields}\n propertiesOrder={usedPropertiesOrder}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={isNewCollection ? deleteProperty : undefined}\n collectionEditable={collectionEditable}\n errors={errors}/>\n </ErrorBoundary>\n\n <Button className={\"mt-8 w-full\"}\n color=\"primary\"\n variant={\"outlined\"}\n size={\"large\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}>\n Add new property\n </Button>\n </div>\n\n {!asDialog &&\n <div className={\"col-span-12 lg:col-span-7 p-4 md:py-8 md:px-4 h-full overflow-auto pb-20 md:pb-20\"}>\n <Paper\n className=\"sticky top-8 p-4 min-h-full border border-transparent w-full flex flex-col justify-center \">\n\n {selectedPropertyFullId &&\n selectedProperty &&\n !isPropertyBuilder(selectedProperty) &&\n <PropertyForm\n inArray={false}\n key={`edit_view_${selectedPropertyIndex}`}\n existingProperty={!isNewCollection}\n autoUpdateId={false}\n allowDataInference={!isNewCollection}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />}\n\n {!selectedProperty &&\n <div className={\"w-full flex flex-col items-center justify-center h-full gap-4\"}>\n <Typography variant={\"label\"} className=\"\">\n {emptyCollection\n ? \"Now you can add your first property\"\n : \"Select a property to edit it\"}\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n >\n <AddIcon/>\n Add new property\n </Button>\n </div>}\n\n {selectedProperty && isPropertyBuilder(selectedProperty) &&\n <Typography variant={\"label\"} className=\"flex items-center justify-center\">\n {\"This property is defined as a property builder in code\"}\n </Typography>}\n </Paper>\n </div>}\n\n {asDialog && <PropertyFormDialog\n inArray={false}\n open={selectedPropertyIndex !== undefined}\n key={`edit_view_${selectedPropertyIndex}`}\n autoUpdateId={!selectedProperty}\n allowDataInference={!isNewCollection}\n existingProperty={true}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n onOkClicked={asDialog\n ? closePropertyDialog\n : undefined\n }/>}\n\n </div>);\n\n return (<>\n\n {body}\n\n {/* This is the dialog used for new properties*/}\n <PropertyFormDialog\n inArray={false}\n existingProperty={false}\n autoOpenTypeSelect={true}\n autoUpdateId={true}\n forceShowErrors={showErrors}\n open={newPropertyDialogOpen}\n onCancel={() => setNewPropertyDialogOpen(false)}\n onPropertyChanged={onPropertyCreated}\n getData={getData}\n allowDataInference={!isNewCollection}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n existingPropertyKeys={values.propertiesOrder as string[]}/>\n\n <ErrorBoundary>\n <GetCodeDialog\n collection={values}\n open={codeDialogOpen}\n onOpenChange={setCodeDialogOpen}/>\n </ErrorBoundary>\n </>\n );\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogContent>\n <Typography variant={\"h6\"}>\n {title ?? \"Unsaved changes\"}\n </Typography>\n\n {body && <Typography>\n {body}\n </Typography>}\n <Typography>\n Are you sure?\n </Typography>\n\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import { useCustomizationController } from \"@firecms/core\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport React from \"react\";\n\nexport function EntityCustomViewsSelectDialog({ open, onClose }: { open: boolean, onClose: (selectedViewKey?: string) => void }) {\n const {\n entityViews,\n } = useCustomizationController();\n\n return <Dialog\n maxWidth={\"md\"}\n open={open}>\n <DialogContent className={\"flex flex-col gap-4\"}>\n <Typography variant={\"h6\"}>\n Select view\n </Typography>\n {entityViews?.map((view) => {\n return <Button\n key={view.key}\n onClick={() => onClose(view.key)}\n fullWidth\n variant={\"text\"}\n >\n {view.name} ({view.key})\n </Button>;\n })}\n {(entityViews ?? []).length === 0 &&\n <Typography variant={\"body2\"}>\n No custom views defined\n </Typography>\n }\n </DialogContent>\n <DialogActions>\n <Button variant={\"outlined\"} onClick={() => onClose()}>Cancel</Button>\n </DialogActions>\n </Dialog>\n}\n","import React from \"react\";\nimport {\n DeleteConfirmationDialog,\n EntityCollection,\n EntityCustomView,\n resolveEntityView,\n useCustomizationController,\n User\n} from \"@firecms/core\";\nimport {\n AddIcon,\n Alert,\n Button,\n Container,\n DeleteIcon,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { CollectionEditorDialog } from \"./CollectionEditorDialog\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { EntityCustomViewsSelectDialog } from \"./EntityCustomViewsSelectDialog\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function SubcollectionsEditTab({\n collection,\n parentCollection,\n configController,\n collectionInference,\n getUser,\n parentCollectionIds\n }: {\n collection: PersistedCollection,\n parentCollection?: EntityCollection,\n configController: CollectionsConfigController;\n collectionInference?: CollectionInference;\n getUser?: (uid: string) => User | null;\n parentCollectionIds?: string[];\n}) {\n\n const { entityViews: contextEntityViews } = useCustomizationController();\n\n const [subcollectionToDelete, setSubcollectionToDelete] = React.useState<string | undefined>();\n const [addEntityViewDialogOpen, setAddEntityViewDialogOpen] = React.useState<boolean>(false);\n const [viewToDelete, setViewToDelete] = React.useState<string | undefined>();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n editedCollectionId?: string,\n }>();\n\n const {\n values,\n setFieldValue,\n } = useFormex<EntityCollection>();\n\n const subcollections = collection.subcollections ?? [];\n const resolvedEntityViews = values.entityViews?.filter(e => typeof e === \"string\")\n .map(e => resolveEntityView(e, contextEntityViews))\n .filter(Boolean) as EntityCustomView[] ?? [];\n const hardCodedEntityViews = collection.entityViews?.filter(e => typeof e !== \"string\") as EntityCustomView[] ?? [];\n const totalEntityViews = resolvedEntityViews.length + hardCodedEntityViews.length;\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"2xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n <div className={\"flex flex-col gap-16\"}>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Subcollections of {values.name}\n </Typography>\n\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n {subcollections && subcollections.length > 0 && <Table>\n <TableBody>\n {subcollections.map((subcollection) => (\n <TableRow key={subcollection.path}\n onClick={() => setCurrentDialog({\n isNewCollection: false,\n editedCollectionId: subcollection.id\n })}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {subcollection.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setSubcollectionToDelete(subcollection.id);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>}\n\n <Button\n onClick={() => {\n setCurrentDialog({\n isNewCollection: true\n });\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add subcollection\n </Button>\n\n </Paper>\n\n </div>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Custom views\n </Typography>\n\n {totalEntityViews === 0 &&\n <Alert action={<Button variant=\"text\"\n size={\"small\"}\n href={\"https://firecms.co/docs/cloud/quickstart\"}\n component={\"a\"}\n rel=\"noopener noreferrer\"\n target=\"_blank\">More info</Button>}>\n Define your own custom views by uploading them with the CLI.\n </Alert>\n }\n\n {<>\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n <Table>\n <TableBody>\n {resolvedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setViewToDelete(view.key);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n {hardCodedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n <Typography variant={\"caption\"} className={\"flex-grow\"}>\n This view is defined in code with\n key <code>{view.key}</code>\n </Typography>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n <Button\n onClick={() => {\n setAddEntityViewDialogOpen(true);\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add custom entity view\n </Button>\n </Paper>\n\n </>}\n\n\n </div>\n\n </div>\n </Container>\n\n <div style={{ height: \"52px\" }}/>\n\n {subcollectionToDelete &&\n <DeleteConfirmationDialog open={Boolean(subcollectionToDelete)}\n onAccept={() => {\n const props = {\n id: subcollectionToDelete,\n parentCollectionIds: [...(parentCollectionIds ?? []), collection.id]\n };\n console.debug(\"Deleting subcollection\", props)\n configController.deleteCollection(props);\n setSubcollectionToDelete(undefined);\n }}\n onCancel={() => setSubcollectionToDelete(undefined)}\n title={<>Delete this subcollection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>}\n {viewToDelete &&\n <DeleteConfirmationDialog open={Boolean(viewToDelete)}\n onAccept={() => {\n setFieldValue(\"entityViews\", values.entityViews?.filter(e => e !== viewToDelete));\n setViewToDelete(undefined);\n }}\n onCancel={() => setViewToDelete(undefined)}\n title={<>Remove this view?</>}\n body={<>This will <b>not\n delete any data</b>, only\n the view in the CMS</>}/>}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={configController}\n parentCollection={collection}\n collectionInference={collectionInference}\n parentCollectionIds={[...parentCollectionIds ?? [], values.id]}\n isNewCollection={false}\n {...currentDialog}\n getUser={getUser}\n handleClose={() => {\n setCurrentDialog(undefined);\n }}/>\n\n <EntityCustomViewsSelectDialog\n open={addEntityViewDialogOpen}\n onClose={(selectedViewKey) => {\n if (selectedViewKey) {\n setFieldValue(\"entityViews\", [...(values.entityViews ?? []), selectedViewKey]);\n }\n setAddEntityViewDialogOpen(false);\n }}/>\n </div>\n );\n}\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const productsCollectionTemplate: EntityCollection = {\n id: \"products\",\n path: \"products\",\n name: \"Products\",\n singularName: \"Product\",\n icon: \"shopping_cart\",\n description: \"List of the products currently sold in your shop\",\n properties: makePropertiesEditable({\n name: {\n dataType: \"string\",\n name: \"Name\",\n description: \"Name of this product\",\n validation: {\n required: true\n }\n },\n brand: {\n dataType: \"string\",\n name: \"Brand\",\n validation: {\n required: true\n }\n },\n description: {\n dataType: \"string\",\n name: \"Description\",\n description: \"Description of this product, supports markdown\",\n markdown: true\n },\n main_image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n },\n description: \"Upload field for images\"\n },\n available: {\n dataType: \"boolean\",\n name: \"Available\",\n columnWidth: 100,\n description: \"Is this product available in the website\"\n },\n price: {\n dataType: \"number\",\n name: \"Price\",\n validation: {\n requiredMessage: \"You must set a positive price\",\n min: 0\n }\n },\n images: {\n dataType: \"array\",\n name: \"Images\",\n hideFromCollection: true,\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n },\n related_products: {\n dataType: \"array\",\n name: \"Related products\",\n description: \"Products related to this one\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n metadata: {\n name: \"Metadata\",\n description: \"This is an example of a map property\",\n dataType: \"map\",\n keyValue: true\n },\n added_on: {\n dataType: \"date\",\n name: \"Added on\",\n autoValue: \"on_create\"\n }\n })\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const blogCollectionTemplate:EntityCollection = {\n id: \"blog\",\n path: \"blog\",\n name: \"Blog\",\n singularName: \"Blog entry\",\n icon: \"article\",\n description: \"A collection of blog entries\",\n defaultSize: \"l\",\n properties: makePropertiesEditable({\n name: {\n name: \"Name\",\n validation: { required: true },\n dataType: \"string\"\n },\n header_image: {\n name: \"Header image\",\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n content: {\n name: \"Content\",\n description: \"Content blocks for the blog entry\",\n validation: { required: true },\n dataType: \"array\",\n oneOf: {\n typeField: \"type\",\n valueField: \"value\",\n properties: {\n text: {\n dataType: \"string\",\n name: \"Text\",\n markdown: true\n },\n quote: {\n dataType: \"string\",\n name: \"Quote\",\n multiline: true\n },\n images: {\n name: \"Images\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n description: \"This fields allows uploading multiple images at once and reordering\"\n },\n products: {\n name: \"Products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\",\n previewProperties: [\"name\", \"main_image\"]\n }\n }\n },\n propertiesOrder: [\"text\", \"quote\", \"images\", \"products\"]\n }\n },\n created_on: {\n name: \"Created on\",\n dataType: \"date\",\n autoValue: \"on_create\"\n },\n status: {\n name: \"Status\",\n validation: { required: true },\n dataType: \"string\",\n enumValues: {\n published: {\n id: \"published\",\n label: \"Published\",\n },\n draft: \"Draft\"\n },\n defaultValue: \"draft\"\n },\n publish_date: {\n name: \"Publish date\",\n dataType: \"date\",\n clearable: true\n },\n reviewed: {\n name: \"Reviewed\",\n dataType: \"boolean\"\n },\n tags: {\n name: \"Tags\",\n description: \"Example of generic array\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n previewAsTag: true\n }\n }\n }),\n initialFilter: {\n status: [\"==\", \"published\"]\n }\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const usersCollectionTemplate: EntityCollection = {\n id: \"users\",\n path: \"users\",\n name: \"Users\",\n singularName: \"User\",\n description: \"Registered users in the app/web\",\n icon: \"person\",\n properties: makePropertiesEditable({\n displayName: {\n name: \"Display name\",\n dataType: \"string\"\n },\n email: {\n name: \"Email\",\n dataType: \"string\",\n email: true\n },\n emailVerified: {\n name: \"Email verified\",\n dataType: \"boolean\"\n },\n phone: {\n name: \"Phone\",\n dataType: \"string\"\n },\n favourite_products: {\n name: \"Favourite products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n photoURL: {\n name: \"Photo URL\",\n dataType: \"string\",\n url: \"image\"\n }\n }),\n};\n","import { EntityCollection } from \"@firecms/core\";\n\nexport const pagesCollectionTemplate: EntityCollection = {\n id: \"pages\",\n path: \"pages\",\n name: \"Pages\",\n singularName: \"Page\",\n icon: \"insert_drive_file\",\n description: \"List of website pages that can be edited here\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Page Title\",\n validation: { required: true }\n },\n slug: {\n dataType: \"string\",\n name: \"URL Slug\",\n validation: {\n required: true,\n unique: true,\n matches: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n matchesMessage: \"Must be lowercase, alphanumeric, and hyphenated\"\n }\n },\n hero_section: {\n dataType: \"map\",\n name: \"Hero Section\",\n properties: {\n headline: {\n dataType: \"string\",\n name: \"Headline\",\n validation: { required: true }\n },\n subhead: {\n dataType: \"string\",\n name: \"Subheadline\"\n },\n background_image: {\n dataType: \"string\",\n name: \"Background Image\",\n storage: {\n storagePath: \"page_hero/images\",\n acceptedFiles: [\"image/*\"],\n }\n },\n call_to_action: {\n dataType: \"string\",\n name: \"Call to Action\"\n },\n call_to_action_link: {\n dataType: \"string\",\n name: \"CTA Link\",\n url: true\n }\n }\n },\n content: {\n dataType: \"array\",\n name: \"Content\",\n oneOf: {\n properties: {\n section: {\n dataType: \"map\",\n name: \"Section\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Section Title\",\n validation: { required: true }\n },\n content: {\n dataType: \"string\",\n name: \"Section Content\",\n markdown: true\n },\n image: {\n dataType: \"string\",\n name: \"Section Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n link: {\n dataType: \"string\",\n name: \"Section Link\",\n url: true\n }\n }\n },\n image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n slider: {\n dataType: \"array\",\n name: \"Slider\",\n of: {\n dataType: \"map\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Title\",\n validation: { required: true }\n },\n image: {\n dataType: \"string\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n }\n }\n },\n }\n }\n },\n sidebar: {\n dataType: \"map\",\n name: \"Sidebar\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Sidebar Title\",\n validation: { required: false }\n },\n content: {\n dataType: \"string\",\n name: \"Sidebar Content\",\n markdown: true\n }\n }\n },\n seo_metadata: {\n dataType: \"map\",\n name: \"SEO Metadata\",\n properties: {\n meta_title: {\n dataType: \"string\",\n name: \"Meta Title\"\n },\n meta_description: {\n dataType: \"string\",\n name: \"Meta Description\"\n },\n focus_keywords: {\n dataType: \"array\",\n name: \"Focus Keywords\",\n of: {\n dataType: \"string\"\n }\n }\n }\n },\n footer_override: {\n dataType: \"string\",\n name: \"Footer Override\",\n markdown: true\n },\n publish_date: {\n dataType: \"date\",\n name: \"Publish Date\",\n validation: { required: true }\n },\n last_updated: {\n dataType: \"date\",\n name: \"Last Updated\",\n autoValue: \"on_update\"\n },\n is_published: {\n dataType: \"boolean\",\n name: \"Is Published\",\n columnWidth: 100,\n description: \"Should this page be live on the site?\"\n },\n author_uid: {\n dataType: \"reference\",\n name: \"Author\",\n path: \"users\"\n }\n }\n};\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, unslugify, } from \"@firecms/core\";\nimport { Button, Card, Chip, CircularProgress, cls, Container, Icon, Tooltip, Typography, } from \"@firecms/ui\";\n\nimport { productsCollectionTemplate } from \"./templates/products_template\";\nimport { blogCollectionTemplate } from \"./templates/blog_template\";\nimport { usersCollectionTemplate } from \"./templates/users_template\";\nimport { ImportFileUpload } from \"@firecms/data_import_export\";\nimport { pagesCollectionTemplate } from \"./templates/pages_template\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function CollectionEditorWelcomeView({\n path,\n pathSuggestions,\n parentCollection,\n onContinue,\n existingCollectionPaths\n }: {\n path: string;\n pathSuggestions?: (path: string) => Promise<string[]>;\n parentCollection?: EntityCollection;\n onContinue: (importData?: object[], propertiesOrder?: string[]) => void;\n existingCollectionPaths?: string[];\n}) {\n\n const [loadingPathSuggestions, setLoadingPathSuggestions] = useState(false);\n const [filteredPathSuggestions, setFilteredPathSuggestions] = useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions && existingCollectionPaths) {\n setLoadingPathSuggestions(true);\n pathSuggestions(path)\n .then(suggestions => {\n const filteredSuggestions = suggestions.filter(s => !(existingCollectionPaths ?? []).find(c => c.trim().toLowerCase() === s.trim().toLowerCase()));\n setFilteredPathSuggestions(filteredSuggestions);\n })\n .finally(() => setLoadingPathSuggestions(false));\n }\n }, [existingCollectionPaths, path, pathSuggestions]);\n\n // const {\n // values,\n // setFieldValue,\n // setValues,\n // handleChange,\n // touched,\n // errors,\n // setFieldTouched,\n // isSubmitting,\n // submitCount\n // } = useFormex<EntityCollection>();\n\n const {\n values,\n setFieldValue,\n setValues,\n submitCount\n } = useFormex<EntityCollection>();\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={\"h4\"} className={\"flex-grow\"}>\n New collection\n </Typography>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Use one of the existing paths in your database:\n </Typography>\n <div className={\"flex flex-wrap gap-x-2 gap-y-1 items-center my-2 min-h-7\"}>\n\n {loadingPathSuggestions && !filteredPathSuggestions && <CircularProgress size={\"small\"}/>}\n\n {filteredPathSuggestions?.map((suggestion, index) => (\n <Chip key={suggestion}\n colorScheme={\"cyanLighter\"}\n onClick={() => {\n setFieldValue(\"name\", unslugify(suggestion));\n setFieldValue(\"id\", suggestion);\n setFieldValue(\"path\", suggestion);\n setFieldValue(\"properties\", undefined);\n onContinue();\n }}\n size=\"small\">\n {suggestion}\n </Chip>\n ))}\n\n {!loadingPathSuggestions && (filteredPathSuggestions ?? [])?.length === 0 &&\n <Typography variant={\"caption\"}>\n No suggestions\n </Typography>\n }\n\n </div>\n\n </div>\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Select a template:\n </Typography>\n\n <div className={\"flex gap-4\"}>\n <TemplateButton title={\"Products\"}\n subtitle={\"A collection of products with images, prices and stock\"}\n icon={<Icon size={\"small\"} iconKey={productsCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(productsCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Users\"}\n subtitle={\"A collection of users with emails, names and roles\"}\n icon={<Icon size={\"small\"} iconKey={usersCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(usersCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Blog posts\"}\n subtitle={\"A collection of blog posts with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={blogCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(blogCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Pages\"}\n subtitle={\"A collection of pages with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={pagesCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(pagesCollectionTemplate);\n onContinue();\n }}/>\n </div>\n\n </div>\n\n {!parentCollection && <div>\n\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className={\"mb-2\"}>\n ● Create a collection from a file (csv, json, xls, xslx...)\n </Typography>\n\n <ImportFileUpload onDataAdded={(data, propertiesOrder) => onContinue(data, propertiesOrder)}/>\n\n </div>}\n\n <div>\n\n <Button variant={\"text\"} onClick={() => onContinue()} className={\"my-2\"}>\n Continue from scratch\n </Button>\n </div>\n\n {/*<div style={{ height: \"52px\" }}/>*/}\n\n </Container>\n </div>\n );\n}\n\nexport function TemplateButton({\n title,\n subtitle,\n icon,\n onClick\n }: {\n title: string,\n icon: React.ReactNode,\n subtitle: string,\n onClick?: () => void\n}) {\n\n return (\n <Tooltip title={subtitle}>\n <Card\n onClick={onClick}\n className={cls(\n \"my-2 rounded-md border mx-0 p-6 px-4 focus:outline-none transition ease-in-out duration-150 flex flex-row gap-4 items-center\",\n \"text-gray-700 dark:text-slate-300\",\n \"hover:border-primary-dark hover:text-primary-dark dark:hover:text-primary focus:ring-primary hover:ring-1 hover:ring-primary\",\n \"border-gray-400 dark:border-gray-600 \"\n )}\n >\n {icon}\n <div className={\"flex flex-col items-start\"}>\n\n <Typography variant={\"subtitle1\"}>\n {title}\n </Typography>\n {/*<Typography>*/}\n {/* {subtitle}*/}\n {/*</Typography>*/}\n\n </div>\n </Card>\n </Tooltip>\n );\n\n}\n","import {\n DataNewPropertiesMapping,\n getInferenceType,\n ImportConfig,\n ImportNewPropertyFieldPreview\n} from \"@firecms/data_import_export\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { getFieldConfig, getFieldId, Properties, Property, PropertyConfig, PropertyConfigBadge, } from \"@firecms/core\";\nimport { Container, Select, Tooltip, Typography } from \"@firecms/ui\";\nimport React, { useState } from \"react\";\nimport { OnPropertyChangedParams, PropertyFormDialog, PropertyWithId } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PersistedCollection } from \"../../../types/persisted_collection\";\nimport { updatePropertyFromWidget } from \"../utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"../PropertySelectItem\";\nimport { supportedFields } from \"../utils/supported_fields\";\nimport { buildPropertyFromData } from \"@firecms/schema_inference\";\n\nexport function CollectionEditorImportMapping({\n importConfig,\n propertyConfigs,\n collectionEditable\n }:\n {\n importConfig: ImportConfig,\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean\n }) {\n\n // const {\n // values,\n // setFieldValue,\n // setFieldTouched,\n // setValues,\n // submitCount\n // } = useFormex();\n\n const {\n setFieldValue,\n setFieldTouched,\n values\n } = useFormex<PersistedCollection>();\n const [selectedProperty, setSelectedProperty] = useState<PropertyWithId | undefined>(undefined);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n const propertyKey = selectedProperty ? selectedProperty.id : undefined;\n const property = selectedProperty || undefined;\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // setSelectedProperty(property);\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n // replace previousId with id in headersMapping\n const newHeadersMapping = { ...importConfig.headersMapping };\n Object.keys(newHeadersMapping).forEach((key) => {\n if (newHeadersMapping[key] === previousId) {\n newHeadersMapping[key] = id ?? \"\";\n }\n });\n importConfig.setHeadersMapping(newHeadersMapping);\n\n // if (id) {\n // setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n // setSelectedPropertyKey(id);\n // }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n };\n const onPropertyTypeChanged = async ({\n id,\n importKey,\n property,\n namespace\n }: OnPropertyChangedParams & {\n importKey: string\n }) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // we try to infer the rest of the properties of a property, from the type and the data\n const propertyData = importConfig.importData.map((d) => getIn(d, importKey));\n const inferredNewProperty = {\n ...buildPropertyFromData(propertyData, property, getInferenceType),\n editable: true\n };\n\n if (propertyPath) {\n if (inferredNewProperty) {\n setFieldValue(propertyPath, inferredNewProperty, false);\n } else {\n setFieldValue(propertyPath, property, false);\n }\n setFieldTouched(propertyPath, true, false);\n }\n };\n\n return (\n\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"6xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <Typography variant=\"h6\" className={\"my-4 ml-3.5\"}>Data property mapping</Typography>\n\n <DataNewPropertiesMapping importConfig={importConfig}\n destinationProperties={values.properties as Properties}\n buildPropertyView={({\n property,\n propertyKey,\n importKey,\n isIdColumn\n }) => {\n if (isIdColumn) {\n return <Typography> This column will be used as ID</Typography>\n }\n\n return <ImportNewPropertyFieldPreview\n property={property}\n propertyKey={propertyKey}\n onPropertyNameChanged={(propertyKey: string, value: string) => setFieldValue(`properties.${propertyKey}.name`, value, false)}\n onEditClick={() => {\n if (!propertyKey || !property) return;\n setSelectedProperty({\n ...property,\n id: propertyKey,\n editable: true\n });\n }}\n propertyTypeView={<PropertySelect property={property}\n disabled={false}\n onPropertyChanged={(props) => onPropertyTypeChanged({\n ...props,\n importKey\n })}\n propertyKey={propertyKey}\n propertyConfigs={propertyConfigs}/>}\n />;\n }}/>\n </Container>\n\n <PropertyFormDialog\n open={selectedProperty !== undefined}\n propertyKey={propertyKey}\n property={property}\n inArray={false}\n autoUpdateId={false}\n onPropertyChanged={onPropertyChanged}\n allowDataInference={false}\n collectionEditable={collectionEditable}\n onOkClicked={() => {\n setSelectedProperty(undefined);\n }}\n onCancel={() => {\n setSelectedProperty(undefined);\n }}\n autoOpenTypeSelect={false}\n existingProperty={false}\n propertyConfigs={propertyConfigs}/>\n\n <div style={{ height: \"52px\" }}/>\n </div>\n );\n\n}\n\nfunction PropertySelect({\n property,\n onPropertyChanged,\n propertyKey,\n propertyConfigs,\n disabled\n }: {\n property: Property | null,\n propertyKey: string | null,\n onPropertyChanged: ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => void,\n propertyConfigs: Record<string, PropertyConfig>,\n disabled?: boolean\n}) {\n\n const fieldId = property ? getFieldId(property) : null;\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n const [selectOpen, setSelectOpen] = useState(false);\n\n return <Tooltip title={property && widget ? `${widget?.name} - ${property.dataType}` : undefined}\n open={selectOpen ? false : undefined}>\n <Select\n open={selectOpen}\n onOpenChange={setSelectOpen}\n invisible={true}\n className={\"w-full\"}\n disabled={disabled}\n error={!widget}\n value={fieldId ?? \"\"}\n placeholder={\"Select a property widget\"}\n position={\"item-aligned\"}\n renderValue={(value) => {\n if (!widget) return null;\n return <PropertyConfigBadge propertyConfig={widget}/>\n }}\n onValueChange={(newSelectedWidgetId) => {\n const newProperty = updatePropertyFromWidget(property, newSelectedWidgetId, propertyConfigs)\n if (!propertyKey) return;\n onPropertyChanged({\n id: propertyKey,\n property: newProperty,\n previousId: propertyKey,\n namespace: undefined\n });\n }}>\n {Object.entries(supportedFields).map(([key, widget]) => {\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={false}\n propertyConfig={widget}\n existing={false}/>;\n })\n }\n </Select>\n </Tooltip>;\n}\n","import { convertDataToEntity, ImportConfig } from \"@firecms/data_import_export\";\nimport { CircularProgressCenter, EntityCollectionTable, Properties, useSelectionController } from \"@firecms/core\";\nimport { useEffect, useState } from \"react\";\nimport { Typography } from \"@firecms/ui\";\n\nexport function CollectionEditorImportDataPreview({\n importConfig,\n properties,\n propertiesOrder\n }: {\n importConfig: ImportConfig,\n properties: Properties,\n propertiesOrder: string[]\n}) {\n\n const [loading, setLoading] = useState<boolean>(false);\n\n async function loadEntities() {\n // const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties, importConfig.headersMapping);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, \"TEMP_PATH\", importConfig.defaultValues));\n importConfig.setEntities(mappedData);\n }\n\n useEffect(() => {\n loadEntities().finally(() => setLoading(false));\n }, []);\n\n const selectionController = useSelectionController();\n if (loading)\n return <CircularProgressCenter/>\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 enablePopupIcon={false}/>\n\n}\n","import { Properties, slugify } from \"@firecms/core\";\nimport { ImportConfig } from \"@firecms/data_import_export\";\n\nexport function cleanPropertiesFromImport(properties: Properties, parentSlug = \"\"): {\n headersMapping: ImportConfig[\"headersMapping\"],\n properties: Properties,\n idColumn?: ImportConfig[\"idColumn\"],\n} {\n\n const result = Object.keys(properties).reduce((acc, key) => {\n const property = properties[key];\n const slug = slugify(key);\n const fullSlug = parentSlug ? `${parentSlug}.${slug}` : slug;\n\n if (property.dataType === \"map\" && property.properties) {\n const slugifiedResult = cleanPropertiesFromImport(property.properties as Properties, fullSlug);\n return {\n headersMapping: { ...acc.headersMapping, [key]: fullSlug },\n properties: {\n ...acc.properties,\n [slug]: {\n ...property,\n properties: slugifiedResult.properties,\n propertiesOrder: Object.keys(slugifiedResult.properties)\n }\n }\n }\n }\n\n const updatedProperties = {\n ...acc.properties,\n [slug]: property\n } as Properties;\n\n const headersMapping = { ...acc.headersMapping, [key]: fullSlug } as Record<string, string>;\n\n return {\n headersMapping,\n properties: updatedProperties,\n }\n }, { headersMapping: {}, properties: {} });\n\n const firstKey = Object.keys(result.headersMapping)?.[0];\n let idColumn: string | undefined;\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n idColumn = firstKey;\n }\n\n return {\n ...result,\n idColumn\n };\n}\n","import * as React from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CircularProgressCenter,\n Entity,\n EntityCollection,\n ErrorView,\n isPropertyBuilder,\n MapProperty,\n mergeDeep,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n randomString,\n removeInitialAndTrailingSlashes,\n removeUndefined,\n TopNavigationResult,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n ArrowBackIcon,\n Button,\n cls,\n coolIconKeys,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n IconButton,\n LoadingButton,\n Tab,\n Tabs\n} from \"@firecms/ui\";\nimport { YupSchema } from \"./CollectionYupValidation\";\nimport { CollectionDetailsForm } from \"./CollectionDetailsForm\";\nimport { CollectionPropertiesEditorForm } from \"./CollectionPropertiesEditorForm\";\nimport { UnsavedChangesDialog } from \"./UnsavedChangesDialog\";\nimport { SubcollectionsEditTab } from \"./SubcollectionsEditTab\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { CollectionEditorWelcomeView } from \"./CollectionEditorWelcomeView\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { getInferenceType, ImportSaveInProgress, useImportConfig } from \"@firecms/data_import_export\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { CollectionEditorImportMapping } from \"./import/CollectionEditorImportMapping\";\nimport { CollectionEditorImportDataPreview } from \"./import/CollectionEditorImportDataPreview\";\nimport { cleanPropertiesFromImport } from \"./import/clean_import_data\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { Formex, FormexController, useCreateFormex } from \"@firecms/formex\";\nimport { getFullIdPath } from \"./util\";\n\nexport interface CollectionEditorDialogProps {\n open: boolean;\n isNewCollection: boolean;\n initialValues?: {\n group?: string,\n path?: string,\n name?: string,\n }\n editedCollectionId?: string;\n fullPath?: string; // full path of this particular collection, like `products/123/locales`\n parentCollectionIds?: string[]; // path ids of the parent collection, like [`products`]\n handleClose: (collection?: EntityCollection) => void;\n configController: CollectionsConfigController;\n reservedGroups?: string[];\n collectionInference?: CollectionInference;\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n pathSuggestions?: (path?: string) => Promise<string[]>;\n getUser?: (uid: string) => User | null;\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n parentCollection?: PersistedCollection;\n existingEntities?: Entity<any>[];\n}\n\nexport function CollectionEditorDialog(props: CollectionEditorDialogProps) {\n\n const open = props.open;\n\n const [formDirty, setFormDirty] = React.useState<boolean>(false);\n const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] = React.useState<boolean>(false);\n\n const handleCancel = () => {\n if (!formDirty) {\n props.handleClose(undefined);\n } else {\n setUnsavedChangesDialogOpen(true);\n }\n };\n\n useEffect(() => {\n if (!open) {\n setFormDirty(false);\n setUnsavedChangesDialogOpen(false);\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n fullWidth={true}\n fullHeight={true}\n scrollable={false}\n maxWidth={\"7xl\"}\n onOpenChange={(open) => !open ? handleCancel() : undefined}\n >\n {open && <CollectionEditor {...props}\n handleCancel={handleCancel}\n setFormDirty={setFormDirty}/>}\n\n <UnsavedChangesDialog\n open={unsavedChangesDialogOpen}\n handleOk={() => props.handleClose(undefined)}\n handleCancel={() => setUnsavedChangesDialogOpen(false)}\n body={\"There are unsaved changes in this collection\"}/>\n\n </Dialog>\n );\n}\n\ntype EditorView = \"welcome\"\n | \"details\"\n | \"import_data_mapping\"\n | \"import_data_preview\"\n | \"import_data_saving\"\n | \"properties\"\n | \"loading\"\n | \"extra_view\"\n | \"subcollections\";\n\nexport function CollectionEditor(props: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void\n}) {\n const { propertyConfigs } = useCustomizationController();\n const navigation = useNavigationController();\n const authController = useAuthController();\n\n const {\n topLevelNavigation,\n collections\n } = navigation;\n\n const initialValuesProp = props.initialValues;\n const includeTemplates = !initialValuesProp?.path && (props.parentCollectionIds ?? []).length === 0;\n const collectionsInThisLevel = (props.parentCollection ? props.parentCollection.subcollections : collections) ?? [];\n const existingPaths = collectionsInThisLevel.map(col => col.path.trim().toLowerCase());\n const existingIds = collectionsInThisLevel.map(col => col.id?.trim().toLowerCase()).filter(Boolean) as string[];\n const [collection, setCollection] = React.useState<PersistedCollection<any> | undefined>();\n const [initialLoadingCompleted, setInitialLoadingCompleted] = React.useState(false);\n\n useEffect(() => {\n try {\n if (navigation.initialised) {\n if (props.editedCollectionId) {\n setCollection(navigation.getCollectionFromPaths([...(props.parentCollectionIds ?? []), props.editedCollectionId]));\n } else {\n setCollection(undefined);\n }\n setInitialLoadingCompleted(true);\n }\n } catch (e) {\n console.error(e);\n }\n }, [props.editedCollectionId, props.parentCollectionIds, navigation.initialised, navigation.getCollectionFromPaths]);\n\n if (!topLevelNavigation) {\n throw Error(\"Internal: Navigation not ready in collection editor\");\n }\n\n const {\n groups\n }: TopNavigationResult = topLevelNavigation;\n\n const initialCollection = collection\n ? {\n ...collection,\n id: collection.id ?? collection.path ?? randomString(16)\n }\n : undefined;\n\n const initialValues: PersistedCollection<any> = initialCollection\n ? applyPropertyConfigs(initialCollection, propertyConfigs)\n : {\n id: initialValuesProp?.path ?? randomString(16),\n path: initialValuesProp?.path ?? \"\",\n name: initialValuesProp?.name ?? \"\",\n group: initialValuesProp?.group ?? \"\",\n properties: {} as PropertiesOrBuilders,\n propertiesOrder: [],\n icon: coolIconKeys[Math.floor(Math.random() * coolIconKeys.length)],\n ownerId: authController.user?.uid ?? \"\"\n };\n\n if (!initialLoadingCompleted) {\n return <CircularProgressCenter/>;\n }\n\n if (!props.isNewCollection && (!navigation.initialised || !initialLoadingCompleted)) {\n return <CircularProgressCenter/>;\n }\n\n return <CollectionEditorInternal\n {...props}\n initialValues={initialValues}\n existingPaths={existingPaths}\n existingIds={existingIds}\n includeTemplates={includeTemplates}\n collection={collection}\n setCollection={setCollection}\n groups={groups}\n propertyConfigs={propertyConfigs}/>\n\n}\n\nfunction CollectionEditorInternal<M extends Record<string, any>>({\n isNewCollection,\n configController,\n editedCollectionId,\n parentCollectionIds,\n fullPath,\n collectionInference,\n handleClose,\n reservedGroups,\n extraView,\n handleCancel,\n setFormDirty,\n pathSuggestions,\n getUser,\n parentCollection,\n getData,\n existingPaths,\n existingIds,\n includeTemplates,\n collection,\n setCollection,\n initialValues,\n propertyConfigs,\n groups,\n existingEntities\n }: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void,\n initialValues: PersistedCollection<M>,\n existingPaths: string[],\n existingIds: string[],\n includeTemplates: boolean,\n collection: PersistedCollection<M> | undefined,\n setCollection: (collection: PersistedCollection<M>) => void,\n propertyConfigs: Record<string, PropertyConfig<any>>,\n groups: string[],\n }\n) {\n\n const importConfig = useImportConfig();\n const navigation = useNavigationController();\n const snackbarController = useSnackbarController();\n\n // Use this ref to store which properties have errors\n const propertyErrorsRef = useRef({});\n\n const initialView = isNewCollection ? (includeTemplates ? \"welcome\" : \"details\") : \"properties\";\n const [currentView, setCurrentView] = useState<EditorView>(initialView); // this view can edit either the details view or the properties one\n\n const [error, setError] = React.useState<Error | undefined>();\n\n const saveCollection = (updatedCollection: PersistedCollection<M>): Promise<boolean> => {\n const id = updatedCollection.id || updatedCollection.path;\n return configController.saveCollection({\n id,\n collectionData: updatedCollection,\n previousId: editedCollectionId,\n parentCollectionIds\n })\n .then(() => {\n setError(undefined);\n return true;\n })\n .catch((e) => {\n setError(e);\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n };\n\n const setNextMode = () => {\n if (currentView === \"details\") {\n if (importConfig.inUse) {\n setCurrentView(\"import_data_saving\");\n } else if (extraView) {\n setCurrentView(\"extra_view\");\n } else {\n setCurrentView(\"properties\");\n }\n } else if (currentView === \"welcome\") {\n setCurrentView(\"details\");\n } else if (currentView === \"import_data_mapping\") {\n setCurrentView(\"import_data_preview\");\n } else if (currentView === \"import_data_preview\") {\n setCurrentView(\"details\");\n } else if (currentView === \"extra_view\") {\n setCurrentView(\"properties\");\n } else {\n setCurrentView(\"details\");\n }\n\n };\n\n const doCollectionInference = (collection: PersistedCollection<any>) => {\n if (!collectionInference) return undefined;\n return collectionInference?.(collection.path, collection.collectionGroup ?? false, parentCollectionIds ?? []);\n };\n\n const inferCollectionFromData = async (newCollection: PersistedCollection<M>) => {\n\n try {\n if (!doCollectionInference) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n\n setCurrentView(\"loading\");\n\n const inferredCollection = await doCollectionInference?.(newCollection);\n\n if (!inferredCollection) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n const values = {\n ...(newCollection ?? {})\n };\n\n if (Object.keys(inferredCollection.properties ?? {}).length > 0) {\n values.properties = inferredCollection.properties as PropertiesOrBuilders<M>;\n values.propertiesOrder = inferredCollection.propertiesOrder as Extract<keyof M, string>[];\n }\n\n if (!values.propertiesOrder) {\n values.propertiesOrder = Object.keys(values.properties) as Extract<keyof M, string>[];\n return values;\n }\n\n setCollection(values);\n console.debug(\"Inferred collection\", {\n newCollection: newCollection ?? {},\n values\n });\n return values;\n } catch (e: any) {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error inferring collection: \" + (e.message ?? \"Details in the console\")\n });\n return newCollection;\n }\n };\n\n const onSubmit = (newCollectionState: PersistedCollection<M>, formexController: FormexController<PersistedCollection<M>>) => {\n console.debug(\"Submitting collection\", newCollectionState);\n try {\n\n if (!isNewCollection) {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n handleClose(newCollectionState);\n });\n return;\n }\n\n if (currentView === \"welcome\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"details\") {\n if (extraView || importConfig.inUse) {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n } else if (isNewCollection) {\n inferCollectionFromData(newCollectionState)\n .then((values) => {\n formexController.resetForm({\n values: values ?? newCollectionState,\n touched: {\n path: true,\n name: true\n }\n });\n }).finally(() => {\n setNextMode();\n });\n } else {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n }\n } else if (currentView === \"extra_view\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"import_data_mapping\") {\n setNextMode();\n } else if (currentView === \"import_data_preview\") {\n setNextMode();\n } else if (currentView === \"properties\") {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n setNextMode();\n handleClose(newCollectionState);\n });\n } else {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n }\n } catch (e: any) {\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n console.error(e);\n formexController.resetForm({ values: newCollectionState });\n }\n };\n\n const validation = (col: PersistedCollection) => {\n\n let errors: Record<string, any> = {};\n const schema = (currentView === \"properties\" || currentView === \"subcollections\" || currentView === \"details\") && YupSchema;\n if (schema) {\n try {\n schema.validateSync(col, { abortEarly: false });\n } catch (e: any) {\n e.inner.forEach((err: any) => {\n errors[err.path] = err.message;\n });\n }\n }\n if (currentView === \"properties\") {\n errors = { ...errors, ...propertyErrorsRef.current };\n }\n if (currentView === \"details\") {\n const pathError = validatePath(col.path, isNewCollection, existingPaths, col.id);\n if (pathError) {\n errors.path = pathError;\n }\n const idError = validateId(col.id, isNewCollection, existingPaths, existingIds);\n if (idError) {\n errors.id = idError;\n }\n }\n return errors;\n };\n\n const formController = useCreateFormex<PersistedCollection<M>>({\n initialValues,\n onSubmit,\n validation\n });\n\n const {\n values,\n setFieldValue,\n isSubmitting,\n dirty,\n submitCount\n } = formController;\n\n // TODO: getting data is only working in root collections with this code\n const path = values.path;\n const updatedFullPath = fullPath?.includes(\"/\") ? fullPath?.split(\"/\").slice(0, -1).join(\"/\") + \"/\" + path : path; // TODO: this path is wrong\n const pathError = validatePath(path, isNewCollection, existingPaths, values.id);\n\n const parentPaths = !pathError && parentCollectionIds ? navigation.convertIdsToPaths(parentCollectionIds) : undefined;\n const resolvedPath = !pathError ? navigation.resolveAliasesFrom(updatedFullPath) : undefined;\n const getDataWithPath = resolvedPath && getData ? async () => {\n const data = await getData(resolvedPath, parentPaths ?? []);\n if (existingEntities) {\n const existingData = existingEntities.map(e => e.values);\n data.push(...existingData);\n }\n return data;\n } : undefined;\n\n useEffect(() => {\n setFormDirty(dirty);\n }, [dirty]);\n\n function onImportDataSet(data: object[], propertiesOrder?: string[]) {\n importConfig.setInUse(true);\n buildEntityPropertiesFromData(data, getInferenceType)\n .then((properties) => {\n const res = cleanPropertiesFromImport(properties);\n\n importConfig.setIdColumn(res.idColumn);\n importConfig.setImportData(data);\n importConfig.setHeadersMapping(res.headersMapping);\n const filteredHeadingsOrder = ((propertiesOrder ?? [])\n .filter((key) => res.headersMapping[key]) as string[]) ?? Object.keys(res.properties);\n importConfig.setHeadingsOrder(filteredHeadingsOrder);\n importConfig.setOriginProperties(res.properties);\n\n const mappedHeadings = (propertiesOrder ?? []).map((key) => res.headersMapping[key]).filter(Boolean) as string[] ?? Object.keys(res.properties);\n setFieldValue(\"properties\", res.properties);\n setFieldValue(\"propertiesOrder\", mappedHeadings);\n });\n }\n\n const validValues = Boolean(values.name) && Boolean(values.id);\n\n const onImportMappingComplete = () => {\n const updatedProperties = { ...values.properties };\n if (importConfig.idColumn)\n delete updatedProperties[importConfig.idColumn];\n setFieldValue(\"properties\", updatedProperties);\n // setFieldValue(\"propertiesOrder\", Object.values(importConfig.headersMapping));\n setNextMode();\n };\n\n const editable = collection?.editable === undefined || collection?.editable === true;\n const collectionEditable = editable || isNewCollection;\n\n return <DialogContent fullHeight={true}>\n <Formex value={formController}>\n\n <>\n {!isNewCollection && <Tabs value={currentView}\n className={cls(defaultBorderMixin, \"justify-end bg-gray-50 dark:bg-gray-950 border-b\")}\n onValueChange={(v) => setCurrentView(v as EditorView)}>\n <Tab value={\"details\"}>\n Details\n </Tab>\n <Tab value={\"properties\"}>\n Properties\n </Tab>\n <Tab value={\"subcollections\"}>\n Additional views\n </Tab>\n </Tabs>}\n\n <form noValidate\n onSubmit={formController.handleSubmit}\n className={cls(\n isNewCollection ? \"h-full\" : \"h-[calc(100%-48px)]\",\n \"flex-grow flex flex-col relative\")}>\n\n {currentView === \"loading\" &&\n <CircularProgressCenter/>}\n\n {currentView === \"extra_view\" &&\n path &&\n extraView?.View &&\n <extraView.View path={path}/>}\n\n {currentView === \"welcome\" &&\n <CollectionEditorWelcomeView\n path={path}\n onContinue={(importData, propertiesOrder) => {\n // console.log(\"Import data\", importData, propertiesOrder)\n if (importData) {\n onImportDataSet(importData, propertiesOrder);\n setCurrentView(\"import_data_mapping\");\n } else {\n setCurrentView(\"details\");\n }\n }}\n existingCollectionPaths={existingPaths}\n parentCollection={parentCollection}\n pathSuggestions={pathSuggestions}/>}\n\n {currentView === \"import_data_mapping\" && importConfig &&\n <CollectionEditorImportMapping importConfig={importConfig}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>}\n\n {currentView === \"import_data_preview\" && importConfig &&\n <CollectionEditorImportDataPreview importConfig={importConfig}\n properties={values.properties as Properties}\n propertiesOrder={values.propertiesOrder as string[]}/>}\n\n {currentView === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={values}\n path={path}\n onImportSuccess={async (importedCollection) => {\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n await saveCollection(values);\n handleClose(importedCollection);\n }}\n />}\n\n {currentView === \"details\" &&\n <CollectionDetailsForm\n existingPaths={existingPaths}\n existingIds={existingIds}\n groups={groups}\n parentCollectionIds={parentCollectionIds}\n parentCollection={parentCollection}\n isNewCollection={isNewCollection}/>}\n\n {currentView === \"subcollections\" && collection &&\n <SubcollectionsEditTab\n parentCollection={parentCollection}\n configController={configController}\n getUser={getUser}\n collectionInference={collectionInference}\n parentCollectionIds={parentCollectionIds}\n collection={collection}/>}\n\n {currentView === \"properties\" &&\n <CollectionPropertiesEditorForm\n showErrors={submitCount > 0}\n isNewCollection={isNewCollection}\n reservedGroups={reservedGroups}\n onPropertyError={(propertyKey, namespace, error) => {\n const current = removeUndefined({\n ...propertyErrorsRef.current,\n [getFullIdPath(propertyKey, namespace)]: removeUndefined(error, true)\n }, true);\n propertyErrorsRef.current = current;\n formController.validate();\n }}\n getUser={getUser}\n getData={getDataWithPath}\n doCollectionInference={doCollectionInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n extraIcon={extraView?.icon &&\n <IconButton\n color={\"primary\"}\n onClick={() => setCurrentView(\"extra_view\")}>\n {extraView.icon}\n </IconButton>}/>\n }\n\n {currentView !== \"welcome\" && <DialogActions\n position={\"absolute\"}>\n {error && <ErrorView error={error}/>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_mapping\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n importConfig.setInUse(false);\n return setCurrentView(\"welcome\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_preview\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n setCurrentView(\"import_data_mapping\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"details\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"welcome\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && currentView === \"properties\" && <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"details\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n <Button variant={\"text\"}\n onClick={() => {\n handleCancel();\n }}>\n Cancel\n </Button>\n\n {isNewCollection && currentView === \"import_data_mapping\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={onImportMappingComplete}\n >\n Next\n </Button>}\n\n {isNewCollection && currentView === \"import_data_preview\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={() => {\n setNextMode();\n }}\n >\n Next\n </Button>}\n\n {isNewCollection && (currentView === \"details\" || currentView === \"properties\") &&\n <LoadingButton\n variant={\"filled\"}\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || (currentView === \"details\" && !validValues)}\n startIcon={currentView === \"properties\"\n ? <DoneIcon/>\n : undefined}\n >\n {currentView === \"details\" && \"Next\"}\n {currentView === \"properties\" && \"Create collection\"}\n </LoadingButton>}\n\n {!isNewCollection && <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n >\n Update collection\n </LoadingButton>}\n\n </DialogActions>}\n </form>\n </>\n\n </Formex>\n\n </DialogContent>\n\n}\n\nfunction applyPropertyConfigs<M extends Record<string, any> = any>(collection: PersistedCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): PersistedCollection<M> {\n const {\n properties,\n ...rest\n } = collection;\n const propertiesResult: PropertiesOrBuilders<any> = {};\n if (properties) {\n Object.keys(properties).forEach((key) => {\n propertiesResult[key] = applyPropertiesConfig(properties[key] as PropertyOrBuilder, propertyConfigs);\n });\n }\n\n return {\n ...rest,\n properties: propertiesResult\n };\n}\n\nfunction applyPropertiesConfig(property: PropertyOrBuilder, propertyConfigs: Record<string, PropertyConfig<any>>) {\n let internalProperty = property;\n if (propertyConfigs && typeof internalProperty === \"object\" && internalProperty.propertyConfig) {\n const propertyConfig = propertyConfigs[internalProperty.propertyConfig];\n if (propertyConfig && isPropertyBuilder(propertyConfig.property)) {\n internalProperty = propertyConfig.property;\n } else {\n\n if (propertyConfig) {\n internalProperty = mergeDeep(propertyConfig.property, internalProperty);\n }\n\n if (!isPropertyBuilder(internalProperty) && internalProperty.dataType === \"map\" && internalProperty.properties) {\n const properties: Record<string, PropertyOrBuilder> = {};\n Object.keys(internalProperty.properties).forEach((key) => {\n properties[key] = applyPropertiesConfig(((internalProperty as MapProperty).properties as Properties)[key] as Property, propertyConfigs);\n });\n internalProperty = {\n ...internalProperty,\n properties\n };\n }\n\n }\n }\n return internalProperty;\n\n}\n\nconst validatePath = (value: string, isNewCollection: boolean, existingPaths: string[], idValue?: string) => {\n let error;\n if (!value) {\n error = \"You must specify a path in the database for this collection\";\n }\n // if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n // error = \"There is already a collection which uses this path as an id\";\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()) && !idValue)\n error = \"There is already a collection with the specified path. If you want to have multiple collections referring to the same database path, make sure the have different ids\";\n\n const subpaths = removeInitialAndTrailingSlashes(value).split(\"/\");\n if (subpaths.length % 2 === 0) {\n error = `Collection paths must have an odd number of segments: ${value}`;\n }\n return error;\n};\n\nconst validateId = (value: string, isNewCollection: boolean, existingPaths: string[], existingIds: string[]) => {\n if (!value) return undefined;\n let error;\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection that uses this value as a path\";\n if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection which uses this id\";\n // if (error) {\n // setAdvancedPanelExpanded(true);\n // }\n return error;\n};\n","import React, { PropsWithChildren, useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport {\n Entity,\n Property,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport { CollectionEditorDialog } from \"./ui/collection_editor/CollectionEditorDialog\";\nimport { useNavigate } from \"react-router\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { PropertyFormDialog } from \"./ui/collection_editor/PropertyEditView\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\n\nexport const ConfigControllerContext = React.createContext<CollectionsConfigController>({} as any);\nexport const CollectionEditorContext = React.createContext<CollectionEditorController>({} as any);\n\nexport interface ConfigControllerProviderProps {\n /**\n * Controller for managing the collections' config.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Callback used to infer the schema from the data.\n */\n collectionInference?: CollectionInference;\n\n /**\n * Use this builder to define the permissions for the configuration per user.\n */\n configPermissions?: CollectionEditorPermissionsBuilder;\n\n /**\n * Groups that cannot be used to create new collections.\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n getPathSuggestions?: (path?: string) => Promise<string[]>;\n\n getUser?: (uid: string) => User | null\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\nexport const ConfigControllerProvider = React.memo(\n function ConfigControllerProvider({\n children,\n collectionConfigController,\n configPermissions,\n reservedGroups,\n collectionInference,\n extraView,\n getPathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }: PropsWithChildren<ConfigControllerProviderProps>) {\n\n const navigation = useNavigationController();\n const navigate = useNavigate();\n const snackbarController = useSnackbarController();\n const { propertyConfigs } = useCustomizationController();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n parentCollection?: PersistedCollection,\n editedCollectionId?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n initialValues?: {\n path?: string,\n group?: string,\n name?: string\n },\n redirect: boolean,\n existingEntities?: Entity<any>[]\n }>();\n\n const [currentPropertyDialog, setCurrentPropertyDialog] = React.useState<{\n propertyKey?: string,\n property?: Property,\n namespace?: string,\n parentCollection?: PersistedCollection,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n fullPath?: string,\n parentCollectionIds: string[],\n collectionEditable: boolean;\n existingEntities?: Entity<any>[]\n }>();\n\n const defaultConfigPermissions: CollectionEditorPermissionsBuilder = useCallback(() => ({\n createCollections: true,\n editCollections: true,\n deleteCollections: true\n }), []);\n\n const editCollection = ({\n id,\n fullPath,\n parentCollectionIds,\n parentCollection,\n existingEntities\n }: {\n id?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection,\n existingEntities?: Entity<any>[]\n }) => {\n console.debug(\"Edit collection\", id, fullPath, parentCollectionIds, parentCollection);\n onAnalyticsEvent?.(\"edit_collection\", {\n id,\n fullPath\n });\n setCurrentDialog({\n editedCollectionId: id,\n fullPath,\n parentCollectionIds,\n isNewCollection: false,\n parentCollection,\n redirect: false,\n existingEntities\n });\n };\n\n const editProperty = ({\n propertyKey,\n property,\n editedCollectionId,\n currentPropertiesOrder,\n parentCollectionIds,\n collection,\n existingEntities\n }: {\n propertyKey?: string,\n property?: Property,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n parentCollectionIds: string[],\n collection: PersistedCollection,\n existingEntities?: Entity<any>[]\n }) => {\n console.debug(\"Edit property\", propertyKey, property, editedCollectionId, currentPropertiesOrder, parentCollectionIds, collection);\n onAnalyticsEvent?.(\"edit_property\", {\n propertyKey,\n editedCollectionId\n });\n // namespace is all the path until the last dot\n const namespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(0, propertyKey.lastIndexOf(\".\"))\n : undefined;\n const propertyKeyWithoutNamespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(propertyKey.lastIndexOf(\".\") + 1)\n : propertyKey;\n setCurrentPropertyDialog({\n propertyKey: propertyKeyWithoutNamespace,\n property,\n namespace,\n currentPropertiesOrder,\n editedCollectionId,\n parentCollectionIds,\n collectionEditable: collection?.editable ?? false,\n existingEntities\n });\n };\n\n const createCollection = ({\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n }: {\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n initialValues?: {\n group?: string,\n path?: string,\n name?: string\n },\n redirect: boolean,\n sourceClick?: string\n }) => {\n console.debug(\"Create collection\", {\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n });\n onAnalyticsEvent?.(\"create_collection\", {\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n });\n setCurrentDialog({\n isNewCollection: true,\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect\n });\n };\n\n return (\n <ConfigControllerContext.Provider value={collectionConfigController}>\n <CollectionEditorContext.Provider\n value={{\n editCollection,\n createCollection,\n editProperty,\n configPermissions: configPermissions ?? defaultConfigPermissions,\n getPathSuggestions\n }}>\n\n {children}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={collectionConfigController}\n isNewCollection={false}\n collectionInference={collectionInference}\n {...currentDialog}\n getData={getData}\n reservedGroups={reservedGroups}\n extraView={extraView}\n pathSuggestions={getPathSuggestions}\n getUser={getUser}\n handleClose={(collection) => {\n if (currentDialog?.redirect) {\n if (collection && currentDialog?.isNewCollection && !currentDialog.parentCollectionIds.length) {\n const url = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n navigate(url);\n }\n }\n setCurrentDialog(undefined);\n }}/>\n\n {/* Used for editing properties*/}\n <PropertyFormDialog\n open={Boolean(currentPropertyDialog)}\n includeIdAndName={true}\n existingProperty={Boolean(currentPropertyDialog?.propertyKey)}\n autoUpdateId={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n autoOpenTypeSelect={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n inArray={false}\n collectionEditable={currentPropertyDialog?.collectionEditable ?? false}\n getData={getData && currentPropertyDialog?.editedCollectionId\n ? () => {\n console.debug(\"get data for property\", currentPropertyDialog?.editedCollectionId);\n const resolvedPath = navigation.resolveAliasesFrom(currentPropertyDialog.editedCollectionId!)\n return getData(resolvedPath, []);\n }\n : undefined}\n onPropertyChanged={({\n id,\n property\n }) => {\n if (!currentPropertyDialog) return;\n if (!id) return;\n const newProperty = !(currentPropertyDialog.propertyKey);\n return collectionConfigController.saveProperty({\n path: currentPropertyDialog?.editedCollectionId,\n property,\n propertyKey: id,\n newPropertiesOrder: newProperty && currentPropertyDialog.currentPropertiesOrder ? [...currentPropertyDialog.currentPropertiesOrder, id] : undefined,\n namespace: currentPropertyDialog.namespace,\n parentCollectionIds: currentPropertyDialog.parentCollectionIds\n })\n .catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onPropertyChangedImmediate={false}\n onDelete={() => {\n if (!currentPropertyDialog?.propertyKey) return;\n const newPropertiesOrder = currentPropertyDialog?.currentPropertiesOrder?.filter(p => p !== currentPropertyDialog?.propertyKey);\n return collectionConfigController.deleteProperty({\n path: currentPropertyDialog?.editedCollectionId,\n propertyKey: currentPropertyDialog?.propertyKey,\n namespace: currentPropertyDialog?.namespace,\n newPropertiesOrder,\n parentCollectionIds: currentPropertyDialog?.parentCollectionIds\n })\n .then(() => {\n setCurrentPropertyDialog(undefined);\n }).catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onError={() => {\n }}\n onOkClicked={() => {\n setCurrentPropertyDialog(undefined);\n }}\n onCancel={() => {\n setCurrentPropertyDialog(undefined);\n }}\n initialErrors={{}}\n forceShowErrors={false}\n existingPropertyKeys={[]}\n allowDataInference={true}\n propertyConfigs={propertyConfigs}\n property={currentPropertyDialog?.property}\n propertyKey={currentPropertyDialog?.propertyKey}/>\n\n </CollectionEditorContext.Provider>\n\n </ConfigControllerContext.Provider>\n );\n }, equal);\n","import { useContext } from \"react\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorContext } from \"./ConfigControllerProvider\";\n\n/**\n * Hook to access the collection editor controller.\n * The methods in this controller can be used to open the collection editor dialog.\n */\nexport const useCollectionEditorController = (): CollectionEditorController => useContext(CollectionEditorContext);\n","import { CollectionActionsProps, useAuthController, useNavigationController } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionAction({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n const collectionEditorController = useCollectionEditorController();\n\n const parentCollection = navigationController.getCollectionFromIds(parentCollectionIds);\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n const editorButton = <Tooltip\n title={canEditCollection ? \"Edit collection\" : \"You don't have permissions to edit this collection\"}>\n <IconButton\n color={\"primary\"}\n disabled={!canEditCollection}\n onClick={canEditCollection\n ? () => collectionEditorController?.editCollection({\n id: collection.id,\n fullPath,\n parentCollectionIds,\n parentCollection: parentCollection as PersistedCollection,\n existingEntities: tableController?.data ?? []\n })\n : undefined}>\n <SettingsIcon/>\n </IconButton>\n </Tooltip>;\n\n return <>\n {editorButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import { useContext } from \"react\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { ConfigControllerContext } from \"./ConfigControllerProvider\";\n\n/**\n * Use this hook to access the configuration controller.\n * You can use it to get the list of collections, and to save/delete collections.\n */\nexport const useCollectionsConfigController = (): CollectionsConfigController => useContext(ConfigControllerContext);\n","import {\n DeleteConfirmationDialog,\n PluginHomePageActionsProps,\n useAuthController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { DeleteIcon, IconButton, Menu, MenuItem, MoreVertIcon, SettingsIcon, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useState } from \"react\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\n\nexport function HomePageEditorCollectionAction({\n path,\n collection\n }: PluginHomePageActionsProps) {\n\n const snackbarController = useSnackbarController();\n const authController = useAuthController();\n const configController = useCollectionsConfigController();\n const collectionEditorController = useCollectionEditorController();\n\n const permissions = collectionEditorController.configPermissions({\n user: authController.user,\n collection\n });\n\n const onEditCollectionClicked = () => {\n collectionEditorController?.editCollection({\n id: collection.id,\n parentCollectionIds: []\n });\n };\n\n const [deleteRequested, setDeleteRequested] = useState(false);\n\n const deleteCollection = () => {\n configController?.deleteCollection({ id: collection.id }).then(() => {\n setDeleteRequested(false);\n snackbarController.open({\n message: \"Collection deleted\",\n type: \"success\"\n });\n });\n };\n\n return <>\n\n <div>\n {permissions.deleteCollections &&\n <Menu\n trigger={<IconButton>\n <MoreVertIcon size={\"small\"}/>\n </IconButton>}\n >\n <MenuItem\n dense={true}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setDeleteRequested(true);\n }}>\n <DeleteIcon/>\n Delete\n </MenuItem>\n\n </Menu>\n\n }\n\n {permissions.editCollections &&\n <IconButton\n onClick={(event) => {\n onEditCollectionClicked();\n }}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>}\n </div>\n\n <DeleteConfirmationDialog\n open={deleteRequested}\n onAccept={deleteCollection}\n onCancel={() => setDeleteRequested(false)}\n title={<>Delete this collection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>\n </>;\n\n}\n","import { EntityTableController, ResolvedProperty } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip } from \"@firecms/ui\";\nimport React from \"react\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function CollectionViewHeaderAction({\n propertyKey,\n onHover,\n property,\n fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean,\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n tableController: EntityTableController;\n}) {\n\n const collectionEditorController = useCollectionEditorController();\n\n return (\n <Tooltip title={\"Edit\"}>\n <IconButton\n className={onHover ? \"bg-white dark:bg-gray-950\" : \"hidden\"}\n onClick={() => {\n collectionEditorController.editProperty({\n propertyKey,\n property,\n editedCollectionId: collection.id,\n parentCollectionIds,\n collection,\n existingEntities: tableController.data ?? []\n });\n }}\n size={\"small\"}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n )\n}\n","import { EntityTableController, getDefaultPropertiesOrder, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Tooltip } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function PropertyAddColumnComponent({\n fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: {\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n tableController: EntityTableController;\n}) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n return (\n <Tooltip title={canEditCollection ? \"Add new property\" : \"You don't have permission to add new properties\"}>\n <div\n className={\"p-0.5 w-20 h-full flex items-center justify-center cursor-pointer bg-gray-100 bg-opacity-40 hover:bg-gray-100 dark:bg-gray-950 dark:bg-opacity-40 dark:hover:bg-gray-950\"}\n // className={onHover ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n collectionEditorController.editProperty({\n editedCollectionId: collection.id,\n parentCollectionIds,\n currentPropertiesOrder: getDefaultPropertiesOrder(collection),\n collection,\n existingEntities: tableController.data\n });\n }}>\n <AddIcon color={\"inherit\"}/>\n </div>\n </Tooltip>\n )\n}\n","import { AddIcon, Button } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionButton() {\n const collectionEditorController = useCollectionEditorController();\n return <div className={\"bg-gray-50 dark:bg-gray-900 min-w-fit rounded\"}>\n <Button className={\"min-w-fit\"}\n variant={\"outlined\"}\n onClick={() => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_button\"\n })}>\n <AddIcon/>\n New collection\n </Button>\n </div>\n}\n","import equal from \"react-fast-compare\"\n\nimport { CollectionActionsProps, mergeDeep, useAuthController, useSnackbarController } from \"@firecms/core\";\nimport { Button, SaveIcon, Tooltip, UndoIcon, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionActionStart({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const configController = useCollectionsConfigController();\n const snackbarController = useSnackbarController();\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n let saveDefaultFilterButton = null;\n if (!equal(getObjectOrNull(tableController.filterValues), getObjectOrNull(collection.initialFilter)) ||\n !equal(getObjectOrNull(tableController.sortBy), getObjectOrNull(collection.initialSort))) {\n saveDefaultFilterButton = <>\n <Tooltip\n title={tableController.sortBy || tableController.filterValues ? \"Save default filter and sort\" : \"Clear default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"outlined\"}\n onClick={() => configController\n ?.saveCollection({\n id: collection.id,\n parentCollectionIds,\n collectionData: mergeDeep(collection as PersistedCollection,\n {\n initialFilter: tableController.filterValues ?? null,\n initialSort: tableController.sortBy ?? null\n })\n }).then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"Default config saved\"\n });\n })}>\n <SaveIcon/>\n </Button>\n </Tooltip>\n\n {(collection.initialFilter || collection.initialSort) && <Tooltip\n title={\"Reset to default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"text\"}\n onClick={() => {\n tableController.clearFilter?.();\n if (collection?.initialFilter)\n tableController.setFilterValues?.(collection?.initialFilter);\n if (collection?.initialSort)\n tableController.setSortBy?.(collection?.initialSort);\n }}>\n <UndoIcon/>\n </Button>\n </Tooltip>}\n </>;\n }\n\n return <>\n {canEditCollection && saveDefaultFilterButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import { PluginHomePageAdditionalCardsProps, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Card, cls, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionCard({\n group,\n context\n }: PluginHomePageAdditionalCardsProps) {\n\n if (!context.navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <Card className={cls(\"h-full p-4 min-h-[124px]\")}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: group ? { group } : undefined,\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n\n <div\n className=\"flex items-center justify-center h-full w-full flex-grow flex-col\">\n <AddIcon color=\"primary\" size={\"large\"}/>\n <Typography color=\"primary\"\n variant={\"caption\"}\n className={\"font-medium\"}>{\"Add new collection\".toUpperCase()}</Typography>\n\n {!canCreateCollections &&\n <Typography variant={\"caption\"}>You don&apos;t have permissions to create\n collections</Typography>\n }\n </div>\n\n </Card>\n );\n}\n","import React from \"react\";\nimport { FireCMSPlugin, useAuthController, useNavigationController, User } from \"@firecms/core\";\nimport { ConfigControllerProvider } from \"./ConfigControllerProvider\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { EditorCollectionAction } from \"./ui/EditorCollectionAction\";\nimport { HomePageEditorCollectionAction } from \"./ui/HomePageEditorCollectionAction\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { CollectionViewHeaderAction } from \"./ui/CollectionViewHeaderAction\";\nimport { PropertyAddColumnComponent } from \"./ui/PropertyAddColumnComponent\";\nimport { NewCollectionButton } from \"./ui/NewCollectionButton\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"./useCollectionEditorController\";\nimport { EditorCollectionActionStart } from \"./ui/EditorCollectionActionStart\";\nimport { NewCollectionCard } from \"./ui/NewCollectionCard\";\n\nexport interface CollectionConfigControllerProps<EC extends PersistedCollection = PersistedCollection, UserType extends User = User> {\n\n /**\n * Firebase app where the configuration is saved.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Define what actions can be performed on the configuration.\n */\n configPermissions?: CollectionEditorPermissionsBuilder<UserType, EC>;\n\n /**\n * The words you define here will not be allowed to be used as group\n * names when creating collections.\n * e.g. [\"admin\"]\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n getPathSuggestions?: (path?: string) => Promise<string[]>;\n\n collectionInference?: CollectionInference;\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n getUser?: (uid: string) => UserType | null;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\n/**\n * Use this hook to initialise the Collection Editor plugin.\n * This is likely the only hook you will need to use.\n * @param firebaseApp Firebase app where your project data lives.\n * @param configPermissions\n * @param reservedGroups\n * @param extraView\n * @param getData\n * @param getUser\n * @param collectionInference\n */\nexport function useCollectionEditorPlugin<EC extends PersistedCollection = PersistedCollection, UserType extends User = User>\n({\n collectionConfigController,\n configPermissions,\n reservedGroups,\n extraView,\n getPathSuggestions,\n getUser,\n collectionInference,\n getData,\n onAnalyticsEvent\n }: CollectionConfigControllerProps<EC, UserType>): FireCMSPlugin<any, any, PersistedCollection> {\n\n return {\n key: \"collection_editor\",\n loading: collectionConfigController.loading,\n provider: {\n Component: ConfigControllerProvider,\n props: {\n collectionConfigController,\n configPermissions,\n collectionInference,\n reservedGroups,\n extraView,\n getPathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }\n },\n homePage: {\n additionalActions: <NewCollectionButton/>,\n additionalChildrenStart: <IntroWidget/>,\n // additionalChildrenEnd: <RootCollectionSuggestions introMode={introMode}/>,\n CollectionActions: HomePageEditorCollectionAction,\n AdditionalCards: NewCollectionCard,\n },\n collectionView: {\n CollectionActionsStart: EditorCollectionActionStart,\n CollectionActions: EditorCollectionAction,\n HeaderAction: CollectionViewHeaderAction,\n AddColumnComponent: PropertyAddColumnComponent\n }\n };\n}\n\nexport function IntroWidget({}: {}) {\n\n const navigation = useNavigationController();\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n if (!navigation.initialised || (navigation.collections ?? []).length > 0) {\n return null;\n }\n\n return (\n <Paper\n className={\"my-4 px-4 py-6 flex flex-col bg-white dark:bg-slate-800 gap-2\"}>\n <Typography variant={\"subtitle2\"} className={\"uppercase\"}>No collections found</Typography>\n <Typography>\n Start building collections in FireCMS easily. Map them to your existing\n database data, import from files, or use our templates.\n </Typography>\n {canCreateCollections && <Button\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n <AddIcon/>Create your first collection\n </Button>}\n <Typography color={\"secondary\"}>\n You can also define collections programmatically.\n </Typography>\n </Paper>\n );\n}\n","import {\n EntityCollection,\n joinCollectionLists,\n makePropertiesEditable,\n ModifyCollectionProps,\n Properties\n} from \"@firecms/core\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\n/**\n * Function in charge of merging collections defined in code with those stored in the backend.\n */\nexport const mergeCollections = (baseCollections: EntityCollection[],\n backendCollections: PersistedCollection[],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void\n) => {\n\n const markAsEditable = (c: PersistedCollection) => {\n makePropertiesEditable(c.properties as Properties);\n c.subcollections?.forEach(markAsEditable);\n };\n const storedCollections = backendCollections ?? [];\n storedCollections.forEach(markAsEditable);\n\n console.debug(\"Collections specified in code:\", baseCollections);\n console.debug(\"Collections stored in the backend\", storedCollections);\n const result = joinCollectionLists(baseCollections, storedCollections, [], modifyCollection);\n console.debug(\"Collections after joining:\", result);\n return result;\n}\n","import { ErrorView, unslugify, useNavigationController } from \"@firecms/core\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { Button } from \"@firecms/ui\";\n\nexport function MissingReferenceWidget({ path: pathProp }: {\n path: string\n}) {\n const navigation = useNavigationController();\n const path = getLastSegment(pathProp);\n const parentCollectionIds = navigation.getParentCollectionIds(pathProp);\n const collectionEditor = useCollectionEditorController();\n return <div className={\"p-1 flex flex-col items-center\"}>\n <ErrorView error={\"No collection for path: \" + path}/>\n <Button className={\"mx-2\"} variant={\"outlined\"}\n size={\"small\"}\n onClick={() => {\n collectionEditor.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds,\n redirect: false,\n sourceClick: \"missing_reference\"\n });\n }}>\n Create\n </Button>\n </div>;\n}\n\nfunction getParentPathSegments(path: string): string[] {\n const segments = path.split(\"/\");\n return segments.filter((segment, index) => index % 2 === 0 && index !== segments.length - 1);\n}\n\nfunction getLastSegment(path: string): string {\n const segments = path.split(\"/\");\n return segments[segments.length - 1];\n}\n"],"names":["Yup","useFormex","useState","getIn","toSnakeCase","singular","useEffect","jsx","IconForView","useAutoComplete","Container","jsxs","Typography","Tooltip","IconButton","Chip","TextField","FieldCaption","cls","Field","DebouncedTextField","Autocomplete","AutocompleteItem","ExpandablePanel","SettingsIcon","ClearIcon","Select","SelectItem","BooleanSwitchWithLabel","Dialog","SearchIconsView","formex","useCreateFormex","values","errors","Formex","extractEnumFromValues","ListIcon","Button","CircularProgress","AutoAwesomeIcon","Paper","ArrayContainer","Fragment","Badge","open","DialogContent","DialogActions","serializeRegExp","RuleIcon","useSnackbarController","useMemo","resolveEnumValues","FileUploadIcon","MultiSelect","MultiSelectItem","Checkbox","isPropertyBuilder","useCustomizationController","getFieldConfig","ErrorBoundary","PropertyConfigBadge","cardMixin","cardClickableMixin","cardSelectedMixin","FunctionsIcon","RemoveCircleIcon","PropertyTree","DragDropContext","Droppable","Draggable","defaultBorderMixin","RemoveIcon","DragHandleIcon","propertiesOrder","AddIcon","CommonPropertyFields","unslugify","useNavigationController","SelectGroup","mergeDeep","DEFAULT_FIELD_CONFIGS","PropertyForm","useRef","property","validateId","isValidRegExp","getFieldId","useDeferredValue","InfoLabel","DeleteIcon","DeleteConfirmationDialog","Highlight","themes","ContentCopyIcon","useLargeLayout","makePropertiesEditable","CodeIcon","resolveEntityView","Table","TableBody","TableRow","TableCell","Alert","Icon","ImportFileUpload","Card","namespace","buildPropertyFromData","getInferenceType","DataNewPropertiesMapping","propertyKey","ImportNewPropertyFieldPreview","widget","convertDataToEntity","useSelectionController","CircularProgressCenter","EntityCollectionTable","slugify","React","useAuthController","randomString","coolIconKeys","useImportConfig","collection","pathError","buildEntityPropertiesFromData","Tabs","Tab","ImportSaveInProgress","error","removeUndefined","ErrorView","ArrowBackIcon","LoadingButton","DoneIcon","removeInitialAndTrailingSlashes","ConfigControllerProvider","useNavigate","useCallback","useContext","Menu","MoreVertIcon","MenuItem","getDefaultPropertiesOrder","SaveIcon","UndoIcon","joinCollectionLists"],"mappings":"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"}