@keycloakify/angular 0.0.4 → 0.0.6

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 (177) hide show
  1. package/account/DefaultPage/DefaultPage.d.ts +2 -30
  2. package/esm2022/account/containers/template/template.component.mjs +6 -6
  3. package/esm2022/account/directives/kc-class/kc-class.directive.mjs +3 -3
  4. package/esm2022/account/pages/account/account.component.mjs +3 -3
  5. package/esm2022/account/pages/applications/applications.component.mjs +3 -3
  6. package/esm2022/account/pages/federatedIdentity/federatedIdentity.component.mjs +3 -3
  7. package/esm2022/account/pages/log/log.component.mjs +3 -3
  8. package/esm2022/account/pages/password/password.component.mjs +3 -3
  9. package/esm2022/account/pages/sessions/sessions.component.mjs +3 -3
  10. package/esm2022/account/pages/totp/totp.component.mjs +3 -3
  11. package/esm2022/account/services/account-resource-injector/account-resource-injector.service.mjs +3 -3
  12. package/esm2022/account/services/i18n/i18n.service.mjs +3 -3
  13. package/esm2022/lib/directives/attributes/attributes.directive.mjs +3 -3
  14. package/esm2022/lib/pipes/input-type/input-type.pipe.mjs +3 -3
  15. package/esm2022/lib/pipes/is-array-with-empty-object/is-array-with-empty-object.pipe.mjs +3 -3
  16. package/esm2022/lib/pipes/kc-sanitize/kc-sanitize.pipe.mjs +3 -3
  17. package/esm2022/lib/pipes/to-array/to-array.pipe.mjs +3 -3
  18. package/esm2022/lib/pipes/to-number/to-number.pipe.mjs +3 -3
  19. package/esm2022/lib/services/resource-injector/resource-injector.service.mjs +3 -3
  20. package/esm2022/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.mjs +7 -53
  21. package/esm2022/login/components/field-errors/field-errors.component.mjs +3 -3
  22. package/esm2022/login/components/group-label/group-label.component.mjs +3 -3
  23. package/esm2022/login/components/input-field-by-type/input-field-by-type.component.mjs +3 -3
  24. package/esm2022/login/components/input-tag/input-tag.component.mjs +3 -3
  25. package/esm2022/login/components/input-tag-selects/input-tag-selects.component.mjs +3 -3
  26. package/esm2022/login/components/logout-other-sessions/logout-other-sessions.component.mjs +3 -3
  27. package/esm2022/login/components/password-wrapper/password-wrapper.component.mjs +3 -3
  28. package/esm2022/login/components/select-tag/select-tag.component.mjs +3 -3
  29. package/esm2022/login/components/textarea-tag/textarea-tag.component.mjs +3 -3
  30. package/esm2022/login/components/user-profile-form-fields/user-profile-form-fields.component.mjs +15 -22
  31. package/esm2022/login/containers/template/template.component.mjs +6 -6
  32. package/esm2022/login/directives/kc-class/kc-class.directive.mjs +3 -3
  33. package/esm2022/login/pages/code/code.component.mjs +3 -3
  34. package/esm2022/login/pages/delete-account-confirm/delete-account-confirm.component.mjs +3 -3
  35. package/esm2022/login/pages/delete-credential/delete-credential.component.mjs +3 -3
  36. package/esm2022/login/pages/error/error.component.mjs +3 -3
  37. package/esm2022/login/pages/frontchannel-logout/frontchannel-logout.component.mjs +3 -3
  38. package/esm2022/login/pages/idp-review-user-profile/idp-review-user-profile.component.mjs +13 -15
  39. package/esm2022/login/pages/info/info.component.mjs +3 -3
  40. package/esm2022/login/pages/login/login.component.mjs +3 -3
  41. package/esm2022/login/pages/login-config-totp/login-config-totp.component.mjs +3 -3
  42. package/esm2022/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.mjs +3 -3
  43. package/esm2022/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.mjs +3 -3
  44. package/esm2022/login/pages/login-idp-link-email/login-idp-link-email.component.mjs +3 -3
  45. package/esm2022/login/pages/login-oauth-grant/login-oauth-grant.component.mjs +3 -3
  46. package/esm2022/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.mjs +3 -3
  47. package/esm2022/login/pages/login-otp/login-otp.component.mjs +3 -3
  48. package/esm2022/login/pages/login-page-expired/login-page-expired.component.mjs +3 -3
  49. package/esm2022/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.mjs +3 -3
  50. package/esm2022/login/pages/login-password/login-password.component.mjs +3 -3
  51. package/esm2022/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.mjs +125 -6
  52. package/esm2022/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.mjs +3 -3
  53. package/esm2022/login/pages/login-reset-otp/login-reset-otp.component.mjs +3 -3
  54. package/esm2022/login/pages/login-reset-password/login-reset-password.component.mjs +3 -3
  55. package/esm2022/login/pages/login-update-password/login-update-password.component.mjs +3 -3
  56. package/esm2022/login/pages/login-update-profile/login-update-profile.component.mjs +13 -15
  57. package/esm2022/login/pages/login-username/login-username.component.mjs +3 -3
  58. package/esm2022/login/pages/login-verify-email/login-verify-email.component.mjs +3 -3
  59. package/esm2022/login/pages/login-x509-info/login-x509-info.component.mjs +3 -3
  60. package/esm2022/login/pages/logout-confirm/logout-confirm.component.mjs +3 -3
  61. package/esm2022/login/pages/register/register.component.mjs +12 -14
  62. package/esm2022/login/pages/saml-post-form/saml-post-form.component.mjs +3 -3
  63. package/esm2022/login/pages/select-authenticator/select-authenticator.component.mjs +3 -3
  64. package/esm2022/login/pages/terms/terms.component.mjs +3 -3
  65. package/esm2022/login/pages/update-email/update-email.component.mjs +13 -15
  66. package/esm2022/login/pages/webauthn-authenticate/webauthn-authenticate.component.mjs +3 -3
  67. package/esm2022/login/pages/webauthn-error/webauthn-error.component.mjs +3 -3
  68. package/esm2022/login/pages/webauthn-register/webauthn-register.component.mjs +3 -3
  69. package/esm2022/login/services/i18n/i18n.service.mjs +3 -3
  70. package/esm2022/login/services/login-resource-injector/login-resource-injector.service.mjs +3 -3
  71. package/esm2022/login/services/user-profile-form/user-profile-form.service.mjs +56 -1004
  72. package/fesm2022/keycloakify-angular-account-containers-template.mjs +6 -6
  73. package/fesm2022/keycloakify-angular-account-directives-kc-class.mjs +3 -3
  74. package/fesm2022/keycloakify-angular-account-pages-account.mjs +3 -3
  75. package/fesm2022/keycloakify-angular-account-pages-applications.mjs +3 -3
  76. package/fesm2022/keycloakify-angular-account-pages-federatedIdentity.mjs +3 -3
  77. package/fesm2022/keycloakify-angular-account-pages-log.mjs +3 -3
  78. package/fesm2022/keycloakify-angular-account-pages-password.mjs +3 -3
  79. package/fesm2022/keycloakify-angular-account-pages-sessions.mjs +3 -3
  80. package/fesm2022/keycloakify-angular-account-pages-totp.mjs +3 -3
  81. package/fesm2022/keycloakify-angular-account-services-account-resource-injector.mjs +3 -3
  82. package/fesm2022/keycloakify-angular-account-services-i18n.mjs +3 -3
  83. package/fesm2022/keycloakify-angular-lib-directives-attributes.mjs +3 -3
  84. package/fesm2022/keycloakify-angular-lib-pipes-input-type.mjs +3 -3
  85. package/fesm2022/keycloakify-angular-lib-pipes-is-array-with-empty-object.mjs +3 -3
  86. package/fesm2022/keycloakify-angular-lib-pipes-kc-sanitize.mjs +3 -3
  87. package/fesm2022/keycloakify-angular-lib-pipes-to-array.mjs +3 -3
  88. package/fesm2022/keycloakify-angular-lib-pipes-to-number.mjs +3 -3
  89. package/fesm2022/keycloakify-angular-lib-services-resource-injector.mjs +3 -3
  90. package/fesm2022/keycloakify-angular-login-components-add-remove-buttons-multi-valued-attribute.mjs +6 -52
  91. package/fesm2022/keycloakify-angular-login-components-add-remove-buttons-multi-valued-attribute.mjs.map +1 -1
  92. package/fesm2022/keycloakify-angular-login-components-field-errors.mjs +3 -3
  93. package/fesm2022/keycloakify-angular-login-components-group-label.mjs +3 -3
  94. package/fesm2022/keycloakify-angular-login-components-input-field-by-type.mjs +3 -3
  95. package/fesm2022/keycloakify-angular-login-components-input-tag-selects.mjs +3 -3
  96. package/fesm2022/keycloakify-angular-login-components-input-tag.mjs +3 -3
  97. package/fesm2022/keycloakify-angular-login-components-logout-other-sessions.mjs +3 -3
  98. package/fesm2022/keycloakify-angular-login-components-password-wrapper.mjs +3 -3
  99. package/fesm2022/keycloakify-angular-login-components-select-tag.mjs +3 -3
  100. package/fesm2022/keycloakify-angular-login-components-textarea-tag.mjs +3 -3
  101. package/fesm2022/keycloakify-angular-login-components-user-profile-form-fields.mjs +14 -21
  102. package/fesm2022/keycloakify-angular-login-components-user-profile-form-fields.mjs.map +1 -1
  103. package/fesm2022/keycloakify-angular-login-containers-template.mjs +6 -6
  104. package/fesm2022/keycloakify-angular-login-directives-kc-class.mjs +3 -3
  105. package/fesm2022/keycloakify-angular-login-pages-code.mjs +3 -3
  106. package/fesm2022/keycloakify-angular-login-pages-delete-account-confirm.mjs +3 -3
  107. package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs +3 -3
  108. package/fesm2022/keycloakify-angular-login-pages-error.mjs +3 -3
  109. package/fesm2022/keycloakify-angular-login-pages-frontchannel-logout.mjs +3 -3
  110. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs +12 -14
  111. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs.map +1 -1
  112. package/fesm2022/keycloakify-angular-login-pages-info.mjs +3 -3
  113. package/fesm2022/keycloakify-angular-login-pages-login-config-totp.mjs +3 -3
  114. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm-override.mjs +3 -3
  115. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm.mjs +3 -3
  116. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs +3 -3
  117. package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs +3 -3
  118. package/fesm2022/keycloakify-angular-login-pages-login-oauth2-device-verify-user-code.mjs +3 -3
  119. package/fesm2022/keycloakify-angular-login-pages-login-otp.mjs +3 -3
  120. package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs +3 -3
  121. package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs +3 -3
  122. package/fesm2022/keycloakify-angular-login-pages-login-password.mjs +3 -3
  123. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs +124 -5
  124. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs.map +1 -1
  125. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs +3 -3
  126. package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs +3 -3
  127. package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs +3 -3
  128. package/fesm2022/keycloakify-angular-login-pages-login-update-password.mjs +3 -3
  129. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs +12 -14
  130. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs.map +1 -1
  131. package/fesm2022/keycloakify-angular-login-pages-login-username.mjs +3 -3
  132. package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs +3 -3
  133. package/fesm2022/keycloakify-angular-login-pages-login-x509-info.mjs +3 -3
  134. package/fesm2022/keycloakify-angular-login-pages-login.mjs +3 -3
  135. package/fesm2022/keycloakify-angular-login-pages-logout-confirm.mjs +3 -3
  136. package/fesm2022/keycloakify-angular-login-pages-register.mjs +11 -13
  137. package/fesm2022/keycloakify-angular-login-pages-register.mjs.map +1 -1
  138. package/fesm2022/keycloakify-angular-login-pages-saml-post-form.mjs +3 -3
  139. package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs +3 -3
  140. package/fesm2022/keycloakify-angular-login-pages-terms.mjs +3 -3
  141. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs +12 -14
  142. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs.map +1 -1
  143. package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs +3 -3
  144. package/fesm2022/keycloakify-angular-login-pages-webauthn-error.mjs +3 -3
  145. package/fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs +3 -3
  146. package/fesm2022/keycloakify-angular-login-services-i18n.mjs +3 -3
  147. package/fesm2022/keycloakify-angular-login-services-login-resource-injector.mjs +3 -3
  148. package/fesm2022/keycloakify-angular-login-services-user-profile-form.mjs +55 -1003
  149. package/fesm2022/keycloakify-angular-login-services-user-profile-form.mjs.map +1 -1
  150. package/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.d.ts +0 -1
  151. package/login/components/user-profile-form-fields/user-profile-form-fields.component.d.ts +3 -13
  152. package/login/pages/idp-review-user-profile/idp-review-user-profile.component.d.ts +1 -2
  153. package/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.d.ts +3 -0
  154. package/login/pages/login-update-profile/login-update-profile.component.d.ts +1 -2
  155. package/login/pages/register/register.component.d.ts +1 -2
  156. package/login/pages/update-email/update-email.component.d.ts +1 -2
  157. package/login/services/user-profile-form/user-profile-form.service.d.ts +20 -41
  158. package/package.json +8 -14
  159. package/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +3 -69
  160. package/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html +71 -68
  161. package/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +6 -21
  162. package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +6 -13
  163. package/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +123 -0
  164. package/src/login/pages/login-update-profile/login-update-profile.component.ts +6 -12
  165. package/src/login/pages/register/register.component.ts +5 -10
  166. package/src/login/pages/update-email/update-email.component.ts +6 -12
  167. package/src/login/services/user-profile-form/user-profile-form.service.ts +103 -1433
  168. package/esm2022/login/services/submit/keycloakify-angular-login-services-submit.mjs +0 -5
  169. package/esm2022/login/services/submit/public-api.mjs +0 -2
  170. package/esm2022/login/services/submit/submit.service.mjs +0 -20
  171. package/fesm2022/keycloakify-angular-login-services-submit.mjs +0 -27
  172. package/fesm2022/keycloakify-angular-login-services-submit.mjs.map +0 -1
  173. package/login/services/submit/index.d.ts +0 -5
  174. package/login/services/submit/public-api.d.ts +0 -1
  175. package/login/services/submit/submit.service.d.ts +0 -9
  176. package/src/login/services/submit/index.ts +0 -1
  177. package/src/login/services/submit/submit.service.ts +0 -12
@@ -4,15 +4,17 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css
4
4
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
5
5
  import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';
6
6
  import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';
7
+ import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
7
8
  import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';
8
9
  import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
9
10
  import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
10
11
 
11
12
  class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
12
13
  constructor() {
13
- super(...arguments);
14
+ super();
14
15
  this.kcContext = inject(KC_LOGIN_CONTEXT);
15
16
  this.i18n = inject(LOGIN_I18N);
17
+ this.loginResourceInjectorService = inject(LoginResourceInjectorService);
16
18
  this.doUseDefaultCss = inject(USE_DEFAULT_CSS);
17
19
  this.classes = inject(LOGIN_CLASSES);
18
20
  this.displayRequiredFields = false;
@@ -23,16 +25,133 @@ class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
23
25
  this.socialProvidersNode = viewChild('socialProvidersNode');
24
26
  this.toggleRecoveryCodesConfirmation = signal(false);
25
27
  this.olRecoveryCodesListId = 'kc-recovery-codes-list';
28
+ this.loginResourceInjectorService.insertAdditionalScripts([
29
+ {
30
+ type: 'text/javascript',
31
+ id: `${this.olRecoveryCodesListId}-script`,
32
+ textContent: `
33
+ /* copy recovery codes */
34
+ function copyRecoveryCodes() {
35
+ var tmpTextarea = document.createElement("textarea");
36
+ var codes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
37
+ for (i = 0; i < codes.length; i++) {
38
+ tmpTextarea.value = tmpTextarea.value + codes[i].innerText + "\\n";
39
+ }
40
+ document.body.appendChild(tmpTextarea);
41
+ tmpTextarea.select();
42
+ document.execCommand("copy");
43
+ document.body.removeChild(tmpTextarea);
44
+ }
45
+
46
+ var copyButton = document.getElementById("copyRecoveryCodes");
47
+ copyButton && copyButton.addEventListener("click", function () {
48
+ copyRecoveryCodes();
49
+ });
50
+
51
+ /* download recovery codes */
52
+ function formatCurrentDateTime() {
53
+ var dt = new Date();
54
+ var options = {
55
+ month: 'long',
56
+ day: 'numeric',
57
+ year: 'numeric',
58
+ hour: 'numeric',
59
+ minute: 'numeric',
60
+ timeZoneName: 'short'
61
+ };
62
+
63
+ return dt.toLocaleString('en-US', options);
64
+ }
65
+
66
+ function parseRecoveryCodeList() {
67
+ var recoveryCodes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
68
+ var recoveryCodeList = "";
69
+
70
+ for (var i = 0; i < recoveryCodes.length; i++) {
71
+ var recoveryCodeLiElement = recoveryCodes[i].innerText;
72
+ recoveryCodeList += recoveryCodeLiElement + "\\r\\n";
73
+ }
74
+
75
+ return recoveryCodeList;
76
+ }
77
+
78
+ function buildDownloadContent() {
79
+ var recoveryCodeList = parseRecoveryCodeList();
80
+ var dt = new Date();
81
+ var options = {
82
+ month: 'long',
83
+ day: 'numeric',
84
+ year: 'numeric',
85
+ hour: 'numeric',
86
+ minute: 'numeric',
87
+ timeZoneName: 'short'
88
+ };
89
+
90
+ return fileBodyContent =
91
+ ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "\\n\\n" +
92
+ recoveryCodeList + "\\n" +
93
+ ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "\\n\\n" +
94
+ ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime();
95
+ }
96
+
97
+ function setUpDownloadLinkAndDownload(filename, text) {
98
+ var el = document.createElement('a');
99
+ el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
100
+ el.setAttribute('download', filename);
101
+ el.style.display = 'none';
102
+ document.body.appendChild(el);
103
+ el.click();
104
+ document.body.removeChild(el);
105
+ }
106
+
107
+ function downloadRecoveryCodes() {
108
+ setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());
109
+ }
110
+
111
+ var downloadButton = document.getElementById("downloadRecoveryCodes");
112
+ downloadButton && downloadButton.addEventListener("click", downloadRecoveryCodes);
113
+
114
+ /* print recovery codes */
115
+ function buildPrintContent() {
116
+ var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;
117
+ var styles =
118
+ \`@page { size: auto; margin-top: 0; }
119
+ body { width: 480px; }
120
+ div { list-style-type: none; font-family: monospace }
121
+ p:first-of-type { margin-top: 48px }\`;
122
+
123
+ return printFileContent =
124
+ "<html><style>" + styles + "</style><body>" +
125
+ "<title>kc-download-recovery-codes</title>" +
126
+ "<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "</p>" +
127
+ "<div>" + recoveryCodeListHTML + "</div>" +
128
+ "<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "</p>" +
129
+ "<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime() + "</p>" +
130
+ "</body></html>";
131
+ }
132
+
133
+ function printRecoveryCodes() {
134
+ var w = window.open();
135
+ w.document.write(buildPrintContent());
136
+ w.print();
137
+ w.close();
138
+ }
139
+
140
+ var printButton = document.getElementById("printRecoveryCodes");
141
+ printButton && printButton.addEventListener("click", printRecoveryCodes);
142
+ `
143
+ }
144
+ ]);
26
145
  }
27
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginRecoveryAuthnCodeConfigComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-config", providers: [
146
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
147
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginRecoveryAuthnCodeConfigComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-config", providers: [
29
148
  {
30
149
  provide: ComponentReference,
31
150
  useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)
32
151
  }
33
152
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "component", type: LogoutOtherSessionsComponent, selector: "kc-logout-other-sessions" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34
153
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, decorators: [{
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, decorators: [{
36
155
  type: Component,
37
156
  args: [{ standalone: true, imports: [KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-login-recovery-authn-code-config', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
38
157
  {
@@ -40,7 +159,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
40
159
  useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)
41
160
  }
42
161
  ], template: "@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n" }]
43
- }] });
162
+ }], ctorParameters: () => [] });
44
163
 
45
164
  /**
46
165
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n loginResourceInjectorService = inject(LoginResourceInjectorService);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n\n constructor() {\n super();\n this.loginResourceInjectorService.insertAdditionalScripts([\n {\n type: 'text/javascript',\n id: `${this.olRecoveryCodesListId}-script`,\n textContent: `\n /* copy recovery codes */\n function copyRecoveryCodes() {\n var tmpTextarea = document.createElement(\"textarea\");\n var codes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n for (i = 0; i < codes.length; i++) {\n tmpTextarea.value = tmpTextarea.value + codes[i].innerText + \"\\\\n\";\n }\n document.body.appendChild(tmpTextarea);\n tmpTextarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tmpTextarea);\n }\n\n var copyButton = document.getElementById(\"copyRecoveryCodes\");\n copyButton && copyButton.addEventListener(\"click\", function () {\n copyRecoveryCodes();\n });\n\n /* download recovery codes */\n function formatCurrentDateTime() {\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return dt.toLocaleString('en-US', options);\n }\n\n function parseRecoveryCodeList() {\n var recoveryCodes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n var recoveryCodeList = \"\";\n\n for (var i = 0; i < recoveryCodes.length; i++) {\n var recoveryCodeLiElement = recoveryCodes[i].innerText;\n recoveryCodeList += recoveryCodeLiElement + \"\\\\r\\\\n\";\n }\n\n return recoveryCodeList;\n }\n\n function buildDownloadContent() {\n var recoveryCodeList = parseRecoveryCodeList();\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return fileBodyContent =\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"\\\\n\\\\n\" +\n recoveryCodeList + \"\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"\\\\n\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime();\n }\n\n function setUpDownloadLinkAndDownload(filename, text) {\n var el = document.createElement('a');\n el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n el.setAttribute('download', filename);\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n }\n\n function downloadRecoveryCodes() {\n setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());\n }\n\n var downloadButton = document.getElementById(\"downloadRecoveryCodes\");\n downloadButton && downloadButton.addEventListener(\"click\", downloadRecoveryCodes);\n\n /* print recovery codes */\n function buildPrintContent() {\n var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;\n var styles =\n \\`@page { size: auto; margin-top: 0; }\n body { width: 480px; }\n div { list-style-type: none; font-family: monospace }\n p:first-of-type { margin-top: 48px }\\`;\n\n return printFileContent =\n \"<html><style>\" + styles + \"</style><body>\" +\n \"<title>kc-download-recovery-codes</title>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"</p>\" +\n \"<div>\" + recoveryCodeListHTML + \"</div>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"</p>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime() + \"</p>\" +\n \"</body></html>\";\n }\n\n function printRecoveryCodes() {\n var w = window.open();\n w.document.write(buildPrintContent());\n w.print();\n w.close();\n }\n\n var printButton = document.getElementById(\"printRecoveryCodes\");\n printButton && printButton.addEventListener(\"click\", printRecoveryCodes);\n `\n }\n ]);\n }\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -22,15 +22,15 @@ class LoginRecoveryAuthnCodeInputComponent extends ComponentReference {
22
22
  this.infoNode = viewChild('infoNode');
23
23
  this.socialProvidersNode = viewChild('socialProvidersNode');
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginRecoveryAuthnCodeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginRecoveryAuthnCodeInputComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-input", providers: [
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginRecoveryAuthnCodeInputComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-input", providers: [
27
27
  {
28
28
  provide: ComponentReference,
29
29
  useExisting: forwardRef(() => LoginRecoveryAuthnCodeInputComponent)
30
30
  }
31
31
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let recoveryAuthnCodesInputBean = kcContext.recoveryAuthnCodesInputBean;\n@let messagesPerField = kcContext.messagesPerField;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('auth-recovery-code-header') }}\n</ng-template>\n\n<form\n id=\"kc-recovery-code-login-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <label\n for=\"recoveryCodeInput\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('auth-recovery-code-prompt', recoveryAuthnCodesInputBean.codeNumber.toString()) }}\n </label>\n </div>\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <input\n tabIndex=\"1\"\n id=\"recoveryCodeInput\"\n name=\"recoveryCodeInput\"\n autoComplete=\"off\"\n type=\"text\"\n autoFocus\n [attr.aria-invalid]=\"messagesPerField.existsError('recoveryCodeInput')\"\n [kcClass]=\"'kcInputClass'\"\n />\n @if (messagesPerField.existsError('recoveryCodeInput')) {\n <span\n id=\"input-error\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHTML]=\"messagesPerField.get('recoveryCodeInput') | kcSanitize: 'html'\"\n ></span>\n }\n </div>\n </div>\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsWrapperClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\"></div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n name=\"login\"\n id=\"kc-login\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doLogIn')\"\n />\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32
32
  }
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginRecoveryAuthnCodeInputComponent, decorators: [{
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeInputComponent, decorators: [{
34
34
  type: Component,
35
35
  args: [{ standalone: true, imports: [KcClassDirective, KcSanitizePipe], selector: 'kc-login-recovery-authn-code-input', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
36
36
  {
@@ -21,15 +21,15 @@ class LoginResetOtpComponent extends ComponentReference {
21
21
  this.infoNode = viewChild('infoNode');
22
22
  this.socialProvidersNode = viewChild('socialProvidersNode');
23
23
  }
24
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginResetOtpComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
25
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginResetOtpComponent, isStandalone: true, selector: "kc-login-reset-otp", providers: [
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginResetOtpComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginResetOtpComponent, isStandalone: true, selector: "kc-login-reset-otp", providers: [
26
26
  {
27
27
  provide: ComponentReference,
28
28
  useExisting: forwardRef(() => LoginResetOtpComponent)
29
29
  }
30
30
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let configuredOtpCredentials = kcContext.configuredOtpCredentials;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('doLogIn') }}\n</ng-template>\n\n<form\n id=\"kc-otp-reset-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div [kcClass]=\"'kcInfoAreaWrapperClass'\">\n <p id=\"kc-otp-reset-form-description\">\n {{ i18n.msgStr('otp-reset-description') }}\n </p>\n @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) {\n <input\n type=\"radio\"\n name=\"selectedCredentialId\"\n [id]=\"'kc-otp-credential-' + i\"\n [kcClass]=\"'kcLoginOTPListInputClass'\"\n [value]=\"otpCredential.id\"\n [defaultChecked]=\"otpCredential.id === configuredOtpCredentials.selectedCredentialId\"\n />\n <label\n for=\"kc-otp-credential-0\"\n [kcClass]=\"'kcLoginOTPListClass'\"\n [tabIndex]=\"i\"\n >\n <span [kcClass]=\"'kcLoginOTPListItemHeaderClass'\">\n <span [kcClass]=\"'kcLoginOTPListItemIconBodyClass'\">\n <i\n aria-hidden=\"true\"\n [kcClass]=\"'kcLoginOTPListItemIconClass'\"\n ></i>\n </span>\n <span [kcClass]=\"'kcLoginOTPListItemTitleClass'\">{{ otpCredential.userLabel }}</span>\n </span>\n </label>\n }\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n id=\"kc-otp-reset-form-submit\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n </div>\n </div>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginResetOtpComponent, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginResetOtpComponent, decorators: [{
33
33
  type: Component,
34
34
  args: [{ standalone: true, imports: [KcClassDirective], selector: 'kc-login-reset-otp', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
35
35
  {
@@ -22,15 +22,15 @@ class LoginResetPasswordComponent extends ComponentReference {
22
22
  this.infoNode = viewChild('infoNode');
23
23
  this.socialProvidersNode = viewChild('socialProvidersNode');
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginResetPasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginResetPasswordComponent, isStandalone: true, selector: "kc-login-reset-password", providers: [
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginResetPasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginResetPasswordComponent, isStandalone: true, selector: "kc-login-reset-password", providers: [
27
27
  {
28
28
  provide: ComponentReference,
29
29
  useExisting: forwardRef(() => LoginResetPasswordComponent)
30
30
  }
31
31
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let realm = kcContext.realm;\n@let auth = kcContext.auth;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('emailForgotTitle') }}\n</ng-template>\n<ng-template #infoNode>\n @let realm = kcContext.realm;\n @if (realm.duplicateEmailsAllowed) {\n {{ i18n.msgStr('emailInstructionUsername') }}\n } @else {\n {{ i18n.msgStr('emailInstruction') }}\n }\n</ng-template>\n\n<form\n id=\"kc-passwd-update-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <label\n for=\"password-new\"\n [kcClass]=\"'kcLabelClass'\"\n >\n @if (realm.loginWithEmailAllowed) {\n {{ i18n.msgStr('username') }}\n } @else if (!realm.registrationEmailAsUsername) {\n {{ i18n.msgStr('usernameOrEmail') }}\n } @else {\n {{ i18n.msgStr('email') }}\n }\n </label>\n </div>\n\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <input\n type=\"text\"\n id=\"username\"\n name=\"username\"\n autoFocus\n [kcClass]=\"'kcInputClass'\"\n [attr.aria-invalid]=\"messagesPerField.existsError('username')\"\n [defaultValue]=\"auth.attemptedUsername ?? ''\"\n />\n\n @if (messagesPerField.existsError('username')) {\n <span\n id=\"input-error-username\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('username') | kcSanitize: 'html'\"\n ></span>\n }\n </div>\n </div>\n\n <div [kcClass]=\"['kcFormGroupClass', 'kcFormSettingClass']\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32
32
  }
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginResetPasswordComponent, decorators: [{
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginResetPasswordComponent, decorators: [{
34
34
  type: Component,
35
35
  args: [{ standalone: true, imports: [KcClassDirective, KcSanitizePipe], selector: 'kc-login-reset-password', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
36
36
  {
@@ -24,15 +24,15 @@ class LoginUpdatePasswordComponent extends ComponentReference {
24
24
  this.infoNode = viewChild('infoNode');
25
25
  this.socialProvidersNode = viewChild('socialProvidersNode');
26
26
  }
27
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUpdatePasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginUpdatePasswordComponent, isStandalone: true, selector: "kc-login-update-password", providers: [
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUpdatePasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginUpdatePasswordComponent, isStandalone: true, selector: "kc-login-update-password", providers: [
29
29
  {
30
30
  provide: ComponentReference,
31
31
  useExisting: forwardRef(() => LoginUpdatePasswordComponent)
32
32
  }
33
33
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('updatePasswordTitle') }}\n</ng-template>\n<form\n id=\"kc-passwd-update-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <label\n for=\"password-new\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('passwordNew') }}\n </label>\n </div>\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <kc-password-wrapper passwordInputId=\"password-new\">\n <input\n type=\"password\"\n id=\"password-new\"\n name=\"password-new\"\n autoFocus\n autoComplete=\"new-password\"\n [kcClass]=\"'kcInputClass'\"\n [attr.aria-invalid]=\"messagesPerField.existsError('password', 'password-confirm')\"\n />\n </kc-password-wrapper>\n\n @if (messagesPerField.existsError('password')) {\n <span\n id=\"input-error-password\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('password') | kcSanitize: 'html'\"\n ></span>\n }\n </div>\n </div>\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <label\n for=\"password-confirm\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('passwordConfirm') }}\n </label>\n </div>\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <kc-password-wrapper passwordInputId=\"password-confirm\">\n <input\n type=\"password\"\n id=\"password-confirm\"\n name=\"password-confirm\"\n autoFocus\n autoComplete=\"new-password\"\n [kcClass]=\"'kcInputClass'\"\n [attr.aria-invalid]=\"messagesPerField.existsError('password', 'password-confirm')\"\n />\n </kc-password-wrapper>\n @if (messagesPerField.existsError('password-confirm')) {\n <span\n id=\"input-error-password-confirm\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('password-confirm') | kcSanitize: 'html'\"\n ></span>\n }\n </div>\n </div>\n <div [kcClass]=\"'kcFormGroupClass'\">\n <kc-logout-other-sessions />\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [kcClass]=\"{\n kcButtonClass: true,\n kcButtonPrimaryClass: true,\n kcButtonBlockClass: !isAppInitiatedAction,\n kcButtonLargeClass: true\n }\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n @if (isAppInitiatedAction) {\n <button\n type=\"submit\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('doCancel') }}\n </button>\n }\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "component", type: PasswordWrapperComponent, selector: "kc-password-wrapper", inputs: ["passwordInputId"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }, { kind: "component", type: LogoutOtherSessionsComponent, selector: "kc-logout-other-sessions" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34
34
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUpdatePasswordComponent, decorators: [{
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUpdatePasswordComponent, decorators: [{
36
36
  type: Component,
37
37
  args: [{ standalone: true, imports: [KcClassDirective, PasswordWrapperComponent, KcSanitizePipe, LogoutOtherSessionsComponent], selector: 'kc-login-update-password', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
38
38
  {
@@ -1,20 +1,20 @@
1
1
  import { NgComponentOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, viewChild, signal, input, forwardRef, Component, ChangeDetectionStrategy } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { inject, viewChild, input, forwardRef, Component, ChangeDetectionStrategy } from '@angular/core';
4
+ import { toSignal } from '@angular/core/rxjs-interop';
5
5
  import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';
6
6
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
7
7
  import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';
8
- import { SubmitService } from '@keycloakify/angular/login/services/submit';
8
+ import { UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form';
9
9
  import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';
10
10
  import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
11
11
  import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
12
+ import { map } from 'rxjs';
12
13
 
13
14
  class LoginUpdateProfileComponent extends ComponentReference {
14
- #submitService;
15
15
  constructor() {
16
- super();
17
- this.#submitService = inject(SubmitService);
16
+ super(...arguments);
17
+ this.#userProfileFormService = inject(UserProfileFormService);
18
18
  this.kcContext = inject(KC_LOGIN_CONTEXT);
19
19
  this.i18n = inject(LOGIN_I18N);
20
20
  this.doUseDefaultCss = inject(USE_DEFAULT_CSS);
@@ -25,21 +25,19 @@ class LoginUpdateProfileComponent extends ComponentReference {
25
25
  this.headerNode = viewChild('headerNode');
26
26
  this.infoNode = viewChild('infoNode');
27
27
  this.socialProvidersNode = viewChild('socialProvidersNode');
28
- this.isFormSubmittable = signal(false);
28
+ this.isFormSubmittable = toSignal(this.#userProfileFormService.formState$.pipe(map(s => s.isFormSubmittable)), { initialValue: false });
29
29
  this.userProfileFormFields = input();
30
- this.#submitService.isSubmittable.pipe(takeUntilDestroyed()).subscribe(submittable => {
31
- this.isFormSubmittable.set(submittable);
32
- });
33
30
  }
34
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUpdateProfileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginUpdateProfileComponent, isStandalone: true, selector: "kc-login-update-profile", inputs: { userProfileFormFields: { classPropertyName: "userProfileFormFields", publicName: "userProfileFormFields", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
31
+ #userProfileFormService;
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUpdateProfileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginUpdateProfileComponent, isStandalone: true, selector: "kc-login-update-profile", inputs: { userProfileFormFields: { classPropertyName: "userProfileFormFields", publicName: "userProfileFormFields", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
36
34
  {
37
35
  provide: ComponentReference,
38
36
  useExisting: forwardRef(() => LoginUpdateProfileComponent)
39
37
  }
40
38
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('loginProfileTitle') }}\n</ng-template>\n<form\n id=\"kc-update-profile-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\"></div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable()\"\n [kcClass]=\"{\n kcButtonClass: true,\n kcButtonPrimaryClass: true,\n kcButtonBlockClass: !isAppInitiatedAction,\n kcButtonLargeClass: true\n }\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n @if (isAppInitiatedAction) {\n <button\n type=\"submit\"\n name=\"cancel-aia\"\n value=\"true\"\n formNoValidate\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('doCancel') }}\n </button>\n }\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
41
39
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUpdateProfileComponent, decorators: [{
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUpdateProfileComponent, decorators: [{
43
41
  type: Component,
44
42
  args: [{ standalone: true, imports: [KcClassDirective, NgComponentOutlet], selector: 'kc-login-update-profile', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
45
43
  {
@@ -47,7 +45,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
47
45
  useExisting: forwardRef(() => LoginUpdateProfileComponent)
48
46
  }
49
47
  ], template: "@let url = kcContext.url;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('loginProfileTitle') }}\n</ng-template>\n<form\n id=\"kc-update-profile-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\"></div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable()\"\n [kcClass]=\"{\n kcButtonClass: true,\n kcButtonPrimaryClass: true,\n kcButtonBlockClass: !isAppInitiatedAction,\n kcButtonLargeClass: true\n }\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n @if (isAppInitiatedAction) {\n <button\n type=\"submit\"\n name=\"cancel-aia\"\n value=\"true\"\n formNoValidate\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('doCancel') }}\n </button>\n }\n </div>\n </div>\n</form>\n" }]
50
- }], ctorParameters: () => [] });
48
+ }] });
51
49
 
52
50
  /**
53
51
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"keycloakify-angular-login-pages-login-update-profile.mjs","sources":["../../src/login/pages/login-update-profile/login-update-profile.component.ts","../../src/login/pages/login-update-profile/login-update-profile.component.html","../../src/login/pages/login-update-profile/keycloakify-angular-login-pages-login-update-profile.ts"],"sourcesContent":["import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { SubmitService } from '@keycloakify/angular/login/services/submit';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, NgComponentOutlet],\n selector: 'kc-login-update-profile',\n templateUrl: 'login-update-profile.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginUpdateProfileComponent)\n }\n ]\n})\nexport class LoginUpdateProfileComponent extends ComponentReference {\n #submitService = inject(SubmitService);\n kcContext = inject<Extract<KcContext, { pageId: 'login-update-profile.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = true;\n displayInfo = false;\n displayMessage: boolean = this.kcContext.messagesPerField.exists('global');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n isFormSubmittable = signal(false);\n userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();\n\n constructor() {\n super();\n this.#submitService.isSubmittable.pipe(takeUntilDestroyed()).subscribe(submittable => {\n this.isFormSubmittable.set(submittable);\n });\n }\n}\n","@let url = kcContext.url;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('loginProfileTitle') }}\n</ng-template>\n<form\n id=\"kc-update-profile-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\"></div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable()\"\n [kcClass]=\"{\n kcButtonClass: true,\n kcButtonPrimaryClass: true,\n kcButtonBlockClass: !isAppInitiatedAction,\n kcButtonLargeClass: true\n }\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n @if (isAppInitiatedAction) {\n <button\n type=\"submit\"\n name=\"cancel-aia\"\n value=\"true\"\n formNoValidate\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('doCancel') }}\n </button>\n }\n </div>\n </div>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keycloakify-angular-login-pages-login-update-profile.mjs","sources":["../../src/login/pages/login-update-profile/login-update-profile.component.ts","../../src/login/pages/login-update-profile/login-update-profile.component.html","../../src/login/pages/login-update-profile/keycloakify-angular-login-pages-login-update-profile.ts"],"sourcesContent":["import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, inject, input, type TemplateRef, Type, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\nimport { map } from 'rxjs';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, NgComponentOutlet],\n selector: 'kc-login-update-profile',\n templateUrl: 'login-update-profile.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginUpdateProfileComponent)\n }\n ]\n})\nexport class LoginUpdateProfileComponent extends ComponentReference {\n #userProfileFormService = inject(UserProfileFormService);\n kcContext = inject<Extract<KcContext, { pageId: 'login-update-profile.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = true;\n displayInfo = false;\n displayMessage: boolean = this.kcContext.messagesPerField.exists('global');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n isFormSubmittable = toSignal(this.#userProfileFormService.formState$.pipe(map(s => s.isFormSubmittable)), { initialValue: false });\n userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();\n}\n","@let url = kcContext.url;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('loginProfileTitle') }}\n</ng-template>\n<form\n id=\"kc-update-profile-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.loginAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\"></div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable()\"\n [kcClass]=\"{\n kcButtonClass: true,\n kcButtonPrimaryClass: true,\n kcButtonBlockClass: !isAppInitiatedAction,\n kcButtonLargeClass: true\n }\"\n [value]=\"i18n.msgStr('doSubmit')\"\n />\n @if (isAppInitiatedAction) {\n <button\n type=\"submit\"\n name=\"cancel-aia\"\n value=\"true\"\n formNoValidate\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('doCancel') }}\n </button>\n }\n </div>\n </div>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -24,15 +24,15 @@ class LoginUsernameComponent extends ComponentReference {
24
24
  this.socialProvidersNode = viewChild('socialProvidersNode');
25
25
  this.isLoginButtonDisabled = signal(false);
26
26
  }
27
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUsernameComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: LoginUsernameComponent, isStandalone: true, selector: "kc-login-username", providers: [
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUsernameComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginUsernameComponent, isStandalone: true, selector: "kc-login-username", providers: [
29
29
  {
30
30
  provide: ComponentReference,
31
31
  useExisting: forwardRef(() => LoginUsernameComponent)
32
32
  }
33
33
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let realm = kcContext.realm;\n@let usernameHidden = kcContext.usernameHidden;\n@let messagesPerField = kcContext.messagesPerField;\n@let url = kcContext.url;\n@let login = kcContext.login;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('doLogIn') }}\n</ng-template>\n<ng-template #infoNode>\n @let url = kcContext.url;\n <div id=\"kc-registration\">\n <span>\n {{ i18n.msgStr('noAccount') }}\n <a\n tabindex=\"6\"\n [href]=\"url?.registrationUrl\"\n >\n {{ i18n.msgStr('doRegister') }}\n </a>\n </span>\n </div>\n</ng-template>\n<ng-template #socialProvidersNode>\n @let realm = kcContext.realm;\n @let social = kcContext.social;\n @if (!!realm?.password && !!social?.providers?.length) {\n <div\n id=\"kc-social-providers\"\n [kcClass]=\"'kcFormSocialAccountSectionClass'\"\n >\n <hr />\n <h2>{{ i18n.msgStr('identity-provider-login-label') }}</h2>\n <ul\n [kcClass]=\"{\n kcFormSocialAccountListClass: true,\n kcFormSocialAccountListGridClass: (social?.providers?.length ?? 0) > 3\n }\"\n >\n @for (provider of social?.providers; track provider.alias; let idx = $index) {\n <li>\n <a\n type=\"button\"\n [id]=\"provider.alias\"\n [kcClass]=\"{\n kcFormSocialAccountListButtonClass: true,\n kcFormSocialAccountGridItem: (social?.providers?.length ?? 0) > 3\n }\"\n [href]=\"provider.loginUrl\"\n >\n @if (provider.iconClasses) {\n <i\n aria-hidden=\"true\"\n [ngClass]=\"provider.iconClasses\"\n [kcClass]=\"'kcCommonLogoIdP'\"\n ></i>\n }\n <span\n [ngClass]=\"{\n 'kc-social-icon-text': provider.iconClasses\n }\"\n [kcClass]=\"'kcFormSocialAccountNameClass'\"\n [innerHTML]=\"provider.displayName | kcSanitize: 'html'\"\n ></span>\n </a>\n </li>\n }\n </ul>\n </div>\n }\n</ng-template>\n<div id=\"kc-form\">\n <div id=\"kc-form-wrapper\">\n @if (realm.password) {\n <form\n id=\"kc-form-login\"\n method=\"post\"\n [action]=\"url?.loginAction\"\n (onSubmit)=\"isLoginButtonDisabled.set(true)\"\n >\n @if (!usernameHidden) {\n <div [kcClass]=\"'kcFormGroupClass'\">\n <label\n for=\"username\"\n [kcClass]=\"'kcLabelClass'\"\n >\n @if (!realm?.loginWithEmailAllowed) {\n {{ i18n.msgStr('username') }}\n } @else if (!realm?.registrationEmailAsUsername) {\n {{ i18n.msgStr('usernameOrEmail') }}\n } @else {\n {{ i18n.msgStr('email') }}\n }\n </label>\n <input\n tabindex=\"2\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n autofocus\n autoComplete=\"off\"\n [kcClass]=\"'kcInputClass'\"\n [defaultValue]=\"login?.username || ''\"\n [attr.aria-invalid]=\"messagesPerField?.existsError('username')\"\n />\n @if (messagesPerField?.existsError('username')) {\n <span\n id=\"input-error\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHTML]=\"messagesPerField.getFirstError('username') | kcSanitize: 'html'\"\n >\n </span>\n }\n </div>\n }\n\n <div [kcClass]=\"['kcFormGroupClass', 'kcFormSettingClass']\">\n <div id=\"kc-form-options\">\n @if (realm.rememberMe && !usernameHidden) {\n <div class=\"checkbox\">\n <label>\n <input\n tabindex=\"5\"\n id=\"rememberMe\"\n name=\"rememberMe\"\n type=\"checkbox\"\n [defaultChecked]=\"!!login?.rememberMe\"\n />\n {{ i18n.msgStr('rememberMe') }}\n </label>\n </div>\n }\n </div>\n </div>\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormGroupClass'\"\n >\n <input\n tabindex=\"4\"\n name=\"login\"\n id=\"kc-login\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doLogIn')\"\n />\n </div>\n </form>\n }\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34
34
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginUsernameComponent, decorators: [{
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginUsernameComponent, decorators: [{
36
36
  type: Component,
37
37
  args: [{ selector: 'kc-login-username', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass], providers: [
38
38
  {
@@ -21,15 +21,15 @@ class LoginVerifyEmailComponent extends ComponentReference {
21
21
  this.infoNode = viewChild('infoNode');
22
22
  this.socialProvidersNode = viewChild('socialProvidersNode');
23
23
  }
24
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginVerifyEmailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
25
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.7", type: LoginVerifyEmailComponent, isStandalone: true, selector: "kc-login-verify-email", providers: [
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginVerifyEmailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.8", type: LoginVerifyEmailComponent, isStandalone: true, selector: "kc-login-verify-email", providers: [
26
26
  {
27
27
  provide: ComponentReference,
28
28
  useExisting: forwardRef(() => LoginVerifyEmailComponent)
29
29
  }
30
30
  ], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let user = kcContext.user;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('emailVerifyTitle') }}\n</ng-template>\n<ng-template #infoNode>\n @let url = kcContext.url;\n <p class=\"instruction\">\n {{ i18n.msgStr('emailVerifyInstruction2') }}\n <br />\n <a [href]=\"url.loginAction\">{{ i18n.msgStr('doClickHere') }}</a>\n &nbsp;\n {{ i18n.msgStr('emailVerifyInstruction3') }}\n </p>\n</ng-template>\n\n<p class=\"instruction\">\n {{ i18n.msgStr('emailVerifyInstruction1', user?.email ?? '') }}\n</p>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: LoginVerifyEmailComponent, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginVerifyEmailComponent, decorators: [{
33
33
  type: Component,
34
34
  args: [{ standalone: true, imports: [KcClassDirective], selector: 'kc-login-verify-email', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
35
35
  {