@strapi/upload 5.36.1 → 5.37.0

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 (50) hide show
  1. package/dist/admin/future/pages/Assets/AssetsPage.js +42 -9
  2. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  3. package/dist/admin/future/pages/Assets/AssetsPage.mjs +42 -9
  4. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  5. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +95 -13
  6. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  7. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +97 -15
  8. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  9. package/dist/admin/future/pages/Assets/components/AssetsTable.js +99 -6
  10. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +100 -7
  12. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +2 -2
  14. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  15. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +2 -2
  16. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
  17. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js +50 -0
  18. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs +48 -0
  20. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +20 -0
  22. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -0
  23. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +18 -0
  24. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -0
  25. package/dist/admin/future/services/assets.js +32 -3
  26. package/dist/admin/future/services/assets.js.map +1 -1
  27. package/dist/admin/future/services/assets.mjs +32 -3
  28. package/dist/admin/future/services/assets.mjs.map +1 -1
  29. package/dist/admin/future/services/folders.js +101 -0
  30. package/dist/admin/future/services/folders.js.map +1 -0
  31. package/dist/admin/future/services/folders.mjs +98 -0
  32. package/dist/admin/future/services/folders.mjs.map +1 -0
  33. package/dist/admin/package.json.js +8 -8
  34. package/dist/admin/package.json.mjs +8 -8
  35. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +3 -1
  36. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +3 -1
  37. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +2 -1
  38. package/dist/admin/src/future/pages/Assets/hooks/useFolderInfo.d.ts +5 -0
  39. package/dist/admin/src/future/pages/Assets/hooks/useFolderNavigation.d.ts +5 -0
  40. package/dist/admin/src/future/services/folders.d.ts +16 -0
  41. package/dist/admin/translations/en.json.js +2 -0
  42. package/dist/admin/translations/en.json.js.map +1 -1
  43. package/dist/admin/translations/en.json.mjs +2 -0
  44. package/dist/admin/translations/en.json.mjs.map +1 -1
  45. package/dist/server/controllers/content-api.js +6 -4
  46. package/dist/server/controllers/content-api.js.map +1 -1
  47. package/dist/server/controllers/content-api.mjs +6 -4
  48. package/dist/server/controllers/content-api.mjs.map +1 -1
  49. package/dist/shared/contracts/folders.d.ts +2 -0
  50. package/package.json +8 -8
@@ -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 { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport type { File } from '../../../../../../shared/contracts/files';\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`;\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(AssetType.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: none;\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\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}\n\nconst AssetCard = ({ asset }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n return (\n <StyledCard>\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2} paddingTop={2}>\n <FileTypeIcon>\n <TypeIcon width={16} height={16} />\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}\n\nexport const AssetsGrid = ({ assets }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n if (assets.length === 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}>\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} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","PreviewContainer","Box","neutral100","StyledImage","img","IconPreview","Flex","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","AssetType","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","_jsx","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","width","height","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","neutral600","FileName","Typography","AssetCard","formatMessage","useIntl","TypeIcon","_jsxs","CardBody","gap","paddingTop","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","More","AssetsGrid","assets","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 } from 'styled-components';\n\nimport { AssetType } 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`;\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 return (\n <StyledFolderCard onClick={() => navigateToFolder(folder)} role=\"button\" tabIndex={0}>\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(AssetType.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: none;\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\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}\n\nconst AssetCard = ({ asset }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n return (\n <StyledCard>\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2} paddingTop={2}>\n <FileTypeIcon>\n <TypeIcon width={16} height={16} />\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}\n\nexport const AssetsGrid = ({ assets, folders = [] }: 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}>\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} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","primary100","primary600","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","_jsxs","onClick","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","e","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","AssetType","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","TypeIcon","CardBody","gap","paddingTop","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { Card, Box, Flex, CardHeader, Typography, Grid, CardBody, IconButton } from '@strapi/design-system';
3
- import { More } from '@strapi/icons';
2
+ import { Card, Box, Flex, Typography, CardHeader, Grid, IconButton, CardBody } from '@strapi/design-system';
3
+ import { Folder, More } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { styled } from 'styled-components';
6
6
  import { AssetType } 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
+ import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
10
11
 
11
12
  /* -------------------------------------------------------------------------------------------------
12
13
  * AssetsGrid
@@ -15,6 +16,70 @@ import { getTranslationKey } from '../../../utils/translations.mjs';
15
16
  border-radius: 8px;
16
17
  overflow: hidden;
17
18
  `;
19
+ /* -------------------------------------------------------------------------------------------------
20
+ * FolderCard
21
+ * -----------------------------------------------------------------------------------------------*/ const FoldersRow = styled(Box)`
22
+ grid-column: 1 / -1;
23
+ `;
24
+ const StyledFolderCard = styled(Flex)`
25
+ width: 100%;
26
+ padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px
27
+ align-items: center;
28
+ gap: ${({ theme })=>theme.spaces[2]}; // 8px
29
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
30
+ border-radius: ${({ theme })=>theme.borderRadius};
31
+ background: ${({ theme })=>theme.colors.neutral0};
32
+ cursor: pointer;
33
+ transition: background 0.2s;
34
+
35
+ &:hover {
36
+ background: ${({ theme })=>theme.colors.primary100};
37
+ }
38
+
39
+ &:focus-visible {
40
+ outline: 2px solid ${({ theme })=>theme.colors.primary600};
41
+ outline-offset: 2px;
42
+ }
43
+ `;
44
+ const FolderIconContainer = styled(Flex)`
45
+ flex-shrink: 0;
46
+ color: ${({ theme })=>theme.colors.neutral600};
47
+ `;
48
+ const FolderName = styled(Typography)`
49
+ flex: 1;
50
+ min-width: 0;
51
+ `;
52
+ const FolderCard = ({ folder })=>{
53
+ const { formatMessage } = useIntl();
54
+ const { navigateToFolder } = useFolderNavigation();
55
+ return /*#__PURE__*/ jsxs(StyledFolderCard, {
56
+ onClick: ()=>navigateToFolder(folder),
57
+ role: "button",
58
+ tabIndex: 0,
59
+ children: [
60
+ /*#__PURE__*/ jsx(FolderIconContainer, {
61
+ children: /*#__PURE__*/ jsx(Folder, {
62
+ width: 20,
63
+ height: 20
64
+ })
65
+ }),
66
+ /*#__PURE__*/ jsx(FolderName, {
67
+ textColor: "neutral800",
68
+ ellipsis: true,
69
+ children: folder.name
70
+ }),
71
+ /*#__PURE__*/ jsx(IconButton, {
72
+ label: formatMessage({
73
+ id: getTranslationKey('control-card.more-actions'),
74
+ defaultMessage: 'More actions'
75
+ }),
76
+ variant: "ghost",
77
+ onClick: (e)=>e.stopPropagation(),
78
+ children: /*#__PURE__*/ jsx(More, {})
79
+ })
80
+ ]
81
+ });
82
+ };
18
83
  /* -------------------------------------------------------------------------------------------------
19
84
  * AssetPreview
20
85
  * -----------------------------------------------------------------------------------------------*/ const PreviewContainer = styled(Box)`
@@ -128,9 +193,10 @@ const AssetCard = ({ asset })=>{
128
193
  ]
129
194
  });
130
195
  };
131
- const AssetsGrid = ({ assets })=>{
196
+ const AssetsGrid = ({ assets, folders = [] })=>{
132
197
  const { formatMessage } = useIntl();
133
- if (assets.length === 0) {
198
+ const totalItems = folders.length + assets.length;
199
+ if (totalItems === 0) {
134
200
  return /*#__PURE__*/ jsx(Box, {
135
201
  padding: 8,
136
202
  children: /*#__PURE__*/ jsx(Typography, {
@@ -142,19 +208,35 @@ const AssetsGrid = ({ assets })=>{
142
208
  })
143
209
  });
144
210
  }
145
- return /*#__PURE__*/ jsx(Grid.Root, {
211
+ return /*#__PURE__*/ jsxs(Grid.Root, {
146
212
  gap: 4,
147
- children: assets.map((asset)=>/*#__PURE__*/ jsx(Grid.Item, {
148
- col: 3,
149
- m: 4,
150
- s: 6,
151
- xs: 12,
152
- direction: "column",
153
- alignItems: "stretch",
154
- children: /*#__PURE__*/ jsx(AssetCard, {
155
- asset: asset
213
+ children: [
214
+ folders.length > 0 && /*#__PURE__*/ jsx(FoldersRow, {
215
+ children: /*#__PURE__*/ jsx(Grid.Root, {
216
+ gap: 4,
217
+ children: folders.map((folder)=>/*#__PURE__*/ jsx(Grid.Item, {
218
+ col: 3,
219
+ m: 4,
220
+ s: 6,
221
+ xs: 12,
222
+ children: /*#__PURE__*/ jsx(FolderCard, {
223
+ folder: folder
224
+ })
225
+ }, `folder-${folder.id}`))
156
226
  })
157
- }, asset.id))
227
+ }),
228
+ assets.map((asset)=>/*#__PURE__*/ jsx(Grid.Item, {
229
+ col: 3,
230
+ m: 4,
231
+ s: 6,
232
+ xs: 12,
233
+ direction: "column",
234
+ alignItems: "stretch",
235
+ children: /*#__PURE__*/ jsx(AssetCard, {
236
+ asset: asset
237
+ })
238
+ }, asset.id))
239
+ ]
158
240
  });
159
241
  };
160
242
 
@@ -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 { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport type { File } from '../../../../../../shared/contracts/files';\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`;\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(AssetType.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: none;\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\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}\n\nconst AssetCard = ({ asset }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n return (\n <StyledCard>\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2} paddingTop={2}>\n <FileTypeIcon>\n <TypeIcon width={16} height={16} />\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}\n\nexport const AssetsGrid = ({ assets }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n if (assets.length === 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}>\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} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","PreviewContainer","Box","neutral100","StyledImage","img","IconPreview","Flex","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","AssetType","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","_jsx","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","width","height","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","neutral600","FileName","Typography","AssetCard","formatMessage","useIntl","TypeIcon","_jsxs","CardBody","gap","paddingTop","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","More","AssetsGrid","assets","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":"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"}
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 { AssetType } 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`;\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 return (\n <StyledFolderCard onClick={() => navigateToFolder(folder)} role=\"button\" tabIndex={0}>\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(AssetType.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: none;\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\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}\n\nconst AssetCard = ({ asset }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n\n return (\n <StyledCard>\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2} paddingTop={2}>\n <FileTypeIcon>\n <TypeIcon width={16} height={16} />\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}\n\nexport const AssetsGrid = ({ assets, folders = [] }: 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}>\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} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","primary100","primary600","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","_jsxs","onClick","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","e","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","AssetType","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","TypeIcon","CardBody","gap","paddingTop","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","map","Item","col","m","s","xs","direction"],"mappings":";;;;;;;;;;;AAuBA;;AAEkG,qGAElG,MAAMA,UAAAA,GAAaC,MAAOC,CAAAA,IAAAA,CAAK;oBACX,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACC,UAAU,CAAC;;;AAG7D,CAAC;AAED;;AAEkG,qGAElG,MAAMC,UAAAA,GAAaL,MAAOM,CAAAA,GAAAA,CAAI;;AAE9B,CAAC;AAED,MAAMC,gBAAAA,GAAmBP,MAAOQ,CAAAA,IAAAA,CAAK;;AAE1B,WAAA,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMO,MAAM,CAAC,CAAE,CAAA,CAAC,CAAC,EAAEP,KAAAA,CAAMO,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;;OAE7D,EAAE,CAAC,EAAEP,KAAK,EAAE,GAAKA,KAAMO,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;oBACpB,EAAE,CAAC,EAAEP,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACC,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMQ,YAAY,CAAC;cACvC,EAAE,CAAC,EAAER,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACQ,QAAQ,CAAC;;;;;gBAKrC,EAAE,CAAC,EAAET,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACS,UAAU,CAAC;;;;uBAIlC,EAAE,CAAC,EAAEV,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACU,UAAU,CAAC;;;AAGhE,CAAC;AAED,MAAMC,mBAAAA,GAAsBd,MAAOQ,CAAAA,IAAAA,CAAK;;SAE/B,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACY,UAAU,CAAC;AAClD,CAAC;AAED,MAAMC,UAAAA,GAAahB,MAAOiB,CAAAA,UAAAA,CAAW;;;AAGrC,CAAC;AAMD,MAAMC,UAAa,GAAA,CAAC,EAAEC,MAAM,EAAmB,GAAA;IAC7C,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,mBAAAA,EAAAA;AAE7B,IAAA,qBACEC,IAACjB,CAAAA,gBAAAA,EAAAA;AAAiBkB,QAAAA,OAAAA,EAAS,IAAMH,gBAAiBH,CAAAA,MAAAA,CAAAA;QAASO,IAAK,EAAA,QAAA;QAASC,QAAU,EAAA,CAAA;;0BACjFC,GAACd,CAAAA,mBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAc,GAACC,CAAAA,MAAAA,EAAAA;oBAAWC,KAAO,EAAA,EAAA;oBAAIC,MAAQ,EAAA;;;0BAEjCH,GAACZ,CAAAA,UAAAA,EAAAA;gBAAWgB,SAAU,EAAA,YAAA;gBAAaC,QAAQ,EAAA,IAAA;AACxCd,gBAAAA,QAAAA,EAAAA,MAAAA,CAAOe;;0BAEVN,GAACO,CAAAA,UAAAA,EAAAA;AACCC,gBAAAA,KAAAA,EAAOhB,aAAc,CAAA;AACnBiB,oBAAAA,EAAAA,EAAIC,iBAAkB,CAAA,2BAAA,CAAA;oBACtBC,cAAgB,EAAA;AAClB,iBAAA,CAAA;gBACAC,OAAQ,EAAA,OAAA;gBACRf,OAAS,EAAA,CAACgB,CAAwBA,GAAAA,CAAAA,CAAEC,eAAe,EAAA;AAEnD,gBAAA,QAAA,gBAAAd,GAACe,CAAAA,IAAAA,EAAAA,EAAAA;;;;AAIT,CAAA;AAEA;;AAEkG,qGAElG,MAAMC,gBAAAA,GAAmB5C,MAAOM,CAAAA,GAAAA,CAAI;;;;;;;MAO9B,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC0C,UAAU,CAAC;;;;AAI/C,CAAC;AAED,MAAMC,WAAAA,GAAc9C,MAAO+C,CAAAA,GAAG;;;;;;;AAO9B,CAAC;AAED,MAAMC,WAAAA,GAAchD,MAAOQ,CAAAA,IAAAA,CAAK;;;;;;SAMvB,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC8C,UAAU,CAAC;cACpC,EAAE,CAAC,EAAE/C,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC0C,UAAU,CAAC;AACvD,CAAC;AAMD,MAAMK,YAAe,GAAA,CAAC,EAAEC,KAAK,EAAqB,GAAA;IAChD,MAAM,EAAEC,eAAe,EAAEC,GAAG,EAAEC,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAE,GAAGL,KAAAA;AAErD,IAAA,IAAII,IAAME,EAAAA,QAAAA,CAASC,SAAUC,CAAAA,KAAK,CAAG,EAAA;AACnC,QAAA,MAAMC,QACJC,GAAAA,2BAAAA,CAA4BP,OAASQ,EAAAA,SAAAA,EAAWN,QAAQK,2BAA4BL,CAAAA,GAAAA,CAAAA;AAEtF,QAAA,IAAII,QAAU,EAAA;AACZ,YAAA,qBACEhC,GAACgB,CAAAA,gBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAhB,GAACkB,CAAAA,WAAAA,EAAAA;oBAAYiB,GAAKH,EAAAA,QAAAA;AAAUI,oBAAAA,GAAAA,EAAKZ,eAAmB,IAAA;;;AAG1D;AACF;IAEA,MAAMa,OAAAA,GAAUC,aAAaX,IAAMF,EAAAA,GAAAA,CAAAA;AAEnC,IAAA,qBACEzB,GAACgB,CAAAA,gBAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAhB,GAACoB,CAAAA,WAAAA,EAAAA;YAAYmB,cAAe,EAAA,QAAA;YAASC,UAAW,EAAA,QAAA;AAC9C,YAAA,QAAA,gBAAAxC,GAACqC,CAAAA,OAAAA,EAAAA;gBAAQnC,KAAO,EAAA,EAAA;gBAAIC,MAAQ,EAAA;;;;AAIpC,CAAA;AAEA;;AAEkG,qGAElG,MAAMsC,gBAAAA,GAAmBrE,MAAOsE,CAAAA,UAAAA,CAAW;;AAE3C,CAAC;AAED,MAAMC,UAAAA,GAAavE,MAAOQ,CAAAA,IAAAA,CAAK;;AAE/B,CAAC;AAED,MAAMgE,YAAAA,GAAexE,MAAOQ,CAAAA,IAAAA,CAAK;SACxB,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACY,UAAU,CAAC;;AAElD,CAAC;AAED,MAAM0D,QAAAA,GAAWzE,MAAOiB,CAAAA,UAAAA,CAAW;;;AAGnC,CAAC;AAMD,MAAMyD,SAAY,GAAA,CAAC,EAAEvB,KAAK,EAAkB,GAAA;IAC1C,MAAM,EAAE/B,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMsD,WAAWT,YAAaf,CAAAA,KAAAA,CAAMI,IAAI,EAAEJ,MAAME,GAAG,CAAA;AAEnD,IAAA,qBACE7B,IAACzB,CAAAA,UAAAA,EAAAA;;0BACC6B,GAACyC,CAAAA,gBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAzC,GAACsB,CAAAA,YAAAA,EAAAA;oBAAaC,KAAOA,EAAAA;;;0BAEvBvB,GAACgD,CAAAA,QAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAApD,IAAC+C,CAAAA,UAAAA,EAAAA;oBAAWH,UAAW,EAAA,QAAA;oBAASS,GAAK,EAAA,CAAA;oBAAGC,UAAY,EAAA,CAAA;;sCAClDlD,GAAC4C,CAAAA,YAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAA5C,GAAC+C,CAAAA,QAAAA,EAAAA;gCAAS7C,KAAO,EAAA,EAAA;gCAAIC,MAAQ,EAAA;;;sCAE/BH,GAAC6C,CAAAA,QAAAA,EAAAA;4BAASzC,SAAU,EAAA,YAAA;4BAAaC,QAAQ,EAAA,IAAA;AACtCkB,4BAAAA,QAAAA,EAAAA,KAAAA,CAAMjB;;sCAETN,GAACO,CAAAA,UAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOhB,aAAc,CAAA;AACnBiB,gCAAAA,EAAAA,EAAIC,iBAAkB,CAAA,2BAAA,CAAA;gCACtBC,cAAgB,EAAA;AAClB,6BAAA,CAAA;4BACAC,OAAQ,EAAA,OAAA;AAER,4BAAA,QAAA,gBAAAZ,GAACe,CAAAA,IAAAA,EAAAA,EAAAA;;;;;;;AAMb,CAAA;AAWO,MAAMoC,aAAa,CAAC,EAAEC,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAmB,GAAA;IAClE,MAAM,EAAE7D,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAM6D,UAAaD,GAAAA,OAAAA,CAAQE,MAAM,GAAGH,OAAOG,MAAM;AAEjD,IAAA,IAAID,eAAe,CAAG,EAAA;AACpB,QAAA,qBACEtD,GAACtB,CAAAA,GAAAA,EAAAA;YAAI8E,OAAS,EAAA,CAAA;AACZ,YAAA,QAAA,gBAAAxD,GAACX,CAAAA,UAAAA,EAAAA;gBAAWe,SAAU,EAAA,YAAA;0BACnBZ,aAAc,CAAA;oBACbiB,EAAI,EAAA,kDAAA;oBACJE,cAAgB,EAAA;AAClB,iBAAA;;;AAIR;IAEA,qBACEf,IAAA,CAAC6D,KAAKC,IAAI,EAAA;QAACT,GAAK,EAAA,CAAA;;YACbI,OAAQE,CAAAA,MAAM,GAAG,CAAA,kBAChBvD,GAACvB,CAAAA,UAAAA,EAAAA;wCACCuB,GAAA,CAACyD,KAAKC,IAAI,EAAA;oBAACT,GAAK,EAAA,CAAA;AACbI,oBAAAA,QAAAA,EAAAA,OAAAA,CAAQM,GAAG,CAAC,CAACpE,MACZ,iBAAAS,GAAA,CAACyD,KAAKG,IAAI,EAAA;4BAACC,GAAK,EAAA,CAAA;4BAAGC,CAAG,EAAA,CAAA;4BAAGC,CAAG,EAAA,CAAA;4BAAGC,EAAI,EAAA,EAAA;AACjC,4BAAA,QAAA,gBAAAhE,GAACV,CAAAA,UAAAA,EAAAA;gCAAWC,MAAQA,EAAAA;;AADsB,yBAAA,EAAA,CAAC,OAAO,EAAEA,MAAOkB,CAAAA,EAAE,CAAE,CAAA,CAAA;;;AAOxE2C,YAAAA,MAAAA,CAAOO,GAAG,CAAC,CAACpC,KACX,iBAAAvB,GAAA,CAACyD,KAAKG,IAAI,EAAA;oBACRC,GAAK,EAAA,CAAA;oBACLC,CAAG,EAAA,CAAA;oBACHC,CAAG,EAAA,CAAA;oBACHC,EAAI,EAAA,EAAA;oBAEJC,SAAU,EAAA,QAAA;oBACVzB,UAAW,EAAA,SAAA;AAEX,oBAAA,QAAA,gBAAAxC,GAAC8C,CAAAA,SAAAA,EAAAA;wBAAUvB,KAAOA,EAAAA;;AAJbA,iBAAAA,EAAAA,KAAAA,CAAMd,EAAE,CAAA;;;AASvB;;;;"}
@@ -10,6 +10,7 @@ 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 constants = require('../constants.js');
13
+ var useFolderNavigation = require('../hooks/useFolderNavigation.js');
13
14
 
14
15
  const StyledTable = styledComponents.styled(designSystem.RawTable)`
15
16
  width: 100%;
@@ -141,13 +142,98 @@ const AssetRow = ({ asset })=>{
141
142
  ]
142
143
  });
143
144
  };
144
- const AssetsTable = ({ assets })=>{
145
+ const FolderTr = styledComponents.styled(StyledTr)`
146
+ cursor: pointer;
147
+
148
+ &:hover {
149
+ background: ${({ theme })=>theme.colors.primary100};
150
+ }
151
+ `;
152
+ const FolderRow = ({ folder })=>{
153
+ const isMobile = strapiAdmin.useIsMobile();
154
+ const { formatDate, formatMessage } = reactIntl.useIntl();
155
+ const { navigateToFolder } = useFolderNavigation.useFolderNavigation();
156
+ return /*#__PURE__*/ jsxRuntime.jsxs(FolderTr, {
157
+ onClick: ()=>navigateToFolder(folder),
158
+ children: [
159
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
160
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
161
+ gap: 3,
162
+ alignItems: "center",
163
+ children: [
164
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
165
+ justifyContent: "center",
166
+ alignItems: "center",
167
+ borderRadius: "4px",
168
+ color: "neutral600",
169
+ width: "3.2rem",
170
+ height: "3.2rem",
171
+ shrink: 0,
172
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {
173
+ width: 20,
174
+ height: 20
175
+ })
176
+ }),
177
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
178
+ textColor: "neutral800",
179
+ fontWeight: "semiBold",
180
+ ellipsis: true,
181
+ children: folder.name
182
+ })
183
+ ]
184
+ })
185
+ }),
186
+ !isMobile && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
187
+ children: [
188
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
189
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
190
+ textColor: "neutral600",
191
+ children: folder.createdAt ? formatDate(new Date(folder.createdAt), {
192
+ dateStyle: 'long'
193
+ }) : '-'
194
+ })
195
+ }),
196
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
197
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
198
+ textColor: "neutral600",
199
+ children: folder.updatedAt ? formatDate(new Date(folder.updatedAt), {
200
+ dateStyle: 'long'
201
+ }) : '-'
202
+ })
203
+ }),
204
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
205
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
206
+ textColor: "neutral600",
207
+ children: "-"
208
+ })
209
+ })
210
+ ]
211
+ }),
212
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
213
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
214
+ justifyContent: "flex-end",
215
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
216
+ label: formatMessage({
217
+ id: translations.getTranslationKey('control-card.more-actions'),
218
+ defaultMessage: 'More actions'
219
+ }),
220
+ variant: "ghost",
221
+ onClick: (e)=>e.stopPropagation(),
222
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
223
+ })
224
+ })
225
+ })
226
+ ]
227
+ });
228
+ };
229
+ const AssetsTable = ({ assets, folders = [] })=>{
145
230
  const isMobile = strapiAdmin.useIsMobile();
146
231
  const { formatMessage } = reactIntl.useIntl();
147
232
  const visibleHeaders = isMobile ? constants.TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions') : constants.TABLE_HEADERS;
233
+ const totalRows = folders.length + assets.length;
148
234
  return /*#__PURE__*/ jsxRuntime.jsxs(StyledTable, {
149
235
  colCount: visibleHeaders.length,
150
- rowCount: assets.length + 1,
236
+ rowCount: totalRows + 1,
151
237
  children: [
152
238
  /*#__PURE__*/ jsxRuntime.jsx(StyledThead, {
153
239
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTr, {
@@ -175,7 +261,7 @@ const AssetsTable = ({ assets })=>{
175
261
  })
176
262
  }),
177
263
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTbody, {
178
- children: assets.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTr, {
264
+ children: totalRows === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTr, {
179
265
  children: /*#__PURE__*/ jsxRuntime.jsx(StyledBodyTd, {
180
266
  colSpan: visibleHeaders.length,
181
267
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
@@ -186,9 +272,16 @@ const AssetsTable = ({ assets })=>{
186
272
  })
187
273
  })
188
274
  })
189
- }) : assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow, {
190
- asset: asset
191
- }, asset.id))
275
+ }) : /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
276
+ children: [
277
+ folders.map((folder)=>/*#__PURE__*/ jsxRuntime.jsx(FolderRow, {
278
+ folder: folder
279
+ }, `folder-${folder.id}`)),
280
+ assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow, {
281
+ asset: asset
282
+ }, asset.id))
283
+ ]
284
+ })
192
285
  })
193
286
  ]
194
287
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsTable.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsMobile } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { TABLE_HEADERS } from '../constants';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\nconst StyledTh = styled(RawTh)`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledTr = styled(RawTr)`\n height: 48px;\n background: ${({ theme }) => theme.colors.neutral0};\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\nconst StyledBodyTd = styled(RawTd)`\n padding: ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={16} height={16} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n}\n\nconst AssetRow = ({ asset }: AssetRowProps) => {\n const isMobile = useIsMobile();\n const { formatDate, formatMessage } = useIntl();\n\n return (\n <StyledTr>\n <StyledTd>\n <Flex gap={3} alignItems=\"center\">\n <AssetPreviewCell asset={asset} />\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {asset.name}\n </Typography>\n {isMobile && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n </StyledTd>\n {!isMobile && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </StyledTd>\n </>\n )}\n <StyledTd>\n <Flex justifyContent=\"flex-end\">\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 </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n}\n\nexport const AssetsTable = ({ assets }: AssetsTableProps) => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n\n const visibleHeaders = isMobile\n ? TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions')\n : TABLE_HEADERS;\n\n return (\n <StyledTable colCount={visibleHeaders.length} rowCount={assets.length + 1}>\n <StyledThead>\n <RawTr>\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {assets.length === 0 ? (\n <RawTr>\n <StyledBodyTd colSpan={visibleHeaders.length}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </StyledBodyTd>\n </RawTr>\n ) : (\n assets.map((asset) => <AssetRow key={asset.id} asset={asset} />)\n )}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","StyledTh","RawTh","spaces","StyledTd","RawTd","StyledTr","RawTr","neutral0","StyledBodyTd","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","isMobile","useIsMobile","formatDate","formatMessage","useIntl","_jsxs","gap","direction","Typography","textColor","fontWeight","ellipsis","name","variant","size","formatBytes","_Fragment","createdAt","Date","dateStyle","updatedAt","IconButton","label","id","getTranslationKey","defaultMessage","More","AssetsTable","assets","visibleHeaders","TABLE_HEADERS","filter","h","colCount","length","rowCount","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","colSpan"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsTable.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsMobile } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Typography,\n VisuallyHidden,\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 { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { TABLE_HEADERS } from '../constants';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\nconst StyledTh = styled(RawTh)`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledTr = styled(RawTr)`\n height: 48px;\n background: ${({ theme }) => theme.colors.neutral0};\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\nconst StyledBodyTd = styled(RawTd)`\n padding: ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={16} height={16} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n}\n\nconst AssetRow = ({ asset }: AssetRowProps) => {\n const isMobile = useIsMobile();\n const { formatDate, formatMessage } = useIntl();\n\n return (\n <StyledTr>\n <StyledTd>\n <Flex gap={3} alignItems=\"center\">\n <AssetPreviewCell asset={asset} />\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {asset.name}\n </Typography>\n {isMobile && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n </StyledTd>\n {!isMobile && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </StyledTd>\n </>\n )}\n <StyledTd>\n <Flex justifyContent=\"flex-end\">\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 </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\nconst FolderTr = styled(StyledTr)`\n cursor: pointer;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n`;\n\ninterface FolderRowProps {\n folder: Folder;\n}\n\nconst FolderRow = ({ folder }: FolderRowProps) => {\n const isMobile = useIsMobile();\n const { formatDate, formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n\n return (\n <FolderTr onClick={() => navigateToFolder(folder)}>\n <StyledTd>\n <Flex gap={3} alignItems=\"center\">\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral600\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <FolderIcon width={20} height={20} />\n </Flex>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {folder.name}\n </Typography>\n </Flex>\n </StyledTd>\n {!isMobile && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </StyledTd>\n </>\n )}\n <StyledTd>\n <Flex justifyContent=\"flex-end\">\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 </Flex>\n </StyledTd>\n </FolderTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n folders?: Folder[];\n}\n\nexport const AssetsTable = ({ assets, folders = [] }: AssetsTableProps) => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n\n const visibleHeaders = isMobile\n ? TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions')\n : TABLE_HEADERS;\n\n const totalRows = folders.length + assets.length;\n\n return (\n <StyledTable colCount={visibleHeaders.length} rowCount={totalRows + 1}>\n <StyledThead>\n <RawTr>\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {totalRows === 0 ? (\n <RawTr>\n <StyledBodyTd colSpan={visibleHeaders.length}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </StyledBodyTd>\n </RawTr>\n ) : (\n <>\n {folders.map((folder) => (\n <FolderRow key={`folder-${folder.id}`} folder={folder} />\n ))}\n {assets.map((asset) => (\n <AssetRow key={asset.id} asset={asset} />\n ))}\n </>\n )}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","StyledTh","RawTh","spaces","StyledTd","RawTd","StyledTr","RawTr","neutral0","StyledBodyTd","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","isMobile","useIsMobile","formatDate","formatMessage","useIntl","_jsxs","gap","direction","Typography","textColor","fontWeight","ellipsis","name","variant","size","formatBytes","_Fragment","createdAt","Date","dateStyle","updatedAt","IconButton","label","id","getTranslationKey","defaultMessage","More","FolderTr","primary100","FolderRow","folder","navigateToFolder","useFolderNavigation","onClick","FolderIcon","e","stopPropagation","AssetsTable","assets","folders","visibleHeaders","TABLE_HEADERS","filter","h","totalRows","length","colCount","rowCount","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","colSpan"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useIsMobile } from '@strapi/admin/strapi-admin';
3
3
  import { RawTable, RawThead, RawTh, RawTd, RawTr, VisuallyHidden, Typography, RawTbody, Flex, IconButton } from '@strapi/design-system';
4
- import { More } from '@strapi/icons';
4
+ import { More, Folder } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { styled } from 'styled-components';
7
7
  import { formatBytes } from '../../../utils/files.mjs';
8
8
  import { getAssetIcon } from '../../../utils/getAssetIcon.mjs';
9
9
  import { getTranslationKey } from '../../../utils/translations.mjs';
10
10
  import { TABLE_HEADERS } from '../constants.mjs';
11
+ import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
11
12
 
12
13
  const StyledTable = styled(RawTable)`
13
14
  width: 100%;
@@ -139,13 +140,98 @@ const AssetRow = ({ asset })=>{
139
140
  ]
140
141
  });
141
142
  };
142
- const AssetsTable = ({ assets })=>{
143
+ const FolderTr = styled(StyledTr)`
144
+ cursor: pointer;
145
+
146
+ &:hover {
147
+ background: ${({ theme })=>theme.colors.primary100};
148
+ }
149
+ `;
150
+ const FolderRow = ({ folder })=>{
151
+ const isMobile = useIsMobile();
152
+ const { formatDate, formatMessage } = useIntl();
153
+ const { navigateToFolder } = useFolderNavigation();
154
+ return /*#__PURE__*/ jsxs(FolderTr, {
155
+ onClick: ()=>navigateToFolder(folder),
156
+ children: [
157
+ /*#__PURE__*/ jsx(StyledTd, {
158
+ children: /*#__PURE__*/ jsxs(Flex, {
159
+ gap: 3,
160
+ alignItems: "center",
161
+ children: [
162
+ /*#__PURE__*/ jsx(Flex, {
163
+ justifyContent: "center",
164
+ alignItems: "center",
165
+ borderRadius: "4px",
166
+ color: "neutral600",
167
+ width: "3.2rem",
168
+ height: "3.2rem",
169
+ shrink: 0,
170
+ children: /*#__PURE__*/ jsx(Folder, {
171
+ width: 20,
172
+ height: 20
173
+ })
174
+ }),
175
+ /*#__PURE__*/ jsx(Typography, {
176
+ textColor: "neutral800",
177
+ fontWeight: "semiBold",
178
+ ellipsis: true,
179
+ children: folder.name
180
+ })
181
+ ]
182
+ })
183
+ }),
184
+ !isMobile && /*#__PURE__*/ jsxs(Fragment, {
185
+ children: [
186
+ /*#__PURE__*/ jsx(StyledTd, {
187
+ children: /*#__PURE__*/ jsx(Typography, {
188
+ textColor: "neutral600",
189
+ children: folder.createdAt ? formatDate(new Date(folder.createdAt), {
190
+ dateStyle: 'long'
191
+ }) : '-'
192
+ })
193
+ }),
194
+ /*#__PURE__*/ jsx(StyledTd, {
195
+ children: /*#__PURE__*/ jsx(Typography, {
196
+ textColor: "neutral600",
197
+ children: folder.updatedAt ? formatDate(new Date(folder.updatedAt), {
198
+ dateStyle: 'long'
199
+ }) : '-'
200
+ })
201
+ }),
202
+ /*#__PURE__*/ jsx(StyledTd, {
203
+ children: /*#__PURE__*/ jsx(Typography, {
204
+ textColor: "neutral600",
205
+ children: "-"
206
+ })
207
+ })
208
+ ]
209
+ }),
210
+ /*#__PURE__*/ jsx(StyledTd, {
211
+ children: /*#__PURE__*/ jsx(Flex, {
212
+ justifyContent: "flex-end",
213
+ children: /*#__PURE__*/ jsx(IconButton, {
214
+ label: formatMessage({
215
+ id: getTranslationKey('control-card.more-actions'),
216
+ defaultMessage: 'More actions'
217
+ }),
218
+ variant: "ghost",
219
+ onClick: (e)=>e.stopPropagation(),
220
+ children: /*#__PURE__*/ jsx(More, {})
221
+ })
222
+ })
223
+ })
224
+ ]
225
+ });
226
+ };
227
+ const AssetsTable = ({ assets, folders = [] })=>{
143
228
  const isMobile = useIsMobile();
144
229
  const { formatMessage } = useIntl();
145
230
  const visibleHeaders = isMobile ? TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions') : TABLE_HEADERS;
231
+ const totalRows = folders.length + assets.length;
146
232
  return /*#__PURE__*/ jsxs(StyledTable, {
147
233
  colCount: visibleHeaders.length,
148
- rowCount: assets.length + 1,
234
+ rowCount: totalRows + 1,
149
235
  children: [
150
236
  /*#__PURE__*/ jsx(StyledThead, {
151
237
  children: /*#__PURE__*/ jsx(RawTr, {
@@ -173,7 +259,7 @@ const AssetsTable = ({ assets })=>{
173
259
  })
174
260
  }),
175
261
  /*#__PURE__*/ jsx(RawTbody, {
176
- children: assets.length === 0 ? /*#__PURE__*/ jsx(RawTr, {
262
+ children: totalRows === 0 ? /*#__PURE__*/ jsx(RawTr, {
177
263
  children: /*#__PURE__*/ jsx(StyledBodyTd, {
178
264
  colSpan: visibleHeaders.length,
179
265
  children: /*#__PURE__*/ jsx(Typography, {
@@ -184,9 +270,16 @@ const AssetsTable = ({ assets })=>{
184
270
  })
185
271
  })
186
272
  })
187
- }) : assets.map((asset)=>/*#__PURE__*/ jsx(AssetRow, {
188
- asset: asset
189
- }, asset.id))
273
+ }) : /*#__PURE__*/ jsxs(Fragment, {
274
+ children: [
275
+ folders.map((folder)=>/*#__PURE__*/ jsx(FolderRow, {
276
+ folder: folder
277
+ }, `folder-${folder.id}`)),
278
+ assets.map((asset)=>/*#__PURE__*/ jsx(AssetRow, {
279
+ asset: asset
280
+ }, asset.id))
281
+ ]
282
+ })
190
283
  })
191
284
  ]
192
285
  });