@anglr/datetime 3.0.0-beta.20220328062817 → 3.0.0-beta.20220504102413
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +7 -2
- package/date-fns/src/services/dateFnsDateApi.service.d.ts +4 -0
- package/date-fns/src/services/dateFnsDateApi.service.d.ts.map +1 -1
- package/es2015/date-fns/src/services/dateFnsDateApi.service.js +7 -1
- package/es2015/date-fns/src/services/dateFnsDateApi.service.js.map +1 -1
- package/es2015/moment/src/services/momentDateApi.service.js +6 -0
- package/es2015/moment/src/services/momentDateApi.service.js.map +1 -1
- package/es2015/src/picker/components/dayPicker/dayPicker.component.js +8 -2
- package/es2015/src/picker/components/dayPicker/dayPicker.component.js.map +1 -1
- package/es2015/src/picker/components/pickerImplBase.component.js.map +1 -1
- package/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +7 -3
- package/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
- package/es2015/src/picker/directives/loopScroll/loopScroll.directive.js +103 -90
- 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/es2015/src/selector/components/inputDateTime/inputDateTime.component.js +4 -0
- package/es2015/src/selector/components/inputDateTime/inputDateTime.component.js.map +1 -1
- package/es2015/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js +4 -0
- package/es2015/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js.map +1 -1
- package/es2015/src/services/dateApi.interface.js.map +1 -1
- package/es2020/date-fns/src/services/dateFnsDateApi.service.js +7 -1
- package/es2020/date-fns/src/services/dateFnsDateApi.service.js.map +1 -1
- package/es2020/moment/src/services/momentDateApi.service.js +6 -0
- package/es2020/moment/src/services/momentDateApi.service.js.map +1 -1
- package/es2020/src/picker/components/dayPicker/dayPicker.component.js +8 -2
- package/es2020/src/picker/components/dayPicker/dayPicker.component.js.map +1 -1
- package/es2020/src/picker/components/pickerImplBase.component.js.map +1 -1
- package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +7 -3
- package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
- package/es2020/src/picker/directives/loopScroll/loopScroll.directive.js +97 -81
- 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/es2020/src/selector/components/inputDateTime/inputDateTime.component.js +4 -0
- package/es2020/src/selector/components/inputDateTime/inputDateTime.component.js.map +1 -1
- package/es2020/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js +4 -0
- package/es2020/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js.map +1 -1
- package/es2020/src/services/dateApi.interface.js.map +1 -1
- package/moment/src/services/momentDateApi.service.d.ts +4 -0
- package/moment/src/services/momentDateApi.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/picker/components/dayPicker/dayPicker.component.d.ts +5 -0
- package/src/picker/components/dayPicker/dayPicker.component.d.ts.map +1 -1
- package/src/picker/components/dayPicker/dayPicker.component.html +1 -1
- package/src/picker/components/pickerImplBase.component.d.ts +1 -1
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.css +26 -2
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.d.ts +1 -1
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.d.ts.map +1 -1
- package/src/picker/components/rollerTimePicker/rollerTimePicker.component.html +27 -1
- package/src/picker/directives/loopScroll/loopScroll.directive.d.ts +35 -17
- 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/src/selector/components/inputDateTime/inputDateTime.component.d.ts.map +1 -1
- package/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.d.ts.map +1 -1
- package/src/services/dateApi.interface.d.ts +5 -0
- package/src/services/dateApi.interface.d.ts.map +1 -1
- package/version.bak +1 -1
|
@@ -73,7 +73,10 @@ export class DateTimeRollerTimePickerComponent extends PickerImplBaseComponent {
|
|
|
73
73
|
/**
|
|
74
74
|
* @inheritdoc
|
|
75
75
|
*/
|
|
76
|
-
setValue(
|
|
76
|
+
setValue(value) {
|
|
77
|
+
if (value) {
|
|
78
|
+
this.displayDate = this._dateApi.getValue(value.from);
|
|
79
|
+
}
|
|
77
80
|
}
|
|
78
81
|
//######################### public methods - template bindings #########################
|
|
79
82
|
/**
|
|
@@ -90,6 +93,7 @@ export class DateTimeRollerTimePickerComponent extends PickerImplBaseComponent {
|
|
|
90
93
|
event === null || event === void 0 ? void 0 : event.stopPropagation();
|
|
91
94
|
event === null || event === void 0 ? void 0 : event.preventDefault();
|
|
92
95
|
if (this.hour == value) {
|
|
96
|
+
this.hoursOpen = false;
|
|
93
97
|
return;
|
|
94
98
|
}
|
|
95
99
|
this.hour = value;
|
|
@@ -136,9 +140,9 @@ export class DateTimeRollerTimePickerComponent extends PickerImplBaseComponent {
|
|
|
136
140
|
}
|
|
137
141
|
}
|
|
138
142
|
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:
|
|
143
|
+
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: -14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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: -14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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: 64px 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 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-item\n{\n opacity: 0.6;\n transition: all 100ms;\n font-weight: 300;\n}\n\n.roller-item.selected\n{\n opacity: 1;\n font-weight: bold;\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
144
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DateTimeRollerTimePickerComponent, decorators: [{
|
|
141
145
|
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:
|
|
146
|
+
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: -14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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: -14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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: 64px 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 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-item\n{\n opacity: 0.6;\n transition: all 100ms;\n font-weight: 300;\n}\n\n.roller-item.selected\n{\n opacity: 1;\n font-weight: bold;\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
147
|
}] });
|
|
144
148
|
//# 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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","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\"\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"]}
|
|
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 if(value)\n {\n this.displayDate = this._dateApi.getValue(value.from);\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 this.hoursOpen = false;\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: -14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours\"\n [loopScrollData]=\"hour?.data\"\n class=\"roller-item\"\n (click)=\"setHour($event, hour?.data)\">{{hour?.displayText}}</div>\n\n <div *ngFor=\"let hour of hours | slice: 0: 14\"\n [loopScrollData]=\"hour?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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: -14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes\"\n [loopScrollData]=\"minute?.data\"\n class=\"roller-item\"\n (click)=\"setMinute($event, minute?.data)\">{{minute?.displayText}}</div>\n\n <div *ngFor=\"let minute of minutes | slice: 0: 14\"\n [loopScrollData]=\"minute?.data\"\n [clone]=\"true\"\n class=\"roller-item\"\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,17 @@ 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
|
+
/**
|
|
22
|
+
* Indication whether ignore scroll handle
|
|
23
|
+
*/
|
|
24
|
+
this._ignoreScrollHandle = false;
|
|
25
|
+
/**
|
|
26
|
+
* Indication whether skip value change
|
|
27
|
+
*/
|
|
28
|
+
this._skipValueChange = false;
|
|
21
29
|
/**
|
|
22
30
|
* Indication whether is currently selection scroll open
|
|
23
31
|
*/
|
|
@@ -28,6 +36,17 @@ export class LoopScrollDirective {
|
|
|
28
36
|
*/
|
|
29
37
|
this.valueChange = new EventEmitter();
|
|
30
38
|
}
|
|
39
|
+
//######################### public properties - inputs #########################
|
|
40
|
+
/**
|
|
41
|
+
* Gets or sets value that is being set in loop scroll
|
|
42
|
+
*/
|
|
43
|
+
get value() {
|
|
44
|
+
return this._value;
|
|
45
|
+
}
|
|
46
|
+
set value(value) {
|
|
47
|
+
this._skipValueChange = this._value == value;
|
|
48
|
+
this._value = value;
|
|
49
|
+
}
|
|
31
50
|
//######################### public methods - implementation of OnChanges #########################
|
|
32
51
|
/**
|
|
33
52
|
* Called when input value changes
|
|
@@ -39,59 +58,62 @@ export class LoopScrollDirective {
|
|
|
39
58
|
}
|
|
40
59
|
const itemHeight = (_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1;
|
|
41
60
|
if (nameof('open') in changes) {
|
|
42
|
-
|
|
61
|
+
if (this.open) {
|
|
62
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
43
65
|
if (nameof('value') in changes) {
|
|
44
|
-
const selectedItem = (_b = this.
|
|
66
|
+
const selectedItem = (_b = this._dataItems) === null || _b === void 0 ? void 0 : _b.find(itm => itm.data == this.value);
|
|
45
67
|
if (!selectedItem) {
|
|
46
68
|
throw new Error('No item selected in loop scroll');
|
|
47
69
|
}
|
|
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' });
|
|
70
|
+
const selectedIndex = this._dataItems.indexOf(selectedItem);
|
|
71
|
+
this._scrollElement.nativeElement.scrollTo({ top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto' });
|
|
54
72
|
}
|
|
55
73
|
else {
|
|
56
|
-
this._scrollElement.nativeElement.scrollTo({ top:
|
|
74
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto' });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (nameof('value') in changes) {
|
|
78
|
+
if (!this._skipValueChange) {
|
|
79
|
+
this._ignoreScrollHandle = true;
|
|
80
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * (this._clonedCount + this._dataItems.findIndex(itm => itm.data == this.value) + (this.open ? -2 : 0)), behavior: 'auto' });
|
|
81
|
+
this._ignoreScrollHandle = false;
|
|
57
82
|
}
|
|
58
|
-
setTimeout(() => this._opening = false, 300);
|
|
59
83
|
}
|
|
84
|
+
this._skipValueChange = false;
|
|
60
85
|
}
|
|
61
86
|
//######################### public methods - implementation of AfterContentInit #########################
|
|
62
87
|
/**
|
|
63
88
|
* Called when content was initialized
|
|
64
89
|
*/
|
|
65
90
|
ngAfterContentInit() {
|
|
66
|
-
var _a, _b, _c;
|
|
91
|
+
var _a, _b, _c, _d;
|
|
67
92
|
this._items = (_a = this.items) === null || _a === void 0 ? void 0 : _a.toArray();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
93
|
+
this._dataItems = (_b = this._items) === null || _b === void 0 ? void 0 : _b.filter(itm => !itm.clone);
|
|
94
|
+
if (!((_c = this._dataItems) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
95
|
+
(_d = this.items) === null || _d === void 0 ? void 0 : _d.changes.subscribe(() => {
|
|
96
|
+
var _a, _b;
|
|
71
97
|
this._items = (_a = this.items) === null || _a === void 0 ? void 0 : _a.toArray();
|
|
98
|
+
this._dataItems = (_b = this._items) === null || _b === void 0 ? void 0 : _b.filter(itm => !itm.clone);
|
|
72
99
|
this._initialize();
|
|
73
100
|
});
|
|
74
101
|
return;
|
|
75
102
|
}
|
|
76
103
|
this._initialize();
|
|
77
104
|
}
|
|
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
105
|
//######################### protected methods #########################
|
|
86
106
|
/**
|
|
87
107
|
* Intialize default value
|
|
88
108
|
*/
|
|
89
109
|
_initialize() {
|
|
90
|
-
var _a;
|
|
91
|
-
|
|
110
|
+
var _a, _b, _c;
|
|
111
|
+
const cloned = (_b = (_a = this._items) === null || _a === void 0 ? void 0 : _a.filter(itm => itm.clone)) !== null && _b !== void 0 ? _b : [];
|
|
112
|
+
this._clonedCount = cloned.length / 2;
|
|
113
|
+
if (!((_c = this._dataItems) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
92
114
|
return;
|
|
93
115
|
}
|
|
94
|
-
this.
|
|
116
|
+
this._dataItems.forEach(itm => {
|
|
95
117
|
if (isBlank(this._itemHeight)) {
|
|
96
118
|
this._itemHeight = itm.element.nativeElement.offsetHeight;
|
|
97
119
|
return;
|
|
@@ -100,86 +122,74 @@ export class LoopScrollDirective {
|
|
|
100
122
|
throw new Error('All items inside of loop scroll should have same height');
|
|
101
123
|
}
|
|
102
124
|
});
|
|
103
|
-
this.
|
|
104
|
-
this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);
|
|
125
|
+
this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * (this._clonedCount + this._dataItems.findIndex(itm => itm.data == this.value)), behavior: 'auto' });
|
|
105
126
|
this._initialized = true;
|
|
106
127
|
}
|
|
107
128
|
/**
|
|
108
|
-
*
|
|
129
|
+
* Handles scroll event
|
|
109
130
|
*/
|
|
110
|
-
|
|
111
|
-
|
|
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 {
|
|
131
|
+
_handleScroll() {
|
|
132
|
+
if (this._ignoreScrollHandle) {
|
|
124
133
|
return;
|
|
125
134
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
135
|
+
requestAnimationFrame(() => {
|
|
136
|
+
var _a, _b, _c, _d, _e;
|
|
137
|
+
if (!this._dataItems) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const index = this._scrollElement.nativeElement.scrollTop / ((_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1);
|
|
141
|
+
const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;
|
|
142
|
+
const dataLength = ((_b = this._itemHeight) !== null && _b !== void 0 ? _b : 1) * this._dataItems.length;
|
|
143
|
+
if (index % 1 <= .2 || index % 1 >= .8) {
|
|
144
|
+
(_d = (_c = this._scrollElement.nativeElement.querySelector('.selected')) === null || _c === void 0 ? void 0 : _c.classList) === null || _d === void 0 ? void 0 : _d.remove('selected');
|
|
145
|
+
const roundIndex = Math.round(index);
|
|
146
|
+
this._items[roundIndex + (this.open ? 2 : 0)].element.nativeElement.classList.add('selected');
|
|
147
|
+
this._emitValue(dataIndex);
|
|
148
|
+
}
|
|
149
|
+
if (dataIndex <= -1) {
|
|
150
|
+
this._updateScroll(dataLength, true, index, dataIndex);
|
|
151
|
+
}
|
|
152
|
+
else if (dataIndex >= ((_e = this._dataItems.length) !== null && _e !== void 0 ? _e : 0)) {
|
|
153
|
+
this._updateScroll(dataLength, false, index, dataIndex);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
146
156
|
}
|
|
147
157
|
/**
|
|
148
|
-
*
|
|
158
|
+
* Updates scroll to be at full value of item
|
|
159
|
+
* @param dataLength - Length of all data
|
|
160
|
+
* @param add - Indication whether add or subtract length
|
|
161
|
+
* @param index - Current index
|
|
162
|
+
* @param dataIndex - Current index of data
|
|
149
163
|
*/
|
|
150
|
-
|
|
151
|
-
var _a
|
|
152
|
-
this.
|
|
153
|
-
|
|
154
|
-
const index = Math.round(this._scrollElement.nativeElement.scrollTop / itemHeight);
|
|
155
|
-
this._scrollElement.nativeElement.scrollTo({ top: index * itemHeight, behavior: 'auto' });
|
|
156
|
-
if (!this._opening) {
|
|
157
|
-
this.valueChange.emit((_b = this._items) === null || _b === void 0 ? void 0 : _b[this.open ? (index + 2) : index].data);
|
|
158
|
-
}
|
|
164
|
+
_updateScroll(dataLength, add, index, dataIndex) {
|
|
165
|
+
var _a;
|
|
166
|
+
this._scrollElement.nativeElement.scrollTo({ top: (Math.round(index) * ((_a = this._itemHeight) !== null && _a !== void 0 ? _a : 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto' });
|
|
167
|
+
this._emitValue(dataIndex);
|
|
159
168
|
}
|
|
160
169
|
/**
|
|
161
|
-
*
|
|
170
|
+
* Emits value after scroll
|
|
171
|
+
* @param index - Index of currently selected data item
|
|
162
172
|
*/
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
_emitValue(index) {
|
|
174
|
+
index = Math.round(index) % this._dataItems.length;
|
|
175
|
+
if (index < 0) {
|
|
176
|
+
index = this._dataItems.length + index;
|
|
177
|
+
}
|
|
178
|
+
const item = this._dataItems[index];
|
|
179
|
+
if (this.value != item.data) {
|
|
180
|
+
this.value = item.data;
|
|
181
|
+
this.valueChange.next(this.value);
|
|
168
182
|
}
|
|
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' });
|
|
172
183
|
}
|
|
173
184
|
}
|
|
174
185
|
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 });
|
|
186
|
+
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
187
|
__decorate([
|
|
177
|
-
|
|
178
|
-
DebounceCall(40),
|
|
188
|
+
DebounceCall(18),
|
|
179
189
|
__metadata("design:type", Function),
|
|
180
|
-
__metadata("design:paramtypes", []),
|
|
190
|
+
__metadata("design:paramtypes", [Number, Boolean, Number, Number]),
|
|
181
191
|
__metadata("design:returntype", void 0)
|
|
182
|
-
], LoopScrollDirective.prototype, "
|
|
192
|
+
], LoopScrollDirective.prototype, "_updateScroll", null);
|
|
183
193
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, decorators: [{
|
|
184
194
|
type: Directive,
|
|
185
195
|
args: [{
|
|
@@ -196,5 +206,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
196
206
|
}], items: [{
|
|
197
207
|
type: ContentChildren,
|
|
198
208
|
args: [LoopScrollDataDirective]
|
|
199
|
-
}], _handleScroll: [
|
|
209
|
+
}], _handleScroll: [{
|
|
210
|
+
type: HostListener,
|
|
211
|
+
args: ['scroll']
|
|
212
|
+
}], _updateScroll: [] } });
|
|
200
213
|
//# 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":";AAAA,OAAO,EAAmB,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAwB,MAAM,EAAE,SAAS,EAAgB,MAAM,eAAe,CAAC;AACpK,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAC,uBAAuB,EAAC,MAAM,4CAA4C,CAAC;;AAEnF;;GAEG;AAKH,MAAM,OAAO,mBAAmB;IAsD5B,iEAAiE;IACjE,YAAsB,cAAuC;QAAvC,mBAAc,GAAd,cAAc,CAAyB;QAzC7D;;WAEG;QACO,iBAAY,GAAY,KAAK,CAAC;QAExC;;WAEG;QACO,aAAQ,GAAY,KAAK,CAAC;QAUpC;;WAEG;QAEI,SAAI,GAAY,KAAK,CAAC;QAE7B,iFAAiF;QAEjF;;WAEG;QAEI,gBAAW,GAAwB,IAAI,YAAY,EAAS,CAAC;IAapE,CAAC;IAED,kGAAkG;IAElG;;OAEG;IACI,WAAW,CAAC,OAAsB;;QAErC,IAAG,CAAC,IAAI,CAAC,YAAY,EACrB;YACI,OAAO;SACV;QAED,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,WAAW,mCAAI,CAAC,CAAC;QAEzC,IAAG,MAAM,CAAsB,MAAM,CAAC,IAAI,OAAO,EACjD;YACI,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YAElF,IAAG,MAAM,CAAsB,OAAO,CAAC,IAAI,OAAO,EAClD;gBACI,MAAM,YAAY,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEtE,IAAG,CAAC,YAAY,EAChB;oBACI,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;iBACtD;gBAED,MAAM,aAAa,GAAG,IAAI,CAAC,MAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBACzD,YAAY,GAAG,aAAa,GAAG,UAAU,CAAC;aAC7C;YAED,IAAG,IAAI,CAAC,IAAI,EACZ;gBACI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;aACvI;iBAED;gBACI,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;aACrF;YAED,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;SAChD;IACL,CAAC;IAED,yGAAyG;IAEzG;;OAEG;IACI,kBAAkB;;QAErB,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,EAAE,CAAC;QAEpC,IAAG,CAAC,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAA,EACvB;YACI,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;;gBAE/B,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,EAAE,CAAC;gBAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,OAAO;SACV;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,kGAAkG;IAElG;;OAEG;IACI,WAAW;QAEd,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACxF,CAAC;IAED,uEAAuE;IAEvE;;OAEG;IACO,WAAW;;QAEjB,IAAG,CAAC,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAA,EACvB;YACI,OAAO;SACV;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAEtB,IAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAC5B;gBACI,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;gBAE1D,OAAO;aACV;YAED,IAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAC7D;gBACI,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;aAC9E;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACO,aAAa;;QAEnB,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,YAAY,CAAC;QACpE,MAAM,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,MAAA,IAAI,CAAC,WAAW,mCAAI,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,gBAAgB,GAAG,GAAG,CAAC;QACzC,IAAI,aAAa,GAAgB,IAAI,CAAC;QAEtC,eAAe;QACf,IAAG,YAAY,IAAI,SAAS,GAAG,SAAS;YACrC,YAAY,IAAI,SAAS,GAAG,SAAS,EACxC;YACI,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;SAC5C;aAED;YACI,OAAO;SACV;QAED,yBAAyB;QACzB,IAAG,aAAa,IAAI,CAAC,EACrB;YACI,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,MAAA,IAAI,CAAC,WAAW,mCAAI,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,EAAE,aAAa,CAAC,CAAC;YAE1F,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;;gBAEhC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACrE,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;SACN;QACD,yBAAyB;aAEzB;YACI,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAA,IAAI,CAAC,WAAW,mCAAI,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAEzD,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAC,GAAG,CAAC,EAAE;;gBAEtB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACpE,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAED;;OAEG;IAGO,aAAa;;QAEnB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,WAAW,mCAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;QAEnF,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAC,GAAG,EAAE,KAAK,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;QAExF,IAAG,CAAC,IAAI,CAAC,QAAQ,EACjB;YACI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAA,IAAI,CAAC,MAAM,0CAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAC9E;IACL,CAAC;IAED;;OAEG;IACO,kBAAkB;;QAExB,MAAM,YAAY,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtE,IAAG,CAAC,YAAY,EAChB;YACI,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACtD;QAED,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,CAAC,CAAC;IAC1E,CAAC;;gHA/PQ,mBAAmB;oGAAnB,mBAAmB,kLAmDX,uBAAuB;AA8KxC;IAFC,QAAQ;IACR,YAAY,CAAC,EAAE,CAAC;;;;wDAchB;2FA9OQ,mBAAmB;kBAJ/B,SAAS;mBACV;oBACI,QAAQ,EAAE,cAAc;iBAC3B;iGA+BU,KAAK;sBADX,KAAK;uBAAC,YAAY;gBAOZ,IAAI;sBADV,KAAK;gBASC,WAAW;sBADjB,MAAM;uBAAC,kBAAkB;gBASnB,KAAK;sBADX,eAAe;uBAAC,uBAAuB;gBA8K9B,aAAa","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 /**\n * Indication whether ignore scroll handle\n */\n protected _ignoreScrollHandle: boolean = false;\n\n /**\n * Indication whether skip value change\n */\n protected _skipValueChange: boolean = false;\n\n /**\n * Value that is being set in loop scroll\n */\n protected _value?: TData;\n\n //######################### public properties - inputs #########################\n\n /**\n * Gets or sets value that is being set in loop scroll\n */\n @Input('loopScroll')\n public get value(): TData\n {\n return this._value;\n }\n public set value(value: TData)\n {\n this._skipValueChange = this._value == value;\n this._value = value;\n }\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 else if(nameof<LoopScrollDirective>('value') in changes)\n {\n if(!this._skipValueChange)\n {\n this._ignoreScrollHandle = true;\n this._scrollElement.nativeElement.scrollTo({top: this._itemHeight! * (this._clonedCount + this._dataItems!.findIndex(itm => itm.data == this.value) + (this.open ? -2 : 0)), behavior: 'auto'});\n this._ignoreScrollHandle = false;\n }\n }\n\n this._skipValueChange = false;\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 + this._dataItems!.findIndex(itm => itm.data == this.value)), behavior: 'auto'});\n this._initialized = true;\n }\n\n /**\n * Handles scroll event\n */\n @HostListener('scroll')\n protected _handleScroll(): void\n {\n if(this._ignoreScrollHandle)\n {\n return;\n }\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(index % 1 <= .2 || index % 1 >= .8)\n {\n this._scrollElement.nativeElement.querySelector('.selected')?.classList?.remove('selected');\n\n const roundIndex = Math.round(index);\n this._items![roundIndex + (this.open ? 2 : 0)].element.nativeElement.classList.add('selected');\n this._emitValue(dataIndex);\n }\n\n if(dataIndex <= -1)\n {\n this._updateScroll(dataLength, true, index, dataIndex);\n }\n else if(dataIndex >= (this._dataItems.length ?? 0))\n {\n this._updateScroll(dataLength, false, index, dataIndex);\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 * @param dataIndex - Current index of data \n */\n @DebounceCall(18)\n protected _updateScroll(dataLength: number, add: boolean, index: number, dataIndex: number): void\n {\n this._scrollElement.nativeElement.scrollTo({top: (Math.round(index) * (this._itemHeight ?? 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto'});\n\n this._emitValue(dataIndex);\n }\n\n /**\n * Emits value after scroll\n * @param index - Index of currently selected data item\n */\n protected _emitValue(index: number): void\n {\n index = Math.round(index) % this._dataItems!.length;\n \n if(index < 0)\n {\n index = this._dataItems!.length + index;\n }\n\n const item = this._dataItems![index];\n\n if(this.value != item.data)\n {\n this.value = item.data;\n this.valueChange.next(this.value);\n }\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}"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, ChangeDetectionStrategy, Inject, ChangeDetectorRef, ElementRef, ViewChild } from '@angular/core';
|
|
2
|
+
import { isPresent } from '@jscrpt/common';
|
|
2
3
|
import { Subject } from 'rxjs';
|
|
3
4
|
import { DATE_API } from '../../../misc/tokens';
|
|
4
5
|
import { DatePositionParserService } from '../../../services/datePositionParser.service';
|
|
@@ -72,6 +73,9 @@ export class InputDateTimeSelectorComponent {
|
|
|
72
73
|
return this._format;
|
|
73
74
|
}
|
|
74
75
|
set format(value) {
|
|
76
|
+
if (isPresent(value)) {
|
|
77
|
+
value = this._dateApi.getFormat(value);
|
|
78
|
+
}
|
|
75
79
|
//only if format changes
|
|
76
80
|
if (this._format != value) {
|
|
77
81
|
this._parser = this._parserSvc.createParser(this._dateApi.getFormat(value));
|