{"version":3,"file":"useRowspanAndColspan.mjs","sources":["../../../src/table/hooks/useRowspanAndColspan.ts"],"sourcesContent":["import { ref, watch, Ref } from 'vue';\nimport get from 'lodash/get';\nimport log from '../../_common/js/log';\nimport { BaseTableCellParams, BaseTableCol, TableRowData, TableRowspanAndColspanFunc } from '../type';\n\nexport interface SkipSpansValue {\n  colspan?: number;\n  rowspan?: number;\n  skipped?: boolean;\n}\n\nexport function getCellKey(row: TableRowData, rowKey: string, colKey: string, colIndex: number) {\n  const rowValue = get(row, rowKey);\n  if (rowValue === undefined) {\n    log.error('Table', 'rowKey is wrong, can not get unique identifier of row.');\n  }\n  return [rowValue, colKey || colIndex].join('_');\n}\n\nexport default function useRowspanAndColspan(\n  data: Ref<TableRowData[]>,\n  columns: Ref<BaseTableCol<TableRowData>[]>,\n  rowKey: Ref<string>,\n  rowspanAndColspan: Ref<TableRowspanAndColspanFunc<TableRowData>>,\n) {\n  const skipSpansMap = ref(new Map<string, SkipSpansValue>());\n\n  // 计算单元格是否跳过渲染\n  const onTrRowspanOrColspan = (params: BaseTableCellParams<TableRowData>, skipSpansValue: SkipSpansValue) => {\n    const { rowIndex, colIndex } = params;\n    if (!skipSpansValue.rowspan && !skipSpansValue.colspan) return;\n    const maxRowIndex = rowIndex + (skipSpansValue.rowspan || 1);\n    const maxColIndex = colIndex + (skipSpansValue.colspan || 1);\n    for (let i = rowIndex; i < maxRowIndex; i++) {\n      for (let j = colIndex; j < maxColIndex; j++) {\n        if (i !== rowIndex || j !== colIndex) {\n          if (!data.value[i] || !columns.value[j]) return;\n          const cellKey = getCellKey(data.value[i], rowKey.value, columns.value[j].colKey, j);\n          const state = skipSpansMap.value.get(cellKey) || {};\n          state.skipped = true;\n          skipSpansMap.value.set(cellKey, state);\n        }\n      }\n    }\n  };\n\n  // 计算单元格是否需要设置 rowspan 和 colspan\n  const updateSkipSpansMap = (\n    data: TableRowData[],\n    columns: BaseTableCol<TableRowData>[],\n    rowspanAndColspan: TableRowspanAndColspanFunc<TableRowData>,\n  ) => {\n    skipSpansMap.value?.clear();\n    if (!data || !rowspanAndColspan) return;\n    for (let i = 0, len = data.length; i < len; i++) {\n      const row = data[i];\n      for (let j = 0, colLen = columns.length; j < colLen; j++) {\n        const col = columns[j];\n        const params = {\n          row,\n          col,\n          rowIndex: i,\n          colIndex: j,\n        };\n        const cellKey = getCellKey(row, rowKey.value, col.colKey, j);\n        const state = skipSpansMap.value.get(cellKey) || {};\n        const o = rowspanAndColspan(params) || {};\n        if (o.rowspan || o.colspan || state.rowspan || state.colspan) {\n          o.rowspan && (state.rowspan = o.rowspan);\n          o.colspan && (state.colspan = o.colspan);\n          skipSpansMap.value.set(cellKey, state);\n        }\n        onTrRowspanOrColspan?.(params, state);\n      }\n    }\n  };\n\n  watch(\n    () => [data.value, columns.value, rowspanAndColspan],\n    () => {\n      updateSkipSpansMap(data.value, columns.value, rowspanAndColspan?.value);\n    },\n    { immediate: true },\n  );\n\n  return { skipSpansMap };\n}\n"],"names":["get","log","row","col","rowIndex","colIndex","watch","updateSkipSpansMap","immediate","skipSpansMap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAA,UAAA,CAAA,GAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA;AACC,EAAA,IAAA,QAAA,GAAAA,KAAA,CAAA,GAAA,EAAA,MAAA,CAAA,CAAA;AACN,EAAA,IAAA,QAAA,KAAA,KAAA,CAAA,EAAA;AACMC,IAAAA,GAAAA,CAAAA,KAAAA,CAAAA,OAAAA,EAAAA,wDAAAA,CAAAA,CAAAA;AACN,GAAA;;AAEF,CAAA;AAEA,SAAA,oBAAA,CAAA,IAAA,EAAA,OAAA,EAAA,MAAA,EAAA,iBAAA,EAAA;;;AAUU,IAAA,IAAA,QAAA,GAAA,MAAA,CAAA,QAAA;;;;;;;AAME,QAAA,IAAA,CAAA,KAAA,QAAA,IAAA,CAAA,KAAA,QAAA,EAAA;AACF,UAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,IAAA,CAAA,OAAA,CAAA,KAAA,CAAA,CAAA,CAAA,EAAA,OAAA;;AAEA,UAAA,IAAA,KAAA,GAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,OAAA,CAAA,IAAA,EAAA,CAAA;;;AAGF,SAAA;AACF,OAAA;AACF,KAAA;;;AAQG,IAAA,IAAA,mBAAA,CAAA;AACH,IAAA,CAAA,mBAAA,GAAA,YAAA,CAAA,KAAA,MAAA,IAAA,IAAA,mBAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,mBAAA,CAAA,KAAA,EAAA,CAAA;AACI,IAAA,IAAA,CAAA,KAAA,IAAA,CAAA,kBAAA,EAAA,OAAA;AACJ,IAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,GAAA,GAAA,KAAA,CAAA,MAAA,EAAA,CAAA,GAAA,GAAA,EAAA,CAAA,EAAA,EAAA;AACE,MAAA,IAAA,GAAA,GAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AACA,MAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,MAAA,GAAA,QAAA,CAAA,MAAA,EAAA,CAAA,GAAA,MAAA,EAAA,CAAA,EAAA,EAAA;AACE,QAAA,IAAA,GAAA,GAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AACA,QAAA,IAAA,MAAA,GAAA;AACEC,UAAAA,GAAAA,EAAAA,GAAAA;AACAC,UAAAA,GAAAA,EAAAA,GAAAA;AACAC,UAAAA,QAAAA,EAAAA,CAAAA;AACAC,UAAAA,QAAAA,EAAAA,CAAAA;;AAEF,QAAA,IAAA,OAAA,GAAA,UAAA,CAAA,GAAA,EAAA,MAAA,CAAA,KAAA,EAAA,GAAA,CAAA,MAAA,EAAA,CAAA,CAAA,CAAA;AACA,QAAA,IAAA,KAAA,GAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,OAAA,CAAA,IAAA,EAAA,CAAA;;AAEA,QAAA,IAAA,CAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,IAAA,KAAA,CAAA,OAAA,IAAA,KAAA,CAAA,OAAA,EAAA;;;;AAIA,SAAA;;AAEF,OAAA;AACF,KAAA;;AAGFC,EAAAA,KAAAA,CAAAA,YAAAA;;AACqD,GAAA,EAAA,YAAA;AAEjDC,IAAAA,kBAAAA,CAAAA,IAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA,KAAAA,EAAAA,iBAAAA,KAAAA,IAAAA,IAAAA,iBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,iBAAAA,CAAAA,KAAAA,CAAAA,CAAAA;AACF,GAAA,EAAA;AACEC,IAAAA,SAAAA,EAAAA,IAAAA;AAAgB,GAAA,CAAA,CAAA;;AAGXC,IAAAA,YAAAA,EAAAA,YAAAA;;AACX;;;;"}