@strapi/upload 5.47.1 → 5.48.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 (123) hide show
  1. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +12 -2
  2. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  3. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +12 -2
  4. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  5. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js +1 -0
  6. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  7. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs +1 -0
  8. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  9. package/dist/admin/future/components/Drawer.js +7 -8
  10. package/dist/admin/future/components/Drawer.js.map +1 -1
  11. package/dist/admin/future/components/Drawer.mjs +7 -8
  12. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  13. package/dist/admin/future/components/UploadProgressDialog.js +33 -29
  14. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  15. package/dist/admin/future/components/UploadProgressDialog.mjs +36 -32
  16. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  17. package/dist/admin/future/pages/Assets/AssetsPage.js +2 -2
  18. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  19. package/dist/admin/future/pages/Assets/AssetsPage.mjs +3 -3
  20. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  21. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +626 -169
  22. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +630 -175
  24. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +25 -5
  26. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +25 -5
  28. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -1
  29. package/dist/admin/future/services/api.js +124 -200
  30. package/dist/admin/future/services/api.js.map +1 -1
  31. package/dist/admin/future/services/api.mjs +124 -200
  32. package/dist/admin/future/services/api.mjs.map +1 -1
  33. package/dist/admin/future/services/assets.js +57 -1
  34. package/dist/admin/future/services/assets.js.map +1 -1
  35. package/dist/admin/future/services/assets.mjs +56 -2
  36. package/dist/admin/future/services/assets.mjs.map +1 -1
  37. package/dist/admin/future/services/settings.js +18 -0
  38. package/dist/admin/future/services/settings.js.map +1 -0
  39. package/dist/admin/future/services/settings.mjs +16 -0
  40. package/dist/admin/future/services/settings.mjs.map +1 -0
  41. package/dist/admin/future/services/uploadFileViaXHR.js +92 -0
  42. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -0
  43. package/dist/admin/future/services/uploadFileViaXHR.mjs +88 -0
  44. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -0
  45. package/dist/admin/future/store/uploadProgress.js +32 -26
  46. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  47. package/dist/admin/future/store/uploadProgress.mjs +32 -27
  48. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  49. package/dist/admin/future/utils/createRafBatcher.js +42 -0
  50. package/dist/admin/future/utils/createRafBatcher.js.map +1 -0
  51. package/dist/admin/future/utils/createRafBatcher.mjs +40 -0
  52. package/dist/admin/future/utils/createRafBatcher.mjs.map +1 -0
  53. package/dist/admin/future/utils/downloadFile.js +19 -0
  54. package/dist/admin/future/utils/downloadFile.js.map +1 -0
  55. package/dist/admin/future/utils/downloadFile.mjs +17 -0
  56. package/dist/admin/future/utils/downloadFile.mjs.map +1 -0
  57. package/dist/admin/hooks/useAssets.js +5 -3
  58. package/dist/admin/hooks/useAssets.js.map +1 -1
  59. package/dist/admin/hooks/useAssets.mjs +5 -3
  60. package/dist/admin/hooks/useAssets.mjs.map +1 -1
  61. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +2 -1
  62. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +15 -1
  63. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +4 -1
  64. package/dist/admin/src/future/services/api.d.ts +9 -8
  65. package/dist/admin/src/future/services/assets.d.ts +6 -1
  66. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +34 -0
  67. package/dist/admin/src/future/store/uploadProgress.d.ts +17 -4
  68. package/dist/admin/src/future/utils/createRafBatcher.d.ts +23 -0
  69. package/dist/admin/src/future/utils/downloadFile.d.ts +6 -0
  70. package/dist/admin/translations/en.json.js +21 -0
  71. package/dist/admin/translations/en.json.js.map +1 -1
  72. package/dist/admin/translations/en.json.mjs +21 -0
  73. package/dist/admin/translations/en.json.mjs.map +1 -1
  74. package/dist/server/controllers/admin-upload.js +69 -118
  75. package/dist/server/controllers/admin-upload.js.map +1 -1
  76. package/dist/server/controllers/admin-upload.mjs +69 -118
  77. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  78. package/dist/server/controllers/content-api.js +12 -0
  79. package/dist/server/controllers/content-api.js.map +1 -1
  80. package/dist/server/controllers/content-api.mjs +12 -0
  81. package/dist/server/controllers/content-api.mjs.map +1 -1
  82. package/dist/server/routes/admin.js +2 -2
  83. package/dist/server/routes/admin.js.map +1 -1
  84. package/dist/server/routes/admin.mjs +2 -2
  85. package/dist/server/routes/admin.mjs.map +1 -1
  86. package/dist/server/routes/content-api.js +15 -0
  87. package/dist/server/routes/content-api.js.map +1 -1
  88. package/dist/server/routes/content-api.mjs +15 -0
  89. package/dist/server/routes/content-api.mjs.map +1 -1
  90. package/dist/server/routes/validation/upload.js +28 -0
  91. package/dist/server/routes/validation/upload.js.map +1 -1
  92. package/dist/server/routes/validation/upload.mjs +28 -0
  93. package/dist/server/routes/validation/upload.mjs.map +1 -1
  94. package/dist/server/services/image-manipulation.js +16 -8
  95. package/dist/server/services/image-manipulation.js.map +1 -1
  96. package/dist/server/services/image-manipulation.mjs +16 -8
  97. package/dist/server/services/image-manipulation.mjs.map +1 -1
  98. package/dist/server/services/upload.js +90 -1
  99. package/dist/server/services/upload.js.map +1 -1
  100. package/dist/server/services/upload.mjs +91 -2
  101. package/dist/server/services/upload.mjs.map +1 -1
  102. package/dist/server/src/controllers/admin-upload.d.ts +6 -8
  103. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  104. package/dist/server/src/controllers/content-api.d.ts +1 -0
  105. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  106. package/dist/server/src/controllers/index.d.ts +2 -1
  107. package/dist/server/src/controllers/index.d.ts.map +1 -1
  108. package/dist/server/src/index.d.ts +6 -1
  109. package/dist/server/src/index.d.ts.map +1 -1
  110. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  111. package/dist/server/src/routes/validation/upload.d.ts +45 -0
  112. package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
  113. package/dist/server/src/services/image-manipulation.d.ts +5 -0
  114. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  115. package/dist/server/src/services/index.d.ts +4 -0
  116. package/dist/server/src/services/index.d.ts.map +1 -1
  117. package/dist/server/src/services/upload.d.ts +5 -0
  118. package/dist/server/src/services/upload.d.ts.map +1 -1
  119. package/dist/server/src/types.d.ts +2 -2
  120. package/dist/server/src/types.d.ts.map +1 -1
  121. package/dist/shared/contracts/files.d.ts +19 -2
  122. package/dist/shared/contracts/files.d.ts.map +1 -1
  123. package/package.json +8 -8
@@ -58,13 +58,12 @@ const DrawerContainer = styled(Flex)`
58
58
  right: 0;
59
59
  padding: ${({ theme })=>theme.spaces[2]};
60
60
  max-width: 100%;
61
- /* Sit at the overlay layer (300): above the page/navigation, but below
62
- popovers (500) and tooltips (1000) rendered from descendant components
63
- (e.g. the asset details SingleSelect) so they surface above the panel, and
64
- below dialog content (modal, 310) so confirmation dialogs — e.g. the
65
- unsaved-changes <Blocker> render on top of the drawer rather than behind
66
- it. */
67
- z-index: ${({ theme })=>theme.zIndices.overlay};
61
+ /* Sit just below the overlay token (300) so that:
62
+ - popovers (500) and tooltips (1000) rendered from descendant components
63
+ surface above the drawer panel,
64
+ - AlertDialog overlays (300) and contents (310) opened from inside the
65
+ drawer (e.g. the asset details "delete" confirm) cover the drawer. */
66
+ z-index: 200;
68
67
  overflow: hidden;
69
68
  width: ${({ width })=>width ?? '400px'};
70
69
  max-height: ${({ maxHeight })=>maxHeight ?? '100vh'};
@@ -106,7 +105,7 @@ const CollapsibleContent = styled(Box)`
106
105
  transition: grid-template-rows 0.3s ease-in-out;
107
106
 
108
107
  > div {
109
- overflow: ${({ $isVisible })=>$isVisible ? 'auto' : 'hidden'};
108
+ overflow: hidden;
110
109
  min-height: 0;
111
110
  }
112
111
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.mjs","sources":["../../../../admin/src/future/components/Drawer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { Box, ScrollArea, IconButton, Flex, FlexProps } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { keyframes, styled } from 'styled-components';\n\n/** Duration of the close animation in ms. Use for timing cleanup (e.g. removing URL params). */\nexport const DRAWER_CLOSE_ANIMATION_MS = 300;\n\n/* -------------------------------------------------------------------------------------------------\n * Animations\n * -----------------------------------------------------------------------------------------------*/\n\n// Direction: up\nconst slideUpFromBottomIn = keyframes`\n from {\n opacity: 0;\n transform: translateY(100%);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nconst slideUpFromBottomOut = keyframes`\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(100%);\n }\n`;\n\n// Direction: left\nconst slideLeftFromRightIn = keyframes`\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nconst slideLeftFromRightOut = keyframes`\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(100%);\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerContainerProps {\n $animationDirection?: DrawerBodyProps['animationDirection'];\n}\n\nconst DrawerContainer = styled(Flex)<DrawerContainerProps>`\n flex-direction: column;\n position: fixed;\n bottom: 0;\n right: 0;\n padding: ${({ theme }) => theme.spaces[2]};\n max-width: 100%;\n /* Sit at the overlay layer (300): above the page/navigation, but below\n popovers (500) and tooltips (1000) rendered from descendant components\n (e.g. the asset details SingleSelect) so they surface above the panel, and\n below dialog content (modal, 310) so confirmation dialogs — e.g. the\n unsaved-changes <Blocker> — render on top of the drawer rather than behind\n it. */\n z-index: ${({ theme }) => theme.zIndices.overlay};\n overflow: hidden;\n width: ${({ width }) => width ?? '400px'};\n max-height: ${({ maxHeight }) => maxHeight ?? '100vh'};\n\n &:focus {\n outline: none;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n &[data-state='open'] {\n animation: ${({ $animationDirection }) =>\n $animationDirection === 'up' ? slideUpFromBottomIn : slideLeftFromRightIn}\n ${DRAWER_CLOSE_ANIMATION_MS}ms cubic-bezier(0.32, 0.72, 0, 1) forwards;\n }\n\n &[data-state='closed'] {\n animation: ${({ $animationDirection }) =>\n $animationDirection === 'up' ? slideUpFromBottomOut : slideLeftFromRightOut}\n ${DRAWER_CLOSE_ANIMATION_MS}ms cubic-bezier(0.32, 0.72, 0, 1) forwards;\n pointer-events: none;\n }\n }\n`;\n\nconst DrawerContent = styled(Box)`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n overflow: hidden;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\ninterface CollapsibleContentProps {\n $isVisible: boolean;\n}\n\nconst CollapsibleContent = styled(Box)<CollapsibleContentProps>`\n display: grid;\n flex: 1;\n min-height: 0;\n grid-template-rows: ${({ $isVisible }) => ($isVisible ? '1fr' : '0fr')};\n transition: grid-template-rows 0.3s ease-in-out;\n\n > div {\n overflow: ${({ $isVisible }) => ($isVisible ? 'auto' : 'hidden')};\n min-height: 0;\n }\n`;\n\nconst CloseIconButton = styled(IconButton)`\n &:hover {\n background: transparent;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Body\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerBodyProps extends FlexProps {\n animationDirection?: 'up' | 'left';\n children: React.ReactNode;\n}\n\nconst DrawerBody = React.forwardRef<HTMLDivElement, DrawerBodyProps>(\n ({ animationDirection, children, ...props }, ref) => (\n <Dialog.Content\n ref={ref}\n forceMount\n asChild\n onPointerDownOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n data-animation-direction={animationDirection}\n >\n <DrawerContainer $animationDirection={animationDirection} {...props}>\n <DrawerContent>{children}</DrawerContent>\n </DrawerContainer>\n </Dialog.Content>\n )\n);\nDrawerBody.displayName = 'DrawerBody';\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerRootProps {\n isVisible?: boolean;\n onClose?: () => void;\n children: React.ReactNode;\n}\n\nconst DrawerRoot = ({ isVisible, onClose, children }: DrawerRootProps): React.ReactElement => (\n <Dialog.Root\n open={isVisible}\n onOpenChange={(nextVisible) => !nextVisible && onClose?.()}\n modal={false}\n >\n <Dialog.Portal>{children}</Dialog.Portal>\n </Dialog.Root>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Content - composable content slot (collapsible when isContentExpanded is used)\n * Contains a scrollable area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerScrollableContentProps {\n children: React.ReactNode;\n /** When provided, content can collapse/expand (e.g. for minimize). Omit to always show. */\n isContentExpanded?: boolean;\n}\n\nconst DrawerScrollableContent = ({\n children,\n isContentExpanded = true,\n}: DrawerScrollableContentProps) => (\n <CollapsibleContent $isVisible={isContentExpanded} data-collapsed={!isContentExpanded}>\n <ScrollArea>{children}</ScrollArea>\n </CollapsibleContent>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.CloseButton - composable close icon button (Cross icon by default)\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerCloseButtonProps extends React.PropsWithChildren {\n onClose: () => void;\n label?: string;\n}\n\nconst DrawerCloseButton = ({ onClose, label, children }: DrawerCloseButtonProps) => {\n const { formatMessage } = useIntl();\n const labelMessage = label ?? formatMessage({ id: 'global.close', defaultMessage: 'Close' });\n return (\n <CloseIconButton onClick={onClose} label={labelMessage} variant=\"ghost\">\n {children ?? <Cross />}\n </CloseIconButton>\n );\n};\n\nconst Drawer = {\n Root: DrawerRoot,\n Body: DrawerBody,\n ScrollableContent: DrawerScrollableContent,\n CloseButton: DrawerCloseButton,\n Title: Dialog.Title,\n Description: Dialog.Description,\n};\n\nexport { Drawer };\n"],"names":["DRAWER_CLOSE_ANIMATION_MS","slideUpFromBottomIn","keyframes","slideUpFromBottomOut","slideLeftFromRightIn","slideLeftFromRightOut","DrawerContainer","styled","Flex","theme","spaces","zIndices","overlay","width","maxHeight","$animationDirection","DrawerContent","Box","colors","neutral0","borderRadius","shadows","popupShadow","neutral150","CollapsibleContent","$isVisible","CloseIconButton","IconButton","DrawerBody","React","forwardRef","animationDirection","children","props","ref","_jsx","Dialog","Content","forceMount","asChild","onPointerDownOutside","e","preventDefault","onInteractOutside","data-animation-direction","displayName","DrawerRoot","isVisible","onClose","Root","open","onOpenChange","nextVisible","modal","Portal","DrawerScrollableContent","isContentExpanded","data-collapsed","ScrollArea","DrawerCloseButton","label","formatMessage","useIntl","labelMessage","id","defaultMessage","onClick","variant","Cross","Drawer","Body","ScrollableContent","CloseButton","Title","Description"],"mappings":"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"}
1
+ {"version":3,"file":"Drawer.mjs","sources":["../../../../admin/src/future/components/Drawer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { Box, ScrollArea, IconButton, Flex, FlexProps } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { keyframes, styled } from 'styled-components';\n\n/** Duration of the close animation in ms. Use for timing cleanup (e.g. removing URL params). */\nexport const DRAWER_CLOSE_ANIMATION_MS = 300;\n\n/* -------------------------------------------------------------------------------------------------\n * Animations\n * -----------------------------------------------------------------------------------------------*/\n\n// Direction: up\nconst slideUpFromBottomIn = keyframes`\n from {\n opacity: 0;\n transform: translateY(100%);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nconst slideUpFromBottomOut = keyframes`\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(100%);\n }\n`;\n\n// Direction: left\nconst slideLeftFromRightIn = keyframes`\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nconst slideLeftFromRightOut = keyframes`\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(100%);\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerContainerProps {\n $animationDirection?: DrawerBodyProps['animationDirection'];\n}\n\nconst DrawerContainer = styled(Flex)<DrawerContainerProps>`\n flex-direction: column;\n position: fixed;\n bottom: 0;\n right: 0;\n padding: ${({ theme }) => theme.spaces[2]};\n max-width: 100%;\n /* Sit just below the overlay token (300) so that:\n - popovers (500) and tooltips (1000) rendered from descendant components\n surface above the drawer panel,\n - AlertDialog overlays (300) and contents (310) opened from inside the\n drawer (e.g. the asset details \"delete\" confirm) cover the drawer. */\n z-index: 200;\n overflow: hidden;\n width: ${({ width }) => width ?? '400px'};\n max-height: ${({ maxHeight }) => maxHeight ?? '100vh'};\n\n &:focus {\n outline: none;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n &[data-state='open'] {\n animation: ${({ $animationDirection }) =>\n $animationDirection === 'up' ? slideUpFromBottomIn : slideLeftFromRightIn}\n ${DRAWER_CLOSE_ANIMATION_MS}ms cubic-bezier(0.32, 0.72, 0, 1) forwards;\n }\n\n &[data-state='closed'] {\n animation: ${({ $animationDirection }) =>\n $animationDirection === 'up' ? slideUpFromBottomOut : slideLeftFromRightOut}\n ${DRAWER_CLOSE_ANIMATION_MS}ms cubic-bezier(0.32, 0.72, 0, 1) forwards;\n pointer-events: none;\n }\n }\n`;\n\nconst DrawerContent = styled(Box)`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-radius: ${({ theme }) => theme.borderRadius};\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n overflow: hidden;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\ninterface CollapsibleContentProps {\n $isVisible: boolean;\n}\n\nconst CollapsibleContent = styled(Box)<CollapsibleContentProps>`\n display: grid;\n flex: 1;\n min-height: 0;\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 min-height: 0;\n }\n`;\n\nconst CloseIconButton = styled(IconButton)`\n &:hover {\n background: transparent;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Body\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerBodyProps extends FlexProps {\n animationDirection?: 'up' | 'left';\n children: React.ReactNode;\n}\n\nconst DrawerBody = React.forwardRef<HTMLDivElement, DrawerBodyProps>(\n ({ animationDirection, children, ...props }, ref) => (\n <Dialog.Content\n ref={ref}\n forceMount\n asChild\n onPointerDownOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n data-animation-direction={animationDirection}\n >\n <DrawerContainer $animationDirection={animationDirection} {...props}>\n <DrawerContent>{children}</DrawerContent>\n </DrawerContainer>\n </Dialog.Content>\n )\n);\nDrawerBody.displayName = 'DrawerBody';\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerRootProps {\n isVisible?: boolean;\n onClose?: () => void;\n children: React.ReactNode;\n}\n\nconst DrawerRoot = ({ isVisible, onClose, children }: DrawerRootProps): React.ReactElement => (\n <Dialog.Root\n open={isVisible}\n onOpenChange={(nextVisible) => !nextVisible && onClose?.()}\n modal={false}\n >\n <Dialog.Portal>{children}</Dialog.Portal>\n </Dialog.Root>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.Content - composable content slot (collapsible when isContentExpanded is used)\n * Contains a scrollable area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerScrollableContentProps {\n children: React.ReactNode;\n /** When provided, content can collapse/expand (e.g. for minimize). Omit to always show. */\n isContentExpanded?: boolean;\n}\n\nconst DrawerScrollableContent = ({\n children,\n isContentExpanded = true,\n}: DrawerScrollableContentProps) => (\n <CollapsibleContent $isVisible={isContentExpanded} data-collapsed={!isContentExpanded}>\n <ScrollArea>{children}</ScrollArea>\n </CollapsibleContent>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Drawer.CloseButton - composable close icon button (Cross icon by default)\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerCloseButtonProps extends React.PropsWithChildren {\n onClose: () => void;\n label?: string;\n}\n\nconst DrawerCloseButton = ({ onClose, label, children }: DrawerCloseButtonProps) => {\n const { formatMessage } = useIntl();\n const labelMessage = label ?? formatMessage({ id: 'global.close', defaultMessage: 'Close' });\n return (\n <CloseIconButton onClick={onClose} label={labelMessage} variant=\"ghost\">\n {children ?? <Cross />}\n </CloseIconButton>\n );\n};\n\nconst Drawer = {\n Root: DrawerRoot,\n Body: DrawerBody,\n ScrollableContent: DrawerScrollableContent,\n CloseButton: DrawerCloseButton,\n Title: Dialog.Title,\n Description: Dialog.Description,\n};\n\nexport { Drawer };\n"],"names":["DRAWER_CLOSE_ANIMATION_MS","slideUpFromBottomIn","keyframes","slideUpFromBottomOut","slideLeftFromRightIn","slideLeftFromRightOut","DrawerContainer","styled","Flex","theme","spaces","width","maxHeight","$animationDirection","DrawerContent","Box","colors","neutral0","borderRadius","shadows","popupShadow","neutral150","CollapsibleContent","$isVisible","CloseIconButton","IconButton","DrawerBody","React","forwardRef","animationDirection","children","props","ref","_jsx","Dialog","Content","forceMount","asChild","onPointerDownOutside","e","preventDefault","onInteractOutside","data-animation-direction","displayName","DrawerRoot","isVisible","onClose","Root","open","onOpenChange","nextVisible","modal","Portal","DrawerScrollableContent","isContentExpanded","data-collapsed","ScrollArea","DrawerCloseButton","label","formatMessage","useIntl","labelMessage","id","defaultMessage","onClick","variant","Cross","Drawer","Body","ScrollableContent","CloseButton","Title","Description"],"mappings":"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"}
@@ -175,17 +175,20 @@ const HEADER_COLOR_MAP = {
175
175
  };
176
176
  const DialogHeader = ({ handleClose })=>{
177
177
  const { formatMessage } = reactIntl.useIntl();
178
- const { isMinimized, progress, files, uploadId, totalFiles } = hooks.useTypedSelector((state)=>state.uploadProgress);
178
+ const { isMinimized, files, uploadId, totalFiles } = hooks.useTypedSelector((state)=>state.uploadProgress);
179
+ const progress = hooks.useTypedSelector(uploadProgress.selectAggregateProgress);
179
180
  const dispatch = hooks.useTypedDispatch();
180
- const [retryCancelledFiles] = api.useRetryCancelledFilesStreamMutation();
181
- const isComplete = progress === 100;
182
- const isAllUploaded = isComplete && files.every((f)=>f.status !== 'uploading');
183
- const isAllErrored = isComplete && files.length > 0 && files.every((f)=>f.status === 'error');
181
+ const [retryCancelledFiles] = api.useRetryCancelledFilesMutation();
182
+ // The batch is complete once every file has reached a terminal state. Byte-weighted
183
+ // progress can't be used here because errored/cancelled rows never reach 100%.
184
+ const isComplete = files.length > 0 && files.every((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');
185
+ const isAllUploaded = isComplete;
186
+ const isAllErrored = isComplete && files.every((f)=>f.status === 'error');
184
187
  const hasCancelledFiles = files.some((f)=>f.status === 'cancelled');
185
188
  const successfulCount = files.filter((f)=>f.status === 'complete').length;
186
189
  const errorCount = files.filter((f)=>f.status === 'error').length;
187
190
  // Success includes partial success (some files succeeded, even if some failed)
188
- const isSuccess = isComplete && isAllUploaded && successfulCount > 0 && !hasCancelledFiles;
191
+ const isSuccess = isComplete && successfulCount > 0 && !hasCancelledFiles;
189
192
  const status = (()=>{
190
193
  if (isAllErrored) return 'error';
191
194
  if (isSuccess) return 'success';
@@ -264,34 +267,32 @@ const DialogHeader = ({ handleClose })=>{
264
267
  };
265
268
  /* -------------------------------------------------------------------------------------------------
266
269
  * UploadProgressDialog
267
- * -----------------------------------------------------------------------------------------------*/ const indeterminate = styledComponents.keyframes`
268
- 0% {
269
- transform: translateX(-100%);
270
- }
271
- 100% {
272
- transform: translateX(400%);
273
- }
274
- `;
275
- const IndeterminateBar = styledComponents.styled.div`
270
+ * -----------------------------------------------------------------------------------------------*/ const ProgressTrack = styledComponents.styled.div`
276
271
  width: 100%;
277
272
  height: ${({ theme })=>theme.spaces[1]};
278
273
  background-color: ${({ theme })=>theme.colors.neutral200};
279
274
  border-radius: 4px;
280
275
  overflow: hidden;
281
- position: relative;
282
-
283
- &::after {
284
- content: '';
285
- position: absolute;
286
- top: 0;
287
- left: 0;
288
- height: 100%;
289
- width: 25%;
290
- background-color: ${({ theme })=>theme.colors.primary700};
291
- border-radius: 4px;
292
- animation: ${indeterminate} 1.5s ease-in-out infinite;
293
- }
294
276
  `;
277
+ const ProgressIndicator = styledComponents.styled.div`
278
+ height: 100%;
279
+ width: ${({ $percent })=>$percent}%;
280
+ background-color: ${({ theme })=>theme.colors.primary700};
281
+ border-radius: 4px;
282
+ transition: width 0.15s linear;
283
+ `;
284
+ const DeterminateBar = ({ percent })=>{
285
+ const clamped = Math.min(100, Math.max(0, Math.round(percent)));
286
+ return /*#__PURE__*/ jsxRuntime.jsx(ProgressTrack, {
287
+ role: "progressbar",
288
+ "aria-valuemin": 0,
289
+ "aria-valuemax": 100,
290
+ "aria-valuenow": clamped,
291
+ children: /*#__PURE__*/ jsxRuntime.jsx(ProgressIndicator, {
292
+ $percent: clamped
293
+ })
294
+ });
295
+ };
295
296
  const FileRow = ({ icon, fileName, children })=>{
296
297
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
297
298
  direction: "column",
@@ -323,6 +324,7 @@ const FileRowRenderer = ({ file })=>{
323
324
  const isCompleted = file.status === 'complete';
324
325
  const isCancelled = file.status === 'cancelled';
325
326
  if (isCurrentFile) {
327
+ const percent = file.size > 0 ? file.uploadedBytes / file.size * 100 : 0;
326
328
  return /*#__PURE__*/ jsxRuntime.jsxs(FileRow, {
327
329
  icon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsCounterClockwise, {
328
330
  fill: "secondary600"
@@ -337,7 +339,9 @@ const FileRowRenderer = ({ file })=>{
337
339
  defaultMessage: 'Uploading...'
338
340
  })
339
341
  }),
340
- /*#__PURE__*/ jsxRuntime.jsx(IndeterminateBar, {})
342
+ /*#__PURE__*/ jsxRuntime.jsx(DeterminateBar, {
343
+ percent: percent
344
+ })
341
345
  ]
342
346
  });
343
347
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UploadProgressDialog.js","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { 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 { Drawer } from './Drawer';\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 <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.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(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n}: 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 const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\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={subtitle}\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 successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && isAllUploaded && successfulCount > 0 && !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\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n />\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 <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\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 CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\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 <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\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 </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","formatMessage","useIntl","background","Cross","fill","id","getTranslationKey","defaultMessage","successCount","count","Check","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","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","indeterminate","keyframes","IndeterminateBar","div","colors","neutral200","primary700","FileRow","icon","fileName","children","width","ellipsis","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","ArrowsCounterClockwise","name","CrossCircle","CheckCircle","CompletedFilesList","UploadProgressDialog","isVisible","currentFile","find","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":"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"}
1
+ {"version":3,"file":"UploadProgressDialog.js","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { 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 } from 'styled-components';\n\nimport { abortUpload, useRetryCancelledFilesMutation } from '../services/api';\nimport { useTypedDispatch, useTypedSelector } from '../store/hooks';\nimport {\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n selectAggregateProgress,\n} from '../store/uploadProgress';\nimport { getTranslationKey } from '../utils/translations';\n\nimport { Drawer } from './Drawer';\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 <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.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(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n}: 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 const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\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={subtitle}\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, files, uploadId, totalFiles } = useTypedSelector(\n (state) => state.uploadProgress\n );\n const progress = useTypedSelector(selectAggregateProgress);\n const dispatch = useTypedDispatch();\n const [retryCancelledFiles] = useRetryCancelledFilesMutation();\n\n // The batch is complete once every file has reached a terminal state. Byte-weighted\n // progress can't be used here because errored/cancelled rows never reach 100%.\n const isComplete =\n files.length > 0 &&\n files.every((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');\n const isAllUploaded = isComplete;\n const isAllErrored = isComplete && files.every((f) => f.status === 'error');\n const hasCancelledFiles = files.some((f) => f.status === 'cancelled');\n const successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && successfulCount > 0 && !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\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n />\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 <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadProgressDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProgressTrack = 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`;\n\nconst ProgressIndicator = styled.div<{ $percent: number }>`\n height: 100%;\n width: ${({ $percent }) => $percent}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n transition: width 0.15s linear;\n`;\n\nconst DeterminateBar = ({ percent }: { percent: number }) => {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={clamped}>\n <ProgressIndicator $percent={clamped} />\n </ProgressTrack>\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 const percent = file.size > 0 ? (file.uploadedBytes / file.size) * 100 : 0;\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 <DeterminateBar percent={percent} />\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 CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\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 <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\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 </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","formatMessage","useIntl","background","Cross","fill","id","getTranslationKey","defaultMessage","successCount","count","Check","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","selectAggregateProgress","dispatch","useTypedDispatch","retryCancelledFiles","useRetryCancelledFilesMutation","isComplete","length","every","f","isAllUploaded","isAllErrored","hasCancelledFiles","some","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","ProgressTrack","div","colors","neutral200","ProgressIndicator","$percent","primary700","DeterminateBar","percent","clamped","min","max","role","aria-valuemin","aria-valuemax","aria-valuenow","FileRow","icon","fileName","children","width","ellipsis","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","size","uploadedBytes","ArrowsCounterClockwise","name","CrossCircle","CheckCircle","CompletedFilesList","UploadProgressDialog","isVisible","currentFile","find","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":"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"}
@@ -3,10 +3,10 @@ import 'react';
3
3
  import { Flex, IconButton, TextButton, Typography } from '@strapi/design-system';
4
4
  import { ChevronDown, ArrowsCounterClockwise, CrossCircle, MinusCircle, CheckCircle, Cross, Check, Upload } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
- import { styled, keyframes } from 'styled-components';
7
- import { useRetryCancelledFilesStreamMutation, abortUpload } from '../services/api.mjs';
6
+ import { styled } from 'styled-components';
7
+ import { useRetryCancelledFilesMutation, abortUpload } from '../services/api.mjs';
8
8
  import { useTypedDispatch, useTypedSelector } from '../store/hooks.mjs';
9
- import { closeUploadProgress, cancelUpload, toggleMinimize } from '../store/uploadProgress.mjs';
9
+ import { closeUploadProgress, selectAggregateProgress, cancelUpload, toggleMinimize } from '../store/uploadProgress.mjs';
10
10
  import { getTranslationKey } from '../utils/translations.mjs';
11
11
  import { Drawer } from './Drawer.mjs';
12
12
 
@@ -173,17 +173,20 @@ const HEADER_COLOR_MAP = {
173
173
  };
174
174
  const DialogHeader = ({ handleClose })=>{
175
175
  const { formatMessage } = useIntl();
176
- const { isMinimized, progress, files, uploadId, totalFiles } = useTypedSelector((state)=>state.uploadProgress);
176
+ const { isMinimized, files, uploadId, totalFiles } = useTypedSelector((state)=>state.uploadProgress);
177
+ const progress = useTypedSelector(selectAggregateProgress);
177
178
  const dispatch = useTypedDispatch();
178
- const [retryCancelledFiles] = useRetryCancelledFilesStreamMutation();
179
- const isComplete = progress === 100;
180
- const isAllUploaded = isComplete && files.every((f)=>f.status !== 'uploading');
181
- const isAllErrored = isComplete && files.length > 0 && files.every((f)=>f.status === 'error');
179
+ const [retryCancelledFiles] = useRetryCancelledFilesMutation();
180
+ // The batch is complete once every file has reached a terminal state. Byte-weighted
181
+ // progress can't be used here because errored/cancelled rows never reach 100%.
182
+ const isComplete = files.length > 0 && files.every((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');
183
+ const isAllUploaded = isComplete;
184
+ const isAllErrored = isComplete && files.every((f)=>f.status === 'error');
182
185
  const hasCancelledFiles = files.some((f)=>f.status === 'cancelled');
183
186
  const successfulCount = files.filter((f)=>f.status === 'complete').length;
184
187
  const errorCount = files.filter((f)=>f.status === 'error').length;
185
188
  // Success includes partial success (some files succeeded, even if some failed)
186
- const isSuccess = isComplete && isAllUploaded && successfulCount > 0 && !hasCancelledFiles;
189
+ const isSuccess = isComplete && successfulCount > 0 && !hasCancelledFiles;
187
190
  const status = (()=>{
188
191
  if (isAllErrored) return 'error';
189
192
  if (isSuccess) return 'success';
@@ -262,34 +265,32 @@ const DialogHeader = ({ handleClose })=>{
262
265
  };
263
266
  /* -------------------------------------------------------------------------------------------------
264
267
  * UploadProgressDialog
265
- * -----------------------------------------------------------------------------------------------*/ const indeterminate = keyframes`
266
- 0% {
267
- transform: translateX(-100%);
268
- }
269
- 100% {
270
- transform: translateX(400%);
271
- }
272
- `;
273
- const IndeterminateBar = styled.div`
268
+ * -----------------------------------------------------------------------------------------------*/ const ProgressTrack = styled.div`
274
269
  width: 100%;
275
270
  height: ${({ theme })=>theme.spaces[1]};
276
271
  background-color: ${({ theme })=>theme.colors.neutral200};
277
272
  border-radius: 4px;
278
273
  overflow: hidden;
279
- position: relative;
280
-
281
- &::after {
282
- content: '';
283
- position: absolute;
284
- top: 0;
285
- left: 0;
286
- height: 100%;
287
- width: 25%;
288
- background-color: ${({ theme })=>theme.colors.primary700};
289
- border-radius: 4px;
290
- animation: ${indeterminate} 1.5s ease-in-out infinite;
291
- }
292
274
  `;
275
+ const ProgressIndicator = styled.div`
276
+ height: 100%;
277
+ width: ${({ $percent })=>$percent}%;
278
+ background-color: ${({ theme })=>theme.colors.primary700};
279
+ border-radius: 4px;
280
+ transition: width 0.15s linear;
281
+ `;
282
+ const DeterminateBar = ({ percent })=>{
283
+ const clamped = Math.min(100, Math.max(0, Math.round(percent)));
284
+ return /*#__PURE__*/ jsx(ProgressTrack, {
285
+ role: "progressbar",
286
+ "aria-valuemin": 0,
287
+ "aria-valuemax": 100,
288
+ "aria-valuenow": clamped,
289
+ children: /*#__PURE__*/ jsx(ProgressIndicator, {
290
+ $percent: clamped
291
+ })
292
+ });
293
+ };
293
294
  const FileRow = ({ icon, fileName, children })=>{
294
295
  return /*#__PURE__*/ jsxs(Flex, {
295
296
  direction: "column",
@@ -321,6 +322,7 @@ const FileRowRenderer = ({ file })=>{
321
322
  const isCompleted = file.status === 'complete';
322
323
  const isCancelled = file.status === 'cancelled';
323
324
  if (isCurrentFile) {
325
+ const percent = file.size > 0 ? file.uploadedBytes / file.size * 100 : 0;
324
326
  return /*#__PURE__*/ jsxs(FileRow, {
325
327
  icon: /*#__PURE__*/ jsx(ArrowsCounterClockwise, {
326
328
  fill: "secondary600"
@@ -335,7 +337,9 @@ const FileRowRenderer = ({ file })=>{
335
337
  defaultMessage: 'Uploading...'
336
338
  })
337
339
  }),
338
- /*#__PURE__*/ jsx(IndeterminateBar, {})
340
+ /*#__PURE__*/ jsx(DeterminateBar, {
341
+ percent: percent
342
+ })
339
343
  ]
340
344
  });
341
345
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UploadProgressDialog.mjs","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { 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 { Drawer } from './Drawer';\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 <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.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(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n}: 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 const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\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={subtitle}\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 successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && isAllUploaded && successfulCount > 0 && !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\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n />\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 <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\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 CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\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 <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\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 </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","formatMessage","useIntl","background","Cross","fill","id","getTranslationKey","defaultMessage","successCount","count","Check","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","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","indeterminate","keyframes","IndeterminateBar","div","colors","neutral200","primary700","FileRow","icon","fileName","children","width","ellipsis","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","ArrowsCounterClockwise","name","CrossCircle","CheckCircle","CompletedFilesList","UploadProgressDialog","isVisible","currentFile","find","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":"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"}
1
+ {"version":3,"file":"UploadProgressDialog.mjs","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { 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 } from 'styled-components';\n\nimport { abortUpload, useRetryCancelledFilesMutation } from '../services/api';\nimport { useTypedDispatch, useTypedSelector } from '../store/hooks';\nimport {\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n selectAggregateProgress,\n} from '../store/uploadProgress';\nimport { getTranslationKey } from '../utils/translations';\n\nimport { Drawer } from './Drawer';\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 <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.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(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n}: 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 const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\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={subtitle}\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, files, uploadId, totalFiles } = useTypedSelector(\n (state) => state.uploadProgress\n );\n const progress = useTypedSelector(selectAggregateProgress);\n const dispatch = useTypedDispatch();\n const [retryCancelledFiles] = useRetryCancelledFilesMutation();\n\n // The batch is complete once every file has reached a terminal state. Byte-weighted\n // progress can't be used here because errored/cancelled rows never reach 100%.\n const isComplete =\n files.length > 0 &&\n files.every((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');\n const isAllUploaded = isComplete;\n const isAllErrored = isComplete && files.every((f) => f.status === 'error');\n const hasCancelledFiles = files.some((f) => f.status === 'cancelled');\n const successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && successfulCount > 0 && !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\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n />\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 <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadProgressDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProgressTrack = 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`;\n\nconst ProgressIndicator = styled.div<{ $percent: number }>`\n height: 100%;\n width: ${({ $percent }) => $percent}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n transition: width 0.15s linear;\n`;\n\nconst DeterminateBar = ({ percent }: { percent: number }) => {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={clamped}>\n <ProgressIndicator $percent={clamped} />\n </ProgressTrack>\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 const percent = file.size > 0 ? (file.uploadedBytes / file.size) * 100 : 0;\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 <DeterminateBar percent={percent} />\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 CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\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 <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\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 </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","formatMessage","useIntl","background","Cross","fill","id","getTranslationKey","defaultMessage","successCount","count","Check","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","selectAggregateProgress","dispatch","useTypedDispatch","retryCancelledFiles","useRetryCancelledFilesMutation","isComplete","length","every","f","isAllUploaded","isAllErrored","hasCancelledFiles","some","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","ProgressTrack","div","colors","neutral200","ProgressIndicator","$percent","primary700","DeterminateBar","percent","clamped","min","max","role","aria-valuemin","aria-valuemax","aria-valuenow","FileRow","icon","fileName","children","width","ellipsis","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","size","uploadedBytes","ArrowsCounterClockwise","name","CrossCircle","CheckCircle","CompletedFilesList","UploadProgressDialog","isVisible","currentFile","find","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":"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"}