@strapi/upload 5.33.1 → 5.33.3
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.
- package/dist/admin/package.json.js +7 -7
- package/dist/admin/package.json.mjs +7 -7
- package/dist/admin/pages/App/App.js +1 -1
- package/dist/admin/pages/App/App.js.map +1 -1
- package/dist/admin/pages/App/App.mjs +1 -1
- package/dist/admin/pages/App/App.mjs.map +1 -1
- package/dist/admin/pages/App/{MediaLibrary/MediaLibrary.js → MediaLibrary.js} +26 -26
- package/dist/admin/pages/App/MediaLibrary.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/MediaLibrary.mjs → MediaLibrary.mjs} +26 -26
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkActions.js +3 -3
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkActions.mjs +3 -3
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkDeleteButton.js +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkDeleteButton.mjs +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkMoveButton.js +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/BulkMoveButton.mjs +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/EmptyOrNoPermissions.js +4 -4
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/EmptyOrNoPermissions.mjs +4 -4
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/Filters.js +6 -6
- package/dist/admin/pages/App/components/Filters.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/Filters.mjs +6 -6
- package/dist/admin/pages/App/components/Filters.mjs.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/Header.js +4 -4
- package/dist/admin/pages/App/components/Header.js.map +1 -0
- package/dist/admin/pages/App/{MediaLibrary/components → components}/Header.mjs +4 -4
- package/dist/admin/pages/App/components/Header.mjs.map +1 -0
- package/dist/admin/src/pages/App/components/BulkActions.d.ts +1 -1
- package/dist/admin/src/pages/App/components/BulkDeleteButton.d.ts +1 -4
- package/dist/admin/src/pages/App/components/BulkMoveButton.d.ts +4 -4
- package/dist/admin/src/pages/App/components/EmptyOrNoPermissions.d.ts +1 -2
- package/dist/admin/src/pages/App/components/Header.d.ts +12 -3
- package/dist/server/controllers/admin-upload.js +6 -36
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +7 -37
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +13 -11
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +13 -11
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/utils/mime-validation.d.ts +8 -0
- package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
- package/dist/server/utils/mime-validation.js +44 -0
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs +44 -1
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/package.json +7 -7
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkDeleteButton.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkMoveButton.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.js.map +0 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.mjs.map +0 -1
- package/dist/admin/src/pages/App/MediaLibrary/components/BulkActions.d.ts +0 -15
- package/dist/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.d.ts +0 -7
- package/dist/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.d.ts +0 -15
- package/dist/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.d.ts +0 -7
- package/dist/admin/src/pages/App/MediaLibrary/components/Filters.d.ts +0 -1
- package/dist/admin/src/pages/App/MediaLibrary/components/Header.d.ts +0 -22
- /package/dist/admin/src/pages/App/{MediaLibrary/MediaLibrary.d.ts → MediaLibrary.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime-validation.mjs","sources":["../../../server/src/utils/mime-validation.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { Core } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nexport type SecurityConfig = {\n allowedTypes?: string[];\n deniedTypes?: string[];\n};\ntype UploadValidationError = {\n code: 'MIME_TYPE_NOT_ALLOWED' | 'VALIDATION_ERROR' | 'UNKNOWN_ERROR';\n message: string;\n details: Record<string, any>;\n};\n\ntype ValidationResult = {\n isValid: boolean;\n error?: UploadValidationError;\n};\n\ntype ErrorDetail = {\n file: any;\n originalIndex: number;\n error: UploadValidationError;\n};\n\nasync function readFileChunk(filePath: string, chunkSize: number = 4100): Promise<Buffer> {\n const buffer = await readFile(filePath);\n return buffer.length > chunkSize ? buffer.subarray(0, chunkSize) : buffer;\n}\n\nexport async function detectMimeType(file: any): Promise<string | undefined> {\n let buffer: Buffer;\n\n const filePath = file.path || file.filepath || file.tempFilePath;\n\n if (filePath) {\n try {\n buffer = await readFileChunk(filePath, 4100);\n } catch (error) {\n throw new Error(\n `Failed to read file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (file.buffer) {\n buffer = file.buffer.length > 4100 ? file.buffer.subarray(0, 4100) : file.buffer;\n } else {\n // No file data available\n return undefined;\n }\n\n try {\n /**\n * Use dynamic import to support file-type which is ESM-only\n * Static imports fail during CommonJS build since bundler can't transform ESM-only packages\n * @see https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c\n */\n const { fileTypeFromBuffer } = await import('file-type');\n\n const result = await fileTypeFromBuffer(new Uint8Array(buffer));\n return result?.mime;\n } catch (error) {\n throw new Error(\n `Failed to detect MIME type: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction matchesMimePattern(mimeType: string, patterns: string[]): boolean {\n if (!patterns?.length) return false;\n\n return patterns.some((pattern) => {\n const normalizedPattern = pattern.toLowerCase();\n const normalizedMimeType = mimeType.toLowerCase();\n\n if (normalizedPattern.includes('*')) {\n const regexPattern = normalizedPattern.replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const matches = regex.test(normalizedMimeType);\n return matches;\n }\n\n const exactMatch = normalizedPattern === normalizedMimeType;\n return exactMatch;\n });\n}\n\nexport function isMimeTypeAllowed(mimeType: string, config: SecurityConfig): boolean {\n const { allowedTypes, deniedTypes } = config;\n\n if (!mimeType) return false;\n\n if (deniedTypes?.length && matchesMimePattern(mimeType, deniedTypes)) {\n return false;\n }\n\n if (allowedTypes?.length) {\n return matchesMimePattern(mimeType, allowedTypes);\n }\n\n return true;\n}\n\nexport function extractFileInfo(file: any) {\n const fileName =\n file.originalFilename || file.name || file.filename || file.newFilename || 'unknown';\n const declaredMimeType = file.mimetype || file.type || file.mimeType || file.mime || '';\n\n return { fileName, declaredMimeType };\n}\n\nexport async function validateFile(\n file: any,\n config: SecurityConfig,\n strapi: Core.Strapi\n): Promise<ValidationResult> {\n const { allowedTypes, deniedTypes } = config;\n\n if (!allowedTypes && !deniedTypes) {\n return { isValid: true };\n }\n\n const { fileName, declaredMimeType } = extractFileInfo(file);\n\n let detectedMime: string | undefined;\n let mimeDetectionFailed = false;\n\n try {\n detectedMime = await detectMimeType(file);\n } catch (error) {\n mimeDetectionFailed = true;\n strapi.log.warn('Failed to detect MIME type from file', {\n fileName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const mimeToValidate = detectedMime || declaredMimeType;\n\n if (\n !detectedMime &&\n (declaredMimeType === 'application/octet-stream' || !declaredMimeType || mimeDetectionFailed)\n ) {\n if (allowedTypes?.length || deniedTypes?.length) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `Cannot verify file type for security reasons`,\n details: {\n fileName,\n reason: 'Unable to detect MIME type from file content',\n declaredType: declaredMimeType,\n mimeDetectionFailed,\n },\n },\n };\n }\n }\n\n if (\n mimeToValidate &&\n (allowedTypes || deniedTypes) &&\n !isMimeTypeAllowed(mimeToValidate, config)\n ) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `File type '${mimeToValidate}' is not allowed`,\n details: {\n fileName,\n detectedType: detectedMime,\n declaredType: declaredMimeType,\n finalType: mimeToValidate,\n allowedTypes,\n deniedTypes,\n },\n },\n };\n }\n\n return { isValid: true };\n}\n\nexport async function validateFiles(files: any, strapi: Core.Strapi): Promise<ValidationResult[]> {\n const filesArray = Array.isArray(files) ? files : [files];\n\n if (!filesArray.length) {\n return [];\n }\n\n const config: SecurityConfig = strapi.config.get('plugin::upload.security', {});\n if (\n config.allowedTypes &&\n (!Array.isArray(config.allowedTypes) ||\n !config.allowedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: allowedTypes must be an array of strings.'\n );\n }\n\n if (\n config.deniedTypes &&\n (!Array.isArray(config.deniedTypes) ||\n !config.deniedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: deniedTypes must be an array of strings.'\n );\n }\n\n if (!config.allowedTypes && !config.deniedTypes) {\n strapi.log.warn(\n 'No upload security configuration found. Consider configuring plugin.upload.security for enhanced file validation.'\n );\n return filesArray.map(() => ({ isValid: true }));\n }\n\n const validationPromises = filesArray.map(async (file, index) => {\n try {\n return await validateFile(file, config, strapi);\n } catch (error) {\n strapi.log.error('Unexpected error during file validation', {\n fileIndex: index,\n fileName: file?.name || file?.originalname,\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n isValid: false,\n error: {\n code: 'VALIDATION_ERROR' as const,\n message: `Validation failed for file at index ${index}`,\n details: {\n index,\n fileName: file?.name || file?.originalname,\n originalError: error instanceof Error ? error.message : String(error),\n },\n },\n };\n }\n });\n\n return Promise.all(validationPromises);\n}\n\nexport async function enforceUploadSecurity(\n files: any,\n strapi: Core.Strapi\n): Promise<{\n validFiles: any[];\n validFileNames: string[];\n errors: Array<ErrorDetail>;\n}> {\n const validationResults = await validateFiles(files, strapi);\n const filesArray = Array.isArray(files) ? files : [files];\n\n const validFiles: any[] = [];\n const validFileNames: string[] = [];\n const errors: Array<ErrorDetail> = [];\n\n for (const [index, result] of validationResults.entries()) {\n if (result.isValid) {\n const file = filesArray[index];\n validFiles.push(file);\n validFileNames.push(file.originalFilename || file.name);\n } else if (result.error) {\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: result.error,\n });\n } else {\n // Handle case where validation failed but no error details are provided\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: {\n code: 'UNKNOWN_ERROR' as const,\n message: 'File validation failed for unknown reason',\n details: {\n index,\n fileName: filesArray[index]?.name || filesArray[index]?.originalname,\n },\n },\n });\n }\n }\n\n return { validFiles, validFileNames, errors };\n}\n"],"names":["readFileChunk","filePath","chunkSize","buffer","readFile","length","subarray","detectMimeType","file","path","filepath","tempFilePath","error","Error","message","String","undefined","fileTypeFromBuffer","result","Uint8Array","mime","matchesMimePattern","mimeType","patterns","some","pattern","normalizedPattern","toLowerCase","normalizedMimeType","includes","regexPattern","replace","regex","RegExp","matches","test","exactMatch","isMimeTypeAllowed","config","allowedTypes","deniedTypes","extractFileInfo","fileName","originalFilename","name","filename","newFilename","declaredMimeType","mimetype","type","validateFile","strapi","isValid","detectedMime","mimeDetectionFailed","log","warn","mimeToValidate","code","details","reason","declaredType","detectedType","finalType","validateFiles","files","filesArray","Array","isArray","get","every","item","errors","ApplicationError","map","validationPromises","index","fileIndex","originalname","originalError","Promise","all","enforceUploadSecurity","validationResults","validFiles","validFileNames","entries","push","originalIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mime-validation.mjs","sources":["../../../server/src/utils/mime-validation.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { Core } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nexport type SecurityConfig = {\n allowedTypes?: string[];\n deniedTypes?: string[];\n};\ntype UploadValidationError = {\n code: 'MIME_TYPE_NOT_ALLOWED' | 'VALIDATION_ERROR' | 'UNKNOWN_ERROR';\n message: string;\n details: Record<string, any>;\n};\n\ntype ValidationResult = {\n isValid: boolean;\n error?: UploadValidationError;\n};\n\ntype ErrorDetail = {\n file: any;\n originalIndex: number;\n error: UploadValidationError;\n};\n\nasync function readFileChunk(filePath: string, chunkSize: number = 4100): Promise<Buffer> {\n const buffer = await readFile(filePath);\n return buffer.length > chunkSize ? buffer.subarray(0, chunkSize) : buffer;\n}\n\nexport async function detectMimeType(file: any): Promise<string | undefined> {\n let buffer: Buffer;\n\n const filePath = file.path || file.filepath || file.tempFilePath;\n\n if (filePath) {\n try {\n buffer = await readFileChunk(filePath, 4100);\n } catch (error) {\n throw new Error(\n `Failed to read file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (file.buffer) {\n buffer = file.buffer.length > 4100 ? file.buffer.subarray(0, 4100) : file.buffer;\n } else {\n // No file data available\n return undefined;\n }\n\n try {\n /**\n * Use dynamic import to support file-type which is ESM-only\n * Static imports fail during CommonJS build since bundler can't transform ESM-only packages\n * @see https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c\n */\n const { fileTypeFromBuffer } = await import('file-type');\n\n const result = await fileTypeFromBuffer(new Uint8Array(buffer));\n return result?.mime;\n } catch (error) {\n throw new Error(\n `Failed to detect MIME type: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction matchesMimePattern(mimeType: string, patterns: string[]): boolean {\n if (!patterns?.length) return false;\n\n return patterns.some((pattern) => {\n const normalizedPattern = pattern.toLowerCase();\n const normalizedMimeType = mimeType.toLowerCase();\n\n if (normalizedPattern.includes('*')) {\n const regexPattern = normalizedPattern.replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const matches = regex.test(normalizedMimeType);\n return matches;\n }\n\n const exactMatch = normalizedPattern === normalizedMimeType;\n return exactMatch;\n });\n}\n\nexport function isMimeTypeAllowed(mimeType: string, config: SecurityConfig): boolean {\n const { allowedTypes, deniedTypes } = config;\n\n if (!mimeType) return false;\n\n if (deniedTypes?.length && matchesMimePattern(mimeType, deniedTypes)) {\n return false;\n }\n\n if (allowedTypes?.length) {\n return matchesMimePattern(mimeType, allowedTypes);\n }\n\n return true;\n}\n\nexport function extractFileInfo(file: any) {\n const fileName =\n file.originalFilename || file.name || file.filename || file.newFilename || 'unknown';\n const declaredMimeType = file.mimetype || file.type || file.mimeType || file.mime || '';\n\n return { fileName, declaredMimeType };\n}\n\nexport async function validateFile(\n file: any,\n config: SecurityConfig,\n strapi: Core.Strapi\n): Promise<ValidationResult> {\n const { allowedTypes, deniedTypes } = config;\n\n if (!allowedTypes && !deniedTypes) {\n return { isValid: true };\n }\n\n const { fileName, declaredMimeType } = extractFileInfo(file);\n\n let detectedMime: string | undefined;\n let mimeDetectionFailed = false;\n\n try {\n detectedMime = await detectMimeType(file);\n } catch (error) {\n mimeDetectionFailed = true;\n strapi.log.warn('Failed to detect MIME type from file', {\n fileName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const mimeToValidate = detectedMime || declaredMimeType;\n\n if (\n !detectedMime &&\n (declaredMimeType === 'application/octet-stream' || !declaredMimeType || mimeDetectionFailed)\n ) {\n if (allowedTypes?.length || deniedTypes?.length) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `Cannot verify file type for security reasons`,\n details: {\n fileName,\n reason: 'Unable to detect MIME type from file content',\n declaredType: declaredMimeType,\n mimeDetectionFailed,\n },\n },\n };\n }\n }\n\n if (\n mimeToValidate &&\n (allowedTypes || deniedTypes) &&\n !isMimeTypeAllowed(mimeToValidate, config)\n ) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `File type '${mimeToValidate}' is not allowed`,\n details: {\n fileName,\n detectedType: detectedMime,\n declaredType: declaredMimeType,\n finalType: mimeToValidate,\n allowedTypes,\n deniedTypes,\n },\n },\n };\n }\n\n return { isValid: true };\n}\n\nexport async function validateFiles(files: any, strapi: Core.Strapi): Promise<ValidationResult[]> {\n const filesArray = Array.isArray(files) ? files : [files];\n\n if (!filesArray.length) {\n return [];\n }\n\n const config: SecurityConfig = strapi.config.get('plugin::upload.security', {});\n if (\n config.allowedTypes &&\n (!Array.isArray(config.allowedTypes) ||\n !config.allowedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: allowedTypes must be an array of strings.'\n );\n }\n\n if (\n config.deniedTypes &&\n (!Array.isArray(config.deniedTypes) ||\n !config.deniedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: deniedTypes must be an array of strings.'\n );\n }\n\n if (!config.allowedTypes && !config.deniedTypes) {\n strapi.log.warn(\n 'No upload security configuration found. Consider configuring plugin.upload.security for enhanced file validation.'\n );\n return filesArray.map(() => ({ isValid: true }));\n }\n\n const validationPromises = filesArray.map(async (file, index) => {\n try {\n return await validateFile(file, config, strapi);\n } catch (error) {\n strapi.log.error('Unexpected error during file validation', {\n fileIndex: index,\n fileName: file?.name || file?.originalname,\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n isValid: false,\n error: {\n code: 'VALIDATION_ERROR' as const,\n message: `Validation failed for file at index ${index}`,\n details: {\n index,\n fileName: file?.name || file?.originalname,\n originalError: error instanceof Error ? error.message : String(error),\n },\n },\n };\n }\n });\n\n return Promise.all(validationPromises);\n}\n\nexport async function enforceUploadSecurity(\n files: any,\n strapi: Core.Strapi\n): Promise<{\n validFiles: any[];\n validFileNames: string[];\n errors: Array<ErrorDetail>;\n}> {\n const validationResults = await validateFiles(files, strapi);\n const filesArray = Array.isArray(files) ? files : [files];\n\n const validFiles: any[] = [];\n const validFileNames: string[] = [];\n const errors: Array<ErrorDetail> = [];\n\n for (const [index, result] of validationResults.entries()) {\n if (result.isValid) {\n const file = filesArray[index];\n validFiles.push(file);\n validFileNames.push(file.originalFilename || file.name);\n } else if (result.error) {\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: result.error,\n });\n } else {\n // Handle case where validation failed but no error details are provided\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: {\n code: 'UNKNOWN_ERROR' as const,\n message: 'File validation failed for unknown reason',\n details: {\n index,\n fileName: filesArray[index]?.name || filesArray[index]?.originalname,\n },\n },\n });\n }\n }\n\n return { validFiles, validFileNames, errors };\n}\n\nexport type PrepareUploadResult = {\n validFiles: any[];\n filteredBody: any;\n};\n\n/**\n * Prepare files and body for upload by enforcing security and parsing fileInfo\n */\nexport async function prepareUploadRequest(\n filesInput: any,\n body: any,\n strapi: Core.Strapi\n): Promise<PrepareUploadResult> {\n const securityResults = await enforceUploadSecurity(filesInput, strapi);\n\n if (securityResults.validFiles.length === 0) {\n throw new errors.ValidationError(\n securityResults.errors[0].error.message,\n securityResults.errors[0].error.details\n );\n }\n\n let filteredBody = body;\n if (body?.fileInfo) {\n // Parse JSON strings in fileInfo\n let parsedFileInfo = body.fileInfo;\n if (Array.isArray(body.fileInfo)) {\n parsedFileInfo = body.fileInfo.map((fi: any) =>\n typeof fi === 'string' ? JSON.parse(fi) : fi\n );\n } else if (typeof body.fileInfo === 'string') {\n parsedFileInfo = JSON.parse(body.fileInfo);\n }\n\n // Filter fileInfo by index - only keep entries for files that passed validation\n if (Array.isArray(parsedFileInfo)) {\n const invalidIndices = new Set(securityResults.errors.map((e) => e.originalIndex));\n const filteredFileInfo = parsedFileInfo.filter(\n (_: any, index: number) => !invalidIndices.has(index)\n );\n\n if (filteredFileInfo.length === 1) {\n filteredBody = {\n ...body,\n fileInfo: filteredFileInfo[0],\n };\n } else {\n filteredBody = {\n ...body,\n fileInfo: filteredFileInfo,\n };\n }\n } else {\n filteredBody = {\n ...body,\n fileInfo: parsedFileInfo,\n };\n }\n }\n\n return {\n validFiles: securityResults.validFiles,\n filteredBody,\n };\n}\n"],"names":["readFileChunk","filePath","chunkSize","buffer","readFile","length","subarray","detectMimeType","file","path","filepath","tempFilePath","error","Error","message","String","undefined","fileTypeFromBuffer","result","Uint8Array","mime","matchesMimePattern","mimeType","patterns","some","pattern","normalizedPattern","toLowerCase","normalizedMimeType","includes","regexPattern","replace","regex","RegExp","matches","test","exactMatch","isMimeTypeAllowed","config","allowedTypes","deniedTypes","extractFileInfo","fileName","originalFilename","name","filename","newFilename","declaredMimeType","mimetype","type","validateFile","strapi","isValid","detectedMime","mimeDetectionFailed","log","warn","mimeToValidate","code","details","reason","declaredType","detectedType","finalType","validateFiles","files","filesArray","Array","isArray","get","every","item","errors","ApplicationError","map","validationPromises","index","fileIndex","originalname","originalError","Promise","all","enforceUploadSecurity","validationResults","validFiles","validFileNames","entries","push","originalIndex","prepareUploadRequest","filesInput","body","securityResults","ValidationError","filteredBody","fileInfo","parsedFileInfo","fi","JSON","parse","invalidIndices","Set","e","filteredFileInfo","filter","_","has"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/upload",
|
|
3
|
-
"version": "5.33.
|
|
3
|
+
"version": "5.33.3",
|
|
4
4
|
"description": "Makes it easy to upload images and files to your Strapi Application.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": {
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"@reduxjs/toolkit": "1.9.7",
|
|
65
65
|
"@strapi/design-system": "2.0.1",
|
|
66
66
|
"@strapi/icons": "2.0.1",
|
|
67
|
-
"@strapi/provider-upload-local": "5.33.
|
|
68
|
-
"@strapi/utils": "5.33.
|
|
67
|
+
"@strapi/provider-upload-local": "5.33.3",
|
|
68
|
+
"@strapi/utils": "5.33.3",
|
|
69
69
|
"byte-size": "8.1.1",
|
|
70
70
|
"cropperjs": "1.6.1",
|
|
71
71
|
"date-fns": "2.30.0",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"lodash": "4.17.21",
|
|
79
79
|
"mime-types": "2.1.35",
|
|
80
80
|
"prop-types": "^15.8.1",
|
|
81
|
-
"qs": "6.
|
|
81
|
+
"qs": "6.14.1",
|
|
82
82
|
"react-dnd": "16.0.1",
|
|
83
83
|
"react-intl": "6.6.2",
|
|
84
84
|
"react-query": "3.39.3",
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
"zod": "3.25.67"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
|
-
"@strapi/admin": "5.33.
|
|
93
|
-
"@strapi/types": "5.33.
|
|
92
|
+
"@strapi/admin": "5.33.3",
|
|
93
|
+
"@strapi/types": "5.33.3",
|
|
94
94
|
"@testing-library/dom": "10.4.1",
|
|
95
95
|
"@testing-library/react": "16.3.0",
|
|
96
96
|
"@testing-library/user-event": "14.6.1",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"@types/koa-range": "0.3.5",
|
|
101
101
|
"@types/koa-static": "4.0.2",
|
|
102
102
|
"formidable": "3.5.4",
|
|
103
|
-
"koa": "2.16.
|
|
103
|
+
"koa": "2.16.3",
|
|
104
104
|
"koa-body": "6.0.1",
|
|
105
105
|
"msw": "1.3.0",
|
|
106
106
|
"react": "18.3.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibrary.js","sources":["../../../../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AIUploadModal } from '../../../ai/components/AIUploadModal';\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAIAvailability } from '../../../hooks/useAiAvailability';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const { isEnabled: isAiEnabled, status: aiAvailabilityStatus } = useAIAvailability();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading =\n isCurrentFolderLoading ||\n foldersLoading ||\n permissionsLoading ||\n assetsLoading ||\n aiAvailabilityStatus === 'loading';\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll, setSelections }] = useSelectionState<\n FolderRow | FileRow\n >(['type', 'id'], []);\n // reset selection when folder changes to hide bulk actions\n React.useEffect(() => {\n setSelections([]);\n }, [query.folder, setSelections]);\n\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError || aiAvailabilityStatus === 'error') {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('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 <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\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 const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\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 as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).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} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog &&\n (isAiEnabled ? (\n <AIUploadModal\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n folderId={query?.folder ? Number(query.folder) : null}\n />\n ) : (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n ))}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n"],"names":["BoxWithHeight","styled","Box","TypographyMaxWidth","Typography","ActionContainer","theme","colors","neutral500","MediaLibrary","navigate","useNavigate","canRead","canCreate","canUpdate","canCopyLink","canDownload","canConfigureView","isLoading","permissionsLoading","useMediaLibraryPermissions","isEnabled","isAiEnabled","status","aiAvailabilityStatus","useAIAvailability","currentFolderToEditRef","React","useRef","formatMessage","useIntl","pathname","useLocation","trackUsage","useTracking","query","setQuery","useQueryParams","isFiltering","Boolean","_q","filters","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","data","assetsData","assetsLoading","error","assetsError","useAssets","skipWhen","foldersData","foldersLoading","foldersError","useFolders","enabled","pagination","page","containsAssetFilter","currentFolder","isCurrentFolderLoading","currentFolderError","useFolder","folder","name","folders","map","type","folderURL","getFolderURL","id","toString","folderPath","path","isSelectable","folderCount","length","assets","results","asset","assetCount","totalAssetCount","total","showUploadAssetDialog","setShowUploadAssetDialog","useState","showEditFolderDialog","setShowEditFolderDialog","assetToEdit","setAssetToEdit","undefined","folderToEdit","setFolderToEdit","selected","selectOne","selectAll","setSelections","useSelectionState","useEffect","indeterminateBulkSelect","toggleUploadAssetDialog","prev","toggleEditFolderDialog","created","handleBulkSelect","checked","elements","handleChangeSort","value","location","sort","handleEditFolder","handleEditFolderClose","payload","current","focus","handleAssetDeleted","numberOfAssets","pageCount","handleBulkActionSuccess","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Main","Header","breadcrumbs","getBreadcrumbDataML","onToggleEditFolderDialog","onToggleUploadAssetDialog","Action","startActions","_Fragment","paddingLeft","paddingRight","background","hasRadius","borderColor","Checkbox","aria-label","getTrad","defaultMessage","onCheckedChange","e","SortPicker","onChangeSort","Filters","endActions","paddingTop","paddingBottom","IconButton","tag","ReactRouterLink","to","search","stringify","encode","label","Cog","onClick","LIST","List","GridIcon","SearchInput","trackedEvent","trackedEventDetails","Content","BulkActions","onSuccess","EmptyOrNoPermissions","onActionClick","TableList","indeterminate","onChangeFolder","folderID","onEditAsset","onEditFolder","onSelectOne","onSelectAll","rows","shouldDisableBulkSelect","sortQuery","FolderGridList","title","count","selectedFolders","filter","isSelected","find","url","Grid","Item","col","m","s","xs","direction","alignItems","FolderCard","ref","ariaLabel","startAction","FolderCardCheckbox","data-testid","cardActions","Pencil","FolderCardBody","FolderCardBodyAction","Flex","maxWidth","fontWeight","textColor","ellipsis","VisuallyHidden","variant","children","filesCount","files","Divider","AssetGridList","onSelectAsset","selectedAssets","Pagination","PageSize","Links","AIUploadModal","open","onClose","folderId","Number","UploadAssetDialog","trackedLocation","EditFolderDialog","parentFolderId","EditAssetDialog","editedAsset"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibrary.mjs","sources":["../../../../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AIUploadModal } from '../../../ai/components/AIUploadModal';\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAIAvailability } from '../../../hooks/useAiAvailability';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const { isEnabled: isAiEnabled, status: aiAvailabilityStatus } = useAIAvailability();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading =\n isCurrentFolderLoading ||\n foldersLoading ||\n permissionsLoading ||\n assetsLoading ||\n aiAvailabilityStatus === 'loading';\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll, setSelections }] = useSelectionState<\n FolderRow | FileRow\n >(['type', 'id'], []);\n // reset selection when folder changes to hide bulk actions\n React.useEffect(() => {\n setSelections([]);\n }, [query.folder, setSelections]);\n\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError || aiAvailabilityStatus === 'error') {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('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 <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\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 const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\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 as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).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} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog &&\n (isAiEnabled ? (\n <AIUploadModal\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n folderId={query?.folder ? Number(query.folder) : null}\n />\n ) : (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n ))}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n"],"names":["BoxWithHeight","styled","Box","TypographyMaxWidth","Typography","ActionContainer","theme","colors","neutral500","MediaLibrary","navigate","useNavigate","canRead","canCreate","canUpdate","canCopyLink","canDownload","canConfigureView","isLoading","permissionsLoading","useMediaLibraryPermissions","isEnabled","isAiEnabled","status","aiAvailabilityStatus","useAIAvailability","currentFolderToEditRef","React","useRef","formatMessage","useIntl","pathname","useLocation","trackUsage","useTracking","query","setQuery","useQueryParams","isFiltering","Boolean","_q","filters","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","data","assetsData","assetsLoading","error","assetsError","useAssets","skipWhen","foldersData","foldersLoading","foldersError","useFolders","enabled","pagination","page","containsAssetFilter","currentFolder","isCurrentFolderLoading","currentFolderError","useFolder","folder","name","folders","map","type","folderURL","getFolderURL","id","toString","folderPath","path","isSelectable","folderCount","length","assets","results","asset","assetCount","totalAssetCount","total","showUploadAssetDialog","setShowUploadAssetDialog","useState","showEditFolderDialog","setShowEditFolderDialog","assetToEdit","setAssetToEdit","undefined","folderToEdit","setFolderToEdit","selected","selectOne","selectAll","setSelections","useSelectionState","useEffect","indeterminateBulkSelect","toggleUploadAssetDialog","prev","toggleEditFolderDialog","created","handleBulkSelect","checked","elements","handleChangeSort","value","location","sort","handleEditFolder","handleEditFolderClose","payload","current","focus","handleAssetDeleted","numberOfAssets","pageCount","handleBulkActionSuccess","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Main","Header","breadcrumbs","getBreadcrumbDataML","onToggleEditFolderDialog","onToggleUploadAssetDialog","Action","startActions","_Fragment","paddingLeft","paddingRight","background","hasRadius","borderColor","Checkbox","aria-label","getTrad","defaultMessage","onCheckedChange","e","SortPicker","onChangeSort","Filters","endActions","paddingTop","paddingBottom","IconButton","tag","ReactRouterLink","to","search","stringify","encode","label","Cog","onClick","LIST","List","GridIcon","SearchInput","trackedEvent","trackedEventDetails","Content","BulkActions","onSuccess","EmptyOrNoPermissions","onActionClick","TableList","indeterminate","onChangeFolder","folderID","onEditAsset","onEditFolder","onSelectOne","onSelectAll","rows","shouldDisableBulkSelect","sortQuery","FolderGridList","title","count","selectedFolders","filter","isSelected","find","url","Grid","Item","col","m","s","xs","direction","alignItems","FolderCard","ref","ariaLabel","startAction","FolderCardCheckbox","data-testid","cardActions","Pencil","FolderCardBody","FolderCardBodyAction","Flex","maxWidth","fontWeight","textColor","ellipsis","VisuallyHidden","variant","children","filesCount","files","Divider","AssetGridList","onSelectAsset","selectedAssets","Pagination","PageSize","Links","AIUploadModal","open","onClose","folderId","Number","UploadAssetDialog","trackedLocation","EditFolderDialog","parentFolderId","EditAssetDialog","editedAsset"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkActions.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n"],"names":["BulkActions","selected","onSuccess","currentFolder","formatMessage","useIntl","numberAssets","reduce","_this","val","type","files","count","_jsxs","Flex","gap","paddingBottom","_jsx","Typography","variant","textColor","id","getTrad","defaultMessage","numberFolders","filter","length","BulkDeleteButton","BulkMoveButton"],"mappings":";;;;;;;;;;;;;;AA4BO,MAAMA,WAAc,GAAA,CAAC,EAAEC,QAAAA,GAAW,EAAE,EAAEC,SAAS,EAAEC,aAAa,EAAoB,GAAA;IACvF,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,eAAeL,QAAUM,EAAAA,MAAAA,CAAO,SAAUC,KAAK,EAAEC,GAAG,EAAA;AACxD,QAAA,OAAOA,GAAKC,EAAAA,IAAAA,KAAS,QAAY,IAAA,OAAA,IAAWD,OAAOA,GAAKE,EAAAA,KAAAA,IAAS,OAAWF,IAAAA,GAAAA,CAAIE,KAAK,GACjFH,KAAAA,GAAQC,GAAKE,EAAAA,KAAAA,EAAOC,QACpBJ,KAAQ,GAAA,CAAA;KACX,EAAA,CAAA,CAAA;AAEH,IAAA,qBACEK,eAACC,CAAAA,iBAAAA,EAAAA;QAAKC,GAAK,EAAA,CAAA;QAAGC,aAAe,EAAA,CAAA;;0BAC3BC,cAACC,CAAAA,uBAAAA,EAAAA;gBAAWC,OAAQ,EAAA,SAAA;gBAAUC,SAAU,EAAA,YAAA;0BACrChB,aACC,CAAA;AACEiB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,sBAAA,CAAA;oBACZC,cACE,EAAA;iBAEJ,EAAA;oBACEC,aAAevB,EAAAA,QAAAA,EAAUwB,OAAO,CAAC,EAAEf,IAAI,EAAE,GAAKA,SAAS,QAAUgB,CAAAA,CAAAA,MAAAA;AACjEpB,oBAAAA;AACF,iBAAA;;0BAIJW,cAACU,CAAAA,iCAAAA,EAAAA;gBACC1B,QAAUA,EAAAA,QAAAA;gBACVC,SAAWA,EAAAA;;0BAEbe,cAACW,CAAAA,6BAAAA,EAAAA;gBACCzB,aAAeA,EAAAA,aAAAA;gBACfF,QAAUA,EAAAA,QAAAA;gBACVC,SAAWA,EAAAA;;;;AAInB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkActions.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n"],"names":["BulkActions","selected","onSuccess","currentFolder","formatMessage","useIntl","numberAssets","reduce","_this","val","type","files","count","_jsxs","Flex","gap","paddingBottom","_jsx","Typography","variant","textColor","id","getTrad","defaultMessage","numberFolders","filter","length","BulkDeleteButton","BulkMoveButton"],"mappings":";;;;;;;;;;;;AA4BO,MAAMA,WAAc,GAAA,CAAC,EAAEC,QAAAA,GAAW,EAAE,EAAEC,SAAS,EAAEC,aAAa,EAAoB,GAAA;IACvF,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,eAAeL,QAAUM,EAAAA,MAAAA,CAAO,SAAUC,KAAK,EAAEC,GAAG,EAAA;AACxD,QAAA,OAAOA,GAAKC,EAAAA,IAAAA,KAAS,QAAY,IAAA,OAAA,IAAWD,OAAOA,GAAKE,EAAAA,KAAAA,IAAS,OAAWF,IAAAA,GAAAA,CAAIE,KAAK,GACjFH,KAAAA,GAAQC,GAAKE,EAAAA,KAAAA,EAAOC,QACpBJ,KAAQ,GAAA,CAAA;KACX,EAAA,CAAA,CAAA;AAEH,IAAA,qBACEK,IAACC,CAAAA,IAAAA,EAAAA;QAAKC,GAAK,EAAA,CAAA;QAAGC,aAAe,EAAA,CAAA;;0BAC3BC,GAACC,CAAAA,UAAAA,EAAAA;gBAAWC,OAAQ,EAAA,SAAA;gBAAUC,SAAU,EAAA,YAAA;0BACrChB,aACC,CAAA;AACEiB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,sBAAA,CAAA;oBACZC,cACE,EAAA;iBAEJ,EAAA;oBACEC,aAAevB,EAAAA,QAAAA,EAAUwB,OAAO,CAAC,EAAEf,IAAI,EAAE,GAAKA,SAAS,QAAUgB,CAAAA,CAAAA,MAAAA;AACjEpB,oBAAAA;AACF,iBAAA;;0BAIJW,GAACU,CAAAA,gBAAAA,EAAAA;gBACC1B,QAAUA,EAAAA,QAAAA;gBACVC,SAAWA,EAAAA;;0BAEbe,GAACW,CAAAA,cAAAA,EAAAA;gBACCzB,aAAeA,EAAAA,aAAAA;gBACfF,QAAUA,EAAAA,QAAAA;gBACVC,SAAWA,EAAAA;;;;AAInB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkDeleteButton.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx"],"sourcesContent":["import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n"],"names":["BulkDeleteButton","selected","onSuccess","formatMessage","useIntl","remove","useBulkRemove","handleConfirmRemove","_jsxs","Dialog","Root","_jsx","Trigger","Button","variant","size","startIcon","Trash","id","defaultMessage","ConfirmDialog","onConfirm"],"mappings":";;;;;;;;;MAeaA,gBAAmB,GAAA,CAAC,EAAEC,QAAQ,EAAEC,SAAS,EAAyB,GAAA;IAC7E,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,MAAM,EAAE,GAAGC,2BAAAA,EAAAA;AAEnB,IAAA,MAAMC,mBAAsB,GAAA,UAAA;AAC1B,QAAA,MAAMF,MAAOJ,CAAAA,QAAAA,CAAAA;AACbC,QAAAA,SAAAA,EAAAA;AACF,KAAA;IAEA,qBACEM,eAAA,CAACC,oBAAOC,IAAI,EAAA;;AACV,0BAAAC,cAAA,CAACF,oBAAOG,OAAO,EAAA;AACb,gBAAA,QAAA,gBAAAD,cAACE,CAAAA,mBAAAA,EAAAA;oBAAOC,OAAQ,EAAA,cAAA;oBAAeC,IAAK,EAAA,GAAA;AAAIC,oBAAAA,SAAAA,gBAAWL,cAACM,CAAAA,WAAAA,EAAAA,EAAAA,CAAAA;8BACjDd,aAAc,CAAA;wBAAEe,EAAI,EAAA,eAAA;wBAAiBC,cAAgB,EAAA;AAAS,qBAAA;;;0BAGnER,cAACS,CAAAA,yBAAAA,EAAAA;gBAAcC,SAAWd,EAAAA;;;;AAGhC;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkDeleteButton.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx"],"sourcesContent":["import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n"],"names":["BulkDeleteButton","selected","onSuccess","formatMessage","useIntl","remove","useBulkRemove","handleConfirmRemove","_jsxs","Dialog","Root","_jsx","Trigger","Button","variant","size","startIcon","Trash","id","defaultMessage","ConfirmDialog","onConfirm"],"mappings":";;;;;;;MAeaA,gBAAmB,GAAA,CAAC,EAAEC,QAAQ,EAAEC,SAAS,EAAyB,GAAA;IAC7E,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,MAAM,EAAE,GAAGC,aAAAA,EAAAA;AAEnB,IAAA,MAAMC,mBAAsB,GAAA,UAAA;AAC1B,QAAA,MAAMF,MAAOJ,CAAAA,QAAAA,CAAAA;AACbC,QAAAA,SAAAA,EAAAA;AACF,KAAA;IAEA,qBACEM,IAAA,CAACC,OAAOC,IAAI,EAAA;;AACV,0BAAAC,GAAA,CAACF,OAAOG,OAAO,EAAA;AACb,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,MAAAA,EAAAA;oBAAOC,OAAQ,EAAA,cAAA;oBAAeC,IAAK,EAAA,GAAA;AAAIC,oBAAAA,SAAAA,gBAAWL,GAACM,CAAAA,KAAAA,EAAAA,EAAAA,CAAAA;8BACjDd,aAAc,CAAA;wBAAEe,EAAI,EAAA,eAAA;wBAAiBC,cAAgB,EAAA;AAAS,qBAAA;;;0BAGnER,GAACS,CAAAA,aAAAA,EAAAA;gBAAcC,SAAWd,EAAAA;;;;AAGhC;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkMoveButton.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n"],"names":["BulkMoveButton","selected","onSuccess","currentFolder","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","handleConfirmMove","_jsxs","Modal","Root","open","onOpenChange","_jsx","Trigger","Button","variant","size","startIcon","Folder","id","defaultMessage","BulkMoveDialog","onClose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAMA,cAAiB,GAAA,CAAC,EAC7BC,QAAAA,GAAW,EAAE,EACbC,SAAS,EACTC,aAAa,EACO,GAAA;IACpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AAEjE,IAAA,MAAMC,iBAAoB,GAAA,IAAA;QACxBH,oBAAqB,CAAA,KAAA,CAAA;AACrBL,QAAAA,SAAAA,EAAAA;AACF,KAAA;IAEA,qBACES,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAACC,IAAMR,EAAAA,iBAAAA;QAAmBS,YAAcR,EAAAA,oBAAAA;;AACjD,0BAAAS,cAAA,CAACJ,mBAAMK,OAAO,EAAA;AACZ,gBAAA,QAAA,gBAAAD,cAACE,CAAAA,mBAAAA,EAAAA;oBAAOC,OAAQ,EAAA,WAAA;oBAAYC,IAAK,EAAA,GAAA;AAAIC,oBAAAA,SAAAA,gBAAWL,cAACM,CAAAA,YAAAA,EAAAA,EAAAA,CAAAA;8BAC9ClB,aAAc,CAAA;wBAAEmB,EAAI,EAAA,aAAA;wBAAeC,cAAgB,EAAA;AAAO,qBAAA;;;0BAG/DR,cAACS,CAAAA,6BAAAA,EAAAA;gBACCtB,aAAeA,EAAAA,aAAAA;gBACfuB,OAAShB,EAAAA,iBAAAA;gBACTT,QAAUA,EAAAA;;;;AAIlB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BulkMoveButton.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n"],"names":["BulkMoveButton","selected","onSuccess","currentFolder","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","handleConfirmMove","_jsxs","Modal","Root","open","onOpenChange","_jsx","Trigger","Button","variant","size","startIcon","Folder","id","defaultMessage","BulkMoveDialog","onClose"],"mappings":";;;;;;;AAyBO,MAAMA,cAAiB,GAAA,CAAC,EAC7BC,QAAAA,GAAW,EAAE,EACbC,SAAS,EACTC,aAAa,EACO,GAAA;IACpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AAEjE,IAAA,MAAMC,iBAAoB,GAAA,IAAA;QACxBH,oBAAqB,CAAA,KAAA,CAAA;AACrBL,QAAAA,SAAAA,EAAAA;AACF,KAAA;IAEA,qBACES,IAAA,CAACC,MAAMC,IAAI,EAAA;QAACC,IAAMR,EAAAA,iBAAAA;QAAmBS,YAAcR,EAAAA,oBAAAA;;AACjD,0BAAAS,GAAA,CAACJ,MAAMK,OAAO,EAAA;AACZ,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,MAAAA,EAAAA;oBAAOC,OAAQ,EAAA,WAAA;oBAAYC,IAAK,EAAA,GAAA;AAAIC,oBAAAA,SAAAA,gBAAWL,GAACM,CAAAA,MAAAA,EAAAA,EAAAA,CAAAA;8BAC9ClB,aAAc,CAAA;wBAAEmB,EAAI,EAAA,aAAA;wBAAeC,cAAgB,EAAA;AAAO,qBAAA;;;0BAG/DR,GAACS,CAAAA,cAAAA,EAAAA;gBACCtB,aAAeA,EAAAA,aAAAA;gBACfuB,OAAShB,EAAAA,iBAAAA;gBACTT,QAAUA,EAAAA;;;;AAIlB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyOrNoPermissions.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx"],"sourcesContent":["import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n"],"names":["getContentIntlMessage","isFiltering","canCreate","canRead","id","defaultMessage","EmptyOrNoPermissions","onActionClick","formatMessage","useIntl","content","_jsx","EmptyAssets","icon","EmptyPermissions","undefined","action","Button","variant","startIcon","Plus","onClick","getTrad"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAMA,qBAAAA,GAAwB,CAAC,EAC7BC,WAAW,EACXC,SAAS,EACTC,OAAO,EAC0C,GAAA;AACjD,IAAA,IAAIF,WAAa,EAAA;QACf,OAAO;YACLG,EAAI,EAAA,oCAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;AACF;AAEA,IAAA,IAAIF,OAAS,EAAA;AACX,QAAA,IAAID,SAAW,EAAA;YACb,OAAO;gBACLE,EAAI,EAAA,0BAAA;gBACJC,cAAgB,EAAA;AAClB,aAAA;AACF;QAEA,OAAO;YACLD,EAAI,EAAA,mBAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;AACF;IAEA,OAAO;QACLD,EAAI,EAAA,+BAAA;QACJC,cAAgB,EAAA;AAClB,KAAA;AACF,CAAA;AAEO,MAAMC,oBAAuB,GAAA,CAAC,EACnCJ,SAAS,EACTD,WAAW,EACXE,OAAO,EACPI,aAAa,EACa,GAAA;IAC1B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,UAAUV,qBAAsB,CAAA;AAAEC,QAAAA,WAAAA;AAAaC,QAAAA,SAAAA;AAAWC,QAAAA;AAAQ,KAAA,CAAA;AAExE,IAAA,qBACEQ,cAACC,CAAAA,uBAAAA,EAAAA;QACCC,IAAM,EAAA,CAACV,UAAUW,wBAAmBC,GAAAA,SAAAA;QACpCC,MACEd,EAAAA,SAAAA,IACA,CAACD,WAAAA,kBACCU,cAACM,CAAAA,mBAAAA,EAAAA;YAAOC,OAAQ,EAAA,WAAA;AAAYC,YAAAA,SAAAA,gBAAWR,cAACS,CAAAA,UAAAA,EAAAA,EAAAA,CAAAA;YAASC,OAASd,EAAAA,aAAAA;sBACvDC,aAAc,CAAA;AACbJ,gBAAAA,EAAAA,EAAIkB,eAAQ,CAAA,2BAAA,CAAA;gBACZjB,cAAgB,EAAA;AAClB,aAAA;;AAINK,QAAAA,OAAAA,EAASF,aAAc,CAAA;AACrB,YAAA,GAAGE,OAAO;YACVN,EAAIkB,EAAAA,eAAAA,CAAQZ,QAAQN,EAAE;AACxB,SAAA;;AAGN;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyOrNoPermissions.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx"],"sourcesContent":["import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n"],"names":["getContentIntlMessage","isFiltering","canCreate","canRead","id","defaultMessage","EmptyOrNoPermissions","onActionClick","formatMessage","useIntl","content","_jsx","EmptyAssets","icon","EmptyPermissions","undefined","action","Button","variant","startIcon","Plus","onClick","getTrad"],"mappings":";;;;;;;;;;;;;AAeA,MAAMA,qBAAAA,GAAwB,CAAC,EAC7BC,WAAW,EACXC,SAAS,EACTC,OAAO,EAC0C,GAAA;AACjD,IAAA,IAAIF,WAAa,EAAA;QACf,OAAO;YACLG,EAAI,EAAA,oCAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;AACF;AAEA,IAAA,IAAIF,OAAS,EAAA;AACX,QAAA,IAAID,SAAW,EAAA;YACb,OAAO;gBACLE,EAAI,EAAA,0BAAA;gBACJC,cAAgB,EAAA;AAClB,aAAA;AACF;QAEA,OAAO;YACLD,EAAI,EAAA,mBAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;AACF;IAEA,OAAO;QACLD,EAAI,EAAA,+BAAA;QACJC,cAAgB,EAAA;AAClB,KAAA;AACF,CAAA;AAEO,MAAMC,oBAAuB,GAAA,CAAC,EACnCJ,SAAS,EACTD,WAAW,EACXE,OAAO,EACPI,aAAa,EACa,GAAA;IAC1B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,UAAUV,qBAAsB,CAAA;AAAEC,QAAAA,WAAAA;AAAaC,QAAAA,SAAAA;AAAWC,QAAAA;AAAQ,KAAA,CAAA;AAExE,IAAA,qBACEQ,GAACC,CAAAA,WAAAA,EAAAA;QACCC,IAAM,EAAA,CAACV,UAAUW,gBAAmBC,GAAAA,SAAAA;QACpCC,MACEd,EAAAA,SAAAA,IACA,CAACD,WAAAA,kBACCU,GAACM,CAAAA,MAAAA,EAAAA;YAAOC,OAAQ,EAAA,WAAA;AAAYC,YAAAA,SAAAA,gBAAWR,GAACS,CAAAA,IAAAA,EAAAA,EAAAA,CAAAA;YAASC,OAASd,EAAAA,aAAAA;sBACvDC,aAAc,CAAA;AACbJ,gBAAAA,EAAAA,EAAIkB,OAAQ,CAAA,2BAAA,CAAA;gBACZjB,cAAgB,EAAA;AAClB,aAAA;;AAINK,QAAAA,OAAAA,EAASF,aAAc,CAAA;AACrB,YAAA,GAAGE,OAAO;YACVN,EAAIkB,EAAAA,OAAAA,CAAQZ,QAAQN,EAAE;AACxB,SAAA;;AAGN;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { useTracking } from '../../../../hooks/useTracking';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\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 displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n"],"names":["Filters","open","setOpen","React","useState","formatMessage","useIntl","trackUsage","useTracking","query","setQuery","useQueryParams","filters","$and","handleRemoveFilter","nextFilters","page","handleSubmit","location","filter","Object","keys","length","_jsxs","Popover","Root","onOpenChange","_jsx","Trigger","Button","variant","startIcon","Filter","size","id","defaultMessage","FilterPopover","displayedFilters","onSubmit","onToggle","FilterList","appliedFilters","filtersSchema","onRemoveFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgBaA,OAAU,GAAA,IAAA;AACrB,IAAA,MAAM,CAACC,IAAMC,EAAAA,OAAAA,CAAQ,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACvC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;AACvB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;AAC9B,IAAA,MAAMC,OAAUH,GAAAA,KAAAA,EAAOG,OAASC,EAAAA,IAAAA,IAAQ,EAAE;AAE1C,IAAA,MAAMC,qBAAwD,CAACC,WAAAA,GAAAA;QAC7DL,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAME,EAAAA;AAAY,aAAA;YAAGC,IAAM,EAAA;AAAE,SAAA,CAAA;AACrD,KAAA;AAEA,IAAA,MAAMC,eAA+C,CAACL,OAAAA,GAAAA;AACpDL,QAAAA,UAAAA,CAAW,+BAAiC,EAAA;YAC1CW,QAAU,EAAA,iBAAA;YACVC,MAAQC,EAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAO,CAACA,OAAQU,CAAAA,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAE;AACrD,SAAA,CAAA;QACAZ,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAMD,EAAAA;AAAQ,aAAA;YAAGI,IAAM,EAAA;AAAE,SAAA,CAAA;AACjD,KAAA;IAEA,qBACEO,eAAA,CAACC,qBAAQC,IAAI,EAAA;QAACxB,IAAMA,EAAAA,IAAAA;QAAMyB,YAAcxB,EAAAA,OAAAA;;AACtC,0BAAAyB,cAAA,CAACH,qBAAQI,OAAO,EAAA;AACd,gBAAA,QAAA,gBAAAD,cAACE,CAAAA,mBAAAA,EAAAA;oBAAOC,OAAQ,EAAA,UAAA;AAAWC,oBAAAA,SAAAA,gBAAWJ,cAACK,CAAAA,YAAAA,EAAAA,EAAAA,CAAAA;oBAAWC,IAAK,EAAA,GAAA;8BACpD5B,aAAc,CAAA;wBAAE6B,EAAI,EAAA,mBAAA;wBAAqBC,cAAgB,EAAA;AAAU,qBAAA;;;0BAGxER,cAACS,CAAAA,2BAAAA,EAAAA;gBACCC,gBAAkBA,EAAAA,iCAAAA;gBAClBzB,OAASA,EAAAA,OAAAA;gBACT0B,QAAUrB,EAAAA,YAAAA;gBACVsB,QAAUrC,EAAAA;;0BAEZyB,cAACa,CAAAA,qBAAAA,EAAAA;gBACCC,cAAgB7B,EAAAA,OAAAA;gBAChB8B,aAAeL,EAAAA,iCAAAA;gBACfM,cAAgB7B,EAAAA;;;;AAIxB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { useTracking } from '../../../../hooks/useTracking';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\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 displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n"],"names":["Filters","open","setOpen","React","useState","formatMessage","useIntl","trackUsage","useTracking","query","setQuery","useQueryParams","filters","$and","handleRemoveFilter","nextFilters","page","handleSubmit","location","filter","Object","keys","length","_jsxs","Popover","Root","onOpenChange","_jsx","Trigger","Button","variant","startIcon","Filter","size","id","defaultMessage","FilterPopover","displayedFilters","onSubmit","onToggle","FilterList","appliedFilters","filtersSchema","onRemoveFilter"],"mappings":";;;;;;;;;;;;;;;;MAgBaA,OAAU,GAAA,IAAA;AACrB,IAAA,MAAM,CAACC,IAAMC,EAAAA,OAAAA,CAAQ,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACvC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;AAC9B,IAAA,MAAMC,OAAUH,GAAAA,KAAAA,EAAOG,OAASC,EAAAA,IAAAA,IAAQ,EAAE;AAE1C,IAAA,MAAMC,qBAAwD,CAACC,WAAAA,GAAAA;QAC7DL,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAME,EAAAA;AAAY,aAAA;YAAGC,IAAM,EAAA;AAAE,SAAA,CAAA;AACrD,KAAA;AAEA,IAAA,MAAMC,eAA+C,CAACL,OAAAA,GAAAA;AACpDL,QAAAA,UAAAA,CAAW,+BAAiC,EAAA;YAC1CW,QAAU,EAAA,iBAAA;YACVC,MAAQC,EAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAO,CAACA,OAAQU,CAAAA,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAE;AACrD,SAAA,CAAA;QACAZ,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAMD,EAAAA;AAAQ,aAAA;YAAGI,IAAM,EAAA;AAAE,SAAA,CAAA;AACjD,KAAA;IAEA,qBACEO,IAAA,CAACC,QAAQC,IAAI,EAAA;QAACxB,IAAMA,EAAAA,IAAAA;QAAMyB,YAAcxB,EAAAA,OAAAA;;AACtC,0BAAAyB,GAAA,CAACH,QAAQI,OAAO,EAAA;AACd,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,MAAAA,EAAAA;oBAAOC,OAAQ,EAAA,UAAA;AAAWC,oBAAAA,SAAAA,gBAAWJ,GAACK,CAAAA,MAAAA,EAAAA,EAAAA,CAAAA;oBAAWC,IAAK,EAAA,GAAA;8BACpD5B,aAAc,CAAA;wBAAE6B,EAAI,EAAA,mBAAA;wBAAqBC,cAAgB,EAAA;AAAU,qBAAA;;;0BAGxER,GAACS,CAAAA,aAAAA,EAAAA;gBACCC,gBAAkBA,EAAAA,gBAAAA;gBAClBzB,OAASA,EAAAA,OAAAA;gBACT0B,QAAUrB,EAAAA,YAAAA;gBACVsB,QAAUrC,EAAAA;;0BAEZyB,GAACa,CAAAA,UAAAA,EAAAA;gBACCC,cAAgB7B,EAAAA,OAAAA;gBAChB8B,aAAeL,EAAAA,gBAAAA;gBACfM,cAAgB7B,EAAAA;;;;AAIxB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Header.tsx"],"sourcesContent":["import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n"],"names":["Header","breadcrumbs","canCreate","folder","onToggleEditFolderDialog","onToggleUploadAssetDialog","formatMessage","useIntl","pathname","useLocation","query","useQueryParams","backQuery","parent","id","undefined","folderPath","path","_jsx","Layouts","title","getTrad","defaultMessage","subtitle","Breadcrumbs","label","currentFolderId","navigationAction","Link","tag","NavLink","startIcon","ArrowLeft","to","stringify","encode","primaryAction","_jsxs","Flex","gap","Button","Plus","variant","onClick"],"mappings":";;;;;;;;;;;;;;;;AA+BaA,MAAAA,MAAAA,GAAS,CAAC,EACrBC,cAAc,IAAI,EAClBC,SAAS,EACTC,SAAS,IAAI,EACbC,wBAAwB,EACxBC,yBAAyB,EACb,GAAA;IACZ,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,QAAQ,EAAE,GAAGC,0BAAAA,EAAAA;AACrB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;AACpB,IAAA,MAAMC,SAAY,GAAA;AAChB,QAAA,GAAGF,KAAK;AACRP,QAAAA,MAAAA,EACEA,QAAQU,MAAU,IAAA,OAAOV,MAAOU,CAAAA,MAAM,KAAK,QAAYV,IAAAA,MAAAA,CAAOU,MAAM,CAACC,EAAE,GACnEX,MAAAA,CAAOU,MAAM,CAACC,EAAE,GAChBC,SAAAA;AACNC,QAAAA,UAAAA,EACEb,QAAQU,MAAU,IAAA,OAAOV,MAAOU,CAAAA,MAAM,KAAK,QAAYV,IAAAA,MAAAA,CAAOU,MAAM,CAACI,IAAI,GACrEd,MAAAA,CAAOU,MAAM,CAACI,IAAI,GAClBF;AACR,KAAA;IAEA,qBACEG,cAAA,CAACC,oBAAQnB,MAAM,EAAA;AACboB,QAAAA,KAAAA,EAAOd,aAAc,CAAA;AACnBQ,YAAAA,EAAAA,EAAIO,eAAQ,CAAA,aAAA,CAAA;YACZC,cAAgB,EAAA,CAAC,aAAa;AAChC,SAAA,CAAA;AACAC,QAAAA,QAAAA,EACEtB,WACA,IAAA,OAAOA,WAAgB,KAAA,SAAA,IACvBE,wBACEe,cAACM,CAAAA,uBAAAA,EAAAA;AACCC,YAAAA,KAAAA,EAAOnB,aAAc,CAAA;AACnBQ,gBAAAA,EAAAA,EAAIO,eAAQ,CAAA,8BAAA,CAAA;gBACZC,cAAgB,EAAA;AAClB,aAAA,CAAA;YACArB,WAAaA,EAAAA,WAAAA;AACbyB,YAAAA,eAAAA,EAAiBvB,MAAQW,EAAAA;;AAI/Ba,QAAAA,gBAAAA,EACExB,wBACEe,cAACU,CAAAA,iBAAAA,EAAAA;YACCC,GAAKC,EAAAA,sBAAAA;AACLC,YAAAA,SAAAA,gBAAWb,cAACc,CAAAA,eAAAA,EAAAA,EAAAA,CAAAA;AACZC,YAAAA,EAAAA,EAAI,CAAGzB,EAAAA,QAAAA,CAAS,CAAC,EAAE0B,aAAUtB,SAAW,EAAA;gBAAEuB,MAAQ,EAAA;aAAU,CAAA,CAAA,CAAA;sBAE3D7B,aAAc,CAAA;AACbQ,gBAAAA,EAAAA,EAAIO,eAAQ,CAAA,gCAAA,CAAA;gBACZC,cAAgB,EAAA;AAClB,aAAA;;AAINc,QAAAA,aAAAA,EACElC,2BACEmC,eAACC,CAAAA,iBAAAA,EAAAA;YAAKC,GAAK,EAAA,CAAA;;8BACTrB,cAACsB,CAAAA,mBAAAA,EAAAA;AAAOT,oBAAAA,SAAAA,gBAAWb,cAACuB,CAAAA,UAAAA,EAAAA,EAAAA,CAAAA;oBAASC,OAAQ,EAAA,WAAA;oBAAYC,OAASvC,EAAAA,wBAAAA;8BACvDE,aAAc,CAAA;AACbQ,wBAAAA,EAAAA,EAAIO,eAAQ,CAAA,2BAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;8BAGFJ,cAACsB,CAAAA,mBAAAA,EAAAA;AAAOT,oBAAAA,SAAAA,gBAAWb,cAACuB,CAAAA,UAAAA,EAAAA,EAAAA,CAAAA;oBAASE,OAAStC,EAAAA,yBAAAA;8BACnCC,aAAc,CAAA;AACbQ,wBAAAA,EAAAA,EAAIO,eAAQ,CAAA,2BAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;;;;AAOd;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Header.tsx"],"sourcesContent":["import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n"],"names":["Header","breadcrumbs","canCreate","folder","onToggleEditFolderDialog","onToggleUploadAssetDialog","formatMessage","useIntl","pathname","useLocation","query","useQueryParams","backQuery","parent","id","undefined","folderPath","path","_jsx","Layouts","title","getTrad","defaultMessage","subtitle","Breadcrumbs","label","currentFolderId","navigationAction","Link","tag","NavLink","startIcon","ArrowLeft","to","stringify","encode","primaryAction","_jsxs","Flex","gap","Button","Plus","variant","onClick"],"mappings":";;;;;;;;;;;;;;AA+BaA,MAAAA,MAAAA,GAAS,CAAC,EACrBC,cAAc,IAAI,EAClBC,SAAS,EACTC,SAAS,IAAI,EACbC,wBAAwB,EACxBC,yBAAyB,EACb,GAAA;IACZ,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,QAAQ,EAAE,GAAGC,WAAAA,EAAAA;AACrB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;AACpB,IAAA,MAAMC,SAAY,GAAA;AAChB,QAAA,GAAGF,KAAK;AACRP,QAAAA,MAAAA,EACEA,QAAQU,MAAU,IAAA,OAAOV,MAAOU,CAAAA,MAAM,KAAK,QAAYV,IAAAA,MAAAA,CAAOU,MAAM,CAACC,EAAE,GACnEX,MAAAA,CAAOU,MAAM,CAACC,EAAE,GAChBC,SAAAA;AACNC,QAAAA,UAAAA,EACEb,QAAQU,MAAU,IAAA,OAAOV,MAAOU,CAAAA,MAAM,KAAK,QAAYV,IAAAA,MAAAA,CAAOU,MAAM,CAACI,IAAI,GACrEd,MAAAA,CAAOU,MAAM,CAACI,IAAI,GAClBF;AACR,KAAA;IAEA,qBACEG,GAAA,CAACC,QAAQnB,MAAM,EAAA;AACboB,QAAAA,KAAAA,EAAOd,aAAc,CAAA;AACnBQ,YAAAA,EAAAA,EAAIO,OAAQ,CAAA,aAAA,CAAA;YACZC,cAAgB,EAAA,CAAC,aAAa;AAChC,SAAA,CAAA;AACAC,QAAAA,QAAAA,EACEtB,WACA,IAAA,OAAOA,WAAgB,KAAA,SAAA,IACvBE,wBACEe,GAACM,CAAAA,WAAAA,EAAAA;AACCC,YAAAA,KAAAA,EAAOnB,aAAc,CAAA;AACnBQ,gBAAAA,EAAAA,EAAIO,OAAQ,CAAA,8BAAA,CAAA;gBACZC,cAAgB,EAAA;AAClB,aAAA,CAAA;YACArB,WAAaA,EAAAA,WAAAA;AACbyB,YAAAA,eAAAA,EAAiBvB,MAAQW,EAAAA;;AAI/Ba,QAAAA,gBAAAA,EACExB,wBACEe,GAACU,CAAAA,IAAAA,EAAAA;YACCC,GAAKC,EAAAA,OAAAA;AACLC,YAAAA,SAAAA,gBAAWb,GAACc,CAAAA,SAAAA,EAAAA,EAAAA,CAAAA;AACZC,YAAAA,EAAAA,EAAI,CAAGzB,EAAAA,QAAAA,CAAS,CAAC,EAAE0B,UAAUtB,SAAW,EAAA;gBAAEuB,MAAQ,EAAA;aAAU,CAAA,CAAA,CAAA;sBAE3D7B,aAAc,CAAA;AACbQ,gBAAAA,EAAAA,EAAIO,OAAQ,CAAA,gCAAA,CAAA;gBACZC,cAAgB,EAAA;AAClB,aAAA;;AAINc,QAAAA,aAAAA,EACElC,2BACEmC,IAACC,CAAAA,IAAAA,EAAAA;YAAKC,GAAK,EAAA,CAAA;;8BACTrB,GAACsB,CAAAA,MAAAA,EAAAA;AAAOT,oBAAAA,SAAAA,gBAAWb,GAACuB,CAAAA,IAAAA,EAAAA,EAAAA,CAAAA;oBAASC,OAAQ,EAAA,WAAA;oBAAYC,OAASvC,EAAAA,wBAAAA;8BACvDE,aAAc,CAAA;AACbQ,wBAAAA,EAAAA,EAAIO,OAAQ,CAAA,2BAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;8BAGFJ,GAACsB,CAAAA,MAAAA,EAAAA;AAAOT,oBAAAA,SAAAA,gBAAWb,GAACuB,CAAAA,IAAAA,EAAAA,EAAAA,CAAAA;oBAASE,OAAStC,EAAAA,yBAAAA;8BACnCC,aAAc,CAAA;AACbQ,wBAAAA,EAAAA,EAAIO,OAAQ,CAAA,2BAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;;;;AAOd;;;;"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { File } from '../../../../../../shared/contracts/files';
|
|
2
|
-
import type { FolderDefinition, Folder as FolderInitial } from '../../../../../../shared/contracts/folders';
|
|
3
|
-
interface FolderWithType extends FolderInitial {
|
|
4
|
-
type: string;
|
|
5
|
-
}
|
|
6
|
-
export interface FileWithType extends File {
|
|
7
|
-
type: string;
|
|
8
|
-
}
|
|
9
|
-
export interface BulkActionsProps {
|
|
10
|
-
selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;
|
|
11
|
-
onSuccess: () => void;
|
|
12
|
-
currentFolder?: FolderWithType;
|
|
13
|
-
}
|
|
14
|
-
export declare const BulkActions: ({ selected, onSuccess, currentFolder }: BulkActionsProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
export {};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { FolderDefinition } from '../../../../../../shared/contracts/folders';
|
|
2
|
-
import type { FileWithType } from '../../../../hooks/useBulkRemove';
|
|
3
|
-
export interface BulkDeleteButtonProps {
|
|
4
|
-
selected: Array<FileWithType | FolderDefinition>;
|
|
5
|
-
onSuccess: () => void;
|
|
6
|
-
}
|
|
7
|
-
export declare const BulkDeleteButton: ({ selected, onSuccess }: BulkDeleteButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { File } from '../../../../../../shared/contracts/files';
|
|
2
|
-
import type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';
|
|
3
|
-
interface FolderWithType extends FolderDefinition {
|
|
4
|
-
type: string;
|
|
5
|
-
}
|
|
6
|
-
interface FileWithType extends File {
|
|
7
|
-
type: string;
|
|
8
|
-
}
|
|
9
|
-
export interface BulkMoveButtonProps {
|
|
10
|
-
onSuccess: () => void;
|
|
11
|
-
currentFolder?: FolderWithType;
|
|
12
|
-
selected?: Array<FolderWithType | FileWithType>;
|
|
13
|
-
}
|
|
14
|
-
export declare const BulkMoveButton: ({ selected, onSuccess, currentFolder, }: BulkMoveButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
export {};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export interface EmptyOrNoPermissionsProps {
|
|
2
|
-
canCreate: boolean;
|
|
3
|
-
canRead: boolean;
|
|
4
|
-
isFiltering: boolean;
|
|
5
|
-
onActionClick: () => void;
|
|
6
|
-
}
|
|
7
|
-
export declare const EmptyOrNoPermissions: ({ canCreate, isFiltering, canRead, onActionClick, }: EmptyOrNoPermissionsProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const Filters: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Folder } from '../../../../../../shared/contracts/folders';
|
|
2
|
-
import type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';
|
|
3
|
-
interface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {
|
|
4
|
-
children: {
|
|
5
|
-
count: number;
|
|
6
|
-
};
|
|
7
|
-
files: {
|
|
8
|
-
count: number;
|
|
9
|
-
};
|
|
10
|
-
parent?: FolderDefinition;
|
|
11
|
-
}
|
|
12
|
-
export interface HeaderProps {
|
|
13
|
-
breadcrumbs?: Array<CrumbDefinition> | null;
|
|
14
|
-
canCreate: boolean;
|
|
15
|
-
folder?: FolderDefinition | null;
|
|
16
|
-
onToggleEditFolderDialog: ({ created }?: {
|
|
17
|
-
created?: boolean;
|
|
18
|
-
}) => void;
|
|
19
|
-
onToggleUploadAssetDialog: () => void;
|
|
20
|
-
}
|
|
21
|
-
export declare const Header: ({ breadcrumbs, canCreate, folder, onToggleEditFolderDialog, onToggleUploadAssetDialog, }: HeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
export {};
|
|
File without changes
|