{"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-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/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/controller/locales-base.service.ts","../../../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-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/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/** This directive is used to trigger an event when the user clicks outside of an element */\r\n@Directive({\r\n    selector: '[elementClickOutside]',\r\n    standalone: false\r\n})\r\n\r\n\r\n/**\r\n * This directive is used to execute an action when the user clicks outside of an element.\r\n * If we set the elementClickOutside tag to the html element and set the onClickOutside event to a function: <element elementClickOutside (onClickOutside)=\"onClickedOutside()\" ...,\r\n * this function will be executed when the user clicks outside of the element.\r\n */\r\nexport class ElementClickOutsideDirective {\r\n    \r\n    \r\n    @Output() onClickOutside = 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.onClickOutside.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')\r\n    public 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')\r\n    public 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 el: ElementRef, private zone: NgZone, private 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 el: ElementRef, private 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\nimport { Type, inject } from \"@angular/core\";\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 { 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 { take } from 'rxjs/operators';\r\nimport { ArrayUtils, NumericUtils } from 'turbocommons-ts';\r\nimport { Type, Injectable, Injector, ApplicationRef, Renderer2, RendererFactory2, ViewContainerRef, EnvironmentInjector } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\r\nimport { BusyStateBaseComponent } from '../view/components/busy-state-base/busy-state-base.component';\r\nimport { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\r\nimport { DialogBaseComponent } from '../view/components/dialog-base/dialog-base.component';\r\nimport { DialogDateSelectionComponent } from '../view/components/dialog-date-selection/dialog-date-selection.component';\nimport { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\n\r\n\r\n/**\r\n * Manages the application modal and non modal floating elements\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class DialogService extends SingletoneStrictClass {\r\n\r\n\r\n    /**\r\n     * Used to modify the busy state component that is shown by default by the addModalBusyState() method.\r\n     *\r\n     * @see this.addModalBusyState()\r\n     */\r\n    customBusyStateComponentClass: Type<BusyStateBaseComponent> = BusyStateBaseComponent;\r\n\r\n\r\n    /**\r\n     * Check public getter for docs\r\n     */\r\n    private _isEnabled = true;\r\n\r\n\r\n    /**\r\n     * Tells if the main application is currently showing a busy state that blocks all user interaction\r\n     */\r\n    private _isShowingBusyState = false;\r\n\r\n\r\n    /**\r\n     * A reference to the modal busy state component that is initialized only the first time it is called.\r\n     *\r\n     * (To append the busy state dynamically, we use the Portal concept from the angular material library)\r\n     */\r\n    private _componentPortal: ComponentPortal<BusyStateBaseComponent> | null = null;\r\n\r\n\r\n    /**\r\n     * A reference to the modal busy state container where the component will be added\r\n     */\r\n    private _modalBusyStateHost: DomPortalOutlet | null = null;\r\n\r\n\r\n    /**\r\n     * Tells if the manager is currently showing a snackbar element or not\r\n     */\r\n    private _isShowingSnackBar = false;\r\n\r\n\r\n    /**\r\n     * Contains a list of the dialogs (MODAL AND NON MODAL) that are currently visible to the user.\r\n     * Each item in this list is a hash that is computed when dialog is created to uniquely identify it.\r\n     *\r\n     * Empty list means no dialogs are currently visible\r\n     */\r\n    private _activeDialogs: string[] = [];\r\n\r\n\r\n    /**\r\n     * Contains a list with all the MatDialog instances that are currently visible to the user.\r\n     * The list uses the same order as the list of _activeDialogs hash values\r\n     */\r\n    private _activeDialogInstances: MatDialogRef<DialogBaseComponent>[] = [];\r\n\r\n\r\n    /**\r\n     * Counts the number of dialogs that are currently open and that can be closed by the user by navigating with the browser\r\n     */\r\n    private _activeCloseableDialogs = 0;\r\n\r\n\r\n    /**\r\n     * Used to store the initialized Renderer 2 instance that is used by this class\r\n     */\r\n    private readonly _renderer: Renderer2;\r\n\r\n\r\n    /**\r\n     * Method that is used to delete the window beforeunload event listener once not used anymore\r\n     */\r\n    private _windowBeforeUnloadUnListen: (() => void) | null = null;\r\n\r\n\r\n    /**\r\n     * Method that is used to delete the document keydown event listener once not used anymore\r\n     */\r\n    private _documentKeydownUnlisten: (() => void) | null = null;\r\n\r\n\r\n    /**\r\n     * Method that is used to delete the document mousedown event listener once not used anymore\r\n     */\r\n    private _documentMousedownUnlisten: (() => void) | null = null;\r\n\r\n\r\n    /**\r\n     * Method that is used to delete the document pointerdown event listener once not used anymore\r\n     */\r\n    private _documentPointerdownUnlisten: (() => void) | null = null;\r\n\r\n\r\n    constructor(rendererFactory: RendererFactory2,\r\n                private readonly matSnackBar: MatSnackBar,\r\n                private readonly matDialog: MatDialog,\r\n                private readonly injector: Injector,\r\n                private readonly applicationRef: ApplicationRef,\r\n                private readonly environmentInjector: EnvironmentInjector) {\r\n\r\n\t\tsuper(DialogService);\r\n\r\n        this._renderer = rendererFactory.createRenderer(null, null);\r\n    }\r\n\r\n\r\n    /**\r\n     * Tells if this dialog service is enabled or not. If dialog service is disabled, none of it's features will work\r\n     * This is used to block all dialog features normally when shutting down the application\r\n     *\r\n     * Use with caution. When this is set to false, dialog service stops working.\r\n     */\r\n    set isEnabled(v: boolean) {\r\n\r\n        if (v === this._isEnabled) {\r\n\r\n            return;\r\n        }\r\n\r\n        this._isEnabled = v;\r\n    }\r\n\r\n\r\n    /**\r\n     * Enables a warning that will be shown to the user when he/she tries to close the application.\r\n     * This warning will prompt the user to continue with the exit process or cancel it.\r\n     * The specific texts of this message are a generic ones and cannot be changed.\r\n     *\r\n     * IMPORTANT: This method must be called after the main application has been initialized in order to work,\r\n     * otherwise it will do nothing.\r\n     */\r\n    addCloseApplicationWarning() {\r\n\r\n        this._windowBeforeUnloadUnListen ??= this._renderer.listen('window', 'beforeunload', (event) => event.returnValue = true);\r\n    }\r\n\r\n\r\n    /**\r\n     * Remove the close application warning message if previously assigned\r\n     */\r\n    removeCloseApplicationWarning() {\r\n\r\n        if (this._windowBeforeUnloadUnListen !== null) {\r\n\r\n            this._windowBeforeUnloadUnListen();\r\n            this._windowBeforeUnloadUnListen = null;\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Change the application visual appearance so the user perceives that the application is\r\n     * currently busy. While modal busy state is enabled, no user input is possible neither via\r\n     * keyboard, mouse or touch. Use this state when performing server requests or operations that\r\n     * must block the user interaction with the application. To allow user interaction again, you must\r\n     * call removeModalBusyState()\r\n     *\r\n     * Notice: We can modify the busy state visual component that is shown by this method. To do it, we must\r\n     * set this.customBusyStateComponentClass property with our own custom busy state component class. (We can do it at\r\n     * our main application component constructor for example). Our custom component must extend the\r\n     * BusyStateBaseComponent one to add its own visual appearance.\r\n     *\r\n     * @see this.customBusyStateComponentClass\r\n     */\r\n    addModalBusyState() {\r\n\r\n        if (!this._isEnabled || this._isShowingBusyState) {\r\n\r\n            return;\r\n        }\r\n\r\n        this._disableUserInteraction();\r\n\r\n        // Dynamically create the busy state component reference if this is the first time\r\n        if (this._componentPortal === null) {\r\n\r\n            this._componentPortal = new ComponentPortal(this.customBusyStateComponentClass);\r\n\r\n            // Create a PortalHost with document.body as its anchor element\r\n            this._modalBusyStateHost = new DomPortalOutlet(\r\n                    document.body,\r\n                    this.environmentInjector,\r\n                    this.applicationRef,\r\n                    this.injector);\r\n        }\r\n\r\n        (this._modalBusyStateHost as DomPortalOutlet).attach(this._componentPortal);\r\n\r\n        this._isShowingBusyState = true;\r\n    }\r\n\r\n\r\n    /**\r\n     * Tells if the application is currently locked in a modal busy state (caused by an addModalBusyState() call)\r\n     */\r\n    get isShowingBusyState() {\r\n\r\n        return this._isShowingBusyState;\r\n    }\r\n\r\n\r\n    /**\r\n     * Cancel the application busy state and restore it back to normal so user interaction is allowed again\r\n     */\r\n    removeModalBusyState() {\r\n\r\n        if (!this._isEnabled || !this._isShowingBusyState) {\r\n\r\n            return;\r\n        }\r\n\r\n        if (this._componentPortal !== null) {\r\n\r\n            (this._modalBusyStateHost as DomPortalOutlet).detach();\r\n        }\r\n\r\n        this._enableUserInteraction();\r\n\r\n        this._isShowingBusyState = false;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * TODO - adapt from TS version\r\n     */\r\n    addToolTip() {\r\n\r\n        // TODO - adapt from TS version\r\n    }\r\n\r\n\r\n    /**\r\n     * Show a non modal snackbar notification to the user (Only one snack-bar can ever be opened at the same time).\r\n     *\r\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.\r\n     * They shouldn’t interrupt the user experience, and they don’t require user input to disappear.\r\n     *\r\n     * @param config A MatSnackBarConfig instance with the customizations we want for this snackbar\r\n     * @param message The message to show on the snackbar\r\n     * @param action If not empty, the text to place on the snackbar confirmation button\r\n     * @param actionCallback A method to execute once the user clicks into the action button.\r\n     *\r\n     * @return A promise that will be resolved once the snackbar is closed.\r\n     */\r\n    addSnackBar(config: MatSnackBarConfig, message: string, action = '') {\r\n\r\n        if (!this._isEnabled) {\r\n            \r\n            return Promise.reject(new Error('Dialog service is disabled'));\r\n        }\r\n\r\n        if (this._isShowingSnackBar) {\r\n            \r\n            throw new Error('Trying to show a snackbar while another one is still visible');\r\n        }\r\n\r\n        this._isShowingSnackBar = true;\r\n\r\n        return new Promise((resolve) => {\r\n            \r\n            const snackBarRef = this.matSnackBar.open(message, action === '' ? undefined : action, config);\r\n\r\n            // Handle action button click\r\n            snackBarRef.onAction().pipe(take(1)).subscribe(() => {\r\n                this._isShowingSnackBar = false;\r\n                resolve(true);\r\n            });\r\n\r\n            // Handle dismiss\r\n            snackBarRef.afterDismissed().pipe(take(1)).subscribe(() => {\r\n                this._isShowingSnackBar = false;\r\n                resolve(false);\r\n            });\r\n        });\r\n    }\r\n\r\n\r\n    /**\r\n     * Tells if the application is currently showing a snackbar or not\r\n     */\r\n    get isShowingSnackBar() {\r\n\r\n        return this._isShowingSnackBar;\r\n    }\r\n\r\n\r\n    /**\r\n     * Force the removal of the snack bar dialog if it exists.\r\n     *\r\n     * If no snackbar is currently visible, this method will do nothing\r\n     */\r\n    removeSnackBar() {\r\n\r\n        if (!this._isEnabled || !this._isShowingSnackBar) {\r\n\r\n            return;\r\n        }\r\n\r\n        this.matSnackBar.dismiss();\r\n\r\n        this._isShowingSnackBar = false;\r\n    }\r\n\r\n\r\n    /**\r\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\r\n     * this library or extend DialogBaseComponent to create our own custom ones.\r\n     *\r\n     * @param dialogComponentClass A class for a component that extends DialogBaseComponent, which will be the dialog that is shown to the user.\r\n     * @param properties An object containing the different visual and textual options that this dialog allows.\r\n     *                   IMPORTANT: texts, options and data values need to be read at the dialog component by declaring \"@Inject(MAT_DIALOG_DATA) public data: any\"\r\n     *                   at the dialog component constructor. This data object will contain the texts, options and data properties\r\n     *  \r\n     *            - id: The html unique identifier that the dialog will have once created. If not specified, no id will be explicitly set\r\n     *            - width: 50% by default. Specify the css value for the default dialog width. As the dialog is responsive, the value will be automatically\r\n     *              reduced if the available screen is not enough, and will reach the desired value otherwise. We can set any css unit like pixels, \r\n     *              %, vh, vw, or any other. For example: '400px', '50%', etc.\r\n     *            - maxWidth: Defines the maximum width that the dialog will have. We can specify it in % or vw, just like is done in\r\n     *              css. By default it is defined as 96vw, which will fit 96% of the viewport on small devices\r\n     *            - height: Unset by default. Specify the css value for the dialog height.\r\n     *            - maxHeight: Defines the maximum height that the dialog will have. We can specify it in % or vh, just like is done in\r\n         *          css. By default it is defined as 96vh, which will fit 96% of the viewport\r\n     *            - modal: True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed\r\n     *              by the user clicking outside it \r\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. \r\n     *            - texts: A list with strings containing the dialog texts, sorted by importance. When dialog has a title, this should\r\n     *              be placed first, subtitle second and so (Each dialog may accept a different custom number of texts).\r\n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.texts)\r\n     *            - options: A list of strings that will be used as button captions for each one of the accepted dialog options \r\n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.options)\r\n     *            - data: An object to pass any extra data we want to the dialog.\r\n     *              (add \"@Inject(MAT_DIALOG_DATA) public data: any\" to dialog constructor and read it with data.data)\r\n     *            - viewContainerRef: This is important if we want to propagate providers from a parent component to this dialog. We must specify \r\n\t *              this reference to make sure the same services injected on the parent are available too at the child dialog \r\n     * \r\n     * @return A promise that will be resolved once the dialog is closed.\r\n     *         The promise will receive a selection object with two properties which will correspond to the index and value from the options \r\n     *         array that's selected by the user. If no option selected, index will be -1 and value null\r\n     */\r\n    addDialog(dialogComponentClass: Type<DialogBaseComponent>,\r\n              properties: {id?: string,\r\n                           width?: string,\r\n                           maxWidth?: string,\r\n                           height?: string,\r\n                           maxHeight?: string,\r\n                           modal?: boolean,\r\n                           closeOnNavigation?: boolean,\r\n                           texts?: string[],\r\n                           options?: string[],\r\n                           data?: any,\r\n                           viewContainerRef?: ViewContainerRef}): Promise<{index: number, value?: any}> {\r\n\r\n        if (!this._isEnabled) {\r\n            \r\n            return Promise.reject(new Error('Dialog service is disabled'));\r\n        }\r\n        \r\n        return new Promise((resolve) => {\r\n            \r\n            // Set the default values for non specified properties\r\n            properties.modal = properties.modal ?? true;\r\n            properties.closeOnNavigation = properties.closeOnNavigation ?? !properties.modal;\r\n            properties.texts = properties.texts ?? [];\r\n            properties.options = properties.options ?? [];\r\n            properties.data = properties.data ?? {};\r\n\r\n            // Generate a string to uniquely identify this dialog on the list of active dialogs\r\n            // A dialog is considered as unique if the dialog id and texts are exactly the same. We do not take options into consideration\r\n            // as there may be dialogs with a big amount of options available.\r\n            let className = (dialogComponentClass as any).DIALOG_CLASS_NAME;\r\n            \r\n            if(className === '') {\r\n                \r\n                throw new Error(`The static property DIALOG_CLASS_NAME is not defined or is empty for this dialog component (${dialogComponentClass})`);     \r\n            }\r\n            \r\n            const dialogHash = className + properties.texts.join('');\r\n\r\n        \t// identical dialogs won't be allowed at the same time\r\n            if (this._activeDialogs.includes(dialogHash)) {\r\n                \r\n                return resolve({index: -1});\r\n            }\r\n\r\n            let dialogRefConfig:any = {\r\n                width: properties.width ?? \"50%\",\r\n                maxWidth: properties.maxWidth ?? \"96vw\",\r\n                maxHeight: properties.maxHeight ?? \"96vh\",\r\n                disableClose: properties.modal,\r\n                autoFocus: false,\r\n                closeOnNavigation: properties.closeOnNavigation,\r\n                viewContainerRef: properties.viewContainerRef,\r\n                data: { texts: properties.texts, options: properties.options, data: properties.data }\r\n            };                      \r\n            \r\n            // Dialog height will only be set if it is specified on properties\r\n            if(properties.height && properties.height !== undefined) {\r\n               \r\n                dialogRefConfig['height'] = properties.height; \r\n            }\r\n            \r\n            const dialogRef = this.matDialog.open(dialogComponentClass, dialogRefConfig);   \r\n\r\n            // Push a new state to handle browser navigation to close the dialog\r\n            if(properties.closeOnNavigation && this._activeCloseableDialogs === 0){\r\n                \r\n                history.pushState({ dialogOpen: true }, '');\r\n            }\r\n            \r\n\t\t\t// Assign the dialog ID only if specifically set on properties\r\n            if(properties.id && properties.id !== undefined) {\r\n                \r\n                dialogRef.id = properties.id;\r\n            }\r\n            \r\n            this._activeDialogs.push(dialogHash);\r\n            this._activeDialogInstances.push(dialogRef);\r\n            \r\n            if(properties.closeOnNavigation) {\r\n                \r\n                this._activeCloseableDialogs += 1;\r\n            }\r\n\r\n            dialogRef.beforeClosed().pipe(take(1)).subscribe((selection: {index: number, value?: any}) => {\r\n                \r\n                this._activeDialogs = ArrayUtils.removeElement(this._activeDialogs, dialogHash);\r\n                this._activeDialogInstances = ArrayUtils.removeElement(this._activeDialogInstances, dialogRef);\r\n\r\n                if(properties.closeOnNavigation) {\r\n                    \r\n                    // Remove dialog state from browser history\r\n                    if (this._activeCloseableDialogs === 1 && window.history.state?.dialogOpen) {\r\n                        \r\n                        history.back();\r\n                    }\r\n                    \r\n                    this._activeCloseableDialogs -= 1;\n                }\r\n                \r\n                if(!properties.modal && selection === undefined) {\r\n                    \r\n                    selection = { index: -1 };\r\n                    \r\n                } else if (!NumericUtils.isInteger(selection.index)) {\r\n                    \r\n                    throw new Error(`closeDialog() expects index to be an integer`);               \r\n                }\r\n\r\n                if(selection.index >= 0 && selection.value === null) {\r\n                    \r\n                    selection.value = properties.options![selection.index];\r\n                }\r\n\r\n                resolve(selection);\r\n            });\r\n        });\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Show a dialog with a calendar to let the user pick a date.\r\n     *\r\n     * @param properties An object containing the different visual and textual options that this dialog allows:\r\n     *            - id: The html unique identifier that the dialog will have once created. If not specified, no id will be explicitly set\r\n     *            - width: Specify the css value for the default dialog width. As the dialog is responsive, the value will be automatically\r\n     *              reduced if the available screen is not enough, and will reach the desired value otherwise. We can set any css unit like pixels, \r\n     *              %, vh, vw, or any other. For example: '400px', '50%', etc.\r\n     *            - maxWidth: Defines the maximum width that the dialog will have regarding the viewport. We can specify it in % or vw, just like is done in\r\n     *              css. By default it is defined as 96vw, which will fit 96% of the viewport on small devices\r\n     *            - height: TODO docs\r\n     *            - maxHeight: TODO docs\r\n     *            - modal: True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed\r\n     *              by the user clicking outside it \r\n     *            - title: An optional dialog title\r\n     *            - viewContainerRef: This is important to propagate providers from a parent component to this dialog. We must specify \r\n\t *              this reference to make sure the same services injected on the parent are available too at the child dialog\r\n     * \r\n     * @returns A Promise that resolves to a Date() object selected by the user or null if no selection was made \r\n     */\r\n    async addDateSelectionDialog(properties: {id?: string,\r\n                                              width?: string,\r\n                                              maxWidth?: string,\r\n                                              height?: string,\r\n                                              maxHeight?: string,\r\n                                              modal?: boolean,\r\n                                              title?: string,\r\n                           \t\t\t          viewContainerRef: ViewContainerRef}): Promise<Date|null> {\r\n\r\n        if (!this._isEnabled) {\r\n            \r\n            return null;\r\n        }\r\n\r\n        const selection = await this.addDialog(DialogDateSelectionComponent, {\r\n            id: properties.id ?? undefined,\r\n            width: properties.width ?? \"50%\",\r\n            maxWidth: properties.maxWidth ?? \"96vw\",\r\n            height: properties.height ?? \"auto\",\r\n            maxHeight: properties.maxHeight ?? \"92vw\",\r\n            modal: properties.modal ?? false,\r\n            texts: [properties.title ?? ''],\r\n            viewContainerRef: properties.viewContainerRef\r\n        });\r\n\r\n        return selection.index === -1 ? null : (selection.value as Date);\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Force the removal of all the dialogs that are currently visible.\r\n     *\r\n     * If no dialogs are currently visible, this method will do nothing\r\n     */\r\n    removeAllDialogs() {\r\n\r\n        if (!this._isEnabled) {\r\n\r\n            return;\r\n        }\r\n        \r\n        // If there are dialogs that should close on navigation and a history state was pushed, pop it\r\n        if (this._activeCloseableDialogs > 0 && window.history.state?.dialogOpen) {\r\n            \r\n            history.back();\r\n        }\r\n\r\n        for (const dialogRef of this._activeDialogInstances) {\r\n\r\n            dialogRef.close({index:-1});\r\n        }\r\n        \r\n        this._activeDialogs = [];\r\n        this._activeDialogInstances = [];\r\n        this._activeCloseableDialogs = 0;\r\n    }\r\n\r\n\r\n    /**\r\n     * TODO - translate from TS version\r\n     */\r\n//    addSideNav(){\r\n//\r\n//    }\r\n\r\n\r\n    /**\r\n     * TODO - translate from TS version\r\n     */\r\n//    get isShowingSideNav(){\r\n//\r\n//    }\r\n\r\n\r\n    /**\r\n     * TODO - translate from TS version\r\n     */\r\n//    removeSideNav(){\r\n//\r\n//    }\r\n\r\n    /**\r\n     * Block all the user interactions with the application (keyboard, touch, mouse, ...)\r\n     */\r\n    private _disableUserInteraction() {\r\n\r\n        this._documentKeydownUnlisten ??= this._renderer.listen('document', 'keydown', (event) => event.preventDefault());\r\n\r\n        this._documentMousedownUnlisten ??= this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());\r\n\r\n        this._documentPointerdownUnlisten ??= this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());\r\n    }\r\n\r\n\r\n    /**\r\n     * Restore the user interactions that were previously disabled with _disableUserInteraction method\r\n     */\r\n    private _enableUserInteraction() {\r\n\r\n        if (this._documentKeydownUnlisten !== null) {\r\n\r\n            this._documentKeydownUnlisten();\r\n            this._documentKeydownUnlisten = null;\r\n        }\r\n\r\n        if (this._documentMousedownUnlisten !== null) {\r\n\r\n            this._documentMousedownUnlisten();\r\n            this._documentMousedownUnlisten = null;\r\n        }\r\n\r\n        if (this._documentPointerdownUnlisten !== null) {\r\n\r\n            this._documentPointerdownUnlisten();\r\n            this._documentPointerdownUnlisten = null;\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 { 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';\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    /**\n     * Indicates whether the title manager has been initialized.\n     * This should only be done once, typically at application startup.\n     */ \r\n    private _isTitleManagerInitialized = false;\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    /**\n     * BehaviorSubject that holds the current route URL.\n     * This allows components to reactively subscribe to route changes.\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    /**\n     * Checks if the current route matches the specified route.\n     * \n     * @param route The route to check against the current route.\r\n     * \n     * @returns True if we are actually at the specified route, false otherwise.\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     */\r\n    getCurrentRoute(): string {\r\n        \r\n        return this._currentRoute.getValue();\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     * \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    /**\n     * Aux method: Updates the browser title based on the current route's data properties.\n     * This is called after each navigation event to ensure the title is always up-to-date.\n     * \n     * @param prefix A text to be added before the computed title.\n     * @param sufix A text to be added after the computed title.\n     */\r\n    private updateTitleFromCurrentRoute(prefix:string, sufix:string): void {\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        const data = currentRoute.data;\r\n        \r\n        if (data['titleKey'] && data['titleBundle']) {\r\n            \r\n            this.titleService.setTitle(prefix + this._localesService.t(data['titleKey'], data['titleBundle']) + sufix);       \r\n        } \r\n    }\r\n    \r\n    \r\n    /**\n     * Navigates to the specified route.\r\n     * \n     * @param route The route to navigate to.\n     */\r\n    navigateTo(route:string){\r\n        \r\n        this.router.navigate(['/' + route]);\r\n    }\r\n    \r\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\nimport { Injectable } from '@angular/core';\r\n\r\n\r\n/**\r\n * Fully featured translation manager to be used with any application that requires text internationalization.\r\n * It is defined as an abstract class so it must be extended in our application. This way we can\r\n * write custom methods to extend the functionality of this class if needed.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport abstract class LocalesBaseService {\r\n\r\n\r\n    /**\r\n     * if the class has been correctly initialized and translations have been correctly loaded\r\n     */\r\n    private _isInitialized = false;\r\n        \r\n\r\n    /**\r\n     * @see getLocales()\r\n     */\r\n    private _locales:string[] = [];\r\n    \r\n    \r\n    /**\r\n     * @see getLanguages()\r\n     */\r\n    private _languages:string[] = [];\r\n        \r\n    \r\n    /**\r\n     * Stores all the loaded localization data by library name, bundle name, key and locales\r\n     */\r\n    private _loadedTranslations:any = {};\r\n    \r\n    \r\n    /**\r\n     * Stores a memory cache to improve performance when outputing translations\r\n     */\r\n    private _keyValuesCache:any = {};\r\n\r\n\r\n    /**\r\n     * @see setWildCardsFormat()\r\n     */\r\n    private _wildCardsFormat = '{N}';\r\n\r\n\r\n    /**\r\n     * @see setMissingKeyFormat()\r\n     */\r\n    private _missingKeyFormat = '$exception';\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     * This is computed based on _wildCardsFormat plus _missingKeyFormat plus the current primary locale\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    private _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 mandayory 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._missingKeyFormat + ((this._locales.length > 0) ? this._locales[0] : '');\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 missingKeyFormat is an empty string, all missing keys will return an empty value (not recommended)\r\n     *\r\n     * If missingKeyFormat contains a string, that string will be always returned for missing keys\r\n     *\r\n     * If missingKeyFormat 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 missingKeyFormat = '[$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    setMissingKeyFormat(value:string) {\r\n\r\n        this._cacheHashBaseString = this._wildCardsFormat + value + ((this._locales.length > 0) ? this._locales[0] : '');\r\n\r\n        this._missingKeyFormat = value;\r\n        \r\n        return value;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * @see setMissingKeyFormat()\r\n     */\r\n    getMissingKeyFormat() {\r\n\r\n        return this._missingKeyFormat;\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 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     * @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 will determine the priority when looking for translations.\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     * @return True if the translations get correctly loaded. Any unsuccessful initialization will throw an exception\r\n     */\r\n    loadLocalesFromJson(locales:string[], json:any){\r\n\r\n        this._isInitialized = false;\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        \r\n        // Validate the translations object follows the right structure\r\n        let isTranslationsValid = false;\r\n          \r\n        for (const library in json) {\n\n            for (const bundle in json[library]) {\n\n                for (const locale in json[library][bundle]) {\n\n                    this._validateLocaleString(locale);\r\n                    \r\n                    isTranslationsValid = true;\n                }\n            }\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        this._loadedTranslations = json;\r\n        this._locales = locales;\r\n        this._languages = locales.map((l: string) => l.substring(0, 2));\r\n        this._cacheHashBaseString = this._wildCardsFormat + this._missingKeyFormat + this._locales[0];\r\n        \r\n        this._isInitialized = true;\r\n        \r\n        return true;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Initializes the translation system by loading and parsing bundle files from the specified translations path.\r\n     * After the promise finishes, the class will contain all the translation data and will be ready to translate any \r\n     * provided key.\r\n     * \r\n     * @param locales An array of locale codes (['en_US', 'es_ES', 'fr_FR', ...]) to load from the url response.\r\n     *        The order of this array will determine the translation priority\r\n     * @param url - Url where the translations are found. The response must be a Json with the expected structure:\r\n     *              { library_name: { bundle_name: { locale_code: { key1: \"translation1\", key2: \"translation2\" } } } ... } \r\n     * \r\n     * @return A promise that will resolve if the translations get correctly loaded, or reject with an error if load fails \r\n     */\r\n    loadLocalesFromUrl(locales:string[], url:string){\r\n\r\n        this._isInitialized = false;\r\n        \r\n        return new Promise((resolve, reject) => {\r\n        \r\n            fetch(url).then(response => {\r\n                \r\n                if (!response.ok) {\r\n                    \r\n                    throw new Error(`HTTP error! status: ${response.status}`);\r\n                }\r\n                \r\n                return response.json();\r\n          \r\n            }).then(data => {\r\n                \r\n                this.loadLocalesFromJson(locales, data);\r\n                                \r\n                resolve(undefined);\r\n          \r\n            }).catch(error => {\r\n            \r\n                reject(new Error(`ERROR LOADING LOCALES FROM: ${url}\\n` + error));\r\n            });\r\n        });\r\n    }\r\n\r\n    \r\n    /**\r\n     * Check if the class has been correctly initialized and translations have been correctly loaded\r\n     */\r\n    isInitialized(){\r\n\r\n        return this._isInitialized;\r\n    }\r\n\r\n\r\n    /**\r\n     * Aux method to verify that this class is correctly initialized with translation data\r\n     */\r\n    private _validateInitialized(){\r\n\r\n        if(!this._isInitialized){\r\n\r\n            throw new Error('Translation service not initialized');\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Checks if the specified locale is currently loaded for the currently defined bundles and paths.\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._locales.includes(locale);\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     * 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._languages.includes(language);\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     * Get the translation to the current primary locale 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 this.wildCardsFormat\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        this._validateInitialized();\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            this._forceNonEmptyString(key, '', 'key must be non empty string');\r\n            this._forceNonEmptyString(bundlePath, '', 'bundlePath must be non empty string');\r\n            \r\n            const [library, bundle] = bundlePath.split('/');\r\n\r\n            this._forceNonEmptyString(library, '', 'no library specified on bundlePath');\r\n            this._forceNonEmptyString(bundle, '', 'no bundle specified on bundlePath');\r\n            \r\n            const replacementsCount = replaceWildcards.length;\r\n\r\n            // Loop all the locales to find the first one with a value for the specified key\r\n            for (const locale of this._locales) {\r\n\r\n                if (this._loadedTranslations[library]?.[bundle]?.[locale]?.[key]) {\r\n\r\n                    let result = this._loadedTranslations[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._missingKeyFormat.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._missingKeyFormat, '$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     * A list of strings containing the locales that are used by this class to translate the given keys, sorted by preference.\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     * When a key and bundle are requested for translation, the class will check on the first language of this\r\n     * list for a translated text. If missing, the next one will be used, and so. This list is constructed after initialize\r\n     * methods is called.\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.\r\n     */\r\n    getLocales(){\r\n\r\n        return this._locales;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * A list of strings containing the languages that are used by this class to translate the given keys, sorted by preference.\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 getLocales()\r\n     */\r\n    getLanguages(){\r\n\r\n        return this._languages;\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Get the first locale from the list of loaded locales, which is the currently used to search for translated texts.\r\n     *\r\n     * @returns The locale that is defined as the primary one. For example: en_US, es_ES, ..\r\n     */\r\n    getPrimaryLocale(){\r\n\r\n        this._validateInitialized();\r\n\r\n        return this._locales[0];\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Get the first language from the list of loaded locales, which is the currently used to search for translated texts.\r\n     *\r\n     * @returns The 2 digit language code that is defined as the primary one. For example: en, es, ..\r\n     */\r\n    getPrimaryLanguage(){\r\n\r\n        this._validateInitialized();\r\n\r\n        return this._languages[0];\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Define the locale that will be placed at the front of the currently loaded locales list (moving all the others one position to the right).\r\n     *\r\n     * This will be the first locale to use when trying to get a translation.\r\n     *\r\n     * @param locale A currently loaded locale that will be moved to the first position of the loaded locales list. If the specified locale\r\n     *        is not currently loaded, an exception will happen.\r\n     *\r\n     * @returns void\r\n     */\r\n    setPrimaryLocale(locale:string){\r\n\r\n        this._validateInitialized();\r\n\r\n        if(!this.isLocaleLoaded(locale)){\r\n\r\n            throw new Error(locale + ' not loaded');\r\n        }\r\n\r\n        let result = [locale];\r\n\r\n        for (let l of this._locales){\r\n        \r\n            if(l !== locale){\r\n\r\n                result.push(l);\r\n            }\r\n        }\r\n\r\n        this._locales = result;\r\n        this._languages = this._locales.map((l: string) => l.substring(0, 2));\r\n        this._cacheHashBaseString = this._wildCardsFormat + this._missingKeyFormat + this._locales[0];\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Moves the specified locales to the beginning of the locales list. This also alters the translation priority by setting the first\r\n     * provided locale as the most prioritary, the second as the next one and so.\r\n     *\r\n     * This method basically works exactly the same way as setPrimaryLocale but letting us add many locales at once.\r\n     *\r\n     * @see setPrimaryLocale()\r\n     *\r\n     * @param locales A list of locales to be moved to the beginning of the translation priority. First locales item will be the prefered\r\n     *        locale for translation, second will be the next one in case some key is not translated for the first one and so. If any of the\r\n     *        specified locales is not currently loaded, an exception will happen.\r\n     *\r\n     * @returns void\r\n     */\r\n    setPrimaryLocales(locales:string[]){\r\n\r\n        if(!Array.isArray(locales) ||\r\n            (new Set(locales).size !== locales.length) ||\r\n            locales.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        for (let i = locales.length - 1; i >= 0; i--) {\r\n\r\n            this.setPrimaryLocale(locales[i]);\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Define the 2 digit language that will be placed at the front of the currently loaded locales list (moving all the others one position to the right).\r\n     *\r\n     * This will be the first language to use when trying to get a translation.\r\n     *\r\n     * @param language A 2 digit language code that matches with any of the currently loaded locales, which will\r\n     *        be moved to the first position of the loaded locales list. If the specified language does not match with\r\n     *        a locale that is currently loaded, an exception will happen.\r\n     *\r\n     * @returns void\r\n     */\r\n    setPrimaryLanguage(language:string){\r\n\r\n        for(let locale of this._locales){\r\n        \r\n            if(locale.substring(0, 2) === language){\r\n\r\n                this.setPrimaryLocale(locale);\r\n\r\n                return;\r\n            }\r\n        }\r\n\r\n        throw new Error(language + ' not loaded');\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Moves the locales that match the specified languages to the beginning of the locales list.\r\n     * Works the same as setPrimaryLocales() but with a list of the 2 digit language codes that match the respective locales.\r\n     *\r\n     * @see setPrimaryLocale()\r\n     * @see setPrimaryLanguage()\r\n     *\r\n     * @param languages A list of 2 digit language codes to be moved to the beginning of the translation priority. If any of the\r\n     *        specified languages does not match with a locale that is currently loaded, an exception will happen.\r\n     *\r\n     * @returns void\r\n     */\r\n    setPrimaryLanguages(languages:string[]){\r\n\r\n        if(!Array.isArray(languages) ||\r\n           (new Set(languages).size !== languages.length) ||\r\n            languages.length === 0){\r\n\r\n            throw new Error('languages must be non empty string array with no duplicate elements');\r\n        }\r\n\r\n        for (let i = languages.length - 1; i >= 0; i--) {\r\n\r\n            this.setPrimaryLanguage(languages[i]);\r\n        }\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Change the loaded locales translation preference order. The same locales that are currently loaded must be passed\r\n     * but with a different order to change the translation priority.\r\n     *\r\n     * @param locales A list with the new locales translation priority\r\n     *\r\n     * @returns void\r\n     */\r\n    setLocalesOrder(locales:string[]){\r\n\r\n        if(locales.length !== this._locales.length){\r\n\r\n            throw new Error('locales must contain all the currently loaded locales');\r\n        }\r\n\r\n        this._validateInitialized();\r\n\r\n        for(let locale of locales){\r\n        \r\n            if(!this.isLocaleLoaded(locale)){\r\n\r\n                throw new Error(locale + ' not loaded');\r\n            }\r\n        }\r\n\r\n        this._locales = locales;\r\n        this._languages = this._locales.map((l: string) => l.substring(0, 2));\r\n        this._cacheHashBaseString = this._wildCardsFormat + this._missingKeyFormat + this._locales[0];\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     */\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","/**\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';\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 * bi 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=\"data.texts[0]\"></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 { 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>","/**\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 * 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 { FormControl, Validators } from '@angular/forms';\r\nimport { StringUtils } from 'turbocommons-ts';\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 null;\r\n            \r\n            }else{\r\n                \r\n                return { isEmpty: true };\r\n            }\r\n            \r\n        } else {\r\n            \r\n          return null;\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Public API Surface of turbogui-angular\r\n */\r\n\r\nexport { TurboGuiAngularModule } from './main/model/modules/turbogui-angular.module';\r\n\r\n\r\n/**\r\n * Services\r\n */\r\nexport { NotificationService } from './main/controller/notification.service';\r\nexport { GlobalErrorService } from './main/controller/globalerror.service';\r\nexport { HTTPService } from './main/controller/http.service';\r\nexport { HTTPServiceGetRequest } from './main/controller/httpservice/HTTPServiceGetRequest';\r\nexport { HTTPServicePostRequest } from './main/controller/httpservice/HTTPServicePostRequest';\r\nexport { TurboApiService } from './main/controller/turbo-api.service';\r\nexport { DialogService } from './main/controller/dialog.service';\r\nexport { BrowserService } from './main/controller/browser.service';\r\nexport { RouterBaseService } from './main/controller/router-base.service';\r\nexport { LocalesBaseService } from './main/controller/locales-base.service';\r\n\r\n\r\n/**\r\n * Components\r\n */\r\nexport { BusyStateBaseComponent } from './main/view/components/busy-state-base/busy-state-base.component';\r\nexport { DialogBaseComponent } from './main/view/components/dialog-base/dialog-base.component';\r\nexport { DialogDateSelectionComponent } from './main/view/components/dialog-date-selection/dialog-date-selection.component';\r\nexport { DialogErrorComponent } from './main/view/components/dialog-error/dialog-error.component';\r\nexport { DialogIFrameComponent } from './main/view/components/dialog-iframe/dialog-iframe.component';\r\nexport { DialogSingleOptionComponent } from './main/view/components/dialog-single-option/dialog-single-option.component';\r\nexport { DialogTwoOptionComponent } from './main/view/components/dialog-two-option/dialog-two-option.component';\r\nexport { DialogMultipleOptionComponent } from './main/view/components/dialog-multiple-option/dialog-multiple-option.component';\r\nexport { DialogSingleSelectionListComponent } from './main/view/components/dialog-single-selection-list/dialog-single-selection-list.component';\r\nexport { DialogSingleInputComponent } from './main/view/components/dialog-single-input/dialog-single-input.component';\r\nexport { ButtonImageComponent } from './main/view/components/button-image/button-image.component';\r\nexport { ButtonContainerComponent } from './main/view/components/button-container/button-container.component';\r\n\r\n\r\n/**\r\n * Classes\r\n */\r\nexport { GUINotification } from './main/model/classes/GUINotification';\r\nexport { SingletoneStrictClass } from './main/model/classes/SingletoneStrictClass';\r\nexport { View } from './main/model/classes/View';\r\nexport { ViewService } from './main/model/classes/ViewService';\r\nexport { DelayedMethodCallManager } from './main/managers/DelayedMethodCallManager';\r\nexport { FadeAnimationClass } from './main/view/animations/fade.animation';\r\nexport { ElementClickOutsideDirective } from './main/view/directives/ElementClickOutsideDirective';\r\nexport { ElementCreatedDirective } from './main/view/directives/ElementCreatedDirective';\r\nexport { ElementDestroyedDirective } from './main/view/directives/ElementDestroyedDirective';\r\nexport { AutoFocusOnDisplayDirective } from './main/view/directives/AutoFocusOnDisplayDirective';\r\nexport { AutoSelectTextOnFocusDirective } from './main/view/directives/AutoSelectTextOnFocusDirective';\r\nexport { ValidatorsPlus } from './main/view/forms/ValidatorsPlus';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","i1","i1.DialogService","i2.BrowserService","i3","i5.AutoFocusOnDisplayDirective","i6.AutoFocusOnDisplayDirective","i7.AutoSelectTextOnFocusDirective"],"mappings":"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"}