{"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx"],"sourcesContent":["import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n  destination:\n    | {\n        value: string | number;\n        label: string;\n      }\n    | string;\n};\n\ninterface FolderWithType extends Folder {\n  type: string;\n}\n\ninterface FileWithType extends File {\n  type: string;\n}\n\nexport interface BulkMoveDialogProps {\n  onClose: () => void;\n  selected?: Array<FolderWithType | FileWithType>;\n  currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n  const { formatMessage } = useIntl();\n  const { data: folderStructure, isLoading } = useFolderStructure();\n  const { move } = useBulkMove();\n\n  if (!folderStructure) {\n    return null;\n  }\n\n  const handleSubmit = async (\n    values: InitialFormData,\n    { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n  ) => {\n    try {\n      if (typeof values.destination !== 'string') {\n        const destinationValue = values.destination.value;\n        await move(destinationValue, selected);\n        onClose();\n      }\n    } catch (error) {\n      const normalizedError = normalizeAPIError(error as FetchError)!;\n\n      if (normalizedError && 'errors' in normalizedError) {\n        const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n          (acc, error) => {\n            acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n            return acc;\n          },\n          {}\n        );\n\n        if (!isEmpty(formikErrors)) {\n          setErrors(formikErrors);\n        }\n      }\n    }\n  };\n\n  if (isLoading) {\n    return (\n      <Modal.Content>\n        <Modal.Body>\n          <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n            <Loader>\n              {formatMessage({\n                id: getTrad('content.isLoading'),\n                defaultMessage: 'Content is loading.',\n              })}\n            </Loader>\n          </Flex>\n        </Modal.Body>\n      </Modal.Content>\n    );\n  }\n\n  const initialFormData: InitialFormData = {\n    destination: {\n      value: currentFolder?.id || '',\n      label: currentFolder?.name || folderStructure[0].label,\n    },\n  };\n\n  return (\n    <Modal.Content>\n      <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n        {({ values, errors, setFieldValue }) => (\n          <Form noValidate>\n            <Modal.Header>\n              <Modal.Title>\n                {formatMessage({\n                  id: getTrad('modal.folder.move.title'),\n                  defaultMessage: 'Move elements to',\n                })}\n              </Modal.Title>\n            </Modal.Header>\n\n            <Modal.Body>\n              <Grid.Root gap={4}>\n                <Grid.Item xs={12} direction=\"column\" alignItems=\"stretch\">\n                  <Field.Root id=\"folder-destination\">\n                    <Field.Label>\n                      {formatMessage({\n                        id: getTrad('form.input.label.folder-location'),\n                        defaultMessage: 'Location',\n                      })}\n                    </Field.Label>\n\n                    <SelectTree\n                      options={folderStructure as OptionSelectTree[]}\n                      onChange={(value: Record<string, string | number>) => {\n                        setFieldValue('destination', value);\n                      }}\n                      defaultValue={\n                        typeof values.destination !== 'string' ? values.destination : undefined\n                      }\n                      name=\"destination\"\n                      menuPortalTarget={document.querySelector('body')}\n                      inputId=\"folder-destination\"\n                      error={errors?.destination}\n                      ariaErrorMessage=\"destination-error\"\n                    />\n\n                    {errors.destination && (\n                      <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n                        {errors.destination}\n                      </Typography>\n                    )}\n                  </Field.Root>\n                </Grid.Item>\n              </Grid.Root>\n            </Modal.Body>\n\n            <Modal.Footer>\n              <Modal.Close>\n                <Button variant=\"tertiary\" name=\"cancel\">\n                  {formatMessage({ id: 'global.cancel', defaultMessage: 'Cancel' })}\n                </Button>\n              </Modal.Close>\n              <Button type=\"submit\" loading={isLoading}>\n                {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n              </Button>\n            </Modal.Footer>\n          </Form>\n        )}\n      </Formik>\n    </Modal.Content>\n  );\n};\n"],"names":["BulkMoveDialog","onClose","selected","currentFolder","formatMessage","useIntl","data","folderStructure","isLoading","useFolderStructure","move","useBulkMove","handleSubmit","values","setErrors","destination","destinationValue","value","error","normalizedError","normalizeAPIError","formikErrors","errors","reduce","acc","path","length","defaultMessage","isEmpty","_jsx","Modal","Content","Body","Flex","justifyContent","paddingTop","paddingBottom","Loader","id","getTrad","initialFormData","label","name","Formik","validateOnChange","onSubmit","initialValues","setFieldValue","_jsxs","Form","noValidate","Header","Title","Grid","Root","gap","Item","xs","direction","alignItems","Field","Label","SelectTree","options","onChange","defaultValue","undefined","menuPortalTarget","document","querySelector","inputId","ariaErrorMessage","Typography","variant","tag","textColor","Footer","Close","Button","type","loading"],"mappings":"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"}