turbogui-angular 20.7.0 → 20.8.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 +43 -15
- package/fesm2022/turbogui-angular.mjs.map +1 -1
- package/main/view/directives/AutoFocusOnDisplayDirective.d.ts +3 -3
- package/main/view/directives/AutoFocusOnDisplayDirective.d.ts.map +1 -1
- package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts +2 -2
- package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts.map +1 -1
- package/main/view/directives/ElementClickOutsideDirective.d.ts +10 -3
- package/main/view/directives/ElementClickOutsideDirective.d.ts.map +1 -1
- package/main/view/directives/ElementCreatedDirective.d.ts.map +1 -1
- package/main/view/directives/ElementDestroyedDirective.d.ts.map +1 -1
- package/main/view/forms/ValidatorsPlus.d.ts +26 -0
- package/main/view/forms/ValidatorsPlus.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -32,25 +32,27 @@ import { FormsModule, Validators, FormControl } from '@angular/forms';
|
|
|
32
32
|
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
33
33
|
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
34
34
|
*/
|
|
35
|
-
/** This directive is used to trigger an event when the user clicks outside of an element */
|
|
36
35
|
/**
|
|
36
|
+
* It is necessary to import TurboGuiAngularModule at the component that uses this directive
|
|
37
|
+
*
|
|
37
38
|
* This directive is used to execute an action when the user clicks outside of an element.
|
|
38
|
-
*
|
|
39
|
+
*
|
|
40
|
+
* If we set the elementClickOutside tag to the html element and set the clickOutsideElement event to a function: <element elementClickOutside (clickOutsideElement)="clickOutsideElement()" ...,
|
|
39
41
|
* this function will be executed when the user clicks outside of the element.
|
|
40
42
|
*/
|
|
41
43
|
class ElementClickOutsideDirective {
|
|
42
44
|
constructor(elementRef) {
|
|
43
45
|
this.elementRef = elementRef;
|
|
44
|
-
this.
|
|
46
|
+
this.clickOutsideElement = new EventEmitter();
|
|
45
47
|
}
|
|
46
48
|
onClick(targetElement) {
|
|
47
49
|
const clickedInside = this.elementRef.nativeElement.contains(targetElement);
|
|
48
50
|
if (!clickedInside) {
|
|
49
|
-
this.
|
|
51
|
+
this.clickOutsideElement.emit();
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: ElementClickOutsideDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
53
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: ElementClickOutsideDirective, isStandalone: false, selector: "[elementClickOutside]", outputs: {
|
|
55
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: ElementClickOutsideDirective, isStandalone: false, selector: "[elementClickOutside]", outputs: { clickOutsideElement: "clickOutsideElement" }, host: { listeners: { "document:click": "onClick($event.target)" } }, ngImport: i0 }); }
|
|
54
56
|
}
|
|
55
57
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: ElementClickOutsideDirective, decorators: [{
|
|
56
58
|
type: Directive,
|
|
@@ -58,7 +60,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
|
|
|
58
60
|
selector: '[elementClickOutside]',
|
|
59
61
|
standalone: false
|
|
60
62
|
}]
|
|
61
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: {
|
|
63
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { clickOutsideElement: [{
|
|
62
64
|
type: Output
|
|
63
65
|
}], onClick: [{
|
|
64
66
|
type: HostListener,
|
|
@@ -102,8 +104,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
|
|
|
102
104
|
standalone: false
|
|
103
105
|
}]
|
|
104
106
|
}], propDecorators: { elementCreated: [{
|
|
105
|
-
type: Output
|
|
106
|
-
args: ['elementCreated']
|
|
107
|
+
type: Output
|
|
107
108
|
}] } });
|
|
108
109
|
|
|
109
110
|
/**
|
|
@@ -143,8 +144,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
|
|
|
143
144
|
standalone: false
|
|
144
145
|
}]
|
|
145
146
|
}], propDecorators: { elementDestroyed: [{
|
|
146
|
-
type: Output
|
|
147
|
-
args: ['elementDestroyed']
|
|
147
|
+
type: Output
|
|
148
148
|
}] } });
|
|
149
149
|
|
|
150
150
|
/**
|
|
@@ -2833,11 +2833,11 @@ class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
2833
2833
|
}
|
|
2834
2834
|
}
|
|
2835
2835
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DialogSingleSelectionListComponent, deps: [{ token: i0.ElementRef }, { token: i1.MatDialogRef }, { token: BrowserService }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2836
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<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>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px
|
|
2836
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<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>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px;cursor:pointer}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: TurboGuiAngularModule }, { kind: "directive", type: AutoFocusOnDisplayDirective, selector: "[autoFocusOnDisplay]" }] }); }
|
|
2837
2837
|
}
|
|
2838
2838
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DialogSingleSelectionListComponent, decorators: [{
|
|
2839
2839
|
type: Component,
|
|
2840
|
-
args: [{ selector: 'tg-dialog-single-selection-list', imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<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>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px
|
|
2840
|
+
args: [{ selector: 'tg-dialog-single-selection-list', imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<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>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px;cursor:pointer}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"] }]
|
|
2841
2841
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.MatDialogRef }, { type: BrowserService }, { type: undefined, decorators: [{
|
|
2842
2842
|
type: Inject,
|
|
2843
2843
|
args: [MAT_DIALOG_DATA]
|
|
@@ -3343,11 +3343,11 @@ class ValidatorsPlus extends Validators {
|
|
|
3343
3343
|
}
|
|
3344
3344
|
// first check if the control has a value
|
|
3345
3345
|
if (control.value && control.value.length > 0) {
|
|
3346
|
-
if (
|
|
3347
|
-
return
|
|
3346
|
+
if (StringUtils.isEmpty(control.value)) {
|
|
3347
|
+
return { isEmpty: true };
|
|
3348
3348
|
}
|
|
3349
3349
|
else {
|
|
3350
|
-
return
|
|
3350
|
+
return null;
|
|
3351
3351
|
}
|
|
3352
3352
|
}
|
|
3353
3353
|
else {
|
|
@@ -3376,6 +3376,34 @@ class ValidatorsPlus extends Validators {
|
|
|
3376
3376
|
return hasValue ? null : { atLeastOneRequired: true };
|
|
3377
3377
|
};
|
|
3378
3378
|
}
|
|
3379
|
+
/**
|
|
3380
|
+
* Validator to check that a control value is a valid mobile phone number with country code.
|
|
3381
|
+
*
|
|
3382
|
+
* The expected format is: +<country code><number>, where:
|
|
3383
|
+
* - <country code> is 1 to 3 digits
|
|
3384
|
+
* - <number> is 6 to 14 digits
|
|
3385
|
+
*
|
|
3386
|
+
* The country code must be prefixed with a plus sign (+). Spaces, dots (.), and hyphens (-) are allowed as separators.
|
|
3387
|
+
*
|
|
3388
|
+
* Examples of valid formats:
|
|
3389
|
+
* - +1 1234567890
|
|
3390
|
+
* - +44-1234-567890
|
|
3391
|
+
* - +91.9876543210
|
|
3392
|
+
*
|
|
3393
|
+
* Examples of invalid formats:
|
|
3394
|
+
* - 1234567890 (missing country code)
|
|
3395
|
+
* - +123 (too short)
|
|
3396
|
+
* - +123456789012345671 (too long)
|
|
3397
|
+
*
|
|
3398
|
+
* @param control The form control to validate.
|
|
3399
|
+
*
|
|
3400
|
+
* @returns An object with the validation error if invalid, or null if valid.
|
|
3401
|
+
*/
|
|
3402
|
+
static mobilePhoneWithCountryCode(control) {
|
|
3403
|
+
const mobilePhoneRegex = /^\+\d{1,3}[\s.-]?\d{6,14}$/;
|
|
3404
|
+
const valid = mobilePhoneRegex.test(control.value);
|
|
3405
|
+
return valid ? null : { mobilePhoneWithCountryCode: true };
|
|
3406
|
+
}
|
|
3379
3407
|
}
|
|
3380
3408
|
|
|
3381
3409
|
/*
|