{"version":3,"file":"tree-node.mjs","sources":["../../../../node_modules/lodash/uniqueId.js","../../../../src/_common/js/tree/tree-node.ts"],"sourcesContent":["var toString = require('./toString');\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n  var id = ++idCounter;\n  return toString(prefix) + id;\n}\n\nmodule.exports = uniqueId;\n","import isNull from 'lodash/isNull';\nimport isFunction from 'lodash/isFunction';\nimport isNumber from 'lodash/isNumber';\nimport uniqueId from 'lodash/uniqueId';\nimport isNil from 'lodash/isNil';\nimport get from 'lodash/get';\nimport { TreeStore } from './tree-store';\nimport {\n  TreeNodeValue,\n  TreeNodeState,\n  TypeIdMap,\n  TypeTreeItem,\n  TypeSettingOptions,\n  TypeTreeNodeModel,\n  TypeTreeNodeData,\n} from './types';\nimport {\n  createNodeModel,\n} from './tree-node-model';\nimport log from '../log';\n\nconst { hasOwnProperty } = Object.prototype;\n\n// 这里的属性为 data 中属性可以同步到 treeNode 实例属性的白名单\n// 仅 label 属性和在列表中的属性可以通过 set 方法配置到 treeNode 实例上\nexport const setableStatus: Record<string, boolean | null> = {\n  expandMutex: null,\n  activable: null,\n  checkable: null,\n  draggable: null,\n  loading: false,\n};\n\nexport const setableProps = Object.keys(setableStatus);\n\nexport const syncableProps = [...setableProps, 'actived', 'expanded', 'checked'];\n\nexport const privateKey = '__tdesign_id__';\n\n// vm 开头为视图属性，不可以外部设置\n// 用于触发视图更新\n// public 方法，在 ui 组件中有可能在使用，会保障其输入输出实现\n// private 方法，可能会改动其输入输出\n\n/**\n * tree 节点数据模型\n * @class TreeNode\n * @param {TreeStore} tree TreeStore 实例\n * @param {object} [data] 节点数据\n * @param {TreeNode} parent 指定的当前 TreeStore 实例中的父节点\n */\nexport class TreeNode {\n  // 节点隶属的树实例\n  public tree: TreeStore;\n\n  // 节点 id ，唯一标志\n  public value: string;\n\n  // 节点文本\n  public label: string;\n\n  // 节点数据\n  public data: TypeTreeNodeData;\n\n  // 父节点\n  public parent: TreeNode;\n\n  // 子节点列表\n  public children: TreeNode[] | boolean;\n\n  // 暴露的 treeNodeModel，这个对象的属性和 api 提供给用户使用\n  public model: TypeTreeNodeModel;\n\n  // 是否为叶节点\n  public vmIsLeaf: boolean;\n\n  // 是否为子节点中的第一个\n  public vmIsFirst: boolean;\n\n  // 是否为子节点中的最后\n  public vmIsLast: boolean;\n\n  // 节点是否是经过过滤剩下的\n  public vmIsRest: boolean;\n\n  // 节点是否展示为锁定状态\n  public vmIsLocked: boolean;\n\n  // 节点在视图上实际的展开状态\n  public expanded: boolean;\n\n  // 展开时是否收起同级节点，对子节点生效\n  public expandMutex: null | boolean;\n\n  // 节点在视图上实际的激活状态\n  public actived: boolean;\n\n  // 是否可激活\n  public activable: null | boolean;\n\n  // 是否可选中\n  public checkable: null | boolean;\n\n  // 是否可选中的视图呈现\n  public vmCheckable: boolean;\n\n  // 节点在视图上实际的选中态\n  public checked: boolean;\n\n  // 节点实际是否为半选状态\n  public indeterminate: boolean;\n\n  // 节点是否已禁用\n  public disabled: null | boolean;\n\n  // 节点是否可拖动\n  public draggable: null | boolean;\n\n  // 节点是否可视\n  public visible: boolean;\n\n  // 节点在树中的层级\n  public level: number;\n\n  // 节点是否正在加载数据\n  public loading: boolean;\n\n  public constructor(\n    tree: TreeStore,\n    data?: TypeTreeNodeData,\n    parent?: TreeNode,\n  ) {\n    this.data = data;\n    this.tree = tree;\n\n    const config = tree.config || {};\n    const prefix = config.prefix || 'x';\n    const keys = config.keys || {};\n    const propChildren = keys.children || 'children';\n    const propLabel = keys.label || 'label';\n    const propValue = keys.value || 'value';\n    const propsDisabled = keys.disabled || 'disabled';\n\n    // 节点自身初始化数据\n    this.model = null;\n    this.children = null;\n    this.level = 0;\n\n    // vm 开头为视图属性，不可以外部设置\n    this.vmCheckable = false;\n    this.vmIsLeaf = false;\n    this.vmIsFirst = false;\n    this.vmIsLast = false;\n    this.vmIsRest = false;\n    this.vmIsLocked = false;\n\n    // 初始化节点基本状态\n    this.visible = false;\n    this.actived = false;\n    this.checked = false;\n    this.indeterminate = false;\n    this.loading = false;\n    this.expanded = config.expandAll;\n\n    // 下面几个属性，节点初始化的时候，可以设置与 treeStore.config 不同的值\n    // 初始化默认值为 null, 则在方法判断时，默认以 treeStore.config 为准\n    // 传递或者设置属性为 boolean 类型的值，则以节点属性值为准\n    // 这种处理方式主要是解决 treeStore.setConfig 方法配置全局属性导致的状态切换与保留的问题\n    this.activable = null;\n    this.checkable = null;\n    this.expandMutex = null;\n    this.draggable = null;\n\n    // 为节点设置唯一 id\n    // tree 数据替换时，value 相同有可能导致节点状态渲染冲突\n    // 用这个 唯一 id 来解决，用于类似 vue 组件的唯一 key 指定场景\n    this[privateKey] = uniqueId(prefix);\n\n    // 设置 value\n    // 没有 value 的时候，value 默认使用自动生成的 唯一 id\n    this.value = isNil(get(data, propValue)) ? this[privateKey] : get(data, propValue);\n    const { nodeMap, privateMap } = tree;\n    if (nodeMap.get(this.value)) {\n      log.warn('Tree', `Dulplicate value: ${this.value}`);\n    }\n    nodeMap.set(this.value, this);\n    privateMap.set(this[privateKey], this);\n\n    // 设置标签\n    this.label = get(data, propLabel) || '';\n    // 设置是否禁用\n    this.disabled = get(data, propsDisabled);\n\n    // 设置子节点\n    const children = data[propChildren];\n    // 子节点为 true 的状态逻辑需要放到状态计算之前\n    // 初始化加载逻辑需要依据这个来进行\n    if (children === true) {\n      this.children = children;\n    }\n\n    // 设置父节点\n    if (parent && parent instanceof TreeNode) {\n      this.parent = parent;\n    } else {\n      this.parent = null;\n    }\n\n    // 同步数据属性到节点属性\n    // 仅 syncableStatus 列举的属性被同步到 treeNode 实例属性\n    syncableProps.forEach((prop) => {\n      if (typeof data[prop] !== 'undefined') {\n        this[prop] = data[prop];\n      }\n    });\n\n    // 初始化节点状态\n    this.initActived();\n    this.initExpanded();\n    this.initChecked();\n\n    // 这里的子节点加载逻辑不能放到状态初始化之前\n    // 因为子节点状态计算依赖父节点初始化状态\n    if (Array.isArray(children)) {\n      this.append(children);\n    } else if (children === true && !config.lazy) {\n      this.loadChildren();\n    }\n\n    // checked 状态依赖于子节点状态\n    // 因此子节点插入之后需要再次更新状态\n    this.updateChecked();\n\n    // 标记节点更新\n    this.update();\n    // 创建节点需要回流操作\n    tree.reflow(this);\n  }\n\n  /* ------ 状态初始化 ------ */\n\n  /**\n   * 初始化选中态\n   * @return void\n   */\n  private initChecked(): void {\n    const { tree, value, parent } = this;\n    const { checkedMap } = tree;\n    const { checkStrictly } = tree.config;\n    if (this.checked) {\n      checkedMap.set(value, true);\n    }\n    if (!checkStrictly && parent?.isChecked()) {\n      checkedMap.set(value, true);\n    }\n    this.updateChecked();\n  }\n\n  /**\n   * 初始化节点展开状态\n   * @return void\n   */\n  private initExpanded(): void {\n    const { tree } = this;\n    let { expanded } = this;\n    const { config } = tree;\n    if (\n      isNumber(config.expandLevel)\n      && this.getLevel() < config.expandLevel\n    ) {\n      tree.expandedMap.set(this.value, true);\n      expanded = true;\n    }\n    if (this.children === true && config.lazy) {\n      expanded = false;\n    }\n    if (expanded) {\n      tree.expandedMap.set(this.value, true);\n    } else {\n      tree.expandedMap.delete(this.value);\n    }\n    this.expanded = expanded;\n  }\n\n  /**\n   * 初始化节点激活状态\n   * @return void\n   */\n  private initActived(): void {\n    const { tree, actived } = this;\n    if (actived && this.isActivable()) {\n      tree.activedMap.set(this.value, true);\n    }\n  }\n\n  /* ------ 节点操作 ------ */\n\n  /**\n   * 追加节点数据\n   * @param {object | object[]} data 节点数据\n   * @return void\n   */\n  public append(data: TypeTreeNodeData | TypeTreeNodeData[]): void {\n    const list = [];\n    if (!Array.isArray(data)) {\n      list.push(data);\n    } else {\n      list.push(...data);\n    }\n    if (list.length <= 0) {\n      return;\n    }\n    if (!Array.isArray(this.children)) {\n      this.children = [];\n    }\n    const { children, tree } = this;\n    list.forEach((item) => {\n      let node = null;\n      if (item instanceof TreeNode) {\n        node = item;\n        node.appendTo(this.tree, this);\n      } else {\n        node = new TreeNode(this.tree, item, this);\n        children.push(node);\n      }\n    });\n    tree.reflow(this);\n    this.updateRelated();\n  }\n\n  /**\n   * 将当前节点追加到某个父节点的子节点列表中\n   * @param {TreeStore} tree 目标树\n   * @param {TreeNode} [parent] 目标父节点\n   * @param {number} [index] 预期在子节点列表中的位置\n   * @return void\n   */\n  public appendTo(\n    tree: TreeStore,\n    parent?: TreeNode,\n    index?: number,\n  ): void {\n    const parentNode = parent;\n    let targetIndex = -1;\n    if (isNumber(index)) {\n      targetIndex = index;\n    }\n\n    const targetParents = parentNode?.getParents() || [];\n    const includeCurrent = targetParents.some((pnode) => pnode === this);\n    if (includeCurrent) {\n      throw new Error('无法将父节点插入到子节点');\n    }\n\n    if (parentNode === this) {\n      throw new Error('无法将节点插入到本节点');\n    }\n\n    if (Array.isArray(parentNode?.children)) {\n      const targetPosNode = parentNode?.children[targetIndex];\n      if (targetPosNode && targetPosNode === this) {\n        // 无需将节点插入到原位置\n        return;\n      }\n    }\n\n    // 先要取得 siblings\n    // 因为要应对节点在同一个 siblings 中变换位置的情况\n    let siblings = null;\n    if (parentNode instanceof TreeNode) {\n      if (!Array.isArray(parentNode?.children)) {\n        parentNode.children = [];\n      }\n      siblings = parent.children;\n    } else {\n      siblings = tree.children;\n    }\n\n    // 上面的逻辑其实已经覆盖了所有业务情况\n    // 这里的逻辑报错仅用于极限兜底，防止 treeStore 被误使用\n    if (!Array.isArray(siblings)) {\n      throw new Error('无法插入到目标位置，可插入的节点列表不存在');\n    }\n\n    const prevLength = siblings.length;\n    const prevIndex = this.getIndex();\n\n    this.remove();\n\n    if (isNumber(index)) {\n      let targetIndex = index;\n      if (parentNode === this.parent) {\n        // 前置节点被拔出后再插入到同一个 siblings 时，会引起目标 index 的变化\n        // 因此要相应的变更插入位置\n        // 后置节点被拔出时，目标 index 是不变的\n        const curLength = siblings.length;\n        if (\n          curLength < prevLength\n          && prevIndex <= targetIndex\n        ) {\n          targetIndex -= 1;\n        }\n      }\n      siblings.splice(targetIndex, 0, this);\n    } else {\n      siblings.push(this);\n    }\n\n    this.parent = parentNode;\n\n    // 插入节点应当继承展开状态\n    // 但不要继承选中状态和高亮状态\n    const nodes = this.walk();\n    nodes.forEach((item) => {\n      const node = item;\n      node.tree = tree;\n      tree.nodeMap.set(node.value, node);\n      tree.privateMap.set(node[privateKey], node);\n      if (node.expanded) {\n        tree.expandedMap.set(node.value, true);\n      }\n    });\n\n    const updateNodes = parentNode?.walk() || tree.children.map((item) => item.walk()).flat();\n    updateNodes.forEach((node) => {\n      node.update();\n      node.updateChecked();\n    });\n\n    tree.reflow();\n  }\n\n  /**\n   * 插入一个节点或者数据到到同级节点的目标位置\n   * @param {TreeNode | object} item 要插入的节点或者数据\n   * @param {number} [index] 预期在子节点列表中的位置\n   * @return void\n   */\n  private insert(\n    item: TypeTreeItem,\n    index?: number,\n  ): void {\n    const { tree, parent } = this;\n    const siblings = this.getSiblings();\n    let node = null;\n    if (item instanceof TreeNode) {\n      node = item;\n      node.appendTo(tree, parent, index);\n    } else if (item) {\n      node = new TreeNode(tree, item, parent);\n      if (isNumber(index)) {\n        siblings.splice(index, 0, node);\n      }\n      siblings.forEach((sibling) => {\n        sibling.update();\n      });\n    }\n    tree.reflow();\n  }\n\n  /**\n   * 在当前节点之前插入节点\n   * @param {TreeNode | object} newData 要插入的节点或者数据\n   * @return void\n   */\n  public insertBefore(newData: TypeTreeItem): void {\n    const index = this.getIndex();\n    this.insert(newData, index);\n  }\n\n  /**\n   * 在当前节点之后插入节点\n   * @param {TreeNode | object} newData 要插入的节点或者数据\n   * @return void\n   */\n  public insertAfter(newData: TypeTreeItem): void {\n    const index = this.getIndex();\n    this.insert(newData, index + 1);\n  }\n\n  /**\n   * 从当前树中移除本节点\n   * @return void\n   */\n  public remove(): void {\n    const { tree } = this;\n\n    const nodes = this.walk();\n    const siblings = this.getSiblings();\n    const index = this.getIndex();\n    // 从父节点的子节点列表中移除自己\n    // 但不要将自己的父节点移除，避免渲染与判断失败\n    if (Array.isArray(siblings)) {\n      siblings.splice(index, 1);\n    }\n    // 清理与树的关系，但不清理自身状态\n    nodes.forEach((node) => {\n      node.clean();\n    });\n    // 同级节点的连线状态会受到影响\n    siblings.forEach((node) => {\n      node.update();\n    });\n    // 父节点选中态会受到影响\n    this.updateParents();\n    tree.reflow();\n  }\n\n  /**\n   * 清除本节点与当前树的关系\n   * @return void\n   */\n  private clean(): void {\n    const { tree, value } = this;\n    tree.activedMap.delete(value);\n    tree.checkedMap.delete(value);\n    tree.expandedMap.delete(value);\n    tree.nodeMap.delete(value);\n    tree.filterMap.delete(value);\n    tree.privateMap.delete(this[privateKey]);\n  }\n\n  /**\n   * 异步加载子节点\n   * @return Promise<void>\n   */\n  private async loadChildren(): Promise<void> {\n    const config = get(this, 'tree.config') || {};\n    if (this.children === true && !this.loading) {\n      if (isFunction(config.load)) {\n        this.loading = true;\n        this.update();\n        let list = [];\n        list = await config.load(this);\n        this.tree.emit('load', {\n          node: this,\n          data: list,\n        });\n        this.loading = false;\n        if (Array.isArray(list) && list.length > 0) {\n          this.append(list);\n        } else {\n          this.children = false;\n        }\n        this.update();\n      }\n    }\n  }\n\n  /**\n   * 设置节点状态\n   * - 为节点设置独立于配置的 disabled 状态: set({ disabled: true })\n   * - 清除独立于配置的 disabled 状态: set({ disabled: null })\n   * @param {object} item 节点状态对象\n   * @return void\n   */\n  public set(item: TreeNodeState): void {\n    const { tree } = this;\n    const keys = Object.keys(item);\n    keys.forEach((key) => {\n      if (hasOwnProperty.call(setableStatus, key) || key === 'label' || key === 'disabled') {\n        this[key] = item[key];\n      }\n    });\n    tree.updated(this);\n  }\n\n  /* ------ 节点获取 ------- */\n\n  /**\n   * 获取本节点的父节点\n   * @return TreeNode 父节点\n   */\n  public getParent(): TreeNode {\n    return this.parent;\n  }\n\n  /**\n   * 获取所有父级节点\n   * - 顺序为从当前到根\n   * @return TreeNode[] 父级节点数组\n   */\n  public getParents(): TreeNode[] {\n    const parents = [];\n    let node = this.parent;\n    while (node) {\n      parents.push(node);\n      node = node.parent;\n    }\n    return parents;\n  }\n\n  /**\n   * 获取所有兄弟节点，包含自己在内\n   * @return TreeNode[] 兄弟节点数组\n   */\n  public getSiblings(): TreeNode[] {\n    const { parent, tree } = this;\n    let list: TreeNode[] = [];\n    if (parent) {\n      if (Array.isArray(parent.children)) {\n        list = parent.children;\n      }\n    } else if (tree) {\n      list = tree.children;\n    }\n    return list;\n  }\n\n  /**\n   * 获取本节点的根节点\n   * @return TreeNode 根节点\n   */\n  public getRoot(): TreeNode {\n    const parents = this.getParents();\n    return parents[parents.length - 1] || null;\n  }\n\n  /**\n   * 获取节点在父节点的子节点列表中的位置\n   * - 如果没有父节点，则获取节点在根节点列表的位置\n   * @return number 节点位置序号\n   */\n  public getIndex(): number {\n    const list = this.getSiblings();\n    return list.indexOf(this);\n  }\n\n  /**\n   * 返回路径节点\n   * - 路径节点包含自己在内\n   * - 节点顺序与父级节点顺序相反，从根到当前\n   * @return TreeNode[] 路径节点数组\n   */\n  public getPath(): TreeNode[] {\n    const nodes = this.getParents();\n    nodes.unshift(this);\n    return nodes.reverse();\n  }\n\n  /**\n   * 获取节点所在层级\n   * @return number 层级序号\n   */\n  public getLevel(): number {\n    const parents = this.getParents();\n    return parents.length;\n  }\n\n  /* ------ 节点状态判断 ------ */\n\n  /**\n   * 判断节点是否被过滤\n   * @return boolean 是否被过滤方法命中\n   */\n  public isRest(): boolean {\n    const {\n      config,\n      filterMap,\n      hasFilter,\n    } = this.tree;\n\n    let rest = false;\n    if (hasFilter) {\n      // 仅在存在过滤条件时，过滤命中才有效\n      const nodeModel = this.getModel();\n      rest = config.filter(nodeModel);\n    }\n\n    if (rest) {\n      filterMap.set(this.value, true);\n    } else if (filterMap.get(this.value)) {\n      filterMap.delete(this.value);\n    }\n\n    return rest;\n  }\n\n  /**\n   * 判断节点是否可见\n   * @return boolean 是否可见\n   */\n  public isVisible(): boolean {\n    const {\n      nodeMap,\n      hasFilter,\n      config,\n    } = this.tree;\n    const { allowFoldNodeOnFilter } = config;\n\n    let visible = true;\n\n    if (!nodeMap.get(this.value)) {\n      // 节点不在当前树上，所以不可见\n      return false;\n    }\n\n    if (hasFilter && !allowFoldNodeOnFilter) {\n      // 如果存在过滤条件\n      // 锁定状态和过滤命中状态，直接呈现\n      visible = (this.vmIsLocked || this.vmIsRest);\n      return visible;\n    }\n\n    // 标志所有父节点展开导致的可见状态\n    let expandVisible = true;\n    const parents = this.getParents();\n    if (parents.length > 0) {\n      expandVisible = parents.every((node: TreeNode) => node.expanded);\n    }\n\n    if (hasFilter) {\n      visible = expandVisible && (this.vmIsRest || this.vmIsLocked);\n    } else {\n      visible = expandVisible;\n    }\n    return visible;\n  }\n\n  /**\n   * 判断节点是否被禁用\n   * @return boolean 是否被禁用\n   */\n  public isDisabled(): boolean {\n    const { tree } = this;\n    const { hasFilter, config } = tree;\n    const { disabled, allowFoldNodeOnFilter } = config;\n    if (hasFilter && !allowFoldNodeOnFilter && this.vmIsLocked && !this.vmIsRest) return true;\n    let state = disabled;\n    if (typeof this.disabled === 'boolean') {\n      state = this.disabled;\n    }\n    return state;\n  }\n\n  /**\n   * 判断节点是否能拖拽\n   * @return boolean 是否能拖拽\n   */\n  public isDraggable(): boolean {\n    let state = !!get(this, 'tree.config.draggable');\n    if (typeof this.draggable === 'boolean') {\n      state = this.draggable;\n    }\n    return state;\n  }\n\n  /**\n   * 判断子节点是否互斥展开\n   * @return boolean 子节点是否互斥展开\n   */\n  public isExpandMutex(): boolean {\n    let state = !!get(this, 'tree.config.expandMutex');\n    if (typeof this.expandMutex === 'boolean') {\n      state = this.expandMutex;\n    }\n    return state;\n  }\n\n  /**\n   * 节点是否可被激活\n   * @return boolean 是否可被激活\n   */\n  public isActivable() {\n    let state = !!get(this, 'tree.config.activable');\n    if (typeof this.activable === 'boolean') {\n      state = this.activable;\n    }\n    return state;\n  }\n\n  /**\n   * 节点是否可选\n   * @return boolean 是否可选\n   */\n  public isCheckable() {\n    let state = !!get(this, 'tree.config.checkable');\n    if (typeof this.checkable === 'boolean') {\n      state = this.checkable;\n    }\n    return state;\n  }\n\n  /**\n   * 节点是否被激活\n   * @param {Map} [map] 预设激活节点 map, 用于计算节点在预期环境中的激活状态\n   * @return boolean 是否被激活\n   */\n  public isActived(map?: Map<string, boolean>): boolean {\n    const { tree, value } = this;\n    const activedMap = map || tree.activedMap;\n    return !!(tree.nodeMap.get(value) && activedMap.get(value));\n  }\n\n  /**\n   * 节点是否已展开\n   * @param {Map} [map] 预设展开节点 map, 用于计算节点在预期环境中的展开状态\n   * @return boolean 是否已展开\n   */\n  public isExpanded(map?: Map<string, boolean>): boolean {\n    const { tree, value, vmIsLocked } = this;\n    const { hasFilter, config } = tree;\n    const { allowFoldNodeOnFilter } = config;\n    if (hasFilter && !allowFoldNodeOnFilter && vmIsLocked) return true;\n    const expandedMap = map || tree.expandedMap;\n    return !!(tree.nodeMap.get(value) && expandedMap.get(value));\n  }\n\n  /**\n   * 节点是否被选中\n   * @param {Map} [map] 预设选中节点 map, 用于计算节点在预期环境中的选中态\n   * @return boolean 是否被选中\n   */\n  public isChecked(map?: TypeIdMap): boolean {\n    const { children, tree, value } = this;\n    const { checkStrictly } = tree.config;\n    // 节点不在当前树上，视为未选中\n    if (!tree.nodeMap.get(value)) return false;\n    // 节点不可选，视为未选中\n    if (!this.isCheckable()) return false;\n    const checkedMap = map || tree.checkedMap;\n    let checked = false;\n    // 如果在 checkedMap 中，则直接为 true\n    if (checkedMap.get(value)) {\n      return true;\n    }\n    // 严格模式，则已经可以判定选中状态\n    if (checkStrictly) return checked;\n    // 允许关联状态的情况下，需要进一步判断\n    if (\n      Array.isArray(children)\n      && children.length > 0\n    ) {\n      // 子节点全部选中，则当前节点选中\n      checked = children.every((node) => {\n        const childIsChecked = node.isChecked(checkedMap);\n        return childIsChecked;\n      });\n    } else {\n      // 从父节点状态推断子节点状态\n      // 这里再调用 isChecked 会导致死循环\n      const parents = this.getParents();\n      checked = parents.some((node) => checkedMap.get(node.value));\n    }\n    return checked;\n  }\n\n  /**\n   * 是否为半选状态\n   * @return boolean 是否为半选状态\n   */\n  public isIndeterminate(): boolean {\n    const { children, tree, value } = this;\n    const { checkStrictly } = tree.config;\n    // 节点不在当前树上，视为未选中\n    if (!tree.nodeMap.get(value)) return false;\n    // 节点不可选，视为未选中\n    if (!this.isCheckable()) return false;\n    // 严格模式没有半选状态\n    if (checkStrictly) return false;\n    // 叶节点不存在半选状态\n    if (!Array.isArray(children)) return false;\n\n    let childChecked: null | boolean = null;\n    const indeterminate = children.some((node: TreeNode) => {\n      if (node.isIndeterminate()) {\n        // 子节点有任意一个半选，则其为半选状态\n        return true;\n      }\n      if (isNull(childChecked)) {\n        childChecked = node.isChecked();\n      }\n      if (childChecked !== node.isChecked()) {\n        // 子节点选中状态不一致，则其为半选状态\n        return true;\n      }\n      return false;\n    });\n\n    return indeterminate;\n  }\n\n  /**\n   * 是否为兄弟节点中的第一个节点\n   * @return boolean 是否为第一个节点\n   */\n  public isFirst(): boolean {\n    const siblings = this.getSiblings();\n    return siblings[0] === this;\n  }\n\n  /**\n   * 是否为兄弟节点中的最后一个节点\n   * @return boolean 是否为最后一个节点\n   */\n  public isLast(): boolean {\n    const siblings = this.getSiblings();\n    return siblings[siblings.length - 1] === this;\n  }\n\n  /**\n   * 是否为叶子节点，叶子节点没有子节点\n   * @return boolean 是否为叶子节点\n   */\n  public isLeaf(): boolean {\n    let isLeaf = false;\n    if (Array.isArray(this.children)) {\n      isLeaf = this.children.length <= 0;\n    } else {\n      isLeaf = !this.children;\n    }\n    return isLeaf;\n  }\n\n  /* ------ 节点状态切换 ------ */\n\n  /**\n   * 锁定节点，解锁节点\n   * - 搜索过滤节点时，路径节点需要固定呈现，视其为锁定态\n   * @param {boolean} lockState 锁定状态\n   * @return void\n   */\n  public lock(lockState: boolean): void {\n    this.vmIsLocked = lockState;\n    this.expanded = this.isExpanded();\n    this.visible = this.isVisible();\n  }\n\n  /**\n   * 节点展开关闭后需要调用的状态检查函数\n   * @return void\n   */\n  public afterExpanded(): void {\n    this.update();\n    // 节点展开时检查延迟加载的数据\n    if (this.expanded && this.children === true) {\n      this.loadChildren();\n    }\n    this.updateChildren();\n  }\n\n  /**\n   * 切换节点展开状态\n   * - 用于受控逻辑处理\n   * - 仅返回预期状态值数组，不直接操作状态\n   * @return string[] 当前树展开的节点值数组\n   */\n  public toggleExpanded(): TreeNodeValue[] {\n    return this.setExpanded(!this.isExpanded());\n  }\n\n  /**\n   * 设置节点展开状态\n   * @param {boolean} expanded 节点展开状态\n   * @param {object} [opts] 操作选项\n   * @param {boolean} [opts.directly=false] 是否直接操作节点状态\n   * @return string[] 当前树展开的节点值数组\n   */\n  public setExpanded(expanded: boolean, opts?: TypeSettingOptions): TreeNodeValue[] {\n    const { tree } = this;\n    const { config } = tree;\n    const options = {\n      directly: false,\n      ...opts,\n    };\n\n    let map = tree.expandedMap;\n    if (!options.directly) {\n      map = new Map(tree.expandedMap);\n    }\n\n    // 手风琴效果，先折叠同级节点\n    if (expanded) {\n      // 列举需要展开的节点\n      const shouldExpandNodes = [];\n      // 自己一定在展开列表中\n      shouldExpandNodes.push(this);\n      if (config.expandParent) {\n        // expandParent 为 true，则父节点都要展开\n        this.getParents().forEach((node) => {\n          shouldExpandNodes.push(node);\n        });\n      }\n      shouldExpandNodes.forEach((node) => {\n        let isExpandMutex = false;\n        // 对于每一个节点，都需要判断是否启用手风琴效果\n        if (node.parent) {\n          isExpandMutex = node.parent.isExpandMutex();\n        } else {\n          isExpandMutex = tree?.config?.expandMutex;\n        }\n        if (isExpandMutex) {\n          // 折叠列表中，先移除同级节点\n          const siblings = node.getSiblings();\n          siblings.forEach((snode) => {\n            map.delete(snode.value);\n            // 同级节点相关状态更新\n            snode.update();\n            snode.updateChildren();\n          });\n        }\n        // 最后设置自己的折叠状态\n        map.set(node.value, true);\n        node.update();\n        node.updateChildren();\n      });\n    } else {\n      map.delete(this.value);\n    }\n\n    if (options.directly) {\n      this.afterExpanded();\n    }\n\n    return tree.getExpanded(map);\n  }\n\n  /**\n   * 切换节点激活状态\n   * - 用于受控逻辑处理\n   * - 仅返回预期状态值数组，不直接操作状态\n   * @return string[] 当前树激活的节点值数组\n   */\n  public toggleActived(): TreeNodeValue[] {\n    return this.setActived(!this.isActived());\n  }\n\n  /**\n   * 设置节点激活状态\n   * @param {boolean} actived 节点激活状态\n   * @param {object} [opts] 操作选项\n   * @param {boolean} [opts.directly=false] 是否直接操作节点状态\n   * @return string[] 当前树激活的节点值数组\n   */\n  public setActived(actived: boolean, opts?: TypeSettingOptions): TreeNodeValue[] {\n    const { tree } = this;\n    const options = {\n      directly: false,\n      ...opts,\n    };\n    const config = tree.config || {};\n    let map = tree.activedMap;\n    if (!options.directly) {\n      map = new Map(tree.activedMap);\n    }\n    if (this.isActivable()) {\n      if (actived) {\n        const prevKeys = Array.from(map.keys());\n        if (!config.activeMultiple) {\n          map.clear();\n        }\n        prevKeys.forEach((value) => {\n          const node = tree.getNode(value);\n          node?.update();\n        });\n        map.set(this.value, true);\n      } else {\n        map.delete(this.value);\n      }\n    }\n    this.update();\n    return tree.getActived(map);\n  }\n\n  /**\n   * 切换节点选中状态\n   * - 用于受控逻辑处理\n   * - 仅返回预期状态值数组，不直接操作状态\n   * @return string[] 当前树选中的节点值数组\n   */\n  public toggleChecked(): TreeNodeValue[] {\n    return this.setChecked(!this.isChecked());\n  }\n\n  /**\n   * 设置节点选中状态\n   * - 节点 UI 操作时调用这个方法\n   * - 节点设置自身状态时调用这个方法\n   * @param {boolean} checked 节点选中状态\n   * @param {object} [opts] 操作选项\n   * @param {boolean} [opts.isAction=true] 是否为 UI 动作\n   * @param {boolean} [opts.directly=false] 是否直接操作节点状态\n   * @return string[] 当前树选中的节点值数组\n   */\n  public setChecked(checked: boolean, opts?: TypeSettingOptions): TreeNodeValue[] {\n    const { tree } = this;\n    const config = tree.config || {};\n    const options: TypeSettingOptions = {\n      // 为 true, 为 UI 操作，状态扩散受 disabled 影响\n      // 为 false, 为值操作, 状态扩散不受 disabled 影响\n      isAction: true,\n      // 为 true, 直接操作节点状态\n      // 为 false, 返回预期状态\n      directly: false,\n      ...opts,\n    };\n    let map = tree.checkedMap;\n    if (!options.directly) {\n      map = new Map(tree.checkedMap);\n    }\n    if (!this.isCheckable()) {\n      // 当前节点非可选节点，则不可设置选中态\n      return tree.getChecked(map);\n    }\n    if (options.isAction && this.isDisabled()) {\n      // 对于 UI 动作，禁用时不可切换选中态\n      return tree.getChecked(map);\n    }\n    if (checked === this.isChecked()) {\n      // 值没有变更，则选中态无变化\n      return tree.getChecked(map);\n    }\n\n    if (checked) {\n      map.set(this.value, true);\n    } else {\n      map.delete(this.value);\n    }\n\n    if (config.checkStrictly) {\n      // 严格模式下，选中态不扩散，仅操作节点自身\n      if (options.directly) {\n        // 严格模式值更新节点自身\n        this.updateChecked();\n      }\n    } else {\n      // 先向下游扩散选中态\n      this.spreadChildrenChecked(checked, map, options);\n      // 再计算上游选中态\n      this.spreadParentChecked(checked, map, options);\n      // 状态更新务必放到扩散动作之后\n      // 过早的状态更新会导致后续计算出错\n      if (options.directly) {\n        const relatedNodes = tree.getRelatedNodes([this.value], {\n          reverse: true,\n        });\n        relatedNodes.forEach((node) => {\n          node.updateChecked();\n        });\n      }\n    }\n\n    return tree.getChecked(map);\n  }\n\n  // 选中态向上游扩散\n  private spreadParentChecked(checked: boolean, map?: TypeIdMap, opts?: TypeSettingOptions) {\n    const options: TypeSettingOptions = {\n      isAction: true,\n      directly: false,\n      ...opts,\n    };\n\n    // 碰到不可选节点，中断扩散\n    if (!this.isCheckable()) return;\n\n    const { children } = this;\n    if (Array.isArray(children) && children.length > 0) {\n      // 有子节点，则选中态由子节点选中态集合来决定\n      map.delete(this.value);\n    }\n\n    const { parent } = this;\n    if (!parent) return;\n    parent.spreadParentChecked(checked, map, options);\n  }\n\n  // 选中态向下游扩散\n  private spreadChildrenChecked(checked: boolean, map?: TypeIdMap, opts?: TypeSettingOptions) {\n    const options: TypeSettingOptions = {\n      isAction: true,\n      directly: false,\n      ...opts,\n    };\n\n    // 碰到不可选节点，中断扩散\n    if (!this.isCheckable()) return;\n    // 对于 UI 动作操作，节点禁用，中断扩散\n    if (options.isAction && this.isDisabled()) return;\n\n    const { children } = this;\n    if (!Array.isArray(children)) return;\n    children.forEach((node) => {\n      // 对于 UI 动作，向下扩散时，禁用状态会阻止状态切换\n      if (options.isAction && node.isDisabled()) return;\n      if (checked) {\n        map.set(node.value, true);\n      } else {\n        map.delete(node.value);\n      }\n      node.spreadChildrenChecked(checked, map, options);\n    });\n  }\n\n  /* ------ 节点状态更新 ------ */\n\n  /**\n   * 更新节点当前状态，将节点放到延时更新检查队列\n   * @return void\n   */\n  public update(): void {\n    this.level = this.getLevel();\n    this.vmIsFirst = this.isFirst();\n    this.vmIsLast = this.isLast();\n    this.vmIsLeaf = this.isLeaf();\n    this.vmCheckable = this.isCheckable();\n    this.vmIsRest = this.isRest();\n    this.actived = this.isActived();\n    this.expanded = this.isExpanded();\n    this.visible = this.isVisible();\n    this.tree.updated(this);\n  }\n\n  /**\n   * 更新节点选中态\n   * @return void\n   */\n  public updateChecked(): void {\n    const { tree, value } = this;\n    const { checkedMap } = tree;\n    this.checked = this.isChecked();\n    this.indeterminate = this.isIndeterminate();\n    if (this.checked) {\n      checkedMap.set(value, true);\n    }\n    tree.updated(this);\n  }\n\n  /**\n   * 更新所有子节点状态\n   * - 不包含自己\n   * @return void\n   */\n  public updateChildren(): void {\n    const { children } = this;\n    if (Array.isArray(children)) {\n      children.forEach((node) => {\n        node.update();\n        node.updateChecked();\n        node.updateChildren();\n      });\n    }\n  }\n\n  /**\n   * 更新所有父级节点状态\n   * - 不包含自己\n   * @return void\n   */\n  public updateParents(): void {\n    const { parent } = this;\n    if (parent) {\n      parent.update();\n      parent.updateChecked();\n      parent.updateParents();\n    }\n  }\n\n  /**\n   * 更新上下游相关节点状态\n   * - 包含自己\n   * @return void\n   */\n  public updateRelated(): void {\n    const { tree } = this;\n    const relatedNodes = tree.getRelatedNodes([this.value]);\n    relatedNodes.forEach((node) => {\n      node.update();\n      node.updateChecked();\n    });\n  }\n\n  /* ------ 节点遍历 ------ */\n\n  /**\n   * 获取包含自己在内所有的子节点\n   * - 包含自己\n   * @return TreeNode[] 遍历结果节点数组\n   */\n  public walk(): TreeNode[] {\n    const { children } = this;\n    let list: TreeNode[] = [];\n    list.push(this);\n    if (Array.isArray(children) && children.length > 0) {\n      children.forEach((node) => {\n        list = list.concat(node.walk());\n      });\n    }\n    return list;\n  }\n\n  /**\n   * 获取节点封装对象\n   * - TreeNode 对象 => TypeTreeNodeModel 对象\n   * - TypeTreeNodeModel 用于封装 treeNode 对外暴露的 api\n   * - 用户仅可操作经过封装的对象，减少了对外暴露的 api，利于代码重构\n   * @return TypeTreeNodeModel 节点封装对象\n   */\n  public getModel(): TypeTreeNodeModel {\n    let { model } = this;\n    if (!model) {\n      model = createNodeModel(this);\n      this.model = model;\n    }\n    return model;\n  }\n}\n\nexport default TreeNode;\n"],"names":["toString","require$$0","idCounter","uniqueId","prefix","id","uniqueId_1","expandMutex","activable","checkable","draggable","loading","_classCallCheck","syncableProps","_this","tree","_createClass","checkedMap","isNumber","expanded","value","list","node","children","targetIndex","siblings","nodes","updateNodes","_regeneratorRuntime","_context","isFunction","data","keys","_this4","parents","rest","filterMap","visible","expandVisible","checked","isNull","childChecked","isLeaf","directly","map","shouldExpandNodes","isExpandMutex","prevKeys","isAction","reverse","relatedNodes","model"],"mappings":"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"}