{"version":3,"file":"turbogui-angular.mjs","sources":["../../../projects/turbogui-angular/src/main/view/directives/ElementClickOutsideDirective.ts","../../../projects/turbogui-angular/src/main/view/directives/ElementCreatedDirective.ts","../../../projects/turbogui-angular/src/main/view/directives/ElementDestroyedDirective.ts","../../../projects/turbogui-angular/src/main/view/directives/AutoFocusOnDisplayDirective.ts","../../../projects/turbogui-angular/src/main/view/directives/AutoSelectTextOnFocusDirective.ts","../../../projects/turbogui-angular/src/main/model/modules/turbogui-angular.module.ts","../../../projects/turbogui-angular/src/main/model/classes/SingletoneStrictClass.ts","../../../projects/turbogui-angular/src/main/controller/notification.service.ts","../../../projects/turbogui-angular/src/main/controller/globalerror.service.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-base/dialog-base.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-error/dialog-error.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-error/dialog-error.component.html","../../../projects/turbogui-angular/src/main/view/animations/fade.animation.ts","../../../projects/turbogui-angular/src/main/view/components/busy-state-base/busy-state-base.component.ts","../../../projects/turbogui-angular/src/main/view/components/busy-state-base/busy-state-base.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-iframe/dialog-iframe.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-iframe/dialog-iframe.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-image/dialog-image.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-image/dialog-image.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-blob/dialog-blob.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-blob/dialog-blob.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-date-selection/dialog-date-selection.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-date-selection/dialog-date-selection.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-single-option/dialog-single-option.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-single-option/dialog-single-option.component.html","../../../projects/turbogui-angular/src/main/controller/dialog.service.ts","../../../projects/turbogui-angular/src/main/controller/http.service.ts","../../../projects/turbogui-angular/src/main/controller/httpservice/HTTPServiceGetRequest.ts","../../../projects/turbogui-angular/src/main/controller/httpservice/HTTPServicePostRequest.ts","../../../projects/turbogui-angular/src/main/controller/browser.service.ts","../../../projects/turbogui-angular/src/main/controller/turbo-api.service.ts","../../../projects/turbogui-angular/src/main/controller/router-base.service.ts","../../../projects/turbogui-angular/src/main/managers/TranslationManager.ts","../../../projects/turbogui-angular/src/main/controller/locales-base.service.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-two-option/dialog-two-option.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-two-option/dialog-two-option.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-multiple-option/dialog-multiple-option.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-multiple-option/dialog-multiple-option.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.html","../../../projects/turbogui-angular/src/main/view/components/dialog-single-input/dialog-single-input.component.ts","../../../projects/turbogui-angular/src/main/view/components/dialog-single-input/dialog-single-input.component.html","../../../projects/turbogui-angular/src/main/view/components/button-base/button-base.component.ts","../../../projects/turbogui-angular/src/main/view/components/button-image/button-image.component.ts","../../../projects/turbogui-angular/src/main/view/components/button-image/button-image.component.html","../../../projects/turbogui-angular/src/main/view/components/button-container/button-container.component.ts","../../../projects/turbogui-angular/src/main/view/components/button-container/button-container.component.html","../../../projects/turbogui-angular/src/main/model/classes/GUINotification.ts","../../../projects/turbogui-angular/src/main/model/classes/View.ts","../../../projects/turbogui-angular/src/main/model/classes/ViewService.ts","../../../projects/turbogui-angular/src/main/managers/DelayedMethodCallManager.ts","../../../projects/turbogui-angular/src/main/view/forms/ValidatorsPlus.ts","../../../projects/turbogui-angular/src/public_api.ts","../../../projects/turbogui-angular/src/turbogui-angular.ts"],"sourcesContent":["/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\n\r\n\r\n/**\r\n * It is necessary to import TurboGuiAngularModule at the component that uses this directive\r\n * \r\n * This directive is used to execute an action when the user clicks outside of an element.\r\n * \r\n * If we set the elementClickOutside tag to the html element and set the clickOutsideElement event to a function: <element elementClickOutside (clickOutsideElement)=\"clickOutsideElement()\" ...,\r\n * this function will be executed when the user clicks outside of the element.\r\n */\r\n@Directive({\r\n    selector: '[elementClickOutside]',\r\n    standalone: false\r\n})\r\n\r\n\r\n\r\nexport class ElementClickOutsideDirective {\r\n    \r\n    \r\n    @Output() clickOutsideElement = new EventEmitter<void>();\r\n  \r\n\r\n    constructor(private readonly elementRef: ElementRef) {\r\n    \r\n    }\r\n  \r\n\r\n    @HostListener('document:click', ['$event.target']) onClick(targetElement: HTMLElement): void {\r\n    \r\n        const clickedInside = this.elementRef.nativeElement.contains(targetElement);\r\n    \r\n        if (!clickedInside) {\r\n            \r\n            this.clickOutsideElement.emit();\r\n        }\r\n    }  \r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Directive, EventEmitter, Output, OnInit } from '@angular/core';\r\n\r\n\r\n/** This directive is used to listen for onInit events on raw html elements */\r\n@Directive({\n    selector: '[elementCreated]',\n    standalone: false\n})\r\n\r\n\r\n/**\r\n * This directive is used to listen for onInit events on raw html elements\r\n * If we place (elementCreated)=\"someMethod()\" on the element at the html template part, when the element\r\n * that uses this directive is visually created, someMethod() will be called.\r\n */\r\nexport class ElementCreatedDirective implements OnInit {\r\n\r\n\r\n    /**\r\n     * Event that will be dispatched once element is created\r\n     */\r\n    @Output() elementCreated: EventEmitter<ElementCreatedDirective> = new EventEmitter();\r\n\r\n\r\n    /**\r\n     * Listen for the on init event\r\n     */\r\n    ngOnInit() {\r\n\r\n        this.elementCreated.next(this);\r\n    }\r\n\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Directive, OnDestroy, EventEmitter, Output } from '@angular/core';\r\n\r\n\r\n/** This directive is used to listen for onDestroy events on raw html elements */\r\n@Directive({\n    selector: '[elementDestroyed]',\n    standalone: false\n})\r\n\r\n\r\n/**\r\n * This directive is used to listen for onDestroy events on raw html elements\r\n * If we place (elementDestroyed)=\"someMethod()\" on the element at the html template part, when the element\r\n * that uses this directive is visually destroyed from the screen, someMethod() will be called.\r\n */\r\nexport class ElementDestroyedDirective implements OnDestroy {\r\n\r\n\r\n    /**\r\n     * Event that will be dispatched once element is destroyed\r\n     */\r\n    @Output() elementDestroyed: EventEmitter<ElementDestroyedDirective> = new EventEmitter();\r\n\r\n\r\n    /**\r\n     * Listen for the on destroy event\r\n     */\r\n    ngOnDestroy() {\r\n\r\n        this.elementDestroyed.next(this);\r\n    }\r\n\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Directive, ElementRef, NgZone, Renderer2, AfterContentInit } from '@angular/core';\r\n\r\n\r\n/** This directive is used to perform an autofocus on an element every time it is displayed */\r\n@Directive({\n    selector: '[autoFocusOnDisplay]',\n    standalone: false\n})\r\n\r\n\r\n/**\r\n * This directive is used to perform an autofocus on an element every time it is displayed\r\n * If we set the autoFocusOnDisplay tag to the html element, it will be automatically focused after it is shown.\r\n */\r\nexport class AutoFocusOnDisplayDirective implements AfterContentInit {\r\n    \r\n    \r\n    constructor(private readonly el: ElementRef, private readonly zone: NgZone, private readonly renderer: Renderer2) {\r\n    \r\n        if (!el.nativeElement['focus']) {\r\n        \r\n            throw new Error('Element does not accept focus');\r\n        }\r\n    }\r\n    \r\n    ngAfterContentInit() {\r\n        \r\n        this.zone.runOutsideAngular(() => setTimeout(() => {\r\n            \r\n            this.renderer.selectRootElement(this.el.nativeElement).focus();\r\n            \r\n        }, 0));\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';\r\n\r\n\r\n/** This directive is used to perform an automatic select all text on an element every time it is focused */\r\n@Directive({\n    selector: '[autoSelectTextOnFocus]',\n    standalone: false\n})\r\n\r\n\r\n/**\r\n * This directive is used to perform an an automatic select all text on an element every time it is focused.\r\n * If we set the autoSelectTextOnFocus tag to the html element, its text will be automatically selected after it gets the focus.\r\n */\r\nexport class AutoSelectTextOnFocusDirective {\r\n    \r\n    \r\n    constructor(private readonly el: ElementRef, private readonly renderer: Renderer2) {\r\n    \r\n        if (!el.nativeElement['select']) {\r\n        \r\n            throw new Error('Element does not accept select');\r\n        }\r\n    }\r\n    \r\n    \r\n    @HostListener('focus', ['$event']) onFocus() {\r\n    \r\n        this.renderer.selectRootElement(this.el.nativeElement).select();\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { ElementClickOutsideDirective } from '../../view/directives/ElementClickOutsideDirective';\r\nimport { ElementCreatedDirective } from '../../view/directives/ElementCreatedDirective';\r\nimport { ElementDestroyedDirective } from '../../view/directives/ElementDestroyedDirective';\r\nimport { AutoFocusOnDisplayDirective } from '../../view/directives/AutoFocusOnDisplayDirective';\r\nimport { AutoSelectTextOnFocusDirective } from '../../view/directives/AutoSelectTextOnFocusDirective';\r\n\r\n\r\n/**\r\n * This file contains the root module that contains all the library declarations and exports.\r\n */\r\n@NgModule({\r\n\r\n    imports: [\r\n    ],\r\n\r\n    declarations: [\r\n        ElementClickOutsideDirective,\r\n        ElementCreatedDirective,\r\n        ElementDestroyedDirective,\r\n        AutoFocusOnDisplayDirective,\r\n        AutoSelectTextOnFocusDirective\r\n    ],\r\n\r\n    providers: [\r\n    ],\r\n\r\n    exports: [\r\n        ElementClickOutsideDirective,\r\n        ElementCreatedDirective,\r\n        ElementDestroyedDirective,\r\n        AutoFocusOnDisplayDirective,\r\n        AutoSelectTextOnFocusDirective\r\n    ]\r\n})\r\n\r\nexport class TurboGuiAngularModule { }\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Type, inject } from \"@angular/core\";\r\n\r\n\r\n/**\r\n * Defines a base class that can be used to create singleton services which cannot be instantiated more than one time\r\n * during the whole application lifetime.\r\n * \r\n * To use it, simply extend this class and pass the parent class type to this constructor via super() \r\n */\r\nexport class SingletoneStrictClass {\r\n    \r\n\tconstructor(classType: Type<any>) {\r\n\t\t\r\n\t    const parent = inject(classType, { skipSelf: true, optional: true});\r\n\t    \r\n\t    if (parent) {\r\n\t\t\t\r\n\t        throw Error(`[${classType.name}]: Can not create more than one instance`);\r\n\t    }\r\n\t}\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { GUINotification } from '../model/classes/GUINotification';\r\nimport { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\n\r\n\r\n/**\r\n * This is the main application event bus.\r\n * All global events that happen on the application are broadcasted by this service, and\r\n * can be listened by any application element who previously subscribed\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class NotificationService extends SingletoneStrictClass {\r\n\r\n\r\n    /**\r\n     * The Observable instance that handles subscriptions and notifications\r\n     */\r\n    private readonly _notifications = new Subject<GUINotification>();\r\n\r\n\r\n\tconstructor(){\r\n\t\t\r\n\t\tsuper(NotificationService);\r\n\t}\r\n\t\r\n\r\n    /**\r\n     * used by other services or components to subscribe to all notifications that are generated by this service\r\n     *\r\n     * @param notificationHandler A method that will be used to receive each notification as a GUINotification instance\r\n     *\r\n     * @returns The new subscription object. Make sure to unsubscribe when not required anymore\r\n     */\r\n    subscribe(notificationHandler: (notification: GUINotification) => any) {\r\n\r\n        return this._notifications.subscribe(notificationHandler);\r\n    }\r\n\r\n\r\n    /**\r\n     * Launch a notification to anyone who may be listening\r\n     *\r\n     * @param notification A notification instance to launch\r\n     */\r\n    send(notification: GUINotification) {\r\n\r\n        this._notifications.next(notification);\r\n    }\r\n\r\n\r\n    /**\r\n     * End a previously initiated subscription\r\n     *\r\n     * @param subscription A previously created subscription instance from which we want to unsubscribe\r\n     */\r\n    unsubscribe(subscription: Subscription) {\r\n\r\n        return subscription.unsubscribe();\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable, ErrorHandler } from '@angular/core';\r\nimport { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\r\n\r\n\r\n/**\r\n * Captures all the application exceptions and performs any required action.\r\n * It also contains multiple general error management features.\r\n *\r\n * To define this class as your application error handler, you must add the following to your\r\n * Application providers:\r\n *      {\r\n *          provide: ErrorHandler,\r\n *          useClass: GlobalErrorService\r\n *      },\r\n *      GlobalErrorService\r\n *\r\n * You cannot access the error handler at runtime. If you need to modify any of the behaviours\r\n * or implement your custom ones, you must extend this class and set your new one as the error\r\n * handler provider.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class GlobalErrorService extends SingletoneStrictClass implements ErrorHandler {\r\n\r\n\r\n    /**\r\n     * Enables or disables the error notification to user via an alert box\r\n     * Extend this class and override this value on your custom error handle to change it\r\n     */\r\n    private readonly showExceptionsToUser = true;\r\n\r\n\r\n    /**\r\n     * Enables or disables the error notification to user via an alert box\r\n     * Extend this class and override this value on your custom error handle to change it\r\n     */\r\n    private readonly showExceptionsOnConsole = true;\r\n\r\n\r\n    /**\r\n     * Defines the text that will be used for the alert that is shown to the user when an exception happens\r\n     * and showExceptionsToUser is true\r\n     * Extend this class and override this value on your custom error handle to change it\r\n     */\r\n    private readonly errorAlertMessage = 'Application exception:\\n\\n';\r\n\r\n\r\n\tconstructor(){\r\n\t\t\r\n\t\tsuper(GlobalErrorService);\r\n\t}\r\n\r\n    /**\r\n     * Show an alert with the received error detail and also log it to the js console.\r\n     *\r\n     * Angular expects at least this method to be implemented on any class that is used as a global exception handler.\r\n     *\r\n     * @param error An error instance\r\n     */\r\n    handleError(error: any) {\r\n\r\n        if (this.showExceptionsToUser) {\r\n\r\n            alert(this.errorAlertMessage + (error as string));\r\n        }\r\n\r\n        if (this.showExceptionsOnConsole) {\r\n\r\n            console.log(error);\r\n        }\r\n\r\n        throw error;\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n\r\nimport { AfterViewInit, Component, ElementRef } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\r\n\r\n\r\n/**\r\n * This is the base class for all the dialog components that can be loaded by the dialog service class\r\n */\r\n@Component({\n    template: '',\n    standalone: false\n})\r\nexport abstract class DialogBaseComponent implements AfterViewInit {\r\n\r\n\r\n    /*\r\n     * The name of the superclass must be set into this constant as it is required by the dialog service to identify dialogs as different.\r\n     * \r\n     * When you extend the dialog base class, simply declare this static constant with the exact same name as your class and you're done.\r\n     * If this value is not set on the extended dialog component, a runtime exception will happen when trying to show the dialog.\r\n     * \r\n     * The root cause of this requirement is that when apps are compiled for production, class names are minified and this causes problems \r\n     * when creating a dialog hash to uniquely identify a dialog instance. Therefore, a hardcoded class name is necesary.\r\n     */        \r\n    static readonly DIALOG_CLASS_NAME:string = '';\r\n\r\n\r\n\tconstructor(public elementRef: ElementRef,\r\n\t\t\t\tpublic dialogRef: MatDialogRef<DialogBaseComponent>) {\r\n  \r\n    }\r\n\r\n\r\n    ngAfterViewInit() {\r\n\t    \r\n\t    // Assign the component HTML identifier if it is specifically assigned to the dialogref instance\r\n\t    if(this.dialogRef.id !== undefined && this.dialogRef.id !== ''){\r\n   \r\n\t\t\tthis.elementRef.nativeElement.id = this.dialogRef.id;\r\n\t\t}\r\n\t}\r\n\r\n    \r\n    /**\r\n     * Method to be called by the dialogs that extend this base component when they want to close themselves.\r\n     * It will perform the close of that dialog and also send an object to the addDialog() callback with the index and value\r\n     * that the user may have selected.\r\n     *\r\n     * @param index The numeric index of the user option selection. It will be specific for each dialog and it's different available options\r\n     * @param value Any value that may be provided to the callback regarding the user selected option.\r\n     *\r\n     * @return void\r\n     */\r\n    closeDialog(index:number, value:any = null){\r\n        \r\n        this.dialogRef.close({index: index, value: value});\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatButtonModule } from '@angular/material/button';\nimport { CommonModule } from '@angular/common';\n\r\n\r\n@Component({\n    selector: 'tg-dialog-error',\n    imports: [CommonModule, MatButtonModule],\n    providers: [],\n    templateUrl: './dialog-error.component.html',\n    styleUrls: ['./dialog-error.component.scss']\n})\r\n\r\n\r\n/**\r\n * A dialog component with a single option button, to be used for error notifications\r\n */\r\nexport class DialogErrorComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogErrorComponent';\r\n    \r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n        \r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogErrorComponent expects 2 texts: The title and optionally a description');\r\n        }\r\n\r\n        if (data.options.length !== 1) {\r\n\r\n            throw new Error('DialogErrorComponent expects only one option');\r\n        }\r\n        \r\n        if(data.texts.length > 1){\r\n\t\t\t\r\n\t\t\tdata.texts[1] = data.texts[1].replace(/\\n/g, \"<br/>\");\r\n\t\t}\r\n    }\r\n}\r\n","<div class=\"titleAndIconContainer\">\r\n    <h3>\r\n        {{data.texts[0]}}\r\n    </h3>\r\n    \r\n    <!-- error icon -->\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\">\r\n        <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\r\n        <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" fill=\"#ff0000\" />\r\n    </svg>\r\n    \r\n</div>\r\n\r\n<div class=\"textContainer\">\r\n    <p *ngIf=\"data.texts.length > 1\" [innerHTML]=\"data.texts[1]\">\r\n    </p>\r\n</div>\r\n\r\n<button mat-raised-button color=\"warn\"\r\n    (click)=\"closeDialog(0)\">\r\n    \r\n    {{data.options[0]}}\r\n    \r\n</button>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { trigger, animate, transition, style } from '@angular/animations';\r\n\r\n\r\n/**\r\n * Fade animations\r\n */\r\n@Injectable()\r\nexport class FadeAnimationClass {\r\n\r\n    /**\r\n     * Get a custom trigger to create fade animations when components are added or removed from the application\r\n     *\r\n     * @param triggerName The name for the trigger we want to create\r\n     * @param enter The time and easing that we want to use for the enter state\r\n     * @param leave The time and easing that we want to use for the leave state\r\n     */\r\n    static getTrigger(triggerName: string, enter = '1s ease', leave = '300ms ease') {\r\n\r\n        return trigger(triggerName, [\r\n                                     transition('void => *', [style({opacity: 0}), animate(enter, style({ opacity: 1 }))]),\r\n                                     transition('* => void', [animate(leave, style({opacity: 0}))])\r\n                                    ]);\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, HostBinding } from '@angular/core';\r\nimport { FadeAnimationClass } from '../../animations/fade.animation';\r\n\r\n\r\n@Component({\n    selector: 'tg-busy-state-base',\n    imports: [],\n    providers: [],\n    templateUrl: './busy-state-base.component.html',\n    animations: [FadeAnimationClass.getTrigger('busyStateBaseFade', '1s ease', '400ms ease')],\n    styleUrls: ['./busy-state-base.component.scss']\n})\r\n\r\n\r\n/**\r\n * This component is used by turboGUI angular library to show the busy state to the user.\r\n * It is used to block all the user input and progressively shows a busy cursor to notify that the application\r\n * is waiting for something.\r\n *\r\n * We can (should) override this component with our own one to adapt its visual appearance to our application.\r\n * We can then set dialogService.busyStateComponentClass to our component class at the application start to to\r\n * override the default one.\r\n */\r\nexport class BusyStateBaseComponent {\r\n\r\n\r\n    /**\r\n     * This is used to attach the fade animation directly to this component so it fades in and out when created and removed from the app\r\n     */\r\n    @HostBinding('@busyStateBaseFade') busyStateBaseFade = true;\r\n}\r\n","<div class=\"darkBg\">\r\n\r\n</div>\r\n\r\n<svg width=\"38\" height=\"38\" viewBox=\"0 0 38 38\" xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#fff\">\r\n    <g fill=\"none\" fill-rule=\"evenodd\">\r\n        <g transform=\"translate(1 1)\" stroke-width=\"1\">\r\n            <circle stroke-opacity=\".2\" cx=\"18\" cy=\"18\" r=\"18\"/>\r\n            <path d=\"M36 18c0-9.94-8.06-18-18-18\">\r\n                <animateTransform\r\n                    attributeName=\"transform\"\r\n                    type=\"rotate\"\r\n                    from=\"0 18 18\"\r\n                    to=\"360 18 18\"\r\n                    dur=\"1s\"\r\n                    repeatCount=\"indefinite\"/>\r\n            </path>\r\n        </g>\r\n    </g>\r\n</svg>\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n\r\n@Component({\r\n    selector: 'tg-dialog-iframe',\r\n    imports: [CommonModule],\r\n    providers: [],\r\n    templateUrl: './dialog-iframe.component.html',\r\n    styleUrls: ['./dialog-iframe.component.scss']\r\n})\r\n\r\n\r\n/**\r\n * A dialog component with an iframe that can be used to display any url or content.\r\n * \r\n * We must specify the url in the data parameter when opening the dialog, and we can also specify the title \r\n * by placing it at the first position of the texts array.\r\n */\r\nexport class DialogIFrameComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogIFrameComponent';\r\n    \r\n    \r\n    title = '';\r\n    \r\n    \r\n    safeUrl: SafeResourceUrl;\r\n    \r\n    \r\n    constructor(public elementRef: ElementRef,\r\n                public dialogRef: MatDialogRef<DialogBaseComponent>,\r\n                private readonly sanitizer: DomSanitizer,\r\n                @Inject(MAT_DIALOG_DATA) public data: any) {\r\n        \r\n        super(elementRef, dialogRef);\r\n        \r\n        if(data.texts.length > 0) {\r\n            \r\n            this.title = data.texts[0];\r\n        }\r\n        \r\n        this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(data.data);\r\n    }\r\n}\r\n","<h2 *ngIf=\"title !== ''\">{{title}}</h2>\r\n\r\n<iframe [src]=\"safeUrl\" title=\"title\"></iframe>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n\r\n@Component({\r\n    selector: 'tg-dialog-image',\r\n    imports: [CommonModule],\r\n    providers: [],\r\n    templateUrl: './dialog-image.component.html',\r\n    styleUrls: ['./dialog-image.component.scss']\r\n})\r\n\r\n\r\n/**\r\n * A dialog component with an image that can be used to display any picture url\r\n * \r\n * We must specify the url in the data parameter when opening the dialog, and we can also specify the title \r\n * by placing it at the first position of the texts array.\r\n */\r\nexport class DialogImageComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogImageComponent';\r\n    \r\n    \r\n    title = '';\r\n    \r\n    \r\n    safeUrl: SafeResourceUrl;\r\n    \r\n    \r\n    constructor(public elementRef: ElementRef,\r\n                public dialogRef: MatDialogRef<DialogBaseComponent>,\r\n                private readonly sanitizer: DomSanitizer,\r\n                @Inject(MAT_DIALOG_DATA) public data: any) {\r\n        \r\n        super(elementRef, dialogRef);\r\n        \r\n        if(data.texts.length > 0) {\r\n            \r\n            this.title = data.texts[0];\r\n        }\r\n        \r\n        this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(data.data);\r\n    }\r\n}\r\n","<h2 *ngIf=\"title !== ''\">{{title}}</h2>\r\n\r\n<img [src]=\"safeUrl\" title=\"title\" alt=\"{{title}}\" />","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\r\n\r\n@Component({\r\n    selector: 'tg-dialog-blob',\r\n    imports: [CommonModule],\r\n    providers: [],\r\n    templateUrl: './dialog-blob.component.html',\r\n    styleUrls: ['./dialog-blob.component.scss']\r\n})\r\n\r\n\r\n/**\r\n * A dialog component that shows a blob (pdf, image, etc) inside an iframe.\r\n * \r\n * We must specify the blol in the data parameter when opening the dialog, and we can also specify the title \r\n * by placing it at the first position of the texts array.\r\n */\r\nexport class DialogBlobComponent extends DialogBaseComponent implements OnInit, OnDestroy {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogBlobComponent';\r\n    \r\n    \r\n    title = '';\r\n    \r\n    \r\n    mimeType = '';\r\n    \r\n    \r\n    objectUrl = '';\r\n    \r\n    \r\n    blobUrl: SafeResourceUrl = '';\r\n    \r\n    \r\n    constructor(public elementRef: ElementRef,\r\n                private readonly sanitizer: DomSanitizer,\r\n                public dialogRef: MatDialogRef<DialogBaseComponent>,\r\n                @Inject(MAT_DIALOG_DATA) public data: any) {\r\n        \r\n        super(elementRef, dialogRef);\r\n        \r\n        if(data.texts.length > 0) {\r\n            \r\n            this.title = data.texts[0];\r\n        }\r\n    }\r\n    \r\n    \r\n    ngOnInit() {\r\n        \r\n        let blob:Blob|null = null;\r\n        let blobInput = this.data?.data?.blob;\r\n        \r\n        this.mimeType = this.data?.data?.mimeType || 'application/octet-stream'; \r\n\r\n        if (typeof blobInput === 'string') {\r\n            \r\n            blob = new Blob([blobInput], { type: this.mimeType });\r\n            \r\n        } else if (blobInput instanceof Blob) {\r\n            \r\n            blob = blobInput;       \r\n        }\r\n\r\n        if (blob instanceof Blob) {\r\n            \r\n            this.objectUrl = URL.createObjectURL(blob);\r\n            this.blobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.objectUrl);\r\n        }\r\n    }\r\n\r\n    \r\n    ngOnDestroy() {\r\n        \r\n        if(this.blobUrl !== ''){\r\n            \r\n            URL.revokeObjectURL(this.objectUrl);\r\n        }\r\n    }\r\n}\r\n","<h2 *ngIf=\"title !== ''\">{{title}}</h2>\r\n\r\n<!-- For images -->\r\n<img *ngIf=\"mimeType.startsWith('image/')\" [src]=\"blobUrl\" [alt]=\"title\" />\r\n\r\n<!-- For PDFs and other types -->\r\n<iframe *ngIf=\"!mimeType.startsWith('image/')\" [src]=\"blobUrl\" [title]=\"title\"></iframe>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\n@Component({\r\n    selector: 'tg-dialog-date-selection',\r\n    imports: [CommonModule, MatDatepickerModule, MatNativeDateModule],\r\n    providers: [],\r\n    templateUrl: './dialog-date-selection.component.html',\r\n    styleUrls: ['./dialog-date-selection.component.scss']\r\n})\r\n\r\n\r\n/**\r\n * A dialog component with a calendar that allows us to select a single date value\r\n */\r\nexport class DialogDateSelectionComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogDateSelectionComponent';\r\n    \r\n    \r\n    selectedDate:Date;\r\n\r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>,\r\n                @Inject(MAT_DIALOG_DATA) public data: any) {\r\n        \r\n        super(elementRef, dialogRef);\r\n    }\r\n}\r\n","<h2>{{data.texts[0]}}</h2>\r\n\r\n<mat-calendar #calendar\r\n    (selectedChange)=\"closeDialog(0, $event)\">\r\n</mat-calendar>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatButtonModule } from '@angular/material/button';\nimport { CommonModule } from '@angular/common';\n\r\n\r\n/**\r\n * A dialog component with a single option button, to be used with dialog service\r\n */\r\n@Component({\n    selector: 'tg-dialog-single-option',\n    imports: [CommonModule, MatButtonModule],\n    providers: [],\n    templateUrl: './dialog-single-option.component.html',\n    styleUrls: ['./dialog-single-option.component.scss']\n})\r\n\r\n\r\nexport class DialogSingleOptionComponent extends DialogBaseComponent {\r\n\r\n    \r\n    static readonly DIALOG_CLASS_NAME = 'DialogSingleOptionComponent';\r\n    \r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n        \r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogSingleOptionComponent expects 2 texts: The title and optionally a description');\r\n        }\r\n\r\n        if (data.options.length !== 1) {\r\n\r\n            throw new Error('DialogSingleOptionComponent expects only one option');\r\n        }\r\n    }\r\n}\r\n","<h3>\r\n    {{data.texts[0]}}\r\n</h3>\r\n\r\n<p *ngIf=\"data.texts.length > 1\">\r\n    {{data.texts[1]}}\r\n</p>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n    (click)=\"closeDialog(0)\">\r\n    \r\n    {{data.options[0]}}\r\n    \r\n</button>","/**\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\n *\n * Website : -> http://www.turbogui.org\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\n */\n\nimport { take } from 'rxjs/operators';\nimport { ArrayUtils, NumericUtils } from 'turbocommons-ts';\nimport { Type, Injectable, Injector, ApplicationRef, Renderer2, RendererFactory2, ViewContainerRef, EnvironmentInjector } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\nimport { BusyStateBaseComponent } from '../view/components/busy-state-base/busy-state-base.component';\nimport { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport { DialogBaseComponent } from '../view/components/dialog-base/dialog-base.component';\nimport { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';\nimport { DialogIFrameComponent } from '../view/components/dialog-iframe/dialog-iframe.component';\nimport { DialogImageComponent } from '../view/components/dialog-image/dialog-image.component';\nimport { DialogBlobComponent } from '../view/components/dialog-blob/dialog-blob.component';\nimport { DialogDateSelectionComponent } from '../view/components/dialog-date-selection/dialog-date-selection.component';\nimport { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\nimport { DialogSingleOptionComponent } from '../view/components/dialog-single-option/dialog-single-option.component';\n\n\n/**\n * Defines a File object that may contain its data loaded.\n */\nexport interface FileWithData extends File {\n    \n    data?: any;\n}\n\n/**\n * Manages the application modal and non modal floating elements\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class DialogService extends SingletoneStrictClass {\n\n\n    /**\n     * Used to modify the busy state component that is shown by default by the addModalBusyState() method.\n     *\n     * @see this.addModalBusyState()\n     */\n    customBusyStateComponentClass: Type<BusyStateBaseComponent> = BusyStateBaseComponent;\n\n\n    /**\n     * Check public getter for docs\n     */\n    private _isEnabled = true;\n\n\n    /**\n     * Tells if the main application is currently showing a busy state that blocks all user interaction\n     */\n    private _isShowingBusyState = false;\n\n\n    /**\n     * A reference to the modal busy state component that is initialized only the first time it is called.\n     *\n     * (To append the busy state dynamically, we use the Portal concept from the angular material library)\n     */\n    private _componentPortal: ComponentPortal<BusyStateBaseComponent> | null = null;\n\n\n    /**\n     * A reference to the modal busy state container where the component will be added\n     */\n    private _modalBusyStateHost: DomPortalOutlet | null = null;\n\n    \n    /**\n     * Used to store the previous document body overflow values when scroll locks are added\n     */\n    private readonly _scrollLockSavedOverflowStates: string[] = [];\n    \n\n    /**\n     * Tells if the manager is currently showing a snackbar element or not\n     */\n    private _isShowingSnackBar = false;\n\n\n    /**\n     * Contains a list of the dialogs (MODAL AND NON MODAL) that are currently visible to the user.\n     * Each item in this list is a hash that is computed when dialog is created to uniquely identify it.\n     *\n     * Empty list means no dialogs are currently visible\n     */\n    private _activeDialogs: string[] = [];\n\n\n    /**\n     * Contains a list with all the MatDialog instances that are currently visible to the user.\n     * The list uses the same order as the list of _activeDialogs hash values\n     */\n    private _activeDialogInstances: MatDialogRef<DialogBaseComponent>[] = [];\n\n\n    /**\n     * Counts the number of dialogs that are currently open and that can be closed by the user by navigating with the browser\n     */\n    private _activeCloseableDialogs = 0;\n\n\n    /**\n     * Used to store the initialized Renderer 2 instance that is used by this class\n     */\n    private readonly _renderer: Renderer2;\n\n\n    /**\n     * Method that is used to delete the window beforeunload event listener once not used anymore\n     */\n    private _windowBeforeUnloadUnListen: (() => void) | null = null;\n\n\n    /**\n     * Method that is used to delete the document keydown event listener once not used anymore\n     */\n    private _documentKeydownUnlisten: (() => void) | null = null;\n\n\n    /**\n     * Method that is used to delete the document mousedown event listener once not used anymore\n     */\n    private _documentMousedownUnlisten: (() => void) | null = null;\n\n\n    /**\n     * Method that is used to delete the document pointerdown event listener once not used anymore\n     */\n    private _documentPointerdownUnlisten: (() => void) | null = null;\n\n\n    constructor(rendererFactory: RendererFactory2,\n                private readonly matSnackBar: MatSnackBar,\n                private readonly matDialog: MatDialog,\n                private readonly injector: Injector,\n                private readonly applicationRef: ApplicationRef,\n                private readonly environmentInjector: EnvironmentInjector) {\n\n\t\tsuper(DialogService);\n\n        this._renderer = rendererFactory.createRenderer(null, null);\n    }\n\n\n    /**\n     * Tells if this dialog service is enabled or not. If dialog service is disabled, none of it's features will work\n     * This is used to block all dialog features normally when shutting down the application\n     *\n     * Use with caution. When this is set to false, dialog service stops working.\n     */\n    set isEnabled(v: boolean) {\n\n        if (v === this._isEnabled) {\n\n            return;\n        }\n\n        this._isEnabled = v;\n    }\n\n\n    /**\n     * Enables a warning that will be shown to the user when he/she tries to close the application.\n     * This warning will prompt the user to continue with the exit process or cancel it.\n     * The specific texts of this message are a generic ones and cannot be changed.\n     *\n     * IMPORTANT: This method must be called after the main application has been initialized in order to work,\n     * otherwise it will do nothing.\n     */\n    addCloseApplicationWarning() {\n\n        this._windowBeforeUnloadUnListen ??= this._renderer.listen('window', 'beforeunload', (event) => event.returnValue = true);\n    }\n\n\n    /**\n     * Remove the close application warning message if previously assigned\n     */\n    removeCloseApplicationWarning() {\n\n        if (this._windowBeforeUnloadUnListen !== null) {\n\n            this._windowBeforeUnloadUnListen();\n            this._windowBeforeUnloadUnListen = null;\n        }\n    }\n    \n    \n    /**\n     * Disable application scroll by setting document body overflow to hidden.\n     * Each call to this method must be matched with a call to removeScrollLock() to restore it back to previous state.\n     * If multiple calls to addScrollLock() are done, multiple calls to removeScrollLock() will be required to restore\n     * the original scroll state.\n     */\n    addScrollLock() {\n        this._scrollLockSavedOverflowStates.push(document.body.style.overflow);\n        document.body.style.overflow = 'hidden';\n    }\n    \n    \n    /**\n     * Restore application scroll by restoring document body overflow to the value it had before\n     * the last call to addScrollLock().\n     * Each call to this method will restore one level of scroll lock. If multiple calls to addScrollLock()\n     * were done, multiple calls to removeScrollLock() will be required to restore the original scroll state.\n     */\n    removeScrollLock() {\n        if (this._scrollLockSavedOverflowStates.length > 0) {\n            document.body.style.overflow = this._scrollLockSavedOverflowStates.pop() as string;\n        }      \n    }\n    \n\n    /**\n     * Change the application visual appearance so the user perceives that the application is\n     * currently busy. While modal busy state is enabled, no user input is possible neither via\n     * keyboard, mouse or touch. Use this state when performing server requests or operations that\n     * must block the user interaction with the application. To allow user interaction again, you must\n     * call removeModalBusyState()\n     *\n     * Notice: We can modify the busy state visual component that is shown by this method. To do it, we must\n     * set this.customBusyStateComponentClass property with our own custom busy state component class. (We can do it at\n     * our main application component constructor for example). Our custom component must extend the\n     * BusyStateBaseComponent one to add its own visual appearance.\n     *\n     * @see this.customBusyStateComponentClass\n     */\n    addModalBusyState() {\n\n        if (!this._isEnabled || this._isShowingBusyState) {\n\n            return;\n        }\n\n        this._disableUserInteraction();\n\n        // Dynamically create the busy state component reference if this is the first time\n        if (this._componentPortal === null) {\n\n            this._componentPortal = new ComponentPortal(this.customBusyStateComponentClass);\n\n            // Create a PortalHost with document.body as its anchor element\n            this._modalBusyStateHost = new DomPortalOutlet(\n                    document.body,\n                    this.environmentInjector,\n                    this.applicationRef,\n                    this.injector);\n        }\n\n        (this._modalBusyStateHost as DomPortalOutlet).attach(this._componentPortal);\n\n        this._isShowingBusyState = true;\n    }\n\n\n    /**\n     * Tells if the application is currently locked in a modal busy state (caused by an addModalBusyState() call)\n     */\n    get isShowingBusyState() {\n\n        return this._isShowingBusyState;\n    }\n\n\n    /**\n     * Cancel the application busy state and restore it back to normal so user interaction is allowed again\n     */\n    removeModalBusyState() {\n\n        if (!this._isEnabled || !this._isShowingBusyState) {\n\n            return;\n        }\n\n        if (this._componentPortal !== null) {\n\n            (this._modalBusyStateHost as DomPortalOutlet).detach();\n        }\n\n        this._enableUserInteraction();\n\n        this._isShowingBusyState = false;\n    }\n    \n    \n    /**\n     * TODO - adapt from TS version\n     */\n    addToolTip() {\n\n        // TODO - adapt from TS version\n    }\n\n\n    /**\n     * Show a non modal snackbar notification to the user (Only one snack-bar can ever be opened at the same time).\n     *\n     * Snackbars inform users of a process that an app has performed or will perform. They appear temporarily, towards the bottom or top of the screen.\n     * They shouldn’t interrupt the user experience, and they don’t require user input to disappear.\n     *\n     * @param config A MatSnackBarConfig instance with the customizations we want for this snackbar\n     * @param message The message to show on the snackbar\n     * @param action If not empty, the text to place on the snackbar confirmation button\n     * @param actionCallback A method to execute once the user clicks into the action button.\n     *\n     * @return A promise that will be resolved once the snackbar is closed.\n     */\n    addSnackBar(config: MatSnackBarConfig, message: string, action = '') {\n\n        if (!this._isEnabled) {\n            \n            return Promise.reject(new Error('Dialog service is disabled'));\n        }\n\n        if (this._isShowingSnackBar) {\n            \n            throw new Error('Trying to show a snackbar while another one is still visible');\n        }\n\n        this._isShowingSnackBar = true;\n\n        return new Promise((resolve) => {\n            \n            const snackBarRef = this.matSnackBar.open(message, action === '' ? undefined : action, config);\n\n            // Handle action button click\n            snackBarRef.onAction().pipe(take(1)).subscribe(() => {\n                this._isShowingSnackBar = false;\n                resolve(true);\n            });\n\n            // Handle dismiss\n            snackBarRef.afterDismissed().pipe(take(1)).subscribe(() => {\n                this._isShowingSnackBar = false;\n                resolve(false);\n            });\n        });\n    }\n\n\n    /**\n     * Tells if the application is currently showing a snackbar or not\n     */\n    get isShowingSnackBar() {\n\n        return this._isShowingSnackBar;\n    }\n\n\n    /**\n     * Force the removal of the snack bar dialog if it exists.\n     *\n     * If no snackbar is currently visible, this method will do nothing\n     */\n    removeSnackBar() {\n\n        if (!this._isEnabled || !this._isShowingSnackBar) {\n\n            return;\n        }\n\n        this.matSnackBar.dismiss();\n\n        this._isShowingSnackBar = false;\n    }\n\n\n    /**\n     * Show a dialog with one or more options that can be used to close it. We can use any of the predefined dialog types that are bundled with\n     * this library or extend DialogBaseComponent to create our own custom ones.\n     *\n     * @param dialogComponentClass A class for a component that extends DialogBaseComponent, which will be the dialog that is shown to the user.\n     * @param properties An object containing the different visual and textual options that this dialog allows.\n     *                   IMPORTANT: texts, options and data values need to be read at the dialog component by declaring \"@Inject(MAT_DIALOG_DATA) public data: any\"\n     *                   at the dialog component constructor. This data object will contain the texts, options and data properties\n     *  \n     *            - id: The html unique identifier that the dialog will have once created. If not specified, no id will be explicitly set\n     *            - width: 50% by default. Specify the css value for the default dialog width. As the dialog is responsive, the value will be automatically\n     *              reduced if the available screen is not enough, and will reach the desired value otherwise. We can set any css unit like pixels, \n     *              %, vh, vw, or any other. For example: '400px', '50%', etc.\n     *            - maxWidth: Defines the maximum width that the dialog will have. We can specify it in % or vw, just like is done in\n     *              css. By default it is defined as 96vw, which will fit 96% of the viewport on small devices\n     *            - height: Unset by default. Specify the css value for the dialog height.\n     *            - maxHeight: Defines the maximum height that the dialog will have. We can specify it in % or vh, just like is done in\n     *              css. By default it is defined as 96vh, which will fit 96% of the viewport\n     *            - scrollLock: (False by default) disables the background scroll to prevent the user from scrolling the document body when the dialog is visible \n     *            - modal: (False default) if the dialog can be closed without interaction or true if selecting an option is mandatory to close it\n     *              by the user clicking outside it \n     *            - closeOnNavigation: Tells if the dialog should be closed when the user navigates with the browser. By default is true for non modal and false for modal dialogs.\n     *            - texts: A list with strings containing the dialog texts, sorted by importance. When dialog has a title, this should\n     *              be placed first, subtitle second and so (Each dialog may accept a different custom number of texts).\n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.texts)\n     *            - options: A list of strings that will be used as button captions for each one of the accepted dialog options \n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.options)\n     *            - data: An object to pass any extra data we want to the dialog.\n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.data)\n     *            - viewContainerRef: This is important if we want to propagate providers from a parent component to this dialog. We must specify \n\t *              this reference to make sure the same services injected on the parent are available too at the child dialog \n     * \n     * @return A promise that will be resolved once the dialog is closed.\n     *         The promise will receive a selection object with two properties which will correspond to the index and value from the options \n     *         array that's selected by the user. If no option selected, index will be -1 and value null\n     */\n    addDialog(dialogComponentClass: Type<DialogBaseComponent>,\n              properties: {id?: string,\n                           width?: string,\n                           maxWidth?: string,\n                           height?: string,\n                           maxHeight?: string,\n                           scrollLock?: boolean,\n                           modal?: boolean,\n                           closeOnNavigation?: boolean,\n                           texts?: string[],\n                           options?: string[],\n                           data?: any,\n                           viewContainerRef?: ViewContainerRef}): Promise<{index: number, value?: any}> {\n\n        if (!this._isEnabled) {\n            \n            return Promise.resolve({index: -1});\n        }\n        \n        return new Promise((resolve) => {\n            \n            // Set the default values for non specified properties\n            properties.modal = properties.modal ?? false;\n            properties.closeOnNavigation = properties.closeOnNavigation ?? !properties.modal;\n            properties.texts = properties.texts ?? [];\n            properties.options = properties.options ?? [];\n            properties.data = properties.data ?? {};\n\n            // Generate a string to uniquely identify this dialog on the list of active dialogs\n            // A dialog is considered as unique if the dialog id and texts are exactly the same. We do not take options into consideration\n            // as there may be dialogs with a big amount of options available.\n            let className = (dialogComponentClass as any).DIALOG_CLASS_NAME;\n            \n            if(className === '') {\n                \n                throw new Error(`The static property DIALOG_CLASS_NAME is not defined or is empty for this dialog component (${dialogComponentClass})`);     \n            }\n            \n            const dialogHash = className + properties.texts.join('');\n\n            // identical dialogs won't be allowed at the same time\n            if (this._activeDialogs.includes(dialogHash)) {\n                \n                return resolve({index: -1});\n            }\n\n            let dialogRefConfig:any = {\n                width: properties.width ?? \"50%\",\n                maxWidth: properties.maxWidth ?? \"96vw\",\n                maxHeight: properties.maxHeight ?? \"96vh\",\n                disableClose: properties.modal,\n                autoFocus: false,\n                closeOnNavigation: properties.closeOnNavigation,\n                viewContainerRef: properties.viewContainerRef,\n                data: { texts: properties.texts, options: properties.options, data: properties.data }\n            };                      \n            \n            // Dialog height will only be set if it is specified on properties\n            if(properties.height && properties.height !== undefined) {\n               \n                dialogRefConfig['height'] = properties.height; \n            }\n            \n            const dialogRef = this.matDialog.open(dialogComponentClass, dialogRefConfig);   \n           \n            if (properties.scrollLock) {\n                this.addScrollLock();\n            }\n            \n            // Push a new state to handle browser navigation to close the dialog\n            if(properties.closeOnNavigation && this._activeCloseableDialogs === 0){\n                \n                history.pushState({ dialogOpen: true }, '');\n            }\n            \n\t\t\t// Assign the dialog ID only if specifically set on properties\n            if(properties.id && properties.id !== undefined) {\n                \n                dialogRef.id = properties.id;\n            }\n            \n            this._activeDialogs.push(dialogHash);\n            this._activeDialogInstances.push(dialogRef);\n            \n            if(properties.closeOnNavigation) {\n                \n                this._activeCloseableDialogs += 1;\n            }\n\n            dialogRef.beforeClosed().pipe(take(1)).subscribe((selection: {index: number, value?: any}) => {\n\n                if (properties.scrollLock) {\n                    this.removeScrollLock();\n                }\n                \n                this._activeDialogs = ArrayUtils.removeElement(this._activeDialogs, dialogHash);\n                this._activeDialogInstances = ArrayUtils.removeElement(this._activeDialogInstances, dialogRef);\n\n                if(properties.closeOnNavigation) {\n                    \n                    // Remove dialog state from browser history\n                    if (this._activeCloseableDialogs === 1 && window.history.state?.dialogOpen) {\n                        \n                        history.back();\n                    }\n                    \n                    this._activeCloseableDialogs -= 1;\n                }\n                \n                if(!properties.modal && selection === undefined) {\n                    \n                    selection = { index: -1 };\n                    \n                } else if (!NumericUtils.isInteger(selection.index)) {\n                    \n                    throw new TypeError(`closeDialog() expects index to be an integer`);               \n                }\n\n                if(selection.index >= 0 && selection.value === null) {\n                    \n                    selection.value = properties.options![selection.index];\n                }\n\n                resolve(selection);\n            });\n        });\n    }\n\n\n    /**\n     * Shows a native OS file browser dialog to let the user select a single file from their local file system.\n     *\n     * @param options An object containing options for the file browser dialog:\n     *   - accept: A string that defines the file types the file input should accept. For example: '.csv,.xlsx', 'image/*', '.pdf', 'image/jpeg, image/png'.\n     *   - maxFileSize: (Optional) The maximum file size in bytes allowed for the selected file. If the selected file exceeds this size, the promise will be rejected with an error\n     *   - loadData: (Optional) Defines how the file content should be read and returned.\n     *             'no' (default): Returns the raw File object without its data.\n     *             'ArrayBuffer': Returns the File object with its content read as a raw binary `ArrayBuffer` in the `data` property.\n     *             'text': Returns the File object with its content read as a text string in the `data` property.\n     *             'base64': Returns the File object with its content read as a Base64 encoded string in the `data` property.\n     *\n     * @returns A Promise that resolves with the selected `File` object (which may have an added `data` property), or `null` if the user cancels the dialog.\n     *          The promise will be rejected with an Error if the selected file exceeds the specified size limits.\n     */\n    async addFileBrowserDialog(options: {accept: string,\n                                         maxFileSize?: number,\n                                         loadData?: 'no' | 'ArrayBuffer' | 'text' | 'base64'}): Promise<FileWithData | null> {\n\n        const files = await this._addFileBrowserDialogInternal({\n            multiple: false,\n            accept: options.accept,\n            maxFileSize: options.maxFileSize,\n            loadData: options.loadData});\n\n        return files ? files[0] : null;\n    }\n\n\n    /**\n     * Shows a native OS file browser dialog to let the user select one or more files from their local file system.\n     *\n     * @param options An object containing options for the file browser dialog:\n     *   - accept: A string that defines the file types the file input should accept. For example: '.csv,.xlsx', 'image/*', '.pdf', 'image/jpeg, image/png'.\n     *   - maxFileSize: (Optional) The maximum file size in bytes allowed for any single selected file. If a selected file exceeds this size, the promise will be rejected with an error.\n     *   - maxTotalSize: (Optional) The maximum total size in bytes for all selected files combined. If the total size of all files exceeds this limit, the promise will be rejected with an error.\n     *   - loadData: (Optional) Defines how the file content should be read and returned.\n     *             'no' (default): Returns an array of `File` objects without their data.\n     *             'ArrayBuffer': Returns an array of `File` objects, each with its content read as a raw binary `ArrayBuffer` in the `data` property.\n     *             'text': Returns an array of `File` objects, each with its content read as a text string in the `data` property.\n     *             'base64': Returns an array of `File` objects, each with its content read as a Base64 encoded string in the `data` property.\n     *\n     * @returns A Promise that resolves with an array of `File` objects (which may have an added `data` property), or `null` if the user cancels the dialog.\n     *          The promise will be rejected with an Error if the selected files exceed the specified size limits.\n     */\n    addFilesBrowserDialog(options: {accept: string,\n                                    maxFileSize?: number,\n                                    maxTotalSize?: number,\n                                    loadData?: 'no' | 'ArrayBuffer' | 'text' | 'base64'}): Promise<FileWithData[] | null> {\n\n        return this._addFileBrowserDialogInternal({\n            multiple: true,\n            accept: options.accept,\n            maxFileSize: options.maxFileSize,\n            maxTotalSize: options.maxTotalSize,\n            loadData: options.loadData});\n    }\n\n\n    /**\n     * Auxiliary method that combines the logic for addFileBrowserDialog and addFilesBrowserDialog\n     */\n    private async _addFileBrowserDialogInternal(options: {multiple: boolean,\n                                                          accept: string,\n                                                          maxFileSize?: number,\n                                                          maxTotalSize?: number,\n                                                          loadData?: 'no'|'ArrayBuffer'|'text'|'base64'}): Promise<FileWithData[] | null> {\n\n        if (!this._isEnabled) {\n\n            return null;\n        }\n\n        // Create a hidden input element to show the file browser dialog\n        const hiddenInput = this._renderer.createElement('input');\n        this._renderer.setAttribute(hiddenInput, 'type', 'file');\n        this._renderer.setAttribute(hiddenInput, 'accept', options.accept);\n        this._renderer.setAttribute(hiddenInput, 'id', 'turbogui-file-browser-input-hidden-dialog');\n\n        if (options.multiple) {\n\n            this._renderer.setAttribute(hiddenInput, 'multiple', 'true');\n        }\n\n        this._renderer.setStyle(hiddenInput, 'display', 'none');\n        this._renderer.appendChild(document.body, hiddenInput);\n\n        try {\n\n            const filesBrowserPromise = new Promise<File[] | null>((resolve) => {\n\n                let resolved = false;\n                \n                const resolveOnce = (files: File[] | null) => {\n                    if (!resolved) {\n                        resolved = true;\n                        window.removeEventListener('focus', onUserInteraction, true);\n                        document.removeEventListener('keydown', onUserInteraction, true);\n                        document.removeEventListener('mousedown', onUserInteraction, true);\n                        document.removeEventListener('pointerdown', onUserInteraction, true);\n                        document.removeEventListener('mousemove', onUserInteraction, true);\n                        document.removeEventListener('scroll', onUserInteraction, true);\n                        hiddenInput.removeEventListener('change', onChange);\n                        resolve(files);\n                    }\n                };\n                \n                // Detect any user activity that may indicate the user has cancelled the file selection\n                // Use a short timeout to allow the 'change' event to fire first if files were selected\n                const onUserInteraction = () => {\n                    setTimeout(() => resolveOnce(null), 800);\n                };\n\n                // Detect when files are selected by the user\n                const onChange = (event: Event) => {\n                    const fileList = (event.target as HTMLInputElement).files;\n                    resolveOnce(fileList ? Array.from(fileList) : null);\n                };\n\n                window.addEventListener('focus', onUserInteraction, true);\n                document.addEventListener('keydown', onUserInteraction, true);\n                document.addEventListener('mousedown', onUserInteraction, true);\n                document.addEventListener('pointerdown', onUserInteraction, true);\n                document.addEventListener('mousemove', onUserInteraction, true);\n                document.addEventListener('scroll', onUserInteraction, true);\n                hiddenInput.addEventListener('change', onChange, { once: true });\n\n                hiddenInput.click();\n            });\n\n            const files = await filesBrowserPromise;\n\n            if (!files || files.length === 0) {\n\n                return null;\n            }\n\n            let totalSize = 0;\n            for (const file of files) {\n\n                if (options.maxFileSize !== undefined && file.size > options.maxFileSize) {\n\n                    throw new Error(`Max file size exceeded: \"${file.name}\" exceeds ${options.maxFileSize} bytes`);\n                }\n\n                totalSize += file.size;\n            }\n\n            if (options.maxTotalSize !== undefined && totalSize > options.maxTotalSize) {\n\n                throw new Error(`Max total size exceeded: ${options.maxTotalSize} bytes`);\n            }\n\n            if (!options.loadData || options.loadData === 'no') {\n\n                return files;\n            }\n\n            // Load file data in the specified format if loadData is set\n            const fileReadPromises = files.map(async (file: FileWithData) => {\n\n                switch (options.loadData) {\n                    case 'ArrayBuffer':\n                        file.data = await file.arrayBuffer();\n                        break;\n\n                    case 'text':\n                        file.data = await file.text();\n                        break;\n\n                    case 'base64':\n                        file.data = await new Promise((resolve, reject) => {\n                            const reader = new FileReader();\n                            reader.onload = () => resolve((reader.result as string).split(',')[1]);\n                            reader.onerror = () => reject(reader.error ?? new Error('Unknown FileReader error'));\n                            reader.readAsDataURL(file);\n                        });\n                        break;\n                }\n\n                return file;\n            });\n\n            return await Promise.all(fileReadPromises);\n\n        } finally {\n\n            this._renderer.removeChild(document.body, hiddenInput);\n        }\n    }\n\n\n    /**\n     * Show a native OS file download dialog to let the user download a file from a provided binary blob data.\n     * \n     * @param blob The binary data containing the file to download. It must be a Blob object\n     * @param fileName The file name to be shown in the download dialog\n     * \n     * @returns void\n     */\n    addFileDownloadBlobDialog(blob:Blob, fileName:string){\n        \n        if (this._isEnabled) {\n\n            const safeFileName = fileName\n                .replace(/[\\/\\\\:*?\"<>|\\s]/g, '-')  // Replace invalid chars and spaces with -\n                .replace(/\\.+/g, '.')             // Replace multiple dots with single dot\n                .replace(/\\.([^.]+)$/, '.$1');    // Ensure only one dot before extension\n                \n            const url = window.URL.createObjectURL(blob);\n            const a = document.createElement('a');\n            \n            a.href = url;\n            a.download = safeFileName;\n            document.body.appendChild(a);\n            a.click();\n            a.remove();\n        }      \n    }\n    \n    \n    /**\n     * Show a dialog with an iframe inside it, to show external web pages or web applications.\n     * \n     * This method is a shortcut for addDialog() method using DialogIFrameComponent as the dialog component class\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - url (mandatory): The url to load in the iframe\n     *            - title: The title to show at the top of the dialog\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     *\n     * @returns A Promise that resolves once the user closes the dialog \n     */\n    async addIFrameDialog(properties: {url:string,\n                                       title?:string,\n                                       id?: string,\n                                       width?: string,\n                                       maxWidth?: string,\n                                       height?: string,\n                                       maxHeight?: string,\n                                       scrollLock?: boolean,\n                                       modal?: boolean}): Promise<null> {\n        \n        if (this._isEnabled) {\n                    \n            await this.addDialog(DialogIFrameComponent, {\n                id: properties.id ?? undefined,\n                data: properties.url,\n                texts: properties.title ? [properties.title] : undefined,\n                width: properties.width ?? \"85vw\",\n                maxWidth: properties.maxWidth ?? \"1200px\",\n                height: properties.height ?? \"98vh\",\n                maxHeight: properties.maxHeight ?? \"3000px\",\n                scrollLock: properties.scrollLock ?? false,\n                modal: properties.modal ?? false\n            });\n        }\n         \n        return null;\n    }\n    \n    \n    /**\n     * Show a dialog with an image inside it, to load image files from a url.\n     * \n     * This method is a shortcut for addDialog() method using DialogImageComponent as the dialog component class\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - url (mandatory): The url to load in the image\n     *            - title: The title to show at the top of the dialog\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     * \n     * @returns A Promise that resolves once the user closes the dialog \n     */\n    async addImageDialog(properties: {url:string,\n                                      title?:string,\n                                      id?: string,\n                                      width?: string,\n                                      maxWidth?: string,\n                                      height?: string,\n                                      maxHeight?: string,\n                                      scrollLock?: boolean,\n                                      modal?: boolean}): Promise<null> {\n                                        \n        if (this._isEnabled) {\n                           \n            await this.addDialog(DialogImageComponent, {\n                id: properties.id ?? undefined,\n                data: properties.url,\n                texts: properties.title ? [properties.title] : undefined,\n                width: properties.width ?? \"85vw\",\n                maxWidth: properties.maxWidth ?? \"1200px\",\n                height: properties.height ?? \"98vh\",\n                maxHeight: properties.maxHeight ?? \"3000px\",\n                scrollLock: properties.scrollLock ?? false,\n                modal: properties.modal ?? false\n            });\n        }\n    \n        return null;\n    }\n    \n    \n    /**\n     * Show a dialog with a pdf from a binary blob data.\n     * \n     * This method is a shortcut for addDialog() method using DialogBlobComponent as the dialog component class, using the received blob\n     * data with a mime type of 'application/pdf'\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - blob (mandatory): The binary data containing the pdf file to show. It can be a Blob, an ArrayBuffer or a raw binary string\n     *            - title: The title to show at the top of the dialog\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     * \n     * @returns A Promise that resolves once the user closes the dialog \n     */\n    async addPdfDialog(properties: {blob:any,\n                                    title?:string,\n                                    id?: string,\n                                    width?: string,\n                                    maxWidth?: string,\n                                    height?: string,\n                                    maxHeight?: string,\n                                    scrollLock?: boolean,\n                                    modal?: boolean}): Promise<null> {\n        \n        if (this._isEnabled) {\n            \n            await this.addDialog(DialogBlobComponent, {\n                id: properties.id ?? undefined,\n                data: { blob: properties.blob, mimeType: 'application/pdf' },\n                texts: properties.title ? [properties.title] : undefined,\n                width: properties.width ?? \"85vw\",\n                maxWidth: properties.maxWidth ?? \"1200px\",\n                height: properties.height ?? \"98vh\",\n                maxHeight: properties.maxHeight ?? \"3000px\",\n                scrollLock: properties.scrollLock ?? false,\n                modal: properties.modal ?? false\n            });\n        }\n\n        return null;\n    }\n    \n    \n    /**\n     * Show a dialog with a calendar to let the user pick a date.\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     *            - title: The title to show at the top of the dialog\n     *            - viewContainerRef: MANDATORY! or the component won't render. see addDialog() docs\n     * \n     * @returns A Promise that resolves to a Date() object selected by the user or null if no selection was made \n     */\n    async addDateSelectionDialog(properties: {id?: string,\n                                              width?: string,\n                                              maxWidth?: string,\n                                              height?: string,\n                                              maxHeight?: string,\n                                              scrollLock?: boolean,\n                                              modal?: boolean,\n                                              title?: string,\n                           \t\t\t          viewContainerRef: ViewContainerRef}): Promise<Date|null> {\n\n        if (!this._isEnabled) {\n            \n            return null;\n        }\n\n        const selection = await this.addDialog(DialogDateSelectionComponent, {\n            id: properties.id ?? undefined,\n            width: properties.width ?? \"50%\",\n            maxWidth: properties.maxWidth ?? \"96vw\",\n            height: properties.height ?? \"auto\",\n            maxHeight: properties.maxHeight ?? \"92vw\",\n            scrollLock: properties.scrollLock ?? false,\n            modal: properties.modal ?? false,\n            texts: [properties.title ?? ''],\n            viewContainerRef: properties.viewContainerRef\n        });\n\n        return selection.index === -1 ? null : (selection.value as Date);\n    }\n    \n    \n    /**\n     * Show a dialog with an error message and a single option button to close it.\n     * \n     * This method is a shortcut for addDialog() method using DialogErrorComponent as the dialog component class\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - title (mandatory): The dialog title\n     *            - option (mandatory): The text to place on the single option button\n     *            - description: An optional description text to show below the title\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     *            - dialogClass: A custom component class to use instead of the default DialogErrorComponent.\n     *              This custom class must extend DialogErrorComponent\n     * \n     * @returns A Promise that resolves once the user selects the button with the option caption \n     */\n    async addErrorDialog(properties: {title:string,\n                                      option: string,\n                                      description?: string,\n                                      id?: string,\n                                      width?: string,\n                                      maxWidth?: string,\n                                      height?: string,\n                                      maxHeight?: string,\n                                      scrollLock?: boolean,\n                                      modal?: boolean,\n                                      dialogClass?:Type<DialogErrorComponent>}): Promise<null> {\n\n        if (this._isEnabled) {\n            \n            let texts = [properties.title];\n            \n            if(properties.description && properties.description !== undefined) {\n                \n                texts.push(properties.description); \n            }\n            \n            await this.addDialog(properties.dialogClass ?? DialogErrorComponent, {\n                id: properties.id ?? undefined,\n                width: properties.width ?? \"70%\",\n                maxWidth: properties.maxWidth ?? \"500px\",\n                height: properties.height ?? \"auto\",\n                maxHeight: properties.maxHeight ?? \"92vw\",\n                scrollLock: properties.scrollLock ?? false,\n                modal: properties.modal ?? false,\n                texts: texts,\n                options: [properties.option]\n            });\n        }\n        \n        return null;\n    }\n    \n    \n    /**\n     * Show a dialog with a message and a single option button to close it.\n     * \n     * This method is a shortcut for addDialog() method using DialogSingleOptionComponent as the dialog component class\n     *\n     * @param properties An object containing the different visual and textual options that this dialog allows:\n     *            - title (mandatory): The dialog title\n     *            - option (mandatory): The text to place on the single option button\n     *            - description: An optional description text to show below the title\n     *            - id: see addDialog() docs\n     *            - width: see addDialog() docs\n     *            - maxWidth: see addDialog() docs\n     *            - height: see addDialog() docs\n     *            - maxHeight: see addDialog() docs\n     *            - scrollLock: addDialog() docs\n     *            - modal: see addDialog() docs\n     *            - dialogClass: A custom component class to use instead of the default DialogSingleOptionComponent.\n     *              This custom class must extend DialogSingleOptionComponent\n     * \n     * @returns A Promise that resolves once the user selects the button with the option caption \n     */\n    async addMessageDialog(properties: {title:string,\n                                        option: string,\n                                        description?: string,\n                                        id?: string,\n                                        width?: string,\n                                        maxWidth?: string,\n                                        height?: string,\n                                        maxHeight?: string,\n                                        scrollLock?: boolean,\n                                        modal?: boolean,\n                                        dialogClass?:Type<DialogSingleOptionComponent>}): Promise<null> {\n    \n        properties.dialogClass ??= DialogSingleOptionComponent;   \n                         \n        return this.addErrorDialog(properties);\n    }\n        \n    \n    /**\n     * Force the removal of all the dialogs that are currently visible.\n     *\n     * If no dialogs are currently visible, this method will do nothing\n     */\n    removeAllDialogs() {\n\n        if (!this._isEnabled) {\n\n            return;\n        }\n\n        for (const dialogRef of this._activeDialogInstances) {\n\n            dialogRef.close({index:-1});\n        }\n        \n        this._activeDialogs = [];\n        this._activeDialogInstances = [];\n        this._activeCloseableDialogs = 0;\n    }\n\n\n    /**\n     * TODO - translate from TS version\n     */\n//    addSideNav(){\n//\n//    }\n\n\n    /**\n     * TODO - translate from TS version\n     */\n//    get isShowingSideNav(){\n//\n//    }\n\n\n    /**\n     * TODO - translate from TS version\n     */\n//    removeSideNav(){\n//\n//    }\n\n    /**\n     * Block all the user interactions with the application (keyboard, touch, mouse, ...)\n     */\n    private _disableUserInteraction() {\n\n        this._documentKeydownUnlisten ??= this._renderer.listen('document', 'keydown', (event) => event.preventDefault());\n\n        this._documentMousedownUnlisten ??= this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());\n\n        this._documentPointerdownUnlisten ??= this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());\n    }\n\n\n    /**\n     * Restore the user interactions that were previously disabled with _disableUserInteraction method\n     */\n    private _enableUserInteraction() {\n\n        if (this._documentKeydownUnlisten !== null) {\n\n            this._documentKeydownUnlisten();\n            this._documentKeydownUnlisten = null;\n        }\n\n        if (this._documentMousedownUnlisten !== null) {\n\n            this._documentMousedownUnlisten();\n            this._documentMousedownUnlisten = null;\n        }\n\n        if (this._documentPointerdownUnlisten !== null) {\n\n            this._documentPointerdownUnlisten();\n            this._documentPointerdownUnlisten = null;\n        }\n    }\n}\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { HTTPManager, HTTPManagerBaseRequest, StringUtils } from 'turbocommons-ts';\r\nimport { DialogService } from './dialog.service';\r\nimport { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';\r\n\r\n\r\n/**\r\n * Manages application http communications\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class HTTPService extends HTTPManager {\r\n    \r\n    \r\n    constructor(public dialogService: DialogService) {\r\n\r\n        super(true);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * The same method as HTTPManager.execute but with the ability to enable several options which are specific to this service:\r\n     *\r\n     * - options:\r\n     *     busyState: Set it to false to prevent the default behaviour of locking the UI while the request is running\r\n     *     handleErrors: Set it to false to prevent the default behaviour of showing a detailed error dialog when a request fails\r\n     *\r\n     * @see HTTPManager.execute()\r\n     */\r\n    execute(requests: string|string[]|HTTPManagerBaseRequest|HTTPManagerBaseRequest[],\r\n            finishedCallback: ((results: {url:string, response:any, isError:boolean, errorMsg:string, code:number}[], anyError:boolean) => void) | null = null,\r\n            progressCallback: null | ((completedUrl: string, totalRequests: number) => void) = null,\r\n            options: {busyState?:boolean, handleErrors?:boolean} = {}){\r\n    \r\n        // Set the default values for non specified properties\r\n        options.busyState = options.busyState ?? true;\r\n        options.handleErrors = options.handleErrors ?? true;\r\n        \r\n        if(options.busyState){\r\n           \r\n           this.dialogService.addModalBusyState(); \r\n        }\r\n    \r\n        super.execute(requests, (results, anyError) => { \r\n            \r\n            if(options.busyState){\r\n                \r\n                this.dialogService.removeModalBusyState();\r\n            }\r\n            \r\n            if(options.handleErrors && anyError){\r\n                \r\n                for(let result of results){\r\n                    \r\n                    if(result.isError){\r\n                        \r\n                        let errorMsg = result.errorMsg + '\\n\\n' + result.response;\r\n                        \r\n                        if(StringUtils.isEmpty(errorMsg)){\r\n                        \r\n                            errorMsg = 'Unknown error. Make sure Internet connection is available';    \r\n                        }\r\n                \r\n                        this.dialogService.addDialog(DialogErrorComponent,\r\n                            {\r\n                                width:'50vw',\r\n                                texts: ['Error: ' + result.code, errorMsg],\r\n                                options: ['Ok']\r\n                            });        \r\n                    }\r\n                }\r\n            }\r\n            \r\n            if(finishedCallback !== null){\r\n                \r\n                finishedCallback(results, anyError);\r\n            }\r\n            \r\n         }, progressCallback);\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n\r\nimport { HTTPManagerGetRequest } from 'turbocommons-ts';\r\n\r\n\r\n/**\r\n * Class that defines a GET http request, to be used by HttpService\r\n */\r\nexport class HTTPServiceGetRequest extends HTTPManagerGetRequest {\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n\r\nimport { HTTPManagerPostRequest } from 'turbocommons-ts';\r\n\r\n\r\n/**\r\n * Class that defines a POST http request, to be used by HttpService\r\n */\r\nexport class HTTPServicePostRequest extends HTTPManagerPostRequest {\r\n}\r\n\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { BrowserManager } from 'turbocommons-ts';\r\nimport { Location, PopStateEvent } from '@angular/common';\r\n\r\n\r\n/**\r\n * An abstraction of the browser entity an all its related operations and properties\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class BrowserService extends BrowserManager {\r\n\r\n\r\n    constructor(private readonly location: Location) {\r\n\r\n        super();\r\n    }\r\n\r\n\r\n    /**\r\n     * Modify the current browser URI without reloading the current page document\r\n     *\r\n     * @param path The uri value we want to set\r\n     * @param query The query url parameters part we want to specify if any\r\n     *\r\n     * @returns void\r\n     */\r\n    setCurrentUrlURI(path: string, query?: string | undefined){\r\n\r\n        this.location.go(path, query);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Obtain a subscription to get notified on any changes at the browser url\r\n     *\r\n     * @param onNext A method to be executed every time the url changes on the browser. The url will be available inside the value parameter\r\n     *\r\n     * @returns Subscribed events. Make sure to unsubscribe when not needed\r\n     */\r\n    subscribeToUrlChange(onNext: (value: PopStateEvent) => void){\r\n        \r\n        return this.location.subscribe(onNext);\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { DialogService } from './dialog.service';\r\nimport { ConversionUtils, HTTPManager, HTTPManagerPostRequest, StringUtils } from 'turbocommons-ts';\r\nimport { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';\r\nimport { BrowserService } from './browser.service';\r\n\r\n\r\n/**\r\n * Allows us to easily perform requests to a remote API that is developed with Turbo framework.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport abstract class TurboApiService {\r\n    \r\n\r\n    /**\r\n     * URI Path to the web service that performs the user login\r\n     */\r\n    loginServiceURI = 'users/login';\r\n    \r\n    \r\n    /**\r\n     * URI Path to the web service that allows us to create extra user tokens\r\n     */\r\n    tokenCreationServiceURI = 'users/user-token-create';\r\n    \r\n    \r\n    /**\r\n     * URI Path to the web service that performs the user log out\r\n     */\r\n    logOutServiceURI = 'users/logout';\r\n    \r\n    \r\n    /**\r\n     * URI Path to the web service that performs the verification for a user email\r\n     */\r\n    mailVerifyServiceURI = 'users/user-mail-verify';\r\n\r\n\r\n    /**\r\n     * The username that is currently defined and will be used by the login methods\r\n     */\r\n    private _userName = '';\r\n\r\n\r\n    /**\r\n     * The password for the user that is currently defined and will be used by the login methods\r\n     */\r\n    private _password = '';\r\n    \r\n    \r\n    /**\r\n     * Contains the last email account that has been verified (or tried to verify) by this service, if any\r\n     */\r\n    private _lastVerifiedMail = '';\r\n\r\n\r\n    /**\r\n     * Check public getter for docs\r\n     */\r\n    private _isLogged = false;\r\n\r\n\r\n    /**\r\n     * @see token() getter for more info\r\n     */\r\n    private _token = '';\r\n    \r\n    \r\n    /**\r\n     * List of operations that are allowed to the currently loged user. It gets filled just after login is performed\r\n     */\r\n    private _operations:string[] = [];\r\n    \r\n    \r\n    /**\r\n     * Private http manager instance that will be exclusive to this turbo api caller service.\r\n     */\r\n    private readonly httpManager: HTTPManager;\r\n    \r\n    \r\n    constructor(private readonly dialogService: DialogService, \r\n                private readonly browserService: BrowserService) {\r\n        \r\n        // Create a fresh instance of the http service so we can use it independently\r\n        this.httpManager = new HTTPManager();\r\n        this._clearUserAndToken();\r\n    }\r\n    \r\n    \r\n    /** \r\n     * The username that is currently defined and will be used by the login methods\r\n     */\r\n    set userName(v:string){\r\n\r\n        this._isLogged = false;\r\n        this._token = '';\r\n        this._userName = v;\r\n    }\r\n    \r\n    \r\n    /** \r\n     * The username that is currently defined and will be used by the login methods\r\n     */\r\n    get userName(){\r\n        \r\n        return this._userName;\r\n    }\r\n    \r\n    \r\n    /** \r\n     * The password for the user that is currently defined and will be used by the login methods\r\n     */\r\n    set password(v:string){\r\n\r\n        this._isLogged = false;\r\n        this._token = '';\r\n        this._password = v;\r\n    }\r\n    \r\n    \r\n    /** \r\n     * The password for the user that is currently defined and will be used by the login methods\r\n     */\r\n    get password(){\r\n        \r\n        return this._password;\r\n    }\r\n    \r\n\r\n    /** \r\n     * Define the root url that will be used for all the API calls\r\n     */\r\n    set baseUrl(url:string){\r\n        \r\n        this.httpManager.baseUrl = url;\r\n    }\r\n    \r\n    \r\n    /** \r\n     * Define the root url that will be used for all the API calls\r\n     */\r\n    get baseUrl(){\r\n        \r\n        return this.httpManager.baseUrl;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user or password\r\n     * values, this method will parse and automatically set them as the credentials to use.\r\n     * \r\n     * The URL hash is not altered in any way by this method.\r\n     *\r\n     * @returns True if any credentials were found and loaded, false if nothing happened\r\n     */\r\n    loadCredentialsFromURLHashFragment() {\r\n    \r\n        // If the hash fragment is empty, nothing to do\r\n        if(!this.browserService.isCurrentUrlWithHashFragment()){\r\n           \r\n           return false;\r\n        }\r\n       \r\n        let valuesFound = false;\r\n       \r\n        // Split the hash fragment to obtain the different values that contains\r\n        let hashData = this.browserService.getCurrentUrlHashFragment().split('/');\r\n       \r\n        // User name is the first element of the hash fragment. If we found a value, \r\n        // we will fill it automatically\r\n        if(hashData.length > 0){\r\n           \r\n            valuesFound = true;\r\n            this.userName = ConversionUtils.base64ToString(hashData[0]);\r\n        }\r\n       \r\n        // Auto fill the password if it is received\r\n        if(hashData.length > 3){\r\n        \r\n            valuesFound = true;\r\n            this.password = ConversionUtils.base64ToString(hashData[3]);\r\n        }\r\n       \r\n        return valuesFound;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user, mail and\r\n     * has verification code values, this method will perform the request to server to verify that email account for the user.\r\n     * \r\n     * The URI path to the mail verification service must be correctly defined at this.mailVerifyServiceURI property.\r\n     *\r\n     * @returns A promise that resolves with the server response if the verification is successful,\r\n     *          or rejects with an error if the verification fails. Response will have 4 possible values:\r\n     *               undefined - meaning that the URL hash fragment didn't contain valid verification values\r\n     *              -1 - meaning verification failed\r\n     *               0 - meaning verification succeeded\r\n     *               1 - meaning the email was already previouly verified\r\n     */\r\n    verifyUserMailFromURLHashFragment() {\r\n\r\n        // If the hash fragment is empty, nothing to do\r\n        if(this.browserService.isCurrentUrlWithHashFragment()){\r\n                   \r\n            let hashData = this.browserService.getCurrentUrlHashFragment().split('/');\r\n                    \r\n            if(hashData.length >= 3){\r\n                        \r\n                // Call for the user mail verification if user, mail and hash are received\r\n                let user = ConversionUtils.base64ToString(hashData[0]);\r\n                let mail = ConversionUtils.base64ToString(hashData[1]);\r\n                let hash = ConversionUtils.base64ToString(hashData[2]);\r\n                        \r\n                if(!StringUtils.isEmpty(user) && !StringUtils.isEmpty(mail) && !StringUtils.isEmpty(hash)){\r\n                    \r\n                    this._lastVerifiedMail = mail;\r\n                    \r\n                    return this.call(this.mailVerifyServiceURI, {userName: user, mail: mail, hash: hash});\r\n                }\r\n            }\r\n        }\r\n        \r\n        return Promise.resolve(undefined);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Obtain the lat user mail account that has been verified (or attempted to verify) by this service.\r\n     */\r\n    getLastVerifiedMail(){\r\n\r\n        return this._lastVerifiedMail;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Authenticates the userName and password that are currently defined at the respective properties of this service.\r\n     * Returns a promise that resolves with the server's response or rejects with an error if the login fails.\r\n     * Path to the login service must be correctly defined at this.loginWebService\r\n     * \r\n     * The authentication process is performed by sending an encoded credentials request to the login web service using the \r\n     * currently defined user name and psw.\r\n     *\r\n     * Here's an example of a call:\r\n     * \r\n     *  login().then(response => {\r\n     *     console.log('Login successful:', response);\r\n     *  }).catch(() => {\r\n     *     console.error('Login failed:');\r\n     *  });\r\n     * \r\n     * @returns A promise that resolves with the server response if the login is successful,\r\n     *          or rejects with an error if the login fails.\r\n     */\r\n    login() {\r\n        \r\n        this.dialogService.addModalBusyState(); \r\n        \r\n        return new Promise((resolve:(r:any) => any, reject) => {\r\n        \r\n            const request = new HTTPManagerPostRequest(this.loginServiceURI);\r\n                    \r\n            request.ignoreGlobalPostParams = true;\r\n               \r\n            const encodedCredentials = ConversionUtils.stringToBase64(\r\n                ConversionUtils.stringToBase64(this._userName) + ',' + ConversionUtils.stringToBase64(this._password));\r\n    \r\n            request.parameters = { data: encodedCredentials };\r\n            \r\n            request.successCallback = (response) => {\r\n            \r\n                if (response !== '') {\r\n        \r\n                    response = JSON.parse(response);            \r\n        \r\n                    this._isLogged = true;\r\n                    this._token = response.token;\r\n                    this._operations = response.operations;\r\n                    this.httpManager.setGlobalPostParam('token', response.token);\r\n        \r\n                    resolve(response);\r\n                    \r\n                } else {\r\n        \r\n                    this._clearUserAndToken();\r\n        \r\n                    reject(new Error());\r\n                }\r\n            };\r\n            \r\n            request.errorCallback = () => {\r\n\r\n                this._clearUserAndToken();\r\n                \r\n                reject(new Error());               \r\n            };\r\n            \r\n            request.finallyCallback = () => {\r\n               \r\n               this.dialogService.removeModalBusyState();\r\n            };\r\n        \r\n            this.httpManager.execute(request);\r\n        }); \r\n    }\r\n    \r\n    \r\n    /**\r\n     * Perform a request to the API service to create a new token for the user that is currently logged in.\r\n     * \r\n     * @param options The parameters that will affect the token behaviour. To learn more about each option, please\r\n     *        refer to the turbodepot UsersManager class createToken method documentation\r\n     * \r\n     * @returns A promise that resolves with the created token string if the request is successful, or rejects \r\n     *          with an error (containing all the error response details) if the request fails.\r\n     */\r\n    createUserToken(options: {lifeTime?:number, useCount?:number, isLifeTimeRecycled?:boolean}) {\r\n        \r\n        return this.call(this.tokenCreationServiceURI, {options: options}, {resultFormat: 'STRING'});\r\n    }\r\n    \r\n\r\n    /**\r\n     * Checks if the user and password credentials are filled and not empty.\r\n     * If any of the two values is empty, false will be returned\r\n     */\r\n    get isUserAndPswDefined(): boolean  {\r\n\r\n        return !StringUtils.isEmpty(this._userName) && !StringUtils.isEmpty(this._password);\r\n    }\r\n\r\n\r\n    /**\r\n     * Tells if the user name and psw that are specified on this service are currently logged or not. This means\r\n     * also a token is active.\r\n     */\r\n    get isLogged(): boolean {\r\n\r\n        return this._isLogged;\r\n    }\r\n\r\n\r\n    /**\r\n     * Gives the value for the currently active user authentication token or an empty string if no user logged\r\n     */\r\n    get token() {\r\n\r\n        return this._token;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Checks if the currently logged user is allowed to perform the specified operation.\r\n     * This will check the user permisions as defined on server side and return true if the operation is allowed\r\n     * or false if not. We can then decide what to do (hide an app section, block a button, etc)\r\n     * \r\n     * @param operation The name of the operation to check \r\n     * \r\n     * @returns True if the operation is allowed, false otherwise \r\n     */\r\n    isUserAllowedTo(operation:string): boolean {\r\n    \r\n        return this._operations.includes(operation);\r\n    }\r\n        \r\n    \r\n    /**\r\n     * Performs a standard request to an API service and returns a promise that resolves with the response data.\r\n     * \r\n     * Following is an example of a call:\r\n     * \r\n     *     this.apiService.call('users/user-create', this.userData, {handleErrors: false}).then(response => {\r\n     *          \r\n     *          console.log('Success:', response);\r\n     *          \r\n     *      }).catch(error => {\r\n     *          \r\n     *          console.error('Error:', error.message);\r\n     *      });\r\n     *\r\n     * @param apiPath - A relative URL (based on the defined base root url) that defines the path to the service to call.\r\n     *        For example: 'users/login'\r\n     * @param parameters - An object containing key-value pairs that are sent as the request body.\r\n     *        token parameter is not necessary, it is automatically appended\r\n     * @param options An object defining several options for the request:\r\n     *        resultFormat: 'JSON' by default. The expected format of the response. \r\n     *        busyState: Enabled by default. Enables or disables the busy state to lock user interaction while performing the http calls.\r\n     *        handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.\r\n     *        If set to false, the promise will generate a reject error that must be handled by our code.\r\n     *       \r\n     * @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects \r\n     *          with an error (containing all the error response details) if the request fails.\r\n     */\r\n    call(apiPath:string, parameters = {}, options: {resultFormat?:'STRING'|'JSON', busyState?:boolean, handleErrors?:boolean} = {}){\r\n    \r\n        // Set the default values for non specified properties\r\n        options.resultFormat = options.resultFormat ?? 'JSON';\r\n        options.busyState = options.busyState ?? true;\r\n        options.handleErrors = options.handleErrors ?? true;\r\n        \r\n        if(options.busyState){\r\n           \r\n           this.dialogService.addModalBusyState(); \r\n        }\r\n        \r\n        return new Promise((resolve:(r:any) => any, reject) => {\r\n            \r\n            // Create the request object\r\n            const request = new HTTPManagerPostRequest(\r\n                apiPath, \r\n                options.resultFormat === 'STRING' ? HTTPManagerPostRequest.STRING : HTTPManagerPostRequest.JSON\r\n            );\r\n\r\n            request.parameters = parameters;\r\n\r\n            request.successCallback = (response: any) => {\r\n                \r\n                resolve(response);\r\n            };\r\n\r\n            request.errorCallback = (errorMsg, errorCode, response) => {\r\n\r\n                if(options.handleErrors){\r\n                \r\n                    this.showErrorDialog(errorMsg, errorCode, response);\r\n                \r\n                }else{\r\n                    \r\n                    reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));\r\n                }                \r\n            };\r\n            \r\n            request.finallyCallback = () => {\r\n                \r\n                if(options.busyState){\r\n                                \r\n                    this.dialogService.removeModalBusyState();\r\n                }\r\n            };\r\n            \r\n            this.httpManager.execute(request);\r\n        });\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Performs a request to chain several api calls into a single http request, via the chain services mechanism of the turboframework API.\r\n     * Returns a promise that resolves with an array of response objects. One for each of the request calls.\r\n     *\r\n     * @param apiPath - A relative URL (based on the defined base root url) that defines the path to the root of the chain services call.\r\n     *        For example: 'turbosite/chain/chain-services'\r\n     * @param services - An array of objects, were each object contains a valid structure for the chain services call. \r\n     *        Token parameter is not necessary, it is automatically appended\r\n     * @param options An object defining several options for the request:\r\n     *        busyState: Enables or disables the busy state to lock user interaction while performing the http calls. Enabled by default\r\n     *        handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.\r\n     *        If set to false, the promise will generate a reject error that must be handled by our code.\r\n     * \r\n     * @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects \r\n     *          with an error (containing all the error response details) if the request fails.\r\n     */\r\n    callChain(apiPath:string, services:{}[], options: {busyState?:boolean, handleErrors?:boolean} = {}){\r\n    \r\n        // Set the default values for non specified properties\r\n        options.busyState = options.busyState ?? true;\r\n        options.handleErrors = options.handleErrors ?? true;\r\n        \r\n        if(options.busyState){\r\n           \r\n           this.dialogService.addModalBusyState(); \r\n        }\r\n                \r\n        return new Promise((resolve:(r:any) => any, reject) => {\r\n            \r\n            const request = new HTTPManagerPostRequest(apiPath, HTTPManagerPostRequest.JSON);\r\n                        \r\n            request.ignoreGlobalPostParams = true;      \r\n\r\n            request.parameters = { services: services };\r\n            \r\n            request.successCallback = (response:any[]) => {\r\n            \r\n                resolve(response);\r\n            };      \r\n\r\n            request.errorCallback = (errorMsg, errorCode, response) => {\r\n\r\n                if(options.handleErrors){\r\n                \r\n                    this.showErrorDialog(errorMsg, errorCode, response);    \r\n                \r\n                }else{\r\n                    \r\n                    reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));\r\n                }                \r\n            };\r\n                        \r\n            request.finallyCallback = () => {\r\n                \r\n                if(options.busyState){\r\n                                \r\n                    this.dialogService.removeModalBusyState();\r\n                }\r\n            };\r\n            \r\n            this.httpManager.execute(request);\r\n        });\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Aux method to show an error dialog when a request fails and error handling is enabled\r\n     */\r\n    private showErrorDialog(errorMsg:string, errorCode:number, response:any){\r\n        \r\n        errorMsg = errorMsg + '\\n\\n' + response;\r\n                                                    \r\n        if(StringUtils.isEmpty(errorMsg)){\r\n        \r\n            errorMsg = 'Unknown error. Make sure Internet connection is available';    \r\n        }\r\n\r\n        this.dialogService.addDialog(DialogErrorComponent,\r\n            {\r\n                width:'50vw',\r\n                texts: ['Error: ' + errorCode, errorMsg],\r\n                options: ['Ok']\r\n            }); \r\n    }\r\n    \r\n    \r\n    /**\r\n     * Perform the logout for the currently logged user\r\n     *\r\n     * @param options An object defining several options for the request:\r\n     *        handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.\r\n     *        If set to false, the promise will generate a reject error that must be handled by our code.\r\n     * \r\n     * @returns A promise that resolves correctly if the logout is correct, or rejects with an error (containing all the error \r\n     *          response details) if the request fails.\r\n     */\r\n    logout(options: {handleErrors?:boolean} = {}) {\r\n        \r\n        // Set the default values for non specified properties\r\n        options.handleErrors = options.handleErrors ?? true;\r\n                \r\n        this.dialogService.addModalBusyState(); \r\n        \r\n        return new Promise((resolve, reject) => {\r\n                \r\n            const request = new HTTPManagerPostRequest(this.logOutServiceURI);\r\n                    \r\n            request.parameters = { token: this._token };\r\n            \r\n            request.successCallback = () => {\r\n            \r\n                this._clearUserAndToken();\r\n                \r\n                resolve(undefined);\r\n            };\r\n            \r\n            request.errorCallback = (errorMsg, errorCode, response) => {\r\n                \r\n                if(options.handleErrors){\r\n                                \r\n                    this.showErrorDialog(errorMsg, errorCode, response);    \r\n                \r\n                }else{\r\n                    \r\n                    reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));\r\n                }               \r\n            };\r\n            \r\n            request.finallyCallback = () => {\r\n               \r\n               this.dialogService.removeModalBusyState();\r\n            };\r\n        \r\n            this.httpManager.execute(request);\r\n        }); \r\n    }\r\n    \r\n    \r\n    /**\r\n     * Aux methot to clear all the currently logged user data\r\n     */\r\n    private _clearUserAndToken(){\r\n        \r\n        this._userName = '';\r\n        this._password = '';\r\n        this._isLogged = false;\r\n        this._token = '';\r\n        this.httpManager.setGlobalPostParam('token', '-'); \r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Injectable, OnDestroy } from '@angular/core';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { LocalesBaseService } from './locales-base.service';\r\n\r\n\r\n/**\r\n * Global service that helps with application routing and related functionalities.\r\n * It is defined as an abstract class so it must be extended in our application to be used.\r\n * We must declare a static array of routes that will be used to define the routes of the application.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport abstract class RouterBaseService implements OnDestroy {\r\n    \r\n\r\n    /**\r\n     * Indicates whether the title manager has been initialized.\r\n     * This should only be done once, typically at application startup.\r\n     */ \r\n    private _isTitleManagerInitialized = false;\r\n    \r\n    \r\n    /**\r\n     * @see getCurrentRouteTitle\n     */\r\n    private _currentRouteTitle:string;\r\n    \r\n\r\n    /**\n     * @see getCurrentBrowserTitle\n     */\r\n    private _currentBrowserTitle:string;\r\n\r\n    \r\n    /**\r\n     * Subscription to router events. This is used to update the current route URL\r\n     */\r\n    private _routerSubscription: Subscription | undefined;\r\n    \r\n    \r\n    /**\r\n     * BehaviorSubject that holds the current route URL.\r\n     * This allows components to reactively subscribe to route changes.\r\n     */\r\n    private readonly _currentRoute = new BehaviorSubject<string>(this.router.url);\r\n\r\n    \r\n    /** \r\n     * Instance of the LocalesService to be used for translations.\r\n     * It will be provided by the methods that require it.\r\n     * This is not injected in the constructor as the locales service class is an abstract class, and we \r\n     * need the custom implementation of the service to be provided by the application that extends it.\r\n     */\r\n    private _localesService: LocalesBaseService;\r\n    \r\n    \r\n    constructor(private readonly router: Router,\r\n                private readonly titleService: Title) {\r\n                    \r\n        // Initial update in case the service loads after the first NavigationEnd\r\n        this._updateCurrentRoute();\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current route URL in the BehaviorSubject.\r\n     * This is called internally after each navigation event.\r\n     */ \r\n    private _updateCurrentRoute(): void {\r\n        \r\n        this._currentRoute.next(this.router.url);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Checks if the current route matches the specified route.\r\n     * \r\n     * @param route The route to check against the current route.\r\n     * \r\n     * @returns True if we are actually at the specified route, false otherwise.\r\n     */\r\n    isRouteCurrent(route:string) {\r\n        \r\n        return this.getCurrentRoute() === '/' + route;\r\n    }\r\n\r\n\r\n    /**\r\n     * Gets the current value of the route URL synchronously.\r\n     * For example, if the current route is `/user/123`, it will return `/user/123`.\r\n     * Notice that the base URL is not included in the returned value.\r\n     */\r\n    getCurrentRoute():string {\r\n        \r\n        return this._currentRoute.getValue();\r\n    }\r\n    \r\n    \r\n    /**\r\n     * The current route title, translated using the LocalesService.\r\n     * This is updated automatically after each navigation event if the title manager is initialized.\r\n     */ \r\n    getCurrentRouteTitle():string {\n        \n        return this._currentRouteTitle;\n    }\n    \n    \r\n    /**\r\n     * The current browser title, which may include prefixes or suffixes.\r\n     * This is updated automatically after each navigation event if the title manager is initialized.\r\n     */\n    getCurrentBrowserTitle():string {\n        \n        return this._currentBrowserTitle;\n    }\r\n\r\n\r\n    /**\r\n     * Gets the current value of the route absolute URL synchronously.\r\n     * \r\n     * For example, if the current route is `/user/123` and the base href is `http://example.com/app/`, it will return `http://example.com/app/user/123`.\r\n     */\r\n    getCurrentRouteAbsolute(){\r\n\r\n        return window.location.origin + this.getCurrentRoute();\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Gets the value of a specific route parameter by its key from the current route.\r\n     * \r\n     * For example, if the current route is `/user/123`, and you call this method with `key` as `id`, it will return `123`.\r\n     * The name of the parameter must match the one defined in the route configuration on your application (e.g., `{ path: 'user/:id', component: UserComponent }`).\r\n     * \r\n     * @param key The key of the route parameter to retrieve.\r\n     * \r\n     * @returns The value of the specified route parameter, or undefined if it does not exist.\r\n     */\r\n    getCurrentRouteParamValue(key: string) {\r\n        \r\n        let currentRoute = this.router.routerState.snapshot.root;\r\n        \r\n        while (currentRoute.firstChild) {\r\n            \r\n            currentRoute = currentRoute.firstChild;\r\n        }\r\n        \r\n        if (!(key in currentRoute.params)) {\r\n            \r\n            throw new Error(`Route parameter '${key}' does not exist.`);\r\n        }\r\n        \r\n        return currentRoute.params[key];\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Gets the value of a specific query parameter by its key from the current route.\r\n     * For example, if the current route is `/search?query=angular`, and you call this method with `key` as `query`, it will return `angular`.\r\n     * \r\n     * @param key The key of the query parameter to retrieve.\r\n     */\r\n    getQueryParamValue(key: string) {\r\n        let currentRoute = this.router.routerState.snapshot.root;\r\n\r\n        while (currentRoute.firstChild) {\r\n            currentRoute = currentRoute.firstChild;\r\n        }\r\n\r\n        return currentRoute.queryParams[key];\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Sets or updates the value of a specific query parameter in the current route.\r\n     * For example, if the current route is `/search?query=angular`, and you call this method with `key` as `page` and `value` as `2`, \r\n     * it will navigate to `/search?query=angular&page=2`.\r\n     * \r\n     * @param key The key of the query parameter to set or update.\r\n     * @param value The value to set for the specified query parameter.\r\n     */\r\n    setQueryParamValue(key: string, value: string) {\r\n        \r\n        let currentRoute = this.router.routerState.root;\r\n        \r\n        while (currentRoute.firstChild) {\r\n            \r\n            currentRoute = currentRoute.firstChild;\r\n        }\r\n\r\n        this.router.navigate([], {\r\n            relativeTo: currentRoute,\r\n            queryParams: { [key]: value },\r\n            queryParamsHandling: 'merge'\r\n        });\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Removes a specific query parameter from the current route.\r\n     * For example, if the current route is `/search?query=angular&page=2`, and you call this method with `key` as `page`,\r\n     * it will navigate to `/search?query=angular`.\r\n     * \r\n     * @param key The key of the query parameter to remove.\r\n     */\r\n    removeQueryParam(key: string) {\r\n        \r\n        let currentRoute = this.router.routerState.root;\r\n\r\n        while (currentRoute.firstChild) {\r\n            currentRoute = currentRoute.firstChild;\r\n        }\r\n\r\n        this.router.navigate([], {\r\n            relativeTo: currentRoute,\r\n            queryParams: { [key]: null },\r\n            queryParamsHandling: 'merge'\r\n        });\r\n    }\r\n\r\n\r\n    /**\r\n     * Initializes the title management feature to automatically refresh the browser title based on the current\r\n     * URL route. It Must be called once, typically at application startup\r\n     * \r\n     * To correctly translate the route title, We expect the route definitions to have the following properties:\r\n     * \r\n     * - titleKey: The key to be used to get the title from the translation bundle.\r\n     * - titleBundle: The bundle to be used to get the title from the translation bundle.\r\n     * \r\n     * (Translations will be done using the LocalesService from this same library).\r\n     * \r\n     * Example of a Route using this feature:\r\n     *   // Home route\r\n     *   { path: '', component: HomePageComponent, \r\n     *     data: { titleKey: 'HOME',  titleBundle: 'turbodepot/user-interface'} },\r\n     * \n     * @param localesService An instance of the already initialized LocalesService to be used for translations. \r\n     * @param prefix A text to be added before the computed title.\r\n     * @param sufix A text to be added after the computed title.\r\n     */\r\n    initializeAutoTranslateTitleByRoute(localesService:LocalesBaseService, prefix:string = '', sufix:string = ''): void {\r\n        \r\n        this._localesService = localesService;\r\n        \r\n        if (this._isTitleManagerInitialized) {\r\n            \r\n            throw new Error('Title refresh from routes has already been initialized. Can only be done once.');\r\n        }\r\n\r\n        // Set initial title based on current route data immediately\r\n        this.updateTitleFromCurrentRoute(prefix, sufix);\r\n\r\n        // Subscribe to future navigation events\r\n        this._routerSubscription = this.router.events.pipe(\r\n            \r\n            filter(event => event instanceof NavigationEnd)\r\n            \r\n        ).subscribe(() => {\r\n            \r\n            this._updateCurrentRoute();\r\n            this.updateTitleFromCurrentRoute(prefix, sufix);\r\n        });\r\n\r\n        this._isTitleManagerInitialized = true;\r\n    }\r\n    \r\n\r\n    /**\r\n     * Aux method: Updates the browser title based on the current route's data properties.\r\n     * This is called after each navigation event to ensure the title is always up-to-date.\r\n     * \r\n     * @param prefix A text to be added before the computed title.\r\n     * @param sufix A text to be added after the computed title.\r\n     */\r\n    private updateTitleFromCurrentRoute(prefix:string, sufix:string): void {\r\n        \r\n        this._currentRouteTitle = '';\r\n        this._currentBrowserTitle = '';\r\n        let currentRoute = this.router.routerState.snapshot.root;\r\n        \r\n        while (currentRoute.firstChild) {\r\n            \r\n            currentRoute = currentRoute.firstChild;\r\n        }\r\n        \r\n        const data = currentRoute.data;\r\n        \r\n        if (data['titleKey'] && data['titleBundle']) {\r\n            \r\n            this._currentRouteTitle = this._localesService.t(data['titleKey'], data['titleBundle']);\r\n        }\r\n        \r\n        this._currentBrowserTitle = prefix + this._currentRouteTitle + sufix;\r\n        \r\n        this.titleService.setTitle(this._currentBrowserTitle);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Navigates to the specified route.\r\n     * \r\n     * @param route The route to navigate to.\r\n     */\r\n    navigateTo(route:string){\r\n        \r\n        this.router.navigate(['/' + route]);\r\n    }\r\n    \r\n\r\n    /**\r\n     * Automatically called when the service is destroyed.\n     * We use it to clean up subscriptions and other resources.\r\n     * \r\n     * Usially not necessary to call this manually.\n     */\r\n    ngOnDestroy(): void {\r\n        \r\n        this._routerSubscription?.unsubscribe();\r\n        \r\n        // Clean up BehaviorSubject\r\n        this._currentRoute.complete();\r\n    }\r\n}","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n\r\n/**\r\n * Fully featured translation manager to be used with any application that requires text internationalization.\r\n * \r\n * It is designed to load translation bundles from several sources, and then provide methods to translate\n * any key on any bundle to the desired locale.\n * \n * - Provides methods to format the translated text to several case formats like start case, all upper case,\n * all lower case, first upper rest lower, etc...\n * \n * - Provides a way to define wildcards on the translated texts that can be replaced at runtime with custom values.\n * \n * The class is designed to be as fast as possible when requesting translations, so it includes an internal memory cache\n * that will store the results of previous translations and return them directly when the same key is requested again.\n * \n * It also includes several configuration options to define how missing keys are handled, what locales are available,\n * what locales are loaded into memory, what locales are used for translation priority, etc...\n * \n * The class does not include any method to load translation bundles from external sources like files or APIs. This is\n * done on purpose to keep the class as generic as possible and avoid any dependency with external libraries or frameworks.\n * \n * It is recommended to use this class as a singleton service in your application, so you can easily access it from\n * any component or service that requires translation functionalities.\r\n */\r\nexport class TranslationManager {\r\n\r\n    \r\n    /**\r\n     * This flag defines if the class will allow loading locales that are not defined on the availableLocales list.\n     * \n     * By default this is set to false, so only locales that are defined on the availableLocales list can be loaded.\n     * \n     * If set to true, any locale can be loaded, even if it is not defined on the availableLocales list. In this case,\n     * the locale will be added at the end of the availableLocales list when loaded.\n     * \n     * It is recommended to keep this set to false and always define the availableLocales list before loading any locale,\n     * so we can avoid loading locales that are not supported by our application.\n     * \n     * Notice that this flag does not affect the translation priority list, which must always contain locales that are\n     * defined on the availableLocales list.\n     * \n     * @see setAvailableLocales()\n     * @see setTranslationPriority()\r\n     */\r\n    public isLoadingNonAvaliableLocalesAllowed = false;\r\n    \r\n    \r\n    /**\r\n     * @see setAvailableLocales()\r\n     */\r\n    protected _availableLocales:string[];\r\n    \r\n    \r\n    /**\r\n     * @see setTranslationPriority()\r\n     */\r\n    protected _translationPriority:string[] = [];\r\n        \r\n\r\n    /**\r\n     * @see getLoadedLocales()\r\n     */\r\n    protected _loadedLocales:string[] = [];\r\n        \r\n    \r\n    /**\r\n     * Stores all the raw localization data that is loaded into memory on this service for all locales.\r\n     * It is organized like: { library_name: { bundle_name: { locale_code: { key1: \"translation1\", key2: \"translation2\" } } } ... }  \r\n     */\r\n    protected _loadedRawTranslationData:any = {};\r\n\r\n\r\n    /**\r\n     * @see setWildCardsFormat()\r\n     */\r\n    protected _wildCardsFormat = '{N}';\r\n\r\n\r\n    /**\r\n     * @see setMissingKeyBehaviour()\r\n     */\r\n    protected _missingKeyBehaviour = '$exception';\r\n\r\n\r\n    /**\r\n     * Stores a memory cache to improve performance when outputing translations\r\n     */\r\n    protected _keyValuesCache:any = {};\r\n\r\n\r\n    /**\r\n     * Stores a hash value that is used to improve the performance for translation t() methods.\r\n     * \r\n     * This is computed based on _wildCardsFormat + _missingKeyBehaviour + _translationPriority\r\n     * \r\n     * Methods that change these values will recalculate the hash string, so when calling translation methods, the\r\n     * performance will be as fast as possible.\r\n     */\r\n    protected _cacheHashBaseString = '';\r\n    \r\n    \r\n    /**\r\n     * Wildcards are string fragments that are placed inside the translated texts. Their main purpose is to be replaced at\r\n     * runtime by custom values like for example a user name, a date, a numeric value, etc..\r\n     *\r\n     * This class helps with this process by including a parameter called 'toReplace' on all ->t methods which allows us\r\n     * to specify a string or list of strings that will replace the respective wildcards on the translated text. Each wildcard\r\n     * must follow the format specified here, and contain a numeric digit that will be used to find the replacement text at the\r\n     * 'toReplace' list. For example, if we define $N as the wildcard format, and we have a translation that contains $0, $1, $2,\r\n     * $0 will be replaced with the first element on toReplace, $1 with the second and so.\r\n     *\r\n     * We usually set this before initializing the class translation data\r\n     *\r\n     * Notice that N is mandatory on the wildcards format and the first index value is 0.\r\n     *\r\n     * @param value The wildcards format we want to set\r\n     * \r\n     * @returns The value that's been set\r\n     */\r\n    setWildCardsFormat(value:string) {\r\n\r\n        if(!value.includes('N')){\r\n        \r\n            throw new Error(\"N is mandatory to replace wildcards\");\r\n        }\r\n\r\n        this._cacheHashBaseString = value + this._missingKeyBehaviour + this._translationPriority.join('');\r\n\r\n        this._wildCardsFormat = value;\r\n        \r\n        return value;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Defines the behaviour for t(), tStartCase(), etc... methods when a key is not found on\r\n     * a bundle or the bundle does not exist\r\n     *\r\n     * If missingKeyBehaviour is an empty string, all missing keys will return an empty value (not recommended)\r\n     *\r\n     * If missingKeyBehaviour contains a string, that string will be always returned for missing keys\r\n     *\r\n     * If missingKeyBehaviour contains a string with one of the following predefined wildcards:<br>\r\n     *    - $key will be replaced with key name. Example: get(\"NAME\") will output [NAME] if key is not found and missingKeyBehaviour = '[$key]'<br>\r\n     *    - $exception (default value) will throw an exception with the problem cause description.\r\n     *\r\n     * @param value The missing key format we want to set\r\n     * \r\n     * @returns The value that's been set\r\n     */\r\n    setMissingKeyBehaviour(value:string) {\r\n\r\n        this._cacheHashBaseString = this._wildCardsFormat + value + this._translationPriority.join('');\r\n\r\n        this._missingKeyBehaviour = value;\r\n        \r\n        return value;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * @see setMissingKeyBehaviour()\r\n     */\r\n    getMissingKeyBehaviour() {\r\n\r\n        return this._missingKeyBehaviour;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Adds translations to the class by loading and parsing bundles from the provided JSON object.\r\n     * After the method finishes, the class will contain in memory all the translation data and will be ready to translate \r\n     * any provided key to any of the specified locales.\r\n     * \r\n     * This method can be called multiple times. New translation data will be merged with any existing data. \r\n     * If a translation key already exists for a specific library, bundle, and locale, its value will be overwritten by the new data.\r\n     *\r\n     * @param locales An array of locale codes (e.g., ['en_US', 'es_ES', 'fr_FR']) to load from the json data into this class.\r\n     *        The order of this array is not important for translation priority.\r\n     * \r\n     * @param json A JSON object containing the translation data. The structure must be as follows:\r\n     *       { library_name: { bundle_name: { locale_code: { key1: \"translation1\", key2: \"translation2\" } } } ... }  \r\n     * \r\n     * @throws Error If any of the provided locales is not correctly formatted or not defined on the availableLocales \r\n     *         list or json data does not follow the expected structure.\r\n     * \r\n     * @return void\r\n     */\r\n    loadLocalesFromJson(locales:string[], json:any){\r\n\r\n        // Cache must be cleared when loading new translations to ensure all keys are re-evaluated.\r\n        this._keyValuesCache = {};\r\n        \r\n        // Validate received locales are correct\r\n        for(const locale of locales) {\r\n\r\n            this._validateLocaleString(locale);\r\n            \r\n            if(!this.isLoadingNonAvaliableLocalesAllowed &&\r\n               (!this._availableLocales || !this._availableLocales.includes(locale))) {\r\n                \r\n                throw new Error(locale + ' not defined as available for translation');\r\n            }              \r\n        }\r\n        \r\n        // Validate the translations object follows the right structure\r\n        let isTranslationsValid = false;\r\n        \r\n        if (json && typeof json === 'object' && Object.keys(json).length > 0) {\r\n            \r\n            for (const library in json) {\r\n                \r\n                for (const bundle in json[library]) {\r\n                    \r\n                    for (const locale in json[library][bundle]) {\r\n                        \r\n                        this._validateLocaleString(locale);\r\n                        isTranslationsValid = true;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        if (!isTranslationsValid) {\r\n            \r\n            throw new Error('translations must be a non empty object with the structure: { library: { bundle: { xx_XX: { key: translation } } } }');\r\n        }\r\n        \r\n        // Deep merge the new translation data with the existing data.\r\n        for (const library in json) {\r\n            \r\n            if (!this._loadedRawTranslationData[library]) {\r\n                \r\n                this._loadedRawTranslationData[library] = {};\r\n            }\r\n\r\n            for (const bundle in json[library]) {\r\n                \r\n                if (!this._loadedRawTranslationData[library][bundle]) {\r\n                    \r\n                    this._loadedRawTranslationData[library][bundle] = {};\r\n                }\r\n\r\n                for (const locale in json[library][bundle]) {\r\n                    \r\n                    if (!this._loadedRawTranslationData[library][bundle][locale]) {\r\n                        \r\n                        this._loadedRawTranslationData[library][bundle][locale] = {};\r\n                    }\r\n                    \r\n                    // Merge the new keys for the locale, overwriting any existing ones.\r\n                    Object.assign(this._loadedRawTranslationData[library][bundle][locale], json[library][bundle][locale]);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Update the list of loaded locales, ensuring no duplicates.\r\n        this._loadedLocales = Array.from(new Set([...this._loadedLocales, ...locales]));\r\n\r\n        // Add loaded locales to the end of the availableLocales list if they are not already there\r\n        for(const locale of locales) {\r\n            \r\n            if(!this._availableLocales.includes(locale)){\r\n                \r\n                this._availableLocales.push(locale);\r\n            }\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Checks if the specified locale is currently loaded into memory on this service.\r\n     *\r\n     * @param locale A locale to check. For example 'en_US'\r\n     *\r\n     * @return True if the locale is currently loaded on the class, false if not.\r\n     */\r\n    isLocaleLoaded(locale:string){\r\n\r\n        this._validateLocaleString(locale);\r\n\r\n        return this._loadedLocales.includes(locale);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Checks if the specified 2 digit language is currently loaded for the currently defined bundles and paths.\r\n     *\r\n     * @param language A language to check. For example 'en'\r\n     *\r\n     * @return True if the language is currently loaded on the class, false if not.\r\n     */\r\n    isLanguageLoaded(language:string){\r\n\r\n        this._validateLanguageString(language);\r\n\r\n        return this.getLoadedLanguages().includes(language);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * @see setAvailableLocales()\r\n     */\r\n    getAvailableLocales(){\r\n\r\n        return this._availableLocales;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Define the list of locales that are allowed to be loaded by this class (sorted by preference!).\n     * Each string must be formatted as a standard locale code with language and country joined by an \n     * underscore, like: en_US, fr_FR. The order of this list does matter, so it is better to sort by priority.\r\n     * \r\n     * IMPORTANT: This method does not load any locale by itself, it just defines what locales are available for translation.\r\n     * You also need to load the translation data for the locales to translate texts.\r\n     * \r\n     * Before performing any translation, available locales and translation priority must be set, and also translation\r\n     * data must be loaded for all the locales that are defined on the translation priority list.\n     *\n     * @param locales A list of locales to be set as available for loading\n     */ \r\n    setAvailableLocales(locales:string[]){\r\n        \r\n        for(const locale of locales) {\n\n            this._validateLocaleString(locale);\n        }\r\n\r\n        this._availableLocales = locales;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * A list containing the locales that have been loaded into memory and ready to be used for translation.\r\n     * Each string is formatted as a standard locale code with language and country joined by an underscore, like: en_US, fr_FR\r\n     *\r\n     * The order on this list does not matter for translation priority, as that is defined by the translationPriority list.\r\n     * \r\n     * @see getLoadedLanguages()\r\n     */\r\n    getLoadedLocales(){\r\n\r\n        return this._loadedLocales;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * A list of strings containing the languages have been loaded into memory and ready to be used for translation.\r\n     * Each string is formatted as a 2 digit language code, like: en, fr\r\n     *\r\n     * This list is the same as the locales() one, but containing only the language part of each locale (the first two digits)\r\n     *\r\n     * @see getLoadedLocales()\r\n     */\r\n    getLoadedLanguages(){\r\n\r\n        return this._loadedLocales.map((l: string) => l.substring(0, 2));\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Define the list of locales that will be used for translation priority.\r\n     * The first locale on the list will be the primary to be used when trying to get a translation, rest will be used \r\n     * as fallback in the same order as they are defined on this list.\r\n     * \r\n     * - The list must contain at least one locale and no duplicate elements.\r\n     * - All locales provided here must exist on the availableLocales list, otherwise an exception will happen.\n     * - When requesting a translation all the locales on this list should be loaded into memory or an exception may happen.\r\n     * - IMPORTANT: Translation behaviour depends heavily on the missingKeyBehaviour property value.\r\n     * \r\n     * @example: After loading the following list of locales ['en_US', 'es_ES', 'fr_FR'] if we call t('HELLO', 'lib1/greetings')\r\n     *           the localization manager will try to locate the en_US value for the HELLO tag on the greetings bundle for the library lib1.\r\n     *           If the tag is not found for the specified locale and bundle, the same search will be performed for the es_ES locale, and so, till a\r\n     *           value is found or no more locales are defined. \n     *\n     * @param localesOrLanguages:string A list of locales (xx_XX) or languages (xx) to be used for translation priority.\r\n     *\r\n     * @returns The list of locales that has been set for translation priority\r\n     */\r\n    setTranslationPriority(localesOrLanguages:string[]){\r\n        \r\n        // Validate received list is correct\r\n        if(!Array.isArray(localesOrLanguages) ||\r\n            (new Set(localesOrLanguages).size !== localesOrLanguages.length) ||\r\n            localesOrLanguages.length === 0){\r\n\r\n            throw new Error('locales must be non empty string array with no duplicate elements');\r\n        }\r\n\r\n        const resolvedLocales: string[] = [];\r\n\r\n        // Validate all requested locales are available for translation\r\n        for(const item of localesOrLanguages) {\r\n\r\n            let resolvedLocale = '';\r\n\r\n            if(/^[a-z]{2}$/.test(item)){\r\n                \r\n                resolvedLocale = this._availableLocales.find(l => l.startsWith(item + '_')) ?? '';\r\n\r\n                if(resolvedLocale === ''){\r\n                    \r\n                    throw new Error(`Language ${item} could not be resolved to any available locale.`);\r\n                }\r\n\r\n            } else {\r\n\r\n                this._validateLocaleString(item);\r\n                resolvedLocale = item;\r\n            }\r\n\r\n            if(!this._availableLocales.includes(resolvedLocale)){\r\n\r\n                throw new Error(resolvedLocale + ' not defined as available for translation');\r\n            }\r\n\r\n            resolvedLocales.push(resolvedLocale);\r\n        }\r\n\r\n        this._translationPriority = resolvedLocales;\r\n        this._cacheHashBaseString = this._wildCardsFormat + this._missingKeyBehaviour + this._translationPriority.join('');\r\n        \r\n        return this._translationPriority;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * @see setTranslationPriority()\r\n     */\r\n    getTranslationPriority(){\n\n        return this._translationPriority;\n    }\r\n\r\n\r\n    /**\r\n     * Get a translation based on the current locales translation priority for the given key, library and bundle\r\n     *\r\n     * @param string key The key we want to read from the specified resource bundle\r\n     * @param string bundlePath A string with the format 'library_name/bundle_name' that is used to locate the bundle were the key to translate is found\r\n     * @param array replaceWildcards A list of values that will replace wildcards that may be found on the translated text. Each wildcard\r\n     *        will be replaced with the element whose index on replaceWildcards matches it. Check the documentation for setWildCardsFormat\r\n     *        property to know more about how to setup wildcards on your translations.\r\n     *\r\n     * @see setWildCardsFormat()\r\n     *\r\n     * @return The translated text\r\n     */\r\n    t(key:string, bundlePath:string, replaceWildcards:string[] = []) {\r\n\r\n        // Create a cache key to improve performance when requesting the same key translation several times\r\n        const cacheKey = `${this._cacheHashBaseString}${key}${bundlePath}${replaceWildcards.join('')}`;\r\n\r\n        if (!this._keyValuesCache[cacheKey]) {\r\n\r\n            const [library, bundle] = bundlePath.split('/');\r\n            \r\n            this._forceNonEmptyString(key, '', 'key must be non empty string');\r\n            this._forceNonEmptyString(bundlePath, '', 'bundlePath must be non empty string');\r\n            this._forceNonEmptyString(library, '', 'no library specified on bundlePath');\r\n            this._forceNonEmptyString(bundle, '', 'no bundle specified on bundlePath');\r\n            \r\n            if(this._translationPriority.length === 0){\r\n\r\n                throw new Error(`No translation priority specified`);\r\n            }\r\n            \r\n            const replacementsCount = replaceWildcards.length;\r\n            \r\n            // Loop all the translation priority locales to find the first one with a value for the specified key\r\n            for (const locale of this._translationPriority) {\r\n                \r\n                if(!this.isLocaleLoaded(locale)){\n\n                    throw new Error(`Locale ${locale} must be loaded before requesting translations`);                    \r\n                }\r\n\r\n                if (this._loadedRawTranslationData[library]?.[bundle]?.[locale]?.[key]) {\r\n\r\n                    let result = this._loadedRawTranslationData[library][bundle][locale][key];\r\n\r\n                    // Replace all wildcards on the text with the specified replacements if any\r\n                    for (let i = 0; i < replacementsCount; i++) {\r\n\r\n                        result = this._replace(result, this._replace(this._wildCardsFormat, 'N', i.toString()), replaceWildcards[i]);\r\n                    }\r\n\r\n                    this._keyValuesCache[cacheKey] = result;\r\n                    \r\n                    return result;\r\n                }\r\n            }\r\n\r\n            // Check if an exception needs to be thrown if the specified key is not found on this bundle\r\n            if (this._missingKeyBehaviour.includes('$exception')) {\r\n                \r\n                throw new Error(`Translation key <${key}> not found on <${bundlePath}>`);\r\n            }\r\n\r\n            this._keyValuesCache[cacheKey] = this._replace(this._missingKeyBehaviour, '$key', key);\r\n        }\r\n\r\n        return this._keyValuesCache[cacheKey];\r\n    }\r\n\r\n\r\n    /**\r\n     * Get the translation for the given key and bundle as a string with all words first character capitalized\r\n     * and all the rest of the word with lower case\r\n     *\r\n     * @see t()\r\n     *\r\n     * @returns The localized and case formatted text\r\n     */\r\n    tStartCase(key:string, bundlePath:string, replaceWildcards:string[] = []) {\r\n\r\n        return this.t(key, bundlePath, replaceWildcards).split(' ')\r\n                .map((word:any) => word ? word[0].toUpperCase() + word.slice(1).toLowerCase() : '').join(' ');\r\n    }\r\n\r\n\r\n    /**\r\n     * Get the translation for the given key and bundle as an all upper case string\r\n     *\r\n     * @see t()\r\n     *\r\n     * @returns The localized and case formatted text\r\n     */\r\n    tAllUpperCase(key:string, bundlePath:string, replaceWildcards:string[] = []) {\r\n\r\n        return this.t(key, bundlePath, replaceWildcards).toUpperCase();\r\n    }\r\n\r\n\r\n    /**\r\n     * Get the translation for the given key and bundle as an all lower case string\r\n     *\r\n     * @see t()\r\n     *\r\n     * @returns The localized and case formatted text\r\n     */\r\n    tAllLowerCase(key:string, bundlePath:string, replaceWildcards:string[] = []) {\r\n\r\n        return this.t(key, bundlePath, replaceWildcards).toLowerCase();\r\n    }\r\n\r\n\r\n    /**\r\n     * Get the translation for the given key and bundle as a string with the first character as Upper case\r\n     * and all the rest as lower case\r\n     *\r\n     * @see t()\r\n     *\r\n     * @returns The localized and case formatted text\r\n     */\r\n    tFirstUpperRestLower(key:string, bundlePath:string, replaceWildcards:string[] = []){\r\n\r\n        const string = this.t(key, bundlePath, replaceWildcards);\r\n        \r\n        return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n    }\r\n\r\n\r\n    /**\r\n     * Aux method to validate that a locale string is correctly formatted\r\n     *\r\n     * @param string $locale A locale string\r\n     */\r\n    private _validateLocaleString(locale:string){\r\n        \r\n        if(!/^[a-z]{2}_[A-Z]{2}$/.test(locale)) {\r\n\r\n            throw new Error('locale must be a valid xx_XX value');\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Aux method to validate that a language string is correctly formatted\r\n     *\r\n     * @param language A 2 digit language string\r\n     */\r\n    _validateLanguageString(language:string){\r\n\r\n        if (!/^[a-z]{2}$/.test(language)) {\r\n\r\n            throw new Error('language must be a valid 2 digit value');\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * This is an aux method to implement the TurboCommons StringUtils replace method.\r\n     * It is exactly the same as the one on the library, but we implement it here to avoid having a dependency with TurboCommons\r\n     */\r\n    private _replace(string: string, search:string, replacement: string) {\r\n        \r\n        const escapedSearch = search.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n           \r\n        return string.replace(new RegExp(escapedSearch, 'g'), replacement);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * This is an aux method to implement the TurboCommons StringUtils isEmpty method.\r\n     * It is exactly the same as the one on the library, but we implement it here to avoid having a dependency with TurboCommons\r\n     * TODO - If we move this class to TurboCommons, we can remove this method\r\n     */\r\n    private _isEmpty(string:string) {\r\n        \r\n        let isString = (typeof string === 'string' || (string as any) instanceof String);\r\n                \r\n        // Throw exception if non string value was received\r\n        if(!isString){\r\n\r\n            // Empty or null value is considered empty\r\n            if(string == null || string == ''){\r\n    \r\n                return true;\r\n            }\r\n            \r\n            throw new Error(\"value is not a string\");\r\n        }\r\n\r\n        return string.replace(/[ \\n\\r\\t]/g, '') === '';\r\n    }\r\n    \r\n    \r\n    /**\r\n     * This is an aux method to implement the TurboCommons StringUtils forceNonEmptyString method.\r\n     * It is exactly the same as the one on the library, but we implement it here to avoid having a dependency with TurboCommons\r\n     */\r\n    private _forceNonEmptyString(value:any, valueName = '', errorMessage = 'must be a non empty string'){\r\n\r\n        let isString = (typeof value === 'string' || value instanceof String);\r\n        \r\n        if(!isString || this._isEmpty(value)){\r\n\r\n            throw new Error(valueName + ' ' + errorMessage);\r\n        }\r\n    }\r\n}\r\n","/**\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\n *\n * Website : -> http://www.turbogui.org\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\n */\n\nimport { Injectable } from '@angular/core';\nimport { TranslationManager } from '../managers/TranslationManager';\n\n\n/**\n * Fully featured translation service to be used with any application that requires text internationalization.\n * It is defined as an abstract service class so it must be extended in our application. This way we can\n * write custom methods to extend the functionality of this class if needed.\n * \n * @see TranslationBaseManager for more information about the methods and properties available.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport abstract class LocalesBaseService extends TranslationManager {\n\n\n    /**\n     * Key used to store the user preferred locales in local storage\n     */ \n    private readonly _storageKey = 'turbogui-user-translation-priority';\n    \n\n    /**\n     * Try to detect the list of locales (sorted by preference) that are defined by the user \n     * at the browser setup and are also available for translation at this class.\n     * \n     * First we will check if there is a stored local storage value that was defined on a previous session. \n     * If found, all the locales stored there that are also available on this class will be returned.\n     * \n     * If no locales could be found from previous sessions, the method will check the browser default language and the \n     * browser languages list. All matching languages that are also listed on availableLocales will be returned, sorted\n     * by the browser preference.\n     * \n     * Finally, if nothing is found, the first locale from the class availableLocales will be returned.\n     *\n     * @returns A list of locales that can be used as a translation priority list\n     */  \n    getAvailableLocalesFromBrowser(){\n        \n        if(this._availableLocales.length === 0) {\n            \n            throw new Error('You must define availableLocales before calling detectBrowserLocales()');\n        }\n\n        let foundLocales = [];\n        \n        // Check for previously stored locales in local storage\n        const storedLocales = localStorage.getItem(this._storageKey);\n        \n        if(storedLocales){\n            \n            for(const locale of storedLocales.split(',')){\n                \n                if(this._availableLocales.includes(locale)){\n                    \n                    foundLocales.push(locale);\n                }\n            }    \n        }\n        \n        // Check for languages on the current browser setup\n        if(foundLocales.length === 0){\n        \n            const browserLanguages = navigator.languages || [navigator.language];\n\n            for (const lang of browserLanguages) {\n                \n                const langCode = lang.split(/[-_]/)[0].toLowerCase();\n                const allowedLocale = this._availableLocales.find(locale => locale.startsWith(langCode + '_'));\n\n                if (allowedLocale) {\n                    \n                    foundLocales.push(allowedLocale);\n                }\n            }    \n        }\n\n        // Return the locales found or the first allowed locale as a fallback\n        return (foundLocales.length > 0) ? foundLocales : [this._availableLocales[0]];\n    }\n    \n    \n    /**\n     * Initializes the translation system by loading and parsing bundle files from the specified translations path.\n     * After the promise finishes, the class will contain all the translation data and will be ready to translate any \n     * provided key.\n     * \n     * @param locales An array of locale codes (['en_US', 'es_ES', 'fr_FR', ...]) to load from the url response.\n     *        The order of this array is not important for translation priority.\n     * \n     * @param url - Url where the translations are found. The response must be a Json with the expected structure:\n     *              { library_name: { bundle_name: { locale_code: { key1: \"translation1\", key2: \"translation2\" } } } ... } \n     * \n     * @return A promise that will resolve if the translations get correctly loaded, or reject with an error if load fails \n     */\n    async loadLocalesFromUrl(locales: string[], url: string) {\n        \n        try {\n            \n            const response = await fetch(url);\n            \n            if (!response.ok) {\n                \n                throw new Error(`HTTP error! status: ${response.status}`);\n            }\n            \n            const data = await response.json();\n            \n            this.loadLocalesFromJson(locales, data);\n            \n        } catch (error) {\n            \n            throw new Error(`ERROR LOADING LOCALES FROM: ${url}\\n${error}`);\n        }\n    }\n    \n    \n    override setTranslationPriority(localesOrLanguages:string[]){\n        \n        const locales = super.setTranslationPriority(localesOrLanguages);  \n\n        // We override this method to store the user preferred locales in local storage\n        // for future sessions\n        localStorage.setItem(this._storageKey, locales.join(','));\n        \n        return locales;\n    }\n         \n}\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatButtonModule } from '@angular/material/button';\nimport { CommonModule } from '@angular/common';\n\r\n\r\n/**\r\n * A dialog component with two option buttons, to be used with dialog service.\r\n * The first of the options is considered to be the primary one and will therefore have more visual accent\r\n */\r\n@Component({\n    selector: 'tg-dialog-two-option',\n    imports: [CommonModule, MatButtonModule],\n    providers: [],\n    templateUrl: './dialog-two-option.component.html',\n    styleUrls: ['./dialog-two-option.component.scss']\n})\r\n\r\n\r\nexport class DialogTwoOptionComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogTwoOptionComponent';\r\n    \r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n        \r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogTwoOptionComponent expects 2 texts: The title and optionally a description');\r\n        }\r\n\r\n        if (data.options.length !== 2) {\r\n\r\n            throw new Error('DialogTwoOptionComponent expects only two options');\r\n        }\r\n    }\r\n}\r\n","<h3>\r\n    {{data.texts[0]}}\r\n</h3>\r\n\r\n<p *ngIf=\"data.texts.length > 1\">\r\n    {{data.texts[1]}}\r\n</p>\r\n\r\n<div class=\"buttonsContainer\">\r\n\r\n    <button mat-raised-button color=\"primary\" class=\"primaryButton\"\r\n        (click)=\"closeDialog(0)\">\r\n        \r\n        {{data.options[0]}}\r\n        \r\n    </button>\r\n    \r\n    <button mat-button\r\n        (click)=\"closeDialog(1)\">\r\n        \r\n        {{data.options[1]}}\r\n        \r\n    </button>\r\n    \r\n</div>\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatButtonModule } from '@angular/material/button';\nimport { CommonModule } from '@angular/common';\n\r\n\r\n@Component({\n    selector: 'tg-dialog-multiple-option',\n    imports: [CommonModule, MatButtonModule],\n    providers: [],\n    templateUrl: './dialog-multiple-option.component.html',\n    styleUrls: ['./dialog-multiple-option.component.scss']\n})\r\n\r\n\r\n/**\r\n * A dialog component that is designed to show more than one option buttons (usually more than two), to be used with dialog service\r\n */\r\nexport class DialogMultipleOptionComponent extends DialogBaseComponent {\r\n\r\n\r\n    static readonly DIALOG_CLASS_NAME = 'DialogMultipleOptionComponent';\r\n    \r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n        \r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogMultipleOptionComponent expects 2 texts: The title and optionally a description');\r\n        }\r\n    }\r\n}\r\n","<h3>\r\n    {{data.texts[0]}}\r\n</h3>\r\n\r\n<p *ngIf=\"data.texts.length > 1\">\r\n    {{data.texts[1]}}\r\n</p>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n    *ngFor=\"let option of data.options; let i = index\"\r\n    (click)=\"closeDialog(i)\">\r\n    \r\n    {{option}}\r\n    \r\n</button>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { BrowserService } from '../../../controller/browser.service';\r\nimport { StringUtils } from 'turbocommons-ts';\r\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { TurboGuiAngularModule } from '../../../model/modules/turbogui-angular.module';\n\r\n\r\n/**\r\n * A dialog component which allows us to select one single item from a list. The elements on that list are displayed on a table\r\n * which may show a scroll if necessary when there are many elements on the list.\r\n * \r\n * It also allows us to filter inside the list with a custom text that we can type into a search input, which is optional.\r\n *\r\n * texts parameter must contain the title, the description (optional), the filter input title (optional), and the submit button caption.\r\n * If that caption is not provided, the selection will be automatically performed once user clicks on an element on the list. Otherwise, \r\n * the element will be selected on the list and the selection will be performed once the user clicks on the submit button.\r\n *\r\n * options parameter must contain the list of elements that will be displayed to the user  \r\n */\r\n@Component({\n    selector: 'tg-dialog-single-selection-list',\n    imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule],\n    providers: [],\n    templateUrl: './dialog-single-selection-list.component.html',\n    styleUrls: ['./dialog-single-selection-list.component.scss']\n})\r\n\r\n\r\nexport class DialogSingleSelectionListComponent extends DialogBaseComponent {\r\n    \r\n    \r\n    static readonly DIALOG_CLASS_NAME = 'DialogSingleSelectionListComponent';\r\n    \r\n    \r\n    /**\r\n     * Declare a reference to the string utils class so it can be used on the html part\r\n     */\r\n    stringUtils = StringUtils;\r\n    \r\n    /** \r\n     * Contains the list of elements that will be directly shown to the user at the component list.\r\n     * It may be filtered or not depending on this component setup and the user input\r\n     */\r\n    filteredOptions:string[] = [];\r\n    \r\n    \r\n    /**\r\n     * Stores the number of options that are currently visible to the user\r\n     */\r\n    filteredOptionsCount = 0;\r\n    \r\n    \r\n    /**\r\n     * Contains the original list of elements that are provided to be listed on this component before\r\n     * being possibly filtered. It is only used as a backup, not shown to the user\r\n     */\r\n    private originalOptions:string[] = [];\r\n    \r\n    \r\n    /**\r\n     * The same list as the originally provided but processed for a better text search.\r\n     * It will be used to perform the search, but not shown to the user.\r\n     */\r\n    private originalOptionsFullTextSearch:string[] = [];\r\n       \r\n    \r\n    /**\r\n     * Stores the index for the element that's been selected by the user\r\n     */\r\n    selectedItemIndex = -1;\r\n    \r\n    \r\n    constructor(public elementRef: ElementRef,\r\n    \t\t\tpublic dialogRef: MatDialogRef<DialogBaseComponent>,\r\n                public browserService: BrowserService,\r\n                @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n\r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogSingleSelectionListComponent expects 4 texts: The title, the description (optional), the filter input title (optional), and the submit button caption');\r\n        }\r\n        \r\n        if (data.options.length < 1) {\r\n\r\n            throw new Error('DialogSingleSelectionListComponent expects one or more options');\r\n        }\r\n        \r\n        this.originalOptions = data.options;\r\n        this.filteredOptionsCount = this.originalOptions.length;\r\n        \r\n        for(let option of this.originalOptions){\r\n            \r\n            this.filteredOptions.push(option);\r\n            this.originalOptionsFullTextSearch.push(StringUtils.formatForFullTextSearch(option));\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Method to calculate the max possible height that the list items container is allowed to have\r\n     */\r\n    getListItemsContainerMaxheight(){\r\n        \r\n        return (this.browserService.getWindowHeight() * 0.6) + 'px';\r\n    }\r\n    \r\n    \r\n    /**\r\n     * If the user presses enter key and there's only one element filtered in the list, we will close this dialog\r\n     * setting that element as the selected.\r\n     */\r\n    onIntroKeyPress(){\r\n\r\n        if(this.filteredOptionsCount === 1){\r\n            \r\n            for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++){\r\n                \r\n                if(this.filteredOptions[i] !== ''){\r\n                    \r\n                    this.closeDialog(i);\r\n                    \r\n                    return;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * When the user types a value on the input element to filter the list, this method will perform\r\n     * that filtering and refresh the list\r\n     */\r\n    onSearchChange(input:HTMLInputElement){\r\n\r\n        this.selectedItemIndex = -1;\r\n        this.filteredOptionsCount = 0;\r\n       \r\n        let inputValue = StringUtils.formatForFullTextSearch(input.value);\r\n\r\n        for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++){\r\n\r\n            if(inputValue === '' ||\r\n               this.originalOptionsFullTextSearch[i].indexOf(inputValue) >= 0){\r\n\r\n                this.filteredOptions[i] = this.originalOptions[i];\r\n                this.filteredOptionsCount ++;\r\n\r\n            }else{\r\n\r\n                this.filteredOptions[i] = '';\r\n            }\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * This method is used to greatly improve ngFor performance with arrays of primitive values. It tells the refresh\r\n     * function to work by index instead of by value. The change in performance when refreshing the list is massive. \r\n     */\r\n    trackByFn = (index: number, _value: string) => index;\r\n}\r\n","<h3>\r\n    {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 &amp;&amp; !stringUtils.isEmpty(data.texts[1])\">\r\n    {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 &amp;&amp; !stringUtils.isEmpty(data.texts[2])\"\r\n    class=\"searchItemInputContainer\">\r\n    \r\n    <mat-label>{{data.texts[2]}}</mat-label>\r\n    <input matInput autoFocusOnDisplay\r\n        (keyup.enter)=\"onIntroKeyPress()\"\r\n        (input)=\"onSearchChange($event.target)\">\r\n        \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n    [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n    <div class=\"listItemContainer\"\r\n        [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n        *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n        (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n    \r\n        <p *ngIf=\"item !== ''\">\r\n            {{item}}\r\n        </p>\r\n    \r\n    </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n    [disabled]=\"selectedItemIndex < 0\"\r\n    (click)=\"closeDialog(selectedItemIndex)\"\r\n    *ngIf=\"data.texts.length > 3\">\r\n\r\n    {{data.texts[3]}}\r\n    \r\n</button>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, ElementRef, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { DialogBaseComponent } from '../dialog-base/dialog-base.component';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TurboGuiAngularModule } from '../../../model/modules/turbogui-angular.module';\r\nimport { StringUtils } from 'turbocommons-ts';\r\n\r\n\r\n@Component({\r\n    selector: 'tg-dialog-single-input',\r\n    imports: [CommonModule, MatButtonModule, MatInputModule, FormsModule,\r\n        TurboGuiAngularModule],\r\n    providers: [],\r\n    templateUrl: './dialog-single-input.component.html',\r\n    styleUrls: ['./dialog-single-input.component.scss']\r\n})\r\n\r\n\r\n/**\r\n * A dialog component with a single input element and an accept button, to be used with dialog service\r\n * It lets us easily ask the user for any arbitrary text we may need.\r\n * \r\n * 1st text is the dialog title\r\n * 2nd text is the dialog subtitle (leave it empty to hide the subtitle)\r\n * 3rd text is the input prompt caption\r\n * 4rd text is the default value of the input contents\r\n * \r\n * 1st option will be the text on the unique save button that exists on the dialog\r\n */\r\nexport class DialogSingleInputComponent extends DialogBaseComponent {\r\n\r\n    \r\n    static readonly DIALOG_CLASS_NAME = 'DialogSingleInputComponent';\r\n    \r\n    \r\n    /**\r\n     * Contains the text that the user types on the dialog input\r\n     */\r\n    inputText = '';\r\n    \r\n    \r\n    /**\r\n    * Contains the default text that's been specified for the input\r\n    */\r\n    defaultTextValue = '';\r\n    \r\n\r\n    constructor(public elementRef: ElementRef, public dialogRef: MatDialogRef<DialogBaseComponent>, @Inject(MAT_DIALOG_DATA) public data: any) {\r\n\r\n        super(elementRef, dialogRef);\r\n        \r\n        if (data.texts.length < 1) {\r\n\r\n            throw new Error('DialogSingleInputComponent expects 1 text: The dialog title');\r\n        }\r\n\r\n        if (data.options.length !== 1) {\r\n\r\n            throw new Error('DialogSingleInputComponent expects only one option');\r\n        }\r\n        \r\n        if (data.texts.length > 3) {\r\n\r\n            this.inputText = data.texts[3]; \r\n            this.defaultTextValue = data.texts[3]; \r\n        }\r\n    }\r\n    \r\n    \r\n    isButtonDisabled(){\r\n        \r\n        if (this.defaultTextValue !== '' && this.inputText === this.defaultTextValue) {\r\n\r\n            return true;\r\n        }\r\n        \r\n        return StringUtils.isEmpty(this.inputText);\r\n    }\r\n    \r\n    \r\n    closeDialog(){\r\n    \r\n        super.closeDialog(0, this.inputText);       \r\n    }\r\n}","<h3>\r\n    {{data.texts[0]}}\r\n</h3>\r\n\r\n<p *ngIf=\"data.texts.length > 1 && data.texts[1] !== ''\">\r\n    {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field>\r\n\r\n    <mat-label>{{data.texts[2]}}</mat-label>\r\n    <input matInput autoFocusOnDisplay autoSelectTextOnFocus\r\n        (keyup.enter)=\"closeDialog()\"\r\n        [(ngModel)]=\"inputText\">\r\n        \r\n</mat-form-field>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n    [disabled]=\"isButtonDisabled()\"\r\n    (click)=\"closeDialog()\">\r\n    \r\n    {{data.options[0]}}\r\n    \r\n</button>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { HostBinding, HostListener, Input, OnInit, Directive } from '@angular/core';\r\n\r\n\r\n/**\r\n * This is the base class for all button components\r\n */\r\n@Directive()\nexport abstract class ButtonBaseComponent implements OnInit {\r\n\r\n\r\n    /**\r\n     * Defines the actual opacity that is binded on the html part\r\n     */\r\n    @HostBinding('style.opacity') currentOpacity = .7;\r\n\r\n\r\n    /**\r\n     * Defines the actual scale that is binded on the html part\r\n     */\r\n    @HostBinding('style.transform') currentScale = 'scale(1)';\r\n    \r\n    \r\n    /**\r\n     * Defines if the button can be clicked or not\r\n     */\r\n    @HostBinding('style.pointer-events') pointerEvents = 'initial';\r\n\r\n\r\n    /**\r\n     * Specifies if the button animations must rollback when the user releases the mouse or pointer after pressing it\r\n     */\r\n    @Input() releaseOnMouseUp = true;\r\n    \r\n    \r\n    /**\r\n     * Specifies the amount of milliseconds that the button will vibrate when it gets clicked (only on compatible devices and browsers)\r\n     * Set it to 0 to disable click vibration\r\n     */\r\n    @Input() vibrateOnClick = 25;\r\n\r\n\r\n    /**\r\n     * Defines the button opacity when it is not clicked\r\n     */\r\n    @Input() defaultOpacity = .7;\r\n\r\n\r\n    /**\r\n     * Defines the image scale when it is not clicked\r\n     */\r\n    @Input() defaultScale = 1;\r\n\r\n\r\n    /**\r\n     * Defines the button opacity when it is hovered\r\n     */\r\n    @Input() hoverOpacity = .8;\r\n\r\n\r\n    /**\r\n     * Defines the image scale when it is hovered\r\n     */\r\n    @Input() hoverScale = 1;\r\n\r\n\r\n    /**\r\n     * Defines the button opacity when it is clicked\r\n     */\r\n    @Input() clickOpacity = 1;\r\n\r\n\r\n    /**\r\n     * Defines the image scale when it is clicked\r\n     */\r\n    @Input() clickScale = 1;\r\n    \r\n    \r\n    /**\r\n     * Defines the button opacity when it is disabled\r\n     */\r\n    @Input() disabledOpacity = .2;\r\n\r\n\r\n    /**\r\n     * Stores the value that tells if the button is enabled or disabled\r\n     */\r\n    private _enabled = true;\r\n    \r\n\r\n    /**\r\n     * Specifies if the button is enabled or disabled\r\n     */\r\n    @Input() set enabled(v:boolean){\r\n        \r\n        this._enabled = v;\r\n        \r\n        this.currentOpacity = v ? this.defaultOpacity : this.disabledOpacity;\r\n        \r\n        this.pointerEvents = v ? 'initial' : 'none'; \r\n    };\r\n\r\n\r\n    /**\r\n     * Set button default values\r\n     */\r\n    ngOnInit() {\r\n\r\n        this.currentOpacity = this._enabled ? this.defaultOpacity : this.disabledOpacity;\r\n        this.currentScale = 'scale(1)';\r\n    }\r\n\r\n\r\n    /**\r\n     * Listens for the mouse over the button component\r\n     */\r\n    @HostListener('mouseover')\r\n    onMouseOver() {\r\n\r\n        if(this._enabled){\r\n            \r\n            this.currentOpacity = this.hoverOpacity;\r\n            this.currentScale = 'scale(' + (this.hoverScale as any as string) + ')';\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Listens for the mouse out of the button component\r\n     */\r\n    @HostListener('mouseout')\r\n    @HostListener('pointerout')\r\n    @HostListener('pointerleave')\r\n    onMouseOut() {\r\n\r\n        if(this._enabled){\r\n            \r\n            this.currentOpacity = this.defaultOpacity;\r\n            this.currentScale = 'scale(' + (this.defaultScale as any as string) + ')';\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Listens for the mouse down on the button component\r\n     */\r\n    @HostListener('pointerdown')\r\n    onMouseDown() {\r\n\r\n        if(this._enabled){\r\n            \r\n            this.currentOpacity = this.clickOpacity;\r\n            this.currentScale = 'scale(' + (this.clickScale as any as string) + ')'; \r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Listens for the mouse up of the button component\r\n     */\r\n    @HostListener('pointerup')\r\n    onMouseUp() {\r\n\r\n        if (this._enabled) {\r\n            \r\n            if (this.vibrateOnClick > 0 && window.navigator && window.navigator.vibrate) {\r\n                \r\n                window.navigator.vibrate(this.vibrateOnClick);\r\n            }\r\n            \r\n            if(this.releaseOnMouseUp){\r\n                \r\n                this.currentOpacity = this.defaultOpacity;\r\n                this.currentScale = 'scale(' + (this.defaultScale as any as string) + ')';\r\n            }\r\n        }\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, HostBinding, Input, OnInit } from '@angular/core';\r\nimport { FadeAnimationClass } from '../../animations/fade.animation';\r\nimport { ButtonBaseComponent } from '../../../view/components/button-base/button-base.component';\r\n\r\n\r\n@Component({\n    selector: 'tg-button-image',\n    imports: [],\n    providers: [],\n    templateUrl: './button-image.component.html',\n    animations: [FadeAnimationClass.getTrigger('buttonFade', '300ms ease', '300ms ease')],\n    styleUrls: ['./button-image.component.scss']\n})\r\n\r\n\r\n/**\r\n * This component is a basic button that uses an image as its visual appearance\r\n */\r\nexport class ButtonImageComponent extends ButtonBaseComponent implements OnInit {\r\n\r\n\r\n    /**\r\n     * This is used to attach the fade animation directly to this component so it fades in and out when created and removed from the app\r\n     */\r\n    @HostBinding('@buttonFade') buttonFade = true;\r\n\r\n\r\n    /**\r\n     * Defines the path to the image that is shown by this button\r\n     */\r\n    @Input() src = '';\r\n\r\n\r\n    /**\r\n     * Defines the percentual size of the image based on the button size. 100 means the image will fill the whole button,\r\n     * 50 only half, etc..\r\n     */\r\n    @Input() percentSize = 100;\r\n}\r\n","<img src=\"{{src}}\"\r\n    [style.width]=\"percentSize + '%'\"\r\n    [style.height]=\"percentSize + '%'\" />","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { Component, HostBinding } from '@angular/core';\r\nimport { FadeAnimationClass } from '../../animations/fade.animation';\r\nimport { ButtonBaseComponent } from '../../../view/components/button-base/button-base.component';\r\n\r\n\r\n@Component({\n    selector: 'tg-button-container',\n    imports: [],\n    providers: [],\n    templateUrl: './button-container.component.html',\n    animations: [FadeAnimationClass.getTrigger('buttonFade', '300ms ease', '300ms ease')],\n    styleUrls: ['./button-container.component.scss']\n})\r\n\r\n\r\n/**\r\n * This component is a basic button without visual appearance, that is used as a container to load any content.\r\n */\r\nexport class ButtonContainerComponent extends ButtonBaseComponent {\r\n\r\n\r\n    /**\r\n     * This is used to attach the fade animation directly to this component so it fades in and out when created and removed from the app\r\n     */\r\n    @HostBinding('@buttonFade') buttonFade = true;\r\n}\r\n","<ng-content></ng-content>","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n/**\r\n * Defines the data that is contained inside a GUI notification\r\n */\r\nexport class GUINotification {\r\n\r\n\r\n    constructor(name: string, type = '', data: any = null) {\r\n\r\n        this.name = name;\r\n        this.type = type;\r\n        this.data = data;\r\n    }\r\n\r\n\r\n    /**\r\n     * The name for this notification\r\n     */\r\n    name = '';\r\n\r\n\r\n    /**\r\n     * An optional type to categorize this notification in case the name is not enough\r\n     * to uniquely identify it\r\n     */\r\n    type = '';\r\n\r\n\r\n    /**\r\n     * Additional data to send with the notification\r\n     */\r\n    data: any = null;\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\nimport { ViewContainerRef } from \"@angular/core\";\nimport { ViewService } from \"./ViewService\";\n\r\n\r\n/**\r\n * This is a base class that helps managing our application pages.\r\n * We should extend this class to create our application pages, as it forces us to set the viewContainerRef and the viewService, \r\n * which are both used when working with pages.\r\n * \r\n * IMPORTANT!!! View services are created and destroyed when the page is created and destroyed. It is vital to specify the view service \r\n * as a provider for the page to ensure that it will be created and destroyed when the view is created and destroyed.\r\n * \r\n * Example:\r\n * \r\n * @Component({\r\n *   ...\r\n *   selector: 'app-my-view-page',\r\n *   providers: [MyViewService]\r\n *   ...\r\n *})  \r\n */\r\nexport abstract class View {\r\n\r\n\r\n\t/**\r\n\t * This constructor is specifically designed to force the following:\r\n     * \r\n     * - Set the viewContainerRef which will be automatically assigned to the respective view service.\r\n     * \r\n     * - If the view has no service, we can set it to null, but it is recommended to always use a service with a view, to store the view state and global methods \r\n\t */\r\n\tconstructor(public viewContainerRef: ViewContainerRef, public viewService:ViewService|null) {\r\n\t\r\n\t\tif(viewService !== null){\r\n\t\t\t\r\n\t\t\tviewService.viewContainerRef = viewContainerRef;\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\nimport { ViewContainerRef } from \"@angular/core\";\n\r\n\r\n/**\r\n * Defines a service that is attached to an application view.\r\n * All our service components that are linked to a view must extend this class so they can be correctly initialized at the view constructor.\r\n */\r\nexport abstract class ViewService {\r\n\r\n\r\n\t/**\r\n\t * A reference to the view container ref which is necessary to propagate the view providers and services to related dialogs\r\n\t */\r\n    viewContainerRef: ViewContainerRef;\t\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\n\r\n/**\r\n * Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed\r\n * several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:\r\n * we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.\r\n * So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.\r\n * Lots of other UI interaction usages may be interesting with this class.\r\n */\r\nexport class DelayedMethodCallManager{\r\n\r\n\r\n    private _functionsToExecute: Function[] = [];\r\n\r\n\r\n    private _timerIsRunning = false;\r\n    \r\n    \r\n    private _setTimeoutHandler: any = null;\r\n    \r\n\r\n    /**\r\n     * Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed\r\n     * several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:\r\n     * we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.\r\n     * So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.\r\n     * Lots of other UI interaction usages may be interesting with this class.\r\n     *\r\n     * @param delay Amount of time to wait before executing the operations . Defaults to 1000 miliseconds.\r\n     */\r\n    constructor(private delay = 1000) {\r\n       \r\n    }\r\n    \r\n    \r\n    /**\r\n     * Add a method to be called once the delay time is finished.\r\n     * Every time a new call to queue is performed, the delay timer is restarted. When the delay time finishes, only the\r\n     * last of the methods that have been pushed by call() will be executed.\r\n     *\r\n     * Use it to queue several user input operations that should be called only once in a period of time, while waiting\r\n     * for the user to finish his input.\r\n     *\r\n     * @param method The function that will be queued for execution after the delay time has passed\r\n     */\r\n    queue(method: () => void){\r\n        \r\n        this._functionsToExecute.push(method);\r\n        \r\n        if(this._timerIsRunning){\r\n            \r\n            clearTimeout(this._setTimeoutHandler);\r\n        }\r\n            \r\n        this._timerIsRunning = true;\r\n            \r\n        this._setTimeoutHandler = setTimeout(() => {this.run() }, this.delay);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Abort all methods that may have been pushed to this class and are waiting to be executed, so none of them\r\n     * is executed when the delay time finishes. Basically everything is cleared and stoped when this method is called.\r\n     */\r\n    cancel(){\r\n        \r\n        if(this._setTimeoutHandler !== null){\r\n            \r\n            clearTimeout(this._setTimeoutHandler);\r\n        }\r\n        \r\n        this._functionsToExecute = [];\r\n        \r\n        this._timerIsRunning = false;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Auxiliary function that performs the call to the latest queued method\r\n     */\r\n    private run(){\r\n        \r\n        (this._functionsToExecute.pop() as () => void)();\r\n        \r\n        this._functionsToExecute = [];\r\n        \r\n        this._timerIsRunning = false;\r\n    }\r\n}\r\n","/**\r\n * TurboGUI is A library that helps with the most common and generic UI elements and functionalities\r\n *\r\n * Website : -> http://www.turbogui.org\r\n * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.\r\n * License Url : -> http://www.apache.org/licenses/LICENSE-2.0\r\n * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com\r\n */\r\n\r\nimport { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\r\nimport { StringUtils } from 'turbocommons-ts';\r\n\r\n\r\n/**\r\n * Validation class that extends the base angular Form Validators class and adds extra useful validators \r\n */\r\nexport class ValidatorsPlus extends Validators {\r\n    \r\n    \r\n    /**\r\n     * Verify that the data of a form value is required and also Not semantically empty, just like the\r\n     * TurboCommons StringUtils.isEmpty method does\r\n     */\r\n    static nonEmpty(control: FormControl) {\r\n\r\n        // Apply first the required validation\r\n        let validateRequired = Validators.required(control);\r\n        \r\n        if(validateRequired !== null){\r\n\r\n            return validateRequired;\r\n        }\r\n                \r\n        // first check if the control has a value\r\n        if (control.value && control.value.length > 0) {\r\n\r\n            if(StringUtils.isEmpty(control.value)){\r\n                \r\n                return { isEmpty: true };\r\n            \r\n            }else{\r\n                \r\n                return null;\r\n            }\r\n            \r\n        } else {\r\n            \r\n          return null;\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Validator to check that at least one of the specified form controls has a non empty value.\r\n     * Non empty criteria is the same as the nonEmpty validator on this same class, which verifies that the value is not semantically empty.\r\n     * \r\n     * To use this validator, you need to pass an array of control names that you want to check. And set it to the validators property\r\n     * of the form builder group. \r\n     * \r\n     * @param controlNames An array of control names to check. For example, ['name', 'surname'].\r\n     * \r\n     * @returns A validator function.\r\n     */\r\n    static atLeastOneIsNotEmpty(controlNames: string[]): ValidatorFn {\r\n        \r\n        return (control: AbstractControl): ValidationErrors | null => {\r\n            \r\n            const formGroup = control as FormGroup;\r\n            \r\n            const hasValue = controlNames.some(name => {\r\n                \r\n                const formControl = formGroup.get(name);\r\n                \r\n                // Check if it's a FormControl and if it's not empty\r\n                return formControl instanceof FormControl && ValidatorsPlus.nonEmpty(formControl) === null;\r\n            });\r\n\r\n            return hasValue ? null : { atLeastOneRequired: true };\r\n        };\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Validator to check that a control value is a valid mobile phone number with country code.\r\n     * \n     * The expected format is: +<country code><number>, where:\n     *    - <country code> is 1 to 3 digits\n     *    - <number> is 6 to 14 digits\n     * \n     * The country code must be prefixed with a plus sign (+). Spaces, dots (.), and hyphens (-) are allowed as separators.\n     * \n     * Examples of valid formats:\n     * - +1 1234567890\n     * - +44-1234-567890\n     * - +91.9876543210\n     * \n     * Examples of invalid formats:\n     * - 1234567890 (missing country code)\n     * - +123 (too short)\n     * - +123456789012345671 (too long)\n     * \n     * @param control The form control to validate.\r\n     * \n     * @returns An object with the validation error if invalid, or null if valid.\r\n     */\r\n    static mobilePhoneWithCountryCode(control: FormControl) {\r\n    \r\n        const mobilePhoneRegex = /^\\+\\d{1,3}[\\s.-]?\\d{6,14}$/;\r\n        \n        const valid = mobilePhoneRegex.test(control.value);\r\n        \n        return valid ? null : { mobilePhoneWithCountryCode: true };\r\n    }\r\n}\r\n","/*\n * Public API Surface of turbogui-angular\n */\n\nexport { TurboGuiAngularModule } from './main/model/modules/turbogui-angular.module';\n\n\n/**\n * Services\n */\nexport { NotificationService } from './main/controller/notification.service';\nexport { GlobalErrorService } from './main/controller/globalerror.service';\nexport { HTTPService } from './main/controller/http.service';\nexport { HTTPServiceGetRequest } from './main/controller/httpservice/HTTPServiceGetRequest';\nexport { HTTPServicePostRequest } from './main/controller/httpservice/HTTPServicePostRequest';\nexport { TurboApiService } from './main/controller/turbo-api.service';\nexport { DialogService } from './main/controller/dialog.service';\nexport { BrowserService } from './main/controller/browser.service';\nexport { RouterBaseService } from './main/controller/router-base.service';\nexport { LocalesBaseService } from './main/controller/locales-base.service';\n\n\n/**\n * Components\n */\nexport { BusyStateBaseComponent } from './main/view/components/busy-state-base/busy-state-base.component';\nexport { DialogBaseComponent } from './main/view/components/dialog-base/dialog-base.component';\nexport { DialogDateSelectionComponent } from './main/view/components/dialog-date-selection/dialog-date-selection.component';\nexport { DialogErrorComponent } from './main/view/components/dialog-error/dialog-error.component';\nexport { DialogIFrameComponent } from './main/view/components/dialog-iframe/dialog-iframe.component';\nexport { DialogImageComponent } from './main/view/components/dialog-image/dialog-image.component';\nexport { DialogSingleOptionComponent } from './main/view/components/dialog-single-option/dialog-single-option.component';\nexport { DialogTwoOptionComponent } from './main/view/components/dialog-two-option/dialog-two-option.component';\nexport { DialogMultipleOptionComponent } from './main/view/components/dialog-multiple-option/dialog-multiple-option.component';\nexport { DialogSingleSelectionListComponent } from './main/view/components/dialog-single-selection-list/dialog-single-selection-list.component';\nexport { DialogSingleInputComponent } from './main/view/components/dialog-single-input/dialog-single-input.component';\nexport { ButtonImageComponent } from './main/view/components/button-image/button-image.component';\nexport { ButtonContainerComponent } from './main/view/components/button-container/button-container.component';\n\n\n/**\n * Classes\n */\nexport { GUINotification } from './main/model/classes/GUINotification';\nexport { SingletoneStrictClass } from './main/model/classes/SingletoneStrictClass';\nexport { View } from './main/model/classes/View';\nexport { ViewService } from './main/model/classes/ViewService';\nexport { DelayedMethodCallManager } from './main/managers/DelayedMethodCallManager';\nexport { FadeAnimationClass } from './main/view/animations/fade.animation';\nexport { ElementClickOutsideDirective } from './main/view/directives/ElementClickOutsideDirective';\nexport { ElementCreatedDirective } from './main/view/directives/ElementCreatedDirective';\nexport { ElementDestroyedDirective } from './main/view/directives/ElementDestroyedDirective';\nexport { AutoFocusOnDisplayDirective } from './main/view/directives/AutoFocusOnDisplayDirective';\nexport { AutoSelectTextOnFocusDirective } from './main/view/directives/AutoSelectTextOnFocusDirective';\nexport { ValidatorsPlus } from './main/view/forms/ValidatorsPlus';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i3","i2","i1","i1.DialogService","i2.BrowserService","i5.AutoFocusOnDisplayDirective","i6.AutoFocusOnDisplayDirective","i7.AutoSelectTextOnFocusDirective"],"mappings":"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"}