@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.
Files changed (59) hide show
  1. package/changelog.md +7 -2
  2. package/date-fns/src/services/dateFnsDateApi.service.d.ts +4 -0
  3. package/date-fns/src/services/dateFnsDateApi.service.d.ts.map +1 -1
  4. package/es2015/date-fns/src/services/dateFnsDateApi.service.js +7 -1
  5. package/es2015/date-fns/src/services/dateFnsDateApi.service.js.map +1 -1
  6. package/es2015/moment/src/services/momentDateApi.service.js +6 -0
  7. package/es2015/moment/src/services/momentDateApi.service.js.map +1 -1
  8. package/es2015/src/picker/components/dayPicker/dayPicker.component.js +8 -2
  9. package/es2015/src/picker/components/dayPicker/dayPicker.component.js.map +1 -1
  10. package/es2015/src/picker/components/pickerImplBase.component.js.map +1 -1
  11. package/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +7 -3
  12. package/es2015/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
  13. package/es2015/src/picker/directives/loopScroll/loopScroll.directive.js +103 -90
  14. package/es2015/src/picker/directives/loopScroll/loopScroll.directive.js.map +1 -1
  15. package/es2015/src/picker/directives/loopScrollData/loopScrollData.directive.js +7 -1
  16. package/es2015/src/picker/directives/loopScrollData/loopScrollData.directive.js.map +1 -1
  17. package/es2015/src/selector/components/inputDateTime/inputDateTime.component.js +4 -0
  18. package/es2015/src/selector/components/inputDateTime/inputDateTime.component.js.map +1 -1
  19. package/es2015/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js +4 -0
  20. package/es2015/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js.map +1 -1
  21. package/es2015/src/services/dateApi.interface.js.map +1 -1
  22. package/es2020/date-fns/src/services/dateFnsDateApi.service.js +7 -1
  23. package/es2020/date-fns/src/services/dateFnsDateApi.service.js.map +1 -1
  24. package/es2020/moment/src/services/momentDateApi.service.js +6 -0
  25. package/es2020/moment/src/services/momentDateApi.service.js.map +1 -1
  26. package/es2020/src/picker/components/dayPicker/dayPicker.component.js +8 -2
  27. package/es2020/src/picker/components/dayPicker/dayPicker.component.js.map +1 -1
  28. package/es2020/src/picker/components/pickerImplBase.component.js.map +1 -1
  29. package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js +7 -3
  30. package/es2020/src/picker/components/rollerTimePicker/rollerTimePicker.component.js.map +1 -1
  31. package/es2020/src/picker/directives/loopScroll/loopScroll.directive.js +97 -81
  32. package/es2020/src/picker/directives/loopScroll/loopScroll.directive.js.map +1 -1
  33. package/es2020/src/picker/directives/loopScrollData/loopScrollData.directive.js +7 -1
  34. package/es2020/src/picker/directives/loopScrollData/loopScrollData.directive.js.map +1 -1
  35. package/es2020/src/selector/components/inputDateTime/inputDateTime.component.js +4 -0
  36. package/es2020/src/selector/components/inputDateTime/inputDateTime.component.js.map +1 -1
  37. package/es2020/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js +4 -0
  38. package/es2020/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.js.map +1 -1
  39. package/es2020/src/services/dateApi.interface.js.map +1 -1
  40. package/moment/src/services/momentDateApi.service.d.ts +4 -0
  41. package/moment/src/services/momentDateApi.service.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/picker/components/dayPicker/dayPicker.component.d.ts +5 -0
  44. package/src/picker/components/dayPicker/dayPicker.component.d.ts.map +1 -1
  45. package/src/picker/components/dayPicker/dayPicker.component.html +1 -1
  46. package/src/picker/components/pickerImplBase.component.d.ts +1 -1
  47. package/src/picker/components/rollerTimePicker/rollerTimePicker.component.css +26 -2
  48. package/src/picker/components/rollerTimePicker/rollerTimePicker.component.d.ts +1 -1
  49. package/src/picker/components/rollerTimePicker/rollerTimePicker.component.d.ts.map +1 -1
  50. package/src/picker/components/rollerTimePicker/rollerTimePicker.component.html +27 -1
  51. package/src/picker/directives/loopScroll/loopScroll.directive.d.ts +35 -17
  52. package/src/picker/directives/loopScroll/loopScroll.directive.d.ts.map +1 -1
  53. package/src/picker/directives/loopScrollData/loopScrollData.directive.d.ts +5 -1
  54. package/src/picker/directives/loopScrollData/loopScrollData.directive.d.ts.map +1 -1
  55. package/src/selector/components/inputDateTime/inputDateTime.component.d.ts.map +1 -1
  56. package/src/selector/components/simpleInputDateTime/simpleInputDateTime.component.d.ts.map +1 -1
  57. package/src/services/dateApi.interface.d.ts +5 -0
  58. package/src/services/dateApi.interface.d.ts.map +1 -1
  59. package/version.bak +1 -1
@@ -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 { BindThis, isBlank, DebounceCall, nameof } from '@jscrpt/common';
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
- * Indication whether is opening active
18
+ * Count of cloned elements before or after
19
19
  */
20
- this._opening = false;
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
@@ -38,24 +57,30 @@ export class LoopScrollDirective {
38
57
  }
39
58
  const itemHeight = this._itemHeight ?? 1;
40
59
  if (nameof('open') in changes) {
41
- let scrollOffset = this._scrollElement.nativeElement.scrollTop + (2 * itemHeight);
60
+ if (this.open) {
61
+ this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
62
+ return;
63
+ }
42
64
  if (nameof('value') in changes) {
43
- const selectedItem = this._items?.find(itm => itm.data == this.value);
65
+ const selectedItem = this._dataItems?.find(itm => itm.data == this.value);
44
66
  if (!selectedItem) {
45
67
  throw new Error('No item selected in loop scroll');
46
68
  }
47
- const selectedIndex = this._items.indexOf(selectedItem);
48
- scrollOffset = selectedIndex * itemHeight;
49
- }
50
- if (this.open) {
51
- this._opening = true;
52
- this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop - (2 * itemHeight), behavior: 'auto' });
69
+ const selectedIndex = this._dataItems.indexOf(selectedItem);
70
+ this._scrollElement.nativeElement.scrollTo({ top: (selectedIndex + this._clonedCount) * itemHeight, behavior: 'auto' });
53
71
  }
54
72
  else {
55
- this._scrollElement.nativeElement.scrollTo({ top: scrollOffset, behavior: 'auto' });
73
+ this._scrollElement.nativeElement.scrollTo({ top: this._scrollElement.nativeElement.scrollTop + (2 * itemHeight), behavior: 'auto' });
56
74
  }
57
- setTimeout(() => this._opening = false, 300);
58
75
  }
76
+ else if (nameof('value') in changes) {
77
+ if (!this._skipValueChange) {
78
+ this._ignoreScrollHandle = true;
79
+ this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * (this._clonedCount + this._dataItems.findIndex(itm => itm.data == this.value) + (this.open ? -2 : 0)), behavior: 'auto' });
80
+ this._ignoreScrollHandle = false;
81
+ }
82
+ }
83
+ this._skipValueChange = false;
59
84
  }
60
85
  //######################### public methods - implementation of AfterContentInit #########################
61
86
  /**
@@ -63,31 +88,28 @@ export class LoopScrollDirective {
63
88
  */
64
89
  ngAfterContentInit() {
65
90
  this._items = this.items?.toArray();
66
- if (!this._items?.length) {
91
+ this._dataItems = this._items?.filter(itm => !itm.clone);
92
+ if (!this._dataItems?.length) {
67
93
  this.items?.changes.subscribe(() => {
68
94
  this._items = this.items?.toArray();
95
+ this._dataItems = this._items?.filter(itm => !itm.clone);
69
96
  this._initialize();
70
97
  });
71
98
  return;
72
99
  }
73
100
  this._initialize();
74
101
  }
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
102
  //######################### protected methods #########################
83
103
  /**
84
104
  * Intialize default value
85
105
  */
86
106
  _initialize() {
87
- if (!this._items?.length) {
107
+ const cloned = this._items?.filter(itm => itm.clone) ?? [];
108
+ this._clonedCount = cloned.length / 2;
109
+ if (!this._dataItems?.length) {
88
110
  return;
89
111
  }
90
- this._items.forEach(itm => {
112
+ this._dataItems.forEach(itm => {
91
113
  if (isBlank(this._itemHeight)) {
92
114
  this._itemHeight = itm.element.nativeElement.offsetHeight;
93
115
  return;
@@ -96,81 +118,72 @@ export class LoopScrollDirective {
96
118
  throw new Error('All items inside of loop scroll should have same height');
97
119
  }
98
120
  });
99
- this._centerActiveValue();
100
- this._scrollElement.nativeElement.addEventListener('scroll', this._handleScroll);
121
+ this._scrollElement.nativeElement.scrollTo({ top: this._itemHeight * (this._clonedCount + this._dataItems.findIndex(itm => itm.data == this.value)), behavior: 'auto' });
101
122
  this._initialized = true;
102
123
  }
103
124
  /**
104
- * Reorders items to make number of items around scroll view equally sized
125
+ * Handles scroll event
105
126
  */
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 {
127
+ _handleScroll() {
128
+ if (this._ignoreScrollHandle) {
119
129
  return;
120
130
  }
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
- }
131
+ requestAnimationFrame(() => {
132
+ if (!this._dataItems) {
133
+ return;
134
+ }
135
+ const index = this._scrollElement.nativeElement.scrollTop / (this._itemHeight ?? 1);
136
+ const dataIndex = index + (this.open ? 2 : 0) - this._clonedCount;
137
+ const dataLength = (this._itemHeight ?? 1) * this._dataItems.length;
138
+ if (index % 1 <= .2 || index % 1 >= .8) {
139
+ this._scrollElement.nativeElement.querySelector('.selected')?.classList?.remove('selected');
140
+ const roundIndex = Math.round(index);
141
+ this._items[roundIndex + (this.open ? 2 : 0)].element.nativeElement.classList.add('selected');
142
+ this._emitValue(dataIndex);
143
+ }
144
+ if (dataIndex <= -1) {
145
+ this._updateScroll(dataLength, true, index, dataIndex);
146
+ }
147
+ else if (dataIndex >= (this._dataItems.length ?? 0)) {
148
+ this._updateScroll(dataLength, false, index, dataIndex);
149
+ }
150
+ });
139
151
  }
140
152
  /**
141
- * Handles scroll event
153
+ * Updates scroll to be at full value of item
154
+ * @param dataLength - Length of all data
155
+ * @param add - Indication whether add or subtract length
156
+ * @param index - Current index
157
+ * @param dataIndex - Current index of data
142
158
  */
143
- _handleScroll() {
144
- this._reorderItems();
145
- const itemHeight = this._itemHeight ?? 1;
146
- const index = Math.round(this._scrollElement.nativeElement.scrollTop / itemHeight);
147
- this._scrollElement.nativeElement.scrollTo({ top: index * itemHeight, behavior: 'auto' });
148
- if (!this._opening) {
149
- this.valueChange.emit(this._items?.[this.open ? (index + 2) : index].data);
150
- }
159
+ _updateScroll(dataLength, add, index, dataIndex) {
160
+ this._scrollElement.nativeElement.scrollTo({ top: (Math.round(index) * (this._itemHeight ?? 1)) + (add ? dataLength : (dataLength * -1)), behavior: 'auto' });
161
+ this._emitValue(dataIndex);
151
162
  }
152
163
  /**
153
- * Centers active value
164
+ * Emits value after scroll
165
+ * @param index - Index of currently selected data item
154
166
  */
155
- _centerActiveValue() {
156
- const selectedItem = this._items?.find(itm => itm.data == this.value);
157
- if (!selectedItem) {
158
- throw new Error('No item selected in loop scroll');
167
+ _emitValue(index) {
168
+ index = Math.round(index) % this._dataItems.length;
169
+ if (index < 0) {
170
+ index = this._dataItems.length + index;
171
+ }
172
+ const item = this._dataItems[index];
173
+ if (this.value != item.data) {
174
+ this.value = item.data;
175
+ this.valueChange.next(this.value);
159
176
  }
160
- selectedItem?.element.nativeElement.scrollIntoView({ block: 'center' });
161
- this._reorderItems();
162
- selectedItem?.element.nativeElement.scrollIntoView({ block: 'center' });
163
177
  }
164
178
  }
165
179
  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 });
180
+ 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
181
  __decorate([
168
- BindThis,
169
- DebounceCall(40),
182
+ DebounceCall(18),
170
183
  __metadata("design:type", Function),
171
- __metadata("design:paramtypes", []),
184
+ __metadata("design:paramtypes", [Number, Boolean, Number, Number]),
172
185
  __metadata("design:returntype", void 0)
173
- ], LoopScrollDirective.prototype, "_handleScroll", null);
186
+ ], LoopScrollDirective.prototype, "_updateScroll", null);
174
187
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: LoopScrollDirective, decorators: [{
175
188
  type: Directive,
176
189
  args: [{
@@ -187,5 +200,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
187
200
  }], items: [{
188
201
  type: ContentChildren,
189
202
  args: [LoopScrollDataDirective]
190
- }], _handleScroll: [] } });
203
+ }], _handleScroll: [{
204
+ type: HostListener,
205
+ args: ['scroll']
206
+ }], _updateScroll: [] } });
191
207
  //# 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 /**\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;IAUhC,iEAAiE;IACjE,YAAmB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAEnD,CAAC;;oHAbQ,uBAAuB;wGAAvB,uBAAuB;2FAAvB,uBAAuB;kBAJnC,SAAS;mBACV;oBACI,QAAQ,EAAE,kBAAkB;iBAC/B;iGASU,IAAI;sBADV,KAAK;uBAAC,gBAAgB","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 //######################### constructor #########################\n constructor(public element: ElementRef<HTMLElement>)\n {\n }\n}"]}
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));
@@ -1 +1 @@
1
- {"version":3,"file":"inputDateTime.component.js","sourceRoot":"","sources":["../../../../../src/selector/components/inputDateTime/inputDateTime.component.ts","../../../../../src/selector/components/inputDateTime/inputDateTime.component.html"],"names":[],"mappings":"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","sourcesContent":["import {Component, ChangeDetectionStrategy, Inject, ChangeDetectorRef, ElementRef, ViewChild} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\n\nimport {DateTimeValue} from '../../../misc/datetime.interface';\nimport {DATE_API} from '../../../misc/tokens';\nimport {DateApi, DateApiObject, DatePositionParser} from '../../../services';\nimport {DatePositionParserService} from '../../../services/datePositionParser.service';\nimport {DateValueProvider} from '../../../services/dateValueProvider.service';\nimport {DateTimeSelector} from '../../misc/datetimeSelector.interface';\n\n/**\n * Component used as datetime selector with input\n */\n@Component(\n{\n selector: 'input-date-time-selector',\n templateUrl: 'inputDateTime.component.html',\n styleUrls: ['inputDateTime.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class InputDateTimeSelectorComponent<TDate = any> implements DateTimeSelector<TDate>\n{\n //######################### protected fields #########################\n\n /**\n * Occurs when value changes\n */\n protected _valueChange: Subject<void> = new Subject<void>();\n\n /**\n * Occurs when selector is touched by user\n */\n protected _touched: Subject<void> = new Subject<void>();\n\n /**\n * Occurs when selector requires picker to be displayed or hidden\n */\n protected _pickerRequest: Subject<boolean> = new Subject<boolean>();\n\n /**\n * Instance of parser created for specific format\n */\n protected _parser: DatePositionParser|null = null;\n\n /**\n * Currently used format for displaying data\n */\n protected _format: string = '';\n\n /**\n * Current value representation as date api wrapper\n */\n protected _dateApiValue: null|DateApiObject<TDate> = null;\n\n /**\n * Indication whether is current value valid value\n */\n protected _isValid: boolean = true;\n\n /**\n * Minimal possible value that can be picked\n */\n protected _minValue: TDate|null = null;\n\n /**\n * Maximal possible value that can be picked\n */\n protected _maxValue: TDate|null = null;\n\n //######################### public properties - implementation of DateTimeSelector #########################\n\n /**\n * Gets or sets currently used format for displaying data\n */\n public get format(): string\n {\n return this._format;\n }\n public set format(value: string)\n {\n //only if format changes\n if(this._format != value)\n {\n this._parser = this._parserSvc.createParser(this._dateApi.getFormat(value));\n }\n\n this._format = value;\n }\n\n /**\n * Gets or sets placeholder that is displayed when there is no value selected\n */\n public placeholder: string|null = null;\n\n /**\n * Gets current value of datetime\n */\n public get value(): DateTimeValue<TDate>|null\n {\n if(!this._dateApiValue || !this._isValid)\n {\n return null;\n }\n\n return this._valueProvider.getValue(this._dateApiValue.value, this._format);\n }\n\n /**\n * Gets formatted value\n */\n public get formattedValue(): string|null\n {\n if(!this._isValid)\n {\n return null;\n }\n\n return this.currentValue;\n }\n\n /**\n * Gets indication whether is current value valid\n */\n public get valid(): boolean\n {\n return this._isValid;\n }\n\n /**\n * Occurs when value changes\n */\n public get valueChange(): Observable<void>\n {\n return this._valueChange.asObservable();\n }\n\n /**\n * Occurs when selector is touched by user\n */\n public get touched(): Observable<void>\n {\n return this._touched.asObservable();\n }\n\n /**\n * Occurs when selector requires picker to be displayed\n */\n public get pickerRequest(): Observable<boolean>\n {\n return this._pickerRequest.asObservable();\n }\n\n //######################### public properties - template bindings #########################\n\n /**\n * Indication whether is input disabled\n * @internal\n */\n public disabled: boolean = false;\n\n //######################### public properties - children #########################\n\n /**\n * Instance of html input element\n * @internal\n */\n @ViewChild('input', {static: true})\n public inputElement!: ElementRef<HTMLInputElement>;\n\n //######################### protected properties #########################\n\n /**\n * Gets or sets string representation current of value\n */\n protected get currentValue(): string|null\n {\n return this.input.value || null;\n }\n protected set currentValue(value: string|null)\n {\n if(this.input)\n {\n this.input.value = value ?? '';\n }\n }\n\n /**\n * Gets input element used for handling date time value\n */\n protected get input(): HTMLInputElement\n {\n return this.inputElement.nativeElement;\n }\n\n //######################### constructor #########################\n constructor(@Inject(DATE_API) protected _dateApi: DateApi<TDate>,\n protected _parserSvc: DatePositionParserService,\n protected _valueProvider: DateValueProvider<TDate>,\n protected _changeDetector: ChangeDetectorRef)\n {\n }\n\n //######################### public methods - implementation of DateTimeSelector #########################\n\n /**\n * Sets minimal possible value for picker, that can be picked\n * @param value - Minimal possible value that can be picked\n */\n public setMinValue(value: TDate|null): void\n {\n this._minValue = value;\n }\n\n /**\n * Sets maximal possible value for picker, that can be picked\n * @param value - Maximal possible value that can be picked\n */\n public setMaxValue(value: TDate|null): void\n {\n this._maxValue = value;\n }\n\n /**\n * Sets value of datetime selector\n * @param value - Value to be set to this selector\n */\n public setValue(value: DateTimeValue<TDate>|null): void\n {\n if(value?.from)\n {\n this._dateApiValue = this._dateApi.getValue(value?.from, this._format);\n this._isValid = this._dateApiValue.isValid();\n \n this._show();\n }\n else\n {\n this._clearValue();\n }\n }\n\n /**\n * Sets as 'control' disabled\n * @param disabled - Indication whether sets value as disabled, if omitted it is same as disabled set to true\n */\n public setDisabled(disabled: boolean = true): void\n {\n this.disabled = disabled;\n }\n\n /**\n * Explicitly runs invalidation of content (change detection)\n */\n public invalidateVisuals(): void\n {\n this._changeDetector.detectChanges();\n }\n\n //######################### public methods - template bindings #########################\n\n /**\n * Handles gaining of focus\n * @internal\n */\n public handleFocus(): void\n {\n this._pickerRequest.next(true);\n\n //no value\n if(!this._dateApiValue)\n {\n this._dateApiValue = this._dateApi.now();\n this._isValid = this._dateApiValue.isValid();\n\n if(this._minMaxConstraintTest())\n {\n this._clearValue();\n }\n else\n {\n this._valueChange.next();\n }\n }\n\n if(!this._isValid)\n {\n return;\n }\n\n this._show();\n\n const result = this._parser!.parse(this.currentValue!, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n /**\n * Handles blur on input\n * @internal\n */\n public handleBlur(): void\n {\n this._pickerRequest.next(false);\n }\n\n /**\n * Handles user input\n * @internal\n */\n public handleInput(): void\n {\n //empty value\n if(!this.currentValue)\n {\n this._clearValue();\n this._valueChange.next();\n\n return;\n }\n\n this._dateApiValue = this._dateApi.getValue(this.currentValue, this._format);\n this._isValid = this._dateApiValue.isValid();\n this._valueChange.next();\n }\n\n /**\n * Handles selection of text inside of input\n * @internal\n */\n public handleSelect(): void\n {\n //handles when all text is selected\n if(this.currentValue && this.input.selectionStart == 0 && this.input.selectionEnd == this.input.value.length)\n {\n const result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n }\n\n /**\n * Handles click event inside of input\n * @internal\n */\n public handleClick(): void\n {\n this._pickerRequest.next(true);\n\n if(!this._dateApiValue)\n {\n return;\n }\n\n const result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n /**\n * Handles keyboard events\n * @param event - Keyboard event that occured\n * @param input - Html input element that holds current value and selection\n * @internal\n */\n public handleKeyboard(event: KeyboardEvent): void\n {\n if(!this._dateApiValue?.isValid())\n {\n return;\n }\n\n switch(event.key)\n {\n case 'ArrowRight':\n case 'ArrowLeft':\n {\n event.preventDefault();\n event.stopPropagation();\n\n const result = event.key == 'ArrowLeft' ? this._parser!.previous(this.input.value, this.input.selectionStart!) : this._parser!.next(this.input.value, this.input.selectionStart!);\n\n if(result)\n {\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n break;\n }\n case 'ArrowUp':\n case 'ArrowDown':\n {\n event.preventDefault();\n event.stopPropagation();\n\n let result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n const selectionStart = result.positionFrom;\n\n this._stepChangeValue(result.part, event.key == 'ArrowUp');\n this._show();\n\n result = this._parser!.parse(this.input.value, selectionStart);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n\n break;\n }\n case 'Tab':\n {\n const result = event.shiftKey ? this._parser!.previous(this.input.value, this.input.selectionStart!) : this._parser!.next(this.input.value, this.input.selectionStart!);\n\n if(result)\n {\n event.preventDefault();\n event.stopPropagation();\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n break;\n }\n case 'a':\n {\n if(event.ctrlKey)\n {\n event.preventDefault();\n event.stopPropagation();\n }\n\n break;\n }\n case 'Backspace':\n {\n this._clearValue();\n this._valueChange.next();\n\n break;\n }\n case 'Escape':\n {\n this._pickerRequest.next(false);\n\n break;\n }\n case ' ':\n {\n if(event.ctrlKey)\n {\n this._pickerRequest.next(true);\n }\n\n break;\n }\n }\n }\n\n //######################### protected methods #########################\n\n /**\n * Shows current value in input\n */\n protected _show(): void\n {\n if(this._isValid)\n {\n this.currentValue = this._dateApiValue?.format(this._format) ?? null;\n }\n }\n\n /**\n * Tests whether are min or max constraint broken, returns true if constraint is broken\n */\n protected _minMaxConstraintTest(): boolean\n {\n return (!!this._minValue && this._dateApiValue!.isBefore(this._minValue)) ||\n (!!this._maxValue && this._dateApiValue!.isAfter(this._maxValue));\n }\n\n /**\n * Runs code with check whether min max constrains was broken\n * @param code - Code that should be executed which can change current value\n */\n protected _withMinMaxConstraint(code: () => void): void\n {\n this._dateApiValue!.updateOriginal();\n\n code();\n\n //min value constraint failure\n if(this._minMaxConstraintTest())\n {\n this._dateApiValue?.resetOriginal();\n\n return;\n }\n\n this._valueChange.next();\n }\n\n /**\n * Clears current value\n */\n protected _clearValue(): void\n {\n this._dateApiValue = null;\n this._isValid = true;\n this.currentValue = null;\n }\n\n /**\n * Changes current value of date for for specified part by single step\n * @param part - Part of date that should be changed\n * @param increment - Indication whether value should be incremented or decremented\n */\n protected _stepChangeValue(part: string, increment: boolean): void\n {\n if(!this._dateApiValue?.isValid())\n {\n return;\n }\n\n switch(part)\n {\n case 'y':\n case 'Y':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addYears(1) : this._dateApiValue!.subtractYears(1));\n\n break;\n }\n case 'Q':\n {\n break;\n }\n case 'M':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addMonths(1) : this._dateApiValue!.subtractMonths(1));\n\n break;\n }\n case 'w':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addWeeks(1) : this._dateApiValue!.subtractWeeks(1));\n\n break;\n }\n case 'd':\n case 'D':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addDays(1) : this._dateApiValue!.subtractDays(1));\n\n break;\n }\n case 'H':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addHours(1) : this._dateApiValue!.subtractHours(1));\n\n break;\n }\n case 'm':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addMinutes(1) : this._dateApiValue!.subtractMinutes(1));\n\n break;\n }\n }\n }\n}","<input type=\"text\"\r\n #input\r\n (focus)=\"handleFocus()\"\r\n (blur)=\"handleBlur()\"\r\n (input)=\"handleInput()\"\r\n (click)=\"handleClick()\"\r\n (select)=\"handleSelect()\"\r\n (keydown)=\"handleKeyboard($any($event))\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder ?? ''\">"]}
1
+ {"version":3,"file":"inputDateTime.component.js","sourceRoot":"","sources":["../../../../../src/selector/components/inputDateTime/inputDateTime.component.ts","../../../../../src/selector/components/inputDateTime/inputDateTime.component.html"],"names":[],"mappings":"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","sourcesContent":["import {Component, ChangeDetectionStrategy, Inject, ChangeDetectorRef, ElementRef, ViewChild} from '@angular/core';\nimport {isPresent} from '@jscrpt/common';\nimport {Observable, Subject} from 'rxjs';\n\nimport {DateTimeValue} from '../../../misc/datetime.interface';\nimport {DATE_API} from '../../../misc/tokens';\nimport {DateApi, DateApiObject, DatePositionParser} from '../../../services';\nimport {DatePositionParserService} from '../../../services/datePositionParser.service';\nimport {DateValueProvider} from '../../../services/dateValueProvider.service';\nimport {DateTimeSelector} from '../../misc/datetimeSelector.interface';\n\n/**\n * Component used as datetime selector with input\n */\n@Component(\n{\n selector: 'input-date-time-selector',\n templateUrl: 'inputDateTime.component.html',\n styleUrls: ['inputDateTime.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class InputDateTimeSelectorComponent<TDate = any> implements DateTimeSelector<TDate>\n{\n //######################### protected fields #########################\n\n /**\n * Occurs when value changes\n */\n protected _valueChange: Subject<void> = new Subject<void>();\n\n /**\n * Occurs when selector is touched by user\n */\n protected _touched: Subject<void> = new Subject<void>();\n\n /**\n * Occurs when selector requires picker to be displayed or hidden\n */\n protected _pickerRequest: Subject<boolean> = new Subject<boolean>();\n\n /**\n * Instance of parser created for specific format\n */\n protected _parser: DatePositionParser|null = null;\n\n /**\n * Currently used format for displaying data\n */\n protected _format: string = '';\n\n /**\n * Current value representation as date api wrapper\n */\n protected _dateApiValue: null|DateApiObject<TDate> = null;\n\n /**\n * Indication whether is current value valid value\n */\n protected _isValid: boolean = true;\n\n /**\n * Minimal possible value that can be picked\n */\n protected _minValue: TDate|null = null;\n\n /**\n * Maximal possible value that can be picked\n */\n protected _maxValue: TDate|null = null;\n\n //######################### public properties - implementation of DateTimeSelector #########################\n\n /**\n * Gets or sets currently used format for displaying data\n */\n public get format(): string\n {\n return this._format;\n }\n public set format(value: string)\n {\n if(isPresent(value))\n {\n value = this._dateApi.getFormat(value);\n }\n\n //only if format changes\n if(this._format != value)\n {\n this._parser = this._parserSvc.createParser(this._dateApi.getFormat(value));\n }\n\n this._format = value;\n }\n\n /**\n * Gets or sets placeholder that is displayed when there is no value selected\n */\n public placeholder: string|null = null;\n\n /**\n * Gets current value of datetime\n */\n public get value(): DateTimeValue<TDate>|null\n {\n if(!this._dateApiValue || !this._isValid)\n {\n return null;\n }\n\n return this._valueProvider.getValue(this._dateApiValue.value, this._format);\n }\n\n /**\n * Gets formatted value\n */\n public get formattedValue(): string|null\n {\n if(!this._isValid)\n {\n return null;\n }\n\n return this.currentValue;\n }\n\n /**\n * Gets indication whether is current value valid\n */\n public get valid(): boolean\n {\n return this._isValid;\n }\n\n /**\n * Occurs when value changes\n */\n public get valueChange(): Observable<void>\n {\n return this._valueChange.asObservable();\n }\n\n /**\n * Occurs when selector is touched by user\n */\n public get touched(): Observable<void>\n {\n return this._touched.asObservable();\n }\n\n /**\n * Occurs when selector requires picker to be displayed\n */\n public get pickerRequest(): Observable<boolean>\n {\n return this._pickerRequest.asObservable();\n }\n\n //######################### public properties - template bindings #########################\n\n /**\n * Indication whether is input disabled\n * @internal\n */\n public disabled: boolean = false;\n\n //######################### public properties - children #########################\n\n /**\n * Instance of html input element\n * @internal\n */\n @ViewChild('input', {static: true})\n public inputElement!: ElementRef<HTMLInputElement>;\n\n //######################### protected properties #########################\n\n /**\n * Gets or sets string representation current of value\n */\n protected get currentValue(): string|null\n {\n return this.input.value || null;\n }\n protected set currentValue(value: string|null)\n {\n if(this.input)\n {\n this.input.value = value ?? '';\n }\n }\n\n /**\n * Gets input element used for handling date time value\n */\n protected get input(): HTMLInputElement\n {\n return this.inputElement.nativeElement;\n }\n\n //######################### constructor #########################\n constructor(@Inject(DATE_API) protected _dateApi: DateApi<TDate>,\n protected _parserSvc: DatePositionParserService,\n protected _valueProvider: DateValueProvider<TDate>,\n protected _changeDetector: ChangeDetectorRef)\n {\n }\n\n //######################### public methods - implementation of DateTimeSelector #########################\n\n /**\n * Sets minimal possible value for picker, that can be picked\n * @param value - Minimal possible value that can be picked\n */\n public setMinValue(value: TDate|null): void\n {\n this._minValue = value;\n }\n\n /**\n * Sets maximal possible value for picker, that can be picked\n * @param value - Maximal possible value that can be picked\n */\n public setMaxValue(value: TDate|null): void\n {\n this._maxValue = value;\n }\n\n /**\n * Sets value of datetime selector\n * @param value - Value to be set to this selector\n */\n public setValue(value: DateTimeValue<TDate>|null): void\n {\n if(value?.from)\n {\n this._dateApiValue = this._dateApi.getValue(value?.from, this._format);\n this._isValid = this._dateApiValue.isValid();\n \n this._show();\n }\n else\n {\n this._clearValue();\n }\n }\n\n /**\n * Sets as 'control' disabled\n * @param disabled - Indication whether sets value as disabled, if omitted it is same as disabled set to true\n */\n public setDisabled(disabled: boolean = true): void\n {\n this.disabled = disabled;\n }\n\n /**\n * Explicitly runs invalidation of content (change detection)\n */\n public invalidateVisuals(): void\n {\n this._changeDetector.detectChanges();\n }\n\n //######################### public methods - template bindings #########################\n\n /**\n * Handles gaining of focus\n * @internal\n */\n public handleFocus(): void\n {\n this._pickerRequest.next(true);\n\n //no value\n if(!this._dateApiValue)\n {\n this._dateApiValue = this._dateApi.now();\n this._isValid = this._dateApiValue.isValid();\n\n if(this._minMaxConstraintTest())\n {\n this._clearValue();\n }\n else\n {\n this._valueChange.next();\n }\n }\n\n if(!this._isValid)\n {\n return;\n }\n\n this._show();\n\n const result = this._parser!.parse(this.currentValue!, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n /**\n * Handles blur on input\n * @internal\n */\n public handleBlur(): void\n {\n this._pickerRequest.next(false);\n }\n\n /**\n * Handles user input\n * @internal\n */\n public handleInput(): void\n {\n //empty value\n if(!this.currentValue)\n {\n this._clearValue();\n this._valueChange.next();\n\n return;\n }\n\n this._dateApiValue = this._dateApi.getValue(this.currentValue, this._format);\n this._isValid = this._dateApiValue.isValid();\n this._valueChange.next();\n }\n\n /**\n * Handles selection of text inside of input\n * @internal\n */\n public handleSelect(): void\n {\n //handles when all text is selected\n if(this.currentValue && this.input.selectionStart == 0 && this.input.selectionEnd == this.input.value.length)\n {\n const result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n }\n\n /**\n * Handles click event inside of input\n * @internal\n */\n public handleClick(): void\n {\n this._pickerRequest.next(true);\n\n if(!this._dateApiValue)\n {\n return;\n }\n\n const result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n /**\n * Handles keyboard events\n * @param event - Keyboard event that occured\n * @param input - Html input element that holds current value and selection\n * @internal\n */\n public handleKeyboard(event: KeyboardEvent): void\n {\n if(!this._dateApiValue?.isValid())\n {\n return;\n }\n\n switch(event.key)\n {\n case 'ArrowRight':\n case 'ArrowLeft':\n {\n event.preventDefault();\n event.stopPropagation();\n\n const result = event.key == 'ArrowLeft' ? this._parser!.previous(this.input.value, this.input.selectionStart!) : this._parser!.next(this.input.value, this.input.selectionStart!);\n\n if(result)\n {\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n break;\n }\n case 'ArrowUp':\n case 'ArrowDown':\n {\n event.preventDefault();\n event.stopPropagation();\n\n let result = this._parser!.parse(this.input.value, this.input.selectionStart!);\n const selectionStart = result.positionFrom;\n\n this._stepChangeValue(result.part, event.key == 'ArrowUp');\n this._show();\n\n result = this._parser!.parse(this.input.value, selectionStart);\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n\n break;\n }\n case 'Tab':\n {\n const result = event.shiftKey ? this._parser!.previous(this.input.value, this.input.selectionStart!) : this._parser!.next(this.input.value, this.input.selectionStart!);\n\n if(result)\n {\n event.preventDefault();\n event.stopPropagation();\n\n this.input.selectionStart = result.positionFrom;\n this.input.selectionEnd = result.positionTo;\n }\n\n break;\n }\n case 'a':\n {\n if(event.ctrlKey)\n {\n event.preventDefault();\n event.stopPropagation();\n }\n\n break;\n }\n case 'Backspace':\n {\n this._clearValue();\n this._valueChange.next();\n\n break;\n }\n case 'Escape':\n {\n this._pickerRequest.next(false);\n\n break;\n }\n case ' ':\n {\n if(event.ctrlKey)\n {\n this._pickerRequest.next(true);\n }\n\n break;\n }\n }\n }\n\n //######################### protected methods #########################\n\n /**\n * Shows current value in input\n */\n protected _show(): void\n {\n if(this._isValid)\n {\n this.currentValue = this._dateApiValue?.format(this._format) ?? null;\n }\n }\n\n /**\n * Tests whether are min or max constraint broken, returns true if constraint is broken\n */\n protected _minMaxConstraintTest(): boolean\n {\n return (!!this._minValue && this._dateApiValue!.isBefore(this._minValue)) ||\n (!!this._maxValue && this._dateApiValue!.isAfter(this._maxValue));\n }\n\n /**\n * Runs code with check whether min max constrains was broken\n * @param code - Code that should be executed which can change current value\n */\n protected _withMinMaxConstraint(code: () => void): void\n {\n this._dateApiValue!.updateOriginal();\n\n code();\n\n //min value constraint failure\n if(this._minMaxConstraintTest())\n {\n this._dateApiValue?.resetOriginal();\n\n return;\n }\n\n this._valueChange.next();\n }\n\n /**\n * Clears current value\n */\n protected _clearValue(): void\n {\n this._dateApiValue = null;\n this._isValid = true;\n this.currentValue = null;\n }\n\n /**\n * Changes current value of date for for specified part by single step\n * @param part - Part of date that should be changed\n * @param increment - Indication whether value should be incremented or decremented\n */\n protected _stepChangeValue(part: string, increment: boolean): void\n {\n if(!this._dateApiValue?.isValid())\n {\n return;\n }\n\n switch(part)\n {\n case 'y':\n case 'Y':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addYears(1) : this._dateApiValue!.subtractYears(1));\n\n break;\n }\n case 'Q':\n {\n break;\n }\n case 'M':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addMonths(1) : this._dateApiValue!.subtractMonths(1));\n\n break;\n }\n case 'w':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addWeeks(1) : this._dateApiValue!.subtractWeeks(1));\n\n break;\n }\n case 'd':\n case 'D':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addDays(1) : this._dateApiValue!.subtractDays(1));\n\n break;\n }\n case 'H':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addHours(1) : this._dateApiValue!.subtractHours(1));\n\n break;\n }\n case 'm':\n {\n this._withMinMaxConstraint(() => increment ? this._dateApiValue!.addMinutes(1) : this._dateApiValue!.subtractMinutes(1));\n\n break;\n }\n }\n }\n}","<input type=\"text\"\r\n #input\r\n (focus)=\"handleFocus()\"\r\n (blur)=\"handleBlur()\"\r\n (input)=\"handleInput()\"\r\n (click)=\"handleClick()\"\r\n (select)=\"handleSelect()\"\r\n (keydown)=\"handleKeyboard($any($event))\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder ?? ''\">"]}
@@ -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 { DateValueProvider } from '../../../services/dateValueProvider.service';
@@ -65,6 +66,9 @@ export class SimpleInputDateTimeSelectorComponent {
65
66
  return this._format;
66
67
  }
67
68
  set format(value) {
69
+ if (isPresent(value)) {
70
+ value = this._dateApi.getFormat(value);
71
+ }
68
72
  this._format = value;
69
73
  }
70
74
  /**