@firecms/media_manager 3.1.0 → 3.2.0-canary.4c3b8f2
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/index.es.js +682 -221
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +682 -221
- package/dist/index.umd.js.map +1 -1
- package/dist/locales/de.d.ts +45 -0
- package/dist/locales/en.d.ts +45 -0
- package/dist/locales/es.d.ts +45 -0
- package/dist/locales/fr.d.ts +45 -0
- package/dist/locales/hi.d.ts +45 -0
- package/dist/locales/it.d.ts +45 -0
- package/dist/locales/pt.d.ts +45 -0
- package/package.json +5 -5
- package/src/components/MediaAssetDetails.tsx +25 -25
- package/src/components/MediaLibraryCard.tsx +5 -2
- package/src/components/MediaLibraryView.tsx +13 -11
- package/src/components/MediaUploadDialog.tsx +13 -11
- package/src/locales/de.ts +45 -0
- package/src/locales/en.ts +45 -0
- package/src/locales/es.ts +45 -0
- package/src/locales/fr.ts +45 -0
- package/src/locales/hi.ts +45 -0
- package/src/locales/it.ts +45 -0
- package/src/locales/pt.ts +45 -0
- package/src/useMediaManagerPlugin.tsx +22 -5
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/MediaManagerProvider.tsx","../src/useMediaManagerController.tsx","../src/components/MediaAssetCard.tsx","../src/components/MediaAssetDetails.tsx","../src/components/MediaUploadDialog.tsx","../src/components/MediaLibraryView.tsx","../src/useMediaManagerPlugin.tsx","../src/components/MediaLibraryCard.tsx"],"sourcesContent":["import React, { createContext, PropsWithChildren, useContext } from \"react\";\nimport { MediaManagerController } from \"./types\";\n\nconst MediaManagerContext = createContext<MediaManagerController | undefined>(undefined);\n\n/**\n * Hook to access the MediaManagerController from context.\n * Must be used within a MediaManagerProvider.\n */\nexport function useMediaManager(): MediaManagerController {\n const context = useContext(MediaManagerContext);\n if (!context) {\n throw new Error(\"useMediaManager must be used within a MediaManagerProvider\");\n }\n return context;\n}\n\nexport interface MediaManagerProviderProps {\n controller: MediaManagerController;\n}\n\n/**\n * Provider component that makes the MediaManagerController available to all children.\n */\nexport function MediaManagerProvider({\n controller,\n children\n}: PropsWithChildren<MediaManagerProviderProps>) {\n return (\n <MediaManagerContext.Provider value={controller}>\n {children}\n </MediaManagerContext.Provider>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { DataSourceDelegate, StorageSource } from \"@firecms/core\";\nimport { MediaAsset, MediaManagerController, ThumbnailSize } from \"./types\";\nimport Compressor from \"compressorjs\";\n\nexport interface UseMediaManagerControllerProps {\n storageSource: StorageSource;\n dataSourceDelegate: DataSourceDelegate;\n storagePath: string;\n collectionPath: string;\n bucket?: string;\n /** Thumbnail sizes to generate on upload */\n thumbnailSizes?: ThumbnailSize[];\n /** Path prefix for thumbnails. Default: \"thumbs\" */\n thumbnailPath?: string;\n}\n\nconst DEFAULT_THUMBNAIL_PATH = \"thumbs\";\n\n/**\n * Hook that creates a MediaManagerController for managing media assets.\n * Handles all CRUD operations for files and their metadata.\n */\nexport function useMediaManagerController({\n storageSource,\n dataSourceDelegate,\n storagePath,\n collectionPath,\n bucket,\n thumbnailSizes,\n thumbnailPath = DEFAULT_THUMBNAIL_PATH\n}: UseMediaManagerControllerProps): MediaManagerController {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const [assets, setAssets] = useState<MediaAsset[]>([]);\n const [selectedAsset, setSelectedAsset] = useState<MediaAsset | undefined>();\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Helper to fetch download URL for an asset\n const fetchDownloadURL = useCallback(async (asset: Omit<MediaAsset, \"downloadURL\">): Promise<MediaAsset> => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n return {\n ...asset,\n downloadURL: downloadConfig.url ?? undefined\n };\n } catch (err) {\n console.warn(`Failed to get download URL for ${asset.storagePath}:`, err);\n return { ...asset, downloadURL: undefined };\n }\n }, [storageSource]);\n\n // Fetch assets from the database\n const refreshAssets = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n try {\n console.log(\"Fetching media assets from:\", collectionPath);\n const entities = await dataSourceDelegate.fetchCollection<Record<string, any>>({\n path: collectionPath,\n orderBy: \"createdAt\",\n order: \"desc\"\n });\n\n console.log(\"Fetched entities:\", entities.length);\n\n if (entities.length === 0) {\n setAssets([]);\n return;\n }\n\n // Convert entities to assets and fetch download URLs\n const loadedAssets: MediaAsset[] = await Promise.all(\n entities.map(async (entity) => {\n const values = entity.values;\n const baseAsset: Omit<MediaAsset, \"downloadURL\"> = {\n id: entity.id,\n fileName: values.fileName,\n storagePath: values.storagePath,\n mimeType: values.mimeType,\n size: values.size,\n dimensions: values.dimensions,\n title: values.title,\n altText: values.altText,\n caption: values.caption,\n tags: values.tags,\n bucket: values.bucket,\n createdAt: values.createdAt instanceof Date\n ? values.createdAt\n : (values.createdAt?.toDate ? values.createdAt.toDate() : new Date(values.createdAt)),\n updatedAt: values.updatedAt instanceof Date\n ? values.updatedAt\n : (values.updatedAt?.toDate ? values.updatedAt.toDate() : new Date(values.updatedAt))\n };\n\n // Fetch download URL for images\n if (baseAsset.mimeType?.startsWith(\"image/\") || baseAsset.mimeType?.startsWith(\"video/\")) {\n return await fetchDownloadURL(baseAsset);\n }\n return { ...baseAsset, downloadURL: undefined };\n })\n );\n\n console.log(\"Loaded assets with URLs:\", loadedAssets.length);\n setAssets(loadedAssets);\n } catch (err) {\n console.error(\"Error fetching media assets:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [dataSourceDelegate, collectionPath, fetchDownloadURL]);\n\n // Initial load\n useEffect(() => {\n refreshAssets();\n }, [refreshAssets]);\n\n // Upload a new file\n const uploadFile = useCallback(async (\n file: File,\n metadata?: Partial<Pick<MediaAsset, \"title\" | \"altText\" | \"caption\" | \"tags\">>\n ): Promise<MediaAsset> => {\n console.log(\"Uploading file:\", file.name, \"to path:\", storagePath);\n\n // Upload to storage\n const uploadResult = await storageSource.uploadFile({\n file,\n fileName: file.name,\n path: storagePath,\n bucket\n });\n\n console.log(\"Upload result:\", uploadResult);\n\n // Get download URL immediately after upload\n let downloadURL: string | undefined;\n try {\n const downloadConfig = await storageSource.getDownloadURL(uploadResult.path, uploadResult.bucket);\n downloadURL = downloadConfig.url ?? undefined;\n console.log(\"Got download URL:\", downloadURL);\n } catch (err) {\n console.warn(\"Failed to get download URL after upload:\", err);\n }\n\n // Get dimensions for images\n let dimensions: { width: number; height: number } | undefined;\n if (file.type.startsWith(\"image/\")) {\n try {\n dimensions = await getImageDimensions(file);\n } catch (err) {\n console.warn(\"Failed to get image dimensions:\", err);\n }\n }\n\n // Generate thumbnails if configured and file is a raster image (skip SVGs)\n const thumbnails: Record<string, string> = {};\n const isRasterImage = file.type.startsWith(\"image/\") && file.type !== \"image/svg+xml\";\n if (thumbnailSizes && thumbnailSizes.length > 0 && isRasterImage) {\n console.log(\"Generating thumbnails for sizes:\", thumbnailSizes.map(s => s.name));\n\n for (const size of thumbnailSizes) {\n try {\n const thumbnailBlob = await generateThumbnail(file, size.width, size.height, size.quality ?? 0.8);\n const thumbFileName = `${Date.now()}_${size.name}_${file.name}`;\n const thumbPath = `${storagePath}/${thumbnailPath}/${size.name}`;\n\n // Upload thumbnail\n const thumbUploadResult = await storageSource.uploadFile({\n file: new File([thumbnailBlob], thumbFileName, { type: \"image/jpeg\" }),\n fileName: thumbFileName,\n path: thumbPath,\n bucket\n });\n\n // Get download URL for thumbnail\n const thumbDownloadConfig = await storageSource.getDownloadURL(thumbUploadResult.path, thumbUploadResult.bucket);\n if (thumbDownloadConfig.url) {\n thumbnails[size.name] = thumbDownloadConfig.url;\n console.log(`Generated ${size.name} thumbnail:`, thumbDownloadConfig.url);\n }\n } catch (err) {\n console.warn(`Failed to generate ${size.name} thumbnail:`, err);\n }\n }\n }\n\n const now = new Date();\n\n // Build asset data, only including defined values (Firestore doesn't allow undefined)\n const assetData: Record<string, any> = {\n fileName: file.name,\n storagePath: uploadResult.path,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now\n };\n\n // Only add optional fields if they are defined\n if (dimensions) assetData.dimensions = dimensions;\n if (metadata?.title) assetData.title = metadata.title;\n if (metadata?.altText) assetData.altText = metadata.altText;\n if (metadata?.caption) assetData.caption = metadata.caption;\n if (metadata?.tags && metadata.tags.length > 0) assetData.tags = metadata.tags;\n if (uploadResult.bucket) assetData.bucket = uploadResult.bucket;\n // Store downloadURL in database for quick access later\n if (downloadURL) assetData.downloadURL = downloadURL;\n // Store thumbnails if any were generated\n if (Object.keys(thumbnails).length > 0) assetData.thumbnails = thumbnails;\n\n console.log(\"Saving asset data to database:\", assetData);\n\n // Save metadata to database\n const entity = await dataSourceDelegate.saveEntity<Record<string, any>>({\n path: collectionPath,\n values: assetData,\n status: \"new\"\n });\n\n console.log(\"Saved entity:\", entity.id);\n\n const newAsset: MediaAsset = {\n id: entity.id,\n fileName: file.name,\n storagePath: uploadResult.path,\n downloadURL,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now,\n dimensions,\n title: metadata?.title,\n altText: metadata?.altText,\n caption: metadata?.caption,\n tags: metadata?.tags,\n bucket: uploadResult.bucket,\n thumbnails: Object.keys(thumbnails).length > 0 ? thumbnails : undefined\n };\n\n setAssets(prev => [newAsset, ...prev]);\n return newAsset;\n }, [storageSource, dataSourceDelegate, storagePath, collectionPath, bucket, thumbnailSizes, thumbnailPath]);\n\n // Delete an asset\n const deleteAsset = useCallback(async (assetId: string): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n console.log(\"Deleting asset:\", assetId, asset.storagePath);\n\n // Delete from storage\n try {\n await storageSource.deleteFile(asset.storagePath, asset.bucket);\n } catch (err) {\n console.warn(\"Failed to delete from storage (may not exist):\", err);\n }\n\n // Delete from database\n await dataSourceDelegate.deleteEntity({\n entity: {\n id: assetId,\n path: collectionPath,\n values: asset\n }\n });\n\n setAssets(prev => prev.filter(a => a.id !== assetId));\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(undefined);\n }\n }, [assets, storageSource, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Update asset metadata\n const updateAsset = useCallback(async (\n assetId: string,\n data: Partial<MediaAsset>\n ): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n // Filter out undefined values\n const cleanData: Record<string, any> = {};\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined) {\n cleanData[key] = value;\n }\n });\n cleanData.updatedAt = new Date();\n\n console.log(\"Updating asset:\", assetId, cleanData);\n\n await dataSourceDelegate.saveEntity({\n path: collectionPath,\n entityId: assetId,\n values: cleanData,\n previousValues: asset,\n status: \"existing\"\n });\n\n setAssets(prev => prev.map(a =>\n a.id === assetId ? { ...a, ...cleanData } : a\n ));\n\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(prev => prev ? { ...prev, ...cleanData } : prev);\n }\n }, [assets, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Search assets (client-side filtering for now)\n const searchAssets = useCallback((query: string) => {\n setSearchQuery(query);\n }, []);\n\n const selectAsset = useCallback((asset: MediaAsset | undefined) => {\n setSelectedAsset(asset);\n }, []);\n\n // Filter assets based on search query\n const filteredAssets = searchQuery\n ? assets.filter(asset =>\n asset.fileName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.title?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.tags?.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase()))\n )\n : assets;\n\n return {\n loading,\n error,\n assets: filteredAssets,\n totalCount: assets.length,\n selectedAsset,\n selectAsset,\n uploadFile,\n deleteAsset,\n updateAsset,\n refreshAssets,\n searchAssets,\n storagePath,\n collectionPath\n };\n}\n\n/**\n * Helper to get image dimensions from a File\n */\nfunction getImageDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = reject;\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Generate a thumbnail from an image file using compressorjs.\n * Uses the same library as the core FireCMS image resize implementation.\n * Maintains aspect ratio while fitting within maxWidth x maxHeight.\n */\nasync function generateThumbnail(\n file: File,\n maxWidth: number,\n maxHeight: number,\n quality: number\n): Promise<Blob> {\n return new Promise<Blob>((resolve, reject) => {\n new Compressor(file, {\n quality,\n maxWidth,\n maxHeight,\n mimeType: \"image/jpeg\",\n success: (result) => {\n resolve(result);\n },\n error: reject,\n });\n });\n}\n","import React from \"react\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon,\n DescriptionIcon,\n VideoLibraryIcon,\n AudiotrackIcon,\n CheckIcon,\n defaultBorderMixin\n} from \"@firecms/ui\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetCardProps {\n asset: MediaAsset;\n viewMode: \"grid\" | \"list\";\n onClick: () => void;\n selected?: boolean;\n /** Preferred thumbnail size to display (e.g., \"small\", \"medium\") */\n thumbnailSize?: string;\n}\n\n/**\n * Card component for displaying a media asset in the grid or list.\n */\nexport function MediaAssetCard({\n asset,\n viewMode,\n onClick,\n selected,\n thumbnailSize = \"small\"\n}: MediaAssetCardProps) {\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n const isAudio = asset.mimeType.startsWith(\"audio/\");\n\n const FileIcon = isImage ? ImageIcon\n : isVideo ? VideoLibraryIcon\n : isAudio ? AudiotrackIcon\n : DescriptionIcon;\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n // Use thumbnail if available, fallback to downloadURL\n const imageUrl = asset.thumbnails?.[thumbnailSize] ?? asset.downloadURL;\n\n const thumbnail = isImage && imageUrl ? (\n <img\n src={imageUrl}\n alt={asset.altText || asset.fileName}\n className=\"w-full h-full object-cover transition-transform duration-200 group-hover:scale-105\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-surface-100 dark:bg-surface-800\">\n <FileIcon size=\"large\" className=\"text-surface-400 dark:text-surface-500\" />\n </div>\n );\n\n if (viewMode === \"list\") {\n return (\n <div\n className={cls(\n \"p-3 cursor-pointer flex items-center gap-3 rounded-lg\",\n \"hover:bg-surface-100 dark:hover:bg-surface-800\",\n \"transition-colors duration-150\",\n `border ${defaultBorderMixin}`,\n selected && \"ring-2 ring-primary bg-primary/5\"\n )}\n onClick={onClick}\n >\n <div className=\"w-12 h-12 rounded-md overflow-hidden flex-shrink-0 bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n {selected && (\n <div className=\"w-6 h-6 rounded-full bg-primary flex items-center justify-center flex-shrink-0\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n );\n }\n\n return (\n <Card\n className={cls(\n \"cursor-pointer overflow-hidden group relative\",\n \"transition-all duration-200\",\n \"hover:shadow-lg hover:-translate-y-0.5\",\n selected && \"ring-2 ring-primary\"\n )}\n onClick={onClick}\n >\n <div className=\"aspect-square relative overflow-hidden bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n\n {/* Hover overlay */}\n <div className={cls(\n \"absolute inset-0 bg-black/0 group-hover:bg-black/20\",\n \"transition-colors duration-200\"\n )} />\n\n {/* Selection indicator */}\n {selected && (\n <div className=\"absolute top-2 right-2 w-6 h-6 rounded-full bg-primary flex items-center justify-center shadow-md\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n\n <div className=\"p-3\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate block mt-0.5\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n </Card>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useCreateFormex } from \"@firecms/formex\";\nimport {\n Button,\n Typography,\n cls,\n CloseIcon,\n DeleteIcon,\n DownloadIcon,\n IconButton,\n TextField,\n Chip,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent\n} from \"@firecms/ui\";\nimport { useSnackbarController, useStorageSource } from \"@firecms/core\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetDetailsProps {\n asset: MediaAsset;\n onClose: () => void;\n onUpdate: (assetId: string, data: Partial<MediaAsset>) => Promise<void>;\n onDelete: (assetId: string) => Promise<void>;\n}\n\n/**\n * Side panel component for viewing and editing media asset details.\n */\nexport function MediaAssetDetails({\n asset,\n onClose,\n onUpdate,\n onDelete\n}: MediaAssetDetailsProps) {\n const snackbarController = useSnackbarController();\n const storageSource = useStorageSource();\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [tagInput, setTagInput] = useState(\"\");\n\n const { values, setFieldValue, dirty } = useCreateFormex<Partial<MediaAsset>>({\n initialValues: {\n title: asset.title ?? \"\",\n altText: asset.altText ?? \"\",\n caption: asset.caption ?? \"\",\n tags: asset.tags ?? []\n }\n });\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n try {\n await onUpdate(asset.id, values);\n snackbarController.open({\n type: \"success\",\n message: \"Asset updated successfully\"\n });\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: `Error updating asset: ${error instanceof Error ? error.message : String(error)}`\n });\n } finally {\n setSaving(false);\n }\n }, [asset.id, values, onUpdate, snackbarController]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n try {\n await onDelete(asset.id);\n snackbarController.open({\n type: \"success\",\n message: \"Asset deleted successfully\"\n });\n onClose();\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: `Error deleting asset: ${error instanceof Error ? error.message : String(error)}`\n });\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n }\n }, [asset.id, onDelete, snackbarController, onClose]);\n\n const handleDownload = useCallback(async () => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n if (downloadConfig.url) {\n window.open(downloadConfig.url, \"_blank\");\n }\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: \"Error getting download URL\"\n });\n }\n }, [asset, storageSource, snackbarController]);\n\n const handleAddTag = useCallback(() => {\n const tag = tagInput.trim();\n if (tag && !values.tags?.includes(tag)) {\n setFieldValue(\"tags\", [...(values.tags ?? []), tag]);\n setTagInput(\"\");\n }\n }, [tagInput, values.tags, setFieldValue]);\n\n const handleRemoveTag = useCallback((tagToRemove: string) => {\n setFieldValue(\"tags\", values.tags?.filter((t: string) => t !== tagToRemove) ?? []);\n }, [values.tags, setFieldValue]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n const formatDate = (date: Date): string => {\n return new Intl.DateTimeFormat(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\"\n }).format(date);\n };\n\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n\n return (\n <>\n <div className={cls(\n \"fixed inset-y-0 right-0 w-full sm:w-96 lg:w-[480px]\",\n \"bg-surface-50 dark:bg-surface-900\",\n \"border-l border-surface-accent-200 dark:border-surface-accent-700\",\n \"shadow-xl z-50\",\n \"flex flex-col\",\n \"animate-slide-in-right\"\n )}>\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"subtitle1\" className=\"font-medium truncate flex-1 mr-2\">\n {asset.title || asset.fileName}\n </Typography>\n <div className=\"flex items-center gap-1\">\n <IconButton onClick={handleDownload}>\n <DownloadIcon size=\"small\" />\n </IconButton>\n <IconButton\n onClick={() => setDeleteDialogOpen(true)}\n className=\"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <DeleteIcon size=\"small\" />\n </IconButton>\n <IconButton onClick={onClose}>\n <CloseIcon size=\"small\" />\n </IconButton>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"p-4 bg-surface-accent-100 dark:bg-surface-accent-800 flex items-center justify-center min-h-48 max-h-64\">\n {isImage && asset.downloadURL ? (\n <img\n src={asset.downloadURL}\n alt={asset.altText || asset.fileName}\n className=\"max-w-full max-h-full object-contain\"\n />\n ) : isVideo && asset.downloadURL ? (\n <video\n src={asset.downloadURL}\n className=\"max-w-full max-h-full\"\n controls\n />\n ) : (\n <div className=\"text-surface-accent-400\">\n Preview not available\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4 space-y-4\">\n {/* Metadata */}\n <div className=\"grid grid-cols-2 gap-3\">\n {asset.dimensions && (\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Dimensions\n </Typography>\n <Typography variant=\"body2\">\n {asset.dimensions.width} × {asset.dimensions.height} px\n </Typography>\n </div>\n )}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Size\n </Typography>\n <Typography variant=\"body2\">\n {formatSize(asset.size)}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Type\n </Typography>\n <Typography variant=\"body2\">\n {asset.mimeType}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Created\n </Typography>\n <Typography variant=\"body2\">\n {formatDate(asset.createdAt)}\n </Typography>\n </div>\n </div>\n\n <hr className=\"border-surface-accent-200 dark:border-surface-accent-700\" />\n\n {/* Editable Fields */}\n <TextField\n label=\"File Name\"\n value={asset.fileName}\n disabled\n size=\"small\"\n />\n\n <TextField\n label=\"Title\"\n value={values.title ?? \"\"}\n onChange={(e) => setFieldValue(\"title\", e.target.value)}\n size=\"small\"\n />\n\n <div>\n <TextField\n label=\"Alt Text\"\n value={values.altText ?? \"\"}\n onChange={(e) => setFieldValue(\"altText\", e.target.value)}\n size=\"small\"\n />\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mt-1\">\n Recommended for SEO\n </Typography>\n </div>\n\n <TextField\n label=\"Caption\"\n value={values.caption ?? \"\"}\n onChange={(e) => setFieldValue(\"caption\", e.target.value)}\n size=\"small\"\n multiline\n />\n\n {/* Tags */}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mb-1 block\">\n Tags\n </Typography>\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {values.tags?.map((tag: string) => (\n <Chip\n key={tag}\n size=\"small\"\n colorScheme=\"blueLighter\"\n onClick={() => handleRemoveTag(tag)}\n >\n {tag} ×\n </Chip>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <TextField\n placeholder=\"Add a tag...\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n size=\"small\"\n className=\"flex-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAddTag();\n }\n }}\n />\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleAddTag}\n disabled={!tagInput.trim()}\n >\n Add\n </Button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 p-4 border-t border-surface-accent-200 dark:border-surface-accent-700\">\n <Button\n variant=\"filled\"\n onClick={handleSave}\n disabled={!dirty || saving}\n className=\"w-full\"\n >\n {saving ? <CircularProgress size=\"small\" /> : \"Save Changes\"}\n </Button>\n </div>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <Dialog\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n >\n <DialogContent>\n <Typography variant=\"subtitle1\" className=\"font-medium mb-2\">\n Delete Asset?\n </Typography>\n <Typography className=\"text-surface-accent-600 dark:text-surface-accent-400\">\n Are you sure you want to delete \"{asset.title || asset.fileName}\"?\n This action cannot be undone.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={() => setDeleteDialogOpen(false)}\n disabled={deleting}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n color=\"error\"\n onClick={handleDelete}\n disabled={deleting}\n >\n {deleting ? <CircularProgress size=\"small\" /> : \"Delete\"}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport {\n Button,\n Typography,\n cls,\n Dialog,\n DialogActions,\n DialogContent,\n CloudUploadIcon,\n CircularProgress\n} from \"@firecms/ui\";\n\nexport interface MediaUploadDialogProps {\n open: boolean;\n onClose: () => void;\n onUpload: (files: File[]) => Promise<void>;\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Dialog component for uploading files to the media library.\n * Supports drag-and-drop and file browser selection.\n */\nexport function MediaUploadDialog({\n open,\n onClose,\n onUpload,\n maxFileSize = 52428800, // 50MB default\n acceptedMimeTypes\n}: MediaUploadDialogProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const validateFiles = useCallback((files: File[]): { valid: File[]; errors: string[] } => {\n const valid: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n if (maxFileSize && file.size > maxFileSize) {\n errors.push(`${file.name}: File too large (max ${formatSize(maxFileSize)})`);\n continue;\n }\n if (acceptedMimeTypes && !acceptedMimeTypes.some(type => {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type === type;\n })) {\n errors.push(`${file.name}: File type not allowed`);\n continue;\n }\n valid.push(file);\n }\n\n return { valid, errors };\n }, [maxFileSize, acceptedMimeTypes]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const files = Array.from(e.dataTransfer.files);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleFileSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleRemoveFile = useCallback((index: number) => {\n setSelectedFiles(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return;\n\n setUploading(true);\n setError(null);\n\n try {\n await onUpload(selectedFiles);\n setSelectedFiles([]);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Upload failed\");\n } finally {\n setUploading(false);\n }\n }, [selectedFiles, onUpload, onClose]);\n\n const handleClose = useCallback(() => {\n if (!uploading) {\n setSelectedFiles([]);\n setError(null);\n onClose();\n }\n }, [uploading, onClose]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open && handleClose()}\n maxWidth=\"md\"\n >\n <DialogContent className=\"p-0\">\n <div className=\"p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"h6\">\n Upload Files\n </Typography>\n </div>\n\n <div className=\"p-4\">\n {/* Drop Zone */}\n <div\n className={cls(\n \"border-2 border-dashed rounded-lg p-8\",\n \"flex flex-col items-center justify-center gap-4\",\n \"transition-colors duration-150\",\n isDragging\n ? \"border-primary bg-primary/5\"\n : \"border-surface-accent-300 dark:border-surface-accent-600\",\n \"hover:border-primary hover:bg-primary/5\",\n \"cursor-pointer\"\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => document.getElementById(\"file-upload-input\")?.click()}\n >\n <CloudUploadIcon\n size=\"large\"\n className={cls(\n isDragging ? \"text-primary\" : \"text-surface-accent-400\"\n )}\n />\n <div className=\"text-center\">\n <Typography variant=\"body1\" className=\"font-medium\">\n Drop files here or click to browse\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Maximum file size: {formatSize(maxFileSize)}\n </Typography>\n </div>\n <input\n id=\"file-upload-input\"\n type=\"file\"\n multiple\n accept={acceptedMimeTypes?.join(\",\")}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n </div>\n\n {/* Error Display */}\n {error && (\n <Typography variant=\"caption\" className=\"text-red-500 mt-2 block whitespace-pre-line\">\n {error}\n </Typography>\n )}\n\n {/* Selected Files */}\n {selectedFiles.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Selected files ({selectedFiles.length})\n </Typography>\n <div className=\"max-h-40 overflow-auto space-y-1\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className={cls(\n \"flex items-center justify-between p-2 rounded\",\n \"bg-surface-accent-50 dark:bg-surface-accent-800\"\n )}\n >\n <div className=\"flex-1 min-w-0 mr-2\">\n <Typography variant=\"body2\" className=\"truncate\">\n {file.name}\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {formatSize(file.size)}\n </Typography>\n </div>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n disabled={uploading}\n >\n Remove\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={handleClose}\n disabled={uploading}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? (\n <>\n <CircularProgress size=\"smallest\" />\n Uploading...\n </>\n ) : (\n `Upload ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : \"\"}`\n )}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useCallback, useRef, useState } from \"react\";\nimport {\n Button,\n Container,\n SearchBar,\n Typography,\n cls,\n AddIcon,\n CircularProgress,\n RefreshIcon,\n IconButton,\n Tooltip,\n AppsIcon,\n Icon\n} from \"@firecms/ui\";\nimport { useMediaManager } from \"../MediaManagerProvider\";\nimport { MediaAssetCard } from \"./MediaAssetCard\";\nimport { MediaAssetDetails } from \"./MediaAssetDetails\";\nimport { MediaUploadDialog } from \"./MediaUploadDialog\";\n\nexport interface MediaLibraryViewProps {\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Main view component for the Media Library.\n * Displays a grid of assets with search, upload, and management capabilities.\n */\nexport function MediaLibraryView({\n maxFileSize,\n acceptedMimeTypes\n }: MediaLibraryViewProps) {\n const controller = useMediaManager();\n const [uploadDialogOpen, setUploadDialogOpen] = useState(false);\n const [viewMode, setViewMode] = useState<\"grid\" | \"list\">(\"grid\");\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleSearch = useCallback((query?: string) => {\n controller.searchAssets(query ?? \"\");\n }, [controller]);\n\n const handleUploadClick = useCallback(() => {\n setUploadDialogOpen(true);\n }, []);\n\n const handleFileSelect = useCallback(async (files: File[]) => {\n for (const file of files) {\n await controller.uploadFile(file);\n }\n setUploadDialogOpen(false);\n }, [controller]);\n\n const handleRefresh = useCallback(() => {\n controller.refreshAssets();\n }, [controller]);\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div\n className=\"flex-shrink-0 border-b border-surface-accent-200 dark:border-surface-accent-700 bg-surface-50 dark:bg-surface-900\">\n <Container maxWidth=\"6xl\" className=\"py-4\">\n <div className=\"flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Typography variant=\"h5\" className=\"font-semibold\">\n Media Library\n </Typography>\n {controller.totalCount !== undefined && (\n <Typography\n variant=\"caption\"\n className=\"bg-surface-accent-100 dark:bg-surface-accent-800 px-2 py-0.5 rounded-full\"\n >\n {controller.totalCount} assets\n </Typography>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 w-full sm:w-auto\">\n <SearchBar\n onTextSearch={handleSearch}\n placeholder=\"Search assets...\"\n className=\"flex-1 sm:w-64\"\n />\n\n <div\n className=\"flex items-center gap-1 border-l border-surface-accent-200 dark:border-surface-accent-700 pl-2 ml-2\">\n <Tooltip title=\"Grid view\">\n <IconButton\n onClick={() => setViewMode(\"grid\")}\n className={cls(\n viewMode === \"grid\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <AppsIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"List view\">\n <IconButton\n onClick={() => setViewMode(\"list\")}\n className={cls(\n viewMode === \"list\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <Icon iconKey=\"list\" size=\"small\"/>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title=\"Refresh\">\n <IconButton onClick={handleRefresh} disabled={controller.loading}>\n <RefreshIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n\n <Button\n variant=\"filled\"\n onClick={handleUploadClick}\n >\n <AddIcon size=\"small\"/>\n Upload\n </Button>\n </div>\n </div>\n </Container>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n <Container maxWidth=\"6xl\" className=\"py-6\">\n {controller.loading && controller.assets.length === 0 ? (\n <div className=\"flex items-center justify-center h-64\">\n <CircularProgress/>\n </div>\n ) : controller.error ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-red-500\">\n Error loading assets: {controller.error.message}\n </Typography>\n <Button onClick={handleRefresh}>\n Try Again\n </Button>\n </div>\n ) : controller.assets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-surface-accent-500\">\n No media assets yet\n </Typography>\n <Button onClick={handleUploadClick}>\n <AddIcon size=\"small\"/>\n Upload your first file\n </Button>\n </div>\n ) : (\n <div className={cls(\n viewMode === \"grid\"\n ? \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\"\n : \"flex flex-col gap-2\"\n )}>\n {controller.assets.map(asset => (\n <MediaAssetCard\n key={asset.id}\n asset={asset}\n viewMode={viewMode}\n onClick={() => controller.selectAsset(asset)}\n selected={controller.selectedAsset?.id === asset.id}\n />\n ))}\n </div>\n )}\n </Container>\n </div>\n\n {/* Details Panel */}\n {controller.selectedAsset && (\n <MediaAssetDetails\n asset={controller.selectedAsset}\n onClose={() => controller.selectAsset(undefined)}\n onUpdate={controller.updateAsset}\n onDelete={controller.deleteAsset}\n />\n )}\n\n {/* Upload Dialog */}\n <MediaUploadDialog\n open={uploadDialogOpen}\n onClose={() => setUploadDialogOpen(false)}\n onUpload={handleFileSelect}\n maxFileSize={maxFileSize}\n acceptedMimeTypes={acceptedMimeTypes}\n />\n </div>\n );\n}\n","import React, { useMemo, createContext, useContext, PropsWithChildren } from \"react\";\nimport { FireCMSPlugin, CMSView } from \"@firecms/core\";\nimport { MediaManagerConfig } from \"./types\";\nimport { MediaManagerProvider } from \"./MediaManagerProvider\";\nimport { useMediaManagerController } from \"./useMediaManagerController\";\nimport { MediaLibraryCard } from \"./components/MediaLibraryCard\";\nimport { MediaLibraryView } from \"./components/MediaLibraryView\";\n\nconst DEFAULT_STORAGE_PATH = \"media\";\nconst DEFAULT_COLLECTION_PATH = \"media_assets\";\n\nexport interface MediaManagerPluginProps extends MediaManagerConfig { }\n\n// Context to store the config\nconst MediaManagerConfigContext = createContext<MediaManagerConfig | null>(null);\n\nfunction useMediaManagerConfig(): MediaManagerConfig {\n const config = useContext(MediaManagerConfigContext);\n if (!config) {\n throw new Error(\"useMediaManagerConfig must be used within MediaManagerConfigProvider\");\n }\n return config;\n}\n\n/**\n * Internal wrapper that reads config from context\n */\nfunction MediaLibraryViewInternal() {\n const config = useMediaManagerConfig();\n const controller = useMediaManagerController({\n storageSource: config.storageSource,\n dataSourceDelegate: config.dataSourceDelegate,\n storagePath: config.storagePath ?? DEFAULT_STORAGE_PATH,\n collectionPath: config.collectionPath ?? DEFAULT_COLLECTION_PATH,\n bucket: config.bucket,\n thumbnailSizes: config.thumbnailSizes,\n thumbnailPath: config.thumbnailPath\n });\n\n return (\n <MediaManagerProvider controller={controller}>\n <MediaLibraryView\n maxFileSize={config.maxFileSize}\n acceptedMimeTypes={config.acceptedMimeTypes}\n />\n </MediaManagerProvider>\n );\n}\n\n/**\n * Build the media view - this is a static object that doesn't change\n */\nfunction buildMediaView(): CMSView {\n return {\n path: \"media\",\n name: \"Media Library\",\n description: \"Manage your media files and assets\",\n group: \"Media\",\n icon: \"perm_media\",\n view: <MediaLibraryViewInternal />\n };\n}\n\n// Single static instance of the view\nconst MEDIA_VIEW = buildMediaView();\n\n/**\n * Hook to create the Media Manager plugin for FireCMS.\n *\n * The plugin automatically registers the Media Library view in the navigation.\n *\n * @example\n * ```tsx\n * const { plugin: mediaManagerPlugin } = useMediaManagerPlugin({\n * storageSource,\n * dataSourceDelegate: firestoreDelegate,\n * storagePath: \"media\",\n * collectionPath: \"media_assets\"\n * });\n *\n * // Add plugin to your plugins array - view is auto-registered\n * const plugins = [mediaManagerPlugin, ...otherPlugins];\n * ```\n */\nexport function useMediaManagerPlugin(props: MediaManagerPluginProps): FireCMSPlugin {\n return useMemo(() => ({\n key: \"media_manager\",\n views: [MEDIA_VIEW],\n provider: {\n Component: ({ children }: PropsWithChildren) => (\n <MediaManagerConfigContext.Provider value={props}>\n {children}\n </MediaManagerConfigContext.Provider>\n )\n }\n } satisfies FireCMSPlugin), []);\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon\n} from \"@firecms/ui\";\n\nexport interface MediaLibraryCardProps {\n group?: string;\n context?: unknown;\n}\n\n/**\n * Card component displayed on the home page that links to the Media Library.\n */\nexport function MediaLibraryCard({ group }: MediaLibraryCardProps) {\n // Only render in the \"Media\" group\n if (group !== \"Media\") return null;\n\n return (\n <Link to=\"/media\" className=\"no-underline\">\n <Card\n className={cls(\n \"p-4 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-accent-800\",\n \"transition-colors duration-200\",\n \"flex flex-col gap-2\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className={cls(\n \"w-10 h-10 rounded-lg\",\n \"bg-primary/10 dark:bg-primary/20\",\n \"flex items-center justify-center\"\n )}>\n <ImageIcon className=\"text-primary\" size=\"medium\" />\n </div>\n <div className=\"flex-1\">\n <Typography variant=\"subtitle2\" className=\"font-medium\">\n Media Library\n </Typography>\n <Typography\n variant=\"caption\"\n className=\"text-surface-accent-600 dark:text-surface-accent-400\"\n >\n Manage images and files\n </Typography>\n </div>\n </div>\n </Card>\n </Link>\n );\n}\n"],"names":["MediaManagerContext","createContext","undefined","useMediaManager","context","useContext","Error","MediaManagerProvider","t0","$","_c","controller","children","t1","DEFAULT_THUMBNAIL_PATH","useMediaManagerController","storageSource","dataSourceDelegate","storagePath","collectionPath","bucket","thumbnailSizes","thumbnailPath","loading","setLoading","useState","error","setError","assets","setAssets","selectedAsset","setSelectedAsset","searchQuery","setSearchQuery","fetchDownloadURL","useCallback","asset","downloadConfig","getDownloadURL","downloadURL","url","err","console","warn","refreshAssets","log","entities","fetchCollection","path","orderBy","order","length","loadedAssets","Promise","all","map","entity","values","baseAsset","id","fileName","mimeType","size","dimensions","title","altText","caption","tags","createdAt","Date","toDate","updatedAt","startsWith","String","useEffect","uploadFile","file","metadata","name","uploadResult","type","getImageDimensions","thumbnails","isRasterImage","s","thumbnailBlob","generateThumbnail","width","height","quality","thumbFileName","now","thumbPath","thumbUploadResult","File","thumbDownloadConfig","assetData","Object","keys","saveEntity","status","newAsset","prev","deleteAsset","assetId","find","a","deleteFile","deleteEntity","filter","updateAsset","data","cleanData","entries","forEach","key","value","entityId","previousValues","searchAssets","query","selectAsset","filteredAssets","toLowerCase","includes","some","tag","totalCount","resolve","reject","img","Image","onload","URL","revokeObjectURL","src","onerror","createObjectURL","maxWidth","maxHeight","Compressor","success","result","MediaAssetCard","viewMode","onClick","selected","thumbnailSize","t2","isImage","isVideo","isAudio","FileIcon","ImageIcon","VideoLibraryIcon","AudiotrackIcon","DescriptionIcon","formatSize","_temp","imageUrl","t3","thumbnail","t4","t5","cls","defaultBorderMixin","t6","t7","t8","t9","t10","split","toUpperCase","t11","t12","t13","t14","Symbol","for","t15","bytes","toFixed","MediaAssetDetails","onClose","onUpdate","onDelete","snackbarController","useSnackbarController","useStorageSource","saving","setSaving","deleting","setDeleting","deleteDialogOpen","setDeleteDialogOpen","tagInput","setTagInput","setFieldValue","dirty","useCreateFormex","initialValues","handleSave","open","message","handleDelete","handleDownload","window","handleAddTag","trim","handleRemoveTag","tagToRemove","t","formatDate","date","Intl","DateTimeFormat","year","month","day","format","e","target","preventDefault","MediaUploadDialog","onUpload","maxFileSize","acceptedMimeTypes","isDragging","setIsDragging","uploading","setUploading","selectedFiles","setSelectedFiles","validateFiles","files","valid","errors","push","endsWith","slice","handleDragOver","handleDragLeave","handleDrop","Array","from","dataTransfer","join","handleFileSelect","handleRemoveFile","index","_","i","handleUpload","handleClose","document","getElementById","click","stopPropagation","MediaLibraryView","uploadDialogOpen","setUploadDialogOpen","setViewMode","useRef","handleSearch","handleUploadClick","handleRefresh","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","DEFAULT_STORAGE_PATH","DEFAULT_COLLECTION_PATH","MediaManagerConfigContext","useMediaManagerConfig","config","MediaLibraryViewInternal","buildMediaView","description","group","icon","view","MEDIA_VIEW","useMediaManagerPlugin","props","useMemo","views","provider","Component","MediaLibraryCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/MediaManagerProvider.tsx","../src/useMediaManagerController.tsx","../src/components/MediaAssetCard.tsx","../src/components/MediaAssetDetails.tsx","../src/components/MediaUploadDialog.tsx","../src/components/MediaLibraryView.tsx","../src/locales/en.ts","../src/locales/es.ts","../src/locales/de.ts","../src/locales/fr.ts","../src/locales/it.ts","../src/locales/hi.ts","../src/locales/pt.ts","../src/useMediaManagerPlugin.tsx","../src/components/MediaLibraryCard.tsx"],"sourcesContent":["import React, { createContext, PropsWithChildren, useContext } from \"react\";\nimport { MediaManagerController } from \"./types\";\n\nconst MediaManagerContext = createContext<MediaManagerController | undefined>(undefined);\n\n/**\n * Hook to access the MediaManagerController from context.\n * Must be used within a MediaManagerProvider.\n */\nexport function useMediaManager(): MediaManagerController {\n const context = useContext(MediaManagerContext);\n if (!context) {\n throw new Error(\"useMediaManager must be used within a MediaManagerProvider\");\n }\n return context;\n}\n\nexport interface MediaManagerProviderProps {\n controller: MediaManagerController;\n}\n\n/**\n * Provider component that makes the MediaManagerController available to all children.\n */\nexport function MediaManagerProvider({\n controller,\n children\n}: PropsWithChildren<MediaManagerProviderProps>) {\n return (\n <MediaManagerContext.Provider value={controller}>\n {children}\n </MediaManagerContext.Provider>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { DataSourceDelegate, StorageSource } from \"@firecms/core\";\nimport { MediaAsset, MediaManagerController, ThumbnailSize } from \"./types\";\nimport Compressor from \"compressorjs\";\n\nexport interface UseMediaManagerControllerProps {\n storageSource: StorageSource;\n dataSourceDelegate: DataSourceDelegate;\n storagePath: string;\n collectionPath: string;\n bucket?: string;\n /** Thumbnail sizes to generate on upload */\n thumbnailSizes?: ThumbnailSize[];\n /** Path prefix for thumbnails. Default: \"thumbs\" */\n thumbnailPath?: string;\n}\n\nconst DEFAULT_THUMBNAIL_PATH = \"thumbs\";\n\n/**\n * Hook that creates a MediaManagerController for managing media assets.\n * Handles all CRUD operations for files and their metadata.\n */\nexport function useMediaManagerController({\n storageSource,\n dataSourceDelegate,\n storagePath,\n collectionPath,\n bucket,\n thumbnailSizes,\n thumbnailPath = DEFAULT_THUMBNAIL_PATH\n}: UseMediaManagerControllerProps): MediaManagerController {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const [assets, setAssets] = useState<MediaAsset[]>([]);\n const [selectedAsset, setSelectedAsset] = useState<MediaAsset | undefined>();\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Helper to fetch download URL for an asset\n const fetchDownloadURL = useCallback(async (asset: Omit<MediaAsset, \"downloadURL\">): Promise<MediaAsset> => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n return {\n ...asset,\n downloadURL: downloadConfig.url ?? undefined\n };\n } catch (err) {\n console.warn(`Failed to get download URL for ${asset.storagePath}:`, err);\n return { ...asset, downloadURL: undefined };\n }\n }, [storageSource]);\n\n // Fetch assets from the database\n const refreshAssets = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n try {\n console.log(\"Fetching media assets from:\", collectionPath);\n const entities = await dataSourceDelegate.fetchCollection<Record<string, any>>({\n path: collectionPath,\n orderBy: \"createdAt\",\n order: \"desc\"\n });\n\n console.log(\"Fetched entities:\", entities.length);\n\n if (entities.length === 0) {\n setAssets([]);\n return;\n }\n\n // Convert entities to assets and fetch download URLs\n const loadedAssets: MediaAsset[] = await Promise.all(\n entities.map(async (entity) => {\n const values = entity.values;\n const baseAsset: Omit<MediaAsset, \"downloadURL\"> = {\n id: entity.id,\n fileName: values.fileName,\n storagePath: values.storagePath,\n mimeType: values.mimeType,\n size: values.size,\n dimensions: values.dimensions,\n title: values.title,\n altText: values.altText,\n caption: values.caption,\n tags: values.tags,\n bucket: values.bucket,\n createdAt: values.createdAt instanceof Date\n ? values.createdAt\n : (values.createdAt?.toDate ? values.createdAt.toDate() : new Date(values.createdAt)),\n updatedAt: values.updatedAt instanceof Date\n ? values.updatedAt\n : (values.updatedAt?.toDate ? values.updatedAt.toDate() : new Date(values.updatedAt))\n };\n\n // Fetch download URL for images\n if (baseAsset.mimeType?.startsWith(\"image/\") || baseAsset.mimeType?.startsWith(\"video/\")) {\n return await fetchDownloadURL(baseAsset);\n }\n return { ...baseAsset, downloadURL: undefined };\n })\n );\n\n console.log(\"Loaded assets with URLs:\", loadedAssets.length);\n setAssets(loadedAssets);\n } catch (err) {\n console.error(\"Error fetching media assets:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [dataSourceDelegate, collectionPath, fetchDownloadURL]);\n\n // Initial load\n useEffect(() => {\n refreshAssets();\n }, [refreshAssets]);\n\n // Upload a new file\n const uploadFile = useCallback(async (\n file: File,\n metadata?: Partial<Pick<MediaAsset, \"title\" | \"altText\" | \"caption\" | \"tags\">>\n ): Promise<MediaAsset> => {\n console.log(\"Uploading file:\", file.name, \"to path:\", storagePath);\n\n // Upload to storage\n const uploadResult = await storageSource.uploadFile({\n file,\n fileName: file.name,\n path: storagePath,\n bucket\n });\n\n console.log(\"Upload result:\", uploadResult);\n\n // Get download URL immediately after upload\n let downloadURL: string | undefined;\n try {\n const downloadConfig = await storageSource.getDownloadURL(uploadResult.path, uploadResult.bucket);\n downloadURL = downloadConfig.url ?? undefined;\n console.log(\"Got download URL:\", downloadURL);\n } catch (err) {\n console.warn(\"Failed to get download URL after upload:\", err);\n }\n\n // Get dimensions for images\n let dimensions: { width: number; height: number } | undefined;\n if (file.type.startsWith(\"image/\")) {\n try {\n dimensions = await getImageDimensions(file);\n } catch (err) {\n console.warn(\"Failed to get image dimensions:\", err);\n }\n }\n\n // Generate thumbnails if configured and file is a raster image (skip SVGs)\n const thumbnails: Record<string, string> = {};\n const isRasterImage = file.type.startsWith(\"image/\") && file.type !== \"image/svg+xml\";\n if (thumbnailSizes && thumbnailSizes.length > 0 && isRasterImage) {\n console.log(\"Generating thumbnails for sizes:\", thumbnailSizes.map(s => s.name));\n\n for (const size of thumbnailSizes) {\n try {\n const thumbnailBlob = await generateThumbnail(file, size.width, size.height, size.quality ?? 0.8);\n const thumbFileName = `${Date.now()}_${size.name}_${file.name}`;\n const thumbPath = `${storagePath}/${thumbnailPath}/${size.name}`;\n\n // Upload thumbnail\n const thumbUploadResult = await storageSource.uploadFile({\n file: new File([thumbnailBlob], thumbFileName, { type: \"image/jpeg\" }),\n fileName: thumbFileName,\n path: thumbPath,\n bucket\n });\n\n // Get download URL for thumbnail\n const thumbDownloadConfig = await storageSource.getDownloadURL(thumbUploadResult.path, thumbUploadResult.bucket);\n if (thumbDownloadConfig.url) {\n thumbnails[size.name] = thumbDownloadConfig.url;\n console.log(`Generated ${size.name} thumbnail:`, thumbDownloadConfig.url);\n }\n } catch (err) {\n console.warn(`Failed to generate ${size.name} thumbnail:`, err);\n }\n }\n }\n\n const now = new Date();\n\n // Build asset data, only including defined values (Firestore doesn't allow undefined)\n const assetData: Record<string, any> = {\n fileName: file.name,\n storagePath: uploadResult.path,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now\n };\n\n // Only add optional fields if they are defined\n if (dimensions) assetData.dimensions = dimensions;\n if (metadata?.title) assetData.title = metadata.title;\n if (metadata?.altText) assetData.altText = metadata.altText;\n if (metadata?.caption) assetData.caption = metadata.caption;\n if (metadata?.tags && metadata.tags.length > 0) assetData.tags = metadata.tags;\n if (uploadResult.bucket) assetData.bucket = uploadResult.bucket;\n // Store downloadURL in database for quick access later\n if (downloadURL) assetData.downloadURL = downloadURL;\n // Store thumbnails if any were generated\n if (Object.keys(thumbnails).length > 0) assetData.thumbnails = thumbnails;\n\n console.log(\"Saving asset data to database:\", assetData);\n\n // Save metadata to database\n const entity = await dataSourceDelegate.saveEntity<Record<string, any>>({\n path: collectionPath,\n values: assetData,\n status: \"new\"\n });\n\n console.log(\"Saved entity:\", entity.id);\n\n const newAsset: MediaAsset = {\n id: entity.id,\n fileName: file.name,\n storagePath: uploadResult.path,\n downloadURL,\n mimeType: file.type,\n size: file.size,\n createdAt: now,\n updatedAt: now,\n dimensions,\n title: metadata?.title,\n altText: metadata?.altText,\n caption: metadata?.caption,\n tags: metadata?.tags,\n bucket: uploadResult.bucket,\n thumbnails: Object.keys(thumbnails).length > 0 ? thumbnails : undefined\n };\n\n setAssets(prev => [newAsset, ...prev]);\n return newAsset;\n }, [storageSource, dataSourceDelegate, storagePath, collectionPath, bucket, thumbnailSizes, thumbnailPath]);\n\n // Delete an asset\n const deleteAsset = useCallback(async (assetId: string): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n console.log(\"Deleting asset:\", assetId, asset.storagePath);\n\n // Delete from storage\n try {\n await storageSource.deleteFile(asset.storagePath, asset.bucket);\n } catch (err) {\n console.warn(\"Failed to delete from storage (may not exist):\", err);\n }\n\n // Delete from database\n await dataSourceDelegate.deleteEntity({\n entity: {\n id: assetId,\n path: collectionPath,\n values: asset\n }\n });\n\n setAssets(prev => prev.filter(a => a.id !== assetId));\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(undefined);\n }\n }, [assets, storageSource, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Update asset metadata\n const updateAsset = useCallback(async (\n assetId: string,\n data: Partial<MediaAsset>\n ): Promise<void> => {\n const asset = assets.find(a => a.id === assetId);\n if (!asset) {\n throw new Error(`Asset with id ${assetId} not found`);\n }\n\n // Filter out undefined values\n const cleanData: Record<string, any> = {};\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined) {\n cleanData[key] = value;\n }\n });\n cleanData.updatedAt = new Date();\n\n console.log(\"Updating asset:\", assetId, cleanData);\n\n await dataSourceDelegate.saveEntity({\n path: collectionPath,\n entityId: assetId,\n values: cleanData,\n previousValues: asset,\n status: \"existing\"\n });\n\n setAssets(prev => prev.map(a =>\n a.id === assetId ? { ...a, ...cleanData } : a\n ));\n\n if (selectedAsset?.id === assetId) {\n setSelectedAsset(prev => prev ? { ...prev, ...cleanData } : prev);\n }\n }, [assets, dataSourceDelegate, collectionPath, selectedAsset]);\n\n // Search assets (client-side filtering for now)\n const searchAssets = useCallback((query: string) => {\n setSearchQuery(query);\n }, []);\n\n const selectAsset = useCallback((asset: MediaAsset | undefined) => {\n setSelectedAsset(asset);\n }, []);\n\n // Filter assets based on search query\n const filteredAssets = searchQuery\n ? assets.filter(asset =>\n asset.fileName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.title?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n asset.tags?.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase()))\n )\n : assets;\n\n return {\n loading,\n error,\n assets: filteredAssets,\n totalCount: assets.length,\n selectedAsset,\n selectAsset,\n uploadFile,\n deleteAsset,\n updateAsset,\n refreshAssets,\n searchAssets,\n storagePath,\n collectionPath\n };\n}\n\n/**\n * Helper to get image dimensions from a File\n */\nfunction getImageDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = reject;\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Generate a thumbnail from an image file using compressorjs.\n * Uses the same library as the core FireCMS image resize implementation.\n * Maintains aspect ratio while fitting within maxWidth x maxHeight.\n */\nasync function generateThumbnail(\n file: File,\n maxWidth: number,\n maxHeight: number,\n quality: number\n): Promise<Blob> {\n return new Promise<Blob>((resolve, reject) => {\n new Compressor(file, {\n quality,\n maxWidth,\n maxHeight,\n mimeType: \"image/jpeg\",\n success: (result) => {\n resolve(result);\n },\n error: reject,\n });\n });\n}\n","import React from \"react\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon,\n DescriptionIcon,\n VideoLibraryIcon,\n AudiotrackIcon,\n CheckIcon,\n defaultBorderMixin\n} from \"@firecms/ui\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetCardProps {\n asset: MediaAsset;\n viewMode: \"grid\" | \"list\";\n onClick: () => void;\n selected?: boolean;\n /** Preferred thumbnail size to display (e.g., \"small\", \"medium\") */\n thumbnailSize?: string;\n}\n\n/**\n * Card component for displaying a media asset in the grid or list.\n */\nexport function MediaAssetCard({\n asset,\n viewMode,\n onClick,\n selected,\n thumbnailSize = \"small\"\n}: MediaAssetCardProps) {\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n const isAudio = asset.mimeType.startsWith(\"audio/\");\n\n const FileIcon = isImage ? ImageIcon\n : isVideo ? VideoLibraryIcon\n : isAudio ? AudiotrackIcon\n : DescriptionIcon;\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n // Use thumbnail if available, fallback to downloadURL\n const imageUrl = asset.thumbnails?.[thumbnailSize] ?? asset.downloadURL;\n\n const thumbnail = isImage && imageUrl ? (\n <img\n src={imageUrl}\n alt={asset.altText || asset.fileName}\n className=\"w-full h-full object-cover transition-transform duration-200 group-hover:scale-105\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-surface-100 dark:bg-surface-800\">\n <FileIcon size=\"large\" className=\"text-surface-400 dark:text-surface-500\" />\n </div>\n );\n\n if (viewMode === \"list\") {\n return (\n <div\n className={cls(\n \"p-3 cursor-pointer flex items-center gap-3 rounded-lg\",\n \"hover:bg-surface-100 dark:hover:bg-surface-800\",\n \"transition-colors duration-150\",\n `border ${defaultBorderMixin}`,\n selected && \"ring-2 ring-primary bg-primary/5\"\n )}\n onClick={onClick}\n >\n <div className=\"w-12 h-12 rounded-md overflow-hidden flex-shrink-0 bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n {selected && (\n <div className=\"w-6 h-6 rounded-full bg-primary flex items-center justify-center flex-shrink-0\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n );\n }\n\n return (\n <Card\n className={cls(\n \"cursor-pointer overflow-hidden group relative\",\n \"transition-all duration-200\",\n \"hover:shadow-lg hover:-translate-y-0.5\",\n selected && \"ring-2 ring-primary\"\n )}\n onClick={onClick}\n >\n <div className=\"aspect-square relative overflow-hidden bg-surface-100 dark:bg-surface-800\">\n {thumbnail}\n\n {/* Hover overlay */}\n <div className={cls(\n \"absolute inset-0 bg-black/0 group-hover:bg-black/20\",\n \"transition-colors duration-200\"\n )} />\n\n {/* Selection indicator */}\n {selected && (\n <div className=\"absolute top-2 right-2 w-6 h-6 rounded-full bg-primary flex items-center justify-center shadow-md\">\n <CheckIcon size=\"smallest\" className=\"text-white\" />\n </div>\n )}\n </div>\n\n <div className=\"p-3\">\n <Typography variant=\"body2\" className=\"font-medium truncate text-surface-900 dark:text-white\">\n {asset.title || asset.fileName}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate block mt-0.5\">\n {formatSize(asset.size)} • {asset.mimeType.split(\"/\")[1]?.toUpperCase()}\n </Typography>\n </div>\n </Card>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useCreateFormex } from \"@firecms/formex\";\nimport {\n Button,\n Typography,\n cls,\n CloseIcon,\n DeleteIcon,\n DownloadIcon,\n IconButton,\n TextField,\n Chip,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent\n} from \"@firecms/ui\";\nimport { useSnackbarController, useStorageSource, useTranslation } from \"@firecms/core\";\nimport { MediaAsset } from \"../types\";\n\nexport interface MediaAssetDetailsProps {\n asset: MediaAsset;\n onClose: () => void;\n onUpdate: (assetId: string, data: Partial<MediaAsset>) => Promise<void>;\n onDelete: (assetId: string) => Promise<void>;\n}\n\n/**\n * Side panel component for viewing and editing media asset details.\n */\nexport function MediaAssetDetails({\n asset,\n onClose,\n onUpdate,\n onDelete\n}: MediaAssetDetailsProps) {\n const snackbarController = useSnackbarController();\n const storageSource = useStorageSource();\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [tagInput, setTagInput] = useState(\"\");\n const { t } = useTranslation();\n\n const { values, setFieldValue, dirty } = useCreateFormex<Partial<MediaAsset>>({\n initialValues: {\n title: asset.title ?? \"\",\n altText: asset.altText ?? \"\",\n caption: asset.caption ?? \"\",\n tags: asset.tags ?? []\n }\n });\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n try {\n await onUpdate(asset.id, values);\n snackbarController.open({\n type: \"success\",\n message: t(\"media_asset_updated\")\n });\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: t(\"media_error_updating\", { message: error instanceof Error ? error.message : String(error) })\n });\n } finally {\n setSaving(false);\n }\n }, [asset.id, values, onUpdate, snackbarController]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n try {\n await onDelete(asset.id);\n snackbarController.open({\n type: \"success\",\n message: t(\"media_asset_deleted\")\n });\n onClose();\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: t(\"media_error_deleting\", { message: error instanceof Error ? error.message : String(error) })\n });\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n }\n }, [asset.id, onDelete, snackbarController, onClose]);\n\n const handleDownload = useCallback(async () => {\n try {\n const downloadConfig = await storageSource.getDownloadURL(asset.storagePath, asset.bucket);\n if (downloadConfig.url) {\n window.open(downloadConfig.url, \"_blank\");\n }\n } catch (error) {\n snackbarController.open({\n type: \"error\",\n message: t(\"media_error_getting_url\")\n });\n }\n }, [asset, storageSource, snackbarController]);\n\n const handleAddTag = useCallback(() => {\n const tag = tagInput.trim();\n if (tag && !values.tags?.includes(tag)) {\n setFieldValue(\"tags\", [...(values.tags ?? []), tag]);\n setTagInput(\"\");\n }\n }, [tagInput, values.tags, setFieldValue]);\n\n const handleRemoveTag = useCallback((tagToRemove: string) => {\n setFieldValue(\"tags\", values.tags?.filter((t: string) => t !== tagToRemove) ?? []);\n }, [values.tags, setFieldValue]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n const formatDate = (date: Date): string => {\n return new Intl.DateTimeFormat(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\"\n }).format(date);\n };\n\n const isImage = asset.mimeType.startsWith(\"image/\");\n const isVideo = asset.mimeType.startsWith(\"video/\");\n\n return (\n <>\n <div className={cls(\n \"fixed inset-y-0 right-0 w-full sm:w-96 lg:w-[480px]\",\n \"bg-surface-50 dark:bg-surface-900\",\n \"border-l border-surface-accent-200 dark:border-surface-accent-700\",\n \"shadow-xl z-50\",\n \"flex flex-col\",\n \"animate-slide-in-right\"\n )}>\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"subtitle1\" className=\"font-medium truncate flex-1 mr-2\">\n {asset.title || asset.fileName}\n </Typography>\n <div className=\"flex items-center gap-1\">\n <IconButton onClick={handleDownload}>\n <DownloadIcon size=\"small\" />\n </IconButton>\n <IconButton\n onClick={() => setDeleteDialogOpen(true)}\n className=\"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <DeleteIcon size=\"small\" />\n </IconButton>\n <IconButton onClick={onClose}>\n <CloseIcon size=\"small\" />\n </IconButton>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"p-4 bg-surface-accent-100 dark:bg-surface-accent-800 flex items-center justify-center min-h-48 max-h-64\">\n {isImage && asset.downloadURL ? (\n <img\n src={asset.downloadURL}\n alt={asset.altText || asset.fileName}\n className=\"max-w-full max-h-full object-contain\"\n />\n ) : isVideo && asset.downloadURL ? (\n <video\n src={asset.downloadURL}\n className=\"max-w-full max-h-full\"\n controls\n />\n ) : (\n <div className=\"text-surface-accent-400\">\n {t(\"media_preview_not_available\")}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4 space-y-4\">\n {/* Metadata */}\n <div className=\"grid grid-cols-2 gap-3\">\n {asset.dimensions && (\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_dimensions\")}\n </Typography>\n <Typography variant=\"body2\">\n {asset.dimensions.width} × {asset.dimensions.height} px\n </Typography>\n </div>\n )}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_size\")}\n </Typography>\n <Typography variant=\"body2\">\n {formatSize(asset.size)}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_type\")}\n </Typography>\n <Typography variant=\"body2\">\n {asset.mimeType}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_created\")}\n </Typography>\n <Typography variant=\"body2\">\n {formatDate(asset.createdAt)}\n </Typography>\n </div>\n </div>\n\n <hr className=\"border-surface-accent-200 dark:border-surface-accent-700\" />\n\n {/* Editable Fields */}\n <TextField\n label={t(\"media_file_name\")}\n value={asset.fileName}\n disabled\n size=\"small\"\n />\n\n <TextField\n label={t(\"media_title\")}\n value={values.title ?? \"\"}\n onChange={(e) => setFieldValue(\"title\", e.target.value)}\n size=\"small\"\n />\n\n <div>\n <TextField\n label={t(\"media_alt_text\")}\n value={values.altText ?? \"\"}\n onChange={(e) => setFieldValue(\"altText\", e.target.value)}\n size=\"small\"\n />\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mt-1\">\n {t(\"media_recommended_seo\")}\n </Typography>\n </div>\n\n <TextField\n label={t(\"media_caption\")}\n value={values.caption ?? \"\"}\n onChange={(e) => setFieldValue(\"caption\", e.target.value)}\n size=\"small\"\n multiline\n />\n\n {/* Tags */}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 mb-1 block\">\n {t(\"media_tags\")}\n </Typography>\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {values.tags?.map((tag: string) => (\n <Chip\n key={tag}\n size=\"small\"\n colorScheme=\"blueLighter\"\n onClick={() => handleRemoveTag(tag)}\n >\n {tag} ×\n </Chip>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <TextField\n placeholder={t(\"media_add_tag\")}\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n size=\"small\"\n className=\"flex-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAddTag();\n }\n }}\n />\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleAddTag}\n disabled={!tagInput.trim()}\n >\n {t(\"media_add\")}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 p-4 border-t border-surface-accent-200 dark:border-surface-accent-700\">\n <Button\n variant=\"filled\"\n onClick={handleSave}\n disabled={!dirty || saving}\n className=\"w-full\"\n >\n {saving ? <CircularProgress size=\"small\" /> : t(\"media_save_changes\")}\n </Button>\n </div>\n </div>\n\n {/* Delete Confirmation Dialog */}\n <Dialog\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n >\n <DialogContent>\n <Typography variant=\"subtitle1\" className=\"font-medium mb-2\">\n {t(\"media_delete_asset\")}\n </Typography>\n <Typography className=\"text-surface-accent-600 dark:text-surface-accent-400\">\n {t(\"media_delete_confirmation\", { name: asset.title || asset.fileName })}\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={() => setDeleteDialogOpen(false)}\n disabled={deleting}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n variant=\"filled\"\n color=\"error\"\n onClick={handleDelete}\n disabled={deleting}\n >\n {deleting ? <CircularProgress size=\"small\" /> : t(\"delete\")}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport {\n Button,\n Typography,\n cls,\n Dialog,\n DialogActions,\n DialogContent,\n CloudUploadIcon,\n CircularProgress\n} from \"@firecms/ui\";\nimport { useTranslation } from \"@firecms/core\";\n\nexport interface MediaUploadDialogProps {\n open: boolean;\n onClose: () => void;\n onUpload: (files: File[]) => Promise<void>;\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Dialog component for uploading files to the media library.\n * Supports drag-and-drop and file browser selection.\n */\nexport function MediaUploadDialog({\n open,\n onClose,\n onUpload,\n maxFileSize = 52428800, // 50MB default\n acceptedMimeTypes\n}: MediaUploadDialogProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const { t } = useTranslation();\n\n const validateFiles = useCallback((files: File[]): { valid: File[]; errors: string[] } => {\n const valid: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n if (maxFileSize && file.size > maxFileSize) {\n errors.push(t(\"media_file_too_large\", { name: file.name, size: formatSize(maxFileSize) }));\n continue;\n }\n if (acceptedMimeTypes && !acceptedMimeTypes.some(type => {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type === type;\n })) {\n errors.push(t(\"media_file_type_not_allowed\", { name: file.name }));\n continue;\n }\n valid.push(file);\n }\n\n return { valid, errors };\n }, [maxFileSize, acceptedMimeTypes]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const files = Array.from(e.dataTransfer.files);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleFileSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n const { valid, errors } = validateFiles(files);\n\n if (errors.length > 0) {\n setError(errors.join(\"\\n\"));\n } else {\n setError(null);\n }\n\n setSelectedFiles(prev => [...prev, ...valid]);\n }, [validateFiles]);\n\n const handleRemoveFile = useCallback((index: number) => {\n setSelectedFiles(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return;\n\n setUploading(true);\n setError(null);\n\n try {\n await onUpload(selectedFiles);\n setSelectedFiles([]);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : t(\"media_upload_failed\"));\n } finally {\n setUploading(false);\n }\n }, [selectedFiles, onUpload, onClose]);\n\n const handleClose = useCallback(() => {\n if (!uploading) {\n setSelectedFiles([]);\n setError(null);\n onClose();\n }\n }, [uploading, onClose]);\n\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open && handleClose()}\n maxWidth=\"md\"\n >\n <DialogContent className=\"p-0\">\n <div className=\"p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"h6\">\n {t(\"media_upload_files\")}\n </Typography>\n </div>\n\n <div className=\"p-4\">\n {/* Drop Zone */}\n <div\n className={cls(\n \"border-2 border-dashed rounded-lg p-8\",\n \"flex flex-col items-center justify-center gap-4\",\n \"transition-colors duration-150\",\n isDragging\n ? \"border-primary bg-primary/5\"\n : \"border-surface-accent-300 dark:border-surface-accent-600\",\n \"hover:border-primary hover:bg-primary/5\",\n \"cursor-pointer\"\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => document.getElementById(\"file-upload-input\")?.click()}\n >\n <CloudUploadIcon\n size=\"large\"\n className={cls(\n isDragging ? \"text-primary\" : \"text-surface-accent-400\"\n )}\n />\n <div className=\"text-center\">\n <Typography variant=\"body1\" className=\"font-medium\">\n {t(\"media_drop_files\")}\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_max_file_size\", { size: formatSize(maxFileSize) })}\n </Typography>\n </div>\n <input\n id=\"file-upload-input\"\n type=\"file\"\n multiple\n accept={acceptedMimeTypes?.join(\",\")}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n </div>\n\n {/* Error Display */}\n {error && (\n <Typography variant=\"caption\" className=\"text-red-500 mt-2 block whitespace-pre-line\">\n {error}\n </Typography>\n )}\n\n {/* Selected Files */}\n {selectedFiles.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {t(\"media_selected_files_count\", { count: selectedFiles.length.toString() })}\n </Typography>\n <div className=\"max-h-40 overflow-auto space-y-1\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className={cls(\n \"flex items-center justify-between p-2 rounded\",\n \"bg-surface-accent-50 dark:bg-surface-accent-800\"\n )}\n >\n <div className=\"flex-1 min-w-0 mr-2\">\n <Typography variant=\"body2\" className=\"truncate\">\n {file.name}\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {formatSize(file.size)}\n </Typography>\n </div>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n disabled={uploading}\n >\n {t(\"media_remove\")}\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button\n variant=\"text\"\n onClick={handleClose}\n disabled={uploading}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n variant=\"filled\"\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? (\n <>\n <CircularProgress size=\"smallest\" />\n {t(\"media_uploading\")}\n </>\n ) : (\n `${t(\"media_upload\")} ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : \"\"}`\n )}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useCallback, useRef, useState } from \"react\";\nimport {\n Button,\n Container,\n SearchBar,\n Typography,\n cls,\n AddIcon,\n CircularProgress,\n RefreshIcon,\n IconButton,\n Tooltip,\n AppsIcon,\n Icon\n} from \"@firecms/ui\";\nimport { useTranslation } from \"@firecms/core\";\nimport { useMediaManager } from \"../MediaManagerProvider\";\nimport { MediaAssetCard } from \"./MediaAssetCard\";\nimport { MediaAssetDetails } from \"./MediaAssetDetails\";\nimport { MediaUploadDialog } from \"./MediaUploadDialog\";\n\nexport interface MediaLibraryViewProps {\n maxFileSize?: number;\n acceptedMimeTypes?: string[];\n}\n\n/**\n * Main view component for the Media Library.\n * Displays a grid of assets with search, upload, and management capabilities.\n */\nexport function MediaLibraryView({\n maxFileSize,\n acceptedMimeTypes\n }: MediaLibraryViewProps) {\n const controller = useMediaManager();\n const [uploadDialogOpen, setUploadDialogOpen] = useState(false);\n const [viewMode, setViewMode] = useState<\"grid\" | \"list\">(\"grid\");\n const fileInputRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslation();\n\n const handleSearch = useCallback((query?: string) => {\n controller.searchAssets(query ?? \"\");\n }, [controller]);\n\n const handleUploadClick = useCallback(() => {\n setUploadDialogOpen(true);\n }, []);\n\n const handleFileSelect = useCallback(async (files: File[]) => {\n for (const file of files) {\n await controller.uploadFile(file);\n }\n setUploadDialogOpen(false);\n }, [controller]);\n\n const handleRefresh = useCallback(() => {\n controller.refreshAssets();\n }, [controller]);\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div\n className=\"flex-shrink-0 border-b border-surface-accent-200 dark:border-surface-accent-700 bg-surface-50 dark:bg-surface-900\">\n <Container maxWidth=\"6xl\" className=\"py-4\">\n <div className=\"flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Typography variant=\"h5\" className=\"font-semibold\">\n {t(\"media_library\")}\n </Typography>\n {controller.totalCount !== undefined && (\n <Typography\n variant=\"caption\"\n className=\"bg-surface-accent-100 dark:bg-surface-accent-800 px-2 py-0.5 rounded-full\"\n >\n {t(\"media_assets_count\", { count: controller.totalCount.toString() })}\n </Typography>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 w-full sm:w-auto\">\n <SearchBar\n onTextSearch={handleSearch}\n placeholder={t(\"media_search_assets\")}\n className=\"flex-1 sm:w-64\"\n />\n\n <div\n className=\"flex items-center gap-1 border-l border-surface-accent-200 dark:border-surface-accent-700 pl-2 ml-2\">\n <Tooltip title={t(\"media_grid_view\")}>\n <IconButton\n onClick={() => setViewMode(\"grid\")}\n className={cls(\n viewMode === \"grid\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <AppsIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"media_list_view\")}>\n <IconButton\n onClick={() => setViewMode(\"list\")}\n className={cls(\n viewMode === \"list\" && \"bg-surface-accent-100 dark:bg-surface-accent-800\"\n )}\n >\n <Icon iconKey=\"list\" size=\"small\"/>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title={t(\"media_refresh\")}>\n <IconButton onClick={handleRefresh} disabled={controller.loading}>\n <RefreshIcon size=\"small\"/>\n </IconButton>\n </Tooltip>\n\n <Button\n variant=\"filled\"\n onClick={handleUploadClick}\n >\n <AddIcon size=\"small\"/>\n {t(\"media_upload\")}\n </Button>\n </div>\n </div>\n </Container>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n <Container maxWidth=\"6xl\" className=\"py-6\">\n {controller.loading && controller.assets.length === 0 ? (\n <div className=\"flex items-center justify-center h-64\">\n <CircularProgress/>\n </div>\n ) : controller.error ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-red-500\">\n {t(\"media_error_loading\", { message: controller.error.message })}\n </Typography>\n <Button onClick={handleRefresh}>\n {t(\"media_try_again\")}\n </Button>\n </div>\n ) : controller.assets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-64 gap-4\">\n <Typography className=\"text-surface-accent-500\">\n {t(\"media_no_assets\")}\n </Typography>\n <Button onClick={handleUploadClick}>\n <AddIcon size=\"small\"/>\n {t(\"media_upload_first_file\")}\n </Button>\n </div>\n ) : (\n <div className={cls(\n viewMode === \"grid\"\n ? \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\"\n : \"flex flex-col gap-2\"\n )}>\n {controller.assets.map(asset => (\n <MediaAssetCard\n key={asset.id}\n asset={asset}\n viewMode={viewMode}\n onClick={() => controller.selectAsset(asset)}\n selected={controller.selectedAsset?.id === asset.id}\n />\n ))}\n </div>\n )}\n </Container>\n </div>\n\n {/* Details Panel */}\n {controller.selectedAsset && (\n <MediaAssetDetails\n asset={controller.selectedAsset}\n onClose={() => controller.selectAsset(undefined)}\n onUpdate={controller.updateAsset}\n onDelete={controller.deleteAsset}\n />\n )}\n\n {/* Upload Dialog */}\n <MediaUploadDialog\n open={uploadDialogOpen}\n onClose={() => setUploadDialogOpen(false)}\n onUpload={handleFileSelect}\n maxFileSize={maxFileSize}\n acceptedMimeTypes={acceptedMimeTypes}\n />\n </div>\n );\n}\n","export const mediaManagerTranslationsEn = {\n media_library: \"Media Library\",\n media_library_description: \"Manage images and files\",\n media_search_assets: \"Search assets...\",\n media_grid_view: \"Grid view\",\n media_list_view: \"List view\",\n media_refresh: \"Refresh\",\n media_upload: \"Upload\",\n media_error_loading: \"Error loading assets: {{message}}\",\n media_try_again: \"Try Again\",\n media_no_assets: \"No media assets yet\",\n media_upload_first_file: \"Upload your first file\",\n media_asset_updated: \"Asset updated successfully\",\n media_error_updating: \"Error updating asset: {{message}}\",\n media_asset_deleted: \"Asset deleted successfully\",\n media_error_deleting: \"Error deleting asset: {{message}}\",\n media_error_getting_url: \"Error getting download URL\",\n media_preview_not_available: \"Preview not available\",\n media_dimensions: \"Dimensions\",\n media_size: \"Size\",\n media_type: \"Type\",\n media_created: \"Created\",\n media_file_name: \"File Name\",\n media_title: \"Title\",\n media_alt_text: \"Alt Text\",\n media_recommended_seo: \"Recommended for SEO\",\n media_caption: \"Caption\",\n media_tags: \"Tags\",\n media_add_tag: \"Add a tag...\",\n media_add: \"Add\",\n media_save_changes: \"Save Changes\",\n media_delete_asset: \"Delete Asset?\",\n media_delete_confirmation: \"Are you sure you want to delete \\\"{{name}}\\\"? This action cannot be undone.\",\n media_file_too_large: \"{{name}}: File too large (max {{size}})\",\n media_file_type_not_allowed: \"{{name}}: File type not allowed\",\n media_upload_failed: \"Upload failed\",\n media_upload_files: \"Upload Files\",\n media_drop_files: \"Drop files here or click to browse\",\n media_max_file_size: \"Maximum file size: {{size}}\",\n media_selected_files_count: \"Selected files ({{count}})\",\n media_remove: \"Remove\",\n media_uploading: \"Uploading...\",\n media_manage_description: \"Manage your media files and assets\",\n media_assets_count: \"{{count}} assets\"\n};\n","export const mediaManagerTranslationsEs = {\n media_library: \"Biblioteca de Medios\",\n media_library_description: \"Gestionar imágenes y archivos\",\n media_search_assets: \"Buscar recursos...\",\n media_grid_view: \"Vista de cuadrícula\",\n media_list_view: \"Vista de lista\",\n media_refresh: \"Actualizar\",\n media_upload: \"Subir\",\n media_error_loading: \"Error al cargar recursos: {{message}}\",\n media_try_again: \"Volver a intentar\",\n media_no_assets: \"Aún no hay recursos multimedia\",\n media_upload_first_file: \"Sube tu primer archivo\",\n media_asset_updated: \"Recurso actualizado con éxito\",\n media_error_updating: \"Error al actualizar recurso: {{message}}\",\n media_asset_deleted: \"Recurso eliminado con éxito\",\n media_error_deleting: \"Error al eliminar recurso: {{message}}\",\n media_error_getting_url: \"Error al obtener URL de descarga\",\n media_preview_not_available: \"Vista previa no disponible\",\n media_dimensions: \"Dimensiones\",\n media_size: \"Tamaño\",\n media_type: \"Tipo\",\n media_created: \"Creado\",\n media_file_name: \"Nombre del archivo\",\n media_title: \"Título\",\n media_alt_text: \"Texto alternativo\",\n media_recommended_seo: \"Recomendado para SEO\",\n media_caption: \"Leyenda\",\n media_tags: \"Etiquetas\",\n media_add_tag: \"Añadir una etiqueta...\",\n media_add: \"Añadir\",\n media_save_changes: \"Guardar cambios\",\n media_delete_asset: \"¿Eliminar recurso?\",\n media_delete_confirmation: \"¿Estás seguro de que deseas eliminar \\\"{{name}}\\\"? Esta acción no se puede deshacer.\",\n media_file_too_large: \"{{name}}: Archivo demasiado grande (máx. {{size}})\",\n media_file_type_not_allowed: \"{{name}}: Tipo de archivo no permitido\",\n media_upload_failed: \"Error al subir\",\n media_upload_files: \"Subir archivos\",\n media_drop_files: \"Suelta archivos aquí o haz clic para buscar\",\n media_max_file_size: \"Tamaño máximo de archivo: {{size}}\",\n media_selected_files_count: \"Archivos seleccionados ({{count}})\",\n media_remove: \"Quitar\",\n media_uploading: \"Subiendo...\",\n media_manage_description: \"Gestiona tus archivos y recursos multimedia\",\n media_assets_count: \"{{count}} recursos\"\n};\n","export const mediaManagerTranslationsDe = {\n media_library: \"Mediathek\",\n media_library_description: \"Bilder und Dateien verwalten\",\n media_search_assets: \"Assets durchsuchen...\",\n media_grid_view: \"Rasteransicht\",\n media_list_view: \"Listenansicht\",\n media_refresh: \"Aktualisieren\",\n media_upload: \"Hochladen\",\n media_error_loading: \"Fehler beim Laden der Assets: {{message}}\",\n media_try_again: \"Erneut versuchen\",\n media_no_assets: \"Noch keine Medien-Assets\",\n media_upload_first_file: \"Laden Sie Ihre erste Datei hoch\",\n media_asset_updated: \"Asset erfolgreich aktualisiert\",\n media_error_updating: \"Fehler beim Aktualisieren des Assets: {{message}}\",\n media_asset_deleted: \"Asset erfolgreich gelöscht\",\n media_error_deleting: \"Fehler beim Löschen des Assets: {{message}}\",\n media_error_getting_url: \"Fehler beim Abrufen der Download-URL\",\n media_preview_not_available: \"Vorschau nicht verfügbar\",\n media_dimensions: \"Abmessungen\",\n media_size: \"Größe\",\n media_type: \"Typ\",\n media_created: \"Erstellt\",\n media_file_name: \"Dateiname\",\n media_title: \"Titel\",\n media_alt_text: \"Alternativtext\",\n media_recommended_seo: \"Empfohlen für SEO\",\n media_caption: \"Bildunterschrift\",\n media_tags: \"Schlagwörter\",\n media_add_tag: \"Schlagwort hinzufügen...\",\n media_add: \"Hinzufügen\",\n media_save_changes: \"Änderungen speichern\",\n media_delete_asset: \"Asset löschen?\",\n media_delete_confirmation: \"Sind Sie sicher, dass Sie \\\"{{name}}\\\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.\",\n media_file_too_large: \"{{name}}: Datei ist zu groß (max. {{size}})\",\n media_file_type_not_allowed: \"{{name}}: Dateityp nicht zulässig\",\n media_upload_failed: \"Hochladen fehlgeschlagen\",\n media_upload_files: \"Dateien hochladen\",\n media_drop_files: \"Dateien hier ablegen oder zum Durchsuchen klicken\",\n media_max_file_size: \"Maximale Dateigröße: {{size}}\",\n media_selected_files_count: \"Ausgewählte Dateien ({{count}})\",\n media_remove: \"Entfernen\",\n media_uploading: \"Wird hochgeladen...\",\n media_manage_description: \"Verwalten Sie Ihre Mediendateien und Assets\",\n media_assets_count: \"{{count}} Assets\"\n};\n","export const mediaManagerTranslationsFr = {\n media_library: \"Médiathèque\",\n media_library_description: \"Gérer les images et les fichiers\",\n media_search_assets: \"Rechercher des éléments...\",\n media_grid_view: \"Vue en grille\",\n media_list_view: \"Vue en liste\",\n media_refresh: \"Rafraîchir\",\n media_upload: \"Télécharger\",\n media_error_loading: \"Erreur lors du chargement des éléments : {{message}}\",\n media_try_again: \"Réessayer\",\n media_no_assets: \"Pas encore d'éléments multimédias\",\n media_upload_first_file: \"Téléchargez votre premier fichier\",\n media_asset_updated: \"Élément mis à jour avec succès\",\n media_error_updating: \"Erreur lors de la mise à jour de l'élément : {{message}}\",\n media_asset_deleted: \"Élément supprimé avec succès\",\n media_error_deleting: \"Erreur lors de la suppression de l'élément : {{message}}\",\n media_error_getting_url: \"Erreur lors de l'obtention de l'URL de téléchargement\",\n media_preview_not_available: \"Aperçu non disponible\",\n media_dimensions: \"Dimensions\",\n media_size: \"Taille\",\n media_type: \"Type\",\n media_created: \"Créé\",\n media_file_name: \"Nom du fichier\",\n media_title: \"Titre\",\n media_alt_text: \"Texte alternatif\",\n media_recommended_seo: \"Recommandé pour le référencement (SEO)\",\n media_caption: \"Légende\",\n media_tags: \"Balises\",\n media_add_tag: \"Ajouter une balise...\",\n media_add: \"Ajouter\",\n media_save_changes: \"Enregistrer les modifications\",\n media_delete_asset: \"Supprimer l'élément ?\",\n media_delete_confirmation: \"Êtes-vous sûr de vouloir supprimer \\\"{{name}}\\\" ? Cette action ne peut pas être annulée.\",\n media_file_too_large: \"{{name}} : Fichier trop volumineux (max {{size}})\",\n media_file_type_not_allowed: \"{{name}} : Type de fichier non autorisé\",\n media_upload_failed: \"Le téléchargement a échoué\",\n media_upload_files: \"Télécharger des fichiers\",\n media_drop_files: \"Déposez les fichiers ici ou cliquez pour parcourir\",\n media_max_file_size: \"Taille maximale du fichier : {{size}}\",\n media_selected_files_count: \"Fichiers sélectionnés ({{count}})\",\n media_remove: \"Retirer\",\n media_uploading: \"Téléchargement en cours...\",\n media_manage_description: \"Gérez vos fichiers et éléments multimédias\",\n media_assets_count: \"{{count}} éléments\"\n};\n","export const mediaManagerTranslationsIt = {\n media_library: \"Libreria multimediale\",\n media_library_description: \"Gestisci immagini e file\",\n media_search_assets: \"Cerca risorse...\",\n media_grid_view: \"Visualizzazione griglia\",\n media_list_view: \"Visualizzazione elenco\",\n media_refresh: \"Aggiorna\",\n media_upload: \"Carica\",\n media_error_loading: \"Errore durante il caricamento delle risorse: {{message}}\",\n media_try_again: \"Riprova\",\n media_no_assets: \"Nessuna risorsa multimediale ancora presente\",\n media_upload_first_file: \"Carica il tuo primo file\",\n media_asset_updated: \"Risorsa aggiornata con successo\",\n media_error_updating: \"Errore durante l'aggiornamento della risorsa: {{message}}\",\n media_asset_deleted: \"Risorsa eliminata con successo\",\n media_error_deleting: \"Errore durante l'eliminazione della risorsa: {{message}}\",\n media_error_getting_url: \"Errore durante il recupero dell'URL di download\",\n media_preview_not_available: \"Anteprima non disponibile\",\n media_dimensions: \"Dimensioni\",\n media_size: \"Dimensione\",\n media_type: \"Tipo\",\n media_created: \"Creato\",\n media_file_name: \"Nome file\",\n media_title: \"Titolo\",\n media_alt_text: \"Testo alternativo\",\n media_recommended_seo: \"Consigliato per la SEO\",\n media_caption: \"Didascalia\",\n media_tags: \"Tag\",\n media_add_tag: \"Aggiungi un tag...\",\n media_add: \"Aggiungi\",\n media_save_changes: \"Salva modifiche\",\n media_delete_asset: \"Elimina risorsa?\",\n media_delete_confirmation: \"Sei sicuro di voler eliminare \\\"{{name}}\\\"? Questa azione non può essere annullata.\",\n media_file_too_large: \"{{name}}: File troppo grande (max {{size}})\",\n media_file_type_not_allowed: \"{{name}}: Tipo di file non consentito\",\n media_upload_failed: \"Caricamento fallito\",\n media_upload_files: \"Carica file\",\n media_drop_files: \"Rilascia i file qui o fai clic per sfogliare\",\n media_max_file_size: \"Dimensione massima del file: {{size}}\",\n media_selected_files_count: \"File selezionati ({{count}})\",\n media_remove: \"Rimuovi\",\n media_uploading: \"Caricamento in corso...\",\n media_manage_description: \"Gestisci i tuoi file e risorse multimediali\",\n media_assets_count: \"{{count}} risorse\"\n};\n","export const mediaManagerTranslationsHi = {\n media_library: \"मीडिया लाइब्रेरी\",\n media_library_description: \"चित्र और फ़ाइलें प्रबंधित करें\",\n media_search_assets: \"संपत्तियां खोजें...\",\n media_grid_view: \"ग्रिड दृश्य\",\n media_list_view: \"सूची दृश्य\",\n media_refresh: \"रीफ्रेश करें\",\n media_upload: \"अपलोड करें\",\n media_error_loading: \"संपत्तियों को लोड करने में त्रुटि: {{message}}\",\n media_try_again: \"पुनः प्रयास करें\",\n media_no_assets: \"अभी तक कोई मीडिया संपत्ति नहीं\",\n media_upload_first_file: \"अपनी पहली फ़ाइल अपलोड करें\",\n media_asset_updated: \"संपत्ति सफलतापूर्वक अपडेट की गई\",\n media_error_updating: \"संपत्ति को अपडेट करने में त्रुटि: {{message}}\",\n media_asset_deleted: \"संपत्ति सफलतापूर्वक हटा दी गई\",\n media_error_deleting: \"संपत्ति को हटाने में त्रुटि: {{message}}\",\n media_error_getting_url: \"डाउनलोड URL प्राप्त करने में त्रुटि\",\n media_preview_not_available: \"पूर्वावलोकन उपलब्ध नहीं है\",\n media_dimensions: \"आयाम\",\n media_size: \"आकार\",\n media_type: \"प्रकार\",\n media_created: \"बनाया गया\",\n media_file_name: \"फ़ाइल का नाम\",\n media_title: \"शीर्षक\",\n media_alt_text: \"वैकल्पिक पाठ\",\n media_recommended_seo: \"SEO के लिए अनुशंसित\",\n media_caption: \"कैप्शन\",\n media_tags: \"टैग\",\n media_add_tag: \"एक टैग जोड़ें...\",\n media_add: \"जोड़ें\",\n media_save_changes: \"परिवर्तन सहेजें\",\n media_delete_asset: \"संपत्ति हटाएं?\",\n media_delete_confirmation: \"क्या आप निश्चित रूप से \\\"{{name}}\\\" को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।\",\n media_file_too_large: \"{{name}}: फ़ाइल बहुत बड़ी है (अधिकतम {{size}})\",\n media_file_type_not_allowed: \"{{name}}: फ़ाइल प्रकार की अनुमति नहीं है\",\n media_upload_failed: \"अपलोड विफल रहा\",\n media_upload_files: \"फ़ाइलें अपलोड करें\",\n media_drop_files: \"फ़ाइलें यहाँ छोड़ें या ब्राउज़ करने के लिए क्लिक करें\",\n media_max_file_size: \"अधिकतम फ़ाइल आकार: {{size}}\",\n media_selected_files_count: \"चयनित फ़ाइलें ({{count}})\",\n media_remove: \"हटाएं\",\n media_uploading: \"अपलोड हो रहा है...\",\n media_manage_description: \"अपनी मीडिया फ़ाइलें और संपत्तियां प्रबंधित करें\",\n media_assets_count: \"{{count}} संपत्तियां\"\n};\n","export const mediaManagerTranslationsPt = {\n media_library: \"Biblioteca de Média\",\n media_library_description: \"Gerir imagens e ficheiros\",\n media_search_assets: \"Pesquisar recursos...\",\n media_grid_view: \"Vista em grelha\",\n media_list_view: \"Vista em lista\",\n media_refresh: \"Atualizar\",\n media_upload: \"Carregar\",\n media_error_loading: \"Erro ao carregar recursos: {{message}}\",\n media_try_again: \"Tentar Novamente\",\n media_no_assets: \"Ainda não há recursos de média\",\n media_upload_first_file: \"Carregue o seu primeiro ficheiro\",\n media_asset_updated: \"Recurso atualizado com sucesso\",\n media_error_updating: \"Erro ao atualizar recurso: {{message}}\",\n media_asset_deleted: \"Recurso eliminado com sucesso\",\n media_error_deleting: \"Erro ao eliminar recurso: {{message}}\",\n media_error_getting_url: \"Erro ao obter URL de download\",\n media_preview_not_available: \"Pré-visualização não disponível\",\n media_dimensions: \"Dimensões\",\n media_size: \"Tamanho\",\n media_type: \"Tipo\",\n media_created: \"Criado\",\n media_file_name: \"Nome do Ficheiro\",\n media_title: \"Título\",\n media_alt_text: \"Texto Alternativo\",\n media_recommended_seo: \"Recomendado para SEO\",\n media_caption: \"Legenda\",\n media_tags: \"Etiquetas\",\n media_add_tag: \"Adicionar uma etiqueta...\",\n media_add: \"Adicionar\",\n media_save_changes: \"Guardar Alterações\",\n media_delete_asset: \"Eliminar Recurso?\",\n media_delete_confirmation: \"Tem a certeza de que quer eliminar \\\"{{name}}\\\"? Esta ação não pode ser desfeita.\",\n media_file_too_large: \"{{name}}: Ficheiro demasiado grande (máx {{size}})\",\n media_file_type_not_allowed: \"{{name}}: Tipo de ficheiro não permitido\",\n media_upload_failed: \"Falha no carregamento\",\n media_upload_files: \"Carregar Ficheiros\",\n media_drop_files: \"Solte ficheiros aqui ou clique para navegar\",\n media_max_file_size: \"Tamanho máximo de ficheiro: {{size}}\",\n media_selected_files_count: \"Ficheiros selecionados ({{count}})\",\n media_remove: \"Remover\",\n media_uploading: \"A carregar...\",\n media_manage_description: \"Gerir os seus ficheiros e recursos de média\",\n media_assets_count: \"{{count}} recursos\"\n};\n","import React, { useMemo, createContext, useContext, PropsWithChildren } from \"react\";\nimport { FireCMSPlugin, CMSView, useTranslation } from \"@firecms/core\";\nimport { MediaManagerConfig } from \"./types\";\nimport { MediaManagerProvider } from \"./MediaManagerProvider\";\nimport { useMediaManagerController } from \"./useMediaManagerController\";\nimport { MediaLibraryCard } from \"./components/MediaLibraryCard\";\nimport { MediaLibraryView } from \"./components/MediaLibraryView\";\nimport { mediaManagerTranslationsEn } from \"./locales/en\";\nimport { mediaManagerTranslationsEs } from \"./locales/es\";\nimport { mediaManagerTranslationsDe } from \"./locales/de\";\nimport { mediaManagerTranslationsFr } from \"./locales/fr\";\nimport { mediaManagerTranslationsIt } from \"./locales/it\";\nimport { mediaManagerTranslationsHi } from \"./locales/hi\";\nimport { mediaManagerTranslationsPt } from \"./locales/pt\";\n\nconst DEFAULT_STORAGE_PATH = \"media\";\nconst DEFAULT_COLLECTION_PATH = \"media_assets\";\n\nexport interface MediaManagerPluginProps extends MediaManagerConfig { }\n\n// Context to store the config\nconst MediaManagerConfigContext = createContext<MediaManagerConfig | null>(null);\n\nfunction useMediaManagerConfig(): MediaManagerConfig {\n const config = useContext(MediaManagerConfigContext);\n if (!config) {\n throw new Error(\"useMediaManagerConfig must be used within MediaManagerConfigProvider\");\n }\n return config;\n}\n\n/**\n * Internal wrapper that reads config from context\n */\nfunction MediaLibraryViewInternal() {\n const config = useMediaManagerConfig();\n const controller = useMediaManagerController({\n storageSource: config.storageSource,\n dataSourceDelegate: config.dataSourceDelegate,\n storagePath: config.storagePath ?? DEFAULT_STORAGE_PATH,\n collectionPath: config.collectionPath ?? DEFAULT_COLLECTION_PATH,\n bucket: config.bucket,\n thumbnailSizes: config.thumbnailSizes,\n thumbnailPath: config.thumbnailPath\n });\n\n return (\n <MediaManagerProvider controller={controller}>\n <MediaLibraryView\n maxFileSize={config.maxFileSize}\n acceptedMimeTypes={config.acceptedMimeTypes}\n />\n </MediaManagerProvider>\n );\n}\n\n/**\n * Build the media view - this is a static object that doesn't change\n */\nfunction buildMediaView(): CMSView {\n return {\n path: \"media\",\n name: \"Media Library\",\n description: \"Manage your media files\",\n group: \"Media\",\n icon: \"perm_media\",\n view: <MediaLibraryViewInternal />\n };\n}\n\n// Removed static MEDIA_VIEW because it depends on translation\n\n/**\n * Hook to create the Media Manager plugin for FireCMS.\n *\n * The plugin automatically registers the Media Library view in the navigation.\n *\n * @example\n * ```tsx\n * const { plugin: mediaManagerPlugin } = useMediaManagerPlugin({\n * storageSource,\n * dataSourceDelegate: firestoreDelegate,\n * storagePath: \"media\",\n * collectionPath: \"media_assets\"\n * });\n *\n * // Add plugin to your plugins array - view is auto-registered\n * const plugins = [mediaManagerPlugin, ...otherPlugins];\n * ```\n */\nexport function useMediaManagerPlugin(props: MediaManagerPluginProps): FireCMSPlugin {\n const mediaView = useMemo(() => buildMediaView(), []);\n\n return useMemo(() => ({\n key: \"media_manager\",\n views: [mediaView],\n provider: {\n Component: ({ children }: PropsWithChildren) => (\n <MediaManagerConfigContext.Provider value={props}>\n {children}\n </MediaManagerConfigContext.Provider>\n )\n },\n i18n: {\n en: mediaManagerTranslationsEn,\n es: mediaManagerTranslationsEs,\n de: mediaManagerTranslationsDe,\n fr: mediaManagerTranslationsFr,\n it: mediaManagerTranslationsIt,\n hi: mediaManagerTranslationsHi,\n pt: mediaManagerTranslationsPt\n }\n } satisfies FireCMSPlugin), []);\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Card,\n Typography,\n cls,\n ImageIcon\n} from \"@firecms/ui\";\nimport { useTranslation } from \"@firecms/core\";\n\nexport interface MediaLibraryCardProps {\n group?: string;\n context?: unknown;\n}\n\n/**\n * Card component displayed on the home page that links to the Media Library.\n */\nexport function MediaLibraryCard({ group }: MediaLibraryCardProps) {\n const { t } = useTranslation();\n\n // Only render in the \"Media\" group\n if (group !== \"Media\") return null;\n\n return (\n <Link to=\"/media\" className=\"no-underline\">\n <Card\n className={cls(\n \"p-4 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-accent-800\",\n \"transition-colors duration-200\",\n \"flex flex-col gap-2\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className={cls(\n \"w-10 h-10 rounded-lg\",\n \"bg-primary/10 dark:bg-primary/20\",\n \"flex items-center justify-center\"\n )}>\n <ImageIcon className=\"text-primary\" size=\"medium\" />\n </div>\n <div className=\"flex-1\">\n <Typography variant=\"subtitle2\" className=\"font-medium\">\n {t(\"media_library\")}\n </Typography>\n <Typography\n variant=\"caption\"\n className=\"text-surface-accent-600 dark:text-surface-accent-400\"\n >\n {t(\"media_library_description\")}\n </Typography>\n </div>\n </div>\n </Card>\n </Link>\n );\n}\n"],"names":["MediaManagerContext","createContext","undefined","useMediaManager","context","useContext","Error","MediaManagerProvider","t0","$","_c","controller","children","t1","DEFAULT_THUMBNAIL_PATH","useMediaManagerController","storageSource","dataSourceDelegate","storagePath","collectionPath","bucket","thumbnailSizes","thumbnailPath","loading","setLoading","useState","error","setError","assets","setAssets","selectedAsset","setSelectedAsset","searchQuery","setSearchQuery","fetchDownloadURL","useCallback","asset","downloadConfig","getDownloadURL","downloadURL","url","err","console","warn","refreshAssets","log","entities","fetchCollection","path","orderBy","order","length","loadedAssets","Promise","all","map","entity","values","baseAsset","id","fileName","mimeType","size","dimensions","title","altText","caption","tags","createdAt","Date","toDate","updatedAt","startsWith","String","useEffect","uploadFile","file","metadata","name","uploadResult","type","getImageDimensions","thumbnails","isRasterImage","s","thumbnailBlob","generateThumbnail","width","height","quality","thumbFileName","now","thumbPath","thumbUploadResult","File","thumbDownloadConfig","assetData","Object","keys","saveEntity","status","newAsset","prev","deleteAsset","assetId","find","a","deleteFile","deleteEntity","filter","updateAsset","data","cleanData","entries","forEach","key","value","entityId","previousValues","searchAssets","query","selectAsset","filteredAssets","toLowerCase","includes","some","tag","totalCount","resolve","reject","img","Image","onload","URL","revokeObjectURL","src","onerror","createObjectURL","maxWidth","maxHeight","Compressor","success","result","MediaAssetCard","viewMode","onClick","selected","thumbnailSize","t2","isImage","isVideo","isAudio","FileIcon","ImageIcon","VideoLibraryIcon","AudiotrackIcon","DescriptionIcon","formatSize","_temp","imageUrl","t3","thumbnail","t4","t5","cls","defaultBorderMixin","t6","t7","t8","t9","t10","split","toUpperCase","t11","t12","t13","t14","Symbol","for","t15","bytes","toFixed","MediaAssetDetails","onClose","onUpdate","onDelete","snackbarController","useSnackbarController","useStorageSource","saving","setSaving","deleting","setDeleting","deleteDialogOpen","setDeleteDialogOpen","tagInput","setTagInput","t","useTranslation","setFieldValue","dirty","useCreateFormex","initialValues","handleSave","open","message","handleDelete","handleDownload","window","handleAddTag","trim","handleRemoveTag","tagToRemove","formatDate","date","Intl","DateTimeFormat","year","month","day","format","e","target","preventDefault","MediaUploadDialog","onUpload","maxFileSize","acceptedMimeTypes","isDragging","setIsDragging","uploading","setUploading","selectedFiles","setSelectedFiles","validateFiles","files","valid","errors","push","endsWith","slice","handleDragOver","handleDragLeave","handleDrop","Array","from","dataTransfer","join","handleFileSelect","handleRemoveFile","index","_","i","handleUpload","handleClose","document","getElementById","click","count","toString","stopPropagation","MediaLibraryView","uploadDialogOpen","setUploadDialogOpen","setViewMode","useRef","handleSearch","handleUploadClick","handleRefresh","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","mediaManagerTranslationsEn","media_library","media_library_description","media_search_assets","media_grid_view","media_list_view","media_refresh","media_upload","media_error_loading","media_try_again","media_no_assets","media_upload_first_file","media_asset_updated","media_error_updating","media_asset_deleted","media_error_deleting","media_error_getting_url","media_preview_not_available","media_dimensions","media_size","media_type","media_created","media_file_name","media_title","media_alt_text","media_recommended_seo","media_caption","media_tags","media_add_tag","media_add","media_save_changes","media_delete_asset","media_delete_confirmation","media_file_too_large","media_file_type_not_allowed","media_upload_failed","media_upload_files","media_drop_files","media_max_file_size","media_selected_files_count","media_remove","media_uploading","media_manage_description","media_assets_count","mediaManagerTranslationsEs","mediaManagerTranslationsDe","mediaManagerTranslationsFr","mediaManagerTranslationsIt","mediaManagerTranslationsHi","mediaManagerTranslationsPt","DEFAULT_STORAGE_PATH","DEFAULT_COLLECTION_PATH","MediaManagerConfigContext","useMediaManagerConfig","config","MediaLibraryViewInternal","buildMediaView","description","group","icon","view","useMediaManagerPlugin","props","mediaView","useMemo","views","provider","Component","i18n","en","es","de","fr","it","hi","pt","MediaLibraryCard"],"mappings":"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"}
|