import type { VxeGridInstance } from 'vxe-table'; import type { BaseFormComponentType, ExtendedFormApi, } from '@vben-core/form-ui'; import type { VxeGridProps } from './types'; import type { ViewedRowHelper } from './use-viewed-row'; import { toRaw } from 'vue'; import { Store } from '@vben-core/shared/store'; import { bindMethods, isBoolean, isFunction, mergeWithArrayOverride, StateHandler, } from '@vben-core/shared/utils'; function getDefaultState(): VxeGridProps { return { class: '', gridClass: '', gridOptions: {}, gridEvents: {}, formOptions: undefined, showSearchForm: true, }; } export class VxeGridApi< T extends Record = any, D extends BaseFormComponentType = BaseFormComponentType, P extends Record = Record, > { public formApi = {} as ExtendedFormApi; // private prevState: null | VxeGridProps = null; public grid = {} as VxeGridInstance; public state: null | VxeGridProps = null; public store: Store>; /** * 已读行 helper(在 mount 中初始化,业务能力全部封装在 useViewedRow 中) */ public viewedRowHelper: null | ViewedRowHelper = null; private isMounted = false; private stateHandler: StateHandler; constructor(options: VxeGridProps = {} as VxeGridProps) { const storeState = { ...options }; const defaultState = getDefaultState(); this.store = new Store>( mergeWithArrayOverride(storeState, defaultState) as VxeGridProps, ); this.store.subscribe((state) => { // this.prevState = this.state; this.state = state; }); this.state = this.store.state; this.stateHandler = new StateHandler(); bindMethods(this); } /** * 清除所有已读状态 */ clearViewedRows() { this.viewedRowHelper?.clearViewed(); } /** * 获取所有已读的 key 集合(返回副本,避免外部修改内部状态) */ getViewedKeys(): Set { const raw = this.viewedRowHelper?.viewedSet.value; return raw ? new Set(raw) : new Set(); } /** * 判断某行是否已读 */ isRowViewed(record: T): boolean { return this.viewedRowHelper?.isViewed(record) ?? false; } /** * 批量标记行为已读 */ markKeysAsViewed(keys: Array) { this.viewedRowHelper?.markKeysAsViewed(keys); } /** * 标记某行为已读 */ markRowAsViewed(record: T) { this.viewedRowHelper?.markAsViewed(record); } mount(instance: null | VxeGridInstance, formApi: ExtendedFormApi) { if (!this.isMounted && instance) { this.grid = instance; this.formApi = formApi; this.stateHandler.setConditionTrue(); this.isMounted = true; } } async query(params: Record = {}) { try { await this.grid.commitProxy('query', toRaw(params)); } catch (error) { console.error('Error occurred while querying:', error); } } async reload(params: Record = {}) { try { await this.grid.commitProxy('reload', toRaw(params)); } catch (error) { console.error('Error occurred while reloading:', error); } } /** * 移除指定 key 的已读状态 */ removeViewedKeys(keys: Array) { this.viewedRowHelper?.removeKeys(keys); } setGridOptions(options: Partial['gridOptions']>) { this.setState({ gridOptions: options, }); } setLoading(isLoading: boolean) { this.setState({ gridOptions: { loading: isLoading, }, }); } setState( stateOrFn: | ((prev: VxeGridProps) => Partial>) | Partial>, ) { if (isFunction(stateOrFn)) { this.store.setState((prev) => { return mergeWithArrayOverride(stateOrFn(prev), prev); }); } else { this.store.setState((prev) => mergeWithArrayOverride(stateOrFn, prev)); } } toggleSearchForm(show?: boolean) { this.setState({ showSearchForm: isBoolean(show) ? show : !this.state?.showSearchForm, }); // nextTick(() => { // this.grid.recalculate(); // }); return this.state?.showSearchForm; } unmount() { this.isMounted = false; this.stateHandler.reset(); this.viewedRowHelper = null; } }