import React, { useCallback, useMemo, useRef, useImperativeHandle, forwardRef } from 'react'; import { OptForm, Operation, OptBoxDefaultOpt } from '../../index'; import type { OptFormMethods, OperationItemConfig, RecordData, OptFormProps } from '../../index'; import { HeaderOpt, DataListOptConfig } from '../index'; export type DataListSearchDefaultOpt = 'search' | 'reset' | 'export'; type DataListSearchFormProps = Pick< OptFormProps, 'labelCol' | 'colNum' | 'fields' | 'size' | 'onValueChange' >; export interface DataListSearchProps extends DataListSearchFormProps { opts?: OperationItemConfig[] | null; searchOpt?: Omit, 'key'> | null; resetOpt?: Omit, 'key'> | null; exportOpt?: Omit, 'key'> | null; onOpt: (data: Partial, optKey: string) => void; headerOpts?: OperationItemConfig[] | null; onHeaderOpt?: (optKey: string) => void; } export const Search = forwardRef(function (props: DataListSearchProps, ref) { const formRef = useRef(null); const handleOpt = useCallback( (optKey: string) => { if (props.opts !== null) { if (optKey === 'reset') formRef.current?.reset(); } const value = formRef.current?.getData(); props.onOpt(value || {}, optKey); }, [props] ); const hasSearchField = useMemo(() => { if (!props.fields) return false; return props.fields.length > 0; }, [props.fields]); useImperativeHandle(ref, () => ({ getData: () => formRef.current && formRef.current.getData(), reset: () => formRef.current && formRef.current.reset(), check: () => formRef.current && formRef.current.check(), setData: (data: Partial>) => { if (formRef.current) formRef.current.setData(data); else setTimeout(() => { formRef.current && formRef.current.setData(data); }, 100); } })); const opts = useMemo(() => { if (props.opts === null) return null; const data: OperationItemConfig[] = []; if (props.searchOpt !== null) data.push({ key: 'search', name: '查询', type: 'primary', ...props.searchOpt }); if (props.resetOpt !== null) data.push({ key: 'reset', name: '重置', ...props.resetOpt }); if (props.exportOpt !== null) data.push({ key: 'export', name: '导出', ...props.exportOpt }); return ( ); }, [ props.opts, props.searchOpt, props.resetOpt, props.exportOpt, props.size, handleOpt ]); return (
{ if (!hasSearchField) return; if (data.key === 'Enter' || data.code === 'Enter') handleOpt('search'); }} > {hasSearchField && ( )}
{props.headerOpts && props.headerOpts.length > 0 && ( { if (!props.onHeaderOpt) return; props.onHeaderOpt(optKey); }} /> )}
{hasSearchField && opts}
); });