@strapi/upload 5.50.0 → 5.50.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 (140) hide show
  1. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +1 -1
  2. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  3. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +1 -1
  4. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  5. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  6. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  7. package/dist/admin/future/pages/Assets/AssetsPage.js +125 -122
  8. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  9. package/dist/admin/future/pages/Assets/AssetsPage.mjs +125 -122
  10. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +700 -0
  12. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -0
  13. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +678 -0
  14. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +132 -15
  16. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  17. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +135 -18
  18. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  19. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +23 -1
  20. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -1
  21. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +23 -1
  22. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/AssetDetails/useCropImg.js +211 -0
  24. package/dist/admin/future/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -0
  25. package/dist/admin/future/pages/Assets/components/AssetDetails/useCropImg.mjs +188 -0
  26. package/dist/admin/future/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -0
  27. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +48 -3
  28. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +49 -4
  30. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetsTable.js +43 -4
  32. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  33. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +44 -5
  34. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  35. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +195 -0
  36. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +192 -0
  38. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -0
  39. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +37 -0
  40. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -0
  41. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +35 -0
  42. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +18 -0
  44. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -0
  46. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +97 -0
  48. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +94 -0
  50. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -0
  51. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +13 -4
  52. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +13 -4
  54. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +6 -3
  56. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +6 -3
  58. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  59. package/dist/admin/future/services/api.js +37 -1
  60. package/dist/admin/future/services/api.js.map +1 -1
  61. package/dist/admin/future/services/api.mjs +37 -2
  62. package/dist/admin/future/services/api.mjs.map +1 -1
  63. package/dist/admin/future/services/folders.js +36 -5
  64. package/dist/admin/future/services/folders.js.map +1 -1
  65. package/dist/admin/future/services/folders.mjs +36 -6
  66. package/dist/admin/future/services/folders.mjs.map +1 -1
  67. package/dist/admin/future/utils/buildBulkMovePayload.js +20 -0
  68. package/dist/admin/future/utils/buildBulkMovePayload.js.map +1 -0
  69. package/dist/admin/future/utils/buildBulkMovePayload.mjs +18 -0
  70. package/dist/admin/future/utils/buildBulkMovePayload.mjs.map +1 -0
  71. package/dist/admin/future/utils/canDropItemOnFolder.js +64 -0
  72. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -0
  73. package/dist/admin/future/utils/canDropItemOnFolder.mjs +61 -0
  74. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -0
  75. package/dist/admin/future/utils/getBulkMoveErrorMessage.js +23 -0
  76. package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +1 -0
  77. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +21 -0
  78. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +1 -0
  79. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  80. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  81. package/dist/admin/hooks/useAssets.js.map +1 -1
  82. package/dist/admin/hooks/useAssets.mjs.map +1 -1
  83. package/dist/admin/hooks/useBulkEdit.js.map +1 -1
  84. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
  85. package/dist/admin/hooks/useBulkMove.js.map +1 -1
  86. package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
  87. package/dist/admin/hooks/useBulkRemove.js.map +1 -1
  88. package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
  89. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  90. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  91. package/dist/admin/hooks/useEditFolder.js +4 -3
  92. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  93. package/dist/admin/hooks/useEditFolder.mjs +4 -3
  94. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  95. package/dist/admin/hooks/useFolder.js.map +1 -1
  96. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  97. package/dist/admin/hooks/useUpload.js.map +1 -1
  98. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  99. package/dist/admin/pages/SettingsPage/SettingsPage.js +1 -1
  100. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  101. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +1 -1
  102. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  103. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +10 -0
  104. package/dist/admin/src/future/pages/Assets/components/AssetDetails/useCropImg.d.ts +48 -0
  105. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +12 -0
  106. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +6 -0
  107. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +4 -0
  108. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +51 -0
  109. package/dist/admin/src/future/services/api.d.ts +24 -6
  110. package/dist/admin/src/future/services/assets.d.ts +1 -1
  111. package/dist/admin/src/future/services/folders.d.ts +12 -2
  112. package/dist/admin/src/future/services/settings.d.ts +1 -1
  113. package/dist/admin/src/future/types/dnd.d.ts +22 -0
  114. package/dist/admin/src/future/utils/buildBulkMovePayload.d.ts +2 -0
  115. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +9 -0
  116. package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +1 -0
  117. package/dist/admin/src/hooks/useAIMetadataJob.d.ts +1 -1
  118. package/dist/admin/src/hooks/useBulkEdit.d.ts +14 -14
  119. package/dist/admin/src/hooks/useBulkMove.d.ts +146 -15
  120. package/dist/admin/src/hooks/useBulkRemove.d.ts +186 -15
  121. package/dist/admin/src/hooks/useEditFolder.d.ts +3 -2
  122. package/dist/admin/translations/en.json.js +28 -0
  123. package/dist/admin/translations/en.json.js.map +1 -1
  124. package/dist/admin/translations/en.json.mjs +28 -0
  125. package/dist/admin/translations/en.json.mjs.map +1 -1
  126. package/dist/admin/translations/pl.json.js +54 -29
  127. package/dist/admin/translations/pl.json.js.map +1 -1
  128. package/dist/admin/translations/pl.json.mjs +54 -29
  129. package/dist/admin/translations/pl.json.mjs.map +1 -1
  130. package/dist/server/controllers/admin-upload.js +3 -2
  131. package/dist/server/controllers/admin-upload.js.map +1 -1
  132. package/dist/server/controllers/admin-upload.mjs +3 -2
  133. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  134. package/dist/server/controllers/content-api.js +6 -5
  135. package/dist/server/controllers/content-api.js.map +1 -1
  136. package/dist/server/controllers/content-api.mjs +6 -5
  137. package/dist/server/controllers/content-api.mjs.map +1 -1
  138. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  139. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  140. package/package.json +8 -7
@@ -0,0 +1,192 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useCallback, useMemo, createContext, useContext } from 'react';
3
+ import { useSensors, useSensor, PointerSensor, DndContext, pointerWithin, DragOverlay } from '@dnd-kit/core';
4
+ import { useNotification } from '@strapi/admin/strapi-admin';
5
+ import { VisuallyHidden, Box } from '@strapi/design-system';
6
+ import { useIntl } from 'react-intl';
7
+ import { useGetFolderStructureQuery, useBulkMoveMutation } from '../../../../services/folders.mjs';
8
+ import { buildBulkMovePayload } from '../../../../utils/buildBulkMovePayload.mjs';
9
+ import { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder.mjs';
10
+ import { getBulkMoveErrorMessage } from '../../../../utils/getBulkMoveErrorMessage.mjs';
11
+ import { getTranslationKey } from '../../../../utils/translations.mjs';
12
+ import { parseFolderTargetId } from './dndIds.mjs';
13
+ import { DragOverlayChip } from './DragOverlayChip.mjs';
14
+
15
+ const AssetsDndContext = /*#__PURE__*/ createContext(null);
16
+ const useAssetsDndOptional = ()=>useContext(AssetsDndContext);
17
+ const getDragItems = (activeData)=>{
18
+ if (!activeData) {
19
+ return [];
20
+ }
21
+ // TODO(CMS-433): include selectedItems from active data for multi-drag payload members.
22
+ return [
23
+ activeData
24
+ ];
25
+ };
26
+ const AssetsDndProvider = ({ children })=>{
27
+ const { formatMessage } = useIntl();
28
+ const { toggleNotification } = useNotification();
29
+ const { data: folderStructure = [] } = useGetFolderStructureQuery();
30
+ const [bulkMove, { isLoading: isMovePending }] = useBulkMoveMutation();
31
+ const [activeItem, setActiveItem] = useState(null);
32
+ const [liveAnnouncement, setLiveAnnouncement] = useState('');
33
+ const announceToLiveRegion = useCallback((message)=>{
34
+ setLiveAnnouncement('');
35
+ requestAnimationFrame(()=>setLiveAnnouncement(message));
36
+ }, []);
37
+ const sensors = useSensors(useSensor(PointerSensor, {
38
+ activationConstraint: {
39
+ distance: 8
40
+ }
41
+ }));
42
+ const contextValue = useMemo(()=>({
43
+ isInternalDragActive: activeItem !== null,
44
+ isMovePending
45
+ }), [
46
+ activeItem,
47
+ isMovePending
48
+ ]);
49
+ const handleDragStart = useCallback((event)=>{
50
+ const data = event.active.data.current;
51
+ setActiveItem(data ?? null);
52
+ }, []);
53
+ const handleDragEnd = useCallback(async (event)=>{
54
+ const { active, over } = event;
55
+ setActiveItem(null);
56
+ if (isMovePending || !over) {
57
+ return;
58
+ }
59
+ const targetFolderId = parseFolderTargetId(over.id);
60
+ const activeData = active.data.current;
61
+ if (targetFolderId == null || !activeData) {
62
+ return;
63
+ }
64
+ const items = getDragItems(activeData);
65
+ if (!canDropItemOnFolder({
66
+ items,
67
+ targetFolderId,
68
+ folderStructure
69
+ })) {
70
+ return;
71
+ }
72
+ const payload = buildBulkMovePayload(items);
73
+ const successMessage = formatMessage({
74
+ id: getTranslationKey('modal.move.success-label'),
75
+ defaultMessage: 'Elements have been moved successfully.'
76
+ });
77
+ const errorFallback = formatMessage({
78
+ id: getTranslationKey('modal.move.error-label'),
79
+ defaultMessage: 'An error occurred while moving the elements.'
80
+ });
81
+ try {
82
+ await bulkMove({
83
+ ...payload,
84
+ destinationFolderId: targetFolderId
85
+ }).unwrap();
86
+ announceToLiveRegion(successMessage);
87
+ toggleNotification({
88
+ type: 'success',
89
+ message: successMessage
90
+ });
91
+ } catch (error) {
92
+ const errorMessage = getBulkMoveErrorMessage(error, errorFallback);
93
+ announceToLiveRegion(formatMessage({
94
+ id: getTranslationKey('dnd.announce.move-failure'),
95
+ defaultMessage: 'Move failed. {message}'
96
+ }, {
97
+ message: errorMessage
98
+ }));
99
+ toggleNotification({
100
+ type: 'danger',
101
+ message: errorMessage
102
+ });
103
+ }
104
+ }, [
105
+ announceToLiveRegion,
106
+ bulkMove,
107
+ folderStructure,
108
+ formatMessage,
109
+ isMovePending,
110
+ toggleNotification
111
+ ]);
112
+ const handleDragCancel = useCallback(()=>{
113
+ setActiveItem(null);
114
+ }, []);
115
+ const announcements = useMemo(()=>({
116
+ onDragStart: ({ active })=>{
117
+ const data = active.data.current;
118
+ return data ? formatMessage({
119
+ id: getTranslationKey('dnd.announce.drag-start'),
120
+ defaultMessage: 'Picked up {name}. Drop on a folder to move.'
121
+ }, {
122
+ name: data.name
123
+ }) : '';
124
+ },
125
+ onDragOver: ()=>'',
126
+ onDragEnd: ({ active, over })=>{
127
+ if (!over) {
128
+ return formatMessage({
129
+ id: getTranslationKey('dnd.announce.cancel'),
130
+ defaultMessage: 'Drag cancelled.'
131
+ });
132
+ }
133
+ const targetFolderId = parseFolderTargetId(over.id);
134
+ const activeData = active.data.current;
135
+ if (targetFolderId == null || !activeData) {
136
+ return '';
137
+ }
138
+ const items = getDragItems(activeData);
139
+ if (!canDropItemOnFolder({
140
+ items,
141
+ targetFolderId,
142
+ folderStructure
143
+ })) {
144
+ return formatMessage({
145
+ id: getTranslationKey('dnd.announce.invalid-drop'),
146
+ defaultMessage: 'Cannot move item to this folder.'
147
+ });
148
+ }
149
+ return '';
150
+ },
151
+ onDragCancel: ()=>formatMessage({
152
+ id: getTranslationKey('dnd.announce.cancel'),
153
+ defaultMessage: 'Drag cancelled.'
154
+ })
155
+ }), [
156
+ folderStructure,
157
+ formatMessage
158
+ ]);
159
+ return /*#__PURE__*/ jsx(AssetsDndContext.Provider, {
160
+ value: contextValue,
161
+ children: /*#__PURE__*/ jsxs(DndContext, {
162
+ sensors: sensors,
163
+ collisionDetection: pointerWithin,
164
+ onDragStart: handleDragStart,
165
+ onDragEnd: handleDragEnd,
166
+ onDragCancel: handleDragCancel,
167
+ accessibility: {
168
+ announcements
169
+ },
170
+ children: [
171
+ /*#__PURE__*/ jsx(VisuallyHidden, {
172
+ "aria-live": "polite",
173
+ "aria-atomic": "true",
174
+ children: liveAnnouncement
175
+ }),
176
+ /*#__PURE__*/ jsx(Box, {
177
+ position: "relative",
178
+ children: children
179
+ }),
180
+ /*#__PURE__*/ jsx(DragOverlay, {
181
+ dropAnimation: null,
182
+ children: activeItem ? /*#__PURE__*/ jsx(DragOverlayChip, {
183
+ item: activeItem
184
+ }) : null
185
+ })
186
+ ]
187
+ })
188
+ });
189
+ }; // TODO(CMS-229): FolderTree droppables + keyboard move path.
190
+
191
+ export { AssetsDndProvider, useAssetsDndOptional };
192
+ //# sourceMappingURL=AssetsDndProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsDndProvider.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, VisuallyHidden } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkMoveMutation, useGetFolderStructureQuery } from '../../../../services/folders';\nimport { buildBulkMovePayload } from '../../../../utils/buildBulkMovePayload';\nimport { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder';\nimport { getBulkMoveErrorMessage } from '../../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport { parseFolderTargetId } from './dndIds';\nimport { DragOverlayChip } from './DragOverlayChip';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\n/* -------------------------------------------------------------------------------------------------\n * Context — shared with UploadDropZoneProvider for bidirectional drag guard.\n * See UploadDropZoneContext.tsx TODO linking both providers.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndContextValue {\n isInternalDragActive: boolean;\n isMovePending: boolean;\n}\n\nconst AssetsDndContext = createContext<AssetsDndContextValue | null>(null);\n\nexport const useAssetsDnd = () => {\n const context = useContext(AssetsDndContext);\n\n if (!context) {\n throw new Error('useAssetsDnd must be used within AssetsDndProvider');\n }\n\n return context;\n};\n\nexport const useAssetsDndOptional = () => useContext(AssetsDndContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndProviderProps {\n children: ReactNode;\n}\n\nconst getDragItems = (activeData: DragItemData | undefined): DragItemData[] => {\n if (!activeData) {\n return [];\n }\n\n // TODO(CMS-433): include selectedItems from active data for multi-drag payload members.\n return [activeData];\n};\n\nexport const AssetsDndProvider = ({ children }: AssetsDndProviderProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n const [bulkMove, { isLoading: isMovePending }] = useBulkMoveMutation();\n const [activeItem, setActiveItem] = useState<DragItemData | null>(null);\n const [liveAnnouncement, setLiveAnnouncement] = useState('');\n\n const announceToLiveRegion = useCallback((message: string) => {\n setLiveAnnouncement('');\n requestAnimationFrame(() => setLiveAnnouncement(message));\n }, []);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: 8 },\n })\n );\n\n const contextValue = useMemo<AssetsDndContextValue>(\n () => ({\n isInternalDragActive: activeItem !== null,\n isMovePending,\n }),\n [activeItem, isMovePending]\n );\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current as DragItemData | undefined;\n setActiveItem(data ?? null);\n }, []);\n\n const handleDragEnd = useCallback(\n async (event: DragEndEvent) => {\n const { active, over } = event;\n setActiveItem(null);\n\n if (isMovePending || !over) {\n return;\n }\n\n const targetFolderId = parseFolderTargetId(over.id);\n const activeData = active.data.current as DragItemData | undefined;\n\n if (targetFolderId == null || !activeData) {\n return;\n }\n\n const items = getDragItems(activeData);\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId,\n folderStructure,\n })\n ) {\n return;\n }\n\n const payload = buildBulkMovePayload(items);\n const successMessage = formatMessage({\n id: getTranslationKey('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n });\n const errorFallback = formatMessage({\n id: getTranslationKey('modal.move.error-label'),\n defaultMessage: 'An error occurred while moving the elements.',\n });\n\n try {\n await bulkMove({ ...payload, destinationFolderId: targetFolderId }).unwrap();\n\n announceToLiveRegion(successMessage);\n\n toggleNotification({\n type: 'success',\n message: successMessage,\n });\n } catch (error) {\n const errorMessage = getBulkMoveErrorMessage(error, errorFallback);\n\n announceToLiveRegion(\n formatMessage(\n {\n id: getTranslationKey('dnd.announce.move-failure'),\n defaultMessage: 'Move failed. {message}',\n },\n { message: errorMessage }\n )\n );\n\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n }\n },\n [\n announceToLiveRegion,\n bulkMove,\n folderStructure,\n formatMessage,\n isMovePending,\n toggleNotification,\n ]\n );\n\n const handleDragCancel = useCallback(() => {\n setActiveItem(null);\n }, []);\n\n const announcements = useMemo(\n () => ({\n onDragStart: ({ active }: DragStartEvent) => {\n const data = active.data.current as DragItemData | undefined;\n return data\n ? formatMessage(\n {\n id: getTranslationKey('dnd.announce.drag-start'),\n defaultMessage: 'Picked up {name}. Drop on a folder to move.',\n },\n { name: data.name }\n )\n : '';\n },\n onDragOver: () => '',\n onDragEnd: ({ active, over }: DragEndEvent) => {\n if (!over) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n });\n }\n\n const targetFolderId = parseFolderTargetId(over.id);\n const activeData = active.data.current as DragItemData | undefined;\n\n if (targetFolderId == null || !activeData) {\n return '';\n }\n\n const items = getDragItems(activeData);\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId,\n folderStructure,\n })\n ) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.invalid-drop'),\n defaultMessage: 'Cannot move item to this folder.',\n });\n }\n\n return '';\n },\n onDragCancel: () =>\n formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n }),\n }),\n [folderStructure, formatMessage]\n );\n\n return (\n <AssetsDndContext.Provider value={contextValue}>\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n >\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {liveAnnouncement}\n </VisuallyHidden>\n <Box position=\"relative\">{children}</Box>\n <DragOverlay dropAnimation={null}>\n {activeItem ? <DragOverlayChip item={activeItem} /> : null}\n </DragOverlay>\n </DndContext>\n </AssetsDndContext.Provider>\n );\n};\n\n// TODO(CMS-229): FolderTree droppables + keyboard move path.\n"],"names":["AssetsDndContext","createContext","useAssetsDndOptional","useContext","getDragItems","activeData","AssetsDndProvider","children","formatMessage","useIntl","toggleNotification","useNotification","data","folderStructure","useGetFolderStructureQuery","bulkMove","isLoading","isMovePending","useBulkMoveMutation","activeItem","setActiveItem","useState","liveAnnouncement","setLiveAnnouncement","announceToLiveRegion","useCallback","message","requestAnimationFrame","sensors","useSensors","useSensor","PointerSensor","activationConstraint","distance","contextValue","useMemo","isInternalDragActive","handleDragStart","event","active","current","handleDragEnd","over","targetFolderId","parseFolderTargetId","id","items","canDropItemOnFolder","payload","buildBulkMovePayload","successMessage","getTranslationKey","defaultMessage","errorFallback","destinationFolderId","unwrap","type","error","errorMessage","getBulkMoveErrorMessage","handleDragCancel","announcements","onDragStart","name","onDragOver","onDragEnd","onDragCancel","_jsx","Provider","value","_jsxs","DndContext","collisionDetection","pointerWithin","accessibility","VisuallyHidden","aria-live","aria-atomic","Box","position","DragOverlay","dropAnimation","DragOverlayChip","item"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var styledComponents = require('styled-components');
7
+
8
+ const Chip = styledComponents.styled(designSystem.Flex)`
9
+ align-items: center;
10
+ gap: ${({ theme })=>theme.spaces[2]};
11
+ padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[3]}`};
12
+ border-radius: ${({ theme })=>theme.borderRadius};
13
+ background: ${({ theme })=>theme.colors.primary100};
14
+ box-shadow: ${({ theme })=>theme.shadows.tableShadow};
15
+ cursor: grabbing;
16
+ max-width: 24rem;
17
+ `;
18
+ const DragOverlayChip = ({ item })=>{
19
+ const Icon = item.kind === 'folder' ? icons.Folder : icons.File;
20
+ return /*#__PURE__*/ jsxRuntime.jsxs(Chip, {
21
+ children: [
22
+ /*#__PURE__*/ jsxRuntime.jsx(Icon, {
23
+ width: 20,
24
+ height: 20
25
+ }),
26
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
27
+ textColor: "neutral800",
28
+ fontWeight: "semiBold",
29
+ ellipsis: true,
30
+ children: item.name
31
+ })
32
+ ]
33
+ });
34
+ }; // TODO composite overlay with folder/file counts + total badge.
35
+
36
+ exports.DragOverlayChip = DragOverlayChip;
37
+ //# sourceMappingURL=DragOverlayChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DragOverlayChip.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nconst Chip = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\ninterface DragOverlayChipProps {\n item: DragItemData;\n}\n\nexport const DragOverlayChip = ({ item }: DragOverlayChipProps) => {\n const Icon = item.kind === 'folder' ? FolderIcon : FileIcon;\n\n return (\n <Chip>\n <Icon width={20} height={20} />\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {item.name}\n </Typography>\n </Chip>\n );\n};\n\n// TODO composite overlay with folder/file counts + total badge.\n"],"names":["Chip","styled","Flex","theme","spaces","borderRadius","colors","primary100","shadows","tableShadow","DragOverlayChip","item","Icon","kind","FolderIcon","FileIcon","_jsxs","_jsx","width","height","Typography","textColor","fontWeight","ellipsis","name"],"mappings":";;;;;;;AAMA,MAAMA,IAAAA,GAAOC,uBAAAA,CAAOC,iBAAAA,CAAK;;OAElB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC7B,WAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMC,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;AACnD,iBAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,YAAY,CAAC;cACvC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAACC,UAAU,CAAC;cACzC,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,OAAO,CAACC,WAAW,CAAC;;;AAGzD,CAAC;AAMM,MAAMC,eAAAA,GAAkB,CAAC,EAAEC,IAAI,EAAwB,GAAA;AAC5D,IAAA,MAAMC,IAAAA,GAAOD,IAAAA,CAAKE,IAAI,KAAK,WAAWC,YAAAA,GAAaC,UAAAA;AAEnD,IAAA,qBACEC,eAAA,CAAChB,IAAAA,EAAAA;;0BACCiB,cAAA,CAACL,IAAAA,EAAAA;gBAAKM,KAAAA,EAAO,EAAA;gBAAIC,MAAAA,EAAQ;;0BACzBF,cAAA,CAACG,uBAAAA,EAAAA;gBAAWC,SAAAA,EAAU,YAAA;gBAAaC,UAAAA,EAAW,UAAA;gBAAWC,QAAQ,EAAA,IAAA;AAC9DZ,gBAAAA,QAAAA,EAAAA,IAAAA,CAAKa;;;;AAId,EAAE;;;;"}
@@ -0,0 +1,35 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Typography, Flex } from '@strapi/design-system';
3
+ import { Folder, File } from '@strapi/icons';
4
+ import { styled } from 'styled-components';
5
+
6
+ const Chip = styled(Flex)`
7
+ align-items: center;
8
+ gap: ${({ theme })=>theme.spaces[2]};
9
+ padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[3]}`};
10
+ border-radius: ${({ theme })=>theme.borderRadius};
11
+ background: ${({ theme })=>theme.colors.primary100};
12
+ box-shadow: ${({ theme })=>theme.shadows.tableShadow};
13
+ cursor: grabbing;
14
+ max-width: 24rem;
15
+ `;
16
+ const DragOverlayChip = ({ item })=>{
17
+ const Icon = item.kind === 'folder' ? Folder : File;
18
+ return /*#__PURE__*/ jsxs(Chip, {
19
+ children: [
20
+ /*#__PURE__*/ jsx(Icon, {
21
+ width: 20,
22
+ height: 20
23
+ }),
24
+ /*#__PURE__*/ jsx(Typography, {
25
+ textColor: "neutral800",
26
+ fontWeight: "semiBold",
27
+ ellipsis: true,
28
+ children: item.name
29
+ })
30
+ ]
31
+ });
32
+ }; // TODO composite overlay with folder/file counts + total badge.
33
+
34
+ export { DragOverlayChip };
35
+ //# sourceMappingURL=DragOverlayChip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DragOverlayChip.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nconst Chip = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\ninterface DragOverlayChipProps {\n item: DragItemData;\n}\n\nexport const DragOverlayChip = ({ item }: DragOverlayChipProps) => {\n const Icon = item.kind === 'folder' ? FolderIcon : FileIcon;\n\n return (\n <Chip>\n <Icon width={20} height={20} />\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {item.name}\n </Typography>\n </Chip>\n );\n};\n\n// TODO composite overlay with folder/file counts + total badge.\n"],"names":["Chip","styled","Flex","theme","spaces","borderRadius","colors","primary100","shadows","tableShadow","DragOverlayChip","item","Icon","kind","FolderIcon","FileIcon","_jsxs","_jsx","width","height","Typography","textColor","fontWeight","ellipsis","name"],"mappings":";;;;;AAMA,MAAMA,IAAAA,GAAOC,MAAAA,CAAOC,IAAAA,CAAK;;OAElB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC7B,WAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMC,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAED,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;AACnD,iBAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,YAAY,CAAC;cACvC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAACC,UAAU,CAAC;cACzC,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,OAAO,CAACC,WAAW,CAAC;;;AAGzD,CAAC;AAMM,MAAMC,eAAAA,GAAkB,CAAC,EAAEC,IAAI,EAAwB,GAAA;AAC5D,IAAA,MAAMC,IAAAA,GAAOD,IAAAA,CAAKE,IAAI,KAAK,WAAWC,MAAAA,GAAaC,IAAAA;AAEnD,IAAA,qBACEC,IAAA,CAAChB,IAAAA,EAAAA;;0BACCiB,GAAA,CAACL,IAAAA,EAAAA;gBAAKM,KAAAA,EAAO,EAAA;gBAAIC,MAAAA,EAAQ;;0BACzBF,GAAA,CAACG,UAAAA,EAAAA;gBAAWC,SAAAA,EAAU,YAAA;gBAAaC,UAAAA,EAAW,UAAA;gBAAWC,QAAQ,EAAA,IAAA;AAC9DZ,gBAAAA,QAAAA,EAAAA,IAAAA,CAAKa;;;;AAId,EAAE;;;;"}
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ const toFileDraggableId = (id)=>`file:${id}`;
4
+ const toFolderDraggableId = (id)=>`folder:${id}`;
5
+ const toFolderTargetId = (id)=>`folder-target:${id}`;
6
+ const parseFolderTargetId = (dndId)=>{
7
+ if (typeof dndId !== 'string') {
8
+ return null;
9
+ }
10
+ const match = /^folder-target:(\d+)$/.exec(dndId);
11
+ return match ? Number(match[1]) : null;
12
+ };
13
+
14
+ exports.parseFolderTargetId = parseFolderTargetId;
15
+ exports.toFileDraggableId = toFileDraggableId;
16
+ exports.toFolderDraggableId = toFolderDraggableId;
17
+ exports.toFolderTargetId = toFolderTargetId;
18
+ //# sourceMappingURL=dndIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dndIds.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number"],"mappings":";;AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ const toFileDraggableId = (id)=>`file:${id}`;
2
+ const toFolderDraggableId = (id)=>`folder:${id}`;
3
+ const toFolderTargetId = (id)=>`folder-target:${id}`;
4
+ const parseFolderTargetId = (dndId)=>{
5
+ if (typeof dndId !== 'string') {
6
+ return null;
7
+ }
8
+ const match = /^folder-target:(\d+)$/.exec(dndId);
9
+ return match ? Number(match[1]) : null;
10
+ };
11
+
12
+ export { parseFolderTargetId, toFileDraggableId, toFolderDraggableId, toFolderTargetId };
13
+ //# sourceMappingURL=dndIds.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dndIds.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number"],"mappings":"AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;"}
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var core = require('@dnd-kit/core');
5
+ var folders = require('../../../../services/folders.js');
6
+ var canDropItemOnFolder = require('../../../../utils/canDropItemOnFolder.js');
7
+ var AssetsDndProvider = require('./AssetsDndProvider.js');
8
+ var dndIds = require('./dndIds.js');
9
+
10
+ const useFileDraggable = (asset)=>{
11
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
12
+ isMovePending: false
13
+ };
14
+ const data = React.useMemo(()=>({
15
+ kind: 'file',
16
+ id: asset.id,
17
+ name: asset.name,
18
+ folderId: asset.folder == null ? null : typeof asset.folder === 'number' ? asset.folder : Number(asset.folder) || null
19
+ }), [
20
+ asset.folder,
21
+ asset.id,
22
+ asset.name
23
+ ]);
24
+ return core.useDraggable({
25
+ id: dndIds.toFileDraggableId(asset.id),
26
+ data,
27
+ disabled: isMovePending
28
+ });
29
+ };
30
+ const useFolderDraggableDroppable = (folder)=>{
31
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
32
+ isMovePending: false
33
+ };
34
+ const { active } = core.useDndContext();
35
+ const { data: folderStructure = [] } = folders.useGetFolderStructureQuery();
36
+ const parentId = typeof folder.parent === 'object' && folder.parent != null ? folder.parent.id ?? null : folder.parent ?? null;
37
+ const dragData = React.useMemo(()=>({
38
+ kind: 'folder',
39
+ id: folder.id,
40
+ name: folder.name,
41
+ parentId
42
+ }), [
43
+ folder.id,
44
+ folder.name,
45
+ parentId
46
+ ]);
47
+ const dropData = React.useMemo(()=>({
48
+ kind: 'folder-target',
49
+ id: folder.id,
50
+ name: folder.name
51
+ }), [
52
+ folder.id,
53
+ folder.name
54
+ ]);
55
+ const draggable = core.useDraggable({
56
+ id: dndIds.toFolderDraggableId(folder.id),
57
+ data: dragData,
58
+ disabled: isMovePending
59
+ });
60
+ const droppable = core.useDroppable({
61
+ id: dndIds.toFolderTargetId(folder.id),
62
+ data: dropData,
63
+ disabled: isMovePending
64
+ });
65
+ const activeData = active?.data.current;
66
+ const isValidDropTarget = React.useMemo(()=>{
67
+ if (!activeData || activeData.id === folder.id && activeData.kind === 'folder') {
68
+ return false;
69
+ }
70
+ return canDropItemOnFolder.canDropItemOnFolder({
71
+ items: [
72
+ activeData
73
+ ],
74
+ targetFolderId: folder.id,
75
+ folderStructure
76
+ });
77
+ }, [
78
+ activeData,
79
+ folder.id,
80
+ folderStructure
81
+ ]);
82
+ const isOver = droppable.isOver;
83
+ const showValidDropHighlight = isOver && isValidDropTarget;
84
+ const showInvalidDropCursor = isOver && !isValidDropTarget && active != null;
85
+ return {
86
+ dragData,
87
+ draggable,
88
+ droppable,
89
+ isDragging: draggable.isDragging,
90
+ showValidDropHighlight,
91
+ showInvalidDropCursor
92
+ };
93
+ };
94
+
95
+ exports.useFileDraggable = useFileDraggable;
96
+ exports.useFolderDraggableDroppable = useFolderDraggableDroppable;
97
+ //# sourceMappingURL=useAssetDnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetDnd.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type {\n DragFileData,\n DragFolderData,\n DragItemData,\n FolderTargetData,\n} from '../../../../types/dnd';\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | null;\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId:\n asset.folder == null\n ? null\n : typeof asset.folder === 'number'\n ? asset.folder\n : Number(asset.folder) || null,\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n return useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: isMovePending,\n });\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { active } = useDndContext();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n\n const parentId =\n typeof folder.parent === 'object' && folder.parent != null\n ? (folder.parent.id ?? null)\n : (folder.parent ?? null);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: isMovePending,\n });\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: isMovePending,\n });\n\n const activeData = active?.data.current as DragItemData | undefined;\n\n const isValidDropTarget = useMemo(() => {\n if (!activeData || (activeData.id === folder.id && activeData.kind === 'folder')) {\n return false;\n }\n\n return canDropItemOnFolder({\n items: [activeData],\n targetFolderId: folder.id,\n folderStructure,\n });\n }, [activeData, folder.id, folderStructure]);\n\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidDropTarget;\n const showInvalidDropCursor = isOver && !isValidDropTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["useFileDraggable","asset","isMovePending","useAssetsDndOptional","data","useMemo","kind","id","name","folderId","folder","Number","useDraggable","toFileDraggableId","disabled","useFolderDraggableDroppable","active","useDndContext","folderStructure","useGetFolderStructureQuery","parentId","parent","dragData","dropData","draggable","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","activeData","current","isValidDropTarget","canDropItemOnFolder","items","targetFolderId","isOver","showValidDropHighlight","showInvalidDropCursor","isDragging"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { useMemo } from 'react';
2
+ import { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';
3
+ import { useGetFolderStructureQuery } from '../../../../services/folders.mjs';
4
+ import { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder.mjs';
5
+ import { useAssetsDndOptional } from './AssetsDndProvider.mjs';
6
+ import { toFolderDraggableId, toFolderTargetId, toFileDraggableId } from './dndIds.mjs';
7
+
8
+ const useFileDraggable = (asset)=>{
9
+ const { isMovePending } = useAssetsDndOptional() ?? {
10
+ isMovePending: false
11
+ };
12
+ const data = useMemo(()=>({
13
+ kind: 'file',
14
+ id: asset.id,
15
+ name: asset.name,
16
+ folderId: asset.folder == null ? null : typeof asset.folder === 'number' ? asset.folder : Number(asset.folder) || null
17
+ }), [
18
+ asset.folder,
19
+ asset.id,
20
+ asset.name
21
+ ]);
22
+ return useDraggable({
23
+ id: toFileDraggableId(asset.id),
24
+ data,
25
+ disabled: isMovePending
26
+ });
27
+ };
28
+ const useFolderDraggableDroppable = (folder)=>{
29
+ const { isMovePending } = useAssetsDndOptional() ?? {
30
+ isMovePending: false
31
+ };
32
+ const { active } = useDndContext();
33
+ const { data: folderStructure = [] } = useGetFolderStructureQuery();
34
+ const parentId = typeof folder.parent === 'object' && folder.parent != null ? folder.parent.id ?? null : folder.parent ?? null;
35
+ const dragData = useMemo(()=>({
36
+ kind: 'folder',
37
+ id: folder.id,
38
+ name: folder.name,
39
+ parentId
40
+ }), [
41
+ folder.id,
42
+ folder.name,
43
+ parentId
44
+ ]);
45
+ const dropData = useMemo(()=>({
46
+ kind: 'folder-target',
47
+ id: folder.id,
48
+ name: folder.name
49
+ }), [
50
+ folder.id,
51
+ folder.name
52
+ ]);
53
+ const draggable = useDraggable({
54
+ id: toFolderDraggableId(folder.id),
55
+ data: dragData,
56
+ disabled: isMovePending
57
+ });
58
+ const droppable = useDroppable({
59
+ id: toFolderTargetId(folder.id),
60
+ data: dropData,
61
+ disabled: isMovePending
62
+ });
63
+ const activeData = active?.data.current;
64
+ const isValidDropTarget = useMemo(()=>{
65
+ if (!activeData || activeData.id === folder.id && activeData.kind === 'folder') {
66
+ return false;
67
+ }
68
+ return canDropItemOnFolder({
69
+ items: [
70
+ activeData
71
+ ],
72
+ targetFolderId: folder.id,
73
+ folderStructure
74
+ });
75
+ }, [
76
+ activeData,
77
+ folder.id,
78
+ folderStructure
79
+ ]);
80
+ const isOver = droppable.isOver;
81
+ const showValidDropHighlight = isOver && isValidDropTarget;
82
+ const showInvalidDropCursor = isOver && !isValidDropTarget && active != null;
83
+ return {
84
+ dragData,
85
+ draggable,
86
+ droppable,
87
+ isDragging: draggable.isDragging,
88
+ showValidDropHighlight,
89
+ showInvalidDropCursor
90
+ };
91
+ };
92
+
93
+ export { useFileDraggable, useFolderDraggableDroppable };
94
+ //# sourceMappingURL=useAssetDnd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetDnd.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type {\n DragFileData,\n DragFolderData,\n DragItemData,\n FolderTargetData,\n} from '../../../../types/dnd';\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | null;\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId:\n asset.folder == null\n ? null\n : typeof asset.folder === 'number'\n ? asset.folder\n : Number(asset.folder) || null,\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n return useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: isMovePending,\n });\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { active } = useDndContext();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n\n const parentId =\n typeof folder.parent === 'object' && folder.parent != null\n ? (folder.parent.id ?? null)\n : (folder.parent ?? null);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: isMovePending,\n });\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: isMovePending,\n });\n\n const activeData = active?.data.current as DragItemData | undefined;\n\n const isValidDropTarget = useMemo(() => {\n if (!activeData || (activeData.id === folder.id && activeData.kind === 'folder')) {\n return false;\n }\n\n return canDropItemOnFolder({\n items: [activeData],\n targetFolderId: folder.id,\n folderStructure,\n });\n }, [activeData, folder.id, folderStructure]);\n\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidDropTarget;\n const showInvalidDropCursor = isOver && !isValidDropTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["useFileDraggable","asset","isMovePending","useAssetsDndOptional","data","useMemo","kind","id","name","folderId","folder","Number","useDraggable","toFileDraggableId","disabled","useFolderDraggableDroppable","active","useDndContext","folderStructure","useGetFolderStructureQuery","parentId","parent","dragData","dropData","draggable","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","activeData","current","isValidDropTarget","canDropItemOnFolder","items","targetFolderId","isOver","showValidDropHighlight","showInvalidDropCursor","isDragging"],"mappings":"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"}
@@ -7,6 +7,7 @@ var icons = require('@strapi/icons');
7
7
  var reactIntl = require('react-intl');
8
8
  var styledComponents = require('styled-components');
9
9
  var translations = require('../../../../utils/translations.js');
10
+ var AssetsDndProvider = require('../Dnd/AssetsDndProvider.js');
10
11
  var UploadDropZoneContext = require('./UploadDropZoneContext.js');
11
12
 
12
13
  function _interopNamespace(e) {
@@ -45,11 +46,14 @@ const DropZoneOverlay = styledComponents.styled(designSystem.Box)`
45
46
  pointer-events: none;
46
47
  `;
47
48
  const DropZoneWithOverlay = ({ children })=>{
48
- const { isDragging } = UploadDropZoneContext.useUploadDropZone();
49
+ const { isDragging: isUploadDragActive } = UploadDropZoneContext.useUploadDropZone();
50
+ const assetsDnd = AssetsDndProvider.useAssetsDndOptional();
51
+ const isInternalDragActive = assetsDnd?.isInternalDragActive ?? false;
52
+ const showOverlay = isUploadDragActive && !isInternalDragActive;
49
53
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
50
54
  position: "relative",
51
55
  children: [
52
- isDragging && /*#__PURE__*/ jsxRuntime.jsx(DropZoneOverlay, {}),
56
+ showOverlay && /*#__PURE__*/ jsxRuntime.jsx(DropZoneOverlay, {}),
53
57
  children
54
58
  ]
55
59
  });
@@ -73,7 +77,10 @@ const DropZoneWithOverlay = ({ children })=>{
73
77
  `;
74
78
  const DropFilesMessage = ({ uploadDropZoneRef, folderName })=>{
75
79
  const { formatMessage } = reactIntl.useIntl();
76
- const { isDragging } = UploadDropZoneContext.useUploadDropZone();
80
+ const { isDragging: isUploadDragActive } = UploadDropZoneContext.useUploadDropZone();
81
+ const assetsDnd = AssetsDndProvider.useAssetsDndOptional();
82
+ const isInternalDragActive = assetsDnd?.isInternalDragActive ?? false;
83
+ const showMessage = isUploadDragActive && !isInternalDragActive;
77
84
  // Dropzone message position (relative to main content)
78
85
  const [leftContentWidth, setLeftContentWidth] = React__namespace.useState(0);
79
86
  // Calculate the left content width to position the dropzone message correctly
@@ -92,7 +99,9 @@ const DropFilesMessage = ({ uploadDropZoneRef, folderName })=>{
92
99
  }, [
93
100
  uploadDropZoneRef
94
101
  ]);
95
- if (!isDragging) return null;
102
+ if (!showMessage) {
103
+ return null;
104
+ }
96
105
  return /*#__PURE__*/ jsxRuntime.jsxs(DropFilesMessageImpl, {
97
106
  $leftContentWidth: leftContentWidth,
98
107
  children: [