mirror of
https://github.com/element-plus/element-plus.git
synced 2026-03-13 07:51:17 +08:00
* refactor(style): Update Eslint to V9 and Prettier to V3 * fix: vscode color * fix: vscode color * chore: remove Useless dependence and old config file * chore: format * Merge branch 'dev' into eslintV9 * fix: fix * fix: ssr test * fix: ssr test * fix: use defineConfig * fix: prettier format and ignore docs dist * fix: index.mjs => index.js * fix: Vscode color * fix: prettier ignore global.d.ts * fix: format --------- Co-authored-by: 2586740555 <15972343+CYJ090915@user.noreply.gitee.com>
102 lines
2.5 KiB
TypeScript
102 lines
2.5 KiB
TypeScript
import { isEqual } from 'lodash-unified'
|
|
import { isPropAbsent } from '@element-plus/utils'
|
|
import Node from './node'
|
|
|
|
import type { Nullable } from '@element-plus/utils'
|
|
import type {
|
|
CascaderConfig,
|
|
CascaderNodePathValue,
|
|
CascaderNodeValue,
|
|
CascaderOption,
|
|
} from './types'
|
|
|
|
const flatNodes = (nodes: Node[], leafOnly: boolean) => {
|
|
return nodes.reduce((res, node) => {
|
|
if (node.isLeaf) {
|
|
res.push(node)
|
|
} else {
|
|
!leafOnly && res.push(node)
|
|
res = res.concat(flatNodes(node.children, leafOnly))
|
|
}
|
|
return res
|
|
}, [] as Node[])
|
|
}
|
|
|
|
export default class Store {
|
|
readonly nodes: Node[]
|
|
readonly allNodes: Node[]
|
|
readonly leafNodes: Node[]
|
|
|
|
constructor(
|
|
data: CascaderOption[],
|
|
readonly config: CascaderConfig
|
|
) {
|
|
const nodes = (data || []).map(
|
|
(nodeData) => new Node(nodeData, this.config)
|
|
)
|
|
this.nodes = nodes
|
|
this.allNodes = flatNodes(nodes, false)
|
|
this.leafNodes = flatNodes(nodes, true)
|
|
}
|
|
|
|
getNodes() {
|
|
return this.nodes
|
|
}
|
|
|
|
getFlattedNodes(leafOnly: boolean) {
|
|
return leafOnly ? this.leafNodes : this.allNodes
|
|
}
|
|
|
|
appendNode(nodeData: CascaderOption, parentNode?: Node) {
|
|
const node = parentNode
|
|
? parentNode.appendChild(nodeData)
|
|
: new Node(nodeData, this.config)
|
|
|
|
if (!parentNode) this.nodes.push(node)
|
|
|
|
this.appendAllNodesAndLeafNodes(node)
|
|
}
|
|
|
|
appendNodes(nodeDataList: CascaderOption[], parentNode: Node) {
|
|
if (nodeDataList.length > 0) {
|
|
nodeDataList.forEach((nodeData) => this.appendNode(nodeData, parentNode))
|
|
} else {
|
|
parentNode && parentNode.isLeaf && this.leafNodes.push(parentNode)
|
|
}
|
|
}
|
|
|
|
appendAllNodesAndLeafNodes(node: Node) {
|
|
this.allNodes.push(node)
|
|
node.isLeaf && this.leafNodes.push(node)
|
|
if (node.children) {
|
|
node.children.forEach((subNode) => {
|
|
this.appendAllNodesAndLeafNodes(subNode)
|
|
})
|
|
}
|
|
}
|
|
|
|
// when checkStrictly, leaf node first
|
|
getNodeByValue(
|
|
value: CascaderNodeValue | CascaderNodePathValue,
|
|
leafOnly = false
|
|
): Nullable<Node> {
|
|
if (isPropAbsent(value)) return null
|
|
|
|
const node = this.getFlattedNodes(leafOnly).find(
|
|
(node) => isEqual(node.value, value) || isEqual(node.pathValues, value)
|
|
)
|
|
|
|
return node || null
|
|
}
|
|
|
|
getSameNode(node: Node): Nullable<Node> {
|
|
if (!node) return null
|
|
|
|
const node_ = this.getFlattedNodes(false).find(
|
|
({ value, level }) => isEqual(node.value, value) && node.level === level
|
|
)
|
|
|
|
return node_ || null
|
|
}
|
|
}
|