UNPKG

systelab-login

Version:

Library with common Systelab login components to speed up our Angular developments

911 lines 99.3 kB
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()}}&nbsp;\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()}}&nbsp;\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