@verdaccio/ui-components 5.0.0-next-9.19 → 5.0.0-next-9.21

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 (312) hide show
  1. package/build/api/use-data-mutation.js +1 -4
  2. package/build/api/use-data-mutation.js.map +1 -1
  3. package/build/api/use-data-mutation.mjs +1 -4
  4. package/build/api/use-data-mutation.mjs.map +1 -1
  5. package/build/api/use-data.d.ts +1 -0
  6. package/build/api/use-data.js +3 -2
  7. package/build/api/use-data.js.map +1 -1
  8. package/build/api/use-data.mjs +3 -3
  9. package/build/api/use-data.mjs.map +1 -1
  10. package/build/components/ActionBar/ActionBar.js +4 -2
  11. package/build/components/ActionBar/ActionBar.js.map +1 -1
  12. package/build/components/ActionBar/ActionBar.mjs +4 -2
  13. package/build/components/ActionBar/ActionBar.mjs.map +1 -1
  14. package/build/components/ActionBar/ActionBarAction.js +1 -1
  15. package/build/components/ActionBar/ActionBarAction.mjs +1 -1
  16. package/build/components/AppRoute/AppRoute.js +13 -0
  17. package/build/components/AppRoute/AppRoute.js.map +1 -1
  18. package/build/components/AppRoute/AppRoute.mjs +13 -0
  19. package/build/components/AppRoute/AppRoute.mjs.map +1 -1
  20. package/build/components/Author/Author.js +1 -1
  21. package/build/components/Author/Author.mjs +1 -1
  22. package/build/components/CopyClipboard/CopyToClipBoard.js +5 -0
  23. package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
  24. package/build/components/CopyClipboard/CopyToClipBoard.mjs +5 -0
  25. package/build/components/CopyClipboard/CopyToClipBoard.mjs.map +1 -1
  26. package/build/components/CopyClipboard/utils.js +14 -1
  27. package/build/components/CopyClipboard/utils.js.map +1 -1
  28. package/build/components/CopyClipboard/utils.mjs +14 -1
  29. package/build/components/CopyClipboard/utils.mjs.map +1 -1
  30. package/build/components/Dependencies/Dependencies.js +2 -1
  31. package/build/components/Dependencies/Dependencies.js.map +1 -1
  32. package/build/components/Dependencies/Dependencies.mjs +2 -1
  33. package/build/components/Dependencies/Dependencies.mjs.map +1 -1
  34. package/build/components/Dependencies/DependencyBlock.js +1 -1
  35. package/build/components/Dependencies/DependencyBlock.mjs +1 -1
  36. package/build/components/Developers/Title.js +1 -1
  37. package/build/components/Developers/Title.mjs +1 -1
  38. package/build/components/Developers/get-unique-developer-values.js +2 -1
  39. package/build/components/Developers/get-unique-developer-values.js.map +1 -1
  40. package/build/components/Developers/get-unique-developer-values.mjs +2 -1
  41. package/build/components/Developers/get-unique-developer-values.mjs.map +1 -1
  42. package/build/components/Distribution/Dist.js +3 -3
  43. package/build/components/Distribution/Dist.js.map +1 -1
  44. package/build/components/Distribution/Dist.mjs +3 -3
  45. package/build/components/Distribution/Dist.mjs.map +1 -1
  46. package/build/components/Engines/Engines.js +1 -1
  47. package/build/components/Engines/Engines.mjs +1 -1
  48. package/build/components/Forbidden/Forbidden.js +1 -1
  49. package/build/components/Forbidden/Forbidden.mjs +1 -1
  50. package/build/components/FundButton/FundButton.js +4 -3
  51. package/build/components/FundButton/FundButton.js.map +1 -1
  52. package/build/components/FundButton/FundButton.mjs +4 -3
  53. package/build/components/FundButton/FundButton.mjs.map +1 -1
  54. package/build/components/GenericError/GenericError.d.ts +3 -0
  55. package/build/components/GenericError/GenericError.js +60 -0
  56. package/build/components/GenericError/GenericError.js.map +1 -0
  57. package/build/components/GenericError/GenericError.mjs +54 -0
  58. package/build/components/GenericError/GenericError.mjs.map +1 -0
  59. package/build/components/GenericError/index.d.ts +1 -0
  60. package/build/components/GenericError/index.js +2 -0
  61. package/build/components/GenericError/index.mjs +2 -0
  62. package/build/components/Help/Help.js +1 -1
  63. package/build/components/Help/Help.mjs +1 -1
  64. package/build/components/Install/Install.js +1 -1
  65. package/build/components/Install/Install.mjs +1 -1
  66. package/build/components/Install/InstallListItem.js +2 -2
  67. package/build/components/Install/InstallListItem.js.map +1 -1
  68. package/build/components/Install/InstallListItem.mjs +2 -2
  69. package/build/components/Install/InstallListItem.mjs.map +1 -1
  70. package/build/components/Keywords/KeywordListItems.js +1 -1
  71. package/build/components/Keywords/KeywordListItems.js.map +1 -1
  72. package/build/components/Keywords/KeywordListItems.mjs +1 -1
  73. package/build/components/Keywords/KeywordListItems.mjs.map +1 -1
  74. package/build/components/Keywords/Keywords.js +2 -2
  75. package/build/components/Keywords/Keywords.js.map +1 -1
  76. package/build/components/Keywords/Keywords.mjs +2 -2
  77. package/build/components/Keywords/Keywords.mjs.map +1 -1
  78. package/build/components/LoginDialog/LoginDialogCloseButton.js +1 -1
  79. package/build/components/LoginDialog/LoginDialogCloseButton.mjs +1 -1
  80. package/build/components/LoginDialog/LoginDialogForm.js +2 -1
  81. package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
  82. package/build/components/LoginDialog/LoginDialogForm.mjs +2 -1
  83. package/build/components/LoginDialog/LoginDialogForm.mjs.map +1 -1
  84. package/build/components/LoginForm/Login.d.ts +1 -0
  85. package/build/components/LoginForm/Login.js +6 -4
  86. package/build/components/LoginForm/Login.js.map +1 -1
  87. package/build/components/LoginForm/Login.mjs +9 -7
  88. package/build/components/LoginForm/Login.mjs.map +1 -1
  89. package/build/components/LoginForm/PasswordField.js +4 -6
  90. package/build/components/LoginForm/PasswordField.js.map +1 -1
  91. package/build/components/LoginForm/PasswordField.mjs +4 -6
  92. package/build/components/LoginForm/PasswordField.mjs.map +1 -1
  93. package/build/components/LoginForm/UsernameField.js +4 -6
  94. package/build/components/LoginForm/UsernameField.js.map +1 -1
  95. package/build/components/LoginForm/UsernameField.mjs +4 -6
  96. package/build/components/LoginForm/UsernameField.mjs.map +1 -1
  97. package/build/components/LoginForm/styles.js +1 -1
  98. package/build/components/LoginForm/styles.mjs +1 -1
  99. package/build/components/LoginForm/useLoginForm.js +13 -3
  100. package/build/components/LoginForm/useLoginForm.js.map +1 -1
  101. package/build/components/LoginForm/useLoginForm.mjs +14 -4
  102. package/build/components/LoginForm/useLoginForm.mjs.map +1 -1
  103. package/build/components/NoItems/NoItems.js +2 -2
  104. package/build/components/NoItems/NoItems.mjs +1 -1
  105. package/build/components/NotFound/NotFound.js +1 -1
  106. package/build/components/NotFound/NotFound.mjs +1 -1
  107. package/build/components/Package/Package.d.ts +1 -1
  108. package/build/components/Package/Package.js +28 -29
  109. package/build/components/Package/Package.js.map +1 -1
  110. package/build/components/Package/Package.mjs +29 -30
  111. package/build/components/Package/Package.mjs.map +1 -1
  112. package/build/components/Person/Person.js +1 -1
  113. package/build/components/Person/Person.js.map +1 -1
  114. package/build/components/Person/Person.mjs +1 -1
  115. package/build/components/Person/Person.mjs.map +1 -1
  116. package/build/components/RawViewer/RawViewer.js +1 -1
  117. package/build/components/RawViewer/RawViewer.mjs +1 -1
  118. package/build/components/RegistryInfoDialog/RegistryInfoDialog.js +1 -1
  119. package/build/components/RegistryInfoDialog/RegistryInfoDialog.mjs +1 -1
  120. package/build/components/Repository/Repository.js +5 -8
  121. package/build/components/Repository/Repository.js.map +1 -1
  122. package/build/components/Repository/Repository.mjs +5 -8
  123. package/build/components/Repository/Repository.mjs.map +1 -1
  124. package/build/components/Search/AutoComplete/AutoComplete.d.ts +1 -0
  125. package/build/components/Search/AutoComplete/AutoComplete.js +4 -4
  126. package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
  127. package/build/components/Search/AutoComplete/AutoComplete.mjs +4 -4
  128. package/build/components/Search/AutoComplete/AutoComplete.mjs.map +1 -1
  129. package/build/components/Search/Search.js +12 -4
  130. package/build/components/Search/Search.js.map +1 -1
  131. package/build/components/Search/Search.mjs +13 -5
  132. package/build/components/Search/Search.mjs.map +1 -1
  133. package/build/components/Search/SearchItem.js +1 -1
  134. package/build/components/Search/SearchItem.mjs +1 -1
  135. package/build/components/SettingsMenu/SettingsMenu.js +1 -1
  136. package/build/components/SettingsMenu/SettingsMenu.mjs +1 -1
  137. package/build/components/SideBarTitle/SideBarTitle.js +2 -2
  138. package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
  139. package/build/components/SideBarTitle/SideBarTitle.mjs +2 -2
  140. package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
  141. package/build/components/UpLinks/UpLinks.js +1 -1
  142. package/build/components/UpLinks/UpLinks.mjs +1 -1
  143. package/build/components/Versions/HistoryList.js +2 -2
  144. package/build/components/Versions/HistoryList.js.map +1 -1
  145. package/build/components/Versions/HistoryList.mjs +2 -2
  146. package/build/components/Versions/HistoryList.mjs.map +1 -1
  147. package/build/components/Versions/Versions.js +22 -21
  148. package/build/components/Versions/Versions.js.map +1 -1
  149. package/build/components/Versions/Versions.mjs +22 -21
  150. package/build/components/Versions/Versions.mjs.map +1 -1
  151. package/build/index.d.ts +1 -0
  152. package/build/index.js +4 -0
  153. package/build/index.mjs +4 -2
  154. package/build/pages/Stage/StageDetail.d.ts +2 -0
  155. package/build/pages/Stage/StageDetail.js +8 -0
  156. package/build/pages/Stage/StageDetail.js.map +1 -0
  157. package/build/pages/Stage/StageDetail.mjs +8 -0
  158. package/build/pages/Stage/StageDetail.mjs.map +1 -0
  159. package/build/pages/Stage/StageList.d.ts +2 -0
  160. package/build/pages/Stage/StageList.js +8 -0
  161. package/build/pages/Stage/StageList.js.map +1 -0
  162. package/build/pages/Stage/StageList.mjs +8 -0
  163. package/build/pages/Stage/StageList.mjs.map +1 -0
  164. package/build/pages/Stage/index.d.ts +2 -0
  165. package/build/pages/Version/Version.js +4 -1
  166. package/build/pages/Version/Version.js.map +1 -1
  167. package/build/pages/Version/Version.mjs +4 -1
  168. package/build/pages/Version/Version.mjs.map +1 -1
  169. package/build/providers/AuthProvider/AuthProvider.js +9 -7
  170. package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
  171. package/build/providers/AuthProvider/AuthProvider.mjs +10 -8
  172. package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
  173. package/build/providers/AuthProvider/utils.d.ts +12 -0
  174. package/build/providers/AuthProvider/utils.js +22 -0
  175. package/build/providers/AuthProvider/utils.js.map +1 -1
  176. package/build/providers/AuthProvider/utils.mjs +21 -2
  177. package/build/providers/AuthProvider/utils.mjs.map +1 -1
  178. package/build/providers/DownloadProvider/DownloadProvider.d.ts +1 -0
  179. package/build/providers/DownloadProvider/DownloadProvider.js +27 -4
  180. package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
  181. package/build/providers/DownloadProvider/DownloadProvider.mjs +27 -6
  182. package/build/providers/DownloadProvider/DownloadProvider.mjs.map +1 -1
  183. package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
  184. package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
  185. package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
  186. package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
  187. package/build/providers/SearchProvider/SearchProvider.d.ts +1 -0
  188. package/build/providers/SearchProvider/SearchProvider.js +8 -6
  189. package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
  190. package/build/providers/SearchProvider/SearchProvider.mjs +8 -6
  191. package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
  192. package/build/providers/TranslatorProvider/TranslatorProvider.js +5 -3
  193. package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
  194. package/build/providers/TranslatorProvider/TranslatorProvider.mjs +5 -3
  195. package/build/providers/TranslatorProvider/TranslatorProvider.mjs.map +1 -1
  196. package/build/providers/VersionProvider/VersionProvider.js +3 -3
  197. package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
  198. package/build/providers/VersionProvider/VersionProvider.mjs +3 -3
  199. package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
  200. package/build/sections/Detail/Tabs.js +1 -1
  201. package/build/sections/Detail/Tabs.mjs +1 -1
  202. package/build/sections/Footer/Footer.js +1 -1
  203. package/build/sections/Footer/Footer.mjs +1 -1
  204. package/build/sections/Header/Header.d.ts +0 -1
  205. package/build/sections/Header/Header.js +16 -14
  206. package/build/sections/Header/Header.js.map +1 -1
  207. package/build/sections/Header/Header.mjs +17 -15
  208. package/build/sections/Header/Header.mjs.map +1 -1
  209. package/build/sections/Header/HeaderGreetings.js +1 -1
  210. package/build/sections/Header/HeaderGreetings.mjs +1 -1
  211. package/build/sections/Header/HeaderMenu.js +26 -7
  212. package/build/sections/Header/HeaderMenu.js.map +1 -1
  213. package/build/sections/Header/HeaderMenu.mjs +26 -7
  214. package/build/sections/Header/HeaderMenu.mjs.map +1 -1
  215. package/build/sections/Header/HeaderRight.js +1 -1
  216. package/build/sections/Header/HeaderRight.mjs +1 -1
  217. package/build/sections/Header/HeaderSettingsDialog.js +1 -1
  218. package/build/sections/Header/HeaderSettingsDialog.mjs +1 -1
  219. package/build/sections/Header/LanguageSwitch.js +1 -1
  220. package/build/sections/Header/LanguageSwitch.mjs +1 -1
  221. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js +1 -1
  222. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs +1 -1
  223. package/build/sections/Home/Home.js +4 -3
  224. package/build/sections/Home/Home.js.map +1 -1
  225. package/build/sections/Home/Home.mjs +5 -4
  226. package/build/sections/Home/Home.mjs.map +1 -1
  227. package/build/sections/Security/AddUser.js +33 -18
  228. package/build/sections/Security/AddUser.js.map +1 -1
  229. package/build/sections/Security/AddUser.mjs +37 -22
  230. package/build/sections/Security/AddUser.mjs.map +1 -1
  231. package/build/sections/Security/ChangePassword.js +17 -15
  232. package/build/sections/Security/ChangePassword.js.map +1 -1
  233. package/build/sections/Security/ChangePassword.mjs +19 -17
  234. package/build/sections/Security/ChangePassword.mjs.map +1 -1
  235. package/build/sections/Security/Login.js +51 -35
  236. package/build/sections/Security/Login.js.map +1 -1
  237. package/build/sections/Security/Login.mjs +54 -38
  238. package/build/sections/Security/Login.mjs.map +1 -1
  239. package/build/sections/Security/Success.js +28 -24
  240. package/build/sections/Security/Success.js.map +1 -1
  241. package/build/sections/Security/Success.mjs +29 -25
  242. package/build/sections/Security/Success.mjs.map +1 -1
  243. package/build/sections/Stage/StageActions.d.ts +15 -0
  244. package/build/sections/Stage/StageActions.js +101 -0
  245. package/build/sections/Stage/StageActions.js.map +1 -0
  246. package/build/sections/Stage/StageActions.mjs +99 -0
  247. package/build/sections/Stage/StageActions.mjs.map +1 -0
  248. package/build/sections/Stage/StageDetail.d.ts +3 -0
  249. package/build/sections/Stage/StageDetail.js +110 -0
  250. package/build/sections/Stage/StageDetail.js.map +1 -0
  251. package/build/sections/Stage/StageDetail.mjs +108 -0
  252. package/build/sections/Stage/StageDetail.mjs.map +1 -0
  253. package/build/sections/Stage/StageList.d.ts +3 -0
  254. package/build/sections/Stage/StageList.js +153 -0
  255. package/build/sections/Stage/StageList.js.map +1 -0
  256. package/build/sections/Stage/StageList.mjs +151 -0
  257. package/build/sections/Stage/StageList.mjs.map +1 -0
  258. package/build/sections/Stage/index.d.ts +6 -0
  259. package/build/sections/Stage/index.js +13 -0
  260. package/build/sections/Stage/index.mjs +6 -0
  261. package/build/sections/Stage/types.d.ts +22 -0
  262. package/build/sections/Stage/useRequireSession.d.ts +14 -0
  263. package/build/sections/Stage/useRequireSession.js +33 -0
  264. package/build/sections/Stage/useRequireSession.js.map +1 -0
  265. package/build/sections/Stage/useRequireSession.mjs +33 -0
  266. package/build/sections/Stage/useRequireSession.mjs.map +1 -0
  267. package/build/sections/Stage/useStage.d.ts +34 -0
  268. package/build/sections/Stage/useStage.js +71 -0
  269. package/build/sections/Stage/useStage.js.map +1 -0
  270. package/build/sections/Stage/useStage.mjs +65 -0
  271. package/build/sections/Stage/useStage.mjs.map +1 -0
  272. package/build/store/api.js +7 -4
  273. package/build/store/api.js.map +1 -1
  274. package/build/store/api.mjs +7 -4
  275. package/build/store/api.mjs.map +1 -1
  276. package/build/types/packageMeta.d.ts +3 -2
  277. package/build/utils/cli-utils.js +2 -2
  278. package/build/utils/cli-utils.js.map +1 -1
  279. package/build/utils/cli-utils.mjs +2 -2
  280. package/build/utils/cli-utils.mjs.map +1 -1
  281. package/build/utils/index.js +1 -0
  282. package/build/utils/index.mjs +2 -2
  283. package/build/utils/routes.d.ts +5 -1
  284. package/build/utils/routes.js +4 -0
  285. package/build/utils/routes.js.map +1 -1
  286. package/build/utils/routes.mjs +4 -0
  287. package/build/utils/routes.mjs.map +1 -1
  288. package/build/utils/schemas.d.ts +1 -0
  289. package/build/utils/schemas.js +4 -4
  290. package/build/utils/schemas.js.map +1 -1
  291. package/build/utils/schemas.mjs +4 -4
  292. package/build/utils/schemas.mjs.map +1 -1
  293. package/build/utils/session-id.d.ts +8 -0
  294. package/build/utils/session-id.js +26 -0
  295. package/build/utils/session-id.js.map +1 -0
  296. package/build/utils/session-id.mjs +26 -0
  297. package/build/utils/session-id.mjs.map +1 -0
  298. package/build/utils/token.d.ts +1 -0
  299. package/build/utils/token.js +12 -8
  300. package/build/utils/token.js.map +1 -1
  301. package/build/utils/token.mjs +12 -9
  302. package/build/utils/token.mjs.map +1 -1
  303. package/build/utils/url.js +1 -1
  304. package/build/utils/url.js.map +1 -1
  305. package/build/utils/url.mjs +1 -1
  306. package/build/utils/url.mjs.map +1 -1
  307. package/build/utils/utils.d.ts +10 -0
  308. package/build/utils/utils.js +26 -0
  309. package/build/utils/utils.js.map +1 -1
  310. package/build/utils/utils.mjs +25 -1
  311. package/build/utils/utils.mjs.map +1 -1
  312. package/package.json +6 -6
@@ -0,0 +1,101 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_useStage = require("./useStage.js");
3
+ let react = require("react");
4
+ react = require_runtime.__toESM(react);
5
+ let react_i18next = require("react-i18next");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let _mui_material = require("@mui/material");
8
+ //#region src/sections/Stage/StageActions.tsx
9
+ /**
10
+ * Approve / reject buttons with a confirmation step.
11
+ *
12
+ * Both actions are irreversible from the UI: approving publishes the version
13
+ * for real, rejecting deletes the staged record and its tarball.
14
+ */
15
+ var StageActions = ({ item, onDone }) => {
16
+ const { t } = (0, react_i18next.useTranslation)();
17
+ const [pending, setPending] = (0, react.useState)(null);
18
+ const [isBusy, setIsBusy] = (0, react.useState)(false);
19
+ const [error, setError] = (0, react.useState)(null);
20
+ const close = (0, react.useCallback)(() => {
21
+ if (!isBusy) {
22
+ setPending(null);
23
+ setError(null);
24
+ }
25
+ }, [isBusy]);
26
+ const confirm = (0, react.useCallback)(async () => {
27
+ if (!pending) return;
28
+ setIsBusy(true);
29
+ setError(null);
30
+ try {
31
+ if (pending === "approve") await require_useStage.approveStagedVersion(item.id);
32
+ else await require_useStage.rejectStagedVersion(item.id);
33
+ setPending(null);
34
+ onDone();
35
+ } catch (err) {
36
+ setError(err?.message ?? t("stage.error.action"));
37
+ } finally {
38
+ setIsBusy(false);
39
+ }
40
+ }, [
41
+ item.id,
42
+ onDone,
43
+ pending,
44
+ t
45
+ ]);
46
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
47
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
48
+ color: "primary",
49
+ "data-testid": `stage-approve-${item.id}`,
50
+ disabled: isBusy,
51
+ onClick: () => setPending("approve"),
52
+ size: "small",
53
+ variant: "outlined",
54
+ children: t("stage.action.approve")
55
+ }),
56
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
57
+ color: "error",
58
+ "data-testid": `stage-reject-${item.id}`,
59
+ disabled: isBusy,
60
+ onClick: () => setPending("reject"),
61
+ size: "small",
62
+ children: t("stage.action.reject")
63
+ }),
64
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Dialog, {
65
+ onClose: close,
66
+ open: pending !== null,
67
+ children: [
68
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.DialogTitle, { children: pending === "approve" ? t("stage.confirm.approveTitle") : t("stage.confirm.rejectTitle") }),
69
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.DialogContent, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.DialogContentText, { children: pending === "approve" ? t("stage.confirm.approveBody", {
70
+ package: item.packageName,
71
+ version: item.version,
72
+ tag: item.tag
73
+ }) : t("stage.confirm.rejectBody", {
74
+ package: item.packageName,
75
+ version: item.version
76
+ }) }), error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
77
+ color: "error",
78
+ marginTop: 2,
79
+ role: "alert",
80
+ children: error
81
+ })] }),
82
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.DialogActions, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
83
+ disabled: isBusy,
84
+ onClick: close,
85
+ children: t("button.cancel")
86
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
87
+ color: pending === "approve" ? "primary" : "error",
88
+ "data-testid": "stage-confirm",
89
+ disabled: isBusy,
90
+ onClick: confirm,
91
+ variant: "contained",
92
+ children: pending === "approve" ? t("stage.action.approve") : t("stage.action.reject")
93
+ })] })
94
+ ]
95
+ })
96
+ ] });
97
+ };
98
+ //#endregion
99
+ exports.default = StageActions;
100
+
101
+ //# sourceMappingURL=StageActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageActions.js","names":[],"sources":["../../../src/sections/Stage/StageActions.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { StagePackageVersion } from './types';\nimport { approveStagedVersion, rejectStagedVersion } from './useStage';\n\ntype PendingAction = 'approve' | 'reject' | null;\n\ninterface Props {\n item: StagePackageVersion;\n /** Called after a successful approve/reject so the caller can refresh. */\n onDone: () => void;\n}\n\n/**\n * Approve / reject buttons with a confirmation step.\n *\n * Both actions are irreversible from the UI: approving publishes the version\n * for real, rejecting deletes the staged record and its tarball.\n */\nconst StageActions: React.FC<Props> = ({ item, onDone }) => {\n const { t } = useTranslation();\n const [pending, setPending] = useState<PendingAction>(null);\n const [isBusy, setIsBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const close = useCallback(() => {\n if (!isBusy) {\n setPending(null);\n setError(null);\n }\n }, [isBusy]);\n\n const confirm = useCallback(async () => {\n if (!pending) {\n return;\n }\n setIsBusy(true);\n setError(null);\n try {\n if (pending === 'approve') {\n await approveStagedVersion(item.id);\n } else {\n await rejectStagedVersion(item.id);\n }\n setPending(null);\n onDone();\n } catch (err: any) {\n // 409 here means the version got published by another route meanwhile,\n // and the staged item is deliberately kept so it can still be inspected\n setError(err?.message ?? t('stage.error.action'));\n } finally {\n setIsBusy(false);\n }\n }, [item.id, onDone, pending, t]);\n\n return (\n <>\n <Button\n color=\"primary\"\n data-testid={`stage-approve-${item.id}`}\n disabled={isBusy}\n onClick={() => setPending('approve')}\n size=\"small\"\n variant=\"outlined\"\n >\n {t('stage.action.approve')}\n </Button>\n <Button\n color=\"error\"\n data-testid={`stage-reject-${item.id}`}\n disabled={isBusy}\n onClick={() => setPending('reject')}\n size=\"small\"\n >\n {t('stage.action.reject')}\n </Button>\n\n <Dialog onClose={close} open={pending !== null}>\n <DialogTitle>\n {pending === 'approve' ? t('stage.confirm.approveTitle') : t('stage.confirm.rejectTitle')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n {pending === 'approve'\n ? t('stage.confirm.approveBody', {\n package: item.packageName,\n version: item.version,\n tag: item.tag,\n })\n : t('stage.confirm.rejectBody', {\n package: item.packageName,\n version: item.version,\n })}\n </DialogContentText>\n {error && (\n <Typography color=\"error\" marginTop={2} role=\"alert\">\n {error}\n </Typography>\n )}\n </DialogContent>\n <DialogActions>\n <Button disabled={isBusy} onClick={close}>\n {t('button.cancel')}\n </Button>\n <Button\n color={pending === 'approve' ? 'primary' : 'error'}\n data-testid=\"stage-confirm\"\n disabled={isBusy}\n onClick={confirm}\n variant=\"contained\"\n >\n {pending === 'approve' ? t('stage.action.approve') : t('stage.action.reject')}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default StageActions;\n"],"mappings":";;;;;;;;;;;;;;AA6BA,IAAM,gBAAiC,EAAE,MAAM,aAAa;CAC1D,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,CAAC,SAAS,eAAA,GAAc,MAAA,SAAA,CAAwB,IAAI;CAC1D,MAAM,CAAC,QAAQ,cAAA,GAAa,MAAA,SAAA,CAAS,KAAK;CAC1C,MAAM,CAAC,OAAO,aAAA,GAAY,MAAA,SAAA,CAAwB,IAAI;CAEtD,MAAM,SAAA,GAAQ,MAAA,YAAA,OAAkB;EAC9B,IAAI,CAAC,QAAQ;GACX,WAAW,IAAI;GACf,SAAS,IAAI;EACf;CACF,GAAG,CAAC,MAAM,CAAC;CAEX,MAAM,WAAA,GAAU,MAAA,YAAA,CAAY,YAAY;EACtC,IAAI,CAAC,SACH;EAEF,UAAU,IAAI;EACd,SAAS,IAAI;EACb,IAAI;GACF,IAAI,YAAY,WACd,MAAM,iBAAA,qBAAqB,KAAK,EAAE;QAElC,MAAM,iBAAA,oBAAoB,KAAK,EAAE;GAEnC,WAAW,IAAI;GACf,OAAO;EACT,SAAS,KAAU;GAGjB,SAAS,KAAK,WAAW,EAAE,oBAAoB,CAAC;EAClD,UAAU;GACR,UAAU,KAAK;EACjB;CACF,GAAG;EAAC,KAAK;EAAI;EAAQ;EAAS;CAAC,CAAC;CAEhC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;GACE,OAAM;GACN,eAAa,iBAAiB,KAAK;GACnC,UAAU;GACV,eAAe,WAAW,SAAS;GACnC,MAAK;GACL,SAAQ;GAEP,UAAA,EAAE,sBAAsB;EACnB,CAAA;EACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;GACE,OAAM;GACN,eAAa,gBAAgB,KAAK;GAClC,UAAU;GACV,eAAe,WAAW,QAAQ;GAClC,MAAK;GAEJ,UAAA,EAAE,qBAAqB;EAClB,CAAA;EAER,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,QAAD;GAAQ,SAAS;GAAO,MAAM,YAAY;GAA1C,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,aAAD,EAAA,UACG,YAAY,YAAY,EAAE,4BAA4B,IAAI,EAAE,2BAA2B,EAC7E,CAAA;IACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,eAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,mBAAD,EAAA,UACG,YAAY,YACT,EAAE,6BAA6B;KAC7B,SAAS,KAAK;KACd,SAAS,KAAK;KACd,KAAK,KAAK;IACZ,CAAC,IACD,EAAE,4BAA4B;KAC5B,SAAS,KAAK;KACd,SAAS,KAAK;IAChB,CAAC,EACY,CAAA,GAClB,SACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,YAAD;KAAY,OAAM;KAAQ,WAAW;KAAG,MAAK;KAC1C,UAAA;IACS,CAAA,CAED,EAAA,CAAA;IACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,eAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;KAAQ,UAAU;KAAQ,SAAS;KAChC,UAAA,EAAE,eAAe;IACZ,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;KACE,OAAO,YAAY,YAAY,YAAY;KAC3C,eAAY;KACZ,UAAU;KACV,SAAS;KACT,SAAQ;KAEP,UAAA,YAAY,YAAY,EAAE,sBAAsB,IAAI,EAAE,qBAAqB;IACtE,CAAA,CACK,EAAA,CAAA;GACT;;CACR,EAAA,CAAA;AAEN"}
@@ -0,0 +1,99 @@
1
+ import { approveStagedVersion, rejectStagedVersion } from "./useStage.mjs";
2
+ import { useCallback, useState } from "react";
3
+ import { useTranslation } from "react-i18next";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
+ import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Typography } from "@mui/material";
6
+ //#region src/sections/Stage/StageActions.tsx
7
+ /**
8
+ * Approve / reject buttons with a confirmation step.
9
+ *
10
+ * Both actions are irreversible from the UI: approving publishes the version
11
+ * for real, rejecting deletes the staged record and its tarball.
12
+ */
13
+ var StageActions = ({ item, onDone }) => {
14
+ const { t } = useTranslation();
15
+ const [pending, setPending] = useState(null);
16
+ const [isBusy, setIsBusy] = useState(false);
17
+ const [error, setError] = useState(null);
18
+ const close = useCallback(() => {
19
+ if (!isBusy) {
20
+ setPending(null);
21
+ setError(null);
22
+ }
23
+ }, [isBusy]);
24
+ const confirm = useCallback(async () => {
25
+ if (!pending) return;
26
+ setIsBusy(true);
27
+ setError(null);
28
+ try {
29
+ if (pending === "approve") await approveStagedVersion(item.id);
30
+ else await rejectStagedVersion(item.id);
31
+ setPending(null);
32
+ onDone();
33
+ } catch (err) {
34
+ setError(err?.message ?? t("stage.error.action"));
35
+ } finally {
36
+ setIsBusy(false);
37
+ }
38
+ }, [
39
+ item.id,
40
+ onDone,
41
+ pending,
42
+ t
43
+ ]);
44
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
45
+ /* @__PURE__ */ jsx(Button, {
46
+ color: "primary",
47
+ "data-testid": `stage-approve-${item.id}`,
48
+ disabled: isBusy,
49
+ onClick: () => setPending("approve"),
50
+ size: "small",
51
+ variant: "outlined",
52
+ children: t("stage.action.approve")
53
+ }),
54
+ /* @__PURE__ */ jsx(Button, {
55
+ color: "error",
56
+ "data-testid": `stage-reject-${item.id}`,
57
+ disabled: isBusy,
58
+ onClick: () => setPending("reject"),
59
+ size: "small",
60
+ children: t("stage.action.reject")
61
+ }),
62
+ /* @__PURE__ */ jsxs(Dialog, {
63
+ onClose: close,
64
+ open: pending !== null,
65
+ children: [
66
+ /* @__PURE__ */ jsx(DialogTitle, { children: pending === "approve" ? t("stage.confirm.approveTitle") : t("stage.confirm.rejectTitle") }),
67
+ /* @__PURE__ */ jsxs(DialogContent, { children: [/* @__PURE__ */ jsx(DialogContentText, { children: pending === "approve" ? t("stage.confirm.approveBody", {
68
+ package: item.packageName,
69
+ version: item.version,
70
+ tag: item.tag
71
+ }) : t("stage.confirm.rejectBody", {
72
+ package: item.packageName,
73
+ version: item.version
74
+ }) }), error && /* @__PURE__ */ jsx(Typography, {
75
+ color: "error",
76
+ marginTop: 2,
77
+ role: "alert",
78
+ children: error
79
+ })] }),
80
+ /* @__PURE__ */ jsxs(DialogActions, { children: [/* @__PURE__ */ jsx(Button, {
81
+ disabled: isBusy,
82
+ onClick: close,
83
+ children: t("button.cancel")
84
+ }), /* @__PURE__ */ jsx(Button, {
85
+ color: pending === "approve" ? "primary" : "error",
86
+ "data-testid": "stage-confirm",
87
+ disabled: isBusy,
88
+ onClick: confirm,
89
+ variant: "contained",
90
+ children: pending === "approve" ? t("stage.action.approve") : t("stage.action.reject")
91
+ })] })
92
+ ]
93
+ })
94
+ ] });
95
+ };
96
+ //#endregion
97
+ export { StageActions as default };
98
+
99
+ //# sourceMappingURL=StageActions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageActions.mjs","names":[],"sources":["../../../src/sections/Stage/StageActions.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { StagePackageVersion } from './types';\nimport { approveStagedVersion, rejectStagedVersion } from './useStage';\n\ntype PendingAction = 'approve' | 'reject' | null;\n\ninterface Props {\n item: StagePackageVersion;\n /** Called after a successful approve/reject so the caller can refresh. */\n onDone: () => void;\n}\n\n/**\n * Approve / reject buttons with a confirmation step.\n *\n * Both actions are irreversible from the UI: approving publishes the version\n * for real, rejecting deletes the staged record and its tarball.\n */\nconst StageActions: React.FC<Props> = ({ item, onDone }) => {\n const { t } = useTranslation();\n const [pending, setPending] = useState<PendingAction>(null);\n const [isBusy, setIsBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const close = useCallback(() => {\n if (!isBusy) {\n setPending(null);\n setError(null);\n }\n }, [isBusy]);\n\n const confirm = useCallback(async () => {\n if (!pending) {\n return;\n }\n setIsBusy(true);\n setError(null);\n try {\n if (pending === 'approve') {\n await approveStagedVersion(item.id);\n } else {\n await rejectStagedVersion(item.id);\n }\n setPending(null);\n onDone();\n } catch (err: any) {\n // 409 here means the version got published by another route meanwhile,\n // and the staged item is deliberately kept so it can still be inspected\n setError(err?.message ?? t('stage.error.action'));\n } finally {\n setIsBusy(false);\n }\n }, [item.id, onDone, pending, t]);\n\n return (\n <>\n <Button\n color=\"primary\"\n data-testid={`stage-approve-${item.id}`}\n disabled={isBusy}\n onClick={() => setPending('approve')}\n size=\"small\"\n variant=\"outlined\"\n >\n {t('stage.action.approve')}\n </Button>\n <Button\n color=\"error\"\n data-testid={`stage-reject-${item.id}`}\n disabled={isBusy}\n onClick={() => setPending('reject')}\n size=\"small\"\n >\n {t('stage.action.reject')}\n </Button>\n\n <Dialog onClose={close} open={pending !== null}>\n <DialogTitle>\n {pending === 'approve' ? t('stage.confirm.approveTitle') : t('stage.confirm.rejectTitle')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n {pending === 'approve'\n ? t('stage.confirm.approveBody', {\n package: item.packageName,\n version: item.version,\n tag: item.tag,\n })\n : t('stage.confirm.rejectBody', {\n package: item.packageName,\n version: item.version,\n })}\n </DialogContentText>\n {error && (\n <Typography color=\"error\" marginTop={2} role=\"alert\">\n {error}\n </Typography>\n )}\n </DialogContent>\n <DialogActions>\n <Button disabled={isBusy} onClick={close}>\n {t('button.cancel')}\n </Button>\n <Button\n color={pending === 'approve' ? 'primary' : 'error'}\n data-testid=\"stage-confirm\"\n disabled={isBusy}\n onClick={confirm}\n variant=\"contained\"\n >\n {pending === 'approve' ? t('stage.action.approve') : t('stage.action.reject')}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default StageActions;\n"],"mappings":";;;;;;;;;;;;AA6BA,IAAM,gBAAiC,EAAE,MAAM,aAAa;CAC1D,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,CAAC,QAAQ;GACX,WAAW,IAAI;GACf,SAAS,IAAI;EACf;CACF,GAAG,CAAC,MAAM,CAAC;CAEX,MAAM,UAAU,YAAY,YAAY;EACtC,IAAI,CAAC,SACH;EAEF,UAAU,IAAI;EACd,SAAS,IAAI;EACb,IAAI;GACF,IAAI,YAAY,WACd,MAAM,qBAAqB,KAAK,EAAE;QAElC,MAAM,oBAAoB,KAAK,EAAE;GAEnC,WAAW,IAAI;GACf,OAAO;EACT,SAAS,KAAU;GAGjB,SAAS,KAAK,WAAW,EAAE,oBAAoB,CAAC;EAClD,UAAU;GACR,UAAU,KAAK;EACjB;CACF,GAAG;EAAC,KAAK;EAAI;EAAQ;EAAS;CAAC,CAAC;CAEhC,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,oBAAC,QAAD;GACE,OAAM;GACN,eAAa,iBAAiB,KAAK;GACnC,UAAU;GACV,eAAe,WAAW,SAAS;GACnC,MAAK;GACL,SAAQ;GAEP,UAAA,EAAE,sBAAsB;EACnB,CAAA;EACR,oBAAC,QAAD;GACE,OAAM;GACN,eAAa,gBAAgB,KAAK;GAClC,UAAU;GACV,eAAe,WAAW,QAAQ;GAClC,MAAK;GAEJ,UAAA,EAAE,qBAAqB;EAClB,CAAA;EAER,qBAAC,QAAD;GAAQ,SAAS;GAAO,MAAM,YAAY;GAA1C,UAAA;IACE,oBAAC,aAAD,EAAA,UACG,YAAY,YAAY,EAAE,4BAA4B,IAAI,EAAE,2BAA2B,EAC7E,CAAA;IACb,qBAAC,eAAD,EAAA,UAAA,CACE,oBAAC,mBAAD,EAAA,UACG,YAAY,YACT,EAAE,6BAA6B;KAC7B,SAAS,KAAK;KACd,SAAS,KAAK;KACd,KAAK,KAAK;IACZ,CAAC,IACD,EAAE,4BAA4B;KAC5B,SAAS,KAAK;KACd,SAAS,KAAK;IAChB,CAAC,EACY,CAAA,GAClB,SACC,oBAAC,YAAD;KAAY,OAAM;KAAQ,WAAW;KAAG,MAAK;KAC1C,UAAA;IACS,CAAA,CAED,EAAA,CAAA;IACf,qBAAC,eAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KAAQ,UAAU;KAAQ,SAAS;KAChC,UAAA,EAAE,eAAe;IACZ,CAAA,GACR,oBAAC,QAAD;KACE,OAAO,YAAY,YAAY,YAAY;KAC3C,eAAY;KACZ,UAAU;KACV,SAAS;KACT,SAAQ;KAEP,UAAA,YAAY,YAAY,EAAE,sBAAsB,IAAI,EAAE,qBAAqB;IACtE,CAAA,CACK,EAAA,CAAA;GACT;;CACR,EAAA,CAAA;AAEN"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const StageDetail: React.FC;
3
+ export default StageDetail;
@@ -0,0 +1,110 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_routes = require("../../utils/routes.js");
3
+ require("../../utils/index.js");
4
+ const require_useStage = require("./useStage.js");
5
+ const require_StageActions = require("./StageActions.js");
6
+ const require_useRequireSession = require("./useRequireSession.js");
7
+ let react = require("react");
8
+ react = require_runtime.__toESM(react);
9
+ let react_i18next = require("react-i18next");
10
+ let react_jsx_runtime = require("react/jsx-runtime");
11
+ let react_router = require("react-router");
12
+ let _mui_material = require("@mui/material");
13
+ //#region src/sections/Stage/StageDetail.tsx
14
+ var StageDetail = () => {
15
+ const { t } = (0, react_i18next.useTranslation)();
16
+ const navigate = (0, react_router.useNavigate)();
17
+ const { stageId } = (0, react_router.useParams)();
18
+ const isLoggedIn = require_useRequireSession.useRequireSession();
19
+ const { data, error, isLoading } = require_useStage.useStageItem(stageId);
20
+ const handleDownload = (0, react.useCallback)(async () => {
21
+ if (data) await require_useStage.downloadStagedTarball(data);
22
+ }, [data]);
23
+ if (!isLoggedIn) return null;
24
+ if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
25
+ display: "flex",
26
+ justifyContent: "center",
27
+ padding: 4,
28
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.CircularProgress, {})
29
+ });
30
+ if (error || !data) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
31
+ padding: 2,
32
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
33
+ color: "error",
34
+ role: "alert",
35
+ children: t("stage.error.notFound")
36
+ })
37
+ });
38
+ const rows = [
39
+ [t("stage.column.package"), data.packageName],
40
+ [t("stage.column.version"), data.version],
41
+ [t("stage.column.tag"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Chip, {
42
+ label: data.tag,
43
+ size: "small"
44
+ }, "tag")],
45
+ [t("stage.column.stagedBy"), `${data.actor} (${data.actorType})`],
46
+ [t("stage.column.date"), new Date(data.createdAt).toLocaleString()],
47
+ [t("stage.column.access"), data.access],
48
+ [t("stage.column.shasum"), data.shasum]
49
+ ];
50
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Box, {
51
+ padding: 2,
52
+ children: [
53
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
54
+ onClick: () => navigate(require_routes.Route.STAGE),
55
+ size: "small",
56
+ children: t("stage.backToList")
57
+ }),
58
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Typography, {
59
+ component: "h1",
60
+ gutterBottom: true,
61
+ variant: "h5",
62
+ children: [
63
+ data.packageName,
64
+ "@",
65
+ data.version
66
+ ]
67
+ }),
68
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Paper, {
69
+ sx: {
70
+ marginTop: 2,
71
+ overflowX: "auto"
72
+ },
73
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Table, {
74
+ "data-testid": "stage-detail",
75
+ size: "small",
76
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableBody, { children: rows.map(([label, value]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.TableRow, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, {
77
+ component: "th",
78
+ scope: "row",
79
+ sx: {
80
+ fontWeight: 600,
81
+ width: "30%"
82
+ },
83
+ children: label
84
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, {
85
+ sx: { wordBreak: "break-all" },
86
+ children: value
87
+ })] }, label)) })
88
+ })
89
+ }),
90
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Box, {
91
+ display: "flex",
92
+ gap: 1,
93
+ marginTop: 2,
94
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
95
+ onClick: handleDownload,
96
+ size: "small",
97
+ variant: "outlined",
98
+ children: t("stage.action.download")
99
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_StageActions.default, {
100
+ item: data,
101
+ onDone: () => navigate(require_routes.Route.STAGE)
102
+ })]
103
+ })
104
+ ]
105
+ });
106
+ };
107
+ //#endregion
108
+ exports.default = StageDetail;
109
+
110
+ //# sourceMappingURL=StageDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageDetail.js","names":[],"sources":["../../../src/sections/Stage/StageDetail.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { downloadStagedTarball, useStageItem } from './useStage';\nimport { useRequireSession } from './useRequireSession';\n\nconst StageDetail: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { stageId } = useParams<{ stageId: string }>();\n const isLoggedIn = useRequireSession();\n const { data, error, isLoading } = useStageItem(stageId);\n\n const handleDownload = useCallback(async () => {\n if (data) {\n await downloadStagedTarball(data);\n }\n }, [data]);\n\n if (!isLoggedIn) {\n return null;\n }\n\n if (isLoading) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" padding={4}>\n <CircularProgress />\n </Box>\n );\n }\n\n if (error || !data) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.notFound')}\n </Typography>\n </Box>\n );\n }\n\n const rows: [string, React.ReactNode][] = [\n [t('stage.column.package'), data.packageName],\n [t('stage.column.version'), data.version],\n [t('stage.column.tag'), <Chip key=\"tag\" label={data.tag} size=\"small\" />],\n [t('stage.column.stagedBy'), `${data.actor} (${data.actorType})`],\n [t('stage.column.date'), new Date(data.createdAt).toLocaleString()],\n [t('stage.column.access'), data.access],\n [t('stage.column.shasum'), data.shasum],\n ];\n\n return (\n <Box padding={2}>\n <Button onClick={() => navigate(Route.STAGE)} size=\"small\">\n {t('stage.backToList')}\n </Button>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {data.packageName}@{data.version}\n </Typography>\n\n <Paper sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table data-testid=\"stage-detail\" size=\"small\">\n <TableBody>\n {rows.map(([label, value]) => (\n <TableRow key={label}>\n <TableCell component=\"th\" scope=\"row\" sx={{ fontWeight: 600, width: '30%' }}>\n {label}\n </TableCell>\n <TableCell sx={{ wordBreak: 'break-all' }}>{value}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Paper>\n\n <Box display=\"flex\" gap={1} marginTop={2}>\n <Button onClick={handleDownload} size=\"small\" variant=\"outlined\">\n {t('stage.action.download')}\n </Button>\n <StageActions item={data} onDone={() => navigate(Route.STAGE)} />\n </Box>\n </Box>\n );\n};\n\nexport default StageDetail;\n"],"mappings":";;;;;;;;;;;;;AAqBA,IAAM,oBAA8B;CAClC,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,EAAE,aAAA,GAAY,aAAA,UAAA,CAA+B;CACnD,MAAM,aAAa,0BAAA,kBAAkB;CACrC,MAAM,EAAE,MAAM,OAAO,cAAc,iBAAA,aAAa,OAAO;CAEvD,MAAM,kBAAA,GAAiB,MAAA,YAAA,CAAY,YAAY;EAC7C,IAAI,MACF,MAAM,iBAAA,sBAAsB,IAAI;CAEpC,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,CAAC,YACH,OAAO;CAGT,IAAI,WACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,KAAD;EAAK,SAAQ;EAAO,gBAAe;EAAS,SAAS;EACnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,kBAAD,CAAmB,CAAA;CAChB,CAAA;CAIT,IAAI,SAAS,CAAC,MACZ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,KAAD;EAAK,SAAS;EACZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,YAAD;GAAY,OAAM;GAAQ,MAAK;GAC5B,UAAA,EAAE,sBAAsB;EACf,CAAA;CACT,CAAA;CAIT,MAAM,OAAoC;EACxC,CAAC,EAAE,sBAAsB,GAAG,KAAK,WAAW;EAC5C,CAAC,EAAE,sBAAsB,GAAG,KAAK,OAAO;EACxC,CAAC,EAAE,kBAAkB,GAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,MAAD;GAAgB,OAAO,KAAK;GAAK,MAAK;EAAS,GAArC,KAAqC,CAAC;EACxE,CAAC,EAAE,uBAAuB,GAAG,GAAG,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;EAChE,CAAC,EAAE,mBAAmB,GAAG,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,eAAe,CAAC;EAClE,CAAC,EAAE,qBAAqB,GAAG,KAAK,MAAM;EACtC,CAAC,EAAE,qBAAqB,GAAG,KAAK,MAAM;CACxC;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,KAAD;EAAK,SAAS;EAAd,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;IAAQ,eAAe,SAAS,eAAA,MAAM,KAAK;IAAG,MAAK;IAChD,UAAA,EAAE,kBAAkB;GACf,CAAA;GACR,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,YAAD;IAAY,WAAU;IAAK,cAAc;IAAM,SAAQ;IAAvD,UAAA;KACG,KAAK;KAAY;KAAE,KAAK;IACf;;GAEZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,OAAD;IAAO,IAAI;KAAE,WAAW;KAAG,WAAW;IAAO;IAC3C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,OAAD;KAAO,eAAY;KAAe,MAAK;KACrC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,WAAD,EAAA,UACG,KAAK,KAAK,CAAC,OAAO,WACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,UAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,WAAD;MAAW,WAAU;MAAK,OAAM;MAAM,IAAI;OAAE,YAAY;OAAK,OAAO;MAAM;MACvE,UAAA;KACQ,CAAA,GACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,WAAD;MAAW,IAAI,EAAE,WAAW,YAAY;MAAI,UAAA;KAAiB,CAAA,CACrD,EAAA,GALK,KAKL,CACX,EACQ,CAAA;IACN,CAAA;GACF,CAAA;GAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,KAAD;IAAK,SAAQ;IAAO,KAAK;IAAG,WAAW;IAAvC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;KAAQ,SAAS;KAAgB,MAAK;KAAQ,SAAQ;KACnD,UAAA,EAAE,uBAAuB;IACpB,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAA,SAAD;KAAc,MAAM;KAAM,cAAc,SAAS,eAAA,MAAM,KAAK;IAAI,CAAA,CAC7D;;EACF;;AAET"}
@@ -0,0 +1,108 @@
1
+ import { Route as Route$1 } from "../../utils/routes.mjs";
2
+ import "../../utils/index.mjs";
3
+ import { downloadStagedTarball, useStageItem } from "./useStage.mjs";
4
+ import StageActions from "./StageActions.mjs";
5
+ import { useRequireSession } from "./useRequireSession.mjs";
6
+ import { useCallback } from "react";
7
+ import { useTranslation } from "react-i18next";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { useNavigate, useParams } from "react-router";
10
+ import { Box, Button, Chip, CircularProgress, Paper, Table, TableBody, TableCell, TableRow, Typography } from "@mui/material";
11
+ //#region src/sections/Stage/StageDetail.tsx
12
+ var StageDetail = () => {
13
+ const { t } = useTranslation();
14
+ const navigate = useNavigate();
15
+ const { stageId } = useParams();
16
+ const isLoggedIn = useRequireSession();
17
+ const { data, error, isLoading } = useStageItem(stageId);
18
+ const handleDownload = useCallback(async () => {
19
+ if (data) await downloadStagedTarball(data);
20
+ }, [data]);
21
+ if (!isLoggedIn) return null;
22
+ if (isLoading) return /* @__PURE__ */ jsx(Box, {
23
+ display: "flex",
24
+ justifyContent: "center",
25
+ padding: 4,
26
+ children: /* @__PURE__ */ jsx(CircularProgress, {})
27
+ });
28
+ if (error || !data) return /* @__PURE__ */ jsx(Box, {
29
+ padding: 2,
30
+ children: /* @__PURE__ */ jsx(Typography, {
31
+ color: "error",
32
+ role: "alert",
33
+ children: t("stage.error.notFound")
34
+ })
35
+ });
36
+ const rows = [
37
+ [t("stage.column.package"), data.packageName],
38
+ [t("stage.column.version"), data.version],
39
+ [t("stage.column.tag"), /* @__PURE__ */ jsx(Chip, {
40
+ label: data.tag,
41
+ size: "small"
42
+ }, "tag")],
43
+ [t("stage.column.stagedBy"), `${data.actor} (${data.actorType})`],
44
+ [t("stage.column.date"), new Date(data.createdAt).toLocaleString()],
45
+ [t("stage.column.access"), data.access],
46
+ [t("stage.column.shasum"), data.shasum]
47
+ ];
48
+ return /* @__PURE__ */ jsxs(Box, {
49
+ padding: 2,
50
+ children: [
51
+ /* @__PURE__ */ jsx(Button, {
52
+ onClick: () => navigate(Route$1.STAGE),
53
+ size: "small",
54
+ children: t("stage.backToList")
55
+ }),
56
+ /* @__PURE__ */ jsxs(Typography, {
57
+ component: "h1",
58
+ gutterBottom: true,
59
+ variant: "h5",
60
+ children: [
61
+ data.packageName,
62
+ "@",
63
+ data.version
64
+ ]
65
+ }),
66
+ /* @__PURE__ */ jsx(Paper, {
67
+ sx: {
68
+ marginTop: 2,
69
+ overflowX: "auto"
70
+ },
71
+ children: /* @__PURE__ */ jsx(Table, {
72
+ "data-testid": "stage-detail",
73
+ size: "small",
74
+ children: /* @__PURE__ */ jsx(TableBody, { children: rows.map(([label, value]) => /* @__PURE__ */ jsxs(TableRow, { children: [/* @__PURE__ */ jsx(TableCell, {
75
+ component: "th",
76
+ scope: "row",
77
+ sx: {
78
+ fontWeight: 600,
79
+ width: "30%"
80
+ },
81
+ children: label
82
+ }), /* @__PURE__ */ jsx(TableCell, {
83
+ sx: { wordBreak: "break-all" },
84
+ children: value
85
+ })] }, label)) })
86
+ })
87
+ }),
88
+ /* @__PURE__ */ jsxs(Box, {
89
+ display: "flex",
90
+ gap: 1,
91
+ marginTop: 2,
92
+ children: [/* @__PURE__ */ jsx(Button, {
93
+ onClick: handleDownload,
94
+ size: "small",
95
+ variant: "outlined",
96
+ children: t("stage.action.download")
97
+ }), /* @__PURE__ */ jsx(StageActions, {
98
+ item: data,
99
+ onDone: () => navigate(Route$1.STAGE)
100
+ })]
101
+ })
102
+ ]
103
+ });
104
+ };
105
+ //#endregion
106
+ export { StageDetail as default };
107
+
108
+ //# sourceMappingURL=StageDetail.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageDetail.mjs","names":[],"sources":["../../../src/sections/Stage/StageDetail.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { downloadStagedTarball, useStageItem } from './useStage';\nimport { useRequireSession } from './useRequireSession';\n\nconst StageDetail: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { stageId } = useParams<{ stageId: string }>();\n const isLoggedIn = useRequireSession();\n const { data, error, isLoading } = useStageItem(stageId);\n\n const handleDownload = useCallback(async () => {\n if (data) {\n await downloadStagedTarball(data);\n }\n }, [data]);\n\n if (!isLoggedIn) {\n return null;\n }\n\n if (isLoading) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" padding={4}>\n <CircularProgress />\n </Box>\n );\n }\n\n if (error || !data) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.notFound')}\n </Typography>\n </Box>\n );\n }\n\n const rows: [string, React.ReactNode][] = [\n [t('stage.column.package'), data.packageName],\n [t('stage.column.version'), data.version],\n [t('stage.column.tag'), <Chip key=\"tag\" label={data.tag} size=\"small\" />],\n [t('stage.column.stagedBy'), `${data.actor} (${data.actorType})`],\n [t('stage.column.date'), new Date(data.createdAt).toLocaleString()],\n [t('stage.column.access'), data.access],\n [t('stage.column.shasum'), data.shasum],\n ];\n\n return (\n <Box padding={2}>\n <Button onClick={() => navigate(Route.STAGE)} size=\"small\">\n {t('stage.backToList')}\n </Button>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {data.packageName}@{data.version}\n </Typography>\n\n <Paper sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table data-testid=\"stage-detail\" size=\"small\">\n <TableBody>\n {rows.map(([label, value]) => (\n <TableRow key={label}>\n <TableCell component=\"th\" scope=\"row\" sx={{ fontWeight: 600, width: '30%' }}>\n {label}\n </TableCell>\n <TableCell sx={{ wordBreak: 'break-all' }}>{value}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Paper>\n\n <Box display=\"flex\" gap={1} marginTop={2}>\n <Button onClick={handleDownload} size=\"small\" variant=\"outlined\">\n {t('stage.action.download')}\n </Button>\n <StageActions item={data} onDone={() => navigate(Route.STAGE)} />\n </Box>\n </Box>\n );\n};\n\nexport default StageDetail;\n"],"mappings":";;;;;;;;;;;AAqBA,IAAM,oBAA8B;CAClC,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,YAAY,UAA+B;CACnD,MAAM,aAAa,kBAAkB;CACrC,MAAM,EAAE,MAAM,OAAO,cAAc,aAAa,OAAO;CAEvD,MAAM,iBAAiB,YAAY,YAAY;EAC7C,IAAI,MACF,MAAM,sBAAsB,IAAI;CAEpC,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,CAAC,YACH,OAAO;CAGT,IAAI,WACF,OACE,oBAAC,KAAD;EAAK,SAAQ;EAAO,gBAAe;EAAS,SAAS;EACnD,UAAA,oBAAC,kBAAD,CAAmB,CAAA;CAChB,CAAA;CAIT,IAAI,SAAS,CAAC,MACZ,OACE,oBAAC,KAAD;EAAK,SAAS;EACZ,UAAA,oBAAC,YAAD;GAAY,OAAM;GAAQ,MAAK;GAC5B,UAAA,EAAE,sBAAsB;EACf,CAAA;CACT,CAAA;CAIT,MAAM,OAAoC;EACxC,CAAC,EAAE,sBAAsB,GAAG,KAAK,WAAW;EAC5C,CAAC,EAAE,sBAAsB,GAAG,KAAK,OAAO;EACxC,CAAC,EAAE,kBAAkB,GAAG,oBAAC,MAAD;GAAgB,OAAO,KAAK;GAAK,MAAK;EAAS,GAArC,KAAqC,CAAC;EACxE,CAAC,EAAE,uBAAuB,GAAG,GAAG,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;EAChE,CAAC,EAAE,mBAAmB,GAAG,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,eAAe,CAAC;EAClE,CAAC,EAAE,qBAAqB,GAAG,KAAK,MAAM;EACtC,CAAC,EAAE,qBAAqB,GAAG,KAAK,MAAM;CACxC;CAEA,OACE,qBAAC,KAAD;EAAK,SAAS;EAAd,UAAA;GACE,oBAAC,QAAD;IAAQ,eAAe,SAAS,QAAM,KAAK;IAAG,MAAK;IAChD,UAAA,EAAE,kBAAkB;GACf,CAAA;GACR,qBAAC,YAAD;IAAY,WAAU;IAAK,cAAc;IAAM,SAAQ;IAAvD,UAAA;KACG,KAAK;KAAY;KAAE,KAAK;IACf;;GAEZ,oBAAC,OAAD;IAAO,IAAI;KAAE,WAAW;KAAG,WAAW;IAAO;IAC3C,UAAA,oBAAC,OAAD;KAAO,eAAY;KAAe,MAAK;KACrC,UAAA,oBAAC,WAAD,EAAA,UACG,KAAK,KAAK,CAAC,OAAO,WACjB,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,WAAD;MAAW,WAAU;MAAK,OAAM;MAAM,IAAI;OAAE,YAAY;OAAK,OAAO;MAAM;MACvE,UAAA;KACQ,CAAA,GACX,oBAAC,WAAD;MAAW,IAAI,EAAE,WAAW,YAAY;MAAI,UAAA;KAAiB,CAAA,CACrD,EAAA,GALK,KAKL,CACX,EACQ,CAAA;IACN,CAAA;GACF,CAAA;GAEP,qBAAC,KAAD;IAAK,SAAQ;IAAO,KAAK;IAAG,WAAW;IAAvC,UAAA,CACE,oBAAC,QAAD;KAAQ,SAAS;KAAgB,MAAK;KAAQ,SAAQ;KACnD,UAAA,EAAE,uBAAuB;IACpB,CAAA,GACR,oBAAC,cAAD;KAAc,MAAM;KAAM,cAAc,SAAS,QAAM,KAAK;IAAI,CAAA,CAC7D;;EACF;;AAET"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const StageList: React.FC;
3
+ export default StageList;
@@ -0,0 +1,153 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_routes = require("../../utils/routes.js");
3
+ require("../../utils/index.js");
4
+ const require_useStage = require("./useStage.js");
5
+ const require_StageActions = require("./StageActions.js");
6
+ const require_useRequireSession = require("./useRequireSession.js");
7
+ let react = require("react");
8
+ react = require_runtime.__toESM(react);
9
+ let react_i18next = require("react-i18next");
10
+ let react_jsx_runtime = require("react/jsx-runtime");
11
+ let react_router = require("react-router");
12
+ let _mui_material = require("@mui/material");
13
+ //#region src/sections/Stage/StageList.tsx
14
+ var StageList = () => {
15
+ const { t } = (0, react_i18next.useTranslation)();
16
+ const navigate = (0, react_router.useNavigate)();
17
+ const isLoggedIn = require_useRequireSession.useRequireSession();
18
+ const [page, setPage] = (0, react.useState)(0);
19
+ const [perPage, setPerPage] = (0, react.useState)(10);
20
+ const [actionError, setActionError] = (0, react.useState)(false);
21
+ const { data, error, isLoading, mutate } = require_useStage.useStageList(page, perPage);
22
+ const handleDownload = (0, react.useCallback)(async (item) => {
23
+ try {
24
+ setActionError(false);
25
+ await require_useStage.downloadStagedTarball(item);
26
+ } catch (err) {
27
+ console.error("Error downloading staged tarball:", err);
28
+ setActionError(true);
29
+ }
30
+ }, []);
31
+ if (!isLoggedIn) return null;
32
+ if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
33
+ display: "flex",
34
+ justifyContent: "center",
35
+ padding: 4,
36
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.CircularProgress, {})
37
+ });
38
+ if (error) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
39
+ padding: 2,
40
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
41
+ color: "error",
42
+ role: "alert",
43
+ children: t("stage.error.list")
44
+ })
45
+ });
46
+ const items = data?.items ?? [];
47
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Box, {
48
+ padding: 2,
49
+ children: [
50
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
51
+ component: "h1",
52
+ gutterBottom: true,
53
+ variant: "h5",
54
+ children: t("stage.title")
55
+ }),
56
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
57
+ color: "text.secondary",
58
+ gutterBottom: true,
59
+ variant: "body2",
60
+ children: t("stage.description")
61
+ }),
62
+ actionError && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
63
+ color: "error",
64
+ role: "alert",
65
+ variant: "body2",
66
+ children: t("stage.error.action")
67
+ }),
68
+ items.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
69
+ color: "text.secondary",
70
+ marginTop: 2,
71
+ children: t("stage.empty")
72
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.TableContainer, {
73
+ component: _mui_material.Paper,
74
+ sx: {
75
+ marginTop: 2,
76
+ overflowX: "auto"
77
+ },
78
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Table, {
79
+ "aria-label": t("stage.title"),
80
+ "data-testid": "stage-table",
81
+ size: "small",
82
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableHead, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.TableRow, { children: [
83
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: t("stage.column.package") }),
84
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: t("stage.column.version") }),
85
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: t("stage.column.tag") }),
86
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: t("stage.column.stagedBy") }),
87
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: t("stage.column.date") }),
88
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, {
89
+ align: "right",
90
+ children: t("stage.column.actions")
91
+ })
92
+ ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableBody, { children: items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.TableRow, {
93
+ "data-testid": `stage-row-${item.id}`,
94
+ hover: true,
95
+ children: [
96
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
97
+ onClick: () => navigate(require_routes.Route.STAGE_DETAIL.replace(":stageId", item.id)),
98
+ size: "small",
99
+ sx: { textTransform: "none" },
100
+ children: item.packageName
101
+ }) }),
102
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: item.version }),
103
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Chip, {
104
+ label: item.tag,
105
+ size: "small"
106
+ }) }),
107
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: item.actor }),
108
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, { children: new Date(item.createdAt).toLocaleString() }),
109
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TableCell, {
110
+ align: "right",
111
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Box, {
112
+ alignItems: "center",
113
+ display: "flex",
114
+ gap: 1,
115
+ justifyContent: "flex-end",
116
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
117
+ "data-testid": `stage-download-${item.id}`,
118
+ onClick: () => handleDownload(item),
119
+ size: "small",
120
+ children: t("stage.action.download")
121
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_StageActions.default, {
122
+ item,
123
+ onDone: () => mutate()
124
+ })]
125
+ })
126
+ })
127
+ ]
128
+ }, item.id)) })]
129
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TablePagination, {
130
+ component: "div",
131
+ count: data?.total ?? 0,
132
+ onPageChange: (_event, nextPage) => setPage(nextPage),
133
+ onRowsPerPageChange: (event) => {
134
+ setPerPage(Number.parseInt(event.target.value, 10));
135
+ setPage(0);
136
+ },
137
+ page,
138
+ rowsPerPage: perPage,
139
+ rowsPerPageOptions: [
140
+ 10,
141
+ 25,
142
+ 50,
143
+ 100
144
+ ]
145
+ })]
146
+ })
147
+ ]
148
+ });
149
+ };
150
+ //#endregion
151
+ exports.default = StageList;
152
+
153
+ //# sourceMappingURL=StageList.js.map