@strapi/upload 5.50.2 → 5.51.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/pages/Assets/AssetsPage.js +201 -137
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +202 -138
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -30
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +163 -32
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +222 -59
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +223 -60
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +252 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +250 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +111 -36
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +113 -38
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/EmptyState.js +63 -0
- package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs +61 -0
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +120 -22
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +121 -23
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js +165 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +163 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +59 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +55 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
- package/dist/admin/future/services/assets.js +33 -1
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +33 -2
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +3 -3
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +3 -3
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.js +23 -2
- package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.mjs +23 -2
- package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
- package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
- package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
- package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.js +31 -0
- package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
- package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
- package/dist/admin/hooks/useUpload.js +15 -9
- package/dist/admin/hooks/useUpload.js.map +1 -1
- package/dist/admin/hooks/useUpload.mjs +17 -11
- package/dist/admin/hooks/useUpload.mjs.map +1 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +1 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +1 -0
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
- package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +11 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +39 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +30 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
- package/dist/admin/src/future/services/assets.d.ts +4 -1
- package/dist/admin/src/future/services/folders.d.ts +4 -1
- package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +1 -17
- package/dist/admin/src/future/types/dnd.d.ts +5 -0
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
- package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
- package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
- package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
- package/dist/admin/translations/en.json.js +36 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +36 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/shared/contracts/folders.d.ts +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
|
+
var designSystem = require('@strapi/design-system');
|
|
7
|
+
var icons = require('@strapi/icons');
|
|
8
|
+
var reactIntl = require('react-intl');
|
|
9
|
+
var styledComponents = require('styled-components');
|
|
10
|
+
var useAiAvailability = require('../../../../hooks/useAiAvailability.js');
|
|
11
|
+
var assets = require('../../../services/assets.js');
|
|
12
|
+
var translations = require('../../../utils/translations.js');
|
|
13
|
+
var useAssetSelection = require('../hooks/useAssetSelection.js');
|
|
14
|
+
var BulkMoveDialog = require('./BulkMoveDialog.js');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Floating bulk action bar for the future Media Library.
|
|
18
|
+
*
|
|
19
|
+
* TODO: create-metadata control is a styled stub (toast on click)
|
|
20
|
+
*/ const Bar = styledComponents.styled(designSystem.Flex)`
|
|
21
|
+
position: fixed;
|
|
22
|
+
bottom: ${({ theme })=>theme.spaces[4]};
|
|
23
|
+
left: 50%;
|
|
24
|
+
transform: translateX(-50%);
|
|
25
|
+
z-index: ${({ theme })=>theme.zIndices.popover};
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: ${({ theme })=>theme.spaces[2]};
|
|
28
|
+
padding: ${({ theme })=>`${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};
|
|
29
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
30
|
+
border: 1px solid ${({ theme })=>theme.colors.neutral150};
|
|
31
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
32
|
+
box-shadow: ${({ theme })=>theme.shadows.popupShadow};
|
|
33
|
+
`;
|
|
34
|
+
const ActionCluster = styledComponents.styled(designSystem.Flex)`
|
|
35
|
+
margin-left: auto;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: ${({ theme })=>theme.spaces[2]};
|
|
38
|
+
`;
|
|
39
|
+
const VerticalDivider = styledComponents.styled(designSystem.Box)`
|
|
40
|
+
width: 1px;
|
|
41
|
+
align-self: stretch;
|
|
42
|
+
background: ${({ theme })=>theme.colors.neutral150};
|
|
43
|
+
margin-left: ${({ theme })=>theme.spaces[1]};
|
|
44
|
+
`;
|
|
45
|
+
const BulkActionsBar = ()=>{
|
|
46
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
47
|
+
const { toggleNotification } = strapiAdmin.useNotification();
|
|
48
|
+
const { isEnabled: isAiMetadataEnabled } = useAiAvailability.useAIAvailability();
|
|
49
|
+
const { selectedIds, selectedFolderIds, clear } = useAssetSelection.useAssetSelection();
|
|
50
|
+
const [bulkDeleteItems, { isLoading: isDeleting }] = assets.useBulkDeleteItemsMutation();
|
|
51
|
+
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = React.useState(false);
|
|
52
|
+
const [isMoveDialogOpen, setIsMoveDialogOpen] = React.useState(false);
|
|
53
|
+
const count = selectedIds.size + selectedFolderIds.size;
|
|
54
|
+
const showStubNotification = (translationKey, defaultMessage)=>{
|
|
55
|
+
toggleNotification({
|
|
56
|
+
type: 'info',
|
|
57
|
+
message: formatMessage({
|
|
58
|
+
id: translations.getTranslationKey(translationKey),
|
|
59
|
+
defaultMessage
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
const handleConfirmDelete = async (e)=>{
|
|
64
|
+
// Radix AlertDialog.Action closes the dialog on click by default; prevent
|
|
65
|
+
// that so the dialog stays open showing the loader while the request runs
|
|
66
|
+
// (a bulk delete can take a while depending on the number of assets).
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
// Guard re-entry while pending.
|
|
69
|
+
if (isDeleting) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const res = await bulkDeleteItems({
|
|
73
|
+
fileIds: Array.from(selectedIds),
|
|
74
|
+
folderIds: Array.from(selectedFolderIds)
|
|
75
|
+
});
|
|
76
|
+
if ('error' in res) {
|
|
77
|
+
// Keep the dialog open and the selection intact so the user can retry
|
|
78
|
+
// (Confirm again) or Cancel; only surface the error toast.
|
|
79
|
+
toggleNotification({
|
|
80
|
+
type: 'danger',
|
|
81
|
+
message: formatMessage({
|
|
82
|
+
id: translations.getTranslationKey('list.bulk-actions.delete.error'),
|
|
83
|
+
defaultMessage: 'An error occurred while deleting the items.'
|
|
84
|
+
})
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
setIsDeleteDialogOpen(false);
|
|
89
|
+
toggleNotification({
|
|
90
|
+
type: 'success',
|
|
91
|
+
message: formatMessage({
|
|
92
|
+
id: translations.getTranslationKey('list.bulk-actions.delete.success'),
|
|
93
|
+
defaultMessage: '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}'
|
|
94
|
+
}, {
|
|
95
|
+
count
|
|
96
|
+
})
|
|
97
|
+
});
|
|
98
|
+
clear();
|
|
99
|
+
};
|
|
100
|
+
if (count === 0) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(Bar, {
|
|
104
|
+
tag: "section",
|
|
105
|
+
role: "region",
|
|
106
|
+
"aria-label": formatMessage({
|
|
107
|
+
id: translations.getTranslationKey('list.bulk-actions.label'),
|
|
108
|
+
defaultMessage: 'Bulk actions'
|
|
109
|
+
}),
|
|
110
|
+
children: [
|
|
111
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
112
|
+
fontWeight: "bold",
|
|
113
|
+
textColor: "neutral800",
|
|
114
|
+
marginRight: 4,
|
|
115
|
+
children: formatMessage({
|
|
116
|
+
id: translations.getTranslationKey('list.bulk-actions.selected-count'),
|
|
117
|
+
defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}'
|
|
118
|
+
}, {
|
|
119
|
+
count
|
|
120
|
+
})
|
|
121
|
+
}),
|
|
122
|
+
/*#__PURE__*/ jsxRuntime.jsxs(ActionCluster, {
|
|
123
|
+
children: [
|
|
124
|
+
isAiMetadataEnabled && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
125
|
+
size: "S",
|
|
126
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Sparkle, {}),
|
|
127
|
+
disabled: isDeleting,
|
|
128
|
+
onClick: ()=>showStubNotification('list.bulk-actions.create-metadata-not-available', "Generate metadata isn't available yet"),
|
|
129
|
+
children: formatMessage({
|
|
130
|
+
id: translations.getTranslationKey('list.bulk-actions.create-metadata'),
|
|
131
|
+
defaultMessage: 'Create metadata'
|
|
132
|
+
})
|
|
133
|
+
}),
|
|
134
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
135
|
+
variant: "tertiary",
|
|
136
|
+
disabled: isDeleting,
|
|
137
|
+
label: formatMessage({
|
|
138
|
+
id: translations.getTranslationKey('list.bulk-actions.move'),
|
|
139
|
+
defaultMessage: 'Move'
|
|
140
|
+
}),
|
|
141
|
+
onClick: ()=>setIsMoveDialogOpen(true),
|
|
142
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowRight, {})
|
|
143
|
+
}),
|
|
144
|
+
/*#__PURE__*/ jsxRuntime.jsx(BulkMoveDialog.BulkMoveDialog, {
|
|
145
|
+
open: isMoveDialogOpen,
|
|
146
|
+
onClose: ()=>setIsMoveDialogOpen(false)
|
|
147
|
+
}),
|
|
148
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Root, {
|
|
149
|
+
open: isDeleteDialogOpen,
|
|
150
|
+
onOpenChange: (open)=>{
|
|
151
|
+
// The dialog must stay open while the request runs — a bulk delete
|
|
152
|
+
// can't be aborted halfway, so the loader is the source of truth.
|
|
153
|
+
if (!isDeleting) {
|
|
154
|
+
setIsDeleteDialogOpen(open);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
children: [
|
|
158
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Trigger, {
|
|
159
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
160
|
+
variant: "danger-light",
|
|
161
|
+
disabled: isDeleting,
|
|
162
|
+
label: formatMessage({
|
|
163
|
+
id: translations.getTranslationKey('list.bulk-actions.delete'),
|
|
164
|
+
defaultMessage: 'Delete'
|
|
165
|
+
}),
|
|
166
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {})
|
|
167
|
+
})
|
|
168
|
+
}),
|
|
169
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Content, {
|
|
170
|
+
children: [
|
|
171
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Header, {
|
|
172
|
+
children: formatMessage({
|
|
173
|
+
id: translations.getTranslationKey('list.bulk-actions.delete.confirm.title'),
|
|
174
|
+
defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?'
|
|
175
|
+
}, {
|
|
176
|
+
count
|
|
177
|
+
})
|
|
178
|
+
}),
|
|
179
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Body, {
|
|
180
|
+
icon: /*#__PURE__*/ jsxRuntime.jsx(icons.WarningCircle, {
|
|
181
|
+
width: "24px",
|
|
182
|
+
height: "24px",
|
|
183
|
+
fill: "danger600"
|
|
184
|
+
}),
|
|
185
|
+
textAlign: "center",
|
|
186
|
+
children: [
|
|
187
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
188
|
+
children: formatMessage({
|
|
189
|
+
id: translations.getTranslationKey('list.bulk-actions.delete.confirm.description.are-you-sure'),
|
|
190
|
+
defaultMessage: 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.'
|
|
191
|
+
})
|
|
192
|
+
}),
|
|
193
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
194
|
+
children: formatMessage({
|
|
195
|
+
id: translations.getTranslationKey('list.bulk-actions.delete.confirm.description.cant-be-undone'),
|
|
196
|
+
defaultMessage: 'This action can’t be undone. Deleting a folder also removes everything inside it, and any linked content will break – media asset containers will appear empty.'
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
]
|
|
200
|
+
}),
|
|
201
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Footer, {
|
|
202
|
+
children: [
|
|
203
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Cancel, {
|
|
204
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
205
|
+
variant: "tertiary",
|
|
206
|
+
disabled: isDeleting,
|
|
207
|
+
fullWidth: true,
|
|
208
|
+
children: formatMessage({
|
|
209
|
+
id: 'app.components.Button.cancel',
|
|
210
|
+
defaultMessage: 'Cancel'
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
}),
|
|
214
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Action, {
|
|
215
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
216
|
+
variant: "danger-light",
|
|
217
|
+
loading: isDeleting,
|
|
218
|
+
onClick: handleConfirmDelete,
|
|
219
|
+
fullWidth: true,
|
|
220
|
+
children: formatMessage({
|
|
221
|
+
id: 'app.components.Button.confirm',
|
|
222
|
+
defaultMessage: 'Confirm'
|
|
223
|
+
})
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
]
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
})
|
|
232
|
+
]
|
|
233
|
+
}),
|
|
234
|
+
/*#__PURE__*/ jsxRuntime.jsx(VerticalDivider, {
|
|
235
|
+
"aria-hidden": true
|
|
236
|
+
}),
|
|
237
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
238
|
+
variant: "ghost",
|
|
239
|
+
label: formatMessage({
|
|
240
|
+
id: translations.getTranslationKey('list.bulk-actions.clear'),
|
|
241
|
+
defaultMessage: 'Clear selection'
|
|
242
|
+
}),
|
|
243
|
+
onClick: clear,
|
|
244
|
+
disabled: isDeleting,
|
|
245
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {})
|
|
246
|
+
})
|
|
247
|
+
]
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
exports.BulkActionsBar = BulkActionsBar;
|
|
252
|
+
//# sourceMappingURL=BulkActionsBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkActionsBar.js","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useState, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Dialog, Flex, IconButton, Typography } from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useAIAvailability } from '../../../../hooks/useAiAvailability';\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\n\n/**\n * Floating bulk action bar for the future Media Library.\n *\n * TODO: create-metadata control is a styled stub (toast on click)\n */\nconst Bar = styled(Flex)`\n position: fixed;\n bottom: ${({ theme }) => theme.spaces[4]};\n left: 50%;\n transform: translateX(-50%);\n z-index: ${({ theme }) => theme.zIndices.popover};\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\nexport const BulkActionsBar = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { isEnabled: isAiMetadataEnabled } = useAIAvailability();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const showStubNotification = (translationKey: string, defaultMessage: string) => {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslationKey(translationKey),\n defaultMessage,\n }),\n });\n };\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n });\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.error'),\n defaultMessage: 'An error occurred while deleting the items.',\n }),\n });\n return;\n }\n\n setIsDeleteDialogOpen(false);\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.success'),\n defaultMessage:\n '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}',\n },\n { count }\n ),\n });\n clear();\n };\n\n if (count === 0) {\n return null;\n }\n\n return (\n <Bar\n tag=\"section\"\n role=\"region\"\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <ActionCluster>\n {isAiMetadataEnabled && (\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={isDeleting}\n onClick={() =>\n showStubNotification(\n 'list.bulk-actions.create-metadata-not-available',\n \"Generate metadata isn't available yet\"\n )\n }\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isDeleting}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog open={isMoveDialogOpen} onClose={() => setIsMoveDialogOpen(false)} />\n\n <Dialog.Root\n open={isDeleteDialogOpen}\n onOpenChange={(open: boolean) => {\n // The dialog must stay open while the request runs — a bulk delete\n // can't be aborted halfway, so the loader is the source of truth.\n if (!isDeleting) {\n setIsDeleteDialogOpen(open);\n }\n }}\n >\n <Dialog.Trigger>\n <IconButton\n variant=\"danger-light\"\n disabled={isDeleting}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.confirm.title'),\n defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?',\n },\n { count }\n )}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n <Typography>\n {formatMessage({\n id: getTranslationKey(\n 'list.bulk-actions.delete.confirm.description.are-you-sure'\n ),\n defaultMessage:\n 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: getTranslationKey(\n 'list.bulk-actions.delete.confirm.description.cant-be-undone'\n ),\n defaultMessage:\n 'This action can’t be undone. Deleting a folder also removes everything inside it, and any linked content will break – media asset containers will appear empty.',\n })}\n </Typography>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger-light\"\n loading={isDeleting}\n onClick={handleConfirmDelete}\n fullWidth\n >\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n </ActionCluster>\n\n <VerticalDivider aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isDeleting}\n >\n <Cross />\n </IconButton>\n </Bar>\n );\n};\n"],"names":["Bar","styled","Flex","theme","spaces","zIndices","popover","colors","neutral0","neutral150","borderRadius","shadows","popupShadow","ActionCluster","VerticalDivider","Box","BulkActionsBar","formatMessage","useIntl","toggleNotification","useNotification","isEnabled","isAiMetadataEnabled","useAIAvailability","selectedIds","selectedFolderIds","clear","useAssetSelection","bulkDeleteItems","isLoading","isDeleting","useBulkDeleteItemsMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","count","size","showStubNotification","translationKey","defaultMessage","type","message","id","getTranslationKey","handleConfirmDelete","e","preventDefault","res","fileIds","Array","from","folderIds","_jsxs","tag","role","aria-label","_jsx","Typography","fontWeight","textColor","marginRight","Button","startIcon","Sparkle","disabled","onClick","IconButton","variant","label","ArrowRight","BulkMoveDialog","open","onClose","Dialog","Root","onOpenChange","Trigger","Trash","Content","Header","Body","icon","WarningCircle","width","height","fill","textAlign","Footer","Cancel","fullWidth","Action","loading","aria-hidden","Cross"],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { useNotification } from '@strapi/admin/strapi-admin';
|
|
4
|
+
import { Typography, Button, IconButton, Dialog, Flex, Box } from '@strapi/design-system';
|
|
5
|
+
import { Sparkle, ArrowRight, Trash, WarningCircle, Cross } from '@strapi/icons';
|
|
6
|
+
import { useIntl } from 'react-intl';
|
|
7
|
+
import { styled } from 'styled-components';
|
|
8
|
+
import { useAIAvailability } from '../../../../hooks/useAiAvailability.mjs';
|
|
9
|
+
import { useBulkDeleteItemsMutation } from '../../../services/assets.mjs';
|
|
10
|
+
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
11
|
+
import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
|
|
12
|
+
import { BulkMoveDialog } from './BulkMoveDialog.mjs';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Floating bulk action bar for the future Media Library.
|
|
16
|
+
*
|
|
17
|
+
* TODO: create-metadata control is a styled stub (toast on click)
|
|
18
|
+
*/ const Bar = styled(Flex)`
|
|
19
|
+
position: fixed;
|
|
20
|
+
bottom: ${({ theme })=>theme.spaces[4]};
|
|
21
|
+
left: 50%;
|
|
22
|
+
transform: translateX(-50%);
|
|
23
|
+
z-index: ${({ theme })=>theme.zIndices.popover};
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: ${({ theme })=>theme.spaces[2]};
|
|
26
|
+
padding: ${({ theme })=>`${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};
|
|
27
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
28
|
+
border: 1px solid ${({ theme })=>theme.colors.neutral150};
|
|
29
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
30
|
+
box-shadow: ${({ theme })=>theme.shadows.popupShadow};
|
|
31
|
+
`;
|
|
32
|
+
const ActionCluster = styled(Flex)`
|
|
33
|
+
margin-left: auto;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: ${({ theme })=>theme.spaces[2]};
|
|
36
|
+
`;
|
|
37
|
+
const VerticalDivider = styled(Box)`
|
|
38
|
+
width: 1px;
|
|
39
|
+
align-self: stretch;
|
|
40
|
+
background: ${({ theme })=>theme.colors.neutral150};
|
|
41
|
+
margin-left: ${({ theme })=>theme.spaces[1]};
|
|
42
|
+
`;
|
|
43
|
+
const BulkActionsBar = ()=>{
|
|
44
|
+
const { formatMessage } = useIntl();
|
|
45
|
+
const { toggleNotification } = useNotification();
|
|
46
|
+
const { isEnabled: isAiMetadataEnabled } = useAIAvailability();
|
|
47
|
+
const { selectedIds, selectedFolderIds, clear } = useAssetSelection();
|
|
48
|
+
const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();
|
|
49
|
+
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
|
50
|
+
const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);
|
|
51
|
+
const count = selectedIds.size + selectedFolderIds.size;
|
|
52
|
+
const showStubNotification = (translationKey, defaultMessage)=>{
|
|
53
|
+
toggleNotification({
|
|
54
|
+
type: 'info',
|
|
55
|
+
message: formatMessage({
|
|
56
|
+
id: getTranslationKey(translationKey),
|
|
57
|
+
defaultMessage
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const handleConfirmDelete = async (e)=>{
|
|
62
|
+
// Radix AlertDialog.Action closes the dialog on click by default; prevent
|
|
63
|
+
// that so the dialog stays open showing the loader while the request runs
|
|
64
|
+
// (a bulk delete can take a while depending on the number of assets).
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
// Guard re-entry while pending.
|
|
67
|
+
if (isDeleting) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const res = await bulkDeleteItems({
|
|
71
|
+
fileIds: Array.from(selectedIds),
|
|
72
|
+
folderIds: Array.from(selectedFolderIds)
|
|
73
|
+
});
|
|
74
|
+
if ('error' in res) {
|
|
75
|
+
// Keep the dialog open and the selection intact so the user can retry
|
|
76
|
+
// (Confirm again) or Cancel; only surface the error toast.
|
|
77
|
+
toggleNotification({
|
|
78
|
+
type: 'danger',
|
|
79
|
+
message: formatMessage({
|
|
80
|
+
id: getTranslationKey('list.bulk-actions.delete.error'),
|
|
81
|
+
defaultMessage: 'An error occurred while deleting the items.'
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
setIsDeleteDialogOpen(false);
|
|
87
|
+
toggleNotification({
|
|
88
|
+
type: 'success',
|
|
89
|
+
message: formatMessage({
|
|
90
|
+
id: getTranslationKey('list.bulk-actions.delete.success'),
|
|
91
|
+
defaultMessage: '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}'
|
|
92
|
+
}, {
|
|
93
|
+
count
|
|
94
|
+
})
|
|
95
|
+
});
|
|
96
|
+
clear();
|
|
97
|
+
};
|
|
98
|
+
if (count === 0) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return /*#__PURE__*/ jsxs(Bar, {
|
|
102
|
+
tag: "section",
|
|
103
|
+
role: "region",
|
|
104
|
+
"aria-label": formatMessage({
|
|
105
|
+
id: getTranslationKey('list.bulk-actions.label'),
|
|
106
|
+
defaultMessage: 'Bulk actions'
|
|
107
|
+
}),
|
|
108
|
+
children: [
|
|
109
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
110
|
+
fontWeight: "bold",
|
|
111
|
+
textColor: "neutral800",
|
|
112
|
+
marginRight: 4,
|
|
113
|
+
children: formatMessage({
|
|
114
|
+
id: getTranslationKey('list.bulk-actions.selected-count'),
|
|
115
|
+
defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}'
|
|
116
|
+
}, {
|
|
117
|
+
count
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
120
|
+
/*#__PURE__*/ jsxs(ActionCluster, {
|
|
121
|
+
children: [
|
|
122
|
+
isAiMetadataEnabled && /*#__PURE__*/ jsx(Button, {
|
|
123
|
+
size: "S",
|
|
124
|
+
startIcon: /*#__PURE__*/ jsx(Sparkle, {}),
|
|
125
|
+
disabled: isDeleting,
|
|
126
|
+
onClick: ()=>showStubNotification('list.bulk-actions.create-metadata-not-available', "Generate metadata isn't available yet"),
|
|
127
|
+
children: formatMessage({
|
|
128
|
+
id: getTranslationKey('list.bulk-actions.create-metadata'),
|
|
129
|
+
defaultMessage: 'Create metadata'
|
|
130
|
+
})
|
|
131
|
+
}),
|
|
132
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
133
|
+
variant: "tertiary",
|
|
134
|
+
disabled: isDeleting,
|
|
135
|
+
label: formatMessage({
|
|
136
|
+
id: getTranslationKey('list.bulk-actions.move'),
|
|
137
|
+
defaultMessage: 'Move'
|
|
138
|
+
}),
|
|
139
|
+
onClick: ()=>setIsMoveDialogOpen(true),
|
|
140
|
+
children: /*#__PURE__*/ jsx(ArrowRight, {})
|
|
141
|
+
}),
|
|
142
|
+
/*#__PURE__*/ jsx(BulkMoveDialog, {
|
|
143
|
+
open: isMoveDialogOpen,
|
|
144
|
+
onClose: ()=>setIsMoveDialogOpen(false)
|
|
145
|
+
}),
|
|
146
|
+
/*#__PURE__*/ jsxs(Dialog.Root, {
|
|
147
|
+
open: isDeleteDialogOpen,
|
|
148
|
+
onOpenChange: (open)=>{
|
|
149
|
+
// The dialog must stay open while the request runs — a bulk delete
|
|
150
|
+
// can't be aborted halfway, so the loader is the source of truth.
|
|
151
|
+
if (!isDeleting) {
|
|
152
|
+
setIsDeleteDialogOpen(open);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
children: [
|
|
156
|
+
/*#__PURE__*/ jsx(Dialog.Trigger, {
|
|
157
|
+
children: /*#__PURE__*/ jsx(IconButton, {
|
|
158
|
+
variant: "danger-light",
|
|
159
|
+
disabled: isDeleting,
|
|
160
|
+
label: formatMessage({
|
|
161
|
+
id: getTranslationKey('list.bulk-actions.delete'),
|
|
162
|
+
defaultMessage: 'Delete'
|
|
163
|
+
}),
|
|
164
|
+
children: /*#__PURE__*/ jsx(Trash, {})
|
|
165
|
+
})
|
|
166
|
+
}),
|
|
167
|
+
/*#__PURE__*/ jsxs(Dialog.Content, {
|
|
168
|
+
children: [
|
|
169
|
+
/*#__PURE__*/ jsx(Dialog.Header, {
|
|
170
|
+
children: formatMessage({
|
|
171
|
+
id: getTranslationKey('list.bulk-actions.delete.confirm.title'),
|
|
172
|
+
defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?'
|
|
173
|
+
}, {
|
|
174
|
+
count
|
|
175
|
+
})
|
|
176
|
+
}),
|
|
177
|
+
/*#__PURE__*/ jsxs(Dialog.Body, {
|
|
178
|
+
icon: /*#__PURE__*/ jsx(WarningCircle, {
|
|
179
|
+
width: "24px",
|
|
180
|
+
height: "24px",
|
|
181
|
+
fill: "danger600"
|
|
182
|
+
}),
|
|
183
|
+
textAlign: "center",
|
|
184
|
+
children: [
|
|
185
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
186
|
+
children: formatMessage({
|
|
187
|
+
id: getTranslationKey('list.bulk-actions.delete.confirm.description.are-you-sure'),
|
|
188
|
+
defaultMessage: 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.'
|
|
189
|
+
})
|
|
190
|
+
}),
|
|
191
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
192
|
+
children: formatMessage({
|
|
193
|
+
id: getTranslationKey('list.bulk-actions.delete.confirm.description.cant-be-undone'),
|
|
194
|
+
defaultMessage: 'This action can’t be undone. Deleting a folder also removes everything inside it, and any linked content will break – media asset containers will appear empty.'
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
]
|
|
198
|
+
}),
|
|
199
|
+
/*#__PURE__*/ jsxs(Dialog.Footer, {
|
|
200
|
+
children: [
|
|
201
|
+
/*#__PURE__*/ jsx(Dialog.Cancel, {
|
|
202
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
203
|
+
variant: "tertiary",
|
|
204
|
+
disabled: isDeleting,
|
|
205
|
+
fullWidth: true,
|
|
206
|
+
children: formatMessage({
|
|
207
|
+
id: 'app.components.Button.cancel',
|
|
208
|
+
defaultMessage: 'Cancel'
|
|
209
|
+
})
|
|
210
|
+
})
|
|
211
|
+
}),
|
|
212
|
+
/*#__PURE__*/ jsx(Dialog.Action, {
|
|
213
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
214
|
+
variant: "danger-light",
|
|
215
|
+
loading: isDeleting,
|
|
216
|
+
onClick: handleConfirmDelete,
|
|
217
|
+
fullWidth: true,
|
|
218
|
+
children: formatMessage({
|
|
219
|
+
id: 'app.components.Button.confirm',
|
|
220
|
+
defaultMessage: 'Confirm'
|
|
221
|
+
})
|
|
222
|
+
})
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
})
|
|
226
|
+
]
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
}),
|
|
232
|
+
/*#__PURE__*/ jsx(VerticalDivider, {
|
|
233
|
+
"aria-hidden": true
|
|
234
|
+
}),
|
|
235
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
236
|
+
variant: "ghost",
|
|
237
|
+
label: formatMessage({
|
|
238
|
+
id: getTranslationKey('list.bulk-actions.clear'),
|
|
239
|
+
defaultMessage: 'Clear selection'
|
|
240
|
+
}),
|
|
241
|
+
onClick: clear,
|
|
242
|
+
disabled: isDeleting,
|
|
243
|
+
children: /*#__PURE__*/ jsx(Cross, {})
|
|
244
|
+
})
|
|
245
|
+
]
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
export { BulkActionsBar };
|
|
250
|
+
//# sourceMappingURL=BulkActionsBar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkActionsBar.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useState, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Dialog, Flex, IconButton, Typography } from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useAIAvailability } from '../../../../hooks/useAiAvailability';\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\n\n/**\n * Floating bulk action bar for the future Media Library.\n *\n * TODO: create-metadata control is a styled stub (toast on click)\n */\nconst Bar = styled(Flex)`\n position: fixed;\n bottom: ${({ theme }) => theme.spaces[4]};\n left: 50%;\n transform: translateX(-50%);\n z-index: ${({ theme }) => theme.zIndices.popover};\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\nexport const BulkActionsBar = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { isEnabled: isAiMetadataEnabled } = useAIAvailability();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const showStubNotification = (translationKey: string, defaultMessage: string) => {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslationKey(translationKey),\n defaultMessage,\n }),\n });\n };\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n });\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.error'),\n defaultMessage: 'An error occurred while deleting the items.',\n }),\n });\n return;\n }\n\n setIsDeleteDialogOpen(false);\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.success'),\n defaultMessage:\n '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}',\n },\n { count }\n ),\n });\n clear();\n };\n\n if (count === 0) {\n return null;\n }\n\n return (\n <Bar\n tag=\"section\"\n role=\"region\"\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <ActionCluster>\n {isAiMetadataEnabled && (\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={isDeleting}\n onClick={() =>\n showStubNotification(\n 'list.bulk-actions.create-metadata-not-available',\n \"Generate metadata isn't available yet\"\n )\n }\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isDeleting}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog open={isMoveDialogOpen} onClose={() => setIsMoveDialogOpen(false)} />\n\n <Dialog.Root\n open={isDeleteDialogOpen}\n onOpenChange={(open: boolean) => {\n // The dialog must stay open while the request runs — a bulk delete\n // can't be aborted halfway, so the loader is the source of truth.\n if (!isDeleting) {\n setIsDeleteDialogOpen(open);\n }\n }}\n >\n <Dialog.Trigger>\n <IconButton\n variant=\"danger-light\"\n disabled={isDeleting}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.confirm.title'),\n defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?',\n },\n { count }\n )}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n <Typography>\n {formatMessage({\n id: getTranslationKey(\n 'list.bulk-actions.delete.confirm.description.are-you-sure'\n ),\n defaultMessage:\n 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: getTranslationKey(\n 'list.bulk-actions.delete.confirm.description.cant-be-undone'\n ),\n defaultMessage:\n 'This action can’t be undone. Deleting a folder also removes everything inside it, and any linked content will break – media asset containers will appear empty.',\n })}\n </Typography>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger-light\"\n loading={isDeleting}\n onClick={handleConfirmDelete}\n fullWidth\n >\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n </ActionCluster>\n\n <VerticalDivider aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isDeleting}\n >\n <Cross />\n </IconButton>\n </Bar>\n );\n};\n"],"names":["Bar","styled","Flex","theme","spaces","zIndices","popover","colors","neutral0","neutral150","borderRadius","shadows","popupShadow","ActionCluster","VerticalDivider","Box","BulkActionsBar","formatMessage","useIntl","toggleNotification","useNotification","isEnabled","isAiMetadataEnabled","useAIAvailability","selectedIds","selectedFolderIds","clear","useAssetSelection","bulkDeleteItems","isLoading","isDeleting","useBulkDeleteItemsMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","count","size","showStubNotification","translationKey","defaultMessage","type","message","id","getTranslationKey","handleConfirmDelete","e","preventDefault","res","fileIds","Array","from","folderIds","_jsxs","tag","role","aria-label","_jsx","Typography","fontWeight","textColor","marginRight","Button","startIcon","Sparkle","disabled","onClick","IconButton","variant","label","ArrowRight","BulkMoveDialog","open","onClose","Dialog","Root","onOpenChange","Trigger","Trash","Content","Header","Body","icon","WarningCircle","width","height","fill","textAlign","Footer","Cancel","fullWidth","Action","loading","aria-hidden","Cross"],"mappings":"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"}
|