@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
@@ -10,6 +10,8 @@ var files = require('../../../utils/files.js');
10
10
  var getAssetIcon = require('../../../utils/getAssetIcon.js');
11
11
  var translations = require('../../../utils/translations.js');
12
12
  var useFolderNavigation = require('../hooks/useFolderNavigation.js');
13
+ var AssetsDndProvider = require('./Dnd/AssetsDndProvider.js');
14
+ var useAssetDnd = require('./Dnd/useAssetDnd.js');
13
15
 
14
16
  /* -------------------------------------------------------------------------------------------------
15
17
  * AssetsGrid
@@ -17,7 +19,9 @@ var useFolderNavigation = require('../hooks/useFolderNavigation.js');
17
19
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
18
20
  border-radius: 8px;
19
21
  overflow: hidden;
20
- cursor: pointer;
22
+ cursor: ${({ $isMovePending })=>$isMovePending ? 'wait' : 'pointer'};
23
+ opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
24
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
21
25
 
22
26
  &:hover {
23
27
  background: ${({ theme })=>theme.colors.primary100};
@@ -41,9 +45,21 @@ const StyledFolderCard = styledComponents.styled(designSystem.Flex)`
41
45
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
42
46
  border-radius: ${({ theme })=>theme.borderRadius};
43
47
  background: ${({ theme })=>theme.colors.neutral0};
44
- cursor: pointer;
48
+ cursor: ${({ $isMovePending, $isInvalidDropTarget })=>{
49
+ if ($isMovePending) {
50
+ return 'wait';
51
+ }
52
+ return $isInvalidDropTarget ? 'not-allowed' : 'pointer';
53
+ }};
54
+ opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
55
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
45
56
  transition: background 0.2s;
46
57
 
58
+ ${({ $isValidDropTarget, theme })=>$isValidDropTarget && styledComponents.css`
59
+ background: ${theme.colors.primary100};
60
+ border: 1px dashed ${theme.colors.primary600};
61
+ `}
62
+
47
63
  &:hover {
48
64
  background: ${({ theme })=>theme.colors.primary100};
49
65
  }
@@ -64,6 +80,14 @@ const FolderName = styledComponents.styled(designSystem.Typography)`
64
80
  const FolderCard = ({ folder })=>{
65
81
  const { formatMessage } = reactIntl.useIntl();
66
82
  const { navigateToFolder } = useFolderNavigation.useFolderNavigation();
83
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
84
+ isMovePending: false
85
+ };
86
+ const { draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useAssetDnd.useFolderDraggableDroppable(folder);
87
+ const setNodeRef = (node)=>{
88
+ setDragRef(node);
89
+ setDropRef(node);
90
+ };
67
91
  const handleKeyDown = (e)=>{
68
92
  if (e.key === 'Enter' || e.key === ' ') {
69
93
  e.preventDefault();
@@ -71,6 +95,13 @@ const FolderCard = ({ folder })=>{
71
95
  }
72
96
  };
73
97
  return /*#__PURE__*/ jsxRuntime.jsxs(StyledFolderCard, {
98
+ ref: setNodeRef,
99
+ ...attributes,
100
+ ...listeners,
101
+ $isDragging: isDragging,
102
+ $isMovePending: isMovePending,
103
+ $isValidDropTarget: showValidDropHighlight,
104
+ $isInvalidDropTarget: showInvalidDropCursor,
74
105
  onClick: ()=>navigateToFolder(folder),
75
106
  onKeyDown: handleKeyDown,
76
107
  role: "listitem",
@@ -138,7 +169,9 @@ const AssetPreview = ({ asset })=>{
138
169
  return /*#__PURE__*/ jsxRuntime.jsx(PreviewContainer, {
139
170
  children: /*#__PURE__*/ jsxRuntime.jsx(StyledImage, {
140
171
  src: mediaURL,
141
- alt: alternativeText || ''
172
+ alt: alternativeText || '',
173
+ draggable: false,
174
+ onDragStart: (e)=>e.preventDefault()
142
175
  })
143
176
  });
144
177
  }
@@ -175,6 +208,10 @@ const FileName = styledComponents.styled(designSystem.Typography)`
175
208
  const AssetCard = ({ asset, onAssetItemClick })=>{
176
209
  const { formatMessage } = reactIntl.useIntl();
177
210
  const TypeIcon = getAssetIcon.getAssetIcon(asset.mime, asset.ext);
211
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
212
+ isMovePending: false
213
+ };
214
+ const { attributes, listeners, setNodeRef, isDragging } = useAssetDnd.useFileDraggable(asset);
178
215
  const handleKeyDown = (e)=>{
179
216
  if (e.key === 'Enter' || e.key === ' ') {
180
217
  e.preventDefault();
@@ -182,8 +219,14 @@ const AssetCard = ({ asset, onAssetItemClick })=>{
182
219
  }
183
220
  };
184
221
  return /*#__PURE__*/ jsxRuntime.jsxs(StyledCard, {
222
+ ref: setNodeRef,
223
+ ...attributes,
224
+ ...listeners,
225
+ $isDragging: isDragging,
226
+ $isMovePending: isMovePending,
185
227
  tabIndex: 0,
186
228
  role: "listitem",
229
+ onDragStart: (e)=>e.preventDefault(),
187
230
  onClick: ()=>onAssetItemClick(asset.id),
188
231
  onKeyDown: handleKeyDown,
189
232
  children: [
@@ -214,6 +257,7 @@ const AssetCard = ({ asset, onAssetItemClick })=>{
214
257
  defaultMessage: 'More actions'
215
258
  }),
216
259
  variant: "ghost",
260
+ onClick: (e)=>e.stopPropagation(),
217
261
  children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
218
262
  })
219
263
  ]
@@ -240,6 +284,7 @@ const AssetsGrid = ({ assets, folders = [], onAssetItemClick })=>{
240
284
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Root, {
241
285
  gap: 4,
242
286
  role: "list",
287
+ "data-testid": "assets-grid",
243
288
  children: [
244
289
  folders.length > 0 && /*#__PURE__*/ jsxRuntime.jsx(FoldersRow, {
245
290
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsGrid.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: pointer;\n transition: background 0.2s;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage src={mediaURL} alt={alternativeText || ''} />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n tabIndex={0}\n role=\"listitem\"\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","handleKeyDown","e","key","preventDefault","_jsxs","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsGrid.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
@@ -2,12 +2,14 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Box, Typography, Grid, IconButton, CardBody, Flex, Card, CardHeader } from '@strapi/design-system';
3
3
  import { Folder, More } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
- import { styled } from 'styled-components';
5
+ import { styled, css } from 'styled-components';
6
6
  import { ASSET_TYPES } from '../../../../enums.mjs';
7
7
  import { prefixFileUrlWithBackendUrl } from '../../../utils/files.mjs';
8
8
  import { getAssetIcon } from '../../../utils/getAssetIcon.mjs';
9
9
  import { getTranslationKey } from '../../../utils/translations.mjs';
10
10
  import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
11
+ import { useAssetsDndOptional } from './Dnd/AssetsDndProvider.mjs';
12
+ import { useFolderDraggableDroppable, useFileDraggable } from './Dnd/useAssetDnd.mjs';
11
13
 
12
14
  /* -------------------------------------------------------------------------------------------------
13
15
  * AssetsGrid
@@ -15,7 +17,9 @@ import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
15
17
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
16
18
  border-radius: 8px;
17
19
  overflow: hidden;
18
- cursor: pointer;
20
+ cursor: ${({ $isMovePending })=>$isMovePending ? 'wait' : 'pointer'};
21
+ opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
22
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
19
23
 
20
24
  &:hover {
21
25
  background: ${({ theme })=>theme.colors.primary100};
@@ -39,9 +43,21 @@ const StyledFolderCard = styled(Flex)`
39
43
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
40
44
  border-radius: ${({ theme })=>theme.borderRadius};
41
45
  background: ${({ theme })=>theme.colors.neutral0};
42
- cursor: pointer;
46
+ cursor: ${({ $isMovePending, $isInvalidDropTarget })=>{
47
+ if ($isMovePending) {
48
+ return 'wait';
49
+ }
50
+ return $isInvalidDropTarget ? 'not-allowed' : 'pointer';
51
+ }};
52
+ opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
53
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
43
54
  transition: background 0.2s;
44
55
 
56
+ ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
57
+ background: ${theme.colors.primary100};
58
+ border: 1px dashed ${theme.colors.primary600};
59
+ `}
60
+
45
61
  &:hover {
46
62
  background: ${({ theme })=>theme.colors.primary100};
47
63
  }
@@ -62,6 +78,14 @@ const FolderName = styled(Typography)`
62
78
  const FolderCard = ({ folder })=>{
63
79
  const { formatMessage } = useIntl();
64
80
  const { navigateToFolder } = useFolderNavigation();
81
+ const { isMovePending } = useAssetsDndOptional() ?? {
82
+ isMovePending: false
83
+ };
84
+ const { draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useFolderDraggableDroppable(folder);
85
+ const setNodeRef = (node)=>{
86
+ setDragRef(node);
87
+ setDropRef(node);
88
+ };
65
89
  const handleKeyDown = (e)=>{
66
90
  if (e.key === 'Enter' || e.key === ' ') {
67
91
  e.preventDefault();
@@ -69,6 +93,13 @@ const FolderCard = ({ folder })=>{
69
93
  }
70
94
  };
71
95
  return /*#__PURE__*/ jsxs(StyledFolderCard, {
96
+ ref: setNodeRef,
97
+ ...attributes,
98
+ ...listeners,
99
+ $isDragging: isDragging,
100
+ $isMovePending: isMovePending,
101
+ $isValidDropTarget: showValidDropHighlight,
102
+ $isInvalidDropTarget: showInvalidDropCursor,
72
103
  onClick: ()=>navigateToFolder(folder),
73
104
  onKeyDown: handleKeyDown,
74
105
  role: "listitem",
@@ -136,7 +167,9 @@ const AssetPreview = ({ asset })=>{
136
167
  return /*#__PURE__*/ jsx(PreviewContainer, {
137
168
  children: /*#__PURE__*/ jsx(StyledImage, {
138
169
  src: mediaURL,
139
- alt: alternativeText || ''
170
+ alt: alternativeText || '',
171
+ draggable: false,
172
+ onDragStart: (e)=>e.preventDefault()
140
173
  })
141
174
  });
142
175
  }
@@ -173,6 +206,10 @@ const FileName = styled(Typography)`
173
206
  const AssetCard = ({ asset, onAssetItemClick })=>{
174
207
  const { formatMessage } = useIntl();
175
208
  const TypeIcon = getAssetIcon(asset.mime, asset.ext);
209
+ const { isMovePending } = useAssetsDndOptional() ?? {
210
+ isMovePending: false
211
+ };
212
+ const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);
176
213
  const handleKeyDown = (e)=>{
177
214
  if (e.key === 'Enter' || e.key === ' ') {
178
215
  e.preventDefault();
@@ -180,8 +217,14 @@ const AssetCard = ({ asset, onAssetItemClick })=>{
180
217
  }
181
218
  };
182
219
  return /*#__PURE__*/ jsxs(StyledCard, {
220
+ ref: setNodeRef,
221
+ ...attributes,
222
+ ...listeners,
223
+ $isDragging: isDragging,
224
+ $isMovePending: isMovePending,
183
225
  tabIndex: 0,
184
226
  role: "listitem",
227
+ onDragStart: (e)=>e.preventDefault(),
185
228
  onClick: ()=>onAssetItemClick(asset.id),
186
229
  onKeyDown: handleKeyDown,
187
230
  children: [
@@ -212,6 +255,7 @@ const AssetCard = ({ asset, onAssetItemClick })=>{
212
255
  defaultMessage: 'More actions'
213
256
  }),
214
257
  variant: "ghost",
258
+ onClick: (e)=>e.stopPropagation(),
215
259
  children: /*#__PURE__*/ jsx(More, {})
216
260
  })
217
261
  ]
@@ -238,6 +282,7 @@ const AssetsGrid = ({ assets, folders = [], onAssetItemClick })=>{
238
282
  return /*#__PURE__*/ jsxs(Grid.Root, {
239
283
  gap: 4,
240
284
  role: "list",
285
+ "data-testid": "assets-grid",
241
286
  children: [
242
287
  folders.length > 0 && /*#__PURE__*/ jsx(FoldersRow, {
243
288
  children: /*#__PURE__*/ jsx(Grid.Root, {
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsGrid.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: pointer;\n transition: background 0.2s;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage src={mediaURL} alt={alternativeText || ''} />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n tabIndex={0}\n role=\"listitem\"\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","handleKeyDown","e","key","preventDefault","_jsxs","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":";;;;;;;;;;;AAuBA;;AAEkG,qGAElG,MAAMA,UAAAA,GAAaC,MAAAA,CAAOC,IAAAA,CAAK;oBACX,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;;;gBAM7C,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;;;;uBAIlC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;AAGhE,CAAC;AAED;;AAEkG,qGAElG,MAAMC,UAAAA,GAAaP,MAAAA,CAAOQ,GAAAA,CAAI;;AAE9B,CAAC;AAED,MAAMC,gBAAAA,GAAmBT,MAAAA,CAAOU,IAAAA,CAAK;;AAE1B,WAAA,EAAE,CAAC,EAAER,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMS,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAET,KAAAA,CAAMS,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;;OAE7D,EAAE,CAAC,EAAET,KAAK,EAAE,GAAKA,KAAAA,CAAMS,MAAM,CAAC,CAAA,CAAE,CAAC;oBACpB,EAAE,CAAC,EAAET,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMU,YAAY,CAAC;cACvC,EAAE,CAAC,EAAEV,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACU,QAAQ,CAAC;;;;;gBAKrC,EAAE,CAAC,EAAEX,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;;;;uBAIlC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;AAGhE,CAAC;AAED,MAAMQ,mBAAAA,GAAsBd,MAAAA,CAAOU,IAAAA,CAAK;;SAE/B,EAAE,CAAC,EAAER,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACY,UAAU,CAAC;AAClD,CAAC;AAED,MAAMC,UAAAA,GAAahB,MAAAA,CAAOiB,UAAAA,CAAW;;;AAGrC,CAAC;AAMD,MAAMC,UAAAA,GAAa,CAAC,EAAEC,MAAM,EAAmB,GAAA;IAC7C,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,mBAAAA,EAAAA;AAE7B,IAAA,MAAMC,gBAAgB,CAACC,CAAAA,GAAAA;AACrB,QAAA,IAAIA,EAAEC,GAAG,KAAK,WAAWD,CAAAA,CAAEC,GAAG,KAAK,GAAA,EAAK;AACtCD,YAAAA,CAAAA,CAAEE,cAAc,EAAA;YAChBL,gBAAAA,CAAiBH,MAAAA,CAAAA;AACnB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACES,IAAA,CAACnB,gBAAAA,EAAAA;AACCoB,QAAAA,OAAAA,EAAS,IAAMP,gBAAAA,CAAiBH,MAAAA,CAAAA;QAChCW,SAAAA,EAAWN,aAAAA;QACXO,IAAAA,EAAK,UAAA;QACLC,QAAAA,EAAU,CAAA;;0BAEVC,GAAA,CAACnB,mBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAmB,GAAA,CAACC,MAAAA,EAAAA;oBAAWC,KAAAA,EAAO,EAAA;oBAAIC,MAAAA,EAAQ;;;0BAEjCH,GAAA,CAACjB,UAAAA,EAAAA;gBAAWqB,SAAAA,EAAU,YAAA;gBAAaC,QAAQ,EAAA,IAAA;AACxCnB,gBAAAA,QAAAA,EAAAA,MAAAA,CAAOoB;;0BAEVN,GAAA,CAACO,UAAAA,EAAAA;AACCC,gBAAAA,KAAAA,EAAOrB,aAAAA,CAAc;AACnBsB,oBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAC,OAAAA,EAAQ,OAAA;gBACRhB,OAAAA,EAAS,CAACJ,CAAAA,GAAwBA,CAAAA,CAAEqB,eAAe,EAAA;AAEnD,gBAAA,QAAA,gBAAAb,GAAA,CAACc,IAAAA,EAAAA,EAAAA;;;;AAIT,CAAA;AAEA;;AAEkG,qGAElG,MAAMC,gBAAAA,GAAmBhD,MAAAA,CAAOQ,GAAAA,CAAI;;;;;;;MAO9B,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8C,UAAU,CAAC;;;;AAI/C,CAAC;AAED,MAAMC,WAAAA,GAAclD,MAAAA,CAAOmD,GAAG;;;;;;;AAO9B,CAAC;AAED,MAAMC,WAAAA,GAAcpD,MAAAA,CAAOU,IAAAA,CAAK;;;;;;SAMvB,EAAE,CAAC,EAAER,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACkD,UAAU,CAAC;cACpC,EAAE,CAAC,EAAEnD,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8C,UAAU,CAAC;AACvD,CAAC;AAMD,MAAMK,YAAAA,GAAe,CAAC,EAAEC,KAAK,EAAqB,GAAA;IAChD,MAAM,EAAEC,eAAe,EAAEC,GAAG,EAAEC,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAE,GAAGL,KAAAA;AAErD,IAAA,IAAII,IAAAA,EAAME,QAAAA,CAASC,WAAAA,CAAYC,KAAK,CAAA,EAAG;AACrC,QAAA,MAAMC,QAAAA,GACJC,2BAAAA,CAA4BP,OAAAA,EAASQ,SAAAA,EAAWN,QAAQK,2BAAAA,CAA4BL,GAAAA,CAAAA;AAEtF,QAAA,IAAII,QAAAA,EAAU;AACZ,YAAA,qBACE/B,GAAA,CAACe,gBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAf,GAAA,CAACiB,WAAAA,EAAAA;oBAAYiB,GAAAA,EAAKH,QAAAA;AAAUI,oBAAAA,GAAAA,EAAKZ,eAAAA,IAAmB;;;AAG1D,QAAA;AACF,IAAA;IAEA,MAAMa,OAAAA,GAAUC,aAAaX,IAAAA,EAAMF,GAAAA,CAAAA;AAEnC,IAAA,qBACExB,GAAA,CAACe,gBAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAf,GAAA,CAACmB,WAAAA,EAAAA;YAAYmB,cAAAA,EAAe,QAAA;YAASC,UAAAA,EAAW,QAAA;AAC9C,YAAA,QAAA,gBAAAvC,GAAA,CAACoC,OAAAA,EAAAA;gBAAQlC,KAAAA,EAAO,EAAA;gBAAIC,MAAAA,EAAQ;;;;AAIpC,CAAA;AAEA;;AAEkG,qGAElG,MAAMqC,gBAAAA,GAAmBzE,MAAAA,CAAO0E,UAAAA,CAAW;2BAChB,EAAE,CAAC,EAAExE,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AACpE,CAAC;AAED,MAAMuE,UAAAA,GAAa3E,MAAAA,CAAOU,IAAAA,CAAK;;;AAG/B,CAAC;AAED,MAAMkE,YAAAA,GAAe5E,MAAAA,CAAOU,IAAAA,CAAK;SACxB,EAAE,CAAC,EAAER,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACY,UAAU,CAAC;;AAElD,CAAC;AAED,MAAM8D,QAAAA,GAAW7E,MAAAA,CAAOiB,UAAAA,CAAW;;;AAGnC,CAAC;AAOD,MAAM6D,YAAY,CAAC,EAAEvB,KAAK,EAAEwB,gBAAgB,EAAkB,GAAA;IAC5D,MAAM,EAAE3D,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM2D,WAAWV,YAAAA,CAAaf,KAAAA,CAAMI,IAAI,EAAEJ,MAAME,GAAG,CAAA;AAEnD,IAAA,MAAMjC,gBAAgB,CAACC,CAAAA,GAAAA;AACrB,QAAA,IAAIA,EAAEC,GAAG,KAAK,WAAWD,CAAAA,CAAEC,GAAG,KAAK,GAAA,EAAK;AACtCD,YAAAA,CAAAA,CAAEE,cAAc,EAAA;AAChBoD,YAAAA,gBAAAA,CAAiBxB,MAAMb,EAAE,CAAA;AAC3B,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEd,IAAA,CAAC7B,UAAAA,EAAAA;QACCiC,QAAAA,EAAU,CAAA;QACVD,IAAAA,EAAK,UAAA;QACLF,OAAAA,EAAS,IAAMkD,gBAAAA,CAAiBxB,KAAAA,CAAMb,EAAE,CAAA;QACxCZ,SAAAA,EAAWN,aAAAA;;0BAEXS,GAAA,CAACwC,gBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAxC,GAAA,CAACqB,YAAAA,EAAAA;oBAAaC,KAAAA,EAAOA;;;0BAEvBtB,GAAA,CAACgD,QAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAArD,IAAA,CAAC+C,UAAAA,EAAAA;oBAAWH,UAAAA,EAAW,QAAA;oBAASU,GAAAA,EAAK,CAAA;;sCACnCjD,GAAA,CAAC2C,YAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAA3C,GAAA,CAAC+C,QAAAA,EAAAA;gCAAS7C,KAAAA,EAAO,EAAA;gCAAIC,MAAAA,EAAQ;;;sCAE/BH,GAAA,CAAC4C,QAAAA,EAAAA;4BAASxC,SAAAA,EAAU,YAAA;4BAAaC,QAAQ,EAAA,IAAA;AACtCiB,4BAAAA,QAAAA,EAAAA,KAAAA,CAAMhB;;sCAETN,GAAA,CAACO,UAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOrB,aAAAA,CAAc;AACnBsB,gCAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;gCACtBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAC,OAAAA,EAAQ,OAAA;AAER,4BAAA,QAAA,gBAAAZ,GAAA,CAACc,IAAAA,EAAAA,EAAAA;;;;;;;AAMb,CAAA;AAYO,MAAMoC,UAAAA,GAAa,CAAC,EAAEC,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAEN,gBAAgB,EAAmB,GAAA;IACpF,MAAM,EAAE3D,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAMiE,UAAAA,GAAaD,OAAAA,CAAQE,MAAM,GAAGH,OAAOG,MAAM;AAEjD,IAAA,IAAID,eAAe,CAAA,EAAG;AACpB,QAAA,qBACErD,GAAA,CAACzB,GAAAA,EAAAA;YAAIgF,OAAAA,EAAS,CAAA;AACZ,YAAA,QAAA,gBAAAvD,GAAA,CAAChB,UAAAA,EAAAA;gBAAWoB,SAAAA,EAAU,YAAA;0BACnBjB,aAAAA,CAAc;oBACbsB,EAAAA,EAAI,kDAAA;oBACJE,cAAAA,EAAgB;AAClB,iBAAA;;;AAIR,IAAA;IAEA,qBACEhB,IAAA,CAAC6D,KAAKC,IAAI,EAAA;QAACR,GAAAA,EAAK,CAAA;QAAGnD,IAAAA,EAAK,MAAA;;YACrBsD,OAAAA,CAAQE,MAAM,GAAG,CAAA,kBAChBtD,GAAA,CAAC1B,UAAAA,EAAAA;wCACC0B,GAAA,CAACwD,KAAKC,IAAI,EAAA;oBAACR,GAAAA,EAAK,CAAA;AACbG,oBAAAA,QAAAA,EAAAA,OAAAA,CAAQM,GAAG,CAAC,CAACxE,MAAAA,iBACZc,GAAA,CAACwD,KAAKG,IAAI,EAAA;4BAACC,GAAAA,EAAK,CAAA;4BAAGC,CAAAA,EAAG,CAAA;4BAAGC,CAAAA,EAAG,CAAA;4BAAGC,EAAAA,EAAI,EAAA;AACjC,4BAAA,QAAA,gBAAA/D,GAAA,CAACf,UAAAA,EAAAA;gCAAWC,MAAAA,EAAQA;;AADsB,yBAAA,EAAA,CAAC,OAAO,EAAEA,MAAAA,CAAOuB,EAAE,CAAA,CAAE,CAAA;;;AAOxE0C,YAAAA,MAAAA,CAAOO,GAAG,CAAC,CAACpC,KAAAA,iBACXtB,GAAA,CAACwD,KAAKG,IAAI,EAAA;oBACRC,GAAAA,EAAK,CAAA;oBACLC,CAAAA,EAAG,CAAA;oBACHC,CAAAA,EAAG,CAAA;oBACHC,EAAAA,EAAI,EAAA;oBAEJC,SAAAA,EAAU,QAAA;oBACVzB,UAAAA,EAAW,SAAA;AAEX,oBAAA,QAAA,gBAAAvC,GAAA,CAAC6C,SAAAA,EAAAA;wBAAUvB,KAAAA,EAAOA,KAAAA;wBAAOwB,gBAAAA,EAAkBA;;AAJtCxB,iBAAAA,EAAAA,KAAAA,CAAMb,EAAE,CAAA;;;AASvB;;;;"}
1
+ {"version":3,"file":"AssetsGrid.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
@@ -11,6 +11,8 @@ var getAssetIcon = require('../../../utils/getAssetIcon.js');
11
11
  var translations = require('../../../utils/translations.js');
12
12
  var constants = require('../constants.js');
13
13
  var useFolderNavigation = require('../hooks/useFolderNavigation.js');
14
+ var AssetsDndProvider = require('./Dnd/AssetsDndProvider.js');
15
+ var useAssetDnd = require('./Dnd/useAssetDnd.js');
14
16
 
15
17
  const StyledTable = styledComponents.styled(designSystem.RawTable)`
16
18
  width: 100%;
@@ -36,10 +38,23 @@ const StyledTd = styledComponents.styled(designSystem.RawTd)`
36
38
  padding: 0 ${({ theme })=>theme.spaces[4]};
37
39
  border-bottom: 1px solid ${({ theme })=>theme.colors.neutral150};
38
40
  `;
39
- const StyledTr = styledComponents.styled(designSystem.RawTr)`
41
+ const StyledTr = styledComponents.styled.tr`
40
42
  height: 48px;
41
43
  background: ${({ theme })=>theme.colors.neutral0};
42
- cursor: pointer;
44
+ cursor: ${({ $isMovePending, $isInvalidDropTarget })=>{
45
+ if ($isMovePending) {
46
+ return 'wait';
47
+ }
48
+ return $isInvalidDropTarget ? 'not-allowed' : 'pointer';
49
+ }};
50
+ opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
51
+ pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
52
+
53
+ ${({ $isValidDropTarget, theme })=>$isValidDropTarget && styledComponents.css`
54
+ background: ${theme.colors.primary100};
55
+ outline: 1px dashed ${theme.colors.primary600};
56
+ outline-offset: -1px;
57
+ `}
43
58
 
44
59
  &:hover {
45
60
  background: ${({ theme })=>theme.colors.primary100};
@@ -80,6 +95,10 @@ const AssetPreviewCell = ({ asset })=>{
80
95
  const AssetRow = ({ asset, onAssetItemClick })=>{
81
96
  const isMobile = strapiAdmin.useIsMobile();
82
97
  const { formatDate, formatMessage } = reactIntl.useIntl();
98
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
99
+ isMovePending: false
100
+ };
101
+ const { attributes, listeners, setNodeRef, isDragging } = useAssetDnd.useFileDraggable(asset);
83
102
  const handleKeyDown = (e)=>{
84
103
  if (e.key === 'Enter' || e.key === ' ') {
85
104
  e.preventDefault();
@@ -87,8 +106,14 @@ const AssetRow = ({ asset, onAssetItemClick })=>{
87
106
  }
88
107
  };
89
108
  return /*#__PURE__*/ jsxRuntime.jsxs(StyledTr, {
109
+ ref: setNodeRef,
110
+ ...attributes,
111
+ ...listeners,
112
+ $isDragging: isDragging,
113
+ $isMovePending: isMovePending,
90
114
  tabIndex: 0,
91
115
  role: "row",
116
+ onDragStart: (e)=>e.preventDefault(),
92
117
  onClick: ()=>onAssetItemClick(asset.id),
93
118
  onKeyDown: handleKeyDown,
94
119
  children: [
@@ -155,6 +180,7 @@ const AssetRow = ({ asset, onAssetItemClick })=>{
155
180
  defaultMessage: 'More actions'
156
181
  }),
157
182
  variant: "ghost",
183
+ onClick: (e)=>e.stopPropagation(),
158
184
  children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
159
185
  })
160
186
  })
@@ -163,8 +189,6 @@ const AssetRow = ({ asset, onAssetItemClick })=>{
163
189
  });
164
190
  };
165
191
  const FolderTr = styledComponents.styled(StyledTr)`
166
- cursor: pointer;
167
-
168
192
  &:hover {
169
193
  background: ${({ theme })=>theme.colors.primary100};
170
194
  }
@@ -173,6 +197,10 @@ const FolderRow = ({ folder })=>{
173
197
  const isMobile = strapiAdmin.useIsMobile();
174
198
  const { formatDate, formatMessage } = reactIntl.useIntl();
175
199
  const { navigateToFolder } = useFolderNavigation.useFolderNavigation();
200
+ const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
201
+ isMovePending: false
202
+ };
203
+ const { draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useAssetDnd.useFolderDraggableDroppable(folder);
176
204
  const handleKeyDown = (e)=>{
177
205
  if (e.key === 'Enter' || e.key === ' ') {
178
206
  e.preventDefault();
@@ -180,8 +208,19 @@ const FolderRow = ({ folder })=>{
180
208
  }
181
209
  };
182
210
  return /*#__PURE__*/ jsxRuntime.jsxs(FolderTr, {
211
+ ref: (node)=>{
212
+ setDragRef(node);
213
+ setDropRef(node);
214
+ },
215
+ ...attributes,
216
+ ...listeners,
217
+ $isDragging: isDragging,
218
+ $isMovePending: isMovePending,
219
+ $isValidDropTarget: showValidDropHighlight,
220
+ $isInvalidDropTarget: showInvalidDropCursor,
183
221
  tabIndex: 0,
184
222
  role: "row",
223
+ onDragStart: (e)=>e.preventDefault(),
185
224
  onClick: ()=>navigateToFolder(folder),
186
225
  onKeyDown: handleKeyDown,
187
226
  children: [