@odx/angular 12.19.1 → 12.19.2
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/CHANGELOG.md +6 -0
- package/components/spinbox/lib/spinbox.component.d.ts +10 -8
- package/esm2022/components/spinbox/lib/spinbox.component.mjs +61 -25
- package/fesm2022/odx-angular-components-spinbox.mjs +60 -24
- package/fesm2022/odx-angular-components-spinbox.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AfterViewInit, ElementRef } from '@angular/core';
|
|
1
|
+
import { AfterViewInit, ElementRef, OnDestroy } from '@angular/core';
|
|
2
2
|
import { CustomFormControl } from '@odx/angular/cdk/custom-form-control';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
@@ -8,8 +8,9 @@ import * as i0 from "@angular/core";
|
|
|
8
8
|
*
|
|
9
9
|
* @see {CustomFormControl}
|
|
10
10
|
*/
|
|
11
|
-
export declare class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit {
|
|
12
|
-
private
|
|
11
|
+
export declare class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit, OnDestroy {
|
|
12
|
+
private destroyIncrementListener;
|
|
13
|
+
private destroyDecrementListener;
|
|
13
14
|
private get inputElement();
|
|
14
15
|
protected decrementButton: ElementRef<HTMLButtonElement>;
|
|
15
16
|
protected incrementButton: ElementRef<HTMLButtonElement>;
|
|
@@ -18,14 +19,14 @@ export declare class SpinboxComponent extends CustomFormControl<number> implemen
|
|
|
18
19
|
* The maximum allowable value for the spinbox.
|
|
19
20
|
*
|
|
20
21
|
* @type {number}
|
|
21
|
-
* @default
|
|
22
|
+
* @default Number.POSITIVE_INFINITY
|
|
22
23
|
*/
|
|
23
24
|
max: number;
|
|
24
25
|
/**
|
|
25
26
|
* The minimum allowable value for the spinbox.
|
|
26
27
|
*
|
|
27
28
|
* @type {number}
|
|
28
|
-
* @default
|
|
29
|
+
* @default Number.NEGATIVE_INFINITY
|
|
29
30
|
*/
|
|
30
31
|
min: number;
|
|
31
32
|
/**
|
|
@@ -37,10 +38,11 @@ export declare class SpinboxComponent extends CustomFormControl<number> implemen
|
|
|
37
38
|
step: number;
|
|
38
39
|
constructor();
|
|
39
40
|
ngAfterViewInit(): void;
|
|
41
|
+
ngOnDestroy(): void;
|
|
42
|
+
updateValue(value: number): void;
|
|
40
43
|
protected maxSteps({ code }: KeyboardEvent): void;
|
|
41
|
-
protected
|
|
42
|
-
|
|
43
|
-
private registerPressHold;
|
|
44
|
+
protected checkAndUpdate(): void;
|
|
45
|
+
private pressAndHold;
|
|
44
46
|
static ɵfac: i0.ɵɵFactoryDeclaration<SpinboxComponent, never>;
|
|
45
47
|
static ɵcmp: i0.ɵɵComponentDeclaration<SpinboxComponent, "odx-spinbox", never, { "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; "step": { "alias": "step"; "required": false; }; }, {}, never, never, true, never>;
|
|
46
48
|
static ngAcceptInputType_max: unknown;
|
|
@@ -4,9 +4,7 @@ import { detectControllerChanges, DisabledController, ReadonlyController } from
|
|
|
4
4
|
import { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';
|
|
5
5
|
import { IconComponent } from '@odx/angular/components/icon';
|
|
6
6
|
import { CSSComponent } from '@odx/angular/internal';
|
|
7
|
-
import {
|
|
8
|
-
import { injectElement, untilDestroyed } from '@odx/angular/utils';
|
|
9
|
-
import { filter, NEVER, startWith, switchMap, tap, timer } from 'rxjs';
|
|
7
|
+
import { injectElement } from '@odx/angular/utils';
|
|
10
8
|
import * as i0 from "@angular/core";
|
|
11
9
|
/**
|
|
12
10
|
* SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement
|
|
@@ -21,22 +19,21 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
21
19
|
}
|
|
22
20
|
constructor() {
|
|
23
21
|
super(0);
|
|
24
|
-
this.takeUntilDestroyed = untilDestroyed();
|
|
25
22
|
this.element = injectElement();
|
|
26
23
|
/**
|
|
27
24
|
* The maximum allowable value for the spinbox.
|
|
28
25
|
*
|
|
29
26
|
* @type {number}
|
|
30
|
-
* @default
|
|
27
|
+
* @default Number.POSITIVE_INFINITY
|
|
31
28
|
*/
|
|
32
|
-
this.max =
|
|
29
|
+
this.max = Number.POSITIVE_INFINITY;
|
|
33
30
|
/**
|
|
34
31
|
* The minimum allowable value for the spinbox.
|
|
35
32
|
*
|
|
36
33
|
* @type {number}
|
|
37
|
-
* @default
|
|
34
|
+
* @default Number.NEGATIVE_INFINITY
|
|
38
35
|
*/
|
|
39
|
-
this.min =
|
|
36
|
+
this.min = Number.NEGATIVE_INFINITY;
|
|
40
37
|
/**
|
|
41
38
|
* The value increment or decrement step for the spinbox.
|
|
42
39
|
*
|
|
@@ -47,15 +44,25 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
47
44
|
detectControllerChanges(this).subscribe();
|
|
48
45
|
}
|
|
49
46
|
ngAfterViewInit() {
|
|
50
|
-
this.
|
|
47
|
+
this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {
|
|
51
48
|
this.inputElement?.stepDown();
|
|
52
|
-
this.
|
|
49
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
53
50
|
});
|
|
54
|
-
this.
|
|
51
|
+
this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {
|
|
55
52
|
this.inputElement?.stepUp();
|
|
56
|
-
this.
|
|
53
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
57
54
|
});
|
|
58
55
|
}
|
|
56
|
+
ngOnDestroy() {
|
|
57
|
+
super.ngOnDestroy();
|
|
58
|
+
this.destroyDecrementListener?.();
|
|
59
|
+
this.destroyIncrementListener?.();
|
|
60
|
+
}
|
|
61
|
+
updateValue(value) {
|
|
62
|
+
if (this.value === value)
|
|
63
|
+
return;
|
|
64
|
+
super.updateValue(value);
|
|
65
|
+
}
|
|
59
66
|
maxSteps({ code }) {
|
|
60
67
|
if (code === 'End' && this.min !== -Infinity) {
|
|
61
68
|
this.updateValue(this.min);
|
|
@@ -64,21 +71,50 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
64
71
|
this.updateValue(this.max);
|
|
65
72
|
}
|
|
66
73
|
}
|
|
67
|
-
|
|
74
|
+
checkAndUpdate() {
|
|
68
75
|
const value = numberAttribute(this.inputElement.value);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.updateValue(numberAttribute(this.inputElement.value));
|
|
76
|
+
const clampedValue = Math.min(this.max, Math.max(this.min, value));
|
|
77
|
+
this.inputElement.value = clampedValue.toString();
|
|
78
|
+
this.updateValue(clampedValue);
|
|
73
79
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
pressAndHold(element, handler, interval = 200) {
|
|
81
|
+
let timerId;
|
|
82
|
+
const clearTimer = () => {
|
|
83
|
+
clearInterval(timerId);
|
|
84
|
+
timerId = undefined;
|
|
85
|
+
};
|
|
86
|
+
const start = () => {
|
|
87
|
+
handler();
|
|
88
|
+
timerId = window.setInterval(handler, interval);
|
|
89
|
+
};
|
|
90
|
+
const handleKeyDown = (event) => {
|
|
91
|
+
if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {
|
|
92
|
+
if (event.code === 'Space') {
|
|
93
|
+
event.preventDefault(); // blocks scrolling
|
|
94
|
+
}
|
|
95
|
+
start();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const handleKeyUp = (event) => {
|
|
99
|
+
if (event.code === 'Space' || event.code === 'Enter') {
|
|
100
|
+
clearTimer();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
element.addEventListener('mousedown', start);
|
|
104
|
+
element.addEventListener('mouseup', clearTimer);
|
|
105
|
+
element.addEventListener('mouseout', clearTimer);
|
|
106
|
+
element.addEventListener('keydown', handleKeyDown);
|
|
107
|
+
element.addEventListener('keyup', handleKeyUp);
|
|
108
|
+
return () => {
|
|
109
|
+
element.removeEventListener('mousedown', start);
|
|
110
|
+
element.removeEventListener('mouseup', clearTimer);
|
|
111
|
+
element.removeEventListener('mouseout', clearTimer);
|
|
112
|
+
element.removeEventListener('keydown', handleKeyDown);
|
|
113
|
+
element.removeEventListener('keyup', handleKeyUp);
|
|
114
|
+
};
|
|
79
115
|
}
|
|
80
116
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
81
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
117
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
82
118
|
};
|
|
83
119
|
SpinboxComponent = __decorate([
|
|
84
120
|
CSSComponent('spinbox'),
|
|
@@ -87,7 +123,7 @@ SpinboxComponent = __decorate([
|
|
|
87
123
|
export { SpinboxComponent };
|
|
88
124
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, decorators: [{
|
|
89
125
|
type: Component,
|
|
90
|
-
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
126
|
+
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n" }]
|
|
91
127
|
}], ctorParameters: () => [], propDecorators: { decrementButton: [{
|
|
92
128
|
type: ViewChild,
|
|
93
129
|
args: ['decrementButton']
|
|
@@ -104,4 +140,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
104
140
|
type: Input,
|
|
105
141
|
args: [{ transform: numberAttribute }]
|
|
106
142
|
}] } });
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpbmJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFFbkY7Ozs7OztHQU1HO0FBV0ksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxpQkFBeUI7SUFHN0QsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsYUFBaUMsQ0FBQztJ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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25ILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUMxQixDQUFDO0lBQ0osQ0FBQzsrR0FyRlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsNkVBcUJQLGVBQWUsdUJBU2YsZUFBZSwwQkFTZixlQUFlLGdCQXpDeEIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQywwUUN4QnpFLHlsQkFnQkEsNENET1ksZ0JBQWdCLG1GQUFFLGFBQWE7O0FBRzlCLGdCQUFnQjtJQVY1QixZQUFZLENBQUMsU0FBUyxDQUFDOztHQVVYLGdCQUFnQixDQXNGNUI7OzRGQXRGWSxnQkFBZ0I7a0JBVDVCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGFBQWEsbUJBRU4sdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxhQUMvQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO3dEQVU3RCxlQUFlO3NCQUR4QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFJbEIsZUFBZTtzQkFEeEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBWXJCLEdBQUc7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBVTlCLEdBQUc7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBVTlCLElBQUk7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgbnVtYmVyQXR0cmlidXRlLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZXRlY3RDb250cm9sbGVyQ2hhbmdlcywgRGlzYWJsZWRDb250cm9sbGVyLCBSZWFkb25seUNvbnRyb2xsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQ29udHJvbERpcmVjdGl2ZSwgQ3VzdG9tRm9ybUNvbnRyb2wgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2N1c3RvbS1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgQ1NTQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2ludGVybmFsJztcbmltcG9ydCB7IGZyb21FdmVudHMgfSBmcm9tICdAb2R4L2FuZ3VsYXIvcnhqcyc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBmaWx0ZXIsIE5FVkVSLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNwaW5ib3hDb21wb25lbnQgaXMgYSBjdXN0b20gZm9ybSBjb250cm9sIGZvciBudW1lcmljIGlucHV0IHdoaWNoIGFsbG93cyB1c2VycyB0byBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudFxuICogdGhlIHZhbHVlIHVzaW5nIGNvcnJlc3BvbmRpbmcgYnV0dG9ucy4gSXQgc3VwcG9ydHMga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgYXV0b21hdGljIGJvdW5kYXJ5IGNoZWNrcyBmb3IgdGhlIHZhbHVlcy5cbiAqICBFeHRlbmRzIEN1c3RvbUZvcm1Db250cm9sIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBiZWhhdmlvci5cbiAqXG4gKiBAc2VlIHtDdXN0b21Gb3JtQ29udHJvbH1cbiAqL1xuQENTU0NvbXBvbmVudCgnc3BpbmJveCcpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtc3BpbmJveCcsXG4gIHRlbXBsYXRlVXJsOiAnc3BpbmJveC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQ29udHJvbERpcmVjdGl2ZSwgSWNvbkNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0Rpc2FibGVkQ29udHJvbGxlci5jb25uZWN0KCksIFJlYWRvbmx5Q29udHJvbGxlci5jb25uZWN0KCldLFxufSlcbmV4cG9ydCBjbGFzcyBTcGluYm94Q29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tRm9ybUNvbnRyb2w8bnVtYmVyPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG5cbiAgcHJpdmF0ZSBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGVjcmVtZW50QnV0dG9uJylcbiAgcHJvdGVjdGVkIGRlY3JlbWVudEJ1dHRvbiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2luY3JlbWVudEJ1dHRvbicpXG4gIHByb3RlY3RlZCBpbmNyZW1lbnRCdXR0b24hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBtYXggPSBJbmZpbml0eTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgLUluZmluaXR5XG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgbWluID0gLUluZmluaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgaW5jcmVtZW50IG9yIGRlY3JlbWVudCBzdGVwIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIHN0ZXAgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKDApO1xuICAgIGRldGVjdENvbnRyb2xsZXJDaGFuZ2VzKHRoaXMpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyUHJlc3NIb2xkKHRoaXMuZGVjcmVtZW50QnV0dG9uKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBEb3duKCk7XG4gICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyUHJlc3NIb2xkKHRoaXMuaW5jcmVtZW50QnV0dG9uKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBVcCgpO1xuICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWF4U3RlcHMoeyBjb2RlIH06IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoY29kZSA9PT0gJ0VuZCcgJiYgdGhpcy5taW4gIT09IC1JbmZpbml0eSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLm1pbik7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAnSG9tZScgJiYgdGhpcy5tYXggIT09IEluZmluaXR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWF4KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSA8IHRoaXMubWluID8gdGhpcy5taW4gOiB2YWx1ZSA+IHRoaXMubWF4ID8gdGhpcy5tYXggOiB2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnB1dENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclByZXNzSG9sZCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGZyb21FdmVudHModGFyZ2V0Lm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ2tleXVwJykucGlwZShcbiAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50Py50eXBlICE9PSAna2V5ZG93bicgfHwgWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKChldmVudCBhcyBLZXlib2FyZEV2ZW50KS5jb2RlKSksXG4gICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKHsgdHlwZSB9KSA9PiAoWydtb3VzZXVwJywgJ2tleXVwJ10uaW5jbHVkZXModHlwZSkgPyBORVZFUiA6IHRpbWVyKDUwMCwgMTAwKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKSkpLFxuICAgICAgdGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkIHx8IGlzUmVhZG9ubHlcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvZHgtc3BpbmJveF9fYWN0aW9uXCIgI2RlY3JlbWVudEJ1dHRvbj48b2R4LWljb24gbmFtZT1cIm1pbnVzXCIgLz48L2J1dHRvbj5cbjxpbnB1dFxuICBvZHhDb250cm9sXG4gIGNsYXNzPVwib2R4LXNwaW5ib3hfX2lucHV0XCJcbiAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICBbcmVhZG9ubHldPVwiaXNSZWFkb25seVwiXG4gIHR5cGU9XCJudW1iZXJcIlxuICBbdmFsdWVdPVwidmFsdWVcIlxuICBbbWluXT1cIm1pblwiXG4gIFttYXhdPVwibWF4XCJcbiAgW3N0ZXBdPVwic3RlcFwiXG4gIChrZXlkb3duKT1cIm1heFN0ZXBzKCRldmVudClcIlxuICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiXG4gIChibHVyKT1cImNoZWNrVmFsdWUoKVwiXG4vPlxuPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNpbmNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJwbHVzXCIgLz48L2J1dHRvbj5cbiJdfQ==
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpbmJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQWEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9KLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFbkQ7Ozs7OztHQU1HO0FBV0ksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxpQkFBeUI7SUFHN0QsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsYUFBaUMsQ0FBQztJQUNqRSxDQUFDO0lBcUNEO1FBQ0UsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBOUJLLFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUUxQzs7Ozs7V0FLRztRQUVJLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFFdEM7Ozs7O1dBS0c7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QUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUM7SUFDSixDQUFDOytHQTdIVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQiw2RUFxQlAsZUFBZSx1QkFTZixlQUFlLDBCQVNmLGVBQWUsZ0JBekN4QixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLDBRQ3RCekUsOGxCQWdCQSw0Q0RLWSxnQkFBZ0IsbUZBQUUsYUFBYTs7QUFHOUIsZ0JBQWdCO0lBVjVCLFlBQVksQ0FBQyxTQUFTLENBQUM7O0dBVVgsZ0JBQWdCLENBOEg1Qjs7NEZBOUhZLGdCQUFnQjtrQkFUNUIsU0FBUztpQ0FDSSxJQUFJLFlBQ04sYUFBYSxtQkFFTix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLGFBQy9CLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7d0RBVTdELGVBQWU7c0JBRHhCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUlsQixlQUFlO3NCQUR4QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFZckIsR0FBRztzQkFEVCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFVOUIsR0FBRztzQkFEVCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFVOUIsSUFBSTtzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBudW1iZXJBdHRyaWJ1dGUsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGV0ZWN0Q29udHJvbGxlckNoYW5nZXMsIERpc2FibGVkQ29udHJvbGxlciwgUmVhZG9ubHlDb250cm9sbGVyIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IENvbnRyb2xEaXJlY3RpdmUsIEN1c3RvbUZvcm1Db250cm9sIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9jdXN0b20tZm9ybS1jb250cm9sJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcblxuLyoqXG4gKiBTcGluYm94Q29tcG9uZW50IGlzIGEgY3VzdG9tIGZvcm0gY29udHJvbCBmb3IgbnVtZXJpYyBpbnB1dCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gaW5jcmVtZW50IGFuZCBkZWNyZW1lbnRcbiAqIHRoZSB2YWx1ZSB1c2luZyBjb3JyZXNwb25kaW5nIGJ1dHRvbnMuIEl0IHN1cHBvcnRzIGtleWJvYXJkIG5hdmlnYXRpb24gYW5kIGF1dG9tYXRpYyBib3VuZGFyeSBjaGVja3MgZm9yIHRoZSB2YWx1ZXMuXG4gKiAgRXh0ZW5kcyBDdXN0b21Gb3JtQ29udHJvbCB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3IuXG4gKlxuICogQHNlZSB7Q3VzdG9tRm9ybUNvbnRyb2x9XG4gKi9cbkBDU1NDb21wb25lbnQoJ3NwaW5ib3gnKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnb2R4LXNwaW5ib3gnLFxuICB0ZW1wbGF0ZVVybDogJ3NwaW5ib3guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0NvbnRyb2xEaXJlY3RpdmUsIEljb25Db21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtEaXNhYmxlZENvbnRyb2xsZXIuY29ubmVjdCgpLCBSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BpbmJveENvbXBvbmVudCBleHRlbmRzIEN1c3RvbUZvcm1Db250cm9sPG51bWJlcj4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGRlc3Ryb3lJbmNyZW1lbnRMaXN0ZW5lciE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveURlY3JlbWVudExpc3RlbmVyITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGVjcmVtZW50QnV0dG9uJylcbiAgcHJvdGVjdGVkIGRlY3JlbWVudEJ1dHRvbiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2luY3JlbWVudEJ1dHRvbicpXG4gIHByb3RlY3RlZCBpbmNyZW1lbnRCdXR0b24hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgbWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbGxvd2FibGUgdmFsdWUgZm9yIHRoZSBzcGluYm94LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBtaW4gPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHN0ZXAgZm9yIHRoZSBzcGluYm94LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgc3RlcCA9IDE7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoMCk7XG4gICAgZGV0ZWN0Q29udHJvbGxlckNoYW5nZXModGhpcykuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveURlY3JlbWVudExpc3RlbmVyID0gdGhpcy5wcmVzc0FuZEhvbGQodGhpcy5kZWNyZW1lbnRCdXR0b24ubmF0aXZlRWxlbWVudCwgKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBEb3duKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkpO1xuICAgIH0pO1xuICAgIHRoaXMuZGVzdHJveUluY3JlbWVudExpc3RlbmVyID0gdGhpcy5wcmVzc0FuZEhvbGQodGhpcy5pbmNyZW1lbnRCdXR0b24ubmF0aXZlRWxlbWVudCwgKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBVcCgpO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZShudW1iZXJBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQudmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveURlY3JlbWVudExpc3RlbmVyPy4oKTtcbiAgICB0aGlzLmRlc3Ryb3lJbmNyZW1lbnRMaXN0ZW5lcj8uKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdXBkYXRlVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHN1cGVyLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXhTdGVwcyh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChjb2RlID09PSAnRW5kJyAmJiB0aGlzLm1pbiAhPT0gLUluZmluaXR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWluKTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09ICdIb21lJyAmJiB0aGlzLm1heCAhPT0gSW5maW5pdHkpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy5tYXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0FuZFVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5taW4odGhpcy5tYXgsIE1hdGgubWF4KHRoaXMubWluLCB2YWx1ZSkpO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gY2xhbXBlZFZhbHVlLnRvU3RyaW5nKCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZShjbGFtcGVkVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVzc0FuZEhvbGQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhhbmRsZXI6ICgpID0+IHZvaWQsIGludGVydmFsID0gMjAwKTogKCkgPT4gdm9pZCB7XG4gICAgbGV0IHRpbWVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNsZWFyVGltZXIgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgICBoYW5kbGVyKCk7XG4gICAgICB0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKGhhbmRsZXIsIGludGVydmFsKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKChldmVudC5jb2RlID09PSAnU3BhY2UnIHx8IGV2ZW50LmNvZGUgPT09ICdFbnRlcicpICYmIHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIGJsb2NrcyBzY3JvbGxpbmdcbiAgICAgICAgfVxuICAgICAgICBzdGFydCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlVcCA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScgfHwgZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgICBjbGVhclRpbWVyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc3RhcnQpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNsZWFyVGltZXIpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBjbGVhclRpbWVyKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgaGFuZGxlS2V5VXApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc3RhcnQpO1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xlYXJUaW1lcik7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgY2xlYXJUaW1lcik7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBoYW5kbGVLZXlVcCk7XG4gICAgfTtcbiAgfVxufVxuIiwiPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNkZWNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJtaW51c1wiIC8+PC9idXR0b24+XG48aW5wdXRcbiAgb2R4Q29udHJvbFxuICBjbGFzcz1cIm9keC1zcGluYm94X19pbnB1dFwiXG4gIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICB0eXBlPVwibnVtYmVyXCJcbiAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgW21pbl09XCJtaW5cIlxuICBbbWF4XT1cIm1heFwiXG4gIFtzdGVwXT1cInN0ZXBcIlxuICAoa2V5ZG93bik9XCJtYXhTdGVwcygkZXZlbnQpXCJcbiAgKGNoYW5nZSk9XCJjaGVja0FuZFVwZGF0ZSgpXCJcbiAgKGJsdXIpPVwiY2hlY2tBbmRVcGRhdGUoKVwiXG4vPlxuPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNpbmNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJwbHVzXCIgLz48L2J1dHRvbj5cbiJdfQ==
|
|
@@ -5,9 +5,7 @@ import { detectControllerChanges, DisabledController, ReadonlyController } from
|
|
|
5
5
|
import { CustomFormControl, ControlDirective } from '@odx/angular/cdk/custom-form-control';
|
|
6
6
|
import { IconComponent } from '@odx/angular/components/icon';
|
|
7
7
|
import { CSSComponent } from '@odx/angular/internal';
|
|
8
|
-
import {
|
|
9
|
-
import { untilDestroyed, injectElement } from '@odx/angular/utils';
|
|
10
|
-
import { filter, tap, switchMap, NEVER, timer, startWith } from 'rxjs';
|
|
8
|
+
import { injectElement } from '@odx/angular/utils';
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement
|
|
@@ -22,22 +20,21 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
22
20
|
}
|
|
23
21
|
constructor() {
|
|
24
22
|
super(0);
|
|
25
|
-
this.takeUntilDestroyed = untilDestroyed();
|
|
26
23
|
this.element = injectElement();
|
|
27
24
|
/**
|
|
28
25
|
* The maximum allowable value for the spinbox.
|
|
29
26
|
*
|
|
30
27
|
* @type {number}
|
|
31
|
-
* @default
|
|
28
|
+
* @default Number.POSITIVE_INFINITY
|
|
32
29
|
*/
|
|
33
|
-
this.max =
|
|
30
|
+
this.max = Number.POSITIVE_INFINITY;
|
|
34
31
|
/**
|
|
35
32
|
* The minimum allowable value for the spinbox.
|
|
36
33
|
*
|
|
37
34
|
* @type {number}
|
|
38
|
-
* @default
|
|
35
|
+
* @default Number.NEGATIVE_INFINITY
|
|
39
36
|
*/
|
|
40
|
-
this.min =
|
|
37
|
+
this.min = Number.NEGATIVE_INFINITY;
|
|
41
38
|
/**
|
|
42
39
|
* The value increment or decrement step for the spinbox.
|
|
43
40
|
*
|
|
@@ -48,15 +45,25 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
48
45
|
detectControllerChanges(this).subscribe();
|
|
49
46
|
}
|
|
50
47
|
ngAfterViewInit() {
|
|
51
|
-
this.
|
|
48
|
+
this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {
|
|
52
49
|
this.inputElement?.stepDown();
|
|
53
|
-
this.
|
|
50
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
54
51
|
});
|
|
55
|
-
this.
|
|
52
|
+
this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {
|
|
56
53
|
this.inputElement?.stepUp();
|
|
57
|
-
this.
|
|
54
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
58
55
|
});
|
|
59
56
|
}
|
|
57
|
+
ngOnDestroy() {
|
|
58
|
+
super.ngOnDestroy();
|
|
59
|
+
this.destroyDecrementListener?.();
|
|
60
|
+
this.destroyIncrementListener?.();
|
|
61
|
+
}
|
|
62
|
+
updateValue(value) {
|
|
63
|
+
if (this.value === value)
|
|
64
|
+
return;
|
|
65
|
+
super.updateValue(value);
|
|
66
|
+
}
|
|
60
67
|
maxSteps({ code }) {
|
|
61
68
|
if (code === 'End' && this.min !== -Infinity) {
|
|
62
69
|
this.updateValue(this.min);
|
|
@@ -65,21 +72,50 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
65
72
|
this.updateValue(this.max);
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
|
-
|
|
75
|
+
checkAndUpdate() {
|
|
69
76
|
const value = numberAttribute(this.inputElement.value);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this.updateValue(numberAttribute(this.inputElement.value));
|
|
77
|
+
const clampedValue = Math.min(this.max, Math.max(this.min, value));
|
|
78
|
+
this.inputElement.value = clampedValue.toString();
|
|
79
|
+
this.updateValue(clampedValue);
|
|
74
80
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
pressAndHold(element, handler, interval = 200) {
|
|
82
|
+
let timerId;
|
|
83
|
+
const clearTimer = () => {
|
|
84
|
+
clearInterval(timerId);
|
|
85
|
+
timerId = undefined;
|
|
86
|
+
};
|
|
87
|
+
const start = () => {
|
|
88
|
+
handler();
|
|
89
|
+
timerId = window.setInterval(handler, interval);
|
|
90
|
+
};
|
|
91
|
+
const handleKeyDown = (event) => {
|
|
92
|
+
if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {
|
|
93
|
+
if (event.code === 'Space') {
|
|
94
|
+
event.preventDefault(); // blocks scrolling
|
|
95
|
+
}
|
|
96
|
+
start();
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const handleKeyUp = (event) => {
|
|
100
|
+
if (event.code === 'Space' || event.code === 'Enter') {
|
|
101
|
+
clearTimer();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
element.addEventListener('mousedown', start);
|
|
105
|
+
element.addEventListener('mouseup', clearTimer);
|
|
106
|
+
element.addEventListener('mouseout', clearTimer);
|
|
107
|
+
element.addEventListener('keydown', handleKeyDown);
|
|
108
|
+
element.addEventListener('keyup', handleKeyUp);
|
|
109
|
+
return () => {
|
|
110
|
+
element.removeEventListener('mousedown', start);
|
|
111
|
+
element.removeEventListener('mouseup', clearTimer);
|
|
112
|
+
element.removeEventListener('mouseout', clearTimer);
|
|
113
|
+
element.removeEventListener('keydown', handleKeyDown);
|
|
114
|
+
element.removeEventListener('keyup', handleKeyUp);
|
|
115
|
+
};
|
|
80
116
|
}
|
|
81
117
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
82
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
118
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
83
119
|
};
|
|
84
120
|
SpinboxComponent = __decorate([
|
|
85
121
|
CSSComponent('spinbox'),
|
|
@@ -87,7 +123,7 @@ SpinboxComponent = __decorate([
|
|
|
87
123
|
], SpinboxComponent);
|
|
88
124
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, decorators: [{
|
|
89
125
|
type: Component,
|
|
90
|
-
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
126
|
+
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n" }]
|
|
91
127
|
}], ctorParameters: () => [], propDecorators: { decrementButton: [{
|
|
92
128
|
type: ViewChild,
|
|
93
129
|
args: ['decrementButton']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-components-spinbox.mjs","sources":["../../../../libs/angular/components/spinbox/src/lib/spinbox.component.ts","../../../../libs/angular/components/spinbox/src/lib/spinbox.component.html","../../../../libs/angular/components/spinbox/src/odx-angular-components-spinbox.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, numberAttribute, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { detectControllerChanges, DisabledController, ReadonlyController } from '@odx/angular';\nimport { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { fromEvents } from '@odx/angular/rxjs';\nimport { injectElement, untilDestroyed } from '@odx/angular/utils';\nimport { filter, NEVER, Observable, startWith, switchMap, tap, timer } from 'rxjs';\n\n/**\n * SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement\n * the value using corresponding buttons. It supports keyboard navigation and automatic boundary checks for the values.\n * Extends CustomFormControl to provide additional behavior.\n *\n * @see {CustomFormControl}\n */\n@CSSComponent('spinbox')\n@Component({\n standalone: true,\n selector: 'odx-spinbox',\n templateUrl: 'spinbox.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [DisabledController.connect(), ReadonlyController.connect()],\n})\nexport class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit {\n private readonly takeUntilDestroyed = untilDestroyed();\n\n private get inputElement(): HTMLInputElement {\n return this.control?.element.nativeElement as HTMLInputElement;\n }\n\n @ViewChild('decrementButton')\n protected decrementButton!: ElementRef<HTMLButtonElement>;\n\n @ViewChild('incrementButton')\n protected incrementButton!: ElementRef<HTMLButtonElement>;\n\n public readonly element = injectElement();\n\n /**\n * The maximum allowable value for the spinbox.\n *\n * @type {number}\n * @default Infinity\n */\n @Input({ transform: numberAttribute })\n public max = Infinity;\n\n /**\n * The minimum allowable value for the spinbox.\n *\n * @type {number}\n * @default -Infinity\n */\n @Input({ transform: numberAttribute })\n public min = -Infinity;\n\n /**\n * The value increment or decrement step for the spinbox.\n *\n * @type {number}\n * @default 1\n */\n @Input({ transform: numberAttribute })\n public step = 1;\n\n constructor() {\n super(0);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n this.registerPressHold(this.decrementButton).subscribe(() => {\n this.inputElement?.stepDown();\n this.onInputChange();\n });\n this.registerPressHold(this.incrementButton).subscribe(() => {\n this.inputElement?.stepUp();\n this.onInputChange();\n });\n }\n\n protected maxSteps({ code }: KeyboardEvent) {\n if (code === 'End' && this.min !== -Infinity) {\n this.updateValue(this.min);\n } else if (code === 'Home' && this.max !== Infinity) {\n this.updateValue(this.max);\n }\n }\n\n protected checkValue(): void {\n const value = numberAttribute(this.inputElement.value);\n this.updateValue(value < this.min ? this.min : value > this.max ? this.max : value);\n }\n\n protected onInputChange(): void {\n this.updateValue(numberAttribute(this.inputElement.value));\n }\n\n private registerPressHold(target: ElementRef<HTMLElement>): Observable<unknown> {\n return fromEvents(target.nativeElement, 'keydown', 'mousedown', 'mouseup', 'keyup').pipe(\n filter((event) => event?.type !== 'keydown' || ['Space', 'Enter'].includes((event as KeyboardEvent).code)),\n tap((event) => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(({ type }) => (['mouseup', 'keyup'].includes(type) ? NEVER : timer(500, 100).pipe(startWith(undefined)))),\n this.takeUntilDestroyed(),\n );\n }\n}\n","<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"onInputChange()\"\n (blur)=\"checkValue()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"odx-angular-components-spinbox.mjs","sources":["../../../../libs/angular/components/spinbox/src/lib/spinbox.component.ts","../../../../libs/angular/components/spinbox/src/lib/spinbox.component.html","../../../../libs/angular/components/spinbox/src/odx-angular-components-spinbox.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, numberAttribute, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { detectControllerChanges, DisabledController, ReadonlyController } from '@odx/angular';\nimport { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement\n * the value using corresponding buttons. It supports keyboard navigation and automatic boundary checks for the values.\n * Extends CustomFormControl to provide additional behavior.\n *\n * @see {CustomFormControl}\n */\n@CSSComponent('spinbox')\n@Component({\n standalone: true,\n selector: 'odx-spinbox',\n templateUrl: 'spinbox.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [DisabledController.connect(), ReadonlyController.connect()],\n})\nexport class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit, OnDestroy {\n private destroyIncrementListener!: () => void;\n private destroyDecrementListener!: () => void;\n private get inputElement(): HTMLInputElement {\n return this.control?.element.nativeElement as HTMLInputElement;\n }\n\n @ViewChild('decrementButton')\n protected decrementButton!: ElementRef<HTMLButtonElement>;\n\n @ViewChild('incrementButton')\n protected incrementButton!: ElementRef<HTMLButtonElement>;\n\n public readonly element = injectElement();\n\n /**\n * The maximum allowable value for the spinbox.\n *\n * @type {number}\n * @default Number.POSITIVE_INFINITY\n */\n @Input({ transform: numberAttribute })\n public max = Number.POSITIVE_INFINITY;\n\n /**\n * The minimum allowable value for the spinbox.\n *\n * @type {number}\n * @default Number.NEGATIVE_INFINITY\n */\n @Input({ transform: numberAttribute })\n public min = Number.NEGATIVE_INFINITY;\n\n /**\n * The value increment or decrement step for the spinbox.\n *\n * @type {number}\n * @default 1\n */\n @Input({ transform: numberAttribute })\n public step = 1;\n\n constructor() {\n super(0);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {\n this.inputElement?.stepDown();\n this.updateValue(numberAttribute(this.inputElement.value));\n });\n this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {\n this.inputElement?.stepUp();\n this.updateValue(numberAttribute(this.inputElement.value));\n });\n }\n\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroyDecrementListener?.();\n this.destroyIncrementListener?.();\n }\n\n public override updateValue(value: number) {\n if (this.value === value) return;\n super.updateValue(value);\n }\n\n protected maxSteps({ code }: KeyboardEvent) {\n if (code === 'End' && this.min !== -Infinity) {\n this.updateValue(this.min);\n } else if (code === 'Home' && this.max !== Infinity) {\n this.updateValue(this.max);\n }\n }\n\n protected checkAndUpdate(): void {\n const value = numberAttribute(this.inputElement.value);\n const clampedValue = Math.min(this.max, Math.max(this.min, value));\n this.inputElement.value = clampedValue.toString();\n this.updateValue(clampedValue);\n }\n\n private pressAndHold(element: HTMLElement, handler: () => void, interval = 200): () => void {\n let timerId: number | undefined;\n\n const clearTimer = () => {\n clearInterval(timerId);\n timerId = undefined;\n };\n\n const start = () => {\n handler();\n timerId = window.setInterval(handler, interval);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {\n if (event.code === 'Space') {\n event.preventDefault(); // blocks scrolling\n }\n start();\n }\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.code === 'Space' || event.code === 'Enter') {\n clearTimer();\n }\n };\n\n element.addEventListener('mousedown', start);\n element.addEventListener('mouseup', clearTimer);\n element.addEventListener('mouseout', clearTimer);\n element.addEventListener('keydown', handleKeyDown);\n element.addEventListener('keyup', handleKeyUp);\n\n return () => {\n element.removeEventListener('mousedown', start);\n element.removeEventListener('mouseup', clearTimer);\n element.removeEventListener('mouseout', clearTimer);\n element.removeEventListener('keydown', handleKeyDown);\n element.removeEventListener('keyup', handleKeyUp);\n };\n }\n}\n","<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|