UNPKG

@tapsellorg/angular-material-library

Version:

Angular library for Tapsell

1 lines 72.6 kB
{"version":3,"file":"tapsellorg-angular-material-library-src-lib-auth.mjs","sources":["../../projects/pegah-library/src/lib/auth/constants.ts","../../projects/pegah-library/src/lib/auth/auth-layout/auth-layout.component.ts","../../projects/pegah-library/src/lib/auth/auth-layout/auth-layout.component.html","../../projects/pegah-library/src/lib/auth/login/login.component.ts","../../projects/pegah-library/src/lib/auth/login/login.component.html","../../projects/pegah-library/src/lib/auth/forget-password/forget-password.component.ts","../../projects/pegah-library/src/lib/auth/forget-password/forget-password.component.html","../../projects/pegah-library/src/lib/auth/register/register.component.ts","../../projects/pegah-library/src/lib/auth/register/register.component.html","../../projects/pegah-library/src/lib/auth/login-otp/login-otp.component.ts","../../projects/pegah-library/src/lib/auth/login-otp/login-otp.component.html","../../projects/pegah-library/src/lib/auth/verification-code/verification-code.component.ts","../../projects/pegah-library/src/lib/auth/verification-code/verification-code.component.html","../../projects/pegah-library/src/lib/auth/complete-user-data/complete-user-data.component.ts","../../projects/pegah-library/src/lib/auth/complete-user-data/complete-user-data.component.html","../../projects/pegah-library/src/lib/auth/auth.module.ts","../../projects/pegah-library/src/lib/auth/tapsellorg-angular-material-library-src-lib-auth.ts"],"sourcesContent":["import { PghAuthLayoutInfo } from './models';\n\nexport const PGH_AUTH_LAYOUT_INFO: PghAuthLayoutInfo = {\n login: {\n sideTitle: '',\n redirectTitle: 'ثبت‌نام',\n redirectPath: 'register',\n },\n register: {\n sideTitle: '',\n redirectTitle: 'ورود به حساب کاربری',\n redirectPath: 'login',\n },\n 'forget-password': {\n sideTitle: '',\n redirectTitle: '',\n redirectPath: '',\n },\n 'reset-password': {\n sideTitle: '',\n redirectTitle: '',\n redirectPath: '',\n },\n 'email-verify': {\n sideTitle: '',\n redirectTitle: '',\n redirectPath: '',\n },\n 'otp-login': {\n sideTitle: 'ورود',\n redirectTitle: 'ثبت نام',\n redirectPath: 'otp-login',\n },\n 'otp-verification-code': {\n sideTitle: 'تایید کد',\n redirectTitle: 'ورود',\n redirectPath: 'otp-login',\n },\n};\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n input,\n model,\n OnInit,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { PghBreakpoints } from '@tapsellorg/angular-material-library/media';\nimport { withDestroy } from '@tapsellorg/angular-material-library/src/lib/common';\nimport { filter, takeUntil } from 'rxjs';\nimport { PGH_AUTH_LAYOUT_INFO } from '../constants';\nimport { PghAuthLayoutInfo, PghLayoutLogoInfo } from '../models';\n\n@Component({\n selector: 'pgh-auth-layout',\n templateUrl: './auth-layout.component.html',\n styleUrls: ['./auth-layout.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('formContainerAnimation', [\n transition(':enter', [\n style({ opacity: 0, width: 0 }),\n animate('.5s ease-out', style({ opacity: 1, width: '60%' })),\n ]),\n transition(':leave', [animate('.5s ease-in', style({ width: 0, padding: 0, opacity: 0 }))]),\n ]),\n ],\n standalone: false,\n})\nexport class PghAuthLayoutComponent extends withDestroy() implements OnInit {\n readonly hasBackButton = input<boolean>(true);\n readonly hasBackToLogin = input<boolean>(false);\n readonly hasSupportButton = input<boolean>(true);\n readonly supportButtonClick = output<void>();\n readonly isUserPanel = input<boolean>(true);\n readonly loginButtonText = input('ورود');\n readonly supportPhoneNumber = input<string>('02191090986');\n readonly routeName = signal<string>('login');\n readonly isMobile = signal<boolean>(false);\n readonly layoutInfo = signal<PghAuthLayoutInfo | undefined>(undefined);\n readonly logos = input<PghLayoutLogoInfo[]>([\n {\n src: 'https://cdn.tapture.ir/tapsell/web/front/web-logo/tapsell-new/logos/white-transparent/Full+Logo+1000px.svg',\n alt: 'Tapsell Logo',\n width: 100,\n },\n {\n src: 'https://cdn.tapture.ir/tapsell/web/front/web-logo/mediaad/white-logo.png',\n alt: 'media Logo',\n width: 100,\n },\n ]);\n\n isOpened = model<boolean>(false);\n\n constructor(\n private router: Router,\n private breakpointObserver: BreakpointObserver,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n this.layoutInfo.set(PGH_AUTH_LAYOUT_INFO);\n }\n\n ngOnInit(): void {\n this.onObserveBreakpoints();\n this.getRouteName();\n }\n\n onSupportClick() {\n this.supportButtonClick.emit();\n }\n\n goToLogin() {\n this.router.navigateByUrl('/login');\n }\n\n goBack() {\n this.isOpened.set(false);\n }\n\n goToRegister() {\n this.router.navigateByUrl('/register');\n }\n\n private onObserveBreakpoints() {\n this.breakpointObserver\n .observe(PghBreakpoints.md)\n .pipe(takeUntil(this._destroyed$))\n .subscribe(result => {\n this.isMobile.set(!result.matches);\n this.cdr.detectChanges();\n });\n }\n\n getRouteName() {\n this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe((event: any) => {\n this.routeName.set(event.url.split('/')[1].split('?')[0]);\n this.cdr.detectChanges();\n });\n }\n}\n","<div class=\"pgh-auth-layout container\" [class.mobile]=\"isMobile()\" dark=\"false\">\n @if (isOpened()) {\n <div\n class=\"pgh-form-container flex-column\"\n [class.mobile]=\"isMobile()\"\n [@formContainerAnimation]\n [@.disabled]=\"isMobile()\"\n >\n @if (!isMobile()) { @if(!hasBackToLogin()){\n <div class=\"d-flex align-self-start cursor-pointer\" (click)=\"goBack()\">\n <mat-icon svgIcon=\"arrow_forward_ios\" style=\"width: 20px\" class=\"align-self-end\"></mat-icon>\n <span>بازگشت</span>\n </div>\n }@else{\n <ng-container [ngTemplateOutlet]=\"backToLogin\"></ng-container>\n } }\n <ng-template #backToLogin>\n <a mat-stroked-button color=\"primary\" [routerLink]=\"['/login']\" class=\"mb-4 align-self-start\">\n <mat-icon class=\"arrow-right-icon\" svgIcon=\"keyboard_arrow_right\"></mat-icon>\n <span>بازگشت</span>\n </a>\n </ng-template>\n <div class=\"content-block w-100 flex-column d-flex justify-content-center\">\n <div class=\"w-100 d-flex flex-row-reverse\">\n @if (isMobile() && hasBackButton()) {\n <mat-icon svgIcon=\"arrow_back_ios\" class=\"cursor-pointer\" (click)=\"goBack()\"></mat-icon>\n }\n </div>\n <ng-content></ng-content>\n <div class=\"pgh-form-subtitle mt-3\" [class.mobile]=\"isMobile()\">\n @if (hasSupportButton() && !isMobile()) {\n <div class=\"d-flex align-items-center\">\n <mat-icon svgIcon=\"support_agent\"></mat-icon>\n <button mat-button color=\"primary\" (click)=\"onSupportClick()\">نیاز به کمک دارم</button>\n </div>\n } @if (isUserPanel()) {\n <a [routerLink]=\"['/' + layoutInfo()![routeName()].redirectPath]\">\n {{ layoutInfo()![routeName()].redirectTitle }}\n </a>\n }\n </div>\n </div>\n </div>\n }\n <div\n class=\"pgh-side-part p-4\"\n [class.close]=\"!isOpened()\"\n [class.mobile-open]=\"isOpened() && isMobile()\"\n [class.mobile]=\"isMobile()\"\n >\n @if (isOpened()) {\n <div class=\"d-flex flex-column justify-content-center align-items-center w-100\">\n <span class=\"font-size-24 mt-5\">{{ layoutInfo()![routeName()].sideTitle }}</span>\n </div>\n }\n <div class=\"pgh-auth-logos\">\n @for (logo of logos(); track logo; let i = $index) {\n <img [src]=\"logo.src\" [alt]=\"logo.alt\" [width]=\"logo.width\" />\n @if (i !== logos().length - 1) {\n <mat-divider [vertical]=\"true\" class=\"logos-divider mx-2\"></mat-divider>\n } }\n </div>\n @if (!isOpened()) {\n <div class=\"w-100 flex-grow-1\">\n <button\n mat-button\n mat-raised-button\n class=\"big-mat-button col-12 mb-3\"\n (click)=\"goToLogin(); isOpened.set(true)\"\n >\n <span class=\"text-primary\">{{ loginButtonText() }}</span>\n </button>\n @if (isUserPanel()) {\n <button\n mat-button\n mat-stroked-button\n class=\"big-mat-button col-12\"\n (click)=\"goToRegister(); isOpened.set(true)\"\n >\n <span>ثبت‌نام</span>\n </button>\n } @if (hasSupportButton()) {\n <div class=\"d-flex align-items-center ms-auto me-auto justify-content-center mt-2\">\n <mat-icon svgIcon=\"support_agent\"></mat-icon>\n <button mat-button (click)=\"onSupportClick()\">نیاز به کمک دارم</button>\n </div>\n }\n </div>\n } @if (isUserPanel()) {\n <a class=\"text-white d-flex align-items-center\" href=\"tel:{{ supportPhoneNumber() }}\">\n {{\n supportPhoneNumber()?.slice(0, 3) +\n '-' +\n supportPhoneNumber()?.slice(4, supportPhoneNumber()?.length)\n }}\n <mat-icon svgIcon=\"call\" class=\"ms-2\"></mat-icon>\n </a>\n }\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n OnChanges,\n OnInit,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { PghLoader } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghLoginForm } from '../models';\nimport { Params } from '@angular/router';\n\n@Component({\n selector: 'pgh-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class PghLoginComponent implements OnInit, OnChanges {\n pageTitle = input('ورود');\n description = input('ورود به پنل مدیااد و تپسل با یک حساب');\n includeForgetPasswordLink = input(false);\n includeRegisterLink = input(false);\n type = input<'EMAIL' | 'USERNAME'>('EMAIL');\n formSubmit = output<PghLoginForm>();\n submitLoader = input<PghLoader>();\n buttonText = input('ورود');\n\n form: UntypedFormGroup = this.formBuilder.group({\n email: [''],\n password: ['', { validators: [Validators.required] }],\n });\n isPasswordRevealed = signal(false);\n forgetPasswordLinkQueryParams = signal<Params | undefined>(undefined);\n\n constructor(private formBuilder: UntypedFormBuilder) {}\n\n ngOnChanges(): void {\n this.form\n .get('email')\n ?.setValidators(\n this.type() === 'EMAIL' ? [Validators.required, Validators.email] : [Validators.required],\n );\n }\n\n ngOnInit(): void {\n this.bindEmailValueChanges();\n }\n\n onSubmit(): void {\n if (this.form.invalid) return;\n\n this.formSubmit.emit(this.form.value);\n }\n\n bindEmailValueChanges() {\n this.form.get('email')?.valueChanges.subscribe(value => {\n if (value) {\n this.forgetPasswordLinkQueryParams.set({\n email: value,\n });\n } else {\n this.forgetPasswordLinkQueryParams.set(undefined);\n }\n });\n }\n}\n","<div class=\"pgh-login\">\n <header>\n <h1 class=\"font-weight-bold text-center font-size-18\">{{ pageTitle() }}</h1>\n </header>\n <p class=\"text-center\">{{ description() }}</p>\n <form [formGroup]=\"form\" (submit)=\"onSubmit()\" class=\"mt-2\">\n @if (type() === 'USERNAME') {\n <mat-form-field class=\"w-100\">\n <mat-label>ایمیل</mat-label>\n <input\n matInput\n type=\"text\"\n formControlName=\"email\"\n autocomplete=\"username\"\n name=\"username\"\n class=\"text-left ltr\"\n autocapitalize=\"none\"\n autofocus\n />\n <mat-error *pghFieldError=\"let message\">\n {{ message }}\n </mat-error>\n </mat-form-field>\n } @if (type() === 'EMAIL') {\n <mat-form-field class=\"w-100\">\n <mat-label>ایمیل</mat-label>\n <input\n matInput\n type=\"email\"\n formControlName=\"email\"\n autocomplete=\"email\"\n name=\"email\"\n class=\"text-left ltr\"\n autofocus\n />\n <mat-error *pghFieldError=\"let message\">\n {{ message }}\n </mat-error>\n </mat-form-field>\n }\n\n <mat-form-field class=\"w-100\">\n <mat-label>رمز عبور</mat-label>\n <input\n matInput\n type=\"password\"\n formControlName=\"password\"\n autocomplete=\"current-password\"\n [pghShowPassword]=\"isPasswordRevealed()\"\n name=\"password\"\n class=\"ltr\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"isPasswordRevealed.set(!isPasswordRevealed())\"\n >\n <mat-icon [svgIcon]=\"isPasswordRevealed() ? 'visibility_off' : 'visibility'\"></mat-icon>\n </button>\n <mat-error *pghFieldError=\"let message\">\n {{ message }}\n </mat-error>\n </mat-form-field>\n @if (includeForgetPasswordLink()) {\n <div class=\"mb-3\">\n <a [routerLink]=\"['/forget-password']\" [queryParams]=\"forgetPasswordLinkQueryParams()\">\n فراموشی رمز عبور\n </a>\n </div>\n }\n\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12\"\n id=\"Accounts_Login\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n [pghLoaderType]=\"'button'\"\n >\n <span>{{ buttonText() }}</span>\n </button>\n </form>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n OnInit,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { UntypedFormBuilder, Validators } from '@angular/forms';\nimport { PghLoader } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghForgetPasswordForm } from '../models';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'pgh-forget-password',\n templateUrl: './forget-password.component.html',\n styleUrls: ['./forget-password.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class PghForgetPasswordComponent implements OnInit {\n readonly formSubmit = output<PghForgetPasswordForm>();\n readonly submitLoader = input<PghLoader>();\n readonly initialEmailValue = input<string>();\n\n form = this.formBuilder.group({\n email: ['', { validators: [Validators.required, Validators.email] }],\n });\n\n constructor(private formBuilder: UntypedFormBuilder, private route: ActivatedRoute) {}\n\n ngOnInit(): void {\n this.form\n .get('email')\n ?.setValue(this.initialEmailValue() || this.route.snapshot.queryParamMap.get('email'));\n }\n\n recoverPassword(): void {\n if (this.form.invalid) return;\n const email = this.form.get('email')?.value;\n this.formSubmit.emit({ email });\n }\n}\n","<div class=\"pgh-forget-password\">\n <header>\n <h1 class=\"font-weight-bold text-center font-size-18\">فراموشی رمز عبور</h1>\n <p class=\"text-center\">برای تغییر رمز عبور، ایمیل خود را وارد کنید</p>\n </header>\n <form [formGroup]=\"form\" (submit)=\"recoverPassword()\" class=\"mt-2\">\n <mat-form-field class=\"w-100\">\n <mat-label>ایمیل</mat-label>\n <input\n matInput\n formControlName=\"email\"\n type=\"email\"\n name=\"email\"\n autocomplete=\"email\"\n placeholder=\"email@example.com\"\n class=\"text-left ltr\"\n autofocus\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n [pghLoaderType]=\"'button'\"\n >\n تایید\n </button>\n </form>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n input,\n output,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { PghLoader } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghFormValidators } from '@tapsellorg/angular-material-library/src/lib/input';\nimport { PghRegisterForm, PghRegistrationFormContent } from '../models';\n\n@Component({\n selector: 'pgh-register',\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class PghRegisterComponent {\n formSubmit = output<PghRegisterForm>();\n submitLoader = input<PghLoader>();\n registrationFormContent = input<PghRegistrationFormContent>({\n mainDescription:\n 'استفاده از <strong>همه</strong> خدمات تبلیغاتی تپسل (وبسایت و اپلیکیشن) فقط با ساخت <strong>یک</strong> حساب کاربری',\n privacyAgencyTitle: ' قوانین و مقررات تپسل',\n privacyLink:\n 'https://college.tapsell.ir/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%D9%88-%D9%85%D9%82%D8%B1%D8%B1%D8%A7%D8%AA/',\n });\n userOptions = input<{ value: string; label: string; description: string }[]>(\n this.getDefaultOptions(),\n );\n isPasswordRevealed = signal<boolean>(false);\n\n form: UntypedFormGroup = this.formBuilder.group({\n firstName: ['', { validators: [Validators.required] }],\n lastName: ['', { validators: [Validators.required] }],\n email: ['', { validators: [Validators.required, Validators.email] }],\n phone: ['', { validators: [Validators.required, PghFormValidators.phoneNumberValidator()] }],\n password: [\n '',\n {\n validators: [\n Validators.required,\n PghFormValidators.hasCapitalCase(),\n PghFormValidators.hasNumber(),\n PghFormValidators.hasSmallCase(),\n Validators.minLength(8),\n ],\n },\n ],\n acceptPolicies: [false, { validators: [Validators.requiredTrue] }],\n userType: ['advertiser', { validators: [Validators.required] }],\n });\n\n passwordValidationRules = [\n { key: 'minlength', message: 'شامل حداقل ۸ کاراکتر' },\n { key: 'hasCapitalCase', message: 'شامل حداقل یک حرف بزرگ' },\n { key: 'hasSmallCase', message: 'شامل حداقل یک حرف کوچک' },\n { key: 'hasNumber', message: 'شامل حداقل یک عدد' },\n ];\n\n constructor(private formBuilder: UntypedFormBuilder) {\n this.initializeOptions();\n }\n\n onUserTypeClick(value: string): void {\n this.form.get('userType')?.setValue(value);\n }\n\n onSubmit(): void {\n if (this.form.invalid) return;\n\n this.formSubmit.emit(this.form.value);\n }\n\n initializeOptions(): void {\n effect(() => {\n untracked(() => this.setDefaultUserType());\n });\n }\n\n private getDefaultOptions(): { value: string; label: string; description: string }[] {\n return [\n {\n value: 'advertiser',\n label: 'تبلیغ‌دهنده',\n description: 'می‌خواهم کسب‌وکارم را در وبسایت‌ها یا اپلیکیشن‌ها تبلیغ کنم',\n },\n {\n value: 'publisher',\n label: 'نمایش‌دهنده',\n description: 'می‌خواهم با نمایش دادن تبلیغات در وبسایت یا اپلیکیشن خود، درآمد کسب کنم',\n },\n {\n value: 'both',\n label: 'هر دو',\n description: 'می‌خواهم هم کسب‌وکارم را تبلیغ کنم و هم از نمایش تبلیغات درآمد کسب کنم',\n },\n ];\n }\n\n private setDefaultUserType(): void {\n const defaultValue = this.userOptions().length > 0 ? this.userOptions()[0].value : '';\n this.form.get('userType')?.setValue(defaultValue);\n }\n}\n","<header>\n <h1 class=\"font-weight-bold text-center font-size-18\">ثبت‌نام</h1>\n</header>\n<p class=\"text-center\" [innerHTML]=\"registrationFormContent().mainDescription\"></p>\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <mat-form-field class=\"col-12 col-md-6\">\n <mat-label>نام</mat-label>\n <input matInput formControlName=\"firstName\" type=\"text\" name=\"name\" autocomplete=\"name\" />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"col-12 col-md-6\">\n <mat-label>نام خانوادگی</mat-label>\n <input\n matInput\n formControlName=\"lastName\"\n type=\"text\"\n name=\"family-name\"\n autocomplete=\"family-name\"\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n </div>\n\n <mat-form-field class=\"w-100\">\n <mat-label>ایمیل</mat-label>\n <input\n matInput\n formControlName=\"email\"\n type=\"email\"\n name=\"email\"\n autocomplete=\"email\"\n placeholder=\"email@example.com\"\n pghPersianNumbersToEnglish\n class=\"font-english-numbers\"\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>شماره‌ی موبایل</mat-label>\n <input\n matInput\n formControlName=\"phone\"\n type=\"tel\"\n name=\"tel\"\n autocomplete=\"tel\"\n placeholder=\"09xxxxxxxxx\"\n pghPersianNumbersToEnglish\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-100\" style=\"margin-bottom: -0.8em\">\n <mat-label>رمز عبور</mat-label>\n <input\n matInput\n formControlName=\"password\"\n type=\"password\"\n name=\"new-password\"\n [pghShowPassword]=\"isPasswordRevealed()\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"isPasswordRevealed.set(!isPasswordRevealed())\"\n >\n <mat-icon\n class=\"fz-20\"\n [svgIcon]=\"isPasswordRevealed() ? 'visibility_off' : 'remove_red_eye'\"\n ></mat-icon>\n </button>\n </mat-form-field>\n\n @for(rule of passwordValidationRules; track rule.key){\n <div class=\"font-size-14\">\n <li\n [ngClass]=\"{\n 'text-success':\n !form.get('password')?.hasError(rule.key) &&\n form.get('password')?.dirty &&\n form.get('password')?.value,\n 'text-danger': form.get('password')?.hasError(rule.key) && form.get('password')?.dirty,\n 'text-muted': !form.get('password')?.dirty || !form.get('password')?.value\n }\"\n >\n {{ rule.message }}\n </li>\n </div>\n }\n\n <div class=\"mb-3 mt-4\">\n <p>نوع حساب کاربری</p>\n\n <div class=\"pgh-user-type-section d-flex justify-content-between\">\n @for (option of userOptions(); track option.value){\n <div\n class=\"pgh-user-type-item\"\n [class.selected]=\"form.get('userType')?.value === option?.value\"\n (click)=\"onUserTypeClick(option.value)\"\n >\n <strong>\n {{ option.label }}\n </strong>\n\n <div>\n <small>\n {{ option.description }}\n </small>\n </div>\n </div>\n }\n </div>\n </div>\n\n <mat-checkbox formControlName=\"acceptPolicies\">\n <a\n class=\"text-decoration-underline\"\n href=\"{{ registrationFormContent().privacyLink }}\"\n target=\"_blank\"\n >\n {{ registrationFormContent().privacyAgencyTitle }}\n </a>\n را می‌پذیرم.\n </mat-checkbox>\n @if (form.get('acceptPolicies')?.invalid && form.get('acceptPolicies')?.touched) {\n <span class=\"mat-error\">تا زمانی‌که قوانین را نپذیرید نمی‌توانید ثبت‌نام کنید.</span>\n }\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12 mt-3\"\n id=\"Send_Email_Verification\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n >\n <span>دریافت کد تایید</span>\n </button>\n</form>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { RouterModule } from '@angular/router';\nimport {\n PghFormValidators,\n PghInputModule,\n} from '@tapsellorg/angular-material-library/src/lib/input';\nimport { PghLoader, PghLoaderModule } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghLayoutOtpLoginInfo, PghOtpLoginForm } from '../models';\n\n@Component({\n selector: 'pgh-login-otp',\n imports: [\n MatFormFieldModule,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n PghInputModule,\n PghLoaderModule,\n MatIconModule,\n RouterModule,\n ],\n templateUrl: './login-otp.component.html',\n styleUrl: './login-otp.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PghLoginOtpComponent {\n private formBuilder = inject(FormBuilder);\n readonly pageTitle = input.required<string>();\n readonly buttonText = input.required<string>();\n readonly description = input<string>('ورود به پنل کاربری');\n readonly submitLoader = input<PghLoader>();\n readonly formSubmit = output<PghOtpLoginForm>();\n readonly registrationFormContent = input<PghLayoutOtpLoginInfo>({\n privacyAgencyTitle: ' قوانین و مقررات تپسل',\n privacyLink:\n 'https://college.tapsell.ir/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%D9%88-%D9%85%D9%82%D8%B1%D8%B1%D8%A7%D8%AA/',\n });\n\n form: FormGroup = this.formBuilder.group({\n phone: ['', { validators: [Validators.required, PghFormValidators.phoneNumberValidator()] }],\n });\n\n onSubmit() {\n if (this.form.invalid) return;\n\n this.formSubmit.emit(this.form.value);\n }\n}\n","<div class=\"pgh-login\">\n <header>\n <h1 class=\"font-weight-bold text-center font-size-18\">{{ pageTitle() }}</h1>\n </header>\n <p class=\"text-center\">{{ description() }}</p>\n <form [formGroup]=\"form\" (submit)=\"onSubmit()\" class=\"mt-2\">\n <mat-form-field class=\"w-100\">\n <mat-label>شماره‌ی موبایل</mat-label>\n <input\n matInput\n formControlName=\"phone\"\n type=\"tel\"\n name=\"tel\"\n autocomplete=\"tel\"\n placeholder=\"09xxxxxxxxx\"\n pghPersianNumbersToEnglish\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12\"\n id=\"Accounts_Login\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n [pghLoaderType]=\"'button'\"\n [disabled]=\"form.invalid\"\n >\n <span>{{ buttonText() }}</span>\n </button>\n\n <div class=\"mt-3 mb-5 text-center\">\n ورود یا ثبت‌نام شما به معنی پذیرش\n <a\n class=\"text-decoration-underline\"\n href=\"{{ registrationFormContent().privacyLink }}\"\n target=\"_blank\"\n >\n {{ registrationFormContent().privacyAgencyTitle }}\n </a>\n است\n </div>\n </form>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\n\nimport { PghLayoutOtpLoginInfo } from '../models';\nimport { RouterModule } from '@angular/router';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n PghCountdownTimerModule,\n PghCountdownTimerService,\n} from '@tapsellorg/angular-material-library/src/lib/countdown-timer';\nimport { PghPinInputComponent } from '@tapsellorg/angular-material-library/src/lib/pin-input';\nimport { PghLoader, PghLoaderModule } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghInputModule } from '@tapsellorg/angular-material-library/src/lib/input';\n@Component({\n selector: 'pgh-verification-code',\n imports: [\n MatButtonModule,\n PghInputModule,\n PghLoaderModule,\n RouterModule,\n MatIconModule,\n PghCountdownTimerModule,\n PghPinInputComponent,\n ],\n templateUrl: './verification-code.component.html',\n styleUrl: './verification-code.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PghVerificationCodeComponent {\n private pghCountdownTimerService = inject(PghCountdownTimerService);\n readonly pageTitle = input.required<string>();\n readonly buttonText = input.required<string>();\n readonly description = input<string>('کد تایید به شماره ۰۹۱۲۳۴۵۶۷۸۹ پیامک شد');\n readonly codeLength = input<number>(5);\n readonly submitLoader = input<PghLoader>();\n readonly resendDurationSeconds = input<number>(120);\n readonly canEditPhoneNumber = input<boolean>(true);\n readonly isPrivacyTextVisible = input<boolean>(true);\n readonly registrationFormContent = input<PghLayoutOtpLoginInfo>({\n privacyAgencyTitle: 'قوانین و مقررات تپسل',\n privacyLink:\n 'https://college.tapsell.ir/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%D9%88-%D9%85%D9%82%D8%B1%D8%B1%D8%A7%D8%AA/',\n });\n readonly resendCode = output();\n readonly submitCode = output<string>();\n isButtonDisabled: boolean = true;\n currentCode: string = '';\n\n // this called every time when user changed the code\n onCodeChanged(code: string) {\n if (code.length < this.codeLength()) this.isButtonDisabled = true;\n }\n\n // this called only if user entered full code\n onCodeCompleted(code: string) {\n this.isButtonDisabled = false;\n this.currentCode = code;\n }\n\n reSendVerificationCode() {\n this.pghCountdownTimerService.restartTimer(this.resendDurationSeconds());\n this.resendCode.emit();\n }\n\n onSubmit() {\n this.submitCode.emit(this.currentCode);\n }\n}\n","<div class=\"pgh-login\">\n <header>\n <h1 class=\"font-weight-bold text-center font-size-18\">{{ pageTitle() }}</h1>\n </header>\n <p class=\"text-center\">{{ description() }}</p>\n\n @if (canEditPhoneNumber()) {\n <p class=\"text-center font-size-14\">\n <a mat-button color=\"accent\" [routerLink]=\"['/login']\" class=\"text-center\">\n <mat-icon class=\"arrow-right-icon\" svgIcon=\"edit\"></mat-icon>\n <span>ویرایش شماره موبایل</span>\n </a>\n </p>\n }\n\n <div dir=\"ltr\" class=\"mb-3\">\n <pgh-pin-input\n [isCodeHidden]=\"false\"\n [codeLength]=\"codeLength()\"\n [initialFocusField]=\"0\"\n (codeChanged)=\"onCodeChanged($event)\"\n (codeCompleted)=\"onCodeCompleted($event)\"\n ></pgh-pin-input>\n </div>\n\n <pgh-countdown-timer\n class=\"mb-3\"\n [durationInSeconds]=\"resendDurationSeconds()\"\n [restartButtonText]=\"'دریافت دوباره کد'\"\n (restartTimerClick)=\"reSendVerificationCode()\"\n ></pgh-countdown-timer>\n\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12 mt-3\"\n id=\"Accounts_Login\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n [pghLoaderType]=\"'button'\"\n [disabled]=\"isButtonDisabled\"\n (click)=\"onSubmit()\"\n >\n <span>{{ buttonText() }}</span>\n </button>\n\n @if (isPrivacyTextVisible()) {\n <div class=\"mt-3 mb-5 text-center\">\n ورود یا ثبت‌نام شما به معنی پذیرش\n <a\n class=\"text-decoration-underline\"\n href=\"{{ registrationFormContent().privacyLink }}\"\n target=\"_blank\"\n >\n {{ registrationFormContent().privacyAgencyTitle }}\n </a>\n است\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { RouterModule } from '@angular/router';\nimport { PghLoader, PghLoaderModule } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghInputModule } from '@tapsellorg/angular-material-library/src/lib/input';\nimport { PghLayoutOtpLoginInfo, PghOtpCompleteUserDataForm } from '../models';\n\n@Component({\n selector: 'pgh-complete-user-data',\n imports: [\n MatFormFieldModule,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n PghInputModule,\n PghLoaderModule,\n MatIconModule,\n RouterModule,\n ],\n templateUrl: './complete-user-data.component.html',\n styleUrl: './complete-user-data.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PghCompleteUserDataComponent {\n private formBuilder = inject(FormBuilder);\n readonly buttonText = input.required<string>();\n readonly pageTitle = input.required<string>();\n readonly submitLoader = input<PghLoader>();\n readonly description = input<string>('برای ورود اطلاعات کاربری خود را تکمیل کنید');\n readonly formSubmit = output<PghOtpCompleteUserDataForm>();\n readonly registrationFormContent = input<PghLayoutOtpLoginInfo>({\n privacyAgencyTitle: ' قوانین و مقررات تپسل',\n privacyLink:\n 'https://college.tapsell.ir/%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%D9%88-%D9%85%D9%82%D8%B1%D8%B1%D8%A7%D8%AA/',\n });\n\n form: FormGroup = this.formBuilder.group({\n firstName: ['', { validators: [Validators.required] }],\n lastName: ['', { validators: [Validators.required] }],\n });\n\n onSubmit() {\n if (this.form.invalid) return;\n\n this.formSubmit.emit(this.form.value);\n }\n}\n","<header>\n <h1 class=\"font-weight-bold text-center font-size-18\">{{ pageTitle() }}</h1>\n</header>\n<p class=\"text-center\">\n {{ description() }}\n</p>\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <mat-form-field class=\"col-12 col-md-6\">\n <mat-label>نام</mat-label>\n <input matInput formControlName=\"firstName\" type=\"text\" name=\"name\" autocomplete=\"name\" />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"col-12 col-md-6\">\n <mat-label>نام خانوادگی</mat-label>\n <input\n matInput\n formControlName=\"lastName\"\n type=\"text\"\n name=\"family-name\"\n autocomplete=\"family-name\"\n />\n <mat-error *pghFieldError=\"let message\">{{ message }}</mat-error>\n </mat-form-field>\n </div>\n\n <button\n mat-raised-button\n color=\"primary\"\n class=\"big-mat-button col-12 mt-2\"\n id=\"Send_Email_Verification\"\n type=\"submit\"\n [pghLoader]=\"submitLoader()\"\n >\n <span>{{ buttonText() }}</span>\n </button>\n\n <div class=\"mt-3 mb-5 text-center\">\n ورود یا ثبت‌نام شما به معنی پذیرش\n <a\n class=\"text-decoration-underline\"\n href=\"{{ registrationFormContent().privacyLink }}\"\n target=\"_blank\"\n >\n {{ registrationFormContent().privacyAgencyTitle }}\n </a>\n است\n </div>\n</form>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { PghAuthLayoutComponent } from './auth-layout/auth-layout.component';\nimport { PghLoginComponent } from './login/login.component';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { PghInputModule } from '@tapsellorg/angular-material-library/src/lib/input';\nimport { PghLoaderModule } from '@tapsellorg/angular-material-library/src/lib/loader';\nimport { PghForgetPasswordComponent } from './forget-password/forget-password.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PghRegisterComponent } from './register/register.component';\nimport { PghPageHeadModule } from '@tapsellorg/angular-material-library/src/lib/page-head';\nimport { PghMediaModule } from '@tapsellorg/angular-material-library/media';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { PghCountdownTimerModule } from '@tapsellorg/angular-material-library/src/lib/countdown-timer';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { PghLoginOtpComponent } from './login-otp/login-otp.component';\nimport { PghVerificationCodeComponent } from './verification-code/verification-code.component';\nimport { PghCompleteUserDataComponent } from './complete-user-data/complete-user-data.component';\n\n@NgModule({\n declarations: [\n PghAuthLayoutComponent,\n PghLoginComponent,\n PghForgetPasswordComponent,\n PghRegisterComponent,\n ],\n imports: [\n CommonModule,\n RouterModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n PghInputModule,\n PghLoaderModule,\n MatIconModule,\n PghPageHeadModule,\n PghMediaModule,\n MatCheckboxModule,\n MatRadioModule,\n PghCountdownTimerModule,\n MatDividerModule,\n PghLoginOtpComponent,\n PghVerificationCodeComponent,\n PghCompleteUserDataComponent,\n ],\n exports: [\n PghAuthLayoutComponent,\n PghLoginComponent,\n PghForgetPasswordComponent,\n PghRegisterComponent,\n PghLoginOtpComponent,\n PghVerificationCodeComponent,\n PghCompleteUserDataComponent,\n ],\n})\nexport class PghAuthModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i5","i1","i2","i3","i6"],"mappings":"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