UNPKG

@arco-vue-pro-components/pro-components

Version:
586 lines (585 loc) 19.9 kB
"use strict"; 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;