@arco-vue-pro-components/pro-components
Version:
基于@arco-design/web-vue组件的高级组件,包括pro-table
586 lines (585 loc) • 19.9 kB
JavaScript
;
var vue = require("vue");
var webVue = require("@arco-design/web-vue");
var index$1 = require("../../locale/index.js");
var index$3 = require("../../_utils/index.js");
var index$2 = require("../my-tool-tip/index.js");
var index$4 = require("../my-icon/index.js");
var context = require("../form/context.js");
var icon = require("@arco-design/web-vue/es/icon");
var is = require("../../_utils/is.js");
var index = require("../utils/index.js");
function _isSlot(s) {
return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !vue.isVNode(s);
}
var ColumnSetting = vue.defineComponent({
name: "ColumnSetting",
props: {
columns: {
type: Array,
default: () => []
},
draggable: {
type: Boolean,
default: true
},
checkable: {
type: Boolean,
default: true
},
showListItemOption: {
type: Boolean,
default: true
},
checkedReset: {
type: Boolean,
default: true
},
icon: {
default: vue.createVNode(icon.IconSettings, null, null)
}
},
setup(props, {
slots
}) {
const tableCtx = vue.inject(context.proTableInjectionKey, {});
const localColumns = vue.toRef(props, "columns");
const listMap = vue.reactive({
left: [],
other: [],
right: []
});
const checkedKeysMap = vue.reactive({
left: [],
right: [],
other: [],
disable: []
});
const checkedKeys = vue.computed(() => [...checkedKeysMap.left, ...checkedKeysMap.right, ...checkedKeysMap.other]);
const defaultCheckedKeysMap = vue.ref({
left: [],
right: [],
other: [],
disable: []
});
const defaultListMap = vue.ref({
left: [],
right: [],
other: []
});
const treeRef = vue.ref({
left: null,
right: null,
other: null
});
const defaultAllCheckedKeys = vue.ref([]);
const currentDragTreeData = vue.ref({});
const needInit = vue.ref((tableCtx == null ? void 0 : tableCtx.columnsMap) ? Object.keys(tableCtx == null ? void 0 : tableCtx.columnsMap).length > 0 : false);
const localColumnsMap = vue.ref(JSON.parse(JSON.stringify(tableCtx == null ? void 0 : tableCtx.columnsMap)) || {});
const loopData = (data, parentItem, parentIndex) => {
if (!data || !is.isArray(data) || !data.length) {
return void 0;
}
let newData = [];
let index2 = 0;
for (let [_, columnItem] of data.entries()) {
const {
title,
render: render2,
hideInSetting,
sortOrder,
disable,
...item
} = columnItem;
if (hideInSetting) {
continue;
}
const newItem = {
...item,
disableCheckbox: parentItem.disableCheckbox || disable,
nodeTitle: title,
parentIndexs: (parentItem.parentIndexs || []).concat(parentIndex),
dragLevel: parentItem.dragLevel + 1,
dragLevelKey: `${parentItem.key}_${parentItem.dragLevel + 1}`,
dragIndex: index2
};
if (newItem.disableCheckbox) {
checkedKeysMap.disable.push(item.key);
}
defaultAllCheckedKeys.value.push(item.key);
switch (item.fixed || parentItem.fixed) {
case "left":
checkedKeysMap.left.push(item.key);
break;
case "right":
checkedKeysMap.right.push(item.key);
break;
default:
checkedKeysMap.other.push(item.key);
break;
}
if (newItem.children) {
newItem.children = loopData(newItem.children, newItem, index2);
}
newData.push(newItem);
index2++;
}
return newData;
};
vue.watch([localColumns, needInit], ([columns, needInit2]) => {
let newLeftList = [];
let newRightList = [];
let newList = [];
let parentIndexMap = {
left: 0,
right: 0,
other: 0
};
let initColumns = [...columns];
if (needInit2 && Object.keys(localColumnsMap.value).length > 0) {
initColumns = index.loopFilter(columns, void 0, localColumnsMap, false);
}
initColumns.forEach((columnItem) => {
const {
title,
render: render2,
hideInSetting,
sortOrder,
disable,
...item
} = columnItem;
const {
fixed
} = item;
if (hideInSetting) {
return;
}
const newItem = {
...item,
nodeTitle: title,
disableCheckbox: disable,
dragLevel: 1,
dragLevelKey: 1,
showTool: true,
dragIndex: parentIndexMap[fixed || "other"]
};
if (newItem.disableCheckbox) {
checkedKeysMap.disable.push(item.key);
}
defaultAllCheckedKeys.value.push(item.key);
switch (fixed) {
case "left":
checkedKeysMap.left.push(item.key);
break;
case "right":
checkedKeysMap.right.push(item.key);
break;
default:
checkedKeysMap.other.push(item.key);
break;
}
if (newItem.children) {
newItem.children = loopData(
newItem.children,
newItem,
parentIndexMap[fixed || "other"]
);
}
parentIndexMap[fixed || "other"] += 1;
if (fixed === "left") {
newLeftList.push(newItem);
return;
}
if (fixed === "right") {
newRightList.push(newItem);
return;
}
newList.push(newItem);
});
listMap.left = newLeftList;
listMap.right = newRightList;
listMap.other = newList;
defaultCheckedKeysMap.value = JSON.parse(JSON.stringify(vue.toRaw(checkedKeysMap)));
defaultListMap.value = index.deepClone(listMap);
}, {
immediate: true,
deep: true
});
const {
getMessage
} = index$1.useI18n();
const prefixCls = index$3.getPrefixCls("pro-table-column-setting");
const checkedAll = (val, reset = false) => {
var _a, _b;
if (val) {
const defaultCheckedKeysData = vue.toRaw(defaultCheckedKeysMap.value);
checkedKeysMap.left = defaultCheckedKeysData.left;
checkedKeysMap.right = defaultCheckedKeysData.right;
checkedKeysMap.other = defaultCheckedKeysData.other;
} else {
if (checkedKeysMap.disable.length) {
for (let type of Object.keys(listMap)) {
checkedKeysMap[type] = checkedKeysMap[type].filter((item) => {
return checkedKeysMap.disable.includes(item);
});
}
} else {
checkedKeysMap.left = [];
checkedKeysMap.right = [];
checkedKeysMap.other = [];
}
}
defaultAllCheckedKeys.value.map((key) => {
localColumnsMap.value[key] = {
...localColumnsMap.value[key] || {},
show: val
};
});
if (reset) {
const defaultListMapData = vue.toRaw(defaultListMap.value);
listMap.left = defaultListMapData.left;
listMap.right = defaultListMapData.right;
listMap.other = defaultListMapData.other;
if (needInit.value) {
needInit.value = false;
}
localColumnsMap.value = {};
(_a = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _a.call(tableCtx, {});
} else {
(_b = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _b.call(tableCtx, localColumnsMap.value);
}
};
const indeterminate = vue.computed(() => {
return checkedKeys.value.length > 0 && checkedKeys.value.length !== defaultAllCheckedKeys.value.length;
});
const updateTreeData = (list) => {
if (!list || !list.length) {
return;
}
function loop(data, parentIndex) {
data.map((item) => {
if (item.parentIndexs) {
item.parentIndexs.splice(0, 1, parentIndex);
}
if (item.children && item.children.length) {
loop(item.children, parentIndex);
}
});
}
list.map((item, index2) => {
item.dragIndex = index2;
if (item.children && item.children.length) {
loop(item.children, index2);
}
});
};
const ToolTipIcon = ({
title,
show,
fixed,
icon: icon2,
type,
dragIndex
}) => {
if (!show) {
return null;
}
return vue.createVNode(index$2, {
"content": title
}, {
default: () => [vue.createVNode("span", {
"onClick": (e) => {
var _a;
e.stopPropagation();
e.preventDefault();
const toolList = listMap[type].splice(dragIndex, 1);
if (!toolList.length) {
return;
}
const toolItem = toolList[0];
toolItem.fixed = fixed;
switch (fixed) {
case "left":
listMap["left"].push(toolItem);
break;
case "right":
listMap["right"].unshift(toolItem);
break;
default:
type === "right" ? listMap["other"].push(toolItem) : listMap["other"].unshift(toolItem);
break;
}
localColumnsMap.value[toolItem.key] = {
...localColumnsMap.value[toolItem.key] || {},
fixed
};
[...listMap["left"], ...listMap["other"], ...listMap["right"]].map((item, order) => {
localColumnsMap.value[item.key] = {
...localColumnsMap.value[item.key] || {},
order,
fixed: item.fixed
};
});
(_a = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _a.call(tableCtx, localColumnsMap.value);
updateTreeData(listMap[fixed || "other"]);
updateTreeData(listMap[type]);
vue.nextTick(() => {
const currentCheckedNodes = treeRef.value[type].getCheckedNodes({
checkedStrategy: "all",
includeHalfChecked: false
});
const currentCheckedKeys = currentCheckedNodes.map((node) => node.key);
const currentKeys = index.getArrDiff(checkedKeysMap[type], currentCheckedKeys);
checkedKeysMap[fixed || "other"] = checkedKeysMap[fixed || "other"].concat(currentKeys);
checkedKeysMap[type] = currentCheckedKeys;
});
}
}, [icon2])]
});
};
const CheckboxListItem = ({
columnKey,
title,
fixed,
showListItemOption,
showTool,
type,
dragIndex
}) => {
const dom = vue.createVNode("span", {
"class": `${prefixCls}-list-item-option`
}, [vue.createVNode(ToolTipIcon, {
"fixed": "left",
"title": getMessage("tableToolBar.leftPin", "\u56FA\u5B9A\u5728\u5DE6\u4FA7"),
"show": fixed !== "left",
"icon": vue.createVNode(icon.IconToTop, null, null),
"type": type,
"dragIndex": dragIndex
}, null), vue.createVNode(ToolTipIcon, {
"fixed": void 0,
"title": getMessage("tableToolBar.noPin", "\u4E0D\u56FA\u5B9A"),
"show": !!fixed,
"icon": vue.createVNode(index$4, {
"type": "icon-vertical-align-middl1"
}, null),
"type": type,
"dragIndex": dragIndex
}, null), vue.createVNode(ToolTipIcon, {
"fixed": "right",
"title": getMessage("tableToolBar.rightPin", "\u56FA\u5B9A\u5728\u53F3\u4FA7"),
"show": fixed !== "right",
"icon": vue.createVNode(icon.IconToBottom, null, null),
"type": type,
"dragIndex": dragIndex
}, null)]);
return vue.createVNode("span", {
"class": `${prefixCls}-list-item`,
"key": columnKey
}, [vue.createVNode("div", {
"class": `${prefixCls}-list-item-title`,
"title": typeof title === "string" ? title : void 0
}, [title]), showListItemOption && showTool ? dom : null]);
};
const getCurrentDropList = (list, indexs) => {
let current = list;
for (let i of indexs) {
current = current[i].children;
}
return current || [];
};
const CheckboxList = ({
list,
draggable,
checkable,
showListItemOption,
showTitle = true,
title: listTitle,
type
}) => {
if (!list || !list.length) {
return null;
}
const listDom = vue.createVNode(webVue.Tree, {
"draggable": !!(draggable && ((list == null ? void 0 : list.length) && (list == null ? void 0 : list.length) > 1 || list.length === 1 && list[0].children)),
"checkable": checkable,
"blockNode": true,
"checkedKeys": checkedKeysMap[type],
"onUpdate:checkedKeys": ($event) => checkedKeysMap[type] = $event,
"ref": (ref) => {
treeRef.value[type] = ref;
},
"showLine": false,
"onCheck": (newCheckedKeys, {
checked,
halfCheckedKeys
}) => {
var _a, _b;
if (checked) {
[...newCheckedKeys, ...halfCheckedKeys].map((key) => {
localColumnsMap.value[key] = {
...localColumnsMap.value[key] || {},
show: true
};
});
(_a = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _a.call(tableCtx, localColumnsMap.value);
return;
}
const prevCheckedNodes = treeRef.value[type].getCheckedNodes({
checkedStrategy: "all",
includeHalfChecked: true
});
const prevCheckedKeys = prevCheckedNodes.map((node) => node.key);
prevCheckedKeys.map((key) => {
localColumnsMap.value[key] = {
...localColumnsMap.value[key] || {},
show: [...newCheckedKeys, ...halfCheckedKeys].includes(key)
};
});
(_b = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _b.call(tableCtx, localColumnsMap.value);
},
"onDrop": ({
dragNode,
dropNode,
dropPosition
}) => {
var _a;
const currentList = dragNode.parentIndexs ? getCurrentDropList(list, dragNode.parentIndexs) : list;
currentList.splice(dropPosition === 1 ? dropNode.dragIndex + 1 : dropNode.dragIndex, 0, dragNode);
const dragIndexAmend = dragNode.dragIndex < dropNode.dragIndex ? 0 : 1;
currentList.splice(dragNode.dragIndex + dragIndexAmend, 1);
currentList.map((item, index2) => {
localColumnsMap.value[item.key] = {
...localColumnsMap.value[item.key] || {},
order: index2
};
item.dragIndex = index2;
});
(_a = tableCtx == null ? void 0 : tableCtx.setColumnsMap) == null ? void 0 : _a.call(tableCtx, localColumnsMap.value);
},
"onDragStart": (_, dragNode) => {
currentDragTreeData.value = dragNode;
},
"allowDrop": ({
dropNode
}) => {
return currentDragTreeData.value.dragLevelKey === dropNode.dragLevelKey;
},
"data": list
}, {
title: (_node) => {
const node = {
..._node,
children: void 0
};
if (!node.nodeTitle)
return null;
return vue.createVNode(CheckboxListItem, {
"fixed": node.fixed,
"showTool": node.showTool,
"showListItemOption": showListItemOption,
"title": node.nodeTitle,
"columnKey": node.key,
"type": type,
"dragIndex": node.dragIndex
}, null);
}
});
return vue.createVNode(vue.Fragment, null, [showTitle && vue.createVNode("span", {
"class": `${prefixCls}-list-title`
}, [listTitle]), listDom]);
};
const GroupCheckboxList = ({
draggable,
checkable,
showListItemOption
}) => {
const showRight = listMap.right && listMap.right.length > 0;
const showLeft = listMap.left && listMap.left.length > 0;
return vue.createVNode("div", {
"class": [`${prefixCls}-list`, {
[`${prefixCls}-list-group`]: showRight || showLeft,
[`${prefixCls}-list-nocheckbox`]: !checkable
}]
}, [vue.createVNode(CheckboxList, {
"title": getMessage("tableToolBar.leftFixedTitle", "\u56FA\u5B9A\u5728\u5DE6\u4FA7"),
"list": listMap.left,
"draggable": draggable,
"checkable": checkable,
"showListItemOption": showListItemOption,
"type": "left"
}, null), vue.createVNode(CheckboxList, {
"list": listMap.other,
"draggable": draggable,
"checkable": checkable,
"showListItemOption": showListItemOption,
"title": getMessage("tableToolBar.noFixedTitle", "\u4E0D\u56FA\u5B9A"),
"showTitle": showLeft || showRight,
"type": "other"
}, null), vue.createVNode(CheckboxList, {
"title": getMessage("tableToolBar.rightFixedTitle", "\u56FA\u5B9A\u5728\u53F3\u4FA7"),
"list": listMap.right,
"draggable": draggable,
"checkable": checkable,
"showListItemOption": showListItemOption,
"type": "right"
}, null)]);
};
const render = () => {
return vue.createVNode(webVue.Popover, {
"showArrow": false,
"overlayClassName": `${prefixCls}-overlay`,
"trigger": "click",
"position": "br",
"popupContainer": tableCtx.popupContainer
}, {
title: () => {
let _slot, _slot2;
return vue.createVNode("div", {
"class": `${prefixCls}-title`
}, [props.checkable === false ? vue.createVNode("div", null, null) : vue.createVNode(webVue.Checkbox, {
"indeterminate": indeterminate.value,
"modelValue": checkedKeys.value.length === defaultAllCheckedKeys.value.length,
"onChange": (val) => {
checkedAll(val);
}
}, _isSlot(_slot = getMessage("tableToolBar.columnDisplay", "\u5217\u5C55\u793A")) ? _slot : {
default: () => [_slot]
}), props.checkedReset ? vue.createVNode("a", {
"onClick": () => {
checkedAll(true, true);
},
"class": `${prefixCls}-action-rest-button`
}, [getMessage("tableToolBar.reset", "\u91CD\u7F6E")]) : null, slots["setting-extra"] ? vue.createVNode(webVue.Space, {
"size": 12,
"align": "center"
}, _isSlot(_slot2 = slots["setting-extra"]()) ? _slot2 : {
default: () => [_slot2]
}) : null]);
},
content: () => {
var _a, _b, _c;
return vue.createVNode(GroupCheckboxList, {
"checkable": (_a = props.checkable) != null ? _a : true,
"draggable": (_b = props.draggable) != null ? _b : true,
"showListItemOption": (_c = props.showListItemOption) != null ? _c : true
}, null);
},
default: () => {
return vue.createVNode(index$2, {
"content": getMessage("tableToolBar.columnSetting", "\u5217\u8BBE\u7F6E")
}, {
default: () => [slots["setting-icon"] ? slots["setting-icon"]() : props.icon]
});
},
...slots
});
};
return {
render
};
},
render() {
return this.render();
}
});
module.exports = ColumnSetting;