import { Slots } from 'vue'; import { InputNumberInstance, DatePickerProps, InputInstance, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckboxGroup, ElCheckbox, SwitchProps, ColorPickerProps, ColorPickerEmits } from 'element-plus'; import { Pagination, BaseResult } from '../types'; export type ExtProps = Partial>; export interface BaseColumn { prop: string; slots?: Slots; } export interface InputColumn extends BaseColumn, ExtProps { rType?: 'text'; rows?: number; elProps?: Partial; } export interface NumberColumn extends BaseColumn, ExtProps { rType: 'number'; } export interface DateColumn extends BaseColumn, Partial { rType: 'date'; onChange?: (val: DatePickerProps['modelValue']) => void; onCalendarChange?: (val: [Date, null | Date]) => void; } export type ValueMap = Record; export type SelectProps = InstanceType['$props']; export type ElOptionProps = InstanceType['$props']; export type SelectColumnOption = Omit & { value?: ElOptionProps['value']; [key: string]: any; }; export interface SelectColumn extends BaseColumn, SelectProps { rType: 'select'; options: SelectColumnOption[]; labelKey?: string; valueMap?: ValueMap; } type ElRadioGroupProps = InstanceType['$props']; type ElRadioProps = InstanceType['$props']; export interface RadioColumn extends BaseColumn, ElRadioGroupProps { rType: 'radio'; options: (Omit & { value: ElRadioProps['modelValue']; })[]; } type CheckBoxGroupProps = InstanceType['$props']; type ElCheckboxProps = InstanceType['$props']; export interface CheckboxColumn extends BaseColumn, ElCheckboxProps { rType: 'checkbox'; options?: (Omit & { value: ElCheckboxProps['modelValue']; })[]; } export interface CheckboxGroupColumn extends BaseColumn, CheckBoxGroupProps { rType: 'checkboxGroup'; options: (Omit & { value: ElCheckboxProps['modelValue']; })[]; } export type CustomScope = { model: T; state: CustomColumn['state']; }; export interface CustomColumn extends BaseColumn { rType: 'custom'; state?: Record; render?: (scope: CustomScope) => JSX.Element; } export interface SwitchColumn extends BaseColumn, Partial { rType: 'switch'; } export interface RemoteColumn extends BaseColumn, SelectProps { rType: 'remote'; params?: Record; method: (query: [p: Pagination, keyword: string, params?: RemoteColumn['params']]) => BaseResult | Promise>; renderLabel?: (i: any) => ElOptionProps['label']; valueMap?: ValueMap; labelKey?: string; noCache?: boolean; defaultOptions?: ElOptionProps[]; } export interface ColorColumn extends BaseColumn, Partial { rType: 'color'; onChange?: ColorPickerEmits['change']; onActiveChange?: ColorPickerEmits['activeChange']; } export type Column = InputColumn | NumberColumn | DateColumn | CustomColumn | SelectColumn | RadioColumn | CheckboxColumn | RemoteColumn | SwitchColumn | CheckboxGroupColumn | ColorColumn; export type ExpandColumn = T extends BaseColumn ? T & K : never; export type ExcludeColumn = T extends BaseColumn ? Omit : never; export {};