keycloakify 6.5.0 → 6.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/bin/keycloakify/generateFtl/generateFtl.d.ts +1 -1
- package/bin/keycloakify/generateFtl/generateFtl.js +1 -0
- package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
- package/bin/tsconfig.tsbuildinfo +1 -1
- package/lib/components/KcApp.js +3 -0
- package/lib/components/KcApp.js.map +1 -1
- package/lib/components/LoginPassword.d.ts +10 -0
- package/lib/components/LoginPassword.js +44 -0
- package/lib/components/LoginPassword.js.map +1 -0
- package/lib/getKcContext/KcContextBase.d.ts +23 -1
- package/lib/getKcContext/KcContextBase.js.map +1 -1
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js +3 -0
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -2
- package/src/bin/keycloakify/generateFtl/generateFtl.ts +1 -0
- package/src/lib/components/KcApp.tsx +3 -0
- package/src/lib/components/LoginPassword.tsx +96 -0
- package/src/lib/getKcContext/KcContextBase.ts +24 -0
- package/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts +13 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "keycloakify",
|
3
|
-
"version": "6.
|
3
|
+
"version": "6.6.1",
|
4
4
|
"description": "Keycloak theme generator for Reacts app",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -70,6 +70,7 @@
|
|
70
70
|
"src/lib/components/LoginIdpLinkEmail.tsx",
|
71
71
|
"src/lib/components/LoginOtp.tsx",
|
72
72
|
"src/lib/components/LoginPageExpired.tsx",
|
73
|
+
"src/lib/components/LoginPassword.tsx",
|
73
74
|
"src/lib/components/LoginResetPassword.tsx",
|
74
75
|
"src/lib/components/LoginUpdatePassword.tsx",
|
75
76
|
"src/lib/components/LoginUpdateProfile.tsx",
|
@@ -468,6 +469,9 @@
|
|
468
469
|
"lib/components/LoginPageExpired.d.ts",
|
469
470
|
"lib/components/LoginPageExpired.js",
|
470
471
|
"lib/components/LoginPageExpired.js.map",
|
472
|
+
"lib/components/LoginPassword.d.ts",
|
473
|
+
"lib/components/LoginPassword.js",
|
474
|
+
"lib/components/LoginPassword.js.map",
|
471
475
|
"lib/components/LoginResetPassword.d.ts",
|
472
476
|
"lib/components/LoginResetPassword.js",
|
473
477
|
"lib/components/LoginResetPassword.js.map",
|
@@ -1291,7 +1295,7 @@
|
|
1291
1295
|
"react-markdown": "^5.0.3",
|
1292
1296
|
"scripting-tools": "^0.19.13",
|
1293
1297
|
"tsafe": "^1.1.1",
|
1294
|
-
"tss-react": "^4.3.
|
1298
|
+
"tss-react": "^4.3.4",
|
1295
1299
|
"zod": "^3.17.10"
|
1296
1300
|
}
|
1297
1301
|
}
|
@@ -13,6 +13,7 @@ const LoginResetPassword = lazy(() => import("./LoginResetPassword"));
|
|
13
13
|
const LoginVerifyEmail = lazy(() => import("./LoginVerifyEmail"));
|
14
14
|
const Terms = lazy(() => import("./Terms"));
|
15
15
|
const LoginOtp = lazy(() => import("./LoginOtp"));
|
16
|
+
const LoginPassword = lazy(() => import("./LoginPassword"));
|
16
17
|
const LoginUsername = lazy(() => import("./LoginUsername"));
|
17
18
|
const LoginUpdatePassword = lazy(() => import("./LoginUpdatePassword"));
|
18
19
|
const LoginUpdateProfile = lazy(() => import("./LoginUpdateProfile"));
|
@@ -70,6 +71,8 @@ const KcApp = memo(
|
|
70
71
|
return <LoginOtp {...{ kcContext, ...props }} />;
|
71
72
|
case "login-username.ftl":
|
72
73
|
return <LoginUsername {...{ kcContext, ...props }} />;
|
74
|
+
case "login-password.ftl":
|
75
|
+
return <LoginPassword {...{ kcContext, ...props }} />;
|
73
76
|
case "login-update-password.ftl":
|
74
77
|
return <LoginUpdatePassword {...{ kcContext, ...props }} />;
|
75
78
|
case "login-update-profile.ftl":
|
@@ -0,0 +1,96 @@
|
|
1
|
+
import React, { useState, memo } from "react";
|
2
|
+
import Template from "./Template";
|
3
|
+
import type { KcProps } from "./KcProps";
|
4
|
+
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
5
|
+
import { useCssAndCx } from "../tools/useCssAndCx";
|
6
|
+
import { useConstCallback } from "powerhooks/useConstCallback";
|
7
|
+
import type { FormEventHandler } from "react";
|
8
|
+
import type { I18n } from "../i18n";
|
9
|
+
|
10
|
+
const LoginPassword = memo(
|
11
|
+
({
|
12
|
+
kcContext,
|
13
|
+
i18n,
|
14
|
+
doFetchDefaultThemeResources = true,
|
15
|
+
...props
|
16
|
+
}: { kcContext: KcContextBase.LoginPassword; i18n: I18n; doFetchDefaultThemeResources?: boolean } & KcProps) => {
|
17
|
+
const { realm, url, login } = kcContext;
|
18
|
+
|
19
|
+
const { msg, msgStr } = i18n;
|
20
|
+
|
21
|
+
const { cx } = useCssAndCx();
|
22
|
+
|
23
|
+
const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
|
24
|
+
|
25
|
+
const onSubmit = useConstCallback<FormEventHandler<HTMLFormElement>>(e => {
|
26
|
+
e.preventDefault();
|
27
|
+
|
28
|
+
setIsLoginButtonDisabled(true);
|
29
|
+
|
30
|
+
const formElement = e.target as HTMLFormElement;
|
31
|
+
|
32
|
+
formElement.submit();
|
33
|
+
});
|
34
|
+
|
35
|
+
return (
|
36
|
+
<Template
|
37
|
+
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...props }}
|
38
|
+
headerNode={msg("doLogIn")}
|
39
|
+
formNode={
|
40
|
+
<div id="kc-form">
|
41
|
+
<div id="kc-form-wrapper">
|
42
|
+
<form id="kc-form-login" onSubmit={onSubmit} action={url.loginAction} method="post">
|
43
|
+
<div className={cx(props.kcFormGroupClass)}>
|
44
|
+
<hr />
|
45
|
+
<label htmlFor="password" className={cx(props.kcLabelClass)}>
|
46
|
+
{msg("password")}
|
47
|
+
</label>
|
48
|
+
<input
|
49
|
+
tabIndex={2}
|
50
|
+
id="password"
|
51
|
+
className={cx(props.kcInputClass)}
|
52
|
+
name="password"
|
53
|
+
type="password"
|
54
|
+
autoFocus={true}
|
55
|
+
autoComplete="on"
|
56
|
+
defaultValue={login.password ?? ""}
|
57
|
+
/>
|
58
|
+
</div>
|
59
|
+
<div className={cx(props.kcFormGroupClass, props.kcFormSettingClass)}>
|
60
|
+
<div id="kc-form-options" />
|
61
|
+
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
62
|
+
{realm.resetPasswordAllowed && (
|
63
|
+
<span>
|
64
|
+
<a tabIndex={5} href={url.loginResetCredentialsUrl}>
|
65
|
+
{msg("doForgotPassword")}
|
66
|
+
</a>
|
67
|
+
</span>
|
68
|
+
)}
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<div id="kc-form-buttons" className={cx(props.kcFormGroupClass)}>
|
72
|
+
<input
|
73
|
+
tabIndex={4}
|
74
|
+
className={cx(
|
75
|
+
props.kcButtonClass,
|
76
|
+
props.kcButtonPrimaryClass,
|
77
|
+
props.kcButtonBlockClass,
|
78
|
+
props.kcButtonLargeClass
|
79
|
+
)}
|
80
|
+
name="login"
|
81
|
+
id="kc-login"
|
82
|
+
type="submit"
|
83
|
+
value={msgStr("doLogIn")}
|
84
|
+
disabled={isLoginButtonDisabled}
|
85
|
+
/>
|
86
|
+
</div>
|
87
|
+
</form>
|
88
|
+
</div>
|
89
|
+
</div>
|
90
|
+
}
|
91
|
+
/>
|
92
|
+
);
|
93
|
+
}
|
94
|
+
);
|
95
|
+
|
96
|
+
export default LoginPassword;
|
@@ -20,6 +20,7 @@ export type KcContextBase =
|
|
20
20
|
| KcContextBase.Terms
|
21
21
|
| KcContextBase.LoginOtp
|
22
22
|
| KcContextBase.LoginUsername
|
23
|
+
| KcContextBase.LoginPassword
|
23
24
|
| KcContextBase.LoginUpdatePassword
|
24
25
|
| KcContextBase.LoginUpdateProfile
|
25
26
|
| KcContextBase.LoginIdpLinkConfirm
|
@@ -229,6 +230,29 @@ export declare namespace KcContextBase {
|
|
229
230
|
};
|
230
231
|
};
|
231
232
|
|
233
|
+
export type LoginPassword = Common & {
|
234
|
+
pageId: "login-password.ftl";
|
235
|
+
url: {
|
236
|
+
loginResetCredentialsUrl: string;
|
237
|
+
registrationUrl: string;
|
238
|
+
};
|
239
|
+
realm: {
|
240
|
+
resetPasswordAllowed: boolean;
|
241
|
+
};
|
242
|
+
auth?: {
|
243
|
+
showUsername?: boolean;
|
244
|
+
showResetCredentials?: boolean;
|
245
|
+
showTryAnotherWayLink?: boolean;
|
246
|
+
attemptedUsername?: string;
|
247
|
+
};
|
248
|
+
social: {
|
249
|
+
displayInfo: boolean;
|
250
|
+
};
|
251
|
+
login: {
|
252
|
+
password?: string;
|
253
|
+
};
|
254
|
+
};
|
255
|
+
|
232
256
|
export type LoginUpdatePassword = Common & {
|
233
257
|
pageId: "login-update-password.ftl";
|
234
258
|
username: string;
|
@@ -380,6 +380,19 @@ export const kcContextMocks: KcContextBase[] = [
|
|
380
380
|
},
|
381
381
|
"registrationDisabled": false
|
382
382
|
}),
|
383
|
+
id<KcContextBase.LoginPassword>({
|
384
|
+
...kcContextCommonMock,
|
385
|
+
"pageId": "login-password.ftl",
|
386
|
+
"url": loginUrl,
|
387
|
+
"realm": {
|
388
|
+
...kcContextCommonMock.realm,
|
389
|
+
"resetPasswordAllowed": true
|
390
|
+
},
|
391
|
+
"social": {
|
392
|
+
"displayInfo": false
|
393
|
+
},
|
394
|
+
"login": {}
|
395
|
+
}),
|
383
396
|
id<KcContextBase.LoginUpdatePassword>({
|
384
397
|
...kcContextCommonMock,
|
385
398
|
"pageId": "login-update-password.ftl",
|