@strapi/upload 5.60.0 → 5.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js +29 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
- package/dist/admin/components/Drawer.js +12 -7
- package/dist/admin/components/Drawer.js.map +1 -1
- package/dist/admin/components/Drawer.mjs +12 -7
- package/dist/admin/components/Drawer.mjs.map +1 -1
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +5 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +5 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +37 -27
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +37 -27
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
- package/dist/admin/index.js +10 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +10 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +2 -2
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
- package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/Drawer.d.ts +8 -0
- package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
- package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
- package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
- package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
- package/dist/admin/translations/en.json.js +4 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +4 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/audit-logs.js +264 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +255 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +4 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +4 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js +23 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +23 -1
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/services/folder.js +48 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +48 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +12 -5
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +12 -5
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js +100 -16
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +102 -18
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +142 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -3
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +3 -3
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -3
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/package.json +9 -16
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Images } from '@strapi/icons';
|
|
2
2
|
import pluginPkg from './package.json.mjs';
|
|
3
|
+
import { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog.mjs';
|
|
4
|
+
import { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone.mjs';
|
|
3
5
|
import { MediaLibraryInput as MediaLibraryInput$1 } from './components/MediaLibraryInput/MediaLibraryInput.mjs';
|
|
4
6
|
import { UploadProgressDialog } from './components/UploadProgressDialog.mjs';
|
|
5
7
|
import { PERMISSIONS } from './constants.mjs';
|
|
@@ -77,6 +79,12 @@ const admin = {
|
|
|
77
79
|
{
|
|
78
80
|
name: 'future-global::upload-progress',
|
|
79
81
|
Component: UploadProgressDialog
|
|
82
|
+
},
|
|
83
|
+
// Lets the Blocks editor take files dropped onto it. Not registered on the
|
|
84
|
+
// legacy Media Library, which has no upload progress dialog to report to.
|
|
85
|
+
{
|
|
86
|
+
name: 'media-library-file-drop-zone',
|
|
87
|
+
Component: EditorFileDropZone
|
|
80
88
|
}
|
|
81
89
|
]);
|
|
82
90
|
}
|
|
@@ -102,10 +110,11 @@ const admin = {
|
|
|
102
110
|
type: 'media',
|
|
103
111
|
Component: isLegacyMediaLibrary ? MediaLibraryInput : MediaLibraryInput$1
|
|
104
112
|
});
|
|
113
|
+
// The picker the Wysiwyg and Blocks editors insert images with.
|
|
105
114
|
app.addComponents([
|
|
106
115
|
{
|
|
107
116
|
name: 'media-library',
|
|
108
|
-
Component: MediaLibraryDialog
|
|
117
|
+
Component: isLegacyMediaLibrary ? MediaLibraryDialog : MediaLibraryPickerDialog
|
|
109
118
|
}
|
|
110
119
|
]);
|
|
111
120
|
app.registerPlugin({
|
package/dist/admin/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAMA,IAAAA,GAAOC,SAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC,MAAMG,KAAAA,GAAkC;AACtCC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrB;;;;;QAMA,MAAMC,uBAAuBC,MAAAA,CAAOL,MAAM,CAACM,YAAY,CAACC,SAAS,CAAC,uBAAA,CAAA;AAElEJ,QAAAA,GAAAA,CAAIK,WAAW,CAAC;YACdC,EAAAA,EAAI,CAAC,QAAQ,EAAEC,QAAAA,CAAAA,CAAU;YACzBC,IAAAA,EAAMC,MAAAA;YACNC,SAAAA,EAAW;gBACTC,EAAAA,EAAI,CAAA,EAAGJ,QAAAA,CAAS,YAAY,CAAC;gBAC7BK,cAAAA,EAAgB;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,YAAYC,IAAI;AAC7BC,YAAAA,SAAAA,EAAWf,oBAAAA,GACP,IAAA;AACE,gBAAA,OAAO,OAAO,4BAAA,CAAA,CAA0BgB,IAAI,CAAC,CAACC,OAAS;AAAEC,wBAAAA,OAAAA,EAASD,IAAIE;qBAAO,CAAA,CAAA;YAC/E,CAAA,GACA,IAAA;AACE,gBAAA,OAAO,OAAO,WAAA,CAAA,CAASH,IAAI,CAAC,CAACC,OAAS;AACpCC,wBAAAA,OAAAA,EAASD,IAAIG;qBACf,CAAA,CAAA;AACF,YAAA,CAAA;YACJC,QAAAA,EAAU;AACZ,SAAA,CAAA;AAEA,QAAA,IAAI,CAACrB,oBAAAA,EAAsB;AACzBD,YAAAA,GAAAA,CAAIuB,WAAW,CAAC;gBAAEC,cAAAA,EAAgBC;AAAsB,aAAA,CAAA;AAExDzB,YAAAA,GAAAA,CAAI0B,aAAa,CAAC;AAChB,gBAAA;oBACE/B,IAAAA,EAAM,gCAAA;oBACNqB,SAAAA,EAAWW;AACb,iBAAA;;;AAGA,gBAAA;oBACEhC,IAAAA,EAAM,8BAAA;oBACNqB,SAAAA,EAAWY;AACb;AACD,aAAA,CAAA;AACH,QAAA;QAEA5B,GAAAA,CAAI6B,eAAe,CAAC,QAAA,EAAU;YAC5BlB,EAAAA,EAAI,wBAAA;YACJL,EAAAA,EAAI,eAAA;YACJI,SAAAA,EAAW;AACTC,gBAAAA,EAAAA,EAAImB,iBAAAA,CAAkB,aAAA,CAAA;gBACtBlB,cAAAA,EAAgB;AAClB,aAAA;AACAI,YAAAA,SAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAO,OAAO,uCAAA,CAAA,CAAqCC,IAAI,CAAC,CAACC,OAAS;AAChEC,wBAAAA,OAAAA,EAASD,IAAIa;qBACf,CAAA,CAAA;AACF,YAAA,CAAA;AACAlB,YAAAA,WAAAA,EAAaC,YAAYkB;AAC3B,SAAA,CAAA;AAEA;;;;QAKAhC,GAAAA,CAAIiC,SAAS,CAAC;YACZC,IAAAA,EAAM,OAAA;AACNlB,YAAAA,SAAAA,EAAWf,uBACNkC,iBAAAA,GACAC;AACP,SAAA,CAAA;;AAEApC,QAAAA,GAAAA,CAAI0B,aAAa,CAAC;AAChB,YAAA;gBACE/B,IAAAA,EAAM,eAAA;AACNqB,gBAAAA,SAAAA,EAAWf,uBACNoC,kBAAAA,GACAC;AACP;AACD,SAAA,CAAA;AAEDtC,QAAAA,GAAAA,CAAIuC,cAAc,CAAC;YACjB5B,EAAAA,EAAIJ,QAAAA;AACJZ,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACA,MAAM6C,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1C7B,IAAI,CAAC,CAAC,EAAEE,OAAAA,EAAS4B,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAAA,EAAMxC,QAAAA,CAAAA;AACrCuC,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCG,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPD,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQO,OAAO,CAACR,aAAAA,CAAAA;AACzB,IAAA;AACF;;;;"}
|
|
@@ -542,7 +542,7 @@ const AssetsPage = ()=>{
|
|
|
542
542
|
onClose: ()=>setIsUrlDialogOpen(false),
|
|
543
543
|
onUpload: handleUrlUpload
|
|
544
544
|
}),
|
|
545
|
-
/*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.
|
|
545
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.AssetDetailsDrawerFromUrl, {})
|
|
546
546
|
]
|
|
547
547
|
});
|
|
548
548
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsPage.js","sources":["../../../../admin/src/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport { Layouts, Page, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, MenuItem, SimpleMenu, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, Files, Folder as FolderIcon, Link } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking';\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport { buildItemLocations } from '../../utils/itemLocations';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsSearchInput } from './components/AssetsSearchInput';\nimport { AssetsView } from './components/AssetsView';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { FilterBadges } from './components/FilterBadges';\nimport { FilterMenu } from './components/FilterMenu';\nimport { FolderFormDialog } from './components/FolderFormDialog';\nimport { FOLDER_TREE_ROOT_SELECTOR, FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { MainAreaContextMenu } from './components/MainAreaContextMenu';\nimport { SortMenu } from './components/SortMenu';\nimport { ViewToggle } from './components/ViewToggle';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useAssetsList } from './hooks/useAssetsList';\nimport { BusyAssetsProvider } from './hooks/useBusyAssets';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useListScrollRestoration } from './hooks/useListScrollRestoration';\nimport { getListQueryKey } from './utils/listQueryKey';\n\nimport type { UploadFileInfo } from '../../../../shared/contracts/files';\n\n// Module-level so the header sentinel's observer isn't rebuilt every render.\nconst HEADER_SENTINEL_OPTIONS: IntersectionObserverInit = { threshold: 0 };\n\nconst ITEM_COUNT_MESSAGE = {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n};\n\nconst SEARCH_RESULTS_COUNT_MESSAGES = {\n both: {\n id: getTranslationKey('header.search-results.count'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}',\n },\n folders: {\n id: getTranslationKey('header.search-results.count.folders'),\n defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}',\n },\n assets: {\n id: getTranslationKey('header.search-results.count.assets'),\n defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}',\n },\n};\n\nconst getSearchResultsCountMessage = (numberFolders: number, numberAssets: number) => {\n if (numberFolders === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.assets;\n }\n\n if (numberAssets === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.folders;\n }\n\n return SEARCH_RESULTS_COUNT_MESSAGES.both;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists), and\n * neither does the table/grid toggle — both views render the same list.\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n// A single sticky header — same layout scrolled or not, so the toolbar\n// alignment can't reflow the way the shared sticky header did. Once the list\n// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it\n// off the rows), like the sticky headers elsewhere in the admin. Horizontal\n// padding stays responsive (passed as props); only the vertical rhythm + shadow\n// change here so they can animate.\nconst StickyHeader = styled(Box)<{ $compact: boolean }>`\n position: sticky;\n top: 0;\n z-index: 2;\n /* Transparent at rest (the grey page shows through); an opaque background +\n shadow appear only once it sticks and content scrolls under it. */\n background: transparent;\n /* Horizontal padding matches the list's default spacing (Layouts.Content /\n RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */\n padding: ${({ theme }) => `${theme.spaces[6]} ${theme.spaces[4]}`};\n transition:\n padding 0.2s ease,\n background 0.2s ease,\n box-shadow 0.2s ease;\n\n ${({ theme }) => theme.breakpoints.medium} {\n padding-left: ${({ theme }) => theme.spaces[6]};\n padding-right: ${({ theme }) => theme.spaces[6]};\n }\n ${({ theme }) => theme.breakpoints.large} {\n padding-left: ${({ theme }) => theme.spaces[10]};\n padding-right: ${({ theme }) => theme.spaces[10]};\n }\n\n /* Compacting is scoped to medium and up, where the header actually sticks. On\n mobile it scrolls away with the list, so shrinking it mid-scroll animated a\n header the user could no longer see — the transition read as a glitch on the\n way back up rather than as the header settling. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n padding-top: ${theme.spaces[3]};\n padding-bottom: ${theme.spaces[3]};\n padding-left: ${theme.spaces[4]};\n padding-right: ${theme.spaces[4]};\n background: ${theme.colors.neutral0};\n box-shadow: ${theme.shadows.tableShadow};\n }\n ${theme.breakpoints.large} {\n padding-left: ${theme.spaces[6]};\n padding-right: ${theme.spaces[6]};\n }\n `}\n`;\n\n// New button aligns with the title, not the toolbar.\nconst TitleRow = styled(Flex)`\n justify-content: space-between;\n align-items: flex-start;\n gap: ${({ theme }) => theme.spaces[4]};\n\n h1 {\n font-size: 1.8rem;\n }\n`;\n\n// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —\n// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,\n// Filter+Search on the left, Sort+Toggle pushed right.\nconst Toolbar = styled(Flex)<{ $compact: boolean }>`\n margin-top: ${({ theme }) => theme.spaces[5]};\n flex-direction: column;\n align-items: stretch;\n gap: ${({ theme }) => theme.spaces[3]};\n transition: margin-top 0.2s ease;\n\n /* Tightening the gap to the title belongs to the compact header, so it is\n scoped to the breakpoints that compact. On mobile the header never sticks,\n and this was the last thing still shifting as the page scrolled. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n margin-top: ${theme.spaces[2]};\n }\n `}\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[3]};\n`;\n\n// Filter + Search. On mobile the group fills the row (search grows into it);\n// on desktop it keeps its intrinsic size and sits at the left edge.\nconst FilterSearchGroup = styled(ToolbarGroup)``;\n\n// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).\n// Desktop: sit together at the right edge (space-between on the toolbar leaves\n// the empty space between the search and here).\nconst SortToggleGroup = styled(ToolbarGroup)`\n justify-content: space-between;\n\n ${({ theme }) => theme.breakpoints.large} {\n justify-content: flex-end;\n flex: 0 0 auto;\n }\n`;\n\n// Fills the row on mobile; intrinsic width on desktop.\nconst SearchSlot = styled(Box)`\n flex: 1;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex: 0 1 auto;\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n const { canCreate, canUpdate } = useMediaLibraryPermissions();\n\n const {\n currentFolderId,\n navigateToFolderId,\n searchQuery,\n isSearching,\n clearSearch,\n listSort,\n listFilters,\n assets,\n subscribers: assetPageSubscribers,\n pagination,\n isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n assetsError,\n folders,\n isLoadingFolders,\n } = useAssetsList();\n const { title, itemCount } = useFolderInfo(currentFolderId);\n\n // Both move affordances (drag and the bulk bar) resolve each item's parent\n // from the rows on screen — while searching, results are global and the\n // folder currently open says nothing about where an item lives.\n const itemLocations = useMemo(() => buildItemLocations(assets, folders), [assets, folders]);\n\n const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, { count: itemCount });\n\n const searchResultsTitle = formatMessage(\n {\n id: getTranslationKey('header.search-results'),\n defaultMessage: 'Search results for \"{query}\"',\n },\n { query: searchQuery }\n );\n const numberFolders = folders.length;\n const numberAssets = pagination?.total ?? 0;\n\n const searchResultsCountLabel = formatMessage(\n getSearchResultsCountMessage(numberFolders, numberAssets),\n { numberFolders, numberAssets }\n );\n\n let pageHeaderTitle: string;\n if (isSearching) {\n pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;\n } else if (title) {\n pageHeaderTitle = `${title} (${itemCountLabel})`;\n } else {\n pageHeaderTitle = formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n }\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Shrink the sticky header once the list scrolls beneath it. A zero-height\n // sentinel sits at the very top of the scroll content; when it leaves the\n // viewport we're scrolled → compact.\n const [isHeaderCompact, setIsHeaderCompact] = useState(false);\n const onHeaderSentinelVisibility = useCallback(\n (isVisible: boolean) => setIsHeaderCompact(!isVisible),\n []\n );\n const headerSentinelRef = useElementOnScreen<HTMLDivElement>(\n onHeaderSentinelVisibility,\n HEADER_SENTINEL_OPTIONS\n );\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // `concurrentUploadRequests` echoes the app config. Missing settings (still\n // loading, no permission) fall back to sequential — never faster than the\n // server asked for.\n const { data: settings } = useGetUploadSettingsQuery();\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n // Drives the post-upload AI metadata phase shown per row in the progress\n // dialog. No mime argument: the files are not known until they are picked,\n // and the server filters the batch on the same allowlist anyway.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n const { trackUsage } = useTracking();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n // Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files\n // about to upload, broken down by asset type.\n const assetsCountByType = files.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('willAddMediaLibraryAssets', {\n location: MEDIA_LIBRARY_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({\n formData,\n totalFiles: files.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n // Defence in depth: the provider is `disabled` without `assets.create`\n // (so onDrop won't fire), but guard here too in case it's ever wired live.\n if (!canCreate) return;\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n trackUsage('didSelectFile', { source: 'url', location: MEDIA_LIBRARY_LOCATION });\n // Counts-by-type aren't available client-side for the URL flow (the server\n // fetches the files), so this fires the event with location only.\n trackUsage('willAddMediaLibraryAssets', { location: MEDIA_LIBRARY_LOCATION });\n try {\n await uploadFromUrls({\n urls,\n folderId: currentFolderId,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: searchQuery,\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: listFilters.serialized || null,\n });\n\n const scrollAnchorRef = useListScrollRestoration(listQueryKey);\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop} disabled={!canCreate}>\n <AssetSelectionProvider disabled={!canUpdate}>\n <BusyAssetsProvider>\n <AssetsDndProvider locations={itemLocations}>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Layouts.Root\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n showActiveFolder={!isSearching}\n onSelectFolder={navigateToFolderId}\n backgroundContextMenu={\n <MainAreaContextMenu\n disabled={!canCreate}\n containerSelector={FOLDER_TREE_ROOT_SELECTOR}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n }\n />\n }\n >\n <Page.Main>\n <Box ref={uploadDropZoneRef}>\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n {/* Zero-height marker: leaves the viewport as soon as the list\n scrolls, flipping the header into its compact state. */}\n <Box ref={headerSentinelRef} height={0} aria-hidden />\n <Box ref={scrollAnchorRef} height={0} aria-hidden />\n\n {/* Renders no wrapper: it listens on the scrolling column\n itself, so the header band and the padding below the list\n are both in the hit area. Interactive controls, the table\n header row and the list items are excluded — see\n MainAreaContextMenu. */}\n <MainAreaContextMenu\n disabled={!canCreate}\n locations={itemLocations}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n <StickyHeader $compact={isHeaderCompact}>\n <TitleRow>\n <Typography variant=\"alpha\" tag=\"h1\">\n {pageHeaderTitle}\n </Typography>\n {canCreate && (\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<FolderIcon />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'File upload',\n })}\n </MenuItem>\n <MenuItem\n onSelect={() => setIsUrlDialogOpen(true)}\n startIcon={<Link />}\n >\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'File upload from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n )}\n </TitleRow>\n\n <Toolbar $compact={isHeaderCompact}>\n <FilterSearchGroup>\n <Box>\n <FilterMenu listFilters={listFilters} />\n </Box>\n <SearchSlot>\n <AssetsSearchInput />\n </SearchSlot>\n </FilterSearchGroup>\n <SortToggleGroup>\n <Box>\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n </Box>\n <ViewToggle view={view} onChange={setView} />\n </SortToggleGroup>\n </Toolbar>\n\n <FilterBadges listFilters={listFilters} compact={isHeaderCompact} />\n </StickyHeader>\n\n <Layouts.Content>\n {/* Renders nothing — keeps every loaded page's query subscribed\n so a rename/delete refreshes the whole list. */}\n {assetPageSubscribers}\n <DropZoneWithOverlay>\n <DropFilesMessage\n uploadDropZoneRef={uploadDropZoneRef}\n folderName={title}\n />\n <AssetsView\n view={view}\n folders={folders}\n isLoadingFolders={isLoadingFolders}\n assets={assets}\n isLoadingAssets={isLoadingAssets}\n isFetchingMore={isFetchingMore}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n error={assetsError}\n locations={itemLocations}\n searchQuery={searchQuery}\n assetsSort={listSort.assetsSort}\n foldersPosition={listSort.foldersPosition}\n hasActiveFilters={listFilters.filters.length > 0}\n onClearFilters={listFilters.clearFilters}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n canAddAssets={canCreate}\n onClearSearch={clearSearch}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Box>\n </Page.Main>\n </Layouts.Root>\n </AssetsDndProvider>\n </BusyAssetsProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <FolderFormDialog\n open={isCreateFolderDialogOpen}\n mode=\"create\"\n parentFolderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["HEADER_SENTINEL_OPTIONS","threshold","ITEM_COUNT_MESSAGE","id","getTranslationKey","defaultMessage","SEARCH_RESULTS_COUNT_MESSAGES","both","folders","assets","getSearchResultsCountMessage","numberFolders","numberAssets","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StickyHeader","styled","Box","theme","spaces","breakpoints","medium","large","$compact","css","colors","neutral0","shadows","tableShadow","TitleRow","Flex","Toolbar","ToolbarGroup","FilterSearchGroup","SortToggleGroup","SearchSlot","AssetsPage","formatMessage","useIntl","openDetails","useAssetDetailsParam","canCreate","canUpdate","useMediaLibraryPermissions","currentFolderId","navigateToFolderId","searchQuery","isSearching","clearSearch","listSort","listFilters","subscribers","assetPageSubscribers","pagination","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","assetsError","isLoadingFolders","useAssetsList","title","itemCount","useFolderInfo","itemLocations","useMemo","buildItemLocations","itemCountLabel","count","searchResultsTitle","query","length","total","searchResultsCountLabel","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","isHeaderCompact","setIsHeaderCompact","onHeaderSentinelVisibility","useCallback","isVisible","headerSentinelRef","useElementOnScreen","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","data","settings","useGetUploadSettingsQuery","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","trackUsage","useTracking","uploadFilesToFolder","files","folderId","assetsCountByType","reduce","acc","file","type","typeFromMime","location","MEDIA_LIBRARY_LOCATION","formData","FormData","fileInfoArray","forEach","append","push","name","caption","alternativeText","folder","JSON","stringify","totalFiles","generateAiMetadata","Boolean","unwrap","handleFileSelect","current","click","handleFileChange","e","target","source","Array","from","value","handleDrop","handleUrlUpload","urls","getListQueryKey","search","sort","assetsSort","foldersPosition","filter","serialized","scrollAnchorRef","useListScrollRestoration","_jsxs","_Fragment","_jsx","UploadDropZoneProvider","onDrop","disabled","AssetSelectionProvider","BusyAssetsProvider","AssetsDndProvider","locations","Layouts","Root","sideNav","FolderTree","showActiveFolder","onSelectFolder","backgroundContextMenu","MainAreaContextMenu","containerSelector","FOLDER_TREE_ROOT_SELECTOR","onCreateFolder","onImportFiles","onImportFromUrl","Page","Main","ref","VisuallyHidden","input","onChange","multiple","height","aria-hidden","Typography","variant","tag","SimpleMenu","popoverPlacement","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","FolderIcon","Files","Link","FilterMenu","AssetsSearchInput","SortMenu","showFoldersGroup","ViewToggle","FilterBadges","compact","Content","DropZoneWithOverlay","DropFilesMessage","folderName","AssetsView","error","hasActiveFilters","filters","onClearFilters","clearFilters","onAssetItemClick","onAddAssets","canAddAssets","onClearSearch","FolderFormDialog","open","mode","parentFolderName","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA;AACA,MAAMA,uBAAAA,GAAoD;IAAEC,SAAAA,EAAW;AAAE,CAAA;AAEzE,MAAMC,kBAAAA,GAAqB;AACzBC,IAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,2BAAA,CAAA;IACtBC,cAAAA,EAAgB;AAClB,CAAA;AAEA,MAAMC,6BAAAA,GAAgC;IACpCC,IAAAA,EAAM;AACJJ,QAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,6BAAA,CAAA;QACtBC,cAAAA,EACE;AACJ,KAAA;IACAG,OAAAA,EAAS;AACPL,QAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,qCAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA;IACAI,MAAAA,EAAQ;AACNN,QAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,oCAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB;AACF,CAAA;AAEA,MAAMK,4BAAAA,GAA+B,CAACC,aAAAA,EAAuBC,YAAAA,GAAAA;AAC3D,IAAA,IAAID,kBAAkB,CAAA,EAAG;AACvB,QAAA,OAAOL,8BAA8BG,MAAM;AAC7C,IAAA;AAEA,IAAA,IAAIG,iBAAiB,CAAA,EAAG;AACtB,QAAA,OAAON,8BAA8BE,OAAO;AAC9C,IAAA;AAEA,IAAA,OAAOF,8BAA8BC,IAAI;AAC3C,CAAA;AAiBA,MAAMM,sBAAAA,GAAyB,CAAC,EAAEC,YAAY,EAA+B,GAAA;IAC3E,MAAM,EAAEC,KAAK,EAAE,GAAGC,mCAAAA,EAAAA;IAElBC,eAAAA,CAAU,IAAA;AACRF,QAAAA,KAAAA,EAAAA;IACF,CAAA,EAAG;AAACD,QAAAA,YAAAA;AAAcC,QAAAA;AAAM,KAAA,CAAA;IAExB,OAAO,IAAA;AACT,CAAA;AAEA;;AAEkG;AAGlG;AACA;AACA;AACA;AACA;AACA,MAAMG,YAAAA,GAAeC,uBAAAA,CAAOC,gBAAAA,CAA2B;;;;;;;;;AAS5C,WAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMC,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;;;;;;EAMlE,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,WAAW,CAACC,MAAM,CAAC;kBAC1B,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;mBAChC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;EAElD,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,WAAW,CAACE,KAAK,CAAC;kBACzB,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,EAAA,CAAG,CAAC;mBACjC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,EAAA,CAAG,CAAC;;;;;;;EAOnD,EAAE,CAAC,EAAEI,QAAQ,EAAEL,KAAK,EAAE,GACpBK,QAAAA,IACAC,oBAAG;AACD,MAAA,EAAEN,KAAAA,CAAME,WAAW,CAACC,MAAM,CAAC;AACZ,qBAAA,EAAEH,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACf,wBAAA,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACpB,sBAAA,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACjB,uBAAA,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACrB,oBAAA,EAAED,KAAAA,CAAMO,MAAM,CAACC,QAAQ,CAAC;AACxB,oBAAA,EAAER,KAAAA,CAAMS,OAAO,CAACC,WAAW,CAAC;;AAE1C,MAAA,EAAEV,KAAAA,CAAME,WAAW,CAACE,KAAK,CAAC;AACV,sBAAA,EAAEJ,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACjB,uBAAA,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;AAErC,IAAA,CAAC;AACL,CAAC;AAED;AACA,MAAMU,QAAAA,GAAWb,uBAAAA,CAAOc,iBAAAA,CAAK;;;OAGtB,EAAE,CAAC,EAAEZ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;;;;AAKxC,CAAC;AAED;AACA;AACA;AACA,MAAMY,OAAAA,GAAUf,uBAAAA,CAAOc,iBAAAA,CAA4B;cACrC,EAAE,CAAC,EAAEZ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;;OAGxC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;;;;;EAMtC,EAAE,CAAC,EAAEI,QAAQ,EAAEL,KAAK,EAAE,GACpBK,QAAAA,IACAC,oBAAG;AACD,MAAA,EAAEN,KAAAA,CAAME,WAAW,CAACC,MAAM,CAAC;AACb,oBAAA,EAAEH,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;AAElC,IAAA,CAAC;;EAEH,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,WAAW,CAACE,KAAK,CAAC;;;;;AAK3C,CAAC;AAED,MAAMU,YAAAA,GAAehB,uBAAAA,CAAOc,iBAAAA,CAAK;;OAE1B,EAAE,CAAC,EAAEZ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AACxC,CAAC;AAED;AACA;AACA,MAAMc,iBAAAA,GAAoBjB,uBAAAA,CAAOgB,YAAAA,CAAa,CAAC,CAAC;AAEhD;AACA;AACA;AACA,MAAME,eAAAA,GAAkBlB,uBAAAA,CAAOgB,YAAAA,CAAa;;;EAG1C,EAAE,CAAC,EAAEd,KAAK,EAAE,GAAKA,KAAAA,CAAME,WAAW,CAACE,KAAK,CAAC;;;;AAI3C,CAAC;AAED;AACA,MAAMa,UAAAA,GAAanB,uBAAAA,CAAOC,gBAAAA,CAAI;;;EAG5B,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAME,WAAW,CAACE,KAAK,CAAC;;;AAG3C,CAAC;MAEYc,UAAAA,GAAa,IAAA;IACxB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,WAAW,EAAE,GAAGC,uCAAAA,EAAAA;AACxB,IAAA,MAAM,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAGC,qDAAAA,EAAAA;AAEjC,IAAA,MAAM,EACJC,eAAe,EACfC,kBAAkB,EAClBC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACRC,WAAW,EACX5C,MAAM,EACN6C,WAAAA,EAAaC,oBAAoB,EACjCC,UAAU,EACVC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,aAAa,EACbC,WAAW,EACXrD,OAAO,EACPsD,gBAAgB,EACjB,GAAGC,2BAAAA,EAAAA;AACJ,IAAA,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGC,2BAAAA,CAAcnB,eAAAA,CAAAA;;;;AAK3C,IAAA,MAAMoB,eAAAA,GAAgBC,aAAAA,CAAQ,IAAMC,gCAAAA,CAAmB5D,QAAQD,OAAAA,CAAAA,EAAU;AAACC,QAAAA,MAAAA;AAAQD,QAAAA;AAAQ,KAAA,CAAA;IAE1F,MAAM8D,cAAAA,GAAiB9B,cAActC,kBAAAA,EAAoB;QAAEqE,KAAAA,EAAON;AAAU,KAAA,CAAA;AAE5E,IAAA,MAAMO,qBAAqBhC,aAAAA,CACzB;AACErC,QAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,uBAAA,CAAA;QACtBC,cAAAA,EAAgB;KAClB,EACA;QAAEoE,KAAAA,EAAOxB;AAAY,KAAA,CAAA;IAEvB,MAAMtC,aAAAA,GAAgBH,QAAQkE,MAAM;IACpC,MAAM9D,YAAAA,GAAe4C,YAAYmB,KAAAA,IAAS,CAAA;AAE1C,IAAA,MAAMC,uBAAAA,GAA0BpC,aAAAA,CAC9B9B,4BAAAA,CAA6BC,aAAAA,EAAeC,YAAAA,CAAAA,EAC5C;AAAED,QAAAA,aAAAA;AAAeC,QAAAA;AAAa,KAAA,CAAA;IAGhC,IAAIiE,eAAAA;AACJ,IAAA,IAAI3B,WAAAA,EAAa;AACf2B,QAAAA,eAAAA,GAAkB,GAAGL,kBAAAA,CAAmB,EAAE,EAAEI,uBAAAA,CAAwB,CAAC,CAAC;AACxE,IAAA,CAAA,MAAO,IAAIZ,KAAAA,EAAO;AAChBa,QAAAA,eAAAA,GAAkB,GAAGb,KAAAA,CAAM,EAAE,EAAEM,cAAAA,CAAe,CAAC,CAAC;IAClD,CAAA,MAAO;AACLO,QAAAA,eAAAA,GAAkBrC,aAAAA,CAAc;YAAErC,EAAAA,EAAI,aAAA;YAAeE,cAAAA,EAAgB;AAAa,SAAA,CAAA;AACpF,IAAA;AAEA,IAAA,MAAM,CAACyE,wBAAAA,EAA0BC,2BAAAA,CAA4B,GAAGC,cAAAA,CAAS,KAAA,CAAA;;IAGzE,MAAM,CAACC,MAAMC,OAAAA,CAAQ,GAAGC,+BAAmBC,0BAAAA,CAAiBH,IAAI,EAAEI,qBAAAA,CAAYC,IAAI,CAAA;IAClF,MAAMC,UAAAA,GAAaN,IAAAA,KAASI,qBAAAA,CAAYC,IAAI;;AAG5C,IAAA,MAAM,CAACE,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGT,cAAAA,CAAS,KAAA,CAAA;;AAGvD,IAAA,MAAMU,eAAeC,YAAAA,CAAyB,IAAA,CAAA;AAC9C,IAAA,MAAMC,oBAAoBD,YAAAA,CAAuB,IAAA,CAAA;;;;AAKjD,IAAA,MAAM,CAACE,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGd,cAAAA,CAAS,KAAA,CAAA;AACvD,IAAA,MAAMe,6BAA6BC,iBAAAA,CACjC,CAACC,YAAuBH,kBAAAA,CAAmB,CAACG,YAC5C,EAAE,CAAA;IAEJ,MAAMC,iBAAAA,GAAoBC,+BACxBJ,0BAAAA,EACA/F,uBAAAA,CAAAA;;IAIF,MAAM,CAACoG,YAAY,GAAGC,0BAAAA,EAAAA;IACtB,MAAM,CAACC,eAAe,GAAGC,6BAAAA,EAAAA;;;;AAIzB,IAAA,MAAM,EAAEC,IAAAA,EAAMC,UAAQ,EAAE,GAAGC,kCAAAA,EAAAA;IAC3B,MAAMC,WAAAA,GAAcF,UAAAA,EAAUD,IAAAA,EAAMI,wBAAAA,IAA4B,CAAA;;;;AAIhE,IAAA,MAAMC,mBAAAA,GAAsBC,yCAAAA,EAAAA;IAC5B,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;IAEvB,MAAMC,mBAAAA,GAAsB,OAAOC,KAAAA,EAA0BC,QAAAA,GAAAA;QAC3D,IAAID,KAAAA,CAAMxC,MAAM,KAAK,CAAA,EAAG;;;AAIxB,QAAA,MAAM0C,iBAAAA,GAAoBF,KAAAA,CAAMG,MAAM,CAAyB,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;YACnE,MAAMC,IAAAA,GAAOC,yBAAAA,CAAaF,IAAAA,CAAKC,IAAI,CAAA;YACnCF,GAAG,CAACE,IAAAA,CAAK,GAAG,CAACF,GAAG,CAACE,IAAAA,CAAK,IAAI,CAAA,IAAK,CAAA;YAC/B,OAAOF,GAAAA;AACT,QAAA,CAAA,EAAG,EAAC,CAAA;AACJP,QAAAA,UAAAA,CAAW,2BAAA,EAA6B;YACtCW,QAAAA,EAAUC,kCAAAA;AACV,YAAA,GAAGP;AACL,SAAA,CAAA;AAEA,QAAA,MAAMQ,WAAW,IAAIC,QAAAA,EAAAA;AACrB,QAAA,MAAMC,gBAAkC,EAAE;QAE1CZ,KAAAA,CAAMa,OAAO,CAAC,CAACR,IAAAA,GAAAA;YACbK,QAAAA,CAASI,MAAM,CAAC,OAAA,EAAST,IAAAA,CAAAA;AACzBO,YAAAA,aAAAA,CAAcG,IAAI,CAAC;AACjBC,gBAAAA,IAAAA,EAAMX,KAAKW,IAAI;gBACfC,OAAAA,EAAS,IAAA;gBACTC,eAAAA,EAAiB,IAAA;gBACjBC,MAAAA,EAAQlB;AACV,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEAS,QAAAA,QAAAA,CAASI,MAAM,CAAC,UAAA,EAAYM,IAAAA,CAAKC,SAAS,CAACT,aAAAA,CAAAA,CAAAA;QAC3C,IAAI;AACF,YAAA,MAAM1B,WAAAA,CAAY;AAChBwB,gBAAAA,QAAAA;AACAY,gBAAAA,UAAAA,EAAYtB,MAAMxC,MAAM;AACxBiC,gBAAAA,WAAAA;AACA8B,gBAAAA,kBAAAA,EAAoBC,OAAAA,CAAQ7B,mBAAAA;AAC9B,aAAA,CAAA,CAAG8B,MAAM,EAAA;AACX,QAAA,CAAA,CAAE,OAAM;;AAER,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,gBAAAA,GAAmB,IAAA;AACvBlD,QAAAA,YAAAA,CAAamD,OAAO,EAAEC,KAAAA,EAAAA;AACxB,IAAA,CAAA;AAEA,IAAA,MAAMC,mBAAmB,OAAOC,CAAAA,GAAAA;AAC9B,QAAA,MAAM9B,KAAAA,GAAQ8B,CAAAA,CAAEC,MAAM,CAAC/B,KAAK;AAC5B,QAAA,IAAIA,KAAAA,IAASA,KAAAA,CAAMxC,MAAM,GAAG,CAAA,EAAG;AAC7BqC,YAAAA,UAAAA,CAAW,eAAA,EAAiB;gBAAEmC,MAAAA,EAAQ,UAAA;gBAAYxB,QAAAA,EAAUC;AAAuB,aAAA,CAAA;AACnF,YAAA,MAAMV,mBAAAA,CAAoBkC,KAAAA,CAAMC,IAAI,CAAClC,KAAAA,CAAAA,EAAQnE,eAAAA,CAAAA;AAC/C,QAAA;QACAiG,CAAAA,CAAEC,MAAM,CAACI,KAAK,GAAG,EAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMC,aAAa,OAAOpC,KAAAA,GAAAA;;;AAGxB,QAAA,IAAI,CAACtE,SAAAA,EAAW;AAChBmE,QAAAA,UAAAA,CAAW,eAAA,EAAiB;YAAEmC,MAAAA,EAAQ,UAAA;YAAYxB,QAAAA,EAAUC;AAAuB,SAAA,CAAA;AACnF,QAAA,MAAMV,oBAAoBC,KAAAA,EAAOnE,eAAAA,CAAAA;AACnC,IAAA,CAAA;AAEA,IAAA,MAAMwG,kBAAkB,OAAOC,IAAAA,GAAAA;AAC7BzC,QAAAA,UAAAA,CAAW,eAAA,EAAiB;YAAEmC,MAAAA,EAAQ,KAAA;YAAOxB,QAAAA,EAAUC;AAAuB,SAAA,CAAA;;;AAG9EZ,QAAAA,UAAAA,CAAW,2BAAA,EAA6B;YAAEW,QAAAA,EAAUC;AAAuB,SAAA,CAAA;QAC3E,IAAI;AACF,YAAA,MAAMrB,cAAAA,CAAe;AACnBkD,gBAAAA,IAAAA;gBACArC,QAAAA,EAAUpE,eAAAA;AACV0F,gBAAAA,kBAAAA,EAAoBC,OAAAA,CAAQ7B,mBAAAA;AAC9B,aAAA,CAAA,CAAG8B,MAAM,EAAA;AACX,QAAA,CAAA,CAAE,OAAM;;AAER,QAAA;AACF,IAAA,CAAA;;;AAIA,IAAA,MAAM7H,iBAAe2I,4BAAAA,CAAgB;QACnCtC,QAAAA,EAAUpE,eAAAA;QACV2G,MAAAA,EAAQzG,WAAAA;;QAER0G,IAAAA,EAAM,CAAA,EAAGvG,SAASwG,UAAU,CAAC,SAAS,EAAExG,QAAAA,CAASyG,eAAe,CAAA,CAAE;QAClEC,MAAAA,EAAQzG,WAAAA,CAAY0G,UAAU,IAAI;AACpC,KAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkBC,iDAAAA,CAAyBnJ,cAAAA,CAAAA;IAEjD,qBACEoJ,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAAA,CAACC,4CAAAA,EAAAA;gBAAuBC,MAAAA,EAAQhB,UAAAA;AAAYiB,gBAAAA,QAAAA,EAAU,CAAC3H,SAAAA;AACrD,gBAAA,QAAA,gBAAAwH,cAAA,CAACI,wCAAAA,EAAAA;AAAuBD,oBAAAA,QAAAA,EAAU,CAAC1H,SAAAA;AACjC,oBAAA,QAAA,gBAAAuH,cAAA,CAACK,gCAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAAP,eAAA,CAACQ,mCAAAA,EAAAA;4BAAkBC,SAAAA,EAAWxG,eAAAA;;8CAC5BiG,cAAA,CAACvJ,sBAAAA,EAAAA;oCAAuBC,YAAAA,EAAcA;;AACtC,8CAAAsJ,cAAA,CAACQ,oBAAQC,IAAI,EAAA;AACXC,oCAAAA,OAAAA,gBACEV,cAAA,CAACW,qBAAAA,EAAAA;wCACChI,eAAAA,EAAiBA,eAAAA;AACjBiI,wCAAAA,gBAAAA,EAAkB,CAAC9H,WAAAA;wCACnB+H,cAAAA,EAAgBjI,kBAAAA;AAChBkI,wCAAAA,qBAAAA,gBACEd,cAAA,CAACe,uCAAAA,EAAAA;AACCZ,4CAAAA,QAAAA,EAAU,CAAC3H,SAAAA;4CACXwI,iBAAAA,EAAmBC,oCAAAA;AACnBC,4CAAAA,cAAAA,EAAgB,IAAMvG,2BAAAA,CAA4B,IAAA,CAAA;4CAClDwG,aAAAA,EAAe3C,gBAAAA;AACf4C,4CAAAA,eAAAA,EAAiB,IAAM/F,kBAAAA,CAAmB,IAAA;;;4DAMlD2E,cAAA,CAACqB,iBAAKC,IAAI,EAAA;AACR,wCAAA,QAAA,gBAAAxB,eAAA,CAAC9I,gBAAAA,EAAAA;4CAAIuK,GAAAA,EAAK/F,iBAAAA;;8DACRwE,cAAA,CAACwB,2BAAAA,EAAAA;AACC,oDAAA,QAAA,gBAAAxB,cAAA,CAACyB,OAAAA,EAAAA;wDAAMrE,IAAAA,EAAK,MAAA;wDAAOmE,GAAAA,EAAKjG,YAAAA;wDAAcoG,QAAAA,EAAU/C,gBAAAA;wDAAkBgD,QAAQ,EAAA;;;8DAK5E3B,cAAA,CAAChJ,gBAAAA,EAAAA;oDAAIuK,GAAAA,EAAKzF,iBAAAA;oDAAmB8F,MAAAA,EAAQ,CAAA;oDAAGC,aAAW,EAAA;;8DACnD7B,cAAA,CAAChJ,gBAAAA,EAAAA;oDAAIuK,GAAAA,EAAK3B,eAAAA;oDAAiBgC,MAAAA,EAAQ,CAAA;oDAAGC,aAAW,EAAA;;8DAOjD7B,cAAA,CAACe,uCAAAA,EAAAA;AACCZ,oDAAAA,QAAAA,EAAU,CAAC3H,SAAAA;oDACX+H,SAAAA,EAAWxG,eAAAA;AACXmH,oDAAAA,cAAAA,EAAgB,IAAMvG,2BAAAA,CAA4B,IAAA,CAAA;oDAClDwG,aAAAA,EAAe3C,gBAAAA;AACf4C,oDAAAA,eAAAA,EAAiB,IAAM/F,kBAAAA,CAAmB,IAAA;;8DAE5CyE,eAAA,CAAChJ,YAAAA,EAAAA;oDAAaQ,QAAAA,EAAUmE,eAAAA;;sEACtBqE,eAAA,CAAClI,QAAAA,EAAAA;;8EACCoI,cAAA,CAAC8B,uBAAAA,EAAAA;oEAAWC,OAAAA,EAAQ,OAAA;oEAAQC,GAAAA,EAAI,IAAA;AAC7BvH,oEAAAA,QAAAA,EAAAA;;AAEFjC,gEAAAA,SAAAA,kBACCsH,eAAA,CAACmC,uBAAAA,EAAAA;oEACCC,gBAAAA,EAAiB,YAAA;oEACjBH,OAAAA,EAAQ,SAAA;AACRI,oEAAAA,OAAAA,gBAASnC,cAAA,CAACoC,iBAAAA,EAAAA,EAAAA,CAAAA;AACVC,oEAAAA,KAAAA,EAAOjK,aAAAA,CAAc;AACnBrC,wEAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,KAAA,CAAA;wEACtBC,cAAAA,EAAgB;AAClB,qEAAA,CAAA;;sFAEA+J,cAAA,CAACsC,qBAAAA,EAAAA;AACCC,4EAAAA,QAAAA,EAAU,IAAM5H,2BAAAA,CAA4B,IAAA,CAAA;AAC5C6H,4EAAAA,SAAAA,gBAAWxC,cAAA,CAACyC,YAAAA,EAAAA,EAAAA,CAAAA;sFAEXrK,aAAAA,CAAc;AACbrC,gFAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,qBAAA,CAAA;gFACtBC,cAAAA,EAAgB;AAClB,6EAAA;;sFAEF+J,cAAA,CAACsC,qBAAAA,EAAAA;4EAASC,QAAAA,EAAU/D,gBAAAA;AAAkBgE,4EAAAA,SAAAA,gBAAWxC,cAAA,CAAC0C,WAAAA,EAAAA,EAAAA,CAAAA;sFAC/CtK,aAAAA,CAAc;AACbrC,gFAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,cAAA,CAAA;gFACtBC,cAAAA,EAAgB;AAClB,6EAAA;;sFAEF+J,cAAA,CAACsC,qBAAAA,EAAAA;AACCC,4EAAAA,QAAAA,EAAU,IAAMlH,kBAAAA,CAAmB,IAAA,CAAA;AACnCmH,4EAAAA,SAAAA,gBAAWxC,cAAA,CAAC2C,UAAAA,EAAAA,EAAAA,CAAAA;sFAEXvK,aAAAA,CAAc;AACbrC,gFAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,iBAAA,CAAA;gFACtBC,cAAAA,EAAgB;AAClB,6EAAA;;;;;;sEAMR6J,eAAA,CAAChI,OAAAA,EAAAA;4DAAQR,QAAAA,EAAUmE,eAAAA;;8EACjBqE,eAAA,CAAC9H,iBAAAA,EAAAA;;sFACCgI,cAAA,CAAChJ,gBAAAA,EAAAA;AACC,4EAAA,QAAA,gBAAAgJ,cAAA,CAAC4C,qBAAAA,EAAAA;gFAAW3J,WAAAA,EAAaA;;;sFAE3B+G,cAAA,CAAC9H,UAAAA,EAAAA;AACC,4EAAA,QAAA,gBAAA8H,cAAA,CAAC6C,mCAAAA,EAAAA,EAAAA;;;;8EAGL/C,eAAA,CAAC7H,eAAAA,EAAAA;;sFACC+H,cAAA,CAAChJ,gBAAAA,EAAAA;AACC,4EAAA,QAAA,gBAAAgJ,cAAA,CAAC8C,iBAAAA,EAAAA;gFAASvD,IAAAA,EAAMvG,QAAAA;AAAU+J,gFAAAA,gBAAAA,EAAkB,CAAC5H;;;sFAE/C6E,cAAA,CAACgD,qBAAAA,EAAAA;4EAAWnI,IAAAA,EAAMA,IAAAA;4EAAM6G,QAAAA,EAAU5G;;;;;;sEAItCkF,cAAA,CAACiD,yBAAAA,EAAAA;4DAAahK,WAAAA,EAAaA,WAAAA;4DAAaiK,OAAAA,EAASzH;;;;AAGnD,8DAAAqE,eAAA,CAACU,oBAAQ2C,OAAO,EAAA;;AAGbhK,wDAAAA,oBAAAA;sEACD2G,eAAA,CAACsD,kCAAAA,EAAAA;;8EACCpD,cAAA,CAACqD,+BAAAA,EAAAA;oEACC7H,iBAAAA,EAAmBA,iBAAAA;oEACnB8H,UAAAA,EAAY1J;;8EAEdoG,cAAA,CAACuD,qBAAAA,EAAAA;oEACC1I,IAAAA,EAAMA,IAAAA;oEACNzE,OAAAA,EAASA,OAAAA;oEACTsD,gBAAAA,EAAkBA,gBAAAA;oEAClBrD,MAAAA,EAAQA,MAAAA;oEACRgD,eAAAA,EAAiBA,eAAAA;oEACjBC,cAAAA,EAAgBA,cAAAA;oEAChBC,WAAAA,EAAaA,WAAAA;oEACbC,aAAAA,EAAeA,aAAAA;oEACfgK,KAAAA,EAAO/J,WAAAA;oEACP8G,SAAAA,EAAWxG,eAAAA;oEACXlB,WAAAA,EAAaA,WAAAA;AACb2G,oEAAAA,UAAAA,EAAYxG,SAASwG,UAAU;AAC/BC,oEAAAA,eAAAA,EAAiBzG,SAASyG,eAAe;AACzCgE,oEAAAA,gBAAAA,EAAkBxK,WAAAA,CAAYyK,OAAO,CAACpJ,MAAM,GAAG,CAAA;AAC/CqJ,oEAAAA,cAAAA,EAAgB1K,YAAY2K,YAAY;oEACxCC,gBAAAA,EAAkBvL,WAAAA;oEAClBwL,WAAAA,EAAatF,gBAAAA;oEACbuF,YAAAA,EAAcvL,SAAAA;oEACdwL,aAAAA,EAAejL;;;;;;;;;;;;;;;0BAWnCiH,cAAA,CAACiE,iCAAAA,EAAAA;gBACCC,IAAAA,EAAMxJ,wBAAAA;gBACNyJ,IAAAA,EAAK,QAAA;gBACLC,gBAAAA,EAAkBxK,KAAAA;gBAClByK,cAAAA,EAAgB1L,eAAAA;AAChB2L,gBAAAA,OAAAA,EAAS,IAAM3J,2BAAAA,CAA4B,KAAA;;0BAE7CqF,cAAA,CAACuE,uCAAAA,EAAAA;gBACCL,IAAAA,EAAM9I,eAAAA;AACNkJ,gBAAAA,OAAAA,EAAS,IAAMjJ,kBAAAA,CAAmB,KAAA,CAAA;gBAClCmJ,QAAAA,EAAUrF;;0BAEZa,cAAA,CAACyE,qCAAAA,EAAAA,EAAAA;;;AAGP;;;;"}
|
|
1
|
+
{"version":3,"file":"AssetsPage.js","sources":["../../../../admin/src/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport { Layouts, Page, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, MenuItem, SimpleMenu, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, Files, Folder as FolderIcon, Link } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking';\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport { buildItemLocations } from '../../utils/itemLocations';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport {\n AssetDetailsDrawerFromUrl,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsSearchInput } from './components/AssetsSearchInput';\nimport { AssetsView } from './components/AssetsView';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { FilterBadges } from './components/FilterBadges';\nimport { FilterMenu } from './components/FilterMenu';\nimport { FolderFormDialog } from './components/FolderFormDialog';\nimport { FOLDER_TREE_ROOT_SELECTOR, FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { MainAreaContextMenu } from './components/MainAreaContextMenu';\nimport { SortMenu } from './components/SortMenu';\nimport { ViewToggle } from './components/ViewToggle';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useAssetsList } from './hooks/useAssetsList';\nimport { BusyAssetsProvider } from './hooks/useBusyAssets';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useListScrollRestoration } from './hooks/useListScrollRestoration';\nimport { getListQueryKey } from './utils/listQueryKey';\n\nimport type { UploadFileInfo } from '../../../../shared/contracts/files';\n\n// Module-level so the header sentinel's observer isn't rebuilt every render.\nconst HEADER_SENTINEL_OPTIONS: IntersectionObserverInit = { threshold: 0 };\n\nconst ITEM_COUNT_MESSAGE = {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n};\n\nconst SEARCH_RESULTS_COUNT_MESSAGES = {\n both: {\n id: getTranslationKey('header.search-results.count'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}',\n },\n folders: {\n id: getTranslationKey('header.search-results.count.folders'),\n defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}',\n },\n assets: {\n id: getTranslationKey('header.search-results.count.assets'),\n defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}',\n },\n};\n\nconst getSearchResultsCountMessage = (numberFolders: number, numberAssets: number) => {\n if (numberFolders === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.assets;\n }\n\n if (numberAssets === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.folders;\n }\n\n return SEARCH_RESULTS_COUNT_MESSAGES.both;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists), and\n * neither does the table/grid toggle — both views render the same list.\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n// A single sticky header — same layout scrolled or not, so the toolbar\n// alignment can't reflow the way the shared sticky header did. Once the list\n// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it\n// off the rows), like the sticky headers elsewhere in the admin. Horizontal\n// padding stays responsive (passed as props); only the vertical rhythm + shadow\n// change here so they can animate.\nconst StickyHeader = styled(Box)<{ $compact: boolean }>`\n position: sticky;\n top: 0;\n z-index: 2;\n /* Transparent at rest (the grey page shows through); an opaque background +\n shadow appear only once it sticks and content scrolls under it. */\n background: transparent;\n /* Horizontal padding matches the list's default spacing (Layouts.Content /\n RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */\n padding: ${({ theme }) => `${theme.spaces[6]} ${theme.spaces[4]}`};\n transition:\n padding 0.2s ease,\n background 0.2s ease,\n box-shadow 0.2s ease;\n\n ${({ theme }) => theme.breakpoints.medium} {\n padding-left: ${({ theme }) => theme.spaces[6]};\n padding-right: ${({ theme }) => theme.spaces[6]};\n }\n ${({ theme }) => theme.breakpoints.large} {\n padding-left: ${({ theme }) => theme.spaces[10]};\n padding-right: ${({ theme }) => theme.spaces[10]};\n }\n\n /* Compacting is scoped to medium and up, where the header actually sticks. On\n mobile it scrolls away with the list, so shrinking it mid-scroll animated a\n header the user could no longer see — the transition read as a glitch on the\n way back up rather than as the header settling. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n padding-top: ${theme.spaces[3]};\n padding-bottom: ${theme.spaces[3]};\n padding-left: ${theme.spaces[4]};\n padding-right: ${theme.spaces[4]};\n background: ${theme.colors.neutral0};\n box-shadow: ${theme.shadows.tableShadow};\n }\n ${theme.breakpoints.large} {\n padding-left: ${theme.spaces[6]};\n padding-right: ${theme.spaces[6]};\n }\n `}\n`;\n\n// New button aligns with the title, not the toolbar.\nconst TitleRow = styled(Flex)`\n justify-content: space-between;\n align-items: flex-start;\n gap: ${({ theme }) => theme.spaces[4]};\n\n h1 {\n font-size: 1.8rem;\n }\n`;\n\n// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —\n// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,\n// Filter+Search on the left, Sort+Toggle pushed right.\nconst Toolbar = styled(Flex)<{ $compact: boolean }>`\n margin-top: ${({ theme }) => theme.spaces[5]};\n flex-direction: column;\n align-items: stretch;\n gap: ${({ theme }) => theme.spaces[3]};\n transition: margin-top 0.2s ease;\n\n /* Tightening the gap to the title belongs to the compact header, so it is\n scoped to the breakpoints that compact. On mobile the header never sticks,\n and this was the last thing still shifting as the page scrolled. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n margin-top: ${theme.spaces[2]};\n }\n `}\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[3]};\n`;\n\n// Filter + Search. On mobile the group fills the row (search grows into it);\n// on desktop it keeps its intrinsic size and sits at the left edge.\nconst FilterSearchGroup = styled(ToolbarGroup)``;\n\n// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).\n// Desktop: sit together at the right edge (space-between on the toolbar leaves\n// the empty space between the search and here).\nconst SortToggleGroup = styled(ToolbarGroup)`\n justify-content: space-between;\n\n ${({ theme }) => theme.breakpoints.large} {\n justify-content: flex-end;\n flex: 0 0 auto;\n }\n`;\n\n// Fills the row on mobile; intrinsic width on desktop.\nconst SearchSlot = styled(Box)`\n flex: 1;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex: 0 1 auto;\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n const { canCreate, canUpdate } = useMediaLibraryPermissions();\n\n const {\n currentFolderId,\n navigateToFolderId,\n searchQuery,\n isSearching,\n clearSearch,\n listSort,\n listFilters,\n assets,\n subscribers: assetPageSubscribers,\n pagination,\n isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n assetsError,\n folders,\n isLoadingFolders,\n } = useAssetsList();\n const { title, itemCount } = useFolderInfo(currentFolderId);\n\n // Both move affordances (drag and the bulk bar) resolve each item's parent\n // from the rows on screen — while searching, results are global and the\n // folder currently open says nothing about where an item lives.\n const itemLocations = useMemo(() => buildItemLocations(assets, folders), [assets, folders]);\n\n const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, { count: itemCount });\n\n const searchResultsTitle = formatMessage(\n {\n id: getTranslationKey('header.search-results'),\n defaultMessage: 'Search results for \"{query}\"',\n },\n { query: searchQuery }\n );\n const numberFolders = folders.length;\n const numberAssets = pagination?.total ?? 0;\n\n const searchResultsCountLabel = formatMessage(\n getSearchResultsCountMessage(numberFolders, numberAssets),\n { numberFolders, numberAssets }\n );\n\n let pageHeaderTitle: string;\n if (isSearching) {\n pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;\n } else if (title) {\n pageHeaderTitle = `${title} (${itemCountLabel})`;\n } else {\n pageHeaderTitle = formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n }\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Shrink the sticky header once the list scrolls beneath it. A zero-height\n // sentinel sits at the very top of the scroll content; when it leaves the\n // viewport we're scrolled → compact.\n const [isHeaderCompact, setIsHeaderCompact] = useState(false);\n const onHeaderSentinelVisibility = useCallback(\n (isVisible: boolean) => setIsHeaderCompact(!isVisible),\n []\n );\n const headerSentinelRef = useElementOnScreen<HTMLDivElement>(\n onHeaderSentinelVisibility,\n HEADER_SENTINEL_OPTIONS\n );\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // `concurrentUploadRequests` echoes the app config. Missing settings (still\n // loading, no permission) fall back to sequential — never faster than the\n // server asked for.\n const { data: settings } = useGetUploadSettingsQuery();\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n // Drives the post-upload AI metadata phase shown per row in the progress\n // dialog. No mime argument: the files are not known until they are picked,\n // and the server filters the batch on the same allowlist anyway.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n const { trackUsage } = useTracking();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n // Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files\n // about to upload, broken down by asset type.\n const assetsCountByType = files.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('willAddMediaLibraryAssets', {\n location: MEDIA_LIBRARY_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({\n formData,\n totalFiles: files.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n // Defence in depth: the provider is `disabled` without `assets.create`\n // (so onDrop won't fire), but guard here too in case it's ever wired live.\n if (!canCreate) return;\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n trackUsage('didSelectFile', { source: 'url', location: MEDIA_LIBRARY_LOCATION });\n // Counts-by-type aren't available client-side for the URL flow (the server\n // fetches the files), so this fires the event with location only.\n trackUsage('willAddMediaLibraryAssets', { location: MEDIA_LIBRARY_LOCATION });\n try {\n await uploadFromUrls({\n urls,\n folderId: currentFolderId,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: searchQuery,\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: listFilters.serialized || null,\n });\n\n const scrollAnchorRef = useListScrollRestoration(listQueryKey);\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop} disabled={!canCreate}>\n <AssetSelectionProvider disabled={!canUpdate}>\n <BusyAssetsProvider>\n <AssetsDndProvider locations={itemLocations}>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Layouts.Root\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n showActiveFolder={!isSearching}\n onSelectFolder={navigateToFolderId}\n backgroundContextMenu={\n <MainAreaContextMenu\n disabled={!canCreate}\n containerSelector={FOLDER_TREE_ROOT_SELECTOR}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n }\n />\n }\n >\n <Page.Main>\n <Box ref={uploadDropZoneRef}>\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n {/* Zero-height marker: leaves the viewport as soon as the list\n scrolls, flipping the header into its compact state. */}\n <Box ref={headerSentinelRef} height={0} aria-hidden />\n <Box ref={scrollAnchorRef} height={0} aria-hidden />\n\n {/* Renders no wrapper: it listens on the scrolling column\n itself, so the header band and the padding below the list\n are both in the hit area. Interactive controls, the table\n header row and the list items are excluded — see\n MainAreaContextMenu. */}\n <MainAreaContextMenu\n disabled={!canCreate}\n locations={itemLocations}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n <StickyHeader $compact={isHeaderCompact}>\n <TitleRow>\n <Typography variant=\"alpha\" tag=\"h1\">\n {pageHeaderTitle}\n </Typography>\n {canCreate && (\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<FolderIcon />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'File upload',\n })}\n </MenuItem>\n <MenuItem\n onSelect={() => setIsUrlDialogOpen(true)}\n startIcon={<Link />}\n >\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'File upload from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n )}\n </TitleRow>\n\n <Toolbar $compact={isHeaderCompact}>\n <FilterSearchGroup>\n <Box>\n <FilterMenu listFilters={listFilters} />\n </Box>\n <SearchSlot>\n <AssetsSearchInput />\n </SearchSlot>\n </FilterSearchGroup>\n <SortToggleGroup>\n <Box>\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n </Box>\n <ViewToggle view={view} onChange={setView} />\n </SortToggleGroup>\n </Toolbar>\n\n <FilterBadges listFilters={listFilters} compact={isHeaderCompact} />\n </StickyHeader>\n\n <Layouts.Content>\n {/* Renders nothing — keeps every loaded page's query subscribed\n so a rename/delete refreshes the whole list. */}\n {assetPageSubscribers}\n <DropZoneWithOverlay>\n <DropFilesMessage\n uploadDropZoneRef={uploadDropZoneRef}\n folderName={title}\n />\n <AssetsView\n view={view}\n folders={folders}\n isLoadingFolders={isLoadingFolders}\n assets={assets}\n isLoadingAssets={isLoadingAssets}\n isFetchingMore={isFetchingMore}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n error={assetsError}\n locations={itemLocations}\n searchQuery={searchQuery}\n assetsSort={listSort.assetsSort}\n foldersPosition={listSort.foldersPosition}\n hasActiveFilters={listFilters.filters.length > 0}\n onClearFilters={listFilters.clearFilters}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n canAddAssets={canCreate}\n onClearSearch={clearSearch}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Box>\n </Page.Main>\n </Layouts.Root>\n </AssetsDndProvider>\n </BusyAssetsProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <FolderFormDialog\n open={isCreateFolderDialogOpen}\n mode=\"create\"\n parentFolderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawerFromUrl />\n </>\n );\n};\n"],"names":["HEADER_SENTINEL_OPTIONS","threshold","ITEM_COUNT_MESSAGE","id","getTranslationKey","defaultMessage","SEARCH_RESULTS_COUNT_MESSAGES","both","folders","assets","getSearchResultsCountMessage","numberFolders","numberAssets","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StickyHeader","styled","Box","theme","spaces","breakpoints","medium","large","$compact","css","colors","neutral0","shadows","tableShadow","TitleRow","Flex","Toolbar","ToolbarGroup","FilterSearchGroup","SortToggleGroup","SearchSlot","AssetsPage","formatMessage","useIntl","openDetails","useAssetDetailsParam","canCreate","canUpdate","useMediaLibraryPermissions","currentFolderId","navigateToFolderId","searchQuery","isSearching","clearSearch","listSort","listFilters","subscribers","assetPageSubscribers","pagination","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","assetsError","isLoadingFolders","useAssetsList","title","itemCount","useFolderInfo","itemLocations","useMemo","buildItemLocations","itemCountLabel","count","searchResultsTitle","query","length","total","searchResultsCountLabel","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","isHeaderCompact","setIsHeaderCompact","onHeaderSentinelVisibility","useCallback","isVisible","headerSentinelRef","useElementOnScreen","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","data","settings","useGetUploadSettingsQuery","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","trackUsage","useTracking","uploadFilesToFolder","files","folderId","assetsCountByType","reduce","acc","file","type","typeFromMime","location","MEDIA_LIBRARY_LOCATION","formData","FormData","fileInfoArray","forEach","append","push","name","caption","alternativeText","folder","JSON","stringify","totalFiles","generateAiMetadata","Boolean","unwrap","handleFileSelect","current","click","handleFileChange","e","target","source","Array","from","value","handleDrop","handleUrlUpload","urls","getListQueryKey","search","sort","assetsSort","foldersPosition","filter","serialized","scrollAnchorRef","useListScrollRestoration","_jsxs","_Fragment","_jsx","UploadDropZoneProvider","onDrop","disabled","AssetSelectionProvider","BusyAssetsProvider","AssetsDndProvider","locations","Layouts","Root","sideNav","FolderTree","showActiveFolder","onSelectFolder","backgroundContextMenu","MainAreaContextMenu","containerSelector","FOLDER_TREE_ROOT_SELECTOR","onCreateFolder","onImportFiles","onImportFromUrl","Page","Main","ref","VisuallyHidden","input","onChange","multiple","height","aria-hidden","Typography","variant","tag","SimpleMenu","popoverPlacement","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","FolderIcon","Files","Link","FilterMenu","AssetsSearchInput","SortMenu","showFoldersGroup","ViewToggle","FilterBadges","compact","Content","DropZoneWithOverlay","DropFilesMessage","folderName","AssetsView","error","hasActiveFilters","filters","onClearFilters","clearFilters","onAssetItemClick","onAddAssets","canAddAssets","onClearSearch","FolderFormDialog","open","mode","parentFolderName","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawerFromUrl"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import { useGetUploadSettingsQuery } from '../../services/settings.mjs';
|
|
|
13
13
|
import { buildItemLocations } from '../../utils/itemLocations.mjs';
|
|
14
14
|
import { getTranslationKey } from '../../utils/translations.mjs';
|
|
15
15
|
import { typeFromMime } from '../../utils/typeFromMime.mjs';
|
|
16
|
-
import { useAssetDetailsParam,
|
|
16
|
+
import { useAssetDetailsParam, AssetDetailsDrawerFromUrl } from './components/AssetDetails/AssetDetailsDrawer.mjs';
|
|
17
17
|
import { AssetsSearchInput } from './components/AssetsSearchInput.mjs';
|
|
18
18
|
import { AssetsView } from './components/AssetsView.mjs';
|
|
19
19
|
import { AssetsDndProvider } from './components/Dnd/AssetsDndProvider.mjs';
|
|
@@ -540,7 +540,7 @@ const AssetsPage = ()=>{
|
|
|
540
540
|
onClose: ()=>setIsUrlDialogOpen(false),
|
|
541
541
|
onUpload: handleUrlUpload
|
|
542
542
|
}),
|
|
543
|
-
/*#__PURE__*/ jsx(
|
|
543
|
+
/*#__PURE__*/ jsx(AssetDetailsDrawerFromUrl, {})
|
|
544
544
|
]
|
|
545
545
|
});
|
|
546
546
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsPage.mjs","sources":["../../../../admin/src/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport { Layouts, Page, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, MenuItem, SimpleMenu, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, Files, Folder as FolderIcon, Link } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking';\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport { buildItemLocations } from '../../utils/itemLocations';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsSearchInput } from './components/AssetsSearchInput';\nimport { AssetsView } from './components/AssetsView';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { FilterBadges } from './components/FilterBadges';\nimport { FilterMenu } from './components/FilterMenu';\nimport { FolderFormDialog } from './components/FolderFormDialog';\nimport { FOLDER_TREE_ROOT_SELECTOR, FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { MainAreaContextMenu } from './components/MainAreaContextMenu';\nimport { SortMenu } from './components/SortMenu';\nimport { ViewToggle } from './components/ViewToggle';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useAssetsList } from './hooks/useAssetsList';\nimport { BusyAssetsProvider } from './hooks/useBusyAssets';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useListScrollRestoration } from './hooks/useListScrollRestoration';\nimport { getListQueryKey } from './utils/listQueryKey';\n\nimport type { UploadFileInfo } from '../../../../shared/contracts/files';\n\n// Module-level so the header sentinel's observer isn't rebuilt every render.\nconst HEADER_SENTINEL_OPTIONS: IntersectionObserverInit = { threshold: 0 };\n\nconst ITEM_COUNT_MESSAGE = {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n};\n\nconst SEARCH_RESULTS_COUNT_MESSAGES = {\n both: {\n id: getTranslationKey('header.search-results.count'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}',\n },\n folders: {\n id: getTranslationKey('header.search-results.count.folders'),\n defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}',\n },\n assets: {\n id: getTranslationKey('header.search-results.count.assets'),\n defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}',\n },\n};\n\nconst getSearchResultsCountMessage = (numberFolders: number, numberAssets: number) => {\n if (numberFolders === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.assets;\n }\n\n if (numberAssets === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.folders;\n }\n\n return SEARCH_RESULTS_COUNT_MESSAGES.both;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists), and\n * neither does the table/grid toggle — both views render the same list.\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n// A single sticky header — same layout scrolled or not, so the toolbar\n// alignment can't reflow the way the shared sticky header did. Once the list\n// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it\n// off the rows), like the sticky headers elsewhere in the admin. Horizontal\n// padding stays responsive (passed as props); only the vertical rhythm + shadow\n// change here so they can animate.\nconst StickyHeader = styled(Box)<{ $compact: boolean }>`\n position: sticky;\n top: 0;\n z-index: 2;\n /* Transparent at rest (the grey page shows through); an opaque background +\n shadow appear only once it sticks and content scrolls under it. */\n background: transparent;\n /* Horizontal padding matches the list's default spacing (Layouts.Content /\n RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */\n padding: ${({ theme }) => `${theme.spaces[6]} ${theme.spaces[4]}`};\n transition:\n padding 0.2s ease,\n background 0.2s ease,\n box-shadow 0.2s ease;\n\n ${({ theme }) => theme.breakpoints.medium} {\n padding-left: ${({ theme }) => theme.spaces[6]};\n padding-right: ${({ theme }) => theme.spaces[6]};\n }\n ${({ theme }) => theme.breakpoints.large} {\n padding-left: ${({ theme }) => theme.spaces[10]};\n padding-right: ${({ theme }) => theme.spaces[10]};\n }\n\n /* Compacting is scoped to medium and up, where the header actually sticks. On\n mobile it scrolls away with the list, so shrinking it mid-scroll animated a\n header the user could no longer see — the transition read as a glitch on the\n way back up rather than as the header settling. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n padding-top: ${theme.spaces[3]};\n padding-bottom: ${theme.spaces[3]};\n padding-left: ${theme.spaces[4]};\n padding-right: ${theme.spaces[4]};\n background: ${theme.colors.neutral0};\n box-shadow: ${theme.shadows.tableShadow};\n }\n ${theme.breakpoints.large} {\n padding-left: ${theme.spaces[6]};\n padding-right: ${theme.spaces[6]};\n }\n `}\n`;\n\n// New button aligns with the title, not the toolbar.\nconst TitleRow = styled(Flex)`\n justify-content: space-between;\n align-items: flex-start;\n gap: ${({ theme }) => theme.spaces[4]};\n\n h1 {\n font-size: 1.8rem;\n }\n`;\n\n// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —\n// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,\n// Filter+Search on the left, Sort+Toggle pushed right.\nconst Toolbar = styled(Flex)<{ $compact: boolean }>`\n margin-top: ${({ theme }) => theme.spaces[5]};\n flex-direction: column;\n align-items: stretch;\n gap: ${({ theme }) => theme.spaces[3]};\n transition: margin-top 0.2s ease;\n\n /* Tightening the gap to the title belongs to the compact header, so it is\n scoped to the breakpoints that compact. On mobile the header never sticks,\n and this was the last thing still shifting as the page scrolled. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n margin-top: ${theme.spaces[2]};\n }\n `}\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[3]};\n`;\n\n// Filter + Search. On mobile the group fills the row (search grows into it);\n// on desktop it keeps its intrinsic size and sits at the left edge.\nconst FilterSearchGroup = styled(ToolbarGroup)``;\n\n// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).\n// Desktop: sit together at the right edge (space-between on the toolbar leaves\n// the empty space between the search and here).\nconst SortToggleGroup = styled(ToolbarGroup)`\n justify-content: space-between;\n\n ${({ theme }) => theme.breakpoints.large} {\n justify-content: flex-end;\n flex: 0 0 auto;\n }\n`;\n\n// Fills the row on mobile; intrinsic width on desktop.\nconst SearchSlot = styled(Box)`\n flex: 1;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex: 0 1 auto;\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n const { canCreate, canUpdate } = useMediaLibraryPermissions();\n\n const {\n currentFolderId,\n navigateToFolderId,\n searchQuery,\n isSearching,\n clearSearch,\n listSort,\n listFilters,\n assets,\n subscribers: assetPageSubscribers,\n pagination,\n isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n assetsError,\n folders,\n isLoadingFolders,\n } = useAssetsList();\n const { title, itemCount } = useFolderInfo(currentFolderId);\n\n // Both move affordances (drag and the bulk bar) resolve each item's parent\n // from the rows on screen — while searching, results are global and the\n // folder currently open says nothing about where an item lives.\n const itemLocations = useMemo(() => buildItemLocations(assets, folders), [assets, folders]);\n\n const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, { count: itemCount });\n\n const searchResultsTitle = formatMessage(\n {\n id: getTranslationKey('header.search-results'),\n defaultMessage: 'Search results for \"{query}\"',\n },\n { query: searchQuery }\n );\n const numberFolders = folders.length;\n const numberAssets = pagination?.total ?? 0;\n\n const searchResultsCountLabel = formatMessage(\n getSearchResultsCountMessage(numberFolders, numberAssets),\n { numberFolders, numberAssets }\n );\n\n let pageHeaderTitle: string;\n if (isSearching) {\n pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;\n } else if (title) {\n pageHeaderTitle = `${title} (${itemCountLabel})`;\n } else {\n pageHeaderTitle = formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n }\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Shrink the sticky header once the list scrolls beneath it. A zero-height\n // sentinel sits at the very top of the scroll content; when it leaves the\n // viewport we're scrolled → compact.\n const [isHeaderCompact, setIsHeaderCompact] = useState(false);\n const onHeaderSentinelVisibility = useCallback(\n (isVisible: boolean) => setIsHeaderCompact(!isVisible),\n []\n );\n const headerSentinelRef = useElementOnScreen<HTMLDivElement>(\n onHeaderSentinelVisibility,\n HEADER_SENTINEL_OPTIONS\n );\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // `concurrentUploadRequests` echoes the app config. Missing settings (still\n // loading, no permission) fall back to sequential — never faster than the\n // server asked for.\n const { data: settings } = useGetUploadSettingsQuery();\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n // Drives the post-upload AI metadata phase shown per row in the progress\n // dialog. No mime argument: the files are not known until they are picked,\n // and the server filters the batch on the same allowlist anyway.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n const { trackUsage } = useTracking();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n // Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files\n // about to upload, broken down by asset type.\n const assetsCountByType = files.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('willAddMediaLibraryAssets', {\n location: MEDIA_LIBRARY_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({\n formData,\n totalFiles: files.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n // Defence in depth: the provider is `disabled` without `assets.create`\n // (so onDrop won't fire), but guard here too in case it's ever wired live.\n if (!canCreate) return;\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n trackUsage('didSelectFile', { source: 'url', location: MEDIA_LIBRARY_LOCATION });\n // Counts-by-type aren't available client-side for the URL flow (the server\n // fetches the files), so this fires the event with location only.\n trackUsage('willAddMediaLibraryAssets', { location: MEDIA_LIBRARY_LOCATION });\n try {\n await uploadFromUrls({\n urls,\n folderId: currentFolderId,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: searchQuery,\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: listFilters.serialized || null,\n });\n\n const scrollAnchorRef = useListScrollRestoration(listQueryKey);\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop} disabled={!canCreate}>\n <AssetSelectionProvider disabled={!canUpdate}>\n <BusyAssetsProvider>\n <AssetsDndProvider locations={itemLocations}>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Layouts.Root\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n showActiveFolder={!isSearching}\n onSelectFolder={navigateToFolderId}\n backgroundContextMenu={\n <MainAreaContextMenu\n disabled={!canCreate}\n containerSelector={FOLDER_TREE_ROOT_SELECTOR}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n }\n />\n }\n >\n <Page.Main>\n <Box ref={uploadDropZoneRef}>\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n {/* Zero-height marker: leaves the viewport as soon as the list\n scrolls, flipping the header into its compact state. */}\n <Box ref={headerSentinelRef} height={0} aria-hidden />\n <Box ref={scrollAnchorRef} height={0} aria-hidden />\n\n {/* Renders no wrapper: it listens on the scrolling column\n itself, so the header band and the padding below the list\n are both in the hit area. Interactive controls, the table\n header row and the list items are excluded — see\n MainAreaContextMenu. */}\n <MainAreaContextMenu\n disabled={!canCreate}\n locations={itemLocations}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n <StickyHeader $compact={isHeaderCompact}>\n <TitleRow>\n <Typography variant=\"alpha\" tag=\"h1\">\n {pageHeaderTitle}\n </Typography>\n {canCreate && (\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<FolderIcon />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'File upload',\n })}\n </MenuItem>\n <MenuItem\n onSelect={() => setIsUrlDialogOpen(true)}\n startIcon={<Link />}\n >\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'File upload from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n )}\n </TitleRow>\n\n <Toolbar $compact={isHeaderCompact}>\n <FilterSearchGroup>\n <Box>\n <FilterMenu listFilters={listFilters} />\n </Box>\n <SearchSlot>\n <AssetsSearchInput />\n </SearchSlot>\n </FilterSearchGroup>\n <SortToggleGroup>\n <Box>\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n </Box>\n <ViewToggle view={view} onChange={setView} />\n </SortToggleGroup>\n </Toolbar>\n\n <FilterBadges listFilters={listFilters} compact={isHeaderCompact} />\n </StickyHeader>\n\n <Layouts.Content>\n {/* Renders nothing — keeps every loaded page's query subscribed\n so a rename/delete refreshes the whole list. */}\n {assetPageSubscribers}\n <DropZoneWithOverlay>\n <DropFilesMessage\n uploadDropZoneRef={uploadDropZoneRef}\n folderName={title}\n />\n <AssetsView\n view={view}\n folders={folders}\n isLoadingFolders={isLoadingFolders}\n assets={assets}\n isLoadingAssets={isLoadingAssets}\n isFetchingMore={isFetchingMore}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n error={assetsError}\n locations={itemLocations}\n searchQuery={searchQuery}\n assetsSort={listSort.assetsSort}\n foldersPosition={listSort.foldersPosition}\n hasActiveFilters={listFilters.filters.length > 0}\n onClearFilters={listFilters.clearFilters}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n canAddAssets={canCreate}\n onClearSearch={clearSearch}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Box>\n </Page.Main>\n </Layouts.Root>\n </AssetsDndProvider>\n </BusyAssetsProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <FolderFormDialog\n open={isCreateFolderDialogOpen}\n mode=\"create\"\n parentFolderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["HEADER_SENTINEL_OPTIONS","threshold","ITEM_COUNT_MESSAGE","id","getTranslationKey","defaultMessage","SEARCH_RESULTS_COUNT_MESSAGES","both","folders","assets","getSearchResultsCountMessage","numberFolders","numberAssets","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StickyHeader","styled","Box","theme","spaces","breakpoints","medium","large","$compact","css","colors","neutral0","shadows","tableShadow","TitleRow","Flex","Toolbar","ToolbarGroup","FilterSearchGroup","SortToggleGroup","SearchSlot","AssetsPage","formatMessage","useIntl","openDetails","useAssetDetailsParam","canCreate","canUpdate","useMediaLibraryPermissions","currentFolderId","navigateToFolderId","searchQuery","isSearching","clearSearch","listSort","listFilters","subscribers","assetPageSubscribers","pagination","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","assetsError","isLoadingFolders","useAssetsList","title","itemCount","useFolderInfo","itemLocations","useMemo","buildItemLocations","itemCountLabel","count","searchResultsTitle","query","length","total","searchResultsCountLabel","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","isHeaderCompact","setIsHeaderCompact","onHeaderSentinelVisibility","useCallback","isVisible","headerSentinelRef","useElementOnScreen","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","data","settings","useGetUploadSettingsQuery","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","trackUsage","useTracking","uploadFilesToFolder","files","folderId","assetsCountByType","reduce","acc","file","type","typeFromMime","location","MEDIA_LIBRARY_LOCATION","formData","FormData","fileInfoArray","forEach","append","push","name","caption","alternativeText","folder","JSON","stringify","totalFiles","generateAiMetadata","Boolean","unwrap","handleFileSelect","current","click","handleFileChange","e","target","source","Array","from","value","handleDrop","handleUrlUpload","urls","getListQueryKey","search","sort","assetsSort","foldersPosition","filter","serialized","scrollAnchorRef","useListScrollRestoration","_jsxs","_Fragment","_jsx","UploadDropZoneProvider","onDrop","disabled","AssetSelectionProvider","BusyAssetsProvider","AssetsDndProvider","locations","Layouts","Root","sideNav","FolderTree","showActiveFolder","onSelectFolder","backgroundContextMenu","MainAreaContextMenu","containerSelector","FOLDER_TREE_ROOT_SELECTOR","onCreateFolder","onImportFiles","onImportFromUrl","Page","Main","ref","VisuallyHidden","input","onChange","multiple","height","aria-hidden","Typography","variant","tag","SimpleMenu","popoverPlacement","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","FolderIcon","Files","Link","FilterMenu","AssetsSearchInput","SortMenu","showFoldersGroup","ViewToggle","FilterBadges","compact","Content","DropZoneWithOverlay","DropFilesMessage","folderName","AssetsView","error","hasActiveFilters","filters","onClearFilters","clearFilters","onAssetItemClick","onAddAssets","canAddAssets","onClearSearch","FolderFormDialog","open","mode","parentFolderName","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsPage.mjs","sources":["../../../../admin/src/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport { Layouts, Page, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, MenuItem, SimpleMenu, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, Files, Folder as FolderIcon, Link } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking';\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport { buildItemLocations } from '../../utils/itemLocations';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport {\n AssetDetailsDrawerFromUrl,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsSearchInput } from './components/AssetsSearchInput';\nimport { AssetsView } from './components/AssetsView';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { FilterBadges } from './components/FilterBadges';\nimport { FilterMenu } from './components/FilterMenu';\nimport { FolderFormDialog } from './components/FolderFormDialog';\nimport { FOLDER_TREE_ROOT_SELECTOR, FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { MainAreaContextMenu } from './components/MainAreaContextMenu';\nimport { SortMenu } from './components/SortMenu';\nimport { ViewToggle } from './components/ViewToggle';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useAssetsList } from './hooks/useAssetsList';\nimport { BusyAssetsProvider } from './hooks/useBusyAssets';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useListScrollRestoration } from './hooks/useListScrollRestoration';\nimport { getListQueryKey } from './utils/listQueryKey';\n\nimport type { UploadFileInfo } from '../../../../shared/contracts/files';\n\n// Module-level so the header sentinel's observer isn't rebuilt every render.\nconst HEADER_SENTINEL_OPTIONS: IntersectionObserverInit = { threshold: 0 };\n\nconst ITEM_COUNT_MESSAGE = {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n};\n\nconst SEARCH_RESULTS_COUNT_MESSAGES = {\n both: {\n id: getTranslationKey('header.search-results.count'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}',\n },\n folders: {\n id: getTranslationKey('header.search-results.count.folders'),\n defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}',\n },\n assets: {\n id: getTranslationKey('header.search-results.count.assets'),\n defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}',\n },\n};\n\nconst getSearchResultsCountMessage = (numberFolders: number, numberAssets: number) => {\n if (numberFolders === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.assets;\n }\n\n if (numberAssets === 0) {\n return SEARCH_RESULTS_COUNT_MESSAGES.folders;\n }\n\n return SEARCH_RESULTS_COUNT_MESSAGES.both;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists), and\n * neither does the table/grid toggle — both views render the same list.\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n// A single sticky header — same layout scrolled or not, so the toolbar\n// alignment can't reflow the way the shared sticky header did. Once the list\n// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it\n// off the rows), like the sticky headers elsewhere in the admin. Horizontal\n// padding stays responsive (passed as props); only the vertical rhythm + shadow\n// change here so they can animate.\nconst StickyHeader = styled(Box)<{ $compact: boolean }>`\n position: sticky;\n top: 0;\n z-index: 2;\n /* Transparent at rest (the grey page shows through); an opaque background +\n shadow appear only once it sticks and content scrolls under it. */\n background: transparent;\n /* Horizontal padding matches the list's default spacing (Layouts.Content /\n RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */\n padding: ${({ theme }) => `${theme.spaces[6]} ${theme.spaces[4]}`};\n transition:\n padding 0.2s ease,\n background 0.2s ease,\n box-shadow 0.2s ease;\n\n ${({ theme }) => theme.breakpoints.medium} {\n padding-left: ${({ theme }) => theme.spaces[6]};\n padding-right: ${({ theme }) => theme.spaces[6]};\n }\n ${({ theme }) => theme.breakpoints.large} {\n padding-left: ${({ theme }) => theme.spaces[10]};\n padding-right: ${({ theme }) => theme.spaces[10]};\n }\n\n /* Compacting is scoped to medium and up, where the header actually sticks. On\n mobile it scrolls away with the list, so shrinking it mid-scroll animated a\n header the user could no longer see — the transition read as a glitch on the\n way back up rather than as the header settling. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n padding-top: ${theme.spaces[3]};\n padding-bottom: ${theme.spaces[3]};\n padding-left: ${theme.spaces[4]};\n padding-right: ${theme.spaces[4]};\n background: ${theme.colors.neutral0};\n box-shadow: ${theme.shadows.tableShadow};\n }\n ${theme.breakpoints.large} {\n padding-left: ${theme.spaces[6]};\n padding-right: ${theme.spaces[6]};\n }\n `}\n`;\n\n// New button aligns with the title, not the toolbar.\nconst TitleRow = styled(Flex)`\n justify-content: space-between;\n align-items: flex-start;\n gap: ${({ theme }) => theme.spaces[4]};\n\n h1 {\n font-size: 1.8rem;\n }\n`;\n\n// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —\n// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,\n// Filter+Search on the left, Sort+Toggle pushed right.\nconst Toolbar = styled(Flex)<{ $compact: boolean }>`\n margin-top: ${({ theme }) => theme.spaces[5]};\n flex-direction: column;\n align-items: stretch;\n gap: ${({ theme }) => theme.spaces[3]};\n transition: margin-top 0.2s ease;\n\n /* Tightening the gap to the title belongs to the compact header, so it is\n scoped to the breakpoints that compact. On mobile the header never sticks,\n and this was the last thing still shifting as the page scrolled. */\n ${({ $compact, theme }) =>\n $compact &&\n css`\n ${theme.breakpoints.medium} {\n margin-top: ${theme.spaces[2]};\n }\n `}\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[3]};\n`;\n\n// Filter + Search. On mobile the group fills the row (search grows into it);\n// on desktop it keeps its intrinsic size and sits at the left edge.\nconst FilterSearchGroup = styled(ToolbarGroup)``;\n\n// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).\n// Desktop: sit together at the right edge (space-between on the toolbar leaves\n// the empty space between the search and here).\nconst SortToggleGroup = styled(ToolbarGroup)`\n justify-content: space-between;\n\n ${({ theme }) => theme.breakpoints.large} {\n justify-content: flex-end;\n flex: 0 0 auto;\n }\n`;\n\n// Fills the row on mobile; intrinsic width on desktop.\nconst SearchSlot = styled(Box)`\n flex: 1;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex: 0 1 auto;\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n const { canCreate, canUpdate } = useMediaLibraryPermissions();\n\n const {\n currentFolderId,\n navigateToFolderId,\n searchQuery,\n isSearching,\n clearSearch,\n listSort,\n listFilters,\n assets,\n subscribers: assetPageSubscribers,\n pagination,\n isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n assetsError,\n folders,\n isLoadingFolders,\n } = useAssetsList();\n const { title, itemCount } = useFolderInfo(currentFolderId);\n\n // Both move affordances (drag and the bulk bar) resolve each item's parent\n // from the rows on screen — while searching, results are global and the\n // folder currently open says nothing about where an item lives.\n const itemLocations = useMemo(() => buildItemLocations(assets, folders), [assets, folders]);\n\n const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, { count: itemCount });\n\n const searchResultsTitle = formatMessage(\n {\n id: getTranslationKey('header.search-results'),\n defaultMessage: 'Search results for \"{query}\"',\n },\n { query: searchQuery }\n );\n const numberFolders = folders.length;\n const numberAssets = pagination?.total ?? 0;\n\n const searchResultsCountLabel = formatMessage(\n getSearchResultsCountMessage(numberFolders, numberAssets),\n { numberFolders, numberAssets }\n );\n\n let pageHeaderTitle: string;\n if (isSearching) {\n pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;\n } else if (title) {\n pageHeaderTitle = `${title} (${itemCountLabel})`;\n } else {\n pageHeaderTitle = formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n }\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Shrink the sticky header once the list scrolls beneath it. A zero-height\n // sentinel sits at the very top of the scroll content; when it leaves the\n // viewport we're scrolled → compact.\n const [isHeaderCompact, setIsHeaderCompact] = useState(false);\n const onHeaderSentinelVisibility = useCallback(\n (isVisible: boolean) => setIsHeaderCompact(!isVisible),\n []\n );\n const headerSentinelRef = useElementOnScreen<HTMLDivElement>(\n onHeaderSentinelVisibility,\n HEADER_SENTINEL_OPTIONS\n );\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // `concurrentUploadRequests` echoes the app config. Missing settings (still\n // loading, no permission) fall back to sequential — never faster than the\n // server asked for.\n const { data: settings } = useGetUploadSettingsQuery();\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n // Drives the post-upload AI metadata phase shown per row in the progress\n // dialog. No mime argument: the files are not known until they are picked,\n // and the server filters the batch on the same allowlist anyway.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n const { trackUsage } = useTracking();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n // Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files\n // about to upload, broken down by asset type.\n const assetsCountByType = files.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('willAddMediaLibraryAssets', {\n location: MEDIA_LIBRARY_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({\n formData,\n totalFiles: files.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n // Defence in depth: the provider is `disabled` without `assets.create`\n // (so onDrop won't fire), but guard here too in case it's ever wired live.\n if (!canCreate) return;\n trackUsage('didSelectFile', { source: 'computer', location: MEDIA_LIBRARY_LOCATION });\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n trackUsage('didSelectFile', { source: 'url', location: MEDIA_LIBRARY_LOCATION });\n // Counts-by-type aren't available client-side for the URL flow (the server\n // fetches the files), so this fires the event with location only.\n trackUsage('willAddMediaLibraryAssets', { location: MEDIA_LIBRARY_LOCATION });\n try {\n await uploadFromUrls({\n urls,\n folderId: currentFolderId,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: searchQuery,\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: listFilters.serialized || null,\n });\n\n const scrollAnchorRef = useListScrollRestoration(listQueryKey);\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop} disabled={!canCreate}>\n <AssetSelectionProvider disabled={!canUpdate}>\n <BusyAssetsProvider>\n <AssetsDndProvider locations={itemLocations}>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Layouts.Root\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n showActiveFolder={!isSearching}\n onSelectFolder={navigateToFolderId}\n backgroundContextMenu={\n <MainAreaContextMenu\n disabled={!canCreate}\n containerSelector={FOLDER_TREE_ROOT_SELECTOR}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n }\n />\n }\n >\n <Page.Main>\n <Box ref={uploadDropZoneRef}>\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n {/* Zero-height marker: leaves the viewport as soon as the list\n scrolls, flipping the header into its compact state. */}\n <Box ref={headerSentinelRef} height={0} aria-hidden />\n <Box ref={scrollAnchorRef} height={0} aria-hidden />\n\n {/* Renders no wrapper: it listens on the scrolling column\n itself, so the header band and the padding below the list\n are both in the hit area. Interactive controls, the table\n header row and the list items are excluded — see\n MainAreaContextMenu. */}\n <MainAreaContextMenu\n disabled={!canCreate}\n locations={itemLocations}\n onCreateFolder={() => setIsCreateFolderDialogOpen(true)}\n onImportFiles={handleFileSelect}\n onImportFromUrl={() => setIsUrlDialogOpen(true)}\n />\n <StickyHeader $compact={isHeaderCompact}>\n <TitleRow>\n <Typography variant=\"alpha\" tag=\"h1\">\n {pageHeaderTitle}\n </Typography>\n {canCreate && (\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<FolderIcon />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'File upload',\n })}\n </MenuItem>\n <MenuItem\n onSelect={() => setIsUrlDialogOpen(true)}\n startIcon={<Link />}\n >\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'File upload from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n )}\n </TitleRow>\n\n <Toolbar $compact={isHeaderCompact}>\n <FilterSearchGroup>\n <Box>\n <FilterMenu listFilters={listFilters} />\n </Box>\n <SearchSlot>\n <AssetsSearchInput />\n </SearchSlot>\n </FilterSearchGroup>\n <SortToggleGroup>\n <Box>\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n </Box>\n <ViewToggle view={view} onChange={setView} />\n </SortToggleGroup>\n </Toolbar>\n\n <FilterBadges listFilters={listFilters} compact={isHeaderCompact} />\n </StickyHeader>\n\n <Layouts.Content>\n {/* Renders nothing — keeps every loaded page's query subscribed\n so a rename/delete refreshes the whole list. */}\n {assetPageSubscribers}\n <DropZoneWithOverlay>\n <DropFilesMessage\n uploadDropZoneRef={uploadDropZoneRef}\n folderName={title}\n />\n <AssetsView\n view={view}\n folders={folders}\n isLoadingFolders={isLoadingFolders}\n assets={assets}\n isLoadingAssets={isLoadingAssets}\n isFetchingMore={isFetchingMore}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n error={assetsError}\n locations={itemLocations}\n searchQuery={searchQuery}\n assetsSort={listSort.assetsSort}\n foldersPosition={listSort.foldersPosition}\n hasActiveFilters={listFilters.filters.length > 0}\n onClearFilters={listFilters.clearFilters}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n canAddAssets={canCreate}\n onClearSearch={clearSearch}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Box>\n </Page.Main>\n </Layouts.Root>\n </AssetsDndProvider>\n </BusyAssetsProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <FolderFormDialog\n open={isCreateFolderDialogOpen}\n mode=\"create\"\n parentFolderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawerFromUrl />\n </>\n );\n};\n"],"names":["HEADER_SENTINEL_OPTIONS","threshold","ITEM_COUNT_MESSAGE","id","getTranslationKey","defaultMessage","SEARCH_RESULTS_COUNT_MESSAGES","both","folders","assets","getSearchResultsCountMessage","numberFolders","numberAssets","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StickyHeader","styled","Box","theme","spaces","breakpoints","medium","large","$compact","css","colors","neutral0","shadows","tableShadow","TitleRow","Flex","Toolbar","ToolbarGroup","FilterSearchGroup","SortToggleGroup","SearchSlot","AssetsPage","formatMessage","useIntl","openDetails","useAssetDetailsParam","canCreate","canUpdate","useMediaLibraryPermissions","currentFolderId","navigateToFolderId","searchQuery","isSearching","clearSearch","listSort","listFilters","subscribers","assetPageSubscribers","pagination","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","assetsError","isLoadingFolders","useAssetsList","title","itemCount","useFolderInfo","itemLocations","useMemo","buildItemLocations","itemCountLabel","count","searchResultsTitle","query","length","total","searchResultsCountLabel","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","isHeaderCompact","setIsHeaderCompact","onHeaderSentinelVisibility","useCallback","isVisible","headerSentinelRef","useElementOnScreen","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","data","settings","useGetUploadSettingsQuery","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","trackUsage","useTracking","uploadFilesToFolder","files","folderId","assetsCountByType","reduce","acc","file","type","typeFromMime","location","MEDIA_LIBRARY_LOCATION","formData","FormData","fileInfoArray","forEach","append","push","name","caption","alternativeText","folder","JSON","stringify","totalFiles","generateAiMetadata","Boolean","unwrap","handleFileSelect","current","click","handleFileChange","e","target","source","Array","from","value","handleDrop","handleUrlUpload","urls","getListQueryKey","search","sort","assetsSort","foldersPosition","filter","serialized","scrollAnchorRef","useListScrollRestoration","_jsxs","_Fragment","_jsx","UploadDropZoneProvider","onDrop","disabled","AssetSelectionProvider","BusyAssetsProvider","AssetsDndProvider","locations","Layouts","Root","sideNav","FolderTree","showActiveFolder","onSelectFolder","backgroundContextMenu","MainAreaContextMenu","containerSelector","FOLDER_TREE_ROOT_SELECTOR","onCreateFolder","onImportFiles","onImportFromUrl","Page","Main","ref","VisuallyHidden","input","onChange","multiple","height","aria-hidden","Typography","variant","tag","SimpleMenu","popoverPlacement","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","FolderIcon","Files","Link","FilterMenu","AssetsSearchInput","SortMenu","showFoldersGroup","ViewToggle","FilterBadges","compact","Content","DropZoneWithOverlay","DropFilesMessage","folderName","AssetsView","error","hasActiveFilters","filters","onClearFilters","clearFilters","onAssetItemClick","onAddAssets","canAddAssets","onClearSearch","FolderFormDialog","open","mode","parentFolderName","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawerFromUrl"],"mappings":"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"}
|