systelab-login
Version:
Library with common Systelab login components to speed up our Angular developments
911 lines • 99.3 kB
JavaScript
import * as i0 from '@angular/core';
import { EventEmitter, Input, Output, Component, Injectable, Directive, NgModule } from '@angular/core';
import * as i3 from '@angular/common';
import { CommonModule } from '@angular/common';
import * as i2 from '@angular/forms';
import { FormsModule } from '@angular/forms';
import * as i1 from 'systelab-translate';
import { SystelabTranslateModule } from 'systelab-translate';
import * as i1$1 from 'systelab-components';
import { SystelabModalContext, SystelabComponentsModule } from 'systelab-components';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
class FormLoginComponent {
get userName() {
return this._userName;
}
set userName(value) {
this._userName = value;
this.userNameChange.emit(this._userName);
}
get password() {
return this._password;
}
set password(value) {
this._password = value;
this.passwordChange.emit(this._password);
}
get currentForm() {
return this._currentForm;
}
set currentForm(value) {
this._currentForm = value;
this.currentFormChange.emit(this._currentForm);
}
constructor(i18nService) {
this.i18nService = i18nService;
this.isRecoveryActive = false;
this.isSignUpActive = false;
this.errorUserPwd = false;
this.txtUsername = '';
this.isLoading = false;
this.maxUsernameLength = 20;
this.isExternalLoginActive = false;
this.userNameChange = new EventEmitter();
this.passwordChange = new EventEmitter();
this.currentFormChange = new EventEmitter();
this.login = new EventEmitter();
this.externalLogin = new EventEmitter();
this._currentForm = '';
this._userName = '';
this._password = '';
}
ngOnInit() {
if (!this.txtUsername) {
this.i18nService.get('COMMON_USERNAME')
.subscribe((res) => {
this.txtUsername = res;
});
}
}
doLogin() {
this.login.emit();
}
doExternalLogin() {
this.externalLogin.emit();
}
goSignUp() {
this.currentForm = 'signup';
}
goRecovery() {
this.currentForm = 'recovery';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormLoginComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: FormLoginComponent, isStandalone: false, selector: "slt-form-login", inputs: { isRecoveryActive: "isRecoveryActive", isSignUpActive: "isSignUpActive", errorUserPwd: "errorUserPwd", txtUsername: "txtUsername", isLoading: "isLoading", maxUsernameLength: "maxUsernameLength", isExternalLoginActive: "isExternalLoginActive", userName: "userName", password: "password", currentForm: "currentForm" }, outputs: { userNameChange: "userNameChange", passwordChange: "passwordChange", currentFormChange: "currentFormChange", login: "login", externalLogin: "externalLogin" }, ngImport: i0, template: "<input type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\" [(ngModel)]=\"userName\" [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" placeholder=\"{{txtUsername}}\" #inputUserName=\"ngModel\" name=\"inputUserName\"\n (keyup.enter)=\"doLogin()\"\n required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n <input type=\"password\" class=\"w-100 slab-form__input slab-form__input--bottomradius\" [(ngModel)]=\"password\" [class.slab-form_input--error]=\"inputPassword.invalid && inputPassword.touched\"\n id=\"inputPassword\" placeholder=\"{{ 'COMMON_PASSWORD' | translate | async }}\" #inputPassword=\"ngModel\" name=\"inputPassword\"\n (keyup.enter)=\"doLogin()\"\n required autocomplete=\"off\">\n\n @if (isRecoveryActive) {\n <div class=\"slab-form_input--marginTop15 text-right\">\n <a href=\"#\" class=\"slab-text slab-text--link\" (click)=\"goRecovery()\">{{ 'COMMON_FORGOT_PASSWORD' | translate | async }}</a>\n </div>\n }\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" [disabled]=\"inputUserName.invalid || inputPassword.invalid\"\n (click)=\"doLogin()\">{{ 'COMMON_ENTER' | translate | async }}\n </button>\n\n @if (isSignUpActive) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link \" (click)=\"goSignUp()\">{{ 'COMMON_CREATE_NEW_ACCOUNT' | translate | async }}</a>\n </div>\n }\n\n @if (isExternalLoginActive) {\n <div class=\"slab-form_input--marginTop15 text-center\">\n <button type=\"button\" class=\"btn btn-link\" (click)=\"doExternalLogin()\">{{ 'COMMON_EXTERNAL_LOGIN' | translate | async }}</button>\n </div>\n }\n\n @if (errorUserPwd) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_INCORRECT_USERNAME_OR_PASSWORD' | translate | async }}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">\n {{ 'COMMON_LOADING' | translate | async }}...\n <i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.GeneralTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormLoginComponent, decorators: [{
type: Component,
args: [{ selector: 'slt-form-login', standalone: false, template: "<input type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\" [(ngModel)]=\"userName\" [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" placeholder=\"{{txtUsername}}\" #inputUserName=\"ngModel\" name=\"inputUserName\"\n (keyup.enter)=\"doLogin()\"\n required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n <input type=\"password\" class=\"w-100 slab-form__input slab-form__input--bottomradius\" [(ngModel)]=\"password\" [class.slab-form_input--error]=\"inputPassword.invalid && inputPassword.touched\"\n id=\"inputPassword\" placeholder=\"{{ 'COMMON_PASSWORD' | translate | async }}\" #inputPassword=\"ngModel\" name=\"inputPassword\"\n (keyup.enter)=\"doLogin()\"\n required autocomplete=\"off\">\n\n @if (isRecoveryActive) {\n <div class=\"slab-form_input--marginTop15 text-right\">\n <a href=\"#\" class=\"slab-text slab-text--link\" (click)=\"goRecovery()\">{{ 'COMMON_FORGOT_PASSWORD' | translate | async }}</a>\n </div>\n }\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" [disabled]=\"inputUserName.invalid || inputPassword.invalid\"\n (click)=\"doLogin()\">{{ 'COMMON_ENTER' | translate | async }}\n </button>\n\n @if (isSignUpActive) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link \" (click)=\"goSignUp()\">{{ 'COMMON_CREATE_NEW_ACCOUNT' | translate | async }}</a>\n </div>\n }\n\n @if (isExternalLoginActive) {\n <div class=\"slab-form_input--marginTop15 text-center\">\n <button type=\"button\" class=\"btn btn-link\" (click)=\"doExternalLogin()\">{{ 'COMMON_EXTERNAL_LOGIN' | translate | async }}</button>\n </div>\n }\n\n @if (errorUserPwd) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_INCORRECT_USERNAME_OR_PASSWORD' | translate | async }}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">\n {{ 'COMMON_LOADING' | translate | async }}...\n <i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { isRecoveryActive: [{
type: Input
}], isSignUpActive: [{
type: Input
}], errorUserPwd: [{
type: Input
}], txtUsername: [{
type: Input
}], isLoading: [{
type: Input
}], maxUsernameLength: [{
type: Input
}], isExternalLoginActive: [{
type: Input
}], userNameChange: [{
type: Output
}], passwordChange: [{
type: Output
}], currentFormChange: [{
type: Output
}], login: [{
type: Output
}], externalLogin: [{
type: Output
}], userName: [{
type: Input
}], password: [{
type: Input
}], currentForm: [{
type: Input
}] } });
class PasswordUtil {
static { this.veryStrongPatternRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])(?=.{14,})'); }
static { this.strongPatternRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])(?=.{10,})'); }
static { this.slightlyStrongPatternRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])(?=.{8,})'); }
static { this.goodPatternRegex = new RegExp('^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})'); }
static { this.moderatePatternRegex = new RegExp('^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{4,})'); }
static getPasswordComplexityTooltip(minPasswordStrengthValue, i18nService) {
return i18nService.instant(PasswordUtil.getPasswordComplexityTooltipTranslationKey(minPasswordStrengthValue), {
complexity: PasswordUtil.getPasswordComplexity(minPasswordStrengthValue, i18nService),
char_number: PasswordUtil.getMinPasswordLength(minPasswordStrengthValue)
});
}
static evaluatePasswordStrength(currentPassword) {
if (!currentPassword) {
return 0;
}
else if (PasswordUtil.veryStrongPatternRegex.test(currentPassword)) {
return 6;
}
else if (PasswordUtil.strongPatternRegex.test(currentPassword)) {
return 5;
}
else if (PasswordUtil.slightlyStrongPatternRegex.test(currentPassword)) {
return 4;
}
else if (PasswordUtil.goodPatternRegex.test(currentPassword)) {
return 3;
}
else if (PasswordUtil.moderatePatternRegex.test(currentPassword)) {
return 2;
}
else {
return 1;
}
}
static getTranslationKey(n) {
switch (n) {
case 6:
return 'PASSWORD_STRENGTH_VERY_STRONG';
case 5:
return 'PASSWORD_STRENGTH_STRONG';
case 4:
return 'PASSWORD_STRENGTH_SLIGHTLY_STRONG';
case 3:
return 'PASSWORD_STRENGTH_GOOD';
case 2:
return 'PASSWORD_STRENGTH_MODERATE';
case 1:
return 'PASSWORD_STRENGTH_WEAK';
default:
return undefined;
}
}
static getStyle(n) {
switch (n) {
case 6:
return 'slab-very-strong';
case 5:
return 'slab-strong';
case 4:
return 'slab-slightly-strong';
case 3:
return 'slab-good';
case 2:
return 'slab-moderate';
case 1:
return 'slab-weak';
default:
return 'slab-very-weak';
}
}
static getPasswordComplexityTooltipTranslationKey(minPasswordStrengthValue) {
switch (minPasswordStrengthValue) {
case 2:
return 'PASSWORD_CRITERIA_LOW';
case 3:
return 'PASSWORD_CRITERIA_LOW';
case 4:
return 'PASSWORD_CRITERIA';
case 5:
return 'PASSWORD_CRITERIA';
case 6:
return 'PASSWORD_CRITERIA';
default:
return 'PASSWORD_CRITERIA_WEAK';
}
}
static getPasswordComplexity(minPasswordStrengthValue, i18nService) {
switch (minPasswordStrengthValue) {
case 2:
return i18nService.instant('PASSWORD_STRENGTH_MODERATE');
case 3:
return i18nService.instant('PASSWORD_STRENGTH_GOOD');
case 4:
return i18nService.instant('PASSWORD_STRENGTH_SLIGHTLY_STRONG');
case 5:
return i18nService.instant('PASSWORD_STRENGTH_STRONG');
case 6:
return i18nService.instant('PASSWORD_STRENGTH_VERY_STRONG');
default:
return i18nService.instant('PASSWORD_STRENGTH_WEAK');
}
}
static getMinPasswordLength(minPasswordStrengthValue) {
switch (minPasswordStrengthValue) {
case 2:
return 4;
case 3:
return 6;
case 4:
return 8;
case 5:
return 10;
case 6:
return 14;
default:
return 2;
}
}
}
class PasswordIndicatorComponent {
constructor(i18nService) {
this.i18nService = i18nService;
this.minPasswordStrengthValue = 1;
this.password = '';
}
getPasswordComplexityTooltip() {
return PasswordUtil.getPasswordComplexityTooltip(this.minPasswordStrengthValue, this.i18nService);
}
getPasswordComplexityStyle() {
return PasswordUtil.getStyle(PasswordUtil.evaluatePasswordStrength(this.password));
}
isOK() {
return PasswordUtil.evaluatePasswordStrength(this.password) >= this.minPasswordStrengthValue;
}
getPasswordComplexityAsLabel() {
const key = PasswordUtil.getTranslationKey(PasswordUtil.evaluatePasswordStrength(this.password));
if (key) {
return this.i18nService.instant(key);
}
else {
return '';
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: PasswordIndicatorComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.4", type: PasswordIndicatorComponent, isStandalone: false, selector: "systelab-password-indicator", inputs: { minPasswordStrengthValue: "minPasswordStrengthValue", password: "password" }, ngImport: i0, template: "<div class=\"d-none d-sm-block mt-2 text-right\">\n <i class=\"icon-info-circle mt-1 slab-info-icon\" title=\"{{ getPasswordComplexityTooltip() }}\"></i>\n</div>\n\n<div class=\"slab-password-strength mt-1 d-inline-block\"\n [ngClass]=\"getPasswordComplexityStyle()\">\n <div class=\"d-inline-block slab-first-step\"></div>\n <div class=\"d-inline-block slab-second-step\"></div>\n <div class=\"d-inline-block slab-third-step\"></div>\n <div class=\"d-inline-block slab-fourth-step\"></div>\n <div class=\"d-inline-block slab-fifth-step\"></div>\n <div class=\"d-inline-block slab-sixth-step\"></div>\n</div>\n<div class=\"text-center mt-0\">\n {{getPasswordComplexityAsLabel()}} \n</div>\n", styles: [".slab-info-icon{font-size:20px;color:#158fef}.slab-password-strength{height:5px;width:100%}.slab-password-strength div{height:5px;width:16.6%;background-color:#ddd}.slab-password-strength.slab-weak .slab-first-step{background-color:#d7382d}.slab-password-strength.slab-moderate .slab-first-step,.slab-password-strength.slab-moderate .slab-second-step{background-color:#f98800}.slab-password-strength.slab-good .slab-first-step,.slab-password-strength.slab-good .slab-second-step,.slab-password-strength.slab-good .slab-third-step{background-color:#e8f87d}.slab-password-strength.slab-slightly-strong .slab-first-step,.slab-password-strength.slab-slightly-strong .slab-second-step,.slab-password-strength.slab-slightly-strong .slab-third-step,.slab-password-strength.slab-slightly-strong .slab-fourth-step{background-color:#a5f854}.slab-password-strength.slab-strong .slab-first-step,.slab-password-strength.slab-strong .slab-second-step,.slab-password-strength.slab-strong .slab-third-step,.slab-password-strength.slab-strong .slab-fourth-step,.slab-password-strength.slab-strong .slab-fifth-step{background-color:#42f82b}.slab-password-strength.slab-very-strong .slab-first-step,.slab-password-strength.slab-very-strong .slab-second-step,.slab-password-strength.slab-very-strong .slab-third-step,.slab-password-strength.slab-very-strong .slab-fourth-step,.slab-password-strength.slab-very-strong .slab-fifth-step,.slab-password-strength.slab-very-strong .slab-sixth-step{background-color:#01a542}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: PasswordIndicatorComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-password-indicator', standalone: false, template: "<div class=\"d-none d-sm-block mt-2 text-right\">\n <i class=\"icon-info-circle mt-1 slab-info-icon\" title=\"{{ getPasswordComplexityTooltip() }}\"></i>\n</div>\n\n<div class=\"slab-password-strength mt-1 d-inline-block\"\n [ngClass]=\"getPasswordComplexityStyle()\">\n <div class=\"d-inline-block slab-first-step\"></div>\n <div class=\"d-inline-block slab-second-step\"></div>\n <div class=\"d-inline-block slab-third-step\"></div>\n <div class=\"d-inline-block slab-fourth-step\"></div>\n <div class=\"d-inline-block slab-fifth-step\"></div>\n <div class=\"d-inline-block slab-sixth-step\"></div>\n</div>\n<div class=\"text-center mt-0\">\n {{getPasswordComplexityAsLabel()}} \n</div>\n", styles: [".slab-info-icon{font-size:20px;color:#158fef}.slab-password-strength{height:5px;width:100%}.slab-password-strength div{height:5px;width:16.6%;background-color:#ddd}.slab-password-strength.slab-weak .slab-first-step{background-color:#d7382d}.slab-password-strength.slab-moderate .slab-first-step,.slab-password-strength.slab-moderate .slab-second-step{background-color:#f98800}.slab-password-strength.slab-good .slab-first-step,.slab-password-strength.slab-good .slab-second-step,.slab-password-strength.slab-good .slab-third-step{background-color:#e8f87d}.slab-password-strength.slab-slightly-strong .slab-first-step,.slab-password-strength.slab-slightly-strong .slab-second-step,.slab-password-strength.slab-slightly-strong .slab-third-step,.slab-password-strength.slab-slightly-strong .slab-fourth-step{background-color:#a5f854}.slab-password-strength.slab-strong .slab-first-step,.slab-password-strength.slab-strong .slab-second-step,.slab-password-strength.slab-strong .slab-third-step,.slab-password-strength.slab-strong .slab-fourth-step,.slab-password-strength.slab-strong .slab-fifth-step{background-color:#42f82b}.slab-password-strength.slab-very-strong .slab-first-step,.slab-password-strength.slab-very-strong .slab-second-step,.slab-password-strength.slab-very-strong .slab-third-step,.slab-password-strength.slab-very-strong .slab-fourth-step,.slab-password-strength.slab-very-strong .slab-fifth-step,.slab-password-strength.slab-very-strong .slab-sixth-step{background-color:#01a542}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { minPasswordStrengthValue: [{
type: Input
}], password: [{
type: Input
}] } });
class FormSignupComponent {
get userName() {
return this._userName;
}
set userName(value) {
this._userName = value;
this.userNameChange.emit(this._userName);
}
get password() {
return this._password;
}
set password(value) {
this._password = value;
this.passwordChange.emit(this._password);
}
get lastName() {
return this._lastName;
}
set lastName(value) {
this._lastName = value;
this.lastNameChange.emit(this._lastName);
}
get name() {
return this._name;
}
set name(value) {
this._name = value;
this.nameChange.emit(this._name);
}
get email() {
return this._email;
}
set email(value) {
this._email = value;
this.emailChange.emit(this._email);
}
get currentForm() {
return this._currentForm;
}
set currentForm(value) {
this._currentForm = value;
this.currentFormChange.emit(this._currentForm);
}
constructor(i18nService) {
this.i18nService = i18nService;
this.minPasswordStrengthValue = 1;
this.maxUsernameLength = 20;
this.isLoginActive = false;
this.errorUserExist = false;
this.isLoading = false;
this.signUp = new EventEmitter();
this.userNameChange = new EventEmitter();
this.passwordChange = new EventEmitter();
this.lastNameChange = new EventEmitter();
this.nameChange = new EventEmitter();
this.emailChange = new EventEmitter();
this.currentFormChange = new EventEmitter();
this._userName = '';
this._password = '';
this._lastName = '';
this._name = '';
this._email = '';
this._currentForm = '';
}
goLogin() {
this.currentForm = 'login';
}
doSignUp() {
this.signUp.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormSignupComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: FormSignupComponent, isStandalone: false, selector: "slt-form-signup", inputs: { minPasswordStrengthValue: "minPasswordStrengthValue", maxUsernameLength: "maxUsernameLength", isLoginActive: "isLoginActive", errorUserExist: "errorUserExist", isLoading: "isLoading", userName: "userName", password: "password", lastName: "lastName", name: "name", email: "email", currentForm: "currentForm" }, outputs: { signUp: "signUp", userNameChange: "userNameChange", passwordChange: "passwordChange", lastNameChange: "lastNameChange", nameChange: "nameChange", emailChange: "emailChange", currentFormChange: "currentFormChange" }, ngImport: i0, template: "<input #inputUserName=\"ngModel\" type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\"\n [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" [(ngModel)]=\"userName\" placeholder=\"{{ 'COMMON_USERNAME' | translate | async }}\"\n name=\"inputUserName\" (keyup.enter)=\"doSignUp()\" required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n\n <input #inputPassword=\"ngModel\" type=\"password\" [class.slab-form_input--error]=\"!passwordIndicator.isOK() && inputPassword.touched\" placeholder=\"{{ 'COMMON_PASSWORD' | translate | async }}\"\n autocomplete=\"off\" class=\"w-100 slab-form__input slab-form__input--bottomradius\" id=\"inputPassword\"\n name=\"inputPassword\" (keyup.enter)=\"doSignUp()\" [(ngModel)]=\"password\"\n required/>\n\n <systelab-password-indicator #passwordIndicator [minPasswordStrengthValue]=\"minPasswordStrengthValue\" [password]=\"password\"></systelab-password-indicator>\n\n\n <input #inputEmail=\"ngModel\" type=\"email\" [class.slab-form_input--error]=\"inputEmail.invalid && inputEmail.touched\" autocomplete=\"off\"\n placeholder=\" {{ 'COMMON_EMAIL' | translate | async }}\" class=\"w-100 slab-form_input--marginTop15 slab-form__input slab-form__input--topradius\"\n (keyup.enter)=\"doSignUp()\" id=\"inputEmail\" name=\"inputEmail\" [(ngModel)]=\"email\" required email/>\n\n <input #inputName=\"ngModel\" type=\"text\" [class.slab-form_input--error]=\"inputName.invalid && inputName.touched\" placeholder=\" {{ 'COMMON_NAME' | translate | async }}\"\n class=\"w-100 slab-form__input \" (keyup.enter)=\"doSignUp()\" id=\"inputName\" name=\"inputName\" [(ngModel)]=\"name\"\n required maxlength=\"50\" minlength=\"2\"/>\n\n <input #inputLastName=\"ngModel\" type=\"text\" [class.slab-form_input--error]=\"inputLastName.invalid && inputLastName.touched\" placeholder=\" {{ 'COMMON_LASTNAME' | translate | async }}\"\n class=\"w-100 slab-form__input \" (keyup.enter)=\"doSignUp()\" id=\"inputLastName\" name=\"inputLastName\" [(ngModel)]=\"lastName\"\n required maxlength=\"80\" minlength=\"2\"/>\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" (click)=\"doSignUp()\"\n [disabled]=\"inputUserName.invalid || inputEmail.invalid || inputPassword.invalid || inputName.invalid || inputLastName.invalid || !passwordIndicator.isOK()\">{{ 'COMMON_SEND' | translate | async }}\n </button>\n\n\n @if (isLoginActive) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link\" (click)=\"goLogin()\">{{ 'COMMON_I_HAVE_ACCOUNT' | translate | async }}</a>\n </div>\n }\n\n @if (errorUserExist) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_USER_ALREADY_EXIST' | translate | async }}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">{{ 'COMMON_LOADING' | translate | async }}...<i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PasswordIndicatorComponent, selector: "systelab-password-indicator", inputs: ["minPasswordStrengthValue", "password"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.GeneralTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormSignupComponent, decorators: [{
type: Component,
args: [{ selector: 'slt-form-signup', standalone: false, template: "<input #inputUserName=\"ngModel\" type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\"\n [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" [(ngModel)]=\"userName\" placeholder=\"{{ 'COMMON_USERNAME' | translate | async }}\"\n name=\"inputUserName\" (keyup.enter)=\"doSignUp()\" required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n\n <input #inputPassword=\"ngModel\" type=\"password\" [class.slab-form_input--error]=\"!passwordIndicator.isOK() && inputPassword.touched\" placeholder=\"{{ 'COMMON_PASSWORD' | translate | async }}\"\n autocomplete=\"off\" class=\"w-100 slab-form__input slab-form__input--bottomradius\" id=\"inputPassword\"\n name=\"inputPassword\" (keyup.enter)=\"doSignUp()\" [(ngModel)]=\"password\"\n required/>\n\n <systelab-password-indicator #passwordIndicator [minPasswordStrengthValue]=\"minPasswordStrengthValue\" [password]=\"password\"></systelab-password-indicator>\n\n\n <input #inputEmail=\"ngModel\" type=\"email\" [class.slab-form_input--error]=\"inputEmail.invalid && inputEmail.touched\" autocomplete=\"off\"\n placeholder=\" {{ 'COMMON_EMAIL' | translate | async }}\" class=\"w-100 slab-form_input--marginTop15 slab-form__input slab-form__input--topradius\"\n (keyup.enter)=\"doSignUp()\" id=\"inputEmail\" name=\"inputEmail\" [(ngModel)]=\"email\" required email/>\n\n <input #inputName=\"ngModel\" type=\"text\" [class.slab-form_input--error]=\"inputName.invalid && inputName.touched\" placeholder=\" {{ 'COMMON_NAME' | translate | async }}\"\n class=\"w-100 slab-form__input \" (keyup.enter)=\"doSignUp()\" id=\"inputName\" name=\"inputName\" [(ngModel)]=\"name\"\n required maxlength=\"50\" minlength=\"2\"/>\n\n <input #inputLastName=\"ngModel\" type=\"text\" [class.slab-form_input--error]=\"inputLastName.invalid && inputLastName.touched\" placeholder=\" {{ 'COMMON_LASTNAME' | translate | async }}\"\n class=\"w-100 slab-form__input \" (keyup.enter)=\"doSignUp()\" id=\"inputLastName\" name=\"inputLastName\" [(ngModel)]=\"lastName\"\n required maxlength=\"80\" minlength=\"2\"/>\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" (click)=\"doSignUp()\"\n [disabled]=\"inputUserName.invalid || inputEmail.invalid || inputPassword.invalid || inputName.invalid || inputLastName.invalid || !passwordIndicator.isOK()\">{{ 'COMMON_SEND' | translate | async }}\n </button>\n\n\n @if (isLoginActive) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link\" (click)=\"goLogin()\">{{ 'COMMON_I_HAVE_ACCOUNT' | translate | async }}</a>\n </div>\n }\n\n @if (errorUserExist) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_USER_ALREADY_EXIST' | translate | async }}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">{{ 'COMMON_LOADING' | translate | async }}...<i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { minPasswordStrengthValue: [{
type: Input
}], maxUsernameLength: [{
type: Input
}], isLoginActive: [{
type: Input
}], errorUserExist: [{
type: Input
}], isLoading: [{
type: Input
}], signUp: [{
type: Output
}], userName: [{
type: Input
}], userNameChange: [{
type: Output
}], password: [{
type: Input
}], passwordChange: [{
type: Output
}], lastName: [{
type: Input
}], lastNameChange: [{
type: Output
}], name: [{
type: Input
}], nameChange: [{
type: Output
}], email: [{
type: Input
}], emailChange: [{
type: Output
}], currentForm: [{
type: Input
}], currentFormChange: [{
type: Output
}] } });
class FormRecoveryComponent {
get userName() {
return this._userName;
}
set userName(value) {
this._userName = value;
this.userNameChange.emit(this._userName);
}
get currentForm() {
return this._currentForm;
}
set currentForm(value) {
this._currentForm = value;
this.currentFormChange.emit(this._currentForm);
}
constructor(i18nService) {
this.i18nService = i18nService;
this.isLoginActive = false;
this.txtRecoverProcessStarted = undefined;
this.errorUserDoesNotExist = false;
this.errorUserPwd = false;
this.txtUsername = '';
this.maxUsernameLength = 20;
this.isLoading = false;
this.showBackButton = false;
this.recovery = new EventEmitter();
this.userNameChange = new EventEmitter();
this.currentFormChange = new EventEmitter();
this._userName = '';
this._currentForm = '';
}
ngOnInit() {
if (!this.txtUsername) {
this.i18nService.get('COMMON_USERNAME')
.subscribe((res) => {
this.txtUsername = res;
});
}
}
doRecovery() {
this.recovery.emit();
}
goLogin() {
this.currentForm = 'login';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormRecoveryComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: FormRecoveryComponent, isStandalone: false, selector: "slt-form-recovery", inputs: { isLoginActive: "isLoginActive", txtRecoverProcessStarted: "txtRecoverProcessStarted", errorUserDoesNotExist: "errorUserDoesNotExist", errorUserPwd: "errorUserPwd", txtUsername: "txtUsername", maxUsernameLength: "maxUsernameLength", isLoading: "isLoading", showBackButton: "showBackButton", userName: "userName", currentForm: "currentForm" }, outputs: { recovery: "recovery", userNameChange: "userNameChange", currentFormChange: "currentFormChange" }, ngImport: i0, template: "<input #inputUserName=\"ngModel\" type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\" [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" [(ngModel)]=\"userName\" placeholder=\"{{txtUsername}}\"\n name=\"inputUserName\" (keyup.enter)=\"doRecovery()\" required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" (click)=\"doRecovery()\" [disabled]=\"inputUserName.invalid \">{{ 'COMMON_SEND' | translate | async }}</button>\n\n @if (isLoginActive || showBackButton) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link \" (click)=\"goLogin()\">{{ (showBackButton ? 'COMMON_BACK' : 'COMMON_I_HAVE_ACCOUNT') | translate | async }}</a>\n </div>\n }\n @if (errorUserDoesNotExist) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_DOES_NOT_EXIST' | translate | async }}</a>\n </div>\n }\n\n @if (txtRecoverProcessStarted) {\n <div class=\"alert alert-success text-center slab-form_input--marginTop25\">\n <a>{{txtRecoverProcessStarted}}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">\n {{ 'COMMON_LOADING' | translate | async }}...\n <i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.GeneralTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormRecoveryComponent, decorators: [{
type: Component,
args: [{ selector: 'slt-form-recovery', standalone: false, template: "<input #inputUserName=\"ngModel\" type=\"text\" class=\"w-100 slab-form__input slab-form__input--topradius\" [class.slab-form_input--error]=\"inputUserName.invalid && inputUserName.touched\"\n id=\"inputUserName\" [(ngModel)]=\"userName\" placeholder=\"{{txtUsername}}\"\n name=\"inputUserName\" (keyup.enter)=\"doRecovery()\" required autocomplete=\"off\" maxlength=\"{{maxUsernameLength}}\" autofocus>\n\n <button type=\"button\" class=\"w-100 btn btn-primary slab-form__submit mt-4\" (click)=\"doRecovery()\" [disabled]=\"inputUserName.invalid \">{{ 'COMMON_SEND' | translate | async }}</button>\n\n @if (isLoginActive || showBackButton) {\n <div class=\"slab-form_input--marginTop25 text-center\">\n <a href=\"#\" class=\"slab-text slab-text--link \" (click)=\"goLogin()\">{{ (showBackButton ? 'COMMON_BACK' : 'COMMON_I_HAVE_ACCOUNT') | translate | async }}</a>\n </div>\n }\n @if (errorUserDoesNotExist) {\n <div class=\"alert alert-danger text-center slab-form_input--marginTop25\">\n <a>{{ 'ERROR_DOES_NOT_EXIST' | translate | async }}</a>\n </div>\n }\n\n @if (txtRecoverProcessStarted) {\n <div class=\"alert alert-success text-center slab-form_input--marginTop25\">\n <a>{{txtRecoverProcessStarted}}</a>\n </div>\n }\n\n @if (isLoading) {\n <div class=\"text-center pt-2\">\n {{ 'COMMON_LOADING' | translate | async }}...\n <i class=\"icon-spinner spin\"></i>\n </div>\n }\n\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { isLoginActive: [{
type: Input
}], txtRecoverProcessStarted: [{
type: Input
}], errorUserDoesNotExist: [{
type: Input
}], errorUserPwd: [{
type: Input
}], txtUsername: [{
type: Input
}], maxUsernameLength: [{
type: Input
}], isLoading: [{
type: Input
}], showBackButton: [{
type: Input
}], recovery: [{
type: Output
}], userName: [{
type: Input
}], userNameChange: [{
type: Output
}], currentForm: [{
type: Input
}], currentFormChange: [{
type: Output
}] } });
class LoginComponent {
get userName() {
return this._userName;
}
set userName(value) {
this._userName = value;
this.userNameChange.emit(this._userName);
}
get password() {
return this._password;
}
set password(value) {
this._password = value;
this.passwordChange.emit(this._password);
}
get lastName() {
return this._lastName;
}
set lastName(value) {
this._lastName = value;
this.lastNameChange.emit(this._lastName);
}
get name() {
return this._name;
}
set name(value) {
this._name = value;
this.nameChange.emit(this._name);
}
get email() {
return this._email;
}
set email(value) {
this._email = value;
this.emailChange.emit(this._email);
}
constructor(i18nService) {
this.i18nService = i18nService;
this.currentForm = undefined;
this.isRecoveryActive = false;
this.isLoginActive = false;
this.isSignUpActive = false;
this.moreInfo = false;
this.applicationName = undefined;
this.moduleName = undefined;
this.version = undefined;
this.applicationLogo = undefined;
this.companyLogo = undefined;
this.clickableLogo = true;
this.background = undefined;
this.copyright = undefined;
this.errorUserExist = false;
this.errorUserDoesNotExist = false;
this.errorUserPwd = false;
this.errorMessage = '';
this.isLoading = false;
this.txtUsername = '';
this.txtRecoverProcessStarted = undefined;
this.minPasswordStrengthValue = 1;
this.showBackButton = false;
this.pathTerms = undefined;
this.pathPrivacy = undefined;
this.isExternalLoginActive = false;
this.maxUsernameLength = 20;
this.userNameChange = new EventEmitter();
this.passwordChange = new EventEmitter();
this.lastNameChange = new EventEmitter();
this.nameChange = new EventEmitter();
this.emailChange = new EventEmitter();
this.onMoreInfo = new EventEmitter();
this.login = new EventEmitter();
this.externalLogin = new EventEmitter();
this.signUp = new EventEmitter();
this.recovery = new EventEmitter();
this.logoClicked = new EventEmitter();
this._password = '';
this._lastName = '';
this._name = '';
this._email = '';
this._userName = '';
if (!this.currentForm) {
this.currentForm = 'login';
}
}
ngOnInit() {
if (!this.txtUsername) {
this.i18nService.get('COMMON_USERNAME')
.subscribe((res) => {
this.txtUsername = res;
});
}
}
doLogin() {
this.login.emit();
}
doExternalLogin() {
this.externalLogin.emit();
}
doSignUp() {
this.signUp.emit();
}
doRecovery() {
this.recovery.emit();
}
goSignUp() {
this.currentForm = 'signup';
}
goRecovery() {
this.currentForm = 'recovery';
}
goLogin() {
this.currentForm = 'login';
}
doMoreInfo() {
this.onMoreInfo.emit();
}
doClickLogo() {
this.logoClicked.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: LoginComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: LoginComponent, isStandalone: false, selector: "systelab-login", inputs: { currentForm: "currentForm", isRecoveryActive: "isRecoveryActive", isLoginActive: "isLoginActive", isSignUpActive: "isSignUpActive", moreInfo: "moreInfo", applicationName: "applicationName", moduleName: "moduleName", version: "version", applicationLogo: "applicationLogo", companyLogo: "companyLogo", clickableLogo: "clickableLogo", background: "background", copyright: "copyright", errorUserExist: "errorUserExist", errorUserDoesNotExist: "errorUserDoesNotExist", errorUserPwd: "errorUserPwd", errorMessage: "errorMessage", isLoading: "isLoading", txtUsername: "txtUsername", txtRecoverProcessStarted: "txtRecoverProcessStarted", minPasswordStrengthValue: "minPasswordStrengthValue", showBackButton: "showBackButton", noticeText: "noticeText", pathTerms: "pathTerms", pathPrivacy: "pathPrivacy", isExternalLoginActive: "isExternalLoginActive", maxUsernameLength: "maxUsernameLength", userName: "userName", password: "password", lastName: "lastName", name: "name", email: "email" }, outputs: { userNameChange: "userNameChange", passwordChange: "passwordChange", lastNameChange: "lastNameChange", nameChange: "nameChange", emailChange: "emailChange", onMoreInfo: "onMoreInfo", login: "login", externalLogin: "externalLogin", signUp: "signUp", recovery: "recovery", logoClicked: "logoClicked" }, ngImport: i0, template: "<div class=\"d-flex h-100 slab-login\">\n <div class=\"slab-login__background slab-login__background--configuration\" [style.background-image]=\"'url(' + background + ')'\"></div>\n <div class=\"slab-login__content d-flex flex-column\">\n <div class=\"d-flex slab-header align-content-center\">\n @if (applicationLogo && clickableLogo) {\n <img alt=\"header-logo\" class=\"slab-header__logo mr-4\" src=\"{{applicationLogo}}\" (click)=\"doClickLogo()\">\n }\n @if (applicationLogo && !clickableLogo) {\n <img alt=\"header-logo\" class=\"slab-header__no-click-logo mr-4\" src=\"{{applicationLogo}}\">\n }\n <div>\n @if (applicationName) {\n <div id=\"application-name-id\" class=\"slab-text\">{{applicationName}}</div>\n }\n @if (moduleName) {\n <div class=\"slab-text slab-text--large\">{{moduleName}}</div>\n }\n @if (version) {\n <div class=\"slab-text slab-text--small slab-text--muted\">{{ 'COMMON_VERSION' | translate | async }}: {{version}} @if (moreInfo) {\n <i class=\"fas fa-info-circle\" style=\"cursor: pointer\" (click)=\"doMoreInfo()\"></i>\n }</div>\n }\n </div>\n </div>\n @if (noticeText) {\n <div class=\"d-flex align-self-center m-4 font-weight-bolder\">{{noticeText}}</div>\n }\n @if (currentForm === 'login') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_LOGIN' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-login (login)=\"doLogin()\"\n (externalLogin)=\"doExternalLogin()\"\n [(userName)]=\"userName\"\n [(password)]=\"password\"\n [isRecoveryActive]=\"isRecoveryActive\"\n [isSignUpActive]=\"isSignUpActive\"\n [errorUserPwd]=\"errorUserPwd\"\n [txtUsername]=\"txtUsername\"\n [(currentForm)]=\"currentForm\"\n [isLoading]=\"isLoading\"\n [maxUsernameLength]=\"maxUsernameLength\"\n [isExternalLoginActive]=\"isExternalLoginActive\">\n </slt-form-login>\n </form>\n </div>\n }\n @if (currentForm === 'signup') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_SIGNUP' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-signup (signUp)=\"doSignUp()\" [(userName)]=\"userName\" [(password)]=\"password\" [(name)]=\"name\" [(lastName)]=\"lastName\"\n [(email)]=\"email\" [isLoginActive]=\"isLoginActive\" [(currentForm)]=\"currentForm\" [errorUserExist]=\"errorUserExist\" [isLoading]=\"isLoading\"\n [minPasswordStrengthValue]=\"minPasswordStrengthValue\" [maxUsernameLength]=\"maxUsernameLength\">\n </slt-form-signup>\n </form>\n </div>\n }\n @if (currentForm === 'recovery') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_RECOVERY' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-recovery (recovery)=\"doRecovery()\" [(userName)]=\"userName\" [txtUsername]=\"txtUsername\" [(currentForm)]=\"currentForm\"\n [errorUserDoesNotExist]=\"errorUserDoesNotExist\" [isLoginActive]=\"isLoginActive\" [txtRecoverProcessStarted]=\"txtRecoverProcessStarted\"\n [isLoading]=\"isLoading\" [maxUsernameLength]=\"maxUsernameLength\" [showBackButton]=\"showBackButton\">\n </slt-form-recovery>\n </form>\n </div>\n }\n\n <div class=\"d-flex slab-footer flex-column\">\n <img width=\"132\" alt=\"company-logo\" src=\"{{ companyLogo }}\" class=\"mt-4 align-self-center\">\n <div class=\"d-none d-sm-block slab-text slab-text--small align-self-center mt-4 \">{{copyright}}</div>\n <div class=\"mt-4 align-self-center\">\n @if (pathTerms) {\n <a class=\"slab-text slab-text--link slab-text--small mr-2 \" target=\"_blank\" href=\"pathTerms\">{{ 'COMMON_TERMS_OF_USE' | translate | async }}</a>\n }\n @if (pathTerms && pathPrivacy) {\n <span>\u00B7</span>\n }\n @if (pathPrivacy) {\n <a class=\"ml-2 slab-text slab-text--link slab-text--small\"\n href=\"pathPrivacy\" target=\"_blank\">{{ 'COMMON_PRIVACY' | translate | async }}</a>\n }\n </div>\n </div>\n </div>\n</div>\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"], dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormLoginComponent, selector: "slt-form-login", inputs: ["isRecoveryActive", "isSignUpActive", "errorUserPwd", "txtUsername", "isLoading", "maxUsernameLength", "isExternalLoginActive", "userName", "password", "currentForm"], outputs: ["userNameChange", "passwordChange", "currentFormChange", "login", "externalLogin"] }, { kind: "component", type: FormSignupComponent, selector: "slt-form-signup", inputs: ["minPasswordStrengthValue", "maxUsernameLength", "isLoginActive", "errorUserExist", "isLoading", "userName", "password", "lastName", "name", "email", "currentForm"], outputs: ["signUp", "userNameChange", "passwordChange", "lastNameChange", "nameChange", "emailChange", "currentFormChange"] }, { kind: "component", type: FormRecoveryComponent, selector: "slt-form-recovery", inputs: ["isLoginActive", "txtRecoverProcessStarted", "errorUserDoesNotExist", "errorUserPwd", "txtUsername", "maxUsernameLength", "isLoading", "showBackButton", "userName", "currentForm"], outputs: ["recovery", "userNameChange", "currentFormChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.GeneralTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: LoginComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-login', standalone: false, template: "<div class=\"d-flex h-100 slab-login\">\n <div class=\"slab-login__background slab-login__background--configuration\" [style.background-image]=\"'url(' + background + ')'\"></div>\n <div class=\"slab-login__content d-flex flex-column\">\n <div class=\"d-flex slab-header align-content-center\">\n @if (applicationLogo && clickableLogo) {\n <img alt=\"header-logo\" class=\"slab-header__logo mr-4\" src=\"{{applicationLogo}}\" (click)=\"doClickLogo()\">\n }\n @if (applicationLogo && !clickableLogo) {\n <img alt=\"header-logo\" class=\"slab-header__no-click-logo mr-4\" src=\"{{applicationLogo}}\">\n }\n <div>\n @if (applicationName) {\n <div id=\"application-name-id\" class=\"slab-text\">{{applicationName}}</div>\n }\n @if (moduleName) {\n <div class=\"slab-text slab-text--large\">{{moduleName}}</div>\n }\n @if (version) {\n <div class=\"slab-text slab-text--small slab-text--muted\">{{ 'COMMON_VERSION' | translate | async }}: {{version}} @if (moreInfo) {\n <i class=\"fas fa-info-circle\" style=\"cursor: pointer\" (click)=\"doMoreInfo()\"></i>\n }</div>\n }\n </div>\n </div>\n @if (noticeText) {\n <div class=\"d-flex align-self-center m-4 font-weight-bolder\">{{noticeText}}</div>\n }\n @if (currentForm === 'login') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_LOGIN' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-login (login)=\"doLogin()\"\n (externalLogin)=\"doExternalLogin()\"\n [(userName)]=\"userName\"\n [(password)]=\"password\"\n [isRecoveryActive]=\"isRecoveryActive\"\n [isSignUpActive]=\"isSignUpActive\"\n [errorUserPwd]=\"errorUserPwd\"\n [txtUsername]=\"txtUsername\"\n [(currentForm)]=\"currentForm\"\n [isLoading]=\"isLoading\"\n [maxUsernameLength]=\"maxUsernameLength\"\n [isExternalLoginActive]=\"isExternalLoginActive\">\n </slt-form-login>\n </form>\n </div>\n }\n @if (currentForm === 'signup') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_SIGNUP' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-signup (signUp)=\"doSignUp()\" [(userName)]=\"userName\" [(password)]=\"password\" [(name)]=\"name\" [(lastName)]=\"lastName\"\n [(email)]=\"email\" [isLoginActive]=\"isLoginActive\" [(currentForm)]=\"currentForm\" [errorUserExist]=\"errorUserExist\" [isLoading]=\"isLoading\"\n [minPasswordStrengthValue]=\"minPasswordStrengthValue\" [maxUsernameLength]=\"maxUsernameLength\">\n </slt-form-signup>\n </form>\n </div>\n }\n @if (currentForm === 'recovery') {\n <div class=\"d-flex slab-form align-content-center flex-wrap mt-4\">\n <div class=\"mb-4 slab-text slab-text--large slab-text--muted\">{{ 'COMMON_SESSION_RECOVERY' | translate | async }}</div>\n <form novalidate class=\"w-100\" autocomplete=\"off\">\n <slt-form-recovery (recovery)=\"doRecovery()\" [(userName)]=\"userName\" [txtUsername]=\"txtUsername\" [(currentForm)]=\"currentForm\"\n [errorUserDoesNotExist]=\"errorUserDoesNotExist\" [isLoginActive]=\"isLoginActive\" [txtRecoverProcessStarted]=\"txtRecoverProcessStarted\"\n [isLoading]=\"isLoading\" [maxUsernameLength]=\"maxUsernameLength\" [showBackButton]=\"showBackButton\">\n </slt-form-recovery>\n </form>\n </div>\n }\n\n <div class=\"d-flex slab-footer flex-column\">\n <img width=\"132\" alt=\"company-logo\" src=\"{{ companyLogo }}\" class=\"mt-4 align-self-center\">\n <div class=\"d-none d-sm-block slab-text slab-text--small align-self-center mt-4 \">{{copyright}}</div>\n <div class=\"mt-4 align-self-center\">\n @if (pathTerms) {\n <a class=\"slab-text slab-text--link slab-text--small mr-2 \" target=\"_blank\" href=\"pathTerms\">{{ 'COMMON_TERMS_OF_USE' | translate | async }}</a>\n }\n @if (pathTerms && pathPrivacy) {\n <span>\u00B7</span>\n }\n @if (pathPrivacy) {\n <a class=\"ml-2 slab-text slab-text--link slab-text--small\"\n href=\"pathPrivacy\" target=\"_blank\">{{ 'COMMON_PRIVACY' | translate | async }}</a>\n }\n </div>\n </div>\n </div>\n</div>\n", styles: [".slab-login{min-height:620px}.slab-login__content{flex:1;padding:44px;background-color:#fff}@media screen and (max-width: 550px){.slab-login__content{padding:24px!important}}.slab-login__background{display:none;flex:1 1 auto;background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:-200px center;-webkit-animation:fadein 3s;-moz-animation:fadein 3s;-ms-animation:fadein 3s;animation:fadein 3s}.slab-login__background--laboratory{background-position:center}.spin{-webkit-transform-origin:50% 58%;transform-origin:50% 58%;-ms-transform-origin:50% 58%;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media screen and (min-width: 550px){.slab-login__content{flex:0 0 414px}.slab-login__background{display:block}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.slab-text{font-size:.9em;line-height:.8}.slab-text--large{font-size:1.6em;line-height:1.5}.slab-text--small{font-size:.8em;line-height:1.5}.slab-text--muted{color:#bebebe}.slab-text--link{color:#0074f2}.slab-text--xsmall{font-size:.7em;line-height:1.5}small.badge{font-weight:400}small.badge-warning{color:#fff}.slab-header__logo{height:68px;cursor:pointer}.slab-header__no-click-logo{height:68px}.slab-form{flex:1}.slab-form__input{height:41px;border:0;box-shadow:0 0 4px #d0d0d0;font-size:14px;padding:0 15px;border-left:3px solid #fff;outline:none}.slab-form__input:focus{border-left:3px solid #0074f2;transition:border-color .6s ease-out}.slab-form__input--topradius{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}.slab-form__input--bottomradius{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.slab-form__submit{background-color:#0074f2;color:#fff;height:45px;font-weight:500;cursor:pointer}.slab-form__submit:hover{background-color:#0074f2cc;border:2px solid rgba(0,0,0,.1);transition:all .3s ease-out}.slab-form_input--marginTop25{margin-top:25px}.slab-form_input--marginTop15{margin-top:15px}.slab-form_input--error{border-left:3px solid #f45642!important}.slab-form_input:disabled,.btn:disabled{cursor:no-drop}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { currentForm: [{
type: Input
}], isRecoveryActive: [{
type: Input
}], isLoginActive: [{
type: Input
}], isSignUpActive: [{
type: Input
}], moreInfo: [{
type: Input
}], applicationName: [{
type: Input
}], moduleName: [{
type: Input
}], version: [{
type: Input
}], applicationLogo: [{
type: Input
}], companyLogo: [{
type: Input
}], clickableLogo: [{
type: Input
}], background: [{
type: Input
}], copyright: [{
type: Input
}], errorUserExist: [{
type: Input
}], errorUserDoesNotExist: [{
type: Input
}], errorUserPwd: [{
type: Input
}], errorMessage: [{
type: Input
}], isLoading: [{
type: Input
}], txtUsername: [{
type: Input
}], txtRecoverProcessStarted: [{
type: Input
}], minPasswordStrengthValue: [{
type: Input
}], showBackButton: [{
type: Input
}], noticeText: [{
type: Input
}], pathTerms: [{
type: Input
}], pathPrivacy: [{
type: Input
}], isExternalLoginActive: [{
type: Input
}], maxUsernameLength: [{
type: Input
}], userNameChange: [{
type: Output
}], passwordChange: [{
type: Output
}], lastNameChange: [{
type: Output
}], nameChange: [{
type: Output
}], emailChange: [{
type: Output
}], onMoreInfo: [{
type: Output
}], login: [{
type: Output
}], externalLogin: [{
type: Output
}], signUp: [{
type: Output
}], recovery: [{
type: Output
}], logoClicked: [{
type: Output
}], userName: [{
type: Input
}], password: [{
type: Input
}], lastName: [{
type: Input
}], name: [{
type: Input
}], email: [{
type: Input
}] } });
class ChangePasswordDialogParameters extends SystelabModalContext {
constructor() {
super(...arguments);
this.width = 550;
this.maxHeight = 360;
this.minPasswordStrengthValue = 1;
this.showOldPasswordField = true;
this.hasNumpad = false;
this.showUsernameField = false;
}
}
class ChangePasswordDialog {
constructor(dialog, i18nService, messagePopupService) {
this.dialog = dialog;
this.i18nService = i18nService;
this.messagePopupService = messagePopupService;
this.isLoading = false;
this.showOldPasswordField = true;
this.showUsernameField = false;
this.parameters = dialog.context;
this.showOldPasswordField = this.parameters.showOldPasswordField;
this.showUsernameField = this.parameters.showUsernameField;
}
static getParameters() {
return new ChangePasswordDialogParameters();
}
ngAfterViewInit() {
setTimeout(() => {
if (this.showOldPasswordField) {
document.getElementById('form-h-it')
.focus();
this.oldPassword = '';
}
else {
document.getElementById('form-h-ip')
.focus();
}
}, 500);
}
close() {
this.dialog.close();
}
isOK() {
return (this.oldPassword || !this.showOldPasswordField) &&
this.newPassword === this.repeatedPassword;
}
changePassword() {
this.parameters.action(this.oldPassword, this.newPassword)
.subscribe((response) => {
if (response) {
this.close();
}
});
}
checkNewRepeatedPassword() {
return this.newPassword !== this.repeatedPassword;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ChangePasswordDialog, deps: [{ token: i1$1.DialogRef }, { token: i1.I18nService }, { token: i1$1.MessagePopupService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ChangePasswordDialog, isStandalone: false, selector: "ng-component", ngImport: i0, template: "<systelab-dialog-header (close)=\"close()\">{{'COMMON_CHANGE_PASSWORD' | translate | async }}</systelab-dialog-header>\n<div class=\"slab-change-password slab-flex-1\">\n <form class=\"w-100 h-100 p-3\" (keypress)=\"($event.which === 13 && isOK()) ? changePassword() : 0\"\n autocomplete=\"off\">\n\n @if (showUsernameField) {\n <div class=\"row mt-1 pb-2\">\n <label class=\"col-md-6 col-form-label\">{{ 'COMMON_USERNAME' | translate | async }}</label>\n <label class=\"col-md-6 col-form-label font-weight-bold\">{{ dialog.context.userName }}</label>\n </div>\n }\n\n @if (showOldPasswordField) {\n <div class=\"row mt-1\">\n <label for=\"form-h-it\" class=\"col-md-6 col-form-label\">{{ 'LOGIN_ENTER_OLDPASSWORD' |\n translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input autofocus class=\"form-control\"\n [(ngModel)]=\"oldPassword\" name=\"oldpassword\" type=\"password\" id=\"form-h-it\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [autofocus]=\"true\" [(value)]=\"oldPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n }\n\n <div class=\"row mt-1\">\n <label for=\"form-h-ip\"\n class=\"col-md-6 col-form-label\">{{ 'LOGIN_ENTER_NEWPASSWORD' | translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input class=\"form-control\"\n [(ngModel)]=\"newPassword\" name=\"newpassword\" type=\"password\" id=\"form-h-ip\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [(value)]=\"newPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n\n <div class=\"row mt-1\">\n <label for=\"form-h-ir\"\n class=\"col-md-6 col-form-label\">{{ 'LOGIN_REPEAT_NEWPASSWORD' | translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input class=\"form-control\"\n [(ngModel)]=\"repeatedPassword\" name=\"repeatedPassword\"\n [class.is-invalid]=\"checkNewRepeatedPassword()\" type=\"password\" id=\"form-h-ir\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [(value)]=\"repeatedPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n\n <systelab-password-indicator #passwordIndicator [minPasswordStrengthValue]=\"parameters.minPasswordStrengthValue\"\n [password]=\"newPassword\"></systelab-password-indicator>\n\n </form>\n</div>\n<systelab-dialog-bottom>\n <button type=\"button\" class=\"btn btn-primary ml-auto\"\n [disabled]=\"!isOK() || !passwordIndicator.isOK()\"\n (click)=\"changePassword()\">{{ 'COMMON_SUBMIT' | translate | async}}\n </button>\n</systelab-dialog-bottom>\n", styles: [".slab-change-password .tooltip{position:relative;display:inline-block;border-bottom:1px dotted black}.slab-change-password .tooltip .tooltiptext{visibility:hidden;width:120px;background-color:#555;color:#fff;text-align:center;padding:5px 0;border-radius:6px;position:absolute;z-index:1;bottom:125%;left:50%;margin-left:-60px;opacity:0;transition:opacity 1s}.slab-change-password .tooltip .tooltiptext:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.slab-change-password .tooltip:hover .tooltiptext{visibility:visible;opacity:1}\n"], dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1$1.DialogHeaderComponent, selector: "systelab-dialog-header", inputs: ["withClose", "withInfo", "withProgressBar", "withTextProgressBar", "withHome", "withMinimize", "withDrag"], outputs: ["close", "info", "home", "minimize"] }, { kind: "component", type: i1$1.DialogBottomComponent, selector: "systelab-dialog-bottom" }, { kind: "component", type: i1$1.NumPadComponent, selector: "systelab-numpad", inputs: ["isPassword", "autofocus", "placeholder", "onClickSelectValue", "value"], outputs: ["valueChange", "change"] }, { kind: "component", type: PasswordIndicatorComponent, selector: "systelab-password-indicator", inputs: ["minPasswordStrengthValue", "password"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.GeneralTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ChangePasswordDialog, decorators: [{
type: Component,
args: [{ standalone: false, template: "<systelab-dialog-header (close)=\"close()\">{{'COMMON_CHANGE_PASSWORD' | translate | async }}</systelab-dialog-header>\n<div class=\"slab-change-password slab-flex-1\">\n <form class=\"w-100 h-100 p-3\" (keypress)=\"($event.which === 13 && isOK()) ? changePassword() : 0\"\n autocomplete=\"off\">\n\n @if (showUsernameField) {\n <div class=\"row mt-1 pb-2\">\n <label class=\"col-md-6 col-form-label\">{{ 'COMMON_USERNAME' | translate | async }}</label>\n <label class=\"col-md-6 col-form-label font-weight-bold\">{{ dialog.context.userName }}</label>\n </div>\n }\n\n @if (showOldPasswordField) {\n <div class=\"row mt-1\">\n <label for=\"form-h-it\" class=\"col-md-6 col-form-label\">{{ 'LOGIN_ENTER_OLDPASSWORD' |\n translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input autofocus class=\"form-control\"\n [(ngModel)]=\"oldPassword\" name=\"oldpassword\" type=\"password\" id=\"form-h-it\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [autofocus]=\"true\" [(value)]=\"oldPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n }\n\n <div class=\"row mt-1\">\n <label for=\"form-h-ip\"\n class=\"col-md-6 col-form-label\">{{ 'LOGIN_ENTER_NEWPASSWORD' | translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input class=\"form-control\"\n [(ngModel)]=\"newPassword\" name=\"newpassword\" type=\"password\" id=\"form-h-ip\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [(value)]=\"newPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n\n <div class=\"row mt-1\">\n <label for=\"form-h-ir\"\n class=\"col-md-6 col-form-label\">{{ 'LOGIN_REPEAT_NEWPASSWORD' | translate | async}}</label>\n <div class=\"col-md-6\">\n @if (!dialog.context.hasNumpad) {\n <input class=\"form-control\"\n [(ngModel)]=\"repeatedPassword\" name=\"repeatedPassword\"\n [class.is-invalid]=\"checkNewRepeatedPassword()\" type=\"password\" id=\"form-h-ir\">\n }\n @if (dialog.context.hasNumpad) {\n <systelab-numpad [(value)]=\"repeatedPassword\"\n [isPassword]=\"true\"></systelab-numpad>\n }\n </div>\n </div>\n\n <systelab-password-indicator #passwordIndicator [minPasswordStrengthValue]=\"parameters.minPasswordStrengthValue\"\n [password]=\"newPassword\"></systelab-password-indicator>\n\n </form>\n</div>\n<systelab-dialog-bottom>\n <button type=\"button\" class=\"btn btn-primary ml-auto\"\n [disabled]=\"!isOK() || !passwordIndicator.isOK()\"\n (click)=\"changePassword()\">{{ 'COMMON_SUBMIT' | translate | async}}\n </button>\n</systelab-dialog-bottom>\n", styles: [".slab-change-password .tooltip{position:relative;display:inline-block;border-bottom:1px dotted black}.slab-change-password .tooltip .tooltiptext{visibility:hidden;width:120px;background-color:#555;color:#fff;text-align:center;padding:5px 0;border-radius:6px;position:absolute;z-index:1;bottom:125%;left:50%;margin-left:-60px;opacity:0;transition:opacity 1s}.slab-change-password .tooltip .tooltiptext:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.slab-change-password .tooltip:hover .tooltiptext{visibility:visible;opacity:1}\n"] }]
}], ctorParameters: () => [{ type: i1$1.DialogRef }, { type: i1.I18nService }, { type: i1$1.MessagePopupService }] });
class LoggedUserRolesService {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: LoggedUserRolesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: LoggedUserRolesService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: LoggedUserRolesService, decorators: [{
type: Injectable
}] });
class AllowedRolesDirective {
constructor(viewContainerRef, templateRef, loggedUserRolesService) {
this.viewContainerRef = viewContainerRef;
this.templateRef = templateRef;
this.loggedUserRolesService = loggedUserRolesService;
this.isVisible = false;
this.stop$ = new Subject();
}
ngOnInit() {
this.loggedUserRolesService.getLoggedUserRoles()
.pipe(takeUntil(this.stop$))
.subscribe((loggedUserRoles) => {
if (!loggedUserRoles) {
this.viewContainerRef.clear();
}
const isLogged = loggedUserRoles && (loggedUserRoles.length > 0);
if (isLogged && this.isAnyRoleAllowed(loggedUserRoles)) {
if (!this.isVisible) {
this.isVisible = true;
this.viewContainerRef.createEmbeddedView(this.templateRef);
}
}
else {
this.isVisible = false;
this.viewContainerRef.clear();
}
});
}
ngOnDestroy() {
this.stop$.next(true);
}
isAnyRoleAllowed(roles) {
return !!roles.find((role) => {
return !!this.sltAllowedRoles.find((allowedRole) => {
return role === allowedRole;
});
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: AllowedRolesDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: LoggedUserRolesService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.4", type: AllowedRolesDirective, isStandalone: false, selector: "[sltAllowedRoles]", inputs: { sltAllowedRoles: "sltAllowedRoles" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: AllowedRolesDirective, decorators: [{
type: Directive,
args: [{
selector: '[sltAllowedRoles]',
standalone: false
}]
}], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: LoggedUserRolesService }], propDecorators: { sltAllowedRoles: [{
type: Input
}] } });
class ForbiddenRolesDirective {
constructor(viewContainerRef, templateRef, loggedUserRolesService) {
this.viewContainerRef = viewContainerRef;
this.templateRef = templateRef;
this.loggedUserRolesService = loggedUserRolesService;
this.isVisible = false;
this.stop$ = new Subject();
}
ngOnInit() {
this.loggedUserRolesService.getLoggedUserRoles()
.pipe(takeUntil(this.stop$))
.subscribe((loggedUserRoles) => {
if (!loggedUserRoles) {
this.viewContainerRef.clear();
}
const isLogged = loggedUserRoles && (loggedUserRoles.length > 0);
if (!isLogged || this.isAnyRoleForbidden(loggedUserRoles)) {
this.isVisible = false;
this.viewContainerRef.clear();
}
else {
if (!this.isVisible) {
this.isVisible = true;
this.viewContainerRef.createEmbeddedView(this.templateRef);
}
}
});
}
ngOnDestroy() {
this.stop$.next(true);
}
isAnyRoleForbidden(roles) {
return !!roles.find((role) => {
return !!this.sltForbiddenRoles.find((forbiddenRole) => {
return role === forbiddenRole;
});
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ForbiddenRolesDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: LoggedUserRolesService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.4", type: ForbiddenRolesDirective, isStandalone: false, selector: "[sltForbiddenRoles]", inputs: { sltForbiddenRoles: "sltForbiddenRoles" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ForbiddenRolesDirective, decorators: [{
type: Directive,
args: [{
selector: '[sltForbiddenRoles]',
standalone: false
}]
}], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: LoggedUserRolesService }], propDecorators: { sltForbiddenRoles: [{
type: Input
}] } });
class SystelabLoginModule {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SystelabLoginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.4", ngImport: i0, type: SystelabLoginModule, declarations: [LoginComponent,
ChangePasswordDialog,
FormLoginComponent,
FormSignupComponent,
FormRecoveryComponent,
PasswordIndicatorComponent,
AllowedRolesDirective,
ForbiddenRolesDirective], imports: [CommonModule,
FormsModule,
SystelabTranslateModule,
SystelabComponentsModule], exports: [LoginComponent,
PasswordIndicatorComponent,
AllowedRolesDirective,
ForbiddenRolesDirective,
ChangePasswordDialog] }); }
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SystelabLoginModule, imports: [CommonModule,
FormsModule,
SystelabTranslateModule,
SystelabComponentsModule] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SystelabLoginModule, decorators: [{
type: NgModule,
args: [{
imports: [
CommonModule,
FormsModule,
SystelabTranslateModule,
SystelabComponentsModule
],
declarations: [
LoginComponent,
ChangePasswordDialog,
FormLoginComponent,
FormSignupComponent,
FormRecoveryComponent,
PasswordIndicatorComponent,
AllowedRolesDirective,
ForbiddenRolesDirective
],
exports: [
LoginComponent,
PasswordIndicatorComponent,
AllowedRolesDirective,
ForbiddenRolesDirective,
ChangePasswordDialog
]
}]
}] });
/*
* Public API Surface of test-ng-workspace
*/
/**
* Generated bundle index. Do not edit.
*/
export { AllowedRolesDirective, ChangePasswordDialog, ChangePasswordDialogParameters, ForbiddenRolesDirective, LoggedUserRolesService, LoginComponent, PasswordIndicatorComponent, SystelabLoginModule };
//# sourceMappingURL=systelab-login.mjs.map