@progress/kendo-charts 1.22.0 → 1.23.0-dev.202201170838

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/LICENSE.md +1 -1
  2. package/NOTICE.txt +119 -79
  3. package/dist/cdn/js/kendo-charts.js +1 -1
  4. package/dist/cdn/main.js +1 -1
  5. package/dist/es/common/keys.js +25 -0
  6. package/dist/es/common.js +1 -0
  7. package/dist/es/drawing-utils.js +27 -3
  8. package/dist/es/main.js +1 -0
  9. package/dist/es/map/attribution.js +158 -0
  10. package/dist/es/map/crs.js +277 -0
  11. package/dist/es/map/datums.js +16 -0
  12. package/dist/es/map/extent.js +129 -0
  13. package/dist/es/map/layers/bubble.js +185 -0
  14. package/dist/es/map/layers/layer.js +140 -0
  15. package/dist/es/map/layers/marker.js +347 -0
  16. package/dist/es/map/layers/shape.js +389 -0
  17. package/dist/es/map/layers/tile.js +491 -0
  18. package/dist/es/map/location.js +201 -0
  19. package/dist/es/map/map.js +945 -0
  20. package/dist/es/map/navigator.js +175 -0
  21. package/dist/es/map/scroller/draggable.js +454 -0
  22. package/dist/es/map/scroller/fx.js +119 -0
  23. package/dist/es/map/scroller/observable.js +175 -0
  24. package/dist/es/map/scroller/scroller.js +746 -0
  25. package/dist/es/map/scroller/user-events.js +713 -0
  26. package/dist/es/map/utils.js +450 -0
  27. package/dist/es/map/zoom.js +139 -0
  28. package/dist/es/map.js +1 -0
  29. package/dist/es/services/map-service.js +15 -0
  30. package/dist/es2015/common/keys.js +25 -0
  31. package/dist/es2015/common.js +1 -0
  32. package/dist/es2015/drawing-utils.js +43 -3
  33. package/dist/es2015/main.js +1 -0
  34. package/dist/es2015/map/attribution.js +148 -0
  35. package/dist/es2015/map/crs.js +233 -0
  36. package/dist/es2015/map/datums.js +16 -0
  37. package/dist/es2015/map/extent.js +115 -0
  38. package/dist/es2015/map/layers/bubble.js +167 -0
  39. package/dist/es2015/map/layers/layer.js +134 -0
  40. package/dist/es2015/map/layers/marker.js +327 -0
  41. package/dist/es2015/map/layers/shape.js +369 -0
  42. package/dist/es2015/map/layers/tile.js +465 -0
  43. package/dist/es2015/map/location.js +193 -0
  44. package/dist/es2015/map/map.js +915 -0
  45. package/dist/es2015/map/navigator.js +170 -0
  46. package/dist/es2015/map/scroller/draggable.js +418 -0
  47. package/dist/es2015/map/scroller/fx.js +112 -0
  48. package/dist/es2015/map/scroller/observable.js +165 -0
  49. package/dist/es2015/map/scroller/scroller.js +716 -0
  50. package/dist/es2015/map/scroller/user-events.js +695 -0
  51. package/dist/es2015/map/utils.js +450 -0
  52. package/dist/es2015/map/zoom.js +134 -0
  53. package/dist/es2015/map.js +1 -0
  54. package/dist/es2015/services/map-service.js +15 -0
  55. package/dist/npm/main.d.ts +1 -0
  56. package/dist/npm/main.js +6218 -342
  57. package/dist/npm/map.d.ts +4 -0
  58. package/dist/systemjs/kendo-charts.js +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,695 @@
1
+ import {
2
+ Class,
3
+ grep
4
+ } from '../../common';
5
+
6
+ import {
7
+ proxy,
8
+ noop,
9
+ applyEventMap,
10
+ getEventMap,
11
+ on,
12
+ off,
13
+ now,
14
+ getSupportedFeatures
15
+ } from '../utils';
16
+
17
+ import {
18
+ Observable
19
+ } from './observable';
20
+
21
+ const extend = Object.assign;
22
+
23
+ const preventDefault = (e) => {
24
+ e.preventDefault();
25
+ };
26
+
27
+ let
28
+ DEFAULT_MIN_HOLD = 800,
29
+ CLICK_DELAY = 300,
30
+ // DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0,
31
+ DEFAULT_THRESHOLD = 0,
32
+ PRESS = 'press',
33
+ HOLD = 'hold',
34
+ SELECT = 'select',
35
+ START = 'start',
36
+ MOVE = 'move',
37
+ END = 'end',
38
+ CANCEL = 'cancel',
39
+ TAP = 'tap',
40
+ DOUBLETAP = 'doubleTap',
41
+ RELEASE = 'release',
42
+ GESTURESTART = 'gesturestart',
43
+ GESTURECHANGE = 'gesturechange',
44
+ GESTUREEND = 'gestureend',
45
+ GESTURETAP = 'gesturetap';
46
+
47
+ let THRESHOLD = {
48
+ 'api': 0,
49
+ 'touch': 0,
50
+ 'mouse': 9,
51
+ 'pointer': 9
52
+ };
53
+
54
+ function touchDelta(touch1, touch2) {
55
+ let x1 = touch1.x.location,
56
+ y1 = touch1.y.location,
57
+ x2 = touch2.x.location,
58
+ y2 = touch2.y.location,
59
+ dx = x1 - x2,
60
+ dy = y1 - y2;
61
+
62
+ return {
63
+ center: {
64
+ x: (x1 + x2) / 2,
65
+ y: (y1 + y2) / 2
66
+ },
67
+ distance: Math.sqrt(dx * dx + dy * dy)
68
+ };
69
+ }
70
+
71
+ function getTouches(e) {
72
+ const support = getSupportedFeatures();
73
+ let touches = [],
74
+ originalEvent = e.originalEvent || e,
75
+ currentTarget = e.currentTarget,
76
+ idx = 0,
77
+ length, changedTouches, touch;
78
+
79
+ if (e.api) {
80
+ touches.push({
81
+ id: 2,
82
+ event: e,
83
+ target: e.target,
84
+ currentTarget: e.target,
85
+ location: e,
86
+ type: 'api'
87
+ });
88
+ } else if (e.type.match(/touch/)) {
89
+ changedTouches = originalEvent ? originalEvent.changedTouches : [];
90
+
91
+ for (length = changedTouches.length; idx < length; idx++) {
92
+ touch = changedTouches[idx];
93
+ touches.push({
94
+ location: touch,
95
+ event: e,
96
+ target: touch.target,
97
+ currentTarget: currentTarget,
98
+ id: touch.identifier,
99
+ type: 'touch'
100
+ });
101
+ }
102
+ } else if (support.pointers || support.msPointers) {
103
+ touches.push({
104
+ location: originalEvent,
105
+ event: e,
106
+ target: e.target,
107
+ currentTarget: currentTarget,
108
+ id: originalEvent.pointerId,
109
+ type: 'pointer'
110
+ });
111
+ } else {
112
+ touches.push({
113
+ id: 1,
114
+ event: e,
115
+ target: e.target,
116
+ currentTarget: currentTarget,
117
+ location: e,
118
+ type: 'mouse'
119
+ });
120
+ }
121
+
122
+ return touches;
123
+ }
124
+ export class TouchAxis extends Class {
125
+ constructor(axis, location) {
126
+ super();
127
+ let that = this;
128
+
129
+ that.support = getSupportedFeatures();
130
+ that.invalidZeroEvents = this.support.mobileOS && this.support.mobileOS.android;
131
+ that.axis = axis;
132
+ that._updateLocationData(location);
133
+ that.startLocation = that.location;
134
+ that.velocity = that.delta = 0;
135
+ that.timeStamp = now();
136
+ }
137
+
138
+ move(location) {
139
+ let that = this,
140
+ offset = location['page' + that.axis],
141
+ timeStamp = now(),
142
+ timeDelta = timeStamp - that.timeStamp || 1;
143
+
144
+ if (!offset && this.invalidZeroEvents) {
145
+ return;
146
+ }
147
+
148
+ that.delta = offset - that.location;
149
+ that._updateLocationData(location);
150
+ that.initialDelta = offset - that.startLocation;
151
+ that.velocity = that.delta / timeDelta;
152
+ that.timeStamp = timeStamp;
153
+ }
154
+
155
+ _updateLocationData(location) {
156
+ let that = this,
157
+ axis = that.axis;
158
+
159
+ that.location = location['page' + axis];
160
+ that.client = location['client' + axis];
161
+ that.screen = location['screen' + axis];
162
+ }
163
+ }
164
+
165
+ export class Touch extends Class {
166
+ constructor(userEvents, target, touchInfo) {
167
+ super();
168
+
169
+ extend(this, {
170
+ x: new TouchAxis('X', touchInfo.location),
171
+ y: new TouchAxis('Y', touchInfo.location),
172
+ type: touchInfo.type,
173
+ useClickAsTap: userEvents.useClickAsTap,
174
+ threshold: userEvents.threshold || THRESHOLD[touchInfo.type],
175
+ userEvents: userEvents,
176
+ target: target,
177
+ currentTarget: touchInfo.currentTarget,
178
+ initialTouch: touchInfo.target,
179
+ id: touchInfo.id,
180
+ pressEvent: touchInfo,
181
+ _clicks: userEvents._clicks,
182
+ supportDoubleTap: userEvents.supportDoubleTap,
183
+ _moved: false,
184
+ _finished: false
185
+ });
186
+ }
187
+
188
+ press() {
189
+ // this._holdTimeout = setTimeout($.proxy(this, '_hold'), this.userEvents.minHold);
190
+ this._holdTimeout = setTimeout(proxy(this._hold, this), this.userEvents.minHold);
191
+ this._trigger(PRESS, this.pressEvent);
192
+ }
193
+
194
+ _tap(touchInfo) {
195
+ let that = this;
196
+
197
+ that.userEvents._clicks++;
198
+
199
+ if (that.userEvents._clicks === 1) {
200
+ that._clickTimeout = setTimeout(function() {
201
+ if (that.userEvents._clicks === 1) {
202
+ that._trigger(TAP, touchInfo);
203
+ } else {
204
+ that._trigger(DOUBLETAP, touchInfo);
205
+ }
206
+
207
+ that.userEvents._clicks = 0;
208
+ }, CLICK_DELAY);
209
+ }
210
+ }
211
+
212
+ _hold() {
213
+ this._trigger(HOLD, this.pressEvent);
214
+ }
215
+
216
+ /* eslint-disable consistent-return */
217
+ move(touchInfo) {
218
+ let that = this;
219
+ let preventMove = touchInfo.type !== 'api' && that.userEvents._shouldNotMove;
220
+
221
+ if (that._finished || preventMove) {
222
+ return;
223
+ }
224
+
225
+ that.x.move(touchInfo.location);
226
+ that.y.move(touchInfo.location);
227
+
228
+ if (!that._moved) {
229
+ if (that._withinIgnoreThreshold()) {
230
+ return;
231
+ }
232
+
233
+ if (!UserEvents.current || UserEvents.current === that.userEvents) {
234
+ that._start(touchInfo);
235
+ } else {
236
+ return that.dispose();
237
+ }
238
+ }
239
+
240
+ if (!that._finished) {
241
+ that._trigger(MOVE, touchInfo);
242
+ }
243
+ }
244
+ /* eslint-enable consistent-return */
245
+
246
+ end(touchInfo) {
247
+ this.endTime = now();
248
+
249
+ if (this._finished) {
250
+ return;
251
+ }
252
+
253
+ this._finished = true;
254
+ this._trigger(RELEASE, touchInfo);
255
+
256
+ if (this._moved) {
257
+ this._trigger(END, touchInfo);
258
+ } else {
259
+ if (!this.useClickAsTap) {
260
+ if (this.supportDoubleTap) {
261
+ this._tap(touchInfo);
262
+ } else {
263
+ this._trigger(TAP, touchInfo);
264
+ }
265
+ }
266
+ }
267
+
268
+ clearTimeout(this._holdTimeout);
269
+ this.dispose();
270
+ }
271
+
272
+ dispose() {
273
+ let userEvents = this.userEvents,
274
+ activeTouches = userEvents.touches || [];
275
+
276
+ this._finished = true;
277
+ this.pressEvent = null;
278
+
279
+ clearTimeout(this._holdTimeout);
280
+ // activeTouches.splice($.inArray(this, activeTouches), 1);
281
+ const activeTouchIndex = activeTouches.indexOf(this);
282
+ activeTouches.splice(activeTouchIndex, 1);
283
+ }
284
+
285
+ skip() {
286
+ this.dispose();
287
+ }
288
+
289
+ cancel() {
290
+ this.dispose();
291
+ }
292
+
293
+ isMoved() {
294
+ return this._moved;
295
+ }
296
+
297
+ _start(touchInfo) {
298
+ clearTimeout(this._holdTimeout);
299
+ this.startTime = now();
300
+ this._moved = true;
301
+ this._trigger(START, touchInfo);
302
+ }
303
+
304
+ _trigger(name, touchInfo) {
305
+ let that = this,
306
+ jQueryEvent = touchInfo.event,
307
+ data = {
308
+ touch: that,
309
+ x: that.x,
310
+ y: that.y,
311
+ target: that.target,
312
+ event: jQueryEvent
313
+ };
314
+ if (that.userEvents.notify(name, data)) {
315
+ jQueryEvent.preventDefault();
316
+ }
317
+ }
318
+
319
+ _withinIgnoreThreshold() {
320
+ let xDelta = this.x.initialDelta,
321
+ yDelta = this.y.initialDelta;
322
+ return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;
323
+ }
324
+ }
325
+
326
+ function withEachUpEvent(callback) {
327
+ const eventMap = getEventMap(navigator.userAgent);
328
+ let downEvents = eventMap.up.split(' '),
329
+ idx = 0,
330
+ length = downEvents.length;
331
+
332
+ for (; idx < length; idx++) {
333
+ callback(downEvents[idx]);
334
+ }
335
+ }
336
+
337
+ export class UserEvents extends Observable {
338
+ constructor(element, options) {
339
+ super();
340
+ let that = this;
341
+ let filter;
342
+
343
+ const support = getSupportedFeatures();
344
+ this.support = support;
345
+
346
+ /* eslint-disable no-param-reassign */
347
+ options = options || {};
348
+ /* eslint-enable no-param-reassign */
349
+ this.options = options;
350
+
351
+ filter = that.filter = options.filter;
352
+ that.threshold = options.threshold || DEFAULT_THRESHOLD;
353
+ that.minHold = options.minHold || DEFAULT_MIN_HOLD;
354
+ that.touches = [];
355
+ that._maxTouches = options.multiTouch ? 2 : 1;
356
+ that.allowSelection = options.allowSelection;
357
+ that.captureUpIfMoved = options.captureUpIfMoved;
358
+ that.useClickAsTap = !options.fastTap && !support.delayedClick();
359
+ that._clicks = 0;
360
+ that.supportDoubleTap = options.supportDoubleTap;
361
+
362
+ const enableGlobalSurface = !support.touch || support.mouseAndTouchPresent;
363
+
364
+ extend(that, {
365
+ element: element,
366
+ surface: options.global && enableGlobalSurface ?
367
+ element.ownerDocument.documentElement :
368
+ options.surface || element,
369
+ stopPropagation: options.stopPropagation,
370
+ pressed: false
371
+ });
372
+
373
+ this._surfaceMoveHandler = proxy(this._move, this);
374
+ on(that.surface, applyEventMap('move'), this._surfaceMoveHandler);
375
+
376
+ this._surfaceEndHandler = proxy(this._end, this);
377
+ on(that.surface, applyEventMap('up cancel'), this._surfaceEndHandler);
378
+
379
+ this._elementStartHandler = proxy(this._start, this);
380
+ on(element, applyEventMap('down'), filter, this._elementStartHandler);
381
+
382
+ if (that.useClickAsTap) {
383
+ this._elementClickHandler = proxy(this._click, this);
384
+ on(element, applyEventMap('click'), filter, this._elementClickHandler);
385
+ }
386
+
387
+ if (support.pointers || support.msPointers) {
388
+ if (support.browser.version < 11) {
389
+ let defaultAction = 'pinch-zoom double-tap-zoom';
390
+
391
+ element.style['-ms-touch-action'] =
392
+ options.touchAction && options.touchAction !== 'none' ?
393
+ defaultAction + ' ' + options.touchAction :
394
+ defaultAction;
395
+
396
+ } else {
397
+ element.style['touch-action'] = options.touchAction || 'none';
398
+ }
399
+ }
400
+ if (options.preventDragEvent) {
401
+ this._elementDragStartHandler = preventDefault;
402
+ on(element, applyEventMap('dragstart'), this._elementDragStartHandler);
403
+ }
404
+
405
+ // element.on(kendo.applyEventMap('mousedown'), filter, {
406
+ // root: element
407
+ // } '_select');
408
+
409
+ // todo: use root
410
+ this._elementSelectHandler = proxy(this._select, this);
411
+ on(element, applyEventMap('mousedown'), filter, this._elementSelectHandler);
412
+
413
+ if (that.captureUpIfMoved && support.eventCapture) {
414
+ let surfaceElement = that.surface,
415
+ preventIfMovingProxy = proxy(that.preventIfMoving, that);
416
+
417
+ withEachUpEvent(function(eventName) {
418
+ surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);
419
+ });
420
+ }
421
+
422
+ that.bind([
423
+ PRESS,
424
+ HOLD,
425
+ TAP,
426
+ DOUBLETAP,
427
+ START,
428
+ MOVE,
429
+ END,
430
+ RELEASE,
431
+ CANCEL,
432
+ GESTURESTART,
433
+ GESTURECHANGE,
434
+ GESTUREEND,
435
+ GESTURETAP,
436
+ SELECT
437
+ ], options);
438
+ }
439
+
440
+ preventIfMoving(e) {
441
+ if (this._isMoved()) {
442
+ e.preventDefault();
443
+ }
444
+ }
445
+
446
+ destroy() {
447
+ let that = this;
448
+ const options = this.options;
449
+ const element = this.element;
450
+
451
+ if (that._destroyed) {
452
+ return;
453
+ }
454
+
455
+ that._destroyed = true;
456
+
457
+ if (that.captureUpIfMoved && this.support.eventCapture) {
458
+ let surfaceElement = that.surface;
459
+ withEachUpEvent(function(eventName) {
460
+ surfaceElement.removeEventListener(eventName, that.preventIfMoving);
461
+ });
462
+ }
463
+
464
+ off(that.surface, applyEventMap('move'), this._surfaceMoveHandler);
465
+ off(that.surface, applyEventMap('up cancel'), this._surfaceEndHandler);
466
+
467
+ off(element, applyEventMap('down'), this._elementStartHandler);
468
+
469
+ if (that.useClickAsTap) {
470
+ off(element, applyEventMap('click'), this._elementClickHandler);
471
+ }
472
+
473
+ if (options.preventDragEvent) {
474
+ off(element, applyEventMap('dragstart'), this._elementDragStartHandler);
475
+ }
476
+
477
+ off(element, applyEventMap('mousedown'), this._elementSelectHandler);
478
+
479
+ that._disposeAll();
480
+ that.unbind();
481
+
482
+ delete that.surface;
483
+ delete that.element;
484
+ delete that.currentTarget;
485
+ }
486
+
487
+ capture() {
488
+ UserEvents.current = this;
489
+ }
490
+
491
+ cancel() {
492
+ this._disposeAll();
493
+ this.trigger(CANCEL);
494
+ }
495
+
496
+ /* eslint-disable indent */
497
+ notify(event, data) {
498
+ let that = this,
499
+ touches = that.touches;
500
+ let eventName = event;
501
+
502
+ if (this._isMultiTouch()) {
503
+ switch (eventName) {
504
+ case MOVE:
505
+ eventName = GESTURECHANGE;
506
+ break;
507
+ case END:
508
+ eventName = GESTUREEND;
509
+ break;
510
+ case TAP:
511
+ eventName = GESTURETAP;
512
+ break;
513
+ default:
514
+ break;
515
+ }
516
+
517
+ extend(data, {
518
+ touches: touches
519
+ }, touchDelta(touches[0], touches[1]));
520
+ }
521
+
522
+ return this.trigger(eventName, extend(data, {
523
+ type: eventName
524
+ }));
525
+ }
526
+ /* eslint-enable indent */
527
+
528
+ press(x, y, target) {
529
+ this._apiCall('_start', x, y, target);
530
+ }
531
+
532
+ move(x, y) {
533
+ this._apiCall('_move', x, y);
534
+ }
535
+
536
+ end(x, y) {
537
+ this._apiCall('_end', x, y);
538
+ }
539
+
540
+ _isMultiTouch() {
541
+ return this.touches.length > 1;
542
+ }
543
+
544
+ _maxTouchesReached() {
545
+ return this.touches.length >= this._maxTouches;
546
+ }
547
+
548
+ _disposeAll() {
549
+ let touches = this.touches;
550
+ while (touches.length > 0) {
551
+ touches.pop().dispose();
552
+ }
553
+ }
554
+
555
+ _isMoved() {
556
+ return grep(this.touches, function(touch) {
557
+ return touch.isMoved();
558
+ }).length;
559
+ }
560
+
561
+ _select(e) {
562
+ if (!this.allowSelection || this.trigger(SELECT, { event: e })) {
563
+ e.preventDefault();
564
+ }
565
+ }
566
+
567
+ _start(e) {
568
+ let that = this,
569
+ idx = 0,
570
+ filter = that.filter,
571
+ target,
572
+ touches = getTouches(e),
573
+ length = touches.length,
574
+ touch,
575
+ which = e.which;
576
+
577
+ if (which && which > 1 || that._maxTouchesReached()) {
578
+ return;
579
+ }
580
+
581
+ UserEvents.current = null;
582
+ that.currentTarget = e.currentTarget;
583
+
584
+ if (that.stopPropagation) {
585
+ e.stopPropagation();
586
+ }
587
+
588
+ for (; idx < length; idx++) {
589
+ if (that._maxTouchesReached()) {
590
+ break;
591
+ }
592
+
593
+ touch = touches[idx];
594
+
595
+ if (filter) {
596
+ target = touch.currentTarget;
597
+ } else {
598
+ target = that.element;
599
+ }
600
+
601
+ if (target && target.length === 0) {
602
+ continue;
603
+ }
604
+
605
+ touch = new Touch(that, target, touch);
606
+ that.touches.push(touch);
607
+ touch.press();
608
+
609
+ if (that._isMultiTouch()) {
610
+ that.notify('gesturestart', {});
611
+ }
612
+ }
613
+ }
614
+
615
+ _move(e) {
616
+ this._eachTouch('move', e);
617
+ }
618
+
619
+ _end(e) {
620
+ this._eachTouch('end', e);
621
+ }
622
+
623
+ _click(e) {
624
+ let data = {
625
+ touch: {
626
+ initialTouch: e.target,
627
+ target: e.currentTarget,
628
+ endTime: now(),
629
+ x: {
630
+ location: e.pageX,
631
+ client: e.clientX
632
+ },
633
+ y: {
634
+ location: e.pageY,
635
+ client: e.clientY
636
+ }
637
+ },
638
+ x: e.pageX,
639
+ y: e.pageY,
640
+ target: e.currentTarget,
641
+ event: e,
642
+ type: 'tap'
643
+ };
644
+
645
+ if (this.trigger('tap', data)) {
646
+ e.preventDefault();
647
+ }
648
+ }
649
+
650
+ _eachTouch(methodName, e) {
651
+ let that = this,
652
+ dict = {},
653
+ touches = getTouches(e),
654
+ activeTouches = that.touches,
655
+ idx,
656
+ touch,
657
+ touchInfo,
658
+ matchingTouch;
659
+
660
+ for (idx = 0; idx < activeTouches.length; idx++) {
661
+ touch = activeTouches[idx];
662
+ dict[touch.id] = touch;
663
+ }
664
+
665
+ for (idx = 0; idx < touches.length; idx++) {
666
+ touchInfo = touches[idx];
667
+ matchingTouch = dict[touchInfo.id];
668
+
669
+ if (matchingTouch) {
670
+ matchingTouch[methodName](touchInfo);
671
+ }
672
+ }
673
+ }
674
+
675
+ _apiCall(type, x, y, target) {
676
+ this[type]({
677
+ api: true,
678
+ pageX: x,
679
+ pageY: y,
680
+ clientX: x,
681
+ clientY: y,
682
+ target: target || this.element,
683
+ stopPropagation: noop,
684
+ preventDefault: noop
685
+ });
686
+ }
687
+
688
+ static defaultThreshold(value) {
689
+ DEFAULT_THRESHOLD = value;
690
+ }
691
+
692
+ static minHold(value) {
693
+ DEFAULT_MIN_HOLD = value;
694
+ }
695
+ }