@aplus-frontend/antdv
Version:
Vue basic component library maintained based on ant-design-vue
182 lines (181 loc) • 5.4 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _vue = require("vue");
var _addEventListener = _interopRequireDefault(require("../../vc-util/Dom/addEventListener"));
var _raf = _interopRequireDefault(require("../../_util/raf"));
var _devWarning = _interopRequireDefault(require("../../vc-util/devWarning"));
var _context = require("../../table/context");
var _supportsPassive = _interopRequireDefault(require("../../_util/supportsPassive"));
const events = {
mouse: {
start: 'mousedown',
move: 'mousemove',
stop: 'mouseup'
},
touch: {
start: 'touchstart',
move: 'touchmove',
stop: 'touchend'
}
};
const defaultMinWidth = 50;
var _default = exports.default = (0, _vue.defineComponent)({
compatConfig: {
MODE: 3
},
name: 'DragHandle',
props: {
prefixCls: String,
width: {
type: Number,
required: true
},
minWidth: {
type: Number,
default: defaultMinWidth
},
maxWidth: {
type: Number,
default: Infinity
},
column: {
type: Object,
default: undefined
}
},
setup(props) {
let startX = 0;
let moveEvent = {
remove: () => {}
};
let stopEvent = {
remove: () => {}
};
const removeEvents = () => {
moveEvent.remove();
stopEvent.remove();
};
(0, _vue.onUnmounted)(() => {
removeEvents();
});
(0, _vue.watchEffect)(() => {
(0, _devWarning.default)(!isNaN(props.width), 'Table', 'width must be a number when use resizable');
});
const {
onResizeColumn
} = (0, _context.useInjectTableContext)();
const minWidth = (0, _vue.computed)(() => {
return typeof props.minWidth === 'number' && !isNaN(props.minWidth) ? props.minWidth : defaultMinWidth;
});
const maxWidth = (0, _vue.computed)(() => {
return typeof props.maxWidth === 'number' && !isNaN(props.maxWidth) ? props.maxWidth : Infinity;
});
const instance = (0, _vue.getCurrentInstance)();
let baseWidth = 0;
let offsetRight = 0;
const dragging = (0, _vue.shallowRef)(false);
const headerLeft = (0, _vue.ref)();
let rafId;
const updateWidth = e => {
let pageX = 0;
if (e.touches) {
if (e.touches.length) {
// touchmove
pageX = e.touches[0].pageX;
} else {
// touchend
pageX = e.changedTouches[0].pageX;
}
} else {
pageX = e.pageX;
}
const tmpDeltaX = startX - pageX;
let w = Math.max(baseWidth - tmpDeltaX, minWidth.value);
w = Math.min(w, maxWidth.value);
_raf.default.cancel(rafId);
rafId = (0, _raf.default)(() => {
onResizeColumn(w, props.column.__originColumn__);
});
};
const updateHeaderWidth = e => {
let pageX = 0;
if (e.touches) {
if (e.touches.length) {
// touchmove
pageX = e.touches[0].pageX;
} else {
// touchend
pageX = e.changedTouches[0].pageX;
}
} else {
pageX = e.pageX;
}
const tmpDeltaX = startX - pageX;
let w = Math.max(baseWidth - tmpDeltaX, minWidth.value);
w = Math.min(w, maxWidth.value);
headerLeft.value = w + offsetRight;
};
const handleMove = e => {
updateHeaderWidth(e);
};
const handleStop = e => {
dragging.value = false;
updateWidth(e);
removeEvents();
};
const handleStart = (e, eventsFor) => {
dragging.value = true;
removeEvents();
baseWidth = instance.vnode.el.parentNode.getBoundingClientRect().width;
const {
right
} = getComputedStyle(instance.vnode.el);
offsetRight = parseFloat(right);
if (e instanceof MouseEvent && e.which !== 1) {
return;
}
if (e.stopPropagation) e.stopPropagation();
startX = e.touches ? e.touches[0].pageX : e.pageX;
moveEvent = (0, _addEventListener.default)(document.documentElement, eventsFor.move, handleMove);
stopEvent = (0, _addEventListener.default)(document.documentElement, eventsFor.stop, handleStop);
};
const handleDown = e => {
e.stopPropagation();
e.preventDefault();
handleStart(e, events.mouse);
};
const handleTouchDown = e => {
e.stopPropagation();
e.preventDefault();
handleStart(e, events.touch);
};
const handleClick = e => {
e.stopPropagation();
e.preventDefault();
};
return () => {
const {
prefixCls
} = props;
const touchEvents = {
[_supportsPassive.default ? 'onTouchstartPassive' : 'onTouchstart']: e => handleTouchDown(e)
};
return (0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({
"class": `${prefixCls}-resize-handle ${dragging.value ? 'dragging' : ''}`,
"style": {
left: dragging.value ? `${headerLeft.value}px` : 'auto'
},
"onMousedown": handleDown
}, touchEvents), {}, {
"onClick": handleClick
}), [(0, _vue.createVNode)("div", {
"class": `${prefixCls}-resize-handle-line`
}, null)]);
};
}
});
;