import { AndOr, ColumnFilter, EditingData, FilterDirective, IndexRow, RowData } from '@/lib/types'; export const getEndIndex = (startIndex: number, viewCount: number) => { return startIndex + viewCount; }; export const getViewCount = (bodyViewHeight: number, rowHeight: number) => { return Math.ceil(bodyViewHeight / rowHeight); }; export const getStartIndex = (scrollTop: number, rowHeight: number) => { return Math.floor(scrollTop / rowHeight); }; const exchangeRowFilterColumn2Id = ( columnField2Id: Record, rowFilter: Record, ) => { return Object.keys(rowFilter).reduce>((acc, key) => { if (columnField2Id[key]) { return { ...acc, [columnField2Id[key]]: rowFilter[key], }; } else { return acc; } }, {}); }; const directiveFilter = { [FilterDirective.contain]: (originalValue: string | number | boolean, value: string) => `${originalValue}`.includes(value), [FilterDirective.notContain]: (originalValue: string | number | boolean, value: string) => !`${originalValue}`.includes(value), [FilterDirective.equal]: (originalValue: string | number | boolean, value: string) => `${originalValue}` === value, [FilterDirective.notEqual]: (originalValue: string | number | boolean, value: string) => `${originalValue}` !== value, [FilterDirective.empty]: (originalValue: string | number | boolean) => !originalValue, [FilterDirective.notEmpty]: (originalValue: string | number | boolean) => !!originalValue, }; const valueFilter = (directive: FilterDirective, value: string) => { return (originalValue: string | number | boolean) => directiveFilter[directive](originalValue, value); }; const isRowPassByFilter = ( rowData: Record, columnFilters: Record, andOr: AndOr, ) => { // 每一个 column 的筛选是 且 关系,必须所有都满足才展示 return Object.keys(columnFilters)[andOr === AndOr.and ? 'every' : 'some']((columnId) => { const columnValue = rowData[columnId]; const { andOr: columnAndOr, filters } = columnFilters[columnId]; return filters[columnAndOr === AndOr.and ? 'every' : 'some'](({ directive, value }) => valueFilter(directive, value)(columnValue.value), ); }); }; export const filterRow = ( rowIndex2Id: string[], data2D: Record, columnField2Id: Record, columnFilters: Record, andOr: AndOr, ) => { // 将 rowFilter 的 key 由 field 置换为 id const filterWithId = exchangeRowFilterColumn2Id(columnField2Id, columnFilters); // 按照当前索引过滤每一行是否应该存在 return rowIndex2Id.filter((id) => { // 过滤 return isRowPassByFilter(data2D[id].fieldData, filterWithId, andOr); }); }; export const resetRowInfoByIndex = ( newRowIndex2Id: string[], baseRowRecord: Record, ) => { let heightCount = 0; return newRowIndex2Id.reduce>((acc, id, index) => { acc[id] = { ...baseRowRecord[id], id, index, // 用全量数据的高度做为高度 height: baseRowRecord[id].height, top: heightCount, }; heightCount = heightCount + baseRowRecord[id].height; return acc; }, {}); };