gridstack
Version:
TypeScript/JS lib for dashboard layout and creation, responsive, mobile support, no external dependencies, with many wrappers (React, Angular, Vue, Ember, knockout...)
117 lines • 5.09 kB
JavaScript
"use strict";
/**
* dd-resizable-handle.ts 12.0.0
* Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DDResizableHandle = void 0;
var dd_touch_1 = require("./dd-touch");
var DDResizableHandle = exports.DDResizableHandle = /** @class */ (function () {
function DDResizableHandle(host, dir, option) {
this.host = host;
this.dir = dir;
this.option = option;
/** @internal true after we've moved enough pixels to start a resize */
this.moving = false;
// create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)
this._mouseDown = this._mouseDown.bind(this);
this._mouseMove = this._mouseMove.bind(this);
this._mouseUp = this._mouseUp.bind(this);
this._keyEvent = this._keyEvent.bind(this);
this._init();
}
/** @internal */
DDResizableHandle.prototype._init = function () {
var el = this.el = document.createElement('div');
el.classList.add('ui-resizable-handle');
el.classList.add("".concat(DDResizableHandle.prefix).concat(this.dir));
el.style.zIndex = '100';
el.style.userSelect = 'none';
this.host.appendChild(this.el);
this.el.addEventListener('mousedown', this._mouseDown);
if (dd_touch_1.isTouch) {
this.el.addEventListener('touchstart', dd_touch_1.touchstart);
this.el.addEventListener('pointerdown', dd_touch_1.pointerdown);
// this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment
}
return this;
};
/** call this when resize handle needs to be removed and cleaned up */
DDResizableHandle.prototype.destroy = function () {
if (this.moving)
this._mouseUp(this.mouseDownEvent);
this.el.removeEventListener('mousedown', this._mouseDown);
if (dd_touch_1.isTouch) {
this.el.removeEventListener('touchstart', dd_touch_1.touchstart);
this.el.removeEventListener('pointerdown', dd_touch_1.pointerdown);
}
this.host.removeChild(this.el);
delete this.el;
delete this.host;
return this;
};
/** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */
DDResizableHandle.prototype._mouseDown = function (e) {
this.mouseDownEvent = e;
document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true }); // capture, not bubble
document.addEventListener('mouseup', this._mouseUp, true);
if (dd_touch_1.isTouch) {
this.el.addEventListener('touchmove', dd_touch_1.touchmove);
this.el.addEventListener('touchend', dd_touch_1.touchend);
}
e.stopPropagation();
e.preventDefault();
};
/** @internal */
DDResizableHandle.prototype._mouseMove = function (e) {
var s = this.mouseDownEvent;
if (this.moving) {
this._triggerEvent('move', e);
}
else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {
// don't start unless we've moved at least 3 pixels
this.moving = true;
this._triggerEvent('start', this.mouseDownEvent);
this._triggerEvent('move', e);
// now track keyboard events to cancel
document.addEventListener('keydown', this._keyEvent);
}
e.stopPropagation();
// e.preventDefault(); passive = true
};
/** @internal */
DDResizableHandle.prototype._mouseUp = function (e) {
if (this.moving) {
this._triggerEvent('stop', e);
document.removeEventListener('keydown', this._keyEvent);
}
document.removeEventListener('mousemove', this._mouseMove, true);
document.removeEventListener('mouseup', this._mouseUp, true);
if (dd_touch_1.isTouch) {
this.el.removeEventListener('touchmove', dd_touch_1.touchmove);
this.el.removeEventListener('touchend', dd_touch_1.touchend);
}
delete this.moving;
delete this.mouseDownEvent;
e.stopPropagation();
e.preventDefault();
};
/** @internal call when keys are being pressed - use Esc to cancel */
DDResizableHandle.prototype._keyEvent = function (e) {
var _a, _b;
if (e.key === 'Escape') {
(_b = (_a = this.host.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid) === null || _b === void 0 ? void 0 : _b.engine.restoreInitial();
this._mouseUp(this.mouseDownEvent);
}
};
/** @internal */
DDResizableHandle.prototype._triggerEvent = function (name, event) {
if (this.option[name])
this.option[name](event);
return this;
};
/** @internal */
DDResizableHandle.prefix = 'ui-resizable-';
return DDResizableHandle;
}());
//# sourceMappingURL=dd-resizable-handle.js.map