turbogui-angular 19.0.0 → 19.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/turbogui-angular.mjs +71 -26
- package/fesm2022/turbogui-angular.mjs.map +1 -1
- package/main/controller/locales-base.service.d.ts +13 -13
- package/main/controller/locales-base.service.d.ts.map +1 -1
- package/main/model/modules/turbogui-angular.module.d.ts +6 -5
- package/main/model/modules/turbogui-angular.module.d.ts.map +1 -1
- package/main/view/directives/ElementClickOutsideDirective.d.ts +20 -0
- package/main/view/directives/ElementClickOutsideDirective.d.ts.map +1 -0
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/public_api.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turbogui-angular.mjs","sources":["../../../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-caller.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-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, 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 { 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 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 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 { ArrayUtils, NumericUtils } from 'turbocommons-ts';\r\nimport { Type, Injectable, ComponentFactoryResolver, Injector, ApplicationRef, Renderer2, RendererFactory2, ViewContainerRef } 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';\r\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 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 * 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 componentFactoryResolver: ComponentFactoryResolver) {\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 if (this._windowBeforeUnloadUnListen === null) {\r\n\r\n this._windowBeforeUnloadUnListen = this._renderer.listen('window', 'beforeunload',\r\n (event) => event.returnValue = true);\r\n }\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.componentFactoryResolver,\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().subscribe(() => {\r\n this._isShowingSnackBar = false;\r\n resolve(true);\r\n });\r\n\r\n // Handle dismiss\r\n snackBarRef.afterDismissed().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 * - 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 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 * - 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 * - options: A list of strings that will be used as button captions for each one of the accepted dialog options\r\n * - data: An object that we can use to pass any extra data that we want to the dialog\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 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.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 const dialogRef = this.matDialog.open(dialogComponentClass, {\r\n width: properties.width ?? \"50%\",\r\n maxWidth: properties.maxWidth ?? \"96vw\",\r\n disableClose: properties.modal,\r\n autoFocus: false,\r\n closeOnNavigation: !properties.modal,\r\n viewContainerRef: properties.viewContainerRef,\r\n data: { texts: properties.texts, options: properties.options, data: properties.data }\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 dialogRef.beforeClosed().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.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 ?? \"50%\",\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 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 }\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 if (this._documentKeydownUnlisten === null) {\r\n\r\n this._documentKeydownUnlisten = this._renderer.listen('document', 'keydown', (event) => event.preventDefault());\r\n }\r\n\r\n if (this._documentMousedownUnlisten === null) {\r\n\r\n this._documentMousedownUnlisten = this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());\r\n }\r\n\r\n if (this._documentPointerdownUnlisten === null) {\r\n\r\n this._documentPointerdownUnlisten = this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());\r\n }\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._documentMousedownUnlisten = 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 { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\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 class TurboApiCallerService extends SingletoneStrictClass {\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 super(TurboApiCallerService);\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 * Initializes the translation system by loading and parsing bundle files from the specified JSON object.\r\n * After the method finishes, the class will contain all the translation data and will be ready to translate any provided key.\r\n *\r\n * @param translations 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 * @param locales An array of locale codes (e.g., ['en_US', 'es_ES', 'fr_FR']) to load into this class. The order of this array \r\n * will determine the translation priority\r\n * \r\n * @return True if the translations get correctly loaded. Any unsuccessful initialization will throw an exception\r\n */\r\n initializeFromJson(translations:any, locales:string[]){\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 translations) {\n\n for (const bundle in translations[library]) {\n\n for (const locale in translations[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 = translations;\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 return this._isInitialized = 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 translationsPath - Url where the translations Json structure of libraries/bundles/locales/keys is available.\r\n * @param locales An array of locale codes (e.g., ['en_US', 'es_ES', 'fr_FR']) to load. These will be added to the translation\r\n * path using the following format: translationsPath/en_US-es_ES-fr_FR. The order of this array will determine the\r\n * translation priority\r\n * @param parameters Any extra parameters to be attached to the translationsPath after the locales like /param1/param2/ etc\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 initializeFromUrl(translationsPath:string, locales:string[], parameters:string[]){\r\n\r\n this._isInitialized = false;\r\n \r\n const translationsFullPath = translationsPath + '/' + locales.join('-') + '/' + parameters.join('/');\r\n \r\n return new Promise((resolve, reject) => {\r\n \r\n fetch(translationsFullPath).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.initializeFromJson(data, locales);\r\n \r\n resolve(undefined);\r\n \r\n }).catch(error => {\r\n \r\n reject(new Error(`ERROR LOADING LOCALES FROM: ${translationsFullPath}\\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 { 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 && !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 && !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 * TODO: THIS IS NOT A GOOD IDEA\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 { TurboApiCallerService } from './main/controller/turbo-api-caller.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 { 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 { 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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"}
|
|
1
|
+
{"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-caller.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-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 { ArrayUtils, NumericUtils } from 'turbocommons-ts';\r\nimport { Type, Injectable, ComponentFactoryResolver, Injector, ApplicationRef, Renderer2, RendererFactory2, ViewContainerRef } 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';\r\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 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 * 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 componentFactoryResolver: ComponentFactoryResolver) {\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 if (this._windowBeforeUnloadUnListen === null) {\r\n\r\n this._windowBeforeUnloadUnListen = this._renderer.listen('window', 'beforeunload',\r\n (event) => event.returnValue = true);\r\n }\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.componentFactoryResolver,\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().subscribe(() => {\r\n this._isShowingSnackBar = false;\r\n resolve(true);\r\n });\r\n\r\n // Handle dismiss\r\n snackBarRef.afterDismissed().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 * - 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 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 * - 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 * - options: A list of strings that will be used as button captions for each one of the accepted dialog options\r\n * - data: An object that we can use to pass any extra data that we want to the dialog\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 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.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 const dialogRef = this.matDialog.open(dialogComponentClass, {\r\n width: properties.width ?? \"50%\",\r\n maxWidth: properties.maxWidth ?? \"96vw\",\r\n disableClose: properties.modal,\r\n autoFocus: false,\r\n closeOnNavigation: !properties.modal,\r\n viewContainerRef: properties.viewContainerRef,\r\n data: { texts: properties.texts, options: properties.options, data: properties.data }\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 dialogRef.beforeClosed().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.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 ?? \"50%\",\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 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 }\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 if (this._documentKeydownUnlisten === null) {\r\n\r\n this._documentKeydownUnlisten = this._renderer.listen('document', 'keydown', (event) => event.preventDefault());\r\n }\r\n\r\n if (this._documentMousedownUnlisten === null) {\r\n\r\n this._documentMousedownUnlisten = this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());\r\n }\r\n\r\n if (this._documentPointerdownUnlisten === null) {\r\n\r\n this._documentPointerdownUnlisten = this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());\r\n }\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._documentMousedownUnlisten = 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 { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';\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 class TurboApiCallerService extends SingletoneStrictClass {\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 super(TurboApiCallerService);\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 { 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 && !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 && !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 * TODO: THIS IS NOT A GOOD IDEA\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 { TurboApiCallerService } from './main/controller/turbo-api-caller.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 { 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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"}
|