xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 11.2 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","sources":["../../src/transfer/utils.ts"],"sourcesContent":["import { ComponentPublicInstance } from 'vue';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isUndefined from 'lodash/isUndefined';\nimport isArray from 'lodash/isArray';\n\nimport { TransferListOptionBase, TransferItemOption, TdTransferProps, TransferValue, DataOption } from './interface';\n\nexport { emitEvent } from '../utils/event';\n\nexport const TRANSFER_NAME = 'XTransfer';\n\ninterface TreeNode {\n children?: Array<TreeNode>;\n}\n\nfunction findTopNode(vm: ComponentPublicInstance): ComponentPublicInstance {\n // 找到t-transfer这层父节点\n if (vm.$options.name === 'x-transfer') {\n return vm;\n }\n if (vm.$parent) {\n return findTopNode(vm.$parent);\n }\n return vm;\n}\n\nfunction getTransferListOption<T>(prop: T | Array<T>): TransferListOptionBase<T> {\n if (isArray(prop)) {\n return {\n source: prop[0],\n target: prop[1],\n };\n }\n return {\n source: prop,\n target: prop,\n };\n}\n\nfunction getDataValues(\n data: Array<TransferItemOption>,\n filterValues: Array<TransferValue>,\n {\n isTreeMode = false,\n include = true, // true=保留filterValues,false=删除filterValues中元素\n } = {},\n): Array<TransferValue> {\n // 用于处理 tree 组件这种数据结构是树形的\n if (isTreeMode) {\n let result: Array<TransferValue> = [];\n if (data) {\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n const isInclude = filterValues.includes(item.value);\n if (!include && isInclude) {\n continue; // 排除模式下子元素一律排除\n }\n\n // 只找叶子节点\n if (item.children && item.children.length > 0) {\n const childResult = getDataValues(item.children, filterValues, {\n isTreeMode,\n include,\n });\n result = result.concat(childResult);\n } else if ((include && isInclude) || (!include && !isInclude)) {\n result.push(item.value);\n }\n }\n }\n return result;\n }\n return data\n .filter((item) => {\n if (!item) return false;\n const isInclude = filterValues.includes(item.value);\n return ((include && isInclude) || (!include && !isInclude)) && !item.disabled;\n })\n .map((item) => item.value);\n}\n\nfunction getTransferData(\n data: Array<DataOption>,\n keys: TdTransferProps['keys'],\n isTreeMode = false,\n): Array<TransferItemOption> {\n const list: Array<TransferItemOption> = data.map((transferDataItem, index): TransferItemOption => {\n const labelKey = keys?.label || 'label';\n const valueKey = keys?.value || 'value';\n const disabledKey = keys?.disabled || 'disabled';\n if (isUndefined(transferDataItem[labelKey])) {\n throw new Error(`${labelKey} is not in DataOption ${JSON.stringify(transferDataItem)}`);\n }\n if (isUndefined(transferDataItem[valueKey])) {\n throw new Error(`${valueKey} is not in DataOption ${JSON.stringify(transferDataItem)}`);\n }\n const result: TransferItemOption = {\n label: transferDataItem[labelKey] as string,\n value: transferDataItem[valueKey],\n key: `key__value_${transferDataItem[valueKey]}_index_${index}`,\n disabled: transferDataItem[disabledKey] ?? false,\n data: transferDataItem,\n };\n if (isTreeMode && transferDataItem.children) {\n result.children = getTransferData(transferDataItem.children, keys, true);\n }\n return result;\n });\n return list;\n}\n\nfunction isAllNodeValid(data: TransferItemOption, filterValues: Array<TransferValue>, needMatch: boolean): boolean {\n if (filterValues.includes(data.value)) {\n return needMatch;\n }\n return false;\n}\n\nfunction isTreeNodeValid(data: TransferItemOption, filterValues: Array<TransferValue>, needMatch: boolean): boolean {\n if (!data) return !needMatch;\n\n if (filterValues.includes(data.value)) {\n return needMatch;\n }\n\n if (data.children?.length) {\n return data.children.some((item) => isTreeNodeValid(item, filterValues, needMatch));\n }\n return !needMatch;\n}\n\n// 复制树并过滤节点\nfunction cloneTreeWithFilter(\n sourceTree: TransferItemOption[],\n targetTree: TransferItemOption[],\n filterValues: Array<TransferValue>,\n needMatch: boolean,\n) {\n sourceTree.forEach((item) => {\n let newNode: TransferItemOption;\n if (isAllNodeValid(item, filterValues, needMatch)) {\n // 如果当前节点直接命中,则复制所有子节点\n newNode = cloneDeep<TransferItemOption>(item);\n targetTree.push(newNode);\n } else if (isTreeNodeValid(item, filterValues, needMatch)) {\n // 如果有合法子节点,就复制这个节点\n newNode = {\n ...item,\n };\n delete newNode.children;\n targetTree.push(newNode);\n if (item.children) {\n newNode.children = [];\n cloneTreeWithFilter(item.children, newNode.children, filterValues, needMatch);\n if (newNode.children.length === 0) {\n delete newNode.children;\n }\n }\n }\n });\n}\n\n// 过滤列表,如果是树的话需要保持树的结构\nfunction filterTransferData(\n data: Array<TransferItemOption>,\n filterValues: Array<TransferValue>,\n needMatch = true,\n isTreeMode = false,\n) {\n if (!isTreeMode) {\n if (needMatch) {\n // 正向过滤。要保持filterValues顺序\n return filterValues.map((value) => data.find((item) => item.value === value)).filter((item) => !!item);\n }\n // 反向过滤\n return data.filter((item) => {\n const isMatch = filterValues.includes(item.value);\n return !isMatch;\n });\n }\n\n const result: Array<TransferItemOption> = [];\n cloneTreeWithFilter(data, result, filterValues, needMatch);\n return result;\n}\n\n// 获取树节点的叶子数量\nfunction getLefCount(nodes: Array<TreeNode>): number {\n let total = 0;\n nodes.forEach((child) => {\n if (child.children && child.children.length > 0) {\n total += getLefCount(child.children);\n } else {\n total += 1;\n }\n });\n return total;\n}\n\nexport {\n findTopNode,\n getTransferListOption,\n getDataValues,\n getTransferData,\n cloneTreeWithFilter,\n filterTransferData,\n getLefCount,\n};\n"],"names":["isArray","source","target","isTreeMode","include","result","isUndefined","label","value","disabled","data","sourceTree","newNode","targetTree","cloneTreeWithFilter","nodes","total"],"mappings":"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"}