keycloakify 7.0.0-rc.7 → 7.0.0
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 +6 -0
- package/account/Template.js +4 -2
- package/account/Template.js.map +1 -1
- package/account/TemplateProps.d.ts +2 -1
- package/account/kcContext/KcContext.d.ts +6 -4
- package/account/kcContext/KcContext.js.map +1 -1
- package/account/kcContext/getKcContext.js +4 -1
- package/account/kcContext/getKcContext.js.map +1 -1
- package/account/kcContext/getKcContextFromWindow.d.ts +1 -1
- package/account/kcContext/getKcContextFromWindow.js.map +1 -1
- package/account/kcContext/kcContextMocks.js +8 -5
- package/account/kcContext/kcContextMocks.js.map +1 -1
- package/account/lib/useGetClassName.d.ts +7 -0
- package/account/lib/useGetClassName.js +11 -0
- package/account/lib/useGetClassName.js.map +1 -0
- package/account/pages/Account.d.ts +1 -1
- package/account/pages/Account.js +5 -6
- package/account/pages/Account.js.map +1 -1
- package/account/pages/PageProps.d.ts +1 -3
- package/account/pages/PageProps.js +1 -7
- package/account/pages/PageProps.js.map +1 -1
- package/account/pages/Password.d.ts +1 -1
- package/account/pages/Password.js +6 -6
- package/account/pages/Password.js.map +1 -1
- package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +9 -7
- package/bin/keycloakify/keycloakify.js +16 -7
- package/bin/keycloakify/keycloakify.js.map +1 -1
- package/lib/useGetClassName.d.ts +8 -4
- package/lib/useGetClassName.js +10 -6
- package/lib/useGetClassName.js.map +1 -1
- package/lib/usePrepareTemplate.js +2 -2
- package/lib/usePrepareTemplate.js.map +1 -1
- package/login/Template.js +2 -6
- package/login/Template.js.map +1 -1
- package/login/TemplateProps.d.ts +2 -3
- package/login/TemplateProps.js +1 -22
- package/login/TemplateProps.js.map +1 -1
- package/login/kcContext/getKcContext.js +3 -0
- package/login/kcContext/getKcContext.js.map +1 -1
- package/login/lib/useGetClassName.d.ts +7 -0
- package/login/lib/useGetClassName.js +88 -0
- package/login/lib/useGetClassName.js.map +1 -0
- package/login/pages/Error.d.ts +1 -1
- package/login/pages/IdpReviewUserProfile.d.ts +1 -1
- package/login/pages/IdpReviewUserProfile.js +2 -3
- package/login/pages/IdpReviewUserProfile.js.map +1 -1
- package/login/pages/Info.d.ts +1 -1
- package/login/pages/Login.d.ts +1 -1
- package/login/pages/Login.js +2 -3
- package/login/pages/Login.js.map +1 -1
- package/login/pages/LoginConfigTotp.d.ts +1 -1
- package/login/pages/LoginConfigTotp.js +2 -3
- package/login/pages/LoginConfigTotp.js.map +1 -1
- package/login/pages/LoginIdpLinkConfirm.d.ts +1 -1
- package/login/pages/LoginIdpLinkConfirm.js +2 -3
- package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
- package/login/pages/LoginIdpLinkEmail.d.ts +1 -1
- package/login/pages/LoginOtp.d.ts +1 -1
- package/login/pages/LoginOtp.js +2 -3
- package/login/pages/LoginOtp.js.map +1 -1
- package/login/pages/LoginPageExpired.d.ts +1 -1
- package/login/pages/LoginPassword.d.ts +1 -1
- package/login/pages/LoginPassword.js +2 -3
- package/login/pages/LoginPassword.js.map +1 -1
- package/login/pages/LoginResetPassword.d.ts +1 -1
- package/login/pages/LoginResetPassword.js +2 -3
- package/login/pages/LoginResetPassword.js.map +1 -1
- package/login/pages/LoginUpdatePassword.d.ts +1 -1
- package/login/pages/LoginUpdatePassword.js +2 -3
- package/login/pages/LoginUpdatePassword.js.map +1 -1
- package/login/pages/LoginUpdateProfile.d.ts +1 -1
- package/login/pages/LoginUpdateProfile.js +2 -3
- package/login/pages/LoginUpdateProfile.js.map +1 -1
- package/login/pages/LoginUsername.d.ts +1 -1
- package/login/pages/LoginUsername.js +2 -3
- package/login/pages/LoginUsername.js.map +1 -1
- package/login/pages/LoginVerifyEmail.d.ts +1 -1
- package/login/pages/LogoutConfirm.d.ts +1 -1
- package/login/pages/LogoutConfirm.js +2 -3
- package/login/pages/LogoutConfirm.js.map +1 -1
- package/login/pages/PageProps.d.ts +2 -4
- package/login/pages/PageProps.js +1 -20
- package/login/pages/PageProps.js.map +1 -1
- package/login/pages/Register.d.ts +1 -1
- package/login/pages/Register.js +2 -3
- package/login/pages/Register.js.map +1 -1
- package/login/pages/RegisterUserProfile.d.ts +1 -1
- package/login/pages/RegisterUserProfile.js +2 -3
- package/login/pages/RegisterUserProfile.js.map +1 -1
- package/login/pages/Terms.d.ts +1 -1
- package/login/pages/Terms.js +2 -3
- package/login/pages/Terms.js.map +1 -1
- package/login/pages/UpdateUserProfile.d.ts +1 -1
- package/login/pages/UpdateUserProfile.js +2 -3
- package/login/pages/UpdateUserProfile.js.map +1 -1
- package/login/pages/WebauthnAuthenticate.d.ts +1 -1
- package/login/pages/WebauthnAuthenticate.js +2 -6
- package/login/pages/WebauthnAuthenticate.js.map +1 -1
- package/login/pages/shared/UserProfileCommons.d.ts +1 -1
- package/package.json +9 -1
- package/src/account/Template.tsx +5 -2
- package/src/account/TemplateProps.ts +3 -1
- package/src/account/kcContext/KcContext.ts +6 -4
- package/src/account/kcContext/getKcContext.ts +5 -1
- package/src/account/kcContext/getKcContextFromWindow.ts +1 -1
- package/src/account/kcContext/kcContextMocks.ts +9 -7
- package/src/account/lib/useGetClassName.ts +12 -0
- package/src/account/pages/Account.tsx +12 -9
- package/src/account/pages/PageProps.ts +1 -11
- package/src/account/pages/Password.tsx +11 -8
- package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +9 -7
- package/src/bin/keycloakify/keycloakify.ts +25 -13
- package/src/lib/useGetClassName.ts +12 -9
- package/src/lib/usePrepareTemplate.ts +2 -2
- package/src/login/Template.tsx +3 -6
- package/src/login/TemplateProps.ts +56 -26
- package/src/login/kcContext/getKcContext.ts +4 -0
- package/src/login/lib/useGetClassName.ts +100 -0
- package/src/login/pages/Error.tsx +1 -1
- package/src/login/pages/IdpReviewUserProfile.tsx +3 -3
- package/src/login/pages/Info.tsx +1 -1
- package/src/login/pages/Login.tsx +3 -3
- package/src/login/pages/LoginConfigTotp.tsx +3 -3
- package/src/login/pages/LoginIdpLinkConfirm.tsx +3 -3
- package/src/login/pages/LoginIdpLinkEmail.tsx +1 -1
- package/src/login/pages/LoginOtp.tsx +3 -3
- package/src/login/pages/LoginPageExpired.tsx +1 -1
- package/src/login/pages/LoginPassword.tsx +3 -3
- package/src/login/pages/LoginResetPassword.tsx +3 -3
- package/src/login/pages/LoginUpdatePassword.tsx +3 -3
- package/src/login/pages/LoginUpdateProfile.tsx +3 -3
- package/src/login/pages/LoginUsername.tsx +3 -3
- package/src/login/pages/LoginVerifyEmail.tsx +1 -1
- package/src/login/pages/LogoutConfirm.tsx +3 -3
- package/src/login/pages/PageProps.ts +2 -135
- package/src/login/pages/Register.tsx +3 -3
- package/src/login/pages/RegisterUserProfile.tsx +3 -3
- package/src/login/pages/Terms.tsx +3 -3
- package/src/login/pages/UpdateUserProfile.tsx +3 -3
- package/src/login/pages/WebauthnAuthenticate.tsx +3 -6
- package/src/login/pages/shared/UserProfileCommons.tsx +1 -1
- package/src/tools/AndByDiscriminatingKey.ts +5 -1
- package/tools/AndByDiscriminatingKey.d.ts +1 -1
@@ -1,6 +1,6 @@
|
|
1
1
|
import { clsx } from "keycloakify/tools/clsx";
|
2
|
-
import {
|
3
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
2
|
+
import type { PageProps } from "keycloakify/account/pages/PageProps";
|
3
|
+
import { useGetClassName } from "keycloakify/account/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
6
|
|
@@ -8,8 +8,11 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
8
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
9
9
|
|
10
10
|
const { getClassName } = useGetClassName({
|
11
|
-
|
12
|
-
classes
|
11
|
+
doUseDefaultCss,
|
12
|
+
"classes": {
|
13
|
+
...classes,
|
14
|
+
"kcBodyClass": clsx(classes?.kcBodyClass, "user")
|
15
|
+
}
|
13
16
|
});
|
14
17
|
|
15
18
|
const { url, realm, messagesPerField, stateChecker, account } = kcContext;
|
@@ -17,7 +20,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
17
20
|
const { msg } = i18n;
|
18
21
|
|
19
22
|
return (
|
20
|
-
<Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="account"
|
23
|
+
<Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="account">
|
21
24
|
<div className="row">
|
22
25
|
<div className="col-md-10">
|
23
26
|
<h2>{msg("editAccountHtmlTitle")}</h2>
|
@@ -33,7 +36,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
33
36
|
<input type="hidden" id="stateChecker" name="stateChecker" value={stateChecker} />
|
34
37
|
|
35
38
|
{!realm.registrationEmailAsUsername && (
|
36
|
-
<div className="form-group
|
39
|
+
<div className={clsx("form-group", messagesPerField.printIfExists("username", "has-error"))}>
|
37
40
|
<div className="col-sm-2 col-md-2">
|
38
41
|
<label htmlFor="username" className="control-label">
|
39
42
|
{msg("username")}
|
@@ -48,7 +51,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
48
51
|
id="username"
|
49
52
|
name="username"
|
50
53
|
disabled={!realm.editUsernameAllowed}
|
51
|
-
value=
|
54
|
+
value={account.username ?? ""}
|
52
55
|
/>
|
53
56
|
</div>
|
54
57
|
</div>
|
@@ -63,7 +66,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
63
66
|
</div>
|
64
67
|
|
65
68
|
<div className="col-sm-10 col-md-10">
|
66
|
-
<input type="text" className="form-control" id="email" name="email" autoFocus value=
|
69
|
+
<input type="text" className="form-control" id="email" name="email" autoFocus value={account.email ?? ""} />
|
67
70
|
</div>
|
68
71
|
</div>
|
69
72
|
|
@@ -89,7 +92,7 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
89
92
|
</div>
|
90
93
|
|
91
94
|
<div className="col-sm-10 col-md-10">
|
92
|
-
<input type="text" className="form-control" id="lastName" name="lastName" value={account.lastName
|
95
|
+
<input type="text" className="form-control" id="lastName" name="lastName" value={account.lastName ?? ""} />
|
93
96
|
</div>
|
94
97
|
</div>
|
95
98
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import type { LazyExoticComponent } from "react";
|
2
2
|
import type { I18n } from "keycloakify/account/i18n";
|
3
|
-
import {
|
3
|
+
import type { TemplateProps, ClassKey } from "keycloakify/account/TemplateProps";
|
4
4
|
|
5
5
|
export type PageProps<KcContext, I18nExtended extends I18n> = {
|
6
6
|
Template: LazyExoticComponent<(props: TemplateProps<any, any>) => JSX.Element | null>;
|
@@ -9,13 +9,3 @@ export type PageProps<KcContext, I18nExtended extends I18n> = {
|
|
9
9
|
doUseDefaultCss: boolean;
|
10
10
|
classes?: Partial<Record<ClassKey, string>>;
|
11
11
|
};
|
12
|
-
|
13
|
-
export type ClassKey = "kcButtonClass" | "kcButtonPrimaryClass" | "kcButtonLargeClass" | "kcButtonDefaultClass";
|
14
|
-
|
15
|
-
export const defaultClasses: Record<ClassKey, string | undefined> = {
|
16
|
-
/** password.ftl */
|
17
|
-
"kcButtonClass": "btn",
|
18
|
-
"kcButtonPrimaryClass": "btn-primary",
|
19
|
-
"kcButtonLargeClass": "btn-lg",
|
20
|
-
"kcButtonDefaultClass": "btn-default"
|
21
|
-
};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { clsx } from "keycloakify/tools/clsx";
|
2
|
-
import {
|
3
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
2
|
+
import type { PageProps } from "keycloakify/account/pages/PageProps";
|
3
|
+
import { useGetClassName } from "keycloakify/account/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
6
|
|
@@ -8,16 +8,19 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
8
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
9
9
|
|
10
10
|
const { getClassName } = useGetClassName({
|
11
|
-
|
12
|
-
classes
|
11
|
+
doUseDefaultCss,
|
12
|
+
"classes": {
|
13
|
+
...classes,
|
14
|
+
"kcBodyClass": clsx(classes?.kcBodyClass, "password")
|
15
|
+
}
|
13
16
|
});
|
14
17
|
|
15
|
-
const { password } = kcContext;
|
18
|
+
const { url, password, account } = kcContext;
|
16
19
|
|
17
20
|
const { msg } = i18n;
|
18
21
|
|
19
22
|
return (
|
20
|
-
<Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="password"
|
23
|
+
<Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="password">
|
21
24
|
<div className="row">
|
22
25
|
<div className="col-md-10">
|
23
26
|
<h2>{msg("changePasswordHtmlTitle")}</h2>
|
@@ -27,12 +30,12 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
|
|
27
30
|
</div>
|
28
31
|
</div>
|
29
32
|
|
30
|
-
<form action=
|
33
|
+
<form action={url.passwordUrl} className="form-horizontal" method="post">
|
31
34
|
<input
|
32
35
|
type="text"
|
33
36
|
id="username"
|
34
37
|
name="username"
|
35
|
-
value=
|
38
|
+
value={account.username ?? ""}
|
36
39
|
autoComplete="username"
|
37
40
|
readOnly
|
38
41
|
style={{ "display": "none;" }}
|
@@ -110,14 +110,16 @@
|
|
110
110
|
}
|
111
111
|
};
|
112
112
|
|
113
|
-
|
113
|
+
<#if account??>
|
114
|
+
out["url"]["getLogoutUrl"] = function () {
|
115
|
+
<#attempt>
|
116
|
+
return "${url.getLogoutUrl()}";
|
117
|
+
<#recover>
|
118
|
+
</#attempt>
|
119
|
+
};
|
120
|
+
</#if>
|
114
121
|
|
115
|
-
out["
|
116
|
-
<#attempt>
|
117
|
-
return "${url.getLogoutUrl()}";
|
118
|
-
<#recover>
|
119
|
-
</#attempt>
|
120
|
-
};
|
122
|
+
out["pageId"] = "${pageId}";
|
121
123
|
|
122
124
|
return out;
|
123
125
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { generateKeycloakThemeResources } from "./generateKeycloakThemeResources";
|
2
2
|
import { generateJavaStackFiles } from "./generateJavaStackFiles";
|
3
|
-
import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path";
|
3
|
+
import { join as pathJoin, relative as pathRelative, basename as pathBasename, sep as pathSep } from "path";
|
4
4
|
import * as child_process from "child_process";
|
5
5
|
import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer";
|
6
6
|
import * as fs from "fs";
|
@@ -42,7 +42,7 @@ export async function main() {
|
|
42
42
|
"reactAppBuildDirPath": pathJoin(reactProjectDirPath, "build"),
|
43
43
|
buildOptions,
|
44
44
|
//We have to leave it at that otherwise we break our default theme.
|
45
|
-
//Problem is that we can
|
45
|
+
//Problem is that we can`t guarantee that the the old resources
|
46
46
|
//will still be available on the newer keycloak version.
|
47
47
|
"keycloakVersion": "11.0.3"
|
48
48
|
});
|
@@ -121,19 +121,31 @@ export async function main() {
|
|
121
121
|
"",
|
122
122
|
`To test your theme locally you can spin up a Keycloak ${containerKeycloakVersion} container image with the theme pre loaded by running:`,
|
123
123
|
"",
|
124
|
-
`👉 $
|
124
|
+
`👉 $ .${pathSep}${pathRelative(
|
125
|
+
reactProjectDirPath,
|
126
|
+
pathJoin(keycloakThemeBuildingDirPath, generateStartKeycloakTestingContainer.basename)
|
127
|
+
)} 👈`,
|
125
128
|
"",
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
+
`Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags`,
|
130
|
+
``,
|
131
|
+
`Once your container is up and running: `,
|
129
132
|
"- Log into the admin console 👉 http://localhost:8080/admin username: admin, password: admin 👈",
|
130
|
-
|
131
|
-
|
132
|
-
`-
|
133
|
-
`-
|
134
|
-
|
135
|
-
|
136
|
-
|
133
|
+
`- Create a realm: myrealm`,
|
134
|
+
`- Enable registration: Realm settings -> Login tab -> User registration: on`,
|
135
|
+
`- Enable the Account theme: Realm settings -> Themes tab -> Account theme, select ${buildOptions.themeName} `,
|
136
|
+
`- Create a client id myclient`,
|
137
|
+
` Root URL: https://www.keycloak.org/app/`,
|
138
|
+
` Valid redirect URIs: https://www.keycloak.org/app* http://localhost* (localhost is optional)`,
|
139
|
+
` Valid post logout redirect URIs: https://www.keycloak.org/app* http://localhost*`,
|
140
|
+
` Web origins: *`,
|
141
|
+
` Login Theme: ${buildOptions.themeName}`,
|
142
|
+
` Save (button at the bottom of the page)`,
|
143
|
+
``,
|
144
|
+
`- Go to 👉 https://www.keycloak.org/app/ 👈 Click "Save" then "Sign in". You should see your login page`,
|
145
|
+
`- Got to 👉 http://localhost:8080/realms/myrealm/account 👈 to see your account theme`,
|
146
|
+
``,
|
147
|
+
`Video tutorial: https://youtu.be/WMyGZNHQkjU`,
|
148
|
+
``
|
137
149
|
].join("\n")
|
138
150
|
);
|
139
151
|
}
|
@@ -1,15 +1,18 @@
|
|
1
1
|
import { clsx } from "keycloakify/tools/clsx";
|
2
2
|
import { useConstCallback } from "keycloakify/tools/useConstCallback";
|
3
3
|
|
4
|
-
export function
|
5
|
-
defaultClasses
|
6
|
-
classes?: Partial<Record<ClassKey, string>>;
|
7
|
-
}) {
|
8
|
-
const { defaultClasses, classes } = params;
|
4
|
+
export function createUseClassName<ClassKey extends string>(params: { defaultClasses: Record<ClassKey, string | undefined> }) {
|
5
|
+
const { defaultClasses } = params;
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
});
|
7
|
+
function useGetClassName(params: { doUseDefaultCss: boolean; classes: Partial<Record<ClassKey, string>> | undefined }) {
|
8
|
+
const { classes } = params;
|
13
9
|
|
14
|
-
|
10
|
+
const getClassName = useConstCallback((classKey: ClassKey): string => {
|
11
|
+
return clsx(classKey, defaultClasses[classKey], classes?.[classKey]);
|
12
|
+
});
|
13
|
+
|
14
|
+
return { getClassName };
|
15
|
+
}
|
16
|
+
|
17
|
+
return { useGetClassName };
|
15
18
|
}
|
@@ -80,9 +80,9 @@ function useSetClassName(params: { target: "html" | "body"; className: string |
|
|
80
80
|
return;
|
81
81
|
}
|
82
82
|
|
83
|
-
const htmlClassList = document.getElementsByTagName(
|
83
|
+
const htmlClassList = document.getElementsByTagName(target)[0].classList;
|
84
84
|
|
85
|
-
const tokens = clsx(
|
85
|
+
const tokens = clsx(className).split(" ");
|
86
86
|
|
87
87
|
htmlClassList.add(...tokens);
|
88
88
|
|
package/src/login/Template.tsx
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
import { assert } from "keycloakify/tools/assert";
|
2
2
|
import { clsx } from "keycloakify/tools/clsx";
|
3
3
|
import { usePrepareTemplate } from "keycloakify/lib/usePrepareTemplate";
|
4
|
-
import { type TemplateProps
|
5
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
4
|
+
import { type TemplateProps } from "keycloakify/login/TemplateProps";
|
5
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
6
6
|
import type { KcContext } from "./kcContext";
|
7
7
|
import type { I18n } from "./i18n";
|
8
8
|
|
@@ -23,10 +23,7 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
|
|
23
23
|
children
|
24
24
|
} = props;
|
25
25
|
|
26
|
-
const { getClassName } = useGetClassName({
|
27
|
-
"defaultClasses": !doUseDefaultCss ? undefined : defaultTemplateClasses,
|
28
|
-
classes
|
29
|
-
});
|
26
|
+
const { getClassName } = useGetClassName({ doUseDefaultCss, classes });
|
30
27
|
|
31
28
|
const { msg, changeLocale, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
|
32
29
|
|
@@ -6,7 +6,7 @@ export type TemplateProps<KcContext extends KcContext.Common, I18nExtended exten
|
|
6
6
|
kcContext: KcContext;
|
7
7
|
i18n: I18nExtended;
|
8
8
|
doUseDefaultCss: boolean;
|
9
|
-
classes?: Partial<Record<
|
9
|
+
classes?: Partial<Record<ClassKey, string>>;
|
10
10
|
|
11
11
|
displayInfo?: boolean;
|
12
12
|
displayMessage?: boolean;
|
@@ -20,7 +20,7 @@ export type TemplateProps<KcContext extends KcContext.Common, I18nExtended exten
|
|
20
20
|
children: ReactNode;
|
21
21
|
};
|
22
22
|
|
23
|
-
export type
|
23
|
+
export type ClassKey =
|
24
24
|
| "kcHtmlClass"
|
25
25
|
| "kcLoginClass"
|
26
26
|
| "kcHeaderClass"
|
@@ -40,27 +40,57 @@ export type TemplateClassKey =
|
|
40
40
|
| "kcFormSocialAccountContentClass"
|
41
41
|
| "kcFormSocialAccountClass"
|
42
42
|
| "kcSignUpClass"
|
43
|
-
| "kcInfoAreaWrapperClass"
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
"
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
"
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
"
|
66
|
-
|
43
|
+
| "kcInfoAreaWrapperClass"
|
44
|
+
| "kcLogoClass"
|
45
|
+
| "kcContainerClass"
|
46
|
+
| "kcContentClass"
|
47
|
+
| "kcFeedbackAreaClass"
|
48
|
+
| "kcLocaleClass"
|
49
|
+
| "kcAlertIconClasserror"
|
50
|
+
| "kcFormAreaClass"
|
51
|
+
| "kcFormSocialAccountListClass"
|
52
|
+
| "kcFormSocialAccountDoubleListClass"
|
53
|
+
| "kcFormSocialAccountListLinkClass"
|
54
|
+
| "kcWebAuthnKeyIcon"
|
55
|
+
| "kcWebAuthnDefaultIcon"
|
56
|
+
| "kcFormClass"
|
57
|
+
| "kcFormGroupErrorClass"
|
58
|
+
| "kcLabelClass"
|
59
|
+
| "kcInputClass"
|
60
|
+
| "kcInputErrorMessageClass"
|
61
|
+
| "kcInputWrapperClass"
|
62
|
+
| "kcFormOptionsClass"
|
63
|
+
| "kcFormButtonsClass"
|
64
|
+
| "kcFormSettingClass"
|
65
|
+
| "kcTextareaClass"
|
66
|
+
| "kcInfoAreaClass"
|
67
|
+
| "kcFormGroupHeader"
|
68
|
+
| "kcButtonClass"
|
69
|
+
| "kcButtonPrimaryClass"
|
70
|
+
| "kcButtonDefaultClass"
|
71
|
+
| "kcButtonLargeClass"
|
72
|
+
| "kcButtonBlockClass"
|
73
|
+
| "kcInputLargeClass"
|
74
|
+
| "kcSrOnlyClass"
|
75
|
+
| "kcSelectAuthListClass"
|
76
|
+
| "kcSelectAuthListItemClass"
|
77
|
+
| "kcSelectAuthListItemFillClass"
|
78
|
+
| "kcSelectAuthListItemInfoClass"
|
79
|
+
| "kcSelectAuthListItemLeftClass"
|
80
|
+
| "kcSelectAuthListItemBodyClass"
|
81
|
+
| "kcSelectAuthListItemDescriptionClass"
|
82
|
+
| "kcSelectAuthListItemHeadingClass"
|
83
|
+
| "kcSelectAuthListItemHelpTextClass"
|
84
|
+
| "kcSelectAuthListItemIconPropertyClass"
|
85
|
+
| "kcSelectAuthListItemIconClass"
|
86
|
+
| "kcSelectAuthListItemTitle"
|
87
|
+
| "kcAuthenticatorDefaultClass"
|
88
|
+
| "kcAuthenticatorPasswordClass"
|
89
|
+
| "kcAuthenticatorOTPClass"
|
90
|
+
| "kcAuthenticatorWebAuthnClass"
|
91
|
+
| "kcAuthenticatorWebAuthnPasswordlessClass"
|
92
|
+
| "kcSelectOTPListClass"
|
93
|
+
| "kcSelectOTPListItemClass"
|
94
|
+
| "kcAuthenticatorOtpCircleClass"
|
95
|
+
| "kcSelectOTPItemHeadingClass"
|
96
|
+
| "kcFormOptionsWrapperClass";
|
@@ -121,6 +121,10 @@ export function getKcContext<KcContextExtension extends { pageId: string } = nev
|
|
121
121
|
return { "kcContext": undefined };
|
122
122
|
}
|
123
123
|
|
124
|
+
if (!("login" in realKcContext)) {
|
125
|
+
return { "kcContext": undefined };
|
126
|
+
}
|
127
|
+
|
124
128
|
{
|
125
129
|
const { url } = realKcContext;
|
126
130
|
|
@@ -0,0 +1,100 @@
|
|
1
|
+
import { createUseClassName } from "keycloakify/lib/useGetClassName";
|
2
|
+
import type { ClassKey } from "keycloakify/login/TemplateProps";
|
3
|
+
|
4
|
+
export const { useGetClassName } = createUseClassName<ClassKey>({
|
5
|
+
"defaultClasses": {
|
6
|
+
"kcHtmlClass": "login-pf",
|
7
|
+
"kcLoginClass": "login-pf-page",
|
8
|
+
"kcContentWrapperClass": "row",
|
9
|
+
"kcHeaderClass": "login-pf-page-header",
|
10
|
+
"kcHeaderWrapperClass": undefined,
|
11
|
+
"kcFormCardClass": "card-pf",
|
12
|
+
"kcFormCardAccountClass": "login-pf-accounts",
|
13
|
+
"kcFormSocialAccountClass": "login-pf-social-section",
|
14
|
+
"kcFormSocialAccountContentClass": "col-xs-12 col-sm-6",
|
15
|
+
"kcFormHeaderClass": "login-pf-header",
|
16
|
+
"kcLocaleWrapperClass": undefined,
|
17
|
+
"kcFeedbackErrorIcon": "pficon pficon-error-circle-o",
|
18
|
+
"kcFeedbackWarningIcon": "pficon pficon-warning-triangle-o",
|
19
|
+
"kcFeedbackSuccessIcon": "pficon pficon-ok",
|
20
|
+
"kcFeedbackInfoIcon": "pficon pficon-info",
|
21
|
+
"kcResetFlowIcon": "pficon pficon-arrow fa-2x",
|
22
|
+
"kcFormGroupClass": "form-group",
|
23
|
+
"kcLabelWrapperClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
|
24
|
+
"kcSignUpClass": "login-pf-signup",
|
25
|
+
"kcInfoAreaWrapperClass": undefined,
|
26
|
+
|
27
|
+
"kcLogoClass": "login-pf-brand",
|
28
|
+
"kcContainerClass": "container-fluid",
|
29
|
+
"kcContentClass": "col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3",
|
30
|
+
"kcFeedbackAreaClass": "col-md-12",
|
31
|
+
"kcLocaleClass": "col-xs-12 col-sm-1",
|
32
|
+
"kcAlertIconClasserror": "pficon pficon-error-circle-o",
|
33
|
+
|
34
|
+
"kcFormAreaClass": "col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2",
|
35
|
+
"kcFormSocialAccountListClass": "login-pf-social list-unstyled login-pf-social-all",
|
36
|
+
"kcFormSocialAccountDoubleListClass": "login-pf-social-double-col",
|
37
|
+
"kcFormSocialAccountListLinkClass": "login-pf-social-link",
|
38
|
+
"kcWebAuthnKeyIcon": "pficon pficon-key",
|
39
|
+
"kcWebAuthnDefaultIcon": "pficon pficon-key",
|
40
|
+
|
41
|
+
"kcFormClass": "form-horizontal",
|
42
|
+
"kcFormGroupErrorClass": "has-error",
|
43
|
+
"kcLabelClass": "control-label",
|
44
|
+
"kcInputClass": "form-control",
|
45
|
+
"kcInputErrorMessageClass": "pf-c-form__helper-text pf-m-error required kc-feedback-text",
|
46
|
+
"kcInputWrapperClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
|
47
|
+
"kcFormOptionsClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
|
48
|
+
"kcFormButtonsClass": "col-xs-12 col-sm-12 col-md-12 col-lg-12",
|
49
|
+
"kcFormSettingClass": "login-pf-settings",
|
50
|
+
"kcTextareaClass": "form-control",
|
51
|
+
|
52
|
+
"kcInfoAreaClass": "col-xs-12 col-sm-4 col-md-4 col-lg-5 details",
|
53
|
+
|
54
|
+
// user-profile grouping
|
55
|
+
"kcFormGroupHeader": "pf-c-form__group",
|
56
|
+
|
57
|
+
// css classes for form buttons main class used for all buttons
|
58
|
+
"kcButtonClass": "btn",
|
59
|
+
// classes defining priority of the button - primary or default (there is typically only one priority button for the form)
|
60
|
+
"kcButtonPrimaryClass": "btn-primary",
|
61
|
+
"kcButtonDefaultClass": "btn-default",
|
62
|
+
// classes defining size of the button
|
63
|
+
"kcButtonLargeClass": "btn-lg",
|
64
|
+
"kcButtonBlockClass": "btn-block",
|
65
|
+
|
66
|
+
// css classes for input
|
67
|
+
"kcInputLargeClass": "input-lg",
|
68
|
+
|
69
|
+
// css classes for form accessability
|
70
|
+
"kcSrOnlyClass": "sr-only",
|
71
|
+
|
72
|
+
// css classes for select-authenticator form
|
73
|
+
"kcSelectAuthListClass": "list-group list-view-pf",
|
74
|
+
"kcSelectAuthListItemClass": "list-group-item list-view-pf-stacked",
|
75
|
+
"kcSelectAuthListItemFillClass": "pf-l-split__item pf-m-fill",
|
76
|
+
"kcSelectAuthListItemIconPropertyClass": "fa-2x select-auth-box-icon-properties",
|
77
|
+
"kcSelectAuthListItemIconClass": "pf-l-split__item select-auth-box-icon",
|
78
|
+
"kcSelectAuthListItemTitle": "select-auth-box-paragraph",
|
79
|
+
"kcSelectAuthListItemInfoClass": "list-view-pf-main-info",
|
80
|
+
"kcSelectAuthListItemLeftClass": "list-view-pf-left",
|
81
|
+
"kcSelectAuthListItemBodyClass": "list-view-pf-body",
|
82
|
+
"kcSelectAuthListItemDescriptionClass": "list-view-pf-description",
|
83
|
+
"kcSelectAuthListItemHeadingClass": "list-group-item-heading",
|
84
|
+
"kcSelectAuthListItemHelpTextClass": "list-group-item-text",
|
85
|
+
|
86
|
+
// css classes for the authenticators
|
87
|
+
"kcAuthenticatorDefaultClass": "fa list-view-pf-icon-lg",
|
88
|
+
"kcAuthenticatorPasswordClass": "fa fa-unlock list-view-pf-icon-lg",
|
89
|
+
"kcAuthenticatorOTPClass": "fa fa-mobile list-view-pf-icon-lg",
|
90
|
+
"kcAuthenticatorWebAuthnClass": "fa fa-key list-view-pf-icon-lg",
|
91
|
+
"kcAuthenticatorWebAuthnPasswordlessClass": "fa fa-key list-view-pf-icon-lg",
|
92
|
+
|
93
|
+
//css classes for the OTP Login Form
|
94
|
+
"kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select",
|
95
|
+
"kcSelectOTPListItemClass": "card-pf-body card-pf-top-element",
|
96
|
+
"kcAuthenticatorOtpCircleClass": "fa fa-mobile card-pf-icon-circle",
|
97
|
+
"kcSelectOTPItemHeadingClass": "card-pf-title text-center",
|
98
|
+
"kcFormOptionsWrapperClass": undefined
|
99
|
+
}
|
100
|
+
});
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { useState } from "react";
|
2
2
|
import { clsx } from "keycloakify/tools/clsx";
|
3
3
|
import { UserProfileFormFields } from "keycloakify/login/pages/shared/UserProfileCommons";
|
4
|
-
import {
|
5
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
4
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
5
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
6
6
|
import type { KcContext } from "../kcContext";
|
7
7
|
import type { I18n } from "../i18n";
|
8
8
|
|
@@ -10,7 +10,7 @@ export default function IdpReviewUserProfile(props: PageProps<Extract<KcContext,
|
|
10
10
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
11
11
|
|
12
12
|
const { getClassName } = useGetClassName({
|
13
|
-
|
13
|
+
doUseDefaultCss,
|
14
14
|
classes
|
15
15
|
});
|
16
16
|
|
package/src/login/pages/Info.tsx
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { assert } from "keycloakify/tools/assert";
|
2
|
-
import {
|
2
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
3
3
|
import type { KcContext } from "../kcContext";
|
4
4
|
import type { I18n } from "../i18n";
|
5
5
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { useState, type FormEventHandler } from "react";
|
2
2
|
import { clsx } from "keycloakify/tools/clsx";
|
3
3
|
import { useConstCallback } from "keycloakify/tools/useConstCallback";
|
4
|
-
import {
|
5
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
4
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
5
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
6
6
|
import type { KcContext } from "../kcContext";
|
7
7
|
import type { I18n } from "../i18n";
|
8
8
|
|
@@ -10,7 +10,7 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
|
|
10
10
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
11
11
|
|
12
12
|
const { getClassName } = useGetClassName({
|
13
|
-
|
13
|
+
doUseDefaultCss,
|
14
14
|
classes
|
15
15
|
});
|
16
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { clsx } from "keycloakify/tools/clsx";
|
2
|
-
import {
|
3
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
2
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
3
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
6
|
|
@@ -8,7 +8,7 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
|
|
8
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
9
9
|
|
10
10
|
const { getClassName } = useGetClassName({
|
11
|
-
|
11
|
+
doUseDefaultCss,
|
12
12
|
classes
|
13
13
|
});
|
14
14
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { clsx } from "keycloakify/tools/clsx";
|
2
|
-
import {
|
3
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
2
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
3
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
6
|
|
@@ -8,7 +8,7 @@ export default function LoginIdpLinkConfirm(props: PageProps<Extract<KcContext,
|
|
8
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
9
9
|
|
10
10
|
const { getClassName } = useGetClassName({
|
11
|
-
|
11
|
+
doUseDefaultCss,
|
12
12
|
classes
|
13
13
|
});
|
14
14
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { KcContext } from "keycloakify/login/kcContext";
|
2
|
-
import {
|
2
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
3
3
|
import type { I18n } from "keycloakify/login/i18n";
|
4
4
|
|
5
5
|
export default function LoginIdpLinkEmail(props: PageProps<Extract<KcContext, { pageId: "login-idp-link-email.ftl" }>, I18n>) {
|
@@ -2,8 +2,8 @@ import { useEffect } from "react";
|
|
2
2
|
import { headInsert } from "keycloakify/tools/headInsert";
|
3
3
|
import { pathJoin } from "keycloakify/bin/tools/pathJoin";
|
4
4
|
import { clsx } from "keycloakify/tools/clsx";
|
5
|
-
import {
|
6
|
-
import { useGetClassName } from "keycloakify/lib/useGetClassName";
|
5
|
+
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
6
|
+
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
7
7
|
import type { KcContext } from "../kcContext";
|
8
8
|
import type { I18n } from "../i18n";
|
9
9
|
|
@@ -11,7 +11,7 @@ export default function LoginOtp(props: PageProps<Extract<KcContext, { pageId: "
|
|
11
11
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
12
12
|
|
13
13
|
const { getClassName } = useGetClassName({
|
14
|
-
|
14
|
+
doUseDefaultCss,
|
15
15
|
classes
|
16
16
|
});
|
17
17
|
|