vxe-pc-ui
Version:
A vue based PC component library
1,041 lines (1,040 loc) • 35.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _vue = require("vue");
var _comp = require("../../ui/src/comp");
var _ui = require("../../ui");
var _vn = require("../../ui/src/vn");
var _dom = require("../../ui/src/dom");
var _utils = require("../../ui/src/utils");
var _log = require("../../ui/src/log");
var _xeUtils = _interopRequireDefault(require("xe-utils"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
var _default = exports.default = (0, _comp.defineVxeComponent)({
name: 'VxeSplitter',
props: {
width: [Number, String],
height: [Number, String],
vertical: {
type: Boolean,
default: () => (0, _ui.getConfig)().splitter.vertical
},
border: {
type: Boolean,
default: () => (0, _ui.getConfig)().splitter.border
},
padding: {
type: Boolean,
default: () => (0, _ui.getConfig)().splitter.padding
},
resize: {
type: Boolean,
default: () => (0, _ui.getConfig)().splitter.resize
},
items: Array,
itemConfig: Object,
barConfig: Object,
resizeConfig: Object,
actionConfig: Object,
size: {
type: String,
default: () => (0, _ui.getConfig)().splitter.size || (0, _ui.getConfig)().size
}
},
emits: ['action-dblclick', 'action-click', 'toggle-expand', 'resize-start', 'resize-drag', 'resize-end'],
setup(props, context) {
const {
emit,
slots
} = context;
const xID = _xeUtils.default.uniqueId();
const refElem = (0, _vue.ref)();
const refBarInfoElem = (0, _vue.ref)();
const refResizableSplitterTip = (0, _vue.ref)();
const {
computeSize
} = (0, _ui.useSize)(props);
const reactData = (0, _vue.reactive)({
staticItems: [],
itemList: [],
barWidth: 0,
barHeight: 0
});
const internalData = {
wrapperWidth: 0,
wrapperHeight: 0
};
const computeItemOpts = (0, _vue.computed)(() => {
return Object.assign({}, (0, _ui.getConfig)().splitter.itemConfig, props.itemConfig);
});
const computeBarOpts = (0, _vue.computed)(() => {
return Object.assign({}, (0, _ui.getConfig)().splitter.barConfig, props.barConfig);
});
const computeResizeOpts = (0, _vue.computed)(() => {
return Object.assign({}, (0, _ui.getConfig)().splitter.resizeConfig, props.resizeConfig);
});
const computeActionOpts = (0, _vue.computed)(() => {
return Object.assign({}, (0, _ui.getConfig)().splitter.actionConfig, props.actionConfig);
});
const computeVisibleItems = (0, _vue.computed)(() => {
return reactData.itemList.filter(item => item.isExpand);
});
const computeAutoItems = (0, _vue.computed)(() => {
const {
vertical
} = props;
const autoItems = [];
let heightCount = 0;
let widthCount = 0;
reactData.itemList.forEach(vertical ? item => {
const {
renderHeight,
resizeHeight,
foldHeight,
isExpand,
height
} = item;
const itemHeight = isExpand ? foldHeight || resizeHeight || renderHeight : 0;
if (!height) {
autoItems.push(item);
}
heightCount += itemHeight;
} : item => {
const {
renderWidth,
resizeWidth,
foldWidth,
isExpand,
width
} = item;
const itemWidth = isExpand ? foldWidth || resizeWidth || renderWidth : 0;
if (!width) {
autoItems.push(item);
}
widthCount += itemWidth;
});
return {
autoItems,
heightCount,
heightRatio: heightCount / 100,
widthCount,
widthRatio: widthCount / 100
};
});
const computeBarStyle = (0, _vue.computed)(() => {
const barOpts = computeBarOpts.value;
const {
width,
height
} = barOpts;
const stys = {};
if (height) {
stys.height = (0, _dom.toCssUnit)(height);
}
if (width) {
stys.width = (0, _dom.toCssUnit)(width);
}
return stys;
});
const computeMaps = {
computeItemOpts,
computeBarOpts,
computeActionOpts
};
const refMaps = {
refElem
};
const $xeSplitter = {
xID,
props,
context,
reactData,
internalData,
getRefMaps: () => refMaps,
getComputeMaps: () => computeMaps
};
const dispatchEvent = (type, params, evnt) => {
emit(type, (0, _ui.createEvent)(evnt, {
$splitter: $xeSplitter
}, params));
};
const callSlot = (slotFunc, params) => {
if (slotFunc) {
if (_xeUtils.default.isString(slotFunc)) {
slotFunc = slots[slotFunc] || null;
}
if (_xeUtils.default.isFunction(slotFunc)) {
return (0, _vn.getSlotVNs)(slotFunc(params));
}
}
return [];
};
const getActionIcon = (prevItem, nextItem, isNext) => {
const {
vertical
} = props;
const topIcon = 'SPLIT_TOP_ACTION';
const bottomIcon = 'SPLIT_BOTTOM_ACTION';
const leftIcon = 'SPLIT_LEFT_ACTION';
const rightIcon = 'SPLIT_RIGHT_ACTION';
let iconName = '';
if (vertical) {
if (isNext) {
iconName = nextItem.isExpand ? bottomIcon : topIcon;
} else {
iconName = prevItem.isExpand ? topIcon : bottomIcon;
}
} else {
if (isNext) {
iconName = nextItem.isExpand ? rightIcon : leftIcon;
} else {
iconName = prevItem.isExpand ? leftIcon : rightIcon;
}
}
if (iconName) {
return (0, _ui.getIcon)()[iconName];
}
return '';
};
const reset = () => {
const {
itemList
} = reactData;
itemList.forEach(item => {
item.isExpand = true;
item.foldHeight = 0;
item.foldWidth = 0;
item.resizeHeight = 0;
item.resizeWidth = 0;
});
return (0, _vue.nextTick)();
};
const handleLoadItem = (list, isReset) => {
const {
staticItems
} = reactData;
const actionOpts = computeActionOpts.value;
const {
showPrevButton,
showNextButton
} = actionOpts;
const itemDef = {
isExpand: true,
renderWidth: 0,
resizeWidth: 0,
foldWidth: 0,
renderHeight: 0,
resizeHeight: 0,
foldHeight: 0
};
reactData.itemList = list.map(item => {
if (item.showAction) {
(0, _log.warnLog)('vxe.error.removeProp', ['[splitter] show-action']);
}
if (item.slots) {
_xeUtils.default.each(item.slots, func => {
if (!_xeUtils.default.isFunction(func)) {
if (!slots[func]) {
(0, _log.errLog)('vxe.error.notSlot', [`[splitter] ${func}`]);
}
}
});
}
return Object.assign({}, isReset ? null : itemDef, item, isReset ? itemDef : null, {
id: _xeUtils.default.uniqueId()
});
});
if (staticItems.length) {
(0, _log.errLog)('vxe.error.errConflicts', ['<vxe-splitter-panel ...>', 'items']);
}
if ((showPrevButton || showNextButton) && reactData.itemList.length > 2) {
(0, _log.errLog)('vxe.error.errConflicts', ['action-config.showPrevButton | action-config.showNextButton', 'Only supports 2 item']);
}
return recalculate();
};
const loadItem = list => {
return handleLoadItem(list || [], false);
};
const reloadItem = list => {
return handleLoadItem(list || [], true);
};
const handleItemByName = name => {
const {
itemList
} = reactData;
let index = -1;
let currItem = null;
let prevItem = null;
let nextItem = null;
for (let i = 0; i < itemList.length; i++) {
const item = itemList[i];
if (item.name === name) {
index = i;
currItem = item;
prevItem = itemList[i - 1] || null;
nextItem = itemList[i + 1] || null;
break;
}
}
return {
index,
currItem,
prevItem,
nextItem
};
};
const setItemExpand = (name, expanded) => {
const restItem = handleItemByName(name);
if (restItem) {
const {
currItem,
prevItem,
nextItem
} = restItem;
if (currItem) {
if (expanded ? !currItem.isExpand : currItem.isExpand) {
if (nextItem) {
if (nextItem.isExpand) {
handleItemActionEvent(null, currItem, nextItem, false);
}
} else if (prevItem) {
if (prevItem.isExpand) {
handleItemActionEvent(null, prevItem, currItem, true);
}
}
}
}
}
return (0, _vue.nextTick)();
};
const toggleItemExpand = name => {
const restItem = handleItemByName(name);
if (restItem) {
const {
currItem
} = restItem;
if (currItem) {
return setItemExpand(name, !currItem.isExpand);
}
}
return (0, _vue.nextTick)();
};
const getItemExpand = name => {
const restItem = handleItemByName(name);
if (restItem) {
const {
currItem
} = restItem;
if (currItem) {
return currItem.isExpand;
}
}
return false;
};
const recalculate = () => {
return (0, _vue.nextTick)().then(() => {
const {
vertical
} = props;
const {
itemList
} = reactData;
const el = refElem.value;
const barInfoElem = refBarInfoElem.value;
if (!el) {
return;
}
const wWidth = el.clientWidth;
const wHeight = el.clientHeight;
if (!wWidth || !wHeight) {
return;
}
if (barInfoElem) {
reactData.barWidth = barInfoElem.offsetWidth;
reactData.barHeight = barInfoElem.offsetHeight;
}
const contentWidth = wWidth - (vertical ? 0 : reactData.barWidth * (itemList.length - 1));
const contentHeight = wHeight - (vertical ? reactData.barHeight * (itemList.length - 1) : 0);
const itemOpts = computeItemOpts.value;
const allMinWidth = _xeUtils.default.toNumber(itemOpts.minWidth);
const allMinHeight = _xeUtils.default.toNumber(itemOpts.minHeight);
const residueItems = [];
if (vertical) {
let countHeight = 0;
itemList.forEach(item => {
const {
height
} = item;
let itemHeight = 0;
if (height) {
if ((0, _dom.isScale)(height)) {
itemHeight = contentHeight * _xeUtils.default.toNumber(height) / 100;
} else {
itemHeight = _xeUtils.default.toNumber(height);
}
item.renderHeight = itemHeight;
} else {
residueItems.push(item);
}
countHeight += itemHeight;
});
if (residueItems.length) {
const reMeanHeight = (contentHeight - countHeight) / residueItems.length;
residueItems.forEach(item => {
item.renderHeight = Math.max(_xeUtils.default.toNumber((0, _utils.getGlobalDefaultConfig)(item.minHeight, allMinHeight)), reMeanHeight);
});
}
} else {
let countWidth = 0;
itemList.forEach(item => {
const {
width
} = item;
let itemWidth = 0;
if (width) {
if ((0, _dom.isScale)(width)) {
itemWidth = contentWidth * _xeUtils.default.toNumber(width) / 100;
} else {
itemWidth = _xeUtils.default.toNumber(width);
}
item.renderWidth = itemWidth;
} else {
residueItems.push(item);
}
countWidth += itemWidth;
});
if (residueItems.length) {
const reMeanWidth = (contentWidth - countWidth) / residueItems.length;
residueItems.forEach(item => {
item.renderWidth = Math.max(_xeUtils.default.toNumber((0, _utils.getGlobalDefaultConfig)(item.minWidth, allMinWidth)), reMeanWidth);
});
}
}
internalData.wrapperWidth = contentWidth;
internalData.wrapperHeight = contentHeight;
});
};
const dragEvent = evnt => {
const {
resize,
vertical
} = props;
const {
itemList
} = reactData;
if (!resize) {
return;
}
evnt.preventDefault();
const barEl = evnt.currentTarget;
const handleEl = barEl.parentElement;
const el = refElem.value;
if (!el) {
return;
}
const prevEl = handleEl.previousElementSibling;
const nextEl = handleEl.nextElementSibling;
if (!prevEl || !nextEl) {
return;
}
const prevId = prevEl.getAttribute('itemid');
const nextId = nextEl.getAttribute('itemid');
const prevItem = itemList.find(item => item.id === prevId);
const nextItem = itemList.find(item => item.id === nextId);
if (!prevItem || !nextItem) {
return;
}
const containerRect = el.getBoundingClientRect();
const barRect = barEl.getBoundingClientRect();
const rsSplitterLineEl = refResizableSplitterTip.value;
const rsSplitterTipEl = rsSplitterLineEl ? rsSplitterLineEl.children[0] : null;
const itemOpts = computeItemOpts.value;
const resizeOpts = computeResizeOpts.value;
const {
immediate
} = resizeOpts;
const allMinWidth = _xeUtils.default.toNumber(itemOpts.minWidth);
const allMinHeight = _xeUtils.default.toNumber(itemOpts.minHeight);
const barOffsetX = Math.ceil(barRect.width - (evnt.clientX - barRect.left));
const barOffsetY = Math.ceil(evnt.clientY - barRect.top);
const prevWidth = prevEl.offsetWidth;
const nextWidth = nextEl.offsetWidth;
const prevMinWidth = _xeUtils.default.toNumber(prevItem ? (0, _utils.getGlobalDefaultConfig)(prevItem.minWidth, allMinWidth) : allMinWidth);
const nextMinWidth = _xeUtils.default.toNumber(nextItem ? (0, _utils.getGlobalDefaultConfig)(nextItem.minWidth, allMinWidth) : allMinWidth);
const minOffsetLeft = prevEl.offsetLeft + prevMinWidth - barOffsetX;
const maxOffsetLeft = nextEl.offsetLeft + nextEl.offsetWidth - nextMinWidth - barOffsetX;
const startOffsetLeft = evnt.clientX - containerRect.left;
let targetOffsetWidth = -1;
let prevResizeWidth = 0;
let nextResizeWidth = 0;
let offsetLeft = startOffsetLeft;
const prevHeight = prevEl.offsetHeight;
const nextHeight = nextEl.offsetHeight;
const prevMinHeight = _xeUtils.default.toNumber(prevItem ? (0, _utils.getGlobalDefaultConfig)(prevItem.minHeight, allMinHeight) : allMinHeight);
const nextMinHeight = _xeUtils.default.toNumber(nextItem ? (0, _utils.getGlobalDefaultConfig)(nextItem.minHeight, allMinHeight) : allMinHeight);
const minOffsetTop = prevEl.offsetTop + prevMinHeight + barOffsetY;
const maxOffsetTop = nextEl.offsetTop + nextEl.offsetHeight - nextMinHeight + barOffsetY;
const startOffsetTop = evnt.clientY - containerRect.top;
let targetOffsetHeight = -1;
let prevResizeHeight = 0;
let nextResizeHeight = 0;
let offsetTop = startOffsetTop;
const handleReStyle = evnt => {
if (!rsSplitterLineEl) {
return;
}
const rsNumPrevEl = rsSplitterTipEl ? rsSplitterTipEl.children[0] : null;
const rsNumNextEl = rsSplitterTipEl ? rsSplitterTipEl.children[1] : null;
if (vertical) {
let tipWidth = 0;
if (rsNumPrevEl) {
if (targetOffsetHeight < 0) {
rsNumPrevEl.style.display = 'none';
} else {
rsNumPrevEl.textContent = `${Math.floor(prevResizeHeight)}px`;
rsNumPrevEl.style.display = 'block';
tipWidth = rsNumPrevEl.offsetWidth;
}
}
if (rsNumNextEl) {
if (targetOffsetHeight < 0) {
rsNumNextEl.textContent = `${Math.floor(nextResizeHeight)}px`;
rsNumNextEl.style.display = 'block';
tipWidth = rsNumNextEl.offsetWidth;
} else {
rsNumNextEl.style.display = 'none';
}
}
let rsLeft = Math.max(1, evnt.clientX - containerRect.left - tipWidth / 2);
if (rsLeft > containerRect.width - tipWidth - 1) {
rsLeft = containerRect.width - tipWidth - 1;
}
rsSplitterLineEl.style.left = '0';
rsSplitterLineEl.style.top = `${offsetTop}px`;
if (rsSplitterTipEl) {
rsSplitterTipEl.style.left = `${rsLeft}px`;
}
} else {
let tipHeight = 0;
if (rsNumPrevEl) {
if (targetOffsetWidth < 0) {
rsNumPrevEl.style.display = 'none';
} else {
rsNumPrevEl.textContent = `${Math.floor(prevResizeWidth)}px`;
rsNumPrevEl.style.display = 'block';
tipHeight = rsNumPrevEl.offsetHeight;
}
}
if (rsNumNextEl) {
if (targetOffsetWidth < 0) {
rsNumNextEl.textContent = `${Math.floor(nextResizeWidth)}px`;
rsNumNextEl.style.display = 'block';
tipHeight = rsNumNextEl.offsetHeight;
} else {
rsNumNextEl.style.display = 'none';
}
}
let rsTop = Math.max(1, evnt.clientY - containerRect.top - tipHeight / 2);
if (rsTop > containerRect.height - tipHeight - 1) {
rsTop = containerRect.height - tipHeight - 1;
}
rsSplitterLineEl.style.top = '0';
rsSplitterLineEl.style.left = `${offsetLeft}px`;
if (rsSplitterTipEl) {
rsSplitterTipEl.style.top = `${rsTop}px`;
}
}
};
const handleUpdate = () => {
if (vertical) {
prevItem.resizeHeight = prevResizeHeight;
nextItem.resizeHeight = nextResizeHeight;
} else {
prevItem.resizeWidth = prevResizeWidth;
nextItem.resizeWidth = nextResizeWidth;
}
};
const handleDrag = evnt => {
if (vertical) {
offsetTop = evnt.clientY - containerRect.top;
if (offsetTop < minOffsetTop) {
offsetTop = minOffsetTop;
}
if (offsetTop > maxOffsetTop) {
offsetTop = maxOffsetTop;
}
targetOffsetHeight = offsetTop - startOffsetTop;
prevResizeHeight = prevHeight + targetOffsetHeight;
nextResizeHeight = nextHeight - targetOffsetHeight;
} else {
offsetLeft = evnt.clientX - containerRect.left;
if (offsetLeft < minOffsetLeft) {
offsetLeft = minOffsetLeft;
}
if (offsetLeft > maxOffsetLeft) {
offsetLeft = maxOffsetLeft;
}
targetOffsetWidth = offsetLeft - startOffsetLeft;
prevResizeWidth = prevWidth + targetOffsetWidth;
nextResizeWidth = nextWidth - targetOffsetWidth;
}
if (immediate) {
if (vertical) {
prevEl.style.height = (0, _dom.toCssUnit)(prevResizeHeight);
nextEl.style.height = (0, _dom.toCssUnit)(nextResizeHeight);
} else {
prevEl.style.width = (0, _dom.toCssUnit)(prevResizeWidth);
nextEl.style.width = (0, _dom.toCssUnit)(nextResizeWidth);
}
}
if (rsSplitterLineEl) {
handleReStyle(evnt);
}
dispatchEvent('resize-drag', {
prevItem,
nextItem,
offsetHeight: targetOffsetHeight,
offsetWidth: targetOffsetWidth
}, evnt);
};
document.onmousemove = evnt => {
evnt.preventDefault();
handleDrag(evnt);
};
document.onmouseup = evnt => {
document.onmousemove = null;
document.onmouseup = null;
if (rsSplitterLineEl) {
rsSplitterLineEl.style.display = '';
}
handleUpdate();
(0, _dom.removeClass)(el, 'is--drag');
dispatchEvent('resize-end', {
prevItem,
nextItem,
offsetHeight: targetOffsetHeight,
offsetWidth: targetOffsetWidth
}, evnt);
recalculate();
};
if (rsSplitterLineEl) {
rsSplitterLineEl.style.display = 'block';
handleReStyle(evnt);
}
handleDrag(evnt);
(0, _dom.addClass)(el, 'is--drag');
dispatchEvent('resize-start', {
prevItem,
nextItem
}, evnt);
};
const handleItemActionEvent = (evnt, prevItem, nextItem, isNext) => {
const {
vertical
} = props;
let expanded = false;
let item = prevItem;
if (isNext) {
item = nextItem;
expanded = !nextItem.isExpand;
nextItem.isExpand = expanded;
} else {
expanded = !prevItem.isExpand;
prevItem.isExpand = expanded;
}
if (vertical) {
if (prevItem.isExpand && nextItem.isExpand) {
prevItem.foldHeight = 0;
nextItem.foldHeight = 0;
} else if (prevItem.isExpand) {
nextItem.foldHeight = 0;
prevItem.foldHeight = (prevItem.resizeHeight || prevItem.renderHeight) + (nextItem.resizeHeight || nextItem.renderHeight);
} else {
prevItem.foldHeight = 0;
nextItem.foldHeight = (prevItem.resizeHeight || prevItem.renderHeight) + (nextItem.resizeHeight || nextItem.renderHeight);
}
} else {
if (prevItem.isExpand && nextItem.isExpand) {
prevItem.foldWidth = 0;
nextItem.foldWidth = 0;
} else if (prevItem.isExpand) {
nextItem.foldWidth = 0;
prevItem.foldWidth = (prevItem.resizeWidth || prevItem.renderWidth) + (nextItem.resizeWidth || nextItem.renderWidth);
} else {
prevItem.foldWidth = 0;
nextItem.foldWidth = (prevItem.resizeWidth || prevItem.renderWidth) + (nextItem.resizeWidth || nextItem.renderWidth);
}
}
if (evnt) {
dispatchEvent('toggle-expand', {
prevItem,
nextItem,
expanded,
item
}, evnt);
}
recalculate();
};
const handlePrevActionDblclickEvent = evnt => {
const {
itemList
} = reactData;
const actionOpts = computeActionOpts.value;
const btnEl = evnt.currentTarget;
const btnWrapperEl = btnEl.parentElement;
const handleEl = btnWrapperEl.parentElement;
const prevEl = handleEl.previousElementSibling;
const prevId = prevEl.getAttribute('itemid');
const prevItem = itemList.find(item => item.id === prevId);
const nextEl = handleEl.nextElementSibling;
const nextId = nextEl.getAttribute('itemid');
const nextItem = itemList.find(item => item.id === nextId);
if (actionOpts.trigger === 'dblclick') {
if (prevItem && nextItem && nextItem.isExpand) {
handleItemActionEvent(evnt, prevItem, nextItem, false);
}
}
dispatchEvent('action-dblclick', {
prevItem,
nextItem
}, evnt);
};
const handlePrevActionClickEvent = evnt => {
const {
itemList
} = reactData;
const actionOpts = computeActionOpts.value;
const btnEl = evnt.currentTarget;
const btnWrapperEl = btnEl.parentElement;
const handleEl = btnWrapperEl.parentElement;
const prevEl = handleEl.previousElementSibling;
const prevId = prevEl.getAttribute('itemid');
const prevItem = itemList.find(item => item.id === prevId);
const nextEl = handleEl.nextElementSibling;
const nextId = nextEl.getAttribute('itemid');
const nextItem = itemList.find(item => item.id === nextId);
if (actionOpts.trigger !== 'dblclick') {
if (prevItem && nextItem && nextItem.isExpand) {
handleItemActionEvent(evnt, prevItem, nextItem, false);
}
}
dispatchEvent('action-click', {
prevItem,
nextItem
}, evnt);
};
const handleNextActionDblclickEvent = evnt => {
const {
itemList
} = reactData;
const actionOpts = computeActionOpts.value;
const btnEl = evnt.currentTarget;
const btnWrapperEl = btnEl.parentElement;
const handleEl = btnWrapperEl.parentElement;
const prevEl = handleEl.previousElementSibling;
const prevId = prevEl.getAttribute('itemid');
const prevItem = itemList.find(item => item.id === prevId);
const nextEl = handleEl.nextElementSibling;
const nextId = nextEl.getAttribute('itemid');
const nextItem = itemList.find(item => item.id === nextId);
if (actionOpts.trigger === 'dblclick') {
if (prevItem && nextItem && prevItem.isExpand) {
handleItemActionEvent(evnt, prevItem, nextItem, true);
}
}
dispatchEvent('action-dblclick', {
prevItem,
nextItem
}, evnt);
};
const handleNextActionClickEvent = evnt => {
const {
itemList
} = reactData;
const actionOpts = computeActionOpts.value;
const btnEl = evnt.currentTarget;
const btnWrapperEl = btnEl.parentElement;
const handleEl = btnWrapperEl.parentElement;
const prevEl = handleEl.previousElementSibling;
const prevId = prevEl.getAttribute('itemid');
const prevItem = itemList.find(item => item.id === prevId);
const nextEl = handleEl.nextElementSibling;
const nextId = nextEl.getAttribute('itemid');
const nextItem = itemList.find(item => item.id === nextId);
if (actionOpts.trigger !== 'dblclick') {
if (prevItem && nextItem && prevItem.isExpand) {
handleItemActionEvent(evnt, prevItem, nextItem, true);
}
}
dispatchEvent('action-click', {
prevItem,
nextItem
}, evnt);
};
const handleGlobalResizeEvent = () => {
recalculate();
};
const splitterMethods = {
dispatchEvent,
setItemExpand,
toggleItemExpand,
getItemExpand,
recalculate,
reset,
loadItem,
reloadItem
};
const splitterPrivateMethods = {};
Object.assign($xeSplitter, splitterMethods, splitterPrivateMethods);
const renderHandleBar = (prevItem, nextItem) => {
const {
border,
resize,
vertical
} = props;
const {
itemList
} = reactData;
const barStyle = computeBarStyle.value;
const actionOpts = computeActionOpts.value;
const {
direction
} = actionOpts;
const showPrevButton = _xeUtils.default.isBoolean(actionOpts.showPrevButton) ? actionOpts.showPrevButton : itemList.some(item => item.showAction);
const showNextButton = _xeUtils.default.isBoolean(actionOpts.showNextButton) ? actionOpts.showNextButton : direction === 'next' && itemList.some(item => item.showAction);
const resizeOpts = computeResizeOpts.value;
const {
immediate
} = resizeOpts;
return (0, _vue.h)('div', {
class: ['vxe-splitter-panel-handle', vertical ? 'is--vertical' : 'is--horizontal', immediate ? 'is-resize--immediate' : 'is-resize--lazy', {
'is--resize': resize,
'is--border': border
}]
}, [(0, _vue.h)('div', {
class: 'vxe-splitter-panel-handle-bar',
style: barStyle,
onMousedown: dragEvent
}), itemList.length === 2 ? (0, _vue.h)('div', {
class: 'vxe-splitter-panel-action-btn-wrapper'
}, [showPrevButton && nextItem.isExpand ? (0, _vue.h)('div', {
class: 'vxe-splitter-panel-action-btn',
onDblclick: handlePrevActionDblclickEvent,
onClick: handlePrevActionClickEvent
}, [(0, _vue.h)('i', {
class: getActionIcon(prevItem, nextItem, false)
})]) : (0, _ui.renderEmptyElement)($xeSplitter), showNextButton && prevItem.isExpand ? (0, _vue.h)('div', {
class: 'vxe-splitter-panel-action-btn',
onDblclick: handleNextActionDblclickEvent,
onClick: handleNextActionClickEvent
}, [(0, _vue.h)('i', {
class: getActionIcon(prevItem, nextItem, true)
})]) : (0, _ui.renderEmptyElement)($xeSplitter)]) : (0, _ui.renderEmptyElement)($xeSplitter)]);
};
const renderItems = () => {
const {
border,
padding,
resize,
vertical
} = props;
const {
itemList
} = reactData;
const vSize = computeSize.value;
const resizeOpts = computeResizeOpts.value;
const {
immediate
} = resizeOpts;
const visibleItems = computeVisibleItems.value;
const {
autoItems
} = computeAutoItems.value;
const itemVNs = [];
itemList.forEach((prevItem, index) => {
const {
id,
name,
slots,
renderHeight,
resizeHeight,
foldHeight,
renderWidth,
resizeWidth,
foldWidth,
isExpand
} = prevItem;
const nextItem = itemList[index + 1];
const defaultSlot = slots ? slots.default : null;
const stys = {};
let itemWidth = isExpand ? foldWidth || resizeWidth || renderWidth : 0;
let itemHeight = isExpand ? foldHeight || resizeHeight || renderHeight : 0;
// 至少存在一个自适应
if (autoItems.length === 1) {
if (vertical) {
if (!prevItem.height) {
itemHeight = 0;
}
} else {
if (!prevItem.width) {
itemWidth = 0;
}
}
}
let isFill = true;
if (vertical) {
if (itemHeight && visibleItems.length > 1) {
isFill = false;
stys.height = (0, _dom.toCssUnit)(itemHeight);
}
} else {
if (itemWidth && visibleItems.length > 1) {
isFill = false;
stys.width = (0, _dom.toCssUnit)(itemWidth);
}
}
itemVNs.push((0, _vue.h)('div', {
itemid: id,
class: ['vxe-splitter-panel', vertical ? 'is--vertical' : 'is--horizontal', immediate ? 'is-resize--immediate' : 'is-resize--lazy', {
[`size--${vSize}`]: vSize,
'is--resize': resize,
'is--padding': padding,
'is--border': border,
'is--height': itemHeight,
'is--width': itemWidth,
'is--visible': isExpand,
'is--hidden': !isExpand,
'is--fill': isExpand && isFill
}],
style: stys
}, [(0, _vue.h)('div', {
itemid: id,
class: 'vxe-splitter-panel--wrapper'
}, [(0, _vue.h)('div', {
class: 'vxe-splitter-panel--inner'
}, defaultSlot ? callSlot(defaultSlot, {
name,
isExpand
}) : [])])]));
if (nextItem) {
itemVNs.push(renderHandleBar(prevItem, nextItem));
}
});
return (0, _vue.h)('div', {
class: 'vxe-splitter-wrapper'
}, itemVNs);
};
const renderVN = () => {
const {
vertical,
width,
height
} = props;
const vSize = computeSize.value;
const resizeOpts = computeResizeOpts.value;
const {
immediate,
showTip
} = resizeOpts;
const defaultSlot = slots.default;
const stys = {};
if (height) {
stys.height = (0, _dom.toCssUnit)(height);
}
if (width) {
stys.width = (0, _dom.toCssUnit)(width);
}
return (0, _vue.h)('div', {
ref: refElem,
class: ['vxe-splitter', vertical ? 'is--vertical' : 'is--horizontal', immediate ? 'is-resize--immediate' : 'is-resize--lazy', {
[`size--${vSize}`]: vSize
}],
style: stys
}, [(0, _vue.h)('div', {
class: 'vxe-splitter-slots'
}, defaultSlot ? defaultSlot({}) : []), renderItems(), (0, _vue.h)('div', {
ref: refResizableSplitterTip,
class: ['vxe-splitter--resizable-splitter-tip', vertical ? 'is--vertical' : 'is--horizontal', immediate ? 'is-resize--immediate' : 'is-resize--lazy']
}, showTip ? [(0, _vue.h)('div', {
class: 'vxe-splitter--resizable-splitter-tip-number'
}, [(0, _vue.h)('div', {
class: 'vxe-splitter--resizable-splitter-number-prev'
}), (0, _vue.h)('div', {
class: 'vxe-splitter--resizable-splitter-number-next'
})])] : []), (0, _vue.h)('div', {
class: 'vxe-splitter--render-vars'
}, [(0, _vue.h)('div', {
ref: refBarInfoElem,
class: 'vxe-splitter--handle-bar-info'
})])]);
};
const itemFlag = (0, _vue.ref)(0);
(0, _vue.watch)(() => props.items ? props.items.length : -1, () => {
itemFlag.value++;
});
(0, _vue.watch)(() => props.items, () => {
itemFlag.value++;
});
(0, _vue.watch)(itemFlag, () => {
loadItem(props.items || []);
});
(0, _vue.watch)(() => reactData.staticItems, val => {
const actionOpts = computeActionOpts.value;
const {
showPrevButton,
showNextButton
} = actionOpts;
if (props.items && props.items.length) {
(0, _log.errLog)('vxe.error.errConflicts', ['<vxe-splitter-panel ...>', 'items']);
}
reactData.itemList = val || [];
if ((showPrevButton || showNextButton) && reactData.itemList.length > 2) {
(0, _log.errLog)('vxe.error.modelConflicts', ['[splitter] action-config.showPrevButton | action-config.showNextButton', '<vxe-splitter-panel ...> Only supports 2 panel']);
}
reactData.itemList.forEach(item => {
if (item.showAction) {
(0, _log.warnLog)('vxe.error.removeProp', ['[splitter] showAction']);
}
});
recalculate();
});
let resizeObserver;
(0, _vue.onMounted)(() => {
(0, _vue.nextTick)(() => {
recalculate();
});
const el = refElem.value;
if (el) {
resizeObserver = _ui.globalResize.create(() => {
recalculate();
});
resizeObserver.observe(el);
}
const actionOpts = computeActionOpts.value;
if (actionOpts.direction) {
(0, _log.errLog)('vxe.error.delProp', ['[splitter] action-config.direction', 'action-config.showPrevButton | action-config.showNextButton']);
}
_ui.globalEvents.on($xeSplitter, 'resize', handleGlobalResizeEvent);
});
(0, _vue.onUnmounted)(() => {
if (resizeObserver) {
resizeObserver.disconnect();
}
_ui.globalEvents.off($xeSplitter, 'resize');
});
(0, _vue.onActivated)(() => {
recalculate();
});
if (props.items) {
loadItem(props.items);
}
(0, _vue.provide)('$xeSplitter', $xeSplitter);
$xeSplitter.renderVN = renderVN;
return $xeSplitter;
},
render() {
return this.renderVN();
}
});