{"version":3,"file":"useFilters.mjs","sources":["../../packages/filter/useFilters.ts"],"sourcesContent":["/*\n * 局部过滤hook\n * @Author: peng-xiao-shuai\n * @Date: 2021-09-22 16:31:33\n * @Last Modified by: peng-xiao-shuai\n * @Last Modified time: 2024-11-14 16:05:01\n */\n\nimport { deepClone } from '../index'\nimport type { PowerfulTableHeader, PowerfulTableHeaderProps } from '~/index'\nimport type {\n  FilterComponents,\n  PowerfulTableProps,\n  StateData,\n} from '../powerful-table/src/powerful-table-data'\nexport function useFilters<L>(\n  state: StateData<L>,\n  props: PowerfulTableProps<L>,\n  filterComponents: FilterComponents\n) {\n  const treeProps = props.tree?.props!\n\n  // 为list数据排序，使其存在树形数据的在前面\n  let tableLists: (L & { [s: string]: any; _cdSort: number })[] = []\n  /**\n   * 数据过滤使用的方法，如果是多选的筛选项，对每一条数据会执行多次，任意一次返回 true 就会显示。\n   */\n  const headerFilter = (\n    value: (number | string)[],\n    column: PowerfulTableHeader<L>,\n    // 初始数据\n    initList: any[] = deepClone(props.list)\n  ) => {\n    // 存在值则不在进行排序，优化性能 用于树形排序，目前树形排序存在问题，所有没什么作用\n    if (!tableLists.length) {\n      tableLists = deepClone(\n        <PowerfulTableProps<L & { [s: string]: any; _cdSort: number }>>props\n      ).list.sort((a, b) => {\n        a._cdSort = a[treeProps?.children!] ? 1 : 0\n        b._cdSort = b[treeProps?.children!] ? 1 : 0\n        return b._cdSort - a._cdSort\n      })\n    }\n\n    const filterList = initList\n\n    if (!value || (Array.isArray(value) && !value.length)) {\n      return props.list\n    }\n\n    const propObj = propObjs<L>(column)\n    // 判断监听类型\n    if (\n      (propObj.filters && propObj.filtersType === 'select') ||\n      propObj.type === 'switch'\n    ) {\n      recursionFilterFun<L>(\n        treeProps,\n        tableLists,\n        (data: (typeof props.list)[number]): boolean => {\n          // 类型断言\n          const D = data as L & { [s: string]: any }\n          const isShow = value.some((prop) => {\n            switch (propObj.type) {\n              // tag类型单独判断\n              case 'tag': {\n                const tagVal: string[] = (\n                  typeof D[propObj.prop] == 'string'\n                    ? D[propObj.prop].split(',')\n                    : D[propObj.prop]\n                )?.map((num: string | number) => String(num))\n                return tagVal?.includes(String(prop))\n              }\n              default:\n                return D[propObj.prop] == prop\n            }\n          })\n          return isShow\n        },\n        filterList\n      )\n    } else if (propObj.filtersType === 'date') {\n      const valueAs = value as string[]\n      recursionFilterFun<L>(\n        treeProps,\n        tableLists,\n        (data: (typeof props.list)[number]): boolean =>\n          compare(\n            (data as L & { [s: string]: any })[propObj.prop],\n            valueAs[0],\n            valueAs[1]\n          ),\n        filterList\n      )\n    } else {\n      recursionFilterFun<L>(\n        treeProps,\n        tableLists,\n        (data: (typeof props.list)[number]) =>\n          String(\n            (data as L & { [s: string]: any })[propObj.prop] || ''\n          ).includes(String(value)),\n        filterList\n      )\n    }\n    return filterList\n  }\n\n  /**\n   * 获取需要过滤的prop\n   */\n  const getPropObj = computed(\n    () =>\n      (column: PowerfulTableHeader): PowerfulTableHeaderProps<L> => {\n        return propObjs<L>(column)\n      }\n  )\n\n  const handleHeaderFilterChange = (\n    value: string | (number | string)[],\n    column: PowerfulTableHeader<L>\n  ) => {\n    let filterList: any[] = []\n    // item.state 是存在的不确定是否是vue的bug. vue文件 <script setup> 中使用 expose 没有问题，\n    // 但是在 tsx 中使用 expose 组件ref可以获取到 expose 暴露的数据，但是类型上不存在 expose 暴露的数据\n    const componentData = filterComponents.value?.filter(\n      (item: any) => item.state.value.length\n    )\n\n    if (componentData?.length) {\n      // 自定义过滤逻辑\n      if (typeof getPropObj.value(column).customFilter === 'function') {\n        new Promise<any[]>((resolve) => {\n          getPropObj.value(column).customFilter!(value, column, resolve)\n        }).then((res) => {\n          state.tableLists = res\n        })\n        return\n      }\n\n      componentData.forEach((item: any) => {\n        filterList = headerFilter(item.state.value, item.header, filterList)\n        state.tableLists = filterList\n      })\n    } else {\n      state.tableLists = props.list\n    }\n  }\n\n  return {\n    handleHeaderFilterChange,\n    getPropObj,\n  }\n}\n\n/**\n * 递归过滤\n * @param {object} propValue el-table treeProps属性\n * @param {array} data tableLists 数据集\n * @param {function} callback 自定义过滤逻辑\n * @param {array} lists 过滤接受的数组\n * @date\n */\nconst recursionFilterFun = <L>(\n  propValue: { children: string; hasChildren: string },\n  data: L[],\n  callback: (data: L) => boolean,\n  lists: any[]\n) => {\n  if (data && data.length) {\n    data.forEach((item: L) => {\n      const D = deepClone(item) as { [s: string]: any }\n      if (D[propValue.children] && D[propValue.children].length) {\n        // 清除子集，避免添加的数据中不符合过滤的子集仍然存在\n        D[propValue.children] = []\n        isPush(callback(item), lists, D)\n\n        recursionFilterFun<L>(\n          propValue,\n          (item as L & { [s: string]: any })[propValue.children],\n          callback,\n          callback(item) ? lists[lists.length - 1][propValue.children] : lists\n        )\n      } else {\n        isPush(callback(item), lists, D)\n      }\n    })\n  }\n}\n\n// 判断是否可以添加数据，如果list中存在一样的 data 数据则不添加\n// TODO 不支持树形表格，多个表头参数查询，非树形表格没问题\nconst isPush = <D>(bool: boolean, list: any[], data: D) => {\n  if (bool) {\n    if (list.length) {\n      const listStr = list.map((item) => JSON.stringify(item))\n\n      listStr.some((item) => {\n        return item\n          .replace(/,\"_cdSort\":\\d/, '')\n          .includes(JSON.stringify(data).replace(/,\"_cdSort\":\\d/, ''))\n      })\n        ? ''\n        : list.push(data)\n    } else {\n      list.push(data)\n    }\n  }\n}\n\nconst propObjs = <L>(\n  column: PowerfulTableHeader\n): PowerfulTableHeaderProps<L> => {\n  // 获取过滤项\n  let propObj: PowerfulTableHeaderProps<L> = { prop: '' }\n  // 判断是否数组\n  if (!Array.isArray(column.props)) {\n    propObj = column.props\n    return propObj\n  }\n  // 是数组的情况下 首先判断单元格prop的数量\n  if (column.props.length === 1) {\n    propObj = column.props[0]\n  } else if (column.props.length > 1) {\n    // 如果数量在两个以上，则需要用户使用(filterItem: true)指定过滤项，未指定则取第一个\n    const queryFilterItem = column.props.find((item) => item.filterItem)\n    // 如果设置了一个或多个过滤项则取过滤后的第一个，如果没设置则取props第一个prop\n    propObj = queryFilterItem ? queryFilterItem : column.props[0]\n  }\n  return propObj\n}\n\n/**\n * 比较指定时间是否在指定时间段内\n * @param value 目标时间 可被new Date()解析\n * @param begin 开始时间 可被new Date()解析\n * @param end 结束时间 可被new Date()解析\n * @returns boolean\n */\nconst compare = (value: string, begin: string, end: string): boolean => {\n  const valueData = new Date(value)\n  const beginData = new Date(begin)\n  const endData = new Date(end)\n  if (valueData >= beginData && valueData <= endData) {\n    return true\n  }\n  return false\n}\n"],"names":["deepClone","computed","useFilters","state","props","filterComponents","_a","treeProps","tableLists","headerFilter","value","column","initList","a","b","filterList","propObj","propObjs","recursionFilterFun","data","D","prop","tagVal","num","valueAs","compare","getPropObj","componentData","item","resolve","res","propValue","callback","lists","isPush","bool","list","queryFilterItem","begin","end","valueData","beginData","endData"],"mappings":"AAegB,SAAA,aAAAA,SAAA;AAAA,SAAA,YAAAC,SAAA;AAAA,SAAAC,EACdC,GACAC,GACAC,GACA;AAJc,MAAAC;AAKR,QAAAC,KAAYD,IAAAF,EAAM,SAAN,gBAAAE,EAAY;AAG9B,MAAIE,IAA4D,CAAA;AAI1D,QAAAC,IAAe,CACnBC,GACAC,GAEAC,IAAkBZ,EAAUI,EAAM,IAAI,MACnC;AAEC,IAACI,EAAW,WACDA,IAAAR;AAAA,MACoDI;AAAA,IAC/D,EAAA,KAAK,KAAK,CAACS,GAAGC,OACdD,EAAE,UAAUA,EAAEN,KAAA,gBAAAA,EAAW,QAAS,IAAI,IAAI,GAC1CO,EAAE,UAAUA,EAAEP,KAAA,gBAAAA,EAAW,QAAS,IAAI,IAAI,GACnCO,EAAE,UAAUD,EAAE,QACtB;AAGH,UAAME,IAAaH;AAEf,QAAA,CAACF,KAAU,MAAM,QAAQA,CAAK,KAAK,CAACA,EAAM;AAC5C,aAAON,EAAM;AAGT,UAAAY,IAAUC,EAAYN,CAAM;AAElC,QACGK,EAAQ,WAAWA,EAAQ,gBAAgB,YAC5CA,EAAQ,SAAS;AAEjB,MAAAE;AAAA,QACEX;AAAA,QACAC;AAAA,QACA,CAACW,MAA+C;AAE9C,gBAAMC,IAAID;AAgBH,iBAfQT,EAAM,KAAK,CAACW,MAAS;AA/C9B,gBAAAf;AAgDJ,oBAAQU,EAAQ,MAAM;AAAA,cAEpB,KAAK,OAAO;AACJ,sBAAAM,KACJhB,IAAA,OAAOc,EAAEJ,EAAQ,IAAI,KAAK,WACtBI,EAAEJ,EAAQ,IAAI,EAAE,MAAM,GAAG,IACzBI,EAAEJ,EAAQ,IAAI,MAFlB,gBAAAV,EAGC,IAAI,CAACiB,MAAyB,OAAOA,CAAG;AAC3C,uBAAOD,KAAA,gBAAAA,EAAQ,SAAS,OAAOD,CAAI;AAAA,cACrC;AAAA,cACA;AACS,uBAAAD,EAAEJ,EAAQ,IAAI,KAAKK;AAAA,YAC9B;AAAA,UAAA,CACD;AAAA,QAEH;AAAA,QACAN;AAAA,MAAA;AAAA,aAEOC,EAAQ,gBAAgB,QAAQ;AACzC,YAAMQ,IAAUd;AAChB,MAAAQ;AAAA,QACEX;AAAA,QACAC;AAAA,QACA,CAACW,MACCM;AAAA,UACGN,EAAkCH,EAAQ,IAAI;AAAA,UAC/CQ,EAAQ,CAAC;AAAA,UACTA,EAAQ,CAAC;AAAA,QACX;AAAA,QACFT;AAAA,MAAA;AAAA,IACF;AAEA,MAAAG;AAAA,QACEX;AAAA,QACAC;AAAA,QACA,CAACW,MACC;AAAA,UACGA,EAAkCH,EAAQ,IAAI,KAAK;AAAA,QAAA,EACpD,SAAS,OAAON,CAAK,CAAC;AAAA,QAC1BK;AAAA,MAAA;AAGG,WAAAA;AAAA,EAAA,GAMHW,IAAazB;AAAA,IACjB,MACE,CAACU,MACQM,EAAYN,CAAM;AAAA,EAC3B;AAkCG,SAAA;AAAA,IACL,0BAhC+B,CAC/BD,GACAC,MACG;AA1GS,UAAAL;AA2GZ,UAAIS,IAAoB,CAAA;AAGlB,YAAAY,KAAgBrB,IAAAD,EAAiB,UAAjB,gBAAAC,EAAwB;AAAA,QAC5C,CAACsB,MAAcA,EAAK,MAAM,MAAM;AAAA;AAGlC,UAAID,KAAA,QAAAA,EAAe,QAAQ;AAEzB,YAAI,OAAOD,EAAW,MAAMf,CAAM,EAAE,gBAAiB,YAAY;AAC3D,cAAA,QAAe,CAACkB,MAAY;AAC9B,YAAAH,EAAW,MAAMf,CAAM,EAAE,aAAcD,GAAOC,GAAQkB,CAAO;AAAA,UAAA,CAC9D,EAAE,KAAK,CAACC,MAAQ;AACf,YAAA3B,EAAM,aAAa2B;AAAA,UAAA,CACpB;AACD;AAAA,QACF;AAEc,QAAAH,EAAA,QAAQ,CAACC,MAAc;AACnC,UAAAb,IAAaN,EAAamB,EAAK,MAAM,OAAOA,EAAK,QAAQb,CAAU,GACnEZ,EAAM,aAAaY;AAAA,QAAA,CACpB;AAAA,MAAA;AAED,QAAAZ,EAAM,aAAaC,EAAM;AAAA,IAC3B;AAAA,IAKA,YAAAsB;AAAA,EAAA;AAEJ;AAUA,MAAMR,IAAqB,CACzBa,GACAZ,GACAa,GACAC,MACG;AACC,EAAAd,KAAQA,EAAK,UACVA,EAAA,QAAQ,CAACS,MAAY;AAClB,UAAAR,IAAIpB,EAAU4B,CAAI;AACpB,IAAAR,EAAEW,EAAU,QAAQ,KAAKX,EAAEW,EAAU,QAAQ,EAAE,UAE/CX,EAAAW,EAAU,QAAQ,IAAI,IACxBG,EAAOF,EAASJ,CAAI,GAAGK,GAAOb,CAAC,GAE/BF;AAAA,MACEa;AAAA,MACCH,EAAkCG,EAAU,QAAQ;AAAA,MACrDC;AAAA,MACAA,EAASJ,CAAI,IAAIK,EAAMA,EAAM,SAAS,CAAC,EAAEF,EAAU,QAAQ,IAAIE;AAAA,IAAA,KAGjEC,EAAOF,EAASJ,CAAI,GAAGK,GAAOb,CAAC;AAAA,EACjC,CACD;AAEL,GAIMc,IAAS,CAAIC,GAAeC,GAAajB,MAAY;AACzD,EAAIgB,MACEC,EAAK,UACSA,EAAK,IAAI,CAACR,MAAS,KAAK,UAAUA,CAAI,CAAC,EAE/C,KAAK,CAACA,MACLA,EACJ,QAAQ,iBAAiB,EAAE,EAC3B,SAAS,KAAK,UAAUT,CAAI,EAAE,QAAQ,iBAAiB,EAAE,CAAC,CAC9D,KAEGiB,EAAK,KAAKjB,CAAI;AAKxB,GAEMF,IAAW,CACfN,MACgC;AAE5B,MAAAK,IAAuC,EAAE,MAAM;AAEnD,MAAI,CAAC,MAAM,QAAQL,EAAO,KAAK;AAC7B,WAAAK,IAAUL,EAAO,OACVK;AAGL,MAAAL,EAAO,MAAM,WAAW;AAChB,IAAAK,IAAAL,EAAO,MAAM,CAAC;AAAA,WACfA,EAAO,MAAM,SAAS,GAAG;AAElC,UAAM0B,IAAkB1B,EAAO,MAAM,KAAK,CAACiB,MAASA,EAAK,UAAU;AAEnE,IAAAZ,IAAUqB,KAAoC1B,EAAO,MAAM,CAAC;AAAA,EAC9D;AACO,SAAAK;AACT,GASMS,IAAU,CAACf,GAAe4B,GAAeC,MAAyB;AAChE,QAAAC,IAAY,IAAI,KAAK9B,CAAK,GAC1B+B,IAAY,IAAI,KAAKH,CAAK,GAC1BI,IAAU,IAAI,KAAKH,CAAG;AACxB,SAAAC,KAAaC,KAAaD,KAAaE;AAI7C;"}