{"version":3,"file":"node.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/node.ts"],"sourcesContent":["import { isArray, isEmpty, isFunction, isUndefined } from '@element-plus/utils'\n\nimport type {\n  CascaderConfig,\n  CascaderNodePathValue,\n  CascaderNodeValue,\n  CascaderOption,\n} from './types'\n\ntype ChildrenData = CascaderOption[] | undefined\n\nlet uid = 0\n\nconst calculatePathNodes = (node: Node) => {\n  const nodes = [node]\n  let { parent } = node\n\n  while (parent) {\n    nodes.unshift(parent)\n    parent = parent.parent\n  }\n\n  return nodes\n}\n\nclass Node {\n  readonly uid: number = uid++\n  readonly level: number\n  readonly value: CascaderNodeValue\n  readonly label: string\n  readonly pathNodes: Node[]\n  readonly pathValues: CascaderNodePathValue\n  readonly pathLabels: string[]\n\n  childrenData: ChildrenData\n  children: Node[]\n  text: string\n  loaded: boolean\n  /**\n   * Is it checked\n   *\n   * @default false\n   */\n  checked = false\n  /**\n   * Used to indicate the intermediate state of unchecked and fully checked child nodes\n   *\n   * @default false\n   */\n  indeterminate = false\n  /**\n   * Loading Status\n   *\n   * @default false\n   */\n  loading = false\n\n  constructor(\n    readonly data: CascaderOption,\n    readonly config: CascaderConfig,\n    readonly parent?: Node,\n    readonly root = false\n  ) {\n    const { value: valueKey, label: labelKey, children: childrenKey } = config\n\n    const childrenData = data[childrenKey] as ChildrenData\n    const pathNodes = calculatePathNodes(this)\n\n    this.level = root ? 0 : parent ? parent.level + 1 : 1\n    this.value = data[valueKey] as CascaderNodeValue\n    this.label = data[labelKey] as string\n    this.pathNodes = pathNodes\n    this.pathValues = pathNodes.map((node) => node.value)\n    this.pathLabels = pathNodes.map((node) => node.label)\n    this.childrenData = childrenData\n    this.children = (childrenData || []).map(\n      (child) => new Node(child, config, this)\n    )\n    this.loaded = !config.lazy || this.isLeaf || !isEmpty(childrenData)\n    this.text = ''\n  }\n\n  get isDisabled(): boolean {\n    const { data, parent, config } = this\n    const { disabled, checkStrictly } = config\n    const isDisabled = isFunction(disabled)\n      ? disabled(data, this)\n      : !!data[disabled]\n    return isDisabled || (!checkStrictly && !!parent?.isDisabled)\n  }\n\n  get isLeaf(): boolean {\n    const { data, config, childrenData, loaded } = this\n    const { lazy, leaf } = config\n    const isLeaf = isFunction(leaf) ? leaf(data, this) : data[leaf]\n\n    return isUndefined(isLeaf)\n      ? lazy && !loaded\n        ? false\n        : !(isArray(childrenData) && childrenData.length)\n      : !!isLeaf\n  }\n\n  get valueByOption() {\n    return this.config.emitPath ? this.pathValues : this.value\n  }\n\n  appendChild(childData: CascaderOption) {\n    const { childrenData, children } = this\n    const node = new Node(childData, this.config, this)\n\n    if (isArray(childrenData)) {\n      childrenData.push(childData)\n    } else {\n      this.childrenData = [childData]\n    }\n\n    children.push(node)\n\n    return node\n  }\n\n  calcText(allLevels: boolean, separator: string) {\n    const text = allLevels ? this.pathLabels.join(separator) : this.label\n    this.text = text\n    return text\n  }\n\n  broadcast(checked: boolean) {\n    this.children.forEach((child) => {\n      if (child) {\n        // bottom up\n        child.broadcast(checked)\n        child.onParentCheck?.(checked)\n      }\n    })\n  }\n\n  emit() {\n    const { parent } = this\n    if (parent) {\n      parent.onChildCheck?.()\n      parent.emit()\n    }\n  }\n\n  onParentCheck(checked: boolean) {\n    if (!this.isDisabled) {\n      this.setCheckState(checked)\n    }\n  }\n\n  onChildCheck() {\n    const { children } = this\n    const validChildren = children.filter((child) => !child.isDisabled)\n    const checked = validChildren.length\n      ? validChildren.every((child) => child.checked)\n      : false\n\n    this.setCheckState(checked)\n  }\n\n  setCheckState(checked: boolean) {\n    const totalNum = this.children.length\n    const checkedNum = this.children.reduce((c, p) => {\n      const num = p.checked ? 1 : p.indeterminate ? 0.5 : 0\n      return c + num\n    }, 0)\n\n    this.checked =\n      this.loaded &&\n      this.children\n        .filter((child) => !child.isDisabled)\n        .every((child) => child.loaded && child.checked) &&\n      checked\n    this.indeterminate =\n      this.loaded && checkedNum !== totalNum && checkedNum > 0\n  }\n\n  doCheck(checked: boolean) {\n    if (this.checked === checked) return\n\n    const { checkStrictly, multiple } = this.config\n\n    if (checkStrictly || !multiple) {\n      this.checked = checked\n    } else {\n      // bottom up to unify the calculation of the indeterminate state\n      this.broadcast(checked)\n      this.setCheckState(checked)\n      this.emit()\n    }\n  }\n}\n\nexport default Node\n"],"mappings":"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"}