@anglr/datetime 3.0.0-beta.20220328062817 → 3.0.0-beta.20220503131853
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/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +2 -2
- package/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
- package/es2015/src/picker/directives/loopScroll/loopScroll.directive.js +54 -93
- package/es2015/src/picker/directives/loopScroll/loopScroll.directive.js.map +1 -1
- package/es2015/src/picker/directives/loopScrollData/loopScrollData.directive.js +7 -1
- package/es2015/src/picker/directives/loopScrollData/loopScrollData.directive.js.map +1 -1
- package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +2 -2
- package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
- package/es2020/src/picker/directives/loopScroll/loopScroll.directive.js +49 -85
- package/es2020/src/picker/directives/loopScroll/loopScroll.directive.js.map +1 -1
- package/es2020/src/picker/directives/loopScrollData/loopScrollData.directive.js +7 -1
- package/es2020/src/picker/directives/loopScrollData/loopScrollData.directive.js.map +1 -1
- package/package.json +1 -1
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.css +12 -0
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.html +21 -1
- package/src/picker/directives/loopScroll/loopScroll.directive.d.ts +15 -16
- package/src/picker/directives/loopScroll/loopScroll.directive.d.ts.map +1 -1
- package/src/picker/directives/loopScrollData/loopScrollData.directive.d.ts +5 -1
- package/src/picker/directives/loopScrollData/loopScrollData.directive.d.ts.map +1 -1
- package/version.bak +1 -1
|
@@ -136,9 +136,9 @@ export class DateTimeRollerTimePickerComponent extends PickerImplBaseComponent {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
DateTimeRollerTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DateTimeRollerTimePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
-
DateTimeRollerTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DateTimeRollerTimePickerComponent, selector: "date-time-roller-time-picker", usesInheritance: true, ngImport: i0, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\" >\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutside", "clickOutsideElement"], outputs: ["clickOutsideChange"] }, { type: i2.LoopScrollDirective, selector: "[loopScroll]", inputs: ["loopScroll", "open"], outputs: ["loopScrollChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.LoopScrollDataDirective, selector: "[loopScrollData]", inputs: ["loopScrollData"] }], pipes: { "dateFormat": i5.DateFormatPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
139
|
+
DateTimeRollerTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DateTimeRollerTimePickerComponent, selector: "date-time-roller-time-picker", usesInheritance: true, ngImport: i0, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n scroll-snap-type: y mandatory;\n contain: content;\n}\n\n.roller-scroll::-webkit-scrollbar\n{\n display: none;\n}\n\n.roller-scroll>div\n{\n scroll-snap-align: start;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutside", "clickOutsideElement"], outputs: ["clickOutsideChange"] }, { type: i2.LoopScrollDirective, selector: "[loopScroll]", inputs: ["loopScroll", "open"], outputs: ["loopScrollChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.LoopScrollDataDirective, selector: "[loopScrollData]", inputs: ["loopScrollData", "clone"] }], pipes: { "dateFormat": i5.DateFormatPipe, "slice": i3.SlicePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
140
140
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DateTimeRollerTimePickerComponent, decorators: [{
|
|
141
141
|
type: Component,
|
|
142
|
-
args: [{ selector: 'date-time-roller-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\" >\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"] }]
|
|
142
|
+
args: [{ selector: 'date-time-roller-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n scroll-snap-type: y mandatory;\n contain: content;\n}\n\n.roller-scroll::-webkit-scrollbar\n{\n display: none;\n}\n\n.roller-scroll>div\n{\n scroll-snap-align: start;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"] }]
|
|
143
143
|
}] });
|
|
144
144
|
//# sourceMappingURL=rollerTimePicker.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollerTimePicker.component.js","sourceRoot":"","sources":["../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.ts","../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.html"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rollerTimePicker.component.js","sourceRoot":"","sources":["../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.ts","../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.html"],"names":[],"mappings":"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","sourcesContent":["import {Component, ChangeDetectionStrategy} from '@angular/core';\n\nimport {DateTimeValue} from '../../../misc/datetime.interface';\nimport {DateApiObject} from '../../../services';\nimport {LoopScrollData} from '../../directives';\nimport {DateTimePicker} from '../../interfaces';\nimport {PickerImplBaseComponent} from '../pickerImplBase.component';\nimport {hours, minutes} from './rollerTimePicker.data';\nimport {RollerTimePickerCssClasses} from './rollerTimePicker.interface';\n\n/**\n * Component used for rendering roller time picker\n */\n@Component(\n{\n selector: 'date-time-roller-time-picker',\n templateUrl: 'rollerTimePicker.component.html',\n styleUrls: ['rollerTimePicker.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DateTimeRollerTimePickerComponent<TDate = any> extends PickerImplBaseComponent<TDate, RollerTimePickerCssClasses> implements DateTimePicker<TDate, RollerTimePickerCssClasses>\n{\n //######################### public properties - template bindings #########################\n\n /**\n * Array of available hours\n */\n public hours: LoopScrollData[] = hours;\n\n /**\n * Array of available minutes\n */\n public minutes: LoopScrollData[] = minutes;\n\n /**\n * Indication whether are minutes open\n */\n public minutesOpen: boolean = false;\n\n /**\n * Indication whether are hours open\n */\n public hoursOpen: boolean = false;\n\n /**\n * Current value of hour\n */\n public get hour(): number\n {\n return this.displayDate?.hour() ?? 0;\n }\n public set hour(value: number)\n {\n this.displayDate?.hour(value);\n }\n\n /**\n * Current value of minute\n */\n public get minute(): number\n {\n return this.displayDate?.minute() ?? 0;\n }\n public set minute(value: number)\n {\n this.displayDate?.minute(value);\n }\n\n //######################### public methods - implementation of PickerBaseComponent #########################\n \n /**\n * @inheritdoc\n */\n public display(value: DateApiObject<TDate>): void\n {\n this.displayDate = value;\n }\n\n /**\n * @inheritdoc\n */\n public setMinValue(_value: TDate | null): void\n {\n }\n\n /**\n * @inheritdoc\n */\n public setMaxValue(_value: TDate | null): void\n {\n }\n\n /**\n * @inheritdoc\n */\n public setValue(_value: DateTimeValue<TDate> | null): void\n {\n }\n\n //######################### public methods - template bindings #########################\n\n /**\n * Sets hour\n * @param event - Mouse event that was triggered\n * @param value - Value to be set as hour\n * @returns \n */\n public setHour<TData = any>(event: MouseEvent|null, value: TData): void\n {\n if(!this.hoursOpen && event)\n {\n return;\n }\n\n event?.stopPropagation();\n event?.preventDefault();\n\n if(this.hour == value as unknown as number)\n {\n return;\n }\n\n this.hour = value as unknown as number;\n \n if(event)\n {\n this.hoursOpen = false;\n }\n\n if(this.displayDate)\n {\n this._value =\n {\n from: this.displayDate?.value,\n to: this.displayDate?.value\n };\n\n this._valueChange.next();\n }\n }\n\n /**\n * Sets minute\n * @param event - Mouse event that was triggered\n * @param value - Value to be set as minute\n * @returns \n */\n public setMinute<TData = any>(event: MouseEvent|null, value: TData): void\n {\n if(!this.minutesOpen && event)\n {\n return;\n }\n\n event?.stopPropagation();\n event?.preventDefault();\n\n if(this.minute == value as unknown as number)\n {\n return;\n }\n\n this.minute = value as unknown as number;\n \n if(event)\n {\n this.minutesOpen = false;\n }\n\n if(this.displayDate)\n {\n this._value =\n {\n from: this.displayDate?.value,\n to: this.displayDate?.value\n };\n\n this._valueChange.next();\n }\n }\n}","<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ContentChildren, Directive, ElementRef, EventEmitter, Input, Output, QueryList } from '@angular/core';
|
|
3
|
-
import {
|
|
2
|
+
import { ContentChildren, Directive, ElementRef, EventEmitter, HostListener, Input, Output, QueryList } from '@angular/core';
|
|
3
|
+
import { DebounceCall, isBlank, nameof } from '@jscrpt/common';
|
|
4
4
|
import { LoopScrollDataDirective } from '../loopScrollData/loopScrollData.directive';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
/**
|
|
@@ -15,9 +15,9 @@ export class LoopScrollDirective {
|
|
|
15
15
|
*/
|
|
16
16
|
this._initialized = false;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Count of cloned elements before or after
|
|
19
19
|
*/
|
|
20
|
-
this.
|
|
20
|
+
this._clonedCount = 0;
|
|
21
21
|
/**
|
|
22
22
|
* Indication whether is currently selection scroll open
|
|
23
23
|
*/
|
|
@@ -39,23 +39,21 @@ export class LoopScrollDirective {
|
|
|
39
39
|
}
|
|
40
40
|
const itemHeight = (_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1;
|
|
41
41
|
if (nameof('open') in changes) {
|
|
42
|
-
|
|
42
|
+
if (this.open) {
|
|
43
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
43
46
|
if (nameof('value') in changes) {
|
|
44
|
-
const selectedItem = (_b = this.
|
|
47
|
+
const selectedItem = (_b = this._dataItems) === null || _b === void 0 ? void 0 : _b.find(itm => itm.data == this.value);
|
|
45
48
|
if (!selectedItem) {
|
|
46
49
|
throw new Error('No item selected in loop scroll');
|
|
47
50
|
}
|
|
48
|
-
const selectedIndex = this.
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
if (this.open) {
|
|
52
|
-
this._opening = true;
|
|
53
|
-
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
|
|
51
|
+
const selectedIndex = this._dataItems.indexOf(selectedItem);
|
|
52
|
+
this._scrollElement.nativeElement.scrollTo({ top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto' });
|
|
54
53
|
}
|
|
55
54
|
else {
|
|
56
|
-
this._scrollElement.nativeElement.scrollTo({ top:
|
|
55
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto' });
|
|
57
56
|
}
|
|
58
|
-
setTimeout(() => this._opening = false, 300);
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
59
|
//######################### public methods - implementation of AfterContentInit #########################
|
|
@@ -63,35 +61,32 @@ export class LoopScrollDirective {
|
|
|
63
61
|
* Called when content was initialized
|
|
64
62
|
*/
|
|
65
63
|
ngAfterContentInit() {
|
|
66
|
-
var _a, _b, _c;
|
|
64
|
+
var _a, _b, _c, _d;
|
|
67
65
|
this._items = (_a = this.items) === null || _a === void 0 ? void 0 : _a.toArray();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
this._dataItems = (_b = this._items) === null || _b === void 0 ? void 0 : _b.filter(itm => !itm.clone);
|
|
67
|
+
if (!((_c = this._dataItems) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
68
|
+
(_d = this.items) === null || _d === void 0 ? void 0 : _d.changes.subscribe(() => {
|
|
69
|
+
var _a, _b;
|
|
71
70
|
this._items = (_a = this.items) === null || _a === void 0 ? void 0 : _a.toArray();
|
|
71
|
+
this._dataItems = (_b = this._items) === null || _b === void 0 ? void 0 : _b.filter(itm => !itm.clone);
|
|
72
72
|
this._initialize();
|
|
73
73
|
});
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
76
|
this._initialize();
|
|
77
77
|
}
|
|
78
|
-
//######################### public methods - implementation of OnDestroy #########################
|
|
79
|
-
/**
|
|
80
|
-
* Called when component is destroyed
|
|
81
|
-
*/
|
|
82
|
-
ngOnDestroy() {
|
|
83
|
-
this._scrollElement.nativeElement.removeEventListener('scroll', this._handleScroll);
|
|
84
|
-
}
|
|
85
78
|
//######################### protected methods #########################
|
|
86
79
|
/**
|
|
87
80
|
* Intialize default value
|
|
88
81
|
*/
|
|
89
82
|
_initialize() {
|
|
90
|
-
var _a;
|
|
91
|
-
|
|
83
|
+
var _a, _b, _c;
|
|
84
|
+
const cloned = (_b = (_a = this._items) === null || _a === void 0 ? void 0 : _a.filter(itm => itm.clone)) !== null && _b !== void 0 ? _b : [];
|
|
85
|
+
this._clonedCount = cloned.length / 2;
|
|
86
|
+
if (!((_c = this._dataItems) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
92
87
|
return;
|
|
93
88
|
}
|
|
94
|
-
this.
|
|
89
|
+
this._dataItems.forEach(itm => {
|
|
95
90
|
if (isBlank(this._itemHeight)) {
|
|
96
91
|
this._itemHeight = itm.element.nativeElement.offsetHeight;
|
|
97
92
|
return;
|
|
@@ -100,86 +95,49 @@ export class LoopScrollDirective {
|
|
|
100
95
|
throw new Error('All items inside of loop scroll should have same height');
|
|
101
96
|
}
|
|
102
97
|
});
|
|
103
|
-
this.
|
|
104
|
-
this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);
|
|
98
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * this._clonedCount });
|
|
105
99
|
this._initialized = true;
|
|
106
100
|
}
|
|
107
|
-
/**
|
|
108
|
-
* Reorders items to make number of items around scroll view equally sized
|
|
109
|
-
*/
|
|
110
|
-
_reorderItems() {
|
|
111
|
-
var _a, _b, _c, _d, _e;
|
|
112
|
-
const scrollOffset = this._scrollElement.nativeElement.scrollTop;
|
|
113
|
-
const scrollHeight = this._scrollElement.nativeElement.scrollHeight;
|
|
114
|
-
const scrollableHeight = scrollHeight - (5 * ((_a = this._itemHeight) !== null && _a !== void 0 ? _a : 0));
|
|
115
|
-
const scrollMid = scrollableHeight / 2;
|
|
116
|
-
const threshold = scrollableHeight * .25;
|
|
117
|
-
let reorderOffset = null;
|
|
118
|
-
//reorder items
|
|
119
|
-
if (scrollOffset <= scrollMid - threshold ||
|
|
120
|
-
scrollOffset >= scrollMid + threshold) {
|
|
121
|
-
reorderOffset = scrollMid - scrollOffset;
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
//move end items to start
|
|
127
|
-
if (reorderOffset >= 0) {
|
|
128
|
-
const numberOfItems = Math.floor(reorderOffset / ((_b = this._itemHeight) !== null && _b !== void 0 ? _b : 1));
|
|
129
|
-
const movedItems = (_c = this._items) === null || _c === void 0 ? void 0 : _c.splice(this._items.length - numberOfItems, numberOfItems);
|
|
130
|
-
movedItems === null || movedItems === void 0 ? void 0 : movedItems.reverse().forEach(itm => {
|
|
131
|
-
var _a;
|
|
132
|
-
this._scrollElement.nativeElement.prepend(itm.element.nativeElement);
|
|
133
|
-
(_a = this._items) === null || _a === void 0 ? void 0 : _a.unshift(itm);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
//move start items to end
|
|
137
|
-
else {
|
|
138
|
-
const numberOfItems = Math.floor((reorderOffset * -1) / ((_d = this._itemHeight) !== null && _d !== void 0 ? _d : 1));
|
|
139
|
-
const movedItems = (_e = this._items) === null || _e === void 0 ? void 0 : _e.splice(0, numberOfItems);
|
|
140
|
-
movedItems === null || movedItems === void 0 ? void 0 : movedItems.forEach(itm => {
|
|
141
|
-
var _a;
|
|
142
|
-
this._scrollElement.nativeElement.append(itm.element.nativeElement);
|
|
143
|
-
(_a = this._items) === null || _a === void 0 ? void 0 : _a.push(itm);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
101
|
/**
|
|
148
102
|
* Handles scroll event
|
|
149
103
|
*/
|
|
150
104
|
_handleScroll() {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
105
|
+
requestAnimationFrame(() => {
|
|
106
|
+
var _a, _b, _c;
|
|
107
|
+
if (!this._dataItems) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const index = this._scrollElement.nativeElement.scrollTop / ((_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1);
|
|
111
|
+
const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;
|
|
112
|
+
const dataLength = ((_b = this._itemHeight) !== null && _b !== void 0 ? _b : 1) * this._dataItems.length;
|
|
113
|
+
if (dataIndex <= -1) {
|
|
114
|
+
this._updateScroll(dataLength, true, index);
|
|
115
|
+
}
|
|
116
|
+
else if (dataIndex >= ((_c = this._dataItems.length) !== null && _c !== void 0 ? _c : 0)) {
|
|
117
|
+
this._updateScroll(dataLength, false, index);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
159
120
|
}
|
|
160
121
|
/**
|
|
161
|
-
*
|
|
122
|
+
* Updates scroll to be at full value of item
|
|
123
|
+
* @param dataLength - Length of all data
|
|
124
|
+
* @param add - Indication whether add or subtract length
|
|
125
|
+
* @param index - Current index
|
|
162
126
|
*/
|
|
163
|
-
|
|
127
|
+
_updateScroll(dataLength, add, index) {
|
|
164
128
|
var _a;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
throw new Error('No item selected in loop scroll');
|
|
168
|
-
}
|
|
169
|
-
selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.element.nativeElement.scrollIntoView({ block: 'center' });
|
|
170
|
-
this._reorderItems();
|
|
171
|
-
selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.element.nativeElement.scrollIntoView({ block: 'center' });
|
|
129
|
+
this._scrollElement.nativeElement.scrollTo({ top: (Math.round(index) * ((_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto' });
|
|
130
|
+
//TODO emit value change
|
|
172
131
|
}
|
|
173
132
|
}
|
|
174
133
|
LoopScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
175
|
-
LoopScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDirective, selector: "[loopScroll]", inputs: { value: ["loopScroll", "value"], open: "open" }, outputs: { valueChange: "loopScrollChange" }, queries: [{ propertyName: "items", predicate: LoopScrollDataDirective }], usesOnChanges: true, ngImport: i0 });
|
|
134
|
+
LoopScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDirective, selector: "[loopScroll]", inputs: { value: ["loopScroll", "value"], open: "open" }, outputs: { valueChange: "loopScrollChange" }, host: { listeners: { "scroll": "_handleScroll()" } }, queries: [{ propertyName: "items", predicate: LoopScrollDataDirective }], usesOnChanges: true, ngImport: i0 });
|
|
176
135
|
__decorate([
|
|
177
|
-
|
|
178
|
-
DebounceCall(40),
|
|
136
|
+
DebounceCall(18),
|
|
179
137
|
__metadata("design:type", Function),
|
|
180
|
-
__metadata("design:paramtypes", []),
|
|
138
|
+
__metadata("design:paramtypes", [Number, Boolean, Number]),
|
|
181
139
|
__metadata("design:returntype", void 0)
|
|
182
|
-
], LoopScrollDirective.prototype, "
|
|
140
|
+
], LoopScrollDirective.prototype, "_updateScroll", null);
|
|
183
141
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, decorators: [{
|
|
184
142
|
type: Directive,
|
|
185
143
|
args: [{
|
|
@@ -196,5 +154,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
196
154
|
}], items: [{
|
|
197
155
|
type: ContentChildren,
|
|
198
156
|
args: [LoopScrollDataDirective]
|
|
199
|
-
}], _handleScroll: [
|
|
157
|
+
}], _handleScroll: [{
|
|
158
|
+
type: HostListener,
|
|
159
|
+
args: ['scroll']
|
|
160
|
+
}], _updateScroll: [] } });
|
|
200
161
|
//# sourceMappingURL=loopScroll.directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScroll.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScroll/loopScroll.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, QueryList, SimpleChanges} from '@angular/core';\nimport {BindThis, isBlank, DebounceCall, nameof} from '@jscrpt/common';\n\nimport {LoopScrollDataDirective} from '../loopScrollData/loopScrollData.directive';\n\n/**\n * Renders loop scroll for array of elements\n */\n@Directive(\n{\n selector: '[loopScroll]'\n})\nexport class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit, OnDestroy\n{\n //######################### protected fields #########################\n\n /**\n * Item height that obtained\n */\n protected _itemHeight?: number;\n\n /**\n * Array of elements and data for scrolled stuff\n */\n protected _items?: LoopScrollDataDirective[];\n\n /**\n * Indication whether is loop scroll initialized\n */\n protected _initialized: boolean = false;\n\n /**\n * Indication whether is opening active\n */\n protected _opening: boolean = false;\n\n //######################### public properties - inputs #########################\n\n /**\n * Value that is being set in loop scroll\n */\n @Input('loopScroll')\n public value?: TData;\n\n /**\n * Indication whether is currently selection scroll open\n */\n @Input()\n public open: boolean = false;\n\n //######################### public properties - outputs #########################\n\n /**\n * Occurs when current value of loop scroll changes\n */\n @Output('loopScrollChange')\n public valueChange: EventEmitter<TData> = new EventEmitter<TData>();\n\n //######################### public properties - children #########################\n\n /**\n * Array of items that are loop scrolled\n */\n @ContentChildren(LoopScrollDataDirective)\n public items?: QueryList<LoopScrollDataDirective>;\n\n //######################### constructor #########################\n constructor(protected _scrollElement: ElementRef<HTMLElement>)\n {\n }\n\n //######################### public methods - implementation of OnChanges #########################\n \n /**\n * Called when input value changes\n */\n public ngOnChanges(changes: SimpleChanges): void\n {\n if(!this._initialized)\n {\n return;\n }\n\n const itemHeight = this._itemHeight ?? 1;\n\n if(nameof<LoopScrollDirective>('open') in changes)\n {\n let scrollOffset = this._scrollElement.nativeElement.scrollTop + (2 * itemHeight);\n\n if(nameof<LoopScrollDirective>('value') in changes)\n {\n const selectedItem = this._items?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n const selectedIndex = this._items!.indexOf(selectedItem);\n scrollOffset = selectedIndex * itemHeight;\n }\n\n if(this.open)\n {\n this._opening = true;\n\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto'});\n }\n else\n {\n this._scrollElement.nativeElement.scrollTo({top: scrollOffset, behavior: 'auto'});\n }\n\n setTimeout(() => this._opening = false, 300);\n }\n }\n\n //######################### public methods - implementation of AfterContentInit #########################\n \n /**\n * Called when content was initialized\n */\n public ngAfterContentInit(): void\n {\n this._items = this.items?.toArray();\n\n if(!this._items?.length)\n {\n this.items?.changes.subscribe(() =>\n {\n this._items = this.items?.toArray();\n\n this._initialize();\n });\n\n return;\n }\n\n this._initialize();\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._scrollElement.nativeElement.removeEventListener('scroll', this._handleScroll);\n }\n\n //######################### protected methods #########################\n\n /**\n * Intialize default value\n */\n protected _initialize(): void\n {\n if(!this._items?.length)\n {\n return;\n }\n\n this._items.forEach(itm =>\n {\n if(isBlank(this._itemHeight))\n {\n this._itemHeight = itm.element.nativeElement.offsetHeight;\n\n return;\n }\n\n if(this._itemHeight != itm.element.nativeElement.offsetHeight)\n {\n throw new Error('All items inside of loop scroll should have same height');\n }\n });\n\n this._centerActiveValue();\n this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);\n this._initialized = true;\n }\n\n /**\n * Reorders items to make number of items around scroll view equally sized\n */\n protected _reorderItems(): void\n {\n const scrollOffset = this._scrollElement.nativeElement.scrollTop;\n const scrollHeight = this._scrollElement.nativeElement.scrollHeight;\n const scrollableHeight = scrollHeight - (5 * (this._itemHeight ?? 0));\n const scrollMid = scrollableHeight / 2;\n const threshold = scrollableHeight * .25;\n let reorderOffset: number|null = null;\n\n //reorder items\n if(scrollOffset <= scrollMid - threshold ||\n scrollOffset >= scrollMid + threshold)\n {\n reorderOffset = scrollMid - scrollOffset;\n }\n else\n {\n return;\n }\n\n //move end items to start\n if(reorderOffset >= 0)\n {\n const numberOfItems = Math.floor(reorderOffset / (this._itemHeight ?? 1));\n const movedItems = this._items?.splice(this._items.length - numberOfItems, numberOfItems);\n\n movedItems?.reverse().forEach(itm =>\n {\n this._scrollElement.nativeElement.prepend(itm.element.nativeElement);\n this._items?.unshift(itm);\n });\n }\n //move start items to end\n else\n {\n const numberOfItems = Math.floor((reorderOffset * -1) / (this._itemHeight ?? 1));\n const movedItems = this._items?.splice(0, numberOfItems);\n\n movedItems?.forEach(itm =>\n {\n this._scrollElement.nativeElement.append(itm.element.nativeElement);\n this._items?.push(itm);\n });\n }\n }\n\n /**\n * Handles scroll event\n */\n @BindThis\n @DebounceCall(40)\n protected _handleScroll(): void\n {\n this._reorderItems();\n\n const itemHeight = this._itemHeight ?? 1;\n const index = Math.round(this._scrollElement.nativeElement.scrollTop / itemHeight);\n\n this._scrollElement.nativeElement.scrollTo({top: index * itemHeight, behavior: 'auto'});\n\n if(!this._opening)\n {\n this.valueChange.emit(this._items?.[this.open ? (index + 2) : index].data);\n }\n }\n\n /**\n * Centers active value\n */\n protected _centerActiveValue(): void\n {\n const selectedItem = this._items?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n selectedItem?.element.nativeElement.scrollIntoView({block: 'center'});\n this._reorderItems();\n selectedItem?.element.nativeElement.scrollIntoView({block: 'center'});\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"loopScroll.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScroll/loopScroll.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output, QueryList, SimpleChanges} from '@angular/core';\nimport {DebounceCall, isBlank, nameof} from '@jscrpt/common';\n\nimport {LoopScrollDataDirective} from '../loopScrollData/loopScrollData.directive';\n\n/**\n * Renders loop scroll for array of elements\n */\n@Directive(\n{\n selector: '[loopScroll]'\n})\nexport class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit\n{\n //######################### protected fields #########################\n\n /**\n * Item height that obtained\n */\n protected _itemHeight?: number;\n\n /**\n * Array of elements for scrolled stuff\n */\n protected _items?: LoopScrollDataDirective[];\n\n /**\n * Array of elements and data for scrolled stuff\n */ \n protected _dataItems?: LoopScrollDataDirective[];\n\n /**\n * Indication whether is loop scroll initialized\n */\n protected _initialized: boolean = false;\n\n /**\n * Count of cloned elements before or after\n */\n protected _clonedCount: number = 0;\n\n //######################### public properties - inputs #########################\n\n /**\n * Value that is being set in loop scroll\n */\n @Input('loopScroll')\n public value?: TData;\n\n /**\n * Indication whether is currently selection scroll open\n */\n @Input()\n public open: boolean = false;\n\n //######################### public properties - outputs #########################\n\n /**\n * Occurs when current value of loop scroll changes\n */\n @Output('loopScrollChange')\n public valueChange: EventEmitter<TData> = new EventEmitter<TData>();\n\n //######################### protected properties - children #########################\n\n /**\n * Array of items that are loop scrolled\n */\n @ContentChildren(LoopScrollDataDirective)\n protected items?: QueryList<LoopScrollDataDirective>;\n\n //######################### constructor #########################\n constructor(protected _scrollElement: ElementRef<HTMLElement>)\n {\n }\n\n //######################### public methods - implementation of OnChanges #########################\n \n /**\n * Called when input value changes\n */\n public ngOnChanges(changes: SimpleChanges): void\n {\n if(!this._initialized)\n {\n return;\n }\n\n const itemHeight = this._itemHeight ?? 1;\n\n if(nameof<LoopScrollDirective>('open') in changes)\n {\n if(this.open)\n {\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto'});\n\n return;\n }\n\n if(nameof<LoopScrollDirective>('value') in changes)\n {\n const selectedItem = this._dataItems?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n const selectedIndex = this._dataItems!.indexOf(selectedItem);\n\n this._scrollElement.nativeElement.scrollTo({top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto'});\n }\n else\n {\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto'});\n }\n }\n }\n\n //######################### public methods - implementation of AfterContentInit #########################\n \n /**\n * Called when content was initialized\n */\n public ngAfterContentInit(): void\n {\n this._items = this.items?.toArray();\n this._dataItems = this._items?.filter(itm => !itm.clone);\n\n if(!this._dataItems?.length)\n {\n this.items?.changes.subscribe(() =>\n {\n this._items = this.items?.toArray();\n this._dataItems = this._items?.filter(itm => !itm.clone);\n\n this._initialize();\n });\n\n return;\n }\n\n this._initialize();\n }\n\n //######################### protected methods #########################\n\n /**\n * Intialize default value\n */\n protected _initialize(): void\n {\n const cloned = this._items?.filter(itm => itm.clone) ?? [];\n this._clonedCount = cloned.length / 2;\n\n if(!this._dataItems?.length)\n {\n return;\n }\n\n this._dataItems.forEach(itm =>\n {\n if(isBlank(this._itemHeight))\n {\n this._itemHeight = itm.element.nativeElement.offsetHeight;\n\n return;\n }\n\n if(this._itemHeight != itm.element.nativeElement.offsetHeight)\n {\n throw new Error('All items inside of loop scroll should have same height');\n }\n });\n\n this._scrollElement.nativeElement.scrollTo({top: this._itemHeight! * this._clonedCount});\n this._initialized = true;\n }\n\n /**\n * Handles scroll event\n */\n @HostListener('scroll')\n protected _handleScroll(): void\n {\n requestAnimationFrame(() =>\n {\n if(!this._dataItems)\n {\n return;\n }\n\n const index = this._scrollElement.nativeElement.scrollTop / (this._itemHeight ?? 1);\n const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;\n const dataLength = (this._itemHeight ?? 1) * this._dataItems.length;\n\n if(dataIndex <= -1)\n {\n this._updateScroll(dataLength, true, index);\n }\n else if(dataIndex >= (this._dataItems.length ?? 0))\n {\n this._updateScroll(dataLength, false, index);\n }\n });\n }\n\n /**\n * Updates scroll to be at full value of item\n * @param dataLength - Length of all data\n * @param add - Indication whether add or subtract length\n * @param index - Current index\n */\n @DebounceCall(18)\n protected _updateScroll(dataLength: number, add: boolean, index: number): void\n {\n this._scrollElement.nativeElement.scrollTo({top: (Math.round(index) * (this._itemHeight ?? 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto'});\n\n //TODO emit value change\n }\n}"]}
|
|
@@ -7,10 +7,14 @@ export class LoopScrollDataDirective {
|
|
|
7
7
|
//######################### constructor #########################
|
|
8
8
|
constructor(element) {
|
|
9
9
|
this.element = element;
|
|
10
|
+
/**
|
|
11
|
+
* Indication that this node is clone
|
|
12
|
+
*/
|
|
13
|
+
this.clone = false;
|
|
10
14
|
}
|
|
11
15
|
}
|
|
12
16
|
LoopScrollDataDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
13
|
-
LoopScrollDataDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDataDirective, selector: "[loopScrollData]", inputs: { data: ["loopScrollData", "data"] }, ngImport: i0 });
|
|
17
|
+
LoopScrollDataDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDataDirective, selector: "[loopScrollData]", inputs: { data: ["loopScrollData", "data"], clone: "clone" }, ngImport: i0 });
|
|
14
18
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDataDirective, decorators: [{
|
|
15
19
|
type: Directive,
|
|
16
20
|
args: [{
|
|
@@ -19,5 +23,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
19
23
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { data: [{
|
|
20
24
|
type: Input,
|
|
21
25
|
args: ['loopScrollData']
|
|
26
|
+
}], clone: [{
|
|
27
|
+
type: Input
|
|
22
28
|
}] } });
|
|
23
29
|
//# sourceMappingURL=loopScrollData.directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScrollData.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScrollData/loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AAKH,MAAM,OAAO,uBAAuB;
|
|
1
|
+
{"version":3,"file":"loopScrollData.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScrollData/loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AAKH,MAAM,OAAO,uBAAuB;IAgBhC,iEAAiE;IACjE,YAAmB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QAPnD;;WAEG;QAEI,UAAK,GAAY,KAAK,CAAC;IAK9B,CAAC;;oHAnBQ,uBAAuB;wGAAvB,uBAAuB;2FAAvB,uBAAuB;kBAJnC,SAAS;mBACV;oBACI,QAAQ,EAAE,kBAAkB;iBAC/B;iGASU,IAAI;sBADV,KAAK;uBAAC,gBAAgB;gBAOhB,KAAK;sBADX,KAAK","sourcesContent":["import {Directive, ElementRef, Input} from '@angular/core';\n\n/**\n * Loop scroll data that are used inside LoopScrollDirective\n */\n@Directive(\n{\n selector: '[loopScrollData]'\n})\nexport class LoopScrollDataDirective<TData = any>\n{\n //######################### public properties - inputs #########################\n\n /**\n * Data for loop\n */\n @Input('loopScrollData')\n public data!: TData;\n\n /**\n * Indication that this node is clone\n */\n @Input()\n public clone: boolean = false;\n\n //######################### constructor #########################\n constructor(public element: ElementRef<HTMLElement>)\n {\n }\n}"]}
|
|
@@ -130,9 +130,9 @@ export class DateTimeRollerTimePickerComponent extends PickerImplBaseComponent {
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
DateTimeRollerTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DateTimeRollerTimePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
133
|
-
DateTimeRollerTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DateTimeRollerTimePickerComponent, selector: "date-time-roller-time-picker", usesInheritance: true, ngImport: i0, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\" >\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutside", "clickOutsideElement"], outputs: ["clickOutsideChange"] }, { type: i2.LoopScrollDirective, selector: "[loopScroll]", inputs: ["loopScroll", "open"], outputs: ["loopScrollChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.LoopScrollDataDirective, selector: "[loopScrollData]", inputs: ["loopScrollData"] }], pipes: { "dateFormat": i5.DateFormatPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
133
|
+
DateTimeRollerTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DateTimeRollerTimePickerComponent, selector: "date-time-roller-time-picker", usesInheritance: true, ngImport: i0, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n scroll-snap-type: y mandatory;\n contain: content;\n}\n\n.roller-scroll::-webkit-scrollbar\n{\n display: none;\n}\n\n.roller-scroll>div\n{\n scroll-snap-align: start;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutside", "clickOutsideElement"], outputs: ["clickOutsideChange"] }, { type: i2.LoopScrollDirective, selector: "[loopScroll]", inputs: ["loopScroll", "open"], outputs: ["loopScrollChange"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.LoopScrollDataDirective, selector: "[loopScrollData]", inputs: ["loopScrollData", "clone"] }], pipes: { "dateFormat": i5.DateFormatPipe, "slice": i3.SlicePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
134
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DateTimeRollerTimePickerComponent, decorators: [{
|
|
135
135
|
type: Component,
|
|
136
|
-
args: [{ selector: 'date-time-roller-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\" >\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"] }]
|
|
136
|
+
args: [{ selector: 'date-time-roller-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n", styles: [".time-area\n{\n display: flex;\n flex-direction: row;\n padding: 48px 64px;\n font-size: 32px;\n}\n\n.value-container\n{\n position: relative;\n height: 1em;\n width: 2ch;\n}\n\n.roller-scroll\n{\n position: absolute;\n line-height: 1em;\n max-height: 1em;\n overflow: scroll;\n scrollbar-width: none;\n top: 0;\n background-color: #666666;\n transition: all 250ms;\n border-radius: 4px;\n scroll-snap-type: y mandatory;\n contain: content;\n}\n\n.roller-scroll::-webkit-scrollbar\n{\n display: none;\n}\n\n.roller-scroll>div\n{\n scroll-snap-align: start;\n}\n\n.roller-scroll.open\n{\n max-height: 5em;\n top: -2em;\n}\n\n.minute-second-separator\n{\n margin-left: 12px;\n margin-right: 12px;\n line-height: 1em;\n}\n"] }]
|
|
137
137
|
}] });
|
|
138
138
|
//# sourceMappingURL=rollerTimePicker.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollerTimePicker.component.js","sourceRoot":"","sources":["../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.ts","../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.html"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rollerTimePicker.component.js","sourceRoot":"","sources":["../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.ts","../../../../../src/picker/components/rollerTimePicker/rollerTimePicker.component.html"],"names":[],"mappings":"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","sourcesContent":["import {Component, ChangeDetectionStrategy} from '@angular/core';\n\nimport {DateTimeValue} from '../../../misc/datetime.interface';\nimport {DateApiObject} from '../../../services';\nimport {LoopScrollData} from '../../directives';\nimport {DateTimePicker} from '../../interfaces';\nimport {PickerImplBaseComponent} from '../pickerImplBase.component';\nimport {hours, minutes} from './rollerTimePicker.data';\nimport {RollerTimePickerCssClasses} from './rollerTimePicker.interface';\n\n/**\n * Component used for rendering roller time picker\n */\n@Component(\n{\n selector: 'date-time-roller-time-picker',\n templateUrl: 'rollerTimePicker.component.html',\n styleUrls: ['rollerTimePicker.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DateTimeRollerTimePickerComponent<TDate = any> extends PickerImplBaseComponent<TDate, RollerTimePickerCssClasses> implements DateTimePicker<TDate, RollerTimePickerCssClasses>\n{\n //######################### public properties - template bindings #########################\n\n /**\n * Array of available hours\n */\n public hours: LoopScrollData[] = hours;\n\n /**\n * Array of available minutes\n */\n public minutes: LoopScrollData[] = minutes;\n\n /**\n * Indication whether are minutes open\n */\n public minutesOpen: boolean = false;\n\n /**\n * Indication whether are hours open\n */\n public hoursOpen: boolean = false;\n\n /**\n * Current value of hour\n */\n public get hour(): number\n {\n return this.displayDate?.hour() ?? 0;\n }\n public set hour(value: number)\n {\n this.displayDate?.hour(value);\n }\n\n /**\n * Current value of minute\n */\n public get minute(): number\n {\n return this.displayDate?.minute() ?? 0;\n }\n public set minute(value: number)\n {\n this.displayDate?.minute(value);\n }\n\n //######################### public methods - implementation of PickerBaseComponent #########################\n \n /**\n * @inheritdoc\n */\n public display(value: DateApiObject<TDate>): void\n {\n this.displayDate = value;\n }\n\n /**\n * @inheritdoc\n */\n public setMinValue(_value: TDate | null): void\n {\n }\n\n /**\n * @inheritdoc\n */\n public setMaxValue(_value: TDate | null): void\n {\n }\n\n /**\n * @inheritdoc\n */\n public setValue(_value: DateTimeValue<TDate> | null): void\n {\n }\n\n //######################### public methods - template bindings #########################\n\n /**\n * Sets hour\n * @param event - Mouse event that was triggered\n * @param value - Value to be set as hour\n * @returns \n */\n public setHour<TData = any>(event: MouseEvent|null, value: TData): void\n {\n if(!this.hoursOpen && event)\n {\n return;\n }\n\n event?.stopPropagation();\n event?.preventDefault();\n\n if(this.hour == value as unknown as number)\n {\n return;\n }\n\n this.hour = value as unknown as number;\n \n if(event)\n {\n this.hoursOpen = false;\n }\n\n if(this.displayDate)\n {\n this._value =\n {\n from: this.displayDate?.value,\n to: this.displayDate?.value\n };\n\n this._valueChange.next();\n }\n }\n\n /**\n * Sets minute\n * @param event - Mouse event that was triggered\n * @param value - Value to be set as minute\n * @returns \n */\n public setMinute<TData = any>(event: MouseEvent|null, value: TData): void\n {\n if(!this.minutesOpen && event)\n {\n return;\n }\n\n event?.stopPropagation();\n event?.preventDefault();\n\n if(this.minute == value as unknown as number)\n {\n return;\n }\n\n this.minute = value as unknown as number;\n \n if(event)\n {\n this.minutesOpen = false;\n }\n\n if(this.displayDate)\n {\n this._value =\n {\n from: this.displayDate?.value,\n to: this.displayDate?.value\n };\n\n this._valueChange.next();\n }\n }\n}","<div class=\"flex-row\" style=\"justify-content: center;\">\n <div [class.clickable]=\"canGoUp\" (mousedown)=\"goUp($event)\">{{displayDate?.value | dateFormat: 'date'}}</div>\n</div>\n\n<div class=\"time-area\">\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"hoursOpen = false\"\n [clickOutsideElement]=\"hoursScroll\">\n <div #hoursScroll\n class=\"roller-scroll\"\n [class.open]=\"hoursOpen\"\n [loopScroll]=\"hour\"\n [open]=\"hoursOpen\"\n (loopScrollChange)=\"setHour(null, $event)\"\n (click)=\"hoursOpen = !hoursOpen\">\n <div *ngFor=\"let hour of hours | slice: -9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 9\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n </div>\n </div>\n\n <div class=\"minute-second-separator\">:</div>\n\n <div class=\"value-container\"\n [clickOutside]=\"true\"\n (clickOutsideChange)=\"minutesOpen = false\"\n [clickOutsideElement]=\"minutesScroll\">\n <div #minutesScroll\n class=\"roller-scroll\"\n [class.open]=\"minutesOpen\"\n [loopScroll]=\"minute\"\n [open]=\"minutesOpen\"\n (loopScrollChange)=\"setMinute(null, $event)\"\n (click)=\"minutesOpen = !minutesOpen\">\n <div *ngFor=\"let minute of minutes | slice: -15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 15\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ContentChildren, Directive, ElementRef, EventEmitter, Input, Output, QueryList } from '@angular/core';
|
|
3
|
-
import {
|
|
2
|
+
import { ContentChildren, Directive, ElementRef, EventEmitter, HostListener, Input, Output, QueryList } from '@angular/core';
|
|
3
|
+
import { DebounceCall, isBlank, nameof } from '@jscrpt/common';
|
|
4
4
|
import { LoopScrollDataDirective } from '../loopScrollData/loopScrollData.directive';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
/**
|
|
@@ -15,9 +15,9 @@ export class LoopScrollDirective {
|
|
|
15
15
|
*/
|
|
16
16
|
this._initialized = false;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Count of cloned elements before or after
|
|
19
19
|
*/
|
|
20
|
-
this.
|
|
20
|
+
this._clonedCount = 0;
|
|
21
21
|
/**
|
|
22
22
|
* Indication whether is currently selection scroll open
|
|
23
23
|
*/
|
|
@@ -38,23 +38,21 @@ export class LoopScrollDirective {
|
|
|
38
38
|
}
|
|
39
39
|
const itemHeight = this._itemHeight ?? 1;
|
|
40
40
|
if (nameof('open') in changes) {
|
|
41
|
-
|
|
41
|
+
if (this.open) {
|
|
42
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
42
45
|
if (nameof('value') in changes) {
|
|
43
|
-
const selectedItem = this.
|
|
46
|
+
const selectedItem = this._dataItems?.find(itm => itm.data == this.value);
|
|
44
47
|
if (!selectedItem) {
|
|
45
48
|
throw new Error('No item selected in loop scroll');
|
|
46
49
|
}
|
|
47
|
-
const selectedIndex = this.
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
if (this.open) {
|
|
51
|
-
this._opening = true;
|
|
52
|
-
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
|
|
50
|
+
const selectedIndex = this._dataItems.indexOf(selectedItem);
|
|
51
|
+
this._scrollElement.nativeElement.scrollTo({ top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto' });
|
|
53
52
|
}
|
|
54
53
|
else {
|
|
55
|
-
this._scrollElement.nativeElement.scrollTo({ top:
|
|
54
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto' });
|
|
56
55
|
}
|
|
57
|
-
setTimeout(() => this._opening = false, 300);
|
|
58
56
|
}
|
|
59
57
|
}
|
|
60
58
|
//######################### public methods - implementation of AfterContentInit #########################
|
|
@@ -63,31 +61,28 @@ export class LoopScrollDirective {
|
|
|
63
61
|
*/
|
|
64
62
|
ngAfterContentInit() {
|
|
65
63
|
this._items = this.items?.toArray();
|
|
66
|
-
|
|
64
|
+
this._dataItems = this._items?.filter(itm => !itm.clone);
|
|
65
|
+
if (!this._dataItems?.length) {
|
|
67
66
|
this.items?.changes.subscribe(() => {
|
|
68
67
|
this._items = this.items?.toArray();
|
|
68
|
+
this._dataItems = this._items?.filter(itm => !itm.clone);
|
|
69
69
|
this._initialize();
|
|
70
70
|
});
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
this._initialize();
|
|
74
74
|
}
|
|
75
|
-
//######################### public methods - implementation of OnDestroy #########################
|
|
76
|
-
/**
|
|
77
|
-
* Called when component is destroyed
|
|
78
|
-
*/
|
|
79
|
-
ngOnDestroy() {
|
|
80
|
-
this._scrollElement.nativeElement.removeEventListener('scroll', this._handleScroll);
|
|
81
|
-
}
|
|
82
75
|
//######################### protected methods #########################
|
|
83
76
|
/**
|
|
84
77
|
* Intialize default value
|
|
85
78
|
*/
|
|
86
79
|
_initialize() {
|
|
87
|
-
|
|
80
|
+
const cloned = this._items?.filter(itm => itm.clone) ?? [];
|
|
81
|
+
this._clonedCount = cloned.length / 2;
|
|
82
|
+
if (!this._dataItems?.length) {
|
|
88
83
|
return;
|
|
89
84
|
}
|
|
90
|
-
this.
|
|
85
|
+
this._dataItems.forEach(itm => {
|
|
91
86
|
if (isBlank(this._itemHeight)) {
|
|
92
87
|
this._itemHeight = itm.element.nativeElement.offsetHeight;
|
|
93
88
|
return;
|
|
@@ -96,81 +91,47 @@ export class LoopScrollDirective {
|
|
|
96
91
|
throw new Error('All items inside of loop scroll should have same height');
|
|
97
92
|
}
|
|
98
93
|
});
|
|
99
|
-
this.
|
|
100
|
-
this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);
|
|
94
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * this._clonedCount });
|
|
101
95
|
this._initialized = true;
|
|
102
96
|
}
|
|
103
|
-
/**
|
|
104
|
-
* Reorders items to make number of items around scroll view equally sized
|
|
105
|
-
*/
|
|
106
|
-
_reorderItems() {
|
|
107
|
-
const scrollOffset = this._scrollElement.nativeElement.scrollTop;
|
|
108
|
-
const scrollHeight = this._scrollElement.nativeElement.scrollHeight;
|
|
109
|
-
const scrollableHeight = scrollHeight - (5 * (this._itemHeight ?? 0));
|
|
110
|
-
const scrollMid = scrollableHeight / 2;
|
|
111
|
-
const threshold = scrollableHeight * .25;
|
|
112
|
-
let reorderOffset = null;
|
|
113
|
-
//reorder items
|
|
114
|
-
if (scrollOffset <= scrollMid - threshold ||
|
|
115
|
-
scrollOffset >= scrollMid + threshold) {
|
|
116
|
-
reorderOffset = scrollMid - scrollOffset;
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
//move end items to start
|
|
122
|
-
if (reorderOffset >= 0) {
|
|
123
|
-
const numberOfItems = Math.floor(reorderOffset / (this._itemHeight ?? 1));
|
|
124
|
-
const movedItems = this._items?.splice(this._items.length - numberOfItems, numberOfItems);
|
|
125
|
-
movedItems?.reverse().forEach(itm => {
|
|
126
|
-
this._scrollElement.nativeElement.prepend(itm.element.nativeElement);
|
|
127
|
-
this._items?.unshift(itm);
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
//move start items to end
|
|
131
|
-
else {
|
|
132
|
-
const numberOfItems = Math.floor((reorderOffset * -1) / (this._itemHeight ?? 1));
|
|
133
|
-
const movedItems = this._items?.splice(0, numberOfItems);
|
|
134
|
-
movedItems?.forEach(itm => {
|
|
135
|
-
this._scrollElement.nativeElement.append(itm.element.nativeElement);
|
|
136
|
-
this._items?.push(itm);
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
97
|
/**
|
|
141
98
|
* Handles scroll event
|
|
142
99
|
*/
|
|
143
100
|
_handleScroll() {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
101
|
+
requestAnimationFrame(() => {
|
|
102
|
+
if (!this._dataItems) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const index = this._scrollElement.nativeElement.scrollTop / (this._itemHeight ?? 1);
|
|
106
|
+
const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;
|
|
107
|
+
const dataLength = (this._itemHeight ?? 1) * this._dataItems.length;
|
|
108
|
+
if (dataIndex <= -1) {
|
|
109
|
+
this._updateScroll(dataLength, true, index);
|
|
110
|
+
}
|
|
111
|
+
else if (dataIndex >= (this._dataItems.length ?? 0)) {
|
|
112
|
+
this._updateScroll(dataLength, false, index);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
151
115
|
}
|
|
152
116
|
/**
|
|
153
|
-
*
|
|
117
|
+
* Updates scroll to be at full value of item
|
|
118
|
+
* @param dataLength - Length of all data
|
|
119
|
+
* @param add - Indication whether add or subtract length
|
|
120
|
+
* @param index - Current index
|
|
154
121
|
*/
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
throw new Error('No item selected in loop scroll');
|
|
159
|
-
}
|
|
160
|
-
selectedItem?.element.nativeElement.scrollIntoView({ block: 'center' });
|
|
161
|
-
this._reorderItems();
|
|
162
|
-
selectedItem?.element.nativeElement.scrollIntoView({ block: 'center' });
|
|
122
|
+
_updateScroll(dataLength, add, index) {
|
|
123
|
+
this._scrollElement.nativeElement.scrollTo({ top: (Math.round(index) * (this._itemHeight ?? 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto' });
|
|
124
|
+
//TODO emit value change
|
|
163
125
|
}
|
|
164
126
|
}
|
|
165
127
|
LoopScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
166
|
-
LoopScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDirective, selector: "[loopScroll]", inputs: { value: ["loopScroll", "value"], open: "open" }, outputs: { valueChange: "loopScrollChange" }, queries: [{ propertyName: "items", predicate: LoopScrollDataDirective }], usesOnChanges: true, ngImport: i0 });
|
|
128
|
+
LoopScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDirective, selector: "[loopScroll]", inputs: { value: ["loopScroll", "value"], open: "open" }, outputs: { valueChange: "loopScrollChange" }, host: { listeners: { "scroll": "_handleScroll()" } }, queries: [{ propertyName: "items", predicate: LoopScrollDataDirective }], usesOnChanges: true, ngImport: i0 });
|
|
167
129
|
__decorate([
|
|
168
|
-
|
|
169
|
-
DebounceCall(40),
|
|
130
|
+
DebounceCall(18),
|
|
170
131
|
__metadata("design:type", Function),
|
|
171
|
-
__metadata("design:paramtypes", []),
|
|
132
|
+
__metadata("design:paramtypes", [Number, Boolean, Number]),
|
|
172
133
|
__metadata("design:returntype", void 0)
|
|
173
|
-
], LoopScrollDirective.prototype, "
|
|
134
|
+
], LoopScrollDirective.prototype, "_updateScroll", null);
|
|
174
135
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, decorators: [{
|
|
175
136
|
type: Directive,
|
|
176
137
|
args: [{
|
|
@@ -187,5 +148,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
187
148
|
}], items: [{
|
|
188
149
|
type: ContentChildren,
|
|
189
150
|
args: [LoopScrollDataDirective]
|
|
190
|
-
}], _handleScroll: [
|
|
151
|
+
}], _handleScroll: [{
|
|
152
|
+
type: HostListener,
|
|
153
|
+
args: ['scroll']
|
|
154
|
+
}], _updateScroll: [] } });
|
|
191
155
|
//# sourceMappingURL=loopScroll.directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScroll.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScroll/loopScroll.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, QueryList, SimpleChanges} from '@angular/core';\nimport {BindThis, isBlank, DebounceCall, nameof} from '@jscrpt/common';\n\nimport {LoopScrollDataDirective} from '../loopScrollData/loopScrollData.directive';\n\n/**\n * Renders loop scroll for array of elements\n */\n@Directive(\n{\n selector: '[loopScroll]'\n})\nexport class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit, OnDestroy\n{\n //######################### protected fields #########################\n\n /**\n * Item height that obtained\n */\n protected _itemHeight?: number;\n\n /**\n * Array of elements and data for scrolled stuff\n */\n protected _items?: LoopScrollDataDirective[];\n\n /**\n * Indication whether is loop scroll initialized\n */\n protected _initialized: boolean = false;\n\n /**\n * Indication whether is opening active\n */\n protected _opening: boolean = false;\n\n //######################### public properties - inputs #########################\n\n /**\n * Value that is being set in loop scroll\n */\n @Input('loopScroll')\n public value?: TData;\n\n /**\n * Indication whether is currently selection scroll open\n */\n @Input()\n public open: boolean = false;\n\n //######################### public properties - outputs #########################\n\n /**\n * Occurs when current value of loop scroll changes\n */\n @Output('loopScrollChange')\n public valueChange: EventEmitter<TData> = new EventEmitter<TData>();\n\n //######################### public properties - children #########################\n\n /**\n * Array of items that are loop scrolled\n */\n @ContentChildren(LoopScrollDataDirective)\n public items?: QueryList<LoopScrollDataDirective>;\n\n //######################### constructor #########################\n constructor(protected _scrollElement: ElementRef<HTMLElement>)\n {\n }\n\n //######################### public methods - implementation of OnChanges #########################\n \n /**\n * Called when input value changes\n */\n public ngOnChanges(changes: SimpleChanges): void\n {\n if(!this._initialized)\n {\n return;\n }\n\n const itemHeight = this._itemHeight ?? 1;\n\n if(nameof<LoopScrollDirective>('open') in changes)\n {\n let scrollOffset = this._scrollElement.nativeElement.scrollTop + (2 * itemHeight);\n\n if(nameof<LoopScrollDirective>('value') in changes)\n {\n const selectedItem = this._items?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n const selectedIndex = this._items!.indexOf(selectedItem);\n scrollOffset = selectedIndex * itemHeight;\n }\n\n if(this.open)\n {\n this._opening = true;\n\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto'});\n }\n else\n {\n this._scrollElement.nativeElement.scrollTo({top: scrollOffset, behavior: 'auto'});\n }\n\n setTimeout(() => this._opening = false, 300);\n }\n }\n\n //######################### public methods - implementation of AfterContentInit #########################\n \n /**\n * Called when content was initialized\n */\n public ngAfterContentInit(): void\n {\n this._items = this.items?.toArray();\n\n if(!this._items?.length)\n {\n this.items?.changes.subscribe(() =>\n {\n this._items = this.items?.toArray();\n\n this._initialize();\n });\n\n return;\n }\n\n this._initialize();\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._scrollElement.nativeElement.removeEventListener('scroll', this._handleScroll);\n }\n\n //######################### protected methods #########################\n\n /**\n * Intialize default value\n */\n protected _initialize(): void\n {\n if(!this._items?.length)\n {\n return;\n }\n\n this._items.forEach(itm =>\n {\n if(isBlank(this._itemHeight))\n {\n this._itemHeight = itm.element.nativeElement.offsetHeight;\n\n return;\n }\n\n if(this._itemHeight != itm.element.nativeElement.offsetHeight)\n {\n throw new Error('All items inside of loop scroll should have same height');\n }\n });\n\n this._centerActiveValue();\n this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);\n this._initialized = true;\n }\n\n /**\n * Reorders items to make number of items around scroll view equally sized\n */\n protected _reorderItems(): void\n {\n const scrollOffset = this._scrollElement.nativeElement.scrollTop;\n const scrollHeight = this._scrollElement.nativeElement.scrollHeight;\n const scrollableHeight = scrollHeight - (5 * (this._itemHeight ?? 0));\n const scrollMid = scrollableHeight / 2;\n const threshold = scrollableHeight * .25;\n let reorderOffset: number|null = null;\n\n //reorder items\n if(scrollOffset <= scrollMid - threshold ||\n scrollOffset >= scrollMid + threshold)\n {\n reorderOffset = scrollMid - scrollOffset;\n }\n else\n {\n return;\n }\n\n //move end items to start\n if(reorderOffset >= 0)\n {\n const numberOfItems = Math.floor(reorderOffset / (this._itemHeight ?? 1));\n const movedItems = this._items?.splice(this._items.length - numberOfItems, numberOfItems);\n\n movedItems?.reverse().forEach(itm =>\n {\n this._scrollElement.nativeElement.prepend(itm.element.nativeElement);\n this._items?.unshift(itm);\n });\n }\n //move start items to end\n else\n {\n const numberOfItems = Math.floor((reorderOffset * -1) / (this._itemHeight ?? 1));\n const movedItems = this._items?.splice(0, numberOfItems);\n\n movedItems?.forEach(itm =>\n {\n this._scrollElement.nativeElement.append(itm.element.nativeElement);\n this._items?.push(itm);\n });\n }\n }\n\n /**\n * Handles scroll event\n */\n @BindThis\n @DebounceCall(40)\n protected _handleScroll(): void\n {\n this._reorderItems();\n\n const itemHeight = this._itemHeight ?? 1;\n const index = Math.round(this._scrollElement.nativeElement.scrollTop / itemHeight);\n\n this._scrollElement.nativeElement.scrollTo({top: index * itemHeight, behavior: 'auto'});\n\n if(!this._opening)\n {\n this.valueChange.emit(this._items?.[this.open ? (index + 2) : index].data);\n }\n }\n\n /**\n * Centers active value\n */\n protected _centerActiveValue(): void\n {\n const selectedItem = this._items?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n selectedItem?.element.nativeElement.scrollIntoView({block: 'center'});\n this._reorderItems();\n selectedItem?.element.nativeElement.scrollIntoView({block: 'center'});\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"loopScroll.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScroll/loopScroll.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output, QueryList, SimpleChanges} from '@angular/core';\nimport {DebounceCall, isBlank, nameof} from '@jscrpt/common';\n\nimport {LoopScrollDataDirective} from '../loopScrollData/loopScrollData.directive';\n\n/**\n * Renders loop scroll for array of elements\n */\n@Directive(\n{\n selector: '[loopScroll]'\n})\nexport class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit\n{\n //######################### protected fields #########################\n\n /**\n * Item height that obtained\n */\n protected _itemHeight?: number;\n\n /**\n * Array of elements for scrolled stuff\n */\n protected _items?: LoopScrollDataDirective[];\n\n /**\n * Array of elements and data for scrolled stuff\n */ \n protected _dataItems?: LoopScrollDataDirective[];\n\n /**\n * Indication whether is loop scroll initialized\n */\n protected _initialized: boolean = false;\n\n /**\n * Count of cloned elements before or after\n */\n protected _clonedCount: number = 0;\n\n //######################### public properties - inputs #########################\n\n /**\n * Value that is being set in loop scroll\n */\n @Input('loopScroll')\n public value?: TData;\n\n /**\n * Indication whether is currently selection scroll open\n */\n @Input()\n public open: boolean = false;\n\n //######################### public properties - outputs #########################\n\n /**\n * Occurs when current value of loop scroll changes\n */\n @Output('loopScrollChange')\n public valueChange: EventEmitter<TData> = new EventEmitter<TData>();\n\n //######################### protected properties - children #########################\n\n /**\n * Array of items that are loop scrolled\n */\n @ContentChildren(LoopScrollDataDirective)\n protected items?: QueryList<LoopScrollDataDirective>;\n\n //######################### constructor #########################\n constructor(protected _scrollElement: ElementRef<HTMLElement>)\n {\n }\n\n //######################### public methods - implementation of OnChanges #########################\n \n /**\n * Called when input value changes\n */\n public ngOnChanges(changes: SimpleChanges): void\n {\n if(!this._initialized)\n {\n return;\n }\n\n const itemHeight = this._itemHeight ?? 1;\n\n if(nameof<LoopScrollDirective>('open') in changes)\n {\n if(this.open)\n {\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto'});\n\n return;\n }\n\n if(nameof<LoopScrollDirective>('value') in changes)\n {\n const selectedItem = this._dataItems?.find(itm => itm.data == this.value);\n\n if(!selectedItem)\n {\n throw new Error('No item selected in loop scroll');\n }\n\n const selectedIndex = this._dataItems!.indexOf(selectedItem);\n\n this._scrollElement.nativeElement.scrollTo({top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto'});\n }\n else\n {\n this._scrollElement.nativeElement.scrollTo({top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto'});\n }\n }\n }\n\n //######################### public methods - implementation of AfterContentInit #########################\n \n /**\n * Called when content was initialized\n */\n public ngAfterContentInit(): void\n {\n this._items = this.items?.toArray();\n this._dataItems = this._items?.filter(itm => !itm.clone);\n\n if(!this._dataItems?.length)\n {\n this.items?.changes.subscribe(() =>\n {\n this._items = this.items?.toArray();\n this._dataItems = this._items?.filter(itm => !itm.clone);\n\n this._initialize();\n });\n\n return;\n }\n\n this._initialize();\n }\n\n //######################### protected methods #########################\n\n /**\n * Intialize default value\n */\n protected _initialize(): void\n {\n const cloned = this._items?.filter(itm => itm.clone) ?? [];\n this._clonedCount = cloned.length / 2;\n\n if(!this._dataItems?.length)\n {\n return;\n }\n\n this._dataItems.forEach(itm =>\n {\n if(isBlank(this._itemHeight))\n {\n this._itemHeight = itm.element.nativeElement.offsetHeight;\n\n return;\n }\n\n if(this._itemHeight != itm.element.nativeElement.offsetHeight)\n {\n throw new Error('All items inside of loop scroll should have same height');\n }\n });\n\n this._scrollElement.nativeElement.scrollTo({top: this._itemHeight! * this._clonedCount});\n this._initialized = true;\n }\n\n /**\n * Handles scroll event\n */\n @HostListener('scroll')\n protected _handleScroll(): void\n {\n requestAnimationFrame(() =>\n {\n if(!this._dataItems)\n {\n return;\n }\n\n const index = this._scrollElement.nativeElement.scrollTop / (this._itemHeight ?? 1);\n const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;\n const dataLength = (this._itemHeight ?? 1) * this._dataItems.length;\n\n if(dataIndex <= -1)\n {\n this._updateScroll(dataLength, true, index);\n }\n else if(dataIndex >= (this._dataItems.length ?? 0))\n {\n this._updateScroll(dataLength, false, index);\n }\n });\n }\n\n /**\n * Updates scroll to be at full value of item\n * @param dataLength - Length of all data\n * @param add - Indication whether add or subtract length\n * @param index - Current index\n */\n @DebounceCall(18)\n protected _updateScroll(dataLength: number, add: boolean, index: number): void\n {\n this._scrollElement.nativeElement.scrollTo({top: (Math.round(index) * (this._itemHeight ?? 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto'});\n\n //TODO emit value change\n }\n}"]}
|
|
@@ -7,10 +7,14 @@ export class LoopScrollDataDirective {
|
|
|
7
7
|
//######################### constructor #########################
|
|
8
8
|
constructor(element) {
|
|
9
9
|
this.element = element;
|
|
10
|
+
/**
|
|
11
|
+
* Indication that this node is clone
|
|
12
|
+
*/
|
|
13
|
+
this.clone = false;
|
|
10
14
|
}
|
|
11
15
|
}
|
|
12
16
|
LoopScrollDataDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
13
|
-
LoopScrollDataDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDataDirective, selector: "[loopScrollData]", inputs: { data: ["loopScrollData", "data"] }, ngImport: i0 });
|
|
17
|
+
LoopScrollDataDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: LoopScrollDataDirective, selector: "[loopScrollData]", inputs: { data: ["loopScrollData", "data"], clone: "clone" }, ngImport: i0 });
|
|
14
18
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDataDirective, decorators: [{
|
|
15
19
|
type: Directive,
|
|
16
20
|
args: [{
|
|
@@ -19,5 +23,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
19
23
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { data: [{
|
|
20
24
|
type: Input,
|
|
21
25
|
args: ['loopScrollData']
|
|
26
|
+
}], clone: [{
|
|
27
|
+
type: Input
|
|
22
28
|
}] } });
|
|
23
29
|
//# sourceMappingURL=loopScrollData.directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScrollData.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScrollData/loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AAKH,MAAM,OAAO,uBAAuB;
|
|
1
|
+
{"version":3,"file":"loopScrollData.directive.js","sourceRoot":"","sources":["../../../../../src/picker/directives/loopScrollData/loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AAKH,MAAM,OAAO,uBAAuB;IAgBhC,iEAAiE;IACjE,YAAmB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QAPnD;;WAEG;QAEI,UAAK,GAAY,KAAK,CAAC;IAK9B,CAAC;;oHAnBQ,uBAAuB;wGAAvB,uBAAuB;2FAAvB,uBAAuB;kBAJnC,SAAS;mBACV;oBACI,QAAQ,EAAE,kBAAkB;iBAC/B;iGASU,IAAI;sBADV,KAAK;uBAAC,gBAAgB;gBAOhB,KAAK;sBADX,KAAK","sourcesContent":["import {Directive, ElementRef, Input} from '@angular/core';\n\n/**\n * Loop scroll data that are used inside LoopScrollDirective\n */\n@Directive(\n{\n selector: '[loopScrollData]'\n})\nexport class LoopScrollDataDirective<TData = any>\n{\n //######################### public properties - inputs #########################\n\n /**\n * Data for loop\n */\n @Input('loopScrollData')\n public data!: TData;\n\n /**\n * Indication that this node is clone\n */\n @Input()\n public clone: boolean = false;\n\n //######################### constructor #########################\n constructor(public element: ElementRef<HTMLElement>)\n {\n }\n}"]}
|
package/package.json
CHANGED
|
@@ -24,6 +24,18 @@
|
|
|
24
24
|
background-color: #666666;
|
|
25
25
|
transition: all 250ms;
|
|
26
26
|
border-radius: 4px;
|
|
27
|
+
scroll-snap-type: y mandatory;
|
|
28
|
+
contain: content;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.roller-scroll::-webkit-scrollbar
|
|
32
|
+
{
|
|
33
|
+
display: none;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.roller-scroll>div
|
|
37
|
+
{
|
|
38
|
+
scroll-snap-align: start;
|
|
27
39
|
}
|
|
28
40
|
|
|
29
41
|
.roller-scroll.open
|
|
@@ -13,10 +13,20 @@
|
|
|
13
13
|
[loopScroll]="hour"
|
|
14
14
|
[open]="hoursOpen"
|
|
15
15
|
(loopScrollChange)="setHour(null, $event)"
|
|
16
|
-
(click)="hoursOpen = !hoursOpen"
|
|
16
|
+
(click)="hoursOpen = !hoursOpen">
|
|
17
|
+
<div *ngFor="let hour of hours | slice: -9"
|
|
18
|
+
[loopScrollData]="hour?.data"
|
|
19
|
+
[clone]="true"
|
|
20
|
+
(click)="setHour($event, hour?.data)">{{hour?.displayText}}</div>
|
|
21
|
+
|
|
17
22
|
<div *ngFor="let hour of hours"
|
|
18
23
|
[loopScrollData]="hour?.data"
|
|
19
24
|
(click)="setHour($event, hour?.data)">{{hour?.displayText}}</div>
|
|
25
|
+
|
|
26
|
+
<div *ngFor="let hour of hours | slice: 0: 9"
|
|
27
|
+
[loopScrollData]="hour?.data"
|
|
28
|
+
[clone]="true"
|
|
29
|
+
(click)="setHour($event, hour?.data)">{{hour?.displayText}}</div>
|
|
20
30
|
</div>
|
|
21
31
|
</div>
|
|
22
32
|
|
|
@@ -33,9 +43,19 @@
|
|
|
33
43
|
[open]="minutesOpen"
|
|
34
44
|
(loopScrollChange)="setMinute(null, $event)"
|
|
35
45
|
(click)="minutesOpen = !minutesOpen">
|
|
46
|
+
<div *ngFor="let minute of minutes | slice: -15"
|
|
47
|
+
[loopScrollData]="minute?.data"
|
|
48
|
+
[clone]="true"
|
|
49
|
+
(click)="setMinute($event, minute?.data)">{{minute?.displayText}}</div>
|
|
50
|
+
|
|
36
51
|
<div *ngFor="let minute of minutes"
|
|
37
52
|
[loopScrollData]="minute?.data"
|
|
38
53
|
(click)="setMinute($event, minute?.data)">{{minute?.displayText}}</div>
|
|
54
|
+
|
|
55
|
+
<div *ngFor="let minute of minutes | slice: 0: 15"
|
|
56
|
+
[loopScrollData]="minute?.data"
|
|
57
|
+
[clone]="true"
|
|
58
|
+
(click)="setMinute($event, minute?.data)">{{minute?.displayText}}</div>
|
|
39
59
|
</div>
|
|
40
60
|
</div>
|
|
41
61
|
</div>
|
|
@@ -1,27 +1,31 @@
|
|
|
1
|
-
import { AfterContentInit, ElementRef, EventEmitter, OnChanges,
|
|
1
|
+
import { AfterContentInit, ElementRef, EventEmitter, OnChanges, QueryList, SimpleChanges } from '@angular/core';
|
|
2
2
|
import { LoopScrollDataDirective } from '../loopScrollData/loopScrollData.directive';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
5
|
* Renders loop scroll for array of elements
|
|
6
6
|
*/
|
|
7
|
-
export declare class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit
|
|
7
|
+
export declare class LoopScrollDirective<TData = any> implements OnChanges, AfterContentInit {
|
|
8
8
|
protected _scrollElement: ElementRef<HTMLElement>;
|
|
9
9
|
/**
|
|
10
10
|
* Item height that obtained
|
|
11
11
|
*/
|
|
12
12
|
protected _itemHeight?: number;
|
|
13
13
|
/**
|
|
14
|
-
* Array of elements
|
|
14
|
+
* Array of elements for scrolled stuff
|
|
15
15
|
*/
|
|
16
16
|
protected _items?: LoopScrollDataDirective[];
|
|
17
|
+
/**
|
|
18
|
+
* Array of elements and data for scrolled stuff
|
|
19
|
+
*/
|
|
20
|
+
protected _dataItems?: LoopScrollDataDirective[];
|
|
17
21
|
/**
|
|
18
22
|
* Indication whether is loop scroll initialized
|
|
19
23
|
*/
|
|
20
24
|
protected _initialized: boolean;
|
|
21
25
|
/**
|
|
22
|
-
*
|
|
26
|
+
* Count of cloned elements before or after
|
|
23
27
|
*/
|
|
24
|
-
protected
|
|
28
|
+
protected _clonedCount: number;
|
|
25
29
|
/**
|
|
26
30
|
* Value that is being set in loop scroll
|
|
27
31
|
*/
|
|
@@ -37,7 +41,7 @@ export declare class LoopScrollDirective<TData = any> implements OnChanges, Afte
|
|
|
37
41
|
/**
|
|
38
42
|
* Array of items that are loop scrolled
|
|
39
43
|
*/
|
|
40
|
-
items?: QueryList<LoopScrollDataDirective>;
|
|
44
|
+
protected items?: QueryList<LoopScrollDataDirective>;
|
|
41
45
|
constructor(_scrollElement: ElementRef<HTMLElement>);
|
|
42
46
|
/**
|
|
43
47
|
* Called when input value changes
|
|
@@ -47,26 +51,21 @@ export declare class LoopScrollDirective<TData = any> implements OnChanges, Afte
|
|
|
47
51
|
* Called when content was initialized
|
|
48
52
|
*/
|
|
49
53
|
ngAfterContentInit(): void;
|
|
50
|
-
/**
|
|
51
|
-
* Called when component is destroyed
|
|
52
|
-
*/
|
|
53
|
-
ngOnDestroy(): void;
|
|
54
54
|
/**
|
|
55
55
|
* Intialize default value
|
|
56
56
|
*/
|
|
57
57
|
protected _initialize(): void;
|
|
58
|
-
/**
|
|
59
|
-
* Reorders items to make number of items around scroll view equally sized
|
|
60
|
-
*/
|
|
61
|
-
protected _reorderItems(): void;
|
|
62
58
|
/**
|
|
63
59
|
* Handles scroll event
|
|
64
60
|
*/
|
|
65
61
|
protected _handleScroll(): void;
|
|
66
62
|
/**
|
|
67
|
-
*
|
|
63
|
+
* Updates scroll to be at full value of item
|
|
64
|
+
* @param dataLength - Length of all data
|
|
65
|
+
* @param add - Indication whether add or subtract length
|
|
66
|
+
* @param index - Current index
|
|
68
67
|
*/
|
|
69
|
-
protected
|
|
68
|
+
protected _updateScroll(dataLength: number, add: boolean, index: number): void;
|
|
70
69
|
static ɵfac: i0.ɵɵFactoryDeclaration<LoopScrollDirective<any>, never>;
|
|
71
70
|
static ɵdir: i0.ɵɵDirectiveDeclaration<LoopScrollDirective<any>, "[loopScroll]", never, { "value": "loopScroll"; "open": "open"; }, { "valueChange": "loopScrollChange"; }, ["items"]>;
|
|
72
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScroll.directive.d.ts","sourceRoot":"","sources":["loopScroll.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAA8B,UAAU,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"loopScroll.directive.d.ts","sourceRoot":"","sources":["loopScroll.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAA8B,UAAU,EAAE,YAAY,EAAuB,SAAS,EAAU,SAAS,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAGvK,OAAO,EAAC,uBAAuB,EAAC,MAAM,4CAA4C,CAAC;;AAEnF;;GAEG;AACH,qBAIa,mBAAmB,CAAC,KAAK,GAAG,GAAG,CAAE,YAAW,SAAS,EAAE,gBAAgB;IA4DpE,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;IAxD7D;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAE7C;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAEjD;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,OAAO,CAAS;IAExC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAK;IAInC;;OAEG;IAEI,KAAK,CAAC,EAAE,KAAK,CAAC;IAErB;;OAEG;IAEI,IAAI,EAAE,OAAO,CAAS;IAI7B;;OAEG;IAEI,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,CAA6B;IAIpE;;OAEG;IAEH,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC;gBAG/B,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;IAM7D;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAwChD;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAuBjC;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IA6B7B;;OAEG;IAEH,SAAS,CAAC,aAAa,IAAI,IAAI;IAwB/B;;;;;OAKG;IAEH,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;yCA1MrE,mBAAmB;2CAAnB,mBAAmB;CAgN/B"}
|
|
@@ -9,8 +9,12 @@ export declare class LoopScrollDataDirective<TData = any> {
|
|
|
9
9
|
* Data for loop
|
|
10
10
|
*/
|
|
11
11
|
data: TData;
|
|
12
|
+
/**
|
|
13
|
+
* Indication that this node is clone
|
|
14
|
+
*/
|
|
15
|
+
clone: boolean;
|
|
12
16
|
constructor(element: ElementRef<HTMLElement>);
|
|
13
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<LoopScrollDataDirective<any>, never>;
|
|
14
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<LoopScrollDataDirective<any>, "[loopScrollData]", never, { "data": "loopScrollData"; }, {}, never>;
|
|
18
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<LoopScrollDataDirective<any>, "[loopScrollData]", never, { "data": "loopScrollData"; "clone": "clone"; }, {}, never>;
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=loopScrollData.directive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopScrollData.directive.d.ts","sourceRoot":"","sources":["loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAQ,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AACH,qBAIa,uBAAuB,CAAC,KAAK,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"loopScrollData.directive.d.ts","sourceRoot":"","sources":["loopScrollData.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAQ,MAAM,eAAe,CAAC;;AAE3D;;GAEG;AACH,qBAIa,uBAAuB,CAAC,KAAK,GAAG,GAAG;IAiBzB,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;IAbnD;;OAEG;IAEI,IAAI,EAAG,KAAK,CAAC;IAEpB;;OAEG;IAEI,KAAK,EAAE,OAAO,CAAS;gBAGX,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;yCAjB1C,uBAAuB;2CAAvB,uBAAuB;CAoBnC"}
|
package/version.bak
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.0.0-beta.
|
|
1
|
+
3.0.0-beta.20220503131853
|