import React, { forwardRef, useEffect, useImperativeHandle } from "react" import { SearchOutlined, SyncOutlined } from "@ant-design/icons"; import './global.less' import { Button, Card, Checkbox, DatePicker, Form, Input, Radio, Select, Space } from "antd"; import { useEventListener } from "ahooks"; import { observer, useLocalObservable } from "mobx-react"; import globaStores from "@/store" // let DatePickers: any = DatePicker // const { RangePicker }: { RangePicker: any } = DatePickers; const {RangePicker} = DatePicker interface PublicConfig { name: string, label?: string, placeholder?: string, allowClear?: boolean } // 选择 interface SelectConfig extends PublicConfig { type: 'select', data: { label: any, value: any }[], mode?: "multiple" | "tags" | undefined showSearch?: boolean } // 输入框 interface InputConfig extends PublicConfig { type: 'input', } // 多选框 interface CheckboxConfig { type: 'checkbox', name: string, label?: string, checkboxName?: string } // 单日期选择 interface DatePickerConfig extends PublicConfig { type: "datePicker", disabledDate?: any // 禁用不可选择日期 format?: string// 展示的日期格式 picker?: 'date' | 'week' | 'month' | 'quarter' | 'year' } // 双日期选择 interface RangePickerConfig { type: 'rangePicker', name: string, label?: string, allowClear?: boolean placeholder?: [string, string], disabledDate?: any // 禁用不可选择日期 format?: string// 展示的日期格式 } // 单选框选择 interface RadioGroupConfig { type: 'radioGroup', name: string, isButton?: boolean, label?: string, data: { label: any, value: any, disabled?: boolean }[], buttonStyle?: 'outline' | 'solid' } export type ConfigProps = Array interface Props { onChange?: (data?: any) => void // 返回字段 children?: JSX.Element, // 按钮组件 config?: ConfigProps, // 搜索配置 initialValues?: any, // 默认值 onData?: (data: any) => void } const TopRightBtn = forwardRef((props: Props, ref: any) => { const { onChange, children, config = [], initialValues = {}, onData } = props /** -----变量开始----- */ const { globaStore } = useLocalObservable(() => ({ globaStore: globaStores })) const { data: { isFullscreen } } = globaStore const [form] = Form.useForm() const isParentClassify = Form.useWatch('isParentClassify', form); /** -----变量结束----- */ //映射ref方法 // useImperativeHandle(ref, () => ({ isParentClassify })) useEffect(() => { onData && onData({ isParentClassify }) }, [isParentClassify]) useEventListener('keydown', (ev: any) => { if (ev.code === 'NumpadEnter') { onSearch() } }); // 点击搜索 const onSearch = async () => { form.submit() let data = await form.validateFields() onChange && onChange(data) } // 重置 const reset = () => { form.resetFields(); onSearch() } return <> {!isFullscreen &&
{config?.map((item: SelectConfig | InputConfig | CheckboxConfig | RangePickerConfig | DatePickerConfig | RadioGroupConfig, index: number) => { switch (item.type) { case 'select': return case 'checkbox': return {item?.checkboxName} case 'input': return case 'datePicker': return case 'rangePicker': return case 'radioGroup': return {item?.data?.map((item1: { label: any, value: any, disabled?: boolean }, ind: number) => { if (item?.isButton) { return {item1.value} } else { return {item1.value} } })} default: return null } })}
{children &&
{children}
}
} }) export default React.memo(observer(TopRightBtn))