barsa-auth 2.3.164 → 2.3.167
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/barsa-auth.mjs +408 -59
- package/fesm2022/barsa-auth.mjs.map +1 -1
- package/package.json +3 -3
- package/types/barsa-auth.d.ts +144 -11
package/fesm2022/barsa-auth.mjs
CHANGED
|
@@ -1,15 +1,208 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, EventEmitter,
|
|
2
|
+
import { inject, Injectable, signal, EventEmitter, Input, Output, ChangeDetectionStrategy, Component, NgZone, ViewChild, ViewChildren, input, TemplateRef, NgModule } from '@angular/core';
|
|
3
3
|
import * as i3 from 'barsa-novin-ray-core';
|
|
4
|
-
import { BaseController, BarsaApi, ViewBase, forbiddenValidator, mobile_regex, BaseComponent,
|
|
4
|
+
import { getUniqueId, BaseController, BarsaApi, ViewBase, forbiddenValidator, mobile_regex, BaseComponent, validateAllFormFields, PortalService, ApplicationCtrlrService, BaseModule, DynamicComponentService, BarsaNovinRayCoreModule } from 'barsa-novin-ray-core';
|
|
5
|
+
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
|
6
|
+
import { firstValueFrom, finalize, catchError, throwError } from 'rxjs';
|
|
5
7
|
import * as i1 from '@angular/common';
|
|
6
8
|
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { HttpClient } from '@angular/common/http';
|
|
8
|
-
import { finalize, catchError, throwError } from 'rxjs';
|
|
9
9
|
import * as i2 from '@angular/forms';
|
|
10
10
|
import { FormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
11
11
|
import { ActivatedRoute } from '@angular/router';
|
|
12
12
|
|
|
13
|
+
function decodeBase64Url(value) {
|
|
14
|
+
const padding = '='.repeat((4 - (value.length % 4)) % 4);
|
|
15
|
+
const binary = globalThis.atob(value.replace(/-/g, '+').replace(/_/g, '/') + padding);
|
|
16
|
+
const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
17
|
+
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
18
|
+
}
|
|
19
|
+
function encodeBase64Url(value) {
|
|
20
|
+
const bytes = new Uint8Array(value);
|
|
21
|
+
let binary = '';
|
|
22
|
+
for (const byte of bytes) {
|
|
23
|
+
binary += String.fromCharCode(byte);
|
|
24
|
+
}
|
|
25
|
+
return globalThis.btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class PasskeyService {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.httpClient = inject(HttpClient);
|
|
31
|
+
}
|
|
32
|
+
isPlatformAuthenticatorAvailable() {
|
|
33
|
+
if (!this.platformAvailability) {
|
|
34
|
+
this.platformAvailability = this.detectPlatformAuthenticator();
|
|
35
|
+
}
|
|
36
|
+
return this.platformAvailability;
|
|
37
|
+
}
|
|
38
|
+
getEnrollmentStatus() {
|
|
39
|
+
return firstValueFrom(this.httpClient.get('/api2/PassKey/0.1/status?v=' + getUniqueId(4))).then((response) => this.parseJsonResponse(response));
|
|
40
|
+
}
|
|
41
|
+
canOfferEnrollment(status) {
|
|
42
|
+
return status.canCreatePasskey ?? status.shouldOfferEnrollment;
|
|
43
|
+
}
|
|
44
|
+
isCredentialAlreadyRegistered(error) {
|
|
45
|
+
return (typeof error === 'object' &&
|
|
46
|
+
error !== null &&
|
|
47
|
+
'name' in error &&
|
|
48
|
+
error.name === 'InvalidStateError');
|
|
49
|
+
}
|
|
50
|
+
async register() {
|
|
51
|
+
const ceremonyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/registrationoptions', {}));
|
|
52
|
+
const ceremony = this.parseJsonResponse(ceremonyResponse);
|
|
53
|
+
const publicKey = this.toCreationOptions(ceremony.publicKey);
|
|
54
|
+
const credential = (await navigator.credentials.create({ publicKey }));
|
|
55
|
+
if (!credential || !('attestationObject' in credential.response)) {
|
|
56
|
+
throw new Error('PASSKEY_REGISTRATION_EMPTY');
|
|
57
|
+
}
|
|
58
|
+
const verifyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/registrationverify', {
|
|
59
|
+
ceremonyId: ceremony.ceremonyId,
|
|
60
|
+
credential: this.serializeRegistrationCredential(credential)
|
|
61
|
+
}));
|
|
62
|
+
const response = this.parseJsonResponse(verifyResponse);
|
|
63
|
+
if (!response.verified) {
|
|
64
|
+
throw new Error('PASSKEY_REGISTRATION_REJECTED');
|
|
65
|
+
}
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
async authenticate() {
|
|
69
|
+
const ceremonyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/authenticationoptions', {}));
|
|
70
|
+
const ceremony = this.parseJsonResponse(ceremonyResponse);
|
|
71
|
+
const publicKey = this.toRequestOptions(ceremony.publicKey);
|
|
72
|
+
const credential = (await navigator.credentials.get({ publicKey }));
|
|
73
|
+
if (!credential || !('signature' in credential.response)) {
|
|
74
|
+
throw new Error('PASSKEY_AUTHENTICATION_EMPTY');
|
|
75
|
+
}
|
|
76
|
+
const verifyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/authenticationverify', {
|
|
77
|
+
ceremonyId: ceremony.ceremonyId,
|
|
78
|
+
credential: this.serializeAuthenticationCredential(credential)
|
|
79
|
+
}));
|
|
80
|
+
const response = this.parseJsonResponse(verifyResponse);
|
|
81
|
+
if (!response.verified || !response.token2?.trim()) {
|
|
82
|
+
throw new Error('PASSKEY_AUTHENTICATION_REJECTED');
|
|
83
|
+
}
|
|
84
|
+
return response.token2;
|
|
85
|
+
}
|
|
86
|
+
getErrorMessage(error) {
|
|
87
|
+
if (error instanceof DOMException) {
|
|
88
|
+
if (error.name === 'NotAllowedError') {
|
|
89
|
+
return 'عملیات لغو شد یا Passkey معتبری روی این دستگاه پیدا نشد.';
|
|
90
|
+
}
|
|
91
|
+
if (error.name === 'InvalidStateError') {
|
|
92
|
+
return 'Passkey این دستگاه قبلاً برای حساب شما ثبت شده است.';
|
|
93
|
+
}
|
|
94
|
+
if (error.name === 'SecurityError') {
|
|
95
|
+
return 'تنظیمات دامنه یا ارتباط امن برای ورود با دستگاه معتبر نیست.';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof HttpErrorResponse) {
|
|
99
|
+
const serverMessage = error.error?.Message || error.error?.message || error.error?.error?.userMessage;
|
|
100
|
+
if (typeof serverMessage === 'string' && serverMessage) {
|
|
101
|
+
return serverMessage;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return 'انجام احراز هویت دستگاه ممکن نشد. میتوانید از روش دیگری وارد شوید.';
|
|
105
|
+
}
|
|
106
|
+
async detectPlatformAuthenticator() {
|
|
107
|
+
if (typeof window === 'undefined' ||
|
|
108
|
+
!window.isSecureContext ||
|
|
109
|
+
typeof PublicKeyCredential === 'undefined' ||
|
|
110
|
+
typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
parseJsonResponse(response) {
|
|
121
|
+
let value = response;
|
|
122
|
+
for (let depth = 0; depth < 2 && typeof value === 'string'; depth++) {
|
|
123
|
+
value = JSON.parse(value);
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
toCreationOptions(options) {
|
|
128
|
+
return {
|
|
129
|
+
...options,
|
|
130
|
+
challenge: decodeBase64Url(options.challenge),
|
|
131
|
+
user: {
|
|
132
|
+
...options.user,
|
|
133
|
+
id: decodeBase64Url(options.user.id)
|
|
134
|
+
},
|
|
135
|
+
excludeCredentials: this.toCredentialDescriptors(options.excludeCredentials),
|
|
136
|
+
authenticatorSelection: {
|
|
137
|
+
...options.authenticatorSelection,
|
|
138
|
+
authenticatorAttachment: 'platform',
|
|
139
|
+
residentKey: 'required',
|
|
140
|
+
requireResidentKey: true,
|
|
141
|
+
userVerification: 'required'
|
|
142
|
+
},
|
|
143
|
+
attestation: 'none',
|
|
144
|
+
hints: ['client-device']
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
toRequestOptions(options) {
|
|
148
|
+
return {
|
|
149
|
+
...options,
|
|
150
|
+
challenge: decodeBase64Url(options.challenge),
|
|
151
|
+
allowCredentials: this.toCredentialDescriptors(options.allowCredentials),
|
|
152
|
+
userVerification: 'required',
|
|
153
|
+
hints: ['client-device']
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
toCredentialDescriptors(descriptors) {
|
|
157
|
+
return descriptors?.map((descriptor) => ({
|
|
158
|
+
...descriptor,
|
|
159
|
+
id: decodeBase64Url(descriptor.id),
|
|
160
|
+
transports: descriptor.transports
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
serializeRegistrationCredential(credential) {
|
|
164
|
+
const response = credential.response;
|
|
165
|
+
return {
|
|
166
|
+
id: credential.id,
|
|
167
|
+
rawId: encodeBase64Url(credential.rawId),
|
|
168
|
+
type: 'public-key',
|
|
169
|
+
authenticatorAttachment: this.getAuthenticatorAttachment(credential),
|
|
170
|
+
clientExtensionResults: credential.getClientExtensionResults(),
|
|
171
|
+
response: {
|
|
172
|
+
clientDataJSON: encodeBase64Url(response.clientDataJSON),
|
|
173
|
+
attestationObject: encodeBase64Url(response.attestationObject),
|
|
174
|
+
transports: response.getTransports?.() || []
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
serializeAuthenticationCredential(credential) {
|
|
179
|
+
const response = credential.response;
|
|
180
|
+
return {
|
|
181
|
+
id: credential.id,
|
|
182
|
+
rawId: encodeBase64Url(credential.rawId),
|
|
183
|
+
type: 'public-key',
|
|
184
|
+
authenticatorAttachment: this.getAuthenticatorAttachment(credential),
|
|
185
|
+
clientExtensionResults: credential.getClientExtensionResults(),
|
|
186
|
+
response: {
|
|
187
|
+
clientDataJSON: encodeBase64Url(response.clientDataJSON),
|
|
188
|
+
authenticatorData: encodeBase64Url(response.authenticatorData),
|
|
189
|
+
signature: encodeBase64Url(response.signature),
|
|
190
|
+
userHandle: response.userHandle ? encodeBase64Url(response.userHandle) : null
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
getAuthenticatorAttachment(credential) {
|
|
195
|
+
return (credential.authenticatorAttachment ??
|
|
196
|
+
null);
|
|
197
|
+
}
|
|
198
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
199
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, providedIn: 'root' }); }
|
|
200
|
+
}
|
|
201
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, decorators: [{
|
|
202
|
+
type: Injectable,
|
|
203
|
+
args: [{ providedIn: 'root' }]
|
|
204
|
+
}] });
|
|
205
|
+
|
|
13
206
|
class LoginMobileController extends BaseController {
|
|
14
207
|
/**
|
|
15
208
|
*
|
|
@@ -102,7 +295,8 @@ class LoginUserPassController extends BaseController {
|
|
|
102
295
|
class LoginVerificationController extends BaseController {
|
|
103
296
|
constructor(view) {
|
|
104
297
|
super(view);
|
|
105
|
-
this.canVerify = signal(false,
|
|
298
|
+
this.canVerify = signal(false, /* @ts-ignore */
|
|
299
|
+
...(ngDevMode ? [{ debugName: "canVerify" }] : /* istanbul ignore next */ []));
|
|
106
300
|
this._httpClient = view.injector.get(HttpClient);
|
|
107
301
|
}
|
|
108
302
|
get form() {
|
|
@@ -166,8 +360,10 @@ class EnterMobileComponent extends ViewBase {
|
|
|
166
360
|
super();
|
|
167
361
|
this.otpSent = new EventEmitter();
|
|
168
362
|
this.controller = new LoginMobileController(this);
|
|
169
|
-
this.loading = signal(false,
|
|
170
|
-
|
|
363
|
+
this.loading = signal(false, /* @ts-ignore */
|
|
364
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
365
|
+
this.isValid = signal(false, /* @ts-ignore */
|
|
366
|
+
...(ngDevMode ? [{ debugName: "isValid" }] : /* istanbul ignore next */ []));
|
|
171
367
|
/** Inserted by Angular inject() migration for backwards compatibility */
|
|
172
368
|
this.fb = inject(FormBuilder);
|
|
173
369
|
this.form = this.fb.group({
|
|
@@ -203,12 +399,12 @@ class EnterMobileComponent extends ViewBase {
|
|
|
203
399
|
onSendCode() {
|
|
204
400
|
this.controller.sendCode(this.otpProvider, this.form.value);
|
|
205
401
|
}
|
|
206
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
207
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
402
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
403
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: EnterMobileComponent, isStandalone: false, selector: "ba-enter-mobile", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider", mobileDescription: "mobileDescription", usernameDescription: "usernameDescription", usernameLabel: "usernameLabel" }, outputs: { otpSent: "otpSent" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
208
404
|
}
|
|
209
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
405
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, decorators: [{
|
|
210
406
|
type: Component,
|
|
211
|
-
args: [{ selector: 'ba-enter-mobile', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"
|
|
407
|
+
args: [{ selector: 'ba-enter-mobile', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
|
|
212
408
|
}], ctorParameters: () => [], propDecorators: { otpSent: [{
|
|
213
409
|
type: Output
|
|
214
410
|
}], errorTemplate: [{
|
|
@@ -227,9 +423,12 @@ class TimerCountDownComponent extends BaseComponent {
|
|
|
227
423
|
constructor() {
|
|
228
424
|
super(...arguments);
|
|
229
425
|
this.resend = new EventEmitter();
|
|
230
|
-
this.showResend = signal(false,
|
|
231
|
-
|
|
232
|
-
this.
|
|
426
|
+
this.showResend = signal(false, /* @ts-ignore */
|
|
427
|
+
...(ngDevMode ? [{ debugName: "showResend" }] : /* istanbul ignore next */ []));
|
|
428
|
+
this.minutesText = signal('', /* @ts-ignore */
|
|
429
|
+
...(ngDevMode ? [{ debugName: "minutesText" }] : /* istanbul ignore next */ []));
|
|
430
|
+
this.secondText = signal('', /* @ts-ignore */
|
|
431
|
+
...(ngDevMode ? [{ debugName: "secondText" }] : /* istanbul ignore next */ []));
|
|
233
432
|
}
|
|
234
433
|
ngOnInit() {
|
|
235
434
|
super.ngOnInit();
|
|
@@ -276,12 +475,12 @@ class TimerCountDownComponent extends BaseComponent {
|
|
|
276
475
|
this.showResend.set(true);
|
|
277
476
|
}
|
|
278
477
|
}
|
|
279
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
280
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
478
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
479
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: TimerCountDownComponent, isStandalone: false, selector: "ba-timer-countdown", inputs: { minutes: "minutes", loading: "loading" }, outputs: { resend: "resend" }, usesInheritance: true, ngImport: i0, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}.auth-timer{align-items:center;color:var(--sapButton_Emphasized_Background, #0a6ed1);font-family:var(--sapFontSemiboldDuplexFamily, var(--sapFontFamily, sans-serif))}\n"], dependencies: [{ kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
281
480
|
}
|
|
282
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
481
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, decorators: [{
|
|
283
482
|
type: Component,
|
|
284
|
-
args: [{ selector: 'ba-timer-countdown', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n
|
|
483
|
+
args: [{ selector: 'ba-timer-countdown', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}.auth-timer{align-items:center;color:var(--sapButton_Emphasized_Background, #0a6ed1);font-family:var(--sapFontSemiboldDuplexFamily, var(--sapFontFamily, sans-serif))}\n"] }]
|
|
285
484
|
}], propDecorators: { resend: [{
|
|
286
485
|
type: Output
|
|
287
486
|
}], minutes: [{
|
|
@@ -297,12 +496,17 @@ class VerificationComponent extends ViewBase {
|
|
|
297
496
|
this.otpVerified = new EventEmitter();
|
|
298
497
|
this.changeMobile = new EventEmitter();
|
|
299
498
|
this.controller = new LoginVerificationController(this);
|
|
300
|
-
this.capId = signal('-',
|
|
301
|
-
|
|
302
|
-
this.
|
|
303
|
-
|
|
499
|
+
this.capId = signal('-', /* @ts-ignore */
|
|
500
|
+
...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
|
|
501
|
+
this.resendLoading = signal(false, /* @ts-ignore */
|
|
502
|
+
...(ngDevMode ? [{ debugName: "resendLoading" }] : /* istanbul ignore next */ []));
|
|
503
|
+
this.loading = signal(false, /* @ts-ignore */
|
|
504
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
505
|
+
this.showCaptcha = signal(false, /* @ts-ignore */
|
|
506
|
+
...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
|
|
304
507
|
this._ngZone = inject(NgZone);
|
|
305
|
-
this.now = signal(getUniqueId(3),
|
|
508
|
+
this.now = signal(getUniqueId(3), /* @ts-ignore */
|
|
509
|
+
...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
|
|
306
510
|
this.fb = inject(FormBuilder);
|
|
307
511
|
this.form = this.fb.group({
|
|
308
512
|
in1: ['', Validators.compose([Validators.required, Validators.maxLength(6)])],
|
|
@@ -352,12 +556,12 @@ class VerificationComponent extends ViewBase {
|
|
|
352
556
|
get canVerify() {
|
|
353
557
|
return this.controller.canVerify();
|
|
354
558
|
}
|
|
355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
356
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
559
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
560
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: VerificationComponent, isStandalone: false, selector: "ba-verification", inputs: { mobile: "mobile", otpProvider: "otpProvider", errorTemplate: "errorTemplate" }, outputs: { otpVerified: "otpVerified", changeMobile: "changeMobile" }, viewQueries: [{ propertyName: "_timerCountDown", first: true, predicate: TimerCountDownComponent, descendants: true }, { propertyName: "_loadingBtn", first: true, predicate: ["loadingBtn"], descendants: true }, { propertyName: "_inputsEl", predicate: ["inputv"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "directive", type: i3.WebOtpDirective, selector: "[appWebotp]", inputs: ["autoUpdate"], outputs: ["otpRecieved"] }, { kind: "component", type: TimerCountDownComponent, selector: "ba-timer-countdown", inputs: ["minutes", "loading"], outputs: ["resend"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
357
561
|
}
|
|
358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
562
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, decorators: [{
|
|
359
563
|
type: Component,
|
|
360
|
-
args: [{ selector: 'ba-verification', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"tw-block tw-w-full tw-text-
|
|
564
|
+
args: [{ selector: 'ba-verification', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
|
|
361
565
|
}], ctorParameters: () => [], propDecorators: { _timerCountDown: [{
|
|
362
566
|
type: ViewChild,
|
|
363
567
|
args: [TimerCountDownComponent]
|
|
@@ -384,11 +588,16 @@ class UserPassComponent extends ViewBase {
|
|
|
384
588
|
super();
|
|
385
589
|
this.loggedIn = new EventEmitter();
|
|
386
590
|
this.controller = new LoginUserPassController(this);
|
|
387
|
-
this.canLogin = signal(false,
|
|
388
|
-
|
|
389
|
-
this.
|
|
390
|
-
|
|
391
|
-
this.
|
|
591
|
+
this.canLogin = signal(false, /* @ts-ignore */
|
|
592
|
+
...(ngDevMode ? [{ debugName: "canLogin" }] : /* istanbul ignore next */ []));
|
|
593
|
+
this.loading = signal(false, /* @ts-ignore */
|
|
594
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
595
|
+
this.capId = signal(getUniqueId(4), /* @ts-ignore */
|
|
596
|
+
...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
|
|
597
|
+
this.now = signal(getUniqueId(3), /* @ts-ignore */
|
|
598
|
+
...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
|
|
599
|
+
this.showCaptcha = signal(false, /* @ts-ignore */
|
|
600
|
+
...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
|
|
392
601
|
/** Inserted by Angular inject() migration for backwards compatibility */
|
|
393
602
|
this.fb = inject(FormBuilder);
|
|
394
603
|
this.form = this.fb.group({
|
|
@@ -435,12 +644,12 @@ class UserPassComponent extends ViewBase {
|
|
|
435
644
|
validateAllFormFields(this.form);
|
|
436
645
|
this.canLogin() && !this.loading() && this.controller.login(this.form.value);
|
|
437
646
|
}
|
|
438
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
439
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
647
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
648
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: UserPassComponent, isStandalone: false, selector: "ba-user-pass", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider" }, outputs: { loggedIn: "loggedIn" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-captcha-refresh{padding:0;border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);cursor:pointer}.auth-captcha-refresh:hover:not(:disabled){border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.auth-captcha-refresh:active:not(:disabled){border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.auth-captcha-refresh:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-captcha-refresh:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
440
649
|
}
|
|
441
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
650
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, decorators: [{
|
|
442
651
|
type: Component,
|
|
443
|
-
args: [{ selector: 'ba-user-pass', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"
|
|
652
|
+
args: [{ selector: 'ba-user-pass', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-captcha-refresh{padding:0;border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);cursor:pointer}.auth-captcha-refresh:hover:not(:disabled){border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.auth-captcha-refresh:active:not(:disabled){border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.auth-captcha-refresh:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-captcha-refresh:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}\n"] }]
|
|
444
653
|
}], ctorParameters: () => [], propDecorators: { loggedIn: [{
|
|
445
654
|
type: Output
|
|
446
655
|
}], errorTemplate: [{
|
|
@@ -449,18 +658,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
449
658
|
type: Input
|
|
450
659
|
}] } });
|
|
451
660
|
|
|
661
|
+
class PasskeyComponent {
|
|
662
|
+
constructor() {
|
|
663
|
+
this.mode = 'login';
|
|
664
|
+
this.autoStart = false;
|
|
665
|
+
this.loggedIn = new EventEmitter();
|
|
666
|
+
this.registered = new EventEmitter();
|
|
667
|
+
this.skipped = new EventEmitter();
|
|
668
|
+
this.cancelled = new EventEmitter();
|
|
669
|
+
this.checkingSupport = signal(true, /* @ts-ignore */
|
|
670
|
+
...(ngDevMode ? [{ debugName: "checkingSupport" }] : /* istanbul ignore next */ []));
|
|
671
|
+
this.supported = signal(false, /* @ts-ignore */
|
|
672
|
+
...(ngDevMode ? [{ debugName: "supported" }] : /* istanbul ignore next */ []));
|
|
673
|
+
this.loading = signal(false, /* @ts-ignore */
|
|
674
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
675
|
+
this.errorMessage = signal('', /* @ts-ignore */
|
|
676
|
+
...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
|
|
677
|
+
this.passkeyService = inject(PasskeyService);
|
|
678
|
+
}
|
|
679
|
+
ngOnInit() {
|
|
680
|
+
void this.checkSupport();
|
|
681
|
+
}
|
|
682
|
+
async onPrimaryAction() {
|
|
683
|
+
if (!this.supported() || this.loading()) {
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
this.loading.set(true);
|
|
687
|
+
this.errorMessage.set('');
|
|
688
|
+
try {
|
|
689
|
+
if (this.mode === 'enrollment') {
|
|
690
|
+
await this.passkeyService.register();
|
|
691
|
+
this.registered.emit();
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
const token2 = await this.passkeyService.authenticate();
|
|
695
|
+
this.loggedIn.emit(token2);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
catch (error) {
|
|
699
|
+
if (this.mode === 'enrollment' && this.passkeyService.isCredentialAlreadyRegistered(error)) {
|
|
700
|
+
// excludeCredentials نشان میدهد Passkey روی authenticator جاری از قبل موجود است.
|
|
701
|
+
this.registered.emit();
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
console.error('Passkey error:', error);
|
|
705
|
+
if (error instanceof DOMException) {
|
|
706
|
+
console.error('name:', error.name);
|
|
707
|
+
console.error('message:', error.message);
|
|
708
|
+
}
|
|
709
|
+
this.errorMessage.set(this.passkeyService.getErrorMessage(error));
|
|
710
|
+
}
|
|
711
|
+
finally {
|
|
712
|
+
this.loading.set(false);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
onSkip() {
|
|
716
|
+
if (this.loading()) {
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
this.skipped.emit();
|
|
720
|
+
}
|
|
721
|
+
async checkSupport() {
|
|
722
|
+
const supported = await this.passkeyService.isPlatformAuthenticatorAvailable();
|
|
723
|
+
this.supported.set(supported);
|
|
724
|
+
this.checkingSupport.set(false);
|
|
725
|
+
if (supported && this.mode === 'login' && this.autoStart) {
|
|
726
|
+
await this.onPrimaryAction();
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
730
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: PasskeyComponent, isStandalone: false, selector: "ba-passkey", inputs: { mode: "mode", autoStart: "autoStart" }, outputs: { loggedIn: "loggedIn", registered: "registered", skipped: "skipped", cancelled: "cancelled" }, ngImport: i0, template: "<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0633\u0631\u06CC\u0639 \u0628\u0627 \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0628\u0627 \u062B\u0628\u062A Passkey\u060C \u062F\u0641\u0639\u0647\u200C\u06CC \u0628\u0639\u062F \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u06CC\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647 \u0648\u0627\u0631\u062F \u0634\u0648\u06CC\u062F. \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0648\u0645\u062A\u0631\u06CC\u06A9 \u0648 PIN \u0627\u0632\r\n \u062F\u0633\u062A\u06AF\u0627\u0647 \u062E\u0627\u0631\u062C \u0646\u0645\u06CC\u200C\u0634\u0648\u0646\u062F.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0627\u0632 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0628\u0631\u0627\u06CC \u0648\u0631\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">\u062F\u0631 \u062D\u0627\u0644 \u0628\u0631\u0631\u0633\u06CC \u0642\u0627\u0628\u0644\u06CC\u062A \u062F\u0633\u062A\u06AF\u0627\u0647...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? '\u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC \u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647' : '\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u062F\u0627\u062E\u0644\u06CC \u0631\u0648\u06CC \u0627\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06CC\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">\u0641\u0639\u0644\u0627\u064B \u0646\u0647</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n \u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0631\u0648\u0634\u200C\u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">\u062E\u0637\u0627!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.passkey-panel{color:var(--sapTextColor, #32363a)}.passkey-title{color:var(--sapTitleColor, var(--sapTextColor, #32363a));font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif))}.passkey-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem);line-height:1.75}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-link{padding:0;border:0;background:transparent}.passkey-link:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
731
|
+
}
|
|
732
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyComponent, decorators: [{
|
|
733
|
+
type: Component,
|
|
734
|
+
args: [{ selector: 'ba-passkey', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0633\u0631\u06CC\u0639 \u0628\u0627 \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0628\u0627 \u062B\u0628\u062A Passkey\u060C \u062F\u0641\u0639\u0647\u200C\u06CC \u0628\u0639\u062F \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u06CC\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647 \u0648\u0627\u0631\u062F \u0634\u0648\u06CC\u062F. \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0648\u0645\u062A\u0631\u06CC\u06A9 \u0648 PIN \u0627\u0632\r\n \u062F\u0633\u062A\u06AF\u0627\u0647 \u062E\u0627\u0631\u062C \u0646\u0645\u06CC\u200C\u0634\u0648\u0646\u062F.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0627\u0632 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0628\u0631\u0627\u06CC \u0648\u0631\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">\u062F\u0631 \u062D\u0627\u0644 \u0628\u0631\u0631\u0633\u06CC \u0642\u0627\u0628\u0644\u06CC\u062A \u062F\u0633\u062A\u06AF\u0627\u0647...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? '\u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC \u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647' : '\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u062F\u0627\u062E\u0644\u06CC \u0631\u0648\u06CC \u0627\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06CC\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">\u0641\u0639\u0644\u0627\u064B \u0646\u0647</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n \u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0631\u0648\u0634\u200C\u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">\u062E\u0637\u0627!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.passkey-panel{color:var(--sapTextColor, #32363a)}.passkey-title{color:var(--sapTitleColor, var(--sapTextColor, #32363a));font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif))}.passkey-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem);line-height:1.75}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-link{padding:0;border:0;background:transparent}.passkey-link:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
|
|
735
|
+
}], propDecorators: { mode: [{
|
|
736
|
+
type: Input
|
|
737
|
+
}], autoStart: [{
|
|
738
|
+
type: Input
|
|
739
|
+
}], loggedIn: [{
|
|
740
|
+
type: Output
|
|
741
|
+
}], registered: [{
|
|
742
|
+
type: Output
|
|
743
|
+
}], skipped: [{
|
|
744
|
+
type: Output
|
|
745
|
+
}], cancelled: [{
|
|
746
|
+
type: Output
|
|
747
|
+
}] } });
|
|
748
|
+
|
|
452
749
|
class BarsaAuthComponent {
|
|
453
750
|
constructor() {
|
|
454
751
|
this.verified = new EventEmitter();
|
|
455
|
-
this.appSettings = input.required(
|
|
456
|
-
|
|
457
|
-
this.
|
|
458
|
-
|
|
752
|
+
this.appSettings = input.required(/* @ts-ignore */
|
|
753
|
+
...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
|
|
754
|
+
this.state = signal('enter-mobile', /* @ts-ignore */
|
|
755
|
+
...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
|
|
756
|
+
this.mobile = signal('', /* @ts-ignore */
|
|
757
|
+
...(ngDevMode ? [{ debugName: "mobile" }] : /* istanbul ignore next */ []));
|
|
758
|
+
this.loading = signal(false, /* @ts-ignore */
|
|
759
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
760
|
+
this.passkeyAvailable = signal(false, /* @ts-ignore */
|
|
761
|
+
...(ngDevMode ? [{ debugName: "passkeyAvailable" }] : /* istanbul ignore next */ []));
|
|
459
762
|
this._portalService = inject(PortalService);
|
|
460
763
|
this._applicationCtrlrService = inject(ApplicationCtrlrService);
|
|
764
|
+
this.passkeyService = inject(PasskeyService);
|
|
461
765
|
}
|
|
462
766
|
ngOnInit() {
|
|
463
767
|
this.state.set(this.appSettings().DefaultState || 'enter-mobile');
|
|
768
|
+
if (this.appSettings().PasskeyEnable) {
|
|
769
|
+
void this.updatePasskeyAvailability();
|
|
770
|
+
}
|
|
464
771
|
}
|
|
465
772
|
onChangeState(state) {
|
|
466
773
|
this.state.set(state);
|
|
@@ -473,15 +780,47 @@ class BarsaAuthComponent {
|
|
|
473
780
|
this.state.set('verification');
|
|
474
781
|
}
|
|
475
782
|
onLoggedIn() {
|
|
783
|
+
void this.completeExistingLogin();
|
|
784
|
+
}
|
|
785
|
+
onPasskeyLoggedIn(token2) {
|
|
786
|
+
this.finishLogin(token2);
|
|
787
|
+
}
|
|
788
|
+
onEnrollmentFinished() {
|
|
789
|
+
this.finishLogin();
|
|
790
|
+
}
|
|
791
|
+
async updatePasskeyAvailability() {
|
|
792
|
+
this.passkeyAvailable.set(await this.passkeyService.isPlatformAuthenticatorAvailable());
|
|
793
|
+
}
|
|
794
|
+
async completeExistingLogin() {
|
|
476
795
|
this.loading.set(true);
|
|
477
|
-
this.
|
|
796
|
+
if (this.appSettings().PasskeyEnable &&
|
|
797
|
+
this.appSettings().PasskeyPromptOnFirstLogin &&
|
|
798
|
+
(await this.passkeyService.isPlatformAuthenticatorAvailable())) {
|
|
799
|
+
try {
|
|
800
|
+
const status = await this.passkeyService.getEnrollmentStatus();
|
|
801
|
+
if (this.passkeyService.canOfferEnrollment(status)) {
|
|
802
|
+
this.loading.set(false);
|
|
803
|
+
this.state.set('passkey-enrollment');
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
catch (e) {
|
|
808
|
+
console.error('Error checking passkey enrollment status:', e);
|
|
809
|
+
// Passkey اختیاری است؛ خطای status نباید ورود موفق را متوقف کند.
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
this.finishLogin();
|
|
478
813
|
}
|
|
479
|
-
|
|
480
|
-
|
|
814
|
+
finishLogin(token2) {
|
|
815
|
+
this.loading.set(false);
|
|
816
|
+
this.verified.emit(token2);
|
|
817
|
+
}
|
|
818
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
819
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: BarsaAuthComponent, isStandalone: false, selector: "ba-auth", inputs: { appSettings: { classPropertyName: "appSettings", publicName: "appSettings", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { verified: "verified" }, ngImport: i0, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.MobileDirective, selector: "[mobile]" }, { kind: "component", type: EnterMobileComponent, selector: "ba-enter-mobile", inputs: ["errorTemplate", "otpProvider", "mobileDescription", "usernameDescription", "usernameLabel"], outputs: ["otpSent"] }, { kind: "component", type: VerificationComponent, selector: "ba-verification", inputs: ["mobile", "otpProvider", "errorTemplate"], outputs: ["otpVerified", "changeMobile"] }, { kind: "component", type: UserPassComponent, selector: "ba-user-pass", inputs: ["errorTemplate", "otpProvider"], outputs: ["loggedIn"] }, { kind: "component", type: PasskeyComponent, selector: "ba-passkey", inputs: ["mode", "autoStart"], outputs: ["loggedIn", "registered", "skipped", "cancelled"] }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
481
820
|
}
|
|
482
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
821
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, decorators: [{
|
|
483
822
|
type: Component,
|
|
484
|
-
args: [{ selector: 'ba-auth', standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\
|
|
823
|
+
args: [{ selector: 'ba-auth', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"] }]
|
|
485
824
|
}], propDecorators: { verified: [{
|
|
486
825
|
type: Output
|
|
487
826
|
}], appSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "appSettings", required: true }] }] } });
|
|
@@ -505,7 +844,8 @@ class LoginComponent {
|
|
|
505
844
|
MobileDescription: '',
|
|
506
845
|
UsernameDescription: '',
|
|
507
846
|
LoginFooter: ''
|
|
508
|
-
},
|
|
847
|
+
}, /* @ts-ignore */
|
|
848
|
+
...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
|
|
509
849
|
this.logoUrl = '';
|
|
510
850
|
this.backgroundUrl = '';
|
|
511
851
|
this.title = '';
|
|
@@ -522,15 +862,21 @@ class LoginComponent {
|
|
|
522
862
|
this.appSettings.set(resolverData.loginSettings);
|
|
523
863
|
}
|
|
524
864
|
}
|
|
525
|
-
onVerified() {
|
|
865
|
+
onVerified(token2) {
|
|
866
|
+
if (token2) {
|
|
867
|
+
const currentUrl = new URL(window.location.origin);
|
|
868
|
+
currentUrl.searchParams.set('token2', token2);
|
|
869
|
+
window.location.href = currentUrl.toString();
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
526
872
|
window.location.href = window.location.origin;
|
|
527
873
|
}
|
|
528
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
529
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: LoginComponent, isStandalone: false, selector: "ba-login", viewQueries: [{ propertyName: "_errorTemplate", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"tw-w-full md:tw-w-4/12 tw-relative tw-bg-white tw-shadow-sm tw-border\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n\r\n <hr class=\"tw-border tw-border-gray-300 tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"tw-text-blue-600 hover:tw-underline tw-pt-2 tw-cursor-pointer\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"tw-bg-white dark:tw-bg-gray-900 tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"tw-flex tw-items-center tw-h-full tw-px-20 tw-bg-gray-900 tw-bg-opacity-40\">\r\n <div>\r\n <h2 class=\"tw-text-4xl tw-font-bold tw-text-white\">{{ appSettings().Section1Title }}</h2>\r\n <p class=\"tw-max-w-xl tw-mt-3 tw-text-gray-300\">{{ appSettings().Section1Description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"tw-text-2xl tw-font-bold tw-text-center tw-text-gray-700 dark:tw-text-white\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"tw-text-xl tw-mt-1 tw-text-gray-500 dark:tw-text-gray-300\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{font-family:IRANYekanDigits}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BarsaAuthComponent, selector: "ba-auth", inputs: ["appSettings"], outputs: ["verified"] }, { kind: "pipe", type: i3.PictureFieldSourcePipe, name: "picFieldSrc" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
874
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
875
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: LoginComponent, isStandalone: false, selector: "ba-login", viewQueries: [{ propertyName: "_errorTemplate", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;min-height:100%}.login-section,.login-page{color:var(--sapTextColor, #32363a);background:var(--sapBackgroundColor, #f7f7f7)}.login-panel{border:var(--sapElement_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, #d9d9d9);color:var(--sapTextColor, #32363a);background:var(--sapGroup_ContentBackground, #fff);box-shadow:var(--sapContent_Shadow1, 0 .125rem .5rem rgba(0, 0, 0, .2))}.login-divider{border:0;border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.login-hero-overlay{background:color-mix(in srgb,var(--sapShell_Background, #354a5f) 72%,transparent)}.login-hero-title{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-hero-description{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontFamily, sans-serif);opacity:.82}.login-title{color:var(--sapTitleColor, #32363a);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-subtitle{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif)}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BarsaAuthComponent, selector: "ba-auth", inputs: ["appSettings"], outputs: ["verified"] }, { kind: "pipe", type: i3.PictureFieldSourcePipe, name: "picFieldSrc" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
530
876
|
}
|
|
531
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
877
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, decorators: [{
|
|
532
878
|
type: Component,
|
|
533
|
-
args: [{ selector: 'ba-login', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"tw-w-full md:tw-w-4/12 tw-relative tw-bg-white tw-shadow-sm tw-border\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n\r\n <hr class=\"tw-border tw-border-gray-300 tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"tw-text-blue-600 hover:tw-underline tw-pt-2 tw-cursor-pointer\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"tw-bg-white dark:tw-bg-gray-900 tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"tw-flex tw-items-center tw-h-full tw-px-20 tw-bg-gray-900 tw-bg-opacity-40\">\r\n <div>\r\n <h2 class=\"tw-text-4xl tw-font-bold tw-text-white\">{{ appSettings().Section1Title }}</h2>\r\n <p class=\"tw-max-w-xl tw-mt-3 tw-text-gray-300\">{{ appSettings().Section1Description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"tw-text-2xl tw-font-bold tw-text-center tw-text-gray-700 dark:tw-text-white\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"tw-text-xl tw-mt-1 tw-text-gray-500 dark:tw-text-gray-300\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{font-family:IRANYekanDigits}\n"] }]
|
|
879
|
+
args: [{ selector: 'ba-login', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;min-height:100%}.login-section,.login-page{color:var(--sapTextColor, #32363a);background:var(--sapBackgroundColor, #f7f7f7)}.login-panel{border:var(--sapElement_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, #d9d9d9);color:var(--sapTextColor, #32363a);background:var(--sapGroup_ContentBackground, #fff);box-shadow:var(--sapContent_Shadow1, 0 .125rem .5rem rgba(0, 0, 0, .2))}.login-divider{border:0;border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.login-hero-overlay{background:color-mix(in srgb,var(--sapShell_Background, #354a5f) 72%,transparent)}.login-hero-title{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-hero-description{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontFamily, sans-serif);opacity:.82}.login-title{color:var(--sapTitleColor, #32363a);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-subtitle{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif)}\n"] }]
|
|
534
880
|
}], propDecorators: { _errorTemplate: [{
|
|
535
881
|
type: ViewChild,
|
|
536
882
|
args: ['template', { static: true, read: TemplateRef }]
|
|
@@ -542,7 +888,8 @@ const components = [
|
|
|
542
888
|
VerificationComponent,
|
|
543
889
|
TimerCountDownComponent,
|
|
544
890
|
UserPassComponent,
|
|
545
|
-
LoginComponent
|
|
891
|
+
LoginComponent,
|
|
892
|
+
PasskeyComponent
|
|
546
893
|
];
|
|
547
894
|
class BarsaAuthModule extends BaseModule {
|
|
548
895
|
/** Inserted by Angular inject() migration for backwards compatibility */
|
|
@@ -552,21 +899,23 @@ class BarsaAuthModule extends BaseModule {
|
|
|
552
899
|
this.dynamicComponents = [...components];
|
|
553
900
|
this.dcm = dcm;
|
|
554
901
|
}
|
|
555
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
556
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
902
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
903
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, declarations: [BarsaAuthComponent,
|
|
557
904
|
EnterMobileComponent,
|
|
558
905
|
VerificationComponent,
|
|
559
906
|
TimerCountDownComponent,
|
|
560
907
|
UserPassComponent,
|
|
561
|
-
LoginComponent
|
|
908
|
+
LoginComponent,
|
|
909
|
+
PasskeyComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
|
|
562
910
|
EnterMobileComponent,
|
|
563
911
|
VerificationComponent,
|
|
564
912
|
TimerCountDownComponent,
|
|
565
913
|
UserPassComponent,
|
|
566
|
-
LoginComponent
|
|
567
|
-
|
|
914
|
+
LoginComponent,
|
|
915
|
+
PasskeyComponent] }); }
|
|
916
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule] }); }
|
|
568
917
|
}
|
|
569
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
918
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, decorators: [{
|
|
570
919
|
type: NgModule,
|
|
571
920
|
args: [{
|
|
572
921
|
declarations: [...components],
|
|
@@ -583,5 +932,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
583
932
|
* Generated bundle index. Do not edit.
|
|
584
933
|
*/
|
|
585
934
|
|
|
586
|
-
export { BarsaAuthComponent, BarsaAuthModule, EnterMobileComponent, LoginComponent, LoginMobileController, LoginUserPassController, LoginVerificationController, TimerCountDownComponent, UserPassComponent, VerificationComponent };
|
|
935
|
+
export { BarsaAuthComponent, BarsaAuthModule, EnterMobileComponent, LoginComponent, LoginMobileController, LoginUserPassController, LoginVerificationController, PasskeyComponent, PasskeyService, TimerCountDownComponent, UserPassComponent, VerificationComponent };
|
|
587
936
|
//# sourceMappingURL=barsa-auth.mjs.map
|