{"version":3,"file":"use-rows.mjs","sources":["../../../../../packages/components/multiple-form/src/use-rows.ts"],"sourcesContent":["import type { ElTable } from '@element-ultra/components/table'\nimport { nextTick, ShallowRef, watch } from 'vue'\nimport type {\n  MultipleFormEmits,\n  MultipleFormProps,\n  MultipleFormRow\n} from './type'\nimport { wrapDataRows, unwrapRows, createRow } from './utils'\n// TODO 让性能优化更好, 分情况只触发每次更改的部分\ninterface Options {\n  props: MultipleFormProps\n  emit: MultipleFormEmits\n  tableRef: ShallowRef<InstanceType<typeof ElTable> | undefined>\n}\n\nexport default function useRows(options: Options) {\n  const { props, emit, tableRef } = options\n\n  let originId = 1\n  let uid = () => originId++\n\n  /** 根行 */\n  const root = createRow({\n    root: true\n  })\n\n  const emitChange = () => {\n    const data = unwrapRows(root.children!, props.childrenKey)\n    emit('change', data)\n    emit('update:data', data)\n  }\n\n  // 一旦是用户操作发起的数据的改变, 则不重新wrapRows从而提高性能\n  let editByUser = false\n\n  /** 标记为用户操作 */\n  const markAsUserAction = <\n    P extends any[],\n    R extends any,\n    Action extends (...args: P) => R\n  >(\n    action: Action\n  ) => {\n    return ((...args: P) => {\n      editByUser = true\n\n      let ret = action(...args)\n\n      nextTick(() => {\n        editByUser = false\n      })\n\n      return ret\n    }) as Action\n  }\n\n  // 不能每次data更新时都重新包裹row\n  // 一旦editedRowsMap不为空则返回\n  watch(\n    () => props.data,\n    data => {\n      if (!data || editByUser) return\n      root.children = wrapDataRows(data, root, props.childrenKey, uid)\n    },\n    { immediate: true }\n  )\n\n  const getIndexes = (indexes: number | number[]) => {\n    if (Array.isArray(indexes)) {\n      return indexes\n    }\n    if (typeof indexes === 'number') {\n      return [indexes]\n    }\n\n    throw new Error('参数indexes类型错误')\n  }\n\n  /** 查询数据 */\n  const find = (indexes: number | number[]) => {\n    const _indexes = getIndexes(indexes)\n\n    const target = _indexes.reduce((acc, index) => {\n      if (index < 0) {\n        throw new Error('索引中不能出现小于0的数字')\n      }\n\n      const target = acc.children?.[index]\n\n      if (!target) {\n        throw new Error(`没有找到该索引 [${_indexes}] 对应的数据`)\n      }\n\n      return target\n    }, root)\n\n    return target\n  }\n\n  const scrollToLast = async () => {\n    await Promise.resolve()\n    const nodes = tableRef.value?.tableDom?.querySelectorAll(\n      '.el-table__body > tr'\n    )\n    const last = nodes?.[(nodes?.length ?? 0) - 1]\n    last?.scrollIntoView({\n      block: 'nearest'\n    })\n  }\n\n  /**\n   * 插入\n   * @param indexes 插入的索引路径\n   * @param rowData 行数据\n   * @param status 状态插入后显示的状态, view查看, edit编辑\n   * @param replaced 是否替换掉原有的数据u\n   */\n  const rawInsertTo = (\n    indexes: number | number[],\n    rowData: Record<string, any>,\n    status: MultipleFormRow['status'],\n    replaced = false\n  ) => {\n    const _indexes = getIndexes(indexes)\n\n    const parent = find(_indexes.slice(0, -1))\n\n    const { children = [] } = parent\n    const lastIndex = _indexes[_indexes.length - 1]\n\n    // 插入索引超出范围则视为错误\n    if (lastIndex > children.length) {\n      throw new Error('插入的索引超出范围')\n    }\n\n    const preHalf = children.slice(0, lastIndex)\n    const nextHalf = children.slice(replaced ? lastIndex + 1 : lastIndex)\n\n    const row = createRow({\n      parent,\n      uid: uid(),\n      data: rowData,\n      index: lastIndex,\n      status,\n      children: replaced ? children[lastIndex].children : undefined\n    })\n\n    parent.children = [...preHalf, row, ...nextHalf]\n\n    !replaced &&\n      nextHalf.forEach(row => {\n        row.index++\n        row.indexes[row.indexes.length - 1] = row.index\n      })\n\n    emitChange()\n\n    !nextHalf.length && scrollToLast()\n\n    return row\n  }\n  const insertTo = markAsUserAction(rawInsertTo)\n\n  const update = (indexes: number | number[], rowData: Record<string, any>) => {\n    insertTo(indexes, rowData, 'view', true)\n  }\n\n  /** 删除行 */\n  const delRow = markAsUserAction((indexes: number | number[]) => {\n    const _indexes = getIndexes(indexes)\n\n    const parent = find(_indexes.slice(0, -1))\n\n    const { children } = parent\n\n    if (!children) {\n      throw new Error('未找到对应的数据')\n    }\n\n    const lastIndex = _indexes[_indexes.length - 1]\n    // 插入索引超出范围则视为错误\n    if (lastIndex > children.length - 1) {\n      throw new Error('所删除的索引超出范围')\n    }\n\n    const preHalf = children.slice(0, lastIndex)\n    const nextHalf = children.slice(lastIndex + 1)\n\n    parent.children = [...preHalf, ...nextHalf]\n\n    nextHalf.forEach(row => {\n      row.index--\n      row.indexes[row.indexes.length - 1] = row.index\n    })\n\n    emitChange()\n  })\n\n  return {\n    root,\n    /** 触发改变事件 */\n    emitChange,\n    /** 插入行 */\n    insertTo,\n    /** 查询 */\n    find,\n    /** 删除行 */\n    delRow,\n    /** 更新行 */\n    update\n  }\n}\n"],"names":["target","row"],"mappings":"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"}