UNPKG

base-ui

Version:

A component library for Better Vue developmemt

127 lines (106 loc) 3.64 kB
const isValueEqual = (left, right) => JSON.stringify(left) === JSON.stringify(right); const getNodeChain = (node) => { const nodeChain = []; let curNode = node; while (curNode.$$parent) { nodeChain.unshift(curNode); curNode = curNode.$$parent; } return nodeChain; }; const getNodeChainByChildren = (root) => { const result = []; function traverse(node, payload) { if (node == null) return; const {label, value, children} = node; payload.push({label, value}); result.push(payload); if (children) { children.forEach((item) => { traverse(item, [...payload]); }); } } traverse(root, []); return result; }; export const getSelectedListFromSingleValue = (list, value) => { const addParent = (node) => { if (node.children && node.children.length) { node.children.forEach((item) => { item.$$parent = node; addParent(item); }); } }; const selectedList = []; // gen forest where nodes can access its parent list.forEach((item) => { item.$$parent = list; addParent(item); }); const deep = (node) => { if (isValueEqual(node.value, value)) { let curNode = node; while (curNode.$$parent) { selectedList.unshift({label: curNode.label, value: curNode.value}); curNode = curNode.$$parent; } return; } if (!node.children || !node.children.length) return; node.children.forEach((item) => { deep(item); }); }; list.forEach((item) => { deep(item); }); return selectedList; }; export const getSelectedListFromListValue = (list, value) => { if (!value) return []; const selectedList = []; let curNode = {children: list}; let curLevel = 0; while (curNode.children && curNode.children.length) { const curValue = value[curLevel]; curNode = curNode.children.find(item => isValueEqual(curValue, item.value)) || {}; selectedList.push({label: curNode.label, value: curNode.value}); curLevel += 1; } return selectedList; }; const filterNode = nodeChain => nodeChain.filter(({disabled = false}) => !disabled); export const getValueFilterMap = (list = [], enableEmitList) => { const filterMap = {}; const rec = (node, parent) => { const isLeaf = !node.children || !node.children.length; if (enableEmitList) { if (!parent) { const nodeArray = getNodeChainByChildren(node); nodeArray.forEach((nodeChain) => { const nodeChainFiltered = filterNode(nodeChain); const key = JSON.stringify(nodeChainFiltered.map(({label, value}) => ({label, value}))); const chainLabel = nodeChainFiltered.map(({label}) => label).join('/'); filterMap[key] = chainLabel; }); } } if (!isLeaf) { node.children.forEach((item) => { rec(item, node); }); } if (!enableEmitList) { const nodeChain = filterNode(getNodeChain(node)); const key = JSON.stringify(nodeChain.map(({label, value}) => ({label, value}))); const chainLabel = nodeChain.map(({label}) => label).join('/'); filterMap[key] = chainLabel; } }; list.forEach((item) => { rec(item, null); }); return filterMap; };