@strapi/upload 5.51.2 → 5.52.1
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/future/App.js +3 -3
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs +4 -4
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/BetaNotice.js +72 -0
- package/dist/admin/future/components/BetaNotice.js.map +1 -0
- package/dist/admin/future/components/BetaNotice.mjs +70 -0
- package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
- package/dist/admin/future/components/Drawer.js +16 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +16 -3
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/TruncatedText.js +76 -0
- package/dist/admin/future/components/TruncatedText.js.map +1 -0
- package/dist/admin/future/components/TruncatedText.mjs +74 -0
- package/dist/admin/future/components/TruncatedText.mjs.map +1 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
- package/dist/admin/future/hooks/useTracking.js +57 -0
- package/dist/admin/future/hooks/useTracking.js.map +1 -0
- package/dist/admin/future/hooks/useTracking.mjs +53 -0
- package/dist/admin/future/hooks/useTracking.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +328 -139
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +332 -143
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +328 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +326 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +35 -14
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +35 -14
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +74 -53
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +74 -54
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +92 -28
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +94 -30
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +26 -4
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +27 -5
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -60
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -63
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +64 -132
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +64 -132
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +27 -17
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +28 -18
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterBadges.js +13 -4
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +13 -4
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +259 -63
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +262 -66
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +146 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +144 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +62 -16
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +64 -18
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +132 -229
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +135 -232
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.js +14 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +14 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +5 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +6 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +203 -62
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +204 -63
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +17 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -1
- package/dist/admin/future/pages/Assets/utils/selection.mjs +17 -1
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -1
- package/dist/admin/future/services/api.js +31 -8
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +31 -8
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +22 -23
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +22 -23
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +37 -2
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +37 -3
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
- package/dist/admin/future/utils/getRelationId.js +24 -0
- package/dist/admin/future/utils/getRelationId.js.map +1 -0
- package/dist/admin/future/utils/getRelationId.mjs +22 -0
- package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.js +14 -0
- package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
- package/dist/admin/future/utils/itemLocations.js +40 -0
- package/dist/admin/future/utils/itemLocations.js.map +1 -0
- package/dist/admin/future/utils/itemLocations.mjs +36 -0
- package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
- package/dist/admin/future/utils/itemSource.js +36 -0
- package/dist/admin/future/utils/itemSource.js.map +1 -0
- package/dist/admin/future/utils/itemSource.mjs +32 -0
- package/dist/admin/future/utils/itemSource.mjs.map +1 -0
- package/dist/admin/hooks/useAIMetadataJob.js +1 -1
- package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.mjs +1 -1
- package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
- package/dist/admin/index.js +11 -17
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +12 -18
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +2 -2
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +2 -2
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/src/future/App.d.ts +1 -1
- package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
- package/dist/admin/src/future/components/Drawer.d.ts +5 -1
- package/dist/admin/src/future/components/TruncatedText.d.ts +32 -0
- package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
- package/dist/admin/src/future/hooks/useTracking.d.ts +29 -0
- package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
- package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +26 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
- package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
- package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +4 -0
- package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +20 -6
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +10 -0
- package/dist/admin/src/future/services/api.d.ts +6 -7
- package/dist/admin/src/future/services/folders.d.ts +6 -1
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
- package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
- package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
- package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
- package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
- package/dist/admin/translations/en.json.js +25 -4
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +25 -4
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +27 -9
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +27 -9
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +24 -8
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +24 -8
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/routes/admin.js +41 -21
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +41 -21
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +29 -8
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +20 -4
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +4 -4
- package/dist/server/src/index.d.ts +4 -4
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata.d.ts +2 -2
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +0 -5
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/shared/contracts/ai-metadata-jobs.d.ts +10 -32
- package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -1
- package/dist/shared/contracts/files.d.ts +10 -10
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +0 -33
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +0 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +0 -31
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +0 -1
- package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
- package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +0 -16
|
@@ -1,46 +1,62 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useEffect, useMemo, useState, useRef, useCallback } from 'react';
|
|
3
3
|
import * as ToggleGroup from '@radix-ui/react-toggle-group';
|
|
4
|
-
import { usePersistentState, Layouts,
|
|
5
|
-
import { Box, VisuallyHidden,
|
|
6
|
-
import {
|
|
4
|
+
import { usePersistentState, useElementOnScreen, Layouts, Page } from '@strapi/admin/strapi-admin';
|
|
5
|
+
import { Box, VisuallyHidden, Typography, SimpleMenu, MenuItem, Flex, Loader } from '@strapi/design-system';
|
|
6
|
+
import { Folder, Files, Link, ChevronDown, List, GridFour } from '@strapi/icons';
|
|
7
7
|
import { useIntl } from 'react-intl';
|
|
8
|
-
import { styled } from 'styled-components';
|
|
9
|
-
import {
|
|
8
|
+
import { css, styled } from 'styled-components';
|
|
9
|
+
import { typeFromMime } from '../../../utils/typeFromMime.mjs';
|
|
10
|
+
import { BetaNotice } from '../../components/BetaNotice.mjs';
|
|
11
|
+
import { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled.mjs';
|
|
10
12
|
import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions.mjs';
|
|
13
|
+
import { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking.mjs';
|
|
11
14
|
import { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api.mjs';
|
|
12
15
|
import { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders.mjs';
|
|
13
16
|
import { useGetUploadSettingsQuery } from '../../services/settings.mjs';
|
|
17
|
+
import { buildItemLocations } from '../../utils/itemLocations.mjs';
|
|
14
18
|
import { getTranslationKey } from '../../utils/translations.mjs';
|
|
15
19
|
import { useAssetDetailsParam, AssetDetailsDrawer } from './components/AssetDetails/AssetDetailsDrawer.mjs';
|
|
16
20
|
import { AssetsGrid } from './components/AssetsGrid.mjs';
|
|
17
21
|
import { AssetsSearchInput } from './components/AssetsSearchInput.mjs';
|
|
18
22
|
import { AssetsTable } from './components/AssetsTable.mjs';
|
|
19
23
|
import { BulkActionsBar } from './components/BulkActionsBar.mjs';
|
|
20
|
-
import { CreateFolderDialog } from './components/CreateFolderDialog.mjs';
|
|
21
24
|
import { AssetsDndProvider } from './components/Dnd/AssetsDndProvider.mjs';
|
|
22
25
|
import { DropZoneWithOverlay, DropFilesMessage } from './components/DropZone/UploadDropZone.mjs';
|
|
23
26
|
import { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext.mjs';
|
|
24
27
|
import { FilteredEmptyState, EmptyState } from './components/EmptyState.mjs';
|
|
25
28
|
import { FilterBadges } from './components/FilterBadges.mjs';
|
|
26
29
|
import { FilterMenu } from './components/FilterMenu.mjs';
|
|
30
|
+
import { FolderFormDialog } from './components/FolderFormDialog.mjs';
|
|
27
31
|
import { FolderTree } from './components/FolderTree/FolderTree.mjs';
|
|
28
32
|
import { ImportFromUrlDialog } from './components/ImportFromUrlDialog.mjs';
|
|
29
33
|
import { SortMenu } from './components/SortMenu.mjs';
|
|
30
34
|
import { localStorageKeys, viewOptions } from './constants.mjs';
|
|
31
35
|
import { useAssetSearch } from './hooks/useAssetSearch.mjs';
|
|
32
36
|
import { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection.mjs';
|
|
37
|
+
import { BusyAssetsProvider } from './hooks/useBusyAssets.mjs';
|
|
33
38
|
import { useFolderInfo } from './hooks/useFolderInfo.mjs';
|
|
34
39
|
import { useFolderNavigation } from './hooks/useFolderNavigation.mjs';
|
|
35
40
|
import { useInfiniteAssets } from './hooks/useInfiniteAssets.mjs';
|
|
41
|
+
import { useInfiniteScrollSentinel } from './hooks/useInfiniteScrollSentinel.mjs';
|
|
36
42
|
import { useListFilters } from './hooks/useListFilters.mjs';
|
|
37
43
|
import { useListSort } from './hooks/useListSort.mjs';
|
|
38
44
|
import { buildAssetFilters } from './utils/buildAssetFilters.mjs';
|
|
39
45
|
import { getListQueryKey } from './utils/listQueryKey.mjs';
|
|
40
46
|
import { mergeMixedList } from './utils/mergeMixedList.mjs';
|
|
41
47
|
|
|
48
|
+
// The negative bottom margin shrinks the trigger area by a pixel so the 1px
|
|
49
|
+
// sentinel sitting exactly at the fold (when a page's rows happen to fill the
|
|
50
|
+
// viewport) reads as "not visible" and doesn't pull an extra page. It still
|
|
51
|
+
// triggers as soon as the sentinel scrolls a hair into view. Tune the bottom
|
|
52
|
+
// value if the list over- or under-fetches near the fold.
|
|
42
53
|
const INTERSECTION_OPTIONS = {
|
|
43
|
-
threshold: 0
|
|
54
|
+
threshold: 0,
|
|
55
|
+
rootMargin: '0px 0px -1px 0px'
|
|
56
|
+
};
|
|
57
|
+
// Module-level so the header sentinel's observer isn't rebuilt every render.
|
|
58
|
+
const HEADER_SENTINEL_OPTIONS = {
|
|
59
|
+
threshold: 0
|
|
44
60
|
};
|
|
45
61
|
const ITEM_COUNT_MESSAGE = {
|
|
46
62
|
id: getTranslationKey('header.content.item-count'),
|
|
@@ -69,7 +85,7 @@ const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
|
|
|
69
85
|
}
|
|
70
86
|
return SEARCH_RESULTS_COUNT_MESSAGES.both;
|
|
71
87
|
};
|
|
72
|
-
const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
|
|
88
|
+
const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
|
|
73
89
|
const { formatMessage } = useIntl();
|
|
74
90
|
const isGridView = view === viewOptions.GRID;
|
|
75
91
|
const isLoading = isLoadingAssets || isLoadingFolders;
|
|
@@ -89,15 +105,12 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
|
|
|
89
105
|
assetsSort,
|
|
90
106
|
hasNextPage
|
|
91
107
|
]);
|
|
92
|
-
const loadMoreRef =
|
|
93
|
-
if (isVisible && hasNextPage && !isFetchingMore) {
|
|
94
|
-
fetchNextPage();
|
|
95
|
-
}
|
|
96
|
-
}, [
|
|
108
|
+
const loadMoreRef = useInfiniteScrollSentinel({
|
|
97
109
|
hasNextPage,
|
|
98
110
|
isFetchingMore,
|
|
99
|
-
fetchNextPage
|
|
100
|
-
|
|
111
|
+
onLoadMore: fetchNextPage,
|
|
112
|
+
options: INTERSECTION_OPTIONS
|
|
113
|
+
});
|
|
101
114
|
if (isLoading) {
|
|
102
115
|
return /*#__PURE__*/ jsx(Flex, {
|
|
103
116
|
justifyContent: "center",
|
|
@@ -163,7 +176,8 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
|
|
|
163
176
|
})
|
|
164
177
|
}),
|
|
165
178
|
/*#__PURE__*/ jsx(BulkActionsBar, {
|
|
166
|
-
assets: assets
|
|
179
|
+
assets: assets,
|
|
180
|
+
locations: locations
|
|
167
181
|
})
|
|
168
182
|
]
|
|
169
183
|
});
|
|
@@ -223,13 +237,122 @@ const StyledToggleItem = styled(ToggleGroup.Item)`
|
|
|
223
237
|
height: 1.6rem;
|
|
224
238
|
}
|
|
225
239
|
`;
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
240
|
+
// A single sticky header — same layout scrolled or not, so the toolbar
|
|
241
|
+
// alignment can't reflow the way the shared sticky header did. Once the list
|
|
242
|
+
// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it
|
|
243
|
+
// off the rows), like the sticky headers elsewhere in the admin. Horizontal
|
|
244
|
+
// padding stays responsive (passed as props); only the vertical rhythm + shadow
|
|
245
|
+
// change here so they can animate.
|
|
246
|
+
const StickyHeader = styled(Box)`
|
|
247
|
+
position: sticky;
|
|
248
|
+
top: 0;
|
|
249
|
+
z-index: 2;
|
|
250
|
+
/* Transparent at rest (the grey page shows through); an opaque background +
|
|
251
|
+
shadow appear only once it sticks and content scrolls under it. */
|
|
252
|
+
background: transparent;
|
|
253
|
+
/* Horizontal padding matches the list's default spacing (Layouts.Content /
|
|
254
|
+
RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */
|
|
255
|
+
padding: ${({ theme })=>`${theme.spaces[6]} ${theme.spaces[4]}`};
|
|
256
|
+
transition:
|
|
257
|
+
padding 0.2s ease,
|
|
258
|
+
background 0.2s ease,
|
|
259
|
+
box-shadow 0.2s ease;
|
|
229
260
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
261
|
+
${({ theme })=>theme.breakpoints.medium} {
|
|
262
|
+
padding-left: ${({ theme })=>theme.spaces[6]};
|
|
263
|
+
padding-right: ${({ theme })=>theme.spaces[6]};
|
|
264
|
+
}
|
|
265
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
266
|
+
padding-left: ${({ theme })=>theme.spaces[10]};
|
|
267
|
+
padding-right: ${({ theme })=>theme.spaces[10]};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Compacting is scoped to medium and up, where the header actually sticks. On
|
|
271
|
+
mobile it scrolls away with the list, so shrinking it mid-scroll animated a
|
|
272
|
+
header the user could no longer see — the transition read as a glitch on the
|
|
273
|
+
way back up rather than as the header settling. */
|
|
274
|
+
${({ $compact, theme })=>$compact && css`
|
|
275
|
+
${theme.breakpoints.medium} {
|
|
276
|
+
padding-top: ${theme.spaces[3]};
|
|
277
|
+
padding-bottom: ${theme.spaces[3]};
|
|
278
|
+
padding-left: ${theme.spaces[4]};
|
|
279
|
+
padding-right: ${theme.spaces[4]};
|
|
280
|
+
background: ${theme.colors.neutral0};
|
|
281
|
+
box-shadow: ${theme.shadows.tableShadow};
|
|
282
|
+
}
|
|
283
|
+
${theme.breakpoints.large} {
|
|
284
|
+
padding-left: ${theme.spaces[6]};
|
|
285
|
+
padding-right: ${theme.spaces[6]};
|
|
286
|
+
}
|
|
287
|
+
`}
|
|
288
|
+
`;
|
|
289
|
+
// New button aligns with the title, not the toolbar.
|
|
290
|
+
const TitleRow = styled(Flex)`
|
|
291
|
+
justify-content: space-between;
|
|
292
|
+
align-items: flex-start;
|
|
293
|
+
gap: ${({ theme })=>theme.spaces[4]};
|
|
294
|
+
|
|
295
|
+
h1 {
|
|
296
|
+
font-size: 1.8rem;
|
|
297
|
+
}
|
|
298
|
+
`;
|
|
299
|
+
// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —
|
|
300
|
+
// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,
|
|
301
|
+
// Filter+Search on the left, Sort+Toggle pushed right.
|
|
302
|
+
const Toolbar = styled(Flex)`
|
|
303
|
+
margin-top: ${({ theme })=>theme.spaces[5]};
|
|
304
|
+
flex-direction: column;
|
|
305
|
+
align-items: stretch;
|
|
306
|
+
gap: ${({ theme })=>theme.spaces[3]};
|
|
307
|
+
transition: margin-top 0.2s ease;
|
|
308
|
+
|
|
309
|
+
/* Tightening the gap to the title belongs to the compact header, so it is
|
|
310
|
+
scoped to the breakpoints that compact. On mobile the header never sticks,
|
|
311
|
+
and this was the last thing still shifting as the page scrolled. */
|
|
312
|
+
${({ $compact, theme })=>$compact && css`
|
|
313
|
+
${theme.breakpoints.medium} {
|
|
314
|
+
margin-top: ${theme.spaces[2]};
|
|
315
|
+
}
|
|
316
|
+
`}
|
|
317
|
+
|
|
318
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
319
|
+
flex-direction: row;
|
|
320
|
+
align-items: center;
|
|
321
|
+
justify-content: space-between;
|
|
322
|
+
}
|
|
323
|
+
`;
|
|
324
|
+
const ToolbarGroup = styled(Flex)`
|
|
325
|
+
align-items: center;
|
|
326
|
+
gap: ${({ theme })=>theme.spaces[3]};
|
|
327
|
+
`;
|
|
328
|
+
// Filter + Search. On mobile the group fills the row (search grows into it);
|
|
329
|
+
// on desktop it keeps its intrinsic size and sits at the left edge.
|
|
330
|
+
const FilterSearchGroup = styled(ToolbarGroup)``;
|
|
331
|
+
// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).
|
|
332
|
+
// Desktop: sit together at the right edge (space-between on the toolbar leaves
|
|
333
|
+
// the empty space between the search and here).
|
|
334
|
+
const SortToggleGroup = styled(ToolbarGroup)`
|
|
335
|
+
justify-content: space-between;
|
|
336
|
+
|
|
337
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
338
|
+
justify-content: flex-end;
|
|
339
|
+
flex: 0 0 auto;
|
|
340
|
+
}
|
|
341
|
+
`;
|
|
342
|
+
// Fills the row on mobile; intrinsic width on desktop.
|
|
343
|
+
const SearchSlot = styled(Box)`
|
|
344
|
+
flex: 1;
|
|
345
|
+
|
|
346
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
347
|
+
flex: 0 1 auto;
|
|
348
|
+
}
|
|
349
|
+
`;
|
|
350
|
+
// Toggle labels are hidden below desktop — icons only (buttons keep aria-label).
|
|
351
|
+
const ToggleLabel = styled.span`
|
|
352
|
+
display: none;
|
|
353
|
+
|
|
354
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
355
|
+
display: inline;
|
|
233
356
|
}
|
|
234
357
|
`;
|
|
235
358
|
const AssetsPage = ()=>{
|
|
@@ -262,7 +385,7 @@ const AssetsPage = ()=>{
|
|
|
262
385
|
[
|
|
263
386
|
listFilters.serialized
|
|
264
387
|
]);
|
|
265
|
-
const { assets, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets({
|
|
388
|
+
const { assets, subscribers: assetPageSubscribers, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets({
|
|
266
389
|
// The real folder is passed even while searching: the service drops the folder
|
|
267
390
|
// filter when `search` is set, so results are still global. List filters
|
|
268
391
|
// compose with both modes.
|
|
@@ -270,7 +393,6 @@ const AssetsPage = ()=>{
|
|
|
270
393
|
search: searchQuery || undefined,
|
|
271
394
|
sort: listSort.assetsSort,
|
|
272
395
|
filters: builtFilters.fileClauses,
|
|
273
|
-
filtersKey: listFilters.serialized,
|
|
274
396
|
enabled: builtFilters.showFiles
|
|
275
397
|
});
|
|
276
398
|
const { data: fetchedFolders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({
|
|
@@ -286,6 +408,13 @@ const AssetsPage = ()=>{
|
|
|
286
408
|
builtFilters.showFolders,
|
|
287
409
|
fetchedFolders
|
|
288
410
|
]);
|
|
411
|
+
// Both move affordances (drag and the bulk bar) resolve each item's parent
|
|
412
|
+
// from the rows on screen — while searching, results are global and the
|
|
413
|
+
// folder currently open says nothing about where an item lives.
|
|
414
|
+
const itemLocations = useMemo(()=>buildItemLocations(assets, folders), [
|
|
415
|
+
assets,
|
|
416
|
+
folders
|
|
417
|
+
]);
|
|
289
418
|
const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
|
|
290
419
|
count: itemCount
|
|
291
420
|
});
|
|
@@ -321,6 +450,12 @@ const AssetsPage = ()=>{
|
|
|
321
450
|
// Refs
|
|
322
451
|
const fileInputRef = useRef(null);
|
|
323
452
|
const uploadDropZoneRef = useRef(null);
|
|
453
|
+
// Shrink the sticky header once the list scrolls beneath it. A zero-height
|
|
454
|
+
// sentinel sits at the very top of the scroll content; when it leaves the
|
|
455
|
+
// viewport we're scrolled → compact.
|
|
456
|
+
const [isHeaderCompact, setIsHeaderCompact] = useState(false);
|
|
457
|
+
const onHeaderSentinelVisibility = useCallback((isVisible)=>setIsHeaderCompact(!isVisible), []);
|
|
458
|
+
const headerSentinelRef = useElementOnScreen(onHeaderSentinelVisibility, HEADER_SENTINEL_OPTIONS);
|
|
324
459
|
// Upload handlers
|
|
325
460
|
const [uploadFiles] = useUploadFilesMutation();
|
|
326
461
|
const [uploadFromUrls] = useUploadFromUrlsMutation();
|
|
@@ -329,10 +464,24 @@ const AssetsPage = ()=>{
|
|
|
329
464
|
// server asked for.
|
|
330
465
|
const { data: settings } = useGetUploadSettingsQuery();
|
|
331
466
|
const concurrency = settings?.data?.concurrentUploadRequests ?? 1;
|
|
332
|
-
// Drives the post-upload AI metadata phase shown per row in the progress
|
|
333
|
-
|
|
467
|
+
// Drives the post-upload AI metadata phase shown per row in the progress
|
|
468
|
+
// dialog. No mime argument: the files are not known until they are picked,
|
|
469
|
+
// and the server filters the batch on the same allowlist anyway.
|
|
470
|
+
const isAiMetadataEnabled = useAIMetadataEnabled();
|
|
471
|
+
const { trackUsage } = useTracking();
|
|
334
472
|
const uploadFilesToFolder = async (files, folderId)=>{
|
|
335
473
|
if (files.length === 0) return;
|
|
474
|
+
// Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files
|
|
475
|
+
// about to upload, broken down by asset type.
|
|
476
|
+
const assetsCountByType = files.reduce((acc, file)=>{
|
|
477
|
+
const type = typeFromMime(file.type);
|
|
478
|
+
acc[type] = (acc[type] ?? 0) + 1;
|
|
479
|
+
return acc;
|
|
480
|
+
}, {});
|
|
481
|
+
trackUsage('willAddMediaLibraryAssets', {
|
|
482
|
+
location: MEDIA_LIBRARY_LOCATION,
|
|
483
|
+
...assetsCountByType
|
|
484
|
+
});
|
|
336
485
|
const formData = new FormData();
|
|
337
486
|
const fileInfoArray = [];
|
|
338
487
|
files.forEach((file)=>{
|
|
@@ -362,6 +511,10 @@ const AssetsPage = ()=>{
|
|
|
362
511
|
const handleFileChange = async (e)=>{
|
|
363
512
|
const files = e.target.files;
|
|
364
513
|
if (files && files.length > 0) {
|
|
514
|
+
trackUsage('didSelectFile', {
|
|
515
|
+
source: 'computer',
|
|
516
|
+
location: MEDIA_LIBRARY_LOCATION
|
|
517
|
+
});
|
|
365
518
|
await uploadFilesToFolder(Array.from(files), currentFolderId);
|
|
366
519
|
}
|
|
367
520
|
e.target.value = '';
|
|
@@ -370,9 +523,22 @@ const AssetsPage = ()=>{
|
|
|
370
523
|
// Defence in depth: the provider is `disabled` without `assets.create`
|
|
371
524
|
// (so onDrop won't fire), but guard here too in case it's ever wired live.
|
|
372
525
|
if (!canCreate) return;
|
|
526
|
+
trackUsage('didSelectFile', {
|
|
527
|
+
source: 'computer',
|
|
528
|
+
location: MEDIA_LIBRARY_LOCATION
|
|
529
|
+
});
|
|
373
530
|
await uploadFilesToFolder(files, currentFolderId);
|
|
374
531
|
};
|
|
375
532
|
const handleUrlUpload = async (urls)=>{
|
|
533
|
+
trackUsage('didSelectFile', {
|
|
534
|
+
source: 'url',
|
|
535
|
+
location: MEDIA_LIBRARY_LOCATION
|
|
536
|
+
});
|
|
537
|
+
// Counts-by-type aren't available client-side for the URL flow (the server
|
|
538
|
+
// fetches the files), so this fires the event with location only.
|
|
539
|
+
trackUsage('willAddMediaLibraryAssets', {
|
|
540
|
+
location: MEDIA_LIBRARY_LOCATION
|
|
541
|
+
});
|
|
376
542
|
try {
|
|
377
543
|
await uploadFromUrls({
|
|
378
544
|
urls,
|
|
@@ -399,93 +565,105 @@ const AssetsPage = ()=>{
|
|
|
399
565
|
disabled: !canCreate,
|
|
400
566
|
children: /*#__PURE__*/ jsx(AssetSelectionProvider, {
|
|
401
567
|
disabled: !canUpdate,
|
|
402
|
-
children: /*#__PURE__*/
|
|
403
|
-
children:
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
minHeight: "100vh",
|
|
411
|
-
background: "neutral0",
|
|
568
|
+
children: /*#__PURE__*/ jsx(BusyAssetsProvider, {
|
|
569
|
+
children: /*#__PURE__*/ jsxs(AssetsDndProvider, {
|
|
570
|
+
locations: itemLocations,
|
|
571
|
+
children: [
|
|
572
|
+
/*#__PURE__*/ jsx(ClearSelectionOnChange, {
|
|
573
|
+
listQueryKey: listQueryKey
|
|
574
|
+
}),
|
|
575
|
+
/*#__PURE__*/ jsx(Layouts.Root, {
|
|
412
576
|
sideNav: /*#__PURE__*/ jsx(FolderTree, {
|
|
413
577
|
currentFolderId: currentFolderId,
|
|
414
578
|
showActiveFolder: !isSearching,
|
|
415
579
|
onSelectFolder: navigateToFolderId
|
|
416
580
|
}),
|
|
417
|
-
children:
|
|
418
|
-
/*#__PURE__*/
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
title: pageHeaderTitle,
|
|
429
|
-
primaryAction: canCreate && /*#__PURE__*/ jsxs(SimpleMenu, {
|
|
430
|
-
popoverPlacement: "bottom-end",
|
|
431
|
-
variant: "default",
|
|
432
|
-
endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
|
|
433
|
-
label: formatMessage({
|
|
434
|
-
id: getTranslationKey('new'),
|
|
435
|
-
defaultMessage: 'New'
|
|
436
|
-
}),
|
|
437
|
-
children: [
|
|
438
|
-
/*#__PURE__*/ jsx(MenuItem, {
|
|
439
|
-
onSelect: ()=>setIsCreateFolderDialogOpen(true),
|
|
440
|
-
startIcon: /*#__PURE__*/ jsx(Folder, {}),
|
|
441
|
-
children: formatMessage({
|
|
442
|
-
id: getTranslationKey('folder.create.title'),
|
|
443
|
-
defaultMessage: 'New folder'
|
|
444
|
-
})
|
|
445
|
-
}),
|
|
446
|
-
/*#__PURE__*/ jsx(MenuItem, {
|
|
447
|
-
onSelect: handleFileSelect,
|
|
448
|
-
startIcon: /*#__PURE__*/ jsx(Files, {}),
|
|
449
|
-
children: formatMessage({
|
|
450
|
-
id: getTranslationKey('import-files'),
|
|
451
|
-
defaultMessage: 'Import files'
|
|
452
|
-
})
|
|
453
|
-
}),
|
|
454
|
-
/*#__PURE__*/ jsx(MenuItem, {
|
|
455
|
-
onSelect: ()=>setIsUrlDialogOpen(true),
|
|
456
|
-
startIcon: /*#__PURE__*/ jsx(Link, {}),
|
|
457
|
-
children: formatMessage({
|
|
458
|
-
id: getTranslationKey('import-from-url'),
|
|
459
|
-
defaultMessage: 'Import from URL'
|
|
460
|
-
})
|
|
461
|
-
})
|
|
462
|
-
]
|
|
581
|
+
children: /*#__PURE__*/ jsx(Page.Main, {
|
|
582
|
+
children: /*#__PURE__*/ jsxs(Box, {
|
|
583
|
+
ref: uploadDropZoneRef,
|
|
584
|
+
children: [
|
|
585
|
+
/*#__PURE__*/ jsx(VisuallyHidden, {
|
|
586
|
+
children: /*#__PURE__*/ jsx("input", {
|
|
587
|
+
type: "file",
|
|
588
|
+
ref: fileInputRef,
|
|
589
|
+
onChange: handleFileChange,
|
|
590
|
+
multiple: true
|
|
591
|
+
})
|
|
463
592
|
}),
|
|
464
|
-
|
|
593
|
+
/*#__PURE__*/ jsx(Box, {
|
|
594
|
+
ref: headerSentinelRef,
|
|
595
|
+
height: 0,
|
|
596
|
+
"aria-hidden": true
|
|
597
|
+
}),
|
|
598
|
+
/*#__PURE__*/ jsxs(StickyHeader, {
|
|
599
|
+
$compact: isHeaderCompact,
|
|
465
600
|
children: [
|
|
466
|
-
/*#__PURE__*/ jsxs(
|
|
467
|
-
justifyContent: "space-between",
|
|
468
|
-
alignItems: "center",
|
|
469
|
-
gap: 4,
|
|
470
|
-
width: "100%",
|
|
601
|
+
/*#__PURE__*/ jsxs(TitleRow, {
|
|
471
602
|
children: [
|
|
472
|
-
/*#__PURE__*/
|
|
473
|
-
|
|
474
|
-
|
|
603
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
604
|
+
variant: "alpha",
|
|
605
|
+
tag: "h1",
|
|
606
|
+
children: pageHeaderTitle
|
|
607
|
+
}),
|
|
608
|
+
canCreate && /*#__PURE__*/ jsxs(SimpleMenu, {
|
|
609
|
+
popoverPlacement: "bottom-end",
|
|
610
|
+
variant: "default",
|
|
611
|
+
endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
|
|
612
|
+
label: formatMessage({
|
|
613
|
+
id: getTranslationKey('new'),
|
|
614
|
+
defaultMessage: 'New'
|
|
615
|
+
}),
|
|
475
616
|
children: [
|
|
476
|
-
/*#__PURE__*/ jsx(
|
|
477
|
-
|
|
617
|
+
/*#__PURE__*/ jsx(MenuItem, {
|
|
618
|
+
onSelect: ()=>setIsCreateFolderDialogOpen(true),
|
|
619
|
+
startIcon: /*#__PURE__*/ jsx(Folder, {}),
|
|
620
|
+
children: formatMessage({
|
|
621
|
+
id: getTranslationKey('folder.create.title'),
|
|
622
|
+
defaultMessage: 'New folder'
|
|
623
|
+
})
|
|
478
624
|
}),
|
|
479
|
-
/*#__PURE__*/ jsx(
|
|
625
|
+
/*#__PURE__*/ jsx(MenuItem, {
|
|
626
|
+
onSelect: handleFileSelect,
|
|
627
|
+
startIcon: /*#__PURE__*/ jsx(Files, {}),
|
|
628
|
+
children: formatMessage({
|
|
629
|
+
id: getTranslationKey('import-files'),
|
|
630
|
+
defaultMessage: 'Import files'
|
|
631
|
+
})
|
|
632
|
+
}),
|
|
633
|
+
/*#__PURE__*/ jsx(MenuItem, {
|
|
634
|
+
onSelect: ()=>setIsUrlDialogOpen(true),
|
|
635
|
+
startIcon: /*#__PURE__*/ jsx(Link, {}),
|
|
636
|
+
children: formatMessage({
|
|
637
|
+
id: getTranslationKey('import-from-url'),
|
|
638
|
+
defaultMessage: 'Import from URL'
|
|
639
|
+
})
|
|
640
|
+
})
|
|
641
|
+
]
|
|
642
|
+
})
|
|
643
|
+
]
|
|
644
|
+
}),
|
|
645
|
+
/*#__PURE__*/ jsxs(Toolbar, {
|
|
646
|
+
$compact: isHeaderCompact,
|
|
647
|
+
children: [
|
|
648
|
+
/*#__PURE__*/ jsxs(FilterSearchGroup, {
|
|
649
|
+
children: [
|
|
650
|
+
/*#__PURE__*/ jsx(Box, {
|
|
651
|
+
children: /*#__PURE__*/ jsx(FilterMenu, {
|
|
652
|
+
listFilters: listFilters
|
|
653
|
+
})
|
|
654
|
+
}),
|
|
655
|
+
/*#__PURE__*/ jsx(SearchSlot, {
|
|
656
|
+
children: /*#__PURE__*/ jsx(AssetsSearchInput, {})
|
|
657
|
+
})
|
|
480
658
|
]
|
|
481
659
|
}),
|
|
482
|
-
/*#__PURE__*/ jsxs(
|
|
483
|
-
gap: 4,
|
|
484
|
-
alignItems: "center",
|
|
660
|
+
/*#__PURE__*/ jsxs(SortToggleGroup, {
|
|
485
661
|
children: [
|
|
486
|
-
/*#__PURE__*/ jsx(
|
|
487
|
-
|
|
488
|
-
|
|
662
|
+
/*#__PURE__*/ jsx(Box, {
|
|
663
|
+
children: /*#__PURE__*/ jsx(SortMenu, {
|
|
664
|
+
sort: listSort,
|
|
665
|
+
showFoldersGroup: !isGridView
|
|
666
|
+
})
|
|
489
667
|
}),
|
|
490
668
|
/*#__PURE__*/ jsxs(StyledToggleGroup, {
|
|
491
669
|
type: "single",
|
|
@@ -504,9 +682,11 @@ const AssetsPage = ()=>{
|
|
|
504
682
|
}),
|
|
505
683
|
children: [
|
|
506
684
|
/*#__PURE__*/ jsx(List, {}),
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
685
|
+
/*#__PURE__*/ jsx(ToggleLabel, {
|
|
686
|
+
children: formatMessage({
|
|
687
|
+
id: getTranslationKey('view.table'),
|
|
688
|
+
defaultMessage: 'Table view'
|
|
689
|
+
})
|
|
510
690
|
})
|
|
511
691
|
]
|
|
512
692
|
}),
|
|
@@ -518,9 +698,11 @@ const AssetsPage = ()=>{
|
|
|
518
698
|
}),
|
|
519
699
|
children: [
|
|
520
700
|
/*#__PURE__*/ jsx(GridFour, {}),
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
701
|
+
/*#__PURE__*/ jsx(ToggleLabel, {
|
|
702
|
+
children: formatMessage({
|
|
703
|
+
id: getTranslationKey('view.grid'),
|
|
704
|
+
defaultMessage: 'Grid view'
|
|
705
|
+
})
|
|
524
706
|
})
|
|
525
707
|
]
|
|
526
708
|
})
|
|
@@ -531,52 +713,59 @@ const AssetsPage = ()=>{
|
|
|
531
713
|
]
|
|
532
714
|
}),
|
|
533
715
|
/*#__PURE__*/ jsx(FilterBadges, {
|
|
534
|
-
listFilters: listFilters
|
|
716
|
+
listFilters: listFilters,
|
|
717
|
+
compact: isHeaderCompact
|
|
718
|
+
})
|
|
719
|
+
]
|
|
720
|
+
}),
|
|
721
|
+
/*#__PURE__*/ jsxs(Layouts.Content, {
|
|
722
|
+
children: [
|
|
723
|
+
/*#__PURE__*/ jsx(BetaNotice, {}),
|
|
724
|
+
assetPageSubscribers,
|
|
725
|
+
/*#__PURE__*/ jsxs(DropZoneWithOverlay, {
|
|
726
|
+
children: [
|
|
727
|
+
/*#__PURE__*/ jsx(DropFilesMessage, {
|
|
728
|
+
uploadDropZoneRef: uploadDropZoneRef,
|
|
729
|
+
folderName: title
|
|
730
|
+
}),
|
|
731
|
+
/*#__PURE__*/ jsx(AssetsView, {
|
|
732
|
+
view: view,
|
|
733
|
+
folders: folders,
|
|
734
|
+
isLoadingFolders: isLoadingFolders,
|
|
735
|
+
assets: assets,
|
|
736
|
+
isLoadingAssets: isLoadingAssets,
|
|
737
|
+
isFetchingMore: isFetchingMore,
|
|
738
|
+
hasNextPage: hasNextPage,
|
|
739
|
+
fetchNextPage: fetchNextPage,
|
|
740
|
+
error: assetsError,
|
|
741
|
+
locations: itemLocations,
|
|
742
|
+
searchQuery: searchQuery,
|
|
743
|
+
assetsSort: listSort.assetsSort,
|
|
744
|
+
foldersPosition: listSort.foldersPosition,
|
|
745
|
+
hasActiveFilters: listFilters.filters.length > 0,
|
|
746
|
+
onClearFilters: listFilters.clearFilters,
|
|
747
|
+
onAssetItemClick: openDetails,
|
|
748
|
+
onAddAssets: handleFileSelect,
|
|
749
|
+
canAddAssets: canCreate,
|
|
750
|
+
onClearSearch: clearSearch
|
|
751
|
+
})
|
|
752
|
+
]
|
|
535
753
|
})
|
|
536
754
|
]
|
|
537
755
|
})
|
|
538
|
-
|
|
539
|
-
}),
|
|
540
|
-
/*#__PURE__*/ jsx(Layouts.Content, {
|
|
541
|
-
children: /*#__PURE__*/ jsxs(DropZoneWithOverlay, {
|
|
542
|
-
children: [
|
|
543
|
-
/*#__PURE__*/ jsx(DropFilesMessage, {
|
|
544
|
-
uploadDropZoneRef: uploadDropZoneRef,
|
|
545
|
-
folderName: title
|
|
546
|
-
}),
|
|
547
|
-
/*#__PURE__*/ jsx(AssetsView, {
|
|
548
|
-
view: view,
|
|
549
|
-
folders: folders,
|
|
550
|
-
isLoadingFolders: isLoadingFolders,
|
|
551
|
-
assets: assets,
|
|
552
|
-
isLoadingAssets: isLoadingAssets,
|
|
553
|
-
isFetchingMore: isFetchingMore,
|
|
554
|
-
hasNextPage: hasNextPage,
|
|
555
|
-
fetchNextPage: fetchNextPage,
|
|
556
|
-
error: assetsError,
|
|
557
|
-
searchQuery: searchQuery,
|
|
558
|
-
assetsSort: listSort.assetsSort,
|
|
559
|
-
foldersPosition: listSort.foldersPosition,
|
|
560
|
-
hasActiveFilters: listFilters.filters.length > 0,
|
|
561
|
-
onClearFilters: listFilters.clearFilters,
|
|
562
|
-
onAssetItemClick: openDetails,
|
|
563
|
-
onAddAssets: handleFileSelect,
|
|
564
|
-
canAddAssets: canCreate,
|
|
565
|
-
onClearSearch: clearSearch
|
|
566
|
-
})
|
|
567
|
-
]
|
|
568
|
-
})
|
|
756
|
+
]
|
|
569
757
|
})
|
|
570
|
-
|
|
758
|
+
})
|
|
571
759
|
})
|
|
572
|
-
|
|
573
|
-
|
|
760
|
+
]
|
|
761
|
+
})
|
|
574
762
|
})
|
|
575
763
|
})
|
|
576
764
|
}),
|
|
577
|
-
/*#__PURE__*/ jsx(
|
|
765
|
+
/*#__PURE__*/ jsx(FolderFormDialog, {
|
|
578
766
|
open: isCreateFolderDialogOpen,
|
|
579
|
-
|
|
767
|
+
mode: "create",
|
|
768
|
+
parentFolderName: title,
|
|
580
769
|
parentFolderId: currentFolderId,
|
|
581
770
|
onClose: ()=>setIsCreateFolderDialogOpen(false)
|
|
582
771
|
}),
|