@verdaccio/ui-components 5.0.0-next-9.20 → 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.
- package/build/api/use-data-mutation.js +1 -4
- package/build/api/use-data-mutation.js.map +1 -1
- package/build/api/use-data-mutation.mjs +1 -4
- package/build/api/use-data-mutation.mjs.map +1 -1
- package/build/api/use-data.d.ts +1 -0
- package/build/api/use-data.js +3 -2
- package/build/api/use-data.js.map +1 -1
- package/build/api/use-data.mjs +3 -3
- package/build/api/use-data.mjs.map +1 -1
- package/build/components/ActionBar/ActionBar.js +4 -2
- package/build/components/ActionBar/ActionBar.js.map +1 -1
- package/build/components/ActionBar/ActionBar.mjs +4 -2
- package/build/components/ActionBar/ActionBar.mjs.map +1 -1
- package/build/components/ActionBar/ActionBarAction.js +1 -1
- package/build/components/ActionBar/ActionBarAction.mjs +1 -1
- package/build/components/Author/Author.js +1 -1
- package/build/components/Author/Author.mjs +1 -1
- package/build/components/CopyClipboard/CopyToClipBoard.js +5 -0
- package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
- package/build/components/CopyClipboard/CopyToClipBoard.mjs +5 -0
- package/build/components/CopyClipboard/CopyToClipBoard.mjs.map +1 -1
- package/build/components/CopyClipboard/utils.js +14 -1
- package/build/components/CopyClipboard/utils.js.map +1 -1
- package/build/components/CopyClipboard/utils.mjs +14 -1
- package/build/components/CopyClipboard/utils.mjs.map +1 -1
- package/build/components/Dependencies/Dependencies.js +2 -1
- package/build/components/Dependencies/Dependencies.js.map +1 -1
- package/build/components/Dependencies/Dependencies.mjs +2 -1
- package/build/components/Dependencies/Dependencies.mjs.map +1 -1
- package/build/components/Dependencies/DependencyBlock.js +1 -1
- package/build/components/Dependencies/DependencyBlock.mjs +1 -1
- package/build/components/Developers/Title.js +1 -1
- package/build/components/Developers/Title.mjs +1 -1
- package/build/components/Developers/get-unique-developer-values.js +2 -1
- package/build/components/Developers/get-unique-developer-values.js.map +1 -1
- package/build/components/Developers/get-unique-developer-values.mjs +2 -1
- package/build/components/Developers/get-unique-developer-values.mjs.map +1 -1
- package/build/components/Distribution/Dist.js +3 -3
- package/build/components/Distribution/Dist.js.map +1 -1
- package/build/components/Distribution/Dist.mjs +3 -3
- package/build/components/Distribution/Dist.mjs.map +1 -1
- package/build/components/Engines/Engines.js +1 -1
- package/build/components/Engines/Engines.mjs +1 -1
- package/build/components/Forbidden/Forbidden.js +1 -1
- package/build/components/Forbidden/Forbidden.mjs +1 -1
- package/build/components/FundButton/FundButton.js +4 -3
- package/build/components/FundButton/FundButton.js.map +1 -1
- package/build/components/FundButton/FundButton.mjs +4 -3
- package/build/components/FundButton/FundButton.mjs.map +1 -1
- package/build/components/GenericError/GenericError.d.ts +3 -0
- package/build/components/GenericError/GenericError.js +60 -0
- package/build/components/GenericError/GenericError.js.map +1 -0
- package/build/components/GenericError/GenericError.mjs +54 -0
- package/build/components/GenericError/GenericError.mjs.map +1 -0
- package/build/components/GenericError/index.d.ts +1 -0
- package/build/components/GenericError/index.js +2 -0
- package/build/components/GenericError/index.mjs +2 -0
- package/build/components/Help/Help.js +1 -1
- package/build/components/Help/Help.mjs +1 -1
- package/build/components/Install/Install.js +1 -1
- package/build/components/Install/Install.mjs +1 -1
- package/build/components/Install/InstallListItem.js +2 -2
- package/build/components/Install/InstallListItem.js.map +1 -1
- package/build/components/Install/InstallListItem.mjs +2 -2
- package/build/components/Install/InstallListItem.mjs.map +1 -1
- package/build/components/Keywords/KeywordListItems.js +1 -1
- package/build/components/Keywords/KeywordListItems.js.map +1 -1
- package/build/components/Keywords/KeywordListItems.mjs +1 -1
- package/build/components/Keywords/KeywordListItems.mjs.map +1 -1
- package/build/components/Keywords/Keywords.js +2 -2
- package/build/components/Keywords/Keywords.js.map +1 -1
- package/build/components/Keywords/Keywords.mjs +2 -2
- package/build/components/Keywords/Keywords.mjs.map +1 -1
- package/build/components/LoginDialog/LoginDialogCloseButton.js +1 -1
- package/build/components/LoginDialog/LoginDialogCloseButton.mjs +1 -1
- package/build/components/LoginDialog/LoginDialogForm.js +2 -1
- package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
- package/build/components/LoginDialog/LoginDialogForm.mjs +2 -1
- package/build/components/LoginDialog/LoginDialogForm.mjs.map +1 -1
- package/build/components/LoginForm/Login.d.ts +1 -0
- package/build/components/LoginForm/Login.js +6 -4
- package/build/components/LoginForm/Login.js.map +1 -1
- package/build/components/LoginForm/Login.mjs +9 -7
- package/build/components/LoginForm/Login.mjs.map +1 -1
- package/build/components/LoginForm/PasswordField.js +4 -6
- package/build/components/LoginForm/PasswordField.js.map +1 -1
- package/build/components/LoginForm/PasswordField.mjs +4 -6
- package/build/components/LoginForm/PasswordField.mjs.map +1 -1
- package/build/components/LoginForm/UsernameField.js +4 -6
- package/build/components/LoginForm/UsernameField.js.map +1 -1
- package/build/components/LoginForm/UsernameField.mjs +4 -6
- package/build/components/LoginForm/UsernameField.mjs.map +1 -1
- package/build/components/LoginForm/styles.js +1 -1
- package/build/components/LoginForm/styles.mjs +1 -1
- package/build/components/LoginForm/useLoginForm.js +13 -3
- package/build/components/LoginForm/useLoginForm.js.map +1 -1
- package/build/components/LoginForm/useLoginForm.mjs +14 -4
- package/build/components/LoginForm/useLoginForm.mjs.map +1 -1
- package/build/components/NoItems/NoItems.js +2 -2
- package/build/components/NoItems/NoItems.mjs +1 -1
- package/build/components/NotFound/NotFound.js +1 -1
- package/build/components/NotFound/NotFound.mjs +1 -1
- package/build/components/Package/Package.d.ts +1 -1
- package/build/components/Package/Package.js +28 -29
- package/build/components/Package/Package.js.map +1 -1
- package/build/components/Package/Package.mjs +29 -30
- package/build/components/Package/Package.mjs.map +1 -1
- package/build/components/Person/Person.js +1 -1
- package/build/components/Person/Person.js.map +1 -1
- package/build/components/Person/Person.mjs +1 -1
- package/build/components/Person/Person.mjs.map +1 -1
- package/build/components/RawViewer/RawViewer.js +1 -1
- package/build/components/RawViewer/RawViewer.mjs +1 -1
- package/build/components/RegistryInfoDialog/RegistryInfoDialog.js +1 -1
- package/build/components/RegistryInfoDialog/RegistryInfoDialog.mjs +1 -1
- package/build/components/Repository/Repository.js +5 -8
- package/build/components/Repository/Repository.js.map +1 -1
- package/build/components/Repository/Repository.mjs +5 -8
- package/build/components/Repository/Repository.mjs.map +1 -1
- package/build/components/Search/AutoComplete/AutoComplete.d.ts +1 -0
- package/build/components/Search/AutoComplete/AutoComplete.js +4 -4
- package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
- package/build/components/Search/AutoComplete/AutoComplete.mjs +4 -4
- package/build/components/Search/AutoComplete/AutoComplete.mjs.map +1 -1
- package/build/components/Search/Search.js +12 -4
- package/build/components/Search/Search.js.map +1 -1
- package/build/components/Search/Search.mjs +13 -5
- package/build/components/Search/Search.mjs.map +1 -1
- package/build/components/Search/SearchItem.js +1 -1
- package/build/components/Search/SearchItem.mjs +1 -1
- package/build/components/SettingsMenu/SettingsMenu.js +1 -1
- package/build/components/SettingsMenu/SettingsMenu.mjs +1 -1
- package/build/components/SideBarTitle/SideBarTitle.js +2 -2
- package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
- package/build/components/SideBarTitle/SideBarTitle.mjs +2 -2
- package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
- package/build/components/UpLinks/UpLinks.js +1 -1
- package/build/components/UpLinks/UpLinks.mjs +1 -1
- package/build/components/Versions/HistoryList.js +2 -2
- package/build/components/Versions/HistoryList.js.map +1 -1
- package/build/components/Versions/HistoryList.mjs +2 -2
- package/build/components/Versions/HistoryList.mjs.map +1 -1
- package/build/components/Versions/Versions.js +22 -21
- package/build/components/Versions/Versions.js.map +1 -1
- package/build/components/Versions/Versions.mjs +22 -21
- package/build/components/Versions/Versions.mjs.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +4 -0
- package/build/index.mjs +4 -2
- package/build/pages/Version/Version.js +4 -1
- package/build/pages/Version/Version.js.map +1 -1
- package/build/pages/Version/Version.mjs +4 -1
- package/build/pages/Version/Version.mjs.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.js +9 -7
- package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.mjs +10 -8
- package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
- package/build/providers/AuthProvider/utils.d.ts +12 -0
- package/build/providers/AuthProvider/utils.js +22 -0
- package/build/providers/AuthProvider/utils.js.map +1 -1
- package/build/providers/AuthProvider/utils.mjs +21 -2
- package/build/providers/AuthProvider/utils.mjs.map +1 -1
- package/build/providers/DownloadProvider/DownloadProvider.d.ts +1 -0
- package/build/providers/DownloadProvider/DownloadProvider.js +27 -4
- package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
- package/build/providers/DownloadProvider/DownloadProvider.mjs +27 -6
- package/build/providers/DownloadProvider/DownloadProvider.mjs.map +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
- package/build/providers/SearchProvider/SearchProvider.d.ts +1 -0
- package/build/providers/SearchProvider/SearchProvider.js +8 -6
- package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
- package/build/providers/SearchProvider/SearchProvider.mjs +8 -6
- package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
- package/build/providers/TranslatorProvider/TranslatorProvider.js +5 -3
- package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
- package/build/providers/TranslatorProvider/TranslatorProvider.mjs +5 -3
- package/build/providers/TranslatorProvider/TranslatorProvider.mjs.map +1 -1
- package/build/providers/VersionProvider/VersionProvider.js +3 -3
- package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
- package/build/providers/VersionProvider/VersionProvider.mjs +3 -3
- package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
- package/build/sections/Detail/Tabs.js +1 -1
- package/build/sections/Detail/Tabs.mjs +1 -1
- package/build/sections/Footer/Footer.js +1 -1
- package/build/sections/Footer/Footer.mjs +1 -1
- package/build/sections/Header/Header.d.ts +0 -1
- package/build/sections/Header/Header.js +16 -14
- package/build/sections/Header/Header.js.map +1 -1
- package/build/sections/Header/Header.mjs +17 -15
- package/build/sections/Header/Header.mjs.map +1 -1
- package/build/sections/Header/HeaderGreetings.js +1 -1
- package/build/sections/Header/HeaderGreetings.mjs +1 -1
- package/build/sections/Header/HeaderMenu.js +1 -1
- package/build/sections/Header/HeaderMenu.mjs +1 -1
- package/build/sections/Header/HeaderRight.js +1 -1
- package/build/sections/Header/HeaderRight.mjs +1 -1
- package/build/sections/Header/HeaderSettingsDialog.js +1 -1
- package/build/sections/Header/HeaderSettingsDialog.mjs +1 -1
- package/build/sections/Header/LanguageSwitch.js +1 -1
- package/build/sections/Header/LanguageSwitch.mjs +1 -1
- package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js +1 -1
- package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs +1 -1
- package/build/sections/Home/Home.js +4 -3
- package/build/sections/Home/Home.js.map +1 -1
- package/build/sections/Home/Home.mjs +5 -4
- package/build/sections/Home/Home.mjs.map +1 -1
- package/build/sections/Security/AddUser.js +33 -18
- package/build/sections/Security/AddUser.js.map +1 -1
- package/build/sections/Security/AddUser.mjs +37 -22
- package/build/sections/Security/AddUser.mjs.map +1 -1
- package/build/sections/Security/ChangePassword.js +17 -15
- package/build/sections/Security/ChangePassword.js.map +1 -1
- package/build/sections/Security/ChangePassword.mjs +19 -17
- package/build/sections/Security/ChangePassword.mjs.map +1 -1
- package/build/sections/Security/Login.js +51 -35
- package/build/sections/Security/Login.js.map +1 -1
- package/build/sections/Security/Login.mjs +54 -38
- package/build/sections/Security/Login.mjs.map +1 -1
- package/build/sections/Security/Success.js +28 -24
- package/build/sections/Security/Success.js.map +1 -1
- package/build/sections/Security/Success.mjs +29 -25
- package/build/sections/Security/Success.mjs.map +1 -1
- package/build/sections/Stage/StageActions.js +1 -1
- package/build/sections/Stage/StageActions.mjs +1 -1
- package/build/sections/Stage/StageDetail.js +1 -1
- package/build/sections/Stage/StageDetail.mjs +1 -1
- package/build/sections/Stage/StageList.js +15 -2
- package/build/sections/Stage/StageList.js.map +1 -1
- package/build/sections/Stage/StageList.mjs +15 -2
- package/build/sections/Stage/StageList.mjs.map +1 -1
- package/build/store/api.js +7 -4
- package/build/store/api.js.map +1 -1
- package/build/store/api.mjs +7 -4
- package/build/store/api.mjs.map +1 -1
- package/build/types/packageMeta.d.ts +3 -2
- package/build/utils/cli-utils.js +2 -2
- package/build/utils/cli-utils.js.map +1 -1
- package/build/utils/cli-utils.mjs +2 -2
- package/build/utils/cli-utils.mjs.map +1 -1
- package/build/utils/index.js +1 -0
- package/build/utils/index.mjs +2 -2
- package/build/utils/routes.d.ts +1 -0
- package/build/utils/routes.js +1 -0
- package/build/utils/routes.js.map +1 -1
- package/build/utils/routes.mjs +1 -0
- package/build/utils/routes.mjs.map +1 -1
- package/build/utils/schemas.d.ts +1 -0
- package/build/utils/schemas.js +4 -4
- package/build/utils/schemas.js.map +1 -1
- package/build/utils/schemas.mjs +4 -4
- package/build/utils/schemas.mjs.map +1 -1
- package/build/utils/session-id.d.ts +8 -0
- package/build/utils/session-id.js +26 -0
- package/build/utils/session-id.js.map +1 -0
- package/build/utils/session-id.mjs +26 -0
- package/build/utils/session-id.mjs.map +1 -0
- package/build/utils/token.d.ts +1 -0
- package/build/utils/token.js +12 -8
- package/build/utils/token.js.map +1 -1
- package/build/utils/token.mjs +12 -9
- package/build/utils/token.mjs.map +1 -1
- package/build/utils/url.js +1 -1
- package/build/utils/url.js.map +1 -1
- package/build/utils/url.mjs +1 -1
- package/build/utils/url.mjs.map +1 -1
- package/build/utils/utils.d.ts +10 -0
- package/build/utils/utils.js +26 -0
- package/build/utils/utils.js.map +1 -1
- package/build/utils/utils.mjs +25 -1
- package/build/utils/utils.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -4,20 +4,21 @@ import { saveAuth } from "../../store/storage.mjs";
|
|
|
4
4
|
import { getConfiguration } from "../../configuration.mjs";
|
|
5
5
|
import { stripTrailingSlash } from "../../store/utils.mjs";
|
|
6
6
|
import { useDataMutation } from "../../api/use-data-mutation.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { authErrorMessage } from "../../providers/AuthProvider/utils.mjs";
|
|
8
|
+
import { useAuth } from "../../providers/AuthProvider/AuthProvider.mjs";
|
|
8
9
|
import NotFound from "../../components/NotFound/NotFound.mjs";
|
|
9
10
|
import "../../components/NotFound/index.mjs";
|
|
10
11
|
import LoginFormHeader from "../../components/LoginForm/styles.mjs";
|
|
11
|
-
import LoginForm from "../../components/LoginForm/Login.mjs";
|
|
12
12
|
import { loginSchema } from "../../utils/schemas.mjs";
|
|
13
|
+
import LoginForm from "../../components/LoginForm/Login.mjs";
|
|
13
14
|
import SecurityLayout from "../../layouts/Security/Dialog.mjs";
|
|
14
15
|
import { SecurityContainer, SecurityForm } from "./styles.mjs";
|
|
15
16
|
import { MessageType } from "./Success.mjs";
|
|
16
17
|
import { getSecurityUrlParams } from "./utils.mjs";
|
|
17
|
-
import { useCallback } from "react";
|
|
18
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { useCallback, useRef } from "react";
|
|
19
19
|
import { useTranslation } from "react-i18next";
|
|
20
|
-
import {
|
|
20
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
21
|
+
import { Link, useLocation, useNavigate } from "react-router";
|
|
21
22
|
import { Link as Link$1, Typography } from "@mui/material";
|
|
22
23
|
import { yupResolver } from "@hookform/resolvers/yup";
|
|
23
24
|
import { useForm } from "react-hook-form";
|
|
@@ -28,63 +29,78 @@ var Login = () => {
|
|
|
28
29
|
const { t } = useTranslation();
|
|
29
30
|
const location = useLocation();
|
|
30
31
|
const navigate = useNavigate();
|
|
32
|
+
const { setUserState } = useAuth();
|
|
31
33
|
const { next } = getSecurityUrlParams(location);
|
|
32
34
|
const createUserEnabled = configuration?.flags?.createUser;
|
|
33
35
|
const addUserLink = Route$1.ADD_USER + (next ? "?next=" + next : "");
|
|
34
36
|
const { trigger } = useDataMutation(basePath, next, "POST");
|
|
35
|
-
const { setError, handleSubmit, register, formState: { isValid, errors } } = useForm({
|
|
37
|
+
const { setError, handleSubmit, register, formState: { isValid, isSubmitting, errors } } = useForm({
|
|
36
38
|
mode: "onChange",
|
|
37
39
|
resolver: yupResolver(loginSchema)
|
|
38
40
|
});
|
|
39
41
|
const handleLogin = useCallback(async (body) => {
|
|
40
|
-
|
|
41
|
-
return await trigger(body);
|
|
42
|
-
} catch (err) {
|
|
43
|
-
throw normalizeAuthError(err);
|
|
44
|
-
}
|
|
42
|
+
return await trigger(body);
|
|
45
43
|
}, [trigger]);
|
|
46
44
|
const onSuccess = useCallback(() => {
|
|
47
45
|
navigate(`${Route$1.SUCCESS}?messageType=${MessageType.Login}`);
|
|
48
46
|
}, [navigate]);
|
|
47
|
+
const inFlight = useRef(false);
|
|
49
48
|
const onSubmit = useCallback(async (data) => {
|
|
49
|
+
if (inFlight.current) return;
|
|
50
|
+
inFlight.current = true;
|
|
50
51
|
try {
|
|
51
52
|
const result = await handleLogin?.(data);
|
|
52
|
-
if (result
|
|
53
|
+
if (!result || !result.username || !result.token) throw new Error("login response is missing the token");
|
|
54
|
+
saveAuth(result.username, result.token);
|
|
55
|
+
setUserState?.({
|
|
56
|
+
username: result.username,
|
|
57
|
+
token: result.token
|
|
58
|
+
});
|
|
53
59
|
onSuccess();
|
|
54
|
-
} catch {
|
|
60
|
+
} catch (err) {
|
|
61
|
+
const message = err?.code === 401 ? t("security.error.invalid-credentials") : authErrorMessage(err, t("security.error.unable-to-login"));
|
|
55
62
|
setError("root", {
|
|
56
63
|
type: "server",
|
|
57
|
-
message
|
|
64
|
+
message
|
|
58
65
|
});
|
|
66
|
+
} finally {
|
|
67
|
+
inFlight.current = false;
|
|
59
68
|
}
|
|
60
69
|
}, [
|
|
61
70
|
handleLogin,
|
|
62
71
|
setError,
|
|
63
|
-
|
|
72
|
+
setUserState,
|
|
73
|
+
onSuccess,
|
|
74
|
+
t
|
|
64
75
|
]);
|
|
65
|
-
return !next ? /* @__PURE__ */ jsx(NotFound, {}) : /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
children: t("security.login.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
return !next ? /* @__PURE__ */ jsx(NotFound, {}) : /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
|
|
77
|
+
as: "div",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsx(LoginFormHeader, {}),
|
|
80
|
+
/* @__PURE__ */ jsx(LoginForm, {
|
|
81
|
+
errors,
|
|
82
|
+
handleSubmit,
|
|
83
|
+
isSubmitting,
|
|
84
|
+
isValid,
|
|
85
|
+
onSubmit,
|
|
86
|
+
register
|
|
87
|
+
}),
|
|
88
|
+
createUserEnabled && /* @__PURE__ */ jsxs(Typography, {
|
|
89
|
+
align: "center",
|
|
90
|
+
sx: {
|
|
91
|
+
mt: 2,
|
|
92
|
+
fontSize: 12
|
|
93
|
+
},
|
|
94
|
+
variant: "body2",
|
|
95
|
+
children: [t("security.login.noUserQuestion"), /* @__PURE__ */ jsx(Link$1, {
|
|
96
|
+
component: Link,
|
|
97
|
+
sx: { ml: 1 },
|
|
98
|
+
to: addUserLink,
|
|
99
|
+
children: t("security.login.createUser")
|
|
100
|
+
})]
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}) }) });
|
|
88
104
|
};
|
|
89
105
|
//#endregion
|
|
90
106
|
export { Login as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Login.mjs","names":[],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport type { LoginFormValues } from '../../components/LoginForm/Login';\nimport LoginForm from '../../components/LoginForm/Login';\nimport LoginFormHeader from '../../components/LoginForm/styles';\nimport NotFound from '../../components/NotFound';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport type { LoginBody } from '../../providers/AuthProvider/types';\nimport {
|
|
1
|
+
{"version":3,"file":"Login.mjs","names":[],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport type { LoginFormValues } from '../../components/LoginForm/Login';\nimport LoginForm from '../../components/LoginForm/Login';\nimport LoginFormHeader from '../../components/LoginForm/styles';\nimport NotFound from '../../components/NotFound';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport type { LoginBody } from '../../providers/AuthProvider/types';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { loginSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\nconst configuration = getConfiguration();\nconst basePath = stripTrailingSlash(configuration.base);\n\nconst Login: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const { next } = getSecurityUrlParams(location);\n const createUserEnabled = configuration?.flags?.createUser;\n const addUserLink = Route.ADD_USER + (next ? '?next=' + next : '');\n\n const { trigger } = useDataMutation<LoginBody>(basePath, next, 'POST');\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const handleLogin = useCallback(\n async (body: { username: string; password: string }) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleLogin?.(data);\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful login\n throw new Error('login response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n onSuccess();\n } catch (err: any) {\n // only a 401 means wrong credentials; a dead server, 500 or 429 must\n // not claim the credentials were invalid\n const message =\n err?.code === 401\n ? t('security.error.invalid-credentials')\n : authErrorMessage(err, t('security.error.unable-to-login'));\n setError('root', { type: 'server', message });\n } finally {\n inFlight.current = false;\n }\n },\n [handleLogin, setError, setUserState, onSuccess, t]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n {/* container only: LoginForm renders the real <form>, and a <form>\n cannot be a descendant of another <form> */}\n <SecurityForm as=\"div\">\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isValid={isValid}\n onSubmit={onSubmit}\n register={register}\n />\n {createUserEnabled && (\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.login.noUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={addUserLink}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAM,gBAAgB,iBAAiB;AACvC,IAAM,WAAW,mBAAmB,cAAc,IAAI;AAEtD,IAAM,cAAwB;CAC5B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,iBAAiB,QAAQ;CACjC,MAAM,EAAE,SAAS,qBAAqB,QAAQ;CAC9C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,QAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,gBAA2B,UAAU,MAAM,MAAM;CAOrE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,cAAc,aATzB,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,WAAW;CACnC,CAOI;CAEJ,MAAM,cAAc,YAClB,OAAO,SAAiD;EACtD,OAAO,MAAM,QAAQ,IAAI;CAC3B,GACA,CAAC,OAAO,CACV;CAEA,MAAM,YAAY,kBAAkB;EAClC,SAAS,GAAG,QAAM,QAAQ,eAAe,YAAY,OAAO;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAIb,MAAM,WAAW,OAAO,KAAK;CAE7B,MAAM,WAAW,YACf,OAAO,SAA0B;EAC/B,IAAI,SAAS,SACX;EAEF,SAAS,UAAU;EACnB,IAAI;GACF,MAAM,SAAS,MAAM,cAAc,IAAI;GACvC,IAAI,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,OAAO,OAEzC,MAAM,IAAI,MAAM,qCAAqC;GAEvD,SAAS,OAAO,UAAU,OAAO,KAAK;GAEtC,eAAe;IAAE,UAAU,OAAO;IAAU,OAAO,OAAO;GAAM,CAAC;GACjE,UAAU;EACZ,SAAS,KAAU;GAGjB,MAAM,UACJ,KAAK,SAAS,MACV,EAAE,oCAAoC,IACtC,iBAAiB,KAAK,EAAE,gCAAgC,CAAC;GAC/D,SAAS,QAAQ;IAAE,MAAM;IAAU;GAAQ,CAAC;EAC9C,UAAU;GACR,SAAS,UAAU;EACrB;CACF,GACA;EAAC;EAAa;EAAU;EAAc;EAAW;CAAC,CACpD;CAEA,OAAO,CAAC,OACN,oBAAC,UAAD,CAAW,CAAA,IAEX,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UAGE,qBAAC,cAAD;EAAc,IAAG;EAAjB,UAAA;GACE,oBAAC,iBAAD,CAAkB,CAAA;GAClB,oBAAC,WAAD;IACU;IACM;IACA;IACL;IACC;IACA;GACX,CAAA;GACA,qBACC,qBAAC,YAAD;IAAY,OAAM;IAAS,IAAI;KAAE,IAAI;KAAG,UAAU;IAAG;IAAG,SAAQ;IAAhE,UAAA,CACG,EAAE,+BAA+B,GAClC,oBAAC,QAAD;KAAM,WAAW;KAAY,IAAI,EAAE,IAAI,EAAE;KAAG,IAAI;KAC7C,UAAA,EAAE,2BAA2B;IAC1B,CAAA,CACI;;EAEF;CACG,CAAA,EAAA,CAAA,EACL,CAAA;AAEpB"}
|
|
@@ -3,8 +3,8 @@ const require_Dialog = require("../../layouts/Security/Dialog.js");
|
|
|
3
3
|
const require_styles = require("./styles.js");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
react = require_runtime.__toESM(react);
|
|
6
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
6
|
let react_i18next = require("react-i18next");
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let react_router = require("react-router");
|
|
9
9
|
let _mui_material = require("@mui/material");
|
|
10
10
|
let _mui_icons_material_CheckCircle = require("@mui/icons-material/CheckCircle");
|
|
@@ -20,33 +20,37 @@ var MessageType = /* @__PURE__ */ function(MessageType) {
|
|
|
20
20
|
var Success = () => {
|
|
21
21
|
const { t } = (0, react_i18next.useTranslation)();
|
|
22
22
|
const location = (0, react_router.useLocation)();
|
|
23
|
+
const navigate = (0, react_router.useNavigate)();
|
|
23
24
|
const messageType = new URLSearchParams(location.search).get("messageType");
|
|
24
25
|
const message = !messageType ? t("security.success.messageSuccess") : t(`security.success.message${messageType}`);
|
|
25
26
|
const handleClose = () => {
|
|
26
|
-
|
|
27
|
+
navigate("/");
|
|
27
28
|
};
|
|
28
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Dialog.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityContainer, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_styles.SecurityForm, {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
29
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Dialog.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityContainer, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_styles.SecurityForm, {
|
|
30
|
+
as: "div",
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_icons_material_CheckCircle.default, { color: "success" }),
|
|
33
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
|
|
34
|
+
component: "h1",
|
|
35
|
+
gutterBottom: true,
|
|
36
|
+
variant: "h4",
|
|
37
|
+
children: t("security.success.title")
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
|
|
40
|
+
color: "text.secondary",
|
|
41
|
+
paragraph: true,
|
|
42
|
+
variant: "body1",
|
|
43
|
+
children: message
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
|
|
46
|
+
color: "primary",
|
|
47
|
+
onClick: handleClose,
|
|
48
|
+
sx: { mt: 2 },
|
|
49
|
+
variant: "contained",
|
|
50
|
+
children: t("security.success.submit")
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
}) }) });
|
|
50
54
|
};
|
|
51
55
|
//#endregion
|
|
52
56
|
exports.MessageType = MessageType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Success.js","names":[],"sources":["../../../src/sections/Security/Success.tsx"],"sourcesContent":["import CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport { Button, Typography } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router';\n\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { SecurityContainer, SecurityForm } from './styles';\n\nexport enum MessageType {\n Login = 'Login',\n ChangePassword = 'ChangePassword',\n AddUser = 'AddUser',\n Success = 'Success',\n}\n\nconst Success: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const messageType = queryParams.get('messageType') as MessageType;\n const message = !messageType\n ? t('security.success.messageSuccess')\n : t(`security.success.message${messageType}`);\n\n const handleClose = () => {\n window.location.href = '/';\n };\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <CheckCircleIcon color=\"success\" />\n <Typography component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.success.title')}\n </Typography>\n <Typography color=\"text.secondary\" paragraph={true} variant=\"body1\">\n {message}\n </Typography>\n <Button color=\"primary\" onClick={handleClose} sx={{ mt: 2 }} variant=\"contained\">\n {t('security.success.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Success;\n"],"mappings":";;;;;;;;;;;;AASA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,WAAA;CACA,YAAA,oBAAA;CACA,YAAA,aAAA;CACA,YAAA,aAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAM,gBAA0B;CAC9B,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAE7B,MAAM,cAAc,IADI,gBAAgB,SAAS,MAC7B,CAAA,CAAY,IAAI,aAAa;CACjD,MAAM,UAAU,CAAC,cACb,EAAE,iCAAiC,IACnC,EAAE,2BAA2B,aAAa;CAE9C,MAAM,oBAAoB;
|
|
1
|
+
{"version":3,"file":"Success.js","names":[],"sources":["../../../src/sections/Security/Success.tsx"],"sourcesContent":["import CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport { Button, Typography } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useNavigate } from 'react-router';\n\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { SecurityContainer, SecurityForm } from './styles';\n\nexport enum MessageType {\n Login = 'Login',\n ChangePassword = 'ChangePassword',\n AddUser = 'AddUser',\n Success = 'Success',\n}\n\nconst Success: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const queryParams = new URLSearchParams(location.search);\n const messageType = queryParams.get('messageType') as MessageType;\n const message = !messageType\n ? t('security.success.messageSuccess')\n : t(`security.success.message${messageType}`);\n\n const handleClose = () => {\n // navigate() keeps the router basename; window.location.href = '/' left the\n // registry entirely when it is served under a sub-path\n navigate('/');\n };\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n {/* container only: this page has no form to submit */}\n <SecurityForm as=\"div\">\n <CheckCircleIcon color=\"success\" />\n <Typography component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.success.title')}\n </Typography>\n <Typography color=\"text.secondary\" paragraph={true} variant=\"body1\">\n {message}\n </Typography>\n <Button color=\"primary\" onClick={handleClose} sx={{ mt: 2 }} variant=\"contained\">\n {t('security.success.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Success;\n"],"mappings":";;;;;;;;;;;;AASA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,WAAA;CACA,YAAA,oBAAA;CACA,YAAA,aAAA;CACA,YAAA,aAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAM,gBAA0B;CAC9B,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAE7B,MAAM,cAAc,IADI,gBAAgB,SAAS,MAC7B,CAAA,CAAY,IAAI,aAAa;CACjD,MAAM,UAAU,CAAC,cACb,EAAE,iCAAiC,IACnC,EAAE,2BAA2B,aAAa;CAE9C,MAAM,oBAAoB;EAGxB,SAAS,GAAG;CACd;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,mBAAD,EAAA,UAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,cAAD;EAAc,IAAG;EAAjB,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,gCAAA,SAAD,EAAiB,OAAM,UAAW,CAAA;GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,YAAD;IAAY,WAAU;IAAK,cAAc;IAAM,SAAQ;IACpD,UAAA,EAAE,wBAAwB;GACjB,CAAA;GACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,YAAD;IAAY,OAAM;IAAiB,WAAW;IAAM,SAAQ;IACzD,UAAA;GACS,CAAA;GACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,QAAD;IAAQ,OAAM;IAAU,SAAS;IAAa,IAAI,EAAE,IAAI,EAAE;IAAG,SAAQ;IAClE,UAAA,EAAE,yBAAyB;GACtB,CAAA;EACI;CACG,CAAA,EAAA,CAAA,EACL,CAAA;AAEpB"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import SecurityLayout from "../../layouts/Security/Dialog.mjs";
|
|
2
2
|
import { SecurityContainer, SecurityForm } from "./styles.mjs";
|
|
3
3
|
import "react";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
4
|
import { useTranslation } from "react-i18next";
|
|
6
|
-
import {
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useLocation, useNavigate } from "react-router";
|
|
7
7
|
import { Button, Typography } from "@mui/material";
|
|
8
8
|
import CheckCircleIcon from "@mui/icons-material/CheckCircle";
|
|
9
9
|
//#region src/sections/Security/Success.tsx
|
|
@@ -17,33 +17,37 @@ var MessageType = /* @__PURE__ */ function(MessageType) {
|
|
|
17
17
|
var Success = () => {
|
|
18
18
|
const { t } = useTranslation();
|
|
19
19
|
const location = useLocation();
|
|
20
|
+
const navigate = useNavigate();
|
|
20
21
|
const messageType = new URLSearchParams(location.search).get("messageType");
|
|
21
22
|
const message = !messageType ? t("security.success.messageSuccess") : t(`security.success.message${messageType}`);
|
|
22
23
|
const handleClose = () => {
|
|
23
|
-
|
|
24
|
+
navigate("/");
|
|
24
25
|
};
|
|
25
|
-
return /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
26
|
+
return /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
|
|
27
|
+
as: "div",
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx(CheckCircleIcon, { color: "success" }),
|
|
30
|
+
/* @__PURE__ */ jsx(Typography, {
|
|
31
|
+
component: "h1",
|
|
32
|
+
gutterBottom: true,
|
|
33
|
+
variant: "h4",
|
|
34
|
+
children: t("security.success.title")
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ jsx(Typography, {
|
|
37
|
+
color: "text.secondary",
|
|
38
|
+
paragraph: true,
|
|
39
|
+
variant: "body1",
|
|
40
|
+
children: message
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ jsx(Button, {
|
|
43
|
+
color: "primary",
|
|
44
|
+
onClick: handleClose,
|
|
45
|
+
sx: { mt: 2 },
|
|
46
|
+
variant: "contained",
|
|
47
|
+
children: t("security.success.submit")
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
}) }) });
|
|
47
51
|
};
|
|
48
52
|
//#endregion
|
|
49
53
|
export { MessageType, Success as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Success.mjs","names":[],"sources":["../../../src/sections/Security/Success.tsx"],"sourcesContent":["import CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport { Button, Typography } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router';\n\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { SecurityContainer, SecurityForm } from './styles';\n\nexport enum MessageType {\n Login = 'Login',\n ChangePassword = 'ChangePassword',\n AddUser = 'AddUser',\n Success = 'Success',\n}\n\nconst Success: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const messageType = queryParams.get('messageType') as MessageType;\n const message = !messageType\n ? t('security.success.messageSuccess')\n : t(`security.success.message${messageType}`);\n\n const handleClose = () => {\n window.location.href = '/';\n };\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <CheckCircleIcon color=\"success\" />\n <Typography component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.success.title')}\n </Typography>\n <Typography color=\"text.secondary\" paragraph={true} variant=\"body1\">\n {message}\n </Typography>\n <Button color=\"primary\" onClick={handleClose} sx={{ mt: 2 }} variant=\"contained\">\n {t('security.success.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Success;\n"],"mappings":";;;;;;;;;AASA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,WAAA;CACA,YAAA,oBAAA;CACA,YAAA,aAAA;CACA,YAAA,aAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAM,gBAA0B;CAC9B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAE7B,MAAM,cAAc,IADI,gBAAgB,SAAS,MAC7B,CAAA,CAAY,IAAI,aAAa;CACjD,MAAM,UAAU,CAAC,cACb,EAAE,iCAAiC,IACnC,EAAE,2BAA2B,aAAa;CAE9C,MAAM,oBAAoB;
|
|
1
|
+
{"version":3,"file":"Success.mjs","names":[],"sources":["../../../src/sections/Security/Success.tsx"],"sourcesContent":["import CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport { Button, Typography } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useNavigate } from 'react-router';\n\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { SecurityContainer, SecurityForm } from './styles';\n\nexport enum MessageType {\n Login = 'Login',\n ChangePassword = 'ChangePassword',\n AddUser = 'AddUser',\n Success = 'Success',\n}\n\nconst Success: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const queryParams = new URLSearchParams(location.search);\n const messageType = queryParams.get('messageType') as MessageType;\n const message = !messageType\n ? t('security.success.messageSuccess')\n : t(`security.success.message${messageType}`);\n\n const handleClose = () => {\n // navigate() keeps the router basename; window.location.href = '/' left the\n // registry entirely when it is served under a sub-path\n navigate('/');\n };\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n {/* container only: this page has no form to submit */}\n <SecurityForm as=\"div\">\n <CheckCircleIcon color=\"success\" />\n <Typography component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.success.title')}\n </Typography>\n <Typography color=\"text.secondary\" paragraph={true} variant=\"body1\">\n {message}\n </Typography>\n <Button color=\"primary\" onClick={handleClose} sx={{ mt: 2 }} variant=\"contained\">\n {t('security.success.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Success;\n"],"mappings":";;;;;;;;;AASA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,WAAA;CACA,YAAA,oBAAA;CACA,YAAA,aAAA;CACA,YAAA,aAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAM,gBAA0B;CAC9B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,YAAY;CAE7B,MAAM,cAAc,IADI,gBAAgB,SAAS,MAC7B,CAAA,CAAY,IAAI,aAAa;CACjD,MAAM,UAAU,CAAC,cACb,EAAE,iCAAiC,IACnC,EAAE,2BAA2B,aAAa;CAE9C,MAAM,oBAAoB;EAGxB,SAAS,GAAG;CACd;CAEA,OACE,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UAEE,qBAAC,cAAD;EAAc,IAAG;EAAjB,UAAA;GACE,oBAAC,iBAAD,EAAiB,OAAM,UAAW,CAAA;GAClC,oBAAC,YAAD;IAAY,WAAU;IAAK,cAAc;IAAM,SAAQ;IACpD,UAAA,EAAE,wBAAwB;GACjB,CAAA;GACZ,oBAAC,YAAD;IAAY,OAAM;IAAiB,WAAW;IAAM,SAAQ;IACzD,UAAA;GACS,CAAA;GACZ,oBAAC,QAAD;IAAQ,OAAM;IAAU,SAAS;IAAa,IAAI,EAAE,IAAI,EAAE;IAAG,SAAQ;IAClE,UAAA,EAAE,yBAAyB;GACtB,CAAA;EACI;CACG,CAAA,EAAA,CAAA,EACL,CAAA;AAEpB"}
|
|
@@ -2,8 +2,8 @@ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
|
|
|
2
2
|
const require_useStage = require("./useStage.js");
|
|
3
3
|
let react = require("react");
|
|
4
4
|
react = require_runtime.__toESM(react);
|
|
5
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
5
|
let react_i18next = require("react-i18next");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
7
|
let _mui_material = require("@mui/material");
|
|
8
8
|
//#region src/sections/Stage/StageActions.tsx
|
|
9
9
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { approveStagedVersion, rejectStagedVersion } from "./useStage.mjs";
|
|
2
2
|
import { useCallback, useState } from "react";
|
|
3
|
-
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
4
3
|
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Typography } from "@mui/material";
|
|
6
6
|
//#region src/sections/Stage/StageActions.tsx
|
|
7
7
|
/**
|
|
@@ -6,8 +6,8 @@ const require_StageActions = require("./StageActions.js");
|
|
|
6
6
|
const require_useRequireSession = require("./useRequireSession.js");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
react = require_runtime.__toESM(react);
|
|
9
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
9
|
let react_i18next = require("react-i18next");
|
|
10
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
11
11
|
let react_router = require("react-router");
|
|
12
12
|
let _mui_material = require("@mui/material");
|
|
13
13
|
//#region src/sections/Stage/StageDetail.tsx
|
|
@@ -4,8 +4,8 @@ import { downloadStagedTarball, useStageItem } from "./useStage.mjs";
|
|
|
4
4
|
import StageActions from "./StageActions.mjs";
|
|
5
5
|
import { useRequireSession } from "./useRequireSession.mjs";
|
|
6
6
|
import { useCallback } from "react";
|
|
7
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
7
|
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
9
|
import { useNavigate, useParams } from "react-router";
|
|
10
10
|
import { Box, Button, Chip, CircularProgress, Paper, Table, TableBody, TableCell, TableRow, Typography } from "@mui/material";
|
|
11
11
|
//#region src/sections/Stage/StageDetail.tsx
|
|
@@ -6,8 +6,8 @@ const require_StageActions = require("./StageActions.js");
|
|
|
6
6
|
const require_useRequireSession = require("./useRequireSession.js");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
react = require_runtime.__toESM(react);
|
|
9
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
9
|
let react_i18next = require("react-i18next");
|
|
10
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
11
11
|
let react_router = require("react-router");
|
|
12
12
|
let _mui_material = require("@mui/material");
|
|
13
13
|
//#region src/sections/Stage/StageList.tsx
|
|
@@ -17,9 +17,16 @@ var StageList = () => {
|
|
|
17
17
|
const isLoggedIn = require_useRequireSession.useRequireSession();
|
|
18
18
|
const [page, setPage] = (0, react.useState)(0);
|
|
19
19
|
const [perPage, setPerPage] = (0, react.useState)(10);
|
|
20
|
+
const [actionError, setActionError] = (0, react.useState)(false);
|
|
20
21
|
const { data, error, isLoading, mutate } = require_useStage.useStageList(page, perPage);
|
|
21
22
|
const handleDownload = (0, react.useCallback)(async (item) => {
|
|
22
|
-
|
|
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
|
+
}
|
|
23
30
|
}, []);
|
|
24
31
|
if (!isLoggedIn) return null;
|
|
25
32
|
if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
|
|
@@ -52,6 +59,12 @@ var StageList = () => {
|
|
|
52
59
|
variant: "body2",
|
|
53
60
|
children: t("stage.description")
|
|
54
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
|
+
}),
|
|
55
68
|
items.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
|
|
56
69
|
color: "text.secondary",
|
|
57
70
|
marginTop: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StageList.js","names":[],"sources":["../../../src/sections/Stage/StageList.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { useRequireSession } from './useRequireSession';\nimport type { StagePackageVersion } from './types';\nimport { downloadStagedTarball, useStageList } from './useStage';\n\nconst StageList: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const isLoggedIn = useRequireSession();\n const [page, setPage] = useState(0);\n const [perPage, setPerPage] = useState(10);\n const { data, error, isLoading, mutate } = useStageList(page, perPage);\n\n const handleDownload = useCallback(async (item: StagePackageVersion) => {\n await downloadStagedTarball(item);\n }, []);\n\n // the redirect lands on the next effect; rendering the table meanwhile would\n // only show an empty state that is about to disappear\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) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.list')}\n </Typography>\n </Box>\n );\n }\n\n const items = data?.items ?? [];\n\n return (\n <Box padding={2}>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {t('stage.title')}\n </Typography>\n <Typography color=\"text.secondary\" gutterBottom={true} variant=\"body2\">\n {t('stage.description')}\n </Typography>\n\n {items.length === 0 ? (\n <Typography color=\"text.secondary\" marginTop={2}>\n {t('stage.empty')}\n </Typography>\n ) : (\n <TableContainer component={Paper} sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table aria-label={t('stage.title')} data-testid=\"stage-table\" size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('stage.column.package')}</TableCell>\n <TableCell>{t('stage.column.version')}</TableCell>\n <TableCell>{t('stage.column.tag')}</TableCell>\n <TableCell>{t('stage.column.stagedBy')}</TableCell>\n <TableCell>{t('stage.column.date')}</TableCell>\n <TableCell align=\"right\">{t('stage.column.actions')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {items.map((item) => (\n <TableRow data-testid={`stage-row-${item.id}`} hover={true} key={item.id}>\n <TableCell>\n <Button\n onClick={() => navigate(Route.STAGE_DETAIL.replace(':stageId', item.id))}\n size=\"small\"\n sx={{ textTransform: 'none' }}\n >\n {item.packageName}\n </Button>\n </TableCell>\n <TableCell>{item.version}</TableCell>\n <TableCell>\n <Chip label={item.tag} size=\"small\" />\n </TableCell>\n <TableCell>{item.actor}</TableCell>\n <TableCell>{new Date(item.createdAt).toLocaleString()}</TableCell>\n <TableCell align=\"right\">\n <Box alignItems=\"center\" display=\"flex\" gap={1} justifyContent=\"flex-end\">\n <Button\n data-testid={`stage-download-${item.id}`}\n onClick={() => handleDownload(item)}\n size=\"small\"\n >\n {t('stage.action.download')}\n </Button>\n <StageActions item={item} onDone={() => mutate()} />\n </Box>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <TablePagination\n component=\"div\"\n count={data?.total ?? 0}\n onPageChange={(_event, nextPage) => setPage(nextPage)}\n onRowsPerPageChange={(event) => {\n setPerPage(Number.parseInt(event.target.value, 10));\n setPage(0);\n }}\n page={page}\n rowsPerPage={perPage}\n rowsPerPageOptions={[10, 25, 50, 100]}\n />\n </TableContainer>\n )}\n </Box>\n );\n};\n\nexport default StageList;\n"],"mappings":";;;;;;;;;;;;;AAyBA,IAAM,kBAA4B;CAChC,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,aAAa,0BAAA,kBAAkB;CACrC,MAAM,CAAC,MAAM,YAAA,GAAW,MAAA,SAAA,CAAS,CAAC;CAClC,MAAM,CAAC,SAAS,eAAA,GAAc,MAAA,SAAA,CAAS,EAAE;CACzC,MAAM,EAAE,MAAM,OAAO,WAAW,WAAW,iBAAA,aAAa,MAAM,OAAO;CAErE,MAAM,kBAAA,GAAiB,MAAA,YAAA,CAAY,OAAO,SAA8B;EACtE,MAAM,iBAAA,sBAAsB,IAAI;
|
|
1
|
+
{"version":3,"file":"StageList.js","names":[],"sources":["../../../src/sections/Stage/StageList.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { useRequireSession } from './useRequireSession';\nimport type { StagePackageVersion } from './types';\nimport { downloadStagedTarball, useStageList } from './useStage';\n\nconst StageList: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const isLoggedIn = useRequireSession();\n const [page, setPage] = useState(0);\n const [perPage, setPerPage] = useState(10);\n const [actionError, setActionError] = useState(false);\n const { data, error, isLoading, mutate } = useStageList(page, perPage);\n\n const handleDownload = useCallback(async (item: StagePackageVersion) => {\n try {\n setActionError(false);\n await downloadStagedTarball(item);\n } catch (err) {\n console.error('Error downloading staged tarball:', err);\n setActionError(true);\n }\n }, []);\n\n // the redirect lands on the next effect; rendering the table meanwhile would\n // only show an empty state that is about to disappear\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) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.list')}\n </Typography>\n </Box>\n );\n }\n\n const items = data?.items ?? [];\n\n return (\n <Box padding={2}>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {t('stage.title')}\n </Typography>\n <Typography color=\"text.secondary\" gutterBottom={true} variant=\"body2\">\n {t('stage.description')}\n </Typography>\n\n {actionError && (\n <Typography color=\"error\" role=\"alert\" variant=\"body2\">\n {t('stage.error.action')}\n </Typography>\n )}\n\n {items.length === 0 ? (\n <Typography color=\"text.secondary\" marginTop={2}>\n {t('stage.empty')}\n </Typography>\n ) : (\n <TableContainer component={Paper} sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table aria-label={t('stage.title')} data-testid=\"stage-table\" size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('stage.column.package')}</TableCell>\n <TableCell>{t('stage.column.version')}</TableCell>\n <TableCell>{t('stage.column.tag')}</TableCell>\n <TableCell>{t('stage.column.stagedBy')}</TableCell>\n <TableCell>{t('stage.column.date')}</TableCell>\n <TableCell align=\"right\">{t('stage.column.actions')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {items.map((item) => (\n <TableRow data-testid={`stage-row-${item.id}`} hover={true} key={item.id}>\n <TableCell>\n <Button\n onClick={() => navigate(Route.STAGE_DETAIL.replace(':stageId', item.id))}\n size=\"small\"\n sx={{ textTransform: 'none' }}\n >\n {item.packageName}\n </Button>\n </TableCell>\n <TableCell>{item.version}</TableCell>\n <TableCell>\n <Chip label={item.tag} size=\"small\" />\n </TableCell>\n <TableCell>{item.actor}</TableCell>\n <TableCell>{new Date(item.createdAt).toLocaleString()}</TableCell>\n <TableCell align=\"right\">\n <Box alignItems=\"center\" display=\"flex\" gap={1} justifyContent=\"flex-end\">\n <Button\n data-testid={`stage-download-${item.id}`}\n onClick={() => handleDownload(item)}\n size=\"small\"\n >\n {t('stage.action.download')}\n </Button>\n <StageActions item={item} onDone={() => mutate()} />\n </Box>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <TablePagination\n component=\"div\"\n count={data?.total ?? 0}\n onPageChange={(_event, nextPage) => setPage(nextPage)}\n onRowsPerPageChange={(event) => {\n setPerPage(Number.parseInt(event.target.value, 10));\n setPage(0);\n }}\n page={page}\n rowsPerPage={perPage}\n rowsPerPageOptions={[10, 25, 50, 100]}\n />\n </TableContainer>\n )}\n </Box>\n );\n};\n\nexport default StageList;\n"],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import { downloadStagedTarball, useStageList } from "./useStage.mjs";
|
|
|
4
4
|
import StageActions from "./StageActions.mjs";
|
|
5
5
|
import { useRequireSession } from "./useRequireSession.mjs";
|
|
6
6
|
import { useCallback, useState } from "react";
|
|
7
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
7
|
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
9
|
import { useNavigate } from "react-router";
|
|
10
10
|
import { Box, Button, Chip, CircularProgress, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TablePagination, TableRow, Typography } from "@mui/material";
|
|
11
11
|
//#region src/sections/Stage/StageList.tsx
|
|
@@ -15,9 +15,16 @@ var StageList = () => {
|
|
|
15
15
|
const isLoggedIn = useRequireSession();
|
|
16
16
|
const [page, setPage] = useState(0);
|
|
17
17
|
const [perPage, setPerPage] = useState(10);
|
|
18
|
+
const [actionError, setActionError] = useState(false);
|
|
18
19
|
const { data, error, isLoading, mutate } = useStageList(page, perPage);
|
|
19
20
|
const handleDownload = useCallback(async (item) => {
|
|
20
|
-
|
|
21
|
+
try {
|
|
22
|
+
setActionError(false);
|
|
23
|
+
await downloadStagedTarball(item);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
console.error("Error downloading staged tarball:", err);
|
|
26
|
+
setActionError(true);
|
|
27
|
+
}
|
|
21
28
|
}, []);
|
|
22
29
|
if (!isLoggedIn) return null;
|
|
23
30
|
if (isLoading) return /* @__PURE__ */ jsx(Box, {
|
|
@@ -50,6 +57,12 @@ var StageList = () => {
|
|
|
50
57
|
variant: "body2",
|
|
51
58
|
children: t("stage.description")
|
|
52
59
|
}),
|
|
60
|
+
actionError && /* @__PURE__ */ jsx(Typography, {
|
|
61
|
+
color: "error",
|
|
62
|
+
role: "alert",
|
|
63
|
+
variant: "body2",
|
|
64
|
+
children: t("stage.error.action")
|
|
65
|
+
}),
|
|
53
66
|
items.length === 0 ? /* @__PURE__ */ jsx(Typography, {
|
|
54
67
|
color: "text.secondary",
|
|
55
68
|
marginTop: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StageList.mjs","names":[],"sources":["../../../src/sections/Stage/StageList.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { useRequireSession } from './useRequireSession';\nimport type { StagePackageVersion } from './types';\nimport { downloadStagedTarball, useStageList } from './useStage';\n\nconst StageList: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const isLoggedIn = useRequireSession();\n const [page, setPage] = useState(0);\n const [perPage, setPerPage] = useState(10);\n const { data, error, isLoading, mutate } = useStageList(page, perPage);\n\n const handleDownload = useCallback(async (item: StagePackageVersion) => {\n await downloadStagedTarball(item);\n }, []);\n\n // the redirect lands on the next effect; rendering the table meanwhile would\n // only show an empty state that is about to disappear\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) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.list')}\n </Typography>\n </Box>\n );\n }\n\n const items = data?.items ?? [];\n\n return (\n <Box padding={2}>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {t('stage.title')}\n </Typography>\n <Typography color=\"text.secondary\" gutterBottom={true} variant=\"body2\">\n {t('stage.description')}\n </Typography>\n\n {items.length === 0 ? (\n <Typography color=\"text.secondary\" marginTop={2}>\n {t('stage.empty')}\n </Typography>\n ) : (\n <TableContainer component={Paper} sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table aria-label={t('stage.title')} data-testid=\"stage-table\" size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('stage.column.package')}</TableCell>\n <TableCell>{t('stage.column.version')}</TableCell>\n <TableCell>{t('stage.column.tag')}</TableCell>\n <TableCell>{t('stage.column.stagedBy')}</TableCell>\n <TableCell>{t('stage.column.date')}</TableCell>\n <TableCell align=\"right\">{t('stage.column.actions')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {items.map((item) => (\n <TableRow data-testid={`stage-row-${item.id}`} hover={true} key={item.id}>\n <TableCell>\n <Button\n onClick={() => navigate(Route.STAGE_DETAIL.replace(':stageId', item.id))}\n size=\"small\"\n sx={{ textTransform: 'none' }}\n >\n {item.packageName}\n </Button>\n </TableCell>\n <TableCell>{item.version}</TableCell>\n <TableCell>\n <Chip label={item.tag} size=\"small\" />\n </TableCell>\n <TableCell>{item.actor}</TableCell>\n <TableCell>{new Date(item.createdAt).toLocaleString()}</TableCell>\n <TableCell align=\"right\">\n <Box alignItems=\"center\" display=\"flex\" gap={1} justifyContent=\"flex-end\">\n <Button\n data-testid={`stage-download-${item.id}`}\n onClick={() => handleDownload(item)}\n size=\"small\"\n >\n {t('stage.action.download')}\n </Button>\n <StageActions item={item} onDone={() => mutate()} />\n </Box>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <TablePagination\n component=\"div\"\n count={data?.total ?? 0}\n onPageChange={(_event, nextPage) => setPage(nextPage)}\n onRowsPerPageChange={(event) => {\n setPerPage(Number.parseInt(event.target.value, 10));\n setPage(0);\n }}\n page={page}\n rowsPerPage={perPage}\n rowsPerPageOptions={[10, 25, 50, 100]}\n />\n </TableContainer>\n )}\n </Box>\n );\n};\n\nexport default StageList;\n"],"mappings":";;;;;;;;;;;AAyBA,IAAM,kBAA4B;CAChC,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,kBAAkB;CACrC,MAAM,CAAC,MAAM,WAAW,SAAS,CAAC;CAClC,MAAM,CAAC,SAAS,cAAc,SAAS,EAAE;CACzC,MAAM,EAAE,MAAM,OAAO,WAAW,WAAW,aAAa,MAAM,OAAO;CAErE,MAAM,iBAAiB,YAAY,OAAO,SAA8B;EACtE,MAAM,sBAAsB,IAAI;
|
|
1
|
+
{"version":3,"file":"StageList.mjs","names":[],"sources":["../../../src/sections/Stage/StageList.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n CircularProgress,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow,\n Typography,\n} from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { Route } from '../../utils';\nimport StageActions from './StageActions';\nimport { useRequireSession } from './useRequireSession';\nimport type { StagePackageVersion } from './types';\nimport { downloadStagedTarball, useStageList } from './useStage';\n\nconst StageList: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const isLoggedIn = useRequireSession();\n const [page, setPage] = useState(0);\n const [perPage, setPerPage] = useState(10);\n const [actionError, setActionError] = useState(false);\n const { data, error, isLoading, mutate } = useStageList(page, perPage);\n\n const handleDownload = useCallback(async (item: StagePackageVersion) => {\n try {\n setActionError(false);\n await downloadStagedTarball(item);\n } catch (err) {\n console.error('Error downloading staged tarball:', err);\n setActionError(true);\n }\n }, []);\n\n // the redirect lands on the next effect; rendering the table meanwhile would\n // only show an empty state that is about to disappear\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) {\n return (\n <Box padding={2}>\n <Typography color=\"error\" role=\"alert\">\n {t('stage.error.list')}\n </Typography>\n </Box>\n );\n }\n\n const items = data?.items ?? [];\n\n return (\n <Box padding={2}>\n <Typography component=\"h1\" gutterBottom={true} variant=\"h5\">\n {t('stage.title')}\n </Typography>\n <Typography color=\"text.secondary\" gutterBottom={true} variant=\"body2\">\n {t('stage.description')}\n </Typography>\n\n {actionError && (\n <Typography color=\"error\" role=\"alert\" variant=\"body2\">\n {t('stage.error.action')}\n </Typography>\n )}\n\n {items.length === 0 ? (\n <Typography color=\"text.secondary\" marginTop={2}>\n {t('stage.empty')}\n </Typography>\n ) : (\n <TableContainer component={Paper} sx={{ marginTop: 2, overflowX: 'auto' }}>\n <Table aria-label={t('stage.title')} data-testid=\"stage-table\" size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('stage.column.package')}</TableCell>\n <TableCell>{t('stage.column.version')}</TableCell>\n <TableCell>{t('stage.column.tag')}</TableCell>\n <TableCell>{t('stage.column.stagedBy')}</TableCell>\n <TableCell>{t('stage.column.date')}</TableCell>\n <TableCell align=\"right\">{t('stage.column.actions')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {items.map((item) => (\n <TableRow data-testid={`stage-row-${item.id}`} hover={true} key={item.id}>\n <TableCell>\n <Button\n onClick={() => navigate(Route.STAGE_DETAIL.replace(':stageId', item.id))}\n size=\"small\"\n sx={{ textTransform: 'none' }}\n >\n {item.packageName}\n </Button>\n </TableCell>\n <TableCell>{item.version}</TableCell>\n <TableCell>\n <Chip label={item.tag} size=\"small\" />\n </TableCell>\n <TableCell>{item.actor}</TableCell>\n <TableCell>{new Date(item.createdAt).toLocaleString()}</TableCell>\n <TableCell align=\"right\">\n <Box alignItems=\"center\" display=\"flex\" gap={1} justifyContent=\"flex-end\">\n <Button\n data-testid={`stage-download-${item.id}`}\n onClick={() => handleDownload(item)}\n size=\"small\"\n >\n {t('stage.action.download')}\n </Button>\n <StageActions item={item} onDone={() => mutate()} />\n </Box>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <TablePagination\n component=\"div\"\n count={data?.total ?? 0}\n onPageChange={(_event, nextPage) => setPage(nextPage)}\n onRowsPerPageChange={(event) => {\n setPerPage(Number.parseInt(event.target.value, 10));\n setPage(0);\n }}\n page={page}\n rowsPerPage={perPage}\n rowsPerPageOptions={[10, 25, 50, 100]}\n />\n </TableContainer>\n )}\n </Box>\n );\n};\n\nexport default StageList;\n"],"mappings":"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"}
|
package/build/store/api.js
CHANGED
|
@@ -21,6 +21,11 @@ function handleResponseType(response) {
|
|
|
21
21
|
response.blob(),
|
|
22
22
|
response.status
|
|
23
23
|
]);
|
|
24
|
+
if (contentType?.includes("application/octet-stream") || contentType?.includes("application/gzip")) return Promise.all([
|
|
25
|
+
response.ok,
|
|
26
|
+
response.blob(),
|
|
27
|
+
response.status
|
|
28
|
+
]);
|
|
24
29
|
if (contentType?.includes("application/json")) return Promise.all([
|
|
25
30
|
response.ok,
|
|
26
31
|
response.json(),
|
|
@@ -48,11 +53,9 @@ var API = class {
|
|
|
48
53
|
request(url, method = "GET", options = { headers: {} }) {
|
|
49
54
|
const token = require_storage.default.getItem("token");
|
|
50
55
|
const headers = new Headers(options.headers);
|
|
51
|
-
if (token && headers.has(AuthHeader) === false) {
|
|
52
|
-
headers.set(AuthHeader, `Bearer ${token}`);
|
|
53
|
-
options.headers = headers;
|
|
54
|
-
}
|
|
56
|
+
if (token && headers.has(AuthHeader) === false) headers.set(AuthHeader, `Bearer ${token}`);
|
|
55
57
|
headers.set("x-client", "verdaccio-ui");
|
|
58
|
+
options.headers = headers;
|
|
56
59
|
return new Promise((resolve, reject) => {
|
|
57
60
|
fetch(url, {
|
|
58
61
|
method,
|