@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.
Files changed (154) hide show
  1. package/dist/admin/future/pages/Assets/AssetsPage.js +201 -137
  2. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  3. package/dist/admin/future/pages/Assets/AssetsPage.mjs +202 -138
  4. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  5. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -30
  6. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  7. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +163 -32
  8. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  9. package/dist/admin/future/pages/Assets/components/AssetsTable.js +222 -59
  10. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +223 -60
  12. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +252 -0
  14. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +250 -0
  16. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
  18. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
  20. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +111 -36
  22. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +113 -38
  24. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
  26. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
  28. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
  30. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
  32. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
  34. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
  36. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
  38. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
  40. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
  42. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
  44. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
  46. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
  48. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/EmptyState.js +63 -0
  50. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -0
  51. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +61 -0
  52. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -0
  53. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +120 -22
  54. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +121 -23
  56. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
  58. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
  60. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
  61. package/dist/admin/future/pages/Assets/components/SortMenu.js +165 -0
  62. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +163 -0
  64. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +59 -0
  66. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
  67. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +55 -0
  68. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
  69. package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
  70. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
  72. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
  74. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
  76. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
  78. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
  80. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
  81. package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
  82. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
  84. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
  85. package/dist/admin/future/services/assets.js +33 -1
  86. package/dist/admin/future/services/assets.js.map +1 -1
  87. package/dist/admin/future/services/assets.mjs +33 -2
  88. package/dist/admin/future/services/assets.mjs.map +1 -1
  89. package/dist/admin/future/services/folders.js +3 -3
  90. package/dist/admin/future/services/folders.js.map +1 -1
  91. package/dist/admin/future/services/folders.mjs +3 -3
  92. package/dist/admin/future/services/folders.mjs.map +1 -1
  93. package/dist/admin/future/services/uploadFileViaXHR.js +23 -2
  94. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
  95. package/dist/admin/future/services/uploadFileViaXHR.mjs +23 -2
  96. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
  97. package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
  98. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
  99. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
  100. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
  101. package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
  102. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
  103. package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
  104. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
  105. package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
  106. package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
  107. package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
  108. package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
  109. package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
  110. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
  111. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
  112. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
  113. package/dist/admin/future/utils/getFolderLabel.js +31 -0
  114. package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
  115. package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
  116. package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
  117. package/dist/admin/hooks/useUpload.js +15 -9
  118. package/dist/admin/hooks/useUpload.js.map +1 -1
  119. package/dist/admin/hooks/useUpload.mjs +17 -11
  120. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  121. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +1 -1
  122. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
  123. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +1 -0
  124. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
  125. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
  126. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
  127. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
  128. package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
  129. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
  130. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
  131. package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
  132. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +11 -0
  133. package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
  134. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +17 -0
  135. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +39 -0
  136. package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
  137. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +30 -0
  138. package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
  139. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
  140. package/dist/admin/src/future/services/assets.d.ts +4 -1
  141. package/dist/admin/src/future/services/folders.d.ts +4 -1
  142. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +1 -17
  143. package/dist/admin/src/future/types/dnd.d.ts +5 -0
  144. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
  145. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
  146. package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
  147. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
  148. package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
  149. package/dist/admin/translations/en.json.js +36 -0
  150. package/dist/admin/translations/en.json.js.map +1 -1
  151. package/dist/admin/translations/en.json.mjs +36 -0
  152. package/dist/admin/translations/en.json.mjs.map +1 -1
  153. package/dist/shared/contracts/folders.d.ts +1 -1
  154. 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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"}