@strapi/upload 5.36.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 (89) hide show
  1. package/dist/admin/future/App.js +5 -12
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +5 -12
  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/pages/Assets/AssetsPage.js +149 -180
  10. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/AssetsPage.mjs +156 -187
  12. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +127 -0
  14. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +105 -0
  16. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +77 -0
  18. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +74 -0
  20. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -0
  21. package/dist/admin/future/services/api.js +419 -9
  22. package/dist/admin/future/services/api.js.map +1 -1
  23. package/dist/admin/future/services/api.mjs +417 -9
  24. package/dist/admin/future/services/api.mjs.map +1 -1
  25. package/dist/admin/future/store/hooks.js +10 -0
  26. package/dist/admin/future/store/hooks.js.map +1 -0
  27. package/dist/admin/future/store/hooks.mjs +7 -0
  28. package/dist/admin/future/store/hooks.mjs.map +1 -0
  29. package/dist/admin/future/store/uploadProgress.js +156 -0
  30. package/dist/admin/future/store/uploadProgress.js.map +1 -0
  31. package/dist/admin/future/store/uploadProgress.mjs +143 -0
  32. package/dist/admin/future/store/uploadProgress.mjs.map +1 -0
  33. package/dist/admin/index.js +11 -0
  34. package/dist/admin/index.js.map +1 -1
  35. package/dist/admin/index.mjs +11 -0
  36. package/dist/admin/index.mjs.map +1 -1
  37. package/dist/admin/package.json.js +10 -9
  38. package/dist/admin/package.json.js.map +1 -1
  39. package/dist/admin/package.json.mjs +10 -9
  40. package/dist/admin/package.json.mjs.map +1 -1
  41. package/dist/admin/src/future/components/UploadProgressDialog.d.ts +1 -0
  42. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +9 -0
  43. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +17 -0
  44. package/dist/admin/src/future/services/api.d.ts +21 -3
  45. package/dist/admin/src/future/store/hooks.d.ts +6 -0
  46. package/dist/admin/src/future/store/uploadProgress.d.ts +46 -0
  47. package/dist/admin/translations/en.json.js +22 -0
  48. package/dist/admin/translations/en.json.js.map +1 -1
  49. package/dist/admin/translations/en.json.mjs +22 -0
  50. package/dist/admin/translations/en.json.mjs.map +1 -1
  51. package/dist/server/controllers/admin-upload.js +151 -2
  52. package/dist/server/controllers/admin-upload.js.map +1 -1
  53. package/dist/server/controllers/admin-upload.mjs +151 -2
  54. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  55. package/dist/server/controllers/content-api.js +8 -2
  56. package/dist/server/controllers/content-api.js.map +1 -1
  57. package/dist/server/controllers/content-api.mjs +9 -3
  58. package/dist/server/controllers/content-api.mjs.map +1 -1
  59. package/dist/server/routes/admin.js +10 -0
  60. package/dist/server/routes/admin.js.map +1 -1
  61. package/dist/server/routes/admin.mjs +10 -0
  62. package/dist/server/routes/admin.mjs.map +1 -1
  63. package/dist/server/src/controllers/admin-upload.d.ts +12 -0
  64. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  65. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  66. package/dist/server/src/controllers/index.d.ts +1 -0
  67. package/dist/server/src/controllers/index.d.ts.map +1 -1
  68. package/dist/server/src/index.d.ts +1 -0
  69. package/dist/server/src/index.d.ts.map +1 -1
  70. package/dist/server/src/routes/admin.d.ts.map +1 -1
  71. package/dist/server/src/utils/mime-validation.d.ts +5 -0
  72. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  73. package/dist/server/utils/mime-validation.js +7 -4
  74. package/dist/server/utils/mime-validation.js.map +1 -1
  75. package/dist/server/utils/mime-validation.mjs +7 -4
  76. package/dist/server/utils/mime-validation.mjs.map +1 -1
  77. package/dist/shared/contracts/files.d.ts +52 -0
  78. package/dist/shared/contracts/files.d.ts.map +1 -0
  79. package/package.json +10 -9
  80. package/dist/admin/future/pages/AIGenerationPage.js +0 -24
  81. package/dist/admin/future/pages/AIGenerationPage.js.map +0 -1
  82. package/dist/admin/future/pages/AIGenerationPage.mjs +0 -22
  83. package/dist/admin/future/pages/AIGenerationPage.mjs.map +0 -1
  84. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js +0 -33
  85. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js.map +0 -1
  86. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs +0 -31
  87. package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs.map +0 -1
  88. package/dist/admin/src/future/pages/AIGenerationPage.d.ts +0 -1
  89. package/dist/admin/src/future/pages/Assets/components/DropZone/DropZoneWithOverlay.d.ts +0 -4
@@ -5,7 +5,6 @@ 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
- var AIGenerationPage = require('./pages/AIGenerationPage.js');
9
8
  var AssetsPage = require('./pages/Assets/AssetsPage.js');
10
9
  var translations = require('./utils/translations.js');
11
10
 
@@ -20,17 +19,11 @@ const UnstableMediaLibrary = ()=>{
20
19
  /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Title, {
21
20
  children: title
22
21
  }),
23
- /*#__PURE__*/ jsxRuntime.jsxs(reactRouterDom.Routes, {
24
- children: [
25
- /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
26
- index: true,
27
- element: /*#__PURE__*/ jsxRuntime.jsx(AssetsPage.AssetsPage, {})
28
- }),
29
- /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
30
- path: "ai-generation",
31
- element: /*#__PURE__*/ jsxRuntime.jsx(AIGenerationPage.AIGenerationPage, {})
32
- })
33
- ]
22
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Routes, {
23
+ children: /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
24
+ index: true,
25
+ element: /*#__PURE__*/ jsxRuntime.jsx(AssetsPage.AssetsPage, {})
26
+ })
34
27
  })
35
28
  ]
36
29
  });
@@ -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 { 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;;;;"}
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 { 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 </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"],"mappings":";;;;;;;;;;MASaA,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;;0BAEbO,cAACE,CAAAA,qBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAF,cAACG,CAAAA,oBAAAA,EAAAA;oBAAMC,KAAK,EAAA,IAAA;AAACC,oBAAAA,OAAAA,gBAASL,cAACM,CAAAA,qBAAAA,EAAAA,EAAAA;;;;;AAI/B;;;;"}
@@ -3,7 +3,6 @@ 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 { AIGenerationPage } from './pages/AIGenerationPage.mjs';
7
6
  import { AssetsPage } from './pages/Assets/AssetsPage.mjs';
8
7
  import { getTranslationKey } from './utils/translations.mjs';
9
8
 
@@ -18,17 +17,11 @@ const UnstableMediaLibrary = ()=>{
18
17
  /*#__PURE__*/ jsx(Page.Title, {
19
18
  children: title
20
19
  }),
21
- /*#__PURE__*/ jsxs(Routes, {
22
- children: [
23
- /*#__PURE__*/ jsx(Route, {
24
- index: true,
25
- element: /*#__PURE__*/ jsx(AssetsPage, {})
26
- }),
27
- /*#__PURE__*/ jsx(Route, {
28
- path: "ai-generation",
29
- element: /*#__PURE__*/ jsx(AIGenerationPage, {})
30
- })
31
- ]
20
+ /*#__PURE__*/ jsx(Routes, {
21
+ children: /*#__PURE__*/ jsx(Route, {
22
+ index: true,
23
+ element: /*#__PURE__*/ jsx(AssetsPage, {})
24
+ })
32
25
  })
33
26
  ]
34
27
  });
@@ -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 { 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;;;;"}
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 { 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 </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"],"mappings":";;;;;;;;MASaA,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;;0BAEbO,GAACE,CAAAA,MAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAF,GAACG,CAAAA,KAAAA,EAAAA;oBAAMC,KAAK,EAAA,IAAA;AAACC,oBAAAA,OAAAA,gBAASL,GAACM,CAAAA,UAAAA,EAAAA,EAAAA;;;;;AAI/B;;;;"}
@@ -0,0 +1,494 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ require('react');
5
+ var Dialog = require('@radix-ui/react-dialog');
6
+ var designSystem = require('@strapi/design-system');
7
+ var icons = require('@strapi/icons');
8
+ var reactIntl = require('react-intl');
9
+ var styledComponents = require('styled-components');
10
+ var api = require('../services/api.js');
11
+ var hooks = require('../store/hooks.js');
12
+ var uploadProgress = require('../store/uploadProgress.js');
13
+ var translations = require('../utils/translations.js');
14
+
15
+ function _interopNamespaceDefault(e) {
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () { return e[k]; }
24
+ });
25
+ }
26
+ });
27
+ }
28
+ n.default = e;
29
+ return Object.freeze(n);
30
+ }
31
+
32
+ var Dialog__namespace = /*#__PURE__*/_interopNamespaceDefault(Dialog);
33
+
34
+ /* -------------------------------------------------------------------------------------------------
35
+ * DialogHeader
36
+ * -----------------------------------------------------------------------------------------------*/ const HeaderStatusMessage = ({ title, subtitle })=>{
37
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
38
+ direction: "column",
39
+ alignItems: "flex-start",
40
+ paddingLeft: 2,
41
+ children: [
42
+ /*#__PURE__*/ jsxRuntime.jsx(Dialog__namespace.Title, {
43
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
44
+ variant: "omega",
45
+ children: title
46
+ })
47
+ }),
48
+ /*#__PURE__*/ jsxRuntime.jsx(Dialog__namespace.Description, {
49
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
50
+ variant: "pi",
51
+ textColor: "neutral600",
52
+ children: subtitle
53
+ })
54
+ })
55
+ ]
56
+ });
57
+ };
58
+ const HeaderStatusIcon = styledComponents.styled(designSystem.Flex)`
59
+ padding: ${({ theme })=>theme.spaces[3]};
60
+ border-radius: ${({ theme })=>`${theme.borderRadius} 0 0 ${theme.borderRadius}`};
61
+
62
+ > svg {
63
+ height: 24px;
64
+ width: 24px;
65
+ }
66
+ `;
67
+ const HeaderStatusWrapper = styledComponents.styled(Dialog__namespace.Title)`
68
+ display: flex;
69
+ align-items: center;
70
+ `;
71
+ const HeaderStatus = ({ status, progress, totalFiles })=>{
72
+ const { formatMessage } = reactIntl.useIntl();
73
+ if (status === 'error') {
74
+ return /*#__PURE__*/ jsxRuntime.jsxs(HeaderStatusWrapper, {
75
+ children: [
76
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusIcon, {
77
+ background: "danger200",
78
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {
79
+ fill: "danger700"
80
+ })
81
+ }),
82
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusMessage, {
83
+ title: formatMessage({
84
+ id: translations.getTranslationKey('upload.progress.failed'),
85
+ defaultMessage: 'Upload failed'
86
+ }),
87
+ subtitle: formatMessage({
88
+ id: translations.getTranslationKey('upload.progress.failed.subtitle'),
89
+ defaultMessage: 'Please try to upload files again'
90
+ })
91
+ })
92
+ ]
93
+ });
94
+ }
95
+ if (status === 'success') {
96
+ return /*#__PURE__*/ jsxRuntime.jsxs(HeaderStatusWrapper, {
97
+ children: [
98
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusIcon, {
99
+ background: "success200",
100
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {
101
+ fill: "success700"
102
+ })
103
+ }),
104
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusMessage, {
105
+ title: formatMessage({
106
+ id: translations.getTranslationKey('upload.progress.success'),
107
+ defaultMessage: 'Upload successful!'
108
+ }),
109
+ subtitle: formatMessage({
110
+ id: translations.getTranslationKey('upload.progress.success.subtitle'),
111
+ defaultMessage: '{count} files uploaded successfully'
112
+ }, {
113
+ count: totalFiles
114
+ })
115
+ })
116
+ ]
117
+ });
118
+ }
119
+ if (status === 'canceled') {
120
+ return /*#__PURE__*/ jsxRuntime.jsxs(HeaderStatusWrapper, {
121
+ children: [
122
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusIcon, {
123
+ background: "neutral200",
124
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.MinusCircle, {
125
+ fill: "neutral700"
126
+ })
127
+ }),
128
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusMessage, {
129
+ title: formatMessage({
130
+ id: translations.getTranslationKey('upload.progress.canceled'),
131
+ defaultMessage: 'Upload canceled'
132
+ }),
133
+ subtitle: formatMessage({
134
+ id: translations.getTranslationKey('upload.progress.canceled.subtitle'),
135
+ defaultMessage: 'Some files were not uploaded'
136
+ })
137
+ })
138
+ ]
139
+ });
140
+ }
141
+ if (status === 'uploading') {
142
+ const progressPercentage = progress ? Math.round(progress) : 0;
143
+ return /*#__PURE__*/ jsxRuntime.jsxs(HeaderStatusWrapper, {
144
+ children: [
145
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusIcon, {
146
+ background: "primary200",
147
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Upload, {
148
+ fill: "primary700"
149
+ })
150
+ }),
151
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatusMessage, {
152
+ title: formatMessage({
153
+ id: translations.getTranslationKey('upload.progress.uploading.withCount'),
154
+ defaultMessage: 'Uploading {total} items ({percentage}%)'
155
+ }, {
156
+ total: totalFiles,
157
+ percentage: progressPercentage
158
+ })
159
+ })
160
+ ]
161
+ });
162
+ }
163
+ return null;
164
+ };
165
+ const HeaderIconButton = styledComponents.styled(designSystem.IconButton)`
166
+ &:hover {
167
+ background: transparent;
168
+ }
169
+ `;
170
+ const ChevronWrapper = styledComponents.styled.span`
171
+ display: flex;
172
+ transition: transform 0.5s ease-in-out;
173
+ transform: ${({ $isMinimized })=>$isMinimized ? 'rotate(180deg)' : 'rotate(0deg)'};
174
+ `;
175
+ const HEADER_COLOR_MAP = {
176
+ uploading: {
177
+ background: 'primary100'
178
+ },
179
+ canceled: {
180
+ background: 'neutral100'
181
+ },
182
+ success: {
183
+ background: 'success100'
184
+ },
185
+ error: {
186
+ background: 'danger100'
187
+ }
188
+ };
189
+ const DialogHeader = ({ handleClose })=>{
190
+ const { formatMessage } = reactIntl.useIntl();
191
+ const { isMinimized, progress, files, uploadId, totalFiles } = hooks.useTypedSelector((state)=>state.uploadProgress);
192
+ const dispatch = hooks.useTypedDispatch();
193
+ const [retryCancelledFiles] = api.useRetryCancelledFilesStreamMutation();
194
+ const isComplete = progress === 100;
195
+ const isAllUploaded = isComplete && files.every((f)=>f.status !== 'uploading');
196
+ const isAllErrored = isComplete && files.length > 0 && files.every((f)=>f.status === 'error');
197
+ const hasCancelledFiles = files.some((f)=>f.status === 'cancelled');
198
+ const isSuccess = isComplete && isAllUploaded && !isAllErrored && !hasCancelledFiles;
199
+ const status = (()=>{
200
+ if (isAllErrored) return 'error';
201
+ if (isSuccess) return 'success';
202
+ if (hasCancelledFiles) return 'canceled';
203
+ return 'uploading';
204
+ })();
205
+ const handleCancel = ()=>{
206
+ api.abortUpload(uploadId);
207
+ dispatch(uploadProgress.cancelUpload());
208
+ };
209
+ const handleRetry = async ()=>{
210
+ try {
211
+ await retryCancelledFiles().unwrap();
212
+ } catch {
213
+ // Error is already dispatched to store from the API queryFn
214
+ }
215
+ };
216
+ const handleToggleMinimize = ()=>{
217
+ dispatch(uploadProgress.toggleMinimize());
218
+ };
219
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
220
+ background: HEADER_COLOR_MAP[status].background,
221
+ justifyContent: "space-between",
222
+ margin: 1,
223
+ hasRadius: true,
224
+ children: [
225
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderStatus, {
226
+ status: status,
227
+ progress: progress,
228
+ totalFiles: totalFiles
229
+ }),
230
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
231
+ gap: 1,
232
+ children: [
233
+ !isAllUploaded && /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextButton, {
234
+ onClick: handleCancel,
235
+ fontWeight: "bold",
236
+ children: formatMessage({
237
+ id: translations.getTranslationKey('upload.progress.cancel'),
238
+ defaultMessage: 'Cancel'
239
+ })
240
+ }),
241
+ hasCancelledFiles && /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextButton, {
242
+ onClick: handleRetry,
243
+ fontWeight: "bold",
244
+ children: formatMessage({
245
+ id: translations.getTranslationKey('upload.progress.retry'),
246
+ defaultMessage: 'Retry'
247
+ })
248
+ }),
249
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderIconButton, {
250
+ onClick: handleToggleMinimize,
251
+ label: formatMessage({
252
+ id: translations.getTranslationKey(isMinimized ? 'upload.progress.maximize' : 'upload.progress.minimize'),
253
+ defaultMessage: isMinimized ? 'Maximize' : 'Minimize'
254
+ }),
255
+ variant: "ghost",
256
+ children: /*#__PURE__*/ jsxRuntime.jsx(ChevronWrapper, {
257
+ $isMinimized: isMinimized,
258
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {})
259
+ })
260
+ }),
261
+ isComplete && /*#__PURE__*/ jsxRuntime.jsx(HeaderIconButton, {
262
+ onClick: handleClose,
263
+ label: formatMessage({
264
+ id: translations.getTranslationKey('upload.progress.close'),
265
+ defaultMessage: 'Close'
266
+ }),
267
+ variant: "ghost",
268
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {})
269
+ })
270
+ ]
271
+ })
272
+ ]
273
+ });
274
+ };
275
+ /* -------------------------------------------------------------------------------------------------
276
+ * UploadProgressDialog
277
+ * -----------------------------------------------------------------------------------------------*/ const indeterminate = styledComponents.keyframes`
278
+ 0% {
279
+ transform: translateX(-100%);
280
+ }
281
+ 100% {
282
+ transform: translateX(400%);
283
+ }
284
+ `;
285
+ const IndeterminateBar = styledComponents.styled.div`
286
+ width: 100%;
287
+ height: ${({ theme })=>theme.spaces[1]};
288
+ background-color: ${({ theme })=>theme.colors.neutral200};
289
+ border-radius: 4px;
290
+ overflow: hidden;
291
+ position: relative;
292
+
293
+ &::after {
294
+ content: '';
295
+ position: absolute;
296
+ top: 0;
297
+ left: 0;
298
+ height: 100%;
299
+ width: 25%;
300
+ background-color: ${({ theme })=>theme.colors.primary700};
301
+ border-radius: 4px;
302
+ animation: ${indeterminate} 1.5s ease-in-out infinite;
303
+ }
304
+ `;
305
+ const FileRow = ({ icon, fileName, children })=>{
306
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
307
+ direction: "column",
308
+ alignItems: "stretch",
309
+ justifyContent: "center",
310
+ gap: 1,
311
+ width: "100%",
312
+ children: [
313
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
314
+ gap: 2,
315
+ children: [
316
+ icon,
317
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
318
+ variant: "omega",
319
+ fontWeight: "semiBold",
320
+ ellipsis: true,
321
+ children: fileName
322
+ })
323
+ ]
324
+ }),
325
+ children
326
+ ]
327
+ });
328
+ };
329
+ const FileRowRenderer = ({ file })=>{
330
+ const { formatMessage } = reactIntl.useIntl();
331
+ const isError = file.status === 'error';
332
+ const isCurrentFile = file.status === 'uploading';
333
+ const isCompleted = file.status === 'complete';
334
+ const isCancelled = file.status === 'cancelled';
335
+ if (isCurrentFile) {
336
+ return /*#__PURE__*/ jsxRuntime.jsxs(FileRow, {
337
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsCounterClockwise, {
338
+ fill: "secondary600"
339
+ }),
340
+ fileName: file.name,
341
+ children: [
342
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
343
+ variant: "pi",
344
+ textColor: "neutral600",
345
+ children: formatMessage({
346
+ id: translations.getTranslationKey('upload.progress.file.uploading'),
347
+ defaultMessage: 'Uploading...'
348
+ })
349
+ }),
350
+ /*#__PURE__*/ jsxRuntime.jsx(IndeterminateBar, {})
351
+ ]
352
+ });
353
+ }
354
+ if (isError) {
355
+ return /*#__PURE__*/ jsxRuntime.jsx(FileRow, {
356
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CrossCircle, {
357
+ fill: "danger500"
358
+ }),
359
+ fileName: file.name,
360
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
361
+ variant: "pi",
362
+ textColor: "neutral600",
363
+ children: file.error
364
+ })
365
+ });
366
+ }
367
+ if (isCancelled) {
368
+ return /*#__PURE__*/ jsxRuntime.jsx(FileRow, {
369
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.MinusCircle, {
370
+ fill: "neutral600"
371
+ }),
372
+ fileName: file.name,
373
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
374
+ variant: "pi",
375
+ textColor: "neutral600",
376
+ children: formatMessage({
377
+ id: translations.getTranslationKey('upload.progress.file.canceled'),
378
+ defaultMessage: 'Canceled'
379
+ })
380
+ })
381
+ });
382
+ }
383
+ if (isCompleted) {
384
+ return /*#__PURE__*/ jsxRuntime.jsx(FileRow, {
385
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
386
+ fill: "success500"
387
+ }),
388
+ fileName: file.name,
389
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
390
+ variant: "pi",
391
+ textColor: "neutral600",
392
+ children: formatMessage({
393
+ id: translations.getTranslationKey('upload.progress.file.uploaded'),
394
+ defaultMessage: 'Uploaded'
395
+ })
396
+ })
397
+ });
398
+ }
399
+ return null;
400
+ };
401
+ const DialogContent = styledComponents.styled(Dialog__namespace.Content)`
402
+ position: fixed;
403
+ bottom: ${({ theme })=>theme.spaces[4]};
404
+ right: ${({ theme })=>theme.spaces[4]};
405
+ width: 400px;
406
+ background-color: ${({ theme })=>theme.colors.neutral0};
407
+ border-radius: ${({ theme })=>theme.borderRadius};
408
+ box-shadow: ${({ theme })=>theme.shadows.popupShadow};
409
+ z-index: 1000;
410
+ overflow: hidden;
411
+ border: 1px solid ${({ theme })=>theme.colors.neutral150};
412
+
413
+ &:focus {
414
+ outline: none;
415
+ }
416
+ `;
417
+ const CompletedFilesList = styledComponents.styled(designSystem.Flex)`
418
+ max-height: 200px;
419
+ overflow-y: auto;
420
+ flex-direction: column;
421
+ gap: ${({ theme })=>theme.spaces[2]};
422
+ width: 100%;
423
+ `;
424
+ const AnimatedContent = styledComponents.styled.div`
425
+ display: grid;
426
+ grid-template-rows: ${({ $isVisible })=>$isVisible ? '1fr' : '0fr'};
427
+ transition: grid-template-rows 0.3s ease-in-out;
428
+
429
+ > div {
430
+ overflow: hidden;
431
+ }
432
+ `;
433
+ const UploadProgressDialog = ()=>{
434
+ const dispatch = hooks.useTypedDispatch();
435
+ const { isVisible, isMinimized, files } = hooks.useTypedSelector((state)=>state.uploadProgress);
436
+ const currentFile = files.find((f)=>f.status === 'uploading');
437
+ const completedFiles = files.filter((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled').sort((a, b)=>{
438
+ // Sort priority: error > cancelled > complete
439
+ const priority = {
440
+ error: 0,
441
+ cancelled: 1,
442
+ complete: 2,
443
+ uploading: 3,
444
+ pending: 4
445
+ };
446
+ return priority[a.status] - priority[b.status];
447
+ });
448
+ const handleClose = ()=>{
449
+ dispatch(uploadProgress.closeUploadProgress());
450
+ };
451
+ return /*#__PURE__*/ jsxRuntime.jsx(Dialog__namespace.Root, {
452
+ open: isVisible,
453
+ modal: false,
454
+ children: /*#__PURE__*/ jsxRuntime.jsx(Dialog__namespace.Portal, {
455
+ children: /*#__PURE__*/ jsxRuntime.jsxs(DialogContent, {
456
+ // The accessible name is set by Dialog.Title and is dynamic,
457
+ // use a data-testid to ensure a stable target for e2e tests
458
+ "data-testid": "upload-progress-dialog",
459
+ children: [
460
+ /*#__PURE__*/ jsxRuntime.jsx(DialogHeader, {
461
+ handleClose: handleClose
462
+ }),
463
+ /*#__PURE__*/ jsxRuntime.jsx(AnimatedContent, {
464
+ $isVisible: !isMinimized,
465
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
466
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
467
+ direction: "column",
468
+ alignItems: "stretch",
469
+ gap: 4,
470
+ paddingTop: 4,
471
+ paddingBottom: 4,
472
+ paddingLeft: 4,
473
+ paddingRight: 4,
474
+ children: [
475
+ currentFile && /*#__PURE__*/ jsxRuntime.jsx(FileRowRenderer, {
476
+ file: currentFile
477
+ }),
478
+ completedFiles.length > 0 && /*#__PURE__*/ jsxRuntime.jsx(CompletedFilesList, {
479
+ children: completedFiles.map((file)=>/*#__PURE__*/ jsxRuntime.jsx(FileRowRenderer, {
480
+ file: file
481
+ }, file.index))
482
+ })
483
+ ]
484
+ })
485
+ })
486
+ })
487
+ ]
488
+ })
489
+ })
490
+ });
491
+ };
492
+
493
+ exports.UploadProgressDialog = UploadProgressDialog;
494
+ //# sourceMappingURL=UploadProgressDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadProgressDialog.js","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { Box, Flex, IconButton, TextButton, Typography } from '@strapi/design-system';\nimport {\n ArrowsCounterClockwise,\n Check,\n CheckCircle,\n ChevronDown,\n Cross,\n CrossCircle,\n MinusCircle,\n Upload,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, keyframes } from 'styled-components';\n\nimport { abortUpload, useRetryCancelledFilesStreamMutation } from '../services/api';\nimport { useTypedDispatch, useTypedSelector } from '../store/hooks';\nimport { closeUploadProgress, toggleMinimize, cancelUpload } from '../store/uploadProgress';\nimport { getTranslationKey } from '../utils/translations';\n\nimport type { FileProgress, FileProgressStatus } from '../store/uploadProgress';\n\n/* -------------------------------------------------------------------------------------------------\n * DialogHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderStatusMessage = ({ title, subtitle }: { title: string; subtitle?: string }) => {\n return (\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingLeft={2}>\n <Dialog.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Dialog.Title>\n <Dialog.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Dialog.Description>\n </Flex>\n );\n};\n\nconst HeaderStatusIcon = styled(Flex)`\n padding: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => `${theme.borderRadius} 0 0 ${theme.borderRadius}`};\n\n > svg {\n height: 24px;\n width: 24px;\n }\n`;\n\nconst HeaderStatusWrapper = styled(Dialog.Title)`\n display: flex;\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n};\n\nconst HeaderStatus = ({ status, progress, totalFiles }: HeaderStatusProps) => {\n const { formatMessage } = useIntl();\n\n if (status === 'error') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"danger200\">\n <Cross fill=\"danger700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.failed'),\n defaultMessage: 'Upload failed',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.failed.subtitle'),\n defaultMessage: 'Please try to upload files again',\n })}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'success') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"success200\">\n <Check fill=\"success700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.success'),\n defaultMessage: 'Upload successful!',\n })}\n subtitle={formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: totalFiles }\n )}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'canceled') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"neutral200\">\n <MinusCircle fill=\"neutral700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.canceled'),\n defaultMessage: 'Upload canceled',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.canceled.subtitle'),\n defaultMessage: 'Some files were not uploaded',\n })}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'uploading') {\n const progressPercentage = progress ? Math.round(progress) : 0;\n\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"primary200\">\n <Upload fill=\"primary700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage(\n {\n id: getTranslationKey('upload.progress.uploading.withCount'),\n defaultMessage: 'Uploading {total} items ({percentage}%)',\n },\n {\n total: totalFiles,\n percentage: progressPercentage,\n }\n )}\n />\n </HeaderStatusWrapper>\n );\n }\n\n return null;\n};\n\nconst HeaderIconButton = styled(IconButton)`\n &:hover {\n background: transparent;\n }\n`;\n\nconst ChevronWrapper = styled.span<{ $isMinimized: boolean }>`\n display: flex;\n transition: transform 0.5s ease-in-out;\n transform: ${({ $isMinimized }) => ($isMinimized ? 'rotate(180deg)' : 'rotate(0deg)')};\n`;\n\nconst HEADER_COLOR_MAP = {\n uploading: { background: 'primary100' },\n canceled: { background: 'neutral100' },\n success: { background: 'success100' },\n error: { background: 'danger100' },\n} as const;\n\nconst DialogHeader = ({ handleClose }: { handleClose: () => void }) => {\n const { formatMessage } = useIntl();\n\n const { isMinimized, progress, files, uploadId, totalFiles } = useTypedSelector(\n (state) => state.uploadProgress\n );\n const dispatch = useTypedDispatch();\n const [retryCancelledFiles] = useRetryCancelledFilesStreamMutation();\n\n const isComplete = progress === 100;\n const isAllUploaded = isComplete && files.every((f) => f.status !== 'uploading');\n const isAllErrored = isComplete && files.length > 0 && files.every((f) => f.status === 'error');\n const hasCancelledFiles = files.some((f) => f.status === 'cancelled');\n const isSuccess = isComplete && isAllUploaded && !isAllErrored && !hasCancelledFiles;\n const status = ((): HeaderStatusProps['status'] => {\n if (isAllErrored) return 'error';\n if (isSuccess) return 'success';\n if (hasCancelledFiles) return 'canceled';\n\n return 'uploading';\n })();\n\n const handleCancel = () => {\n abortUpload(uploadId);\n dispatch(cancelUpload());\n };\n\n const handleRetry = async () => {\n try {\n await retryCancelledFiles().unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleToggleMinimize = () => {\n dispatch(toggleMinimize());\n };\n\n return (\n <Flex\n background={HEADER_COLOR_MAP[status].background}\n justifyContent=\"space-between\"\n margin={1}\n hasRadius\n >\n <HeaderStatus status={status} progress={progress} totalFiles={totalFiles} />\n <Flex gap={1}>\n {!isAllUploaded && (\n <TextButton onClick={handleCancel} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.cancel'),\n defaultMessage: 'Cancel',\n })}\n </TextButton>\n )}\n {hasCancelledFiles && (\n <TextButton onClick={handleRetry} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.retry'),\n defaultMessage: 'Retry',\n })}\n </TextButton>\n )}\n <HeaderIconButton\n onClick={handleToggleMinimize}\n label={formatMessage({\n id: getTranslationKey(\n isMinimized ? 'upload.progress.maximize' : 'upload.progress.minimize'\n ),\n defaultMessage: isMinimized ? 'Maximize' : 'Minimize',\n })}\n variant=\"ghost\"\n >\n <ChevronWrapper $isMinimized={isMinimized}>\n <ChevronDown />\n </ChevronWrapper>\n </HeaderIconButton>\n {isComplete && (\n <HeaderIconButton\n onClick={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n variant=\"ghost\"\n >\n <Cross />\n </HeaderIconButton>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadProgressDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst indeterminate = keyframes`\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n`;\n\nconst IndeterminateBar = styled.div`\n width: 100%;\n height: ${({ theme }) => theme.spaces[1]};\n background-color: ${({ theme }) => theme.colors.neutral200};\n border-radius: 4px;\n overflow: hidden;\n position: relative;\n\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 25%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n animation: ${indeterminate} 1.5s ease-in-out infinite;\n }\n`;\n\nconst FileRow = ({\n icon,\n fileName,\n children,\n}: {\n icon: React.ReactNode;\n fileName: string;\n children: React.ReactNode;\n}) => {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" justifyContent=\"center\" gap={1} width=\"100%\">\n <Flex gap={2}>\n {icon}\n <Typography variant=\"omega\" fontWeight=\"semiBold\" ellipsis>\n {fileName}\n </Typography>\n </Flex>\n {children}\n </Flex>\n );\n};\n\nconst FileRowRenderer = ({ file }: { file: FileProgress }) => {\n const { formatMessage } = useIntl();\n const isError = file.status === 'error';\n const isCurrentFile = file.status === 'uploading';\n const isCompleted = file.status === 'complete';\n const isCancelled = file.status === 'cancelled';\n\n if (isCurrentFile) {\n return (\n <FileRow icon={<ArrowsCounterClockwise fill=\"secondary600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.uploading'),\n defaultMessage: 'Uploading...',\n })}\n </Typography>\n <IndeterminateBar />\n </FileRow>\n );\n }\n\n if (isError) {\n return (\n <FileRow icon={<CrossCircle fill=\"danger500\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {file.error}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCancelled) {\n return (\n <FileRow icon={<MinusCircle fill=\"neutral600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.canceled'),\n defaultMessage: 'Canceled',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCompleted) {\n return (\n <FileRow icon={<CheckCircle fill=\"success500\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.uploaded'),\n defaultMessage: 'Uploaded',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n return null;\n};\n\nconst DialogContent = styled(Dialog.Content)`\n position: fixed;\n bottom: ${({ theme }) => theme.spaces[4]};\n right: ${({ theme }) => theme.spaces[4]};\n width: 400px;\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n z-index: 1000;\n overflow: hidden;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n\n &:focus {\n outline: none;\n }\n`;\n\nconst CompletedFilesList = styled(Flex)`\n max-height: 200px;\n overflow-y: auto;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n`;\n\nconst AnimatedContent = styled.div<{ $isVisible: boolean }>`\n display: grid;\n grid-template-rows: ${({ $isVisible }) => ($isVisible ? '1fr' : '0fr')};\n transition: grid-template-rows 0.3s ease-in-out;\n\n > div {\n overflow: hidden;\n }\n`;\n\nexport const UploadProgressDialog = () => {\n const dispatch = useTypedDispatch();\n const { isVisible, isMinimized, files } = useTypedSelector((state) => state.uploadProgress);\n\n const currentFile = files.find((f) => f.status === 'uploading');\n const completedFiles = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .sort((a, b) => {\n // Sort priority: error > cancelled > complete\n const priority: Record<FileProgressStatus, number> = {\n error: 0,\n cancelled: 1,\n complete: 2,\n uploading: 3,\n pending: 4,\n };\n return priority[a.status] - priority[b.status];\n });\n\n const handleClose = () => {\n dispatch(closeUploadProgress());\n };\n\n return (\n <Dialog.Root open={isVisible} modal={false}>\n <Dialog.Portal>\n <DialogContent\n // The accessible name is set by Dialog.Title and is dynamic,\n // use a data-testid to ensure a stable target for e2e tests\n data-testid=\"upload-progress-dialog\"\n >\n <DialogHeader handleClose={handleClose} />\n\n <AnimatedContent $isVisible={!isMinimized}>\n <Box>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n >\n {currentFile && <FileRowRenderer file={currentFile} />}\n\n {completedFiles.length > 0 && (\n <CompletedFilesList>\n {completedFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n </CompletedFilesList>\n )}\n </Flex>\n </Box>\n </AnimatedContent>\n </DialogContent>\n </Dialog.Portal>\n </Dialog.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Dialog","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","formatMessage","useIntl","background","Cross","fill","id","getTranslationKey","defaultMessage","Check","count","MinusCircle","progressPercentage","Math","round","Upload","total","percentage","HeaderIconButton","IconButton","ChevronWrapper","span","$isMinimized","HEADER_COLOR_MAP","uploading","canceled","success","error","DialogHeader","handleClose","isMinimized","files","uploadId","useTypedSelector","state","uploadProgress","dispatch","useTypedDispatch","retryCancelledFiles","useRetryCancelledFilesStreamMutation","isComplete","isAllUploaded","every","f","isAllErrored","length","hasCancelledFiles","some","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","indeterminate","keyframes","IndeterminateBar","div","colors","neutral200","primary700","FileRow","icon","fileName","children","width","ellipsis","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","ArrowsCounterClockwise","name","CrossCircle","CheckCircle","DialogContent","Content","neutral0","shadows","popupShadow","neutral150","CompletedFilesList","AnimatedContent","$isVisible","UploadProgressDialog","isVisible","currentFile","find","completedFiles","filter","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","open","modal","Portal","data-testid","Box","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":"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"}