UNPKG

el-plus-powerful-table

Version:

## [DOCS](https://peng-xiao-shuai.github.io/vite-vue-admin-docs/zh-CN/component_directive/component/powerful-table-doc.html)

1 lines 11.8 kB
{"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":"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"}