ng-reorder
Version:
Sort elements within a list by using drag-n-drop interface without any restrictions by direction
954 lines (934 loc) • 40.6 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('@angular/common'), require('rxjs/operators')) :
typeof define === 'function' && define.amd ? define('ng-reorder', ['exports', '@angular/core', 'rxjs', '@angular/common', 'rxjs/operators'], factory) :
(global = global || self, factory(global['ng-reorder'] = {}, global.ng.core, global.rxjs, global.ng.common, global.rxjs.operators));
}(this, (function (exports, core, rxjs, common, operators) { 'use strict';
var EventService = /** @class */ (function () {
function EventService(_document, _zone) {
this._document = _document;
this._zone = _zone;
this.move = new rxjs.Subject();
this.up = new rxjs.Subject();
this.scroll = new rxjs.Subject();
this._globalListeners = new Map();
}
EventService.prototype.applyGlobalListeners = function (event) {
var _this = this;
var isMouse = event.type.startsWith('mouse');
var moveEvent = isMouse ? 'mousemove' : 'touchmove';
var endEvent = isMouse ? 'mouseup' : 'touchend';
this._globalListeners
.set('scroll', {
func: function (e) {
_this.scroll.next(e);
},
options: true
})
.set('selectstart', {
func: function (e) {
e.preventDefault();
},
options: false
})
.set(moveEvent, {
func: function (e) {
_this.move.next(e);
e.preventDefault();
},
options: { passive: false }
})
.set(endEvent, {
func: function (e) {
_this.up.next(e);
},
options: true
});
this._zone.runOutsideAngular(function () {
_this._globalListeners.forEach(function (handler, e) {
_this._document.addEventListener(e, handler.func, handler.options);
});
});
};
EventService.prototype.removeGlobalListeners = function () {
var _this = this;
this._zone.runOutsideAngular(function () {
_this._globalListeners.forEach(function (handler, event) {
_this._document.removeEventListener(event, handler.func, handler.options);
});
});
};
return EventService;
}());
EventService.decorators = [
{ type: core.Injectable }
];
EventService.ctorParameters = function () { return [
{ type: HTMLElement, decorators: [{ type: core.Inject, args: [common.DOCUMENT,] }] },
{ type: core.NgZone }
]; };
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b)
if (Object.prototype.hasOwnProperty.call(b, p))
d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function () {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); };
}
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try {
step(generator.next(value));
}
catch (e) {
reject(e);
} }
function rejected(value) { try {
step(generator["throw"](value));
}
catch (e) {
reject(e);
} }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1)
throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return { value: op[1], done: false };
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
}
catch (e) {
op = [6, e];
y = 0;
}
finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return { value: op[0] ? op[1] : void 0, done: true };
}
}
var __createBinding = Object.create ? (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
}) : (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
o[k2] = m[k];
});
function __exportStar(m, o) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
__createBinding(o, m, p);
}
function __values(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m)
return m.call(o);
if (o && typeof o.length === "number")
return {
next: function () {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
;
function __await(v) {
return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n])
i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try {
step(g[n](v));
}
catch (e) {
settle(q[0][3], e);
} }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length)
resume(q[0][0], q[0][1]); }
}
function __asyncDelegator(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
}
function __asyncValues(o) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
}
function __makeTemplateObject(cooked, raw) {
if (Object.defineProperty) {
Object.defineProperty(cooked, "raw", { value: raw });
}
else {
cooked.raw = raw;
}
return cooked;
}
;
var __setModuleDefault = Object.create ? (function (o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function (o, v) {
o["default"] = v;
};
function __importStar(mod) {
if (mod && mod.__esModule)
return mod;
var result = {};
if (mod != null)
for (var k in mod)
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
__createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
}
function __importDefault(mod) {
return (mod && mod.__esModule) ? mod : { default: mod };
}
function __classPrivateFieldGet(receiver, privateMap) {
if (!privateMap.has(receiver)) {
throw new TypeError("attempted to get private field on non-instance");
}
return privateMap.get(receiver);
}
function __classPrivateFieldSet(receiver, privateMap, value) {
if (!privateMap.has(receiver)) {
throw new TypeError("attempted to set private field on non-instance");
}
privateMap.set(receiver, value);
return value;
}
/**
* @param array array to reorder
* @param begin the index which is moving in the array
* @param end the index where the array[begin] is moving to
*/
function reorderItems(array, begin, end) {
if (array.length === 0) {
return;
}
begin = fit(begin, array.length - 1);
end = fit(end, array.length - 1);
if (begin === end || end === -1 || begin === -1) {
return array;
}
var shift = begin < end ? 1 : -1;
var anchor = array[begin];
for (var i = begin; i !== end; i += shift) {
array[i] = array[i + shift];
}
array[end] = anchor;
return array;
}
/**
* @param array array to reorder
* @param a the index of first element
* @param b the index of second element
*/
function swapItems(array, a, b) {
var _a;
_a = __read([array[b], array[a]], 2), array[a] = _a[0], array[b] = _a[1];
return array;
}
/** To ensure to get a number not less than zero and not greater than a given max value
* @param value number to check
* @param max max value
*/
function fit(value, max) {
if (isNaN(value) || value === null) {
return -1;
}
return Math.max(0, Math.min(value, max));
}
/** Whether the event is touch or not */
function isTouchEvent(event) {
return event.type[0] === 't';
}
/** Returns { 0, 0 } point */
function createPoint() {
return { x: 0, y: 0 };
}
/**
* Returns the sum of two points
* @param first first point
* @param second second point
*/
function pointSum(first, second) {
return {
x: first.x + second.x,
y: first.y + second.y
};
}
/**
* Returns the difference between two points
* @param first first point
* @param second second point
*/
function pointDif(first, second) {
return {
x: first.x - second.x,
y: first.y - second.y
};
}
/**
* Returns point from pointer event
* @param event Mouse or Touch event
*/
function pointFromPointerEvent(event) {
var $ = isTouchEvent(event) ? event.targetTouches[0] : event;
return {
x: $.clientX,
y: $.clientY
};
}
/**
* Returns time of a transition of a speciphic property in miliseconds.
* @param element DOM element to check
* @param property required CSS property
* @param includeAll include or not the "all" property. By default true
*/
function transitionTimeOf(element, property, includeAll) {
var _a;
if (includeAll === void 0) { includeAll = true; }
var style = getComputedStyle(element);
var properties = style.transitionProperty.split(',');
// filter for the 'all' property
var target = function ($) {
if (includeAll) {
return $ === property || $ === 'all';
}
else {
return $ === property;
}
};
var foundProperty = properties.find(target);
// If no fouded property returns zero
if (!foundProperty) {
return 0;
}
var index = properties.indexOf(foundProperty);
var delay = style.transitionDelay.split(',')[index];
var duration = style.transitionDuration.split(',')[index];
// Destructuring assignment.
// Next lines check whether the values in ms and return parsed time in ms
_a = __read([delay, duration].map(function ($) {
var k = $.toLowerCase().indexOf('ms') !== -1 ? 1 : 1000;
return parseFloat($) * k;
}), 2), delay = _a[0], duration = _a[1];
return delay + duration;
}
var DRAG_UNIT_PARENT = new core.InjectionToken('Parent');
var DragHandleDirective = /** @class */ (function () {
function DragHandleDirective(_parent, _host) {
this._parent = _parent;
this._host = _host;
}
/** @returns true if the hanlde is equal to an element */
DragHandleDirective.prototype.is = function (element) {
return this._host.nativeElement === element || this._host.nativeElement.contains(element);
};
return DragHandleDirective;
}());
DragHandleDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[dragHandle]'
},] }
];
DragHandleDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: core.Inject, args: [DRAG_UNIT_PARENT,] }, { type: core.SkipSelf }] },
{ type: core.ElementRef }
]; };
var DragRejectorDirective = /** @class */ (function () {
function DragRejectorDirective(_parent, _host) {
this._parent = _parent;
this._host = _host;
}
/** @returns true if the rejector is equal to an element */
DragRejectorDirective.prototype.is = function (element) {
return this._host.nativeElement === element || this._host.nativeElement.contains(element);
};
return DragRejectorDirective;
}());
DragRejectorDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[dragRejector]'
},] }
];
DragRejectorDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: core.Inject, args: [DRAG_UNIT_PARENT,] }, { type: core.SkipSelf }] },
{ type: core.ElementRef }
]; };
var DRAG_COLLECTION = new core.InjectionToken('Container');
var DragUnitDirective = /** @class */ (function () {
function DragUnitDirective(container, eventService, _host, _zone) {
this.container = container;
this.eventService = eventService;
this._host = _host;
this._zone = _zone;
/** Emits when the element is successfully touched */
this.unitTaken = new core.EventEmitter();
/** Emits when the element is released */
this.unitReleased = new core.EventEmitter();
/** Emits when the element is moved on the page */
this.unitMoved = new core.EventEmitter();
// Indicate if the element is dragging or not
this._active = false;
// Indicate if the element is dropped
this._droppped = false;
/** Emits when the element is destroyed */
this._destroy = new rxjs.Subject();
this._moveSubscribtion = rxjs.Subscription.EMPTY;
this._upSubscription = rxjs.Subscription.EMPTY;
this._scrollSubscription = rxjs.Subscription.EMPTY;
this._origin = this._offset = this._scrollOrigin = this._scrollOffset = createPoint();
}
Object.defineProperty(DragUnitDirective.prototype, "active", {
get: function () {
return this._active;
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragUnitDirective.prototype, "dropped", {
get: function () {
return this._droppped;
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragUnitDirective.prototype, "disabled", {
get: function () {
return this._disabled;
},
enumerable: false,
configurable: true
});
DragUnitDirective.prototype.ngAfterViewInit = function () {
var _this = this;
['mousedown', 'touchstart'].forEach(function (e) {
_this._host.nativeElement.addEventListener(e, _this._pointerDown.bind(_this), { passive: false, capture: true });
});
};
DragUnitDirective.prototype.ngOnDestroy = function () {
this._destroy.next();
this._destroy.complete();
};
DragUnitDirective.prototype.applyTransformation = function (shift) {
if (shift.x === 0 && shift.y === 0) {
this._host.nativeElement.style.transform = '';
return;
}
this._host.nativeElement.style.transform = "translate(" + shift.x + "px, " + shift.y + "px)";
};
DragUnitDirective.prototype.getRect = function () {
return this._host.nativeElement.getBoundingClientRect();
};
DragUnitDirective.prototype.reset = function () {
this._host.nativeElement.style.transform = null;
this._active = false;
this._droppped = false;
this._offset = this._origin = this._scrollOrigin = this._scrollOffset = this._pointerPosition = { x: 0, y: 0 };
};
DragUnitDirective.prototype.setOffset = function (point) {
this._offset = point;
};
DragUnitDirective.prototype._animateDroppedElement = function () {
var _this = this;
return new Promise(function (resolve, reject) {
_this._zone.onStable.asObservable().pipe(operators.first()).subscribe(resolve);
});
};
DragUnitDirective.prototype._initDragSequence = function (event) {
var _this = this;
this.eventService.applyGlobalListeners(event);
this._scrollOrigin = { x: document.defaultView.scrollX, y: document.defaultView.scrollY };
this._moveSubscribtion = this.eventService.move
.pipe(operators.takeUntil(this._destroy), operators.tap(function (e) {
_this._zone.run(function () { return _this._pointerMove(e); });
})).subscribe();
this._upSubscription = this.eventService.up
.pipe(operators.takeUntil(this._destroy), operators.tap(function (e) {
_this._zone.run(function () { return _this._pointerUp(e); });
})).subscribe();
this._scrollSubscription = this.eventService.scroll
.pipe(operators.takeUntil(this._destroy), operators.tap(function (e) {
_this._zone.run(function () { return _this._viewScroll(); });
})).subscribe();
return;
};
DragUnitDirective.prototype._viewScroll = function () {
var view = document.defaultView;
var currentScroll = { x: view.scrollX, y: view.scrollY };
this._scrollOffset = pointDif(currentScroll, this._scrollOrigin);
var point = pointSum(this._pointerPosition, this._scrollOffset);
this.applyTransformation(pointDif(point, this._origin));
};
DragUnitDirective.prototype._startDragSequence = function (event) {
if (this.container.disabled || this._disabled)
return;
event.stopPropagation();
this._initDragSequence(event);
this._origin = this._pointerPosition = pointFromPointerEvent(event);
this._active = true;
this.container.start(this, this._origin);
this.unitTaken.emit({
unit: this,
event: event
});
};
DragUnitDirective.prototype._stopDragSequence = function () {
var _this = this;
this._moveSubscribtion.unsubscribe();
this._upSubscription.unsubscribe();
this._scrollSubscription.unsubscribe();
var delay = transitionTimeOf(this._host.nativeElement, 'transform');
setTimeout(function () {
_this.container.stop(_this);
_this.eventService.removeGlobalListeners();
}, delay * 1.5);
};
DragUnitDirective.prototype._pointerDown = function (event) {
var _this = this;
if (this.container.inAction)
return;
var target = event.target;
if (this._rejectors.length && this._rejectors.find(function (rejector) { return rejector.is(target); }))
return;
else if (this._handles.length && !this._handles.find(function (handle) { return handle.is(target); }))
return;
else if (true)
this._zone.run(function () { return _this._startDragSequence(event); });
return;
};
DragUnitDirective.prototype._pointerMove = function (event) {
this._pointerPosition = pointFromPointerEvent(event);
var point = pointSum(this._pointerPosition, this._scrollOffset);
this.applyTransformation(pointDif(point, this._origin));
this.container.moveUnitTo(this, point);
this.unitMoved.emit({
unit: this,
distance: pointDif(point, this._origin),
event: event
});
};
DragUnitDirective.prototype._pointerUp = function (event) {
this._active = false;
this.applyTransformation(this._offset);
this._droppped = true;
this._animateDroppedElement().then(this._stopDragSequence.bind(this));
this.unitReleased.emit({
unit: this,
event: event
});
};
return DragUnitDirective;
}());
DragUnitDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[dragUnit]',
providers: [
{ provide: DRAG_UNIT_PARENT, useExisting: DragUnitDirective }
],
host: {
'[class.drag-unit]': 'true',
'[class.active]': 'active',
'[class.dropped]': 'dropped',
'[class.disabled]': 'disabled'
}
},] }
];
DragUnitDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: core.Inject, args: [DRAG_COLLECTION,] }, { type: core.SkipSelf }] },
{ type: EventService, decorators: [{ type: core.SkipSelf }] },
{ type: core.ElementRef },
{ type: core.NgZone }
]; };
DragUnitDirective.propDecorators = {
_disabled: [{ type: core.Input, args: ['disabled',] }],
unitTaken: [{ type: core.Output }],
unitReleased: [{ type: core.Output }],
unitMoved: [{ type: core.Output }],
_handles: [{ type: core.ContentChildren, args: [DragHandleDirective, { descendants: true },] }],
_rejectors: [{ type: core.ContentChildren, args: [DragRejectorDirective, { descendants: true },] }]
};
var SortService = /** @class */ (function () {
function SortService() {
this._listOfPositions = null;
this._from = null;
this._to = null;
}
SortService.prototype.cachePosition = function (unit) {
this._listOfPositions.push(this.getPosition(unit));
};
SortService.prototype.findIndex = function (point) {
var e_1, _a;
try {
for (var _b = __values(this._listOfPositions), _c = _b.next(); !_c.done; _c = _b.next()) {
var $ = _c.value;
var left = point.x > $.rect.left + $.shift.x;
var right = point.x < $.rect.right + $.shift.x;
var top = point.y > $.rect.top + $.shift.y;
var bottom = point.y < $.rect.bottom + $.shift.y;
if (left && right && top && bottom) {
return this._listOfPositions.indexOf($);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return -1;
};
SortService.prototype.getPosition = function (unit) {
return {
unit: unit,
rect: unit.getRect(),
shift: createPoint()
};
};
SortService.prototype.initService = function (container) {
this._root = container;
};
SortService.prototype.cacheAllPositions = function () {
var _this = this;
this._listOfPositions = new Array();
this._root.units.forEach(function (unit) { return _this.cachePosition(unit); });
};
SortService.prototype.moveUnits = function (unit, point) {
var elements = this._listOfPositions;
var oldIndex = elements.map(function (i) { return i.unit; }).indexOf(unit);
var newIndex = this.findIndex(point);
if (oldIndex === -1 || newIndex === -1 || newIndex === oldIndex || this._from === null) {
return;
}
this._to = newIndex;
var newPosition = {
x: elements[newIndex].rect.left + elements[newIndex].shift.x,
y: elements[newIndex].rect.top + elements[newIndex].shift.y
};
var step = newIndex > oldIndex ? -1 : 1;
for (var current = newIndex; current !== oldIndex; current += step) {
var next = current + step;
var shift = {
x: (elements[next].rect.left + elements[next].shift.x) - (elements[current].rect.left + elements[current].shift.x),
y: (elements[next].rect.top + elements[next].shift.y) - (elements[current].rect.top + elements[current].shift.y)
};
elements[current].shift.x += shift.x;
elements[current].shift.y += shift.y;
elements[current].unit.applyTransformation(elements[current].shift);
}
elements[oldIndex].shift.x = (newPosition.x - elements[oldIndex].rect.left);
elements[oldIndex].shift.y = (newPosition.y - elements[oldIndex].rect.top);
unit.setOffset(elements[oldIndex].shift);
this._listOfPositions = elements;
this._listOfPositions = reorderItems(this._listOfPositions, oldIndex, newIndex);
};
SortService.prototype.start = function (units, point, from) {
this.cacheAllPositions();
this._from = from;
};
SortService.prototype.stop = function (unit) {
var _this = this;
return new Promise(function (resolve) {
var $ = {
collection: _this._root,
unit: unit,
previousIndex: _this._from,
currentIndex: _this._to
};
resolve($);
_this._listOfPositions = null;
_this._from = null;
_this._to = null;
});
};
return SortService;
}());
SortService.decorators = [
{ type: core.Injectable }
];
SortService.ctorParameters = function () { return []; };
var DragCollectionDirective = /** @class */ (function () {
function DragCollectionDirective(_zone, sortService) {
this._zone = _zone;
this.sortService = sortService;
this.dropCompleted = new core.EventEmitter();
this._activeItem = null;
}
Object.defineProperty(DragCollectionDirective.prototype, "inAction", {
get: function () {
return this._activeItem !== null;
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragCollectionDirective.prototype, "disabled", {
get: function () {
return this._disabled;
},
enumerable: false,
configurable: true
});
DragCollectionDirective.prototype.ngAfterViewInit = function () {
this.sortService.initService(this);
};
DragCollectionDirective.prototype.clearChildren = function () {
var _this = this;
this._zone.run(function () {
_this.units.toArray().forEach(function (unit) { return unit.reset(); });
});
};
DragCollectionDirective.prototype.moveUnitTo = function (unit, point) {
this.sortService.moveUnits(unit, point);
};
DragCollectionDirective.prototype.start = function (unit, point) {
var units = this.units.toArray();
var from = units.indexOf(unit);
this.sortService.start(units, point, from);
this._activeItem = unit;
};
DragCollectionDirective.prototype.stop = function (unit) {
var _this = this;
this.clearChildren();
this.sortService.stop(unit).then(function (e) {
if (e.currentIndex !== null)
_this.dropCompleted.emit(e);
});
this._activeItem = null;
};
return DragCollectionDirective;
}());
DragCollectionDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[dragCollection]',
providers: [
{ provide: DRAG_COLLECTION, useExisting: DragCollectionDirective },
EventService,
SortService
],
host: {
'[class.collection]': 'true',
'[class.in-action]': 'inAction',
'[class.disabled]': 'disabled'
}
},] }
];
DragCollectionDirective.ctorParameters = function () { return [
{ type: core.NgZone },
{ type: SortService, decorators: [{ type: core.Self }] }
]; };
DragCollectionDirective.propDecorators = {
_disabled: [{ type: core.Input, args: ['disabled',] }],
dropCompleted: [{ type: core.Output }],
units: [{ type: core.ContentChildren, args: [DragUnitDirective,] }]
};
var NgReorderModule = /** @class */ (function () {
function NgReorderModule() {
}
return NgReorderModule;
}());
NgReorderModule.decorators = [
{ type: core.NgModule, args: [{
declarations: [
DragCollectionDirective,
DragUnitDirective,
DragHandleDirective,
DragRejectorDirective,
],
imports: [],
exports: [DragCollectionDirective, DragUnitDirective, DragHandleDirective, DragRejectorDirective]
},] }
];
/*
* Public API Surface of ng-reorder
*/
/**
* Generated bundle index. Do not edit.
*/
exports.DragCollectionDirective = DragCollectionDirective;
exports.DragHandleDirective = DragHandleDirective;
exports.DragRejectorDirective = DragRejectorDirective;
exports.DragUnitDirective = DragUnitDirective;
exports.NgReorderModule = NgReorderModule;
exports.createPoint = createPoint;
exports.pointDif = pointDif;
exports.pointFromPointerEvent = pointFromPointerEvent;
exports.pointSum = pointSum;
exports.reorderItems = reorderItems;
exports.ɵa = DRAG_COLLECTION;
exports.ɵc = EventService;
exports.ɵd = SortService;
exports.ɵe = DRAG_UNIT_PARENT;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=ng-reorder.umd.js.map