barsa-auth 2.3.165 → 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 +350 -22
- package/fesm2022/barsa-auth.mjs.map +1 -1
- package/package.json +1 -1
- 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
|
*
|
|
@@ -207,11 +400,11 @@ class EnterMobileComponent extends ViewBase {
|
|
|
207
400
|
this.controller.sendCode(this.otpProvider, this.form.value);
|
|
208
401
|
}
|
|
209
402
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
210
|
-
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=\"
|
|
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 }); }
|
|
211
404
|
}
|
|
212
405
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, decorators: [{
|
|
213
406
|
type: Component,
|
|
214
|
-
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"] }]
|
|
215
408
|
}], ctorParameters: () => [], propDecorators: { otpSent: [{
|
|
216
409
|
type: Output
|
|
217
410
|
}], errorTemplate: [{
|
|
@@ -283,11 +476,11 @@ class TimerCountDownComponent extends BaseComponent {
|
|
|
283
476
|
}
|
|
284
477
|
}
|
|
285
478
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
286
|
-
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=\"tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n
|
|
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 }); }
|
|
287
480
|
}
|
|
288
481
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, decorators: [{
|
|
289
482
|
type: Component,
|
|
290
|
-
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"] }]
|
|
291
484
|
}], propDecorators: { resend: [{
|
|
292
485
|
type: Output
|
|
293
486
|
}], minutes: [{
|
|
@@ -364,11 +557,11 @@ class VerificationComponent extends ViewBase {
|
|
|
364
557
|
return this.controller.canVerify();
|
|
365
558
|
}
|
|
366
559
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
367
|
-
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=\"tw-block tw-w-full tw-text-
|
|
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 }); }
|
|
368
561
|
}
|
|
369
562
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, decorators: [{
|
|
370
563
|
type: Component,
|
|
371
|
-
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"] }]
|
|
372
565
|
}], ctorParameters: () => [], propDecorators: { _timerCountDown: [{
|
|
373
566
|
type: ViewChild,
|
|
374
567
|
args: [TimerCountDownComponent]
|
|
@@ -452,11 +645,11 @@ class UserPassComponent extends ViewBase {
|
|
|
452
645
|
this.canLogin() && !this.loading() && this.controller.login(this.form.value);
|
|
453
646
|
}
|
|
454
647
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
455
|
-
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=\"
|
|
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 }); }
|
|
456
649
|
}
|
|
457
650
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, decorators: [{
|
|
458
651
|
type: Component,
|
|
459
|
-
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"] }]
|
|
460
653
|
}], ctorParameters: () => [], propDecorators: { loggedIn: [{
|
|
461
654
|
type: Output
|
|
462
655
|
}], errorTemplate: [{
|
|
@@ -465,6 +658,94 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
465
658
|
type: Input
|
|
466
659
|
}] } });
|
|
467
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
|
+
|
|
468
749
|
class BarsaAuthComponent {
|
|
469
750
|
constructor() {
|
|
470
751
|
this.verified = new EventEmitter();
|
|
@@ -476,11 +757,17 @@ class BarsaAuthComponent {
|
|
|
476
757
|
...(ngDevMode ? [{ debugName: "mobile" }] : /* istanbul ignore next */ []));
|
|
477
758
|
this.loading = signal(false, /* @ts-ignore */
|
|
478
759
|
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
760
|
+
this.passkeyAvailable = signal(false, /* @ts-ignore */
|
|
761
|
+
...(ngDevMode ? [{ debugName: "passkeyAvailable" }] : /* istanbul ignore next */ []));
|
|
479
762
|
this._portalService = inject(PortalService);
|
|
480
763
|
this._applicationCtrlrService = inject(ApplicationCtrlrService);
|
|
764
|
+
this.passkeyService = inject(PasskeyService);
|
|
481
765
|
}
|
|
482
766
|
ngOnInit() {
|
|
483
767
|
this.state.set(this.appSettings().DefaultState || 'enter-mobile');
|
|
768
|
+
if (this.appSettings().PasskeyEnable) {
|
|
769
|
+
void this.updatePasskeyAvailability();
|
|
770
|
+
}
|
|
484
771
|
}
|
|
485
772
|
onChangeState(state) {
|
|
486
773
|
this.state.set(state);
|
|
@@ -493,15 +780,47 @@ class BarsaAuthComponent {
|
|
|
493
780
|
this.state.set('verification');
|
|
494
781
|
}
|
|
495
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() {
|
|
496
795
|
this.loading.set(true);
|
|
497
|
-
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();
|
|
813
|
+
}
|
|
814
|
+
finishLogin(token2) {
|
|
815
|
+
this.loading.set(false);
|
|
816
|
+
this.verified.emit(token2);
|
|
498
817
|
}
|
|
499
818
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
500
|
-
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\">\
|
|
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 }); }
|
|
501
820
|
}
|
|
502
821
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, decorators: [{
|
|
503
822
|
type: Component,
|
|
504
|
-
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\">\
|
|
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"] }]
|
|
505
824
|
}], propDecorators: { verified: [{
|
|
506
825
|
type: Output
|
|
507
826
|
}], appSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "appSettings", required: true }] }] } });
|
|
@@ -543,15 +862,21 @@ class LoginComponent {
|
|
|
543
862
|
this.appSettings.set(resolverData.loginSettings);
|
|
544
863
|
}
|
|
545
864
|
}
|
|
546
|
-
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
|
+
}
|
|
547
872
|
window.location.href = window.location.origin;
|
|
548
873
|
}
|
|
549
874
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
550
|
-
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=\"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 }); }
|
|
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 }); }
|
|
551
876
|
}
|
|
552
877
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, decorators: [{
|
|
553
878
|
type: Component,
|
|
554
|
-
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"] }]
|
|
555
880
|
}], propDecorators: { _errorTemplate: [{
|
|
556
881
|
type: ViewChild,
|
|
557
882
|
args: ['template', { static: true, read: TemplateRef }]
|
|
@@ -563,7 +888,8 @@ const components = [
|
|
|
563
888
|
VerificationComponent,
|
|
564
889
|
TimerCountDownComponent,
|
|
565
890
|
UserPassComponent,
|
|
566
|
-
LoginComponent
|
|
891
|
+
LoginComponent,
|
|
892
|
+
PasskeyComponent
|
|
567
893
|
];
|
|
568
894
|
class BarsaAuthModule extends BaseModule {
|
|
569
895
|
/** Inserted by Angular inject() migration for backwards compatibility */
|
|
@@ -579,12 +905,14 @@ class BarsaAuthModule extends BaseModule {
|
|
|
579
905
|
VerificationComponent,
|
|
580
906
|
TimerCountDownComponent,
|
|
581
907
|
UserPassComponent,
|
|
582
|
-
LoginComponent
|
|
908
|
+
LoginComponent,
|
|
909
|
+
PasskeyComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
|
|
583
910
|
EnterMobileComponent,
|
|
584
911
|
VerificationComponent,
|
|
585
912
|
TimerCountDownComponent,
|
|
586
913
|
UserPassComponent,
|
|
587
|
-
LoginComponent
|
|
914
|
+
LoginComponent,
|
|
915
|
+
PasskeyComponent] }); }
|
|
588
916
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule] }); }
|
|
589
917
|
}
|
|
590
918
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, decorators: [{
|
|
@@ -604,5 +932,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
604
932
|
* Generated bundle index. Do not edit.
|
|
605
933
|
*/
|
|
606
934
|
|
|
607
|
-
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 };
|
|
608
936
|
//# sourceMappingURL=barsa-auth.mjs.map
|