ember-sortable 2.4.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +2 -2
- package/.github/workflows/github_ci.yml +15 -13
- package/CHANGELOG.md +203 -108
- package/MIGRATION_GUIDE_MODIFIERS.md +20 -13
- package/MIGRATION_GUIDE_V2.md +20 -8
- package/README.md +74 -151
- package/V2_MIGRATION_RFC.md +188 -222
- package/addon/modifiers/sortable-group.js +38 -40
- package/addon/modifiers/sortable-handle.js +16 -18
- package/addon/modifiers/sortable-item.js +101 -74
- package/addon/services/ember-sortable.js +3 -6
- package/addon/system/scroll-parent.js +1 -1
- package/addon/utils/coordinate.js +1 -1
- package/addon/utils/css-calculation.js +2 -2
- package/addon/utils/defaults.js +4 -3
- package/addon/utils/keyboard.js +3 -12
- package/addon-test-support/helpers/drag.js +3 -11
- package/addon-test-support/helpers/index.js +1 -4
- package/addon-test-support/helpers/reorder.js +4 -6
- package/addon-test-support/utils/keyboard.js +3 -12
- package/addon-test-support/utils/offset.js +6 -6
- package/config/environment.js +2 -2
- package/index.js +0 -20
- package/package.json +31 -17
- package/addon/components/sortable-group.js +0 -741
- package/addon/components/sortable-handle.js +0 -30
- package/addon/components/sortable-item.js +0 -770
- package/addon/styles/components/sortable-group.css +0 -9
- package/addon/templates/components/sortable-group.hbs +0 -16
- package/addon/templates/components/sortable-handle.hbs +0 -1
- package/addon/templates/components/sortable-item.hbs +0 -2
- package/addon/utils/transitionend.js +0 -22
- package/app/components/sortable-group.js +0 -3
- package/app/components/sortable-handle.js +0 -4
- package/app/components/sortable-item.js +0 -3
- 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 {
|
|
5
|
-
import {or} from '@ember/object/computed';
|
|
6
|
-
import {DRAG_ACTIONS, ELEMENT_CLICK_ACTION, END_ACTIONS} from "../utils/constant";
|
|
4
|
+
import { action, set } from '@ember/object';
|
|
5
|
+
import { DRAG_ACTIONS, ELEMENT_CLICK_ACTION, END_ACTIONS } from '../utils/constant';
|
|
7
6
|
import { run, throttle, bind, scheduleOnce, later } from '@ember/runloop';
|
|
8
7
|
import { DEBUG } from '@glimmer/env';
|
|
9
|
-
import {getX, getY} from
|
|
10
|
-
import ScrollContainer from
|
|
11
|
-
import scrollParent from
|
|
12
|
-
import {getBorderSpacing} from
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
@reads("sortableGroup.direction")
|
|
64
|
-
direction;
|
|
64
|
+
get model() {
|
|
65
|
+
return this.args.named.model;
|
|
66
|
+
}
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
get direction() {
|
|
69
|
+
return this.sortableGroup.direction;
|
|
70
|
+
}
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
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 ||
|
|
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
|
-
!(
|
|
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 ||
|
|
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(
|
|
178
|
+
this.element.classList.add('is-dragging');
|
|
174
179
|
} else {
|
|
175
|
-
this.element.classList.remove(
|
|
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(
|
|
219
|
+
this.element.classList.add('is-dropping');
|
|
215
220
|
} else {
|
|
216
|
-
this.element.classList.remove(
|
|
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
|
-
|
|
234
|
-
|
|
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) {
|
|
249
|
-
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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) {
|
|
333
|
+
if (this.isDisabled) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
316
336
|
|
|
317
337
|
if (this.handleElement && !startEvent.target.closest(this.handle)) {
|
|
318
338
|
return;
|
|
@@ -323,18 +343,18 @@ export default class SortableItemModifier extends Modifier {
|
|
|
323
343
|
|
|
324
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) {
|
|
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,
|
|
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) {
|
|
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;
|
|
@@ -536,7 +560,9 @@ export default class SortableItemModifier extends Modifier {
|
|
|
536
560
|
@private
|
|
537
561
|
*/
|
|
538
562
|
_applyPosition() {
|
|
539
|
-
if (!this.element || !this.element) {
|
|
563
|
+
if (!this.element || !this.element) {
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
540
566
|
|
|
541
567
|
const groupDirection = this.direction;
|
|
542
568
|
|
|
@@ -544,7 +570,7 @@ export default class SortableItemModifier extends Modifier {
|
|
|
544
570
|
let x = this.x;
|
|
545
571
|
let dx = x - this.element.offsetLeft + parseFloat(getComputedStyle(this.element).marginLeft);
|
|
546
572
|
|
|
547
|
-
this.element.style.transform = `translateX(${dx}px)`;
|
|
573
|
+
this.element.style.transform = `translateX(${Math.max(0, dx)}px)`;
|
|
548
574
|
}
|
|
549
575
|
if (groupDirection === 'y') {
|
|
550
576
|
let y = this.y;
|
|
@@ -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) {
|
|
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,
|
|
590
|
-
set(this,
|
|
617
|
+
set(this, 'isDragging', false);
|
|
618
|
+
set(this, 'isDropping', true);
|
|
591
619
|
|
|
592
620
|
this.sortableGroup.update();
|
|
593
621
|
transitionPromise.then(() => this._complete());
|
|
@@ -656,8 +684,8 @@ export default class SortableItemModifier extends Modifier {
|
|
|
656
684
|
*/
|
|
657
685
|
_complete() {
|
|
658
686
|
this.onDragStop(this.model);
|
|
659
|
-
set(this,
|
|
660
|
-
set(this,
|
|
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
|
-
|
|
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(
|
|
775
|
-
this.element.addEventListener(
|
|
776
|
-
this.element.addEventListener(
|
|
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(
|
|
781
|
-
this.element.removeEventListener(
|
|
782
|
-
this.element.removeEventListener(
|
|
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;
|
package/addon/utils/defaults.js
CHANGED
|
@@ -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, ${
|
|
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.`;
|
package/addon/utils/keyboard.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,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, () => {
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
+
}
|
package/config/environment.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
module.exports = function(environment) {
|
|
3
|
+
module.exports = function (environment) {
|
|
4
4
|
const ENV = {
|
|
5
5
|
environment,
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ module.exports = function(environment) {
|
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
|
-
}
|
|
23
|
+
};
|
|
24
24
|
|
|
25
25
|
return ENV;
|
|
26
26
|
};
|