{"version":3,"file":"node.mjs","names":["isUndefined"],"sources":["../../../../../../../packages/components/tree/src/model/node.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport { isNil } from 'lodash-unified'\nimport {\n  hasOwn,\n  isArray,\n  isBoolean,\n  isFunction,\n  isString,\n  isUndefined,\n} from '@element-plus/utils'\nimport { NODE_KEY, markNodeData } from './util'\n\nimport type TreeStore from './tree-store'\nimport type { Nullable } from '@element-plus/utils'\nimport type {\n  FakeNode,\n  TreeKey,\n  TreeNodeChildState,\n  TreeNodeData,\n  TreeNodeLoadedDefaultProps,\n  TreeNodeOptions,\n} from '../tree.type'\n\nexport const getChildState = (node: Node[]): TreeNodeChildState => {\n  let all = true\n  let none = true\n  let allWithoutDisable = true\n  let isEffectivelyChecked = true\n  for (let i = 0, j = node.length; i < j; i++) {\n    const n = node[i]\n    if (n.checked !== true || n.indeterminate) {\n      all = false\n      if (!n.disabled) {\n        allWithoutDisable = false\n      }\n    }\n    if (n.checked !== false || n.indeterminate) {\n      none = false\n    }\n    if (!n.isEffectivelyChecked) {\n      isEffectivelyChecked = false\n    }\n  }\n\n  return {\n    all,\n    none,\n    allWithoutDisable,\n    half: !all && !none,\n    isEffectivelyChecked,\n  }\n}\n\nconst reInitChecked = function (node: Node): void {\n  if (node.childNodes.length === 0 || node.loading) {\n    node.isEffectivelyChecked = node.disabled || node.checked\n    return\n  }\n\n  const { all, none, half, isEffectivelyChecked } = getChildState(\n    node.childNodes\n  )\n  node.isEffectivelyChecked = isEffectivelyChecked\n  if (all) {\n    node.checked = true\n    node.indeterminate = false\n  } else if (half) {\n    node.checked = false\n    node.indeterminate = true\n  } else if (none) {\n    node.checked = false\n    node.indeterminate = false\n  }\n\n  const parent = node.parent\n  if (!parent || parent.level === 0) return\n\n  if (!node.store.checkStrictly) {\n    reInitChecked(parent)\n  }\n}\n\nconst getPropertyFromData = function (node: Node, prop: string): any {\n  const props = node.store.props\n  const data = node.data || {}\n  const config = (props as any)[prop]\n\n  if (isFunction(config)) {\n    return config(data, node)\n  } else if (isString(config)) {\n    return data[config]\n  } else if (isUndefined(config)) {\n    const dataProp = data[prop]\n    return isUndefined(dataProp) ? '' : dataProp\n  }\n}\n\nconst setCanFocus = function (childNodes: Node[], focus: boolean): void {\n  childNodes.forEach((item) => {\n    item.canFocus = focus\n    setCanFocus(item.childNodes, focus)\n  })\n}\n\nlet nodeIdSeed = 0\n\nclass Node {\n  id: number\n  text: string | null\n  checked: boolean\n  indeterminate: boolean\n  data: TreeNodeData\n  expanded: boolean\n  parent: Node | null\n  visible: boolean\n  isCurrent: boolean\n  store!: TreeStore\n  isLeafByUser: boolean | undefined = undefined\n  isLeaf: boolean | undefined = undefined\n  canFocus: boolean\n\n  level: number\n  loaded: boolean\n  childNodes: Node[]\n  loading: boolean\n\n  /**\n   * Determines whether the current tree node is effectively checked.\n   *\n   * Rules:\n   * 1. A disabled leaf node is always considered checked.\n   * 2. A non-disabled leaf node reflects its actual checked state.\n   * 3. A non-leaf node is considered checked only when:\n   *    - All of its child nodes are effectively checked, and\n   *    - Each child follows the same evaluation rules:\n   *      - Disabled leaf nodes follow rule #1.\n   *      - Non-leaf child nodes are recursively evaluated under this rule (#3).\n   */\n  isEffectivelyChecked: boolean = false\n\n  constructor(options: TreeNodeOptions) {\n    this.id = nodeIdSeed++\n    this.text = null\n    this.checked = false\n    this.indeterminate = false\n    this.data = null as unknown as TreeNodeData\n    this.expanded = false\n    this.parent = null as Node | null\n    this.visible = true\n    this.isCurrent = false\n    this.canFocus = false\n\n    for (const name in options) {\n      if (hasOwn(options, name)) {\n        this[name] = options[name]\n      }\n    }\n\n    // internal\n    this.level = 0\n    this.loaded = false\n    this.childNodes = []\n    this.loading = false\n\n    if (this.parent) {\n      this.level = this.parent.level + 1\n    }\n  }\n\n  initialize() {\n    const store = this.store\n    if (!store) {\n      throw new Error('[Node]store is required!')\n    }\n    store.registerNode(this)\n\n    const props = store.props\n    if (props && typeof props.isLeaf !== 'undefined') {\n      const isLeaf = getPropertyFromData(this, 'isLeaf')\n      if (isBoolean(isLeaf)) {\n        this.isLeafByUser = isLeaf\n      }\n    }\n\n    if (store.lazy !== true && this.data) {\n      this.setData(this.data)\n\n      if (store.defaultExpandAll) {\n        this.expanded = true\n        this.canFocus = true\n      }\n    } else if (\n      this.level > 0 &&\n      store.lazy &&\n      store.defaultExpandAll &&\n      !this.isLeafByUser\n    ) {\n      this.expand()\n    }\n    if (!isArray(this.data)) {\n      markNodeData(this, this.data)\n    }\n    if (!this.data) return\n\n    const defaultExpandedKeys = store.defaultExpandedKeys\n    const key = store.key\n\n    if (\n      key &&\n      !isNil(this.key) &&\n      defaultExpandedKeys &&\n      defaultExpandedKeys.includes(this.key)\n    ) {\n      this.expand(null, store.autoExpandParent)\n    }\n\n    if (\n      key &&\n      store.currentNodeKey !== undefined &&\n      this.key === store.currentNodeKey\n    ) {\n      store.currentNode && (store.currentNode.isCurrent = false)\n      store.currentNode = this\n      store.currentNode.isCurrent = true\n    }\n\n    if (store.lazy) {\n      store._initDefaultCheckedNode(this)\n    }\n\n    this.updateLeafState()\n    if (this.level === 1 || this.parent?.expanded === true) this.canFocus = true\n  }\n\n  setData(data: TreeNodeData): void {\n    if (!isArray(data)) {\n      markNodeData(this, data)\n    }\n\n    this.data = data\n    this.childNodes = []\n\n    let children\n    if (this.level === 0 && isArray(this.data)) {\n      children = this.data\n    } else {\n      children = getPropertyFromData(this, 'children') || []\n    }\n\n    for (let i = 0, j = children.length; i < j; i++) {\n      this.insertChild({ data: children[i] })\n    }\n  }\n\n  get label(): string {\n    return getPropertyFromData(this, 'label')\n  }\n\n  get key(): TreeKey | null | undefined {\n    const nodeKey = this.store.key\n    if (this.data) return this.data[nodeKey]\n    return null\n  }\n\n  get disabled(): boolean {\n    return getPropertyFromData(this, 'disabled')\n  }\n\n  get nextSibling(): Nullable<Node> {\n    const parent = this.parent\n    if (parent) {\n      const index = parent.childNodes.indexOf(this)\n      if (index > -1) {\n        return parent.childNodes[index + 1]\n      }\n    }\n    return null\n  }\n\n  get previousSibling(): Nullable<Node> {\n    const parent = this.parent\n    if (parent) {\n      const index = parent.childNodes.indexOf(this)\n      if (index > -1) {\n        return index > 0 ? parent.childNodes[index - 1] : null\n      }\n    }\n    return null\n  }\n\n  contains(target: Node, deep = true): boolean {\n    return (this.childNodes || []).some(\n      (child) => child === target || (deep && child.contains(target))\n    )\n  }\n\n  remove(): void {\n    const parent = this.parent\n    if (parent) {\n      parent.removeChild(this)\n    }\n  }\n\n  insertChild(child?: FakeNode | Node, index?: number, batch?: boolean): void {\n    if (!child) throw new Error('InsertChild error: child is required.')\n\n    if (!(child instanceof Node)) {\n      if (!batch) {\n        const children = this.getChildren(true)\n        if (!children?.includes(child.data)) {\n          if (isUndefined(index) || index < 0) {\n            children?.push(child.data)\n          } else {\n            children?.splice(index, 0, child.data)\n          }\n        }\n      }\n      Object.assign(child, {\n        parent: this,\n        store: this.store,\n      })\n      child = reactive(new Node(child as TreeNodeOptions))\n      if (child instanceof Node) {\n        child.initialize()\n      }\n    }\n\n    ;(child as Node).level = this.level + 1\n\n    if (isUndefined(index) || index < 0) {\n      this.childNodes.push(child as Node)\n    } else {\n      this.childNodes.splice(index, 0, child as Node)\n    }\n\n    this.updateLeafState()\n  }\n\n  insertBefore(child: FakeNode | Node, ref: Node): void {\n    let index\n    if (ref) {\n      index = this.childNodes.indexOf(ref)\n    }\n    this.insertChild(child, index)\n  }\n\n  insertAfter(child: FakeNode | Node, ref: Node): void {\n    let index\n    if (ref) {\n      index = this.childNodes.indexOf(ref)\n      if (index !== -1) index += 1\n    }\n    this.insertChild(child, index)\n  }\n\n  removeChild(child: Node): void {\n    const children = this.getChildren() || []\n    const dataIndex = children.indexOf(child.data)\n    if (dataIndex > -1) {\n      children.splice(dataIndex, 1)\n    }\n\n    const index = this.childNodes.indexOf(child)\n\n    if (index > -1) {\n      this.store && this.store.deregisterNode(child)\n      child.parent = null\n      this.childNodes.splice(index, 1)\n    }\n\n    this.updateLeafState()\n  }\n\n  removeChildByData(data: TreeNodeData | null): void {\n    const targetNode = this.childNodes.find((child) => child.data === data)\n\n    if (targetNode) {\n      this.removeChild(targetNode)\n    }\n  }\n\n  expand(callback?: (() => void) | null, expandParent?: boolean): void {\n    const done = () => {\n      if (expandParent) {\n        let parent = this.parent\n        while (parent && parent.level > 0) {\n          parent.expanded = true\n          parent = parent.parent\n        }\n      }\n      this.expanded = true\n      if (callback) callback()\n      setCanFocus(this.childNodes, true)\n    }\n\n    if (this.shouldLoadData()) {\n      this.loadData((data) => {\n        if (isArray(data)) {\n          if (this.checked) {\n            this.setChecked(true, true)\n          } else if (!this.store.checkStrictly) {\n            reInitChecked(this)\n          }\n          done()\n        }\n      })\n    } else {\n      done()\n    }\n  }\n\n  doCreateChildren(\n    array: TreeNodeData[],\n    defaultProps: TreeNodeLoadedDefaultProps = {}\n  ): void {\n    array.forEach((item) => {\n      this.insertChild(\n        Object.assign({ data: item }, defaultProps),\n        undefined,\n        true\n      )\n    })\n  }\n\n  collapse(): void {\n    this.expanded = false\n    setCanFocus(this.childNodes, false)\n  }\n\n  shouldLoadData() {\n    return Boolean(this.store.lazy === true && this.store.load && !this.loaded)\n  }\n\n  updateLeafState(): void {\n    if (\n      this.store.lazy === true &&\n      this.loaded !== true &&\n      typeof this.isLeafByUser !== 'undefined'\n    ) {\n      this.isLeaf = this.isLeafByUser\n      this.isEffectivelyChecked = this.isLeaf && this.disabled\n      return\n    }\n    const childNodes = this.childNodes\n    if (\n      !this.store.lazy ||\n      (this.store.lazy === true && this.loaded === true)\n    ) {\n      this.isLeaf = !childNodes || childNodes.length === 0\n      this.isEffectivelyChecked = this.isLeaf && this.disabled\n      return\n    }\n    this.isLeaf = false\n  }\n\n  setChecked(\n    value?: boolean | string,\n    deep?: boolean,\n    recursion?: boolean,\n    passValue?: boolean\n  ) {\n    this.indeterminate = value === 'half'\n    this.checked = value === true\n    this.isEffectivelyChecked =\n      !this.childNodes.length && (this.disabled || this.checked)\n\n    if (this.store.checkStrictly) return\n\n    if (!(this.shouldLoadData() && !this.store.checkDescendants)) {\n      const handleDescendants = (): void => {\n        if (deep) {\n          const childNodes = this.childNodes\n          for (let i = 0, j = childNodes.length; i < j; i++) {\n            const child = childNodes[i]\n            passValue = passValue || value !== false\n            const isCheck =\n              child.disabled && child.isLeaf ? child.checked : passValue\n            child.setChecked(isCheck, deep, true, passValue)\n          }\n          const { half, all, isEffectivelyChecked } = getChildState(childNodes)\n          if (!all) {\n            this.checked = all\n            this.indeterminate = half\n          }\n          this.isEffectivelyChecked = !this.childNodes.length\n            ? this.disabled || this.checked\n            : isEffectivelyChecked\n        }\n      }\n\n      if (this.shouldLoadData()) {\n        // Only work on lazy load data.\n        this.loadData(\n          () => {\n            handleDescendants()\n            reInitChecked(this)\n          },\n          {\n            checked: value !== false,\n          }\n        )\n        return\n      } else {\n        handleDescendants()\n      }\n    }\n\n    const parent = this.parent\n    if (!parent || parent.level === 0) return\n\n    if (!recursion) {\n      reInitChecked(parent)\n    }\n  }\n\n  getChildren(forceInit = false): TreeNodeData | TreeNodeData[] | null {\n    // this is data\n    if (this.level === 0) return this.data\n    const data = this.data\n    if (!data) return null\n\n    const props = this.store.props\n    let children = 'children'\n    if (props) {\n      children = props.children || 'children'\n    }\n\n    if (isUndefined(data[children])) {\n      data[children] = null\n    }\n\n    if (forceInit && !data[children]) {\n      data[children] = []\n    }\n\n    return data[children]\n  }\n\n  updateChildren(): void {\n    const newData = (this.getChildren() || []) as TreeNodeData[]\n    const oldData = this.childNodes.map((node) => node.data)\n\n    const newDataMap: Record<TreeKey, TreeNodeData> = {}\n    const newNodes: TreeNodeData[] = []\n\n    newData.forEach((item, index) => {\n      const key = item[NODE_KEY]\n      const isNodeExists =\n        !!key && oldData.some((data) => data?.[NODE_KEY] === key)\n      if (isNodeExists) {\n        newDataMap[key] = { index, data: item }\n      } else {\n        newNodes.push({ index, data: item })\n      }\n    })\n\n    if (!this.store.lazy) {\n      oldData.forEach((item) => {\n        if (!newDataMap[item?.[NODE_KEY]]) this.removeChildByData(item)\n      })\n    }\n\n    newNodes.forEach(({ index, data }) => {\n      this.insertChild({ data }, index)\n    })\n\n    this.updateLeafState()\n  }\n\n  loadData(\n    callback: (data?: TreeNodeData[]) => void,\n    defaultProps: TreeNodeLoadedDefaultProps = {}\n  ) {\n    if (\n      this.store.lazy === true &&\n      this.store.load &&\n      !this.loaded &&\n      (!this.loading || Object.keys(defaultProps).length)\n    ) {\n      this.loading = true\n\n      const resolve = (children: TreeNodeData[]) => {\n        this.childNodes = []\n\n        this.doCreateChildren(children, defaultProps)\n        this.loaded = true\n        this.loading = false\n\n        this.updateLeafState()\n        if (callback) {\n          callback.call(this, children)\n        }\n      }\n      const reject = () => {\n        this.loading = false\n      }\n\n      this.store.load(this, resolve, reject)\n    } else {\n      if (callback) {\n        callback.call(this)\n      }\n    }\n  }\n\n  eachNode(callback: (node: Node) => void) {\n    const arr: Node[] = [this]\n    while (arr.length) {\n      const node = arr.shift()!\n      arr.unshift(...node.childNodes)\n      callback(node)\n    }\n  }\n\n  reInitChecked() {\n    if (this.store.checkStrictly) return\n    reInitChecked(this)\n  }\n}\n\nexport default Node\n"],"mappings":"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"}