859 lines
35 KiB
JavaScript
859 lines
35 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
|
|
var React = require('react');
|
|
var memoize = _interopDefault(require('fast-memoize'));
|
|
|
|
/*! *****************************************************************************
|
|
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);
|
|
};
|
|
|
|
var styles = {
|
|
top: {
|
|
width: '100%',
|
|
height: '10px',
|
|
top: '-5px',
|
|
left: '0px',
|
|
cursor: 'row-resize',
|
|
},
|
|
right: {
|
|
width: '10px',
|
|
height: '100%',
|
|
top: '0px',
|
|
right: '-5px',
|
|
cursor: 'col-resize',
|
|
},
|
|
bottom: {
|
|
width: '100%',
|
|
height: '10px',
|
|
bottom: '-5px',
|
|
left: '0px',
|
|
cursor: 'row-resize',
|
|
},
|
|
left: {
|
|
width: '10px',
|
|
height: '100%',
|
|
top: '0px',
|
|
left: '-5px',
|
|
cursor: 'col-resize',
|
|
},
|
|
topRight: {
|
|
width: '20px',
|
|
height: '20px',
|
|
position: 'absolute',
|
|
right: '-10px',
|
|
top: '-10px',
|
|
cursor: 'ne-resize',
|
|
},
|
|
bottomRight: {
|
|
width: '20px',
|
|
height: '20px',
|
|
position: 'absolute',
|
|
right: '-10px',
|
|
bottom: '-10px',
|
|
cursor: 'se-resize',
|
|
},
|
|
bottomLeft: {
|
|
width: '20px',
|
|
height: '20px',
|
|
position: 'absolute',
|
|
left: '-10px',
|
|
bottom: '-10px',
|
|
cursor: 'sw-resize',
|
|
},
|
|
topLeft: {
|
|
width: '20px',
|
|
height: '20px',
|
|
position: 'absolute',
|
|
left: '-10px',
|
|
top: '-10px',
|
|
cursor: 'nw-resize',
|
|
},
|
|
};
|
|
var Resizer = /** @class */ (function (_super) {
|
|
__extends(Resizer, _super);
|
|
function Resizer() {
|
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
_this.onMouseDown = function (e) {
|
|
_this.props.onResizeStart(e, _this.props.direction);
|
|
};
|
|
_this.onTouchStart = function (e) {
|
|
_this.props.onResizeStart(e, _this.props.direction);
|
|
};
|
|
return _this;
|
|
}
|
|
Resizer.prototype.render = function () {
|
|
return (React.createElement("div", { className: this.props.className || '', style: __assign(__assign({ position: 'absolute', userSelect: 'none' }, styles[this.props.direction]), (this.props.replaceStyles || {})), onMouseDown: this.onMouseDown, onTouchStart: this.onTouchStart }, this.props.children));
|
|
};
|
|
return Resizer;
|
|
}(React.PureComponent));
|
|
|
|
var DEFAULT_SIZE = {
|
|
width: 'auto',
|
|
height: 'auto',
|
|
};
|
|
var clamp = memoize(function (n, min, max) { return Math.max(Math.min(n, max), min); });
|
|
var snap = memoize(function (n, size) { return Math.round(n / size) * size; });
|
|
var hasDirection = memoize(function (dir, target) {
|
|
return new RegExp(dir, 'i').test(target);
|
|
});
|
|
// INFO: In case of window is a Proxy and does not porxy Events correctly, use isTouchEvent & isMouseEvent to distinguish event type instead of `instanceof`.
|
|
var isTouchEvent = function (event) {
|
|
return Boolean(event.touches && event.touches.length);
|
|
};
|
|
var isMouseEvent = function (event) {
|
|
return Boolean((event.clientX || event.clientX === 0) &&
|
|
(event.clientY || event.clientY === 0));
|
|
};
|
|
var findClosestSnap = memoize(function (n, snapArray, snapGap) {
|
|
if (snapGap === void 0) { snapGap = 0; }
|
|
var closestGapIndex = snapArray.reduce(function (prev, curr, index) { return (Math.abs(curr - n) < Math.abs(snapArray[prev] - n) ? index : prev); }, 0);
|
|
var gap = Math.abs(snapArray[closestGapIndex] - n);
|
|
return snapGap === 0 || gap < snapGap ? snapArray[closestGapIndex] : n;
|
|
});
|
|
var endsWith = memoize(function (str, searchStr) {
|
|
return str.substr(str.length - searchStr.length, searchStr.length) === searchStr;
|
|
});
|
|
var getStringSize = memoize(function (n) {
|
|
n = n.toString();
|
|
if (n === 'auto') {
|
|
return n;
|
|
}
|
|
if (endsWith(n, 'px')) {
|
|
return n;
|
|
}
|
|
if (endsWith(n, '%')) {
|
|
return n;
|
|
}
|
|
if (endsWith(n, 'vh')) {
|
|
return n;
|
|
}
|
|
if (endsWith(n, 'vw')) {
|
|
return n;
|
|
}
|
|
if (endsWith(n, 'vmax')) {
|
|
return n;
|
|
}
|
|
if (endsWith(n, 'vmin')) {
|
|
return n;
|
|
}
|
|
return n + "px";
|
|
});
|
|
var getPixelSize = function (size, parentSize, innerWidth, innerHeight) {
|
|
if (size && typeof size === 'string') {
|
|
if (endsWith(size, 'px')) {
|
|
return Number(size.replace('px', ''));
|
|
}
|
|
if (endsWith(size, '%')) {
|
|
var ratio = Number(size.replace('%', '')) / 100;
|
|
return parentSize * ratio;
|
|
}
|
|
if (endsWith(size, 'vw')) {
|
|
var ratio = Number(size.replace('vw', '')) / 100;
|
|
return innerWidth * ratio;
|
|
}
|
|
if (endsWith(size, 'vh')) {
|
|
var ratio = Number(size.replace('vh', '')) / 100;
|
|
return innerHeight * ratio;
|
|
}
|
|
}
|
|
return size;
|
|
};
|
|
var calculateNewMax = memoize(function (parentSize, innerWidth, innerHeight, maxWidth, maxHeight, minWidth, minHeight) {
|
|
maxWidth = getPixelSize(maxWidth, parentSize.width, innerWidth, innerHeight);
|
|
maxHeight = getPixelSize(maxHeight, parentSize.height, innerWidth, innerHeight);
|
|
minWidth = getPixelSize(minWidth, parentSize.width, innerWidth, innerHeight);
|
|
minHeight = getPixelSize(minHeight, parentSize.height, innerWidth, innerHeight);
|
|
return {
|
|
maxWidth: typeof maxWidth === 'undefined' ? undefined : Number(maxWidth),
|
|
maxHeight: typeof maxHeight === 'undefined' ? undefined : Number(maxHeight),
|
|
minWidth: typeof minWidth === 'undefined' ? undefined : Number(minWidth),
|
|
minHeight: typeof minHeight === 'undefined' ? undefined : Number(minHeight),
|
|
};
|
|
});
|
|
var definedProps = [
|
|
'as',
|
|
'style',
|
|
'className',
|
|
'grid',
|
|
'snap',
|
|
'bounds',
|
|
'boundsByDirection',
|
|
'size',
|
|
'defaultSize',
|
|
'minWidth',
|
|
'minHeight',
|
|
'maxWidth',
|
|
'maxHeight',
|
|
'lockAspectRatio',
|
|
'lockAspectRatioExtraWidth',
|
|
'lockAspectRatioExtraHeight',
|
|
'enable',
|
|
'handleStyles',
|
|
'handleClasses',
|
|
'handleWrapperStyle',
|
|
'handleWrapperClass',
|
|
'children',
|
|
'onResizeStart',
|
|
'onResize',
|
|
'onResizeStop',
|
|
'handleComponent',
|
|
'scale',
|
|
'resizeRatio',
|
|
'snapGap',
|
|
];
|
|
// HACK: This class is used to calculate % size.
|
|
var baseClassName = '__resizable_base__';
|
|
var Resizable = /** @class */ (function (_super) {
|
|
__extends(Resizable, _super);
|
|
function Resizable(props) {
|
|
var _this = _super.call(this, props) || this;
|
|
_this.ratio = 1;
|
|
_this.resizable = null;
|
|
// For parent boundary
|
|
_this.parentLeft = 0;
|
|
_this.parentTop = 0;
|
|
// For boundary
|
|
_this.resizableLeft = 0;
|
|
_this.resizableRight = 0;
|
|
_this.resizableTop = 0;
|
|
_this.resizableBottom = 0;
|
|
// For target boundary
|
|
_this.targetLeft = 0;
|
|
_this.targetTop = 0;
|
|
_this.appendBase = function () {
|
|
if (!_this.resizable || !_this.window) {
|
|
return null;
|
|
}
|
|
var parent = _this.parentNode;
|
|
if (!parent) {
|
|
return null;
|
|
}
|
|
var element = _this.window.document.createElement('div');
|
|
element.style.width = '100%';
|
|
element.style.height = '100%';
|
|
element.style.position = 'absolute';
|
|
element.style.transform = 'scale(0, 0)';
|
|
element.style.left = '0';
|
|
element.style.flex = '0 0 100%';
|
|
if (element.classList) {
|
|
element.classList.add(baseClassName);
|
|
}
|
|
else {
|
|
element.className += baseClassName;
|
|
}
|
|
parent.appendChild(element);
|
|
return element;
|
|
};
|
|
_this.removeBase = function (base) {
|
|
var parent = _this.parentNode;
|
|
if (!parent) {
|
|
return;
|
|
}
|
|
parent.removeChild(base);
|
|
};
|
|
_this.ref = function (c) {
|
|
if (c) {
|
|
_this.resizable = c;
|
|
}
|
|
};
|
|
_this.state = {
|
|
isResizing: false,
|
|
width: typeof (_this.propsSize && _this.propsSize.width) === 'undefined'
|
|
? 'auto'
|
|
: _this.propsSize && _this.propsSize.width,
|
|
height: typeof (_this.propsSize && _this.propsSize.height) === 'undefined'
|
|
? 'auto'
|
|
: _this.propsSize && _this.propsSize.height,
|
|
direction: 'right',
|
|
original: {
|
|
x: 0,
|
|
y: 0,
|
|
width: 0,
|
|
height: 0,
|
|
},
|
|
backgroundStyle: {
|
|
height: '100%',
|
|
width: '100%',
|
|
backgroundColor: 'rgba(0,0,0,0)',
|
|
cursor: 'auto',
|
|
opacity: 0,
|
|
position: 'fixed',
|
|
zIndex: 9999,
|
|
top: '0',
|
|
left: '0',
|
|
bottom: '0',
|
|
right: '0',
|
|
},
|
|
flexBasis: undefined,
|
|
};
|
|
_this.onResizeStart = _this.onResizeStart.bind(_this);
|
|
_this.onMouseMove = _this.onMouseMove.bind(_this);
|
|
_this.onMouseUp = _this.onMouseUp.bind(_this);
|
|
return _this;
|
|
}
|
|
Object.defineProperty(Resizable.prototype, "parentNode", {
|
|
get: function () {
|
|
if (!this.resizable) {
|
|
return null;
|
|
}
|
|
return this.resizable.parentNode;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Resizable.prototype, "window", {
|
|
get: function () {
|
|
if (!this.resizable) {
|
|
return null;
|
|
}
|
|
if (!this.resizable.ownerDocument) {
|
|
return null;
|
|
}
|
|
return this.resizable.ownerDocument.defaultView;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Resizable.prototype, "propsSize", {
|
|
get: function () {
|
|
return this.props.size || this.props.defaultSize || DEFAULT_SIZE;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Resizable.prototype, "size", {
|
|
get: function () {
|
|
var width = 0;
|
|
var height = 0;
|
|
if (this.resizable && this.window) {
|
|
var orgWidth = this.resizable.offsetWidth;
|
|
var orgHeight = this.resizable.offsetHeight;
|
|
// HACK: Set position `relative` to get parent size.
|
|
// This is because when re-resizable set `absolute`, I can not get base width correctly.
|
|
var orgPosition = this.resizable.style.position;
|
|
if (orgPosition !== 'relative') {
|
|
this.resizable.style.position = 'relative';
|
|
}
|
|
// INFO: Use original width or height if set auto.
|
|
width = this.resizable.style.width !== 'auto' ? this.resizable.offsetWidth : orgWidth;
|
|
height = this.resizable.style.height !== 'auto' ? this.resizable.offsetHeight : orgHeight;
|
|
// Restore original position
|
|
this.resizable.style.position = orgPosition;
|
|
}
|
|
return { width: width, height: height };
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Resizable.prototype, "sizeStyle", {
|
|
get: function () {
|
|
var _this = this;
|
|
var size = this.props.size;
|
|
var getSize = function (key) {
|
|
if (typeof _this.state[key] === 'undefined' || _this.state[key] === 'auto') {
|
|
return 'auto';
|
|
}
|
|
if (_this.propsSize && _this.propsSize[key] && endsWith(_this.propsSize[key].toString(), '%')) {
|
|
if (endsWith(_this.state[key].toString(), '%')) {
|
|
return _this.state[key].toString();
|
|
}
|
|
var parentSize = _this.getParentSize();
|
|
var value = Number(_this.state[key].toString().replace('px', ''));
|
|
var percent = (value / parentSize[key]) * 100;
|
|
return percent + "%";
|
|
}
|
|
return getStringSize(_this.state[key]);
|
|
};
|
|
var width = size && typeof size.width !== 'undefined' && !this.state.isResizing
|
|
? getStringSize(size.width)
|
|
: getSize('width');
|
|
var height = size && typeof size.height !== 'undefined' && !this.state.isResizing
|
|
? getStringSize(size.height)
|
|
: getSize('height');
|
|
return { width: width, height: height };
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Resizable.prototype.getParentSize = function () {
|
|
if (!this.parentNode) {
|
|
if (!this.window) {
|
|
return { width: 0, height: 0 };
|
|
}
|
|
return { width: this.window.innerWidth, height: this.window.innerHeight };
|
|
}
|
|
var base = this.appendBase();
|
|
if (!base) {
|
|
return { width: 0, height: 0 };
|
|
}
|
|
// INFO: To calculate parent width with flex layout
|
|
var wrapChanged = false;
|
|
var wrap = this.parentNode.style.flexWrap;
|
|
if (wrap !== 'wrap') {
|
|
wrapChanged = true;
|
|
this.parentNode.style.flexWrap = 'wrap';
|
|
// HACK: Use relative to get parent padding size
|
|
}
|
|
base.style.position = 'relative';
|
|
base.style.minWidth = '100%';
|
|
base.style.minHeight = '100%';
|
|
var size = {
|
|
width: base.offsetWidth,
|
|
height: base.offsetHeight,
|
|
};
|
|
if (wrapChanged) {
|
|
this.parentNode.style.flexWrap = wrap;
|
|
}
|
|
this.removeBase(base);
|
|
return size;
|
|
};
|
|
Resizable.prototype.bindEvents = function () {
|
|
if (this.window) {
|
|
this.window.addEventListener('mouseup', this.onMouseUp);
|
|
this.window.addEventListener('mousemove', this.onMouseMove);
|
|
this.window.addEventListener('mouseleave', this.onMouseUp);
|
|
this.window.addEventListener('touchmove', this.onMouseMove, {
|
|
capture: true,
|
|
passive: false,
|
|
});
|
|
this.window.addEventListener('touchend', this.onMouseUp);
|
|
}
|
|
};
|
|
Resizable.prototype.unbindEvents = function () {
|
|
if (this.window) {
|
|
this.window.removeEventListener('mouseup', this.onMouseUp);
|
|
this.window.removeEventListener('mousemove', this.onMouseMove);
|
|
this.window.removeEventListener('mouseleave', this.onMouseUp);
|
|
this.window.removeEventListener('touchmove', this.onMouseMove, true);
|
|
this.window.removeEventListener('touchend', this.onMouseUp);
|
|
}
|
|
};
|
|
Resizable.prototype.componentDidMount = function () {
|
|
if (!this.resizable || !this.window) {
|
|
return;
|
|
}
|
|
var computedStyle = this.window.getComputedStyle(this.resizable);
|
|
this.setState({
|
|
width: this.state.width || this.size.width,
|
|
height: this.state.height || this.size.height,
|
|
flexBasis: computedStyle.flexBasis !== 'auto' ? computedStyle.flexBasis : undefined,
|
|
});
|
|
};
|
|
Resizable.prototype.componentWillUnmount = function () {
|
|
if (this.window) {
|
|
this.unbindEvents();
|
|
}
|
|
};
|
|
Resizable.prototype.createSizeForCssProperty = function (newSize, kind) {
|
|
var propsSize = this.propsSize && this.propsSize[kind];
|
|
return this.state[kind] === 'auto' &&
|
|
this.state.original[kind] === newSize &&
|
|
(typeof propsSize === 'undefined' || propsSize === 'auto')
|
|
? 'auto'
|
|
: newSize;
|
|
};
|
|
Resizable.prototype.calculateNewMaxFromBoundary = function (maxWidth, maxHeight) {
|
|
var boundsByDirection = this.props.boundsByDirection;
|
|
var direction = this.state.direction;
|
|
var widthByDirection = boundsByDirection && hasDirection('left', direction);
|
|
var heightByDirection = boundsByDirection && hasDirection('top', direction);
|
|
var boundWidth;
|
|
var boundHeight;
|
|
if (this.props.bounds === 'parent') {
|
|
var parent_1 = this.parentNode;
|
|
if (parent_1) {
|
|
boundWidth = widthByDirection
|
|
? this.resizableRight - this.parentLeft
|
|
: parent_1.offsetWidth + (this.parentLeft - this.resizableLeft);
|
|
boundHeight = heightByDirection
|
|
? this.resizableBottom - this.parentTop
|
|
: parent_1.offsetHeight + (this.parentTop - this.resizableTop);
|
|
}
|
|
}
|
|
else if (this.props.bounds === 'window') {
|
|
if (this.window) {
|
|
boundWidth = widthByDirection ? this.resizableRight : this.window.innerWidth - this.resizableLeft;
|
|
boundHeight = heightByDirection ? this.resizableBottom : this.window.innerHeight - this.resizableTop;
|
|
}
|
|
}
|
|
else if (this.props.bounds) {
|
|
boundWidth = widthByDirection
|
|
? this.resizableRight - this.targetLeft
|
|
: this.props.bounds.offsetWidth + (this.targetLeft - this.resizableLeft);
|
|
boundHeight = heightByDirection
|
|
? this.resizableBottom - this.targetTop
|
|
: this.props.bounds.offsetHeight + (this.targetTop - this.resizableTop);
|
|
}
|
|
if (boundWidth && Number.isFinite(boundWidth)) {
|
|
maxWidth = maxWidth && maxWidth < boundWidth ? maxWidth : boundWidth;
|
|
}
|
|
if (boundHeight && Number.isFinite(boundHeight)) {
|
|
maxHeight = maxHeight && maxHeight < boundHeight ? maxHeight : boundHeight;
|
|
}
|
|
return { maxWidth: maxWidth, maxHeight: maxHeight };
|
|
};
|
|
Resizable.prototype.calculateNewSizeFromDirection = function (clientX, clientY) {
|
|
var scale = this.props.scale || 1;
|
|
var resizeRatio = this.props.resizeRatio || 1;
|
|
var _a = this.state, direction = _a.direction, original = _a.original;
|
|
var _b = this.props, lockAspectRatio = _b.lockAspectRatio, lockAspectRatioExtraHeight = _b.lockAspectRatioExtraHeight, lockAspectRatioExtraWidth = _b.lockAspectRatioExtraWidth;
|
|
var newWidth = original.width;
|
|
var newHeight = original.height;
|
|
var extraHeight = lockAspectRatioExtraHeight || 0;
|
|
var extraWidth = lockAspectRatioExtraWidth || 0;
|
|
if (hasDirection('right', direction)) {
|
|
newWidth = original.width + ((clientX - original.x) * resizeRatio) / scale;
|
|
if (lockAspectRatio) {
|
|
newHeight = (newWidth - extraWidth) / this.ratio + extraHeight;
|
|
}
|
|
}
|
|
if (hasDirection('left', direction)) {
|
|
newWidth = original.width - ((clientX - original.x) * resizeRatio) / scale;
|
|
if (lockAspectRatio) {
|
|
newHeight = (newWidth - extraWidth) / this.ratio + extraHeight;
|
|
}
|
|
}
|
|
if (hasDirection('bottom', direction)) {
|
|
newHeight = original.height + ((clientY - original.y) * resizeRatio) / scale;
|
|
if (lockAspectRatio) {
|
|
newWidth = (newHeight - extraHeight) * this.ratio + extraWidth;
|
|
}
|
|
}
|
|
if (hasDirection('top', direction)) {
|
|
newHeight = original.height - ((clientY - original.y) * resizeRatio) / scale;
|
|
if (lockAspectRatio) {
|
|
newWidth = (newHeight - extraHeight) * this.ratio + extraWidth;
|
|
}
|
|
}
|
|
return { newWidth: newWidth, newHeight: newHeight };
|
|
};
|
|
Resizable.prototype.calculateNewSizeFromAspectRatio = function (newWidth, newHeight, max, min) {
|
|
var _a = this.props, lockAspectRatio = _a.lockAspectRatio, lockAspectRatioExtraHeight = _a.lockAspectRatioExtraHeight, lockAspectRatioExtraWidth = _a.lockAspectRatioExtraWidth;
|
|
var computedMinWidth = typeof min.width === 'undefined' ? 10 : min.width;
|
|
var computedMaxWidth = typeof max.width === 'undefined' || max.width < 0 ? newWidth : max.width;
|
|
var computedMinHeight = typeof min.height === 'undefined' ? 10 : min.height;
|
|
var computedMaxHeight = typeof max.height === 'undefined' || max.height < 0 ? newHeight : max.height;
|
|
var extraHeight = lockAspectRatioExtraHeight || 0;
|
|
var extraWidth = lockAspectRatioExtraWidth || 0;
|
|
if (lockAspectRatio) {
|
|
var extraMinWidth = (computedMinHeight - extraHeight) * this.ratio + extraWidth;
|
|
var extraMaxWidth = (computedMaxHeight - extraHeight) * this.ratio + extraWidth;
|
|
var extraMinHeight = (computedMinWidth - extraWidth) / this.ratio + extraHeight;
|
|
var extraMaxHeight = (computedMaxWidth - extraWidth) / this.ratio + extraHeight;
|
|
var lockedMinWidth = Math.max(computedMinWidth, extraMinWidth);
|
|
var lockedMaxWidth = Math.min(computedMaxWidth, extraMaxWidth);
|
|
var lockedMinHeight = Math.max(computedMinHeight, extraMinHeight);
|
|
var lockedMaxHeight = Math.min(computedMaxHeight, extraMaxHeight);
|
|
newWidth = clamp(newWidth, lockedMinWidth, lockedMaxWidth);
|
|
newHeight = clamp(newHeight, lockedMinHeight, lockedMaxHeight);
|
|
}
|
|
else {
|
|
newWidth = clamp(newWidth, computedMinWidth, computedMaxWidth);
|
|
newHeight = clamp(newHeight, computedMinHeight, computedMaxHeight);
|
|
}
|
|
return { newWidth: newWidth, newHeight: newHeight };
|
|
};
|
|
Resizable.prototype.setBoundingClientRect = function () {
|
|
// For parent boundary
|
|
if (this.props.bounds === 'parent') {
|
|
var parent_2 = this.parentNode;
|
|
if (parent_2) {
|
|
var parentRect = parent_2.getBoundingClientRect();
|
|
this.parentLeft = parentRect.left;
|
|
this.parentTop = parentRect.top;
|
|
}
|
|
}
|
|
// For target(html element) boundary
|
|
if (this.props.bounds && typeof this.props.bounds !== 'string') {
|
|
var targetRect = this.props.bounds.getBoundingClientRect();
|
|
this.targetLeft = targetRect.left;
|
|
this.targetTop = targetRect.top;
|
|
}
|
|
// For boundary
|
|
if (this.resizable) {
|
|
var _a = this.resizable.getBoundingClientRect(), left = _a.left, top_1 = _a.top, right = _a.right, bottom = _a.bottom;
|
|
this.resizableLeft = left;
|
|
this.resizableRight = right;
|
|
this.resizableTop = top_1;
|
|
this.resizableBottom = bottom;
|
|
}
|
|
};
|
|
Resizable.prototype.onResizeStart = function (event, direction) {
|
|
if (!this.resizable || !this.window) {
|
|
return;
|
|
}
|
|
var clientX = 0;
|
|
var clientY = 0;
|
|
if (event.nativeEvent && isMouseEvent(event.nativeEvent)) {
|
|
clientX = event.nativeEvent.clientX;
|
|
clientY = event.nativeEvent.clientY;
|
|
}
|
|
else if (event.nativeEvent && isTouchEvent(event.nativeEvent)) {
|
|
clientX = event.nativeEvent.touches[0].clientX;
|
|
clientY = event.nativeEvent.touches[0].clientY;
|
|
}
|
|
if (this.props.onResizeStart) {
|
|
if (this.resizable) {
|
|
var startResize = this.props.onResizeStart(event, direction, this.resizable);
|
|
if (startResize === false) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// Fix #168
|
|
if (this.props.size) {
|
|
if (typeof this.props.size.height !== 'undefined' && this.props.size.height !== this.state.height) {
|
|
this.setState({ height: this.props.size.height });
|
|
}
|
|
if (typeof this.props.size.width !== 'undefined' && this.props.size.width !== this.state.width) {
|
|
this.setState({ width: this.props.size.width });
|
|
}
|
|
}
|
|
// For lockAspectRatio case
|
|
this.ratio =
|
|
typeof this.props.lockAspectRatio === 'number' ? this.props.lockAspectRatio : this.size.width / this.size.height;
|
|
var flexBasis;
|
|
var computedStyle = this.window.getComputedStyle(this.resizable);
|
|
if (computedStyle.flexBasis !== 'auto') {
|
|
var parent_3 = this.parentNode;
|
|
if (parent_3) {
|
|
var dir = this.window.getComputedStyle(parent_3).flexDirection;
|
|
this.flexDir = dir.startsWith('row') ? 'row' : 'column';
|
|
flexBasis = computedStyle.flexBasis;
|
|
}
|
|
}
|
|
// For boundary
|
|
this.setBoundingClientRect();
|
|
this.bindEvents();
|
|
var state = {
|
|
original: {
|
|
x: clientX,
|
|
y: clientY,
|
|
width: this.size.width,
|
|
height: this.size.height,
|
|
},
|
|
isResizing: true,
|
|
backgroundStyle: __assign(__assign({}, this.state.backgroundStyle), { cursor: this.window.getComputedStyle(event.target).cursor || 'auto' }),
|
|
direction: direction,
|
|
flexBasis: flexBasis,
|
|
};
|
|
this.setState(state);
|
|
};
|
|
Resizable.prototype.onMouseMove = function (event) {
|
|
if (!this.state.isResizing || !this.resizable || !this.window) {
|
|
return;
|
|
}
|
|
if (this.window.TouchEvent && isTouchEvent(event)) {
|
|
try {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
}
|
|
catch (e) {
|
|
// Ignore on fail
|
|
}
|
|
}
|
|
var _a = this.props, maxWidth = _a.maxWidth, maxHeight = _a.maxHeight, minWidth = _a.minWidth, minHeight = _a.minHeight;
|
|
var clientX = isTouchEvent(event) ? event.touches[0].clientX : event.clientX;
|
|
var clientY = isTouchEvent(event) ? event.touches[0].clientY : event.clientY;
|
|
var _b = this.state, direction = _b.direction, original = _b.original, width = _b.width, height = _b.height;
|
|
var parentSize = this.getParentSize();
|
|
var max = calculateNewMax(parentSize, this.window.innerWidth, this.window.innerHeight, maxWidth, maxHeight, minWidth, minHeight);
|
|
maxWidth = max.maxWidth;
|
|
maxHeight = max.maxHeight;
|
|
minWidth = max.minWidth;
|
|
minHeight = max.minHeight;
|
|
// Calculate new size
|
|
var _c = this.calculateNewSizeFromDirection(clientX, clientY), newHeight = _c.newHeight, newWidth = _c.newWidth;
|
|
// Calculate max size from boundary settings
|
|
var boundaryMax = this.calculateNewMaxFromBoundary(maxWidth, maxHeight);
|
|
if (this.props.snap && this.props.snap.x) {
|
|
newWidth = findClosestSnap(newWidth, this.props.snap.x, this.props.snapGap);
|
|
}
|
|
if (this.props.snap && this.props.snap.y) {
|
|
newHeight = findClosestSnap(newHeight, this.props.snap.y, this.props.snapGap);
|
|
}
|
|
// Calculate new size from aspect ratio
|
|
var newSize = this.calculateNewSizeFromAspectRatio(newWidth, newHeight, { width: boundaryMax.maxWidth, height: boundaryMax.maxHeight }, { width: minWidth, height: minHeight });
|
|
newWidth = newSize.newWidth;
|
|
newHeight = newSize.newHeight;
|
|
if (this.props.grid) {
|
|
var newGridWidth = snap(newWidth, this.props.grid[0]);
|
|
var newGridHeight = snap(newHeight, this.props.grid[1]);
|
|
var gap = this.props.snapGap || 0;
|
|
newWidth = gap === 0 || Math.abs(newGridWidth - newWidth) <= gap ? newGridWidth : newWidth;
|
|
newHeight = gap === 0 || Math.abs(newGridHeight - newHeight) <= gap ? newGridHeight : newHeight;
|
|
}
|
|
var delta = {
|
|
width: newWidth - original.width,
|
|
height: newHeight - original.height,
|
|
};
|
|
if (width && typeof width === 'string') {
|
|
if (endsWith(width, '%')) {
|
|
var percent = (newWidth / parentSize.width) * 100;
|
|
newWidth = percent + "%";
|
|
}
|
|
else if (endsWith(width, 'vw')) {
|
|
var vw = (newWidth / this.window.innerWidth) * 100;
|
|
newWidth = vw + "vw";
|
|
}
|
|
else if (endsWith(width, 'vh')) {
|
|
var vh = (newWidth / this.window.innerHeight) * 100;
|
|
newWidth = vh + "vh";
|
|
}
|
|
}
|
|
if (height && typeof height === 'string') {
|
|
if (endsWith(height, '%')) {
|
|
var percent = (newHeight / parentSize.height) * 100;
|
|
newHeight = percent + "%";
|
|
}
|
|
else if (endsWith(height, 'vw')) {
|
|
var vw = (newHeight / this.window.innerWidth) * 100;
|
|
newHeight = vw + "vw";
|
|
}
|
|
else if (endsWith(height, 'vh')) {
|
|
var vh = (newHeight / this.window.innerHeight) * 100;
|
|
newHeight = vh + "vh";
|
|
}
|
|
}
|
|
var newState = {
|
|
width: this.createSizeForCssProperty(newWidth, 'width'),
|
|
height: this.createSizeForCssProperty(newHeight, 'height'),
|
|
};
|
|
if (this.flexDir === 'row') {
|
|
newState.flexBasis = newState.width;
|
|
}
|
|
else if (this.flexDir === 'column') {
|
|
newState.flexBasis = newState.height;
|
|
}
|
|
this.setState(newState);
|
|
if (this.props.onResize) {
|
|
this.props.onResize(event, direction, this.resizable, delta);
|
|
}
|
|
};
|
|
Resizable.prototype.onMouseUp = function (event) {
|
|
var _a = this.state, isResizing = _a.isResizing, direction = _a.direction, original = _a.original;
|
|
if (!isResizing || !this.resizable) {
|
|
return;
|
|
}
|
|
var delta = {
|
|
width: this.size.width - original.width,
|
|
height: this.size.height - original.height,
|
|
};
|
|
if (this.props.onResizeStop) {
|
|
this.props.onResizeStop(event, direction, this.resizable, delta);
|
|
}
|
|
if (this.props.size) {
|
|
this.setState(this.props.size);
|
|
}
|
|
this.unbindEvents();
|
|
this.setState({
|
|
isResizing: false,
|
|
backgroundStyle: __assign(__assign({}, this.state.backgroundStyle), { cursor: 'auto' }),
|
|
});
|
|
};
|
|
Resizable.prototype.updateSize = function (size) {
|
|
this.setState({ width: size.width, height: size.height });
|
|
};
|
|
Resizable.prototype.renderResizer = function () {
|
|
var _this = this;
|
|
var _a = this.props, enable = _a.enable, handleStyles = _a.handleStyles, handleClasses = _a.handleClasses, handleWrapperStyle = _a.handleWrapperStyle, handleWrapperClass = _a.handleWrapperClass, handleComponent = _a.handleComponent;
|
|
if (!enable) {
|
|
return null;
|
|
}
|
|
var resizers = Object.keys(enable).map(function (dir) {
|
|
if (enable[dir] !== false) {
|
|
return (React.createElement(Resizer, { key: dir, direction: dir, onResizeStart: _this.onResizeStart, replaceStyles: handleStyles && handleStyles[dir], className: handleClasses && handleClasses[dir] }, handleComponent && handleComponent[dir] ? handleComponent[dir] : null));
|
|
}
|
|
return null;
|
|
});
|
|
// #93 Wrap the resize box in span (will not break 100% width/height)
|
|
return (React.createElement("div", { className: handleWrapperClass, style: handleWrapperStyle }, resizers));
|
|
};
|
|
Resizable.prototype.render = function () {
|
|
var _this = this;
|
|
var extendsProps = Object.keys(this.props).reduce(function (acc, key) {
|
|
if (definedProps.indexOf(key) !== -1) {
|
|
return acc;
|
|
}
|
|
acc[key] = _this.props[key];
|
|
return acc;
|
|
}, {});
|
|
var style = __assign(__assign(__assign({ position: 'relative', userSelect: this.state.isResizing ? 'none' : 'auto' }, this.props.style), this.sizeStyle), { maxWidth: this.props.maxWidth, maxHeight: this.props.maxHeight, minWidth: this.props.minWidth, minHeight: this.props.minHeight, boxSizing: 'border-box', flexShrink: 0 });
|
|
if (this.state.flexBasis) {
|
|
style.flexBasis = this.state.flexBasis;
|
|
}
|
|
var Wrapper = this.props.as || 'div';
|
|
return (React.createElement(Wrapper, __assign({ ref: this.ref, style: style, className: this.props.className }, extendsProps),
|
|
this.state.isResizing && React.createElement("div", { style: this.state.backgroundStyle }),
|
|
this.props.children,
|
|
this.renderResizer()));
|
|
};
|
|
Resizable.defaultProps = {
|
|
as: 'div',
|
|
onResizeStart: function () { },
|
|
onResize: function () { },
|
|
onResizeStop: function () { },
|
|
enable: {
|
|
top: true,
|
|
right: true,
|
|
bottom: true,
|
|
left: true,
|
|
topRight: true,
|
|
bottomRight: true,
|
|
bottomLeft: true,
|
|
topLeft: true,
|
|
},
|
|
style: {},
|
|
grid: [1, 1],
|
|
lockAspectRatio: false,
|
|
lockAspectRatioExtraWidth: 0,
|
|
lockAspectRatioExtraHeight: 0,
|
|
scale: 1,
|
|
resizeRatio: 1,
|
|
snapGap: 0,
|
|
};
|
|
return Resizable;
|
|
}(React.PureComponent));
|
|
|
|
exports.Resizable = Resizable;
|