base-ui
Version:
A component library for Better Vue developmemt
127 lines (106 loc) • 3.64 kB
JavaScript
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;
};