{"version":3,"file":"watcher.mjs","sources":["../../../../../../src/components/ivue-table/store/watcher.ts"],"sourcesContent":["import { ref, getCurrentInstance, unref } from 'vue';\r\nimport { hasOwn } from '@vue/shared';\r\nimport { throwError } from '../../../utils/error';\r\n\r\n// 展开行\r\nimport useExpand from './expand';\r\n// 嵌套数据\r\nimport useTree from './tree';\r\n// 当前数据\r\nimport useCurrent from './current';\r\n\r\nimport {\r\n  getKeysMap,\r\n  getRowIdentity,\r\n  toggleRowStatus,\r\n  orderBy,\r\n  getColumnById,\r\n  getColumnByKey,\r\n} from '../utils';\r\n\r\n// ts\r\nimport type { Ref } from 'vue';\r\nimport type { TableColumnCtx } from '../table-column/defaults';\r\nimport type { Table } from '../table/defaults';\r\nimport type { StoreFilter } from './index';\r\nimport type { SortOrder } from '../table-header/types/index';\r\n\r\n// 扁平化数组\r\nconst flattenColumns = (columns: TableColumnCtx[]) => {\r\n  const result = [];\r\n\r\n  columns.forEach((column: TableColumnCtx) => {\r\n    // 有子项\r\n    if (column.children) {\r\n      // eslint-disable-next-line prefer-spread\r\n      result.push.apply(result, flattenColumns(column.children));\r\n    }\r\n    // 没有子项\r\n    else {\r\n      result.push(column);\r\n    }\r\n  });\r\n\r\n  return result;\r\n};\r\n\r\n// 排序数据\r\nconst sortData = (data, states) => {\r\n  // 排序列\r\n  const sortingColumn = states.sortingColumn;\r\n\r\n  // 没有排序\r\n  if (!sortingColumn || typeof sortingColumn.sortable === 'string') {\r\n    return data;\r\n  }\r\n\r\n  // 对数据进行排序\r\n  return orderBy(\r\n    data,\r\n    // 排序的key 对应列内容的字段名\r\n    states.sortProp,\r\n    // 数据在排序时所使用排序策略的轮转顺序\r\n    states.sortOrder,\r\n    // 自定义排序方法\r\n    sortingColumn.sortMethod,\r\n    // 指定数据按照哪个属性进行排序\r\n    sortingColumn.sortBy\r\n  );\r\n};\r\n\r\nfunction useWatcher() {\r\n  // vm\r\n  const vm = getCurrentInstance() as Table;\r\n\r\n  // data\r\n\r\n  // 显示的数据\r\n  const data = ref<TableColumnCtx[]>([]);\r\n  const _data = ref<TableColumnCtx[]>([]);\r\n  // 行数据的 Key\r\n  const rowKey = ref<string | null>(null);\r\n  // 选择或取消选择所有行的值\r\n  const selectOnIndeterminate = ref<boolean>(false);\r\n  // 选择全部\r\n  const isAllSelected = ref<boolean>(false);\r\n  // 选择列表\r\n  const selection = ref<TableColumnCtx[]>([]);\r\n  // 是否有固定列\r\n  const isFixedColumns = ref<boolean>(false);\r\n  // hover行\r\n  const hoverRow = ref<TableColumnCtx>(null);\r\n  // 列数据\r\n  const originColumns = ref<TableColumnCtx[]>([]);\r\n  // 列\r\n  const columns = ref<TableColumnCtx[]>([]);\r\n  // 备份列\r\n  const _columns = ref<TableColumnCtx[]>([]);\r\n  // 固定列\r\n  const fixedColumns = ref<TableColumnCtx[]>([]);\r\n  // 右边固定列\r\n  const rightFixedColumns = ref<TableColumnCtx[]>([]);\r\n\r\n  // 固定列长度\r\n  const leafColumnsLength = ref<number>(0);\r\n  // 固定列长度\r\n  const fixedLeafColumnsLength = ref<number>(0);\r\n  // 右边固定列长度\r\n  const rightFixedLeafColumnsLength = ref<number>(0);\r\n\r\n  // 仅对 type=selection 的列有效，\r\n  // 类型为 Function，Function 的返回值用来决定这一行的 CheckBox 是否可以勾选\r\n  const selectable: Ref<(row: TableColumnCtx, index: number) => boolean> | any =\r\n    ref(null);\r\n\r\n  // 保存数据更新前选中的值\r\n  const reserveSelection = ref<boolean>(false);\r\n\r\n  // 排序的key 对应列内容的字段名\r\n  const sortProp = ref<string | null>(null);\r\n\r\n  // 需要排序的列\r\n  const sortingColumn = ref<TableColumnCtx | null>(null);\r\n\r\n  // 排序\r\n  const sortOrder = ref<SortOrder>(null);\r\n\r\n  // 过滤的数据\r\n  const filteredData = ref<any[]>([]);\r\n\r\n  // 选择过滤的列\r\n  // 例子\r\n  // 列id: [\r\n  //   选择过滤的数据\r\n  // ]\r\n  const filters: Ref<StoreFilter> = ref({});\r\n\r\n  // methods\r\n\r\n  // 用于多选表格，切换全选和全不选\r\n  const _toggleAllSelection = () => {\r\n    // 当只选择了一些行（但不是全部）时，选择或取消选择所有行\r\n    // 取决于 selectOnIndeterminate 的值\r\n\r\n    // 是否选择所有行\r\n    const value = selectOnIndeterminate.value\r\n      ? !isAllSelected.value\r\n      : !(isAllSelected.value || selection.value.length);\r\n\r\n    // 是否选择所有行\r\n    isAllSelected.value = value;\r\n\r\n    let selectionChanged = false;\r\n    let childrenCount = 0;\r\n\r\n    // 行数据的 Key\r\n    const rowKey = vm?.store?.states?.rowKey.value;\r\n\r\n    // 遍历数据\r\n    data.value.forEach((row, index) => {\r\n      // 行下标\r\n      const rowIndex = index + childrenCount;\r\n\r\n      // 这一行的 CheckBox 是否可以勾选\r\n      if (selectable.value) {\r\n        // 勾选\r\n        if (\r\n          selectable.value.call(null, row, rowIndex) &&\r\n          toggleRowStatus(selection.value, row, value)\r\n        ) {\r\n          selectionChanged = true;\r\n        }\r\n      }\r\n      // 修改当前行的状态\r\n      else {\r\n        if (toggleRowStatus(selection.value, row, value)) {\r\n          selectionChanged = true;\r\n        }\r\n      }\r\n\r\n      // 通过rowKey获取所有子节点的个数\r\n      childrenCount += getChildrenCount(getRowIdentity(row, rowKey));\r\n    });\r\n\r\n    // 勾选了\r\n    if (selectionChanged) {\r\n      vm.emit('on-selection-change', selection.value || []);\r\n    }\r\n\r\n    // 选择全部\r\n    vm.emit('on-select-all', selection.value);\r\n  };\r\n\r\n  // 展开行数据\r\n  const {\r\n    toggleRowExpansion,\r\n    updateExpandRows,\r\n    setExpandRowKeys,\r\n    isRowExpanded,\r\n    states: expandStates,\r\n  } = useExpand({\r\n    data,\r\n    rowKey,\r\n  });\r\n\r\n  // 嵌套数据\r\n  const {\r\n    loadOrToggle,\r\n    updateTreeData,\r\n    updateTreeExpandKeys,\r\n    toggleTreeExpansion,\r\n    states: treeStates,\r\n  }: any = useTree({\r\n    data,\r\n    rowKey,\r\n  });\r\n\r\n  // 检查 rowKey 是否存在\r\n  const isRowKey = () => {\r\n    if (!rowKey.value) {\r\n      throwError('ivue-table', 'prop row-key is required');\r\n    }\r\n  };\r\n\r\n  // 更新多选框key\r\n  const updateSelectionByRowKey = () => {\r\n    // 获取多选框标志\r\n    const selectedMap = getKeysMap(selection.value, rowKey.value);\r\n\r\n    data.value.forEach((row) => {\r\n      // 获取rowKey对应的数据\r\n      const rowId = getRowIdentity(row, rowKey.value);\r\n\r\n      const rowInfo = selectedMap[rowId];\r\n\r\n      if (rowInfo) {\r\n        selection.value[rowInfo.index] = row;\r\n      }\r\n    });\r\n  };\r\n\r\n  // 更新列数据\r\n  const updateColumns = () => {\r\n    // 不是固定列\r\n    const notFixedColumns = _columns.value.filter((column) => !column.fixed);\r\n\r\n    // 固定列\r\n    fixedColumns.value =\r\n      _columns.value.filter(\r\n        (column) => column.fixed === true || column.fixed === 'left'\r\n      ) || [];\r\n\r\n    // 右边固定列\r\n    rightFixedColumns.value = _columns.value.filter(\r\n      (column) => column.fixed === 'right'\r\n    );\r\n\r\n    // 未扁平化列数据\r\n    originColumns.value = [];\r\n    originColumns.value = originColumns.value\r\n      .concat(fixedColumns.value)\r\n      .concat(notFixedColumns)\r\n      .concat(rightFixedColumns.value);\r\n\r\n    // 扁平化不是固定列\r\n    const leafColumns = flattenColumns(notFixedColumns);\r\n    // 扁平化固定列\r\n    const fixedLeafColumns: any[] = flattenColumns(fixedColumns.value);\r\n    // 扁平化右边固定列\r\n    const rightFixedLeafColumns = flattenColumns(rightFixedColumns.value);\r\n\r\n    leafColumnsLength.value = leafColumns.length;\r\n    fixedLeafColumnsLength.value = fixedLeafColumns.length;\r\n    rightFixedLeafColumnsLength.value = rightFixedLeafColumns.length;\r\n\r\n    // 扁平化后的列数据\r\n    columns.value = [];\r\n    columns.value = columns.value\r\n      .concat(fixedLeafColumns)\r\n      .concat(leafColumns)\r\n      .concat(rightFixedLeafColumns);\r\n\r\n    // 是否有固定列\r\n    isFixedColumns.value =\r\n      fixedColumns.value.length > 0 || rightFixedColumns.value.length > 0;\r\n  };\r\n\r\n  // 更新当前数据\r\n  const {\r\n    updateCurrentRowData,\r\n    updateCurrentRow,\r\n    setCurrentRowKey,\r\n    states: currentData,\r\n  } = useCurrent({\r\n    data,\r\n    rowKey,\r\n  });\r\n\r\n  // 更新 DOM 更新列数据\r\n  const scheduleLayout = (needUpdateColumns?: boolean, immediate = false) => {\r\n    // 更新列数据 未扁平化列数据 | 扁平化后的列数据 | 是否有固定列\r\n    if (needUpdateColumns) {\r\n      updateColumns();\r\n    }\r\n\r\n    // 立即执行更新布局\r\n    if (immediate) {\r\n      vm.state.updateLayout();\r\n    }\r\n    // 延迟50毫秒更新布局\r\n    else {\r\n      vm.state.debouncedUpdateLayout();\r\n    }\r\n  };\r\n\r\n  // 选择多选\r\n  const isSelected = (row: TableColumnCtx) => {\r\n    return selection.value.includes(row);\r\n  };\r\n\r\n  // 多选返回当前选中的行\r\n  const getSelectionRows = () => {\r\n    return (selection.value || []).slice();\r\n  };\r\n\r\n  // 多选选择的行\r\n  const toggleRowSelection = (\r\n    row: any,\r\n    selected: any = undefined,\r\n    emitChange = true\r\n  ) => {\r\n    const changed = toggleRowStatus(selection.value, row, selected);\r\n\r\n    if (changed) {\r\n      const newSelection = (selection.value || []).slice();\r\n\r\n      // 通过api调用时触发\r\n      if (emitChange) {\r\n        vm.emit('on-select', newSelection, row);\r\n      }\r\n\r\n      vm.emit('on-selection-change', newSelection);\r\n    }\r\n  };\r\n\r\n  // 更新是否选择全部行\r\n  const updateAllSelected = () => {\r\n    // 没有数据\r\n    if (data.value?.length === 0) {\r\n      isAllSelected.value = false;\r\n\r\n      return;\r\n    }\r\n\r\n    let selectedMap;\r\n\r\n    // 行数据的Key\r\n    if (rowKey.value) {\r\n      selectedMap = getKeysMap(selection.value, rowKey.value);\r\n    }\r\n\r\n    // 是否选择了\r\n    const isSelected = (row) => {\r\n      // 有行数据的Key\r\n      if (selectedMap) {\r\n        return !!selectedMap[getRowIdentity(row, rowKey.value)];\r\n      }\r\n      // 没有key\r\n      else {\r\n        return selection.value.includes(row);\r\n      }\r\n    };\r\n\r\n    let _isAllSelected = true;\r\n    let selectedCount = 0;\r\n    let childrenCount = 0;\r\n\r\n    for (let i = 0, j = (data.value || []).length; i < j; i++) {\r\n      // 行数据的Key\r\n      const keyProp = vm?.store?.states?.rowKey.value;\r\n\r\n      // 行index\r\n      const rowIndex = i + childrenCount;\r\n      // 当前数据\r\n      const item = data.value[i];\r\n\r\n      // 是否有可选行\r\n      const isRowSelectable =\r\n        selectable.value && selectable.value.call(null, item, rowIndex);\r\n\r\n      // 当前行没有选中\r\n      if (!isSelected(item)) {\r\n        if (!selectable.value || isRowSelectable) {\r\n          _isAllSelected = false;\r\n\r\n          break;\r\n        }\r\n      }\r\n      // 选中了\r\n      else {\r\n        selectedCount++;\r\n      }\r\n\r\n      // 子节点数量\r\n      childrenCount += getChildrenCount(getRowIdentity(item, keyProp));\r\n    }\r\n\r\n    // 不是全选\r\n    if (selectedCount === 0) {\r\n      _isAllSelected = false;\r\n    }\r\n\r\n    // 设置全选状态\r\n    isAllSelected.value = _isAllSelected;\r\n  };\r\n\r\n  // 通过rowKey获取所有子节点的个数\r\n  const getChildrenCount = (rowKey: string) => {\r\n    if (!vm || !vm.store) {\r\n      return 0;\r\n    }\r\n\r\n    // 树形\r\n    const { treeData } = vm.store.states;\r\n\r\n    // 子节点数量\r\n    let count = 0;\r\n\r\n    // 有子节点\r\n    const children = treeData.value[rowKey]?.children;\r\n\r\n    // 有子节点\r\n    if (children) {\r\n      count += children.length;\r\n\r\n      children.forEach((childKey) => {\r\n        count += getChildrenCount(childKey);\r\n      });\r\n    }\r\n\r\n    return count;\r\n  };\r\n\r\n  // 清除多选选择行\r\n  const clearSelection = () => {\r\n    isAllSelected.value = false;\r\n\r\n    const oldSelection = selection.value;\r\n\r\n    // 有选择行\r\n    if (oldSelection.length) {\r\n      selection.value = [];\r\n\r\n      vm.emit('on-selection-change', []);\r\n    }\r\n  };\r\n\r\n  // 清洁选择\r\n  const cleanRedundantSelection = () => {\r\n    // 需要删除的数据\r\n    let deleted;\r\n\r\n    // 有rowKey\r\n    if (rowKey.value) {\r\n      deleted = [];\r\n\r\n      // 行数据的Key\r\n      const selectedMap = getKeysMap(selection.value, rowKey.value);\r\n\r\n      // 获取列数据 {index, row}\r\n      const dataMap = getKeysMap(data.value, rowKey.value);\r\n\r\n      for (const key in selectedMap) {\r\n        // 是否存在数据\r\n        if (hasOwn(selectedMap, key) && !dataMap[key]) {\r\n          // 获取需要删除的数据(当前数据列表中不存在的数据)\r\n          deleted.push(selectedMap[key].row);\r\n        }\r\n      }\r\n    }\r\n    // 没有设置rowKey\r\n    else {\r\n      // 获取需要删除的数据(当前数据列表中不存在的数据)\r\n      deleted = selection.value.filter((item) => !data.value.includes(item));\r\n    }\r\n\r\n    // 有需要删除的数组\r\n    if (deleted.length) {\r\n      // 过滤数据获取最新的选择数据\r\n      const newSelection = selection.value.filter(\r\n        (item) => !deleted.includes(item)\r\n      );\r\n\r\n      selection.value = newSelection;\r\n\r\n      // 选择的数据\r\n      vm.emit('on-selection-change', newSelection);\r\n    }\r\n  };\r\n\r\n  // 根据 filters 与 sort 去过滤 data\r\n  const handleExecQueryData = (filter = true) => {\r\n    // 过滤数据\r\n    if (filter) {\r\n      initFilterData();\r\n    }\r\n\r\n    // 排序数据\r\n    initSortData();\r\n  };\r\n\r\n  // 排序数据\r\n  const initSortData = () => {\r\n    data.value = sortData(filteredData.value, {\r\n      // 需要排序的列\r\n      sortingColumn: sortingColumn.value,\r\n      // 排序的key 对应列内容的字段名\r\n      sortProp: sortProp.value,\r\n      // 排序顺序\r\n      sortOrder: sortOrder.value,\r\n    });\r\n  };\r\n\r\n  // 过滤数据\r\n  const initFilterData = () => {\r\n    let sourceData = unref(_data);\r\n\r\n    // 循环列\r\n    Object.keys(filters.value).forEach((columnId) => {\r\n      // 列的值->选择过滤的数据\r\n      const values = filters.value[columnId];\r\n\r\n      // 没有选择数据\r\n      if (!values || values.length === 0) {\r\n        return;\r\n      }\r\n\r\n      // 根据当前选择需要筛选的列id -> 获取表格中的当前选择列数据\r\n      const column = getColumnById(\r\n        {\r\n          columns: columns.value,\r\n        },\r\n        columnId\r\n      );\r\n\r\n      // 是否有自定义过滤方法\r\n      if (column && column.filterMethod) {\r\n        sourceData = sourceData.filter((row) => {\r\n          return values.some((value) =>\r\n            column.filterMethod.call(null, value, row, column)\r\n          );\r\n        });\r\n      }\r\n    });\r\n\r\n    filteredData.value = sourceData;\r\n  };\r\n\r\n  // 更新排序属性\r\n  const updateSort = (column, prop, order) => {\r\n    // 重置排序排序顺序\r\n    if (sortingColumn.value && sortingColumn.value !== column) {\r\n      sortingColumn.value.order = null;\r\n    }\r\n\r\n    // 重新设置排序顺序\r\n    sortingColumn.value = column;\r\n\r\n    // 排序的key 对应列内容的字段名\r\n    sortProp.value = prop;\r\n\r\n    // 排序方向\r\n    sortOrder.value = order;\r\n  };\r\n\r\n  // 检查 rowKey 是否存在\r\n  const assertRowKey = () => {\r\n    if (!rowKey.value) {\r\n      throwError('ivue-table', 'prop row-key is required');\r\n    }\r\n  };\r\n\r\n  // 更新过滤的数据\r\n  const updateFilters = (columns, values) => {\r\n    if (!Array.isArray(columns)) {\r\n      columns = [columns];\r\n    }\r\n\r\n    const obj: any = {};\r\n\r\n    // 获取列表数据\r\n    columns.forEach((item) => {\r\n      filters.value[`${item.id}`] = values;\r\n\r\n      obj[item.columnKey || item.id] = values;\r\n    });\r\n\r\n    return obj;\r\n  };\r\n\r\n  // 用于清空排序条件，数据会恢复成未排序的状态\r\n  const clearSort = () => {\r\n    // 没有排序\r\n    if (!sortingColumn.value) {\r\n      return;\r\n    }\r\n\r\n    // 更新排序属性\r\n    updateSort(null, null, null);\r\n\r\n    vm.store.commit('changeSortCondition', {\r\n      silent: true,\r\n    });\r\n  };\r\n\r\n  // 传入由columnKey 组成的数组以清除指定列的过滤条件\r\n  //  如果没有参数，清除所有过滤器\r\n  const clearFilter = (columnKeys) => {\r\n    const { tableHeaderContent } = vm.refs;\r\n\r\n    // 没有头部\r\n    if (!tableHeaderContent) {\r\n      return;\r\n    }\r\n\r\n    // 当前有哪些过滤列表\r\n    const panels = Object.assign({}, tableHeaderContent.filterPanels);\r\n\r\n    const keys = Object.keys(panels);\r\n\r\n    // 没有过滤列表\r\n    if (!keys.length) {\r\n      return;\r\n    }\r\n\r\n    // 清除指定列的过滤条件\r\n    if (typeof columnKeys === 'string') {\r\n      columnKeys = [columnKeys];\r\n    }\r\n\r\n    // 有过滤条件\r\n    if (Array.isArray(columnKeys)) {\r\n      const _columns = columnKeys.map((key) =>\r\n        getColumnByKey(\r\n          {\r\n            columns: columns.value,\r\n          },\r\n          key\r\n        )\r\n      );\r\n\r\n      // 清空过滤的值\r\n      keys.forEach((key) => {\r\n        const column = _columns.find((col) => col.id === key);\r\n\r\n        // 清空过滤的值\r\n        if (column) {\r\n          column.filteredValue = [];\r\n        }\r\n      });\r\n\r\n      // 发送事件 过滤改变\r\n      vm.store.commit('filterChange', {\r\n        column: _columns,\r\n        values: [],\r\n        silent: true,\r\n        multi: true,\r\n      });\r\n    }\r\n    // 没有过滤条件清空全部过滤列表\r\n    else {\r\n      // 清空全部过滤列表\r\n      keys.forEach((key) => {\r\n        const column = columns.value.find((col) => col.id === key);\r\n        if (column) {\r\n          column.filteredValue = [];\r\n        }\r\n      });\r\n\r\n      filters.value = {};\r\n\r\n      // 发送事件 过滤改变\r\n      vm.store.commit('filterChange', {\r\n        column: {},\r\n        values: [],\r\n        silent: true,\r\n      });\r\n    }\r\n  };\r\n\r\n  // 展开行与 TreeTable 都要使用\r\n  const toggleRowExpansionAdapter = (\r\n    row: TableColumnCtx,\r\n    expanded: boolean\r\n  ) => {\r\n    // 是否是展开列\r\n    const hasExpandColumn = columns.value.some(({ type }) => type === 'expand');\r\n\r\n    // 展开列\r\n    if (hasExpandColumn) {\r\n      toggleRowExpansion(row, expanded);\r\n    }\r\n    // 切换树节点展开\r\n    else {\r\n      toggleTreeExpansion(row, expanded);\r\n    }\r\n  };\r\n\r\n  // 适配层，expand-row-keys 在 Expand 与 TreeTable 中都有使用\r\n  const setExpandRowKeysAdapter = (val: string[]) => {\r\n    // 这里会触发额外的计算，但为了兼容性，暂时这么做\r\n    setExpandRowKeys(val);\r\n    // 更新树节点展开\r\n    updateTreeExpandKeys(val);\r\n  };\r\n\r\n  return {\r\n    _toggleAllSelection,\r\n    toggleAllSelection: () => {},\r\n    isRowKey,\r\n    updateSelectionByRowKey,\r\n    updateColumns,\r\n    scheduleLayout,\r\n    updateCurrentRowData,\r\n    updateCurrentRow,\r\n    isSelected,\r\n    toggleRowSelection,\r\n    updateAllSelected,\r\n    clearSelection,\r\n    cleanRedundantSelection,\r\n    handleExecQueryData,\r\n    updateSort,\r\n    assertRowKey,\r\n    updateFilters,\r\n    clearSort,\r\n    clearFilter,\r\n    getSelectionRows,\r\n    toggleRowExpansion,\r\n    toggleRowExpansionAdapter,\r\n    updateExpandRows,\r\n    setExpandRowKeysAdapter,\r\n    setCurrentRowKey,\r\n    isRowExpanded,\r\n    updateTreeData,\r\n    loadOrToggle,\r\n    // 状态\r\n    states: {\r\n      data,\r\n      _data,\r\n      rowKey,\r\n      selectOnIndeterminate,\r\n      isFixedColumns,\r\n      hoverRow,\r\n      columns,\r\n      _columns,\r\n      originColumns,\r\n      rightFixedLeafColumnsLength,\r\n      fixedLeafColumnsLength,\r\n      fixedColumns,\r\n      rightFixedColumns,\r\n      isAllSelected,\r\n      selectable,\r\n      reserveSelection,\r\n      selection,\r\n      sortProp,\r\n      sortingColumn,\r\n      sortOrder,\r\n      ...expandStates,\r\n      ...treeStates,\r\n      ...currentData,\r\n    },\r\n  };\r\n}\r\n\r\nexport default useWatcher;\r\n"],"names":["rowKey","isSelected","columns","_columns"],"mappings":"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"}