@strapi/upload 5.0.4 → 5.0.5

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-Bg-hWXGc.mjs","sources":["../../admin/src/utils/appendSearchParamsToUrl.ts","../../admin/src/utils/containsAssetFilter.ts","../../admin/src/utils/prefixFileUrlWithBackendUrl.ts","../../admin/src/utils/createAssetUrl.ts","../../admin/src/utils/displayedFilters.ts","../../admin/src/utils/downloadFile.ts","../../admin/src/utils/findRecursiveFolderByValue.ts","../../admin/src/utils/formatBytes.ts","../../admin/src/utils/formatDuration.ts","../../admin/src/utils/toSingularTypes.ts","../../admin/src/utils/getAllowedFiles.ts","../../admin/src/utils/normalizeAPIError.ts","../../admin/src/utils/getAPIInnerErrors.ts","../../admin/src/pluginId.ts","../../admin/src/utils/getTrad.ts","../../admin/src/utils/getBreadcrumbDataCM.ts","../../admin/src/utils/getFolderURL.ts","../../admin/src/utils/getFileExtension.ts","../../admin/src/components/SelectTree/utils/flattenTree.ts","../../admin/src/utils/getFolderParents.ts","../../admin/src/utils/moveElement.ts","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/newConstants.ts","../../admin/src/utils/typeFromMime.ts","../../admin/src/utils/rawFileToAsset.ts","../../admin/src/utils/urlsToAssets.ts","../../admin/src/utils/urlYupSchema.ts","../../admin/src/constants.js","../../admin/src/hooks/useAssets.ts","../../admin/src/hooks/useFolders.ts","../../admin/src/hooks/useMediaLibraryPermissions.ts","../../admin/src/hooks/useConfig.ts","../../admin/src/hooks/useModalQueryParams.ts","../../admin/src/hooks/useSelectionState.ts","../../admin/src/hooks/useEditAsset.ts","../../admin/src/hooks/utils/rename-keys.ts","../../admin/src/hooks/useFolderStructure.ts","../../admin/src/components/ContextInfo/ContextInfo.jsx","../../admin/src/components/SelectTree/Option.jsx","../../admin/src/components/SelectTree/utils/getOpenValues.js","../../admin/src/components/SelectTree/utils/getValuesToClose.js","../../admin/src/components/SelectTree/SelectTree.jsx","../../admin/src/components/EditAssetDialog/DialogHeader.jsx","../../admin/src/hooks/useCropImg.ts","../../admin/src/hooks/useUpload.ts","../../admin/src/hooks/useClipboard.ts","../../admin/src/components/CopyLinkButton/index.jsx","../../admin/src/components/UploadProgress/index.jsx","../../admin/src/hooks/useRemoveAsset.ts","../../admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx","../../admin/src/hooks/usePersistentState.ts","../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/components.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/index.jsx","../../admin/src/components/EditAssetDialog/ReplaceMediaButton.jsx","../../admin/src/components/EditAssetDialog/index.jsx","../../admin/src/hooks/useBulkRemove.ts","../../admin/src/hooks/useEditFolder.ts","../../admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.jsx","../../admin/src/components/EditFolderDialog/RemoveFolderDialog.jsx","../../admin/src/components/EditFolderDialog/EditFolderDialog.jsx","../../admin/src/hooks/useFolder.ts","../../admin/src/components/AssetCard/AssetCardBase.jsx","../../admin/src/components/AssetCard/AudioPreview.jsx","../../admin/src/components/AssetCard/AudioAssetCard.jsx","../../admin/src/components/AssetCard/DocAssetCard.jsx","../../admin/src/components/AssetCard/ImageAssetCard.jsx","../../admin/src/components/AssetCard/VideoPreview.jsx","../../admin/src/components/AssetCard/VideoAssetCard.jsx","../../admin/src/components/AssetCard/AssetCard.jsx","../../admin/src/components/AssetGridList/Draggable.jsx","../../admin/src/components/AssetGridList/index.jsx","../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.jsx","../../admin/src/components/Breadcrumbs/Breadcrumbs.jsx","../../admin/src/components/EmptyAssets/EmptyAssetGrid.jsx","../../admin/src/components/EmptyAssets/index.jsx","../../admin/src/components/FolderCard/contexts/FolderCard.jsx","../../admin/src/components/FolderCard/hooks/useId.js","../../admin/src/components/FolderCard/FolderCard/FolderCard.jsx","../../admin/src/components/FolderCard/FolderCardBody/FolderCardBody.jsx","../../admin/src/components/FolderCard/FolderCardBodyAction/index.jsx","../../admin/src/components/FolderGridList/FolderGridList.jsx","../../admin/src/components/SortPicker/index.jsx","../../admin/src/components/TableList/PreviewCell.jsx","../../admin/src/components/TableList/CellContent.jsx","../../admin/src/components/TableList/TableRows.jsx","../../admin/src/components/TableList/index.jsx","../../admin/src/components/FilterList/FilterTag.jsx","../../admin/src/components/FilterList/index.jsx","../../admin/src/components/FilterPopover/FilterValueInput.jsx","../../admin/src/components/FilterPopover/utils/getFilterList.js","../../admin/src/components/FilterPopover/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/Filters.jsx","../../admin/src/components/AssetDialog/BrowseStep/PageSize.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationContext.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/utils/isSelectable.js","../../admin/src/components/AssetDialog/BrowseStep/index.jsx","../../admin/src/components/AssetDialog/DialogFooter.jsx","../../admin/src/components/AssetDialog/SelectedStep/index.jsx","../../admin/src/components/AssetDialog/index.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.jsx","../../admin/src/components/AssetCard/UploadingAssetCard.jsx","../../admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx","../../admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx","../../admin/src/components/MediaLibraryDialog/index.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx","../../admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.jsx","../../admin/src/components/MediaLibraryInput/index.jsx","../../admin/src/index.js"],"sourcesContent":["interface AppendSearchParamsToUrlProps {\n url?: string;\n params?: Record<string, string | null | undefined> | string;\n}\n\nconst appendSearchParamsToUrl = ({ url, params }: AppendSearchParamsToUrlProps) => {\n if (url === undefined || typeof params !== 'object') {\n return url;\n }\n\n const urlObj = new URL(url, window.strapi.backendURL);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlObj.searchParams.append(key, value);\n }\n });\n\n return urlObj.toString();\n};\n\nexport { appendSearchParamsToUrl };\n","import type { Query } from '../../../shared/contracts/files';\n\nconst containsMimeTypeFilter = (query: Query | null) => {\n const filters = query?.filters?.$and;\n\n if (!filters) {\n return false;\n }\n\n const result = filters.find((filter) => {\n return Object.keys(filter).includes('mime');\n });\n\n return !!result;\n};\n\nexport const containsAssetFilter = (query: Query | null) => {\n return containsMimeTypeFilter(query);\n};\n","export const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n","import { prefixFileUrlWithBackendUrl } from './prefixFileUrlWithBackendUrl';\n\nimport type { File } from '../../../shared/contracts/files';\n\nexport const createAssetUrl = (asset: File, forThumbnail = true) => {\n if (asset.isLocal) {\n return asset.url;\n }\n\n const assetUrl = forThumbnail ? asset?.formats?.thumbnail?.url || asset.url : asset.url;\n\n return prefixFileUrlWithBackendUrl(assetUrl);\n};\n","export const displayedFilters = [\n {\n name: 'createdAt',\n fieldSchema: {\n type: 'date',\n },\n metadatas: { label: 'createdAt' },\n },\n {\n name: 'updatedAt',\n fieldSchema: {\n type: 'date',\n },\n metadatas: { label: 'updatedAt' },\n },\n {\n name: 'mime',\n fieldSchema: {\n type: 'enumeration',\n options: [\n { label: 'audio', value: 'audio' },\n { label: 'file', value: 'file' },\n { label: 'image', value: 'image' },\n { label: 'video', value: 'video' },\n ],\n },\n metadatas: { label: 'type' },\n },\n];\n","export const downloadFile = async (url: string, fileName: string) => {\n const fileBlob = await fetch(url).then((res) => res.blob());\n const urlDownload = window.URL.createObjectURL(fileBlob);\n const link = document.createElement('a');\n\n link.href = urlDownload;\n link.setAttribute('download', fileName);\n link.click();\n};\n","import type { FolderNode } from '../../../shared/contracts/folders';\n\ninterface FolderStructureValue extends Omit<FolderNode, 'children'> {\n value: number | null;\n children?: FolderStructureValue[];\n}\n\ntype Value = number | null | { value: number | null };\n\nexport function findRecursiveFolderByValue(data: FolderStructureValue[], value: Value) {\n let result;\n\n function iter(a: FolderStructureValue) {\n if (a.value === value) {\n result = a;\n\n return true;\n }\n\n return Array.isArray(a.children) && a.children.some(iter);\n }\n\n data.some(iter);\n\n return result;\n}\n","import byteSize from 'byte-size';\n\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n","import { intervalToDuration } from 'date-fns';\n\nconst zeroPad = (num?: number) => String(num).padStart(2, '0');\n\nexport const formatDuration = (durationInSecond: number) => {\n const duration = intervalToDuration({ start: 0, end: durationInSecond * 1000 });\n\n return `${zeroPad(duration.hours)}:${zeroPad(duration.minutes)}:${zeroPad(duration.seconds)}`;\n};\n","export const toSingularTypes = (types?: string[]) => {\n if (!types) {\n return [];\n }\n\n return types.map((type) => type.substring(0, type.length - 1));\n};\n\nexport default toSingularTypes;\n","import { toSingularTypes } from './toSingularTypes';\nimport type { File } from '../../../shared/contracts/files';\n/**\n * Returns the files that can be added to the media field\n * @param {Object[]} pluralTypes Array of string (allowedTypes)\n * @param {Object[]} files Array of files\n * @returns Object[]\n */\n\ninterface AllowedFiles extends File {\n documentId: string;\n isSelectable: boolean;\n locale: string | null;\n type: string;\n}\n\nexport const getAllowedFiles = (pluralTypes: string[], files: AllowedFiles[]) => {\n const singularTypes = toSingularTypes(pluralTypes);\n\n const allowedFiles = files.filter((file) => {\n const fileType = file?.mime?.split('/')[0];\n\n if (!fileType) {\n return false;\n }\n\n if (singularTypes.includes('file') && !['video', 'image', 'audio'].includes(fileType)) {\n return true;\n }\n\n return singularTypes.includes(fileType);\n });\n\n return allowedFiles;\n};\n","import type { errors } from '@strapi/utils';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype ApiError = InstanceType<(typeof errors)[keyof typeof errors]>;\n\ninterface NormalizeErrorOptions {\n name?: string;\n intlMessagePrefixCallback?: (id: string) => string;\n}\n\ninterface NormalizeErrorReturn {\n id: string;\n defaultMessage: string;\n name?: string;\n values: Record<'path', string> | Record<string, never>;\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nfunction getPrefixedId(message: string, callback?: (prefixedMessage: string) => string) {\n const prefixedMessage = `apiError.${message}`;\n\n // if a prefix function has been passed in it is used to\n // prefix the id, e.g. to allow an error message to be\n // set only for a localization namespace\n if (typeof callback === 'function') {\n return callback(prefixedMessage);\n }\n\n return prefixedMessage;\n}\n\nfunction normalizeError(\n error: ApiError | YupFormattedError,\n { name, intlMessagePrefixCallback }: NormalizeErrorOptions\n): NormalizeErrorReturn {\n const { message } = error;\n\n const normalizedError = {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n name: error.name ?? name,\n values: {},\n };\n\n if ('path' in error) {\n normalizedError.values = { path: error.path.join('.') };\n }\n\n return normalizedError;\n}\n\nconst validateErrorIsYupValidationError = (\n err: ApiError\n): err is errors.YupValidationError & { details: { errors: YupFormattedError[] } } =>\n typeof err.details === 'object' && err.details !== null && 'errors' in err.details;\n\n/**\n * Normalize the format of `ResponseError`\n * in places where the hook `useAPIErrorHandler` can not called\n * (e.g. outside of a React component).\n */\nexport function normalizeAPIError(\n apiError: FetchError,\n intlMessagePrefixCallback?: NormalizeErrorOptions['intlMessagePrefixCallback']\n):\n | NormalizeErrorReturn\n | { name: string; message: string | null; errors: NormalizeErrorReturn[] }\n | null {\n const error = apiError.response?.data.error;\n\n if (error) {\n // some errors carry multiple errors (such as ValidationError)\n if (validateErrorIsYupValidationError(error)) {\n return {\n name: error.name,\n message: error?.message || null,\n errors: error.details.errors.map((err) =>\n normalizeError(err, { name: error.name, intlMessagePrefixCallback })\n ),\n };\n }\n\n return normalizeError(error, { intlMessagePrefixCallback });\n }\n\n return null;\n}\n","import { normalizeAPIError } from './normalizeAPIError';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype GetAPIInnerErrorsReturn = {\n [key: string]: MessageDescriptor;\n};\n\n/**\n *\n * Returns a normalized error message\n *\n */\nexport function getAPIInnerErrors(\n error: FetchError,\n { getTrad }: { getTrad: (key: string) => string }\n) {\n const normalizedError = normalizeAPIError(error, getTrad);\n\n if (normalizedError && 'errors' in normalizedError) {\n return normalizedError.errors.reduce<GetAPIInnerErrorsReturn>((acc, error) => {\n if ('path' in error.values) {\n acc[error.values.path] = {\n id: error.id,\n defaultMessage: error.defaultMessage,\n };\n }\n\n return acc;\n }, {});\n }\n\n return normalizedError?.defaultMessage;\n}\n","import pluginPkg from '../../package.json';\n\nexport const pluginId = pluginPkg.name.replace(/^@strapi\\//i, '');\n\nexport default pluginId;\n","import pluginId from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n","import { getTrad } from './getTrad';\n\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface BreadcrumbDataFolder extends Omit<Folder, 'children' | 'files' | 'parent'> {\n parent?: BreadcrumbDataFolder;\n children?: {\n count: number;\n };\n files?: {\n count: number;\n };\n}\n\ninterface BreadcrumbItem {\n id?: number | null;\n label?: MessageDescriptor | string;\n path?: string;\n}\n\ntype BreadcrumbData = BreadcrumbItem | [];\n\nexport const getBreadcrumbDataCM = (folder: BreadcrumbDataFolder | null) => {\n let data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n },\n ];\n\n if (folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent) {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n path: folder.parent.path,\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n path: folder.path,\n });\n }\n\n return data;\n};\n","import type { Query } from '../../../shared/contracts/files';\n\nimport { stringify } from 'qs';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...queryParamsWithoutQ,\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n","export const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n","type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n children?: TreeNode<T>[];\n};\n\nexport default function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0\n): FlattenedNode<T>[] {\n return tree.flatMap((item) =>\n item.children\n ? [{ ...item, parent: parent?.value, depth }, ...flattenTree(item.children, item, depth + 1)]\n : { ...item, depth, parent: parent?.value }\n );\n}\n","import flattenTree from '../components/SelectTree/utils/flattenTree';\n\nimport type { FolderNode } from '../../../shared/contracts/folders';\n\ninterface FolderStructureValue extends Omit<FolderNode, 'children'> {\n value: number | null;\n children?: FolderStructureValue[];\n}\n\nexport const getFolderParents = (folders: FolderStructureValue[], currentFolderId: number) => {\n const parents = [];\n const flatFolders = flattenTree(folders);\n const currentFolder = flatFolders.find((folder) => folder.value === currentFolderId);\n\n if (!currentFolder) {\n return [];\n }\n\n let { parent } = currentFolder;\n\n while (parent !== undefined) {\n // eslint-disable-next-line no-loop-func\n let parentToStore = flatFolders.find(({ value }) => value === parent);\n parents.push({ id: parentToStore?.value, label: parentToStore?.label });\n parent = parentToStore?.parent;\n }\n\n return parents.reverse();\n};\n","const move = (array: number[], oldIndex: number, newIndex: number) => {\n if (newIndex >= array.length) {\n newIndex = array.length - 1;\n }\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\n\n return array;\n};\n\nexport const moveElement = (array: number[], index: number, offset: number) => {\n const newIndex = index + offset;\n\n return move(array, index, newIndex);\n};\n","type Translations = {\n [key: string]: string;\n};\n\nexport const prefixPluginTranslations = (trad: Translations, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce((acc: Translations, current: string) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n }, {});\n};\n","// TODO: replace this file with the constants file when it will be migrated to TS\nexport enum AssetType {\n Video = 'video',\n Image = 'image',\n Document = 'doc',\n Audio = 'audio',\n}\n\nexport enum AssetSource {\n Url = 'url',\n Computer = 'computer',\n}\n\nexport const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::upload.read', subject: null },\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n {\n action: 'plugin::upload.assets.update',\n subject: null,\n },\n ],\n copyLink: [\n {\n action: 'plugin::upload.assets.copy-link',\n subject: null,\n },\n ],\n create: [\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n ],\n download: [\n {\n action: 'plugin::upload.assets.download',\n subject: null,\n },\n ],\n read: [{ action: 'plugin::upload.read', subject: null }],\n configureView: [{ action: 'plugin::upload.configure-view', subject: null }],\n settings: [{ action: 'plugin::upload.settings.read', subject: null }],\n update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }],\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetType } from '../newConstants';\n\nexport const typeFromMime = (mime: string) => {\n if (mime.includes(AssetType.Image)) {\n return AssetType.Image;\n }\n if (mime.includes(AssetType.Video)) {\n return AssetType.Video;\n }\n if (mime.includes(AssetType.Audio)) {\n return AssetType.Audio;\n }\n\n return AssetType.Document;\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetSource } from '../newConstants';\nimport { typeFromMime } from './typeFromMime';\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = (rawFile: RawFile, assetSource: AssetSource) => {\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(rawFile.type),\n url: URL.createObjectURL(rawFile),\n ext: rawFile.name.split('.').pop(),\n mime: rawFile.type,\n rawFile,\n isLocal: true,\n };\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetSource } from '../newConstants';\n\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]) => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = assetsResults.map((fullFilledAsset) => ({\n source: AssetSource.Url,\n name: fullFilledAsset.name,\n type: typeFromMime(fullFilledAsset.mime!),\n url: fullFilledAsset.url,\n ext: fullFilledAsset.url.split('.').pop(),\n mime: fullFilledAsset.mime,\n rawFile: fullFilledAsset.rawFile,\n }));\n\n return assets;\n};\n","import { translatedErrors as errorsTrads } from '@strapi/admin/strapi-admin';\nimport * as yup from 'yup';\n\nimport { getTrad } from './getTrad';\n\nexport const urlSchema = yup.object().shape({\n urls: yup.string().test({\n name: 'isUrlValid',\n // eslint-disable-next-line no-template-curly-in-string\n message: '${path}',\n test(values = '') {\n const urls = values.split(/\\r?\\n/);\n\n if (urls.length === 0) {\n return this.createError({\n path: this.path,\n message: errorsTrads.min.id,\n });\n }\n\n if (urls.length > 20) {\n return this.createError({\n path: this.path,\n message: errorsTrads.max.id,\n });\n }\n\n const filtered = urls.filter((val) => {\n try {\n // eslint-disable-next-line no-new\n new URL(val);\n\n return false;\n } catch (err) {\n // invalid url\n return true;\n }\n });\n\n const filteredLength = filtered.length;\n\n if (filteredLength === 0) {\n return true;\n }\n\n const errorMessage =\n filteredLength > 1\n ? 'form.upload-url.error.url.invalids'\n : 'form.upload-url.error.url.invalid';\n\n return this.createError({\n path: this.path,\n message: getTrad(errorMessage),\n params: { number: filtered.length },\n });\n },\n }),\n});\n","import PropTypes from 'prop-types';\n\nimport { getTrad } from './utils';\n\nexport const AssetType = {\n Video: 'video',\n Image: 'image',\n Document: 'doc',\n Audio: 'audio',\n};\n\nexport const AssetSource = {\n Url: 'url',\n Computer: 'computer',\n};\n\nconst ParentFolderShape = {\n id: PropTypes.number.isRequired,\n createdAt: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n updatedAt: PropTypes.string.isRequired,\n pathId: PropTypes.number.isRequired,\n path: PropTypes.string.isRequired,\n};\n\nParentFolderShape.parent = PropTypes.shape(ParentFolderShape);\n\nconst FolderShape = {\n id: PropTypes.number,\n children: PropTypes.shape({\n count: PropTypes.number.isRequired,\n }),\n createdAt: PropTypes.string,\n createdBy: PropTypes.shape(),\n files: PropTypes.shape({\n count: PropTypes.number.isRequired,\n }),\n name: PropTypes.string,\n updatedAt: PropTypes.string,\n updatedBy: PropTypes.shape(),\n pathId: PropTypes.number,\n path: PropTypes.string,\n};\n\nFolderShape.parent = PropTypes.shape(ParentFolderShape);\n\nexport const FolderDefinition = PropTypes.shape(FolderShape);\n\nconst FolderStructure = PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n label: PropTypes.string.isRequired,\n children: PropTypes.array,\n});\n\nFolderStructure.children = PropTypes.arrayOf(PropTypes.shape(FolderStructure));\nFolderStructure.defaultProps = {\n children: undefined,\n};\n\nexport const FolderStructureDefinition = PropTypes.arrayOf(FolderStructure);\n\nexport const AssetDefinition = PropTypes.shape({\n id: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n size: PropTypes.number,\n createdAt: PropTypes.string,\n ext: PropTypes.string,\n mime: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n updatedAt: PropTypes.string,\n alternativeText: PropTypes.string,\n caption: PropTypes.string,\n folder: PropTypes.shape(FolderDefinition),\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n});\n\nexport const CrumbDefinition = PropTypes.shape({\n id: PropTypes.number,\n label: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n defaultMessage: PropTypes.string.isRequired,\n }),\n ]).isRequired,\n href: PropTypes.string,\n});\n\nexport const CrumbMenuDefinition = PropTypes.arrayOf(CrumbDefinition);\n\nexport const BreadcrumbsDefinition = PropTypes.arrayOf(\n PropTypes.oneOfType([CrumbDefinition, CrumbMenuDefinition])\n);\n\nexport const viewOptions = {\n GRID: 0,\n LIST: 1,\n};\nexport const tableHeaders = [\n {\n name: 'preview',\n key: 'preview',\n metadatas: {\n label: { id: getTrad('list.table.header.preview'), defaultMessage: 'preview' },\n isSortable: false,\n },\n type: 'image',\n },\n {\n name: 'name',\n key: 'name',\n metadatas: {\n label: { id: getTrad('list.table.header.name'), defaultMessage: 'name' },\n isSortable: true,\n },\n type: 'text',\n },\n {\n name: 'ext',\n key: 'extension',\n metadatas: {\n label: { id: getTrad('list.table.header.ext'), defaultMessage: 'extension' },\n isSortable: false,\n },\n type: 'ext',\n },\n {\n name: 'size',\n key: 'size',\n metadatas: {\n label: { id: getTrad('list.table.header.size'), defaultMessage: 'size' },\n isSortable: false,\n },\n type: 'size',\n },\n {\n name: 'createdAt',\n key: 'createdAt',\n metadatas: {\n label: { id: getTrad('list.table.header.createdAt'), defaultMessage: 'created' },\n isSortable: true,\n },\n type: 'date',\n },\n {\n name: 'updatedAt',\n key: 'updatedAt',\n metadatas: {\n label: { id: getTrad('list.table.header.updatedAt'), defaultMessage: 'last update' },\n isSortable: true,\n },\n type: 'date',\n },\n];\n\nexport const pageSizes = [10, 20, 50, 100];\n\nexport const sortOptions = [\n { key: 'sort.created_at_desc', value: 'createdAt:DESC' },\n { key: 'sort.created_at_asc', value: 'createdAt:ASC' },\n { key: 'sort.name_asc', value: 'name:ASC' },\n { key: 'sort.name_desc', value: 'name:DESC' },\n { key: 'sort.updated_at_desc', value: 'updatedAt:DESC' },\n { key: 'sort.updated_at_asc', value: 'updatedAt:ASC' },\n];\n\nexport const localStorageKeys = {\n modalView: `STRAPI_UPLOAD_MODAL_VIEW`,\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::upload.read', subject: null },\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n {\n action: 'plugin::upload.assets.update',\n subject: null,\n },\n ],\n copyLink: [\n {\n action: 'plugin::upload.assets.copy-link',\n subject: null,\n },\n ],\n create: [\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n ],\n download: [\n {\n action: 'plugin::upload.assets.download',\n subject: null,\n },\n ],\n read: [{ action: 'plugin::upload.read', subject: null }],\n configureView: [{ action: 'plugin::upload.configure-view', subject: null }],\n settings: [{ action: 'plugin::upload.settings.read', subject: null }],\n update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }],\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\nimport { Query, GetFiles } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport type { Query } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\ninterface UseFoldersOptions {\n enabled?: boolean;\n query?: Query;\n}\n\nexport const useFolders = ({ enabled = true, query = {} }: UseFoldersOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { folder, _q, ...paramsExceptFolderAndQ } = query;\n const { get } = useFetchClient();\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n _q,\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n parent: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFolders.Response['data'],\n GetFolders.Response['error']\n >(\n [pluginId, 'folders', stringify(params)],\n async () => {\n const {\n data: { data },\n } = await get<GetFolders.Response>('/upload/folders', { params });\n\n return data;\n },\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The folders have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return { data, error, isLoading };\n};\n","import { useRBAC } from '@strapi/admin/strapi-admin';\n\n// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { PERMISSIONS } from '../newConstants';\n\nconst { main, ...restPermissions } = PERMISSIONS;\n\nexport const useMediaLibraryPermissions = () => {\n const { allowedActions, isLoading } = useRBAC(restPermissions);\n\n return { ...allowedActions, isLoading };\n};\n","import { useTracking, useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery, UseMutationResult, UseQueryResult } from 'react-query';\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\n\nimport pluginId from '../pluginId';\n\nconst endpoint = `/${pluginId}/configuration`;\nconst queryKey = [pluginId, 'configuration'];\n\nexport const useConfig = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n\n const config: UseQueryResult<\n GetConfiguration.Response['data']['data'] | GetConfiguration.Response['error']\n > = useQuery(\n queryKey,\n async () => {\n const res: GetConfiguration.Response = await get(endpoint);\n\n return res.data.data;\n },\n {\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n /**\n * We're cementing that we always expect an object to be returned.\n */\n select: (data) => data || {},\n }\n );\n\n const putMutation: UseMutationResult<\n void,\n UpdateConfiguration.Response['error'],\n UpdateConfiguration.Request['body']\n > = useMutation(\n async (body) => {\n await put<UpdateConfiguration.Response>(endpoint, body);\n },\n {\n onSuccess() {\n trackUsage('didEditMediaLibraryConfig');\n config.refetch();\n },\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n return {\n config,\n mutateConfig: putMutation,\n };\n};\n","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { stringify } from 'qs';\n\nimport { useConfig } from './useConfig';\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nconst useModalQueryParams = (initialState?: Partial<Query>) => {\n const { trackUsage } = useTracking();\n const {\n config: { data: config },\n } = useConfig();\n\n const [queryObject, setQueryObject] = React.useState<Query>({\n page: 1,\n sort: 'updatedAt:DESC',\n pageSize: 10,\n filters: {\n $and: [],\n },\n ...initialState,\n });\n\n React.useEffect(() => {\n if (config && 'sort' in config && 'pageSize' in config) {\n setQueryObject((prevQuery) => ({\n ...prevQuery,\n sort: config.sort,\n pageSize: config.pageSize,\n }));\n }\n }, [config]);\n\n const handleChangeFilters = (nextFilters: FilterCondition<string>[]) => {\n if (nextFilters) {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(nextFilters[nextFilters.length - 1])[0],\n });\n setQueryObject((prev) => ({ ...prev, page: 1, filters: { $and: nextFilters } }));\n }\n };\n\n const handleChangePageSize = (pageSize: Query['pageSize']) => {\n setQueryObject((prev) => ({\n ...prev,\n pageSize: typeof pageSize === 'string' ? parseInt(pageSize, 10) : pageSize,\n page: 1,\n }));\n };\n\n const handeChangePage = (page: Query['page']) => {\n setQueryObject((prev) => ({ ...prev, page }));\n };\n\n const handleChangeSort = (sort: Query['sort']) => {\n if (sort) {\n trackUsage('didSortMediaLibraryElements', {\n location: 'content-manager',\n sort,\n });\n setQueryObject((prev) => ({ ...prev, sort }));\n }\n };\n\n const handleChangeSearch = (_q: Query['_q']) => {\n if (_q) {\n setQueryObject((prev) => ({ ...prev, _q, page: 1 }));\n } else {\n const newState: Query = { page: 1 };\n\n Object.keys(queryObject).forEach((key) => {\n if (!['page', '_q'].includes(key)) {\n // @ts-ignore\n newState[key] = queryObject[key];\n }\n });\n\n setQueryObject(newState);\n }\n };\n\n const handleChangeFolder = (folder: Query['folder'], folderPath: Query['folderPath']) => {\n setQueryObject((prev) => ({ ...prev, folder: folder ?? null, folderPath }));\n };\n\n return [\n { queryObject, rawQuery: stringify(queryObject, { encode: false }) },\n {\n onChangeFilters: handleChangeFilters,\n onChangeFolder: handleChangeFolder,\n onChangePage: handeChangePage,\n onChangePageSize: handleChangePageSize,\n onChangeSort: handleChangeSort,\n onChangeSearch: handleChangeSearch,\n },\n ];\n};\n\nexport default useModalQueryParams;\n","import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // filter out items in currSelections that are in nextSelections\n ...currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport type ErrorMutation = {\n message: string;\n response: {\n status: number;\n data: {\n error: Error;\n };\n };\n} | null;\n\nconst editAssetRequest = (\n asset: FileAsset,\n file: File,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const endpoint = `/${pluginId}?id=${asset.id}`;\n\n const formData = new FormData();\n\n if (file) {\n formData.append('files', file);\n }\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n alternativeText: asset.alternativeText,\n caption: asset.caption,\n folder: asset.folder,\n name: asset.name,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useEditAsset = () => {\n const [progress, setProgress] = React.useState(0);\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFile.Response['data'],\n ErrorMutation,\n { asset: FileAsset; file: File }\n >(({ asset, file }) => editAssetRequest(asset, file, signal, setProgress, post), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n },\n onError(reason) {\n if (reason?.response?.status === 403) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('permissions.not-allowed.update') }),\n });\n } else {\n toggleNotification({ type: 'danger', message: reason?.message });\n }\n },\n });\n\n const editAsset = (asset: FileAsset, file: File) => mutation.mutateAsync({ asset, file });\n\n const cancel = () => abortController.abort();\n\n return { ...mutation, cancel, editAsset, progress, status: mutation.status };\n};\n","type Primitive = string | number | boolean | null | undefined;\n\nexport type DeepRecord<T> = {\n [K in keyof T]: T[K] extends Primitive ? T[K] : DeepRecord<T[K]>;\n};\n\nexport const recursiveRenameKeys = <T extends object>(\n obj: T,\n fn: (key: string) => string\n): DeepRecord<T> =>\n Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n const getValue = (v: unknown): any =>\n typeof v === 'object' && v !== null ? recursiveRenameKeys(v, fn) : v;\n\n return [fn(key), Array.isArray(value) ? value.map((val) => getValue(val)) : getValue(value)];\n })\n ) as DeepRecord<T>;\n","import { useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport { recursiveRenameKeys } from './utils/rename-keys';\n\nimport { FolderNode, GetFolderStructure } from '../../../shared/contracts/folders';\n\nconst FIELD_MAPPING: Record<string, string> = {\n name: 'label',\n id: 'value',\n};\n\nexport const useFolderStructure = ({ enabled = true } = {}) => {\n const { formatMessage } = useIntl();\n const { get } = useFetchClient();\n\n const fetchFolderStructure = async () => {\n const {\n data: { data },\n } = await get<GetFolderStructure.Response['data']>('/upload/folder-structure');\n\n const children = data.map((f: FolderNode) =>\n recursiveRenameKeys(f, (key) => FIELD_MAPPING?.[key] ?? key)\n );\n\n return [\n {\n value: null,\n label: formatMessage({\n id: getTrad('form.input.label.folder-location-default-label'),\n defaultMessage: 'Media Library',\n }),\n children,\n },\n ];\n };\n\n const { data, error, isLoading } = useQuery(\n [pluginId, 'folder', 'structure'],\n fetchFolderStructure,\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n }\n );\n\n return { data, error, isLoading };\n};\n","import React from 'react';\n\nimport { Box, Flex, Grid, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const ContextInfo = ({ blocks }) => {\n return (\n <Box\n hasRadius\n paddingLeft={6}\n paddingRight={6}\n paddingTop={4}\n paddingBottom={4}\n background=\"neutral100\"\n >\n <Grid.Root gap={4}>\n {blocks.map(({ label, value }) => (\n <Grid.Item col={6} xs={12} key={label} direction=\"column\" alignItems=\"stretch\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {value}\n </Typography>\n </Flex>\n </Grid.Item>\n ))}\n </Grid.Root>\n </Box>\n );\n};\n\nContextInfo.propTypes = {\n blocks: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n })\n ).isRequired,\n};\n","import React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { ChevronDown, ChevronUp } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { components } from 'react-select';\nimport { styled } from 'styled-components';\n\nconst ToggleButton = styled(Flex)`\n align-self: flex-end;\n height: 2.2rem;\n width: 2.8rem;\n\n &:hover,\n &:focus {\n background-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst Option = ({ children, data, selectProps, ...props }) => {\n const { formatMessage } = useIntl();\n const { depth, value, children: options } = data;\n const { maxDisplayDepth, openValues, onOptionToggle } = selectProps;\n const isOpen = openValues.includes(value);\n\n const Icon = isOpen ? ChevronUp : ChevronDown;\n\n return (\n <components.Option {...props}>\n <Flex alignItems=\"start\">\n <Typography textColor=\"neutral800\" ellipsis>\n <span style={{ paddingLeft: `${Math.min(depth, maxDisplayDepth) * 14}px` }}>\n {children}\n </span>\n </Typography>\n\n {options?.length > 0 && (\n <ToggleButton\n aria-label={formatMessage({\n id: 'app.utils.toggle',\n defaultMessage: 'Toggle',\n })}\n tag=\"button\"\n alignItems=\"center\"\n hasRadius\n justifyContent=\"center\"\n marginLeft=\"auto\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n\n onOptionToggle(value);\n }}\n >\n <Icon width=\"1.4rem\" fill=\"neutral500\" />\n </ToggleButton>\n )}\n </Flex>\n </components.Option>\n );\n};\n\nOption.propTypes = {\n children: PropTypes.node.isRequired,\n data: PropTypes.object.isRequired,\n onToggle: PropTypes.func.isRequired,\n selectProps: PropTypes.shape({\n maxDisplayDepth: PropTypes.number,\n openValues: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n onOptionToggle: PropTypes.func,\n }).isRequired,\n};\n\nexport default Option;\n","function getOpenValues(options, defaultValue = {}) {\n let values = [];\n const { value } = defaultValue;\n const option = options.find((option) => option.value === value);\n\n if (!option) {\n return values;\n }\n\n values.push(option.value);\n\n let { parent } = option;\n\n while (parent !== undefined) {\n // eslint-disable-next-line no-loop-func\n const option = options.find(({ value }) => value === parent);\n\n values.push(option.value);\n parent = option.parent;\n }\n\n return values.reverse();\n}\n\nexport default getOpenValues;\n","function getValuesToClose(options, value) {\n const optionForValue = options.find((option) => option.value === value);\n\n return options\n .filter((option) => option.depth >= optionForValue.depth)\n .map((option) => option.value);\n}\n\nexport default getValuesToClose;\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { Cross, CaretDown } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport ReactSelect, { components } from 'react-select';\nimport { styled, useTheme } from 'styled-components';\n\nimport Option from './Option';\nimport flattenTree from './utils/flattenTree';\nimport getOpenValues from './utils/getOpenValues';\nimport getValuesToClose from './utils/getValuesToClose';\n\nconst hasParent = (option) => !option.parent;\n\nconst SelectTree = ({ options: defaultOptions, maxDisplayDepth, defaultValue, ...props }) => {\n const flatDefaultOptions = useMemo(() => flattenTree(defaultOptions), [defaultOptions]);\n const optionsFiltered = useMemo(() => flatDefaultOptions.filter(hasParent), [flatDefaultOptions]);\n const [options, setOptions] = useState(optionsFiltered);\n const [openValues, setOpenValues] = useState(getOpenValues(flatDefaultOptions, defaultValue));\n\n useEffect(() => {\n if (openValues.length === 0) {\n setOptions(flatDefaultOptions.filter((option) => option.parent === undefined));\n } else {\n const allOpenValues = openValues.reduce((acc, value) => {\n const options = flatDefaultOptions.filter(\n (option) => option.value === value || option.parent === value\n );\n\n options.forEach((option) => {\n const values = getOpenValues(flatDefaultOptions, option);\n acc = [...acc, ...values];\n });\n\n return acc;\n }, []);\n\n const nextOptions = flatDefaultOptions.filter((option) =>\n allOpenValues.includes(option.value)\n );\n\n setOptions(nextOptions);\n }\n }, [openValues, flatDefaultOptions, optionsFiltered]);\n\n const handleToggle = (value) => {\n if (openValues.includes(value)) {\n const valuesToClose = getValuesToClose(flatDefaultOptions, value);\n setOpenValues((prev) => prev.filter((prevData) => !valuesToClose.includes(prevData)));\n } else {\n setOpenValues((prev) => [...prev, value]);\n }\n };\n\n return (\n <Select\n components={{ Option }}\n options={options}\n defaultValue={defaultValue}\n isSearchable={false}\n /* -- custom props, used by the Option component */\n maxDisplayDepth={maxDisplayDepth}\n openValues={openValues}\n onOptionToggle={handleToggle}\n /* -- / custom props */\n {...props}\n />\n );\n};\n\nconst Select = ({ components, styles, error, ariaErrorMessage, ...props }) => {\n const theme = useTheme();\n const customStyles = getSelectStyles(theme, error);\n\n return (\n <ReactSelect\n menuPosition=\"fixed\"\n components={{\n ClearIndicator,\n DropdownIndicator,\n IndicatorSeparator: () => null,\n LoadingIndicator: () => null,\n ...components,\n }}\n aria-errormessage={error && ariaErrorMessage}\n aria-invalid={!!error}\n styles={{ ...customStyles, ...styles }}\n {...props}\n />\n );\n};\n\nSelect.defaultProps = {\n ariaErrorMessage: '',\n components: {},\n error: undefined,\n styles: {},\n};\n\nSelect.propTypes = {\n components: PropTypes.object,\n styles: PropTypes.object,\n error: PropTypes.string,\n ariaErrorMessage: PropTypes.string,\n};\n\nconst IconBox = styled(Box)`\n background: transparent;\n border: none;\n position: relative;\n z-index: 1;\n\n svg {\n height: 1.1rem;\n width: 1.1rem;\n }\n\n svg path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nconst ClearIndicator = (props) => {\n const Component = components.ClearIndicator;\n\n return (\n <Component {...props}>\n <IconBox tag=\"button\" type=\"button\">\n <Cross />\n </IconBox>\n </Component>\n );\n};\n\nconst CarretBox = styled(IconBox)`\n display: flex;\n background: none;\n border: none;\n\n svg {\n width: 0.9rem;\n }\n`;\n\nconst DropdownIndicator = ({ innerProps }) => {\n return (\n // @ts-expect-error – issue with the ref attached to `innerProps`\n <CarretBox paddingRight={3} {...innerProps}>\n <CaretDown />\n </CarretBox>\n );\n};\n\nDropdownIndicator.propTypes = {\n innerProps: PropTypes.object.isRequired,\n};\n\nconst getSelectStyles = (theme, error) => {\n return {\n clearIndicator: (base) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n container: (base) => ({\n ...base,\n background: theme.colors.neutral0,\n lineHeight: 'normal',\n }),\n control(base, state) {\n let borderColor = theme.colors.neutral200;\n let boxShadowColor;\n let backgroundColor;\n\n if (state.isFocused) {\n borderColor = theme.colors.primary600;\n boxShadowColor = theme.colors.primary600;\n } else if (error) {\n borderColor = theme.colors.danger600;\n }\n\n if (state.isDisabled) {\n backgroundColor = `${theme.colors.neutral150} !important`;\n }\n\n return {\n ...base,\n fontSize: theme.fontSizes[2],\n height: 40,\n border: `1px solid ${borderColor} !important`,\n outline: 0,\n backgroundColor,\n borderRadius: theme.borderRadius,\n boxShadow: boxShadowColor ? `${boxShadowColor} 0px 0px 0px 2px` : '',\n };\n },\n indicatorsContainer: (base) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n input: (base) => ({\n ...base,\n margin: 0,\n padding: 0,\n color: theme.colors.neutral800,\n gridTemplateColumns: '0 100%',\n }),\n menuPortal: (base) => ({\n ...base,\n zIndex: theme.zIndices.dialog,\n pointerEvents: 'auto',\n }),\n menu(base) {\n return {\n ...base,\n width: '100%',\n marginTop: theme.spaces[1],\n backgroundColor: theme.colors.neutral0,\n color: theme.colors.neutral800,\n borderRadius: theme.borderRadius,\n border: `1px solid ${theme.colors.neutral200}`,\n boxShadow: theme.shadows.tableShadow,\n fontSize: theme.fontSizes[2],\n zIndex: 2,\n };\n },\n menuList: (base) => ({\n ...base,\n paddingLeft: theme.spaces[1],\n paddingTop: theme.spaces[1],\n paddingRight: theme.spaces[1],\n paddingBottom: theme.spaces[1],\n }),\n option(base, state) {\n let backgroundColor = base.backgroundColor;\n\n if (state.isFocused || state.isSelected) {\n backgroundColor = theme.colors.primary100;\n }\n\n return {\n ...base,\n color: theme.colors.neutral800,\n lineHeight: theme.spaces[5],\n backgroundColor,\n borderRadius: theme.borderRadius,\n '&:active': {\n backgroundColor: theme.colors.primary100,\n },\n };\n },\n placeholder: (base) => ({\n ...base,\n color: theme.colors.neutral600,\n marginLeft: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '80%',\n }),\n singleValue(base, state) {\n let color = theme.colors.neutral800;\n\n if (state.isDisabled) {\n color = theme.colors.neutral600;\n }\n\n return { ...base, marginLeft: 0, color };\n },\n valueContainer: (base) => ({\n ...base,\n cursor: 'pointer',\n padding: 0,\n paddingLeft: theme.spaces[4],\n marginLeft: 0,\n marginRight: 0,\n }),\n };\n};\n\nconst OptionShape = PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n label: PropTypes.string.isRequired,\n children: PropTypes.array,\n});\n\nOptionShape.children = PropTypes.arrayOf(PropTypes.shape(OptionShape));\n\nOptionShape.defaultProps = {\n children: undefined,\n};\n\nSelectTree.defaultProps = {\n defaultValue: undefined,\n maxDisplayDepth: 5,\n};\n\nSelectTree.propTypes = {\n defaultValue: PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n }),\n maxDisplayDepth: PropTypes.number,\n options: PropTypes.arrayOf(OptionShape).isRequired,\n};\n\nexport default SelectTree;\n","import * as React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nexport const DialogHeader = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Header>\n <Modal.Title>\n {formatMessage({ id: 'global.details', defaultMessage: 'Details' })}\n </Modal.Title>\n </Modal.Header>\n );\n};\n","import * as React from 'react';\n\nimport Cropper from 'cropperjs';\n\nconst QUALITY = 1;\n\ntype Size = {\n width?: number;\n height?: number;\n};\n\ntype Resize = {\n detail: {\n height: number;\n width: number;\n };\n};\n\nexport const useCropImg = () => {\n const cropperRef = React.useRef<Cropper>();\n const [isCropping, setIsCropping] = React.useState(false);\n const [size, setSize] = React.useState<Size>({ width: undefined, height: undefined });\n\n React.useEffect(() => {\n return () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n }\n };\n }, []);\n\n const handleResize = ({ detail: { height, width } }: Resize) => {\n const roundedDataWidth = Math.round(width);\n const roundedDataHeight = Math.round(height);\n\n setSize({ width: roundedDataWidth, height: roundedDataHeight });\n };\n\n const crop = (image: HTMLImageElement) => {\n if (!cropperRef.current) {\n cropperRef.current = new Cropper(image, {\n modal: true,\n initialAspectRatio: 16 / 9,\n movable: true,\n zoomable: false,\n cropBoxResizable: true,\n background: false,\n crop: handleResize,\n });\n\n setIsCropping(true);\n }\n };\n\n const stopCropping = () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n cropperRef.current = undefined;\n setIsCropping(false);\n }\n };\n\n const produceFile = (name: string, mimeType: string, lastModifiedDate: string) =>\n new Promise((resolve, reject) => {\n if (!cropperRef.current) {\n reject(\n new Error(\n 'The cropper has not been instantiated: make sure to call the crop() function before calling produceFile().'\n )\n );\n } else {\n const canvas = cropperRef.current.getCroppedCanvas();\n\n canvas.toBlob(\n (blob) => {\n resolve(\n new File([blob!], name, {\n type: mimeType,\n lastModified: new Date(lastModifiedDate).getTime(),\n })\n );\n },\n mimeType,\n QUALITY\n );\n }\n });\n\n return {\n crop,\n produceFile,\n stopCropping,\n isCropping,\n isCropperReady: Boolean(cropperRef.current),\n ...size,\n };\n};\n","import * as React from 'react';\n\nimport { useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends File {\n rawFile: RawFile;\n}\n\nconst uploadAsset = (\n asset: Asset,\n folderId: number,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const { rawFile, caption, name, alternativeText } = asset;\n const formData = new FormData();\n\n formData.append('files', rawFile);\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name,\n caption,\n alternativeText,\n folder: folderId,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useUpload = () => {\n const [progress, setProgress] = React.useState(0);\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n CreateFile.Response['data'],\n CreateFile.Response['error'],\n { asset: Asset; folderId: number }\n >(\n ({ asset, folderId }) => {\n return uploadAsset(asset, folderId, signal, setProgress, post);\n },\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n },\n }\n );\n\n const upload = (asset: Asset, folderId: number) => mutation.mutateAsync({ asset, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n","import { useCallback } from 'react';\n\nconst useClipboard = () => {\n const copy = useCallback(async (value: string | number) => {\n try {\n // only strings and numbers casted to strings can be copied to clipboard\n if (typeof value !== 'string' && typeof value !== 'number') {\n throw new Error(\n `Cannot copy typeof ${typeof value} to clipboard, must be a string or number`\n );\n }\n // empty strings are also considered invalid\n else if (value === '') {\n throw new Error(`Cannot copy empty string to clipboard.`);\n }\n\n const stringifiedValue = value.toString();\n\n await navigator.clipboard.writeText(stringifiedValue);\n\n return true;\n } catch (error) {\n /**\n * Realistically this isn't useful in production as there's nothing the user can do.\n */\n if (process.env.NODE_ENV === 'development') {\n console.warn('Copy failed', error);\n }\n\n return false;\n }\n }, []);\n\n return { copy };\n};\n\nexport { useClipboard };\n","import React from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { IconButton } from '@strapi/design-system';\nimport { Link as LinkIcon } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { useClipboard } from '../../hooks/useClipboard';\nimport { getTrad } from '../../utils';\n\nexport const CopyLinkButton = ({ url }) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n\n const handleClick = async () => {\n const didCopy = await copy(url);\n\n if (didCopy) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.link-copied',\n defaultMessage: 'Link copied into the clipboard',\n }),\n });\n }\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.copy-link'),\n defaultMessage: 'Copy link',\n })}\n onClick={handleClick}\n >\n <LinkIcon />\n </IconButton>\n );\n};\n\nCopyLinkButton.propTypes = {\n url: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Flex, ProgressBar, Typography } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nconst BoxWrapper = styled(Flex)`\n border-radius: ${({ theme }) => `${theme.borderRadius} ${theme.borderRadius} 0 0`};\n width: 100%;\n height: 100%;\n\n svg {\n path {\n fill: ${({ theme, error }) => (error ? theme.colors.danger600 : undefined)};\n }\n }\n`;\n\nconst CancelButton = styled.button`\n border: none;\n background: none;\n width: min-content;\n color: ${({ theme }) => theme.colors.neutral600};\n\n &:hover,\n &:focus {\n color: ${({ theme }) => theme.colors.neutral700};\n }\n\n svg {\n height: 10px;\n width: 10px;\n\n path {\n fill: currentColor;\n }\n }\n`;\n\nexport const UploadProgress = ({ onCancel, progress, error }) => {\n const { formatMessage } = useIntl();\n\n return (\n <BoxWrapper alignItems=\"center\" background={error ? 'danger100' : 'neutral150'} error={error}>\n {error ? (\n <Cross aria-label={error?.message} />\n ) : (\n <Flex direction=\"column\" alignItems=\"center\" gap={2} width=\"100%\">\n <ProgressBar value={progress}>{`${progress}/100%`}</ProgressBar>\n\n <CancelButton type=\"button\" onClick={onCancel}>\n <Flex gap={2}>\n <Typography variant=\"pi\" tag=\"span\" textColor=\"inherit\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Typography>\n\n <Cross aria-hidden />\n </Flex>\n </CancelButton>\n </Flex>\n )}\n </BoxWrapper>\n );\n};\n\nUploadProgress.defaultProps = {\n error: undefined,\n progress: 0,\n};\n\nUploadProgress.propTypes = {\n error: PropTypes.instanceOf(Error),\n onCancel: PropTypes.func.isRequired,\n progress: PropTypes.number,\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\nimport type { DeleteFile } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\nexport const useRemoveAsset = (onSuccess: () => void) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { del } = useFetchClient();\n\n const mutation = useMutation(\n (assetId: number) => del<DeleteFile.Response>(`/upload/files/${assetId}`),\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'modal.remove.success-label',\n defaultMessage: 'Elements have been successfully deleted.',\n }),\n });\n\n onSuccess();\n },\n onError(error: Error) {\n toggleNotification({ type: 'danger', message: error.message });\n },\n }\n );\n\n const removeAsset = async (assetId: number) => {\n await mutation.mutateAsync(assetId);\n };\n\n return { ...mutation, removeAsset };\n};\n","import React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\n\nexport const RemoveAssetDialog = ({ open, onClose, asset }) => {\n // `null` means asset is deleted\n const { removeAsset } = useRemoveAsset(() => {\n onClose(null);\n });\n\n const handleConfirm = async (event) => {\n event.preventDefault();\n await removeAsset(asset.id);\n };\n\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={handleConfirm} />\n </Dialog.Root>\n );\n};\n\nRemoveAssetDialog.propTypes = {\n onClose: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n asset: PropTypes.shape({\n id: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n size: PropTypes.number,\n createdAt: PropTypes.string,\n ext: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n};\n","import { useEffect, useState } from 'react';\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => {\n const stickyValue = window.localStorage.getItem(key);\n\n if (stickyValue !== null) {\n try {\n return JSON.parse(stickyValue);\n } catch {\n // JSON.parse fails when the stored value is a primitive\n return stickyValue;\n }\n }\n\n return defaultValue;\n });\n\n useEffect(() => {\n window.localStorage.setItem(key, JSON.stringify(value));\n }, [key, value]);\n\n return [value, setValue] as const;\n};\n\nexport { usePersistentState };\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React, { forwardRef } from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nexport const AssetPreview = forwardRef(({ mime, url, name, ...props }, ref) => {\n const [lang] = usePersistentState('strapi-admin-language', 'en');\n\n if (mime.includes(AssetType.Image)) {\n return <img ref={ref} src={url} alt={name} {...props} />;\n }\n\n if (mime.includes(AssetType.Video)) {\n return (\n <video controls src={url} ref={ref} {...props}>\n <track label={name} default kind=\"captions\" srcLang={lang} src=\"\" />\n </video>\n );\n }\n\n if (mime.includes(AssetType.Audio)) {\n return (\n <audio controls src={url} ref={ref} {...props}>\n {name}\n </audio>\n );\n }\n\n if (mime.includes('pdf')) {\n return (\n <CardAsset justifyContent=\"center\" {...props}>\n <FilePdf aria-label={name} />\n </CardAsset>\n );\n }\n\n return (\n <CardAsset justifyContent=\"center\" {...props}>\n <File aria-label={name} />\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n\nAssetPreview.propTypes = {\n mime: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n};\n","import { Badge, Box, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nexport const RelativeBox = styled(Box)`\n position: relative;\n`;\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n\n svg {\n font-size: 4.8rem;\n height: 26.4rem;\n }\n\n img,\n video {\n margin: 0;\n padding: 0;\n max-height: 26.4rem;\n max-width: 100%;\n }\n`;\n\nexport const ActionRow = styled(Flex)`\n height: 5.2rem;\n background-color: ${({ $blurry }) => ($blurry ? `rgba(33, 33, 52, 0.4)` : undefined)};\n`;\n\nexport const CroppingActionRow = styled(Flex)`\n z-index: 1;\n height: 5.2rem;\n position: absolute;\n background-color: rgba(33, 33, 52, 0.4);\n width: 100%;\n`;\n\n// TODO: fix in parts, this shouldn't happen\nexport const BadgeOverride = styled(Badge)`\n span {\n color: inherit;\n font-weight: ${({ theme }) => theme.fontWeights.regular};\n }\n`;\n\nexport const UploadProgressWrapper = styled.div`\n position: absolute;\n z-index: 2;\n height: 100%;\n width: 100%;\n`;\n","import React from 'react';\n\nimport { Flex, FocusTrap, IconButton, Menu } from '@strapi/design-system';\nimport { Check, Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTrad } from '../../../utils';\n\nimport { CroppingActionRow } from './components';\n\nexport const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => {\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n return (\n <FocusTrap onEscape={onCancel}>\n <CroppingActionRow justifyContent=\"flex-end\" paddingLeft={3} paddingRight={3}>\n <Flex gap={1}>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.stop-crop'),\n defaultMessage: 'Stop cropping',\n })}\n onClick={onCancel}\n >\n <Cross />\n </IconButton>\n\n <Menu.Root>\n <Trigger\n aria-label={formatMessage({\n id: getTrad('control-card.crop'),\n defaultMessage: 'Crop',\n })}\n variant=\"tertiary\"\n paddingLeft={2}\n paddingRight={2}\n endIcon={null}\n >\n <Check\n aria-hidden\n focusable={false}\n style={{ position: 'relative', top: 2 }}\n fill=\"#C0C0D0\"\n />\n </Trigger>\n <Menu.Content zIndex={theme.zIndices.dialog}>\n <Menu.Item onSelect={onValidate}>\n {formatMessage({\n id: getTrad('checkControl.crop-original'),\n defaultMessage: 'Crop the original asset',\n })}\n </Menu.Item>\n\n {onDuplicate && (\n <Menu.Item onSelect={onDuplicate}>\n {formatMessage({\n id: getTrad('checkControl.crop-duplicate'),\n defaultMessage: 'Duplicate & crop the asset',\n })}\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </CroppingActionRow>\n </FocusTrap>\n );\n};\n\nconst Trigger = styled(Menu.Trigger)`\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n\n &:hover {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n }\n\n &:active {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n }\n`;\n\nCroppingActions.defaultProps = {\n onDuplicate: undefined,\n};\n\nCroppingActions.propTypes = {\n onCancel: PropTypes.func.isRequired,\n onDuplicate: PropTypes.func,\n onValidate: PropTypes.func.isRequired,\n};\n","import React, { useEffect, useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, AssetType } from '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './components';\nimport { CroppingActions } from './CroppingActions';\n\nimport 'cropperjs/dist/cropper.css';\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n}) => {\n const { trackUsage } = useTracking();\n const previewRef = useRef(null);\n const [isCropImageReady, setIsCropImageReady] = useState(false);\n const [hasCropIntent, setHasCropIntent] = useState(null);\n const [assetUrl, setAssetUrl] = useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n return (\n <>\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl} />}\n\n {canUpdate && asset.mime.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <AssetPreview\n ref={previewRef}\n mime={asset.mime}\n name={asset.name}\n url={hasCropIntent ? assetUrl : thumbnailUrl}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n\nPreviewBox.defaultProps = {\n replacementFile: undefined,\n trackedLocation: undefined,\n};\n\nPreviewBox.propTypes = {\n canUpdate: PropTypes.bool.isRequired,\n canCopyLink: PropTypes.bool.isRequired,\n canDownload: PropTypes.bool.isRequired,\n replacementFile: PropTypes.instanceOf(File),\n asset: AssetDefinition.isRequired,\n onDelete: PropTypes.func.isRequired,\n onCropFinish: PropTypes.func.isRequired,\n onCropStart: PropTypes.func.isRequired,\n onCropCancel: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useRef } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, VisuallyHidden } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const ReplaceMediaButton = ({ onSelectMedia, acceptedMime, trackedLocation, ...props }) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef(null);\n const { trackUsage } = useTracking();\n\n const handleClick = (e) => {\n e.preventDefault();\n\n if (trackedLocation) {\n trackUsage('didReplaceMedia', { location: trackedLocation });\n }\n\n inputRef.current.click();\n };\n\n const handleChange = () => {\n const file = inputRef.current.files[0];\n\n onSelectMedia(file);\n };\n\n return (\n <>\n <Button variant=\"secondary\" onClick={handleClick} {...props}>\n {formatMessage({\n id: getTrad('control-card.replace-media'),\n defaultMessage: 'Replace media',\n })}\n </Button>\n <VisuallyHidden>\n <input\n accept={acceptedMime}\n type=\"file\"\n name=\"file\"\n tabIndex={-1}\n ref={inputRef}\n onChange={handleChange}\n aria-hidden\n />\n </VisuallyHidden>\n </>\n );\n};\n\nReplaceMediaButton.defaultProps = {\n trackedLocation: undefined,\n};\n\nReplaceMediaButton.propTypes = {\n acceptedMime: PropTypes.string.isRequired,\n onSelectMedia: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","/**\n *\n * EditAssetDialog\n *\n */\n\nimport React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Grid,\n Loader,\n Modal,\n TextInput,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport isEqual from 'lodash/isEqual';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { AssetDefinition } from '../../constants';\nimport { useEditAsset } from '../../hooks/useEditAsset';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { findRecursiveFolderByValue, getTrad, getFileExtension, formatBytes } from '../../utils';\nimport { ContextInfo } from '../ContextInfo';\nimport SelectTree from '../SelectTree';\n\nimport { DialogHeader } from './DialogHeader';\nimport { PreviewBox } from './PreviewBox';\nimport { ReplaceMediaButton } from './ReplaceMediaButton';\n\nconst LoadingBody = styled(Flex)`\n /* 80px are coming from the Tabs component that is not included in the ModalBody */\n min-height: ${() => `calc(60vh + 8rem)`};\n`;\n\nconst fileInfoSchema = yup.object({\n name: yup.string().required(),\n alternativeText: yup.string(),\n caption: yup.string(),\n folder: yup.number(),\n});\n\nexport const EditAssetContent = ({\n onClose,\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n trackedLocation,\n}) => {\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const submitButtonRef = useRef(null);\n const [isCropping, setIsCropping] = useState(false);\n const [replacementFile, setReplacementFile] = useState();\n const { editAsset, isLoading } = useEditAsset();\n\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n\n const handleSubmit = async (values) => {\n const nextAsset = { ...asset, ...values, folder: values.parent.value };\n\n if (asset.isLocal) {\n onClose(nextAsset);\n } else {\n const editedAsset = await editAsset(nextAsset, replacementFile);\n\n const assetType = asset?.mime.split('/')[0];\n // if the folder parent was the root of Media Library, its id is null\n // we know it changed location if the new parent value exists\n const didChangeLocation = asset?.folder?.id\n ? asset.folder.id !== values.parent.value\n : asset.folder === null && !!values.parent.value;\n\n trackUsage('didEditMediaLibraryElements', {\n location: trackedLocation,\n type: assetType,\n changeLocation: didChangeLocation,\n });\n\n onClose(editedAsset);\n }\n };\n\n const handleStartCropping = () => {\n setIsCropping(true);\n };\n\n const handleCancelCropping = () => {\n setIsCropping(false);\n };\n\n const handleFinishCropping = () => {\n setIsCropping(false);\n onClose();\n };\n\n const formDisabled = !canUpdate || isCropping;\n\n const handleConfirmClose = () => {\n // eslint-disable-next-line no-alert\n const confirm = window.confirm(\n formatMessage({\n id: 'window.confirm.close-modal.file',\n defaultMessage: 'Are you sure? Your changes will be lost.',\n })\n );\n\n if (confirm) {\n onClose();\n }\n };\n\n const activeFolderId = asset?.folder?.id;\n const initialFormData = !folderStructureIsLoading && {\n name: asset.name,\n alternativeText: asset.alternativeText ?? undefined,\n caption: asset.caption ?? undefined,\n parent: {\n value: activeFolderId ?? undefined,\n label:\n findRecursiveFolderByValue(folderStructure, activeFolderId)?.label ??\n folderStructure[0].label,\n },\n };\n\n const handleClose = (values) => {\n if (!isEqual(initialFormData, values)) {\n handleConfirmClose();\n } else {\n onClose();\n }\n };\n\n if (folderStructureIsLoading) {\n return (\n <>\n <DialogHeader />\n <LoadingBody minHeight=\"60vh\" justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </LoadingBody>\n <Modal.Footer>\n <Button onClick={() => handleClose()} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Footer>\n </>\n );\n }\n\n return (\n <Formik\n validationSchema={fileInfoSchema}\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialFormData}\n >\n {({ values, errors, handleChange, setFieldValue }) => (\n <>\n <DialogHeader />\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <PreviewBox\n asset={asset}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n onDelete={onClose}\n onCropFinish={handleFinishCropping}\n onCropStart={handleStartCropping}\n onCropCancel={handleCancelCropping}\n replacementFile={replacementFile}\n trackedLocation={trackedLocation}\n />\n </Grid.Item>\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Form noValidate>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={3}>\n <ContextInfo\n blocks={[\n {\n label: formatMessage({\n id: getTrad('modal.file-details.size'),\n defaultMessage: 'Size',\n }),\n value: formatBytes(asset.size),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.dimensions'),\n defaultMessage: 'Dimensions',\n }),\n value:\n asset.height && asset.width ? `${asset.width}✕${asset.height}` : null,\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.date'),\n defaultMessage: 'Date',\n }),\n value: formatDate(new Date(asset.createdAt)),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.extension'),\n defaultMessage: 'Extension',\n }),\n value: getFileExtension(asset.ext),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.id'),\n defaultMessage: 'Asset ID',\n }),\n value: asset.id,\n },\n ]}\n />\n <Field.Root name=\"name\" error={errors.name}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-name'),\n defaultMessage: 'File name',\n })}\n </Field.Label>\n <TextInput\n value={values.name}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Error />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.decription.file-alt'),\n defaultMessage: 'This text will be displayed if the asset can’t be shown.',\n })}\n error={errors.alternativeText}\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n <TextInput\n value={values.alternativeText}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n\n <Field.Root name=\"caption\" error={errors.caption}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n <TextInput\n value={values.caption}\n onChange={handleChange}\n disabled={formDisabled}\n />\n </Field.Root>\n\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Field.Root name=\"parent\" id=\"asset-folder\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n name=\"parent\"\n defaultValue={values.parent}\n options={folderStructure}\n onChange={(value) => {\n setFieldValue('parent', value);\n }}\n menuPortalTarget={document.querySelector('body')}\n inputId=\"asset-folder\"\n isDisabled={formDisabled}\n error={errors?.parent}\n ariaErrorMessage=\"folder-parent-error\"\n />\n </Field.Root>\n </Flex>\n </Flex>\n\n <VisuallyHidden>\n <button\n type=\"submit\"\n tabIndex={-1}\n ref={submitButtonRef}\n disabled={formDisabled}\n >\n {formatMessage({ id: 'submit', defaultMessage: 'Submit' })}\n </button>\n </VisuallyHidden>\n </Form>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={() => handleClose(values)} variant=\"tertiary\">\n {formatMessage({ id: 'global.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Flex gap={2}>\n <ReplaceMediaButton\n onSelectMedia={setReplacementFile}\n acceptedMime={asset.mime}\n disabled={formDisabled}\n trackedLocation={trackedLocation}\n />\n\n <Button\n onClick={() => submitButtonRef.current.click()}\n loading={isLoading}\n disabled={formDisabled}\n >\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Flex>\n </Modal.Footer>\n </>\n )}\n </Formik>\n );\n};\n\nEditAssetContent.defaultProps = {\n asset: {},\n trackedLocation: undefined,\n canUpdate: false,\n canCopyLink: false,\n canDownload: false,\n};\n\nEditAssetContent.propTypes = {\n asset: AssetDefinition,\n canUpdate: PropTypes.bool,\n canCopyLink: PropTypes.bool,\n canDownload: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nexport const EditAssetDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditAssetContent onClose={onClose} {...restProps} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nEditAssetDialog.defaultProps = {\n asset: {},\n trackedLocation: undefined,\n canUpdate: false,\n canCopyLink: false,\n canDownload: false,\n};\n\nEditAssetDialog.propTypes = {\n asset: AssetDefinition,\n canUpdate: PropTypes.bool,\n canCopyLink: PropTypes.bool,\n canDownload: PropTypes.bool,\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\nimport { BulkDeleteFiles, File } from '../../../shared/contracts/files';\nimport type { BulkDeleteFolders, Folder } from '../../../shared/contracts/folders';\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\ntype BulkRemovePayload = Partial<BulkDeleteFiles.Request['body']> &\n Partial<BulkDeleteFolders.Request['body']>;\n\nexport const useBulkRemove = () => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkRemoveQuery = (filesAndFolders: Array<FileWithType | FolderWithType>) => {\n const payload = filesAndFolders.reduce<BulkRemovePayload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-delete', payload);\n };\n\n const mutation = useMutation<\n BulkDeleteFiles.Response | BulkDeleteFolders.Response,\n BulkDeleteFiles.Response['error'] | BulkDeleteFolders.Response['error'],\n Array<FileWithType | FolderWithType>\n >(bulkRemoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n if (data?.folders?.length > 0) {\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.remove.success-label'),\n defaultMessage: 'Elements have been successfully deleted.',\n }),\n });\n },\n onError(error) {\n toggleNotification({ type: 'danger', message: error?.message });\n },\n });\n\n const remove = (...args: Parameters<typeof mutation.mutateAsync>) =>\n mutation.mutateAsync(...args);\n\n return { ...mutation, remove };\n};\n","import { useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { CreateFolders, UpdateFolder } from '../../../shared/contracts/folders';\n\nimport pluginId from '../pluginId';\n\ninterface EditFolderRequestParams {\n attrs: CreateFolders.Request['body'] | UpdateFolder.Request['body'];\n id?: UpdateFolder.Request['params']['id'];\n}\n\nconst editFolderRequest = (\n put: FetchClient['put'],\n post: FetchClient['post'],\n { attrs, id }: EditFolderRequestParams\n): Promise<UpdateFolder.Response['data'] | CreateFolders.Response['data']> => {\n const isEditing = !!id;\n const method = isEditing ? put : post;\n\n return method(`/upload/folders/${id ?? ''}`, attrs).then((res) => res.data);\n};\n\nexport const useEditFolder = () => {\n const queryClient = useQueryClient();\n const { put, post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFolder.Response['data'] | CreateFolders.Response['data'],\n UpdateFolder.Response['error'] | CreateFolders.Response['error'],\n EditFolderRequestParams\n >((...args) => editFolderRequest(put, post, ...args), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n queryClient.refetchQueries([pluginId, 'folder', 'structure'], { active: true });\n },\n });\n\n const editFolder = (\n attrs: EditFolderRequestParams['attrs'],\n id?: EditFolderRequestParams['id']\n ) => mutation.mutateAsync({ attrs, id });\n\n return { ...mutation, editFolder, status: mutation.status };\n};\n","import React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nexport const EditFolderModalHeader = ({ isEditing }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Header>\n <Modal.Title>\n {formatMessage(\n isEditing\n ? {\n id: getTrad('modal.folder.edit.title'),\n defaultMessage: 'Edit folder',\n }\n : {\n id: getTrad('modal.folder.create.title'),\n defaultMessage: 'Add new folder',\n }\n )}\n </Modal.Title>\n </Modal.Header>\n );\n};\n\nEditFolderModalHeader.defaultProps = {\n isEditing: false,\n};\n\nEditFolderModalHeader.propTypes = {\n isEditing: PropTypes.bool,\n};\n","import React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const RemoveFolderDialog = ({ onClose, onConfirm, open }) => {\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={onConfirm} />\n </Dialog.Root>\n );\n};\n\nRemoveFolderDialog.propTypes = {\n onClose: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n};\n\nexport default RemoveFolderDialog;\n","import React, { useState } from 'react';\n\nimport { useTracking, useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Grid,\n Loader,\n Modal,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { FolderDefinition } from '../../constants';\nimport { useBulkRemove } from '../../hooks/useBulkRemove';\nimport { useEditFolder } from '../../hooks/useEditFolder';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { findRecursiveFolderByValue, getTrad, getAPIInnerErrors } from '../../utils';\nimport { ContextInfo } from '../ContextInfo';\nimport SelectTree from '../SelectTree';\n\nimport { EditFolderModalHeader } from './ModalHeader';\nimport RemoveFolderDialog from './RemoveFolderDialog';\n\nconst folderSchema = yup.object({\n name: yup.string().required(),\n parent: yup\n .object({\n label: yup.string(),\n value: yup.number().nullable(true),\n })\n .nullable(true),\n});\n\nexport const EditFolderContent = ({ onClose, folder, location, parentFolderId }) => {\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n const { canCreate, isLoading: isLoadingPermissions, canUpdate } = useMediaLibraryPermissions();\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const { editFolder, isLoading: isEditFolderLoading } = useEditFolder();\n const { remove } = useBulkRemove();\n const { toggleNotification } = useNotification();\n const isLoading = isLoadingPermissions || folderStructureIsLoading;\n const isEditing = !!folder;\n const formDisabled = (folder && !canUpdate) || (!folder && !canCreate);\n const initialFormData = !folderStructureIsLoading && {\n name: folder?.name ?? '',\n parent: {\n /* ideally we would use folderStructure[0].value, but since it is null\n react complains about rendering null as field value */\n value: parentFolderId ? parseInt(parentFolderId, 10) : undefined,\n label: parentFolderId\n ? findRecursiveFolderByValue(folderStructure, parseInt(parentFolderId, 10))?.label\n : folderStructure[0].label,\n },\n };\n\n const handleSubmit = async (values, { setErrors }) => {\n try {\n await editFolder(\n {\n ...values,\n parent: values.parent.value ?? null,\n },\n folder?.id\n );\n\n toggleNotification({\n type: 'success',\n message: isEditing\n ? formatMessage({\n id: getTrad('modal.folder-notification-edited-success'),\n defaultMessage: 'Folder successfully edited',\n })\n : formatMessage({\n id: getTrad('modal.folder-notification-created-success'),\n defaultMessage: 'Folder successfully created',\n }),\n });\n\n if (isEditing) {\n const didChangeLocation = parentFolderId\n ? parseInt(parentFolderId, 10) !== values.parent.value\n : parentFolderId === null && !!values.parent.value;\n\n trackUsage('didEditMediaLibraryElements', {\n location,\n type: 'folder',\n changeLocation: didChangeLocation,\n });\n } else {\n trackUsage('didAddMediaLibraryFolders', { location });\n }\n\n onClose({ created: true });\n } catch (err) {\n const errors = getAPIInnerErrors(err, { getTrad });\n const formikErrors = Object.entries(errors).reduce((acc, [key, error]) => {\n acc[key] = error.defaultMessage;\n\n return acc;\n }, {});\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n };\n\n const handleDelete = async () => {\n await remove([folder]);\n\n setShowConfirmDialog(false);\n onClose();\n };\n\n if (isLoading) {\n return (\n <>\n <EditFolderModalHeader isEditing={isEditing} />\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 </>\n );\n }\n\n return (\n <>\n <Formik\n validationSchema={folderSchema}\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialFormData}\n >\n {({ values, errors, handleChange, setFieldValue }) => (\n <Form noValidate>\n <EditFolderModalHeader isEditing={isEditing} />\n <Modal.Body>\n <Grid.Root gap={4}>\n {isEditing && (\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <ContextInfo\n blocks={[\n {\n label: formatMessage({\n id: getTrad('modal.folder.create.elements'),\n defaultMessage: 'Elements',\n }),\n value: formatMessage(\n {\n id: getTrad('modal.folder.elements.count'),\n defaultMessage: '{folderCount} folders, {assetCount} assets',\n },\n {\n assetCount: folder?.files?.count ?? 0,\n folderCount: folder?.children?.count ?? 0,\n }\n ),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.folder.create.creation-date'),\n defaultMessage: 'Creation Date',\n }),\n value: formatDate(new Date(folder.createdAt)),\n },\n ]}\n />\n </Grid.Item>\n )}\n\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"name\" error={errors.name}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-name'),\n defaultMessage: 'Name',\n })}\n </Field.Label>\n <TextInput\n value={values.name}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Error />\n </Field.Root>\n </Grid.Item>\n\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-parent\">\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}\n onChange={(value) => {\n setFieldValue('parent', value);\n }}\n isDisabled={formDisabled}\n defaultValue={values.parent}\n name=\"parent\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-parent\"\n disabled={formDisabled}\n error={errors?.parent}\n ariaErrorMessage=\"folder-parent-error\"\n />\n\n {errors.parent && (\n <Typography\n variant=\"pi\"\n tag=\"p\"\n id=\"folder-parent-error\"\n textColor=\"danger600\"\n >\n {errors.parent}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={() => onClose()} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Flex gap={2}>\n {isEditing && canUpdate && (\n <Button\n type=\"button\"\n variant=\"danger-light\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"delete\"\n disabled={!canUpdate || isEditFolderLoading}\n >\n {formatMessage({\n id: getTrad('modal.folder.create.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Button>\n )}\n\n <Button\n name=\"submit\"\n loading={isEditFolderLoading}\n disabled={formDisabled}\n type=\"submit\"\n >\n {formatMessage(\n isEditing\n ? { id: getTrad('modal.folder.edit.submit'), defaultMessage: 'Save' }\n : { id: getTrad('modal.folder.create.submit'), defaultMessage: 'Create' }\n )}\n </Button>\n </Flex>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n <RemoveFolderDialog\n open={showConfirmDialog}\n onClose={() => setShowConfirmDialog(false)}\n onConfirm={handleDelete}\n />\n </>\n );\n};\n\nEditFolderContent.defaultProps = {\n folder: undefined,\n location: undefined,\n parentFolderId: null,\n};\n\nEditFolderContent.propTypes = {\n folder: FolderDefinition,\n location: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n parentFolderId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport const EditFolderDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditFolderContent {...restProps} onClose={onClose} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nEditFolderDialog.defaultProps = {\n folder: undefined,\n location: undefined,\n parentFolderId: null,\n};\n\nEditFolderDialog.propTypes = {\n folder: FolderDefinition,\n location: PropTypes.string,\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n parentFolderId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\nimport { GetFolder } from '../../../shared/contracts/folders';\n\nexport const useFolder = (id: number, { enabled = true } = {}) => {\n const { toggleNotification } = useNotification();\n const { get } = useFetchClient();\n const { formatMessage } = useIntl();\n\n const { data, error, isLoading } = useQuery<\n GetFolder.Response['data'],\n GetFolder.Response['error']\n >(\n [pluginId, 'folder', id],\n async () => {\n const {\n data: { data },\n } = await get(`/upload/folders/${id}`, {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n },\n },\n });\n\n return data;\n },\n {\n retry: false,\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('notification.warning.404'),\n defaultMessage: 'Not found',\n }),\n });\n },\n }\n );\n\n return { data, error, isLoading };\n};\n","import React from 'react';\n\nimport {\n Box,\n Card,\n CardAction,\n CardBadge,\n CardBody,\n CardCheckbox,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n IconButton,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTrad } from '../../utils';\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Card)`\n cursor: pointer;\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\nexport const AssetCardBase = ({\n children,\n extension,\n isSelectable,\n name,\n onSelect,\n onRemove,\n onEdit,\n selected,\n subtitle,\n variant,\n}) => {\n const { formatMessage } = useIntl();\n\n /** @type {import(\"react\").MouseEventHandler<HTMLDivElement> } */\n const handleClick = (e) => {\n if (onEdit) {\n onEdit(e);\n }\n };\n\n /**\n * @type {import(\"react\").MouseEventHandler<HTMLDivElement> }\n *\n * This is required because we need to stop the propagation of the event\n * bubbling to the `CardContainer`, however the `CardCheckbox` only returns\n * the `boolean` value as opposed to the event itself.\n */\n const handlePropagationClick = (e) => {\n e.stopPropagation();\n };\n\n return (\n <CardContainer role=\"button\" height=\"100%\" tabIndex={-1} onClick={handleClick}>\n <CardHeader>\n {isSelectable && (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div onClick={handlePropagationClick}>\n <CardCheckbox checked={selected} onCheckedChange={onSelect} />\n </div>\n )}\n {(onRemove || onEdit) && (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n {onRemove && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n onClick={onRemove}\n >\n <Trash />\n </IconButton>\n )}\n\n {onEdit && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n onClick={onEdit}\n >\n <Pencil />\n </IconButton>\n )}\n </CardActionsContainer>\n )}\n {children}\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <CardTitle tag=\"h2\">{name}</CardTitle>\n </Box>\n <CardSubtitle>\n <Extension>{extension}</Extension>\n {subtitle}\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>\n {formatMessage({\n id: getTrad(`settings.section.${variant.toLowerCase()}.label`),\n defaultMessage: variant,\n })}\n </CardBadge>\n </Flex>\n </CardBody>\n </CardContainer>\n );\n};\n\nAssetCardBase.defaultProps = {\n children: undefined,\n isSelectable: true,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n selected: false,\n subtitle: '',\n variant: 'Image',\n};\n\nAssetCardBase.propTypes = {\n children: PropTypes.node,\n extension: PropTypes.string.isRequired,\n isSelectable: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n selected: PropTypes.bool,\n subtitle: PropTypes.string,\n variant: PropTypes.oneOf(['Image', 'Video', 'Audio', 'Doc']),\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const AudioPreview = ({ url, alt }) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n\nAudioPreview.defaultProps = {};\n\nAudioPreview.propTypes = {\n alt: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Box, CardAsset } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase } from './AssetCardBase';\nimport { AudioPreview } from './AudioPreview';\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\nexport const AudioAssetCard = ({ name, url, size, ...restProps }) => {\n return (\n <AssetCardBase name={name} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </CardAsset>\n </AssetCardBase>\n );\n};\n\nAudioAssetCard.defaultProps = {\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n selected: false,\n size: 'M',\n};\n\nAudioAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n url: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase } from './AssetCardBase';\n\nconst IconWrapper = styled.span`\n svg {\n font-size: 4.8rem;\n }\n`;\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nexport const DocAssetCard = ({ name, extension, size, ...restProps }) => {\n return (\n <AssetCardBase name={name} extension={extension} {...restProps} variant=\"Doc\">\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <IconWrapper>\n {extension === 'pdf' ? <FilePdf aria-label={name} /> : <File aria-label={name} />}\n </IconWrapper>\n </CardAsset>\n </AssetCardBase>\n );\n};\n\nDocAssetCard.defaultProps = {\n selected: false,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n size: 'M',\n};\n\nDocAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n selected: PropTypes.bool,\n name: PropTypes.string.isRequired,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport { CardAsset } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase } from './AssetCardBase';\n\nexport const ImageAssetCard = ({ height, width, thumbnail, size, alt, isUrlSigned, ...props }) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n\n return (\n <AssetCardBase {...props} subtitle={height && width && ` - ${width}✕${height}`} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n\nImageAssetCard.defaultProps = {\n height: undefined,\n width: undefined,\n selected: false,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n size: 'M',\n updatedAt: undefined,\n};\n\nImageAssetCard.propTypes = {\n alt: PropTypes.string.isRequired,\n extension: PropTypes.string.isRequired,\n height: PropTypes.number,\n name: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n width: PropTypes.number,\n thumbnail: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n updatedAt: PropTypes.string,\n isUrlSigned: PropTypes.bool.isRequired,\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\nexport const VideoPreview = ({ url, mime, onLoadDuration, alt, ...props }) => {\n const handleTimeUpdate = (e) => {\n if (e.target.currentTime > 0) {\n const video = e.target;\n const canvas = document.createElement('canvas');\n\n canvas.height = video.videoHeight;\n canvas.width = video.videoWidth;\n canvas.getContext('2d').drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n\n video.replaceWith(canvas);\n onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e) => {\n const video = e.target;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" {...props} key={url}>\n <video\n muted\n onLoadedData={handleThumbnailVisibility}\n src={url}\n crossOrigin=\"anonymous\"\n onTimeUpdate={handleTimeUpdate}\n >\n <source type={mime} />\n </video>\n <VisuallyHidden tag=\"figcaption\">{alt}</VisuallyHidden>\n </Box>\n );\n};\n\nVideoPreview.defaultProps = {\n onLoadDuration() {},\n size: 'M',\n};\n\nVideoPreview.propTypes = {\n alt: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n mime: PropTypes.string.isRequired,\n onLoadDuration: PropTypes.func,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React, { useState } from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase } from './AssetCardBase';\nimport { VideoPreview } from './VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n display: block;\n pointer-events: none;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\nexport const VideoAssetCard = ({ name, url, mime, size, ...props }) => {\n const [duration, setDuration] = useState();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase name={name} {...props} variant=\"Video\">\n <CardAsset size={size}>\n <VideoPreviewWrapper size={size}>\n <VideoPreview url={url} mime={mime} onLoadDuration={setDuration} alt={name} />\n </VideoPreviewWrapper>\n </CardAsset>\n <CardTimer>{formattedDuration || '...'}</CardTimer>\n </AssetCardBase>\n );\n};\n\nVideoAssetCard.defaultProps = {\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n selected: false,\n size: 'M',\n};\n\nVideoAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n mime: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n url: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport { AssetDefinition, AssetType } from '../../constants';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nexport const AssetCard = ({ asset, isSelected, onSelect, onEdit, onRemove, size, local }) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext),\n key: asset.id,\n name: asset.name,\n url: local ? asset.url : createAssetUrl(asset, true),\n mime: asset.mime,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n };\n\n if (asset.mime.includes(AssetType.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime.includes(AssetType.Image)) {\n return (\n <ImageAssetCard\n {...commonAssetCardProps}\n alt={asset.alternativeText || asset.name}\n height={asset.height}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)}\n width={asset.width}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n />\n );\n }\n\n if (asset.mime.includes(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n\nAssetCard.defaultProps = {\n isSelected: false,\n // Determine if the asset is loaded locally or from a remote resource\n local: false,\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n size: 'M',\n};\n\nAssetCard.propTypes = {\n asset: AssetDefinition.isRequired,\n local: PropTypes.bool,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n isSelected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React, { useRef } from 'react';\n\nimport PropTypes from 'prop-types';\nimport { useDrag, useDrop } from 'react-dnd';\n\nexport const Draggable = ({ children, id, index, moveItem }) => {\n const ref = useRef(null);\n\n const [, drop] = useDrop({\n accept: 'draggable',\n hover(hoveredOverItem) {\n if (!ref.current) {\n return;\n }\n\n if (hoveredOverItem.id !== id) {\n moveItem(hoveredOverItem.index, index);\n\n hoveredOverItem.index = index;\n }\n },\n });\n\n const [{ isDragging }, drag] = useDrag({\n type: 'draggable',\n item() {\n return { index, id };\n },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n const opacity = isDragging ? 0.2 : 1;\n\n drag(drop(ref));\n\n return (\n <div ref={ref} style={{ opacity, cursor: 'move' }}>\n {children}\n </div>\n );\n};\n\nDraggable.propTypes = {\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n index: PropTypes.number.isRequired,\n children: PropTypes.node.isRequired,\n moveItem: PropTypes.func.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { AssetCard } from '../AssetCard/AssetCard';\n\nimport { Draggable } from './Draggable';\n\nexport const AssetGridList = ({\n allowedTypes,\n assets,\n onEditAsset,\n onSelectAsset,\n selectedAssets,\n size,\n onReorderAsset,\n title,\n}) => {\n return (\n <KeyboardNavigable tagName=\"article\">\n {title && (\n <Box paddingTop={2} paddingBottom={2}>\n <Typography tag=\"h2\" variant=\"delta\" fontWeight=\"semiBold\">\n {title}\n </Typography>\n </Box>\n )}\n\n <Grid.Root gap={4}>\n {assets.map((asset, index) => {\n const isSelected = !!selectedAssets.find((currentAsset) => currentAsset.id === asset.id);\n\n if (onReorderAsset) {\n return (\n <Grid.Item key={asset.id} col={3} height=\"100%\">\n <Draggable index={index} moveItem={onReorderAsset} id={asset.id}>\n <AssetCard\n allowedTypes={allowedTypes}\n asset={asset}\n isSelected={isSelected}\n onEdit={onEditAsset ? () => onEditAsset(asset) : undefined}\n onSelect={() => onSelectAsset(asset)}\n size={size}\n />\n </Draggable>\n </Grid.Item>\n );\n }\n\n return (\n <Grid.Item col={3} key={asset.id} height=\"100%\" direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n key={asset.id}\n allowedTypes={allowedTypes}\n asset={asset}\n isSelected={isSelected}\n onEdit={onEditAsset ? () => onEditAsset(asset) : undefined}\n onSelect={() => onSelectAsset(asset)}\n size={size}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </KeyboardNavigable>\n );\n};\n\nAssetGridList.defaultProps = {\n allowedTypes: ['images', 'files', 'videos', 'audios'],\n onEditAsset: undefined,\n size: 'M',\n onReorderAsset: undefined,\n title: null,\n};\n\nAssetGridList.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n assets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n onEditAsset: PropTypes.func,\n onSelectAsset: PropTypes.func.isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n size: PropTypes.oneOf(['S', 'M']),\n onReorderAsset: PropTypes.func,\n title: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\nexport const CrumbSimpleMenuAsync = ({ parentsToOmit, currentFolderId, onChangeFolder }) => {\n const [shouldFetch, setShouldFetch] = useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) => !parentsToOmit.includes(ascendant.id) && ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(ascendant.id, ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder: ascendant?.id,\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem isLink tag={NavLink} to={url} key={ascendant.id}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n\nCrumbSimpleMenuAsync.defaultProps = {\n currentFolderId: undefined,\n onChangeFolder: undefined,\n parentsToOmit: [],\n};\n\nCrumbSimpleMenuAsync.propTypes = {\n currentFolderId: PropTypes.number,\n onChangeFolder: PropTypes.func,\n parentsToOmit: PropTypes.arrayOf(PropTypes.number),\n};\n","import React from 'react';\n\nimport { Breadcrumbs as BaseBreadcrumbs, Crumb, CrumbLink } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { BreadcrumbsDefinition } from '../../constants';\n\nimport { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync';\n\nexport const Breadcrumbs = ({ breadcrumbs, onChangeFolder, currentFolderId, ...props }) => {\n const { formatMessage } = useIntl();\n\n return (\n <BaseBreadcrumbs {...props}>\n {breadcrumbs.map((crumb, index) => {\n if (Array.isArray(crumb)) {\n return (\n <CrumbSimpleMenuAsync\n parentsToOmit={[...breadcrumbs]\n .splice(index + 1, breadcrumbs.length - 1)\n .map((parent) => parent.id)}\n key={`breadcrumb-${crumb?.id ?? 'menu'}`}\n currentFolderId={currentFolderId}\n onChangeFolder={onChangeFolder}\n />\n );\n }\n\n const isCurrentFolderMediaLibrary = crumb.id === null && currentFolderId === undefined;\n\n if (currentFolderId !== crumb.id && !isCurrentFolderMediaLibrary) {\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n tag={onChangeFolder ? 'button' : NavLink}\n type={onChangeFolder && 'button'}\n to={onChangeFolder ? undefined : crumb.href}\n onClick={onChangeFolder && (() => onChangeFolder(crumb.id, crumb.path))}\n >\n {crumb.label?.id ? formatMessage(crumb.label) : crumb.label}\n </CrumbLink>\n );\n }\n\n return (\n <Crumb\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n isCurrent={index + 1 === breadcrumbs.length}\n >\n {crumb.label?.id ? formatMessage(crumb.label) : crumb.label}\n </Crumb>\n );\n })}\n </BaseBreadcrumbs>\n );\n};\n\nBreadcrumbs.defaultProps = {\n currentFolderId: undefined,\n onChangeFolder: undefined,\n};\n\nBreadcrumbs.propTypes = {\n breadcrumbs: BreadcrumbsDefinition.isRequired,\n currentFolderId: PropTypes.number,\n onChangeFolder: PropTypes.func,\n};\n","import React from 'react';\n\nimport { Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nconst EmptyAssetCard = styled(Box)`\n background: linear-gradient(\n 180deg,\n rgba(234, 234, 239, 0) 0%,\n ${({ theme }) => theme.colors.neutral200} 100%\n );\n opacity: 0.33;\n`;\n\nconst PlaceholderSize = {\n S: 138,\n M: 234,\n};\n\nexport const EmptyAssetGrid = ({ count, size }) => {\n return (\n <Layouts.Grid size={size}>\n {Array(count)\n .fill(null)\n .map((_, idx) => (\n <EmptyAssetCard\n // eslint-disable-next-line react/no-array-index-key\n key={`empty-asset-card-${idx}`}\n height={`${PlaceholderSize[size]}px`}\n hasRadius\n />\n ))}\n </Layouts.Grid>\n );\n};\n\nEmptyAssetGrid.propTypes = {\n count: PropTypes.number.isRequired,\n size: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport PropTypes from 'prop-types';\n\nimport { EmptyAssetGrid } from './EmptyAssetGrid';\n\nexport const EmptyAssets = ({ icon: Icon = EmptyDocuments, content, action, size, count }) => {\n return (\n <Box position=\"relative\">\n <EmptyAssetGrid size={size} count={count} />\n\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"center\" gap={4} textAlign=\"center\">\n <Flex direction=\"column\" alignItems=\"center\" gap={6}>\n <Icon width=\"160px\" height=\"88px\" />\n\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {content}\n </Typography>\n </Flex>\n\n {action}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nEmptyAssets.defaultProps = {\n action: undefined,\n icon: undefined,\n size: 'M',\n count: 12,\n};\n\nEmptyAssets.propTypes = {\n action: PropTypes.node,\n icon: PropTypes.elementType,\n content: PropTypes.string.isRequired,\n size: PropTypes.string,\n count: PropTypes.number,\n};\n","import { createContext, useContext } from 'react';\n\nexport const FolderCardContext = createContext({});\n\nexport function useFolderCard() {\n return useContext(FolderCardContext);\n}\n","import { useRef } from 'react';\n\nlet id = 0;\n\nconst genId = () => ++id;\n\nconst useId = (initialId) => {\n const idRef = useRef(`${initialId}-${genId()}`);\n\n return idRef.current;\n};\n\nexport default useId;\n","import React, { forwardRef, useMemo } from 'react';\n\nimport { Box, CardAction, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { FolderCardContext } from '../contexts/FolderCard';\nimport useId from '../hooks/useId';\n\nconst FauxClickWrapper = styled.button`\n height: 100%;\n left: 0;\n position: absolute;\n opacity: 0;\n top: 0;\n width: 100%;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n`;\n\nconst StyledFolder = styled(Folder)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CardActionDisplay = styled(Box)`\n display: none;\n`;\n\nconst Card = styled(Box)`\n &:hover,\n &:focus-within {\n ${CardActionDisplay} {\n display: ${({ $isCardActions }) => ($isCardActions ? 'block' : '')};\n }\n }\n`;\n\nexport const FolderCard = forwardRef(\n ({ children, id, startAction, cardActions, ariaLabel, onClick, to, ...props }, ref) => {\n const generatedId = useId(id);\n const fodlerCtxValue = useMemo(() => ({ id: generatedId }), [generatedId]);\n\n return (\n <FolderCardContext.Provider value={fodlerCtxValue}>\n <Card position=\"relative\" tabIndex={0} $isCardActions={!!cardActions} ref={ref} {...props}>\n <FauxClickWrapper\n to={to || undefined}\n tag={to ? NavLink : 'button'}\n type={to ? undefined : 'button'}\n onClick={onClick}\n tabIndex={-1}\n aria-label={ariaLabel}\n aria-hidden\n />\n\n <Flex\n hasRadius\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor=\"neutral150\"\n background=\"neutral0\"\n shadow=\"tableShadow\"\n padding={3}\n gap={2}\n cursor=\"pointer\"\n >\n {startAction}\n\n <Box\n hasRadius\n background=\"secondary100\"\n color=\"secondary500\"\n paddingBottom={2}\n paddingLeft={3}\n paddingRight={3}\n paddingTop={2}\n >\n <StyledFolder width=\"2.4rem\" height=\"2.4rem\" />\n </Box>\n\n {children}\n\n <CardActionDisplay>\n <CardAction right={4}>{cardActions}</CardAction>\n </CardActionDisplay>\n </Flex>\n </Card>\n </FolderCardContext.Provider>\n );\n }\n);\n\nFolderCard.defaultProps = {\n id: undefined,\n cardActions: null,\n startAction: null,\n to: undefined,\n onClick: undefined,\n};\n\nFolderCard.propTypes = {\n ariaLabel: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n id: PropTypes.string,\n onClick: PropTypes.func,\n startAction: PropTypes.element,\n cardActions: PropTypes.element,\n to: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nconst StyledBox = styled(Flex)`\n user-select: none;\n`;\n\nexport const FolderCardBody = (props) => {\n const { id } = useFolderCard();\n\n return (\n <StyledBox\n {...props}\n id={`${id}-title`}\n alignItems=\"flex-start\"\n direction=\"column\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n position=\"relative\"\n />\n );\n};\n","import React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nconst BoxOutline = styled(Box)`\n &:focus {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst BoxTextDecoration = styled(BoxOutline)`\n text-decoration: none;\n`;\n\nexport const FolderCardBodyAction = ({ to, ...props }) => {\n if (to) {\n return (\n <BoxTextDecoration\n // padding needed to give outline space to appear\n // since FolderCardBody needs overflow hidden property\n padding={1}\n tag={NavLink}\n maxWidth=\"100%\"\n to={to}\n {...props}\n />\n );\n }\n\n return <BoxOutline padding={1} tag=\"button\" type=\"button\" maxWidth=\"100%\" {...props} />;\n};\n\nFolderCardBodyAction.defaultProps = {\n to: undefined,\n};\n\nFolderCardBodyAction.propTypes = {\n to: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const FolderGridList = ({ title, children }) => {\n return (\n <KeyboardNavigable tagName=\"article\">\n {title && (\n <Box paddingBottom={2}>\n <Typography tag=\"h2\" variant=\"delta\" fontWeight=\"semiBold\">\n {title}\n </Typography>\n </Box>\n )}\n\n <Grid.Root gap={4}>{children}</Grid.Root>\n </KeyboardNavigable>\n );\n};\n\nFolderGridList.defaultProps = {\n title: null,\n};\n\nFolderGridList.propTypes = {\n children: PropTypes.node.isRequired,\n title: PropTypes.string,\n};\n","import React from 'react';\n\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { sortOptions } from '../../constants';\nimport { getTrad } from '../../utils';\n\nconst SortPicker = ({ onChangeSort, value }) => {\n const { formatMessage } = useIntl();\n\n return (\n <SingleSelect\n size=\"S\"\n value={value}\n onChange={(value) => onChangeSort(value)}\n aria-label={formatMessage({\n id: getTrad('sort.label'),\n defaultMessage: 'Sort by',\n })}\n placeholder={formatMessage({\n id: getTrad('sort.label'),\n defaultMessage: 'Sort by',\n })}\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption key={filter.key} value={filter.value}>\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n};\n\nSortPicker.defaultProps = {\n value: undefined,\n};\n\nSortPicker.propTypes = {\n onChangeSort: PropTypes.func.isRequired,\n value: PropTypes.string,\n};\n\nexport default SortPicker;\n","import React from 'react';\n\nimport { Avatar, Box, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\nimport { VideoPreview } from '../AssetCard/VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n figure {\n width: ${({ theme }) => theme.spaces[7]};\n height: ${({ theme }) => theme.spaces[7]};\n }\n\n canvas,\n video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n }\n`;\n\nexport const PreviewCell = ({ type, content }) => {\n if (type === 'folder') {\n return (\n <Flex\n justifyContent=\"center\"\n background=\"secondary100\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n borderRadius=\"50%\"\n >\n <Folder fill=\"secondary500\" width=\"1.6rem\" height=\"1.6rem\" />\n </Flex>\n );\n }\n\n const { alternativeText, ext, formats, mime, name, url } = content;\n\n if (mime.includes(AssetType.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n return <Avatar.Item src={mediaURL} alt={alternativeText} preview />;\n }\n\n if (mime.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper>\n <VideoPreview\n url={createAssetUrl(content, true)}\n mime={mime}\n alt={alternativeText ?? name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n return (\n <Box background=\"secondary100\" color=\"secondary600\" width=\"3.2rem\" height=\"3.2rem\">\n {getFileExtension(ext)}\n </Box>\n );\n};\n\nPreviewCell.propTypes = {\n content: PropTypes.shape({\n alternativeText: PropTypes.string,\n ext: PropTypes.string,\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n mime: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n type: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Typography } from '@strapi/design-system';\nimport parseISO from 'date-fns/parseISO';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { formatBytes, getFileExtension } from '../../utils';\n\nimport { PreviewCell } from './PreviewCell';\n\nexport const CellContent = ({ cellType, contentType, content, name }) => {\n const { formatDate, formatMessage } = useIntl();\n\n switch (cellType) {\n case 'image':\n return <PreviewCell type={contentType} content={content} />;\n\n case 'date':\n return <Typography>{formatDate(parseISO(content[name]), { dateStyle: 'full' })}</Typography>;\n\n case 'size':\n if (contentType === 'folder')\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n\n return <Typography>{formatBytes(content[name])}</Typography>;\n\n case 'ext':\n if (contentType === 'folder')\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n\n return <Typography>{getFileExtension(content[name]).toUpperCase()}</Typography>;\n\n case 'text':\n return <Typography>{content[name]}</Typography>;\n\n default:\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n }\n};\n\nCellContent.propTypes = {\n cellType: PropTypes.string.isRequired,\n contentType: PropTypes.string.isRequired,\n content: PropTypes.shape({\n alternativeText: PropTypes.string,\n ext: PropTypes.string,\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n mime: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n name: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Checkbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system';\nimport { Eye, Pencil } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { AssetDefinition, FolderDefinition, tableHeaders as cells } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { CellContent } from './CellContent';\n\nexport const TableRows = ({\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectOne,\n rows,\n selected,\n}) => {\n const { formatMessage } = useIntl();\n\n const handleRowClickFn = (element, elementType, id, path) => {\n if (elementType === 'asset') {\n onEditAsset(element);\n } else {\n onChangeFolder(id, path);\n }\n };\n\n return (\n <Tbody>\n {rows.map((element) => {\n const { path, id, isSelectable, name, folderURL, type: contentType } = element;\n\n const isSelected = !!selected.find(\n (currentRow) => currentRow.id === id && currentRow.type === contentType\n );\n\n return (\n <Tr key={id} onClick={() => handleRowClickFn(element, contentType, id, path)}>\n <Td onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: contentType === 'asset' ? 'list-assets-select' : 'list.folder.select',\n defaultMessage:\n contentType === 'asset' ? 'Select {name} asset' : 'Select {name} folder',\n },\n { name }\n )}\n disabled={!isSelectable}\n onCheckedChange={() => onSelectOne(element)}\n checked={isSelected}\n />\n </Td>\n {cells.map(({ name, type: cellType }) => {\n return (\n <Td key={name}>\n <CellContent\n content={element}\n cellType={cellType}\n contentType={contentType}\n name={name}\n />\n </Td>\n );\n })}\n\n <Td onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"flex-end\">\n {contentType === 'folder' && (\n <IconButton\n tag={folderURL ? Link : 'button'}\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n to={folderURL}\n onClick={() => !folderURL && onChangeFolder(id)}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n )}\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.edit'),\n defaultMessage: 'Edit',\n })}\n onClick={() =>\n contentType === 'asset' ? onEditAsset(element) : onEditFolder(element)\n }\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n );\n};\n\nTableRows.defaultProps = {\n onChangeFolder: null,\n rows: [],\n selected: [],\n};\n\nTableRows.propTypes = {\n onChangeFolder: PropTypes.func,\n onEditAsset: PropTypes.func.isRequired,\n onEditFolder: PropTypes.func.isRequired,\n onSelectOne: PropTypes.func.isRequired,\n rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n};\n","import React from 'react';\n\nimport {\n Checkbox,\n IconButton,\n Table,\n Th,\n Thead,\n Tooltip,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { CaretDown, CaretUp } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, FolderDefinition, tableHeaders } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { TableRows } from './TableRows';\n\nexport const TableList = ({\n assetCount,\n folderCount,\n indeterminate,\n onChangeSort,\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectAll,\n onSelectOne,\n rows,\n selected,\n shouldDisableBulkSelect,\n sortQuery,\n}) => {\n const { formatMessage } = useIntl();\n const [sortBy, sortOrder] = sortQuery.split(':');\n\n const handleClickSort = (isSorted, name) => {\n const nextSortOrder = isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC';\n const nextSort = `${name}:${nextSortOrder}`;\n\n onChangeSort(nextSort);\n };\n\n return (\n <Table colCount={tableHeaders.length + 2} rowCount={assetCount + folderCount + 1}>\n <Thead>\n <Tr>\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n disabled={shouldDisableBulkSelect}\n onCheckedChange={(checked) => onSelectAll(checked, rows)}\n checked={\n indeterminate && !shouldDisableBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n />\n </Th>\n {tableHeaders.map(({ metadatas: { label, isSortable }, name, key }) => {\n const isSorted = sortBy === name;\n const isUp = sortOrder === 'ASC';\n const tableHeaderLabel = formatMessage(label);\n const sortLabel = formatMessage(\n { id: 'list.table.header.sort', defaultMessage: 'Sort on {label}' },\n { label: tableHeaderLabel }\n );\n\n return (\n <Th\n action={\n isSorted && (\n <IconButton\n label={sortLabel}\n onClick={() => handleClickSort(isSorted, name)}\n variant=\"ghost\"\n >\n {isUp ? <CaretUp /> : <CaretDown />}\n </IconButton>\n )\n }\n key={key}\n >\n <Tooltip label={isSortable ? sortLabel : tableHeaderLabel}>\n {isSortable ? (\n <Typography\n onClick={() => handleClickSort(isSorted, name)}\n tag={isSorted ? 'span' : 'button'}\n label={!isSorted ? sortLabel : ''}\n textColor=\"neutral600\"\n variant=\"sigma\"\n >\n {tableHeaderLabel}\n </Typography>\n ) : (\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n )}\n </Tooltip>\n </Th>\n );\n })}\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTrad('list.table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <TableRows\n onChangeFolder={onChangeFolder}\n onEditAsset={onEditAsset}\n onEditFolder={onEditFolder}\n rows={rows}\n onSelectOne={onSelectOne}\n selected={selected}\n />\n </Table>\n );\n};\n\nTableList.defaultProps = {\n assetCount: 0,\n folderCount: 0,\n indeterminate: false,\n onChangeSort: null,\n onChangeFolder: null,\n onEditAsset: null,\n onEditFolder: null,\n rows: [],\n selected: [],\n shouldDisableBulkSelect: false,\n sortQuery: '',\n};\n\nTableList.propTypes = {\n assetCount: PropTypes.number,\n folderCount: PropTypes.number,\n indeterminate: PropTypes.bool,\n onChangeSort: PropTypes.func,\n onChangeFolder: PropTypes.func,\n onEditAsset: PropTypes.func,\n onEditFolder: PropTypes.func,\n onSelectAll: PropTypes.func.isRequired,\n onSelectOne: PropTypes.func.isRequired,\n rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n shouldDisableBulkSelect: PropTypes.bool,\n sortQuery: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Tag } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst FilterTag = ({ attribute, filter, onClick, operator, value }) => {\n const { formatMessage, formatDate, formatTime } = useIntl();\n\n const handleClick = () => {\n onClick(filter);\n };\n\n const { fieldSchema } = attribute;\n\n const type = fieldSchema.type;\n\n let formattedValue = value;\n\n if (type === 'date') {\n formattedValue = formatDate(value, { dateStyle: 'full' });\n }\n\n if (type === 'datetime') {\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n }\n\n if (type === 'time') {\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(hour);\n date.setMinutes(minute);\n\n formattedValue = formatTime(date, {\n numeric: 'auto',\n style: 'short',\n });\n }\n\n const content = `${attribute.metadatas.label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${formattedValue}`;\n\n return (\n <Tag onClick={handleClick} icon={<Cross />} padding={1}>\n {content}\n </Tag>\n );\n};\n\nFilterTag.propTypes = {\n attribute: PropTypes.shape({\n name: PropTypes.string.isRequired,\n fieldSchema: PropTypes.object.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string.isRequired }).isRequired,\n }).isRequired,\n filter: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n operator: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n};\n\nexport default FilterTag;\n","/**\n *\n * FilterList\n *\n */\n\nimport React from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport FilterTag from './FilterTag';\n\nconst FilterList = ({ appliedFilters, filtersSchema, onRemoveFilter }) => {\n const handleClick = (filter) => {\n const nextFilters = appliedFilters.filter((prevFilter) => {\n const name = Object.keys(filter)[0];\n const filterType = Object.keys(filter[name])[0];\n const value = decodeURIComponent(filter[name][filterType]);\n\n return prevFilter[name]?.[filterType] !== value;\n });\n\n onRemoveFilter(nextFilters);\n };\n\n return appliedFilters.map((filter, i) => {\n const attributeName = Object.keys(filter)[0];\n const attribute = filtersSchema.find(({ name }) => name === attributeName);\n\n const filterObj = filter[attributeName];\n const operator = Object.keys(filterObj)[0];\n let value = filterObj[operator];\n\n if (Array.isArray(value)) {\n value = value.join(', ');\n } else if (typeof value === 'object') {\n value = Object.values(value).join(', ');\n } else {\n value =\n Array.isArray(value) || typeof value === 'object'\n ? Object.values(value).join(', ')\n : decodeURIComponent(value);\n }\n\n let displayedOperator = operator;\n\n if (attribute.name === 'mime') {\n displayedOperator = operator === '$contains' ? '$eq' : '$ne';\n\n // Type is file\n // The filter for the file is the following: { mime: {$not: {$contains: ['image', 'video']}}}\n if (operator === '$not') {\n value = 'file';\n displayedOperator = '$eq';\n }\n\n // Here the type is file and the filter is not file\n // { mime: {$contains: ['image', 'video'] }}\n if (['image', 'video'].includes(value[0]) && ['image', 'video'].includes(value[1])) {\n value = 'file';\n displayedOperator = '$ne';\n }\n }\n\n return (\n <FilterTag\n // eslint-disable-next-line react/no-array-index-key\n key={`${attributeName}-${i}`}\n attribute={attribute}\n filter={filter}\n onClick={handleClick}\n operator={displayedOperator}\n value={value}\n />\n );\n });\n};\n\nFilterList.defaultProps = {\n filtersSchema: [],\n};\n\nFilterList.propTypes = {\n appliedFilters: PropTypes.array.isRequired,\n filtersSchema: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string }),\n fieldSchema: PropTypes.shape({\n type: PropTypes.string,\n mainField: PropTypes.shape({\n name: PropTypes.string,\n type: PropTypes.string,\n }),\n }),\n })\n ),\n onRemoveFilter: PropTypes.func.isRequired,\n};\n\nexport default FilterList;\n","import React from 'react';\n\nimport { DateTimePicker, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst FilterValueInput = ({ label, onChange, options, type, value }) => {\n const { formatMessage } = useIntl();\n\n if (type === 'date') {\n return (\n <DateTimePicker\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n ariaLabel={label}\n name=\"datetimepicker\"\n onChange={(date) => {\n const formattedDate = date ? new Date(date).toISOString() : '';\n\n onChange(formattedDate);\n }}\n onClear={() => onChange('')}\n value={value ? new Date(value) : undefined}\n selectedDateLabel={(formattedDate) => `Date picker, current is ${formattedDate}`}\n selectButtonTitle={formatMessage({ id: 'selectButtonTitle', defaultMessage: 'Select' })}\n />\n );\n }\n\n return (\n <SingleSelect aria-label={label} onChange={onChange} value={value}>\n {options.map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {option.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n );\n};\n\nFilterValueInput.defaultProps = {\n label: '',\n options: [],\n value: '',\n};\n\nFilterValueInput.propTypes = {\n label: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n options: PropTypes.arrayOf(\n PropTypes.shape({ label: PropTypes.string.isRequired, value: PropTypes.string.isRequired })\n ),\n type: PropTypes.string.isRequired,\n value: PropTypes.any,\n};\n\nexport default FilterValueInput;\n","/**\n * Depending on the selected field find the possible filters to apply\n * @param {Object} fieldSchema.type the type of the filter\n * @returns {Object[]}\n */\nconst getFilterList = ({ fieldSchema: { type: fieldType, mainField } }) => {\n const type = mainField?.schema.type ? mainField.schema.type : fieldType;\n\n switch (type) {\n case 'enumeration': {\n return [\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n },\n value: '$contains',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n },\n value: '$notContains',\n },\n ];\n }\n\n case 'date': {\n return [\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$eq', defaultMessage: 'is' },\n value: '$eq',\n },\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$ne', defaultMessage: 'is not' },\n value: '$ne',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$gt',\n defaultMessage: 'is greater than',\n },\n value: '$gt',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$gte',\n defaultMessage: 'is greater than or equal to',\n },\n value: '$gte',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$lt',\n defaultMessage: 'is less than',\n },\n value: '$lt',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$lte',\n defaultMessage: 'is less than or equal to',\n },\n value: '$lte',\n },\n ];\n }\n\n default:\n return [\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$eq', defaultMessage: 'is' },\n value: '$eq',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$eqi',\n defaultMessage: 'is (case insensitive)',\n },\n value: '$eqi',\n },\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$ne', defaultMessage: 'is not' },\n value: '$ne',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$null',\n defaultMessage: 'is null',\n },\n value: '$null',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$notNull',\n defaultMessage: 'is not null',\n },\n value: '$notNull',\n },\n ];\n }\n};\n\nexport default getFilterList;\n","/**\n *\n * FilterPopover\n *\n */\n\nimport React, { useState } from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport FilterValueInput from './FilterValueInput';\nimport getFilterList from './utils/getFilterList';\n\nconst FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle }) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options[0].value;\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value, filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator, value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator, value: '' }));\n }\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return filter.mime?.$not?.$contains !== undefined;\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n return filter.mime[modifiedData.filter] === modifiedData.value;\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (filter.mime?.$not?.$contains !== undefined) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n let filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n return (\n filter[modifiedData.name] &&\n filter[modifiedData.name]?.[modifiedData.filter] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n let filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter.metadatas}\n {...appliedFilter.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n\nFilterPopover.propTypes = {\n displayedFilters: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string }),\n fieldSchema: PropTypes.shape({ type: PropTypes.string }),\n })\n ).isRequired,\n filters: PropTypes.array.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onToggle: PropTypes.func.isRequired,\n};\n\nexport default FilterPopover;\n","import * as React from 'react';\n\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { displayedFilters } from '../../../utils';\nimport FilterList from '../../FilterList';\nimport FilterPopover from '../../FilterPopover';\n\nexport const Filters = ({ appliedFilters, onChangeFilters }) => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n onToggle={setOpen}\n displayedFilters={displayedFilters}\n filters={appliedFilters}\n onSubmit={onChangeFilters}\n />\n\n {appliedFilters && (\n <FilterList\n appliedFilters={appliedFilters}\n filtersSchema={displayedFilters}\n onRemoveFilter={onChangeFilters}\n />\n )}\n </Popover.Root>\n );\n};\n\nFilters.propTypes = {\n appliedFilters: PropTypes.array.isRequired,\n onChangeFilters: PropTypes.func.isRequired,\n};\n","/**\n *\n * PageSize\n *\n */\n\nimport React from 'react';\n\nimport { Box, Flex, SingleSelectOption, SingleSelect, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst PageSize = ({ onChangePageSize, pageSize }) => {\n const { formatMessage } = useIntl();\n\n const handleChange = (value) => {\n onChangePageSize(value);\n };\n\n return (\n <Flex>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n onChange={handleChange}\n value={pageSize.toString()}\n >\n <SingleSelectOption value=\"10\">10</SingleSelectOption>\n <SingleSelectOption value=\"20\">20</SingleSelectOption>\n <SingleSelectOption value=\"50\">50</SingleSelectOption>\n <SingleSelectOption value=\"100\">100</SingleSelectOption>\n </SingleSelect>\n <Box paddingLeft={2}>\n <Typography textColor=\"neutral600\" tag=\"label\" htmlFor=\"page-size\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Box>\n </Flex>\n );\n};\n\nPageSize.propTypes = {\n onChangePageSize: PropTypes.func.isRequired,\n pageSize: PropTypes.number.isRequired,\n};\n\nexport default PageSize;\n","import { createContext, useContext } from 'react';\n\nexport const PaginationContext = createContext({ activePage: 1, pageCount: 1 });\nexport const usePagination = () => useContext(PaginationContext);\n","import React from 'react';\n\nimport { Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { usePagination } from './PaginationContext';\n\nconst PaginationText = styled(Typography)`\n line-height: revert;\n`;\n\nconst LinkWrapper = styled.button`\n padding: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ $active, theme }) => ($active ? theme.shadows.filterShadow : undefined)};\n text-decoration: none;\n display: flex;\n position: relative;\n outline: none;\n\n &:after {\n transition-property: all;\n transition-duration: 0.2s;\n border-radius: 8px;\n content: '';\n position: absolute;\n top: -4px;\n bottom: -4px;\n left: -4px;\n right: -4px;\n border: 2px solid transparent;\n }\n\n &:focus-visible {\n outline: none;\n\n &:after {\n border-radius: 8px;\n content: '';\n position: absolute;\n top: -5px;\n bottom: -5px;\n left: -5px;\n right: -5px;\n border: 2px solid ${(props) => props.theme.colors.primary600};\n }\n }\n`;\n\nLinkWrapper.defaultProps = { type: 'button' };\n\nconst PageLinkWrapper = styled(LinkWrapper)`\n color: ${({ theme, $active }) => ($active ? theme.colors.primary700 : theme.colors.neutral800)};\n background: ${({ theme, $active }) => ($active ? theme.colors.neutral0 : undefined)};\n\n &:hover {\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n }\n`;\n\nconst ActionLinkWrapper = styled(LinkWrapper)`\n font-size: 1.1rem;\n svg path {\n fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral600)};\n }\n\n &:focus,\n &:hover {\n svg path {\n fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral700)};\n }\n }\n\n ${(p) =>\n p['aria-disabled']\n ? `\n pointer-events: none;\n `\n : undefined}\n`;\n\nconst DotsWrapper = styled(LinkWrapper)`\n color: ${({ theme }) => theme.colors.neutral800};\n`;\n\nexport const PreviousLink = ({ children, ...props }) => {\n const { activePage } = usePagination();\n\n const disabled = activePage === 1;\n\n return (\n <li>\n <ActionLinkWrapper aria-disabled={disabled} tabIndex={disabled ? -1 : undefined} {...props}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <ChevronLeft aria-hidden />\n </ActionLinkWrapper>\n </li>\n );\n};\n\nexport const NextLink = ({ children, ...props }) => {\n const { activePage, pageCount } = usePagination();\n\n const disabled = activePage === pageCount;\n\n return (\n <li>\n <ActionLinkWrapper aria-disabled={disabled} tabIndex={disabled ? -1 : undefined} {...props}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <ChevronRight aria-hidden />\n </ActionLinkWrapper>\n </li>\n );\n};\n\nexport const PageLink = ({ number, children, ...props }) => {\n const { activePage } = usePagination();\n\n const isActive = activePage === number;\n\n return (\n <li>\n <PageLinkWrapper {...props} $active={isActive}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden variant=\"pi\" fontWeight={isActive ? 'bold' : ''}>\n {number}\n </PaginationText>\n </PageLinkWrapper>\n </li>\n );\n};\n\nexport const Dots = ({ children, ...props }) => (\n <li>\n <DotsWrapper {...props} tag=\"div\">\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden small>\n …\n </PaginationText>\n </DotsWrapper>\n </li>\n);\n\nPageLink.propTypes = {\n children: PropTypes.node.isRequired,\n number: PropTypes.number.isRequired,\n};\n\nconst sharedPropTypes = {\n children: PropTypes.node.isRequired,\n};\n\nNextLink.propTypes = sharedPropTypes;\nPreviousLink.propTypes = sharedPropTypes;\n\nDots.propTypes = {\n children: PropTypes.node.isRequired,\n};\n","import React, { useMemo } from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { PaginationContext } from './PaginationContext';\n\nexport const Pagination = ({ children, label, activePage, pageCount }) => {\n const paginationValue = useMemo(() => ({ activePage, pageCount }), [activePage, pageCount]);\n\n return (\n <PaginationContext.Provider value={paginationValue}>\n <Box tag=\"nav\" aria-label={label}>\n <Flex tag=\"ul\" gap={1}>\n {children}\n </Flex>\n </Box>\n </PaginationContext.Provider>\n );\n};\n\nPagination.defaultProps = {\n label: 'pagination',\n};\n\nPagination.propTypes = {\n activePage: PropTypes.number.isRequired,\n children: PropTypes.node.isRequired,\n label: PropTypes.string,\n pageCount: PropTypes.number.isRequired,\n};\n","/**\n * The component works as follows: this is a duplicate of the helper-plugin one but without the router\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\nimport React from 'react';\n\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { Dots, NextLink, PageLink, PreviousLink } from './components';\nimport { Pagination } from './Pagination';\n\nconst PaginationFooter = ({ activePage, onChangePage, pagination: { pageCount } }) => {\n const { formatMessage } = useIntl();\n\n const previousActivePage = activePage - 1;\n const nextActivePage = activePage + 1;\n\n const firstLinks = [\n <PageLink\n key={1}\n number={1}\n onClick={() => {\n onChangePage(1);\n }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: 1 }\n )}\n </PageLink>,\n ];\n\n if (pageCount <= 4) {\n const links = Array.from({ length: pageCount })\n .map((_, i) => i + 1)\n .map((number) => {\n return (\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n\n return (\n <Pagination activePage={activePage} pageCount={pageCount}>\n <PreviousLink onClick={() => onChangePage(previousActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {links}\n <NextLink onClick={() => onChangePage(nextActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </Pagination>\n );\n }\n\n let firstLinksToCreate = [];\n let lastLinks = [];\n let lastLinksToCreate = [];\n const middleLinks = [];\n\n if (pageCount > 1) {\n lastLinks.push(\n <PageLink key={pageCount} number={pageCount} onClick={() => onChangePage(pageCount)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: pageCount }\n )}\n </PageLink>\n );\n }\n\n if (activePage === 1 && pageCount >= 3) {\n firstLinksToCreate = [2];\n }\n\n if (activePage === 2 && pageCount >= 3) {\n if (pageCount === 5) {\n firstLinksToCreate = [2, 3, 4];\n } else if (pageCount === 3) {\n firstLinksToCreate = [2];\n } else {\n firstLinksToCreate = [2, 3];\n }\n }\n\n if (activePage === 4 && pageCount >= 3) {\n firstLinksToCreate = [2];\n }\n\n if (activePage === pageCount && pageCount >= 3) {\n lastLinksToCreate = [pageCount - 1];\n }\n\n if (activePage === pageCount - 2 && pageCount > 3) {\n lastLinksToCreate = [activePage + 1, activePage, activePage - 1];\n }\n\n if (activePage === pageCount - 3 && pageCount > 3 && activePage > 5) {\n lastLinksToCreate = [activePage + 2, activePage + 1, activePage, activePage - 1];\n }\n\n if (activePage === pageCount - 1 && pageCount > 3) {\n lastLinksToCreate = [activePage, activePage - 1];\n }\n\n lastLinksToCreate.forEach((number) => {\n lastLinks.unshift(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n Go to page {number}\n </PageLink>\n );\n });\n\n firstLinksToCreate.forEach((number) => {\n firstLinks.push(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n\n if (\n ![1, 2].includes(activePage) &&\n activePage <= pageCount - 3 &&\n firstLinks.length + lastLinks.length < 6\n ) {\n const middleLinksToCreate = [activePage - 1, activePage, activePage + 1];\n\n middleLinksToCreate.forEach((number) => {\n middleLinks.push(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n }\n\n const shouldShowDotsAfterFirstLink =\n pageCount > 5 || (pageCount === 5 && (activePage === 1 || activePage === 5));\n const shouldShowMiddleDots = middleLinks.length > 2 && activePage > 4 && pageCount > 5;\n\n const beforeDotsLinksLength = shouldShowMiddleDots\n ? pageCount - activePage - 1\n : pageCount - firstLinks.length - lastLinks.length;\n const afterDotsLength = shouldShowMiddleDots\n ? pageCount - firstLinks.length - lastLinks.length\n : pageCount - activePage - 1;\n\n return (\n <Pagination activePage={activePage} pageCount={pageCount}>\n <PreviousLink onClick={() => onChangePage(previousActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {firstLinks}\n {shouldShowMiddleDots && (\n <Dots>\n {formatMessage(\n {\n id: 'components.pagination.remaining-links',\n defaultMessage: 'And {number} other links',\n },\n { number: beforeDotsLinksLength }\n )}\n </Dots>\n )}\n {middleLinks}\n {shouldShowDotsAfterFirstLink && (\n <Dots>\n {formatMessage(\n {\n id: 'components.pagination.remaining-links',\n defaultMessage: 'And {number} other links',\n },\n { number: afterDotsLength }\n )}\n </Dots>\n )}\n {lastLinks}\n <NextLink onClick={() => onChangePage(nextActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </Pagination>\n );\n};\n\nPaginationFooter.propTypes = {\n activePage: PropTypes.number.isRequired,\n onChangePage: PropTypes.func.isRequired,\n pagination: PropTypes.shape({ pageCount: PropTypes.number.isRequired }).isRequired,\n};\n\nexport default PaginationFooter;\n","import React, { useLayoutEffect, useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nconst SearchAsset = ({ onChangeSearch, queryValue }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [isOpen, setIsOpen] = useState(!!queryValue);\n const [value, setValue] = useState(queryValue || '');\n const wrapperRef = useRef(null);\n\n useLayoutEffect(() => {\n if (isOpen) {\n setTimeout(() => {\n wrapperRef.current.querySelector('input').focus();\n }, 0);\n }\n }, [isOpen]);\n\n const handleToggle = () => {\n setIsOpen((prev) => !prev);\n };\n\n const handleClear = () => {\n handleToggle();\n onChangeSearch(null);\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n trackUsage('didSearchMediaLibraryElements', { location: 'content-manager' });\n onChangeSearch(value);\n };\n\n if (isOpen) {\n return (\n <div ref={wrapperRef}>\n <SearchForm onSubmit={handleSubmit}>\n <Searchbar\n name=\"search\"\n onClear={handleClear}\n onChange={(e) => setValue(e.target.value)}\n clearLabel={formatMessage({\n id: getTrad('search.clear.label'),\n defaultMessage: 'Clear the search',\n })}\n size=\"S\"\n value={value}\n placeholder={formatMessage({\n id: getTrad('search.placeholder'),\n defaultMessage: 'e.g: the first dog on the moon',\n })}\n >\n {formatMessage({ id: getTrad('search.label'), defaultMessage: 'Search for an asset' })}\n </Searchbar>\n </SearchForm>\n </div>\n );\n }\n\n return (\n <IconButton label=\"Search\" onClick={handleToggle}>\n <Search />\n </IconButton>\n );\n};\n\nSearchAsset.defaultProps = {\n queryValue: null,\n};\n\nSearchAsset.propTypes = {\n onChangeSearch: PropTypes.func.isRequired,\n queryValue: PropTypes.string,\n};\n\nexport default SearchAsset;\n","/**\n * @param {string[]} allowedTypes\n * @param {string} mime\n * @returns {boolean}\n */\n\nexport const isSelectable = (allowedTypes, mime = '') => {\n if (!mime) return false;\n\n const fileType = mime.split('/')[0];\n\n return (\n allowedTypes.includes(fileType) ||\n (allowedTypes.includes('file') && !['video', 'image', 'audio'].includes(fileType))\n );\n};\n","import React from 'react';\n\nimport {\n Checkbox,\n Box,\n Button,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { GridFour as GridIcon, List, Pencil, Plus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AssetDefinition,\n FolderDefinition,\n localStorageKeys,\n viewOptions,\n} from '../../../constants';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { getBreadcrumbDataCM, toSingularTypes, getTrad, getAllowedFiles } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList';\nimport { Breadcrumbs } from '../../Breadcrumbs';\nimport { EmptyAssets } from '../../EmptyAssets';\nimport { FolderCard, FolderCardBody, FolderCardBodyAction } from '../../FolderCard';\nimport { FolderGridList } from '../../FolderGridList';\nimport SortPicker from '../../SortPicker';\nimport { TableList } from '../../TableList';\n\nimport { Filters } from './Filters';\nimport PageSize from './PageSize';\nimport PaginationFooter from './PaginationFooter';\nimport SearchAsset from './SearchAsset';\nimport { isSelectable } from './utils/isSelectable';\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const BrowseStep = ({\n allowedTypes,\n assets: rawAssets,\n canCreate,\n canRead,\n folders,\n multiple,\n onAddAsset,\n onChangeFilters,\n onChangePage,\n onChangePageSize,\n onChangeSearch,\n onChangeSort,\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectAllAsset,\n onSelectAsset,\n pagination,\n queryObject,\n selectedAssets,\n}) => {\n const { formatMessage } = useIntl();\n const [view, setView] = usePersistentState(localStorageKeys.modalView, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const { data: currentFolder, isLoading: isCurrentFolderLoading } = useFolder(\n queryObject?.folder,\n {\n enabled: canRead && !!queryObject?.folder,\n }\n );\n\n const singularTypes = toSingularTypes(allowedTypes);\n const assets = rawAssets.map((asset) => ({\n ...asset,\n isSelectable: isSelectable(singularTypes, asset?.mime),\n type: 'asset',\n }));\n\n const breadcrumbs = !isCurrentFolderLoading && getBreadcrumbDataCM(currentFolder);\n\n const allAllowedAsset = getAllowedFiles(allowedTypes, assets);\n const areAllAssetSelected =\n allAllowedAsset.length > 0 &&\n selectedAssets.length > 0 &&\n allAllowedAsset.every(\n (asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1\n );\n const hasSomeAssetSelected = allAllowedAsset.some(\n (asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1\n );\n const isSearching = !!queryObject?._q;\n const isFiltering = queryObject?.filters?.$and?.length > 0;\n const isSearchingOrFiltering = isSearching || isFiltering;\n const assetCount = assets.length;\n const folderCount = folders.length;\n const handleClickFolderCard = (...args) => {\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n onChangeSearch('');\n onChangeFolder(...args);\n };\n\n return (\n <Box>\n {onSelectAllAsset && (\n <Box paddingBottom={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"flex-start\">\n {(assetCount > 0 || folderCount > 0 || isFiltering) && (\n <Flex gap={2} wrap=\"wrap\">\n {multiple && isGridView && (\n <Flex\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n height=\"3.2rem\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all assets',\n })}\n checked={\n !areAllAssetSelected && hasSomeAssetSelected\n ? 'indeterminate'\n : areAllAssetSelected\n }\n onCheckedChange={onSelectAllAsset}\n />\n </Flex>\n )}\n {isGridView && <SortPicker onChangeSort={onChangeSort} value={queryObject?.sort} />}\n <Filters\n appliedFilters={queryObject?.filters?.$and}\n onChangeFilters={onChangeFilters}\n />\n </Flex>\n )}\n\n {(assetCount > 0 || folderCount > 0 || isSearching) && (\n <Flex marginLeft=\"auto\" shrink={0} gap={2}>\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: 'view-switch.list',\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: 'view-switch.grid',\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchAsset onChangeSearch={onChangeSearch} queryValue={queryObject._q || ''} />\n </Flex>\n )}\n </Flex>\n </Box>\n )}\n\n {canRead && breadcrumbs?.length > 0 && currentFolder && (\n <Box paddingTop={3}>\n <Breadcrumbs\n onChangeFolder={onChangeFolder}\n tag=\"nav\"\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={queryObject?.folder}\n />\n </Box>\n )}\n\n {assetCount === 0 && folderCount === 0 && (\n <Box paddingBottom={6}>\n <EmptyAssets\n size=\"S\"\n count={6}\n action={\n canCreate &&\n !isFiltering &&\n !isSearching && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onAddAsset}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={\n // eslint-disable-next-line no-nested-ternary\n isSearchingOrFiltering\n ? formatMessage({\n id: getTrad('list.assets-empty.title-withSearch'),\n defaultMessage: 'There are no assets with the applied filters',\n })\n : canCreate && !isSearching\n ? formatMessage({\n id: getTrad('list.assets.empty'),\n defaultMessage: 'Upload your first assets...',\n })\n : formatMessage({\n id: getTrad('list.assets.empty.no-permissions'),\n defaultMessage: 'The asset list is empty',\n })\n }\n />\n </Box>\n )}\n\n {!isGridView && (folderCount > 0 || assetCount > 0) && (\n <TableList\n allowedTypes={allowedTypes}\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={!areAllAssetSelected && hasSomeAssetSelected}\n isFolderSelectionAllowed={false}\n onChangeSort={onChangeSort}\n onChangeFolder={handleClickFolderCard}\n onEditAsset={onEditAsset}\n onEditFolder={onEditFolder}\n onSelectOne={onSelectAsset}\n onSelectAll={onSelectAllAsset}\n rows={[...folders.map((folder) => ({ ...folder, type: 'folder' })), ...assets]}\n selected={selectedAssets}\n shouldDisableBulkSelect={!multiple}\n sortQuery={queryObject?.sort ?? ''}\n />\n )}\n\n {isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n (((isSearchingOrFiltering && assetCount > 0) || !isSearchingOrFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n onClick={() => handleClickFolderCard(folder.id, folder.path)}\n cardActions={\n onEditFolder && (\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => onEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n )\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction\n onClick={() => handleClickFolderCard(folder.id, folder.path)}\n >\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n ellipsis\n textColor=\"neutral800\"\n >\n {folder.name}\n {/* VisuallyHidden dash here allows to separate folder title and count informations\n for voice reading structure purpose */}\n <VisuallyHidden>-</VisuallyHidden>\n </TypographyMaxWidth>\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: folder.children.count,\n filesCount: folder.files.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <Box paddingTop={6}>\n <AssetGridList\n allowedTypes={allowedTypes}\n size=\"S\"\n assets={assets}\n onSelectAsset={onSelectAsset}\n selectedAssets={selectedAssets}\n onEditAsset={onEditAsset}\n title={\n ((!isSearchingOrFiltering || (isSearchingOrFiltering && folderCount > 0)) &&\n queryObject.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: assetCount }\n )) ||\n ''\n }\n />\n </Box>\n )}\n </>\n )}\n\n {pagination.pageCount > 0 && (\n <Flex justifyContent=\"space-between\" paddingTop={4}>\n <PageSize pageSize={queryObject.pageSize} onChangePageSize={onChangePageSize} />\n <PaginationFooter\n activePage={queryObject.page}\n onChangePage={onChangePage}\n pagination={pagination}\n />\n </Flex>\n )}\n </Box>\n );\n};\n\nBrowseStep.defaultProps = {\n allowedTypes: [],\n folders: [],\n multiple: false,\n onSelectAllAsset: undefined,\n};\nBrowseStep.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n canCreate: PropTypes.bool.isRequired,\n canRead: PropTypes.bool.isRequired,\n folders: PropTypes.arrayOf(FolderDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onChangeFilters: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n onChangePage: PropTypes.func.isRequired,\n onChangePageSize: PropTypes.func.isRequired,\n onChangeSort: PropTypes.func.isRequired,\n onChangeSearch: PropTypes.func.isRequired,\n onEditAsset: PropTypes.func.isRequired,\n onEditFolder: PropTypes.func.isRequired,\n onSelectAsset: PropTypes.func.isRequired,\n onSelectAllAsset: PropTypes.func,\n queryObject: PropTypes.shape({\n filters: PropTypes.object,\n page: PropTypes.number.isRequired,\n pageSize: PropTypes.number.isRequired,\n _q: PropTypes.string,\n sort: PropTypes.string,\n folder: PropTypes.number,\n }).isRequired,\n pagination: PropTypes.shape({ pageCount: PropTypes.number.isRequired }).isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nexport const DialogFooter = ({ onClose, onValidate }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n {onValidate && (\n <Button onClick={onValidate}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n )}\n </Modal.Footer>\n );\n};\n\nDialogFooter.defaultProps = {\n onValidate: undefined,\n};\n\nDialogFooter.propTypes = {\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func,\n};\n","import React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList';\n\nexport const SelectedStep = ({ selectedAssets, onSelectAsset, onReorderAsset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex gap={0}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage(\n {\n id: getTrad('list.assets.to-upload'),\n defaultMessage:\n '{number, plural, =0 {No asset} one {1 asset} other {# assets}} ready to upload',\n },\n { number: selectedAssets.length }\n )}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header-subtitle'),\n defaultMessage: 'Manage the assets before adding them to the Media Library',\n })}\n </Typography>\n </Flex>\n\n <AssetGridList\n size=\"S\"\n assets={selectedAssets}\n onSelectAsset={onSelectAsset}\n selectedAssets={selectedAssets}\n onReorderAsset={onReorderAsset}\n />\n </Flex>\n );\n};\n\nSelectedStep.defaultProps = {\n onReorderAsset: undefined,\n};\n\nSelectedStep.propTypes = {\n onSelectAsset: PropTypes.func.isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n onReorderAsset: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Divider, Flex, Loader, Modal, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetDefinition } from '../../constants';\nimport { useAssets } from '../../hooks/useAssets';\nimport { useFolders } from '../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport useModalQueryParams from '../../hooks/useModalQueryParams';\nimport { useSelectionState } from '../../hooks/useSelectionState';\nimport { containsAssetFilter, getTrad, getAllowedFiles, moveElement } from '../../utils';\nimport { EditAssetContent } from '../EditAssetDialog';\nimport { EditFolderContent } from '../EditFolderDialog';\n\nimport { BrowseStep } from './BrowseStep';\nimport { DialogFooter } from './DialogFooter';\nimport { SelectedStep } from './SelectedStep';\n\nconst LoadingBody = styled(Flex)`\n /* 80px are coming from the Tabs component that is not included in the ModalBody */\n min-height: ${() => `calc(60vh + 8rem)`};\n`;\n\nexport const AssetContent = ({\n allowedTypes,\n folderId,\n onClose,\n onAddAsset,\n onAddFolder,\n onChangeFolder,\n onValidate,\n multiple,\n initiallySelectedAssets,\n trackedLocation,\n}) => {\n const [assetToEdit, setAssetToEdit] = useState(undefined);\n const [folderToEdit, setFolderToEdit] = useState(undefined);\n const { formatMessage } = useIntl();\n const {\n canRead,\n canCreate,\n isLoading: isLoadingPermissions,\n canUpdate,\n canCopyLink,\n canDownload,\n } = useMediaLibraryPermissions();\n\n const [\n { queryObject },\n {\n onChangeFilters,\n onChangePage,\n onChangePageSize,\n onChangeSort,\n onChangeSearch,\n onChangeFolder: onChangeFolderParam,\n },\n ] = useModalQueryParams({ folder: folderId });\n\n const {\n data: { pagination, results: assets } = {},\n isLoading: isLoadingAssets,\n error: errorAssets,\n } = useAssets({ skipWhen: !canRead, query: queryObject });\n\n const {\n data: folders,\n isLoading: isLoadingFolders,\n error: errorFolders,\n } = useFolders({\n enabled: canRead && !containsAssetFilter(queryObject) && pagination?.page === 1,\n query: queryObject,\n });\n\n const [\n selectedAssets,\n { selectOne, selectOnly, setSelections, selectMultiple, deselectMultiple },\n ] = useSelectionState(['id'], initiallySelectedAssets);\n\n const handleSelectAllAssets = () => {\n const allowedAssets = getAllowedFiles(allowedTypes, assets);\n\n if (!multiple) {\n return undefined;\n }\n\n // selected files in current folder\n const alreadySelected = allowedAssets.filter(\n (asset) => selectedAssets.findIndex((selectedAsset) => selectedAsset.id === asset.id) !== -1\n );\n\n if (alreadySelected.length > 0) {\n deselectMultiple(alreadySelected);\n } else {\n selectMultiple(allowedAssets);\n }\n };\n\n const handleSelectAsset = (asset) => {\n return multiple ? selectOne(asset) : selectOnly(asset);\n };\n\n const isLoading = isLoadingPermissions || isLoadingAssets || isLoadingFolders;\n const hasError = errorAssets || errorFolders;\n\n if (isLoading) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <LoadingBody justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </LoadingBody>\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (hasError) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Page.Error />\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (!canRead) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Page.NoPermissions />\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (assetToEdit) {\n return (\n <EditAssetContent\n onClose={() => setAssetToEdit(undefined)}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation={trackedLocation}\n />\n );\n }\n\n if (folderToEdit) {\n return (\n <EditFolderContent\n folder={folderToEdit}\n onClose={() => setFolderToEdit(undefined)}\n location=\"content-manager\"\n parentFolderId={queryObject?.folder}\n />\n );\n }\n\n const handleMoveItem = (hoverIndex, destIndex) => {\n const offset = destIndex - hoverIndex;\n const orderedAssetsClone = selectedAssets.slice();\n const nextAssets = moveElement(orderedAssetsClone, hoverIndex, offset);\n setSelections(nextAssets);\n };\n\n const handleFolderChange = (folderId, folderPath) => {\n onChangeFolder(folderId);\n onChangeFolderParam(folderId, folderPath);\n };\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <TabsRoot variant=\"simple\" defaultValue={selectedAssets.length > 0 ? 'selected' : 'browse'}>\n <Flex paddingLeft={8} paddingRight={8} paddingTop={6} justifyContent=\"space-between\">\n <Tabs.List>\n <Tabs.Trigger value=\"browse\">\n {formatMessage({\n id: getTrad('modal.nav.browse'),\n defaultMessage: 'Browse',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"selected\">\n {formatMessage({\n id: getTrad('modal.header.select-files'),\n defaultMessage: 'Selected files',\n })}\n <Badge marginLeft={2}>{selectedAssets.length}</Badge>\n </Tabs.Trigger>\n </Tabs.List>\n <Flex gap={2}>\n <Button\n variant=\"secondary\"\n onClick={() => onAddFolder({ folderId: queryObject?.folder })}\n >\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header.add-folder'),\n defaultMessage: 'Add folder',\n })}\n </Button>\n <Button onClick={() => onAddAsset({ folderId: queryObject?.folder })}>\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header.button'),\n defaultMessage: 'Add more assets',\n })}\n </Button>\n </Flex>\n </Flex>\n <Divider />\n <Modal.Body>\n <Tabs.Content value=\"browse\">\n <BrowseStep\n allowedTypes={allowedTypes}\n assets={assets}\n canCreate={canCreate}\n canRead={canRead}\n folders={folders}\n onSelectAsset={handleSelectAsset}\n selectedAssets={selectedAssets}\n multiple={multiple}\n onSelectAllAsset={handleSelectAllAssets}\n onEditAsset={setAssetToEdit}\n onEditFolder={setFolderToEdit}\n pagination={pagination}\n queryObject={queryObject}\n onAddAsset={onAddAsset}\n onChangeFilters={onChangeFilters}\n onChangeFolder={handleFolderChange}\n onChangePage={onChangePage}\n onChangePageSize={onChangePageSize}\n onChangeSort={onChangeSort}\n onChangeSearch={onChangeSearch}\n />\n </Tabs.Content>\n <Tabs.Content value=\"selected\">\n <SelectedStep\n selectedAssets={selectedAssets}\n onSelectAsset={handleSelectAsset}\n onReorderAsset={handleMoveItem}\n />\n </Tabs.Content>\n </Modal.Body>\n </TabsRoot>\n <DialogFooter onClose={onClose} onValidate={() => onValidate(selectedAssets)} />\n </>\n );\n};\n\nAssetContent.defaultProps = {\n allowedTypes: [],\n folderId: null,\n initiallySelectedAssets: [],\n multiple: false,\n trackedLocation: undefined,\n};\n\nAssetContent.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n folderId: PropTypes.number,\n initiallySelectedAssets: PropTypes.arrayOf(AssetDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onAddFolder: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nexport const AssetDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <AssetContent onClose={onClose} {...restProps} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nAssetDialog.defaultProps = {\n allowedTypes: [],\n folderId: null,\n initiallySelectedAssets: [],\n multiple: false,\n open: false,\n trackedLocation: undefined,\n};\n\nAssetDialog.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n folderId: PropTypes.number,\n initiallySelectedAssets: PropTypes.arrayOf(AssetDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onAddFolder: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n open: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nconst TabsRoot = styled(Tabs.Root)`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n","/* eslint-disable jsx-a11y/label-has-associated-control */\nimport React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Flex, Modal, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nconst Wrapper = styled(Flex)`\n flex-direction: column;\n`;\n\nconst IconWrapper = styled.div`\n font-size: 6rem;\n\n svg path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n`;\n\nconst MediaBox = styled(Box)`\n border-style: dashed;\n`;\n\nconst OpaqueBox = styled(Box)`\n opacity: 0;\n cursor: pointer;\n`;\n\nexport const FromComputerForm = ({ onClose, onAddAssets, trackedLocation }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef(null);\n const { trackUsage } = useTracking();\n\n const handleDragOver = (event) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'computer', location: trackedLocation });\n }\n\n onAddAssets(assets);\n };\n\n const handleDrop = (e) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n onAddAssets(assets);\n }\n\n setDragOver(false);\n };\n\n return (\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <label>\n <MediaBox\n paddingTop={11}\n paddingBottom={11}\n hasRadius\n justifyContent=\"center\"\n borderColor={dragOver ? 'primary500' : 'neutral300'}\n background={dragOver ? 'primary100' : 'neutral100'}\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <Flex justifyContent=\"center\">\n <Wrapper>\n <IconWrapper>\n <PicturePlus aria-hidden width=\"3.2rem\" height=\"3.2rem\" />\n </IconWrapper>\n\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: getTrad('input.label'),\n defaultMessage: 'Drag & Drop here or',\n })}\n </Typography>\n </Box>\n\n <OpaqueBox\n tag=\"input\"\n position=\"absolute\"\n left={0}\n right={0}\n bottom={0}\n top={0}\n width=\"100%\"\n type=\"file\"\n multiple\n name=\"files\"\n tabIndex={-1}\n ref={inputRef}\n zIndex={1}\n onChange={handleChange}\n />\n\n <Box position=\"relative\">\n <Button type=\"button\" onClick={handleClick}>\n {formatMessage({\n id: getTrad('input.button.label'),\n defaultMessage: 'Browse files',\n })}\n </Button>\n </Box>\n </Wrapper>\n </Flex>\n </MediaBox>\n </label>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'cancel',\n })}\n </Button>\n </Modal.Footer>\n </form>\n );\n};\n\nFromComputerForm.defaultProps = {\n trackedLocation: undefined,\n};\n\nFromComputerForm.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAssets: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e) {\n setError(e);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occured' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n\nFromUrlForm.defaultProps = {\n trackedLocation: undefined,\n};\n\nFromUrlForm.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAsset: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Box, Divider, Modal, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nimport { FromComputerForm } from './FromComputerForm';\nimport { FromUrlForm } from './FromUrlForm';\n\nexport const AddAssetStep = ({ onClose, onAddAsset, trackedLocation }) => {\n const { formatMessage } = useIntl();\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Tabs.Root variant=\"simple\" defaultValue=\"computer\">\n <Box paddingLeft={8} paddingRight={8} paddingTop={6}>\n <Tabs.List\n aria-label={formatMessage({\n id: getTrad('tabs.title'),\n defaultMessage: 'How do you want to upload your assets?',\n })}\n >\n <Tabs.Trigger value=\"computer\">\n {formatMessage({\n id: getTrad('modal.nav.computer'),\n defaultMessage: 'From computer',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"url\">\n {formatMessage({\n id: getTrad('modal.nav.url'),\n defaultMessage: 'From URL',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n\n <Divider />\n </Box>\n <Tabs.Content value=\"computer\">\n <FromComputerForm\n onClose={onClose}\n onAddAssets={onAddAsset}\n trackedLocation={trackedLocation}\n />\n </Tabs.Content>\n <Tabs.Content value=\"url\">\n <FromUrlForm\n onClose={onClose}\n onAddAsset={onAddAsset}\n trackedLocation={trackedLocation}\n />\n </Tabs.Content>\n </Tabs.Root>\n </>\n );\n};\n\nAddAssetStep.defaultProps = {\n trackedLocation: undefined,\n};\n\nAddAssetStep.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAsset: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useEffect } from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId,\n}) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={handleCancel} progress={progress} />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <CardTitle tag=\"h2\">{asset.name}</CardTitle>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.response?.data?.error?.message\n ? {\n id: getTrad(`apiError.${error.response.data.error.message}`),\n defaultMessage: error.response.data.error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occured while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n\nUploadingAssetCard.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n};\n\nUploadingAssetCard.propTypes = {\n addUploadedFiles: PropTypes.func,\n asset: PropTypes.shape({\n name: PropTypes.string,\n ext: PropTypes.string,\n rawFile: PropTypes.instanceOf(File),\n type: PropTypes.oneOf(Object.values(AssetType)),\n }).isRequired,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n onCancel: PropTypes.func.isRequired,\n onStatusChange: PropTypes.func.isRequired,\n};\n","import React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Grid, KeyboardNavigable, Modal, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad } from '../../../utils';\nimport { AssetCard } from '../../AssetCard/AssetCard';\nimport { UploadingAssetCard } from '../../AssetCard/UploadingAssetCard';\n\nconst Status = {\n Idle: 'IDLE',\n Uploading: 'UPLOADING',\n Intermediate: 'INTERMEDIATE',\n};\n\nexport const PendingAssetStep = ({\n addUploadedFiles,\n folderId,\n onClose,\n onEditAsset,\n onRemoveAsset,\n assets,\n onClickAddAsset,\n onCancelUpload,\n onUploadSucceed,\n trackedLocation,\n}) => {\n const assetCountRef = useRef(0);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [uploadStatus, setUploadStatus] = useState(Status.Idle);\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const assetsCountByType = assets.reduce((acc, asset) => {\n const { type } = asset;\n\n if (!acc[type]) {\n acc[type] = 0;\n }\n\n // values need to be stringified because Amplitude ignores number values\n acc[type] = `${parseInt(acc[type], 10) + 1}`;\n\n return acc;\n }, {});\n\n trackUsage('willAddMediaLibraryAssets', {\n location: trackedLocation,\n ...assetsCountByType,\n });\n\n setUploadStatus(Status.Uploading);\n };\n\n const handleStatusChange = (status, file) => {\n if (status === 'success' || status === 'error') {\n assetCountRef.current++;\n\n // There's no \"terminated\" status. When all the files have called their\n // onUploadSucceed callback, the parent component filters the asset list\n // and closes the modal when the asset list is empty\n if (assetCountRef.current === assets.length) {\n assetCountRef.current = 0;\n setUploadStatus(Status.Intermediate);\n }\n }\n\n if (status === 'success') {\n onUploadSucceed(file);\n }\n };\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={7}>\n <Flex justifyContent=\"space-between\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={0}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage(\n {\n id: getTrad('list.assets.to-upload'),\n defaultMessage:\n '{number, plural, =0 {No asset} one {1 asset} other {# assets}} ready to upload',\n },\n { number: assets.length }\n )}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header-subtitle'),\n defaultMessage: 'Manage the assets before adding them to the Media Library',\n })}\n </Typography>\n </Flex>\n <Button size=\"S\" onClick={onClickAddAsset}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n <KeyboardNavigable tagName=\"article\">\n <Grid.Root gap={4}>\n {assets.map((asset) => {\n const assetKey = asset.url;\n\n if (uploadStatus === Status.Uploading || uploadStatus === Status.Intermediate) {\n return (\n <Grid.Item col={4} key={assetKey} direction=\"column\" alignItems=\"stretch\">\n <UploadingAssetCard\n // Props used to store the newly uploaded files\n addUploadedFiles={addUploadedFiles}\n asset={asset}\n id={assetKey}\n onCancel={onCancelUpload}\n onStatusChange={(status) => handleStatusChange(status, asset.rawFile)}\n size=\"S\"\n folderId={folderId}\n />\n </Grid.Item>\n );\n }\n\n return (\n <Grid.Item col={4} key={assetKey} direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n asset={asset}\n size=\"S\"\n key={assetKey}\n local\n alt={asset.name}\n onEdit={onEditAsset}\n onRemove={onRemoveAsset}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </KeyboardNavigable>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button onClick={handleSubmit} loading={uploadStatus === Status.Uploading}>\n {formatMessage(\n {\n id: getTrad('modal.upload-list.footer.button'),\n defaultMessage:\n 'Upload {number, plural, one {# asset} other {# assets}} to the library',\n },\n { number: assets.length }\n )}\n </Button>\n </Modal.Footer>\n </>\n );\n};\n\nPendingAssetStep.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n trackedLocation: undefined,\n};\n\nPendingAssetStep.propTypes = {\n addUploadedFiles: PropTypes.func,\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n onClose: PropTypes.func.isRequired,\n onEditAsset: PropTypes.func.isRequired,\n onRemoveAsset: PropTypes.func.isRequired,\n onClickAddAsset: PropTypes.func.isRequired,\n onUploadSucceed: PropTypes.func.isRequired,\n onCancelUpload: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../constants';\nimport { EditAssetContent } from '../EditAssetDialog';\n\nimport { AddAssetStep } from './AddAssetStep/AddAssetStep';\nimport { PendingAssetStep } from './PendingAssetStep/PendingAssetStep';\n\nconst Steps = {\n AddAsset: 'AddAsset',\n PendingAsset: 'PendingAsset',\n};\n\nexport const UploadAssetDialog = ({\n initialAssetsToAdd,\n folderId,\n onClose,\n addUploadedFiles,\n trackedLocation,\n open,\n validateAssetsTypes = (_, cb) => cb(),\n}) => {\n const { formatMessage } = useIntl();\n const [step, setStep] = useState(initialAssetsToAdd ? Steps.PendingAsset : Steps.AddAsset);\n const [assets, setAssets] = useState(initialAssetsToAdd || []);\n const [assetToEdit, setAssetToEdit] = useState(undefined);\n\n const handleAddToPendingAssets = (nextAssets) => {\n validateAssetsTypes(nextAssets, () => {\n setAssets((prevAssets) => prevAssets.concat(nextAssets));\n setStep(Steps.PendingAsset);\n });\n };\n\n const moveToAddAsset = () => {\n setStep(Steps.AddAsset);\n };\n\n const handleCancelUpload = (file) => {\n const nextAssets = assets.filter((asset) => asset.rawFile !== file);\n setAssets(nextAssets);\n\n // When there's no asset, transition to the AddAsset step\n if (nextAssets.length === 0) {\n moveToAddAsset();\n }\n };\n\n const handleUploadSuccess = (file) => {\n const nextAssets = assets.filter((asset) => asset.rawFile !== file);\n setAssets(nextAssets);\n\n if (nextAssets.length === 0) {\n onClose();\n }\n };\n\n const handleAssetEditValidation = (nextAsset) => {\n if (nextAsset) {\n const nextAssets = assets.map((asset) => (asset === assetToEdit ? nextAsset : asset));\n setAssets(nextAssets);\n }\n\n setAssetToEdit(undefined);\n };\n\n const handleClose = () => {\n if (step === Steps.PendingAsset && assets.length > 0) {\n // eslint-disable-next-line no-alert\n const confirm = window.confirm(\n formatMessage({\n id: 'window.confirm.close-modal.files',\n defaultMessage: 'Are you sure? You have some files that have not been uploaded yet.',\n })\n );\n\n if (confirm) {\n onClose();\n }\n } else {\n onClose();\n }\n };\n\n const handleRemoveAsset = (assetToRemove) => {\n const nextAssets = assets.filter((asset) => asset !== assetToRemove);\n setAssets(nextAssets);\n };\n\n return (\n <Modal.Root open={open} onOpenChange={handleClose}>\n {step === Steps.AddAsset && (\n <Modal.Content>\n <AddAssetStep\n onClose={onClose}\n onAddAsset={handleAddToPendingAssets}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n\n {step === Steps.PendingAsset && (\n <Modal.Content>\n <PendingAssetStep\n onClose={handleClose}\n assets={assets}\n onEditAsset={setAssetToEdit}\n onRemoveAsset={handleRemoveAsset}\n onClickAddAsset={moveToAddAsset}\n onCancelUpload={handleCancelUpload}\n onUploadSucceed={handleUploadSuccess}\n initialAssetsToAdd={initialAssetsToAdd}\n addUploadedFiles={addUploadedFiles}\n folderId={folderId}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n\n {assetToEdit && (\n <Modal.Content>\n <EditAssetContent\n onClose={handleAssetEditValidation}\n asset={assetToEdit}\n canUpdate\n canCopyLink={false}\n canDownload={false}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n </Modal.Root>\n );\n};\n\nUploadAssetDialog.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n initialAssetsToAdd: undefined,\n onClose() {},\n trackedLocation: undefined,\n validateAssetsTypes: undefined,\n};\n\nUploadAssetDialog.propTypes = {\n addUploadedFiles: PropTypes.func,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n initialAssetsToAdd: PropTypes.arrayOf(AssetDefinition),\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func,\n trackedLocation: PropTypes.string,\n validateAssetsTypes: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport { AssetDialog } from '../AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport const MediaLibraryDialog = ({ onClose, onSelectAssets, allowedTypes }) => {\n const [step, setStep] = useState(STEPS.AssetSelect);\n const [folderId, setFolderId] = useState(null);\n\n switch (step) {\n case STEPS.AssetSelect:\n return (\n <AssetDialog\n allowedTypes={allowedTypes}\n folderId={folderId}\n open\n onClose={onClose}\n onValidate={onSelectAssets}\n onAddAsset={() => setStep(STEPS.AssetUpload)}\n onAddFolder={() => setStep(STEPS.FolderCreate)}\n onChangeFolder={(folderId) => setFolderId(folderId)}\n multiple\n />\n );\n\n case STEPS.FolderCreate:\n return (\n <EditFolderDialog\n open\n onClose={() => setStep(STEPS.AssetSelect)}\n parentFolderId={folderId}\n />\n );\n\n default:\n return (\n <UploadAssetDialog open onClose={() => setStep(STEPS.AssetSelect)} folderId={folderId} />\n );\n }\n};\n\nMediaLibraryDialog.defaultProps = {\n allowedTypes: ['files', 'images', 'videos', 'audios'],\n};\n\nMediaLibraryDialog.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n onClose: PropTypes.func.isRequired,\n onSelectAssets: PropTypes.func.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetDefinition, AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }) => {\n if (asset.mime.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview url={createAssetUrl(asset, true)} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime.includes(AssetType.Image)) {\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={createAssetUrl(asset, true)}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n\nCarouselAsset.propTypes = {\n asset: AssetDefinition.isRequired,\n};\n","import React from 'react';\n\nimport { CarouselActions, IconButton } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad, prefixFileUrlWithBackendUrl } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton';\n\nexport const CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditAsset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <CarouselActions>\n {onAddAsset && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.add'),\n defaultMessage: 'Add',\n })}\n onClick={() => onAddAsset(asset)}\n >\n <Plus />\n </IconButton>\n )}\n\n <CopyLinkButton url={prefixFileUrlWithBackendUrl(asset.url)} />\n\n {onDeleteAsset && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => onDeleteAsset(asset)}\n >\n <Trash />\n </IconButton>\n )}\n\n {onEditAsset && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.edit'),\n defaultMessage: 'edit',\n })}\n onClick={onEditAsset}\n >\n <Pencil />\n </IconButton>\n )}\n </CarouselActions>\n );\n};\n\nCarouselAssetActions.defaultProps = {\n onAddAsset: undefined,\n onDeleteAsset: undefined,\n onEditAsset: undefined,\n};\n\nCarouselAssetActions.propTypes = {\n asset: AssetDefinition.isRequired,\n onAddAsset: PropTypes.func,\n onEditAsset: PropTypes.func,\n onDeleteAsset: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nconst TextAlignTypography = styled(Typography)`\n align-items: center;\n`;\n\nexport const EmptyStateAsset = ({ disabled, onClick, onDropAsset }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n\n const handleDragEnter = (e) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e) => {\n if (!e.currentTarget.contains(e.relatedTarget)) {\n setDragOver(false);\n }\n };\n\n const handleDragOver = (e) => {\n e.preventDefault();\n };\n\n const handleDrop = (e) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n onDropAsset(assets);\n }\n\n setDragOver(false);\n };\n\n return (\n <Flex\n borderStyle={dragOver ? 'dashed' : undefined}\n borderWidth={dragOver ? '1px' : undefined}\n borderColor={dragOver ? 'primary600' : undefined}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n width=\"100%\"\n tag=\"button\"\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n gap={3}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n <PicturePlus\n aria-hidden\n width=\"3.2rem\"\n height=\"3.2rem\"\n fill={disabled ? 'neutral400' : 'primary600'}\n />\n <TextAlignTypography\n variant=\"pi\"\n fontWeight=\"bold\"\n textColor=\"neutral600\"\n style={{ textAlign: 'center' }}\n tag=\"span\"\n >\n {formatMessage({\n id: getTrad('mediaLibraryInput.placeholder'),\n defaultMessage: 'Click to add an asset or drag and drop one in this area',\n })}\n </TextAlignTypography>\n </Flex>\n );\n};\n\nEmptyStateAsset.defaultProps = {\n disabled: false,\n onDropAsset: undefined,\n};\n\nEmptyStateAsset.propTypes = {\n disabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n onDropAsset: PropTypes.func,\n};\n","import React, { forwardRef, useState } from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nexport const CarouselAssets = forwardRef(\n (\n {\n assets,\n disabled,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required,\n selectedAssetIndex,\n trackedLocation,\n },\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={onEditAsset ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset disabled={disabled} onClick={onAddAsset} onDropAsset={onDropAsset} />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n\n if (editedAsset) {\n onEditAsset(editedAsset);\n }\n }}\n asset={currentAsset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n\nCarouselAssets.defaultProps = {\n disabled: false,\n error: undefined,\n hint: undefined,\n labelAction: undefined,\n onDropAsset: undefined,\n required: false,\n trackedLocation: undefined,\n};\n\nCarouselAssets.propTypes = {\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n disabled: PropTypes.bool,\n error: PropTypes.string,\n hint: PropTypes.string,\n label: PropTypes.string.isRequired,\n labelAction: PropTypes.node,\n onAddAsset: PropTypes.func.isRequired,\n onDeleteAsset: PropTypes.func.isRequired,\n onDeleteAssetFromMediaLibrary: PropTypes.func.isRequired,\n onDropAsset: PropTypes.func,\n onEditAsset: PropTypes.func.isRequired,\n onNext: PropTypes.func.isRequired,\n onPrevious: PropTypes.func.isRequired,\n required: PropTypes.bool,\n selectedAssetIndex: PropTypes.number.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { forwardRef, useEffect, useState } from 'react';\n\nimport { useField, useNotification } from '@strapi/admin/strapi-admin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, getAllowedFiles } from '../../utils';\nimport { AssetDialog } from '../AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nimport { CarouselAssets } from './Carousel/CarouselAssets';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport const MediaLibraryInput = forwardRef(\n (\n { attribute: { allowedTypes, multiple }, label, hint, disabled, labelAction, name, required },\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const { onChange, value, error } = useField(name);\n const fieldAllowedTypes = allowedTypes || ['files', 'images', 'videos', 'audios'];\n const [uploadedFiles, setUploadedFiles] = useState([]);\n const [step, setStep] = useState(undefined);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [droppedAssets, setDroppedAssets] = useState();\n const [folderId, setFolderId] = useState(null);\n const { toggleNotification } = useNotification();\n\n useEffect(() => {\n // Clear the uploaded files on close\n if (step === undefined) {\n setUploadedFiles([]);\n }\n }, [step]);\n\n let selectedAssets = [];\n\n if (Array.isArray(value)) {\n selectedAssets = value;\n } else if (value) {\n selectedAssets = [value];\n }\n\n const handleValidation = (nextSelectedAssets) => {\n onChange({\n target: { name, value: multiple ? nextSelectedAssets : nextSelectedAssets[0] },\n });\n setStep(undefined);\n };\n\n const handleDeleteAssetFromMediaLibrary = () => {\n let nextValue;\n\n if (multiple) {\n const nextSelectedAssets = selectedAssets.filter(\n (_, assetIndex) => assetIndex !== selectedIndex\n );\n nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;\n } else {\n nextValue = null;\n }\n\n onChange({\n target: { name, value: nextValue },\n });\n\n setSelectedIndex(0);\n };\n\n const handleDeleteAsset = (asset) => {\n let nextValue;\n\n if (multiple) {\n const nextSelectedAssets = selectedAssets.filter((prevAsset) => prevAsset.id !== asset.id);\n\n nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;\n } else {\n nextValue = null;\n }\n\n onChange({\n target: { name, value: nextValue },\n });\n\n setSelectedIndex(0);\n };\n\n const handleAssetEdit = (asset) => {\n const nextSelectedAssets = selectedAssets.map((prevAsset) =>\n prevAsset.id === asset.id ? asset : prevAsset\n );\n\n onChange({\n target: { name, value: multiple ? nextSelectedAssets : nextSelectedAssets[0] },\n });\n };\n\n const validateAssetsTypes = (assets, callback) => {\n const allowedAssets = getAllowedFiles(fieldAllowedTypes, assets);\n\n if (allowedAssets.length > 0) {\n callback(allowedAssets);\n } else {\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage(\n {\n id: getTrad('input.notification.not-supported'),\n defaultMessage: `You can't upload this type of file.`,\n },\n {\n fileTypes: fieldAllowedTypes.join(','),\n }\n ),\n });\n }\n };\n\n const handleAssetDrop = (assets) => {\n validateAssetsTypes(assets, (allowedAssets) => {\n setDroppedAssets(allowedAssets);\n setStep(STEPS.AssetUpload);\n });\n };\n\n if (multiple && selectedAssets.length > 0) {\n label = `${label} (${selectedIndex + 1} / ${selectedAssets.length})`;\n }\n\n const handleNext = () => {\n setSelectedIndex((current) => (current < selectedAssets.length - 1 ? current + 1 : 0));\n };\n\n const handlePrevious = () => {\n setSelectedIndex((current) => (current > 0 ? current - 1 : selectedAssets.length - 1));\n };\n\n const handleFilesUploadSucceeded = (uploadedFiles) => {\n setUploadedFiles((prev) => [...prev, ...uploadedFiles]);\n };\n\n let initiallySelectedAssets = selectedAssets;\n\n if (uploadedFiles.length > 0) {\n const allowedUploadedFiles = getAllowedFiles(fieldAllowedTypes, uploadedFiles);\n\n initiallySelectedAssets = multiple\n ? [...allowedUploadedFiles, ...selectedAssets]\n : [allowedUploadedFiles[0]];\n }\n\n return (\n <>\n <CarouselAssets\n ref={forwardedRef}\n assets={selectedAssets}\n disabled={disabled}\n label={label}\n labelAction={labelAction}\n onDeleteAsset={handleDeleteAsset}\n onDeleteAssetFromMediaLibrary={handleDeleteAssetFromMediaLibrary}\n onAddAsset={() => setStep(STEPS.AssetSelect)}\n onDropAsset={handleAssetDrop}\n onEditAsset={handleAssetEdit}\n onNext={handleNext}\n onPrevious={handlePrevious}\n error={error}\n hint={hint}\n required={required}\n selectedAssetIndex={selectedIndex}\n trackedLocation=\"content-manager\"\n />\n\n {step === STEPS.AssetSelect && (\n <AssetDialog\n allowedTypes={fieldAllowedTypes}\n initiallySelectedAssets={initiallySelectedAssets}\n folderId={folderId}\n onClose={() => {\n setStep(undefined);\n setFolderId(null);\n }}\n open={step === STEPS.AssetSelect}\n onValidate={handleValidation}\n multiple={multiple}\n onAddAsset={() => setStep(STEPS.AssetUpload)}\n onAddFolder={() => setStep(STEPS.FolderCreate)}\n onChangeFolder={(folder) => setFolderId(folder)}\n trackedLocation=\"content-manager\"\n />\n )}\n\n {step === STEPS.AssetUpload && (\n <UploadAssetDialog\n open={step === STEPS.AssetUpload}\n onClose={() => setStep(STEPS.AssetSelect)}\n initialAssetsToAdd={droppedAssets}\n addUploadedFiles={handleFilesUploadSucceeded}\n trackedLocation=\"content-manager\"\n folderId={folderId}\n validateAssetsTypes={validateAssetsTypes}\n />\n )}\n\n {step === STEPS.FolderCreate && (\n <EditFolderDialog\n open={step === STEPS.FolderCreate}\n onClose={() => setStep(STEPS.AssetSelect)}\n parentFolderId={folderId}\n />\n )}\n </>\n );\n }\n);\n\nMediaLibraryInput.defaultProps = {\n attribute: { allowedTypes: ['videos', 'files', 'images', 'audios'], multiple: false },\n disabled: false,\n hint: undefined,\n label: undefined,\n labelAction: undefined,\n required: false,\n};\n\nMediaLibraryInput.propTypes = {\n attribute: PropTypes.shape({\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n multiple: PropTypes.bool,\n }),\n disabled: PropTypes.bool,\n hint: PropTypes.string,\n label: PropTypes.string,\n labelAction: PropTypes.node,\n\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n};\n","import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport pluginId from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n register(app) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => import('./pages/App'),\n position: 4,\n });\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n to: 'media-library',\n Component: () => import('./pages/SettingsPage'),\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({ type: 'media', Component: MediaLibraryInput });\n app.addComponents([{ name: 'media-library', Component: MediaLibraryDialog }]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["files","name","getTrad","error","id","index","pluginId","AssetType","AssetSource","PERMISSIONS","errorsTrads","data","endpoint","option","value","options","components","LinkIcon","CardAsset","File","Wrapper","UploadProgressWrapper","DownloadIcon","Resize","LoadingBody","Extension","Card","isSelectable","AudioPreviewWrapper","IconWrapper","VideoPreviewWrapper","BaseBreadcrumbs","cells","Link","displayedFilters","filterToAdd","hasFilter","GridIcon","folderId","PicturePlus","STEPS","uploadedFiles"],"mappings":"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"}
1
+ {"version":3,"file":"index-CuzWuOXx.mjs","sources":["../../admin/src/utils/appendSearchParamsToUrl.ts","../../admin/src/utils/containsAssetFilter.ts","../../admin/src/utils/prefixFileUrlWithBackendUrl.ts","../../admin/src/utils/createAssetUrl.ts","../../admin/src/utils/displayedFilters.ts","../../admin/src/utils/downloadFile.ts","../../admin/src/utils/findRecursiveFolderByValue.ts","../../admin/src/utils/formatBytes.ts","../../admin/src/utils/formatDuration.ts","../../admin/src/utils/toSingularTypes.ts","../../admin/src/utils/getAllowedFiles.ts","../../admin/src/utils/normalizeAPIError.ts","../../admin/src/utils/getAPIInnerErrors.ts","../../admin/src/pluginId.ts","../../admin/src/utils/getTrad.ts","../../admin/src/utils/getBreadcrumbDataCM.ts","../../admin/src/utils/getFolderURL.ts","../../admin/src/utils/getFileExtension.ts","../../admin/src/components/SelectTree/utils/flattenTree.ts","../../admin/src/utils/getFolderParents.ts","../../admin/src/utils/moveElement.ts","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/newConstants.ts","../../admin/src/utils/typeFromMime.ts","../../admin/src/utils/rawFileToAsset.ts","../../admin/src/utils/urlsToAssets.ts","../../admin/src/utils/urlYupSchema.ts","../../admin/src/constants.js","../../admin/src/hooks/useAssets.ts","../../admin/src/hooks/useFolders.ts","../../admin/src/hooks/useMediaLibraryPermissions.ts","../../admin/src/hooks/useConfig.ts","../../admin/src/hooks/useModalQueryParams.ts","../../admin/src/hooks/useSelectionState.ts","../../admin/src/hooks/useEditAsset.ts","../../admin/src/hooks/utils/rename-keys.ts","../../admin/src/hooks/useFolderStructure.ts","../../admin/src/components/ContextInfo/ContextInfo.jsx","../../admin/src/components/SelectTree/Option.jsx","../../admin/src/components/SelectTree/utils/getOpenValues.js","../../admin/src/components/SelectTree/utils/getValuesToClose.js","../../admin/src/components/SelectTree/SelectTree.jsx","../../admin/src/components/EditAssetDialog/DialogHeader.jsx","../../admin/src/hooks/useCropImg.ts","../../admin/src/hooks/useUpload.ts","../../admin/src/hooks/useClipboard.ts","../../admin/src/components/CopyLinkButton/index.jsx","../../admin/src/components/UploadProgress/index.jsx","../../admin/src/hooks/useRemoveAsset.ts","../../admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx","../../admin/src/hooks/usePersistentState.ts","../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/components.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx","../../admin/src/components/EditAssetDialog/PreviewBox/index.jsx","../../admin/src/components/EditAssetDialog/ReplaceMediaButton.jsx","../../admin/src/components/EditAssetDialog/index.jsx","../../admin/src/hooks/useBulkRemove.ts","../../admin/src/hooks/useEditFolder.ts","../../admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.jsx","../../admin/src/components/EditFolderDialog/RemoveFolderDialog.jsx","../../admin/src/components/EditFolderDialog/EditFolderDialog.jsx","../../admin/src/hooks/useFolder.ts","../../admin/src/components/AssetCard/AssetCardBase.jsx","../../admin/src/components/AssetCard/AudioPreview.jsx","../../admin/src/components/AssetCard/AudioAssetCard.jsx","../../admin/src/components/AssetCard/DocAssetCard.jsx","../../admin/src/components/AssetCard/ImageAssetCard.jsx","../../admin/src/components/AssetCard/VideoPreview.jsx","../../admin/src/components/AssetCard/VideoAssetCard.jsx","../../admin/src/components/AssetCard/AssetCard.jsx","../../admin/src/components/AssetGridList/Draggable.jsx","../../admin/src/components/AssetGridList/index.jsx","../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.jsx","../../admin/src/components/Breadcrumbs/Breadcrumbs.jsx","../../admin/src/components/EmptyAssets/EmptyAssetGrid.jsx","../../admin/src/components/EmptyAssets/index.jsx","../../admin/src/components/FolderCard/contexts/FolderCard.jsx","../../admin/src/components/FolderCard/hooks/useId.js","../../admin/src/components/FolderCard/FolderCard/FolderCard.jsx","../../admin/src/components/FolderCard/FolderCardBody/FolderCardBody.jsx","../../admin/src/components/FolderCard/FolderCardBodyAction/index.jsx","../../admin/src/components/FolderGridList/FolderGridList.jsx","../../admin/src/components/SortPicker/index.jsx","../../admin/src/components/TableList/PreviewCell.jsx","../../admin/src/components/TableList/CellContent.jsx","../../admin/src/components/TableList/TableRows.jsx","../../admin/src/components/TableList/index.jsx","../../admin/src/components/FilterList/FilterTag.jsx","../../admin/src/components/FilterList/index.jsx","../../admin/src/components/FilterPopover/FilterValueInput.jsx","../../admin/src/components/FilterPopover/utils/getFilterList.js","../../admin/src/components/FilterPopover/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/Filters.jsx","../../admin/src/components/AssetDialog/BrowseStep/PageSize.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationContext.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.jsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx","../../admin/src/components/AssetDialog/BrowseStep/utils/isSelectable.js","../../admin/src/components/AssetDialog/BrowseStep/index.jsx","../../admin/src/components/AssetDialog/DialogFooter.jsx","../../admin/src/components/AssetDialog/SelectedStep/index.jsx","../../admin/src/components/AssetDialog/index.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.jsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.jsx","../../admin/src/components/AssetCard/UploadingAssetCard.jsx","../../admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx","../../admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx","../../admin/src/components/MediaLibraryDialog/index.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx","../../admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.jsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.jsx","../../admin/src/components/MediaLibraryInput/index.jsx","../../admin/src/index.js"],"sourcesContent":["interface AppendSearchParamsToUrlProps {\n url?: string;\n params?: Record<string, string | null | undefined> | string;\n}\n\nconst appendSearchParamsToUrl = ({ url, params }: AppendSearchParamsToUrlProps) => {\n if (url === undefined || typeof params !== 'object') {\n return url;\n }\n\n const urlObj = new URL(url, window.strapi.backendURL);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlObj.searchParams.append(key, value);\n }\n });\n\n return urlObj.toString();\n};\n\nexport { appendSearchParamsToUrl };\n","import type { Query } from '../../../shared/contracts/files';\n\nconst containsMimeTypeFilter = (query: Query | null) => {\n const filters = query?.filters?.$and;\n\n if (!filters) {\n return false;\n }\n\n const result = filters.find((filter) => {\n return Object.keys(filter).includes('mime');\n });\n\n return !!result;\n};\n\nexport const containsAssetFilter = (query: Query | null) => {\n return containsMimeTypeFilter(query);\n};\n","export const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n","import { prefixFileUrlWithBackendUrl } from './prefixFileUrlWithBackendUrl';\n\nimport type { File } from '../../../shared/contracts/files';\n\nexport const createAssetUrl = (asset: File, forThumbnail = true) => {\n if (asset.isLocal) {\n return asset.url;\n }\n\n const assetUrl = forThumbnail ? asset?.formats?.thumbnail?.url || asset.url : asset.url;\n\n return prefixFileUrlWithBackendUrl(assetUrl);\n};\n","export const displayedFilters = [\n {\n name: 'createdAt',\n fieldSchema: {\n type: 'date',\n },\n metadatas: { label: 'createdAt' },\n },\n {\n name: 'updatedAt',\n fieldSchema: {\n type: 'date',\n },\n metadatas: { label: 'updatedAt' },\n },\n {\n name: 'mime',\n fieldSchema: {\n type: 'enumeration',\n options: [\n { label: 'audio', value: 'audio' },\n { label: 'file', value: 'file' },\n { label: 'image', value: 'image' },\n { label: 'video', value: 'video' },\n ],\n },\n metadatas: { label: 'type' },\n },\n];\n","export const downloadFile = async (url: string, fileName: string) => {\n const fileBlob = await fetch(url).then((res) => res.blob());\n const urlDownload = window.URL.createObjectURL(fileBlob);\n const link = document.createElement('a');\n\n link.href = urlDownload;\n link.setAttribute('download', fileName);\n link.click();\n};\n","import type { FolderNode } from '../../../shared/contracts/folders';\n\ninterface FolderStructureValue extends Omit<FolderNode, 'children'> {\n value: number | null;\n children?: FolderStructureValue[];\n}\n\ntype Value = number | null | { value: number | null };\n\nexport function findRecursiveFolderByValue(data: FolderStructureValue[], value: Value) {\n let result;\n\n function iter(a: FolderStructureValue) {\n if (a.value === value) {\n result = a;\n\n return true;\n }\n\n return Array.isArray(a.children) && a.children.some(iter);\n }\n\n data.some(iter);\n\n return result;\n}\n","import byteSize from 'byte-size';\n\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n","import { intervalToDuration } from 'date-fns';\n\nconst zeroPad = (num?: number) => String(num).padStart(2, '0');\n\nexport const formatDuration = (durationInSecond: number) => {\n const duration = intervalToDuration({ start: 0, end: durationInSecond * 1000 });\n\n return `${zeroPad(duration.hours)}:${zeroPad(duration.minutes)}:${zeroPad(duration.seconds)}`;\n};\n","export const toSingularTypes = (types?: string[]) => {\n if (!types) {\n return [];\n }\n\n return types.map((type) => type.substring(0, type.length - 1));\n};\n\nexport default toSingularTypes;\n","import { toSingularTypes } from './toSingularTypes';\nimport type { File } from '../../../shared/contracts/files';\n/**\n * Returns the files that can be added to the media field\n * @param {Object[]} pluralTypes Array of string (allowedTypes)\n * @param {Object[]} files Array of files\n * @returns Object[]\n */\n\ninterface AllowedFiles extends File {\n documentId: string;\n isSelectable: boolean;\n locale: string | null;\n type: string;\n}\n\nexport const getAllowedFiles = (pluralTypes: string[], files: AllowedFiles[]) => {\n const singularTypes = toSingularTypes(pluralTypes);\n\n const allowedFiles = files.filter((file) => {\n const fileType = file?.mime?.split('/')[0];\n\n if (!fileType) {\n return false;\n }\n\n if (singularTypes.includes('file') && !['video', 'image', 'audio'].includes(fileType)) {\n return true;\n }\n\n return singularTypes.includes(fileType);\n });\n\n return allowedFiles;\n};\n","import type { errors } from '@strapi/utils';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype ApiError = InstanceType<(typeof errors)[keyof typeof errors]>;\n\ninterface NormalizeErrorOptions {\n name?: string;\n intlMessagePrefixCallback?: (id: string) => string;\n}\n\ninterface NormalizeErrorReturn {\n id: string;\n defaultMessage: string;\n name?: string;\n values: Record<'path', string> | Record<string, never>;\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nfunction getPrefixedId(message: string, callback?: (prefixedMessage: string) => string) {\n const prefixedMessage = `apiError.${message}`;\n\n // if a prefix function has been passed in it is used to\n // prefix the id, e.g. to allow an error message to be\n // set only for a localization namespace\n if (typeof callback === 'function') {\n return callback(prefixedMessage);\n }\n\n return prefixedMessage;\n}\n\nfunction normalizeError(\n error: ApiError | YupFormattedError,\n { name, intlMessagePrefixCallback }: NormalizeErrorOptions\n): NormalizeErrorReturn {\n const { message } = error;\n\n const normalizedError = {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n name: error.name ?? name,\n values: {},\n };\n\n if ('path' in error) {\n normalizedError.values = { path: error.path.join('.') };\n }\n\n return normalizedError;\n}\n\nconst validateErrorIsYupValidationError = (\n err: ApiError\n): err is errors.YupValidationError & { details: { errors: YupFormattedError[] } } =>\n typeof err.details === 'object' && err.details !== null && 'errors' in err.details;\n\n/**\n * Normalize the format of `ResponseError`\n * in places where the hook `useAPIErrorHandler` can not called\n * (e.g. outside of a React component).\n */\nexport function normalizeAPIError(\n apiError: FetchError,\n intlMessagePrefixCallback?: NormalizeErrorOptions['intlMessagePrefixCallback']\n):\n | NormalizeErrorReturn\n | { name: string; message: string | null; errors: NormalizeErrorReturn[] }\n | null {\n const error = apiError.response?.data.error;\n\n if (error) {\n // some errors carry multiple errors (such as ValidationError)\n if (validateErrorIsYupValidationError(error)) {\n return {\n name: error.name,\n message: error?.message || null,\n errors: error.details.errors.map((err) =>\n normalizeError(err, { name: error.name, intlMessagePrefixCallback })\n ),\n };\n }\n\n return normalizeError(error, { intlMessagePrefixCallback });\n }\n\n return null;\n}\n","import { normalizeAPIError } from './normalizeAPIError';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype GetAPIInnerErrorsReturn = {\n [key: string]: MessageDescriptor;\n};\n\n/**\n *\n * Returns a normalized error message\n *\n */\nexport function getAPIInnerErrors(\n error: FetchError,\n { getTrad }: { getTrad: (key: string) => string }\n) {\n const normalizedError = normalizeAPIError(error, getTrad);\n\n if (normalizedError && 'errors' in normalizedError) {\n return normalizedError.errors.reduce<GetAPIInnerErrorsReturn>((acc, error) => {\n if ('path' in error.values) {\n acc[error.values.path] = {\n id: error.id,\n defaultMessage: error.defaultMessage,\n };\n }\n\n return acc;\n }, {});\n }\n\n return normalizedError?.defaultMessage;\n}\n","import pluginPkg from '../../package.json';\n\nexport const pluginId = pluginPkg.name.replace(/^@strapi\\//i, '');\n\nexport default pluginId;\n","import pluginId from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n","import { getTrad } from './getTrad';\n\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface BreadcrumbDataFolder extends Omit<Folder, 'children' | 'files' | 'parent'> {\n parent?: BreadcrumbDataFolder;\n children?: {\n count: number;\n };\n files?: {\n count: number;\n };\n}\n\ninterface BreadcrumbItem {\n id?: number | null;\n label?: MessageDescriptor | string;\n path?: string;\n}\n\ntype BreadcrumbData = BreadcrumbItem | [];\n\nexport const getBreadcrumbDataCM = (folder: BreadcrumbDataFolder | null) => {\n let data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n },\n ];\n\n if (folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent) {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n path: folder.parent.path,\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n path: folder.path,\n });\n }\n\n return data;\n};\n","import type { Query } from '../../../shared/contracts/files';\n\nimport { stringify } from 'qs';\n\nexport const getFolderURL = (\n pathname: string,\n currentQuery: Query,\n { folder, folderPath }: { folder?: string; folderPath?: string } = {}\n) => {\n const { _q, ...queryParamsWithoutQ } = currentQuery;\n const queryParamsString = stringify(\n {\n ...queryParamsWithoutQ,\n folder,\n folderPath,\n },\n { encode: false }\n );\n\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n return `${pathname}${queryParamsString ? `?${queryParamsString}` : ''}`;\n};\n","export const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n","type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n children?: TreeNode<T>[];\n};\n\nexport default function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0\n): FlattenedNode<T>[] {\n return tree.flatMap((item) =>\n item.children\n ? [{ ...item, parent: parent?.value, depth }, ...flattenTree(item.children, item, depth + 1)]\n : { ...item, depth, parent: parent?.value }\n );\n}\n","import flattenTree from '../components/SelectTree/utils/flattenTree';\n\nimport type { FolderNode } from '../../../shared/contracts/folders';\n\ninterface FolderStructureValue extends Omit<FolderNode, 'children'> {\n value: number | null;\n children?: FolderStructureValue[];\n}\n\nexport const getFolderParents = (folders: FolderStructureValue[], currentFolderId: number) => {\n const parents = [];\n const flatFolders = flattenTree(folders);\n const currentFolder = flatFolders.find((folder) => folder.value === currentFolderId);\n\n if (!currentFolder) {\n return [];\n }\n\n let { parent } = currentFolder;\n\n while (parent !== undefined) {\n // eslint-disable-next-line no-loop-func\n let parentToStore = flatFolders.find(({ value }) => value === parent);\n parents.push({ id: parentToStore?.value, label: parentToStore?.label });\n parent = parentToStore?.parent;\n }\n\n return parents.reverse();\n};\n","const move = (array: number[], oldIndex: number, newIndex: number) => {\n if (newIndex >= array.length) {\n newIndex = array.length - 1;\n }\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\n\n return array;\n};\n\nexport const moveElement = (array: number[], index: number, offset: number) => {\n const newIndex = index + offset;\n\n return move(array, index, newIndex);\n};\n","type Translations = {\n [key: string]: string;\n};\n\nexport const prefixPluginTranslations = (trad: Translations, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce((acc: Translations, current: string) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n }, {});\n};\n","// TODO: replace this file with the constants file when it will be migrated to TS\nexport enum AssetType {\n Video = 'video',\n Image = 'image',\n Document = 'doc',\n Audio = 'audio',\n}\n\nexport enum AssetSource {\n Url = 'url',\n Computer = 'computer',\n}\n\nexport const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::upload.read', subject: null },\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n {\n action: 'plugin::upload.assets.update',\n subject: null,\n },\n ],\n copyLink: [\n {\n action: 'plugin::upload.assets.copy-link',\n subject: null,\n },\n ],\n create: [\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n ],\n download: [\n {\n action: 'plugin::upload.assets.download',\n subject: null,\n },\n ],\n read: [{ action: 'plugin::upload.read', subject: null }],\n configureView: [{ action: 'plugin::upload.configure-view', subject: null }],\n settings: [{ action: 'plugin::upload.settings.read', subject: null }],\n update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }],\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetType } from '../newConstants';\n\nexport const typeFromMime = (mime: string) => {\n if (mime.includes(AssetType.Image)) {\n return AssetType.Image;\n }\n if (mime.includes(AssetType.Video)) {\n return AssetType.Video;\n }\n if (mime.includes(AssetType.Audio)) {\n return AssetType.Audio;\n }\n\n return AssetType.Document;\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetSource } from '../newConstants';\nimport { typeFromMime } from './typeFromMime';\nimport type { RawFile } from '../../../shared/contracts/files';\n\nexport const rawFileToAsset = (rawFile: RawFile, assetSource: AssetSource) => {\n return {\n size: rawFile.size / 1000,\n createdAt: new Date(rawFile.lastModified).toISOString(),\n name: rawFile.name,\n source: assetSource,\n type: typeFromMime(rawFile.type),\n url: URL.createObjectURL(rawFile),\n ext: rawFile.name.split('.').pop(),\n mime: rawFile.type,\n rawFile,\n isLocal: true,\n };\n};\n","// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { AssetSource } from '../newConstants';\n\nimport { typeFromMime } from './typeFromMime';\n\nfunction getFilenameFromURL(url: string) {\n return new URL(url).pathname.split('/').pop();\n}\n\nexport const urlsToAssets = async (urls: string[]) => {\n const assetPromises = urls.map((url) =>\n fetch(url).then(async (res) => {\n const blob = await res.blob();\n\n const loadedFile = new File([blob], getFilenameFromURL(res.url)!, {\n type: res.headers.get('content-type') || undefined,\n });\n\n return {\n name: loadedFile.name,\n url: res.url,\n mime: res.headers.get('content-type'),\n rawFile: loadedFile,\n };\n })\n );\n // Retrieve the assets metadata\n const assetsResults = await Promise.all(assetPromises);\n\n const assets = assetsResults.map((fullFilledAsset) => ({\n source: AssetSource.Url,\n name: fullFilledAsset.name,\n type: typeFromMime(fullFilledAsset.mime!),\n url: fullFilledAsset.url,\n ext: fullFilledAsset.url.split('.').pop(),\n mime: fullFilledAsset.mime,\n rawFile: fullFilledAsset.rawFile,\n }));\n\n return assets;\n};\n","import { translatedErrors as errorsTrads } from '@strapi/admin/strapi-admin';\nimport * as yup from 'yup';\n\nimport { getTrad } from './getTrad';\n\nexport const urlSchema = yup.object().shape({\n urls: yup.string().test({\n name: 'isUrlValid',\n // eslint-disable-next-line no-template-curly-in-string\n message: '${path}',\n test(values = '') {\n const urls = values.split(/\\r?\\n/);\n\n if (urls.length === 0) {\n return this.createError({\n path: this.path,\n message: errorsTrads.min.id,\n });\n }\n\n if (urls.length > 20) {\n return this.createError({\n path: this.path,\n message: errorsTrads.max.id,\n });\n }\n\n const filtered = urls.filter((val) => {\n try {\n // eslint-disable-next-line no-new\n new URL(val);\n\n return false;\n } catch (err) {\n // invalid url\n return true;\n }\n });\n\n const filteredLength = filtered.length;\n\n if (filteredLength === 0) {\n return true;\n }\n\n const errorMessage =\n filteredLength > 1\n ? 'form.upload-url.error.url.invalids'\n : 'form.upload-url.error.url.invalid';\n\n return this.createError({\n path: this.path,\n message: getTrad(errorMessage),\n params: { number: filtered.length },\n });\n },\n }),\n});\n","import PropTypes from 'prop-types';\n\nimport { getTrad } from './utils';\n\nexport const AssetType = {\n Video: 'video',\n Image: 'image',\n Document: 'doc',\n Audio: 'audio',\n};\n\nexport const AssetSource = {\n Url: 'url',\n Computer: 'computer',\n};\n\nconst ParentFolderShape = {\n id: PropTypes.number.isRequired,\n createdAt: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n updatedAt: PropTypes.string.isRequired,\n pathId: PropTypes.number.isRequired,\n path: PropTypes.string.isRequired,\n};\n\nParentFolderShape.parent = PropTypes.shape(ParentFolderShape);\n\nconst FolderShape = {\n id: PropTypes.number,\n children: PropTypes.shape({\n count: PropTypes.number.isRequired,\n }),\n createdAt: PropTypes.string,\n createdBy: PropTypes.shape(),\n files: PropTypes.shape({\n count: PropTypes.number.isRequired,\n }),\n name: PropTypes.string,\n updatedAt: PropTypes.string,\n updatedBy: PropTypes.shape(),\n pathId: PropTypes.number,\n path: PropTypes.string,\n};\n\nFolderShape.parent = PropTypes.shape(ParentFolderShape);\n\nexport const FolderDefinition = PropTypes.shape(FolderShape);\n\nconst FolderStructure = PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n label: PropTypes.string.isRequired,\n children: PropTypes.array,\n});\n\nFolderStructure.children = PropTypes.arrayOf(PropTypes.shape(FolderStructure));\nFolderStructure.defaultProps = {\n children: undefined,\n};\n\nexport const FolderStructureDefinition = PropTypes.arrayOf(FolderStructure);\n\nexport const AssetDefinition = PropTypes.shape({\n id: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n size: PropTypes.number,\n createdAt: PropTypes.string,\n ext: PropTypes.string,\n mime: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n updatedAt: PropTypes.string,\n alternativeText: PropTypes.string,\n caption: PropTypes.string,\n folder: PropTypes.shape(FolderDefinition),\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n});\n\nexport const CrumbDefinition = PropTypes.shape({\n id: PropTypes.number,\n label: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n defaultMessage: PropTypes.string.isRequired,\n }),\n ]).isRequired,\n href: PropTypes.string,\n});\n\nexport const CrumbMenuDefinition = PropTypes.arrayOf(CrumbDefinition);\n\nexport const BreadcrumbsDefinition = PropTypes.arrayOf(\n PropTypes.oneOfType([CrumbDefinition, CrumbMenuDefinition])\n);\n\nexport const viewOptions = {\n GRID: 0,\n LIST: 1,\n};\nexport const tableHeaders = [\n {\n name: 'preview',\n key: 'preview',\n metadatas: {\n label: { id: getTrad('list.table.header.preview'), defaultMessage: 'preview' },\n isSortable: false,\n },\n type: 'image',\n },\n {\n name: 'name',\n key: 'name',\n metadatas: {\n label: { id: getTrad('list.table.header.name'), defaultMessage: 'name' },\n isSortable: true,\n },\n type: 'text',\n },\n {\n name: 'ext',\n key: 'extension',\n metadatas: {\n label: { id: getTrad('list.table.header.ext'), defaultMessage: 'extension' },\n isSortable: false,\n },\n type: 'ext',\n },\n {\n name: 'size',\n key: 'size',\n metadatas: {\n label: { id: getTrad('list.table.header.size'), defaultMessage: 'size' },\n isSortable: false,\n },\n type: 'size',\n },\n {\n name: 'createdAt',\n key: 'createdAt',\n metadatas: {\n label: { id: getTrad('list.table.header.createdAt'), defaultMessage: 'created' },\n isSortable: true,\n },\n type: 'date',\n },\n {\n name: 'updatedAt',\n key: 'updatedAt',\n metadatas: {\n label: { id: getTrad('list.table.header.updatedAt'), defaultMessage: 'last update' },\n isSortable: true,\n },\n type: 'date',\n },\n];\n\nexport const pageSizes = [10, 20, 50, 100];\n\nexport const sortOptions = [\n { key: 'sort.created_at_desc', value: 'createdAt:DESC' },\n { key: 'sort.created_at_asc', value: 'createdAt:ASC' },\n { key: 'sort.name_asc', value: 'name:ASC' },\n { key: 'sort.name_desc', value: 'name:DESC' },\n { key: 'sort.updated_at_desc', value: 'updatedAt:DESC' },\n { key: 'sort.updated_at_asc', value: 'updatedAt:ASC' },\n];\n\nexport const localStorageKeys = {\n modalView: `STRAPI_UPLOAD_MODAL_VIEW`,\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::upload.read', subject: null },\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n {\n action: 'plugin::upload.assets.update',\n subject: null,\n },\n ],\n copyLink: [\n {\n action: 'plugin::upload.assets.copy-link',\n subject: null,\n },\n ],\n create: [\n {\n action: 'plugin::upload.assets.create',\n subject: null,\n },\n ],\n download: [\n {\n action: 'plugin::upload.assets.download',\n subject: null,\n },\n ],\n read: [{ action: 'plugin::upload.read', subject: null }],\n configureView: [{ action: 'plugin::upload.configure-view', subject: null }],\n settings: [{ action: 'plugin::upload.settings.read', subject: null }],\n update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }],\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\nimport { Query, GetFiles } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport type { Query } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\ninterface UseFoldersOptions {\n enabled?: boolean;\n query?: Query;\n}\n\nexport const useFolders = ({ enabled = true, query = {} }: UseFoldersOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { folder, _q, ...paramsExceptFolderAndQ } = query;\n const { get } = useFetchClient();\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n _q,\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n parent: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFolders.Response['data'],\n GetFolders.Response['error']\n >(\n [pluginId, 'folders', stringify(params)],\n async () => {\n const {\n data: { data },\n } = await get<GetFolders.Response>('/upload/folders', { params });\n\n return data;\n },\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The folders have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return { data, error, isLoading };\n};\n","import { useRBAC } from '@strapi/admin/strapi-admin';\n\n// TODO: replace this import with the import from constants file when it will be migrated to TS\nimport { PERMISSIONS } from '../newConstants';\n\nconst { main, ...restPermissions } = PERMISSIONS;\n\nexport const useMediaLibraryPermissions = () => {\n const { allowedActions, isLoading } = useRBAC(restPermissions);\n\n return { ...allowedActions, isLoading };\n};\n","import { useTracking, useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery, UseMutationResult, UseQueryResult } from 'react-query';\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\n\nimport pluginId from '../pluginId';\n\nconst endpoint = `/${pluginId}/configuration`;\nconst queryKey = [pluginId, 'configuration'];\n\nexport const useConfig = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n\n const config: UseQueryResult<\n GetConfiguration.Response['data']['data'] | GetConfiguration.Response['error']\n > = useQuery(\n queryKey,\n async () => {\n const res: GetConfiguration.Response = await get(endpoint);\n\n return res.data.data;\n },\n {\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n /**\n * We're cementing that we always expect an object to be returned.\n */\n select: (data) => data || {},\n }\n );\n\n const putMutation: UseMutationResult<\n void,\n UpdateConfiguration.Response['error'],\n UpdateConfiguration.Request['body']\n > = useMutation(\n async (body) => {\n await put<UpdateConfiguration.Response>(endpoint, body);\n },\n {\n onSuccess() {\n trackUsage('didEditMediaLibraryConfig');\n config.refetch();\n },\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n return {\n config,\n mutateConfig: putMutation,\n };\n};\n","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { stringify } from 'qs';\n\nimport { useConfig } from './useConfig';\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nconst useModalQueryParams = (initialState?: Partial<Query>) => {\n const { trackUsage } = useTracking();\n const {\n config: { data: config },\n } = useConfig();\n\n const [queryObject, setQueryObject] = React.useState<Query>({\n page: 1,\n sort: 'updatedAt:DESC',\n pageSize: 10,\n filters: {\n $and: [],\n },\n ...initialState,\n });\n\n React.useEffect(() => {\n if (config && 'sort' in config && 'pageSize' in config) {\n setQueryObject((prevQuery) => ({\n ...prevQuery,\n sort: config.sort,\n pageSize: config.pageSize,\n }));\n }\n }, [config]);\n\n const handleChangeFilters = (nextFilters: FilterCondition<string>[]) => {\n if (nextFilters) {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(nextFilters[nextFilters.length - 1])[0],\n });\n setQueryObject((prev) => ({ ...prev, page: 1, filters: { $and: nextFilters } }));\n }\n };\n\n const handleChangePageSize = (pageSize: Query['pageSize']) => {\n setQueryObject((prev) => ({\n ...prev,\n pageSize: typeof pageSize === 'string' ? parseInt(pageSize, 10) : pageSize,\n page: 1,\n }));\n };\n\n const handeChangePage = (page: Query['page']) => {\n setQueryObject((prev) => ({ ...prev, page }));\n };\n\n const handleChangeSort = (sort: Query['sort']) => {\n if (sort) {\n trackUsage('didSortMediaLibraryElements', {\n location: 'content-manager',\n sort,\n });\n setQueryObject((prev) => ({ ...prev, sort }));\n }\n };\n\n const handleChangeSearch = (_q: Query['_q']) => {\n if (_q) {\n setQueryObject((prev) => ({ ...prev, _q, page: 1 }));\n } else {\n const newState: Query = { page: 1 };\n\n Object.keys(queryObject).forEach((key) => {\n if (!['page', '_q'].includes(key)) {\n // @ts-ignore\n newState[key] = queryObject[key];\n }\n });\n\n setQueryObject(newState);\n }\n };\n\n const handleChangeFolder = (folder: Query['folder'], folderPath: Query['folderPath']) => {\n setQueryObject((prev) => ({ ...prev, folder: folder ?? null, folderPath }));\n };\n\n return [\n { queryObject, rawQuery: stringify(queryObject, { encode: false }) },\n {\n onChangeFilters: handleChangeFilters,\n onChangeFolder: handleChangeFolder,\n onChangePage: handeChangePage,\n onChangePageSize: handleChangePageSize,\n onChangeSort: handleChangeSort,\n onChangeSearch: handleChangeSearch,\n },\n ];\n};\n\nexport default useModalQueryParams;\n","import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // filter out items in currSelections that are in nextSelections\n ...currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n","import * as React from 'react';\n\nimport { useNotification, useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport type ErrorMutation = {\n message: string;\n response: {\n status: number;\n data: {\n error: Error;\n };\n };\n} | null;\n\nconst editAssetRequest = (\n asset: FileAsset,\n file: File,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const endpoint = `/${pluginId}?id=${asset.id}`;\n\n const formData = new FormData();\n\n if (file) {\n formData.append('files', file);\n }\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n alternativeText: asset.alternativeText,\n caption: asset.caption,\n folder: asset.folder,\n name: asset.name,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useEditAsset = () => {\n const [progress, setProgress] = React.useState(0);\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFile.Response['data'],\n ErrorMutation,\n { asset: FileAsset; file: File }\n >(({ asset, file }) => editAssetRequest(asset, file, signal, setProgress, post), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n },\n onError(reason) {\n if (reason?.response?.status === 403) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('permissions.not-allowed.update') }),\n });\n } else {\n toggleNotification({ type: 'danger', message: reason?.message });\n }\n },\n });\n\n const editAsset = (asset: FileAsset, file: File) => mutation.mutateAsync({ asset, file });\n\n const cancel = () => abortController.abort();\n\n return { ...mutation, cancel, editAsset, progress, status: mutation.status };\n};\n","type Primitive = string | number | boolean | null | undefined;\n\nexport type DeepRecord<T> = {\n [K in keyof T]: T[K] extends Primitive ? T[K] : DeepRecord<T[K]>;\n};\n\nexport const recursiveRenameKeys = <T extends object>(\n obj: T,\n fn: (key: string) => string\n): DeepRecord<T> =>\n Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n const getValue = (v: unknown): any =>\n typeof v === 'object' && v !== null ? recursiveRenameKeys(v, fn) : v;\n\n return [fn(key), Array.isArray(value) ? value.map((val) => getValue(val)) : getValue(value)];\n })\n ) as DeepRecord<T>;\n","import { useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport { recursiveRenameKeys } from './utils/rename-keys';\n\nimport { FolderNode, GetFolderStructure } from '../../../shared/contracts/folders';\n\nconst FIELD_MAPPING: Record<string, string> = {\n name: 'label',\n id: 'value',\n};\n\nexport const useFolderStructure = ({ enabled = true } = {}) => {\n const { formatMessage } = useIntl();\n const { get } = useFetchClient();\n\n const fetchFolderStructure = async () => {\n const {\n data: { data },\n } = await get<GetFolderStructure.Response['data']>('/upload/folder-structure');\n\n const children = data.map((f: FolderNode) =>\n recursiveRenameKeys(f, (key) => FIELD_MAPPING?.[key] ?? key)\n );\n\n return [\n {\n value: null,\n label: formatMessage({\n id: getTrad('form.input.label.folder-location-default-label'),\n defaultMessage: 'Media Library',\n }),\n children,\n },\n ];\n };\n\n const { data, error, isLoading } = useQuery(\n [pluginId, 'folder', 'structure'],\n fetchFolderStructure,\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n }\n );\n\n return { data, error, isLoading };\n};\n","import React from 'react';\n\nimport { Box, Flex, Grid, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const ContextInfo = ({ blocks }) => {\n return (\n <Box\n hasRadius\n paddingLeft={6}\n paddingRight={6}\n paddingTop={4}\n paddingBottom={4}\n background=\"neutral100\"\n >\n <Grid.Root gap={4}>\n {blocks.map(({ label, value }) => (\n <Grid.Item col={6} xs={12} key={label} direction=\"column\" alignItems=\"stretch\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {value}\n </Typography>\n </Flex>\n </Grid.Item>\n ))}\n </Grid.Root>\n </Box>\n );\n};\n\nContextInfo.propTypes = {\n blocks: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n })\n ).isRequired,\n};\n","import React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { ChevronDown, ChevronUp } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { components } from 'react-select';\nimport { styled } from 'styled-components';\n\nconst ToggleButton = styled(Flex)`\n align-self: flex-end;\n height: 2.2rem;\n width: 2.8rem;\n\n &:hover,\n &:focus {\n background-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst Option = ({ children, data, selectProps, ...props }) => {\n const { formatMessage } = useIntl();\n const { depth, value, children: options } = data;\n const { maxDisplayDepth, openValues, onOptionToggle } = selectProps;\n const isOpen = openValues.includes(value);\n\n const Icon = isOpen ? ChevronUp : ChevronDown;\n\n return (\n <components.Option {...props}>\n <Flex alignItems=\"start\">\n <Typography textColor=\"neutral800\" ellipsis>\n <span style={{ paddingLeft: `${Math.min(depth, maxDisplayDepth) * 14}px` }}>\n {children}\n </span>\n </Typography>\n\n {options?.length > 0 && (\n <ToggleButton\n aria-label={formatMessage({\n id: 'app.utils.toggle',\n defaultMessage: 'Toggle',\n })}\n tag=\"button\"\n alignItems=\"center\"\n hasRadius\n justifyContent=\"center\"\n marginLeft=\"auto\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n\n onOptionToggle(value);\n }}\n >\n <Icon width=\"1.4rem\" fill=\"neutral500\" />\n </ToggleButton>\n )}\n </Flex>\n </components.Option>\n );\n};\n\nOption.propTypes = {\n children: PropTypes.node.isRequired,\n data: PropTypes.object.isRequired,\n onToggle: PropTypes.func.isRequired,\n selectProps: PropTypes.shape({\n maxDisplayDepth: PropTypes.number,\n openValues: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n onOptionToggle: PropTypes.func,\n }).isRequired,\n};\n\nexport default Option;\n","function getOpenValues(options, defaultValue = {}) {\n let values = [];\n const { value } = defaultValue;\n const option = options.find((option) => option.value === value);\n\n if (!option) {\n return values;\n }\n\n values.push(option.value);\n\n let { parent } = option;\n\n while (parent !== undefined) {\n // eslint-disable-next-line no-loop-func\n const option = options.find(({ value }) => value === parent);\n\n values.push(option.value);\n parent = option.parent;\n }\n\n return values.reverse();\n}\n\nexport default getOpenValues;\n","function getValuesToClose(options, value) {\n const optionForValue = options.find((option) => option.value === value);\n\n return options\n .filter((option) => option.depth >= optionForValue.depth)\n .map((option) => option.value);\n}\n\nexport default getValuesToClose;\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { Cross, CaretDown } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport ReactSelect, { components } from 'react-select';\nimport { styled, useTheme } from 'styled-components';\n\nimport Option from './Option';\nimport flattenTree from './utils/flattenTree';\nimport getOpenValues from './utils/getOpenValues';\nimport getValuesToClose from './utils/getValuesToClose';\n\nconst hasParent = (option) => !option.parent;\n\nconst SelectTree = ({ options: defaultOptions, maxDisplayDepth, defaultValue, ...props }) => {\n const flatDefaultOptions = useMemo(() => flattenTree(defaultOptions), [defaultOptions]);\n const optionsFiltered = useMemo(() => flatDefaultOptions.filter(hasParent), [flatDefaultOptions]);\n const [options, setOptions] = useState(optionsFiltered);\n const [openValues, setOpenValues] = useState(getOpenValues(flatDefaultOptions, defaultValue));\n\n useEffect(() => {\n if (openValues.length === 0) {\n setOptions(flatDefaultOptions.filter((option) => option.parent === undefined));\n } else {\n const allOpenValues = openValues.reduce((acc, value) => {\n const options = flatDefaultOptions.filter(\n (option) => option.value === value || option.parent === value\n );\n\n options.forEach((option) => {\n const values = getOpenValues(flatDefaultOptions, option);\n acc = [...acc, ...values];\n });\n\n return acc;\n }, []);\n\n const nextOptions = flatDefaultOptions.filter((option) =>\n allOpenValues.includes(option.value)\n );\n\n setOptions(nextOptions);\n }\n }, [openValues, flatDefaultOptions, optionsFiltered]);\n\n const handleToggle = (value) => {\n if (openValues.includes(value)) {\n const valuesToClose = getValuesToClose(flatDefaultOptions, value);\n setOpenValues((prev) => prev.filter((prevData) => !valuesToClose.includes(prevData)));\n } else {\n setOpenValues((prev) => [...prev, value]);\n }\n };\n\n return (\n <Select\n components={{ Option }}\n options={options}\n defaultValue={defaultValue}\n isSearchable={false}\n /* -- custom props, used by the Option component */\n maxDisplayDepth={maxDisplayDepth}\n openValues={openValues}\n onOptionToggle={handleToggle}\n /* -- / custom props */\n {...props}\n />\n );\n};\n\nconst Select = ({ components, styles, error, ariaErrorMessage, ...props }) => {\n const theme = useTheme();\n const customStyles = getSelectStyles(theme, error);\n\n return (\n <ReactSelect\n menuPosition=\"fixed\"\n components={{\n ClearIndicator,\n DropdownIndicator,\n IndicatorSeparator: () => null,\n LoadingIndicator: () => null,\n ...components,\n }}\n aria-errormessage={error && ariaErrorMessage}\n aria-invalid={!!error}\n styles={{ ...customStyles, ...styles }}\n {...props}\n />\n );\n};\n\nSelect.defaultProps = {\n ariaErrorMessage: '',\n components: {},\n error: undefined,\n styles: {},\n};\n\nSelect.propTypes = {\n components: PropTypes.object,\n styles: PropTypes.object,\n error: PropTypes.string,\n ariaErrorMessage: PropTypes.string,\n};\n\nconst IconBox = styled(Box)`\n background: transparent;\n border: none;\n position: relative;\n z-index: 1;\n\n svg {\n height: 1.1rem;\n width: 1.1rem;\n }\n\n svg path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nconst ClearIndicator = (props) => {\n const Component = components.ClearIndicator;\n\n return (\n <Component {...props}>\n <IconBox tag=\"button\" type=\"button\">\n <Cross />\n </IconBox>\n </Component>\n );\n};\n\nconst CarretBox = styled(IconBox)`\n display: flex;\n background: none;\n border: none;\n\n svg {\n width: 0.9rem;\n }\n`;\n\nconst DropdownIndicator = ({ innerProps }) => {\n return (\n // @ts-expect-error – issue with the ref attached to `innerProps`\n <CarretBox paddingRight={3} {...innerProps}>\n <CaretDown />\n </CarretBox>\n );\n};\n\nDropdownIndicator.propTypes = {\n innerProps: PropTypes.object.isRequired,\n};\n\nconst getSelectStyles = (theme, error) => {\n return {\n clearIndicator: (base) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n container: (base) => ({\n ...base,\n background: theme.colors.neutral0,\n lineHeight: 'normal',\n }),\n control(base, state) {\n let borderColor = theme.colors.neutral200;\n let boxShadowColor;\n let backgroundColor;\n\n if (state.isFocused) {\n borderColor = theme.colors.primary600;\n boxShadowColor = theme.colors.primary600;\n } else if (error) {\n borderColor = theme.colors.danger600;\n }\n\n if (state.isDisabled) {\n backgroundColor = `${theme.colors.neutral150} !important`;\n }\n\n return {\n ...base,\n fontSize: theme.fontSizes[2],\n height: 40,\n border: `1px solid ${borderColor} !important`,\n outline: 0,\n backgroundColor,\n borderRadius: theme.borderRadius,\n boxShadow: boxShadowColor ? `${boxShadowColor} 0px 0px 0px 2px` : '',\n };\n },\n indicatorsContainer: (base) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n input: (base) => ({\n ...base,\n margin: 0,\n padding: 0,\n color: theme.colors.neutral800,\n gridTemplateColumns: '0 100%',\n }),\n menuPortal: (base) => ({\n ...base,\n zIndex: theme.zIndices.dialog,\n pointerEvents: 'auto',\n }),\n menu(base) {\n return {\n ...base,\n width: '100%',\n marginTop: theme.spaces[1],\n backgroundColor: theme.colors.neutral0,\n color: theme.colors.neutral800,\n borderRadius: theme.borderRadius,\n border: `1px solid ${theme.colors.neutral200}`,\n boxShadow: theme.shadows.tableShadow,\n fontSize: theme.fontSizes[2],\n zIndex: 2,\n };\n },\n menuList: (base) => ({\n ...base,\n paddingLeft: theme.spaces[1],\n paddingTop: theme.spaces[1],\n paddingRight: theme.spaces[1],\n paddingBottom: theme.spaces[1],\n }),\n option(base, state) {\n let backgroundColor = base.backgroundColor;\n\n if (state.isFocused || state.isSelected) {\n backgroundColor = theme.colors.primary100;\n }\n\n return {\n ...base,\n color: theme.colors.neutral800,\n lineHeight: theme.spaces[5],\n backgroundColor,\n borderRadius: theme.borderRadius,\n '&:active': {\n backgroundColor: theme.colors.primary100,\n },\n };\n },\n placeholder: (base) => ({\n ...base,\n color: theme.colors.neutral600,\n marginLeft: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '80%',\n }),\n singleValue(base, state) {\n let color = theme.colors.neutral800;\n\n if (state.isDisabled) {\n color = theme.colors.neutral600;\n }\n\n return { ...base, marginLeft: 0, color };\n },\n valueContainer: (base) => ({\n ...base,\n cursor: 'pointer',\n padding: 0,\n paddingLeft: theme.spaces[4],\n marginLeft: 0,\n marginRight: 0,\n }),\n };\n};\n\nconst OptionShape = PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n label: PropTypes.string.isRequired,\n children: PropTypes.array,\n});\n\nOptionShape.children = PropTypes.arrayOf(PropTypes.shape(OptionShape));\n\nOptionShape.defaultProps = {\n children: undefined,\n};\n\nSelectTree.defaultProps = {\n defaultValue: undefined,\n maxDisplayDepth: 5,\n};\n\nSelectTree.propTypes = {\n defaultValue: PropTypes.shape({\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n }),\n maxDisplayDepth: PropTypes.number,\n options: PropTypes.arrayOf(OptionShape).isRequired,\n};\n\nexport default SelectTree;\n","import * as React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nexport const DialogHeader = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Header>\n <Modal.Title>\n {formatMessage({ id: 'global.details', defaultMessage: 'Details' })}\n </Modal.Title>\n </Modal.Header>\n );\n};\n","import * as React from 'react';\n\nimport Cropper from 'cropperjs';\n\nconst QUALITY = 1;\n\ntype Size = {\n width?: number;\n height?: number;\n};\n\ntype Resize = {\n detail: {\n height: number;\n width: number;\n };\n};\n\nexport const useCropImg = () => {\n const cropperRef = React.useRef<Cropper>();\n const [isCropping, setIsCropping] = React.useState(false);\n const [size, setSize] = React.useState<Size>({ width: undefined, height: undefined });\n\n React.useEffect(() => {\n return () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n }\n };\n }, []);\n\n const handleResize = ({ detail: { height, width } }: Resize) => {\n const roundedDataWidth = Math.round(width);\n const roundedDataHeight = Math.round(height);\n\n setSize({ width: roundedDataWidth, height: roundedDataHeight });\n };\n\n const crop = (image: HTMLImageElement) => {\n if (!cropperRef.current) {\n cropperRef.current = new Cropper(image, {\n modal: true,\n initialAspectRatio: 16 / 9,\n movable: true,\n zoomable: false,\n cropBoxResizable: true,\n background: false,\n crop: handleResize,\n });\n\n setIsCropping(true);\n }\n };\n\n const stopCropping = () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n cropperRef.current = undefined;\n setIsCropping(false);\n }\n };\n\n const produceFile = (name: string, mimeType: string, lastModifiedDate: string) =>\n new Promise((resolve, reject) => {\n if (!cropperRef.current) {\n reject(\n new Error(\n 'The cropper has not been instantiated: make sure to call the crop() function before calling produceFile().'\n )\n );\n } else {\n const canvas = cropperRef.current.getCroppedCanvas();\n\n canvas.toBlob(\n (blob) => {\n resolve(\n new File([blob!], name, {\n type: mimeType,\n lastModified: new Date(lastModifiedDate).getTime(),\n })\n );\n },\n mimeType,\n QUALITY\n );\n }\n });\n\n return {\n crop,\n produceFile,\n stopCropping,\n isCropping,\n isCropperReady: Boolean(cropperRef.current),\n ...size,\n };\n};\n","import * as React from 'react';\n\nimport { useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends File {\n rawFile: RawFile;\n}\n\nconst uploadAsset = (\n asset: Asset,\n folderId: number,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const { rawFile, caption, name, alternativeText } = asset;\n const formData = new FormData();\n\n formData.append('files', rawFile);\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name,\n caption,\n alternativeText,\n folder: folderId,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useUpload = () => {\n const [progress, setProgress] = React.useState(0);\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n CreateFile.Response['data'],\n CreateFile.Response['error'],\n { asset: Asset; folderId: number }\n >(\n ({ asset, folderId }) => {\n return uploadAsset(asset, folderId, signal, setProgress, post);\n },\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n },\n }\n );\n\n const upload = (asset: Asset, folderId: number) => mutation.mutateAsync({ asset, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n","import { useCallback } from 'react';\n\nconst useClipboard = () => {\n const copy = useCallback(async (value: string | number) => {\n try {\n // only strings and numbers casted to strings can be copied to clipboard\n if (typeof value !== 'string' && typeof value !== 'number') {\n throw new Error(\n `Cannot copy typeof ${typeof value} to clipboard, must be a string or number`\n );\n }\n // empty strings are also considered invalid\n else if (value === '') {\n throw new Error(`Cannot copy empty string to clipboard.`);\n }\n\n const stringifiedValue = value.toString();\n\n await navigator.clipboard.writeText(stringifiedValue);\n\n return true;\n } catch (error) {\n /**\n * Realistically this isn't useful in production as there's nothing the user can do.\n */\n if (process.env.NODE_ENV === 'development') {\n console.warn('Copy failed', error);\n }\n\n return false;\n }\n }, []);\n\n return { copy };\n};\n\nexport { useClipboard };\n","import React from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { IconButton } from '@strapi/design-system';\nimport { Link as LinkIcon } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { useClipboard } from '../../hooks/useClipboard';\nimport { getTrad } from '../../utils';\n\nexport const CopyLinkButton = ({ url }) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n\n const handleClick = async () => {\n const didCopy = await copy(url);\n\n if (didCopy) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.link-copied',\n defaultMessage: 'Link copied into the clipboard',\n }),\n });\n }\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.copy-link'),\n defaultMessage: 'Copy link',\n })}\n onClick={handleClick}\n >\n <LinkIcon />\n </IconButton>\n );\n};\n\nCopyLinkButton.propTypes = {\n url: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Flex, ProgressBar, Typography } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nconst BoxWrapper = styled(Flex)`\n border-radius: ${({ theme }) => `${theme.borderRadius} ${theme.borderRadius} 0 0`};\n width: 100%;\n height: 100%;\n\n svg {\n path {\n fill: ${({ theme, error }) => (error ? theme.colors.danger600 : undefined)};\n }\n }\n`;\n\nconst CancelButton = styled.button`\n border: none;\n background: none;\n width: min-content;\n color: ${({ theme }) => theme.colors.neutral600};\n\n &:hover,\n &:focus {\n color: ${({ theme }) => theme.colors.neutral700};\n }\n\n svg {\n height: 10px;\n width: 10px;\n\n path {\n fill: currentColor;\n }\n }\n`;\n\nexport const UploadProgress = ({ onCancel, progress, error }) => {\n const { formatMessage } = useIntl();\n\n return (\n <BoxWrapper alignItems=\"center\" background={error ? 'danger100' : 'neutral150'} error={error}>\n {error ? (\n <Cross aria-label={error?.message} />\n ) : (\n <Flex direction=\"column\" alignItems=\"center\" gap={2} width=\"100%\">\n <ProgressBar value={progress}>{`${progress}/100%`}</ProgressBar>\n\n <CancelButton type=\"button\" onClick={onCancel}>\n <Flex gap={2}>\n <Typography variant=\"pi\" tag=\"span\" textColor=\"inherit\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Typography>\n\n <Cross aria-hidden />\n </Flex>\n </CancelButton>\n </Flex>\n )}\n </BoxWrapper>\n );\n};\n\nUploadProgress.defaultProps = {\n error: undefined,\n progress: 0,\n};\n\nUploadProgress.propTypes = {\n error: PropTypes.instanceOf(Error),\n onCancel: PropTypes.func.isRequired,\n progress: PropTypes.number,\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\nimport type { DeleteFile } from '../../../shared/contracts/files';\n\nimport pluginId from '../pluginId';\n\nexport const useRemoveAsset = (onSuccess: () => void) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { del } = useFetchClient();\n\n const mutation = useMutation(\n (assetId: number) => del<DeleteFile.Response>(`/upload/files/${assetId}`),\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'modal.remove.success-label',\n defaultMessage: 'Elements have been successfully deleted.',\n }),\n });\n\n onSuccess();\n },\n onError(error: Error) {\n toggleNotification({ type: 'danger', message: error.message });\n },\n }\n );\n\n const removeAsset = async (assetId: number) => {\n await mutation.mutateAsync(assetId);\n };\n\n return { ...mutation, removeAsset };\n};\n","import React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\n\nexport const RemoveAssetDialog = ({ open, onClose, asset }) => {\n // `null` means asset is deleted\n const { removeAsset } = useRemoveAsset(() => {\n onClose(null);\n });\n\n const handleConfirm = async (event) => {\n event.preventDefault();\n await removeAsset(asset.id);\n };\n\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={handleConfirm} />\n </Dialog.Root>\n );\n};\n\nRemoveAssetDialog.propTypes = {\n onClose: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n asset: PropTypes.shape({\n id: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n size: PropTypes.number,\n createdAt: PropTypes.string,\n ext: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n};\n","import { useEffect, useState } from 'react';\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => {\n const stickyValue = window.localStorage.getItem(key);\n\n if (stickyValue !== null) {\n try {\n return JSON.parse(stickyValue);\n } catch {\n // JSON.parse fails when the stored value is a primitive\n return stickyValue;\n }\n }\n\n return defaultValue;\n });\n\n useEffect(() => {\n window.localStorage.setItem(key, JSON.stringify(value));\n }, [key, value]);\n\n return [value, setValue] as const;\n};\n\nexport { usePersistentState };\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React, { forwardRef } from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nexport const AssetPreview = forwardRef(({ mime, url, name, ...props }, ref) => {\n const [lang] = usePersistentState('strapi-admin-language', 'en');\n\n if (mime.includes(AssetType.Image)) {\n return <img ref={ref} src={url} alt={name} {...props} />;\n }\n\n if (mime.includes(AssetType.Video)) {\n return (\n <video controls src={url} ref={ref} {...props}>\n <track label={name} default kind=\"captions\" srcLang={lang} src=\"\" />\n </video>\n );\n }\n\n if (mime.includes(AssetType.Audio)) {\n return (\n <audio controls src={url} ref={ref} {...props}>\n {name}\n </audio>\n );\n }\n\n if (mime.includes('pdf')) {\n return (\n <CardAsset justifyContent=\"center\" {...props}>\n <FilePdf aria-label={name} />\n </CardAsset>\n );\n }\n\n return (\n <CardAsset justifyContent=\"center\" {...props}>\n <File aria-label={name} />\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n\nAssetPreview.propTypes = {\n mime: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n};\n","import { Badge, Box, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nexport const RelativeBox = styled(Box)`\n position: relative;\n`;\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n\n svg {\n font-size: 4.8rem;\n height: 26.4rem;\n }\n\n img,\n video {\n margin: 0;\n padding: 0;\n max-height: 26.4rem;\n max-width: 100%;\n }\n`;\n\nexport const ActionRow = styled(Flex)`\n height: 5.2rem;\n background-color: ${({ $blurry }) => ($blurry ? `rgba(33, 33, 52, 0.4)` : undefined)};\n`;\n\nexport const CroppingActionRow = styled(Flex)`\n z-index: 1;\n height: 5.2rem;\n position: absolute;\n background-color: rgba(33, 33, 52, 0.4);\n width: 100%;\n`;\n\n// TODO: fix in parts, this shouldn't happen\nexport const BadgeOverride = styled(Badge)`\n span {\n color: inherit;\n font-weight: ${({ theme }) => theme.fontWeights.regular};\n }\n`;\n\nexport const UploadProgressWrapper = styled.div`\n position: absolute;\n z-index: 2;\n height: 100%;\n width: 100%;\n`;\n","import React from 'react';\n\nimport { Flex, FocusTrap, IconButton, Menu } from '@strapi/design-system';\nimport { Check, Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTrad } from '../../../utils';\n\nimport { CroppingActionRow } from './components';\n\nexport const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => {\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n return (\n <FocusTrap onEscape={onCancel}>\n <CroppingActionRow justifyContent=\"flex-end\" paddingLeft={3} paddingRight={3}>\n <Flex gap={1}>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.stop-crop'),\n defaultMessage: 'Stop cropping',\n })}\n onClick={onCancel}\n >\n <Cross />\n </IconButton>\n\n <Menu.Root>\n <Trigger\n aria-label={formatMessage({\n id: getTrad('control-card.crop'),\n defaultMessage: 'Crop',\n })}\n variant=\"tertiary\"\n paddingLeft={2}\n paddingRight={2}\n endIcon={null}\n >\n <Check\n aria-hidden\n focusable={false}\n style={{ position: 'relative', top: 2 }}\n fill=\"#C0C0D0\"\n />\n </Trigger>\n <Menu.Content zIndex={theme.zIndices.dialog}>\n <Menu.Item onSelect={onValidate}>\n {formatMessage({\n id: getTrad('checkControl.crop-original'),\n defaultMessage: 'Crop the original asset',\n })}\n </Menu.Item>\n\n {onDuplicate && (\n <Menu.Item onSelect={onDuplicate}>\n {formatMessage({\n id: getTrad('checkControl.crop-duplicate'),\n defaultMessage: 'Duplicate & crop the asset',\n })}\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </CroppingActionRow>\n </FocusTrap>\n );\n};\n\nconst Trigger = styled(Menu.Trigger)`\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n\n &:hover {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n }\n\n &:active {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n }\n`;\n\nCroppingActions.defaultProps = {\n onDuplicate: undefined,\n};\n\nCroppingActions.propTypes = {\n onCancel: PropTypes.func.isRequired,\n onDuplicate: PropTypes.func,\n onValidate: PropTypes.func.isRequired,\n};\n","import React, { useEffect, useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, AssetType } from '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './components';\nimport { CroppingActions } from './CroppingActions';\n\nimport 'cropperjs/dist/cropper.css';\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n}) => {\n const { trackUsage } = useTracking();\n const previewRef = useRef(null);\n const [isCropImageReady, setIsCropImageReady] = useState(false);\n const [hasCropIntent, setHasCropIntent] = useState(null);\n const [assetUrl, setAssetUrl] = useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n return (\n <>\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl} />}\n\n {canUpdate && asset.mime.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <AssetPreview\n ref={previewRef}\n mime={asset.mime}\n name={asset.name}\n url={hasCropIntent ? assetUrl : thumbnailUrl}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n\nPreviewBox.defaultProps = {\n replacementFile: undefined,\n trackedLocation: undefined,\n};\n\nPreviewBox.propTypes = {\n canUpdate: PropTypes.bool.isRequired,\n canCopyLink: PropTypes.bool.isRequired,\n canDownload: PropTypes.bool.isRequired,\n replacementFile: PropTypes.instanceOf(File),\n asset: AssetDefinition.isRequired,\n onDelete: PropTypes.func.isRequired,\n onCropFinish: PropTypes.func.isRequired,\n onCropStart: PropTypes.func.isRequired,\n onCropCancel: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useRef } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, VisuallyHidden } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const ReplaceMediaButton = ({ onSelectMedia, acceptedMime, trackedLocation, ...props }) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef(null);\n const { trackUsage } = useTracking();\n\n const handleClick = (e) => {\n e.preventDefault();\n\n if (trackedLocation) {\n trackUsage('didReplaceMedia', { location: trackedLocation });\n }\n\n inputRef.current.click();\n };\n\n const handleChange = () => {\n const file = inputRef.current.files[0];\n\n onSelectMedia(file);\n };\n\n return (\n <>\n <Button variant=\"secondary\" onClick={handleClick} {...props}>\n {formatMessage({\n id: getTrad('control-card.replace-media'),\n defaultMessage: 'Replace media',\n })}\n </Button>\n <VisuallyHidden>\n <input\n accept={acceptedMime}\n type=\"file\"\n name=\"file\"\n tabIndex={-1}\n ref={inputRef}\n onChange={handleChange}\n aria-hidden\n />\n </VisuallyHidden>\n </>\n );\n};\n\nReplaceMediaButton.defaultProps = {\n trackedLocation: undefined,\n};\n\nReplaceMediaButton.propTypes = {\n acceptedMime: PropTypes.string.isRequired,\n onSelectMedia: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","/**\n *\n * EditAssetDialog\n *\n */\n\nimport React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Grid,\n Loader,\n Modal,\n TextInput,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport isEqual from 'lodash/isEqual';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { AssetDefinition } from '../../constants';\nimport { useEditAsset } from '../../hooks/useEditAsset';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { findRecursiveFolderByValue, getTrad, getFileExtension, formatBytes } from '../../utils';\nimport { ContextInfo } from '../ContextInfo';\nimport SelectTree from '../SelectTree';\n\nimport { DialogHeader } from './DialogHeader';\nimport { PreviewBox } from './PreviewBox';\nimport { ReplaceMediaButton } from './ReplaceMediaButton';\n\nconst LoadingBody = styled(Flex)`\n /* 80px are coming from the Tabs component that is not included in the ModalBody */\n min-height: ${() => `calc(60vh + 8rem)`};\n`;\n\nconst fileInfoSchema = yup.object({\n name: yup.string().required(),\n alternativeText: yup.string(),\n caption: yup.string(),\n folder: yup.number(),\n});\n\nexport const EditAssetContent = ({\n onClose,\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n trackedLocation,\n}) => {\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const submitButtonRef = useRef(null);\n const [isCropping, setIsCropping] = useState(false);\n const [replacementFile, setReplacementFile] = useState();\n const { editAsset, isLoading } = useEditAsset();\n\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n\n const handleSubmit = async (values) => {\n const nextAsset = { ...asset, ...values, folder: values.parent.value };\n\n if (asset.isLocal) {\n onClose(nextAsset);\n } else {\n const editedAsset = await editAsset(nextAsset, replacementFile);\n\n const assetType = asset?.mime.split('/')[0];\n // if the folder parent was the root of Media Library, its id is null\n // we know it changed location if the new parent value exists\n const didChangeLocation = asset?.folder?.id\n ? asset.folder.id !== values.parent.value\n : asset.folder === null && !!values.parent.value;\n\n trackUsage('didEditMediaLibraryElements', {\n location: trackedLocation,\n type: assetType,\n changeLocation: didChangeLocation,\n });\n\n onClose(editedAsset);\n }\n };\n\n const handleStartCropping = () => {\n setIsCropping(true);\n };\n\n const handleCancelCropping = () => {\n setIsCropping(false);\n };\n\n const handleFinishCropping = () => {\n setIsCropping(false);\n onClose();\n };\n\n const formDisabled = !canUpdate || isCropping;\n\n const handleConfirmClose = () => {\n // eslint-disable-next-line no-alert\n const confirm = window.confirm(\n formatMessage({\n id: 'window.confirm.close-modal.file',\n defaultMessage: 'Are you sure? Your changes will be lost.',\n })\n );\n\n if (confirm) {\n onClose();\n }\n };\n\n const activeFolderId = asset?.folder?.id;\n const initialFormData = !folderStructureIsLoading && {\n name: asset.name,\n alternativeText: asset.alternativeText ?? undefined,\n caption: asset.caption ?? undefined,\n parent: {\n value: activeFolderId ?? undefined,\n label:\n findRecursiveFolderByValue(folderStructure, activeFolderId)?.label ??\n folderStructure[0].label,\n },\n };\n\n const handleClose = (values) => {\n if (!isEqual(initialFormData, values)) {\n handleConfirmClose();\n } else {\n onClose();\n }\n };\n\n if (folderStructureIsLoading) {\n return (\n <>\n <DialogHeader />\n <LoadingBody minHeight=\"60vh\" justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </LoadingBody>\n <Modal.Footer>\n <Button onClick={() => handleClose()} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Footer>\n </>\n );\n }\n\n return (\n <Formik\n validationSchema={fileInfoSchema}\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialFormData}\n >\n {({ values, errors, handleChange, setFieldValue }) => (\n <>\n <DialogHeader />\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <PreviewBox\n asset={asset}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n onDelete={onClose}\n onCropFinish={handleFinishCropping}\n onCropStart={handleStartCropping}\n onCropCancel={handleCancelCropping}\n replacementFile={replacementFile}\n trackedLocation={trackedLocation}\n />\n </Grid.Item>\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Form noValidate>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={3}>\n <ContextInfo\n blocks={[\n {\n label: formatMessage({\n id: getTrad('modal.file-details.size'),\n defaultMessage: 'Size',\n }),\n value: formatBytes(asset.size),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.dimensions'),\n defaultMessage: 'Dimensions',\n }),\n value:\n asset.height && asset.width ? `${asset.width}✕${asset.height}` : null,\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.date'),\n defaultMessage: 'Date',\n }),\n value: formatDate(new Date(asset.createdAt)),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.extension'),\n defaultMessage: 'Extension',\n }),\n value: getFileExtension(asset.ext),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.file-details.id'),\n defaultMessage: 'Asset ID',\n }),\n value: asset.id,\n },\n ]}\n />\n <Field.Root name=\"name\" error={errors.name}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-name'),\n defaultMessage: 'File name',\n })}\n </Field.Label>\n <TextInput\n value={values.name}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Error />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.decription.file-alt'),\n defaultMessage: 'This text will be displayed if the asset can’t be shown.',\n })}\n error={errors.alternativeText}\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n <TextInput\n value={values.alternativeText}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n\n <Field.Root name=\"caption\" error={errors.caption}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n <TextInput\n value={values.caption}\n onChange={handleChange}\n disabled={formDisabled}\n />\n </Field.Root>\n\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Field.Root name=\"parent\" id=\"asset-folder\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n name=\"parent\"\n defaultValue={values.parent}\n options={folderStructure}\n onChange={(value) => {\n setFieldValue('parent', value);\n }}\n menuPortalTarget={document.querySelector('body')}\n inputId=\"asset-folder\"\n isDisabled={formDisabled}\n error={errors?.parent}\n ariaErrorMessage=\"folder-parent-error\"\n />\n </Field.Root>\n </Flex>\n </Flex>\n\n <VisuallyHidden>\n <button\n type=\"submit\"\n tabIndex={-1}\n ref={submitButtonRef}\n disabled={formDisabled}\n >\n {formatMessage({ id: 'submit', defaultMessage: 'Submit' })}\n </button>\n </VisuallyHidden>\n </Form>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={() => handleClose(values)} variant=\"tertiary\">\n {formatMessage({ id: 'global.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Flex gap={2}>\n <ReplaceMediaButton\n onSelectMedia={setReplacementFile}\n acceptedMime={asset.mime}\n disabled={formDisabled}\n trackedLocation={trackedLocation}\n />\n\n <Button\n onClick={() => submitButtonRef.current.click()}\n loading={isLoading}\n disabled={formDisabled}\n >\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Flex>\n </Modal.Footer>\n </>\n )}\n </Formik>\n );\n};\n\nEditAssetContent.defaultProps = {\n asset: {},\n trackedLocation: undefined,\n canUpdate: false,\n canCopyLink: false,\n canDownload: false,\n};\n\nEditAssetContent.propTypes = {\n asset: AssetDefinition,\n canUpdate: PropTypes.bool,\n canCopyLink: PropTypes.bool,\n canDownload: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nexport const EditAssetDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditAssetContent onClose={onClose} {...restProps} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nEditAssetDialog.defaultProps = {\n asset: {},\n trackedLocation: undefined,\n canUpdate: false,\n canCopyLink: false,\n canDownload: false,\n};\n\nEditAssetDialog.propTypes = {\n asset: AssetDefinition,\n canUpdate: PropTypes.bool,\n canCopyLink: PropTypes.bool,\n canDownload: PropTypes.bool,\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\nimport { BulkDeleteFiles, File } from '../../../shared/contracts/files';\nimport type { BulkDeleteFolders, Folder } from '../../../shared/contracts/folders';\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\ntype BulkRemovePayload = Partial<BulkDeleteFiles.Request['body']> &\n Partial<BulkDeleteFolders.Request['body']>;\n\nexport const useBulkRemove = () => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkRemoveQuery = (filesAndFolders: Array<FileWithType | FolderWithType>) => {\n const payload = filesAndFolders.reduce<BulkRemovePayload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-delete', payload);\n };\n\n const mutation = useMutation<\n BulkDeleteFiles.Response | BulkDeleteFolders.Response,\n BulkDeleteFiles.Response['error'] | BulkDeleteFolders.Response['error'],\n Array<FileWithType | FolderWithType>\n >(bulkRemoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n if (data?.folders?.length > 0) {\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.remove.success-label'),\n defaultMessage: 'Elements have been successfully deleted.',\n }),\n });\n },\n onError(error) {\n toggleNotification({ type: 'danger', message: error?.message });\n },\n });\n\n const remove = (...args: Parameters<typeof mutation.mutateAsync>) =>\n mutation.mutateAsync(...args);\n\n return { ...mutation, remove };\n};\n","import { useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { CreateFolders, UpdateFolder } from '../../../shared/contracts/folders';\n\nimport pluginId from '../pluginId';\n\ninterface EditFolderRequestParams {\n attrs: CreateFolders.Request['body'] | UpdateFolder.Request['body'];\n id?: UpdateFolder.Request['params']['id'];\n}\n\nconst editFolderRequest = (\n put: FetchClient['put'],\n post: FetchClient['post'],\n { attrs, id }: EditFolderRequestParams\n): Promise<UpdateFolder.Response['data'] | CreateFolders.Response['data']> => {\n const isEditing = !!id;\n const method = isEditing ? put : post;\n\n return method(`/upload/folders/${id ?? ''}`, attrs).then((res) => res.data);\n};\n\nexport const useEditFolder = () => {\n const queryClient = useQueryClient();\n const { put, post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFolder.Response['data'] | CreateFolders.Response['data'],\n UpdateFolder.Response['error'] | CreateFolders.Response['error'],\n EditFolderRequestParams\n >((...args) => editFolderRequest(put, post, ...args), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n queryClient.refetchQueries([pluginId, 'folder', 'structure'], { active: true });\n },\n });\n\n const editFolder = (\n attrs: EditFolderRequestParams['attrs'],\n id?: EditFolderRequestParams['id']\n ) => mutation.mutateAsync({ attrs, id });\n\n return { ...mutation, editFolder, status: mutation.status };\n};\n","import React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nexport const EditFolderModalHeader = ({ isEditing }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Header>\n <Modal.Title>\n {formatMessage(\n isEditing\n ? {\n id: getTrad('modal.folder.edit.title'),\n defaultMessage: 'Edit folder',\n }\n : {\n id: getTrad('modal.folder.create.title'),\n defaultMessage: 'Add new folder',\n }\n )}\n </Modal.Title>\n </Modal.Header>\n );\n};\n\nEditFolderModalHeader.defaultProps = {\n isEditing: false,\n};\n\nEditFolderModalHeader.propTypes = {\n isEditing: PropTypes.bool,\n};\n","import React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const RemoveFolderDialog = ({ onClose, onConfirm, open }) => {\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={onConfirm} />\n </Dialog.Root>\n );\n};\n\nRemoveFolderDialog.propTypes = {\n onClose: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n};\n\nexport default RemoveFolderDialog;\n","import React, { useState } from 'react';\n\nimport { useTracking, useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Grid,\n Loader,\n Modal,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { FolderDefinition } from '../../constants';\nimport { useBulkRemove } from '../../hooks/useBulkRemove';\nimport { useEditFolder } from '../../hooks/useEditFolder';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { findRecursiveFolderByValue, getTrad, getAPIInnerErrors } from '../../utils';\nimport { ContextInfo } from '../ContextInfo';\nimport SelectTree from '../SelectTree';\n\nimport { EditFolderModalHeader } from './ModalHeader';\nimport RemoveFolderDialog from './RemoveFolderDialog';\n\nconst folderSchema = yup.object({\n name: yup.string().required(),\n parent: yup\n .object({\n label: yup.string(),\n value: yup.number().nullable(true),\n })\n .nullable(true),\n});\n\nexport const EditFolderContent = ({ onClose, folder, location, parentFolderId }) => {\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n const { canCreate, isLoading: isLoadingPermissions, canUpdate } = useMediaLibraryPermissions();\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const { editFolder, isLoading: isEditFolderLoading } = useEditFolder();\n const { remove } = useBulkRemove();\n const { toggleNotification } = useNotification();\n const isLoading = isLoadingPermissions || folderStructureIsLoading;\n const isEditing = !!folder;\n const formDisabled = (folder && !canUpdate) || (!folder && !canCreate);\n const initialFormData = !folderStructureIsLoading && {\n name: folder?.name ?? '',\n parent: {\n /* ideally we would use folderStructure[0].value, but since it is null\n react complains about rendering null as field value */\n value: parentFolderId ? parseInt(parentFolderId, 10) : undefined,\n label: parentFolderId\n ? findRecursiveFolderByValue(folderStructure, parseInt(parentFolderId, 10))?.label\n : folderStructure[0].label,\n },\n };\n\n const handleSubmit = async (values, { setErrors }) => {\n try {\n await editFolder(\n {\n ...values,\n parent: values.parent.value ?? null,\n },\n folder?.id\n );\n\n toggleNotification({\n type: 'success',\n message: isEditing\n ? formatMessage({\n id: getTrad('modal.folder-notification-edited-success'),\n defaultMessage: 'Folder successfully edited',\n })\n : formatMessage({\n id: getTrad('modal.folder-notification-created-success'),\n defaultMessage: 'Folder successfully created',\n }),\n });\n\n if (isEditing) {\n const didChangeLocation = parentFolderId\n ? parseInt(parentFolderId, 10) !== values.parent.value\n : parentFolderId === null && !!values.parent.value;\n\n trackUsage('didEditMediaLibraryElements', {\n location,\n type: 'folder',\n changeLocation: didChangeLocation,\n });\n } else {\n trackUsage('didAddMediaLibraryFolders', { location });\n }\n\n onClose({ created: true });\n } catch (err) {\n const errors = getAPIInnerErrors(err, { getTrad });\n const formikErrors = Object.entries(errors).reduce((acc, [key, error]) => {\n acc[key] = error.defaultMessage;\n\n return acc;\n }, {});\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n };\n\n const handleDelete = async () => {\n await remove([folder]);\n\n setShowConfirmDialog(false);\n onClose();\n };\n\n if (isLoading) {\n return (\n <>\n <EditFolderModalHeader isEditing={isEditing} />\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 </>\n );\n }\n\n return (\n <>\n <Formik\n validationSchema={folderSchema}\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialFormData}\n >\n {({ values, errors, handleChange, setFieldValue }) => (\n <Form noValidate>\n <EditFolderModalHeader isEditing={isEditing} />\n <Modal.Body>\n <Grid.Root gap={4}>\n {isEditing && (\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <ContextInfo\n blocks={[\n {\n label: formatMessage({\n id: getTrad('modal.folder.create.elements'),\n defaultMessage: 'Elements',\n }),\n value: formatMessage(\n {\n id: getTrad('modal.folder.elements.count'),\n defaultMessage: '{folderCount} folders, {assetCount} assets',\n },\n {\n assetCount: folder?.files?.count ?? 0,\n folderCount: folder?.children?.count ?? 0,\n }\n ),\n },\n\n {\n label: formatMessage({\n id: getTrad('modal.folder.create.creation-date'),\n defaultMessage: 'Creation Date',\n }),\n value: formatDate(new Date(folder.createdAt)),\n },\n ]}\n />\n </Grid.Item>\n )}\n\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"name\" error={errors.name}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-name'),\n defaultMessage: 'Name',\n })}\n </Field.Label>\n <TextInput\n value={values.name}\n onChange={handleChange}\n disabled={formDisabled}\n />\n <Field.Error />\n </Field.Root>\n </Grid.Item>\n\n <Grid.Item xs={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-parent\">\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}\n onChange={(value) => {\n setFieldValue('parent', value);\n }}\n isDisabled={formDisabled}\n defaultValue={values.parent}\n name=\"parent\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-parent\"\n disabled={formDisabled}\n error={errors?.parent}\n ariaErrorMessage=\"folder-parent-error\"\n />\n\n {errors.parent && (\n <Typography\n variant=\"pi\"\n tag=\"p\"\n id=\"folder-parent-error\"\n textColor=\"danger600\"\n >\n {errors.parent}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={() => onClose()} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Flex gap={2}>\n {isEditing && canUpdate && (\n <Button\n type=\"button\"\n variant=\"danger-light\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"delete\"\n disabled={!canUpdate || isEditFolderLoading}\n >\n {formatMessage({\n id: getTrad('modal.folder.create.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Button>\n )}\n\n <Button\n name=\"submit\"\n loading={isEditFolderLoading}\n disabled={formDisabled}\n type=\"submit\"\n >\n {formatMessage(\n isEditing\n ? { id: getTrad('modal.folder.edit.submit'), defaultMessage: 'Save' }\n : { id: getTrad('modal.folder.create.submit'), defaultMessage: 'Create' }\n )}\n </Button>\n </Flex>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n <RemoveFolderDialog\n open={showConfirmDialog}\n onClose={() => setShowConfirmDialog(false)}\n onConfirm={handleDelete}\n />\n </>\n );\n};\n\nEditFolderContent.defaultProps = {\n folder: undefined,\n location: undefined,\n parentFolderId: null,\n};\n\nEditFolderContent.propTypes = {\n folder: FolderDefinition,\n location: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n parentFolderId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport const EditFolderDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditFolderContent {...restProps} onClose={onClose} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nEditFolderDialog.defaultProps = {\n folder: undefined,\n location: undefined,\n parentFolderId: null,\n};\n\nEditFolderDialog.propTypes = {\n folder: FolderDefinition,\n location: PropTypes.string,\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n parentFolderId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport pluginId from '../pluginId';\nimport { getTrad } from '../utils';\nimport { GetFolder } from '../../../shared/contracts/folders';\n\nexport const useFolder = (id: number, { enabled = true } = {}) => {\n const { toggleNotification } = useNotification();\n const { get } = useFetchClient();\n const { formatMessage } = useIntl();\n\n const { data, error, isLoading } = useQuery<\n GetFolder.Response['data'],\n GetFolder.Response['error']\n >(\n [pluginId, 'folder', id],\n async () => {\n const {\n data: { data },\n } = await get(`/upload/folders/${id}`, {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n },\n },\n });\n\n return data;\n },\n {\n retry: false,\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('notification.warning.404'),\n defaultMessage: 'Not found',\n }),\n });\n },\n }\n );\n\n return { data, error, isLoading };\n};\n","import React from 'react';\n\nimport {\n Box,\n Card,\n CardAction,\n CardBadge,\n CardBody,\n CardCheckbox,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n IconButton,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTrad } from '../../utils';\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Card)`\n cursor: pointer;\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\nexport const AssetCardBase = ({\n children,\n extension,\n isSelectable,\n name,\n onSelect,\n onRemove,\n onEdit,\n selected,\n subtitle,\n variant,\n}) => {\n const { formatMessage } = useIntl();\n\n /** @type {import(\"react\").MouseEventHandler<HTMLDivElement> } */\n const handleClick = (e) => {\n if (onEdit) {\n onEdit(e);\n }\n };\n\n /**\n * @type {import(\"react\").MouseEventHandler<HTMLDivElement> }\n *\n * This is required because we need to stop the propagation of the event\n * bubbling to the `CardContainer`, however the `CardCheckbox` only returns\n * the `boolean` value as opposed to the event itself.\n */\n const handlePropagationClick = (e) => {\n e.stopPropagation();\n };\n\n return (\n <CardContainer role=\"button\" height=\"100%\" tabIndex={-1} onClick={handleClick}>\n <CardHeader>\n {isSelectable && (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div onClick={handlePropagationClick}>\n <CardCheckbox checked={selected} onCheckedChange={onSelect} />\n </div>\n )}\n {(onRemove || onEdit) && (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n {onRemove && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n onClick={onRemove}\n >\n <Trash />\n </IconButton>\n )}\n\n {onEdit && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n onClick={onEdit}\n >\n <Pencil />\n </IconButton>\n )}\n </CardActionsContainer>\n )}\n {children}\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <CardTitle tag=\"h2\">{name}</CardTitle>\n </Box>\n <CardSubtitle>\n <Extension>{extension}</Extension>\n {subtitle}\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>\n {formatMessage({\n id: getTrad(`settings.section.${variant.toLowerCase()}.label`),\n defaultMessage: variant,\n })}\n </CardBadge>\n </Flex>\n </CardBody>\n </CardContainer>\n );\n};\n\nAssetCardBase.defaultProps = {\n children: undefined,\n isSelectable: true,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n selected: false,\n subtitle: '',\n variant: 'Image',\n};\n\nAssetCardBase.propTypes = {\n children: PropTypes.node,\n extension: PropTypes.string.isRequired,\n isSelectable: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n selected: PropTypes.bool,\n subtitle: PropTypes.string,\n variant: PropTypes.oneOf(['Image', 'Video', 'Audio', 'Doc']),\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const AudioPreview = ({ url, alt }) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n\nAudioPreview.defaultProps = {};\n\nAudioPreview.propTypes = {\n alt: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Box, CardAsset } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase } from './AssetCardBase';\nimport { AudioPreview } from './AudioPreview';\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\nexport const AudioAssetCard = ({ name, url, size, ...restProps }) => {\n return (\n <AssetCardBase name={name} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </CardAsset>\n </AssetCardBase>\n );\n};\n\nAudioAssetCard.defaultProps = {\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n selected: false,\n size: 'M',\n};\n\nAudioAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n url: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase } from './AssetCardBase';\n\nconst IconWrapper = styled.span`\n svg {\n font-size: 4.8rem;\n }\n`;\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nexport const DocAssetCard = ({ name, extension, size, ...restProps }) => {\n return (\n <AssetCardBase name={name} extension={extension} {...restProps} variant=\"Doc\">\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <IconWrapper>\n {extension === 'pdf' ? <FilePdf aria-label={name} /> : <File aria-label={name} />}\n </IconWrapper>\n </CardAsset>\n </AssetCardBase>\n );\n};\n\nDocAssetCard.defaultProps = {\n selected: false,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n size: 'M',\n};\n\nDocAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n selected: PropTypes.bool,\n name: PropTypes.string.isRequired,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport { CardAsset } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase } from './AssetCardBase';\n\nexport const ImageAssetCard = ({ height, width, thumbnail, size, alt, isUrlSigned, ...props }) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n\n return (\n <AssetCardBase {...props} subtitle={height && width && ` - ${width}✕${height}`} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n\nImageAssetCard.defaultProps = {\n height: undefined,\n width: undefined,\n selected: false,\n onEdit: undefined,\n onSelect: undefined,\n onRemove: undefined,\n size: 'M',\n updatedAt: undefined,\n};\n\nImageAssetCard.propTypes = {\n alt: PropTypes.string.isRequired,\n extension: PropTypes.string.isRequired,\n height: PropTypes.number,\n name: PropTypes.string.isRequired,\n onEdit: PropTypes.func,\n onSelect: PropTypes.func,\n onRemove: PropTypes.func,\n width: PropTypes.number,\n thumbnail: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n updatedAt: PropTypes.string,\n isUrlSigned: PropTypes.bool.isRequired,\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\nexport const VideoPreview = ({ url, mime, onLoadDuration, alt, ...props }) => {\n const handleTimeUpdate = (e) => {\n if (e.target.currentTime > 0) {\n const video = e.target;\n const canvas = document.createElement('canvas');\n\n canvas.height = video.videoHeight;\n canvas.width = video.videoWidth;\n canvas.getContext('2d').drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n\n video.replaceWith(canvas);\n onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e) => {\n const video = e.target;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" {...props} key={url}>\n <video\n muted\n onLoadedData={handleThumbnailVisibility}\n src={url}\n crossOrigin=\"anonymous\"\n onTimeUpdate={handleTimeUpdate}\n >\n <source type={mime} />\n </video>\n <VisuallyHidden tag=\"figcaption\">{alt}</VisuallyHidden>\n </Box>\n );\n};\n\nVideoPreview.defaultProps = {\n onLoadDuration() {},\n size: 'M',\n};\n\nVideoPreview.propTypes = {\n alt: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n mime: PropTypes.string.isRequired,\n onLoadDuration: PropTypes.func,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React, { useState } from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase } from './AssetCardBase';\nimport { VideoPreview } from './VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n display: block;\n pointer-events: none;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\nexport const VideoAssetCard = ({ name, url, mime, size, ...props }) => {\n const [duration, setDuration] = useState();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase name={name} {...props} variant=\"Video\">\n <CardAsset size={size}>\n <VideoPreviewWrapper size={size}>\n <VideoPreview url={url} mime={mime} onLoadDuration={setDuration} alt={name} />\n </VideoPreviewWrapper>\n </CardAsset>\n <CardTimer>{formattedDuration || '...'}</CardTimer>\n </AssetCardBase>\n );\n};\n\nVideoAssetCard.defaultProps = {\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n selected: false,\n size: 'M',\n};\n\nVideoAssetCard.propTypes = {\n extension: PropTypes.string.isRequired,\n mime: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n url: PropTypes.string.isRequired,\n selected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport { AssetDefinition, AssetType } from '../../constants';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nexport const AssetCard = ({ asset, isSelected, onSelect, onEdit, onRemove, size, local }) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext),\n key: asset.id,\n name: asset.name,\n url: local ? asset.url : createAssetUrl(asset, true),\n mime: asset.mime,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n };\n\n if (asset.mime.includes(AssetType.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime.includes(AssetType.Image)) {\n return (\n <ImageAssetCard\n {...commonAssetCardProps}\n alt={asset.alternativeText || asset.name}\n height={asset.height}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)}\n width={asset.width}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n />\n );\n }\n\n if (asset.mime.includes(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n\nAssetCard.defaultProps = {\n isSelected: false,\n // Determine if the asset is loaded locally or from a remote resource\n local: false,\n onSelect: undefined,\n onEdit: undefined,\n onRemove: undefined,\n size: 'M',\n};\n\nAssetCard.propTypes = {\n asset: AssetDefinition.isRequired,\n local: PropTypes.bool,\n onSelect: PropTypes.func,\n onEdit: PropTypes.func,\n onRemove: PropTypes.func,\n isSelected: PropTypes.bool,\n size: PropTypes.oneOf(['S', 'M']),\n};\n","import React, { useRef } from 'react';\n\nimport PropTypes from 'prop-types';\nimport { useDrag, useDrop } from 'react-dnd';\n\nexport const Draggable = ({ children, id, index, moveItem }) => {\n const ref = useRef(null);\n\n const [, drop] = useDrop({\n accept: 'draggable',\n hover(hoveredOverItem) {\n if (!ref.current) {\n return;\n }\n\n if (hoveredOverItem.id !== id) {\n moveItem(hoveredOverItem.index, index);\n\n hoveredOverItem.index = index;\n }\n },\n });\n\n const [{ isDragging }, drag] = useDrag({\n type: 'draggable',\n item() {\n return { index, id };\n },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n const opacity = isDragging ? 0.2 : 1;\n\n drag(drop(ref));\n\n return (\n <div ref={ref} style={{ opacity, cursor: 'move' }}>\n {children}\n </div>\n );\n};\n\nDraggable.propTypes = {\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n index: PropTypes.number.isRequired,\n children: PropTypes.node.isRequired,\n moveItem: PropTypes.func.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { AssetCard } from '../AssetCard/AssetCard';\n\nimport { Draggable } from './Draggable';\n\nexport const AssetGridList = ({\n allowedTypes,\n assets,\n onEditAsset,\n onSelectAsset,\n selectedAssets,\n size,\n onReorderAsset,\n title,\n}) => {\n return (\n <KeyboardNavigable tagName=\"article\">\n {title && (\n <Box paddingTop={2} paddingBottom={2}>\n <Typography tag=\"h2\" variant=\"delta\" fontWeight=\"semiBold\">\n {title}\n </Typography>\n </Box>\n )}\n\n <Grid.Root gap={4}>\n {assets.map((asset, index) => {\n const isSelected = !!selectedAssets.find((currentAsset) => currentAsset.id === asset.id);\n\n if (onReorderAsset) {\n return (\n <Grid.Item key={asset.id} col={3} height=\"100%\">\n <Draggable index={index} moveItem={onReorderAsset} id={asset.id}>\n <AssetCard\n allowedTypes={allowedTypes}\n asset={asset}\n isSelected={isSelected}\n onEdit={onEditAsset ? () => onEditAsset(asset) : undefined}\n onSelect={() => onSelectAsset(asset)}\n size={size}\n />\n </Draggable>\n </Grid.Item>\n );\n }\n\n return (\n <Grid.Item col={3} key={asset.id} height=\"100%\" direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n key={asset.id}\n allowedTypes={allowedTypes}\n asset={asset}\n isSelected={isSelected}\n onEdit={onEditAsset ? () => onEditAsset(asset) : undefined}\n onSelect={() => onSelectAsset(asset)}\n size={size}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </KeyboardNavigable>\n );\n};\n\nAssetGridList.defaultProps = {\n allowedTypes: ['images', 'files', 'videos', 'audios'],\n onEditAsset: undefined,\n size: 'M',\n onReorderAsset: undefined,\n title: null,\n};\n\nAssetGridList.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n assets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n onEditAsset: PropTypes.func,\n onSelectAsset: PropTypes.func.isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n size: PropTypes.oneOf(['S', 'M']),\n onReorderAsset: PropTypes.func,\n title: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\nexport const CrumbSimpleMenuAsync = ({ parentsToOmit, currentFolderId, onChangeFolder }) => {\n const [shouldFetch, setShouldFetch] = useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) => !parentsToOmit.includes(ascendant.id) && ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(ascendant.id, ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder: ascendant?.id,\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem isLink tag={NavLink} to={url} key={ascendant.id}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n\nCrumbSimpleMenuAsync.defaultProps = {\n currentFolderId: undefined,\n onChangeFolder: undefined,\n parentsToOmit: [],\n};\n\nCrumbSimpleMenuAsync.propTypes = {\n currentFolderId: PropTypes.number,\n onChangeFolder: PropTypes.func,\n parentsToOmit: PropTypes.arrayOf(PropTypes.number),\n};\n","import React from 'react';\n\nimport { Breadcrumbs as BaseBreadcrumbs, Crumb, CrumbLink } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { BreadcrumbsDefinition } from '../../constants';\n\nimport { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync';\n\nexport const Breadcrumbs = ({ breadcrumbs, onChangeFolder, currentFolderId, ...props }) => {\n const { formatMessage } = useIntl();\n\n return (\n <BaseBreadcrumbs {...props}>\n {breadcrumbs.map((crumb, index) => {\n if (Array.isArray(crumb)) {\n return (\n <CrumbSimpleMenuAsync\n parentsToOmit={[...breadcrumbs]\n .splice(index + 1, breadcrumbs.length - 1)\n .map((parent) => parent.id)}\n key={`breadcrumb-${crumb?.id ?? 'menu'}`}\n currentFolderId={currentFolderId}\n onChangeFolder={onChangeFolder}\n />\n );\n }\n\n const isCurrentFolderMediaLibrary = crumb.id === null && currentFolderId === undefined;\n\n if (currentFolderId !== crumb.id && !isCurrentFolderMediaLibrary) {\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n tag={onChangeFolder ? 'button' : NavLink}\n type={onChangeFolder && 'button'}\n to={onChangeFolder ? undefined : crumb.href}\n onClick={onChangeFolder && (() => onChangeFolder(crumb.id, crumb.path))}\n >\n {crumb.label?.id ? formatMessage(crumb.label) : crumb.label}\n </CrumbLink>\n );\n }\n\n return (\n <Crumb\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n isCurrent={index + 1 === breadcrumbs.length}\n >\n {crumb.label?.id ? formatMessage(crumb.label) : crumb.label}\n </Crumb>\n );\n })}\n </BaseBreadcrumbs>\n );\n};\n\nBreadcrumbs.defaultProps = {\n currentFolderId: undefined,\n onChangeFolder: undefined,\n};\n\nBreadcrumbs.propTypes = {\n breadcrumbs: BreadcrumbsDefinition.isRequired,\n currentFolderId: PropTypes.number,\n onChangeFolder: PropTypes.func,\n};\n","import React from 'react';\n\nimport { Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nconst EmptyAssetCard = styled(Box)`\n background: linear-gradient(\n 180deg,\n rgba(234, 234, 239, 0) 0%,\n ${({ theme }) => theme.colors.neutral200} 100%\n );\n opacity: 0.33;\n`;\n\nconst PlaceholderSize = {\n S: 138,\n M: 234,\n};\n\nexport const EmptyAssetGrid = ({ count, size }) => {\n return (\n <Layouts.Grid size={size}>\n {Array(count)\n .fill(null)\n .map((_, idx) => (\n <EmptyAssetCard\n // eslint-disable-next-line react/no-array-index-key\n key={`empty-asset-card-${idx}`}\n height={`${PlaceholderSize[size]}px`}\n hasRadius\n />\n ))}\n </Layouts.Grid>\n );\n};\n\nEmptyAssetGrid.propTypes = {\n count: PropTypes.number.isRequired,\n size: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport PropTypes from 'prop-types';\n\nimport { EmptyAssetGrid } from './EmptyAssetGrid';\n\nexport const EmptyAssets = ({ icon: Icon = EmptyDocuments, content, action, size, count }) => {\n return (\n <Box position=\"relative\">\n <EmptyAssetGrid size={size} count={count} />\n\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"center\" gap={4} textAlign=\"center\">\n <Flex direction=\"column\" alignItems=\"center\" gap={6}>\n <Icon width=\"160px\" height=\"88px\" />\n\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {content}\n </Typography>\n </Flex>\n\n {action}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nEmptyAssets.defaultProps = {\n action: undefined,\n icon: undefined,\n size: 'M',\n count: 12,\n};\n\nEmptyAssets.propTypes = {\n action: PropTypes.node,\n icon: PropTypes.elementType,\n content: PropTypes.string.isRequired,\n size: PropTypes.string,\n count: PropTypes.number,\n};\n","import { createContext, useContext } from 'react';\n\nexport const FolderCardContext = createContext({});\n\nexport function useFolderCard() {\n return useContext(FolderCardContext);\n}\n","import { useRef } from 'react';\n\nlet id = 0;\n\nconst genId = () => ++id;\n\nconst useId = (initialId) => {\n const idRef = useRef(`${initialId}-${genId()}`);\n\n return idRef.current;\n};\n\nexport default useId;\n","import React, { forwardRef, useMemo } from 'react';\n\nimport { Box, CardAction, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { FolderCardContext } from '../contexts/FolderCard';\nimport useId from '../hooks/useId';\n\nconst FauxClickWrapper = styled.button`\n height: 100%;\n left: 0;\n position: absolute;\n opacity: 0;\n top: 0;\n width: 100%;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n`;\n\nconst StyledFolder = styled(Folder)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CardActionDisplay = styled(Box)`\n display: none;\n`;\n\nconst Card = styled(Box)`\n &:hover,\n &:focus-within {\n ${CardActionDisplay} {\n display: ${({ $isCardActions }) => ($isCardActions ? 'block' : '')};\n }\n }\n`;\n\nexport const FolderCard = forwardRef(\n ({ children, id, startAction, cardActions, ariaLabel, onClick, to, ...props }, ref) => {\n const generatedId = useId(id);\n const fodlerCtxValue = useMemo(() => ({ id: generatedId }), [generatedId]);\n\n return (\n <FolderCardContext.Provider value={fodlerCtxValue}>\n <Card position=\"relative\" tabIndex={0} $isCardActions={!!cardActions} ref={ref} {...props}>\n <FauxClickWrapper\n to={to || undefined}\n tag={to ? NavLink : 'button'}\n type={to ? undefined : 'button'}\n onClick={onClick}\n tabIndex={-1}\n aria-label={ariaLabel}\n aria-hidden\n />\n\n <Flex\n hasRadius\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor=\"neutral150\"\n background=\"neutral0\"\n shadow=\"tableShadow\"\n padding={3}\n gap={2}\n cursor=\"pointer\"\n >\n {startAction}\n\n <Box\n hasRadius\n background=\"secondary100\"\n color=\"secondary500\"\n paddingBottom={2}\n paddingLeft={3}\n paddingRight={3}\n paddingTop={2}\n >\n <StyledFolder width=\"2.4rem\" height=\"2.4rem\" />\n </Box>\n\n {children}\n\n <CardActionDisplay>\n <CardAction right={4}>{cardActions}</CardAction>\n </CardActionDisplay>\n </Flex>\n </Card>\n </FolderCardContext.Provider>\n );\n }\n);\n\nFolderCard.defaultProps = {\n id: undefined,\n cardActions: null,\n startAction: null,\n to: undefined,\n onClick: undefined,\n};\n\nFolderCard.propTypes = {\n ariaLabel: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n id: PropTypes.string,\n onClick: PropTypes.func,\n startAction: PropTypes.element,\n cardActions: PropTypes.element,\n to: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nconst StyledBox = styled(Flex)`\n user-select: none;\n`;\n\nexport const FolderCardBody = (props) => {\n const { id } = useFolderCard();\n\n return (\n <StyledBox\n {...props}\n id={`${id}-title`}\n alignItems=\"flex-start\"\n direction=\"column\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n position=\"relative\"\n />\n );\n};\n","import React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nconst BoxOutline = styled(Box)`\n &:focus {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst BoxTextDecoration = styled(BoxOutline)`\n text-decoration: none;\n`;\n\nexport const FolderCardBodyAction = ({ to, ...props }) => {\n if (to) {\n return (\n <BoxTextDecoration\n // padding needed to give outline space to appear\n // since FolderCardBody needs overflow hidden property\n padding={1}\n tag={NavLink}\n maxWidth=\"100%\"\n to={to}\n {...props}\n />\n );\n }\n\n return <BoxOutline padding={1} tag=\"button\" type=\"button\" maxWidth=\"100%\" {...props} />;\n};\n\nFolderCardBodyAction.defaultProps = {\n to: undefined,\n};\n\nFolderCardBodyAction.propTypes = {\n to: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nexport const FolderGridList = ({ title, children }) => {\n return (\n <KeyboardNavigable tagName=\"article\">\n {title && (\n <Box paddingBottom={2}>\n <Typography tag=\"h2\" variant=\"delta\" fontWeight=\"semiBold\">\n {title}\n </Typography>\n </Box>\n )}\n\n <Grid.Root gap={4}>{children}</Grid.Root>\n </KeyboardNavigable>\n );\n};\n\nFolderGridList.defaultProps = {\n title: null,\n};\n\nFolderGridList.propTypes = {\n children: PropTypes.node.isRequired,\n title: PropTypes.string,\n};\n","import React from 'react';\n\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { sortOptions } from '../../constants';\nimport { getTrad } from '../../utils';\n\nconst SortPicker = ({ onChangeSort, value }) => {\n const { formatMessage } = useIntl();\n\n return (\n <SingleSelect\n size=\"S\"\n value={value}\n onChange={(value) => onChangeSort(value)}\n aria-label={formatMessage({\n id: getTrad('sort.label'),\n defaultMessage: 'Sort by',\n })}\n placeholder={formatMessage({\n id: getTrad('sort.label'),\n defaultMessage: 'Sort by',\n })}\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption key={filter.key} value={filter.value}>\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n};\n\nSortPicker.defaultProps = {\n value: undefined,\n};\n\nSortPicker.propTypes = {\n onChangeSort: PropTypes.func.isRequired,\n value: PropTypes.string,\n};\n\nexport default SortPicker;\n","import React from 'react';\n\nimport { Avatar, Box, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\nimport { VideoPreview } from '../AssetCard/VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n figure {\n width: ${({ theme }) => theme.spaces[7]};\n height: ${({ theme }) => theme.spaces[7]};\n }\n\n canvas,\n video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n }\n`;\n\nexport const PreviewCell = ({ type, content }) => {\n if (type === 'folder') {\n return (\n <Flex\n justifyContent=\"center\"\n background=\"secondary100\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n borderRadius=\"50%\"\n >\n <Folder fill=\"secondary500\" width=\"1.6rem\" height=\"1.6rem\" />\n </Flex>\n );\n }\n\n const { alternativeText, ext, formats, mime, name, url } = content;\n\n if (mime.includes(AssetType.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n return <Avatar.Item src={mediaURL} alt={alternativeText} preview />;\n }\n\n if (mime.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper>\n <VideoPreview\n url={createAssetUrl(content, true)}\n mime={mime}\n alt={alternativeText ?? name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n return (\n <Box background=\"secondary100\" color=\"secondary600\" width=\"3.2rem\" height=\"3.2rem\">\n {getFileExtension(ext)}\n </Box>\n );\n};\n\nPreviewCell.propTypes = {\n content: PropTypes.shape({\n alternativeText: PropTypes.string,\n ext: PropTypes.string,\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n mime: PropTypes.string,\n name: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n type: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Typography } from '@strapi/design-system';\nimport parseISO from 'date-fns/parseISO';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { formatBytes, getFileExtension } from '../../utils';\n\nimport { PreviewCell } from './PreviewCell';\n\nexport const CellContent = ({ cellType, contentType, content, name }) => {\n const { formatDate, formatMessage } = useIntl();\n\n switch (cellType) {\n case 'image':\n return <PreviewCell type={contentType} content={content} />;\n\n case 'date':\n return <Typography>{formatDate(parseISO(content[name]), { dateStyle: 'full' })}</Typography>;\n\n case 'size':\n if (contentType === 'folder')\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n\n return <Typography>{formatBytes(content[name])}</Typography>;\n\n case 'ext':\n if (contentType === 'folder')\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n\n return <Typography>{getFileExtension(content[name]).toUpperCase()}</Typography>;\n\n case 'text':\n return <Typography>{content[name]}</Typography>;\n\n default:\n return (\n <Typography\n aria-label={formatMessage({\n id: 'list.table.content.empty-label',\n defaultMessage: 'This field is empty',\n })}\n >\n -\n </Typography>\n );\n }\n};\n\nCellContent.propTypes = {\n cellType: PropTypes.string.isRequired,\n contentType: PropTypes.string.isRequired,\n content: PropTypes.shape({\n alternativeText: PropTypes.string,\n ext: PropTypes.string,\n formats: PropTypes.shape({\n thumbnail: PropTypes.shape({\n url: PropTypes.string,\n }),\n }),\n mime: PropTypes.string,\n url: PropTypes.string,\n }).isRequired,\n name: PropTypes.string.isRequired,\n};\n","import React from 'react';\n\nimport { Checkbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system';\nimport { Eye, Pencil } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { AssetDefinition, FolderDefinition, tableHeaders as cells } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { CellContent } from './CellContent';\n\nexport const TableRows = ({\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectOne,\n rows,\n selected,\n}) => {\n const { formatMessage } = useIntl();\n\n const handleRowClickFn = (element, elementType, id, path) => {\n if (elementType === 'asset') {\n onEditAsset(element);\n } else {\n onChangeFolder(id, path);\n }\n };\n\n return (\n <Tbody>\n {rows.map((element) => {\n const { path, id, isSelectable, name, folderURL, type: contentType } = element;\n\n const isSelected = !!selected.find(\n (currentRow) => currentRow.id === id && currentRow.type === contentType\n );\n\n return (\n <Tr key={id} onClick={() => handleRowClickFn(element, contentType, id, path)}>\n <Td onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: contentType === 'asset' ? 'list-assets-select' : 'list.folder.select',\n defaultMessage:\n contentType === 'asset' ? 'Select {name} asset' : 'Select {name} folder',\n },\n { name }\n )}\n disabled={!isSelectable}\n onCheckedChange={() => onSelectOne(element)}\n checked={isSelected}\n />\n </Td>\n {cells.map(({ name, type: cellType }) => {\n return (\n <Td key={name}>\n <CellContent\n content={element}\n cellType={cellType}\n contentType={contentType}\n name={name}\n />\n </Td>\n );\n })}\n\n <Td onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"flex-end\">\n {contentType === 'folder' && (\n <IconButton\n tag={folderURL ? Link : 'button'}\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n to={folderURL}\n onClick={() => !folderURL && onChangeFolder(id)}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n )}\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.edit'),\n defaultMessage: 'Edit',\n })}\n onClick={() =>\n contentType === 'asset' ? onEditAsset(element) : onEditFolder(element)\n }\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n );\n};\n\nTableRows.defaultProps = {\n onChangeFolder: null,\n rows: [],\n selected: [],\n};\n\nTableRows.propTypes = {\n onChangeFolder: PropTypes.func,\n onEditAsset: PropTypes.func.isRequired,\n onEditFolder: PropTypes.func.isRequired,\n onSelectOne: PropTypes.func.isRequired,\n rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n};\n","import React from 'react';\n\nimport {\n Checkbox,\n IconButton,\n Table,\n Th,\n Thead,\n Tooltip,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { CaretDown, CaretUp } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition, FolderDefinition, tableHeaders } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { TableRows } from './TableRows';\n\nexport const TableList = ({\n assetCount,\n folderCount,\n indeterminate,\n onChangeSort,\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectAll,\n onSelectOne,\n rows,\n selected,\n shouldDisableBulkSelect,\n sortQuery,\n}) => {\n const { formatMessage } = useIntl();\n const [sortBy, sortOrder] = sortQuery.split(':');\n\n const handleClickSort = (isSorted, name) => {\n const nextSortOrder = isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC';\n const nextSort = `${name}:${nextSortOrder}`;\n\n onChangeSort(nextSort);\n };\n\n return (\n <Table colCount={tableHeaders.length + 2} rowCount={assetCount + folderCount + 1}>\n <Thead>\n <Tr>\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n disabled={shouldDisableBulkSelect}\n onCheckedChange={(checked) => onSelectAll(checked, rows)}\n checked={\n indeterminate && !shouldDisableBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n />\n </Th>\n {tableHeaders.map(({ metadatas: { label, isSortable }, name, key }) => {\n const isSorted = sortBy === name;\n const isUp = sortOrder === 'ASC';\n const tableHeaderLabel = formatMessage(label);\n const sortLabel = formatMessage(\n { id: 'list.table.header.sort', defaultMessage: 'Sort on {label}' },\n { label: tableHeaderLabel }\n );\n\n return (\n <Th\n action={\n isSorted && (\n <IconButton\n label={sortLabel}\n onClick={() => handleClickSort(isSorted, name)}\n variant=\"ghost\"\n >\n {isUp ? <CaretUp /> : <CaretDown />}\n </IconButton>\n )\n }\n key={key}\n >\n <Tooltip label={isSortable ? sortLabel : tableHeaderLabel}>\n {isSortable ? (\n <Typography\n onClick={() => handleClickSort(isSorted, name)}\n tag={isSorted ? 'span' : 'button'}\n label={!isSorted ? sortLabel : ''}\n textColor=\"neutral600\"\n variant=\"sigma\"\n >\n {tableHeaderLabel}\n </Typography>\n ) : (\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n )}\n </Tooltip>\n </Th>\n );\n })}\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTrad('list.table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <TableRows\n onChangeFolder={onChangeFolder}\n onEditAsset={onEditAsset}\n onEditFolder={onEditFolder}\n rows={rows}\n onSelectOne={onSelectOne}\n selected={selected}\n />\n </Table>\n );\n};\n\nTableList.defaultProps = {\n assetCount: 0,\n folderCount: 0,\n indeterminate: false,\n onChangeSort: null,\n onChangeFolder: null,\n onEditAsset: null,\n onEditFolder: null,\n rows: [],\n selected: [],\n shouldDisableBulkSelect: false,\n sortQuery: '',\n};\n\nTableList.propTypes = {\n assetCount: PropTypes.number,\n folderCount: PropTypes.number,\n indeterminate: PropTypes.bool,\n onChangeSort: PropTypes.func,\n onChangeFolder: PropTypes.func,\n onEditAsset: PropTypes.func,\n onEditFolder: PropTypes.func,\n onSelectAll: PropTypes.func.isRequired,\n onSelectOne: PropTypes.func.isRequired,\n rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n selected: PropTypes.arrayOf(AssetDefinition, FolderDefinition),\n shouldDisableBulkSelect: PropTypes.bool,\n sortQuery: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Tag } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst FilterTag = ({ attribute, filter, onClick, operator, value }) => {\n const { formatMessage, formatDate, formatTime } = useIntl();\n\n const handleClick = () => {\n onClick(filter);\n };\n\n const { fieldSchema } = attribute;\n\n const type = fieldSchema.type;\n\n let formattedValue = value;\n\n if (type === 'date') {\n formattedValue = formatDate(value, { dateStyle: 'full' });\n }\n\n if (type === 'datetime') {\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n }\n\n if (type === 'time') {\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(hour);\n date.setMinutes(minute);\n\n formattedValue = formatTime(date, {\n numeric: 'auto',\n style: 'short',\n });\n }\n\n const content = `${attribute.metadatas.label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${formattedValue}`;\n\n return (\n <Tag onClick={handleClick} icon={<Cross />} padding={1}>\n {content}\n </Tag>\n );\n};\n\nFilterTag.propTypes = {\n attribute: PropTypes.shape({\n name: PropTypes.string.isRequired,\n fieldSchema: PropTypes.object.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string.isRequired }).isRequired,\n }).isRequired,\n filter: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n operator: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n};\n\nexport default FilterTag;\n","/**\n *\n * FilterList\n *\n */\n\nimport React from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport FilterTag from './FilterTag';\n\nconst FilterList = ({ appliedFilters, filtersSchema, onRemoveFilter }) => {\n const handleClick = (filter) => {\n const nextFilters = appliedFilters.filter((prevFilter) => {\n const name = Object.keys(filter)[0];\n const filterType = Object.keys(filter[name])[0];\n const value = decodeURIComponent(filter[name][filterType]);\n\n return prevFilter[name]?.[filterType] !== value;\n });\n\n onRemoveFilter(nextFilters);\n };\n\n return appliedFilters.map((filter, i) => {\n const attributeName = Object.keys(filter)[0];\n const attribute = filtersSchema.find(({ name }) => name === attributeName);\n\n const filterObj = filter[attributeName];\n const operator = Object.keys(filterObj)[0];\n let value = filterObj[operator];\n\n if (Array.isArray(value)) {\n value = value.join(', ');\n } else if (typeof value === 'object') {\n value = Object.values(value).join(', ');\n } else {\n value =\n Array.isArray(value) || typeof value === 'object'\n ? Object.values(value).join(', ')\n : decodeURIComponent(value);\n }\n\n let displayedOperator = operator;\n\n if (attribute.name === 'mime') {\n displayedOperator = operator === '$contains' ? '$eq' : '$ne';\n\n // Type is file\n // The filter for the file is the following: { mime: {$not: {$contains: ['image', 'video']}}}\n if (operator === '$not') {\n value = 'file';\n displayedOperator = '$eq';\n }\n\n // Here the type is file and the filter is not file\n // { mime: {$contains: ['image', 'video'] }}\n if (['image', 'video'].includes(value[0]) && ['image', 'video'].includes(value[1])) {\n value = 'file';\n displayedOperator = '$ne';\n }\n }\n\n return (\n <FilterTag\n // eslint-disable-next-line react/no-array-index-key\n key={`${attributeName}-${i}`}\n attribute={attribute}\n filter={filter}\n onClick={handleClick}\n operator={displayedOperator}\n value={value}\n />\n );\n });\n};\n\nFilterList.defaultProps = {\n filtersSchema: [],\n};\n\nFilterList.propTypes = {\n appliedFilters: PropTypes.array.isRequired,\n filtersSchema: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string }),\n fieldSchema: PropTypes.shape({\n type: PropTypes.string,\n mainField: PropTypes.shape({\n name: PropTypes.string,\n type: PropTypes.string,\n }),\n }),\n })\n ),\n onRemoveFilter: PropTypes.func.isRequired,\n};\n\nexport default FilterList;\n","import React from 'react';\n\nimport { DateTimePicker, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst FilterValueInput = ({ label, onChange, options, type, value }) => {\n const { formatMessage } = useIntl();\n\n if (type === 'date') {\n return (\n <DateTimePicker\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n ariaLabel={label}\n name=\"datetimepicker\"\n onChange={(date) => {\n const formattedDate = date ? new Date(date).toISOString() : '';\n\n onChange(formattedDate);\n }}\n onClear={() => onChange('')}\n value={value ? new Date(value) : undefined}\n selectedDateLabel={(formattedDate) => `Date picker, current is ${formattedDate}`}\n selectButtonTitle={formatMessage({ id: 'selectButtonTitle', defaultMessage: 'Select' })}\n />\n );\n }\n\n return (\n <SingleSelect aria-label={label} onChange={onChange} value={value}>\n {options.map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {option.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n );\n};\n\nFilterValueInput.defaultProps = {\n label: '',\n options: [],\n value: '',\n};\n\nFilterValueInput.propTypes = {\n label: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n options: PropTypes.arrayOf(\n PropTypes.shape({ label: PropTypes.string.isRequired, value: PropTypes.string.isRequired })\n ),\n type: PropTypes.string.isRequired,\n value: PropTypes.any,\n};\n\nexport default FilterValueInput;\n","/**\n * Depending on the selected field find the possible filters to apply\n * @param {Object} fieldSchema.type the type of the filter\n * @returns {Object[]}\n */\nconst getFilterList = ({ fieldSchema: { type: fieldType, mainField } }) => {\n const type = mainField?.schema.type ? mainField.schema.type : fieldType;\n\n switch (type) {\n case 'enumeration': {\n return [\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n },\n value: '$contains',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n },\n value: '$notContains',\n },\n ];\n }\n\n case 'date': {\n return [\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$eq', defaultMessage: 'is' },\n value: '$eq',\n },\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$ne', defaultMessage: 'is not' },\n value: '$ne',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$gt',\n defaultMessage: 'is greater than',\n },\n value: '$gt',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$gte',\n defaultMessage: 'is greater than or equal to',\n },\n value: '$gte',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$lt',\n defaultMessage: 'is less than',\n },\n value: '$lt',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$lte',\n defaultMessage: 'is less than or equal to',\n },\n value: '$lte',\n },\n ];\n }\n\n default:\n return [\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$eq', defaultMessage: 'is' },\n value: '$eq',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$eqi',\n defaultMessage: 'is (case insensitive)',\n },\n value: '$eqi',\n },\n {\n intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$ne', defaultMessage: 'is not' },\n value: '$ne',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$null',\n defaultMessage: 'is null',\n },\n value: '$null',\n },\n {\n intlLabel: {\n id: 'components.FilterOptions.FILTER_TYPES.$notNull',\n defaultMessage: 'is not null',\n },\n value: '$notNull',\n },\n ];\n }\n};\n\nexport default getFilterList;\n","/**\n *\n * FilterPopover\n *\n */\n\nimport React, { useState } from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport FilterValueInput from './FilterValueInput';\nimport getFilterList from './utils/getFilterList';\n\nconst FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle }) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options[0].value;\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value, filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator, value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator, value: '' }));\n }\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return filter.mime?.$not?.$contains !== undefined;\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n return filter.mime[modifiedData.filter] === modifiedData.value;\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (filter.mime?.$not?.$contains !== undefined) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n let filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n return (\n filter[modifiedData.name] &&\n filter[modifiedData.name]?.[modifiedData.filter] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n let filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter.metadatas}\n {...appliedFilter.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n\nFilterPopover.propTypes = {\n displayedFilters: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string.isRequired,\n metadatas: PropTypes.shape({ label: PropTypes.string }),\n fieldSchema: PropTypes.shape({ type: PropTypes.string }),\n })\n ).isRequired,\n filters: PropTypes.array.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onToggle: PropTypes.func.isRequired,\n};\n\nexport default FilterPopover;\n","import * as React from 'react';\n\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { displayedFilters } from '../../../utils';\nimport FilterList from '../../FilterList';\nimport FilterPopover from '../../FilterPopover';\n\nexport const Filters = ({ appliedFilters, onChangeFilters }) => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n onToggle={setOpen}\n displayedFilters={displayedFilters}\n filters={appliedFilters}\n onSubmit={onChangeFilters}\n />\n\n {appliedFilters && (\n <FilterList\n appliedFilters={appliedFilters}\n filtersSchema={displayedFilters}\n onRemoveFilter={onChangeFilters}\n />\n )}\n </Popover.Root>\n );\n};\n\nFilters.propTypes = {\n appliedFilters: PropTypes.array.isRequired,\n onChangeFilters: PropTypes.func.isRequired,\n};\n","/**\n *\n * PageSize\n *\n */\n\nimport React from 'react';\n\nimport { Box, Flex, SingleSelectOption, SingleSelect, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst PageSize = ({ onChangePageSize, pageSize }) => {\n const { formatMessage } = useIntl();\n\n const handleChange = (value) => {\n onChangePageSize(value);\n };\n\n return (\n <Flex>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n onChange={handleChange}\n value={pageSize.toString()}\n >\n <SingleSelectOption value=\"10\">10</SingleSelectOption>\n <SingleSelectOption value=\"20\">20</SingleSelectOption>\n <SingleSelectOption value=\"50\">50</SingleSelectOption>\n <SingleSelectOption value=\"100\">100</SingleSelectOption>\n </SingleSelect>\n <Box paddingLeft={2}>\n <Typography textColor=\"neutral600\" tag=\"label\" htmlFor=\"page-size\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Box>\n </Flex>\n );\n};\n\nPageSize.propTypes = {\n onChangePageSize: PropTypes.func.isRequired,\n pageSize: PropTypes.number.isRequired,\n};\n\nexport default PageSize;\n","import { createContext, useContext } from 'react';\n\nexport const PaginationContext = createContext({ activePage: 1, pageCount: 1 });\nexport const usePagination = () => useContext(PaginationContext);\n","import React from 'react';\n\nimport { Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { styled } from 'styled-components';\n\nimport { usePagination } from './PaginationContext';\n\nconst PaginationText = styled(Typography)`\n line-height: revert;\n`;\n\nconst LinkWrapper = styled.button`\n padding: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ $active, theme }) => ($active ? theme.shadows.filterShadow : undefined)};\n text-decoration: none;\n display: flex;\n position: relative;\n outline: none;\n\n &:after {\n transition-property: all;\n transition-duration: 0.2s;\n border-radius: 8px;\n content: '';\n position: absolute;\n top: -4px;\n bottom: -4px;\n left: -4px;\n right: -4px;\n border: 2px solid transparent;\n }\n\n &:focus-visible {\n outline: none;\n\n &:after {\n border-radius: 8px;\n content: '';\n position: absolute;\n top: -5px;\n bottom: -5px;\n left: -5px;\n right: -5px;\n border: 2px solid ${(props) => props.theme.colors.primary600};\n }\n }\n`;\n\nLinkWrapper.defaultProps = { type: 'button' };\n\nconst PageLinkWrapper = styled(LinkWrapper)`\n color: ${({ theme, $active }) => ($active ? theme.colors.primary700 : theme.colors.neutral800)};\n background: ${({ theme, $active }) => ($active ? theme.colors.neutral0 : undefined)};\n\n &:hover {\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n }\n`;\n\nconst ActionLinkWrapper = styled(LinkWrapper)`\n font-size: 1.1rem;\n svg path {\n fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral600)};\n }\n\n &:focus,\n &:hover {\n svg path {\n fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral700)};\n }\n }\n\n ${(p) =>\n p['aria-disabled']\n ? `\n pointer-events: none;\n `\n : undefined}\n`;\n\nconst DotsWrapper = styled(LinkWrapper)`\n color: ${({ theme }) => theme.colors.neutral800};\n`;\n\nexport const PreviousLink = ({ children, ...props }) => {\n const { activePage } = usePagination();\n\n const disabled = activePage === 1;\n\n return (\n <li>\n <ActionLinkWrapper aria-disabled={disabled} tabIndex={disabled ? -1 : undefined} {...props}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <ChevronLeft aria-hidden />\n </ActionLinkWrapper>\n </li>\n );\n};\n\nexport const NextLink = ({ children, ...props }) => {\n const { activePage, pageCount } = usePagination();\n\n const disabled = activePage === pageCount;\n\n return (\n <li>\n <ActionLinkWrapper aria-disabled={disabled} tabIndex={disabled ? -1 : undefined} {...props}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <ChevronRight aria-hidden />\n </ActionLinkWrapper>\n </li>\n );\n};\n\nexport const PageLink = ({ number, children, ...props }) => {\n const { activePage } = usePagination();\n\n const isActive = activePage === number;\n\n return (\n <li>\n <PageLinkWrapper {...props} $active={isActive}>\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden variant=\"pi\" fontWeight={isActive ? 'bold' : ''}>\n {number}\n </PaginationText>\n </PageLinkWrapper>\n </li>\n );\n};\n\nexport const Dots = ({ children, ...props }) => (\n <li>\n <DotsWrapper {...props} tag=\"div\">\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden small>\n …\n </PaginationText>\n </DotsWrapper>\n </li>\n);\n\nPageLink.propTypes = {\n children: PropTypes.node.isRequired,\n number: PropTypes.number.isRequired,\n};\n\nconst sharedPropTypes = {\n children: PropTypes.node.isRequired,\n};\n\nNextLink.propTypes = sharedPropTypes;\nPreviousLink.propTypes = sharedPropTypes;\n\nDots.propTypes = {\n children: PropTypes.node.isRequired,\n};\n","import React, { useMemo } from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\n\nimport { PaginationContext } from './PaginationContext';\n\nexport const Pagination = ({ children, label, activePage, pageCount }) => {\n const paginationValue = useMemo(() => ({ activePage, pageCount }), [activePage, pageCount]);\n\n return (\n <PaginationContext.Provider value={paginationValue}>\n <Box tag=\"nav\" aria-label={label}>\n <Flex tag=\"ul\" gap={1}>\n {children}\n </Flex>\n </Box>\n </PaginationContext.Provider>\n );\n};\n\nPagination.defaultProps = {\n label: 'pagination',\n};\n\nPagination.propTypes = {\n activePage: PropTypes.number.isRequired,\n children: PropTypes.node.isRequired,\n label: PropTypes.string,\n pageCount: PropTypes.number.isRequired,\n};\n","/**\n * The component works as follows: this is a duplicate of the helper-plugin one but without the router\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\nimport React from 'react';\n\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { Dots, NextLink, PageLink, PreviousLink } from './components';\nimport { Pagination } from './Pagination';\n\nconst PaginationFooter = ({ activePage, onChangePage, pagination: { pageCount } }) => {\n const { formatMessage } = useIntl();\n\n const previousActivePage = activePage - 1;\n const nextActivePage = activePage + 1;\n\n const firstLinks = [\n <PageLink\n key={1}\n number={1}\n onClick={() => {\n onChangePage(1);\n }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: 1 }\n )}\n </PageLink>,\n ];\n\n if (pageCount <= 4) {\n const links = Array.from({ length: pageCount })\n .map((_, i) => i + 1)\n .map((number) => {\n return (\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n\n return (\n <Pagination activePage={activePage} pageCount={pageCount}>\n <PreviousLink onClick={() => onChangePage(previousActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {links}\n <NextLink onClick={() => onChangePage(nextActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </Pagination>\n );\n }\n\n let firstLinksToCreate = [];\n let lastLinks = [];\n let lastLinksToCreate = [];\n const middleLinks = [];\n\n if (pageCount > 1) {\n lastLinks.push(\n <PageLink key={pageCount} number={pageCount} onClick={() => onChangePage(pageCount)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: pageCount }\n )}\n </PageLink>\n );\n }\n\n if (activePage === 1 && pageCount >= 3) {\n firstLinksToCreate = [2];\n }\n\n if (activePage === 2 && pageCount >= 3) {\n if (pageCount === 5) {\n firstLinksToCreate = [2, 3, 4];\n } else if (pageCount === 3) {\n firstLinksToCreate = [2];\n } else {\n firstLinksToCreate = [2, 3];\n }\n }\n\n if (activePage === 4 && pageCount >= 3) {\n firstLinksToCreate = [2];\n }\n\n if (activePage === pageCount && pageCount >= 3) {\n lastLinksToCreate = [pageCount - 1];\n }\n\n if (activePage === pageCount - 2 && pageCount > 3) {\n lastLinksToCreate = [activePage + 1, activePage, activePage - 1];\n }\n\n if (activePage === pageCount - 3 && pageCount > 3 && activePage > 5) {\n lastLinksToCreate = [activePage + 2, activePage + 1, activePage, activePage - 1];\n }\n\n if (activePage === pageCount - 1 && pageCount > 3) {\n lastLinksToCreate = [activePage, activePage - 1];\n }\n\n lastLinksToCreate.forEach((number) => {\n lastLinks.unshift(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n Go to page {number}\n </PageLink>\n );\n });\n\n firstLinksToCreate.forEach((number) => {\n firstLinks.push(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n\n if (\n ![1, 2].includes(activePage) &&\n activePage <= pageCount - 3 &&\n firstLinks.length + lastLinks.length < 6\n ) {\n const middleLinksToCreate = [activePage - 1, activePage, activePage + 1];\n\n middleLinksToCreate.forEach((number) => {\n middleLinks.push(\n <PageLink key={number} number={number} onClick={() => onChangePage(number)}>\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: number }\n )}\n </PageLink>\n );\n });\n }\n\n const shouldShowDotsAfterFirstLink =\n pageCount > 5 || (pageCount === 5 && (activePage === 1 || activePage === 5));\n const shouldShowMiddleDots = middleLinks.length > 2 && activePage > 4 && pageCount > 5;\n\n const beforeDotsLinksLength = shouldShowMiddleDots\n ? pageCount - activePage - 1\n : pageCount - firstLinks.length - lastLinks.length;\n const afterDotsLength = shouldShowMiddleDots\n ? pageCount - firstLinks.length - lastLinks.length\n : pageCount - activePage - 1;\n\n return (\n <Pagination activePage={activePage} pageCount={pageCount}>\n <PreviousLink onClick={() => onChangePage(previousActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {firstLinks}\n {shouldShowMiddleDots && (\n <Dots>\n {formatMessage(\n {\n id: 'components.pagination.remaining-links',\n defaultMessage: 'And {number} other links',\n },\n { number: beforeDotsLinksLength }\n )}\n </Dots>\n )}\n {middleLinks}\n {shouldShowDotsAfterFirstLink && (\n <Dots>\n {formatMessage(\n {\n id: 'components.pagination.remaining-links',\n defaultMessage: 'And {number} other links',\n },\n { number: afterDotsLength }\n )}\n </Dots>\n )}\n {lastLinks}\n <NextLink onClick={() => onChangePage(nextActivePage)}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </Pagination>\n );\n};\n\nPaginationFooter.propTypes = {\n activePage: PropTypes.number.isRequired,\n onChangePage: PropTypes.func.isRequired,\n pagination: PropTypes.shape({ pageCount: PropTypes.number.isRequired }).isRequired,\n};\n\nexport default PaginationFooter;\n","import React, { useLayoutEffect, useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nconst SearchAsset = ({ onChangeSearch, queryValue }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [isOpen, setIsOpen] = useState(!!queryValue);\n const [value, setValue] = useState(queryValue || '');\n const wrapperRef = useRef(null);\n\n useLayoutEffect(() => {\n if (isOpen) {\n setTimeout(() => {\n wrapperRef.current.querySelector('input').focus();\n }, 0);\n }\n }, [isOpen]);\n\n const handleToggle = () => {\n setIsOpen((prev) => !prev);\n };\n\n const handleClear = () => {\n handleToggle();\n onChangeSearch(null);\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n trackUsage('didSearchMediaLibraryElements', { location: 'content-manager' });\n onChangeSearch(value);\n };\n\n if (isOpen) {\n return (\n <div ref={wrapperRef}>\n <SearchForm onSubmit={handleSubmit}>\n <Searchbar\n name=\"search\"\n onClear={handleClear}\n onChange={(e) => setValue(e.target.value)}\n clearLabel={formatMessage({\n id: getTrad('search.clear.label'),\n defaultMessage: 'Clear the search',\n })}\n size=\"S\"\n value={value}\n placeholder={formatMessage({\n id: getTrad('search.placeholder'),\n defaultMessage: 'e.g: the first dog on the moon',\n })}\n >\n {formatMessage({ id: getTrad('search.label'), defaultMessage: 'Search for an asset' })}\n </Searchbar>\n </SearchForm>\n </div>\n );\n }\n\n return (\n <IconButton label=\"Search\" onClick={handleToggle}>\n <Search />\n </IconButton>\n );\n};\n\nSearchAsset.defaultProps = {\n queryValue: null,\n};\n\nSearchAsset.propTypes = {\n onChangeSearch: PropTypes.func.isRequired,\n queryValue: PropTypes.string,\n};\n\nexport default SearchAsset;\n","/**\n * @param {string[]} allowedTypes\n * @param {string} mime\n * @returns {boolean}\n */\n\nexport const isSelectable = (allowedTypes, mime = '') => {\n if (!mime) return false;\n\n const fileType = mime.split('/')[0];\n\n return (\n allowedTypes.includes(fileType) ||\n (allowedTypes.includes('file') && !['video', 'image', 'audio'].includes(fileType))\n );\n};\n","import React from 'react';\n\nimport {\n Checkbox,\n Box,\n Button,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { GridFour as GridIcon, List, Pencil, Plus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AssetDefinition,\n FolderDefinition,\n localStorageKeys,\n viewOptions,\n} from '../../../constants';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { getBreadcrumbDataCM, toSingularTypes, getTrad, getAllowedFiles } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList';\nimport { Breadcrumbs } from '../../Breadcrumbs';\nimport { EmptyAssets } from '../../EmptyAssets';\nimport { FolderCard, FolderCardBody, FolderCardBodyAction } from '../../FolderCard';\nimport { FolderGridList } from '../../FolderGridList';\nimport SortPicker from '../../SortPicker';\nimport { TableList } from '../../TableList';\n\nimport { Filters } from './Filters';\nimport PageSize from './PageSize';\nimport PaginationFooter from './PaginationFooter';\nimport SearchAsset from './SearchAsset';\nimport { isSelectable } from './utils/isSelectable';\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const BrowseStep = ({\n allowedTypes,\n assets: rawAssets,\n canCreate,\n canRead,\n folders,\n multiple,\n onAddAsset,\n onChangeFilters,\n onChangePage,\n onChangePageSize,\n onChangeSearch,\n onChangeSort,\n onChangeFolder,\n onEditAsset,\n onEditFolder,\n onSelectAllAsset,\n onSelectAsset,\n pagination,\n queryObject,\n selectedAssets,\n}) => {\n const { formatMessage } = useIntl();\n const [view, setView] = usePersistentState(localStorageKeys.modalView, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const { data: currentFolder, isLoading: isCurrentFolderLoading } = useFolder(\n queryObject?.folder,\n {\n enabled: canRead && !!queryObject?.folder,\n }\n );\n\n const singularTypes = toSingularTypes(allowedTypes);\n const assets = rawAssets.map((asset) => ({\n ...asset,\n isSelectable: isSelectable(singularTypes, asset?.mime),\n type: 'asset',\n }));\n\n const breadcrumbs = !isCurrentFolderLoading && getBreadcrumbDataCM(currentFolder);\n\n const allAllowedAsset = getAllowedFiles(allowedTypes, assets);\n const areAllAssetSelected =\n allAllowedAsset.length > 0 &&\n selectedAssets.length > 0 &&\n allAllowedAsset.every(\n (asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1\n );\n const hasSomeAssetSelected = allAllowedAsset.some(\n (asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1\n );\n const isSearching = !!queryObject?._q;\n const isFiltering = queryObject?.filters?.$and?.length > 0;\n const isSearchingOrFiltering = isSearching || isFiltering;\n const assetCount = assets.length;\n const folderCount = folders.length;\n const handleClickFolderCard = (...args) => {\n // Search query will always fetch the same results\n // we remove it here to allow navigating in a folder and see the result of this navigation\n onChangeSearch('');\n onChangeFolder(...args);\n };\n\n return (\n <Box>\n {onSelectAllAsset && (\n <Box paddingBottom={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"flex-start\">\n {(assetCount > 0 || folderCount > 0 || isFiltering) && (\n <Flex gap={2} wrap=\"wrap\">\n {multiple && isGridView && (\n <Flex\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n height=\"3.2rem\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all assets',\n })}\n checked={\n !areAllAssetSelected && hasSomeAssetSelected\n ? 'indeterminate'\n : areAllAssetSelected\n }\n onCheckedChange={onSelectAllAsset}\n />\n </Flex>\n )}\n {isGridView && <SortPicker onChangeSort={onChangeSort} value={queryObject?.sort} />}\n <Filters\n appliedFilters={queryObject?.filters?.$and}\n onChangeFilters={onChangeFilters}\n />\n </Flex>\n )}\n\n {(assetCount > 0 || folderCount > 0 || isSearching) && (\n <Flex marginLeft=\"auto\" shrink={0} gap={2}>\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: 'view-switch.list',\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: 'view-switch.grid',\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchAsset onChangeSearch={onChangeSearch} queryValue={queryObject._q || ''} />\n </Flex>\n )}\n </Flex>\n </Box>\n )}\n\n {canRead && breadcrumbs?.length > 0 && currentFolder && (\n <Box paddingTop={3}>\n <Breadcrumbs\n onChangeFolder={onChangeFolder}\n tag=\"nav\"\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={queryObject?.folder}\n />\n </Box>\n )}\n\n {assetCount === 0 && folderCount === 0 && (\n <Box paddingBottom={6}>\n <EmptyAssets\n size=\"S\"\n count={6}\n action={\n canCreate &&\n !isFiltering &&\n !isSearching && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onAddAsset}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={\n // eslint-disable-next-line no-nested-ternary\n isSearchingOrFiltering\n ? formatMessage({\n id: getTrad('list.assets-empty.title-withSearch'),\n defaultMessage: 'There are no assets with the applied filters',\n })\n : canCreate && !isSearching\n ? formatMessage({\n id: getTrad('list.assets.empty'),\n defaultMessage: 'Upload your first assets...',\n })\n : formatMessage({\n id: getTrad('list.assets.empty.no-permissions'),\n defaultMessage: 'The asset list is empty',\n })\n }\n />\n </Box>\n )}\n\n {!isGridView && (folderCount > 0 || assetCount > 0) && (\n <TableList\n allowedTypes={allowedTypes}\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={!areAllAssetSelected && hasSomeAssetSelected}\n isFolderSelectionAllowed={false}\n onChangeSort={onChangeSort}\n onChangeFolder={handleClickFolderCard}\n onEditAsset={onEditAsset}\n onEditFolder={onEditFolder}\n onSelectOne={onSelectAsset}\n onSelectAll={onSelectAllAsset}\n rows={[...folders.map((folder) => ({ ...folder, type: 'folder' })), ...assets]}\n selected={selectedAssets}\n shouldDisableBulkSelect={!multiple}\n sortQuery={queryObject?.sort ?? ''}\n />\n )}\n\n {isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n (((isSearchingOrFiltering && assetCount > 0) || !isSearchingOrFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n onClick={() => handleClickFolderCard(folder.id, folder.path)}\n cardActions={\n onEditFolder && (\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => onEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n )\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction\n onClick={() => handleClickFolderCard(folder.id, folder.path)}\n >\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n ellipsis\n textColor=\"neutral800\"\n >\n {folder.name}\n {/* VisuallyHidden dash here allows to separate folder title and count informations\n for voice reading structure purpose */}\n <VisuallyHidden>-</VisuallyHidden>\n </TypographyMaxWidth>\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: folder.children.count,\n filesCount: folder.files.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <Box paddingTop={6}>\n <AssetGridList\n allowedTypes={allowedTypes}\n size=\"S\"\n assets={assets}\n onSelectAsset={onSelectAsset}\n selectedAssets={selectedAssets}\n onEditAsset={onEditAsset}\n title={\n ((!isSearchingOrFiltering || (isSearchingOrFiltering && folderCount > 0)) &&\n queryObject.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: assetCount }\n )) ||\n ''\n }\n />\n </Box>\n )}\n </>\n )}\n\n {pagination.pageCount > 0 && (\n <Flex justifyContent=\"space-between\" paddingTop={4}>\n <PageSize pageSize={queryObject.pageSize} onChangePageSize={onChangePageSize} />\n <PaginationFooter\n activePage={queryObject.page}\n onChangePage={onChangePage}\n pagination={pagination}\n />\n </Flex>\n )}\n </Box>\n );\n};\n\nBrowseStep.defaultProps = {\n allowedTypes: [],\n folders: [],\n multiple: false,\n onSelectAllAsset: undefined,\n};\nBrowseStep.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n canCreate: PropTypes.bool.isRequired,\n canRead: PropTypes.bool.isRequired,\n folders: PropTypes.arrayOf(FolderDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onChangeFilters: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n onChangePage: PropTypes.func.isRequired,\n onChangePageSize: PropTypes.func.isRequired,\n onChangeSort: PropTypes.func.isRequired,\n onChangeSearch: PropTypes.func.isRequired,\n onEditAsset: PropTypes.func.isRequired,\n onEditFolder: PropTypes.func.isRequired,\n onSelectAsset: PropTypes.func.isRequired,\n onSelectAllAsset: PropTypes.func,\n queryObject: PropTypes.shape({\n filters: PropTypes.object,\n page: PropTypes.number.isRequired,\n pageSize: PropTypes.number.isRequired,\n _q: PropTypes.string,\n sort: PropTypes.string,\n folder: PropTypes.number,\n }).isRequired,\n pagination: PropTypes.shape({ pageCount: PropTypes.number.isRequired }).isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nexport const DialogFooter = ({ onClose, onValidate }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n {onValidate && (\n <Button onClick={onValidate}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n )}\n </Modal.Footer>\n );\n};\n\nDialogFooter.defaultProps = {\n onValidate: undefined,\n};\n\nDialogFooter.propTypes = {\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func,\n};\n","import React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList';\n\nexport const SelectedStep = ({ selectedAssets, onSelectAsset, onReorderAsset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex gap={0}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage(\n {\n id: getTrad('list.assets.to-upload'),\n defaultMessage:\n '{number, plural, =0 {No asset} one {1 asset} other {# assets}} ready to upload',\n },\n { number: selectedAssets.length }\n )}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header-subtitle'),\n defaultMessage: 'Manage the assets before adding them to the Media Library',\n })}\n </Typography>\n </Flex>\n\n <AssetGridList\n size=\"S\"\n assets={selectedAssets}\n onSelectAsset={onSelectAsset}\n selectedAssets={selectedAssets}\n onReorderAsset={onReorderAsset}\n />\n </Flex>\n );\n};\n\nSelectedStep.defaultProps = {\n onReorderAsset: undefined,\n};\n\nSelectedStep.propTypes = {\n onSelectAsset: PropTypes.func.isRequired,\n selectedAssets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n onReorderAsset: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Divider, Flex, Loader, Modal, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetDefinition } from '../../constants';\nimport { useAssets } from '../../hooks/useAssets';\nimport { useFolders } from '../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport useModalQueryParams from '../../hooks/useModalQueryParams';\nimport { useSelectionState } from '../../hooks/useSelectionState';\nimport { containsAssetFilter, getTrad, getAllowedFiles, moveElement } from '../../utils';\nimport { EditAssetContent } from '../EditAssetDialog';\nimport { EditFolderContent } from '../EditFolderDialog';\n\nimport { BrowseStep } from './BrowseStep';\nimport { DialogFooter } from './DialogFooter';\nimport { SelectedStep } from './SelectedStep';\n\nconst LoadingBody = styled(Flex)`\n /* 80px are coming from the Tabs component that is not included in the ModalBody */\n min-height: ${() => `calc(60vh + 8rem)`};\n`;\n\nexport const AssetContent = ({\n allowedTypes,\n folderId,\n onClose,\n onAddAsset,\n onAddFolder,\n onChangeFolder,\n onValidate,\n multiple,\n initiallySelectedAssets,\n trackedLocation,\n}) => {\n const [assetToEdit, setAssetToEdit] = useState(undefined);\n const [folderToEdit, setFolderToEdit] = useState(undefined);\n const { formatMessage } = useIntl();\n const {\n canRead,\n canCreate,\n isLoading: isLoadingPermissions,\n canUpdate,\n canCopyLink,\n canDownload,\n } = useMediaLibraryPermissions();\n\n const [\n { queryObject },\n {\n onChangeFilters,\n onChangePage,\n onChangePageSize,\n onChangeSort,\n onChangeSearch,\n onChangeFolder: onChangeFolderParam,\n },\n ] = useModalQueryParams({ folder: folderId });\n\n const {\n data: { pagination, results: assets } = {},\n isLoading: isLoadingAssets,\n error: errorAssets,\n } = useAssets({ skipWhen: !canRead, query: queryObject });\n\n const {\n data: folders,\n isLoading: isLoadingFolders,\n error: errorFolders,\n } = useFolders({\n enabled: canRead && !containsAssetFilter(queryObject) && pagination?.page === 1,\n query: queryObject,\n });\n\n const [\n selectedAssets,\n { selectOne, selectOnly, setSelections, selectMultiple, deselectMultiple },\n ] = useSelectionState(['id'], initiallySelectedAssets);\n\n const handleSelectAllAssets = () => {\n const allowedAssets = getAllowedFiles(allowedTypes, assets);\n\n if (!multiple) {\n return undefined;\n }\n\n // selected files in current folder\n const alreadySelected = allowedAssets.filter(\n (asset) => selectedAssets.findIndex((selectedAsset) => selectedAsset.id === asset.id) !== -1\n );\n\n if (alreadySelected.length > 0) {\n deselectMultiple(alreadySelected);\n } else {\n selectMultiple(allowedAssets);\n }\n };\n\n const handleSelectAsset = (asset) => {\n return multiple ? selectOne(asset) : selectOnly(asset);\n };\n\n const isLoading = isLoadingPermissions || isLoadingAssets || isLoadingFolders;\n const hasError = errorAssets || errorFolders;\n\n if (isLoading) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <LoadingBody justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </LoadingBody>\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (hasError) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Page.Error />\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (!canRead) {\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Page.NoPermissions />\n <DialogFooter onClose={onClose} />\n </>\n );\n }\n\n if (assetToEdit) {\n return (\n <EditAssetContent\n onClose={() => setAssetToEdit(undefined)}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation={trackedLocation}\n />\n );\n }\n\n if (folderToEdit) {\n return (\n <EditFolderContent\n folder={folderToEdit}\n onClose={() => setFolderToEdit(undefined)}\n location=\"content-manager\"\n parentFolderId={queryObject?.folder}\n />\n );\n }\n\n const handleMoveItem = (hoverIndex, destIndex) => {\n const offset = destIndex - hoverIndex;\n const orderedAssetsClone = selectedAssets.slice();\n const nextAssets = moveElement(orderedAssetsClone, hoverIndex, offset);\n setSelections(nextAssets);\n };\n\n const handleFolderChange = (folderId, folderPath) => {\n onChangeFolder(folderId);\n onChangeFolderParam(folderId, folderPath);\n };\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <TabsRoot variant=\"simple\" defaultValue={selectedAssets.length > 0 ? 'selected' : 'browse'}>\n <Flex paddingLeft={8} paddingRight={8} paddingTop={6} justifyContent=\"space-between\">\n <Tabs.List>\n <Tabs.Trigger value=\"browse\">\n {formatMessage({\n id: getTrad('modal.nav.browse'),\n defaultMessage: 'Browse',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"selected\">\n {formatMessage({\n id: getTrad('modal.header.select-files'),\n defaultMessage: 'Selected files',\n })}\n <Badge marginLeft={2}>{selectedAssets.length}</Badge>\n </Tabs.Trigger>\n </Tabs.List>\n <Flex gap={2}>\n <Button\n variant=\"secondary\"\n onClick={() => onAddFolder({ folderId: queryObject?.folder })}\n >\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header.add-folder'),\n defaultMessage: 'Add folder',\n })}\n </Button>\n <Button onClick={() => onAddAsset({ folderId: queryObject?.folder })}>\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header.button'),\n defaultMessage: 'Add more assets',\n })}\n </Button>\n </Flex>\n </Flex>\n <Divider />\n <Modal.Body>\n <Tabs.Content value=\"browse\">\n <BrowseStep\n allowedTypes={allowedTypes}\n assets={assets}\n canCreate={canCreate}\n canRead={canRead}\n folders={folders}\n onSelectAsset={handleSelectAsset}\n selectedAssets={selectedAssets}\n multiple={multiple}\n onSelectAllAsset={handleSelectAllAssets}\n onEditAsset={setAssetToEdit}\n onEditFolder={setFolderToEdit}\n pagination={pagination}\n queryObject={queryObject}\n onAddAsset={onAddAsset}\n onChangeFilters={onChangeFilters}\n onChangeFolder={handleFolderChange}\n onChangePage={onChangePage}\n onChangePageSize={onChangePageSize}\n onChangeSort={onChangeSort}\n onChangeSearch={onChangeSearch}\n />\n </Tabs.Content>\n <Tabs.Content value=\"selected\">\n <SelectedStep\n selectedAssets={selectedAssets}\n onSelectAsset={handleSelectAsset}\n onReorderAsset={handleMoveItem}\n />\n </Tabs.Content>\n </Modal.Body>\n </TabsRoot>\n <DialogFooter onClose={onClose} onValidate={() => onValidate(selectedAssets)} />\n </>\n );\n};\n\nAssetContent.defaultProps = {\n allowedTypes: [],\n folderId: null,\n initiallySelectedAssets: [],\n multiple: false,\n trackedLocation: undefined,\n};\n\nAssetContent.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n folderId: PropTypes.number,\n initiallySelectedAssets: PropTypes.arrayOf(AssetDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onAddFolder: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nexport const AssetDialog = ({ open, onClose, ...restProps }) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <AssetContent onClose={onClose} {...restProps} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nAssetDialog.defaultProps = {\n allowedTypes: [],\n folderId: null,\n initiallySelectedAssets: [],\n multiple: false,\n open: false,\n trackedLocation: undefined,\n};\n\nAssetDialog.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n folderId: PropTypes.number,\n initiallySelectedAssets: PropTypes.arrayOf(AssetDefinition),\n multiple: PropTypes.bool,\n onAddAsset: PropTypes.func.isRequired,\n onAddFolder: PropTypes.func.isRequired,\n onChangeFolder: PropTypes.func.isRequired,\n open: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n onValidate: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n\nconst TabsRoot = styled(Tabs.Root)`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n","/* eslint-disable jsx-a11y/label-has-associated-control */\nimport React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Flex, Modal, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nconst Wrapper = styled(Flex)`\n flex-direction: column;\n`;\n\nconst IconWrapper = styled.div`\n font-size: 6rem;\n\n svg path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n`;\n\nconst MediaBox = styled(Box)`\n border-style: dashed;\n`;\n\nconst OpaqueBox = styled(Box)`\n opacity: 0;\n cursor: pointer;\n`;\n\nexport const FromComputerForm = ({ onClose, onAddAssets, trackedLocation }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef(null);\n const { trackUsage } = useTracking();\n\n const handleDragOver = (event) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'computer', location: trackedLocation });\n }\n\n onAddAssets(assets);\n };\n\n const handleDrop = (e) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n onAddAssets(assets);\n }\n\n setDragOver(false);\n };\n\n return (\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <label>\n <MediaBox\n paddingTop={11}\n paddingBottom={11}\n hasRadius\n justifyContent=\"center\"\n borderColor={dragOver ? 'primary500' : 'neutral300'}\n background={dragOver ? 'primary100' : 'neutral100'}\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <Flex justifyContent=\"center\">\n <Wrapper>\n <IconWrapper>\n <PicturePlus aria-hidden width=\"3.2rem\" height=\"3.2rem\" />\n </IconWrapper>\n\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: getTrad('input.label'),\n defaultMessage: 'Drag & Drop here or',\n })}\n </Typography>\n </Box>\n\n <OpaqueBox\n tag=\"input\"\n position=\"absolute\"\n left={0}\n right={0}\n bottom={0}\n top={0}\n width=\"100%\"\n type=\"file\"\n multiple\n name=\"files\"\n tabIndex={-1}\n ref={inputRef}\n zIndex={1}\n onChange={handleChange}\n />\n\n <Box position=\"relative\">\n <Button type=\"button\" onClick={handleClick}>\n {formatMessage({\n id: getTrad('input.button.label'),\n defaultMessage: 'Browse files',\n })}\n </Button>\n </Box>\n </Wrapper>\n </Flex>\n </MediaBox>\n </label>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'cancel',\n })}\n </Button>\n </Modal.Footer>\n </form>\n );\n};\n\nFromComputerForm.defaultProps = {\n trackedLocation: undefined,\n};\n\nFromComputerForm.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAssets: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e) {\n setError(e);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occured' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n\nFromUrlForm.defaultProps = {\n trackedLocation: undefined,\n};\n\nFromUrlForm.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAsset: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React from 'react';\n\nimport { Box, Divider, Modal, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nimport { FromComputerForm } from './FromComputerForm';\nimport { FromUrlForm } from './FromUrlForm';\n\nexport const AddAssetStep = ({ onClose, onAddAsset, trackedLocation }) => {\n const { formatMessage } = useIntl();\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n <Tabs.Root variant=\"simple\" defaultValue=\"computer\">\n <Box paddingLeft={8} paddingRight={8} paddingTop={6}>\n <Tabs.List\n aria-label={formatMessage({\n id: getTrad('tabs.title'),\n defaultMessage: 'How do you want to upload your assets?',\n })}\n >\n <Tabs.Trigger value=\"computer\">\n {formatMessage({\n id: getTrad('modal.nav.computer'),\n defaultMessage: 'From computer',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"url\">\n {formatMessage({\n id: getTrad('modal.nav.url'),\n defaultMessage: 'From URL',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n\n <Divider />\n </Box>\n <Tabs.Content value=\"computer\">\n <FromComputerForm\n onClose={onClose}\n onAddAssets={onAddAsset}\n trackedLocation={trackedLocation}\n />\n </Tabs.Content>\n <Tabs.Content value=\"url\">\n <FromUrlForm\n onClose={onClose}\n onAddAsset={onAddAsset}\n trackedLocation={trackedLocation}\n />\n </Tabs.Content>\n </Tabs.Root>\n </>\n );\n};\n\nAddAssetStep.defaultProps = {\n trackedLocation: undefined,\n};\n\nAddAssetStep.propTypes = {\n onClose: PropTypes.func.isRequired,\n onAddAsset: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useEffect } from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId,\n}) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={handleCancel} progress={progress} />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <CardTitle tag=\"h2\">{asset.name}</CardTitle>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.response?.data?.error?.message\n ? {\n id: getTrad(`apiError.${error.response.data.error.message}`),\n defaultMessage: error.response.data.error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occured while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n\nUploadingAssetCard.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n};\n\nUploadingAssetCard.propTypes = {\n addUploadedFiles: PropTypes.func,\n asset: PropTypes.shape({\n name: PropTypes.string,\n ext: PropTypes.string,\n rawFile: PropTypes.instanceOf(File),\n type: PropTypes.oneOf(Object.values(AssetType)),\n }).isRequired,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n onCancel: PropTypes.func.isRequired,\n onStatusChange: PropTypes.func.isRequired,\n};\n","import React, { useRef, useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Grid, KeyboardNavigable, Modal, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad } from '../../../utils';\nimport { AssetCard } from '../../AssetCard/AssetCard';\nimport { UploadingAssetCard } from '../../AssetCard/UploadingAssetCard';\n\nconst Status = {\n Idle: 'IDLE',\n Uploading: 'UPLOADING',\n Intermediate: 'INTERMEDIATE',\n};\n\nexport const PendingAssetStep = ({\n addUploadedFiles,\n folderId,\n onClose,\n onEditAsset,\n onRemoveAsset,\n assets,\n onClickAddAsset,\n onCancelUpload,\n onUploadSucceed,\n trackedLocation,\n}) => {\n const assetCountRef = useRef(0);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [uploadStatus, setUploadStatus] = useState(Status.Idle);\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const assetsCountByType = assets.reduce((acc, asset) => {\n const { type } = asset;\n\n if (!acc[type]) {\n acc[type] = 0;\n }\n\n // values need to be stringified because Amplitude ignores number values\n acc[type] = `${parseInt(acc[type], 10) + 1}`;\n\n return acc;\n }, {});\n\n trackUsage('willAddMediaLibraryAssets', {\n location: trackedLocation,\n ...assetsCountByType,\n });\n\n setUploadStatus(Status.Uploading);\n };\n\n const handleStatusChange = (status, file) => {\n if (status === 'success' || status === 'error') {\n assetCountRef.current++;\n\n // There's no \"terminated\" status. When all the files have called their\n // onUploadSucceed callback, the parent component filters the asset list\n // and closes the modal when the asset list is empty\n if (assetCountRef.current === assets.length) {\n assetCountRef.current = 0;\n setUploadStatus(Status.Intermediate);\n }\n }\n\n if (status === 'success') {\n onUploadSucceed(file);\n }\n };\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={7}>\n <Flex justifyContent=\"space-between\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={0}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage(\n {\n id: getTrad('list.assets.to-upload'),\n defaultMessage:\n '{number, plural, =0 {No asset} one {1 asset} other {# assets}} ready to upload',\n },\n { number: assets.length }\n )}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modal.upload-list.sub-header-subtitle'),\n defaultMessage: 'Manage the assets before adding them to the Media Library',\n })}\n </Typography>\n </Flex>\n <Button size=\"S\" onClick={onClickAddAsset}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n <KeyboardNavigable tagName=\"article\">\n <Grid.Root gap={4}>\n {assets.map((asset) => {\n const assetKey = asset.url;\n\n if (uploadStatus === Status.Uploading || uploadStatus === Status.Intermediate) {\n return (\n <Grid.Item col={4} key={assetKey} direction=\"column\" alignItems=\"stretch\">\n <UploadingAssetCard\n // Props used to store the newly uploaded files\n addUploadedFiles={addUploadedFiles}\n asset={asset}\n id={assetKey}\n onCancel={onCancelUpload}\n onStatusChange={(status) => handleStatusChange(status, asset.rawFile)}\n size=\"S\"\n folderId={folderId}\n />\n </Grid.Item>\n );\n }\n\n return (\n <Grid.Item col={4} key={assetKey} direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n asset={asset}\n size=\"S\"\n key={assetKey}\n local\n alt={asset.name}\n onEdit={onEditAsset}\n onRemove={onRemoveAsset}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </KeyboardNavigable>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button onClick={handleSubmit} loading={uploadStatus === Status.Uploading}>\n {formatMessage(\n {\n id: getTrad('modal.upload-list.footer.button'),\n defaultMessage:\n 'Upload {number, plural, one {# asset} other {# assets}} to the library',\n },\n { number: assets.length }\n )}\n </Button>\n </Modal.Footer>\n </>\n );\n};\n\nPendingAssetStep.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n trackedLocation: undefined,\n};\n\nPendingAssetStep.propTypes = {\n addUploadedFiles: PropTypes.func,\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n onClose: PropTypes.func.isRequired,\n onEditAsset: PropTypes.func.isRequired,\n onRemoveAsset: PropTypes.func.isRequired,\n onClickAddAsset: PropTypes.func.isRequired,\n onUploadSucceed: PropTypes.func.isRequired,\n onCancelUpload: PropTypes.func.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { useState } from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../constants';\nimport { EditAssetContent } from '../EditAssetDialog';\n\nimport { AddAssetStep } from './AddAssetStep/AddAssetStep';\nimport { PendingAssetStep } from './PendingAssetStep/PendingAssetStep';\n\nconst Steps = {\n AddAsset: 'AddAsset',\n PendingAsset: 'PendingAsset',\n};\n\nexport const UploadAssetDialog = ({\n initialAssetsToAdd,\n folderId,\n onClose,\n addUploadedFiles,\n trackedLocation,\n open,\n validateAssetsTypes = (_, cb) => cb(),\n}) => {\n const { formatMessage } = useIntl();\n const [step, setStep] = useState(initialAssetsToAdd ? Steps.PendingAsset : Steps.AddAsset);\n const [assets, setAssets] = useState(initialAssetsToAdd || []);\n const [assetToEdit, setAssetToEdit] = useState(undefined);\n\n const handleAddToPendingAssets = (nextAssets) => {\n validateAssetsTypes(nextAssets, () => {\n setAssets((prevAssets) => prevAssets.concat(nextAssets));\n setStep(Steps.PendingAsset);\n });\n };\n\n const moveToAddAsset = () => {\n setStep(Steps.AddAsset);\n };\n\n const handleCancelUpload = (file) => {\n const nextAssets = assets.filter((asset) => asset.rawFile !== file);\n setAssets(nextAssets);\n\n // When there's no asset, transition to the AddAsset step\n if (nextAssets.length === 0) {\n moveToAddAsset();\n }\n };\n\n const handleUploadSuccess = (file) => {\n const nextAssets = assets.filter((asset) => asset.rawFile !== file);\n setAssets(nextAssets);\n\n if (nextAssets.length === 0) {\n onClose();\n }\n };\n\n const handleAssetEditValidation = (nextAsset) => {\n if (nextAsset) {\n const nextAssets = assets.map((asset) => (asset === assetToEdit ? nextAsset : asset));\n setAssets(nextAssets);\n }\n\n setAssetToEdit(undefined);\n };\n\n const handleClose = () => {\n if (step === Steps.PendingAsset && assets.length > 0) {\n // eslint-disable-next-line no-alert\n const confirm = window.confirm(\n formatMessage({\n id: 'window.confirm.close-modal.files',\n defaultMessage: 'Are you sure? You have some files that have not been uploaded yet.',\n })\n );\n\n if (confirm) {\n onClose();\n }\n } else {\n onClose();\n }\n };\n\n const handleRemoveAsset = (assetToRemove) => {\n const nextAssets = assets.filter((asset) => asset !== assetToRemove);\n setAssets(nextAssets);\n };\n\n return (\n <Modal.Root open={open} onOpenChange={handleClose}>\n {step === Steps.AddAsset && (\n <Modal.Content>\n <AddAssetStep\n onClose={onClose}\n onAddAsset={handleAddToPendingAssets}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n\n {step === Steps.PendingAsset && (\n <Modal.Content>\n <PendingAssetStep\n onClose={handleClose}\n assets={assets}\n onEditAsset={setAssetToEdit}\n onRemoveAsset={handleRemoveAsset}\n onClickAddAsset={moveToAddAsset}\n onCancelUpload={handleCancelUpload}\n onUploadSucceed={handleUploadSuccess}\n initialAssetsToAdd={initialAssetsToAdd}\n addUploadedFiles={addUploadedFiles}\n folderId={folderId}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n\n {assetToEdit && (\n <Modal.Content>\n <EditAssetContent\n onClose={handleAssetEditValidation}\n asset={assetToEdit}\n canUpdate\n canCopyLink={false}\n canDownload={false}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n </Modal.Root>\n );\n};\n\nUploadAssetDialog.defaultProps = {\n addUploadedFiles: undefined,\n folderId: null,\n initialAssetsToAdd: undefined,\n onClose() {},\n trackedLocation: undefined,\n validateAssetsTypes: undefined,\n};\n\nUploadAssetDialog.propTypes = {\n addUploadedFiles: PropTypes.func,\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n initialAssetsToAdd: PropTypes.arrayOf(AssetDefinition),\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func,\n trackedLocation: PropTypes.string,\n validateAssetsTypes: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport PropTypes from 'prop-types';\n\nimport { AssetDialog } from '../AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport const MediaLibraryDialog = ({ onClose, onSelectAssets, allowedTypes }) => {\n const [step, setStep] = useState(STEPS.AssetSelect);\n const [folderId, setFolderId] = useState(null);\n\n switch (step) {\n case STEPS.AssetSelect:\n return (\n <AssetDialog\n allowedTypes={allowedTypes}\n folderId={folderId}\n open\n onClose={onClose}\n onValidate={onSelectAssets}\n onAddAsset={() => setStep(STEPS.AssetUpload)}\n onAddFolder={() => setStep(STEPS.FolderCreate)}\n onChangeFolder={(folderId) => setFolderId(folderId)}\n multiple\n />\n );\n\n case STEPS.FolderCreate:\n return (\n <EditFolderDialog\n open\n onClose={() => setStep(STEPS.AssetSelect)}\n parentFolderId={folderId}\n />\n );\n\n default:\n return (\n <UploadAssetDialog open onClose={() => setStep(STEPS.AssetSelect)} folderId={folderId} />\n );\n }\n};\n\nMediaLibraryDialog.defaultProps = {\n allowedTypes: ['files', 'images', 'videos', 'audios'],\n};\n\nMediaLibraryDialog.propTypes = {\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n onClose: PropTypes.func.isRequired,\n onSelectAssets: PropTypes.func.isRequired,\n};\n","import React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetDefinition, AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }) => {\n if (asset.mime.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview url={createAssetUrl(asset, true)} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime.includes(AssetType.Image)) {\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={createAssetUrl(asset, true)}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n\nCarouselAsset.propTypes = {\n asset: AssetDefinition.isRequired,\n};\n","import React from 'react';\n\nimport { CarouselActions, IconButton } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad, prefixFileUrlWithBackendUrl } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton';\n\nexport const CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditAsset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <CarouselActions>\n {onAddAsset && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.add'),\n defaultMessage: 'Add',\n })}\n onClick={() => onAddAsset(asset)}\n >\n <Plus />\n </IconButton>\n )}\n\n <CopyLinkButton url={prefixFileUrlWithBackendUrl(asset.url)} />\n\n {onDeleteAsset && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => onDeleteAsset(asset)}\n >\n <Trash />\n </IconButton>\n )}\n\n {onEditAsset && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.edit'),\n defaultMessage: 'edit',\n })}\n onClick={onEditAsset}\n >\n <Pencil />\n </IconButton>\n )}\n </CarouselActions>\n );\n};\n\nCarouselAssetActions.defaultProps = {\n onAddAsset: undefined,\n onDeleteAsset: undefined,\n onEditAsset: undefined,\n};\n\nCarouselAssetActions.propTypes = {\n asset: AssetDefinition.isRequired,\n onAddAsset: PropTypes.func,\n onEditAsset: PropTypes.func,\n onDeleteAsset: PropTypes.func,\n};\n","import React, { useState } from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nconst TextAlignTypography = styled(Typography)`\n align-items: center;\n`;\n\nexport const EmptyStateAsset = ({ disabled, onClick, onDropAsset }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n\n const handleDragEnter = (e) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e) => {\n if (!e.currentTarget.contains(e.relatedTarget)) {\n setDragOver(false);\n }\n };\n\n const handleDragOver = (e) => {\n e.preventDefault();\n };\n\n const handleDrop = (e) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\n\n onDropAsset(assets);\n }\n\n setDragOver(false);\n };\n\n return (\n <Flex\n borderStyle={dragOver ? 'dashed' : undefined}\n borderWidth={dragOver ? '1px' : undefined}\n borderColor={dragOver ? 'primary600' : undefined}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n width=\"100%\"\n tag=\"button\"\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n gap={3}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n <PicturePlus\n aria-hidden\n width=\"3.2rem\"\n height=\"3.2rem\"\n fill={disabled ? 'neutral400' : 'primary600'}\n />\n <TextAlignTypography\n variant=\"pi\"\n fontWeight=\"bold\"\n textColor=\"neutral600\"\n style={{ textAlign: 'center' }}\n tag=\"span\"\n >\n {formatMessage({\n id: getTrad('mediaLibraryInput.placeholder'),\n defaultMessage: 'Click to add an asset or drag and drop one in this area',\n })}\n </TextAlignTypography>\n </Flex>\n );\n};\n\nEmptyStateAsset.defaultProps = {\n disabled: false,\n onDropAsset: undefined,\n};\n\nEmptyStateAsset.propTypes = {\n disabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n onDropAsset: PropTypes.func,\n};\n","import React, { forwardRef, useState } from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { AssetDefinition } from '../../../constants';\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nexport const CarouselAssets = forwardRef(\n (\n {\n assets,\n disabled,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required,\n selectedAssetIndex,\n trackedLocation,\n },\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={onEditAsset ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset disabled={disabled} onClick={onAddAsset} onDropAsset={onDropAsset} />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n\n if (editedAsset) {\n onEditAsset(editedAsset);\n }\n }}\n asset={currentAsset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n\nCarouselAssets.defaultProps = {\n disabled: false,\n error: undefined,\n hint: undefined,\n labelAction: undefined,\n onDropAsset: undefined,\n required: false,\n trackedLocation: undefined,\n};\n\nCarouselAssets.propTypes = {\n assets: PropTypes.arrayOf(AssetDefinition).isRequired,\n disabled: PropTypes.bool,\n error: PropTypes.string,\n hint: PropTypes.string,\n label: PropTypes.string.isRequired,\n labelAction: PropTypes.node,\n onAddAsset: PropTypes.func.isRequired,\n onDeleteAsset: PropTypes.func.isRequired,\n onDeleteAssetFromMediaLibrary: PropTypes.func.isRequired,\n onDropAsset: PropTypes.func,\n onEditAsset: PropTypes.func.isRequired,\n onNext: PropTypes.func.isRequired,\n onPrevious: PropTypes.func.isRequired,\n required: PropTypes.bool,\n selectedAssetIndex: PropTypes.number.isRequired,\n trackedLocation: PropTypes.string,\n};\n","import React, { forwardRef, useEffect, useState } from 'react';\n\nimport { useField, useNotification } from '@strapi/admin/strapi-admin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, getAllowedFiles } from '../../utils';\nimport { AssetDialog } from '../AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nimport { CarouselAssets } from './Carousel/CarouselAssets';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport const MediaLibraryInput = forwardRef(\n (\n { attribute: { allowedTypes, multiple }, label, hint, disabled, labelAction, name, required },\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const { onChange, value, error } = useField(name);\n const fieldAllowedTypes = allowedTypes || ['files', 'images', 'videos', 'audios'];\n const [uploadedFiles, setUploadedFiles] = useState([]);\n const [step, setStep] = useState(undefined);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [droppedAssets, setDroppedAssets] = useState();\n const [folderId, setFolderId] = useState(null);\n const { toggleNotification } = useNotification();\n\n useEffect(() => {\n // Clear the uploaded files on close\n if (step === undefined) {\n setUploadedFiles([]);\n }\n }, [step]);\n\n let selectedAssets = [];\n\n if (Array.isArray(value)) {\n selectedAssets = value;\n } else if (value) {\n selectedAssets = [value];\n }\n\n const handleValidation = (nextSelectedAssets) => {\n onChange({\n target: { name, value: multiple ? nextSelectedAssets : nextSelectedAssets[0] },\n });\n setStep(undefined);\n };\n\n const handleDeleteAssetFromMediaLibrary = () => {\n let nextValue;\n\n if (multiple) {\n const nextSelectedAssets = selectedAssets.filter(\n (_, assetIndex) => assetIndex !== selectedIndex\n );\n nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;\n } else {\n nextValue = null;\n }\n\n onChange({\n target: { name, value: nextValue },\n });\n\n setSelectedIndex(0);\n };\n\n const handleDeleteAsset = (asset) => {\n let nextValue;\n\n if (multiple) {\n const nextSelectedAssets = selectedAssets.filter((prevAsset) => prevAsset.id !== asset.id);\n\n nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;\n } else {\n nextValue = null;\n }\n\n onChange({\n target: { name, value: nextValue },\n });\n\n setSelectedIndex(0);\n };\n\n const handleAssetEdit = (asset) => {\n const nextSelectedAssets = selectedAssets.map((prevAsset) =>\n prevAsset.id === asset.id ? asset : prevAsset\n );\n\n onChange({\n target: { name, value: multiple ? nextSelectedAssets : nextSelectedAssets[0] },\n });\n };\n\n const validateAssetsTypes = (assets, callback) => {\n const allowedAssets = getAllowedFiles(fieldAllowedTypes, assets);\n\n if (allowedAssets.length > 0) {\n callback(allowedAssets);\n } else {\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage(\n {\n id: getTrad('input.notification.not-supported'),\n defaultMessage: `You can't upload this type of file.`,\n },\n {\n fileTypes: fieldAllowedTypes.join(','),\n }\n ),\n });\n }\n };\n\n const handleAssetDrop = (assets) => {\n validateAssetsTypes(assets, (allowedAssets) => {\n setDroppedAssets(allowedAssets);\n setStep(STEPS.AssetUpload);\n });\n };\n\n if (multiple && selectedAssets.length > 0) {\n label = `${label} (${selectedIndex + 1} / ${selectedAssets.length})`;\n }\n\n const handleNext = () => {\n setSelectedIndex((current) => (current < selectedAssets.length - 1 ? current + 1 : 0));\n };\n\n const handlePrevious = () => {\n setSelectedIndex((current) => (current > 0 ? current - 1 : selectedAssets.length - 1));\n };\n\n const handleFilesUploadSucceeded = (uploadedFiles) => {\n setUploadedFiles((prev) => [...prev, ...uploadedFiles]);\n };\n\n let initiallySelectedAssets = selectedAssets;\n\n if (uploadedFiles.length > 0) {\n const allowedUploadedFiles = getAllowedFiles(fieldAllowedTypes, uploadedFiles);\n\n initiallySelectedAssets = multiple\n ? [...allowedUploadedFiles, ...selectedAssets]\n : [allowedUploadedFiles[0]];\n }\n\n return (\n <>\n <CarouselAssets\n ref={forwardedRef}\n assets={selectedAssets}\n disabled={disabled}\n label={label}\n labelAction={labelAction}\n onDeleteAsset={handleDeleteAsset}\n onDeleteAssetFromMediaLibrary={handleDeleteAssetFromMediaLibrary}\n onAddAsset={() => setStep(STEPS.AssetSelect)}\n onDropAsset={handleAssetDrop}\n onEditAsset={handleAssetEdit}\n onNext={handleNext}\n onPrevious={handlePrevious}\n error={error}\n hint={hint}\n required={required}\n selectedAssetIndex={selectedIndex}\n trackedLocation=\"content-manager\"\n />\n\n {step === STEPS.AssetSelect && (\n <AssetDialog\n allowedTypes={fieldAllowedTypes}\n initiallySelectedAssets={initiallySelectedAssets}\n folderId={folderId}\n onClose={() => {\n setStep(undefined);\n setFolderId(null);\n }}\n open={step === STEPS.AssetSelect}\n onValidate={handleValidation}\n multiple={multiple}\n onAddAsset={() => setStep(STEPS.AssetUpload)}\n onAddFolder={() => setStep(STEPS.FolderCreate)}\n onChangeFolder={(folder) => setFolderId(folder)}\n trackedLocation=\"content-manager\"\n />\n )}\n\n {step === STEPS.AssetUpload && (\n <UploadAssetDialog\n open={step === STEPS.AssetUpload}\n onClose={() => setStep(STEPS.AssetSelect)}\n initialAssetsToAdd={droppedAssets}\n addUploadedFiles={handleFilesUploadSucceeded}\n trackedLocation=\"content-manager\"\n folderId={folderId}\n validateAssetsTypes={validateAssetsTypes}\n />\n )}\n\n {step === STEPS.FolderCreate && (\n <EditFolderDialog\n open={step === STEPS.FolderCreate}\n onClose={() => setStep(STEPS.AssetSelect)}\n parentFolderId={folderId}\n />\n )}\n </>\n );\n }\n);\n\nMediaLibraryInput.defaultProps = {\n attribute: { allowedTypes: ['videos', 'files', 'images', 'audios'], multiple: false },\n disabled: false,\n hint: undefined,\n label: undefined,\n labelAction: undefined,\n required: false,\n};\n\nMediaLibraryInput.propTypes = {\n attribute: PropTypes.shape({\n allowedTypes: PropTypes.arrayOf(PropTypes.string),\n multiple: PropTypes.bool,\n }),\n disabled: PropTypes.bool,\n hint: PropTypes.string,\n label: PropTypes.string,\n labelAction: PropTypes.node,\n\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n};\n","import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport pluginId from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n register(app) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => import('./pages/App'),\n position: 4,\n });\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n to: 'media-library',\n Component: () => import('./pages/SettingsPage'),\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({ type: 'media', Component: MediaLibraryInput });\n app.addComponents([{ name: 'media-library', Component: MediaLibraryDialog }]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["files","name","getTrad","error","id","index","pluginId","AssetType","AssetSource","PERMISSIONS","errorsTrads","data","endpoint","option","value","options","components","LinkIcon","CardAsset","File","Wrapper","UploadProgressWrapper","DownloadIcon","Resize","LoadingBody","Extension","Card","isSelectable","AudioPreviewWrapper","IconWrapper","VideoPreviewWrapper","BaseBreadcrumbs","cells","Link","displayedFilters","filterToAdd","hasFilter","GridIcon","folderId","PicturePlus","STEPS","uploadedFiles"],"mappings":"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"}