@strapi/upload 5.8.0 → 5.9.0

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-DAyGguoD.js","sources":["../../admin/src/pluginId.ts","../../admin/src/hooks/useAssets.ts","../../admin/src/hooks/useFolders.ts","../../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/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/utils/typeFromMime.ts","../../admin/src/utils/rawFileToAsset.ts","../../admin/src/utils/urlsToAssets.ts","../../admin/src/utils/urlYupSchema.ts","../../admin/src/constants.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/renameKeys.ts","../../admin/src/hooks/useFolderStructure.ts","../../admin/src/components/ContextInfo/ContextInfo.tsx","../../admin/src/components/SelectTree/Option.tsx","../../admin/src/components/SelectTree/utils/getOpenValues.ts","../../admin/src/components/SelectTree/utils/getValuesToClose.ts","../../admin/src/components/SelectTree/SelectTree.tsx","../../admin/src/components/EditAssetDialog/DialogHeader.tsx","../../admin/src/hooks/useCropImg.ts","../../admin/src/hooks/useUpload.ts","../../admin/src/components/CopyLinkButton/CopyLinkButton.tsx","../../admin/src/components/UploadProgress/UploadProgress.tsx","../../admin/src/hooks/useRemoveAsset.ts","../../admin/src/components/EditAssetDialog/RemoveAssetDialog.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx","../../admin/src/components/EditAssetDialog/ReplaceMediaButton.tsx","../../admin/src/components/EditAssetDialog/EditAssetContent.tsx","../../admin/src/hooks/useBulkRemove.ts","../../admin/src/hooks/useEditFolder.ts","../../admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.tsx","../../admin/src/components/EditFolderDialog/RemoveFolderDialog.tsx","../../admin/src/components/EditFolderDialog/EditFolderDialog.tsx","../../admin/src/hooks/useFolder.ts","../../admin/src/hooks/usePersistentState.ts","../../admin/src/components/AssetCard/AssetCardBase.tsx","../../admin/src/components/AssetCard/AudioPreview.tsx","../../admin/src/components/AssetCard/AudioAssetCard.tsx","../../admin/src/components/AssetCard/DocAssetCard.tsx","../../admin/src/components/AssetCard/ImageAssetCard.tsx","../../admin/src/components/AssetCard/VideoPreview.tsx","../../admin/src/components/AssetCard/VideoAssetCard.tsx","../../admin/src/components/AssetCard/AssetCard.tsx","../../admin/src/components/AssetGridList/Draggable.tsx","../../admin/src/components/AssetGridList/AssetGridList.tsx","../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx","../../admin/src/components/Breadcrumbs/Breadcrumbs.tsx","../../admin/src/components/EmptyAssets/EmptyAssetGrid.tsx","../../admin/src/components/EmptyAssets/EmptyAssets.tsx","../../admin/src/components/FolderCard/contexts/FolderCard.tsx","../../admin/src/components/FolderCard/FolderCard/FolderCard.tsx","../../admin/src/components/FolderCard/FolderCardBody/FolderCardBody.tsx","../../admin/src/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.tsx","../../admin/src/components/FolderGridList/FolderGridList.tsx","../../admin/src/components/SortPicker/SortPicker.tsx","../../admin/src/components/TableList/PreviewCell.tsx","../../admin/src/components/TableList/CellContent.tsx","../../admin/src/components/TableList/TableRows.tsx","../../admin/src/components/TableList/TableList.tsx","../../admin/src/components/FilterList/FilterTag.tsx","../../admin/src/components/FilterList/FilterList.tsx","../../admin/src/components/FilterPopover/FilterValueInput.tsx","../../admin/src/components/FilterPopover/utils/getFilterList.ts","../../admin/src/components/FilterPopover/FilterPopover.tsx","../../admin/src/components/AssetDialog/BrowseStep/Filters.tsx","../../admin/src/components/AssetDialog/BrowseStep/PageSize.tsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.tsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.tsx","../../admin/src/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.tsx","../../admin/src/components/AssetDialog/BrowseStep/utils/isSelectable.ts","../../admin/src/components/AssetDialog/BrowseStep/BrowseStep.tsx","../../admin/src/components/AssetDialog/DialogFooter.tsx","../../admin/src/components/AssetDialog/SelectedStep/SelectedStep.tsx","../../admin/src/components/AssetDialog/AssetDialog.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.tsx","../../admin/src/components/AssetCard/UploadingAssetCard.tsx","../../admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.tsx","../../admin/src/components/UploadAssetDialog/UploadAssetDialog.tsx","../../admin/src/components/MediaLibraryDialog/MediaLibraryDialog.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.tsx","../../admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx","../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx","../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nexport const pluginId = pluginPkg.name.replace(/^@strapi\\//i, '');\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';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\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';\n\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\n\nimport type { Query } from '../../../shared/contracts/files';\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","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?: string | number | null;\n children?: FolderStructureValue[];\n label?: string;\n}\n\ntype Value = number | null | { value: number | null };\n\nexport function findRecursiveFolderByValue(\n data: FolderStructureValue[],\n value: Value\n): FolderStructureValue | undefined {\n let result: FolderStructureValue | undefined;\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","import { toSingularTypes } from './toSingularTypes';\n\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\nexport interface 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 { FetchError } from '@strapi/admin/strapi-admin';\nimport type { errors } from '@strapi/utils';\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';\n\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 { 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\nexport interface 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 const 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 { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\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 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: string | number | null;\n children?: FolderStructureValue[];\n}\n\ntype Parents = { id?: number | string | null; label?: string; path?: string }[];\n\nexport const getFolderParents = (folders: FolderStructureValue[], currentFolderId: number) => {\n const parents: 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 const 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 = <T = number>(array: T[], 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 = <T = number>(array: T[], 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","import { AssetType } from '../constants';\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","import { AssetSource } from '../constants';\n\nimport { typeFromMime } from './typeFromMime';\n\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","import { AssetSource } from '../constants';\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 ? fullFilledAsset.mime : undefined,\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 { getTrad } from './utils';\n\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\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 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 pageSizes = [10, 20, 50, 100];\n\nexport const localStorageKeys = {\n modalView: `STRAPI_UPLOAD_MODAL_VIEW`,\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n LIST: 1,\n};\n","import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\nconst { main: _main, ...restPermissions } = PERMISSIONS;\n\ntype UseRBACReturnType = ReturnType<typeof useRBAC>;\n\ntype AllowedActionsType = UseRBACReturnType['allowedActions'];\n\nexport const useMediaLibraryPermissions = (): AllowedActionsType & { isLoading: boolean } => {\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';\n\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\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';\n\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nexport const 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'] | null) => {\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 (newState as Record<string, string | number | undefined>)[key] = (\n queryObject as Record<string, string | number | undefined>\n )[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","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';\n\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\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): unknown =>\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 { FolderNode, GetFolderStructure } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport { recursiveRenameKeys } from './utils/renameKeys';\n\nconst FIELD_MAPPING: Record<string, string> = {\n name: 'label',\n id: 'value',\n};\n\ninterface FolderNodeWithChildren extends Omit<FolderNode, 'children'> {\n children: FolderNodeWithChildren[];\n label?: string;\n value: string | number | null;\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 const children = data.map((f: FolderNodeWithChildren) =>\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 { Box, Flex, Grid, Typography } from '@strapi/design-system';\n\ninterface ContextInfoProps {\n blocks: { label: string; value: string | number | null }[];\n}\n\nexport const ContextInfo = ({ blocks }: ContextInfoProps) => {\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","import * as React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { ChevronDown, ChevronUp } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { components, OptionProps as ReactSelectOptionProps } from 'react-select';\nimport { styled } from 'styled-components';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\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\ninterface SelectProps {\n maxDisplayDepth: number;\n openValues: string[];\n onOptionToggle: (value: string) => void;\n}\n\ninterface FolderWithDepth extends Folder {\n depth: number;\n value: string;\n}\n\ninterface OptionProps extends ReactSelectOptionProps<FolderWithDepth, false> {\n selectProps: SelectProps & ReactSelectOptionProps<FolderWithDepth, false>['selectProps'];\n}\n\nexport const Option = ({ children, data, selectProps, ...props }: OptionProps) => {\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 data={data} selectProps={selectProps} {...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 && 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: React.MouseEvent<HTMLButtonElement>) => {\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","interface Option {\n value: number | string | null;\n parent?: number | string | null;\n}\n\ninterface DefaultValue {\n value?: number | string | null;\n}\n\nexport function getOpenValues(options: Option[], defaultValue: DefaultValue = {}) {\n const values: Option['value'][] = [];\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 const option = options.find(({ value }) => value === parent);\n\n if (!option) {\n break;\n }\n\n values.push(option.value);\n parent = option.parent;\n }\n\n return values.reverse();\n}\n","interface Option {\n value: string | number | null;\n depth: number;\n}\n\nexport function getValuesToClose(options: Option[], value: number | string | null) {\n const optionForValue = options.find((option) => option.value === value);\n\n if (!optionForValue) {\n return [];\n }\n\n return options\n .filter((option) => option.depth >= optionForValue.depth)\n .map((option) => option.value);\n}\n","import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { Cross, CaretDown } from '@strapi/icons';\nimport ReactSelect, {\n components,\n GroupBase,\n StylesConfig,\n ClearIndicatorProps,\n} from 'react-select';\nimport { styled, useTheme, DefaultTheme } from 'styled-components';\n\nimport { Option } from './Option';\nimport { flattenTree, FlattenedNode } from './utils/flattenTree';\nimport { getOpenValues } from './utils/getOpenValues';\nimport { getValuesToClose } from './utils/getValuesToClose';\n\nconst hasParent = (option: FlattenedNode<string | number | null>) => !option.parent;\n\nexport type OptionSelectTree = {\n value: string | number | null;\n label?: string;\n children?: OptionSelectTree[];\n};\n\nexport interface SelectTreeProps<\n Option = unknown,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n IsMulti extends boolean = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Group extends GroupBase<Option> = GroupBase<Option>,\n> {\n maxDisplayDepth?: number;\n defaultValue?: {\n value?: string | number | null;\n };\n options: OptionSelectTree[];\n onChange?: (value: Record<string, string | number>) => void;\n name?: string;\n menuPortalTarget?: HTMLElement | null;\n inputId?: string;\n error?: string;\n ariaErrorMessage?: string;\n isDisabled?: boolean;\n disabled?: boolean;\n}\n\nexport const SelectTree = ({\n options: defaultOptions,\n maxDisplayDepth = 5,\n defaultValue,\n ...props\n}: SelectTreeProps) => {\n const flatDefaultOptions = React.useMemo(() => flattenTree(defaultOptions), [defaultOptions]);\n const optionsFiltered = React.useMemo(\n () => flatDefaultOptions.filter(hasParent),\n [flatDefaultOptions]\n );\n const [options, setOptions] = React.useState(optionsFiltered);\n const [openValues, setOpenValues] = React.useState(\n getOpenValues(flatDefaultOptions, defaultValue)\n );\n\n React.useEffect(() => {\n if (openValues.length === 0) {\n setOptions(flatDefaultOptions.filter((option) => option.parent === undefined));\n } else {\n const allOpenValues = openValues.reduce<(string | number | null)[]>((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: string | number | null) => {\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\ntype SelectOption = { value?: string | number | null; label?: string };\n\ninterface SelectProps<\n Option = SelectOption,\n IsMulti extends boolean = false,\n Group extends GroupBase<Option> = GroupBase<Option>,\n> {\n components?: object;\n styles?: StylesConfig<Option, IsMulti, Group>;\n error?: string;\n ariaErrorMessage?: string;\n options: OptionSelectTree[];\n defaultValue?: {\n value?: string | number | null;\n };\n isSearchable?: boolean;\n maxDisplayDepth?: number;\n openValues?: (string | number | null)[];\n onOptionToggle?: (value: string | number | null) => void;\n}\n\nconst Select = ({\n components = {},\n styles = {},\n error,\n ariaErrorMessage,\n ...props\n}: SelectProps) => {\n const theme = useTheme();\n const customStyles = getSelectStyles(theme, error);\n\n return (\n <ReactSelect\n menuPosition=\"fixed\"\n components={{\n ...components,\n ClearIndicator,\n DropdownIndicator,\n IndicatorSeparator: () => null,\n LoadingIndicator: () => null,\n }}\n aria-errormessage={error && ariaErrorMessage}\n aria-invalid={!!error}\n styles={\n { ...customStyles, ...styles } as StylesConfig<SelectOption, false, GroupBase<SelectOption>>\n }\n {...props}\n />\n );\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 = (\n props: ClearIndicatorProps<SelectOption, false, GroupBase<SelectOption>>\n) => {\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 }: { innerProps: object }) => {\n return (\n <CarretBox paddingRight={3} {...innerProps}>\n <CaretDown />\n </CarretBox>\n );\n};\n\nconst getSelectStyles = (\n theme: DefaultTheme,\n error?: string\n): StylesConfig<SelectOption, false, GroupBase<SelectOption>> => {\n return {\n clearIndicator: (base: object) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n container: (base: object) => ({\n ...base,\n background: theme.colors.neutral0,\n lineHeight: 'normal',\n }),\n control(base: object, state: { isFocused: boolean; isDisabled: boolean }) {\n let borderColor = theme.colors.neutral200;\n let boxShadowColor: string | undefined = undefined;\n let backgroundColor: string | undefined = undefined;\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: object) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n input: (base: object) => ({\n ...base,\n margin: 0,\n padding: 0,\n color: theme.colors.neutral800,\n gridTemplateColumns: '0 100%',\n }),\n menuPortal: (base: object) => ({\n ...base,\n zIndex: theme.zIndices.dialog,\n pointerEvents: 'auto',\n }),\n menu(base: object) {\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: object) => ({\n ...base,\n paddingLeft: theme.spaces[1],\n paddingTop: theme.spaces[1],\n paddingRight: theme.spaces[1],\n paddingBottom: theme.spaces[1],\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n option(base: any, state: { isFocused: boolean; isSelected: boolean }) {\n let backgroundColor = base?.backgroundColor as string;\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: object) => ({\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: object, state: { isDisabled: boolean }) {\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: object) => ({\n ...base,\n cursor: 'pointer',\n padding: 0,\n paddingLeft: theme.spaces[4],\n marginLeft: 0,\n marginRight: 0,\n }),\n };\n};\n","import { 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 checkCrossOrigin: 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';\n\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends Omit<File, 'id' | 'hash'> {\n rawFile?: RawFile;\n id?: File['id'];\n hash?: File['hash'];\n}\n\nconst uploadAsset = (\n asset: Asset,\n folderId: number | null,\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 | null }\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 | null) =>\n mutation.mutateAsync({ asset, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n isLoading: mutation.isLoading,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport { useNotification, useClipboard } from '@strapi/admin/strapi-admin';\nimport { IconButton } from '@strapi/design-system';\nimport { Link as LinkIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const CopyLinkButton = ({ url }: { url: string }) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Flex, ProgressBar, Typography } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { UpdateFile } from '../../../../shared/contracts/files';\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 interface UploadProgressProps {\n error?: UpdateFile.Response['error'] | Error | null;\n onCancel: () => void;\n progress?: number;\n}\n\nexport const UploadProgress = ({ onCancel, progress = 0, error }: UploadProgressProps) => {\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} />\n <Typography>{`${progress}/100%`}</Typography>\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","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { pluginId } from '../pluginId';\n\nimport type { DeleteFile } from '../../../shared/contracts/files';\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 { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\n\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface RemoveAssetDialogProps {\n open: boolean;\n onClose: (open: boolean | null) => void;\n asset: File;\n}\n\nexport const RemoveAssetDialog = ({ open, onClose, asset }: RemoveAssetDialogProps) => {\n // `null` means asset is deleted\n const { removeAsset } = useRemoveAsset(() => {\n onClose(null);\n });\n\n const handleConfirm = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\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","/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps {\n mime: string;\n name: string;\n url: string;\n onLoad?: () => void;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const { formatMessage } = useIntl();\n\n if (mime.includes(AssetType.Image)) {\n return (\n <img ref={ref as React.ForwardedRef<HTMLImageElement>} src={url} alt={name} {...props} />\n );\n }\n\n if (mime.includes(AssetType.Video)) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (mime.includes(AssetType.Audio)) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n if (mime.includes('pdf')) {\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n }\n\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n","// TODO: find a better naming convention for the file that was an index file before\nimport { 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 height: 26px;\n }\n\n img,\n mux-player {\n margin: 0;\n padding: 0;\n max-height: 26.4rem;\n max-width: 100%;\n }\n\n mux-player {\n --play-button: inline-flex;\n --mute-button: inline-flex;\n --pip-button: inline-flex;\n --fullscreen-button: inline-flex;\n --playback-rate-button: inline-flex;\n --volume-range: inline-flex;\n --time-range: inline-flex;\n --time-display: inline-flex;\n --duration-display: inline-flex;\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 { Flex, FocusTrap, IconButton, Menu } from '@strapi/design-system';\nimport { Check, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTrad } from '../../../utils';\n\nimport { CroppingActionRow } from './PreviewComponents';\n\ninterface CroppingActionsProps {\n onCancel: () => void;\n onValidate: () => void;\n onDuplicate?: () => void;\n}\n\nexport const CroppingActions = ({ onCancel, onValidate, onDuplicate }: CroppingActionsProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React 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 { useIntl } from 'react-intl';\n\nimport { 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/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } from '../../../../../shared/contracts/files';\n\nimport 'cropperjs/dist/cropper.css';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n}\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}: PreviewBoxProps) => {\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.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 React.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 React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.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!)) as File;\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(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\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","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, VisuallyHidden, ButtonProps } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\ninterface ReplaceMediaButtonProps extends ButtonProps {\n acceptedMime: string;\n onSelectMedia: (file?: File) => void;\n trackedLocation?: string;\n}\n\nexport const ReplaceMediaButton = ({\n onSelectMedia,\n acceptedMime,\n trackedLocation,\n ...props\n}: ReplaceMediaButtonProps) => {\n const { formatMessage } = useIntl();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { trackUsage } = useTracking();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\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 data-testid=\"file-input\"\n tabIndex={-1}\n ref={inputRef}\n onChange={handleChange}\n aria-hidden\n />\n </VisuallyHidden>\n </>\n );\n};\n","/**\n *\n * EditAssetDialog\n *\n */\nimport * as React 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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useEditAsset } from '../../hooks/useEditAsset';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { findRecursiveFolderByValue, getTrad, getFileExtension, formatBytes } from '../../utils';\nimport { ContextInfo } from '../ContextInfo/ContextInfo';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport { DialogHeader } from './DialogHeader';\nimport { PreviewBox } from './PreviewBox/PreviewBox';\nimport { ReplaceMediaButton } from './ReplaceMediaButton';\n\nimport type { File as FileDefinition, RawFile } from '../../../../shared/contracts/files';\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 interface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface EditAssetContentProps {\n asset?: Asset;\n canUpdate?: boolean;\n canCopyLink?: boolean;\n canDownload?: boolean;\n trackedLocation?: string;\n onClose: (arg?: Asset | null | boolean) => void;\n}\n\ninterface FormInitialData {\n name?: string;\n alternativeText?: string;\n caption?: string;\n parent?: {\n value?: number;\n label: string;\n };\n}\n\nexport const EditAssetContent = ({\n onClose,\n asset,\n canUpdate = false,\n canCopyLink = false,\n canDownload = false,\n trackedLocation,\n}: EditAssetContentProps) => {\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const submitButtonRef = React.useRef<HTMLButtonElement>(null);\n const [isCropping, setIsCropping] = React.useState(false);\n const [replacementFile, setReplacementFile] = React.useState<File | undefined>();\n const { editAsset, isLoading } = useEditAsset();\n\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n\n const handleSubmit = async (values: FormInitialData) => {\n const nextAsset = { ...asset, ...values, folder: values.parent?.value } as Asset;\n\n if (asset?.isLocal) {\n onClose(nextAsset);\n } else {\n const editedAsset = (await editAsset(nextAsset, replacementFile!)) as Asset;\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?: { [key: string]: unknown }) => {\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 ? asset.size : 0),\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 ? 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 ? asset.id : null,\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\ninterface EditAssetDialogProps {\n asset: Asset;\n canUpdate?: boolean;\n canCopyLink?: boolean;\n canDownload?: boolean;\n trackedLocation?: string;\n open: boolean;\n onClose: (arg?: Asset | null | boolean) => void;\n}\n\nexport const EditAssetDialog = ({\n open,\n onClose,\n canUpdate = false,\n canCopyLink = false,\n canDownload = false,\n ...restProps\n}: EditAssetDialogProps) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditAssetContent\n onClose={onClose}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n {...restProps}\n />\n </Modal.Content>\n </Modal.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkDeleteFiles, File } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport type { BulkDeleteFolders, FolderDefinition } from '../../../shared/contracts/folders';\n\nexport interface FileWithType extends File {\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 | FolderDefinition>) => {\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 | FolderDefinition>\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';\n\nimport { CreateFolders, UpdateFolder } from '../../../shared/contracts/folders';\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 async onSuccess() {\n await queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n await 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 { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\ninterface EditFolderModalHeaderProps {\n isEditing?: boolean;\n}\n\nexport const EditFolderModalHeader = ({ isEditing = false }: EditFolderModalHeaderProps) => {\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","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\n\ninterface RemoveFolderDialogProps {\n onClose: () => void;\n onConfirm: () => void;\n open: boolean;\n}\n\nexport const RemoveFolderDialog = ({ onClose, onConfirm, open }: RemoveFolderDialogProps) => {\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={onConfirm} />\n </Dialog.Root>\n );\n};\n","import * as React 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, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\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/ContextInfo';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport { EditFolderModalHeader } from './ModalHeader/ModalHeader';\nimport { RemoveFolderDialog } from './RemoveFolderDialog';\n\nimport type { FolderDefinition } from '../../../../shared/contracts/folders';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\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\ninterface ValuesSubmit {\n name: string;\n parent: null | { label?: string; value?: number };\n}\n\nexport interface EditFolderDialogProps {\n parentFolderId?: string | number | null;\n location?: string;\n folder?: FolderDefinition;\n open?: boolean;\n onClose: (payload?: { created?: boolean | undefined } | boolean) => void;\n}\n\nexport const EditFolderContent = ({\n onClose,\n folder,\n location,\n parentFolderId,\n}: EditFolderDialogProps) => {\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n const { canCreate, isLoading: isLoadingPermissions, canUpdate } = useMediaLibraryPermissions();\n const [showConfirmDialog, setShowConfirmDialog] = React.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: ValuesSubmit = !folderStructureIsLoading\n ? {\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.toString(), 10) : undefined,\n label: parentFolderId\n ? folderStructure &&\n findRecursiveFolderByValue(folderStructure, parseInt(parentFolderId.toString(), 10))\n ?.label\n : folderStructure?.[0].label,\n },\n }\n : {\n name: '',\n parent: null,\n };\n\n const handleSubmit = async (\n values: ValuesSubmit,\n { setErrors }: { setErrors: (errors: FormikErrors<ValuesSubmit>) => void }\n ) => {\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.toString(), 10) !== values.parent?.value\n : parentFolderId === null && !!values.parent?.value;\n trackUsage('didEditMediaLibraryElements', {\n location,\n type: 'folder',\n changeLocation: didChangeLocation,\n });\n } else {\n trackUsage('didAddMediaLibraryFolders', { location: location! });\n }\n\n onClose({ created: true });\n } catch (err) {\n const errors = getAPIInnerErrors(err as FetchError, { getTrad });\n const formikErrors = Object.entries(errors!).reduce(\n (acc: Record<string, string>, [key, error]) => {\n acc[key] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n };\n\n const handleDelete = async () => {\n if (folder) {\n await remove([folder]);\n }\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\n name=\"name\"\n error={typeof errors.name === 'string' ? errors.name : undefined}\n >\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={typeof errors.parent === 'string' ? errors.parent : undefined}\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 {typeof errors.parent === 'string' ? errors.parent : undefined}\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\nexport const EditFolderDialog = ({ open, onClose, ...restProps }: EditFolderDialogProps) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditFolderContent {...restProps} onClose={onClose} open={open} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { GetFolder } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport const useFolder = (id: number | null | undefined, { 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 { 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","import * as 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 Typography,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\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 interface AssetCardBaseProps {\n children?: React.ReactNode;\n extension: string;\n isSelectable?: boolean;\n name: string;\n onSelect?: () => void;\n onRemove?: () => void;\n onEdit?: (\n event:\n | React.MouseEvent<HTMLButtonElement, MouseEvent>\n | React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n selected?: boolean;\n subtitle?: string;\n variant: 'Image' | 'Video' | 'Audio' | 'Doc';\n}\n\nexport const AssetCardBase = ({\n children,\n extension,\n isSelectable = true,\n name,\n onSelect,\n onRemove,\n onEdit,\n selected = false,\n subtitle = '',\n variant = 'Image',\n}: AssetCardBaseProps) => {\n const { formatMessage } = useIntl();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onEdit) {\n onEdit(e);\n }\n };\n\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: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n e.stopPropagation();\n };\n\n return (\n <CardContainer role=\"button\" height=\"100%\" tabIndex={-1} onClick={handleClick}>\n <CardHeader>\n {isSelectable && (\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 <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{name}</CardTitle>\n </Typography>\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","/* eslint-disable jsx-a11y/media-has-caption */\nimport { Box } from '@strapi/design-system';\n\ninterface AudioPreviewProps {\n alt: string;\n url: string;\n}\n\nexport const AudioPreview = ({ url, alt }: AudioPreviewProps) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n","import { Box, CardAsset, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } 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\ninterface AudioAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n url: string;\n}\n\nexport const AudioAssetCard = ({\n name,\n url,\n size = 'M',\n selected = false,\n ...restProps\n}: AudioAssetCardProps) => {\n return (\n <AssetCardBase name={name} selected={selected} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <Flex alignItems=\"center\">\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface DocAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n extension: string;\n}\n\nexport const DocAssetCard = ({\n name,\n extension,\n size = 'M',\n selected = false,\n ...restProps\n}: DocAssetCardProps) => {\n const { formatMessage } = useIntl();\n return (\n <AssetCardBase\n name={name}\n extension={extension}\n selected={selected}\n {...restProps}\n variant=\"Doc\"\n >\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n {extension === 'pdf' ? (\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n ) : (\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n )}\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n","import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\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 const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n","import * as React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\ninterface VideoPreviewProps {\n alt: string;\n url: string;\n mime: string;\n onLoadDuration?: (duration?: number) => void;\n size?: 'S' | 'M';\n}\n\nexport const VideoPreview = ({\n url,\n mime,\n onLoadDuration = () => {},\n alt,\n ...props\n}: VideoPreviewProps) => {\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (e.currentTarget.currentTime > 0) {\n const video = e.currentTarget;\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 && onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" key={url} {...props}>\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","import * as React from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } 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\ninterface VideoAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n mime: string;\n url: string;\n size?: 'S' | 'M';\n}\n\nexport const VideoAssetCard = ({\n name,\n url,\n mime,\n size = 'M',\n selected = false,\n ...props\n}: VideoAssetCardProps) => {\n const [duration, setDuration] = React.useState<number>();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase selected={selected} 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","import { 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\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n}: AssetCardProps) => {\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 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 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 {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n","import * as React from 'react';\n\nimport { useDrag, useDrop } from 'react-dnd';\n\ninterface DraggableProps {\n id: string | number;\n index: number;\n children: React.ReactNode;\n moveItem: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const Draggable = ({ children, id, index, moveItem }: DraggableProps) => {\n const ref = React.useRef(null);\n\n const [, drop] = useDrop({\n accept: 'draggable',\n hover(hoveredOverItem: { id: number; index: number }) {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\n\nimport { AssetCard } from '../AssetCard/AssetCard';\n\nimport { Draggable } from './Draggable';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\n\nexport interface AssetGridListProps {\n allowedTypes?: AllowedTypes[];\n assets: File[];\n onEditAsset?: (asset: File) => void;\n onSelectAsset: (asset: File) => void;\n selectedAssets: File[];\n size?: 'S' | 'M';\n onReorderAsset?: (fromIndex: number, toIndex: number) => void;\n title?: string | null;\n}\n\nexport const AssetGridList = ({\n allowedTypes = ['files', 'images', 'videos', 'audios'],\n assets,\n onEditAsset,\n onSelectAsset,\n selectedAssets,\n size = 'M',\n onReorderAsset,\n title = null,\n}: AssetGridListProps) => {\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","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.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) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n 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(Number(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: typeof ascendant?.id === 'string' ? ascendant.id : undefined,\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem isLink href={url} key={ascendant.id}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n","import {\n Breadcrumbs as BaseBreadcrumbs,\n Crumb,\n CrumbLink,\n BreadcrumbsProps as BaseBreadcrumbsProps,\n} from '@strapi/design-system';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link as ReactRouterLink } from 'react-router-dom';\n\nimport { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync';\n\nexport type CrumbDefinition = {\n id?: number | null;\n label?: MessageDescriptor | string;\n href?: string;\n path?: string;\n};\n\nexport interface BreadcrumbsProps extends BaseBreadcrumbsProps {\n breadcrumbs: Array<CrumbDefinition>;\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const Breadcrumbs = ({\n breadcrumbs,\n onChangeFolder,\n currentFolderId,\n ...props\n}: BreadcrumbsProps) => {\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 if (onChangeFolder) {\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n type=\"button\"\n onClick={() => onChangeFolder(crumb.id!, crumb.path)}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </CrumbLink>\n );\n }\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n to={crumb.href}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - `tag` prop is not defined in the `BaseLinkProps` type\n tag={ReactRouterLink}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </CrumbLink>\n );\n }\n\n return (\n <Crumb\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n isCurrent={index + 1 === breadcrumbs.length}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </Crumb>\n );\n })}\n </BaseBreadcrumbs>\n );\n};\n","import { Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\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\ninterface EmptyAssetGridProps {\n count: number;\n size: 'S' | 'M';\n}\n\nexport const EmptyAssetGrid = ({ count, size }: EmptyAssetGridProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\n\nimport { EmptyAssetGrid } from './EmptyAssetGrid';\n\ninterface EmptyAssetsProps {\n action?: React.ReactNode;\n icon?: React.ElementType;\n content: string;\n size?: 'S' | 'M';\n count?: number;\n}\n\nexport const EmptyAssets = ({\n icon: Icon = EmptyDocuments,\n content,\n action,\n size = 'M',\n count = 12,\n}: EmptyAssetsProps) => {\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","import { createContext, useContext } from 'react';\n\nexport const FolderCardContext = createContext<{\n id?: string;\n}>({});\n\nexport function useFolderCard() {\n return useContext(FolderCardContext);\n}\n","import * as React from 'react';\n\nimport { Box, CardAction, Flex, BoxProps } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { NavLink, LinkProps } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { FolderCardContext } from '../contexts/FolderCard';\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 interface FolderCardProps extends Omit<BoxProps, 'id'> {\n ariaLabel: string;\n children: React.ReactNode;\n id?: string;\n startAction?: React.ReactNode;\n cardActions?: React.ReactNode;\n onClick?: () => void;\n to?: LinkProps['to'];\n}\n\nexport const FolderCard = React.forwardRef(\n (\n {\n children,\n startAction = null,\n cardActions = null,\n ariaLabel,\n onClick,\n to,\n ...props\n }: FolderCardProps,\n ref\n ) => {\n const generatedId = React.useId();\n const fodlerCtxValue = React.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 as={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} position=\"end\">\n {cardActions}\n </CardAction>\n </CardActionDisplay>\n </Flex>\n </Card>\n </FolderCardContext.Provider>\n );\n }\n);\n","import { Flex, FlexProps } 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: FlexProps) => {\n const { id } = useFolderCard();\n\n return (\n <StyledBox\n {...props}\n id={`${id}-title`}\n data-testid={`${id}-title`}\n alignItems=\"flex-start\"\n direction=\"column\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n position=\"relative\"\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, BoxProps } from '@strapi/design-system';\nimport { NavLink, LinkProps } 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\ninterface FolderCardBodyActionProps extends BoxProps {\n to?: LinkProps['to'];\n}\n\nexport const FolderCardBodyAction = ({ to, ...props }: FolderCardBodyActionProps) => {\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","import * as React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\n\nexport interface FolderGridListProps {\n children: React.ReactNode;\n title?: string | null;\n}\n\nexport const FolderGridList = ({ title = null, children }: FolderGridListProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { sortOptions } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport type { Query } from '../../../../shared/contracts/files';\n\ninterface SortPickerProps {\n onChangeSort: (value: Query['sort'] | string) => void;\n value?: string;\n}\n\nexport const SortPicker = ({ onChangeSort, value }: SortPickerProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SingleSelect\n size=\"S\"\n value={value}\n onChange={(value) => onChangeSort(value.toString())}\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","import { Avatar, Box, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport {\n createAssetUrl,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { VideoPreview } from '../AssetCard/VideoPreview';\n\nimport type { File } from '../../../../shared/contracts/files';\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\ninterface PreviewCellProps {\n content: File;\n type?: string;\n}\n\nexport const PreviewCell = ({ type, content }: PreviewCellProps) => {\n const { formatMessage } = useIntl();\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\n aria-label={formatMessage({\n id: getTrad('header.actions.add-assets.folder'),\n defaultMessage: 'folder',\n })}\n fill=\"secondary500\"\n width=\"1.6rem\"\n height=\"1.6rem\"\n />\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 (\n <Avatar.Item\n src={mediaURL}\n alt={alternativeText || undefined}\n preview\n fallback={alternativeText}\n />\n );\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","import { Typography } from '@strapi/design-system';\nimport parseISO from 'date-fns/parseISO';\nimport { useIntl } from 'react-intl';\n\nimport { formatBytes, getFileExtension } from '../../utils';\n\nimport { PreviewCell } from './PreviewCell';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface CellContentProps {\n cellType: string;\n contentType?: string;\n content: File;\n name: string;\n}\n\nexport const CellContent = ({ cellType, contentType, content, name }: CellContentProps) => {\n const { formatDate, formatMessage } = useIntl();\n const contentValue = content[name as Extract<keyof File, string>];\n\n switch (cellType) {\n case 'image':\n return <PreviewCell type={contentType} content={content} />;\n\n case 'date':\n if (typeof contentValue === 'string') {\n return <Typography>{formatDate(parseISO(contentValue), { dateStyle: 'full' })}</Typography>;\n }\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 if (typeof contentValue === 'string' || typeof contentValue === 'number') {\n return <Typography>{formatBytes(contentValue)}</Typography>;\n }\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 if (typeof contentValue === 'string') {\n return <Typography>{getFileExtension(contentValue)?.toUpperCase()}</Typography>;\n }\n case 'text':\n if (typeof contentValue === 'string') {\n return <Typography>{contentValue}</Typography>;\n }\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","import { Checkbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system';\nimport { Eye, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { tableHeaders as cells } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { CellContent } from './CellContent';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\n\ninterface FileRow extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\ninterface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface TableRowsProps {\n onChangeFolder?: ((folderId: number, folderPath?: string) => void) | null;\n onEditAsset: (asset: FileRow) => void;\n onEditFolder: (folder: FolderRow) => void;\n onSelectOne: (element: FileRow | FolderRow) => void;\n rows: FileRow[] | FolderRow[];\n selected: FileRow[] | FolderRow[];\n}\n\nexport const TableRows = ({\n onChangeFolder = null,\n onEditAsset,\n onEditFolder,\n onSelectOne,\n rows = [],\n selected = [],\n}: TableRowsProps) => {\n const { formatMessage } = useIntl();\n\n const handleRowClickFn = (\n element: FileRow | FolderRow,\n id: number,\n path: FolderRow['path'],\n elementType?: string\n ) => {\n if (elementType === 'asset') {\n onEditAsset(element as FileRow);\n } else {\n if (onChangeFolder) {\n onChangeFolder(id, path);\n }\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\n key={id}\n onClick={() => handleRowClickFn(element, id, path || undefined, contentType)}\n >\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 as FileRow}\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 (folderURL ? (\n <IconButton\n tag={Link}\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n to={folderURL}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n ) : (\n <IconButton\n tag=\"button\"\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n onClick={() => onChangeFolder && 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'\n ? onEditAsset(element as FileRow)\n : onEditFolder(element as FolderRow)\n }\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\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 { useIntl } from 'react-intl';\n\nimport { tableHeaders } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { TableRows } from './TableRows';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\n\nexport interface FileRow extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface TableListProps {\n isFolderSelectionAllowed?: boolean;\n allowedTypes?: AllowedTypes[];\n assetCount?: number;\n folderCount?: number;\n indeterminate?: boolean;\n onChangeSort?: ((sortQuery: string) => void) | null;\n onChangeFolder?: ((folderId: number, folderPath?: string) => void) | null;\n onEditAsset?: ((asset: FileRow) => void) | null;\n onEditFolder?: ((folder: FolderRow) => void) | null;\n onSelectAll: (checked: boolean | string, rows?: FolderRow[] | FileRow[]) => void;\n onSelectOne: (element: FileRow | FolderRow) => void;\n rows?: FileRow[] | FolderRow[];\n selected?: FileRow[] | FolderRow[];\n shouldDisableBulkSelect?: boolean;\n sortQuery?: string;\n}\n\nexport const TableList = ({\n assetCount = 0,\n folderCount = 0,\n indeterminate = false,\n onChangeSort = null,\n onChangeFolder = null,\n onEditAsset = null,\n onEditFolder = null,\n onSelectAll,\n onSelectOne,\n rows = [],\n selected = [],\n shouldDisableBulkSelect = false,\n sortQuery = '',\n}: TableListProps) => {\n const { formatMessage } = useIntl();\n const [sortBy, sortOrder] = sortQuery.split(':');\n\n const handleClickSort = (isSorted: boolean, name: string) => {\n const nextSortOrder = isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC';\n const nextSort = `${name}:${nextSortOrder}`;\n\n onChangeSort && 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 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","import { Tag } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { FilterStructure } from './FilterList';\n\ntype FilterTagAttribute = {\n fieldSchema?: {\n type?: string; // \"date\" | \"enumeration\"\n options?: {\n label: string; // \"audio\" | \"video\" | \"image\" | \"file\"\n value: string; // \"audio\" | \"video\" | \"image\" | \"file\"\n }[];\n };\n metadatas?: {\n label?: string; // \"createdAt\" | \"updatedAt\" | \"type\"\n };\n name: string; // \"createdAt\" | \"updatedAt\" | \"mime\"\n};\n\ninterface FilterTagProps {\n attribute: FilterTagAttribute;\n operator: string;\n value: string;\n filter: FilterStructure;\n onClick: (filter: FilterStructure) => void;\n}\n\nexport const FilterTag = ({ attribute, filter, onClick, operator, value }: FilterTagProps) => {\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(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\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","// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterList\n *\n */\nimport { FilterTag } from './FilterTag';\n\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport interface FilterListProps {\n appliedFilters: FilterStructure[];\n filtersSchema: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema?: {\n type?: string;\n mainField?: {\n name: string;\n type: string;\n };\n options?: {\n label: string;\n value: string;\n }[];\n };\n }[];\n onRemoveFilter: (filters: FilterStructure[]) => void;\n}\n\nexport const FilterList = ({ appliedFilters, filtersSchema, onRemoveFilter }: FilterListProps) => {\n const handleClick = (filter: FilterStructure) => {\n const nextFilters = appliedFilters.filter((prevFilter) => {\n const name = Object.keys(filter)[0];\n const filterName = filter[name];\n if (filterName !== undefined) {\n const filterType = Object.keys(filterName)[0];\n const filterValue = filterName[filterType];\n if (typeof filterValue === 'string') {\n const decodedValue = decodeURIComponent(filterValue);\n return prevFilter[name]?.[filterType] !== decodedValue;\n }\n }\n\n return true;\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 if (!attribute) {\n // Handle the case where attribute is undefined\n return null;\n }\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 as string}\n />\n );\n });\n};\n","import { DateTimePicker, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface FilterValueInputProps {\n label?: string;\n onChange: (value: string) => void;\n options?: { label?: string; value: string }[];\n type?: string;\n value?: string;\n}\n\nexport const FilterValueInput = ({\n label = '',\n onChange,\n options = [],\n type,\n value = '',\n}: FilterValueInputProps) => {\n const { formatMessage } = useIntl();\n\n if (type === 'date') {\n return (\n <DateTimePicker\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n aria-label={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 />\n );\n }\n\n return (\n <SingleSelect\n aria-label={label}\n onChange={(value: string | number) => onChange(value.toString())}\n value={value}\n >\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","interface GetFilterListProps {\n fieldSchema: {\n type: string;\n options?: { value: string }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n}\n\nexport const getFilterList = ({\n fieldSchema: { type: fieldType, mainField },\n}: GetFilterListProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React 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 { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\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.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\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: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\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 const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\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 (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\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 const 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 const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const 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","import * as React from 'react';\n\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { displayedFilters } from '../../../utils';\nimport { FilterList } from '../../FilterList/FilterList';\nimport { FilterPopover } from '../../FilterPopover/FilterPopover';\n\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport type Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\ninterface FiltersProps {\n appliedFilters: FilterStructure[];\n onChangeFilters: (filters: Filter[]) => void;\n}\n\nexport const Filters = ({ appliedFilters, onChangeFilters }: FiltersProps) => {\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((prev) => !prev)}\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","import { Box, Flex, SingleSelectOption, SingleSelect, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface PageSizeProps {\n onChangePageSize: (value: number) => void;\n pageSize: number;\n}\n\nexport const PageSize = ({ onChangePageSize, pageSize }: PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const handleChange = (value: string | number) => {\n onChangePageSize(Number(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","import * as React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\n\nconst PaginationContext = React.createContext({ activePage: 1, pageCount: 1 });\nexport const usePagination = () => React.useContext(PaginationContext);\n\ninterface PaginationProps {\n activePage: number;\n children: React.ReactNode;\n label?: string;\n pageCount: number;\n}\n\nexport const Pagination = ({\n children,\n activePage,\n pageCount,\n label = 'pagination',\n}: PaginationProps) => {\n const paginationValue = React.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","// TODO: find a better naming convention for the file that was an index file before\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 { Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { Pagination, usePagination } from './Pagination';\n\nconst PaginationText = styled(Typography)`\n line-height: revert;\n`;\n\nconst linkWrapperStyles = css<{ $active?: boolean }>`\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\nconst LinkWrapperButton = styled.button<{ $active?: boolean }>`\n ${linkWrapperStyles}\n`;\n\nconst LinkWrapperDiv = styled.div<{ $active?: boolean }>`\n ${linkWrapperStyles}\n`;\n\nLinkWrapperButton.defaultProps = { type: 'button' };\n\nconst PageLinkWrapper = styled(LinkWrapperButton)`\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(LinkWrapperButton)`\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(LinkWrapperDiv)`\n color: ${({ theme }) => theme.colors.neutral800};\n`;\n\ninterface PaginationLinkProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n}\n\ninterface PageLinkProps extends PaginationLinkProps {\n number: number;\n}\n\nconst PreviousLink = ({ children, ...props }: PaginationLinkProps) => {\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\nconst NextLink = ({ children, ...props }: PaginationLinkProps) => {\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\nconst PageLink = ({ number, children, ...props }: PageLinkProps) => {\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\ninterface DotsProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nconst Dots = ({ children, ...props }: DotsProps) => (\n <li>\n <DotsWrapper {...props} as=\"div\">\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden small>\n …\n </PaginationText>\n </DotsWrapper>\n </li>\n);\n\ninterface PaginationFooterProps {\n activePage: number;\n onChangePage: (page: number) => void;\n pagination: {\n pageCount: number;\n };\n}\n\nexport const PaginationFooter = ({\n activePage,\n onChangePage,\n pagination: { pageCount },\n}: PaginationFooterProps) => {\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: number[] = [];\n const lastLinks: JSX.Element[] = [];\n let lastLinksToCreate: number[] = [];\n const middleLinks: JSX.Element[] = [];\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\n\ninterface SearchAssetProps {\n onChangeSearch: (_q: Query['_q'] | null) => void;\n queryValue?: Query['_q'] | null;\n}\n\nexport const SearchAsset = ({ onChangeSearch, queryValue = null }: SearchAssetProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [isOpen, setIsOpen] = React.useState(!!queryValue);\n const [value, setValue] = React.useState(queryValue || '');\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n\n React.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: React.FormEvent<HTMLFormElement>) => {\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 aria-label=\"search\"\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","export const isSelectable = (allowedTypes: string[], 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","// TODO: find a better naming convention for the file that was an index file before\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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport {\n getBreadcrumbDataCM,\n toSingularTypes,\n getTrad,\n getAllowedFiles,\n BreadcrumbDataFolder,\n AllowedFiles,\n} from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList/AssetGridList';\nimport { Breadcrumbs } from '../../Breadcrumbs/Breadcrumbs';\nimport { EmptyAssets } from '../../EmptyAssets/EmptyAssets';\nimport { FolderCard } from '../../FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderGridList } from '../../FolderGridList/FolderGridList';\nimport { SortPicker } from '../../SortPicker/SortPicker';\nimport { TableList, FolderRow, FileRow } from '../../TableList/TableList';\n\nimport { Filters, FilterStructure as ImportedFilterStructure } from './Filters';\nimport { PageSize } from './PageSize';\nimport { PaginationFooter } from './PaginationFooter/PaginationFooter';\nimport { SearchAsset } from './SearchAsset/SearchAsset';\nimport { isSelectable } from './utils/isSelectable';\n\nimport type { File, Query, FilterCondition } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../../AssetCard/AssetCard';\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\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport type Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FolderWithType extends Omit<Folder, 'children' | 'files'> {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n children?: Folder['children'] & {\n count: number;\n };\n files?: Folder['files'] & {\n count: number;\n };\n}\n\nexport interface FileWithType extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface BrowseStepProps {\n allowedTypes?: AllowedTypes[];\n assets: File[];\n canCreate: boolean;\n canRead: boolean;\n folders?: FolderWithType[];\n multiple?: boolean;\n onAddAsset: () => void;\n onChangeFilters: (filters: FilterCondition<string>[] | Filter[]) => void;\n onChangeFolder: (id: number, path?: string) => void;\n onChangePage: (page: number) => void;\n onChangePageSize: (value: number) => void;\n onChangeSort: (value: Query['sort'] | string) => void;\n onChangeSearch: (_q?: Query['_q'] | null) => void;\n onEditAsset: ((asset: FileWithType) => void) | null;\n onEditFolder: ((folder: FolderRow) => void) | null;\n onSelectAsset: (element: FileRow | FolderRow) => void;\n onSelectAllAsset?: (checked: boolean | string, rows?: FolderRow[] | FileRow[]) => void;\n queryObject: Query;\n pagination: { pageCount: number };\n selectedAssets: FileWithType[] | FolderWithType[];\n}\n\nexport const BrowseStep = ({\n allowedTypes = [],\n assets: rawAssets,\n canCreate,\n canRead,\n folders = [],\n multiple = false,\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}: BrowseStepProps) => {\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 as number | null | undefined,\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\n ? getBreadcrumbDataCM(currentFolder as BreadcrumbDataFolder)\n : undefined;\n\n const allAllowedAsset = getAllowedFiles(allowedTypes, assets as AllowedFiles[]);\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 && queryObject.filters.$and.length > 0;\n const isSearchingOrFiltering = isSearching || isFiltering;\n const assetCount = assets.length;\n const folderCount = folders.length;\n const handleClickFolderCard = (...args: Parameters<typeof onChangeFolder>) => {\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 as ImportedFilterStructure[]}\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 && breadcrumbs.length > 0 && currentFolder && (\n <Box paddingTop={3}>\n <Breadcrumbs\n onChangeFolder={onChangeFolder}\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs as BreadcrumbDataFolder[]}\n currentFolderId={queryObject?.folder as number | undefined}\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={\n [...folders.map((folder) => ({ ...folder, type: 'folder' })), ...assets] as\n | FolderRow[]\n | FileRow[]\n }\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 as FileWithType[]}\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\n pageSize={queryObject.pageSize! as number}\n onChangePageSize={onChangePageSize}\n />\n <PaginationFooter\n activePage={queryObject.page as number}\n onChangePage={onChangePage}\n pagination={pagination}\n />\n </Flex>\n )}\n </Box>\n );\n};\n","import { Button, Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface DialogFooterProps {\n onClose: () => void;\n onValidate?: () => void;\n}\n\nexport const DialogFooter = ({ onClose, onValidate }: DialogFooterProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList/AssetGridList';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\ninterface SelectedStepProps {\n onSelectAsset: (asset: File) => void;\n selectedAssets: File[];\n onReorderAsset?: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const SelectedStep = ({\n selectedAssets,\n onSelectAsset,\n onReorderAsset,\n}: SelectedStepProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex gap={0} direction=\"column\" alignItems=\"start\">\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Divider, Flex, Loader, Modal, Tabs } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\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 {\n containsAssetFilter,\n getTrad,\n getAllowedFiles,\n moveElement,\n AllowedFiles,\n} from '../../utils';\nimport { EditAssetContent, Asset as EditAsset } from '../EditAssetDialog/EditAssetContent';\nimport { EditFolderContent } from '../EditFolderDialog/EditFolderDialog';\n\nimport {\n BrowseStep,\n FolderWithType,\n FileWithType,\n Filter as BrowseFilter,\n} from './BrowseStep/BrowseStep';\nimport { DialogFooter } from './DialogFooter';\nimport { SelectedStep } from './SelectedStep/SelectedStep';\n\nimport type { File as Asset, FilterCondition, Query } from '../../../../shared/contracts/files';\nimport type { Folder, FolderDefinition } from '../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\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 interface FileRow extends Asset {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\ninterface AssetContentProps {\n allowedTypes?: AllowedTypes[];\n folderId?: number | null;\n onClose: () => void;\n onAddAsset: (arg?: { folderId: number | { id: number } | null | undefined }) => void;\n onAddFolder: ({ folderId }: { folderId: number | { id: number } | null | undefined }) => void;\n onChangeFolder: (folderId: number | null) => void;\n onValidate: (selectedAssets: Asset[]) => void;\n multiple?: boolean;\n trackedLocation?: string;\n initiallySelectedAssets?: Asset[];\n}\n\nexport const AssetContent = ({\n allowedTypes = [],\n folderId = null,\n onClose,\n onAddAsset,\n onAddFolder,\n onChangeFolder,\n onValidate,\n multiple = false,\n initiallySelectedAssets = [],\n trackedLocation,\n}: AssetContentProps) => {\n const [assetToEdit, setAssetToEdit] = React.useState<FileWithType | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined>(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 as AllowedFiles[]);\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: Asset | FileRow | FolderRow) => {\n return multiple ? selectOne(asset as Asset) : selectOnly(asset as 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 as EditAsset}\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 as FolderDefinition}\n onClose={() => setFolderToEdit(undefined)}\n location=\"content-manager\"\n parentFolderId={queryObject?.folder as string | number | null | undefined}\n />\n );\n }\n\n const handleMoveItem = (hoverIndex: number, destIndex: number) => {\n const offset = destIndex - hoverIndex;\n const orderedAssetsClone = selectedAssets.slice();\n const nextAssets = moveElement<Asset>(orderedAssetsClone, hoverIndex, offset);\n setSelections(nextAssets);\n };\n\n const handleFolderChange = (folderId: number, folderPath?: string) => {\n onChangeFolder(folderId);\n if (onChangeFolderParam) {\n onChangeFolderParam(folderId, folderPath);\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 <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 as FolderWithType[]}\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={(filters: FilterCondition<string>[] | BrowseFilter[]) =>\n onChangeFilters!(filters as FilterCondition<string>[])\n }\n onChangeFolder={handleFolderChange}\n onChangePage={onChangePage!}\n onChangePageSize={onChangePageSize!}\n onChangeSort={(sort: string | undefined) => onChangeSort!(sort as Query['sort'])}\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\ninterface AssetDialogProps extends AssetContentProps {\n open?: boolean;\n}\n\nexport const AssetDialog = ({ open = false, onClose, ...restProps }: AssetDialogProps) => {\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\nconst TabsRoot = styled(Tabs.Root)`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n","import * as React 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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\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\ninterface FromComputerFormProps {\n onClose: () => void;\n onAddAssets: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromComputerForm = ({\n onClose,\n onAddAssets,\n trackedLocation,\n}: FromComputerFormProps) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { trackUsage } = useTracking();\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n inputRef.current?.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current?.files;\n const assets: FileWithRawFile[] = [];\n\n if (files) {\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n assets.push(asset);\n }\n }\n }\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'computer', location: trackedLocation });\n }\n\n onAddAssets(assets);\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\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 if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n assets.push(asset);\n }\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 aria-label={formatMessage({\n id: getTrad('input.label'),\n defaultMessage: 'Drag & Drop here or',\n })}\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","import * as React 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 { useIntl } from 'react-intl';\n\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = 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: unknown) {\n setError(e as Error);\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","import { Box, Divider, Modal, Tabs } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nimport { FromComputerForm } from './FromComputerForm';\nimport { FromUrlForm } from './FromUrlForm';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nexport interface FileWithRawFile extends Omit<File, 'id' | 'hash'> {\n id?: string;\n hash?: string;\n rawFile: RawFile;\n}\n\ninterface AddAssetStepProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const AddAssetStep = ({ onClose, onAddAsset, trackedLocation }: AddAssetStepProps) => {\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","import * as React 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 { 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/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\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 React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.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\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\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?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: 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","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Grid, KeyboardNavigable, Modal, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { AssetType } from '../../../constants';\nimport { getTrad } from '../../../utils';\nimport { AssetCard } from '../../AssetCard/AssetCard';\nimport { UploadingAssetCard } from '../../AssetCard/UploadingAssetCard';\n\nimport type { File, RawFile } from '../../../../../shared/contracts/files';\n\nconst Status = {\n Idle: 'IDLE',\n Uploading: 'UPLOADING',\n Intermediate: 'INTERMEDIATE',\n};\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\ninterface PendingAssetStepProps {\n addUploadedFiles?: (files: File[]) => void;\n folderId?: string | number | null;\n onClose: () => void;\n onEditAsset: (asset: File) => void;\n onRemoveAsset: (asset: File) => void;\n onAddAsset?: (asset: File) => void;\n assets: Asset[];\n onClickAddAsset: () => void;\n onCancelUpload: (rawFile: RawFile) => void;\n onUploadSucceed: (file: RawFile) => void;\n trackedLocation?: string;\n initialAssetsToAdd?: File[];\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}: PendingAssetStepProps) => {\n const assetCountRef = React.useRef(0);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [uploadStatus, setUploadStatus] = React.useState(Status.Idle);\n\n const handleSubmit = async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const assetsCountByType = assets.reduce(\n (acc: Record<AssetType, string | number>, asset) => {\n const { type } = asset;\n\n if (type !== undefined && !acc[type]) {\n acc[type] = 0;\n }\n\n if (type !== undefined) {\n const accType = acc[type];\n const currentCount = typeof accType === 'string' ? accType : accType.toString();\n acc[type] = `${parseInt(currentCount, 10) + 1}`;\n }\n\n return acc;\n },\n {} as Record<AssetType, string | number>\n );\n\n trackUsage('willAddMediaLibraryAssets', {\n location: trackedLocation!,\n ...assetsCountByType,\n });\n\n setUploadStatus(Status.Uploading);\n };\n\n const handleStatusChange = (status: string, file: RawFile) => {\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","import * as React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { EditAssetContent } from '../EditAssetDialog/EditAssetContent';\n\nimport { AddAssetStep } from './AddAssetStep/AddAssetStep';\nimport { PendingAssetStep } from './PendingAssetStep/PendingAssetStep';\n\nimport type { File, RawFile } from '../../../../shared/contracts/files';\nimport type { AllowedFiles } from '../../utils';\n\nconst Steps = {\n AddAsset: 'AddAsset',\n PendingAsset: 'PendingAsset',\n};\n\ninterface FileWithRawFile extends Omit<File, 'id' | 'hash'> {\n id?: string;\n hash?: string;\n rawFile: RawFile;\n}\n\ntype FileWithoutIdHash = Omit<File, 'id' | 'hash'>;\n\nexport interface Asset extends Omit<File, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: File['folder'] & { id: number };\n}\n\nexport interface UploadAssetDialogProps {\n addUploadedFiles?: (files: Asset[] | File[]) => void;\n folderId?: string | number | null;\n initialAssetsToAdd?: Asset[];\n onClose: () => void;\n open: boolean;\n trackedLocation?: string;\n validateAssetsTypes?: (\n assets: FileWithoutIdHash[] | Asset[],\n cb: (assets?: AllowedFiles[], error?: string) => void\n ) => void;\n}\n\nexport const UploadAssetDialog = ({\n initialAssetsToAdd,\n folderId = null,\n onClose = () => {},\n addUploadedFiles,\n trackedLocation,\n open,\n validateAssetsTypes = (_, cb) => cb(),\n}: UploadAssetDialogProps) => {\n const { formatMessage } = useIntl();\n const [step, setStep] = React.useState(initialAssetsToAdd ? Steps.PendingAsset : Steps.AddAsset);\n const [assets, setAssets] = React.useState(initialAssetsToAdd || []);\n const [assetToEdit, setAssetToEdit] = React.useState<File | Asset | undefined>(undefined);\n\n const handleAddToPendingAssets = (nextAssets: Asset[]) => {\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: RawFile) => {\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: RawFile) => {\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?: Asset | boolean | null) => {\n if (nextAsset && typeof nextAsset !== 'boolean') {\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: File) => {\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={(assets: FileWithRawFile[]) =>\n handleAddToPendingAssets(assets as unknown as Asset[])\n }\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 as Asset}\n canUpdate\n canCopyLink={false}\n canDownload={false}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n </Modal.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { AssetDialog } from '../AssetDialog/AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog/EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\nexport interface MediaLibraryDialogProps {\n allowedTypes?: AllowedTypes[];\n onClose: () => void;\n onSelectAssets: (selectedAssets: File[]) => void;\n}\n\nexport const MediaLibraryDialog = ({\n onClose,\n onSelectAssets,\n allowedTypes = ['files', 'images', 'videos', 'audios'],\n}: MediaLibraryDialogProps) => {\n const [step, setStep] = React.useState(STEPS.AssetSelect);\n const [folderId, setFolderId] = React.useState<number | null>(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","import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\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 }: { asset: FileAsset }) => {\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\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\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","import { CarouselActions, IconButton } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, prefixFileUrlWithBackendUrl } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\ninterface CarouselAssetActionsProps {\n asset: File;\n onDeleteAsset?: (asset: File) => void;\n onAddAsset?: (asset: File) => void;\n onEditAsset?: () => void;\n}\n\nexport const CarouselAssetActions = ({\n asset,\n onDeleteAsset,\n onAddAsset,\n onEditAsset,\n}: CarouselAssetActionsProps) => {\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","import * as React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\nconst TextAlignTypography = styled(Typography)`\n align-items: center;\n`;\n\ntype FileWithoutIdHash = Omit<File, 'id' | 'hash'>;\n\ninterface EmptyStateAssetProps {\n disabled?: boolean;\n onClick: (asset?: File, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDropAsset: (assets: FileWithoutIdHash[]) => void;\n}\n\nexport const EmptyStateAsset = ({\n disabled = false,\n onClick,\n onDropAsset,\n}: EmptyStateAssetProps) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n\n const handleDragEnter = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLButtonElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setDragOver(false);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n };\n\n const handleDrop = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets: FileWithoutIdHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\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 as unknown as React.MouseEventHandler<HTMLButtonElement>}\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","import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\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\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\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 if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { useField, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, getAllowedFiles, AllowedFiles } from '../../utils';\nimport { AssetDialog } from '../AssetDialog/AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog/EditFolderDialog';\nimport { UploadAssetDialog, Asset } from '../UploadAssetDialog/UploadAssetDialog';\n\nimport { CarouselAssets, CarouselAssetsProps, FileWithoutIdHash } from './Carousel/CarouselAssets';\n\nimport type { File } from '../../../../shared/contracts/files';\ntype AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport interface MediaLibraryInputProps {\n required?: boolean;\n name: string;\n labelAction?: React.ReactNode;\n label?: string;\n hint?: string;\n disabled?: boolean;\n attribute?: {\n allowedTypes?: AllowedTypes[];\n multiple?: boolean;\n };\n}\n\nexport const MediaLibraryInput = React.forwardRef<CarouselAssetsProps, MediaLibraryInputProps>(\n (\n {\n attribute: { allowedTypes = ['videos', 'files', 'images', 'audios'], multiple = false } = {},\n label,\n hint,\n disabled = false,\n labelAction = undefined,\n name,\n required = false,\n },\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] = React.useState<Asset[] | File[]>([]);\n const [step, setStep] = React.useState<string | undefined>(undefined);\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [droppedAssets, setDroppedAssets] = React.useState<AllowedFiles[]>();\n const [folderId, setFolderId] = React.useState<number | null>(null);\n const { toggleNotification } = useNotification();\n\n React.useEffect(() => {\n // Clear the uploaded files on close\n if (step === undefined) {\n setUploadedFiles([]);\n }\n }, [step]);\n\n let selectedAssets: File[] = [];\n\n if (Array.isArray(value)) {\n selectedAssets = value;\n } else if (value) {\n selectedAssets = [value];\n }\n\n const handleValidation = (nextSelectedAssets: File[]) => {\n const value = multiple ? nextSelectedAssets : nextSelectedAssets[0];\n onChange(name, value);\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 const value = nextValue;\n onChange(name, value);\n\n setSelectedIndex(0);\n };\n\n const handleDeleteAsset = (asset: File) => {\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(name, nextValue);\n\n setSelectedIndex(0);\n };\n\n const handleAssetEdit = (asset: File) => {\n const nextSelectedAssets = selectedAssets.map((prevAsset) =>\n prevAsset.id === asset.id ? asset : prevAsset\n );\n\n onChange(name, multiple ? nextSelectedAssets : nextSelectedAssets[0]);\n };\n\n const validateAssetsTypes = (\n assets: FileWithoutIdHash[] | Asset[],\n callback: (assets?: AllowedFiles[], error?: string) => void\n ) => {\n const allowedAssets = getAllowedFiles(fieldAllowedTypes, assets as AllowedFiles[]);\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: FileWithoutIdHash[]) => {\n validateAssetsTypes(assets, (allowedAssets?: AllowedFiles[]) => {\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: Asset[] | File[]) => {\n setUploadedFiles((prev) => [...prev, ...uploadedFiles]);\n };\n\n let initiallySelectedAssets = selectedAssets;\n\n if (uploadedFiles.length > 0) {\n const allowedUploadedFiles = getAllowedFiles(\n fieldAllowedTypes,\n uploadedFiles as AllowedFiles[]\n );\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 as AllowedTypes[]}\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 as Asset[]}\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","import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\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/App').then((mod) => ({ default: mod.Upload })),\n position: 4,\n });\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n async Component() {\n const { ProtectedSettingsPage } = await import('./pages/SettingsPage/SettingsPage');\n return { default: ProtectedSettingsPage };\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\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\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["useIntl","useNotification","useNotifyAT","useFetchClient","useQuery","data","React","stringify","byteSize","intervalToDuration","files","name","getTrad","error","pluginId","yup","errorsTrads","AssetType","AssetSource","useRBAC","endpoint","useTracking","useMutation","useQueryClient","jsx","Box","Grid","jsxs","Flex","Typography","styled","ChevronUp","ChevronDown","components","option","value","options","useTheme","ReactSelect","Cross","CaretDown","Modal","Cropper","useClipboard","IconButton","LinkIcon","ProgressBar","Dialog","ConfirmDialog","CardAsset","MuxPlayer","FilePdf","File","Wrapper","Badge","UploadProgressWrapper","FocusTrap","Menu","Check","Fragment","Trash","DownloadIcon","Resize","Button","VisuallyHidden","LoadingBody","isEqual","Loader","Formik","Form","Field","TextInput","isEmpty","useState","useEffect","Extension","CardAction","Card","isSelectable","CardHeader","CardCheckbox","Pencil","CardBody","CardContent","CardTitle","CardSubtitle","CardBadge","AudioPreviewWrapper","VideoPreviewWrapper","CardTimer","useDrop","useDrag","KeyboardNavigable","useLocation","useQueryParams","CrumbSimpleMenu","MenuItem","BaseBreadcrumbs","CrumbLink","ReactRouterLink","Crumb","Layouts","EmptyDocuments","createContext","useContext","Folder","NavLink","SingleSelect","SingleSelectOption","Avatar","parseISO","Tbody","Tr","Td","Checkbox","cells","Link","Eye","Table","Thead","Th","CaretUp","Tooltip","Tag","DateTimePicker","displayedFilters","filterToAdd","hasFilter","Popover","Plus","Filter","css","ChevronLeft","ChevronRight","SearchForm","Searchbar","Search","List","GridIcon","Divider","Page","folderId","Tabs","PicturePlus","Textarea","assets","STEPS","CarouselActions","CarouselInput","CarouselSlide","useField","uploadedFiles","Images"],"mappings":"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"}
1
+ {"version":3,"file":"index-BfAVIhAL.js","sources":["../../admin/src/pluginId.ts","../../admin/src/hooks/useAssets.ts","../../admin/src/hooks/useFolders.ts","../../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/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/utils/typeFromMime.ts","../../admin/src/utils/rawFileToAsset.ts","../../admin/src/utils/urlsToAssets.ts","../../admin/src/utils/urlYupSchema.ts","../../admin/src/constants.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/renameKeys.ts","../../admin/src/hooks/useFolderStructure.ts","../../admin/src/components/ContextInfo/ContextInfo.tsx","../../admin/src/components/SelectTree/Option.tsx","../../admin/src/components/SelectTree/utils/getOpenValues.ts","../../admin/src/components/SelectTree/utils/getValuesToClose.ts","../../admin/src/components/SelectTree/SelectTree.tsx","../../admin/src/components/EditAssetDialog/DialogHeader.tsx","../../admin/src/hooks/useCropImg.ts","../../admin/src/hooks/useUpload.ts","../../admin/src/components/CopyLinkButton/CopyLinkButton.tsx","../../admin/src/components/UploadProgress/UploadProgress.tsx","../../admin/src/hooks/useRemoveAsset.ts","../../admin/src/components/EditAssetDialog/RemoveAssetDialog.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.tsx","../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx","../../admin/src/components/EditAssetDialog/ReplaceMediaButton.tsx","../../admin/src/components/EditAssetDialog/EditAssetContent.tsx","../../admin/src/hooks/useBulkRemove.ts","../../admin/src/hooks/useEditFolder.ts","../../admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.tsx","../../admin/src/components/EditFolderDialog/RemoveFolderDialog.tsx","../../admin/src/components/EditFolderDialog/EditFolderDialog.tsx","../../admin/src/hooks/useFolder.ts","../../admin/src/hooks/usePersistentState.ts","../../admin/src/components/AssetCard/AssetCardBase.tsx","../../admin/src/components/AssetCard/AudioPreview.tsx","../../admin/src/components/AssetCard/AudioAssetCard.tsx","../../admin/src/components/AssetCard/DocAssetCard.tsx","../../admin/src/components/AssetCard/ImageAssetCard.tsx","../../admin/src/components/AssetCard/VideoPreview.tsx","../../admin/src/components/AssetCard/VideoAssetCard.tsx","../../admin/src/components/AssetCard/AssetCard.tsx","../../admin/src/components/AssetGridList/Draggable.tsx","../../admin/src/components/AssetGridList/AssetGridList.tsx","../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx","../../admin/src/components/Breadcrumbs/Breadcrumbs.tsx","../../admin/src/components/EmptyAssets/EmptyAssetGrid.tsx","../../admin/src/components/EmptyAssets/EmptyAssets.tsx","../../admin/src/components/FolderCard/contexts/FolderCard.tsx","../../admin/src/components/FolderCard/FolderCard/FolderCard.tsx","../../admin/src/components/FolderCard/FolderCardBody/FolderCardBody.tsx","../../admin/src/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.tsx","../../admin/src/components/FolderGridList/FolderGridList.tsx","../../admin/src/components/SortPicker/SortPicker.tsx","../../admin/src/components/TableList/PreviewCell.tsx","../../admin/src/components/TableList/CellContent.tsx","../../admin/src/components/TableList/TableRows.tsx","../../admin/src/components/TableList/TableList.tsx","../../admin/src/components/FilterList/FilterTag.tsx","../../admin/src/components/FilterList/FilterList.tsx","../../admin/src/components/FilterPopover/FilterValueInput.tsx","../../admin/src/components/FilterPopover/utils/getFilterList.ts","../../admin/src/components/FilterPopover/FilterPopover.tsx","../../admin/src/components/AssetDialog/BrowseStep/Filters.tsx","../../admin/src/components/AssetDialog/BrowseStep/PageSize.tsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.tsx","../../admin/src/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.tsx","../../admin/src/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.tsx","../../admin/src/components/AssetDialog/BrowseStep/utils/isSelectable.ts","../../admin/src/components/AssetDialog/BrowseStep/BrowseStep.tsx","../../admin/src/components/AssetDialog/DialogFooter.tsx","../../admin/src/components/AssetDialog/SelectedStep/SelectedStep.tsx","../../admin/src/components/AssetDialog/AssetDialog.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx","../../admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.tsx","../../admin/src/components/AssetCard/UploadingAssetCard.tsx","../../admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.tsx","../../admin/src/components/UploadAssetDialog/UploadAssetDialog.tsx","../../admin/src/components/MediaLibraryDialog/MediaLibraryDialog.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.tsx","../../admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.tsx","../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx","../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx","../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nexport const pluginId = pluginPkg.name.replace(/^@strapi\\//i, '');\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';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\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';\n\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\n\nimport type { Query } from '../../../shared/contracts/files';\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","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?: string | number | null;\n children?: FolderStructureValue[];\n label?: string;\n}\n\ntype Value = number | null | { value: number | null };\n\nexport function findRecursiveFolderByValue(\n data: FolderStructureValue[],\n value: Value\n): FolderStructureValue | undefined {\n let result: FolderStructureValue | undefined;\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","import { toSingularTypes } from './toSingularTypes';\n\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\nexport interface 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 { FetchError } from '@strapi/admin/strapi-admin';\nimport type { errors } from '@strapi/utils';\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';\n\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 { 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\nexport interface 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 const 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 { stringify } from 'qs';\n\nimport type { Query } from '../../../shared/contracts/files';\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 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: string | number | null;\n children?: FolderStructureValue[];\n}\n\ntype Parents = { id?: number | string | null; label?: string; path?: string }[];\n\nexport const getFolderParents = (folders: FolderStructureValue[], currentFolderId: number) => {\n const parents: 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 const 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 = <T = number>(array: T[], 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 = <T = number>(array: T[], 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","import { AssetType } from '../constants';\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","import { AssetSource } from '../constants';\n\nimport { typeFromMime } from './typeFromMime';\n\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","import { AssetSource } from '../constants';\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 ? fullFilledAsset.mime : undefined,\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 { getTrad } from './utils';\n\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\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 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 pageSizes = [10, 20, 50, 100];\n\nexport const localStorageKeys = {\n modalView: `STRAPI_UPLOAD_MODAL_VIEW`,\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n LIST: 1,\n};\n","import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\nconst { main: _main, ...restPermissions } = PERMISSIONS;\n\ntype UseRBACReturnType = ReturnType<typeof useRBAC>;\n\ntype AllowedActionsType = UseRBACReturnType['allowedActions'];\n\nexport const useMediaLibraryPermissions = (): AllowedActionsType & { isLoading: boolean } => {\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';\n\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\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';\n\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nexport const 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'] | null) => {\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 (newState as Record<string, string | number | undefined>)[key] = (\n queryObject as Record<string, string | number | undefined>\n )[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","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';\n\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\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): unknown =>\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 { FolderNode, GetFolderStructure } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport { recursiveRenameKeys } from './utils/renameKeys';\n\nconst FIELD_MAPPING: Record<string, string> = {\n name: 'label',\n id: 'value',\n};\n\ninterface FolderNodeWithChildren extends Omit<FolderNode, 'children'> {\n children: FolderNodeWithChildren[];\n label?: string;\n value: string | number | null;\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 const children = data.map((f: FolderNodeWithChildren) =>\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 { Box, Flex, Grid, Typography } from '@strapi/design-system';\n\ninterface ContextInfoProps {\n blocks: { label: string; value: string | number | null }[];\n}\n\nexport const ContextInfo = ({ blocks }: ContextInfoProps) => {\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","import * as React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { ChevronDown, ChevronUp } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { components, OptionProps as ReactSelectOptionProps } from 'react-select';\nimport { styled } from 'styled-components';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\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\ninterface SelectProps {\n maxDisplayDepth: number;\n openValues: string[];\n onOptionToggle: (value: string) => void;\n}\n\ninterface FolderWithDepth extends Folder {\n depth: number;\n value: string;\n}\n\ninterface OptionProps extends ReactSelectOptionProps<FolderWithDepth, false> {\n selectProps: SelectProps & ReactSelectOptionProps<FolderWithDepth, false>['selectProps'];\n}\n\nexport const Option = ({ children, data, selectProps, ...props }: OptionProps) => {\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 data={data} selectProps={selectProps} {...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 && 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: React.MouseEvent<HTMLButtonElement>) => {\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","interface Option {\n value: number | string | null;\n parent?: number | string | null;\n}\n\ninterface DefaultValue {\n value?: number | string | null;\n}\n\nexport function getOpenValues(options: Option[], defaultValue: DefaultValue = {}) {\n const values: Option['value'][] = [];\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 const option = options.find(({ value }) => value === parent);\n\n if (!option) {\n break;\n }\n\n values.push(option.value);\n parent = option.parent;\n }\n\n return values.reverse();\n}\n","interface Option {\n value: string | number | null;\n depth: number;\n}\n\nexport function getValuesToClose(options: Option[], value: number | string | null) {\n const optionForValue = options.find((option) => option.value === value);\n\n if (!optionForValue) {\n return [];\n }\n\n return options\n .filter((option) => option.depth >= optionForValue.depth)\n .map((option) => option.value);\n}\n","import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { Cross, CaretDown } from '@strapi/icons';\nimport ReactSelect, {\n components,\n GroupBase,\n StylesConfig,\n ClearIndicatorProps,\n} from 'react-select';\nimport { styled, useTheme, DefaultTheme } from 'styled-components';\n\nimport { Option } from './Option';\nimport { flattenTree, FlattenedNode } from './utils/flattenTree';\nimport { getOpenValues } from './utils/getOpenValues';\nimport { getValuesToClose } from './utils/getValuesToClose';\n\nconst hasParent = (option: FlattenedNode<string | number | null>) => !option.parent;\n\nexport type OptionSelectTree = {\n value: string | number | null;\n label?: string;\n children?: OptionSelectTree[];\n};\n\nexport interface SelectTreeProps<\n Option = unknown,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n IsMulti extends boolean = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Group extends GroupBase<Option> = GroupBase<Option>,\n> {\n maxDisplayDepth?: number;\n defaultValue?: {\n value?: string | number | null;\n };\n options: OptionSelectTree[];\n onChange?: (value: Record<string, string | number>) => void;\n name?: string;\n menuPortalTarget?: HTMLElement | null;\n inputId?: string;\n error?: string;\n ariaErrorMessage?: string;\n isDisabled?: boolean;\n disabled?: boolean;\n}\n\nexport const SelectTree = ({\n options: defaultOptions,\n maxDisplayDepth = 5,\n defaultValue,\n ...props\n}: SelectTreeProps) => {\n const flatDefaultOptions = React.useMemo(() => flattenTree(defaultOptions), [defaultOptions]);\n const optionsFiltered = React.useMemo(\n () => flatDefaultOptions.filter(hasParent),\n [flatDefaultOptions]\n );\n const [options, setOptions] = React.useState(optionsFiltered);\n const [openValues, setOpenValues] = React.useState(\n getOpenValues(flatDefaultOptions, defaultValue)\n );\n\n React.useEffect(() => {\n if (openValues.length === 0) {\n setOptions(flatDefaultOptions.filter((option) => option.parent === undefined));\n } else {\n const allOpenValues = openValues.reduce<(string | number | null)[]>((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: string | number | null) => {\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\ntype SelectOption = { value?: string | number | null; label?: string };\n\ninterface SelectProps<\n Option = SelectOption,\n IsMulti extends boolean = false,\n Group extends GroupBase<Option> = GroupBase<Option>,\n> {\n components?: object;\n styles?: StylesConfig<Option, IsMulti, Group>;\n error?: string;\n ariaErrorMessage?: string;\n options: OptionSelectTree[];\n defaultValue?: {\n value?: string | number | null;\n };\n isSearchable?: boolean;\n maxDisplayDepth?: number;\n openValues?: (string | number | null)[];\n onOptionToggle?: (value: string | number | null) => void;\n}\n\nconst Select = ({\n components = {},\n styles = {},\n error,\n ariaErrorMessage,\n ...props\n}: SelectProps) => {\n const theme = useTheme();\n const customStyles = getSelectStyles(theme, error);\n\n return (\n <ReactSelect\n menuPosition=\"fixed\"\n components={{\n ...components,\n ClearIndicator,\n DropdownIndicator,\n IndicatorSeparator: () => null,\n LoadingIndicator: () => null,\n }}\n aria-errormessage={error && ariaErrorMessage}\n aria-invalid={!!error}\n styles={\n { ...customStyles, ...styles } as StylesConfig<SelectOption, false, GroupBase<SelectOption>>\n }\n {...props}\n />\n );\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 = (\n props: ClearIndicatorProps<SelectOption, false, GroupBase<SelectOption>>\n) => {\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 }: { innerProps: object }) => {\n return (\n <CarretBox paddingRight={3} {...innerProps}>\n <CaretDown />\n </CarretBox>\n );\n};\n\nconst getSelectStyles = (\n theme: DefaultTheme,\n error?: string\n): StylesConfig<SelectOption, false, GroupBase<SelectOption>> => {\n return {\n clearIndicator: (base: object) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n container: (base: object) => ({\n ...base,\n background: theme.colors.neutral0,\n lineHeight: 'normal',\n }),\n control(base: object, state: { isFocused: boolean; isDisabled: boolean }) {\n let borderColor = theme.colors.neutral200;\n let boxShadowColor: string | undefined = undefined;\n let backgroundColor: string | undefined = undefined;\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: object) => ({ ...base, padding: 0, paddingRight: theme.spaces[3] }),\n input: (base: object) => ({\n ...base,\n margin: 0,\n padding: 0,\n color: theme.colors.neutral800,\n gridTemplateColumns: '0 100%',\n }),\n menuPortal: (base: object) => ({\n ...base,\n zIndex: theme.zIndices.dialog,\n pointerEvents: 'auto',\n }),\n menu(base: object) {\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: object) => ({\n ...base,\n paddingLeft: theme.spaces[1],\n paddingTop: theme.spaces[1],\n paddingRight: theme.spaces[1],\n paddingBottom: theme.spaces[1],\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n option(base: any, state: { isFocused: boolean; isSelected: boolean }) {\n let backgroundColor = base?.backgroundColor as string;\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: object) => ({\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: object, state: { isDisabled: boolean }) {\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: object) => ({\n ...base,\n cursor: 'pointer',\n padding: 0,\n paddingLeft: theme.spaces[4],\n marginLeft: 0,\n marginRight: 0,\n }),\n };\n};\n","import { 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 checkCrossOrigin: 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';\n\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends Omit<File, 'id' | 'hash'> {\n rawFile?: RawFile;\n id?: File['id'];\n hash?: File['hash'];\n}\n\nconst uploadAsset = (\n asset: Asset,\n folderId: number | null,\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 | null }\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 | null) =>\n mutation.mutateAsync({ asset, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n isLoading: mutation.isLoading,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport { useNotification, useClipboard } from '@strapi/admin/strapi-admin';\nimport { IconButton } from '@strapi/design-system';\nimport { Link as LinkIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const CopyLinkButton = ({ url }: { url: string }) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Flex, ProgressBar, Typography } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { UpdateFile } from '../../../../shared/contracts/files';\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 interface UploadProgressProps {\n error?: UpdateFile.Response['error'] | Error | null;\n onCancel: () => void;\n progress?: number;\n}\n\nexport const UploadProgress = ({ onCancel, progress = 0, error }: UploadProgressProps) => {\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} />\n <Typography>{`${progress}/100%`}</Typography>\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","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { pluginId } from '../pluginId';\n\nimport type { DeleteFile } from '../../../shared/contracts/files';\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 { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\n\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface RemoveAssetDialogProps {\n open: boolean;\n onClose: (open: boolean | null) => void;\n asset: File;\n}\n\nexport const RemoveAssetDialog = ({ open, onClose, asset }: RemoveAssetDialogProps) => {\n // `null` means asset is deleted\n const { removeAsset } = useRemoveAsset(() => {\n onClose(null);\n });\n\n const handleConfirm = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\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","/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps {\n mime: string;\n name: string;\n url: string;\n onLoad?: () => void;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const { formatMessage } = useIntl();\n\n if (mime.includes(AssetType.Image)) {\n return (\n <img ref={ref as React.ForwardedRef<HTMLImageElement>} src={url} alt={name} {...props} />\n );\n }\n\n if (mime.includes(AssetType.Video)) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (mime.includes(AssetType.Audio)) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n if (mime.includes('pdf')) {\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n }\n\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n","// TODO: find a better naming convention for the file that was an index file before\nimport { 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 height: 26px;\n }\n\n img,\n mux-player {\n margin: 0;\n padding: 0;\n max-height: 26.4rem;\n max-width: 100%;\n }\n\n mux-player {\n --play-button: inline-flex;\n --mute-button: inline-flex;\n --pip-button: inline-flex;\n --fullscreen-button: inline-flex;\n --playback-rate-button: inline-flex;\n --volume-range: inline-flex;\n --time-range: inline-flex;\n --time-display: inline-flex;\n --duration-display: inline-flex;\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 { Flex, FocusTrap, IconButton, Menu } from '@strapi/design-system';\nimport { Check, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTrad } from '../../../utils';\n\nimport { CroppingActionRow } from './PreviewComponents';\n\ninterface CroppingActionsProps {\n onCancel: () => void;\n onValidate: () => void;\n onDuplicate?: () => void;\n}\n\nexport const CroppingActions = ({ onCancel, onValidate, onDuplicate }: CroppingActionsProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React 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 { useIntl } from 'react-intl';\n\nimport { 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/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } from '../../../../../shared/contracts/files';\n\nimport 'cropperjs/dist/cropper.css';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n}\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}: PreviewBoxProps) => {\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.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 React.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 React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.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!)) as File;\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(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\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","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, VisuallyHidden, ButtonProps } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\ninterface ReplaceMediaButtonProps extends ButtonProps {\n acceptedMime: string;\n onSelectMedia: (file?: File) => void;\n trackedLocation?: string;\n}\n\nexport const ReplaceMediaButton = ({\n onSelectMedia,\n acceptedMime,\n trackedLocation,\n ...props\n}: ReplaceMediaButtonProps) => {\n const { formatMessage } = useIntl();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { trackUsage } = useTracking();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\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 data-testid=\"file-input\"\n tabIndex={-1}\n ref={inputRef}\n onChange={handleChange}\n aria-hidden\n />\n </VisuallyHidden>\n </>\n );\n};\n","/**\n *\n * EditAssetDialog\n *\n */\nimport * as React 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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useEditAsset } from '../../hooks/useEditAsset';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { findRecursiveFolderByValue, getTrad, getFileExtension, formatBytes } from '../../utils';\nimport { ContextInfo } from '../ContextInfo/ContextInfo';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport { DialogHeader } from './DialogHeader';\nimport { PreviewBox } from './PreviewBox/PreviewBox';\nimport { ReplaceMediaButton } from './ReplaceMediaButton';\n\nimport type { File as FileDefinition, RawFile } from '../../../../shared/contracts/files';\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 interface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface EditAssetContentProps {\n asset?: Asset;\n canUpdate?: boolean;\n canCopyLink?: boolean;\n canDownload?: boolean;\n trackedLocation?: string;\n onClose: (arg?: Asset | null | boolean) => void;\n}\n\ninterface FormInitialData {\n name?: string;\n alternativeText?: string;\n caption?: string;\n parent?: {\n value?: number;\n label: string;\n };\n}\n\nexport const EditAssetContent = ({\n onClose,\n asset,\n canUpdate = false,\n canCopyLink = false,\n canDownload = false,\n trackedLocation,\n}: EditAssetContentProps) => {\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const submitButtonRef = React.useRef<HTMLButtonElement>(null);\n const [isCropping, setIsCropping] = React.useState(false);\n const [replacementFile, setReplacementFile] = React.useState<File | undefined>();\n const { editAsset, isLoading } = useEditAsset();\n\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n\n const handleSubmit = async (values: FormInitialData) => {\n const nextAsset = { ...asset, ...values, folder: values.parent?.value } as Asset;\n\n if (asset?.isLocal) {\n onClose(nextAsset);\n } else {\n const editedAsset = (await editAsset(nextAsset, replacementFile!)) as Asset;\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?: { [key: string]: unknown }) => {\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 ? asset.size : 0),\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 ? 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 ? asset.id : null,\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\ninterface EditAssetDialogProps {\n asset: Asset;\n canUpdate?: boolean;\n canCopyLink?: boolean;\n canDownload?: boolean;\n trackedLocation?: string;\n open: boolean;\n onClose: (arg?: Asset | null | boolean) => void;\n}\n\nexport const EditAssetDialog = ({\n open,\n onClose,\n canUpdate = false,\n canCopyLink = false,\n canDownload = false,\n ...restProps\n}: EditAssetDialogProps) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditAssetContent\n onClose={onClose}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n {...restProps}\n />\n </Modal.Content>\n </Modal.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkDeleteFiles, File } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nimport type { BulkDeleteFolders, FolderDefinition } from '../../../shared/contracts/folders';\n\nexport interface FileWithType extends File {\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 | FolderDefinition>) => {\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 | FolderDefinition>\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';\n\nimport { CreateFolders, UpdateFolder } from '../../../shared/contracts/folders';\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 async onSuccess() {\n await queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n await 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 { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\ninterface EditFolderModalHeaderProps {\n isEditing?: boolean;\n}\n\nexport const EditFolderModalHeader = ({ isEditing = false }: EditFolderModalHeaderProps) => {\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","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Dialog } from '@strapi/design-system';\n\ninterface RemoveFolderDialogProps {\n onClose: () => void;\n onConfirm: () => void;\n open: boolean;\n}\n\nexport const RemoveFolderDialog = ({ onClose, onConfirm, open }: RemoveFolderDialogProps) => {\n return (\n <Dialog.Root open={open} onOpenChange={onClose}>\n <ConfirmDialog onConfirm={onConfirm} />\n </Dialog.Root>\n );\n};\n","import * as React 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, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\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/ContextInfo';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport { EditFolderModalHeader } from './ModalHeader/ModalHeader';\nimport { RemoveFolderDialog } from './RemoveFolderDialog';\n\nimport type { FolderDefinition } from '../../../../shared/contracts/folders';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\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\ninterface ValuesSubmit {\n name: string;\n parent: null | { label?: string; value?: number };\n}\n\nexport interface EditFolderDialogProps {\n parentFolderId?: string | number | null;\n location?: string;\n folder?: FolderDefinition;\n open?: boolean;\n onClose: (payload?: { created?: boolean | undefined } | boolean) => void;\n}\n\nexport const EditFolderContent = ({\n onClose,\n folder,\n location,\n parentFolderId,\n}: EditFolderDialogProps) => {\n const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure({\n enabled: true,\n });\n const { canCreate, isLoading: isLoadingPermissions, canUpdate } = useMediaLibraryPermissions();\n const [showConfirmDialog, setShowConfirmDialog] = React.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: ValuesSubmit = !folderStructureIsLoading\n ? {\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.toString(), 10) : undefined,\n label: parentFolderId\n ? folderStructure &&\n findRecursiveFolderByValue(folderStructure, parseInt(parentFolderId.toString(), 10))\n ?.label\n : folderStructure?.[0].label,\n },\n }\n : {\n name: '',\n parent: null,\n };\n\n const handleSubmit = async (\n values: ValuesSubmit,\n { setErrors }: { setErrors: (errors: FormikErrors<ValuesSubmit>) => void }\n ) => {\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.toString(), 10) !== values.parent?.value\n : parentFolderId === null && !!values.parent?.value;\n trackUsage('didEditMediaLibraryElements', {\n location,\n type: 'folder',\n changeLocation: didChangeLocation,\n });\n } else {\n trackUsage('didAddMediaLibraryFolders', { location: location! });\n }\n\n onClose({ created: true });\n } catch (err) {\n const errors = getAPIInnerErrors(err as FetchError, { getTrad });\n const formikErrors = Object.entries(errors!).reduce(\n (acc: Record<string, string>, [key, error]) => {\n acc[key] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n };\n\n const handleDelete = async () => {\n if (folder) {\n await remove([folder]);\n }\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\n name=\"name\"\n error={typeof errors.name === 'string' ? errors.name : undefined}\n >\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={typeof errors.parent === 'string' ? errors.parent : undefined}\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 {typeof errors.parent === 'string' ? errors.parent : undefined}\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\nexport const EditFolderDialog = ({ open, onClose, ...restProps }: EditFolderDialogProps) => {\n return (\n <Modal.Root open={open} onOpenChange={onClose}>\n <Modal.Content>\n <EditFolderContent {...restProps} onClose={onClose} open={open} />\n </Modal.Content>\n </Modal.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { GetFolder } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport const useFolder = (id: number | null | undefined, { 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 { 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","import * as 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 Typography,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\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 interface AssetCardBaseProps {\n children?: React.ReactNode;\n extension: string;\n isSelectable?: boolean;\n name: string;\n onSelect?: () => void;\n onRemove?: () => void;\n onEdit?: (\n event:\n | React.MouseEvent<HTMLButtonElement, MouseEvent>\n | React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n selected?: boolean;\n subtitle?: string;\n variant: 'Image' | 'Video' | 'Audio' | 'Doc';\n}\n\nexport const AssetCardBase = ({\n children,\n extension,\n isSelectable = true,\n name,\n onSelect,\n onRemove,\n onEdit,\n selected = false,\n subtitle = '',\n variant = 'Image',\n}: AssetCardBaseProps) => {\n const { formatMessage } = useIntl();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onEdit) {\n onEdit(e);\n }\n };\n\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: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n e.stopPropagation();\n };\n\n return (\n <CardContainer role=\"button\" height=\"100%\" tabIndex={-1} onClick={handleClick}>\n <CardHeader>\n {isSelectable && (\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 <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{name}</CardTitle>\n </Typography>\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","/* eslint-disable jsx-a11y/media-has-caption */\nimport { Box } from '@strapi/design-system';\n\ninterface AudioPreviewProps {\n alt: string;\n url: string;\n}\n\nexport const AudioPreview = ({ url, alt }: AudioPreviewProps) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n","import { Box, CardAsset, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } 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\ninterface AudioAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n url: string;\n}\n\nexport const AudioAssetCard = ({\n name,\n url,\n size = 'M',\n selected = false,\n ...restProps\n}: AudioAssetCardProps) => {\n return (\n <AssetCardBase name={name} selected={selected} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <Flex alignItems=\"center\">\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface DocAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n extension: string;\n}\n\nexport const DocAssetCard = ({\n name,\n extension,\n size = 'M',\n selected = false,\n ...restProps\n}: DocAssetCardProps) => {\n const { formatMessage } = useIntl();\n return (\n <AssetCardBase\n name={name}\n extension={extension}\n selected={selected}\n {...restProps}\n variant=\"Doc\"\n >\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n {extension === 'pdf' ? (\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n ) : (\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n )}\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n","import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\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 const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n","import * as React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\ninterface VideoPreviewProps {\n alt: string;\n url: string;\n mime: string;\n onLoadDuration?: (duration?: number) => void;\n size?: 'S' | 'M';\n}\n\nexport const VideoPreview = ({\n url,\n mime,\n onLoadDuration = () => {},\n alt,\n ...props\n}: VideoPreviewProps) => {\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (e.currentTarget.currentTime > 0) {\n const video = e.currentTarget;\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 && onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" key={url} {...props}>\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","import * as React from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } 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\ninterface VideoAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n mime: string;\n url: string;\n size?: 'S' | 'M';\n}\n\nexport const VideoAssetCard = ({\n name,\n url,\n mime,\n size = 'M',\n selected = false,\n ...props\n}: VideoAssetCardProps) => {\n const [duration, setDuration] = React.useState<number>();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase selected={selected} 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","import { 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\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n}: AssetCardProps) => {\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 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 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 {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n","import * as React from 'react';\n\nimport { useDrag, useDrop } from 'react-dnd';\n\ninterface DraggableProps {\n id: string | number;\n index: number;\n children: React.ReactNode;\n moveItem: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const Draggable = ({ children, id, index, moveItem }: DraggableProps) => {\n const ref = React.useRef(null);\n\n const [, drop] = useDrop({\n accept: 'draggable',\n hover(hoveredOverItem: { id: number; index: number }) {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\n\nimport { AssetCard } from '../AssetCard/AssetCard';\n\nimport { Draggable } from './Draggable';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\n\nexport interface AssetGridListProps {\n allowedTypes?: AllowedTypes[];\n assets: File[];\n onEditAsset?: (asset: File) => void;\n onSelectAsset: (asset: File) => void;\n selectedAssets: File[];\n size?: 'S' | 'M';\n onReorderAsset?: (fromIndex: number, toIndex: number) => void;\n title?: string | null;\n}\n\nexport const AssetGridList = ({\n allowedTypes = ['files', 'images', 'videos', 'audios'],\n assets,\n onEditAsset,\n onSelectAsset,\n selectedAssets,\n size = 'M',\n onReorderAsset,\n title = null,\n}: AssetGridListProps) => {\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","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.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) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n 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(Number(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: typeof ascendant?.id === 'string' ? ascendant.id : undefined,\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem isLink href={url} key={ascendant.id}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n","import {\n Breadcrumbs as BaseBreadcrumbs,\n Crumb,\n CrumbLink,\n BreadcrumbsProps as BaseBreadcrumbsProps,\n} from '@strapi/design-system';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link as ReactRouterLink } from 'react-router-dom';\n\nimport { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync';\n\nexport type CrumbDefinition = {\n id?: number | null;\n label?: MessageDescriptor | string;\n href?: string;\n path?: string;\n};\n\nexport interface BreadcrumbsProps extends BaseBreadcrumbsProps {\n breadcrumbs: Array<CrumbDefinition>;\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const Breadcrumbs = ({\n breadcrumbs,\n onChangeFolder,\n currentFolderId,\n ...props\n}: BreadcrumbsProps) => {\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 if (onChangeFolder) {\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n type=\"button\"\n onClick={() => onChangeFolder(crumb.id!, crumb.path)}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </CrumbLink>\n );\n }\n return (\n <CrumbLink\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n to={crumb.href}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - `tag` prop is not defined in the `BaseLinkProps` type\n tag={ReactRouterLink}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </CrumbLink>\n );\n }\n\n return (\n <Crumb\n key={`breadcrumb-${crumb?.id ?? 'root'}`}\n isCurrent={index + 1 === breadcrumbs.length}\n >\n {typeof crumb.label !== 'string' && crumb.label?.id\n ? formatMessage(crumb.label)\n : (crumb.label as string)}\n </Crumb>\n );\n })}\n </BaseBreadcrumbs>\n );\n};\n","import { Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\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\ninterface EmptyAssetGridProps {\n count: number;\n size: 'S' | 'M';\n}\n\nexport const EmptyAssetGrid = ({ count, size }: EmptyAssetGridProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\n\nimport { EmptyAssetGrid } from './EmptyAssetGrid';\n\ninterface EmptyAssetsProps {\n action?: React.ReactNode;\n icon?: React.ElementType;\n content: string;\n size?: 'S' | 'M';\n count?: number;\n}\n\nexport const EmptyAssets = ({\n icon: Icon = EmptyDocuments,\n content,\n action,\n size = 'M',\n count = 12,\n}: EmptyAssetsProps) => {\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","import { createContext, useContext } from 'react';\n\nexport const FolderCardContext = createContext<{\n id?: string;\n}>({});\n\nexport function useFolderCard() {\n return useContext(FolderCardContext);\n}\n","import * as React from 'react';\n\nimport { Box, CardAction, Flex, BoxProps } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { NavLink, LinkProps } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { FolderCardContext } from '../contexts/FolderCard';\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 interface FolderCardProps extends Omit<BoxProps, 'id'> {\n ariaLabel: string;\n children: React.ReactNode;\n id?: string;\n startAction?: React.ReactNode;\n cardActions?: React.ReactNode;\n onClick?: () => void;\n to?: LinkProps['to'];\n}\n\nexport const FolderCard = React.forwardRef(\n (\n {\n children,\n startAction = null,\n cardActions = null,\n ariaLabel,\n onClick,\n to,\n ...props\n }: FolderCardProps,\n ref\n ) => {\n const generatedId = React.useId();\n const fodlerCtxValue = React.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 as={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} position=\"end\">\n {cardActions}\n </CardAction>\n </CardActionDisplay>\n </Flex>\n </Card>\n </FolderCardContext.Provider>\n );\n }\n);\n","import { Flex, FlexProps } 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: FlexProps) => {\n const { id } = useFolderCard();\n\n return (\n <StyledBox\n {...props}\n id={`${id}-title`}\n data-testid={`${id}-title`}\n alignItems=\"flex-start\"\n direction=\"column\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n position=\"relative\"\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport { Box, BoxProps } from '@strapi/design-system';\nimport { NavLink, LinkProps } 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\ninterface FolderCardBodyActionProps extends BoxProps {\n to?: LinkProps['to'];\n}\n\nexport const FolderCardBodyAction = ({ to, ...props }: FolderCardBodyActionProps) => {\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","import * as React from 'react';\n\nimport { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system';\n\nexport interface FolderGridListProps {\n children: React.ReactNode;\n title?: string | null;\n}\n\nexport const FolderGridList = ({ title = null, children }: FolderGridListProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { sortOptions } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport type { Query } from '../../../../shared/contracts/files';\n\ninterface SortPickerProps {\n onChangeSort: (value: Query['sort'] | string) => void;\n value?: string;\n}\n\nexport const SortPicker = ({ onChangeSort, value }: SortPickerProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SingleSelect\n size=\"S\"\n value={value}\n onChange={(value) => onChangeSort(value.toString())}\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","import { Avatar, Box, Flex } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../constants';\nimport {\n createAssetUrl,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { VideoPreview } from '../AssetCard/VideoPreview';\n\nimport type { File } from '../../../../shared/contracts/files';\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\ninterface PreviewCellProps {\n content: File;\n type?: string;\n}\n\nexport const PreviewCell = ({ type, content }: PreviewCellProps) => {\n const { formatMessage } = useIntl();\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\n aria-label={formatMessage({\n id: getTrad('header.actions.add-assets.folder'),\n defaultMessage: 'folder',\n })}\n fill=\"secondary500\"\n width=\"1.6rem\"\n height=\"1.6rem\"\n />\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 (\n <Avatar.Item\n src={mediaURL}\n alt={alternativeText || undefined}\n preview\n fallback={alternativeText}\n />\n );\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","import { Typography } from '@strapi/design-system';\nimport parseISO from 'date-fns/parseISO';\nimport { useIntl } from 'react-intl';\n\nimport { formatBytes, getFileExtension } from '../../utils';\n\nimport { PreviewCell } from './PreviewCell';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface CellContentProps {\n cellType: string;\n contentType?: string;\n content: File;\n name: string;\n}\n\nexport const CellContent = ({ cellType, contentType, content, name }: CellContentProps) => {\n const { formatDate, formatMessage } = useIntl();\n const contentValue = content[name as Extract<keyof File, string>];\n\n switch (cellType) {\n case 'image':\n return <PreviewCell type={contentType} content={content} />;\n\n case 'date':\n if (typeof contentValue === 'string') {\n return <Typography>{formatDate(parseISO(contentValue), { dateStyle: 'full' })}</Typography>;\n }\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 if (typeof contentValue === 'string' || typeof contentValue === 'number') {\n return <Typography>{formatBytes(contentValue)}</Typography>;\n }\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 if (typeof contentValue === 'string') {\n return <Typography>{getFileExtension(contentValue)?.toUpperCase()}</Typography>;\n }\n case 'text':\n if (typeof contentValue === 'string') {\n return <Typography>{contentValue}</Typography>;\n }\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","import { Checkbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system';\nimport { Eye, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { tableHeaders as cells } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { CellContent } from './CellContent';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\n\ninterface FileRow extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\ninterface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface TableRowsProps {\n onChangeFolder?: ((folderId: number, folderPath?: string) => void) | null;\n onEditAsset: (asset: FileRow) => void;\n onEditFolder: (folder: FolderRow) => void;\n onSelectOne: (element: FileRow | FolderRow) => void;\n rows: FileRow[] | FolderRow[];\n selected: FileRow[] | FolderRow[];\n}\n\nexport const TableRows = ({\n onChangeFolder = null,\n onEditAsset,\n onEditFolder,\n onSelectOne,\n rows = [],\n selected = [],\n}: TableRowsProps) => {\n const { formatMessage } = useIntl();\n\n const handleRowClickFn = (\n element: FileRow | FolderRow,\n id: number,\n path: FolderRow['path'],\n elementType?: string\n ) => {\n if (elementType === 'asset') {\n onEditAsset(element as FileRow);\n } else {\n if (onChangeFolder) {\n onChangeFolder(id, path);\n }\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\n key={id}\n onClick={() => handleRowClickFn(element, id, path || undefined, contentType)}\n >\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 as FileRow}\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 (folderURL ? (\n <IconButton\n tag={Link}\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n to={folderURL}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n ) : (\n <IconButton\n tag=\"button\"\n label={formatMessage({\n id: getTrad('list.folders.link-label'),\n defaultMessage: 'Access folder',\n })}\n onClick={() => onChangeFolder && 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'\n ? onEditAsset(element as FileRow)\n : onEditFolder(element as FolderRow)\n }\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\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 { useIntl } from 'react-intl';\n\nimport { tableHeaders } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport { TableRows } from './TableRows';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\n\nexport interface FileRow extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface TableListProps {\n isFolderSelectionAllowed?: boolean;\n allowedTypes?: AllowedTypes[];\n assetCount?: number;\n folderCount?: number;\n indeterminate?: boolean;\n onChangeSort?: ((sortQuery: string) => void) | null;\n onChangeFolder?: ((folderId: number, folderPath?: string) => void) | null;\n onEditAsset?: ((asset: FileRow) => void) | null;\n onEditFolder?: ((folder: FolderRow) => void) | null;\n onSelectAll: (checked: boolean | string, rows?: FolderRow[] | FileRow[]) => void;\n onSelectOne: (element: FileRow | FolderRow) => void;\n rows?: FileRow[] | FolderRow[];\n selected?: FileRow[] | FolderRow[];\n shouldDisableBulkSelect?: boolean;\n sortQuery?: string;\n}\n\nexport const TableList = ({\n assetCount = 0,\n folderCount = 0,\n indeterminate = false,\n onChangeSort = null,\n onChangeFolder = null,\n onEditAsset = null,\n onEditFolder = null,\n onSelectAll,\n onSelectOne,\n rows = [],\n selected = [],\n shouldDisableBulkSelect = false,\n sortQuery = '',\n}: TableListProps) => {\n const { formatMessage } = useIntl();\n const [sortBy, sortOrder] = sortQuery.split(':');\n\n const handleClickSort = (isSorted: boolean, name: string) => {\n const nextSortOrder = isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC';\n const nextSort = `${name}:${nextSortOrder}`;\n\n onChangeSort && 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 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","import { Tag } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { FilterStructure } from './FilterList';\n\ntype FilterTagAttribute = {\n fieldSchema?: {\n type?: string; // \"date\" | \"enumeration\"\n options?: {\n label: string; // \"audio\" | \"video\" | \"image\" | \"file\"\n value: string; // \"audio\" | \"video\" | \"image\" | \"file\"\n }[];\n };\n metadatas?: {\n label?: string; // \"createdAt\" | \"updatedAt\" | \"type\"\n };\n name: string; // \"createdAt\" | \"updatedAt\" | \"mime\"\n};\n\ninterface FilterTagProps {\n attribute: FilterTagAttribute;\n operator: string;\n value: string;\n filter: FilterStructure;\n onClick: (filter: FilterStructure) => void;\n}\n\nexport const FilterTag = ({ attribute, filter, onClick, operator, value }: FilterTagProps) => {\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(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\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","// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterList\n *\n */\nimport { FilterTag } from './FilterTag';\n\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport interface FilterListProps {\n appliedFilters: FilterStructure[];\n filtersSchema: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema?: {\n type?: string;\n mainField?: {\n name: string;\n type: string;\n };\n options?: {\n label: string;\n value: string;\n }[];\n };\n }[];\n onRemoveFilter: (filters: FilterStructure[]) => void;\n}\n\nexport const FilterList = ({ appliedFilters, filtersSchema, onRemoveFilter }: FilterListProps) => {\n const handleClick = (filter: FilterStructure) => {\n const nextFilters = appliedFilters.filter((prevFilter) => {\n const name = Object.keys(filter)[0];\n const filterName = filter[name];\n if (filterName !== undefined) {\n const filterType = Object.keys(filterName)[0];\n const filterValue = filterName[filterType];\n if (typeof filterValue === 'string') {\n const decodedValue = decodeURIComponent(filterValue);\n return prevFilter[name]?.[filterType] !== decodedValue;\n }\n }\n\n return true;\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 if (!attribute) {\n // Handle the case where attribute is undefined\n return null;\n }\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 as string}\n />\n );\n });\n};\n","import { DateTimePicker, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface FilterValueInputProps {\n label?: string;\n onChange: (value: string) => void;\n options?: { label?: string; value: string }[];\n type?: string;\n value?: string;\n}\n\nexport const FilterValueInput = ({\n label = '',\n onChange,\n options = [],\n type,\n value = '',\n}: FilterValueInputProps) => {\n const { formatMessage } = useIntl();\n\n if (type === 'date') {\n return (\n <DateTimePicker\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n aria-label={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 />\n );\n }\n\n return (\n <SingleSelect\n aria-label={label}\n onChange={(value: string | number) => onChange(value.toString())}\n value={value}\n >\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","interface GetFilterListProps {\n fieldSchema: {\n type: string;\n options?: { value: string }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n}\n\nexport const getFilterList = ({\n fieldSchema: { type: fieldType, mainField },\n}: GetFilterListProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React 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 { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\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.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\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: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\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 const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\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 (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\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 const 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 const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const 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","import * as React from 'react';\n\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { displayedFilters } from '../../../utils';\nimport { FilterList } from '../../FilterList/FilterList';\nimport { FilterPopover } from '../../FilterPopover/FilterPopover';\n\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport type Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\ninterface FiltersProps {\n appliedFilters: FilterStructure[];\n onChangeFilters: (filters: Filter[]) => void;\n}\n\nexport const Filters = ({ appliedFilters, onChangeFilters }: FiltersProps) => {\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((prev) => !prev)}\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","import { Box, Flex, SingleSelectOption, SingleSelect, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface PageSizeProps {\n onChangePageSize: (value: number) => void;\n pageSize: number;\n}\n\nexport const PageSize = ({ onChangePageSize, pageSize }: PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const handleChange = (value: string | number) => {\n onChangePageSize(Number(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","import * as React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\n\nconst PaginationContext = React.createContext({ activePage: 1, pageCount: 1 });\nexport const usePagination = () => React.useContext(PaginationContext);\n\ninterface PaginationProps {\n activePage: number;\n children: React.ReactNode;\n label?: string;\n pageCount: number;\n}\n\nexport const Pagination = ({\n children,\n activePage,\n pageCount,\n label = 'pagination',\n}: PaginationProps) => {\n const paginationValue = React.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","// TODO: find a better naming convention for the file that was an index file before\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 { Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { Pagination, usePagination } from './Pagination';\n\nconst PaginationText = styled(Typography)`\n line-height: revert;\n`;\n\nconst linkWrapperStyles = css<{ $active?: boolean }>`\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\nconst LinkWrapperButton = styled.button<{ $active?: boolean }>`\n ${linkWrapperStyles}\n`;\n\nconst LinkWrapperDiv = styled.div<{ $active?: boolean }>`\n ${linkWrapperStyles}\n`;\n\nLinkWrapperButton.defaultProps = { type: 'button' };\n\nconst PageLinkWrapper = styled(LinkWrapperButton)`\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(LinkWrapperButton)`\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(LinkWrapperDiv)`\n color: ${({ theme }) => theme.colors.neutral800};\n`;\n\ninterface PaginationLinkProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n}\n\ninterface PageLinkProps extends PaginationLinkProps {\n number: number;\n}\n\nconst PreviousLink = ({ children, ...props }: PaginationLinkProps) => {\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\nconst NextLink = ({ children, ...props }: PaginationLinkProps) => {\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\nconst PageLink = ({ number, children, ...props }: PageLinkProps) => {\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\ninterface DotsProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nconst Dots = ({ children, ...props }: DotsProps) => (\n <li>\n <DotsWrapper {...props} as=\"div\">\n <VisuallyHidden>{children}</VisuallyHidden>\n <PaginationText aria-hidden small>\n …\n </PaginationText>\n </DotsWrapper>\n </li>\n);\n\ninterface PaginationFooterProps {\n activePage: number;\n onChangePage: (page: number) => void;\n pagination: {\n pageCount: number;\n };\n}\n\nexport const PaginationFooter = ({\n activePage,\n onChangePage,\n pagination: { pageCount },\n}: PaginationFooterProps) => {\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: number[] = [];\n const lastLinks: JSX.Element[] = [];\n let lastLinksToCreate: number[] = [];\n const middleLinks: JSX.Element[] = [];\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\n\ninterface SearchAssetProps {\n onChangeSearch: (_q: Query['_q'] | null) => void;\n queryValue?: Query['_q'] | null;\n}\n\nexport const SearchAsset = ({ onChangeSearch, queryValue = null }: SearchAssetProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [isOpen, setIsOpen] = React.useState(!!queryValue);\n const [value, setValue] = React.useState(queryValue || '');\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n\n React.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: React.FormEvent<HTMLFormElement>) => {\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 aria-label=\"search\"\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","export const isSelectable = (allowedTypes: string[], 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","// TODO: find a better naming convention for the file that was an index file before\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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport {\n getBreadcrumbDataCM,\n toSingularTypes,\n getTrad,\n getAllowedFiles,\n BreadcrumbDataFolder,\n AllowedFiles,\n} from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList/AssetGridList';\nimport { Breadcrumbs } from '../../Breadcrumbs/Breadcrumbs';\nimport { EmptyAssets } from '../../EmptyAssets/EmptyAssets';\nimport { FolderCard } from '../../FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderGridList } from '../../FolderGridList/FolderGridList';\nimport { SortPicker } from '../../SortPicker/SortPicker';\nimport { TableList, FolderRow, FileRow } from '../../TableList/TableList';\n\nimport { Filters, FilterStructure as ImportedFilterStructure } from './Filters';\nimport { PageSize } from './PageSize';\nimport { PaginationFooter } from './PaginationFooter/PaginationFooter';\nimport { SearchAsset } from './SearchAsset/SearchAsset';\nimport { isSelectable } from './utils/isSelectable';\n\nimport type { File, Query, FilterCondition } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../../AssetCard/AssetCard';\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\ntype NumberKeyedObject = Record<number, string>;\n\ntype StringFilter = {\n [key: string]: string;\n};\n\ntype MimeFilter = {\n [key: string]:\n | string\n | NumberKeyedObject\n | Record<string, string | NumberKeyedObject>\n | undefined;\n};\n\nexport type FilterStructure = {\n [key: string]: MimeFilter | StringFilter | undefined;\n};\n\nexport type Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FolderWithType extends Omit<Folder, 'children' | 'files'> {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n children?: Folder['children'] & {\n count: number;\n };\n files?: Folder['files'] & {\n count: number;\n };\n}\n\nexport interface FileWithType extends File {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface BrowseStepProps {\n allowedTypes?: AllowedTypes[];\n assets: File[];\n canCreate: boolean;\n canRead: boolean;\n folders?: FolderWithType[];\n multiple?: boolean;\n onAddAsset: () => void;\n onChangeFilters: (filters: FilterCondition<string>[] | Filter[]) => void;\n onChangeFolder: (id: number, path?: string) => void;\n onChangePage: (page: number) => void;\n onChangePageSize: (value: number) => void;\n onChangeSort: (value: Query['sort'] | string) => void;\n onChangeSearch: (_q?: Query['_q'] | null) => void;\n onEditAsset: ((asset: FileWithType) => void) | null;\n onEditFolder: ((folder: FolderRow) => void) | null;\n onSelectAsset: (element: FileRow | FolderRow) => void;\n onSelectAllAsset?: (checked: boolean | string, rows?: FolderRow[] | FileRow[]) => void;\n queryObject: Query;\n pagination: { pageCount: number };\n selectedAssets: FileWithType[] | FolderWithType[];\n}\n\nexport const BrowseStep = ({\n allowedTypes = [],\n assets: rawAssets,\n canCreate,\n canRead,\n folders = [],\n multiple = false,\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}: BrowseStepProps) => {\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 as number | null | undefined,\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\n ? getBreadcrumbDataCM(currentFolder as BreadcrumbDataFolder)\n : undefined;\n\n const allAllowedAsset = getAllowedFiles(allowedTypes, assets as AllowedFiles[]);\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 && queryObject.filters.$and.length > 0;\n const isSearchingOrFiltering = isSearching || isFiltering;\n const assetCount = assets.length;\n const folderCount = folders.length;\n const handleClickFolderCard = (...args: Parameters<typeof onChangeFolder>) => {\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 as ImportedFilterStructure[]}\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 && breadcrumbs.length > 0 && currentFolder && (\n <Box paddingTop={3}>\n <Breadcrumbs\n onChangeFolder={onChangeFolder}\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs as BreadcrumbDataFolder[]}\n currentFolderId={queryObject?.folder as number | undefined}\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={\n [...folders.map((folder) => ({ ...folder, type: 'folder' })), ...assets] as\n | FolderRow[]\n | FileRow[]\n }\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 as FileWithType[]}\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\n pageSize={queryObject.pageSize! as number}\n onChangePageSize={onChangePageSize}\n />\n <PaginationFooter\n activePage={queryObject.page as number}\n onChangePage={onChangePage}\n pagination={pagination}\n />\n </Flex>\n )}\n </Box>\n );\n};\n","import { Button, Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface DialogFooterProps {\n onClose: () => void;\n onValidate?: () => void;\n}\n\nexport const DialogFooter = ({ onClose, onValidate }: DialogFooterProps) => {\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","// TODO: find a better naming convention for the file that was an index file before\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\nimport { AssetGridList } from '../../AssetGridList/AssetGridList';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\ninterface SelectedStepProps {\n onSelectAsset: (asset: File) => void;\n selectedAssets: File[];\n onReorderAsset?: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const SelectedStep = ({\n selectedAssets,\n onSelectAsset,\n onReorderAsset,\n}: SelectedStepProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex gap={0} direction=\"column\" alignItems=\"start\">\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","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Divider, Flex, Loader, Modal, Tabs } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\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 {\n containsAssetFilter,\n getTrad,\n getAllowedFiles,\n moveElement,\n AllowedFiles,\n} from '../../utils';\nimport { EditAssetContent, Asset as EditAsset } from '../EditAssetDialog/EditAssetContent';\nimport { EditFolderContent } from '../EditFolderDialog/EditFolderDialog';\n\nimport {\n BrowseStep,\n FolderWithType,\n FileWithType,\n Filter as BrowseFilter,\n} from './BrowseStep/BrowseStep';\nimport { DialogFooter } from './DialogFooter';\nimport { SelectedStep } from './SelectedStep/SelectedStep';\n\nimport type { File as Asset, FilterCondition, Query } from '../../../../shared/contracts/files';\nimport type { Folder, FolderDefinition } from '../../../../shared/contracts/folders';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\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 interface FileRow extends Asset {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\nexport interface FolderRow extends Folder {\n folderURL?: string;\n isSelectable?: boolean;\n type?: string;\n}\n\ninterface AssetContentProps {\n allowedTypes?: AllowedTypes[];\n folderId?: number | null;\n onClose: () => void;\n onAddAsset: (arg?: { folderId: number | { id: number } | null | undefined }) => void;\n onAddFolder: ({ folderId }: { folderId: number | { id: number } | null | undefined }) => void;\n onChangeFolder: (folderId: number | null) => void;\n onValidate: (selectedAssets: Asset[]) => void;\n multiple?: boolean;\n trackedLocation?: string;\n initiallySelectedAssets?: Asset[];\n}\n\nexport const AssetContent = ({\n allowedTypes = [],\n folderId = null,\n onClose,\n onAddAsset,\n onAddFolder,\n onChangeFolder,\n onValidate,\n multiple = false,\n initiallySelectedAssets = [],\n trackedLocation,\n}: AssetContentProps) => {\n const [assetToEdit, setAssetToEdit] = React.useState<FileWithType | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined>(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 as AllowedFiles[]);\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: Asset | FileRow | FolderRow) => {\n return multiple ? selectOne(asset as Asset) : selectOnly(asset as 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 as EditAsset}\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 as FolderDefinition}\n onClose={() => setFolderToEdit(undefined)}\n location=\"content-manager\"\n parentFolderId={queryObject?.folder as string | number | null | undefined}\n />\n );\n }\n\n const handleMoveItem = (hoverIndex: number, destIndex: number) => {\n const offset = destIndex - hoverIndex;\n const orderedAssetsClone = selectedAssets.slice();\n const nextAssets = moveElement<Asset>(orderedAssetsClone, hoverIndex, offset);\n setSelections(nextAssets);\n };\n\n const handleFolderChange = (folderId: number, folderPath?: string) => {\n onChangeFolder(folderId);\n if (onChangeFolderParam) {\n onChangeFolderParam(folderId, folderPath);\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 <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 as FolderWithType[]}\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={(filters: FilterCondition<string>[] | BrowseFilter[]) =>\n onChangeFilters!(filters as FilterCondition<string>[])\n }\n onChangeFolder={handleFolderChange}\n onChangePage={onChangePage!}\n onChangePageSize={onChangePageSize!}\n onChangeSort={(sort: string | undefined) => onChangeSort!(sort as Query['sort'])}\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\ninterface AssetDialogProps extends AssetContentProps {\n open?: boolean;\n}\n\nexport const AssetDialog = ({ open = false, onClose, ...restProps }: AssetDialogProps) => {\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\nconst TabsRoot = styled(Tabs.Root)`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n","import * as React 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 { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\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\ninterface FromComputerFormProps {\n onClose: () => void;\n onAddAssets: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromComputerForm = ({\n onClose,\n onAddAssets,\n trackedLocation,\n}: FromComputerFormProps) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { trackUsage } = useTracking();\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n inputRef.current?.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current?.files;\n const assets: FileWithRawFile[] = [];\n\n if (files) {\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n assets.push(asset);\n }\n }\n }\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'computer', location: trackedLocation });\n }\n\n onAddAssets(assets);\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\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 if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n assets.push(asset);\n }\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 aria-label={formatMessage({\n id: getTrad('input.label'),\n defaultMessage: 'Drag & Drop here or',\n })}\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","import * as React 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 { useIntl } from 'react-intl';\n\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = 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: unknown) {\n setError(e as Error);\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","import { Box, Divider, Modal, Tabs } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nimport { FromComputerForm } from './FromComputerForm';\nimport { FromUrlForm } from './FromUrlForm';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nexport interface FileWithRawFile extends Omit<File, 'id' | 'hash'> {\n id?: string;\n hash?: string;\n rawFile: RawFile;\n}\n\ninterface AddAssetStepProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const AddAssetStep = ({ onClose, onAddAsset, trackedLocation }: AddAssetStepProps) => {\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","import * as React 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 { 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/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\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 React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.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\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\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?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: 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","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Grid, KeyboardNavigable, Modal, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { AssetType } from '../../../constants';\nimport { getTrad } from '../../../utils';\nimport { AssetCard } from '../../AssetCard/AssetCard';\nimport { UploadingAssetCard } from '../../AssetCard/UploadingAssetCard';\n\nimport type { File, RawFile } from '../../../../../shared/contracts/files';\n\nconst Status = {\n Idle: 'IDLE',\n Uploading: 'UPLOADING',\n Intermediate: 'INTERMEDIATE',\n};\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\ninterface PendingAssetStepProps {\n addUploadedFiles?: (files: File[]) => void;\n folderId?: string | number | null;\n onClose: () => void;\n onEditAsset: (asset: File) => void;\n onRemoveAsset: (asset: File) => void;\n onAddAsset?: (asset: File) => void;\n assets: Asset[];\n onClickAddAsset: () => void;\n onCancelUpload: (rawFile: RawFile) => void;\n onUploadSucceed: (file: RawFile) => void;\n trackedLocation?: string;\n initialAssetsToAdd?: File[];\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}: PendingAssetStepProps) => {\n const assetCountRef = React.useRef(0);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [uploadStatus, setUploadStatus] = React.useState(Status.Idle);\n\n const handleSubmit = async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const assetsCountByType = assets.reduce(\n (acc: Record<AssetType, string | number>, asset) => {\n const { type } = asset;\n\n if (type !== undefined && !acc[type]) {\n acc[type] = 0;\n }\n\n if (type !== undefined) {\n const accType = acc[type];\n const currentCount = typeof accType === 'string' ? accType : accType.toString();\n acc[type] = `${parseInt(currentCount, 10) + 1}`;\n }\n\n return acc;\n },\n {} as Record<AssetType, string | number>\n );\n\n trackUsage('willAddMediaLibraryAssets', {\n location: trackedLocation!,\n ...assetsCountByType,\n });\n\n setUploadStatus(Status.Uploading);\n };\n\n const handleStatusChange = (status: string, file: RawFile) => {\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","import * as React from 'react';\n\nimport { Modal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { EditAssetContent } from '../EditAssetDialog/EditAssetContent';\n\nimport { AddAssetStep } from './AddAssetStep/AddAssetStep';\nimport { PendingAssetStep } from './PendingAssetStep/PendingAssetStep';\n\nimport type { File, RawFile } from '../../../../shared/contracts/files';\nimport type { AllowedFiles } from '../../utils';\n\nconst Steps = {\n AddAsset: 'AddAsset',\n PendingAsset: 'PendingAsset',\n};\n\ninterface FileWithRawFile extends Omit<File, 'id' | 'hash'> {\n id?: string;\n hash?: string;\n rawFile: RawFile;\n}\n\ntype FileWithoutIdHash = Omit<File, 'id' | 'hash'>;\n\nexport interface Asset extends Omit<File, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: File['folder'] & { id: number };\n}\n\nexport interface UploadAssetDialogProps {\n addUploadedFiles?: (files: Asset[] | File[]) => void;\n folderId?: string | number | null;\n initialAssetsToAdd?: Asset[];\n onClose: () => void;\n open: boolean;\n trackedLocation?: string;\n validateAssetsTypes?: (\n assets: FileWithoutIdHash[] | Asset[],\n cb: (assets?: AllowedFiles[], error?: string) => void\n ) => void;\n}\n\nexport const UploadAssetDialog = ({\n initialAssetsToAdd,\n folderId = null,\n onClose = () => {},\n addUploadedFiles,\n trackedLocation,\n open,\n validateAssetsTypes = (_, cb) => cb(),\n}: UploadAssetDialogProps) => {\n const { formatMessage } = useIntl();\n const [step, setStep] = React.useState(initialAssetsToAdd ? Steps.PendingAsset : Steps.AddAsset);\n const [assets, setAssets] = React.useState(initialAssetsToAdd || []);\n const [assetToEdit, setAssetToEdit] = React.useState<File | Asset | undefined>(undefined);\n\n const handleAddToPendingAssets = (nextAssets: Asset[]) => {\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: RawFile) => {\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: RawFile) => {\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?: Asset | boolean | null) => {\n if (nextAsset && typeof nextAsset !== 'boolean') {\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: File) => {\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={(assets: FileWithRawFile[]) =>\n handleAddToPendingAssets(assets as unknown as Asset[])\n }\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 as Asset}\n canUpdate\n canCopyLink={false}\n canDownload={false}\n trackedLocation={trackedLocation}\n />\n </Modal.Content>\n )}\n </Modal.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { AssetDialog } from '../AssetDialog/AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog/EditFolderDialog';\nimport { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { AllowedTypes } from '../AssetCard/AssetCard';\nexport interface MediaLibraryDialogProps {\n allowedTypes?: AllowedTypes[];\n onClose: () => void;\n onSelectAssets: (selectedAssets: File[]) => void;\n}\n\nexport const MediaLibraryDialog = ({\n onClose,\n onSelectAssets,\n allowedTypes = ['files', 'images', 'videos', 'audios'],\n}: MediaLibraryDialogProps) => {\n const [step, setStep] = React.useState(STEPS.AssetSelect);\n const [folderId, setFolderId] = React.useState<number | null>(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","import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\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 }: { asset: FileAsset }) => {\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\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\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","import { CarouselActions, IconButton } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, prefixFileUrlWithBackendUrl } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\ninterface CarouselAssetActionsProps {\n asset: File;\n onDeleteAsset?: (asset: File) => void;\n onAddAsset?: (asset: File) => void;\n onEditAsset?: () => void;\n}\n\nexport const CarouselAssetActions = ({\n asset,\n onDeleteAsset,\n onAddAsset,\n onEditAsset,\n}: CarouselAssetActionsProps) => {\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","import * as React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle as PicturePlus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetSource } from '../../../constants';\nimport { getTrad, rawFileToAsset } from '../../../utils';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\nconst TextAlignTypography = styled(Typography)`\n align-items: center;\n`;\n\ntype FileWithoutIdHash = Omit<File, 'id' | 'hash'>;\n\ninterface EmptyStateAssetProps {\n disabled?: boolean;\n onClick: (asset?: File, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDropAsset: (assets: FileWithoutIdHash[]) => void;\n}\n\nexport const EmptyStateAsset = ({\n disabled = false,\n onClick,\n onDropAsset,\n}: EmptyStateAssetProps) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n\n const handleDragEnter = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLButtonElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setDragOver(false);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n };\n\n const handleDrop = (e: React.DragEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n if (e?.dataTransfer?.files) {\n const files = e.dataTransfer.files;\n const assets: FileWithoutIdHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n if (file) {\n const asset = rawFileToAsset(file, AssetSource.Computer);\n\n assets.push(asset);\n }\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 as unknown as React.MouseEventHandler<HTMLButtonElement>}\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","import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\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\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\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 if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { useField, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad, getAllowedFiles, AllowedFiles } from '../../utils';\nimport { AssetDialog } from '../AssetDialog/AssetDialog';\nimport { EditFolderDialog } from '../EditFolderDialog/EditFolderDialog';\nimport { UploadAssetDialog, Asset } from '../UploadAssetDialog/UploadAssetDialog';\n\nimport { CarouselAssets, CarouselAssetsProps, FileWithoutIdHash } from './Carousel/CarouselAssets';\n\nimport type { File } from '../../../../shared/contracts/files';\ntype AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\nconst STEPS = {\n AssetSelect: 'SelectAsset',\n AssetUpload: 'UploadAsset',\n FolderCreate: 'FolderCreate',\n};\n\nexport interface MediaLibraryInputProps {\n required?: boolean;\n name: string;\n labelAction?: React.ReactNode;\n label?: string;\n hint?: string;\n disabled?: boolean;\n attribute?: {\n allowedTypes?: AllowedTypes[];\n multiple?: boolean;\n };\n}\n\nexport const MediaLibraryInput = React.forwardRef<CarouselAssetsProps, MediaLibraryInputProps>(\n (\n {\n attribute: { allowedTypes = ['videos', 'files', 'images', 'audios'], multiple = false } = {},\n label,\n hint,\n disabled = false,\n labelAction = undefined,\n name,\n required = false,\n },\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] = React.useState<Asset[] | File[]>([]);\n const [step, setStep] = React.useState<string | undefined>(undefined);\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [droppedAssets, setDroppedAssets] = React.useState<AllowedFiles[]>();\n const [folderId, setFolderId] = React.useState<number | null>(null);\n const { toggleNotification } = useNotification();\n\n React.useEffect(() => {\n // Clear the uploaded files on close\n if (step === undefined) {\n setUploadedFiles([]);\n }\n }, [step]);\n\n let selectedAssets: File[] = [];\n\n if (Array.isArray(value)) {\n selectedAssets = value;\n } else if (value) {\n selectedAssets = [value];\n }\n\n const handleValidation = (nextSelectedAssets: File[]) => {\n const value = multiple ? nextSelectedAssets : nextSelectedAssets[0];\n onChange(name, value);\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 const value = nextValue;\n onChange(name, value);\n\n setSelectedIndex(0);\n };\n\n const handleDeleteAsset = (asset: File) => {\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(name, nextValue);\n\n setSelectedIndex(0);\n };\n\n const handleAssetEdit = (asset: File) => {\n const nextSelectedAssets = selectedAssets.map((prevAsset) =>\n prevAsset.id === asset.id ? asset : prevAsset\n );\n\n onChange(name, multiple ? nextSelectedAssets : nextSelectedAssets[0]);\n };\n\n const validateAssetsTypes = (\n assets: FileWithoutIdHash[] | Asset[],\n callback: (assets?: AllowedFiles[], error?: string) => void\n ) => {\n const allowedAssets = getAllowedFiles(fieldAllowedTypes, assets as AllowedFiles[]);\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: FileWithoutIdHash[]) => {\n validateAssetsTypes(assets, (allowedAssets?: AllowedFiles[]) => {\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: Asset[] | File[]) => {\n setUploadedFiles((prev) => [...prev, ...uploadedFiles]);\n };\n\n let initiallySelectedAssets = selectedAssets;\n\n if (uploadedFiles.length > 0) {\n const allowedUploadedFiles = getAllowedFiles(\n fieldAllowedTypes,\n uploadedFiles as AllowedFiles[]\n );\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 as AllowedTypes[]}\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 as Asset[]}\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","import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\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/App').then((mod) => ({ default: mod.Upload })),\n position: 4,\n });\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n async Component() {\n const { ProtectedSettingsPage } = await import('./pages/SettingsPage/SettingsPage');\n return { default: ProtectedSettingsPage };\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\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\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["useIntl","useNotification","useNotifyAT","useFetchClient","useQuery","data","React","stringify","byteSize","intervalToDuration","files","name","getTrad","error","pluginId","yup","errorsTrads","AssetType","AssetSource","useRBAC","endpoint","useTracking","useMutation","useQueryClient","jsx","Box","Grid","jsxs","Flex","Typography","styled","ChevronUp","ChevronDown","components","option","value","options","useTheme","ReactSelect","Cross","CaretDown","Modal","Cropper","useClipboard","IconButton","LinkIcon","ProgressBar","Dialog","ConfirmDialog","CardAsset","MuxPlayer","FilePdf","File","Wrapper","Badge","UploadProgressWrapper","FocusTrap","Menu","Check","Fragment","Trash","DownloadIcon","Resize","Button","VisuallyHidden","LoadingBody","isEqual","Loader","Formik","Form","Field","TextInput","isEmpty","useState","useEffect","Extension","CardAction","Card","isSelectable","CardHeader","CardCheckbox","Pencil","CardBody","CardContent","CardTitle","CardSubtitle","CardBadge","AudioPreviewWrapper","VideoPreviewWrapper","CardTimer","useDrop","useDrag","KeyboardNavigable","useLocation","useQueryParams","CrumbSimpleMenu","MenuItem","BaseBreadcrumbs","CrumbLink","ReactRouterLink","Crumb","Layouts","EmptyDocuments","createContext","useContext","Folder","NavLink","SingleSelect","SingleSelectOption","Avatar","parseISO","Tbody","Tr","Td","Checkbox","cells","Link","Eye","Table","Thead","Th","CaretUp","Tooltip","Tag","DateTimePicker","displayedFilters","filterToAdd","hasFilter","Popover","Plus","Filter","css","ChevronLeft","ChevronRight","SearchForm","Searchbar","Search","List","GridIcon","Divider","Page","folderId","Tabs","PicturePlus","Textarea","assets","STEPS","CarouselActions","CarouselInput","CarouselSlide","useField","uploadedFiles","Images"],"mappings":"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"}