{"version":3,"file":"utils.mjs","sources":["../../src/transfer/utils.ts"],"sourcesContent":["import { ComponentPublicInstance } from 'vue';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isUndefined from 'lodash/isUndefined';\nimport isArray from 'lodash/isArray';\n\nimport { TransferListOptionBase, TransferItemOption, TdTransferProps, TransferValue, DataOption } from './interface';\n\nexport { emitEvent } from '../utils/event';\n\nexport const TRANSFER_NAME = 'XTransfer';\n\ninterface TreeNode {\n  children?: Array<TreeNode>;\n}\n\nfunction findTopNode(vm: ComponentPublicInstance): ComponentPublicInstance {\n  // 找到t-transfer这层父节点\n  if (vm.$options.name === 'x-transfer') {\n    return vm;\n  }\n  if (vm.$parent) {\n    return findTopNode(vm.$parent);\n  }\n  return vm;\n}\n\nfunction getTransferListOption<T>(prop: T | Array<T>): TransferListOptionBase<T> {\n  if (isArray(prop)) {\n    return {\n      source: prop[0],\n      target: prop[1],\n    };\n  }\n  return {\n    source: prop,\n    target: prop,\n  };\n}\n\nfunction getDataValues(\n  data: Array<TransferItemOption>,\n  filterValues: Array<TransferValue>,\n  {\n    isTreeMode = false,\n    include = true, // true=保留filterValues，false=删除filterValues中元素\n  } = {},\n): Array<TransferValue> {\n  // 用于处理 tree 组件这种数据结构是树形的\n  if (isTreeMode) {\n    let result: Array<TransferValue> = [];\n    if (data) {\n      for (let i = 0; i < data.length; i++) {\n        const item = data[i];\n        const isInclude = filterValues.includes(item.value);\n        if (!include && isInclude) {\n          continue; // 排除模式下子元素一律排除\n        }\n\n        // 只找叶子节点\n        if (item.children && item.children.length > 0) {\n          const childResult = getDataValues(item.children, filterValues, {\n            isTreeMode,\n            include,\n          });\n          result = result.concat(childResult);\n        } else if ((include && isInclude) || (!include && !isInclude)) {\n          result.push(item.value);\n        }\n      }\n    }\n    return result;\n  }\n  return data\n    .filter((item) => {\n      if (!item) return false;\n      const isInclude = filterValues.includes(item.value);\n      return ((include && isInclude) || (!include && !isInclude)) && !item.disabled;\n    })\n    .map((item) => item.value);\n}\n\nfunction getTransferData(\n  data: Array<DataOption>,\n  keys: TdTransferProps['keys'],\n  isTreeMode = false,\n): Array<TransferItemOption> {\n  const list: Array<TransferItemOption> = data.map((transferDataItem, index): TransferItemOption => {\n    const labelKey = keys?.label || 'label';\n    const valueKey = keys?.value || 'value';\n    const disabledKey = keys?.disabled || 'disabled';\n    if (isUndefined(transferDataItem[labelKey])) {\n      throw new Error(`${labelKey} is not in DataOption ${JSON.stringify(transferDataItem)}`);\n    }\n    if (isUndefined(transferDataItem[valueKey])) {\n      throw new Error(`${valueKey} is not in DataOption ${JSON.stringify(transferDataItem)}`);\n    }\n    const result: TransferItemOption = {\n      label: transferDataItem[labelKey] as string,\n      value: transferDataItem[valueKey],\n      key: `key__value_${transferDataItem[valueKey]}_index_${index}`,\n      disabled: transferDataItem[disabledKey] ?? false,\n      data: transferDataItem,\n    };\n    if (isTreeMode && transferDataItem.children) {\n      result.children = getTransferData(transferDataItem.children, keys, true);\n    }\n    return result;\n  });\n  return list;\n}\n\nfunction isAllNodeValid(data: TransferItemOption, filterValues: Array<TransferValue>, needMatch: boolean): boolean {\n  if (filterValues.includes(data.value)) {\n    return needMatch;\n  }\n  return false;\n}\n\nfunction isTreeNodeValid(data: TransferItemOption, filterValues: Array<TransferValue>, needMatch: boolean): boolean {\n  if (!data) return !needMatch;\n\n  if (filterValues.includes(data.value)) {\n    return needMatch;\n  }\n\n  if (data.children?.length) {\n    return data.children.some((item) => isTreeNodeValid(item, filterValues, needMatch));\n  }\n  return !needMatch;\n}\n\n// 复制树并过滤节点\nfunction cloneTreeWithFilter(\n  sourceTree: TransferItemOption[],\n  targetTree: TransferItemOption[],\n  filterValues: Array<TransferValue>,\n  needMatch: boolean,\n) {\n  sourceTree.forEach((item) => {\n    let newNode: TransferItemOption;\n    if (isAllNodeValid(item, filterValues, needMatch)) {\n      // 如果当前节点直接命中，则复制所有子节点\n      newNode = cloneDeep<TransferItemOption>(item);\n      targetTree.push(newNode);\n    } else if (isTreeNodeValid(item, filterValues, needMatch)) {\n      // 如果有合法子节点，就复制这个节点\n      newNode = {\n        ...item,\n      };\n      delete newNode.children;\n      targetTree.push(newNode);\n      if (item.children) {\n        newNode.children = [];\n        cloneTreeWithFilter(item.children, newNode.children, filterValues, needMatch);\n        if (newNode.children.length === 0) {\n          delete newNode.children;\n        }\n      }\n    }\n  });\n}\n\n// 过滤列表，如果是树的话需要保持树的结构\nfunction filterTransferData(\n  data: Array<TransferItemOption>,\n  filterValues: Array<TransferValue>,\n  needMatch = true,\n  isTreeMode = false,\n) {\n  if (!isTreeMode) {\n    if (needMatch) {\n      // 正向过滤。要保持filterValues顺序\n      return filterValues.map((value) => data.find((item) => item.value === value)).filter((item) => !!item);\n    }\n    // 反向过滤\n    return data.filter((item) => {\n      const isMatch = filterValues.includes(item.value);\n      return !isMatch;\n    });\n  }\n\n  const result: Array<TransferItemOption> = [];\n  cloneTreeWithFilter(data, result, filterValues, needMatch);\n  return result;\n}\n\n// 获取树节点的叶子数量\nfunction getLefCount(nodes: Array<TreeNode>): number {\n  let total = 0;\n  nodes.forEach((child) => {\n    if (child.children && child.children.length > 0) {\n      total += getLefCount(child.children);\n    } else {\n      total += 1;\n    }\n  });\n  return total;\n}\n\nexport {\n  findTopNode,\n  getTransferListOption,\n  getDataValues,\n  getTransferData,\n  cloneTreeWithFilter,\n  filterTransferData,\n  getLefCount,\n};\n"],"names":["isArray","source","target","isTreeMode","include","result","isUndefined","label","value","disabled","data","sourceTree","newNode","targetTree","cloneTreeWithFilter","nodes","total"],"mappings":"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"}