{"version":3,"file":"tree-store.mjs","sources":["../../../../src/_common/js/tree/tree-store.ts"],"sourcesContent":["import { isArray, isFunction, isNumber, isString, difference, camelCase, isPlainObject } from 'lodash-es';\nimport mitt from 'mitt';\n\nimport { TreeNode, privateKey } from './tree-node';\nimport {\n  TreeNodeValue,\n  TypeIdMap,\n  TypeTargetNode,\n  TypeTreeNodeData,\n  TypeTreeItem,\n  TypeTreeStoreOptions,\n  TypeTreeFilter,\n  TypeTreeFilterOptions,\n  TypeRelatedNodesOptions,\n  TypeTreeEventState,\n  TypeUpdatedMap,\n} from './types';\n\nfunction nextTick(fn: () => void): Promise<void> {\n  const pm = Promise.resolve();\n  pm.then(fn);\n  return pm;\n}\n\n// 保留原有字符串、数字判断，补充 bigint 支持\nfunction isTreeNodeValue(item: unknown): item is TreeNodeValue {\n  return isString(item) || isNumber(item) || typeof item === 'bigint';\n}\n\n// 构建一个树的数据模型\n// 基本设计思想：写入时更新，减少读取消耗，以减少未来实现虚拟滚动所需的计算量\n// 任何一次数据写入，会触发相应节点的状态更新\n// public 方法，在 ui 组件中有可能在使用，会保障其输入输出实现\n// private 方法，可能会改动其输入输出\n\n/**\n * tree 数据模型\n * @class TreeStore\n * @param {object} options tree 组件选项\n * @param {string} [options.prefix=\"t\"] tree 组件内部属性前缀\n * @param {object} options.keys 取值映射对象，部分属性按照其 key/value 来取 treeNode 属性值\n * @param {string} [options.keys.label=\"label\"] 从 data 种取 label 值时读取的属性名称\n * @param {string} [options.keys.value=\"value\"] 从 data 种取 value 值时读取的属性名称\n * @param {string} [options.keys.children=\"children\"] 从 data 种取 children 值时读取的属性名称\n * @param {boolean} [options.expandAll=false] 初始化节点时，是否自动展开\n * @param {number} [options.expandLevel=0] 初始化节点时，自动展开的级别\n * @param {boolean} [options.expandMutex=false] 展开时，是否使用手风琴模式\n * @param {boolean} [options.expandParent=false] 展开节点时，是否自动展开父节点\n * @param {boolean} [options.activable=false] 是否可以激活节点\n * @param {boolean} [options.activeMultiple=false] 激活节点是否使用多选模式\n * @param {boolean} [options.checkable=false] 节点是否可选中\n * @param {boolean} [options.checkStrictly=false] 节点选中是否使用严格模式\n * @param {string} [options.checkAllAffectedBy=\"onlyEnabled\"] 参与父节点全选、半选状态判定的子节点范围\n * @param {boolean} [options.disabled=false] 节点是否禁用\n * @param {boolean|function} [options.disableCheck=false] 节点被禁用的条件\n * @param {boolean} [options.draggable=false] 节点是否可拖动\n * @param {function} [options.load=null] 节点延迟加载函数\n * @param {boolean} [options.lazy=false] 节点是否使用延迟加载模式\n * @param {string} [options.valueMode=\"onlyLeaf\"] 节点选中取值模式\n * @param {function} [options.filter=null] 节点过滤函数\n * @param {function} [options.onLoad=null] 节点延迟加载完成时的回调函数\n * @param {function} [options.onReflow=null] 节点触发回流后的回调\n * @param {function} [options.onUpdate=null] 节点触发更新后的后调\n * @param {boolean} [options.allowFoldNodeOnFilter=false] 过滤时，是否允许折叠节点\n */\nexport class TreeStore {\n  // 根节点集合\n  public children: TreeNode[];\n\n  // 所有节点集合\n  public nodes: TreeNode[];\n\n  // 所有节点映射\n  public nodeMap: Map<TreeNodeValue, TreeNode>;\n\n  // 节点 私有 ID 映射\n  public privateMap: Map<TreeNodeValue, TreeNode>;\n\n  // 配置选项\n  public config: TypeTreeStoreOptions;\n\n  // 活动节点集合\n  public activedMap: TypeIdMap;\n\n  // 数据被更新的节点集合\n  public updatedMap: TypeUpdatedMap;\n\n  // 选中节点集合\n  public checkedMap: TypeIdMap;\n\n  // 展开节点的集合\n  public expandedMap: TypeIdMap;\n\n  // 符合过滤条件的节点的集合\n  public filterMap: TypeIdMap;\n\n  // 存在过滤器标志\n  public hasFilter: boolean;\n\n  // 事件派发器\n  public emitter: ReturnType<typeof mitt>;\n\n  // 数据更新计时器\n  private updateTick: Promise<void>;\n\n  // 识别是否需要重排\n  private shouldReflow: boolean;\n\n  // 树节点过滤器\n  private prevFilter: TypeTreeFilter;\n\n  public constructor(options: TypeTreeStoreOptions) {\n    const config: TypeTreeStoreOptions = {\n      prefix: 't',\n      keys: {},\n      expandAll: false,\n      expandLevel: 0,\n      expandMutex: false,\n      expandParent: false,\n      activable: false,\n      activeMultiple: false,\n      checkable: false,\n      checkStrictly: false,\n      checkAllAffectedBy: 'onlyEnabled',\n      disabled: false,\n      disableCheck: false,\n      draggable: false,\n      load: null,\n      lazy: false,\n      valueMode: 'onlyLeaf',\n      filter: null,\n      // 每次搜索条件变更，重置展开状态，路径节点展开，显示命中节点\n      // allowFoldNodeOnFilter 为 true 时，搜索条件不变的情况下，允许折叠路径节点\n      // 默认状态，allowFoldNodeOnFilter 为 false 时，路径节点无法折叠\n      allowFoldNodeOnFilter: false,\n      onLoad: null,\n      onReflow: null,\n      onUpdate: null,\n      ...options,\n    };\n    this.config = config;\n    this.nodes = [];\n    this.children = [];\n    this.nodeMap = new Map();\n    this.privateMap = new Map();\n    this.activedMap = new Map();\n    this.expandedMap = new Map();\n    this.checkedMap = new Map();\n    this.updatedMap = new Map();\n    this.filterMap = new Map();\n    this.prevFilter = null;\n    // 这个计时器确保频繁的 update 事件被归纳为1次完整数据更新后的触发\n    this.updateTick = null;\n    // 在子节点增删改查时，将此属性设置为 true，来触发视图更新\n    this.shouldReflow = false;\n    // 这个标志会被大量用到\n    this.hasFilter = isFunction(config.filter);\n    this.emitter = mitt();\n  }\n\n  /**\n   * 配置选项\n   * @param {object} options tree 组件选项\n   * @return void\n   */\n  public setConfig(options: TypeTreeStoreOptions) {\n    const { config } = this;\n    const checkAllAffectedByChanged =\n      options.checkAllAffectedBy !== undefined && options.checkAllAffectedBy !== config.checkAllAffectedBy;\n    let hasChanged = false;\n    (Object.keys(options) as (keyof TypeTreeStoreOptions)[]).forEach((key) => {\n      const val = options[key];\n      if (val !== config[key]) {\n        hasChanged = true;\n        // @ts-ignore\n        // TODO: https://github.com/microsoft/TypeScript/issues/32693\n        config[key] = val;\n      }\n    });\n    this.hasFilter = isFunction(config.filter);\n    if (hasChanged) {\n      if (checkAllAffectedByChanged && !config.checkStrictly) {\n        // 父节点选中态可能是旧策略的缓存，保留叶子节点值后重新计算。\n        this.nodeMap.forEach((node) => {\n          if (!node.isLeaf() && !node.isDisabled()) this.checkedMap.delete(node.value);\n        });\n        this.nodeMap.forEach((node) => node.updateChecked());\n      }\n      // 在 td-tree 的 render 方法中调用 setConfig\n      // 这样减少了 watch 属性\n      // 仅在属性变更后刷新状态\n      // 这样可以避免触发渲染死循环\n      this.refreshState();\n    }\n  }\n\n  /**\n   * 获取根节点列表\n   * @return TreeNode[] 根节点对象数组\n   */\n  public getChildren(): TreeNode[] {\n    return this.children;\n  }\n\n  /**\n   * 获取指定节点对象\n   * @param {string|number|TreeNode} item 获取节点对象的条件，可以是节点 value，也可以是节点本身\n   * @return TreeNode 节点对象，如果判断树中没有符合条件的节点，返回 null\n   */\n  public getNode(item: TypeTargetNode): TreeNode {\n    let node = null;\n    if (isTreeNodeValue(item)) {\n      node = this.nodeMap.get(item);\n    } else if (item instanceof TreeNode) {\n      node = this.nodeMap.get(item.value);\n    }\n    if (!node) node = null;\n    return node;\n  }\n\n  /**\n   * 获取节点在总节点列表中的位置\n   * @param {TreeNode} node 节点对象\n   * @return number 节点在总节点列表中的位置序号\n   */\n  public getIndex(node: TreeNode): number {\n    return this.nodes.indexOf(node);\n  }\n\n  /**\n   * 获取指定节点的父节点\n   * @param {string} value 节点值\n   * @return TreeNode 节点对象\n   */\n  public getParent(value: TypeTargetNode): TreeNode {\n    let parent = null;\n    const node = this.getNode(value);\n    if (node) {\n      parent = node.getParent();\n    }\n    return parent;\n  }\n\n  /**\n   * 获取指定节点的所有父节点\n   * @param {string} value 节点值\n   * @return TreeNode[] 父节点数组\n   */\n  public getParents(value: TypeTargetNode): TreeNode[] {\n    const node = this.getNode(value);\n    let parents: TreeNode[] = [];\n    if (node) {\n      parents = node.getParents();\n    }\n    return parents;\n  }\n\n  /**\n   * 获取指定节点在其所在 children 中的位置\n   * @param {string} value 节点值\n   * @return number 节点在 children 中的位置序号\n   */\n  public getNodeIndex(value: TypeTargetNode): number {\n    const node = this.getNode(value);\n    let index = -1;\n    if (node) {\n      index = node.getIndex();\n    }\n    return index;\n  }\n\n  /**\n   * 获取所有符合条件的节点，按回流排序后的顺序给出\n   * 以这些字段作为示例:\n   * - value: 节点值(ID)\n   * - TreeNode: 节点实例\n   * - level: 节点层级\n   * - filter: 节点过滤函数\n   * 支持下列使用方式\n   * - getNodes() 获取所有节点\n   * - getNodes(value) 获取节点值对应的目标节点下，包含自己在内的所有子节点\n   * - getNodes(TreeNode) 获取目标节点下，包含自己在内的所有子节点\n   * - getNodes(value, { level: 2 }) 获取目标节点下，层级在 2 以内的子节点\n   * - getNodes(value, { filter: node => (!node.checked) }) 获取目标节点下，未选中的节点\n   * - getNodes(value, { props: { actived: true } }) 获取目标节点下，已激活的节点\n   * @param {string | TreeNode} [item] 节点值，节点对象\n   * @param {object} [options] 节点过滤条件，可传递节点属性，过滤出属性一致的节点\n   * @param {number} [options.level=Infinity] 节点层级\n   * @param {function} [options.filter=null] 节点过滤条件函数\n   * @param {object} [options.props] 节点属性对象，作为过滤条件\n   * @return TreeNode[] 符合条件的节点数组\n   */\n  public getNodes(item?: TypeTargetNode, options?: TypeTreeFilterOptions): TreeNode[] {\n    let nodes: TreeNode[] = [];\n    let val: TreeNodeValue = '';\n    if (isTreeNodeValue(item)) {\n      val = item;\n    } else if (item instanceof TreeNode) {\n      val = item.value;\n    }\n    // 0 与 0n 均为有效节点值，不能视作「空值」从而返回全部节点\n    if (!val && val !== 0 && typeof val !== 'bigint') {\n      nodes = this.nodes.slice(0);\n    } else {\n      const node = this.getNode(val);\n      if (node) {\n        nodes = node.walk();\n      }\n    }\n\n    if (options) {\n      const conf: TypeTreeFilterOptions = {\n        filter: null,\n        level: Infinity,\n        ...options,\n      };\n      if (isNumber(conf.level) && conf.level !== Infinity) {\n        nodes = nodes.filter((node) => node.level <= conf.level);\n      }\n      if (isFunction(conf.filter)) {\n        nodes = nodes.filter((node) => {\n          const nodeModel = node.getModel();\n          return conf.filter(nodeModel);\n        });\n      }\n      if (isPlainObject(conf.props)) {\n        nodes = nodes.filter((node) => {\n          const result = Object.keys(conf.props).every((key) => {\n            // @ts-ignore\n            // TODO: https://github.com/microsoft/TypeScript/issues/32693\n            const propEqual = node[key] === conf.props[key];\n            return propEqual;\n          });\n          return result;\n        });\n      }\n    }\n    return nodes;\n  }\n\n  /**\n   * 添加新节点数据\n   * @param {object[]} list 节点数据对象数组\n   * @return void\n   */\n  public append(list: TypeTreeNodeData[]): void {\n    list.forEach((item) => {\n      const node = new TreeNode(this, item);\n      this.children.push(node);\n    });\n    this.reflow();\n  }\n\n  /**\n   * 清空当前树的数据，重新加载数据\n   * @param {object[]} list 节点数据对象数组\n   * @return void\n   */\n  public reload(list: TypeTreeNodeData[]): void {\n    this.removeAll();\n    this.append(list);\n  }\n\n  /**\n   * 解析节点数据，适配多种节点类型\n   * @param {string | TreeNode | object} para 树节点值，或者树节点，或者节点构造数据\n   * @param {object | TreeNode} item 节点构造数据, 或者节点构造数据数组，或者树节点\n   * @return spec 解析完成的数据结构\n   * - {TreeNode} spec.node 目标树节点\n   * - {object} spec.data 节点构造数据\n   */\n  private parseNodeData(para: TreeNodeValue | TreeNode | TypeTreeNodeData, item: TypeTreeNodeData | TreeNode) {\n    let value: TreeNodeValue = '';\n    let node = null;\n    let data = null;\n\n    if (isTreeNodeValue(para)) {\n      value = para;\n      node = this.getNode(value);\n      data = item;\n    } else if (para instanceof TreeNode) {\n      if (item) {\n        node = para;\n        data = item;\n      } else {\n        data = para;\n      }\n    } else {\n      data = para;\n    }\n    const spec = {\n      node,\n      data,\n    };\n    return spec;\n  }\n\n  /**\n   * 向指定节点追加节点或者数据\n   * 以这些字段作为示例: item: 节点数据, TreeNode: 节点实例, value: 节点值(ID)\n   * 支持下列使用方式\n   * - appendNodes(item) 直接传递节点构造数据，新增节点\n   * - appendNodes(TreeNode) 传递别的树的树节点，新增节点\n   * - appendNodes(value, item) 以节点值查找指定节点，并新增节点构造数据\n   * - appendNodes(value, TreeNode) 以节点值查找指定节点，并新增树节点\n   * - appendNodes(TreeNode, item) 向指定节点新增节点构造数据\n   * - appendNodes(TreeNode, TreeNode) 向指定节点新增树节点\n   * @param {string | TreeNode | object} para 树节点值，或者树节点，或者节点构造数据\n   * @param {object | TreeNode} [item] 节点构造数据, 或者节点构造数据数组，或者树节点\n   * @return void\n   */\n  public appendNodes(para: TypeTargetNode | TypeTreeNodeData, item?: TypeTreeNodeData | TreeNode): void {\n    const spec = this.parseNodeData(para, item);\n    if (spec.data) {\n      if (!spec.node) {\n        // 在根节点插入\n        if (spec.data instanceof TreeNode) {\n          spec.data.appendTo(this);\n        } else if (Array.isArray(spec.data)) {\n          this.append(spec.data);\n        } else {\n          this.append([spec.data]);\n        }\n      } else {\n        // 插入到目标节点之下\n        if (spec.data instanceof TreeNode) {\n          spec.data.appendTo(this, spec.node);\n        } else if (isArray(spec.data)) {\n          spec.node.append(spec.data);\n        } else {\n          spec.node.append([spec.data]);\n        }\n        spec.node.updateRelated();\n      }\n    }\n  }\n\n  /**\n   * 在目标节点之前插入节点\n   * @param {string | TreeNode} value 节点值，或者树节点\n   * @param {object | TreeNode} item 节点构造数据, 或者树节点\n   * @return void\n   */\n  public insertBefore(value: TypeTargetNode, item: TypeTreeItem): void {\n    const node = this.getNode(value);\n    if (node) {\n      node.insertBefore(item);\n    }\n  }\n\n  /**\n   * 在目标节点之后插入节点\n   * @param {string | TreeNode} value 节点值，或者树节点\n   * @param {object | TreeNode} item 节点构造数据, 或者树节点\n   * @return void\n   */\n  public insertAfter(value: TypeTargetNode, item: TypeTreeItem): void {\n    const node = this.getNode(value);\n    if (node) {\n      node.insertAfter(item);\n    }\n  }\n\n  /**\n   * 更新树结构\n   * - 清空 nodes 数组，然后遍历所有根节点重新插入 node\n   * - 这个操作将会为树结构数据提供一个一纬数组索引\n   * @return void\n   */\n  public refreshNodes(): void {\n    const { children, nodes } = this;\n    nodes.length = 0;\n    children.forEach((node) => {\n      const list = node.walk();\n      Array.prototype.push.apply(nodes, list);\n    });\n  }\n\n  /**\n   * 标记节点重排\n   * - 应该仅在树节点增删改查时调用\n   * - 节点重排会在延时后触发 refreshNodes 方法的调用\n   * @param {TreeNode} [node] 触发重排的树节点\n   * @return void\n   */\n  public reflow(node?: TreeNode): void {\n    this.shouldReflow = true;\n    this.updated(node);\n  }\n\n  /**\n   * 触发更新事件\n   * - 节点属性变更时调用\n   * - 统一延时后，处理需要在其他节点状态更新后再处理的逻辑，减少这类逻辑的重复调用开销\n   * - 统一延时后，派发事件，通知树已更新完毕，以及回流完毕，触发 vue 视图渲染操作\n   * @param {TreeNode} [node] 触发更新的树节点\n   * @return void\n   */\n  public updated(node?: TreeNode): void {\n    const { updatedMap } = this;\n    if (node) {\n      // 传入节点，则为指定节点的更新\n      updatedMap.set(node[privateKey], 'changed');\n    } else {\n      // reflow 流程不传入节点，需要更新所有节点\n      this.getNodes().forEach((itemNode) => {\n        updatedMap.set(itemNode[privateKey], 'changed');\n      });\n    }\n\n    if (this.updateTick) return;\n    this.updateTick = nextTick(() => {\n      this.updateTick = null;\n\n      // 检查节点是否需要回流，重排数组\n      if (this.shouldReflow) {\n        this.refreshNodes();\n        this.emit('reflow');\n      }\n\n      // 检查节点是否有被过滤，锁定路径节点\n      // 在此之前要遍历节点生成一个经过排序的节点数组\n      // 以便于优化锁定检查算法\n      this.lockFilterPathNodes();\n\n      // stateId 用于单个节点状态监控\n      const stateId = `t${new Date().getTime()}`;\n      const updatedList = Array.from(updatedMap.keys());\n      const updatedNodes = updatedList.map((nodePrivateKey) => {\n        updatedMap.set(nodePrivateKey, stateId);\n        return this.privateMap.get(nodePrivateKey);\n      });\n\n      // 统计需要更新状态的节点，派发更新事件\n      this.emit('update', {\n        nodes: updatedNodes,\n        map: updatedMap,\n      });\n\n      // 每次回流检查完毕，还原检查状态\n      this.shouldReflow = false;\n      updatedMap.clear();\n    });\n  }\n\n  /**\n   * 获取激活节点集合\n   * @param {Map} [map] 预设激活节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n   * @return string[] 激活节点值数组\n   */\n  public getActived(map?: TypeIdMap): TreeNodeValue[] {\n    const activedMap = map || this.activedMap;\n    return Array.from(activedMap.keys());\n  }\n\n  /**\n   * 获取指定范围的激活节点\n   * - 范围是目标节点在内所有子节点\n   * @param {string | TreeNode} [item] 目标节点值，或者目标节点本身\n   * @return TreeNode[] 激活节点数组\n   */\n  public getActivedNodes(item?: TypeTargetNode): TreeNode[] {\n    let nodes = this.getNodes(item);\n    nodes = nodes.filter((node) => node.isActived());\n    return nodes;\n  }\n\n  /**\n   * 替换激活态\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public replaceActived(list: TreeNodeValue[]): void {\n    this.resetActived();\n    this.setActived(list);\n  }\n\n  /**\n   * 设置激活态\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public setActived(actived: TreeNodeValue[]): void {\n    const { activeMultiple } = this.config;\n    const list = actived.slice(0);\n    if (!activeMultiple) {\n      list.length = 1;\n    }\n    list.forEach((val) => {\n      this.activedMap.set(val, true);\n      const node = this.getNode(val);\n      if (node) {\n        node.update();\n      }\n    });\n  }\n\n  /**\n   * 清空所有节点的激活状态\n   * @return void\n   */\n  public resetActived(): void {\n    const actived = this.getActived();\n    this.activedMap.clear();\n    const relatedNodes = this.getRelatedNodes(actived);\n    relatedNodes.forEach((node) => {\n      node.update();\n    });\n  }\n\n  /**\n   * 获取展开节点集合\n   * @param {Map} [map] 预设展开节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n   * @return void\n   */\n  public getExpanded(map?: TypeIdMap): TreeNodeValue[] {\n    const expandedMap = map || this.expandedMap;\n    return Array.from(expandedMap.keys());\n  }\n\n  /**\n   * 替换展开节点\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public replaceExpanded(list: TreeNodeValue[]): void {\n    const expanded = this.getExpanded();\n    const added = difference(list, expanded);\n    const removed = difference(expanded, list);\n    this.setExpandedDirectly(removed, false);\n    this.updateExpanded(removed);\n    this.setExpanded(added);\n  }\n\n  /**\n   * 批量设置展开节点\n   * - 注意这个状态设置操作会忽略互斥属性\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public setExpanded(list: TreeNodeValue[]): void {\n    this.setExpandedDirectly(list);\n    this.updateExpanded(list);\n  }\n\n  /**\n   * 直接设置节点展开状态\n   * - 注意这个状态设置操作会忽略互斥属性\n   * @param {string[]} list 目标节点值数组\n   * @param {boolean} [expanded=true] 展开状态\n   * @return void\n   */\n  public setExpandedDirectly(list: TreeNodeValue[], expanded = true): void {\n    list.forEach((val) => {\n      const node = this.getNode(val);\n      if (!node?.isLeaf() && expanded) {\n        this.expandedMap.set(val, true);\n      } else {\n        this.expandedMap.delete(val);\n      }\n      node?.afterExpanded();\n    });\n  }\n\n  /**\n   * 清除所有节点的展开状态\n   * @return void\n   */\n  public resetExpanded(): void {\n    const expanded = this.getExpanded();\n    this.expandedMap.clear();\n    this.updateExpanded(expanded);\n  }\n\n  /**\n   * 更新展开节点相关节点的状态\n   * - 节点展开状态变更后，上下游节点可能存在状态变更，统一纳入待更新队列\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public updateExpanded(list: TreeNodeValue[]): void {\n    const relatedNodes = this.getRelatedNodes(list, {\n      withParents: false,\n    });\n    relatedNodes.forEach((node) => {\n      node.update();\n    });\n  }\n\n  /**\n   * 获取选中态节点值数组\n   * @param {Map} [map] 预设选中节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n   * @return string[] 选中态节点 value 数组\n   */\n  public getChecked(map?: TypeIdMap): TreeNodeValue[] {\n    const { nodeMap, config } = this;\n    const { valueMode, checkStrictly } = config;\n    const list: TreeNodeValue[] = [];\n    const checkedMap = map || this.checkedMap;\n    nodeMap.forEach((node) => {\n      // 判断未选中，直接忽略\n      if (!node.isChecked(checkedMap)) return;\n      if (valueMode === 'parentFirst' && !checkStrictly) {\n        // valueMode 为 parentFirst\n        // 仅取值父节点，独立选中的禁用节点保留自身值\n        if (node.isDisabled() || !node.parent || !node.parent.isChecked(checkedMap)) {\n          list.push(node.value);\n        }\n      } else if (valueMode === 'onlyLeaf' && !checkStrictly) {\n        // valueMode 为 onlyLeaf\n        // 仅取值叶子节点\n        if (node.isLeaf()) {\n          list.push(node.value);\n        }\n      } else {\n        // valueMode 为 all\n        // 取值所有选中节点\n        list.push(node.value);\n      }\n    });\n    return list;\n  }\n\n  /**\n   * 获取指定节点下的选中节点\n   * @param {string | TreeNode} [item] 目标节点值，或者目标节点\n   * @return TreeNode[] 选中节点数组\n   */\n  public getCheckedNodes(item?: TypeTargetNode): TreeNode[] {\n    let nodes = this.getNodes(item);\n    nodes = nodes.filter((node) => node.isChecked());\n    return nodes;\n  }\n\n  /**\n   * 替换选中态列表\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public replaceChecked(list: TreeNodeValue[]): void {\n    this.resetChecked();\n    this.setChecked(list);\n  }\n\n  /**\n   * 批量设置选中态\n   * @param {string[]} list 目标节点值数组\n   * @return void\n   */\n  public setChecked(list: TreeNodeValue[]): void {\n    const { checkStrictly, checkable } = this.config;\n    if (!checkable) return;\n    list.forEach((val: TreeNodeValue) => {\n      const node = this.getNode(val);\n      if (!node) return;\n      if (checkStrictly) {\n        this.checkedMap.set(val, true);\n        node.updateChecked();\n      } else {\n        const childrenNodes = node.walk();\n        childrenNodes.forEach((childNode) => {\n          // 显式传入的节点可选中，禁用后代不随父节点联动\n          if (childNode !== node && childNode.isDisabled()) return;\n          this.checkedMap.set(childNode.value, true);\n        });\n      }\n    });\n    if (!checkStrictly) {\n      const checkedValues = this.getChecked();\n      const relatedNodes = this.getRelatedNodes(checkedValues);\n      relatedNodes.forEach((node) => {\n        node.updateChecked();\n      });\n    }\n  }\n\n  /**\n   * 清除所有节点选中态\n   * @return void\n   */\n  public resetChecked(): void {\n    const checked = this.getChecked();\n    const relatedNodes = this.getRelatedNodes(checked);\n    this.checkedMap.clear();\n    relatedNodes.forEach((node) => {\n      node.updateChecked();\n    });\n  }\n\n  /**\n   * 更新所有树节点状态，但不更新选中态\n   * 用于不影响选中态时候的更新，减少递归循环造成的时间消耗\n   * @return void\n   */\n  public refreshState(): void {\n    const { nodeMap } = this;\n    // 树在初始化未回流时，nodes 数组为空\n    // 所以遍历 nodeMap 确保初始化阶段 refreshState 方法也可以触发全部节点的更新\n    nodeMap.forEach((node) => {\n      node.update();\n    });\n  }\n\n  /**\n   * 更新全部节点状态\n   * @return void\n   */\n  public updateAll(): void {\n    const { nodeMap } = this;\n    nodeMap.forEach((node) => {\n      node.update();\n      node.updateChecked();\n    });\n  }\n\n  /**\n   * 移除指定节点\n   * @param {string} value 目标节点值\n   * @return void\n   */\n  public remove(value?: TypeTargetNode): void {\n    const node = this.getNode(value);\n    if (node) {\n      node.remove();\n    }\n  }\n\n  /**\n   * 移除所有节点\n   * @return void\n   */\n  public removeAll(): void {\n    this.expandedMap.clear();\n    this.checkedMap.clear();\n    this.activedMap.clear();\n    this.filterMap.clear();\n    this.nodeMap.clear();\n    this.privateMap.clear();\n    this.updatedMap.clear();\n    this.nodes = [];\n    this.children = [];\n    this.reflow();\n  }\n\n  /**\n   * 获取节点状态变化可能影响的关联节点\n   * - 用于实现最小遍历集合\n   * @param {string[]} list 目标节点值数组\n   * @param {object} [options] 操作选项\n   * @oaran {boolean} [options.reverse=false] 倒序排列遍历节点\n   * @param {boolean} [options.withParents=true] 包含所有父节点\n   * @return TreeNode[] 关联节点数组\n   */\n  public getRelatedNodes(list: TreeNodeValue[], options?: TypeRelatedNodesOptions): TreeNode[] {\n    const conf = {\n      // 默认倒序排列，从底层节点开始遍历\n      reverse: false,\n      // 默认遍历父节点\n      withParents: true,\n      ...options,\n    };\n    const map = new Map();\n    list.forEach((value) => {\n      if (map.get(value)) return;\n      const node = this.getNode(value);\n      if (node) {\n        const parents = node.getParents().reverse();\n        const children = node.walk();\n        let related = [];\n        if (conf.withParents) {\n          related = parents.concat(children);\n        } else {\n          related = children;\n        }\n        // 用 map 实现节点去重\n        related.forEach((relatedNode) => {\n          map.set(relatedNode.value, relatedNode);\n        });\n      }\n    });\n    let relatedNodes = Array.from(map.values());\n    if (conf.reverse) {\n      relatedNodes = relatedNodes.reverse();\n    }\n    return relatedNodes;\n  }\n\n  /**\n   * 触发绑定的事件\n   * - store.emitter 可以绑定事件回调，用于多个组件共同监听事件\n   * @param {string} name 事件名称\n   * @param {Event} [state] 事件对象\n   * @param {TreeNode} [state.node] 事件关联节点\n   * @param {TreeNode[]} [state.nodes] 事件关联节点数组\n   * @param {Map} [state.map] 事件关联节点映射\n   * @param {object[]} [state.data] 事件关联节点数据\n   * @return void\n   */\n  public emit(name: string, state?: TypeTreeEventState): void {\n    const { config, emitter } = this;\n    const methodName = camelCase(`on-${name}`);\n    const method = config[methodName as keyof TypeTreeStoreOptions];\n    if (isFunction(method)) {\n      // @ts-ignore\n      // TODO: 待移除\n      method(state);\n    }\n    emitter.emit(name, state);\n  }\n\n  /**\n   * 锁定过滤节点的路径节点\n   * - 使得路径节点自动展开\n   * @return void\n   */\n  private lockFilterPathNodes(): void {\n    const { config } = this;\n    const allNodes = this.getNodes();\n\n    if (this.prevFilter) {\n      // 过滤条件清空时，也需要清理锁定节点\n      // 所在判断过滤条件是否存在之前，就要调用这里的清理逻辑\n      // 不想在每次渲染时都做这个清空判断\n      // 所以判断一下之前是否有进行过滤\n      allNodes.forEach((node: TreeNode) => {\n        // 先清空所有锁定状态\n        if (node.vmIsLocked) {\n          // lock 方法内部有状态计算\n          // 所以要减少 lock 方法调用次数\n          node.lock(false);\n        }\n      });\n    }\n\n    const currentFilter = config.filter;\n    // 当前没有过滤器\n    // 则无需处理锁定节点\n    if (!currentFilter || !isFunction(currentFilter)) return;\n    this.prevFilter = config.filter;\n\n    // 全部节点要经过排序，才能使用这个遍历\n    // 比起每个过滤节点调用 getParents 方法检查父节点状态\n    // 复杂度 O(N*log(N)) => O(N)\n    allNodes.reverse().forEach((node: TreeNode) => {\n      // 数组颠倒后，等于是从每个节点的子节点开始判断\n      // 想象为从展开树的最底部向上遍历\n      const parent = node.getParent();\n      if (!parent) return;\n      if (node.vmIsRest || node.vmIsLocked) {\n        // 当前节点被过滤条件命中\n        // 或者当前节点被锁定\n        // 则需要判定父节点状态\n        if (!parent.vmIsLocked) {\n          // 父节点已被锁定，则忽略动作\n          // lock 方法有内置状态判断\n          parent.lock(true);\n        }\n      }\n    });\n  }\n}\n\nexport default TreeStore;\n"],"names":["nextTick","fn","pm","Promise","resolve","then","isTreeNodeValue","item","isString","isNumber","TreeStore","options","_classCallCheck","_defineProperty","config","_objectSpread","prefix","keys","expandAll","expandLevel","expandMutex","expandParent","activable","activeMultiple","checkable","checkStrictly","checkAllAffectedBy","disabled","disableCheck","draggable","load","lazy","valueMode","filter","allowFoldNodeOnFilter","onLoad","onReflow","onUpdate","nodes","children","nodeMap","Map","privateMap","activedMap","expandedMap","checkedMap","updatedMap","filterMap","prevFilter","updateTick","shouldReflow","hasFilter","isFunction","emitter","mitt","_createClass","key","value","setConfig","_this","checkAllAffectedByChanged","hasChanged","Object","forEach","val","node","isLeaf","isDisabled","delete","updateChecked","refreshState","getChildren","getNode","get","TreeNode","getIndex","indexOf","getParent","parent","getParents","parents","getNodeIndex","index","getNodes","slice","walk","conf","level","Infinity","nodeModel","getModel","isPlainObject","props","result","every","propEqual","append","list","_this2","push","reflow","reload","removeAll","parseNodeData","para","data","spec","appendNodes","appendTo","Array","isArray","updateRelated","insertBefore","insertAfter","refreshNodes","length","prototype","apply","updated","_this3","set","privateKey","itemNode","emit","lockFilterPathNodes","stateId","concat","Date","getTime","updatedList","from","updatedNodes","map","nodePrivateKey","clear","getActived","getActivedNodes","isActived","replaceActived","resetActived","setActived","actived","_this4","update","relatedNodes","getRelatedNodes","getExpanded","replaceExpanded","expanded","added","difference","removed","setExpandedDirectly","updateExpanded","setExpanded","_this5","arguments","undefined","afterExpanded","resetExpanded","withParents","getChecked","isChecked","getCheckedNodes","replaceChecked","resetChecked","setChecked","_this6","_this$config","childrenNodes","childNode","checkedValues","checked","updateAll","remove","_this7","reverse","related","relatedNode","values","name","state","methodName","camelCase","method","allNodes","vmIsLocked","lock","currentFilter","vmIsRest"],"mappings":"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"}