import { ReactElement, ReactNode, Ref } from 'react'; import { DivProps, Id, Obj, Size } from '../../types'; import { ColumnType, DataGridBaseProps, DataGridMultipleProps, DataGridSingleProps, OrderType, RowType } from '../dataGrid'; import { FormItemProps, FormProps, FormRef, FormValue } from '../form'; import { CurdFilterable, CurdFilterableProps } from './curdFilterable'; import { FieldPath } from '../../utils'; import { ButtonProps } from '../button'; import { CurdDialogProps } from './curdDialog'; import { BubbleConfirmProps } from '../bubbleConfirm'; import { BubbleProps } from '../bubble'; export type CurdFormItemProps = FormItemProps & { /** 对filter或form内的字段单独排序,数字越大越靠后,默认为`0` */ order?: number; } & Obj; export type CurdFormItemType = CurdFormItemProps | ReactElement | true; export interface CurdColumn extends Omit, 'filter' | 'children'> { /** 在表格中隐藏,表明该列只用于filter或form */ hideInTable?: boolean; filter?: CurdFormItemType | (() => CurdFormItemType); filterInline?: ColumnType['filter']; form?: CurdFormItemType | ((activeRow?: R) => CurdFormItemType); } export type LoadRowsReturn = { rows: R[]; /** 必须返回总数才能使翻页正常工作 */ total: number; }; type EachRowType = T | ((row: R) => T); export type CurdRef = { reload(): Promise; setPage(page: number): void; getPage(): number; setPageSize(size: number): void; getPageSize(): number; setFilterValue(filterValue: FormValue): void; getFilterValue(): FormValue; resetFilter(): void; openCreateDialog(defaultValue?: F): Promise | undefined; openUpdateDialog(row: R, defaultValue?: F): Promise | undefined; selectSingle(): Promise | undefined; selectMultiple(selected?: Id[]): Promise | undefined; }; export interface CurdBaseProps extends Omit, 'ref' | 'columns' | 'filterPredicate' | 'onLoad'> { ref?: Ref>; /** 默认属性会传递给DataGrid组件,外层包裹元素的属性使用wrapperProps */ wrapperProps?: DivProps; /** 嵌入式样式通常用于Dialog或Card组件内 */ variant?: 'standard' | 'embeded'; loadRows?: { bivarianceHack(pagination?: { page: number; pageSize: number; }, filterValue?: FormValue, sorter?: { field: FieldPath; type: OrderType; }): LoadRowsReturn | null | Promise | null>; }['bivarianceHack']; onLoad?(rowsReturn: LoadRowsReturn): void; columns?: (CurdColumn | symbol)[]; toolbarLeft?: ReactNode; toolbarRight?: ReactNode; reloadable?: boolean; onReload?(): void; resizable?: boolean; defaultSize?: Size; onSizeChange?(size: Size): void; columnConfigurable?: boolean | { defaultVisible?: Id[]; visible?: Id[]; onVisibleChange?(visible: Id[]): void; defaultOrder?: Id[]; order?: Id[]; onOrderChange?(order: Id[]): void; }; resizeBubbleProps?: BubbleProps; columnConfigBubbleProps?: BubbleProps; filterableProps?: Omit; renderFilterable?(filterableProps: CurdFilterableProps): ReactNode; renderFilterConditions?: CurdFilterableProps['renderFilterConditions']; copyable?: boolean; creatable?: boolean; updatable?: EachRowType; deletable?: EachRowType; createButtonProps?: ButtonProps; updateButtonProps?: EachRowType; deleteButtonProps?: EachRowType; deleteConfirmProps?: BubbleConfirmProps; controlColumnTitle?: ReactNode; /** 渲染额外的操作项,不会影响"编辑"与"删除"按钮 */ renderExtraControl?(row: R): ReactNode; /** 用于做每行数据标题的字段 */ titleKey?: keyof R; /** 数据的名称,默认为`"数据"` */ dataName?: ReactNode; /** create操作的名称,默认为`"添加"` */ createName?: ReactNode; /** update操作的名称,默认为`"编辑"` */ updateName?: ReactNode; /** delete操作的名称,默认为`"删除"` */ deleteName?: ReactNode; /** create操作完成后触发,若返回promise则会等待promise返回再触发loadRows */ onCreate?(formValue: F): any; onUpdate?(formValue: F, row: R): any; onDelete?(row: R): any; /** 行数据转换为表单值的方法,若不指定,行数据会直接填入表单 */ rowToForm?(row: R): F | Promise; dialogProps?: Partial>; formProps?: FormProps; formRef?: Ref>; } interface CurdSingleProps extends Omit, 'ref' | 'columns' | 'onLoad'>, CurdBaseProps { } interface CurdMultipleProps extends Omit, 'ref' | 'columns' | 'onLoad'>, CurdBaseProps { } export type CurdProps = CurdSingleProps | CurdMultipleProps; export declare const Curd: { (props: CurdProps): ReactElement; Filter: typeof CurdFilterable; CONTROL_COLUMN: symbol; }; export {};