@keycloakify/angular 0.0.1-rc.23 → 0.0.1-rc.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +2 -0
  2. package/bin/338.index.js +14 -1
  3. package/bin/758.index.js +14 -1
  4. package/bin/925.index.js +13 -2
  5. package/esm2022/login/containers/template/template.component.mjs +11 -5
  6. package/esm2022/login/login.mjs +1 -1
  7. package/esm2022/login/pages/code/code.component.mjs +3 -3
  8. package/esm2022/login/pages/delete-credential/delete-credential.component.mjs +3 -3
  9. package/esm2022/login/pages/error/error.component.mjs +3 -3
  10. package/esm2022/login/pages/idp-review-user-profile/idp-review-user-profile.component.mjs +7 -7
  11. package/esm2022/login/pages/info/info.component.mjs +3 -3
  12. package/esm2022/login/pages/login/login.component.mjs +3 -3
  13. package/esm2022/login/pages/login-idp-link-email/login-idp-link-email.component.mjs +3 -3
  14. package/esm2022/login/pages/login-oauth-grant/login-oauth-grant.component.mjs +3 -3
  15. package/esm2022/login/pages/login-page-expired/login-page-expired.component.mjs +3 -3
  16. package/esm2022/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.mjs +3 -3
  17. package/esm2022/login/pages/login-password/login-password.component.mjs +3 -3
  18. package/esm2022/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.mjs +3 -3
  19. package/esm2022/login/pages/login-reset-otp/login-reset-otp.component.mjs +3 -3
  20. package/esm2022/login/pages/login-reset-password/login-reset-password.component.mjs +3 -3
  21. package/esm2022/login/pages/login-update-profile/login-update-profile.component.mjs +7 -7
  22. package/esm2022/login/pages/login-username/login-username.component.mjs +3 -3
  23. package/esm2022/login/pages/login-verify-email/login-verify-email.component.mjs +3 -3
  24. package/esm2022/login/pages/register/register.component.mjs +7 -7
  25. package/esm2022/login/pages/select-authenticator/select-authenticator.component.mjs +3 -3
  26. package/esm2022/login/pages/update-email/update-email.component.mjs +7 -7
  27. package/esm2022/login/pages/webauthn-authenticate/webauthn-authenticate.component.mjs +3 -3
  28. package/fesm2022/keycloakify-angular-login-containers-template.mjs +10 -4
  29. package/fesm2022/keycloakify-angular-login-containers-template.mjs.map +1 -1
  30. package/fesm2022/keycloakify-angular-login-pages-code.mjs +2 -2
  31. package/fesm2022/keycloakify-angular-login-pages-code.mjs.map +1 -1
  32. package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs +2 -2
  33. package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs.map +1 -1
  34. package/fesm2022/keycloakify-angular-login-pages-error.mjs +2 -2
  35. package/fesm2022/keycloakify-angular-login-pages-error.mjs.map +1 -1
  36. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs +6 -6
  37. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs.map +1 -1
  38. package/fesm2022/keycloakify-angular-login-pages-info.mjs +2 -2
  39. package/fesm2022/keycloakify-angular-login-pages-info.mjs.map +1 -1
  40. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs +2 -2
  41. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs.map +1 -1
  42. package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs +2 -2
  43. package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs.map +1 -1
  44. package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs +2 -2
  45. package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs.map +1 -1
  46. package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs +2 -2
  47. package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs.map +1 -1
  48. package/fesm2022/keycloakify-angular-login-pages-login-password.mjs +2 -2
  49. package/fesm2022/keycloakify-angular-login-pages-login-password.mjs.map +1 -1
  50. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs +2 -2
  51. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs.map +1 -1
  52. package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs +2 -2
  53. package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs.map +1 -1
  54. package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs +2 -2
  55. package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs.map +1 -1
  56. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs +6 -6
  57. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs.map +1 -1
  58. package/fesm2022/keycloakify-angular-login-pages-login-username.mjs +2 -2
  59. package/fesm2022/keycloakify-angular-login-pages-login-username.mjs.map +1 -1
  60. package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs +2 -2
  61. package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs.map +1 -1
  62. package/fesm2022/keycloakify-angular-login-pages-login.mjs +2 -2
  63. package/fesm2022/keycloakify-angular-login-pages-login.mjs.map +1 -1
  64. package/fesm2022/keycloakify-angular-login-pages-register.mjs +7 -7
  65. package/fesm2022/keycloakify-angular-login-pages-register.mjs.map +1 -1
  66. package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs +2 -2
  67. package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs.map +1 -1
  68. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs +6 -6
  69. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs.map +1 -1
  70. package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs +2 -2
  71. package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs.map +1 -1
  72. package/login/containers/template/template.component.d.ts +4 -2
  73. package/login/login.d.ts +1 -0
  74. package/login/pages/idp-review-user-profile/idp-review-user-profile.component.d.ts +4 -2
  75. package/login/pages/login-update-profile/login-update-profile.component.d.ts +4 -2
  76. package/login/pages/register/register.component.d.ts +4 -2
  77. package/login/pages/update-email/update-email.component.d.ts +4 -2
  78. package/package.json +7 -7
  79. package/src/bin/eject-page.ts +21 -3
  80. package/src/bin/update-kc-gen.ts +14 -1
  81. package/src/login/containers/template/template.component.html +1 -0
  82. package/src/login/containers/template/template.component.ts +6 -0
  83. package/src/login/login.ts +1 -0
  84. package/src/login/pages/code/code.component.html +1 -0
  85. package/src/login/pages/delete-credential/delete-credential.component.html +26 -26
  86. package/src/login/pages/error/error.component.html +16 -17
  87. package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +1 -1
  88. package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +4 -3
  89. package/src/login/pages/info/info.component.html +2 -2
  90. package/src/login/pages/login/login.component.html +3 -1
  91. package/src/login/pages/login-idp-link-email/login-idp-link-email.component.html +2 -0
  92. package/src/login/pages/login-oauth-grant/login-oauth-grant.component.html +1 -0
  93. package/src/login/pages/login-page-expired/login-page-expired.component.html +23 -24
  94. package/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html +166 -165
  95. package/src/login/pages/login-password/login-password.component.html +68 -69
  96. package/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html +55 -57
  97. package/src/login/pages/login-reset-otp/login-reset-otp.component.html +48 -49
  98. package/src/login/pages/login-reset-password/login-reset-password.component.html +1 -0
  99. package/src/login/pages/login-update-profile/login-update-profile.component.html +1 -1
  100. package/src/login/pages/login-update-profile/login-update-profile.component.ts +3 -2
  101. package/src/login/pages/login-username/login-username.component.html +5 -3
  102. package/src/login/pages/login-verify-email/login-verify-email.component.html +1 -1
  103. package/src/login/pages/register/register.component.html +2 -2
  104. package/src/login/pages/register/register.component.ts +3 -2
  105. package/src/login/pages/select-authenticator/select-authenticator.component.html +32 -32
  106. package/src/login/pages/update-email/update-email.component.html +1 -1
  107. package/src/login/pages/update-email/update-email.component.ts +3 -2
  108. package/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html +1 -0
@@ -6,63 +6,61 @@
6
6
  {{ i18n.msgStr('auth-recovery-code-header') }}
7
7
  </ng-template>
8
8
 
9
- <ng-container content>
10
- <form
11
- id="kc-recovery-code-login-form"
12
- method="post"
13
- [kcClass]="'kcFormClass'"
14
- [action]="url.loginAction"
15
- >
16
- <div [kcClass]="'kcFormGroupClass'">
17
- <div [kcClass]="'kcLabelWrapperClass'">
18
- <label
19
- for="recoveryCodeInput"
20
- [kcClass]="'kcLabelClass'"
21
- >
22
- {{ i18n.msgStr('auth-recovery-code-prompt', recoveryAuthnCodesInputBean.codeNumber.toString()) }}
23
- </label>
24
- </div>
25
- <div [kcClass]="'kcInputWrapperClass'">
26
- <input
27
- tabIndex="1"
28
- id="recoveryCodeInput"
29
- name="recoveryCodeInput"
30
- autoComplete="off"
31
- type="text"
32
- autoFocus
33
- [attr.aria-invalid]="messagesPerField.existsError('recoveryCodeInput')"
34
- [kcClass]="'kcInputClass'"
35
- />
36
- @if (messagesPerField.existsError('recoveryCodeInput')) {
37
- <span
38
- id="input-error"
39
- aria-live="polite"
40
- [kcClass]="'kcInputErrorMessageClass'"
41
- [innerHTML]="messagesPerField.get('recoveryCodeInput') | kcSanitize: 'html'"
42
- ></span>
43
- }
44
- </div>
9
+ <form
10
+ id="kc-recovery-code-login-form"
11
+ method="post"
12
+ [kcClass]="'kcFormClass'"
13
+ [action]="url.loginAction"
14
+ >
15
+ <div [kcClass]="'kcFormGroupClass'">
16
+ <div [kcClass]="'kcLabelWrapperClass'">
17
+ <label
18
+ for="recoveryCodeInput"
19
+ [kcClass]="'kcLabelClass'"
20
+ >
21
+ {{ i18n.msgStr('auth-recovery-code-prompt', recoveryAuthnCodesInputBean.codeNumber.toString()) }}
22
+ </label>
23
+ </div>
24
+ <div [kcClass]="'kcInputWrapperClass'">
25
+ <input
26
+ tabIndex="1"
27
+ id="recoveryCodeInput"
28
+ name="recoveryCodeInput"
29
+ autoComplete="off"
30
+ type="text"
31
+ autoFocus
32
+ [attr.aria-invalid]="messagesPerField.existsError('recoveryCodeInput')"
33
+ [kcClass]="'kcInputClass'"
34
+ />
35
+ @if (messagesPerField.existsError('recoveryCodeInput')) {
36
+ <span
37
+ id="input-error"
38
+ aria-live="polite"
39
+ [kcClass]="'kcInputErrorMessageClass'"
40
+ [innerHTML]="messagesPerField.get('recoveryCodeInput') | kcSanitize: 'html'"
41
+ ></span>
42
+ }
45
43
  </div>
44
+ </div>
46
45
 
47
- <div [kcClass]="'kcFormGroupClass'">
48
- <div
49
- id="kc-form-options"
50
- [kcClass]="'kcFormOptionsWrapperClass'"
51
- >
52
- <div [kcClass]="'kcFormOptionsWrapperClass'"></div>
53
- </div>
54
- <div
55
- id="kc-form-buttons"
56
- [kcClass]="'kcFormButtonsClass'"
57
- >
58
- <input
59
- name="login"
60
- id="kc-login"
61
- type="submit"
62
- [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']"
63
- [value]="i18n.msgStr('doLogIn')"
64
- />
65
- </div>
46
+ <div [kcClass]="'kcFormGroupClass'">
47
+ <div
48
+ id="kc-form-options"
49
+ [kcClass]="'kcFormOptionsWrapperClass'"
50
+ >
51
+ <div [kcClass]="'kcFormOptionsWrapperClass'"></div>
52
+ </div>
53
+ <div
54
+ id="kc-form-buttons"
55
+ [kcClass]="'kcFormButtonsClass'"
56
+ >
57
+ <input
58
+ name="login"
59
+ id="kc-login"
60
+ type="submit"
61
+ [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']"
62
+ [value]="i18n.msgStr('doLogIn')"
63
+ />
66
64
  </div>
67
- </form>
68
- </ng-container>
65
+ </div>
66
+ </form>
@@ -4,57 +4,56 @@
4
4
  <ng-template #headerNode>
5
5
  {{ i18n.msgStr('doLogIn') }}
6
6
  </ng-template>
7
- <ng-container content>
8
- <form
9
- id="kc-otp-reset-form"
10
- method="post"
11
- [kcClass]="'kcFormClass'"
12
- [action]="url.loginAction"
13
- >
14
- <div [kcClass]="'kcInputWrapperClass'">
15
- <div [kcClass]="'kcInfoAreaWrapperClass'">
16
- <p id="kc-otp-reset-form-description">
17
- {{ i18n.msgStr('otp-reset-description') }}
18
- </p>
19
- @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) {
7
+
8
+ <form
9
+ id="kc-otp-reset-form"
10
+ method="post"
11
+ [kcClass]="'kcFormClass'"
12
+ [action]="url.loginAction"
13
+ >
14
+ <div [kcClass]="'kcInputWrapperClass'">
15
+ <div [kcClass]="'kcInfoAreaWrapperClass'">
16
+ <p id="kc-otp-reset-form-description">
17
+ {{ i18n.msgStr('otp-reset-description') }}
18
+ </p>
19
+ @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) {
20
+ <input
21
+ type="radio"
22
+ name="selectedCredentialId"
23
+ [id]="'kc-otp-credential-' + i"
24
+ [kcClass]="'kcLoginOTPListInputClass'"
25
+ [value]="otpCredential.id"
26
+ [defaultChecked]="otpCredential.id === configuredOtpCredentials.selectedCredentialId"
27
+ />
28
+ <label
29
+ for="kc-otp-credential-0"
30
+ [kcClass]="'kcLoginOTPListClass'"
31
+ [tabIndex]="i"
32
+ >
33
+ <span [kcClass]="'kcLoginOTPListItemHeaderClass'">
34
+ <span [kcClass]="'kcLoginOTPListItemIconBodyClass'">
35
+ <i
36
+ aria-hidden="true"
37
+ [kcClass]="'kcLoginOTPListItemIconClass'"
38
+ ></i>
39
+ </span>
40
+ <span [kcClass]="'kcLoginOTPListItemTitleClass'">{{ otpCredential.userLabel }}</span>
41
+ </span>
42
+ </label>
43
+ }
44
+ <div [kcClass]="'kcFormGroupClass'">
45
+ <div
46
+ id="kc-form-buttons"
47
+ [kcClass]="'kcFormButtonsClass'"
48
+ >
20
49
  <input
21
- type="radio"
22
- name="selectedCredentialId"
23
- [id]="'kc-otp-credential-' + i"
24
- [kcClass]="'kcLoginOTPListInputClass'"
25
- [value]="otpCredential.id"
26
- [defaultChecked]="otpCredential.id === configuredOtpCredentials.selectedCredentialId"
50
+ id="kc-otp-reset-form-submit"
51
+ type="submit"
52
+ [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']"
53
+ [value]="i18n.msgStr('doSubmit')"
27
54
  />
28
- <label
29
- for="kc-otp-credential-0"
30
- [kcClass]="'kcLoginOTPListClass'"
31
- [tabIndex]="i"
32
- >
33
- <span [kcClass]="'kcLoginOTPListItemHeaderClass'">
34
- <span [kcClass]="'kcLoginOTPListItemIconBodyClass'">
35
- <i
36
- aria-hidden="true"
37
- [kcClass]="'kcLoginOTPListItemIconClass'"
38
- ></i>
39
- </span>
40
- <span [kcClass]="'kcLoginOTPListItemTitleClass'">{{ otpCredential.userLabel }}</span>
41
- </span>
42
- </label>
43
- }
44
- <div [kcClass]="'kcFormGroupClass'">
45
- <div
46
- id="kc-form-buttons"
47
- [kcClass]="'kcFormButtonsClass'"
48
- >
49
- <input
50
- id="kc-otp-reset-form-submit"
51
- type="submit"
52
- [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']"
53
- [value]="i18n.msgStr('doSubmit')"
54
- />
55
- </div>
56
55
  </div>
57
56
  </div>
58
57
  </div>
59
- </form>
60
- </ng-container>
58
+ </div>
59
+ </form>
@@ -7,6 +7,7 @@
7
7
  {{ i18n.msgStr('emailForgotTitle') }}
8
8
  </ng-template>
9
9
  <ng-template #infoNode>
10
+ @let realm = kcContext.realm;
10
11
  @if (realm.duplicateEmailsAllowed) {
11
12
  {{ i18n.msgStr('emailInstructionUsername') }}
12
13
  } @else {
@@ -10,7 +10,7 @@
10
10
  [kcClass]="'kcFormClass'"
11
11
  [action]="url.loginAction"
12
12
  >
13
- <kc-user-profile-form-fields />
13
+ <ng-container [ngComponentOutlet]="userProfileFormFields() ?? null" />
14
14
  <div [kcClass]="'kcFormGroupClass'">
15
15
  <div
16
16
  id="kc-form-options"
@@ -1,5 +1,5 @@
1
1
  import { NgComponentOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';
5
5
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
@@ -15,7 +15,7 @@ import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
15
15
 
16
16
  @Component({
17
17
  standalone: true,
18
- imports: [KcClassDirective, NgComponentOutlet, UserProfileFormFieldsComponent],
18
+ imports: [KcClassDirective, NgComponentOutlet],
19
19
  selector: 'kc-login-update-profile',
20
20
  templateUrl: 'login-update-profile.component.html',
21
21
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -46,6 +46,7 @@ export class LoginUpdateProfileComponent extends ComponentReference {
46
46
  socialProvidersNode? = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');
47
47
 
48
48
  isFormSubmittable = signal(false);
49
+ userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();
49
50
 
50
51
  constructor() {
51
52
  super();
@@ -1,5 +1,4 @@
1
1
  @let realm = kcContext.realm;
2
- @let social = kcContext.social;
3
2
  @let usernameHidden = kcContext.usernameHidden;
4
3
  @let messagesPerField = kcContext.messagesPerField;
5
4
  @let url = kcContext.url;
@@ -8,7 +7,8 @@
8
7
  <ng-template #headerNode>
9
8
  {{ i18n.msgStr('doLogIn') }}
10
9
  </ng-template>
11
- <ng-container infoNode>
10
+ <ng-template #infoNode>
11
+ @let url = kcContext.url;
12
12
  <div id="kc-registration">
13
13
  <span>
14
14
  {{ i18n.msgStr('noAccount') }}
@@ -20,8 +20,10 @@
20
20
  </a>
21
21
  </span>
22
22
  </div>
23
- </ng-container>
23
+ </ng-template>
24
24
  <ng-template #socialProvidersNode>
25
+ @let realm = kcContext.realm;
26
+ @let social = kcContext.social;
25
27
  @if (!!realm?.password && !!social?.providers?.length) {
26
28
  <div
27
29
  id="kc-social-providers"
@@ -1,10 +1,10 @@
1
- @let url = kcContext.url;
2
1
  @let user = kcContext.user;
3
2
 
4
3
  <ng-template #headerNode>
5
4
  {{ i18n.msgStr('emailVerifyTitle') }}
6
5
  </ng-template>
7
6
  <ng-template #infoNode>
7
+ @let url = kcContext.url;
8
8
  <p class="instruction">
9
9
  {{ i18n.msgStr('emailVerifyInstruction2') }}
10
10
  <br />
@@ -1,4 +1,3 @@
1
- @let messageHeader = kcContext.messageHeader;
2
1
  @let url = kcContext.url;
3
2
  @let messagesPerField = kcContext.messagesPerField;
4
3
  @let recaptchaRequired = kcContext.recaptchaRequired;
@@ -8,6 +7,7 @@
8
7
  @let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;
9
8
 
10
9
  <ng-template #headerNode>
10
+ @let messageHeader = kcContext.messageHeader;
11
11
  {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}
12
12
  </ng-template>
13
13
  <form
@@ -16,7 +16,7 @@
16
16
  [kcClass]="'kcFormClass'"
17
17
  [action]="url.registrationAction"
18
18
  >
19
- <kc-user-profile-form-fields />
19
+ <ng-container [ngComponentOutlet]="userProfileFormFields() ?? null" />
20
20
  @if (termsAcceptanceRequired) {
21
21
  <div className="form-group">
22
22
  <div [kcClass]="'kcInputWrapperClass'">
@@ -1,5 +1,5 @@
1
1
  import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize';
5
5
  import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';
@@ -19,7 +19,7 @@ import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
19
19
  templateUrl: './register.component.html',
20
20
  standalone: true,
21
21
  changeDetection: ChangeDetectionStrategy.OnPush,
22
- imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, NgComponentOutlet, UserProfileFormFieldsComponent],
22
+ imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, NgComponentOutlet],
23
23
  providers: [
24
24
  {
25
25
  provide: ComponentReference,
@@ -48,6 +48,7 @@ export class RegisterComponent extends ComponentReference {
48
48
 
49
49
  isFormSubmittable = signal(false);
50
50
  areTermsAccepted = signal(false);
51
+ userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();
51
52
 
52
53
  constructor() {
53
54
  super();
@@ -4,37 +4,37 @@
4
4
  <ng-template #headerNode>
5
5
  {{ i18n.msgStr('loginChooseAuthenticator') }}
6
6
  </ng-template>
7
- <ng-container content>
8
- <form
9
- id="kc-select-credential-form"
10
- method="post"
11
- [kcClass]="'kcFormClass'"
12
- [action]="url.loginAction"
13
- >
14
- <div [kcClass]="'kcSelectAuthListClass'">
15
- @for (authenticationSelection of auth.authenticationSelections; track authenticationSelection; let i = $index) {
16
- <button
17
- type="submit"
18
- name="authenticationExecution"
19
- [kcClass]="'kcSelectAuthListItemClass'"
20
- [value]="authenticationSelection.authExecId"
21
- >
22
- <div [kcClass]="'kcSelectAuthListItemIconClass'">
23
- <i [kcClass]="['kcSelectAuthListItemIconPropertyClass', $any(authenticationSelection.iconCssClass)]"></i>
24
- </div>
25
- <div [kcClass]="'kcSelectAuthListItemBodyClass'">
26
- <div [kcClass]="'kcSelectAuthListItemHeadingClass'">
27
- {{ i18n.advancedMsgStr(authenticationSelection.displayName) }}
28
- </div>
29
- <div [kcClass]="'kcSelectAuthListItemDescriptionClass'">
30
- {{ i18n.advancedMsgStr(authenticationSelection.helpText) }}
31
- </div>
7
+
8
+ <form
9
+ id="kc-select-credential-form"
10
+ method="post"
11
+ [kcClass]="'kcFormClass'"
12
+ [action]="url.loginAction"
13
+ >
14
+ <div [kcClass]="'kcSelectAuthListClass'">
15
+ @for (authenticationSelection of auth.authenticationSelections; track authenticationSelection; let i = $index) {
16
+ <button
17
+ type="submit"
18
+ name="authenticationExecution"
19
+ [kcClass]="'kcSelectAuthListItemClass'"
20
+ [value]="authenticationSelection.authExecId"
21
+ >
22
+ <div [kcClass]="'kcSelectAuthListItemIconClass'">
23
+ <i [kcClass]="['kcSelectAuthListItemIconPropertyClass', $any(authenticationSelection.iconCssClass)]"></i>
24
+ </div>
25
+ <div [kcClass]="'kcSelectAuthListItemBodyClass'">
26
+ <div [kcClass]="'kcSelectAuthListItemHeadingClass'">
27
+ {{ i18n.advancedMsgStr(authenticationSelection.displayName) }}
32
28
  </div>
33
- <div [kcClass]="'kcSelectAuthListItemFillClass'"></div>
34
- <div [kcClass]="'kcSelectAuthListItemArrowClass'">
35
- <i [kcClass]="'kcSelectAuthListItemArrowIconClass'"></i>
29
+ <div [kcClass]="'kcSelectAuthListItemDescriptionClass'">
30
+ {{ i18n.advancedMsgStr(authenticationSelection.helpText) }}
36
31
  </div>
37
- </button>
38
- }
39
- </div></form
40
- ></ng-container>
32
+ </div>
33
+ <div [kcClass]="'kcSelectAuthListItemFillClass'"></div>
34
+ <div [kcClass]="'kcSelectAuthListItemArrowClass'">
35
+ <i [kcClass]="'kcSelectAuthListItemArrowIconClass'"></i>
36
+ </div>
37
+ </button>
38
+ }
39
+ </div>
40
+ </form>
@@ -10,7 +10,7 @@
10
10
  [kcClass]="'kcFormClass'"
11
11
  [action]="url.loginAction"
12
12
  >
13
- <kc-user-profile-form-fields />
13
+ <ng-container [ngComponentOutlet]="userProfileFormFields() ?? null" />
14
14
  <div [kcClass]="'kcFormGroupClass'">
15
15
  <div
16
16
  id="kc-form-options"
@@ -1,5 +1,5 @@
1
1
  import { NgComponentOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
5
5
  import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';
@@ -13,7 +13,7 @@ import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
13
13
 
14
14
  @Component({
15
15
  standalone: true,
16
- imports: [KcClassDirective, NgComponentOutlet, LogoutOtherSessionsComponent, UserProfileFormFieldsComponent],
16
+ imports: [KcClassDirective, NgComponentOutlet, LogoutOtherSessionsComponent],
17
17
  selector: 'kc-update-email',
18
18
  templateUrl: 'update-email.component.html',
19
19
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -40,6 +40,7 @@ export class UpdateEmailComponent extends ComponentReference {
40
40
  infoNode? = viewChild<TemplateRef<HTMLElement>>('infoNode');
41
41
  socialProvidersNode? = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');
42
42
 
43
+ userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();
43
44
  isFormSubmittable = signal(false);
44
45
 
45
46
  constructor() {
@@ -6,6 +6,7 @@
6
6
  {{ i18n.msgStr('webauthn-login-title') }}
7
7
  </ng-template>
8
8
  <ng-template #infoNode>
9
+ @let url = kcContext.url;
9
10
  <div id="kc-registration">
10
11
  <span>
11
12
  {{ i18n.msgStr('noAccount') }}