@strapi/upload 5.35.0 → 5.36.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 (68) hide show
  1. package/dist/admin/future/App.js +4 -9
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +4 -9
  4. package/dist/admin/future/App.mjs.map +1 -1
  5. package/dist/admin/future/enums.js +12 -0
  6. package/dist/admin/future/enums.js.map +1 -0
  7. package/dist/admin/future/enums.mjs +10 -0
  8. package/dist/admin/future/enums.mjs.map +1 -0
  9. package/dist/admin/future/pages/Assets/AssetsPage.js +342 -0
  10. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -0
  11. package/dist/admin/future/pages/Assets/AssetsPage.mjs +321 -0
  12. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -0
  13. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +164 -0
  14. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -0
  16. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/AssetsTable.js +198 -0
  18. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +196 -0
  20. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js +33 -0
  22. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js.map +1 -0
  23. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs +31 -0
  24. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +107 -0
  26. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -0
  27. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +104 -0
  28. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -0
  29. package/dist/admin/future/pages/Assets/constants.js +54 -0
  30. package/dist/admin/future/pages/Assets/constants.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/constants.mjs +50 -0
  32. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -0
  33. package/dist/admin/future/services/assets.js +37 -0
  34. package/dist/admin/future/services/assets.js.map +1 -0
  35. package/dist/admin/future/services/assets.mjs +35 -0
  36. package/dist/admin/future/services/assets.mjs.map +1 -0
  37. package/dist/admin/future/utils/files.js +23 -0
  38. package/dist/admin/future/utils/files.js.map +1 -0
  39. package/dist/admin/future/utils/files.mjs +19 -0
  40. package/dist/admin/future/utils/files.mjs.map +1 -0
  41. package/dist/admin/future/utils/getAssetIcon.js +28 -0
  42. package/dist/admin/future/utils/getAssetIcon.js.map +1 -0
  43. package/dist/admin/future/utils/getAssetIcon.mjs +26 -0
  44. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -0
  45. package/dist/admin/package.json.js +7 -6
  46. package/dist/admin/package.json.js.map +1 -1
  47. package/dist/admin/package.json.mjs +7 -6
  48. package/dist/admin/package.json.mjs.map +1 -1
  49. package/dist/admin/src/future/enums.d.ts +6 -0
  50. package/dist/admin/src/future/pages/Assets/AssetsPage.d.ts +1 -0
  51. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +6 -0
  52. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +6 -0
  53. package/dist/admin/src/future/pages/Assets/components/DropZone/DropZoneWithOverlay.d.ts +4 -0
  54. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +11 -0
  55. package/dist/admin/src/future/pages/Assets/constants.d.ts +17 -0
  56. package/dist/admin/src/future/services/assets.d.ts +13 -0
  57. package/dist/admin/src/future/utils/files.d.ts +3 -0
  58. package/dist/admin/src/future/utils/getAssetIcon.d.ts +12 -0
  59. package/dist/admin/translations/en.json.js +3 -0
  60. package/dist/admin/translations/en.json.js.map +1 -1
  61. package/dist/admin/translations/en.json.mjs +3 -0
  62. package/dist/admin/translations/en.json.mjs.map +1 -1
  63. package/package.json +7 -6
  64. package/dist/admin/future/pages/MediaLibraryPage.js +0 -119
  65. package/dist/admin/future/pages/MediaLibraryPage.js.map +0 -1
  66. package/dist/admin/future/pages/MediaLibraryPage.mjs +0 -98
  67. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +0 -1
  68. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +0 -1
@@ -5,19 +5,14 @@ require('react');
5
5
  var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var reactIntl = require('react-intl');
7
7
  var reactRouterDom = require('react-router-dom');
8
- require('byte-size');
9
- require('date-fns');
10
- var getTrad = require('../utils/getTrad.js');
11
- require('qs');
12
- require('../utils/typeFromMime.js');
13
- require('../utils/urlYupSchema.js');
14
8
  var AIGenerationPage = require('./pages/AIGenerationPage.js');
15
- var MediaLibraryPage = require('./pages/MediaLibraryPage.js');
9
+ var AssetsPage = require('./pages/Assets/AssetsPage.js');
10
+ var translations = require('./utils/translations.js');
16
11
 
17
12
  const UnstableMediaLibrary = ()=>{
18
13
  const { formatMessage } = reactIntl.useIntl();
19
14
  const title = formatMessage({
20
- id: getTrad.getTrad('plugin.name'),
15
+ id: translations.getTranslationKey('plugin.name'),
21
16
  defaultMessage: 'Media Library'
22
17
  });
23
18
  return /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Page.Main, {
@@ -29,7 +24,7 @@ const UnstableMediaLibrary = ()=>{
29
24
  children: [
30
25
  /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
31
26
  index: true,
32
- element: /*#__PURE__*/ jsxRuntime.jsx(MediaLibraryPage.MediaLibraryPage, {})
27
+ element: /*#__PURE__*/ jsxRuntime.jsx(AssetsPage.AssetsPage, {})
33
28
  }),
34
29
  /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
35
30
  path: "ai-generation",
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { getTrad } from '../utils';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { MediaLibraryPage } from './pages/MediaLibraryPage';\n\nexport const UnstableMediaLibrary = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<MediaLibraryPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibrary","formatMessage","useIntl","title","id","getTrad","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","MediaLibraryPage","path","AIGenerationPage"],"mappings":";;;;;;;;;;;;;;;;MAWaA,oBAAuB,GAAA,IAAA;IAClC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAAEG,QAAAA,EAAAA,EAAIC,eAAQ,CAAA,aAAA,CAAA;QAAgBC,cAAgB,EAAA;AAAgB,KAAA,CAAA;IAE1F,qBACEC,eAAA,CAACC,iBAAKC,IAAI,EAAA;;AACR,0BAAAC,cAAA,CAACF,iBAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,eAACK,CAAAA,qBAAAA,EAAAA;;kCACCF,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,cAACM,CAAAA,iCAAAA,EAAAA,EAAAA;;kCACvBN,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,cAACQ,CAAAA,iCAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
1
+ {"version":3,"file":"App.js","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { AssetsPage } from './pages/Assets/AssetsPage';\nimport { getTranslationKey } from './utils/translations';\n\nexport const UnstableMediaLibrary = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<AssetsPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibrary","formatMessage","useIntl","title","id","getTranslationKey","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","AssetsPage","path","AIGenerationPage"],"mappings":";;;;;;;;;;;MAUaA,oBAAuB,GAAA,IAAA;IAClC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAC1BG,QAAAA,EAAAA,EAAIC,8BAAkB,CAAA,aAAA,CAAA;QACtBC,cAAgB,EAAA;AAClB,KAAA,CAAA;IAEA,qBACEC,eAAA,CAACC,iBAAKC,IAAI,EAAA;;AACR,0BAAAC,cAAA,CAACF,iBAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,eAACK,CAAAA,qBAAAA,EAAAA;;kCACCF,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,cAACM,CAAAA,qBAAAA,EAAAA,EAAAA;;kCACvBN,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,cAACQ,CAAAA,iCAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
@@ -3,19 +3,14 @@ import 'react';
3
3
  import { Page } from '@strapi/admin/strapi-admin';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { Routes, Route } from 'react-router-dom';
6
- import 'byte-size';
7
- import 'date-fns';
8
- import { getTrad } from '../utils/getTrad.mjs';
9
- import 'qs';
10
- import '../utils/typeFromMime.mjs';
11
- import '../utils/urlYupSchema.mjs';
12
6
  import { AIGenerationPage } from './pages/AIGenerationPage.mjs';
13
- import { MediaLibraryPage } from './pages/MediaLibraryPage.mjs';
7
+ import { AssetsPage } from './pages/Assets/AssetsPage.mjs';
8
+ import { getTranslationKey } from './utils/translations.mjs';
14
9
 
15
10
  const UnstableMediaLibrary = ()=>{
16
11
  const { formatMessage } = useIntl();
17
12
  const title = formatMessage({
18
- id: getTrad('plugin.name'),
13
+ id: getTranslationKey('plugin.name'),
19
14
  defaultMessage: 'Media Library'
20
15
  });
21
16
  return /*#__PURE__*/ jsxs(Page.Main, {
@@ -27,7 +22,7 @@ const UnstableMediaLibrary = ()=>{
27
22
  children: [
28
23
  /*#__PURE__*/ jsx(Route, {
29
24
  index: true,
30
- element: /*#__PURE__*/ jsx(MediaLibraryPage, {})
25
+ element: /*#__PURE__*/ jsx(AssetsPage, {})
31
26
  }),
32
27
  /*#__PURE__*/ jsx(Route, {
33
28
  path: "ai-generation",
@@ -1 +1 @@
1
- {"version":3,"file":"App.mjs","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { getTrad } from '../utils';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { MediaLibraryPage } from './pages/MediaLibraryPage';\n\nexport const UnstableMediaLibrary = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<MediaLibraryPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibrary","formatMessage","useIntl","title","id","getTrad","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","MediaLibraryPage","path","AIGenerationPage"],"mappings":";;;;;;;;;;;;;;MAWaA,oBAAuB,GAAA,IAAA;IAClC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAAEG,QAAAA,EAAAA,EAAIC,OAAQ,CAAA,aAAA,CAAA;QAAgBC,cAAgB,EAAA;AAAgB,KAAA,CAAA;IAE1F,qBACEC,IAAA,CAACC,KAAKC,IAAI,EAAA;;AACR,0BAAAC,GAAA,CAACF,KAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,IAACK,CAAAA,MAAAA,EAAAA;;kCACCF,GAACG,CAAAA,KAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,GAACM,CAAAA,gBAAAA,EAAAA,EAAAA;;kCACvBN,GAACG,CAAAA,KAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,GAACQ,CAAAA,gBAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
1
+ {"version":3,"file":"App.mjs","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { AssetsPage } from './pages/Assets/AssetsPage';\nimport { getTranslationKey } from './utils/translations';\n\nexport const UnstableMediaLibrary = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<AssetsPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibrary","formatMessage","useIntl","title","id","getTranslationKey","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","AssetsPage","path","AIGenerationPage"],"mappings":";;;;;;;;;MAUaA,oBAAuB,GAAA,IAAA;IAClC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAC1BG,QAAAA,EAAAA,EAAIC,iBAAkB,CAAA,aAAA,CAAA;QACtBC,cAAgB,EAAA;AAClB,KAAA,CAAA;IAEA,qBACEC,IAAA,CAACC,KAAKC,IAAI,EAAA;;AACR,0BAAAC,GAAA,CAACF,KAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,IAACK,CAAAA,MAAAA,EAAAA;;kCACCF,GAACG,CAAAA,KAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,GAACM,CAAAA,UAAAA,EAAAA,EAAAA;;kCACvBN,GAACG,CAAAA,KAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,GAACQ,CAAAA,gBAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var AssetType = /*#__PURE__*/ function(AssetType) {
4
+ AssetType["Video"] = "video";
5
+ AssetType["Image"] = "image";
6
+ AssetType["Document"] = "doc";
7
+ AssetType["Audio"] = "audio";
8
+ return AssetType;
9
+ }({});
10
+
11
+ exports.AssetType = AssetType;
12
+ //# sourceMappingURL=enums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.js","sources":["../../../admin/src/future/enums.ts"],"sourcesContent":["export enum AssetType {\n Video = 'video',\n Image = 'image',\n Document = 'doc',\n Audio = 'audio',\n}\n"],"names":["AssetType"],"mappings":";;AAAO,IAAA,SAAKA,iBAAAA,SAAAA,SAAAA,EAAAA;;;;;AAAAA,IAAAA,OAAAA,SAAAA;AAKX,CAAA,CAAA,EAAA;;;;"}
@@ -0,0 +1,10 @@
1
+ var AssetType = /*#__PURE__*/ function(AssetType) {
2
+ AssetType["Video"] = "video";
3
+ AssetType["Image"] = "image";
4
+ AssetType["Document"] = "doc";
5
+ AssetType["Audio"] = "audio";
6
+ return AssetType;
7
+ }({});
8
+
9
+ export { AssetType };
10
+ //# sourceMappingURL=enums.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.mjs","sources":["../../../admin/src/future/enums.ts"],"sourcesContent":["export enum AssetType {\n Video = 'video',\n Image = 'image',\n Document = 'doc',\n Audio = 'audio',\n}\n"],"names":["AssetType"],"mappings":"AAAO,IAAA,SAAKA,iBAAAA,SAAAA,SAAAA,EAAAA;;;;;AAAAA,IAAAA,OAAAA,SAAAA;AAKX,CAAA,CAAA,EAAA;;;;"}
@@ -0,0 +1,342 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var ToggleGroup = require('@radix-ui/react-toggle-group');
6
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
7
+ var designSystem = require('@strapi/design-system');
8
+ var icons = require('@strapi/icons');
9
+ var reactIntl = require('react-intl');
10
+ var styledComponents = require('styled-components');
11
+ var usePersistentState = require('../../../hooks/usePersistentState.js');
12
+ var api = require('../../services/api.js');
13
+ var assets = require('../../services/assets.js');
14
+ var translations = require('../../utils/translations.js');
15
+ var AssetsGrid = require('./components/AssetsGrid.js');
16
+ var AssetsTable = require('./components/AssetsTable.js');
17
+ var DropZoneWithOverlay = require('./components/DropZone/DropZoneWithOverlay.js');
18
+ var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext.js');
19
+ var constants = require('./constants.js');
20
+
21
+ function _interopNamespaceDefault(e) {
22
+ var n = Object.create(null);
23
+ if (e) {
24
+ Object.keys(e).forEach(function (k) {
25
+ if (k !== 'default') {
26
+ var d = Object.getOwnPropertyDescriptor(e, k);
27
+ Object.defineProperty(n, k, d.get ? d : {
28
+ enumerable: true,
29
+ get: function () { return e[k]; }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ n.default = e;
35
+ return Object.freeze(n);
36
+ }
37
+
38
+ var ToggleGroup__namespace = /*#__PURE__*/_interopNamespaceDefault(ToggleGroup);
39
+
40
+ const AssetsView = ({ view })=>{
41
+ const { formatMessage } = reactIntl.useIntl();
42
+ const { data, isLoading, error } = assets.useGetAssetsQuery({
43
+ folder: null
44
+ });
45
+ const isGridView = view === constants.viewOptions.GRID;
46
+ const assets$1 = data?.results ?? [];
47
+ if (isLoading) {
48
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
49
+ justifyContent: "center",
50
+ padding: 8,
51
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
52
+ children: formatMessage({
53
+ id: 'app.loading',
54
+ defaultMessage: 'Loading...'
55
+ })
56
+ })
57
+ });
58
+ }
59
+ if (error) {
60
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
61
+ padding: 8,
62
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
63
+ textColor: "danger600",
64
+ children: formatMessage({
65
+ id: translations.getTranslationKey('list.assets.error'),
66
+ defaultMessage: 'An error occurred while fetching assets.'
67
+ })
68
+ })
69
+ });
70
+ }
71
+ if (isGridView) {
72
+ return /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
73
+ assets: assets$1
74
+ });
75
+ }
76
+ return /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
77
+ assets: assets$1
78
+ });
79
+ };
80
+ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
81
+ display: flex;
82
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
83
+ border-radius: ${({ theme })=>theme.borderRadius};
84
+ overflow: hidden;
85
+ `;
86
+ const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
87
+ display: flex;
88
+ align-items: center;
89
+ gap: ${({ theme })=>theme.spaces[2]};
90
+ padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
91
+ border: none;
92
+ background: ${({ theme })=>theme.colors.neutral0};
93
+ color: ${({ theme })=>theme.colors.neutral800};
94
+ cursor: pointer;
95
+ font-size: ${({ theme })=>theme.fontSizes[1]};
96
+ font-weight: ${({ theme })=>theme.fontWeights.semiBold};
97
+
98
+ &:hover {
99
+ background: ${({ theme })=>theme.colors.neutral100};
100
+ }
101
+
102
+ &[data-state='on'] {
103
+ background: ${({ theme })=>theme.colors.neutral150};
104
+ }
105
+
106
+ svg {
107
+ width: 1.6rem;
108
+ height: 1.6rem;
109
+ }
110
+ `;
111
+ const DropFilesMessage = ({ uploadDropZoneRef })=>{
112
+ const { formatMessage } = reactIntl.useIntl();
113
+ const { isDragging } = UploadDropZoneContext.useUploadDropZone();
114
+ // Dropzone message position (relative to main content)
115
+ const [leftContentWidth, setLeftContentWidth] = React.useState(0);
116
+ // Calculate the left content width to position the dropzone message correctly
117
+ React.useEffect(()=>{
118
+ if (!uploadDropZoneRef?.current) return;
119
+ const updateRect = ()=>{
120
+ const rect = uploadDropZoneRef.current?.getBoundingClientRect();
121
+ if (rect) {
122
+ setLeftContentWidth((prev)=>prev !== rect.left ? rect.left : prev);
123
+ }
124
+ };
125
+ updateRect();
126
+ const resizeObserver = new ResizeObserver(updateRect);
127
+ resizeObserver.observe(uploadDropZoneRef.current);
128
+ return ()=>resizeObserver.disconnect();
129
+ }, [
130
+ uploadDropZoneRef
131
+ ]);
132
+ if (!isDragging) return null;
133
+ return /*#__PURE__*/ jsxRuntime.jsxs(DropFilesMessageImpl, {
134
+ $leftContentWidth: leftContentWidth,
135
+ children: [
136
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
137
+ textColor: "neutral0",
138
+ children: formatMessage({
139
+ id: translations.getTranslationKey('dropzone.upload.message'),
140
+ defaultMessage: 'Drop here to upload to'
141
+ })
142
+ }),
143
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
144
+ gap: 2,
145
+ alignItems: "center",
146
+ children: [
147
+ /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {
148
+ width: 20,
149
+ height: 20,
150
+ fill: "neutral0"
151
+ }),
152
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
153
+ textColor: "neutral0",
154
+ fontWeight: "semiBold",
155
+ children: "Current folder"
156
+ })
157
+ ]
158
+ })
159
+ ]
160
+ });
161
+ };
162
+ const DropFilesMessageImpl = styledComponents.styled(designSystem.Box)`
163
+ position: fixed;
164
+ bottom: ${({ theme })=>theme.spaces[8]};
165
+ left: 50%;
166
+ transform: translateX(calc(-50% + ${({ $leftContentWidth })=>$leftContentWidth / 2}px));
167
+ display: flex;
168
+ flex-direction: column;
169
+ align-items: center;
170
+ justify-content: center;
171
+ gap: ${({ theme })=>theme.spaces[2]};
172
+ background: ${({ theme })=>theme.colors.primary600};
173
+ padding: ${({ theme })=>theme.spaces[4]} ${({ theme })=>theme.spaces[6]};
174
+ border-radius: ${({ theme })=>theme.borderRadius};
175
+ z-index: 2;
176
+ `;
177
+ const AssetsPage = ()=>{
178
+ const { formatMessage } = reactIntl.useIntl();
179
+ // View state
180
+ const [view, setView] = usePersistentState.usePersistentState(constants.localStorageKeys.view, constants.viewOptions.GRID);
181
+ const isGridView = view === constants.viewOptions.GRID;
182
+ // Refs
183
+ const fileInputRef = React.useRef(null);
184
+ const uploadDropZoneRef = React.useRef(null);
185
+ // Upload handlers
186
+ const { toggleNotification } = strapiAdmin.useNotification();
187
+ const { _unstableFormatAPIError } = strapiAdmin.useAPIErrorHandler();
188
+ const [uploadFiles] = api.useUploadFilesMutation();
189
+ const uploadFilesToFolder = async (files, folderId)=>{
190
+ if (files.length === 0) return;
191
+ const formData = new FormData();
192
+ files.forEach((file)=>{
193
+ formData.append('files', file);
194
+ formData.append('fileInfo', JSON.stringify({
195
+ name: file.name,
196
+ caption: null,
197
+ alternativeText: null,
198
+ folder: folderId
199
+ }));
200
+ });
201
+ try {
202
+ await uploadFiles(formData).unwrap();
203
+ toggleNotification({
204
+ type: 'success',
205
+ message: formatMessage({
206
+ id: translations.getTranslationKey('assets.uploaded'),
207
+ defaultMessage: '{number, plural, one {# asset} other {# assets}} uploaded successfully'
208
+ }, {
209
+ number: files.length
210
+ })
211
+ });
212
+ } catch (error) {
213
+ const errorMessage = _unstableFormatAPIError(error);
214
+ toggleNotification({
215
+ type: 'danger',
216
+ message: errorMessage
217
+ });
218
+ }
219
+ };
220
+ const handleFileSelect = ()=>{
221
+ fileInputRef.current?.click();
222
+ };
223
+ const handleFileChange = async (e)=>{
224
+ const files = e.target.files;
225
+ if (files && files.length > 0) {
226
+ await uploadFilesToFolder(Array.from(files), null);
227
+ }
228
+ e.target.value = '';
229
+ };
230
+ const handleDrop = async (files)=>{
231
+ await uploadFilesToFolder(files, null);
232
+ };
233
+ return /*#__PURE__*/ jsxRuntime.jsx(UploadDropZoneContext.UploadDropZoneProvider, {
234
+ onDrop: handleDrop,
235
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
236
+ ref: uploadDropZoneRef,
237
+ children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
238
+ minHeight: "100vh",
239
+ children: [
240
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
241
+ children: /*#__PURE__*/ jsxRuntime.jsx("input", {
242
+ type: "file",
243
+ ref: fileInputRef,
244
+ onChange: handleFileChange,
245
+ multiple: true
246
+ })
247
+ }),
248
+ /*#__PURE__*/ jsxRuntime.jsx(DropFilesMessage, {
249
+ uploadDropZoneRef: uploadDropZoneRef
250
+ }),
251
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
252
+ navigationAction: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
253
+ children: "TODO: Breadcrumbs"
254
+ }),
255
+ title: "TODO: Folder location",
256
+ primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
257
+ gap: 2,
258
+ children: [
259
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.SimpleMenu, {
260
+ popoverPlacement: "bottom-end",
261
+ variant: "default",
262
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
263
+ label: formatMessage({
264
+ id: translations.getTranslationKey('new'),
265
+ defaultMessage: 'New'
266
+ }),
267
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
268
+ onSelect: handleFileSelect,
269
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
270
+ children: formatMessage({
271
+ id: translations.getTranslationKey('import-files'),
272
+ defaultMessage: 'Import files'
273
+ })
274
+ })
275
+ }),
276
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.SearchInput, {
277
+ label: formatMessage({
278
+ id: translations.getTranslationKey('search.label'),
279
+ defaultMessage: 'Search for an asset'
280
+ }),
281
+ trackedEvent: "didSearchMediaLibraryElements",
282
+ trackedEventDetails: {
283
+ location: 'upload'
284
+ }
285
+ }),
286
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
287
+ type: "single",
288
+ value: isGridView ? 'grid' : 'table',
289
+ onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
290
+ "aria-label": formatMessage({
291
+ id: translations.getTranslationKey('view.switch.label'),
292
+ defaultMessage: 'View options'
293
+ }),
294
+ children: [
295
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
296
+ value: "table",
297
+ "aria-label": formatMessage({
298
+ id: translations.getTranslationKey('view.table'),
299
+ defaultMessage: 'Table view'
300
+ }),
301
+ children: [
302
+ /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
303
+ formatMessage({
304
+ id: translations.getTranslationKey('view.table'),
305
+ defaultMessage: 'Table view'
306
+ })
307
+ ]
308
+ }),
309
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
310
+ value: "grid",
311
+ "aria-label": formatMessage({
312
+ id: translations.getTranslationKey('view.grid'),
313
+ defaultMessage: 'Grid view'
314
+ }),
315
+ children: [
316
+ /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
317
+ formatMessage({
318
+ id: translations.getTranslationKey('view.grid'),
319
+ defaultMessage: 'Grid view'
320
+ })
321
+ ]
322
+ })
323
+ ]
324
+ })
325
+ ]
326
+ })
327
+ }),
328
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
329
+ children: /*#__PURE__*/ jsxRuntime.jsx(DropZoneWithOverlay.DropZoneWithOverlay, {
330
+ children: /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
331
+ view: view
332
+ })
333
+ })
334
+ })
335
+ ]
336
+ })
337
+ })
338
+ });
339
+ };
340
+
341
+ exports.AssetsPage = AssetsPage;
342
+ //# sourceMappingURL=AssetsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsPage.js","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport {\n Layouts,\n SearchInput,\n useNotification,\n useAPIErrorHandler,\n} 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, Folder, GridFour as GridIcon, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useUploadFilesMutation } from '../../services/api';\nimport { useGetAssetsQuery } from '../../services/assets';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { DropZoneWithOverlay } from './components/DropZone/DropZoneWithOverlay';\nimport {\n UploadDropZoneProvider,\n useUploadDropZone,\n} from './components/DropZone/UploadDropZoneContext';\nimport { localStorageKeys, viewOptions } from './constants';\n\ninterface AssetsViewProps {\n view: number;\n}\n\nconst AssetsView = ({ view }: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetAssetsQuery({ folder: null });\n\n const isGridView = view === viewOptions.GRID;\n const assets = data?.results ?? [];\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 if (isGridView) {\n return <AssetsGrid assets={assets} />;\n }\n\n return <AssetsTable assets={assets} />;\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\n/**\n * Dropzone items\n */\n\ninterface DropFilesMessageProps {\n uploadDropZoneRef?: React.RefObject<HTMLDivElement>;\n}\n\nconst DropFilesMessage = ({ uploadDropZoneRef }: DropFilesMessageProps) => {\n const { formatMessage } = useIntl();\n const { isDragging } = useUploadDropZone();\n\n // Dropzone message position (relative to main content)\n const [leftContentWidth, setLeftContentWidth] = useState(0);\n\n // Calculate the left content width to position the dropzone message correctly\n useEffect(() => {\n if (!uploadDropZoneRef?.current) return;\n\n const updateRect = () => {\n const rect = uploadDropZoneRef.current?.getBoundingClientRect();\n if (rect) {\n setLeftContentWidth((prev) => (prev !== rect.left ? rect.left : prev));\n }\n };\n\n updateRect();\n const resizeObserver = new ResizeObserver(updateRect);\n resizeObserver.observe(uploadDropZoneRef.current);\n return () => resizeObserver.disconnect();\n }, [uploadDropZoneRef]);\n\n if (!isDragging) return null;\n\n return (\n <DropFilesMessageImpl $leftContentWidth={leftContentWidth}>\n <Typography textColor=\"neutral0\">\n {formatMessage({\n id: getTranslationKey('dropzone.upload.message'),\n defaultMessage: 'Drop here to upload to',\n })}\n </Typography>\n <Flex gap={2} alignItems=\"center\">\n <Folder width={20} height={20} fill=\"neutral0\" />\n <Typography textColor=\"neutral0\" fontWeight=\"semiBold\">\n Current folder{/* TODO: Replace this later with the current folder name */}\n </Typography>\n </Flex>\n </DropFilesMessageImpl>\n );\n};\n\nconst DropFilesMessageImpl = styled(Box)<{ $leftContentWidth: number }>`\n position: fixed;\n bottom: ${({ theme }) => theme.spaces[8]};\n left: 50%;\n transform: translateX(calc(-50% + ${({ $leftContentWidth }) => $leftContentWidth / 2}px));\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: ${({ theme }) => theme.spaces[2]};\n background: ${({ theme }) => theme.colors.primary600};\n padding: ${({ theme }) => theme.spaces[4]} ${({ theme }) => theme.spaces[6]};\n border-radius: ${({ theme }) => theme.borderRadius};\n z-index: 2;\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 { toggleNotification } = useNotification();\n const { _unstableFormatAPIError } = useAPIErrorHandler();\n const [uploadFiles] = useUploadFilesMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n const formData = new FormData();\n files.forEach((file) => {\n formData.append('files', file);\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n })\n );\n });\n try {\n await uploadFiles(formData).unwrap();\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('assets.uploaded'),\n defaultMessage:\n '{number, plural, one {# asset} other {# assets}} uploaded successfully',\n },\n { number: files.length }\n ),\n });\n } catch (error) {\n const errorMessage = _unstableFormatAPIError(error as Error);\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\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\">\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} />\n\n <Layouts.Header\n navigationAction={<Box>TODO: Breadcrumbs</Box>}\n title=\"TODO: Folder location\"\n primaryAction={\n <Flex gap={2}>\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 <SearchInput\n label={formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\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 }\n />\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <AssetsView view={view} />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n </UploadDropZoneProvider>\n );\n};\n"],"names":["AssetsView","view","formatMessage","useIntl","data","isLoading","error","useGetAssetsQuery","folder","isGridView","viewOptions","GRID","assets","results","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","AssetsGrid","AssetsTable","StyledToggleGroup","styled","ToggleGroup","Root","theme","colors","neutral200","borderRadius","StyledToggleItem","Item","spaces","neutral0","neutral800","fontSizes","fontWeights","semiBold","neutral100","neutral150","DropFilesMessage","uploadDropZoneRef","isDragging","useUploadDropZone","leftContentWidth","setLeftContentWidth","useState","useEffect","current","updateRect","rect","getBoundingClientRect","prev","left","resizeObserver","ResizeObserver","observe","disconnect","_jsxs","DropFilesMessageImpl","$leftContentWidth","gap","alignItems","Folder","width","height","fill","fontWeight","primary600","AssetsPage","setView","usePersistentState","localStorageKeys","fileInputRef","useRef","toggleNotification","useNotification","_unstableFormatAPIError","useAPIErrorHandler","uploadFiles","useUploadFilesMutation","uploadFilesToFolder","files","folderId","length","formData","FormData","forEach","file","append","JSON","stringify","name","caption","alternativeText","unwrap","type","message","number","errorMessage","handleFileSelect","click","handleFileChange","e","target","Array","from","value","handleDrop","UploadDropZoneProvider","onDrop","ref","Layouts","minHeight","VisuallyHidden","input","onChange","multiple","Header","navigationAction","title","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Files","SearchInput","trackedEvent","trackedEventDetails","location","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay"],"mappings":"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"}