{"version":3,"file":"tree-store.mjs","sources":["../../../../node_modules/lodash/difference.js","../../../../src/_common/js/tree/tree-store.ts"],"sourcesContent":["var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n    : [];\n});\n\nmodule.exports = difference;\n","import isArray from 'lodash/isArray';\nimport isFunction from 'lodash/isFunction';\nimport isNumber from 'lodash/isNumber';\nimport isString from 'lodash/isString';\nimport difference from 'lodash/difference';\nimport camelCase from 'lodash/camelCase';\nimport isPlainObject from 'lodash/isPlainObject';\nimport mitt from 'mitt';\n\nimport { TreeNode } 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} from './types';\n\nfunction nextTick(fn: () => void): Promise<void> {\n  const pm = Promise.resolve();\n  pm.then(fn);\n  return pm;\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 {boolean} [options.disabled=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<string, TreeNode>;\n\n  // 配置选项\n  public config: TypeTreeStoreOptions;\n\n  // 活动节点集合\n  public activedMap: TypeIdMap;\n\n  // 数据被更新的节点集合\n  public updatedMap: TypeIdMap;\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: 'x',\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      disabled: 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    let hasChanged = false;\n    Object.keys(options).forEach((key) => {\n      const val = options[key];\n      if (val !== config[key]) {\n        hasChanged = true;\n        config[key] = val;\n      }\n    });\n    this.hasFilter = isFunction(config.filter);\n    if (hasChanged) {\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 (isString(item) || isNumber(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(\n    item?: TypeTargetNode,\n    options?: TypeTreeFilterOptions,\n  ): TreeNode[] {\n    let nodes: TreeNode[] = [];\n    let val: TreeNodeValue = '';\n    if (isString(item) || isNumber(item)) {\n      val = item;\n    } else if (item instanceof TreeNode) {\n      val = item.value;\n    }\n    if (!val) {\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            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.expandedMap.clear();\n    this.checkedMap.clear();\n    this.activedMap.clear();\n    this.filterMap.clear();\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(\n    para: TreeNodeValue | TreeNode | TypeTreeNodeData,\n    item: TypeTreeNodeData | TreeNode,\n  ) {\n    let value: TreeNodeValue = '';\n    let node = null;\n    let data = null;\n\n    if (isString(para) || isNumber(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(\n    para: TypeTargetNode | TypeTreeNodeData,\n    item?: TypeTreeNodeData | TreeNode,\n  ): 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    if (node?.value) {\n      this.updatedMap.set(node.value, true);\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      const updatedList = Array.from(this.updatedMap.keys());\n      if (updatedList.length > 0) {\n        // 统计需要更新状态的节点，派发更新事件\n        const updatedNodes = updatedList.map((value) => this.getNode(value));\n        this.emit('update', {\n          nodes: updatedNodes,\n          map: this.updatedMap,\n        });\n      } else if (this.shouldReflow) {\n        // 单纯的回流不需要更新节点状态\n        // 但需要触发更新事件\n        // 实际业务中，这个逻辑几乎无法触发，节点操作必然引发 update\n        // 这里代码仅仅用于边界兜底\n        this.emit('update', {\n          nodes: [],\n          map: this.updatedMap,\n        });\n      }\n\n      // 每次回流检查完毕，还原检查状态\n      this.shouldReflow = false;\n      this.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      if (expanded) {\n        this.expandedMap.set(val, true);\n      } else {\n        this.expandedMap.delete(val);\n      }\n      const node = this.getNode(val);\n      if (node) {\n        node.afterExpanded();\n      }\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.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          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    const nodes = this.getNodes();\n    nodes.forEach((node) => {\n      node.remove();\n    });\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(\n    list: TreeNodeValue[],\n    options?: TypeRelatedNodesOptions,\n  ): 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];\n    if (isFunction(method)) {\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":["baseDifference","require$$0","baseFlatten","require$$1","baseRest","require$$2","isArrayLikeObject","require$$3","difference","array","values","difference_1","pm","_classCallCheck","prefix","expandAll","expandLevel","expandMutex","expandParent","activable","activeMultiple","checkable","checkStrictly","disabled","draggable","load","lazy","valueMode","filter","allowFoldNodeOnFilter","onLoad","onReflow","onUpdate","_createClass","value","hasChanged","config","parent","parents","index","val","nodes","level","isNumber","isFunction","isPlainObject","list","_this","node","data","spec","children","_this2","relatedNodes","_this4","withParents","nodeMap","childrenNodes","reverse","related","emitter","allNodes"],"mappings":"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"}