ember-sortable 2.3.0 → 3.0.1

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 (36) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +2 -2
  2. package/.github/workflows/github_ci.yml +15 -13
  3. package/CHANGELOG.md +229 -107
  4. package/MIGRATION_GUIDE_MODIFIERS.md +20 -13
  5. package/MIGRATION_GUIDE_V2.md +20 -8
  6. package/README.md +75 -152
  7. package/V2_MIGRATION_RFC.md +188 -222
  8. package/addon/modifiers/sortable-group.js +48 -50
  9. package/addon/modifiers/sortable-handle.js +16 -18
  10. package/addon/modifiers/sortable-item.js +104 -77
  11. package/addon/services/ember-sortable.js +3 -6
  12. package/addon/system/scroll-parent.js +1 -1
  13. package/addon/utils/coordinate.js +1 -1
  14. package/addon/utils/css-calculation.js +2 -2
  15. package/addon/utils/defaults.js +4 -3
  16. package/addon/utils/keyboard.js +3 -12
  17. package/addon-test-support/helpers/drag.js +3 -11
  18. package/addon-test-support/helpers/index.js +1 -4
  19. package/addon-test-support/helpers/reorder.js +4 -6
  20. package/addon-test-support/utils/keyboard.js +3 -12
  21. package/addon-test-support/utils/offset.js +6 -6
  22. package/config/environment.js +2 -2
  23. package/index.js +0 -20
  24. package/package.json +34 -20
  25. package/addon/components/sortable-group.js +0 -741
  26. package/addon/components/sortable-handle.js +0 -30
  27. package/addon/components/sortable-item.js +0 -770
  28. package/addon/styles/components/sortable-group.css +0 -9
  29. package/addon/templates/components/sortable-group.hbs +0 -16
  30. package/addon/templates/components/sortable-handle.hbs +0 -1
  31. package/addon/templates/components/sortable-item.hbs +0 -2
  32. package/addon/utils/transitionend.js +0 -22
  33. package/app/components/sortable-group.js +0 -3
  34. package/app/components/sortable-handle.js +0 -4
  35. package/app/components/sortable-item.js +0 -3
  36. package/vendor/polyfills/closest.js +0 -21
@@ -1,23 +1,23 @@
1
+ /* eslint-disable ember/no-computed-properties-in-native-classes */
1
2
  import Modifier from 'ember-modifier';
2
3
  import { Promise, defer } from 'rsvp';
3
- import {action, set} from '@ember/object';
4
- import {reads} from '@ember/object/computed';
5
- import {or} from '@ember/object/computed';
6
- import {DRAG_ACTIONS, ELEMENT_CLICK_ACTION, END_ACTIONS} from "../utils/constant";
7
- import { run, throttle } from '@ember/runloop';
4
+ import { action, set } from '@ember/object';
5
+ import { DRAG_ACTIONS, ELEMENT_CLICK_ACTION, END_ACTIONS } from '../utils/constant';
6
+ import { run, throttle, bind, scheduleOnce, later } from '@ember/runloop';
8
7
  import { DEBUG } from '@glimmer/env';
9
- import {getX, getY} from "../utils/coordinate";
10
- import ScrollContainer from "../system/scroll-container";
11
- import scrollParent from "../system/scroll-parent";
12
- import {getBorderSpacing} from "../utils/css-calculation";
8
+ import { getX, getY } from '../utils/coordinate';
9
+ import ScrollContainer from '../system/scroll-container';
10
+ import scrollParent from '../system/scroll-parent';
11
+ import { getBorderSpacing } from '../utils/css-calculation';
13
12
  import { buildWaiter } from '@ember/test-waiters';
14
- import {inject as service} from '@ember/service';
13
+ import { inject as service } from '@ember/service';
15
14
  import { assert, deprecate } from '@ember/debug';
16
15
  import config from 'ember-get-config';
16
+
17
17
  const { environment } = config;
18
18
  const isTesting = environment === 'test';
19
19
 
20
- const sortableItemWaiter = buildWaiter("sortable-item-waiter");
20
+ const sortableItemWaiter = buildWaiter('sortable-item-waiter');
21
21
 
22
22
  /**
23
23
  * Modifier to mark an element as an item to be reordered
@@ -39,8 +39,9 @@ const sortableItemWaiter = buildWaiter("sortable-item-waiter");
39
39
  * </ol>
40
40
  */
41
41
  export default class SortableItemModifier extends Modifier {
42
+ className = 'sortable-item';
42
43
 
43
- className = "sortable-item";
44
+ @service('ember-sortable@ember-sortable') sortableService;
44
45
 
45
46
  _sortableGroup;
46
47
  /**
@@ -52,22 +53,25 @@ export default class SortableItemModifier extends Modifier {
52
53
  get sortableGroup() {
53
54
  if (this._sortableGroup === undefined) {
54
55
  this._sortableGroup = this.sortableService.fetchGroup(this.groupName);
55
- assert(`No sortable group named ${this.groupName} found. Please check that the groups and items have the same groupName`, this._sortableGroup !== undefined)
56
+ assert(
57
+ `No sortable group named ${this.groupName} found. Please check that the groups and items have the same groupName`,
58
+ this._sortableGroup !== undefined
59
+ );
56
60
  }
57
61
  return this._sortableGroup.groupModifier;
58
62
  }
59
63
 
60
- @reads("args.named.model")
61
- model;
62
-
63
- @reads("sortableGroup.direction")
64
- direction;
64
+ get model() {
65
+ return this.args.named.model;
66
+ }
65
67
 
66
- @reads("sortableGroup.disabled")
67
- groupDisabled;
68
+ get direction() {
69
+ return this.sortableGroup.direction;
70
+ }
68
71
 
69
- @service('ember-sortable@ember-sortable')
70
- sortableService;
72
+ get groupDisabled() {
73
+ return this.sortableGroup.disabled;
74
+ }
71
75
 
72
76
  /**
73
77
  * This is the group name used to keep groups separate if there are more than one on the screen at a time.
@@ -77,7 +81,7 @@ export default class SortableItemModifier extends Modifier {
77
81
  * @returns {*|string}
78
82
  */
79
83
  get groupName() {
80
- return this.args.named.groupName || "_EmberSortableGroup";
84
+ return this.args.named.groupName || '_EmberSortableGroup';
81
85
  }
82
86
 
83
87
  /**
@@ -110,7 +114,7 @@ export default class SortableItemModifier extends Modifier {
110
114
  get isDisabled() {
111
115
  deprecate(
112
116
  '"isDraggingDisabled" is deprecated. Please migrate to "disabled" named argument',
113
- !("isDraggingDisabled" in this.args.named),
117
+ !('isDraggingDisabled' in this.args.named),
114
118
  {
115
119
  id: 'ember-sortable.is-dragging-disabled',
116
120
  url: 'https://github.com/adopted-ember-addons/ember-sortable#readme',
@@ -120,7 +124,8 @@ export default class SortableItemModifier extends Modifier {
120
124
  available: '2.2.6',
121
125
  enabled: '2.2.6',
122
126
  },
123
- });
127
+ }
128
+ );
124
129
 
125
130
  return this.groupDisabled || this.args.named.disabled || this.args.named.isDraggingDisabled || false;
126
131
  }
@@ -137,7 +142,7 @@ export default class SortableItemModifier extends Modifier {
137
142
  @default "[data-sortable-handle]"
138
143
  */
139
144
  get handle() {
140
- return this.args.named.handle || "[data-sortable-handle]";
145
+ return this.args.named.handle || '[data-sortable-handle]';
141
146
  }
142
147
 
143
148
  handleElement;
@@ -170,9 +175,9 @@ export default class SortableItemModifier extends Modifier {
170
175
  }
171
176
  set isDragging(value) {
172
177
  if (value) {
173
- this.element.classList.add("is-dragging");
178
+ this.element.classList.add('is-dragging');
174
179
  } else {
175
- this.element.classList.remove("is-dragging");
180
+ this.element.classList.remove('is-dragging');
176
181
  }
177
182
  this._isDragging = value;
178
183
  }
@@ -185,7 +190,7 @@ export default class SortableItemModifier extends Modifier {
185
190
  @default null
186
191
  */
187
192
  get onDragStart() {
188
- return this.args.named.onDragStart || (item => item);
193
+ return this.args.named.onDragStart || ((item) => item);
189
194
  }
190
195
 
191
196
  /**
@@ -196,7 +201,7 @@ export default class SortableItemModifier extends Modifier {
196
201
  @default null
197
202
  */
198
203
  get onDragStop() {
199
- return this.args.named.onDragStop || (item => item);
204
+ return this.args.named.onDragStop || ((item) => item);
200
205
  }
201
206
 
202
207
  /**
@@ -211,9 +216,9 @@ export default class SortableItemModifier extends Modifier {
211
216
  }
212
217
  set isDropping(value) {
213
218
  if (value) {
214
- this.element.classList.add("is-dropping");
219
+ this.element.classList.add('is-dropping');
215
220
  } else {
216
- this.element.classList.remove("is-dropping");
221
+ this.element.classList.remove('is-dropping');
217
222
  }
218
223
  this._isDropping = value;
219
224
  }
@@ -230,8 +235,9 @@ export default class SortableItemModifier extends Modifier {
230
235
  @property isBusy
231
236
  @type Boolean
232
237
  */
233
- @or('isDragging', 'isDropping')
234
- isBusy;
238
+ get isBusy() {
239
+ return this.isDragging || this.isDropping;
240
+ }
235
241
 
236
242
  /**
237
243
  @property disableCheckScrollBounds
@@ -245,15 +251,21 @@ export default class SortableItemModifier extends Modifier {
245
251
  */
246
252
  @action
247
253
  mouseDown(event) {
248
- if (event.which !== 1) { return; }
249
- if (event.ctrlKey) { return; }
254
+ if (event.which !== 1) {
255
+ return;
256
+ }
257
+ if (event.ctrlKey) {
258
+ return;
259
+ }
250
260
 
251
261
  this._primeDrag(event);
252
262
  }
253
263
 
254
264
  @action
255
265
  keyDown(event) {
256
- if (this.isDisabled) { return; }
266
+ if (this.isDisabled) {
267
+ return;
268
+ }
257
269
 
258
270
  // If the event is coming from within the item, we do not want to activate keyboard reorder mode.
259
271
  if (event.target === this.handleElement || event.target === this.element) {
@@ -276,7 +288,9 @@ export default class SortableItemModifier extends Modifier {
276
288
  */
277
289
  freeze() {
278
290
  let el = this.element;
279
- if (!el) { return; }
291
+ if (!el) {
292
+ return;
293
+ }
280
294
 
281
295
  el.style.transition = 'none';
282
296
  }
@@ -286,7 +300,9 @@ export default class SortableItemModifier extends Modifier {
286
300
  */
287
301
  reset() {
288
302
  let el = this.element;
289
- if (!el) { return; }
303
+ if (!el) {
304
+ return;
305
+ }
290
306
 
291
307
  delete this._y;
292
308
  delete this._x;
@@ -299,7 +315,9 @@ export default class SortableItemModifier extends Modifier {
299
315
  */
300
316
  thaw() {
301
317
  let el = this.element;
302
- if (!el) { return; }
318
+ if (!el) {
319
+ return;
320
+ }
303
321
 
304
322
  el.style.transition = '';
305
323
  }
@@ -312,7 +330,9 @@ export default class SortableItemModifier extends Modifier {
312
330
  * @private
313
331
  */
314
332
  _primeDrag(startEvent) {
315
- if (this.isDisabled) { return; }
333
+ if (this.isDisabled) {
334
+ return;
335
+ }
316
336
 
317
337
  if (this.handleElement && !startEvent.target.closest(this.handle)) {
318
338
  return;
@@ -321,20 +341,20 @@ export default class SortableItemModifier extends Modifier {
321
341
  startEvent.preventDefault();
322
342
  startEvent.stopPropagation();
323
343
 
324
- this._prepareDragListener = run.bind(this, this._prepareDrag, startEvent);
344
+ this._prepareDragListener = bind(this, this._prepareDrag, startEvent);
325
345
 
326
- DRAG_ACTIONS.forEach(event => window.addEventListener(event, this._prepareDragListener));
346
+ DRAG_ACTIONS.forEach((event) => window.addEventListener(event, this._prepareDragListener));
327
347
 
328
348
  this._cancelStartDragListener = () => {
329
- DRAG_ACTIONS.forEach(event => window.removeEventListener(event, this._prepareDragListener));
349
+ DRAG_ACTIONS.forEach((event) => window.removeEventListener(event, this._prepareDragListener));
330
350
  };
331
351
 
332
352
  const selfCancellingCallback = () => {
333
- END_ACTIONS.forEach(event => window.removeEventListener(event, selfCancellingCallback));
353
+ END_ACTIONS.forEach((event) => window.removeEventListener(event, selfCancellingCallback));
334
354
  this._cancelStartDragListener();
335
355
  };
336
356
 
337
- END_ACTIONS.forEach(event => window.addEventListener(event, selfCancellingCallback));
357
+ END_ACTIONS.forEach((event) => window.addEventListener(event, selfCancellingCallback));
338
358
  }
339
359
 
340
360
  /**
@@ -351,7 +371,7 @@ export default class SortableItemModifier extends Modifier {
351
371
  let dy = Math.abs(getY(startEvent) - getY(event));
352
372
 
353
373
  if (distance <= dx || distance <= dy) {
354
- DRAG_ACTIONS.forEach(event => window.removeEventListener(event, this._prepareDragListener));
374
+ DRAG_ACTIONS.forEach((event) => window.removeEventListener(event, this._prepareDragListener));
355
375
  this._startDrag(startEvent);
356
376
  }
357
377
  }
@@ -364,25 +384,27 @@ export default class SortableItemModifier extends Modifier {
364
384
  * @private
365
385
  */
366
386
  _startDrag(event) {
367
- if (this.isBusy) { return; }
387
+ if (this.isBusy) {
388
+ return;
389
+ }
368
390
 
369
391
  let drag = this._makeDragHandler(event);
370
- let dragThrottled = ev => throttle(this, drag, ev, 16, false);
392
+ let dragThrottled = (ev) => throttle(this, drag, ev, 16, false);
371
393
 
372
394
  let drop = () => {
373
- DRAG_ACTIONS.forEach(event => window.removeEventListener(event, dragThrottled));
374
- END_ACTIONS.forEach(event => window.removeEventListener(event, drop));
395
+ DRAG_ACTIONS.forEach((event) => window.removeEventListener(event, dragThrottled));
396
+ END_ACTIONS.forEach((event) => window.removeEventListener(event, drop));
375
397
 
376
398
  run(() => {
377
399
  this._drop();
378
400
  });
379
401
  };
380
402
 
381
- DRAG_ACTIONS.forEach(event => window.addEventListener(event, dragThrottled));
382
- END_ACTIONS.forEach(event => window.addEventListener(event, drop));
403
+ DRAG_ACTIONS.forEach((event) => window.addEventListener(event, dragThrottled));
404
+ END_ACTIONS.forEach((event) => window.addEventListener(event, drop));
383
405
 
384
406
  this.sortableGroup.prepare();
385
- set(this, "isDragging", true);
407
+ set(this, 'isDragging', true);
386
408
  this.onDragStart(this.model);
387
409
  this._scrollOnEdges(drag);
388
410
  }
@@ -414,7 +436,7 @@ export default class SortableItemModifier extends Modifier {
414
436
  },
415
437
  get bottom() {
416
438
  return this.top + this.height;
417
- }
439
+ },
418
440
  };
419
441
 
420
442
  let leadingEdgeKey, trailingEdgeKey, scrollKey, pageKey;
@@ -431,12 +453,14 @@ export default class SortableItemModifier extends Modifier {
431
453
  }
432
454
 
433
455
  let createFakeEvent = () => {
434
- if (this._pageX == null && this._pageY == null) { return; }
456
+ if (this._pageX == null && this._pageY == null) {
457
+ return;
458
+ }
435
459
  return {
436
460
  pageX: this._pageX,
437
461
  pageY: this._pageY,
438
462
  clientX: this._pageX,
439
- clientY: this._pageY
463
+ clientY: this._pageY,
440
464
  };
441
465
  };
442
466
 
@@ -497,7 +521,7 @@ export default class SortableItemModifier extends Modifier {
497
521
  elementOrigin = this.x;
498
522
  scrollOrigin = parentElement.getBoundingClientRect().left;
499
523
 
500
- return event => {
524
+ return (event) => {
501
525
  this._pageX = getX(event);
502
526
  let dx = this._pageX - dragOrigin;
503
527
  let scrollX = parentElement.getBoundingClientRect().left;
@@ -512,7 +536,7 @@ export default class SortableItemModifier extends Modifier {
512
536
  elementOrigin = this.y;
513
537
  scrollOrigin = parentElement.getBoundingClientRect().top;
514
538
 
515
- return event => {
539
+ return (event) => {
516
540
  this._pageY = getY(event);
517
541
  let dy = this._pageY - dragOrigin;
518
542
  let scrollY = parentElement.getBoundingClientRect().top;
@@ -528,7 +552,7 @@ export default class SortableItemModifier extends Modifier {
528
552
  @private
529
553
  */
530
554
  _scheduleApplyPosition() {
531
- run.scheduleOnce('render', this, '_applyPosition');
555
+ scheduleOnce('render', this, '_applyPosition');
532
556
  }
533
557
 
534
558
  /**
@@ -536,7 +560,9 @@ export default class SortableItemModifier extends Modifier {
536
560
  @private
537
561
  */
538
562
  _applyPosition() {
539
- if (!this.element || !this.element) { return; }
563
+ if (!this.element || !this.element) {
564
+ return;
565
+ }
540
566
 
541
567
  const groupDirection = this.direction;
542
568
 
@@ -559,7 +585,7 @@ export default class SortableItemModifier extends Modifier {
559
585
  @private
560
586
  */
561
587
  _drag(dimension) {
562
- if(!this.isDragging) {
588
+ if (!this.isDragging) {
563
589
  return;
564
590
  }
565
591
  let updateInterval = this.updateInterval;
@@ -580,14 +606,16 @@ export default class SortableItemModifier extends Modifier {
580
606
  @private
581
607
  */
582
608
  _drop() {
583
- if (!this.element) { return; }
609
+ if (!this.element) {
610
+ return;
611
+ }
584
612
 
585
613
  let transitionPromise = this._waitForTransition();
586
614
 
587
615
  this._preventClick();
588
616
 
589
- set(this, "isDragging", false);
590
- set(this, "isDropping", true);
617
+ set(this, 'isDragging', false);
618
+ set(this, 'isDropping', true);
591
619
 
592
620
  this.sortableGroup.update();
593
621
  transitionPromise.then(() => this._complete());
@@ -638,7 +666,7 @@ export default class SortableItemModifier extends Modifier {
638
666
  });
639
667
  } else {
640
668
  const duration = this.isAnimated ? this.transitionDuration : 200;
641
- transitionPromise = new Promise((resolve) => run.later(resolve, duration));
669
+ transitionPromise = new Promise((resolve) => later(resolve, duration));
642
670
  }
643
671
 
644
672
  if (DEBUG) {
@@ -656,8 +684,8 @@ export default class SortableItemModifier extends Modifier {
656
684
  */
657
685
  _complete() {
658
686
  this.onDragStop(this.model);
659
- set(this, "isDropping", false);
660
- set(this, "wasDropped", true);
687
+ set(this, 'isDropping', false);
688
+ set(this, 'wasDropped', true);
661
689
  this.sortableGroup.commit();
662
690
  }
663
691
 
@@ -677,7 +705,7 @@ export default class SortableItemModifier extends Modifier {
677
705
  @property transitionDuration
678
706
  @type Number
679
707
  */
680
- get transitionDuration() {
708
+ get transitionDuration() {
681
709
  let el = this.element;
682
710
  let rule = getComputedStyle(el).transitionDuration;
683
711
  let match = rule.match(/([\d.]+)([ms]*)/);
@@ -771,15 +799,15 @@ export default class SortableItemModifier extends Modifier {
771
799
  }
772
800
 
773
801
  addEventListener() {
774
- this.element.addEventListener("keydown", this.keyDown);
775
- this.element.addEventListener("mousedown", this.mouseDown);
776
- this.element.addEventListener("touchstart", this.touchStart);
802
+ this.element.addEventListener('keydown', this.keyDown);
803
+ this.element.addEventListener('mousedown', this.mouseDown);
804
+ this.element.addEventListener('touchstart', this.touchStart);
777
805
  }
778
806
 
779
807
  removeEventListener() {
780
- this.element.removeEventListener("keydown", this.keyDown);
781
- this.element.removeEventListener("mousedown", this.mouseDown);
782
- this.element.removeEventListener("touchstart", this.touchStart);
808
+ this.element.removeEventListener('keydown', this.keyDown);
809
+ this.element.removeEventListener('mousedown', this.mouseDown);
810
+ this.element.removeEventListener('touchstart', this.touchStart);
783
811
  }
784
812
 
785
813
  didReceiveArguments() {
@@ -797,7 +825,7 @@ export default class SortableItemModifier extends Modifier {
797
825
 
798
826
  didInstall() {
799
827
  this.addEventListener();
800
- this.element.dataset.sortableItem=true;
828
+ this.element.dataset.sortableItem = true;
801
829
  this.sortableService.registerItem(this.groupName, this);
802
830
  }
803
831
 
@@ -805,5 +833,4 @@ export default class SortableItemModifier extends Modifier {
805
833
  this.removeEventListener();
806
834
  this.sortableService.deregisterItem(this.groupName, this);
807
835
  }
808
-
809
836
  }
@@ -1,7 +1,6 @@
1
1
  import Service from '@ember/service';
2
2
 
3
3
  export default class EmberSortableService extends Service {
4
-
5
4
  /**
6
5
  * Internal State for any groups currently in DOM
7
6
  *
@@ -13,9 +12,7 @@ export default class EmberSortableService extends Service {
13
12
  * }
14
13
  * @type {{}}
15
14
  */
16
- groups = {
17
-
18
- };
15
+ groups = {};
19
16
 
20
17
  /**
21
18
  * Register a new group with the service
@@ -27,8 +24,8 @@ export default class EmberSortableService extends Service {
27
24
  if (this.groups[groupName] === undefined) {
28
25
  this.groups[groupName] = {
29
26
  groupModifier: groupModifier,
30
- items: []
31
- }
27
+ items: [],
28
+ };
32
29
  } else {
33
30
  this.groups[groupName].groupModifier = groupModifier;
34
31
  }
@@ -17,7 +17,7 @@ function getParentElements(element) {
17
17
  export default function (element) {
18
18
  let position = getComputedStyle(element).position;
19
19
  let excludeStaticParent = position === 'absolute';
20
- let scrollParent = getParentElements(element).filter(function(parent) {
20
+ let scrollParent = getParentElements(element).filter(function (parent) {
21
21
  let parentElemStyles = getComputedStyle(parent);
22
22
  if (excludeStaticParent && parentElemStyles.position === 'static') {
23
23
  return false;
@@ -31,4 +31,4 @@ export function getX(event) {
31
31
  } else {
32
32
  return event.clientX;
33
33
  }
34
- }
34
+ }
@@ -12,6 +12,6 @@ export function getBorderSpacing(el) {
12
12
 
13
13
  return {
14
14
  horizontal: parseFloat(horizontal),
15
- vertical: parseFloat(vertical)
15
+ vertical: parseFloat(vertical),
16
16
  };
17
- }
17
+ }
@@ -4,8 +4,7 @@ export const defaultA11yAnnouncementConfig = {
4
4
 
5
5
  if (direction === 'y') {
6
6
  message += 'Press up and down keys to change position,';
7
- }
8
- else {
7
+ } else {
9
8
  message += 'Press left and right keys to change position,';
10
9
  }
11
10
 
@@ -14,7 +13,9 @@ export const defaultA11yAnnouncementConfig = {
14
13
  return message;
15
14
  },
16
15
  MOVE({ a11yItemName, index, maxLength, delta }) {
17
- return `${a11yItemName} is moved to position, ${index + 1 + delta} of ${maxLength}. Press Space to confirm new position, Escape to cancel.`;
16
+ return `${a11yItemName} is moved to position, ${
17
+ index + 1 + delta
18
+ } of ${maxLength}. Press Space to confirm new position, Escape to cancel.`;
18
19
  },
19
20
  CONFIRM({ a11yItemName }) {
20
21
  return `${a11yItemName} is successfully repositioned.`;
@@ -26,16 +26,7 @@ function createKeyTest(key, keyCode) {
26
26
  export const isEnterKey = createKeyTest(ENTER_KEY, ENTER_KEY_CODE);
27
27
  export const isEscapeKey = createKeyTest(ESCAPE_KEY, ESCAPE_KEY_CODE);
28
28
  export const isSpaceKey = createKeyTest(SPACE_KEY, SPACE_KEY_CODE);
29
- export const isLeftArrowKey = createKeyTest(
30
- ARROW_KEYS.LEFT,
31
- ARROW_KEY_CODES.LEFT
32
- );
29
+ export const isLeftArrowKey = createKeyTest(ARROW_KEYS.LEFT, ARROW_KEY_CODES.LEFT);
33
30
  export const isUpArrowKey = createKeyTest(ARROW_KEYS.UP, ARROW_KEY_CODES.UP);
34
- export const isRightArrowKey = createKeyTest(
35
- ARROW_KEYS.RIGHT,
36
- ARROW_KEY_CODES.RIGHT
37
- );
38
- export const isDownArrowKey = createKeyTest(
39
- ARROW_KEYS.DOWN,
40
- ARROW_KEY_CODES.DOWN
41
- );
31
+ export const isRightArrowKey = createKeyTest(ARROW_KEYS.RIGHT, ARROW_KEY_CODES.RIGHT);
32
+ export const isDownArrowKey = createKeyTest(ARROW_KEYS.DOWN, ARROW_KEY_CODES.DOWN);
@@ -1,4 +1,4 @@
1
- import { triggerEvent, find, settled, } from '@ember/test-helpers';
1
+ import { triggerEvent, find, settled } from '@ember/test-helpers';
2
2
  import { getOffset } from '../utils/offset';
3
3
 
4
4
  /**
@@ -26,12 +26,7 @@ import { getOffset } from '../utils/offset';
26
26
  @return {Promise}
27
27
  */
28
28
 
29
- export async function drag(
30
- mode,
31
- itemSelector,
32
- offsetFn,
33
- callbacks = {}
34
- ) {
29
+ export async function drag(mode, itemSelector, offsetFn, callbacks = {}) {
35
30
  let start;
36
31
  let move;
37
32
  let end;
@@ -62,10 +57,7 @@ export async function drag(
62
57
  // https://stackoverflow.com/a/5042051
63
58
  const dx = offset.dx || 0;
64
59
  const dy = offset.dy || 0;
65
- const clientHeight =
66
- itemElement.clientHeight ||
67
- itemElement.offsetHeight ||
68
- itemElement.parentNode.offsetHeight;
60
+ const clientHeight = itemElement.clientHeight || itemElement.offsetHeight || itemElement.parentNode.offsetHeight;
69
61
  const scale = clientHeight / (rect.bottom - rect.top);
70
62
  const halfwayX = itemOffset.left + (dx * scale) / 2;
71
63
  const halfwayY = itemOffset.top + (dy * scale) / 2;
@@ -1,7 +1,4 @@
1
1
  import { drag } from './drag';
2
2
  import { reorder } from './reorder';
3
3
 
4
- export {
5
- drag,
6
- reorder,
7
- }
4
+ export { drag, reorder };
@@ -1,11 +1,7 @@
1
1
  import { find, findAll } from '@ember/test-helpers';
2
2
  import { drag } from './drag';
3
3
  import { getOffset } from '../utils/offset';
4
- /**
5
- In tests, the dummy app is rendered at half size.
6
- To avoid rounding errors, we must therefore double
7
- the overshoot.
8
- */
4
+
9
5
  const OVERSHOOT = 2;
10
6
 
11
7
  /**
@@ -38,6 +34,8 @@ export async function reorder(mode, itemSelector, ...resultSelectors) {
38
34
  const dx = getOffset(targetElement).left - OVERSHOOT - getOffset(sourceElement).left;
39
35
  const dy = getOffset(targetElement).top - OVERSHOOT - getOffset(sourceElement).top;
40
36
 
41
- await drag(mode, sourceElement, () => { return { dx: dx, dy: dy }; });
37
+ await drag(mode, sourceElement, () => {
38
+ return { dx: dx, dy: dy };
39
+ });
42
40
  }
43
41
  }
@@ -26,16 +26,7 @@ function createKeyTest(key, keyCode) {
26
26
  export const isEnterKey = createKeyTest(ENTER_KEY, ENTER_KEY_CODE);
27
27
  export const isEscapeKey = createKeyTest(ESCAPE_KEY, ESCAPE_KEY_CODE);
28
28
  export const isSpaceKey = createKeyTest(SPACE_KEY, SPACE_KEY_CODE);
29
- export const isLeftArrowKey = createKeyTest(
30
- ARROW_KEYS.LEFT,
31
- ARROW_KEY_CODES.LEFT
32
- );
29
+ export const isLeftArrowKey = createKeyTest(ARROW_KEYS.LEFT, ARROW_KEY_CODES.LEFT);
33
30
  export const isUpArrowKey = createKeyTest(ARROW_KEYS.UP, ARROW_KEY_CODES.UP);
34
- export const isRightArrowKey = createKeyTest(
35
- ARROW_KEYS.RIGHT,
36
- ARROW_KEY_CODES.RIGHT
37
- );
38
- export const isDownArrowKey = createKeyTest(
39
- ARROW_KEYS.DOWN,
40
- ARROW_KEY_CODES.DOWN
41
- );
31
+ export const isRightArrowKey = createKeyTest(ARROW_KEYS.RIGHT, ARROW_KEY_CODES.RIGHT);
32
+ export const isDownArrowKey = createKeyTest(ARROW_KEYS.DOWN, ARROW_KEY_CODES.DOWN);
@@ -1,9 +1,9 @@
1
1
  /** Vanilla Javascript equivalent of JQuery's `.offset`.
2
- * Reference: https://github.com/nefe/You-Dont-Need-jQuery
3
- *
4
- * @method getOffset
5
- * @param {Element} el an element
6
- */
2
+ * Reference: https://github.com/nefe/You-Dont-Need-jQuery
3
+ *
4
+ * @method getOffset
5
+ * @param {Element} el an element
6
+ */
7
7
  export function getOffset(el) {
8
8
  const box = el.getBoundingClientRect();
9
9
 
@@ -11,4 +11,4 @@ export function getOffset(el) {
11
11
  top: box.top + window.pageYOffset - document.documentElement.clientTop,
12
12
  left: box.left + window.pageXOffset - document.documentElement.clientLeft,
13
13
  };
14
- }
14
+ }