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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keycloakify",
3
- "version": "6.5.0",
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.3",
1298
+ "tss-react": "^4.3.4",
1295
1299
  "zod": "^3.17.10"
1296
1300
  }
1297
1301
  }
@@ -14,6 +14,7 @@ import { Reflect } from "tsafe/Reflect";
14
14
  export const pageIds = [
15
15
  "login.ftl",
16
16
  "login-username.ftl",
17
+ "login-password.ftl",
17
18
  "register.ftl",
18
19
  "register-user-profile.ftl",
19
20
  "info.ftl",
@@ -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",