@strapi/upload 5.35.0 → 5.36.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 (130) hide show
  1. package/dist/admin/future/App.js +8 -20
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +8 -20
  4. package/dist/admin/future/App.mjs.map +1 -1
  5. package/dist/admin/future/components/UploadProgressDialog.js +494 -0
  6. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -0
  7. package/dist/admin/future/components/UploadProgressDialog.mjs +473 -0
  8. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -0
  9. package/dist/admin/future/enums.js +12 -0
  10. package/dist/admin/future/enums.js.map +1 -0
  11. package/dist/admin/future/enums.mjs +10 -0
  12. package/dist/admin/future/enums.mjs.map +1 -0
  13. package/dist/admin/future/pages/Assets/AssetsPage.js +311 -0
  14. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/AssetsPage.mjs +290 -0
  16. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +164 -0
  18. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -0
  20. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/AssetsTable.js +198 -0
  22. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -0
  23. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +196 -0
  24. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +127 -0
  26. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -0
  27. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +105 -0
  28. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -0
  29. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +107 -0
  30. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +104 -0
  32. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/constants.js +54 -0
  34. package/dist/admin/future/pages/Assets/constants.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/constants.mjs +50 -0
  36. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +77 -0
  38. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -0
  39. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +74 -0
  40. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -0
  41. package/dist/admin/future/services/api.js +419 -9
  42. package/dist/admin/future/services/api.js.map +1 -1
  43. package/dist/admin/future/services/api.mjs +417 -9
  44. package/dist/admin/future/services/api.mjs.map +1 -1
  45. package/dist/admin/future/services/assets.js +37 -0
  46. package/dist/admin/future/services/assets.js.map +1 -0
  47. package/dist/admin/future/services/assets.mjs +35 -0
  48. package/dist/admin/future/services/assets.mjs.map +1 -0
  49. package/dist/admin/future/store/hooks.js +10 -0
  50. package/dist/admin/future/store/hooks.js.map +1 -0
  51. package/dist/admin/future/store/hooks.mjs +7 -0
  52. package/dist/admin/future/store/hooks.mjs.map +1 -0
  53. package/dist/admin/future/store/uploadProgress.js +156 -0
  54. package/dist/admin/future/store/uploadProgress.js.map +1 -0
  55. package/dist/admin/future/store/uploadProgress.mjs +143 -0
  56. package/dist/admin/future/store/uploadProgress.mjs.map +1 -0
  57. package/dist/admin/future/utils/files.js +23 -0
  58. package/dist/admin/future/utils/files.js.map +1 -0
  59. package/dist/admin/future/utils/files.mjs +19 -0
  60. package/dist/admin/future/utils/files.mjs.map +1 -0
  61. package/dist/admin/future/utils/getAssetIcon.js +28 -0
  62. package/dist/admin/future/utils/getAssetIcon.js.map +1 -0
  63. package/dist/admin/future/utils/getAssetIcon.mjs +26 -0
  64. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -0
  65. package/dist/admin/index.js +11 -0
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +11 -0
  68. package/dist/admin/index.mjs.map +1 -1
  69. package/dist/admin/package.json.js +11 -9
  70. package/dist/admin/package.json.js.map +1 -1
  71. package/dist/admin/package.json.mjs +11 -9
  72. package/dist/admin/package.json.mjs.map +1 -1
  73. package/dist/admin/src/future/components/UploadProgressDialog.d.ts +1 -0
  74. package/dist/admin/src/future/enums.d.ts +6 -0
  75. package/dist/admin/src/future/pages/Assets/AssetsPage.d.ts +1 -0
  76. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +6 -0
  77. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +6 -0
  78. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +9 -0
  79. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +11 -0
  80. package/dist/admin/src/future/pages/Assets/constants.d.ts +17 -0
  81. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +17 -0
  82. package/dist/admin/src/future/services/api.d.ts +21 -3
  83. package/dist/admin/src/future/services/assets.d.ts +13 -0
  84. package/dist/admin/src/future/store/hooks.d.ts +6 -0
  85. package/dist/admin/src/future/store/uploadProgress.d.ts +46 -0
  86. package/dist/admin/src/future/utils/files.d.ts +3 -0
  87. package/dist/admin/src/future/utils/getAssetIcon.d.ts +12 -0
  88. package/dist/admin/translations/en.json.js +25 -0
  89. package/dist/admin/translations/en.json.js.map +1 -1
  90. package/dist/admin/translations/en.json.mjs +25 -0
  91. package/dist/admin/translations/en.json.mjs.map +1 -1
  92. package/dist/server/controllers/admin-upload.js +151 -2
  93. package/dist/server/controllers/admin-upload.js.map +1 -1
  94. package/dist/server/controllers/admin-upload.mjs +151 -2
  95. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  96. package/dist/server/controllers/content-api.js +8 -2
  97. package/dist/server/controllers/content-api.js.map +1 -1
  98. package/dist/server/controllers/content-api.mjs +9 -3
  99. package/dist/server/controllers/content-api.mjs.map +1 -1
  100. package/dist/server/routes/admin.js +10 -0
  101. package/dist/server/routes/admin.js.map +1 -1
  102. package/dist/server/routes/admin.mjs +10 -0
  103. package/dist/server/routes/admin.mjs.map +1 -1
  104. package/dist/server/src/controllers/admin-upload.d.ts +12 -0
  105. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  106. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  107. package/dist/server/src/controllers/index.d.ts +1 -0
  108. package/dist/server/src/controllers/index.d.ts.map +1 -1
  109. package/dist/server/src/index.d.ts +1 -0
  110. package/dist/server/src/index.d.ts.map +1 -1
  111. package/dist/server/src/routes/admin.d.ts.map +1 -1
  112. package/dist/server/src/utils/mime-validation.d.ts +5 -0
  113. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  114. package/dist/server/utils/mime-validation.js +7 -4
  115. package/dist/server/utils/mime-validation.js.map +1 -1
  116. package/dist/server/utils/mime-validation.mjs +7 -4
  117. package/dist/server/utils/mime-validation.mjs.map +1 -1
  118. package/dist/shared/contracts/files.d.ts +52 -0
  119. package/dist/shared/contracts/files.d.ts.map +1 -0
  120. package/package.json +11 -9
  121. package/dist/admin/future/pages/AIGenerationPage.js +0 -24
  122. package/dist/admin/future/pages/AIGenerationPage.js.map +0 -1
  123. package/dist/admin/future/pages/AIGenerationPage.mjs +0 -22
  124. package/dist/admin/future/pages/AIGenerationPage.mjs.map +0 -1
  125. package/dist/admin/future/pages/MediaLibraryPage.js +0 -119
  126. package/dist/admin/future/pages/MediaLibraryPage.js.map +0 -1
  127. package/dist/admin/future/pages/MediaLibraryPage.mjs +0 -98
  128. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +0 -1
  129. package/dist/admin/src/future/pages/AIGenerationPage.d.ts +0 -1
  130. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsPage.mjs","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport { Layouts, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Loader,\n MenuItem,\n SimpleMenu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ChevronDown, Files, GridFour as GridIcon, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useUploadFilesStreamMutation } from '../../services/api';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { useInfiniteAssets } from './hooks/useInfiniteAssets';\n\nconst INTERSECTION_OPTIONS: IntersectionObserverInit = { threshold: 0.1 };\n\nimport type { UploadFileInfo } from '../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsView\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsViewProps {\n view: number;\n}\n\nconst AssetsView = ({ view }: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const { assets, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error } =\n useInfiniteAssets();\n\n const isGridView = view === viewOptions.GRID;\n\n const loadMoreRef = useElementOnScreen<HTMLDivElement>(\n useCallback(\n (isVisible) => {\n if (isVisible && hasNextPage && !isFetchingMore) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingMore, fetchNextPage]\n ),\n INTERSECTION_OPTIONS\n );\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error) {\n return (\n <Box padding={8}>\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.assets.error'),\n defaultMessage: 'An error occurred while fetching assets.',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <>\n {isGridView ? <AssetsGrid assets={assets} /> : <AssetsTable assets={assets} />}\n <div ref={loadMoreRef} style={{ height: 1 }} />\n {isFetchingMore && (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('list.assets.loading-more'),\n defaultMessage: 'Loading more assets...',\n })}\n </Loader>\n </Flex>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledToggleGroup = styled(ToggleGroup.Root)`\n display: flex;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst StyledToggleItem = styled(ToggleGroup.Item)`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[4]}`};\n border: none;\n background: ${({ theme }) => theme.colors.neutral0};\n color: ${({ theme }) => theme.colors.neutral800};\n cursor: pointer;\n font-size: ${({ theme }) => theme.fontSizes[1]};\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &[data-state='on'] {\n background: ${({ theme }) => theme.colors.neutral150};\n }\n\n svg {\n width: 1.6rem;\n height: 1.6rem;\n }\n`;\n\nconst HeaderWrapper = styled.div`\n [data-strapi-header] {\n background: ${({ theme }) => theme.colors.neutral0};\n\n h1 {\n font-size: 1.8rem;\n }\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const [uploadFilesStream] = useUploadFilesStreamMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFilesStream({ formData, totalFiles: files.length }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n await uploadFilesToFolder(Array.from(files), null);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, null);\n };\n\n return (\n <UploadDropZoneProvider onDrop={handleDrop}>\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root minHeight=\"100vh\" background=\"neutral0\">\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <HeaderWrapper>\n <Layouts.Header\n title=\"TODO: Folder name\"\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({ id: getTranslationKey('new'), defaultMessage: 'New' })}\n >\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n subtitle={\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4} width=\"100%\">\n <Flex gap={4} alignItems=\"center\">\n TODO: Filters and search\n </Flex>\n\n <Flex gap={4} alignItems=\"center\">\n <Box>TODO: Sort</Box>\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value && setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE)\n }\n aria-label={formatMessage({\n id: getTranslationKey('view.switch.label'),\n defaultMessage: 'View options',\n })}\n >\n <StyledToggleItem\n value=\"table\"\n aria-label={formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n >\n <List />\n {formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n </StyledToggleItem>\n <StyledToggleItem\n value=\"grid\"\n aria-label={formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n >\n <GridIcon />\n {formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n </StyledToggleItem>\n </StyledToggleGroup>\n </Flex>\n </Flex>\n }\n />\n </HeaderWrapper>\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} />\n <AssetsView view={view} />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n </UploadDropZoneProvider>\n );\n};\n"],"names":["INTERSECTION_OPTIONS","threshold","AssetsView","view","formatMessage","useIntl","assets","isLoading","isFetchingMore","hasNextPage","fetchNextPage","error","useInfiniteAssets","isGridView","viewOptions","GRID","loadMoreRef","useElementOnScreen","useCallback","isVisible","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","_jsxs","_Fragment","AssetsGrid","AssetsTable","div","ref","style","height","StyledToggleGroup","styled","ToggleGroup","Root","theme","colors","neutral200","borderRadius","StyledToggleItem","Item","spaces","neutral0","neutral800","fontSizes","fontWeights","semiBold","neutral100","neutral150","HeaderWrapper","AssetsPage","setView","usePersistentState","localStorageKeys","fileInputRef","useRef","uploadDropZoneRef","uploadFilesStream","useUploadFilesStreamMutation","uploadFilesToFolder","files","folderId","length","formData","FormData","fileInfoArray","forEach","file","append","push","name","caption","alternativeText","folder","JSON","stringify","totalFiles","unwrap","handleFileSelect","current","click","handleFileChange","e","target","Array","from","value","handleDrop","UploadDropZoneProvider","onDrop","Layouts","minHeight","background","VisuallyHidden","input","type","onChange","multiple","Header","title","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Files","subtitle","alignItems","gap","width","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay","DropFilesMessage"],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var styledComponents = require('styled-components');
8
+ var enums = require('../../../enums.js');
9
+ var files = require('../../../utils/files.js');
10
+ var getAssetIcon = require('../../../utils/getAssetIcon.js');
11
+ var translations = require('../../../utils/translations.js');
12
+
13
+ /* -------------------------------------------------------------------------------------------------
14
+ * AssetsGrid
15
+ * -----------------------------------------------------------------------------------------------*/ const StyledCard = styledComponents.styled(designSystem.Card)`
16
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
17
+ border-radius: 8px;
18
+ overflow: hidden;
19
+ `;
20
+ /* -------------------------------------------------------------------------------------------------
21
+ * AssetPreview
22
+ * -----------------------------------------------------------------------------------------------*/ const PreviewContainer = styledComponents.styled(designSystem.Box)`
23
+ position: relative;
24
+ width: 100%;
25
+ padding-bottom: 62.5%;
26
+ height: 0;
27
+ overflow: hidden;
28
+ background: repeating-conic-gradient(
29
+ ${({ theme })=>theme.colors.neutral100} 0% 25%,
30
+ transparent 0% 50%
31
+ )
32
+ 50% / 20px 20px;
33
+ `;
34
+ const StyledImage = styledComponents.styled.img`
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ width: 100%;
39
+ height: 100%;
40
+ object-fit: cover;
41
+ `;
42
+ const IconPreview = styledComponents.styled(designSystem.Flex)`
43
+ position: absolute;
44
+ top: 0;
45
+ left: 0;
46
+ width: 100%;
47
+ height: 100%;
48
+ color: ${({ theme })=>theme.colors.neutral500};
49
+ background: ${({ theme })=>theme.colors.neutral100};
50
+ `;
51
+ const AssetPreview = ({ asset })=>{
52
+ const { alternativeText, ext, formats, mime, url } = asset;
53
+ if (mime?.includes(enums.AssetType.Image)) {
54
+ const mediaURL = files.prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? files.prefixFileUrlWithBackendUrl(url);
55
+ if (mediaURL) {
56
+ return /*#__PURE__*/ jsxRuntime.jsx(PreviewContainer, {
57
+ children: /*#__PURE__*/ jsxRuntime.jsx(StyledImage, {
58
+ src: mediaURL,
59
+ alt: alternativeText || ''
60
+ })
61
+ });
62
+ }
63
+ }
64
+ const DocIcon = getAssetIcon.getAssetIcon(mime, ext);
65
+ return /*#__PURE__*/ jsxRuntime.jsx(PreviewContainer, {
66
+ children: /*#__PURE__*/ jsxRuntime.jsx(IconPreview, {
67
+ justifyContent: "center",
68
+ alignItems: "center",
69
+ children: /*#__PURE__*/ jsxRuntime.jsx(DocIcon, {
70
+ width: 48,
71
+ height: 48
72
+ })
73
+ })
74
+ });
75
+ };
76
+ /* -------------------------------------------------------------------------------------------------
77
+ * AssetCard
78
+ * -----------------------------------------------------------------------------------------------*/ const StyledCardHeader = styledComponents.styled(designSystem.CardHeader)`
79
+ border-bottom: none;
80
+ `;
81
+ const CardFooter = styledComponents.styled(designSystem.Flex)`
82
+ min-width: 0;
83
+ `;
84
+ const FileTypeIcon = styledComponents.styled(designSystem.Flex)`
85
+ color: ${({ theme })=>theme.colors.neutral600};
86
+ flex-shrink: 0;
87
+ `;
88
+ const FileName = styledComponents.styled(designSystem.Typography)`
89
+ flex: 1;
90
+ min-width: 0;
91
+ `;
92
+ const AssetCard = ({ asset })=>{
93
+ const { formatMessage } = reactIntl.useIntl();
94
+ const TypeIcon = getAssetIcon.getAssetIcon(asset.mime, asset.ext);
95
+ return /*#__PURE__*/ jsxRuntime.jsxs(StyledCard, {
96
+ children: [
97
+ /*#__PURE__*/ jsxRuntime.jsx(StyledCardHeader, {
98
+ children: /*#__PURE__*/ jsxRuntime.jsx(AssetPreview, {
99
+ asset: asset
100
+ })
101
+ }),
102
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardBody, {
103
+ children: /*#__PURE__*/ jsxRuntime.jsxs(CardFooter, {
104
+ alignItems: "center",
105
+ gap: 2,
106
+ paddingTop: 2,
107
+ children: [
108
+ /*#__PURE__*/ jsxRuntime.jsx(FileTypeIcon, {
109
+ children: /*#__PURE__*/ jsxRuntime.jsx(TypeIcon, {
110
+ width: 16,
111
+ height: 16
112
+ })
113
+ }),
114
+ /*#__PURE__*/ jsxRuntime.jsx(FileName, {
115
+ textColor: "primary800",
116
+ ellipsis: true,
117
+ children: asset.name
118
+ }),
119
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
120
+ label: formatMessage({
121
+ id: translations.getTranslationKey('control-card.more-actions'),
122
+ defaultMessage: 'More actions'
123
+ }),
124
+ variant: "ghost",
125
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
126
+ })
127
+ ]
128
+ })
129
+ })
130
+ ]
131
+ });
132
+ };
133
+ const AssetsGrid = ({ assets })=>{
134
+ const { formatMessage } = reactIntl.useIntl();
135
+ if (assets.length === 0) {
136
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
137
+ padding: 8,
138
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
139
+ textColor: "neutral600",
140
+ children: formatMessage({
141
+ id: 'app.components.EmptyStateLayout.content-document',
142
+ defaultMessage: 'No content found'
143
+ })
144
+ })
145
+ });
146
+ }
147
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
148
+ gap: 4,
149
+ children: assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
150
+ col: 3,
151
+ m: 4,
152
+ s: 6,
153
+ xs: 12,
154
+ direction: "column",
155
+ alignItems: "stretch",
156
+ children: /*#__PURE__*/ jsxRuntime.jsx(AssetCard, {
157
+ asset: asset
158
+ })
159
+ }, asset.id))
160
+ });
161
+ };
162
+
163
+ exports.AssetsGrid = AssetsGrid;
164
+ //# sourceMappingURL=AssetsGrid.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,162 @@
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';
4
+ import { useIntl } from 'react-intl';
5
+ import { styled } from 'styled-components';
6
+ import { AssetType } from '../../../enums.mjs';
7
+ import { prefixFileUrlWithBackendUrl } from '../../../utils/files.mjs';
8
+ import { getAssetIcon } from '../../../utils/getAssetIcon.mjs';
9
+ import { getTranslationKey } from '../../../utils/translations.mjs';
10
+
11
+ /* -------------------------------------------------------------------------------------------------
12
+ * AssetsGrid
13
+ * -----------------------------------------------------------------------------------------------*/ const StyledCard = styled(Card)`
14
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
15
+ border-radius: 8px;
16
+ overflow: hidden;
17
+ `;
18
+ /* -------------------------------------------------------------------------------------------------
19
+ * AssetPreview
20
+ * -----------------------------------------------------------------------------------------------*/ const PreviewContainer = styled(Box)`
21
+ position: relative;
22
+ width: 100%;
23
+ padding-bottom: 62.5%;
24
+ height: 0;
25
+ overflow: hidden;
26
+ background: repeating-conic-gradient(
27
+ ${({ theme })=>theme.colors.neutral100} 0% 25%,
28
+ transparent 0% 50%
29
+ )
30
+ 50% / 20px 20px;
31
+ `;
32
+ const StyledImage = styled.img`
33
+ position: absolute;
34
+ top: 0;
35
+ left: 0;
36
+ width: 100%;
37
+ height: 100%;
38
+ object-fit: cover;
39
+ `;
40
+ const IconPreview = styled(Flex)`
41
+ position: absolute;
42
+ top: 0;
43
+ left: 0;
44
+ width: 100%;
45
+ height: 100%;
46
+ color: ${({ theme })=>theme.colors.neutral500};
47
+ background: ${({ theme })=>theme.colors.neutral100};
48
+ `;
49
+ const AssetPreview = ({ asset })=>{
50
+ const { alternativeText, ext, formats, mime, url } = asset;
51
+ if (mime?.includes(AssetType.Image)) {
52
+ const mediaURL = prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);
53
+ if (mediaURL) {
54
+ return /*#__PURE__*/ jsx(PreviewContainer, {
55
+ children: /*#__PURE__*/ jsx(StyledImage, {
56
+ src: mediaURL,
57
+ alt: alternativeText || ''
58
+ })
59
+ });
60
+ }
61
+ }
62
+ const DocIcon = getAssetIcon(mime, ext);
63
+ return /*#__PURE__*/ jsx(PreviewContainer, {
64
+ children: /*#__PURE__*/ jsx(IconPreview, {
65
+ justifyContent: "center",
66
+ alignItems: "center",
67
+ children: /*#__PURE__*/ jsx(DocIcon, {
68
+ width: 48,
69
+ height: 48
70
+ })
71
+ })
72
+ });
73
+ };
74
+ /* -------------------------------------------------------------------------------------------------
75
+ * AssetCard
76
+ * -----------------------------------------------------------------------------------------------*/ const StyledCardHeader = styled(CardHeader)`
77
+ border-bottom: none;
78
+ `;
79
+ const CardFooter = styled(Flex)`
80
+ min-width: 0;
81
+ `;
82
+ const FileTypeIcon = styled(Flex)`
83
+ color: ${({ theme })=>theme.colors.neutral600};
84
+ flex-shrink: 0;
85
+ `;
86
+ const FileName = styled(Typography)`
87
+ flex: 1;
88
+ min-width: 0;
89
+ `;
90
+ const AssetCard = ({ asset })=>{
91
+ const { formatMessage } = useIntl();
92
+ const TypeIcon = getAssetIcon(asset.mime, asset.ext);
93
+ return /*#__PURE__*/ jsxs(StyledCard, {
94
+ children: [
95
+ /*#__PURE__*/ jsx(StyledCardHeader, {
96
+ children: /*#__PURE__*/ jsx(AssetPreview, {
97
+ asset: asset
98
+ })
99
+ }),
100
+ /*#__PURE__*/ jsx(CardBody, {
101
+ children: /*#__PURE__*/ jsxs(CardFooter, {
102
+ alignItems: "center",
103
+ gap: 2,
104
+ paddingTop: 2,
105
+ children: [
106
+ /*#__PURE__*/ jsx(FileTypeIcon, {
107
+ children: /*#__PURE__*/ jsx(TypeIcon, {
108
+ width: 16,
109
+ height: 16
110
+ })
111
+ }),
112
+ /*#__PURE__*/ jsx(FileName, {
113
+ textColor: "primary800",
114
+ ellipsis: true,
115
+ children: asset.name
116
+ }),
117
+ /*#__PURE__*/ jsx(IconButton, {
118
+ label: formatMessage({
119
+ id: getTranslationKey('control-card.more-actions'),
120
+ defaultMessage: 'More actions'
121
+ }),
122
+ variant: "ghost",
123
+ children: /*#__PURE__*/ jsx(More, {})
124
+ })
125
+ ]
126
+ })
127
+ })
128
+ ]
129
+ });
130
+ };
131
+ const AssetsGrid = ({ assets })=>{
132
+ const { formatMessage } = useIntl();
133
+ if (assets.length === 0) {
134
+ return /*#__PURE__*/ jsx(Box, {
135
+ padding: 8,
136
+ children: /*#__PURE__*/ jsx(Typography, {
137
+ textColor: "neutral600",
138
+ children: formatMessage({
139
+ id: 'app.components.EmptyStateLayout.content-document',
140
+ defaultMessage: 'No content found'
141
+ })
142
+ })
143
+ });
144
+ }
145
+ return /*#__PURE__*/ jsx(Grid.Root, {
146
+ 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
156
+ })
157
+ }, asset.id))
158
+ });
159
+ };
160
+
161
+ export { AssetsGrid };
162
+ //# sourceMappingURL=AssetsGrid.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,198 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var designSystem = require('@strapi/design-system');
6
+ var icons = require('@strapi/icons');
7
+ var reactIntl = require('react-intl');
8
+ var styledComponents = require('styled-components');
9
+ var files = require('../../../utils/files.js');
10
+ var getAssetIcon = require('../../../utils/getAssetIcon.js');
11
+ var translations = require('../../../utils/translations.js');
12
+ var constants = require('../constants.js');
13
+
14
+ const StyledTable = styledComponents.styled(designSystem.RawTable)`
15
+ width: 100%;
16
+ border-collapse: separate;
17
+ border-spacing: 0;
18
+ border: 1px solid ${({ theme })=>theme.colors.neutral150};
19
+ border-radius: 4px;
20
+ overflow: hidden;
21
+ `;
22
+ const StyledThead = styledComponents.styled(designSystem.RawThead)`
23
+ background: ${({ theme })=>theme.colors.neutral100};
24
+
25
+ tr {
26
+ border-bottom: 1px solid ${({ theme })=>theme.colors.neutral150};
27
+ }
28
+ `;
29
+ const StyledTh = styledComponents.styled(designSystem.RawTh)`
30
+ height: 40px;
31
+ padding: 0 ${({ theme })=>theme.spaces[4]};
32
+ text-align: left;
33
+ `;
34
+ const StyledTd = styledComponents.styled(designSystem.RawTd)`
35
+ padding: 0 ${({ theme })=>theme.spaces[4]};
36
+ border-bottom: 1px solid ${({ theme })=>theme.colors.neutral150};
37
+ `;
38
+ const StyledTr = styledComponents.styled(designSystem.RawTr)`
39
+ height: 48px;
40
+ background: ${({ theme })=>theme.colors.neutral0};
41
+
42
+ &:last-child {
43
+ ${StyledTd} {
44
+ border-bottom: 0;
45
+ }
46
+ }
47
+ `;
48
+ const StyledBodyTd = styledComponents.styled(designSystem.RawTd)`
49
+ padding: ${({ theme })=>theme.spaces[4]};
50
+ border-bottom: 1px solid ${({ theme })=>theme.colors.neutral150};
51
+ `;
52
+ const AssetPreviewCell = ({ asset })=>{
53
+ const { ext, mime } = asset;
54
+ const DocIcon = getAssetIcon.getAssetIcon(mime, ext);
55
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
56
+ justifyContent: "center",
57
+ alignItems: "center",
58
+ borderRadius: "4px",
59
+ color: "neutral500",
60
+ width: "3.2rem",
61
+ height: "3.2rem",
62
+ shrink: 0,
63
+ children: /*#__PURE__*/ jsxRuntime.jsx(DocIcon, {
64
+ width: 16,
65
+ height: 16
66
+ })
67
+ });
68
+ };
69
+ const AssetRow = ({ asset })=>{
70
+ const isMobile = strapiAdmin.useIsMobile();
71
+ const { formatDate, formatMessage } = reactIntl.useIntl();
72
+ return /*#__PURE__*/ jsxRuntime.jsxs(StyledTr, {
73
+ children: [
74
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
75
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
76
+ gap: 3,
77
+ alignItems: "center",
78
+ children: [
79
+ /*#__PURE__*/ jsxRuntime.jsx(AssetPreviewCell, {
80
+ asset: asset
81
+ }),
82
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
83
+ direction: "column",
84
+ alignItems: "flex-start",
85
+ children: [
86
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
87
+ textColor: "neutral800",
88
+ fontWeight: "semiBold",
89
+ ellipsis: true,
90
+ children: asset.name
91
+ }),
92
+ isMobile && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
93
+ textColor: "neutral600",
94
+ variant: "pi",
95
+ children: asset.size ? files.formatBytes(asset.size, 1) : '-'
96
+ })
97
+ ]
98
+ })
99
+ ]
100
+ })
101
+ }),
102
+ !isMobile && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
103
+ children: [
104
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
105
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
106
+ textColor: "neutral600",
107
+ children: asset.createdAt ? formatDate(new Date(asset.createdAt), {
108
+ dateStyle: 'long'
109
+ }) : '-'
110
+ })
111
+ }),
112
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
113
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
114
+ textColor: "neutral600",
115
+ children: asset.updatedAt ? formatDate(new Date(asset.updatedAt), {
116
+ dateStyle: 'long'
117
+ }) : '-'
118
+ })
119
+ }),
120
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
121
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
122
+ textColor: "neutral600",
123
+ children: asset.size ? files.formatBytes(asset.size, 1) : '-'
124
+ })
125
+ })
126
+ ]
127
+ }),
128
+ /*#__PURE__*/ jsxRuntime.jsx(StyledTd, {
129
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
130
+ justifyContent: "flex-end",
131
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
132
+ label: formatMessage({
133
+ id: translations.getTranslationKey('control-card.more-actions'),
134
+ defaultMessage: 'More actions'
135
+ }),
136
+ variant: "ghost",
137
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.More, {})
138
+ })
139
+ })
140
+ })
141
+ ]
142
+ });
143
+ };
144
+ const AssetsTable = ({ assets })=>{
145
+ const isMobile = strapiAdmin.useIsMobile();
146
+ const { formatMessage } = reactIntl.useIntl();
147
+ const visibleHeaders = isMobile ? constants.TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions') : constants.TABLE_HEADERS;
148
+ return /*#__PURE__*/ jsxRuntime.jsxs(StyledTable, {
149
+ colCount: visibleHeaders.length,
150
+ rowCount: assets.length + 1,
151
+ children: [
152
+ /*#__PURE__*/ jsxRuntime.jsx(StyledThead, {
153
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTr, {
154
+ children: visibleHeaders.map((header)=>{
155
+ const tableHeaderLabel = formatMessage(header.label);
156
+ const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;
157
+ if (isVisuallyHidden) {
158
+ return /*#__PURE__*/ jsxRuntime.jsx(StyledTh, {
159
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
160
+ children: formatMessage({
161
+ id: translations.getTranslationKey('table.header.actions'),
162
+ defaultMessage: 'actions'
163
+ })
164
+ })
165
+ }, header.name);
166
+ }
167
+ return /*#__PURE__*/ jsxRuntime.jsx(StyledTh, {
168
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
169
+ textColor: "neutral600",
170
+ variant: "sigma",
171
+ children: tableHeaderLabel
172
+ })
173
+ }, header.name);
174
+ })
175
+ })
176
+ }),
177
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTbody, {
178
+ children: assets.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.RawTr, {
179
+ children: /*#__PURE__*/ jsxRuntime.jsx(StyledBodyTd, {
180
+ colSpan: visibleHeaders.length,
181
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
182
+ textColor: "neutral600",
183
+ children: formatMessage({
184
+ id: 'app.components.EmptyStateLayout.content-document',
185
+ defaultMessage: 'No content found'
186
+ })
187
+ })
188
+ })
189
+ }) : assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow, {
190
+ asset: asset
191
+ }, asset.id))
192
+ })
193
+ ]
194
+ });
195
+ };
196
+
197
+ exports.AssetsTable = AssetsTable;
198
+ //# sourceMappingURL=AssetsTable.js.map
@@ -0,0 +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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"}