import {CreateElement, VNodeDirective, VueConstructor} from "vue"; import {ScopedSlot, ScopedSlotChildren} from "vue/types/vnode"; import {ExtendedVue, Vue} from "vue/types/vue"; export namespace FormCreate { export interface Install { (Vue): void; } export interface Create { (rules: FormRule[], config?: FormConfig): $FApi } export interface Init { (rules: FormRule[], config?: FormConfig): MountApi } export interface MountApi { mount($el?: Element): $FApi; remove(); $f: $FApi; } export interface Component { (): VueConstructor[]; (id: string): VueConstructor; (id: string, definition): ExtendedVue; } export interface FormData { [field: string]: any; } export interface BindFormData extends FormData { } export interface BaseButton { innerText?: string; show?: boolean; col?: Col; click?: Function; } export interface BaseConfig { form?: FormConfig; row?: Row; upload?: Upload; submitBtn?: Button; resetBtn?: Button; el?: Element | string; switchMaker?: boolean; iframeHelper?: boolean; mounted?: ($f: $FApi, FormButton>) => void; onReload?: ($f: $FApi, FormButton>) => void; onSubmit?: (formData: FormData, $f: $FApi, FormButton>) => void; } export interface Data { key?: string | number; slot?: string; scopedSlots?: { [key: string]: ScopedSlot | undefined }; ref?: string; class?: any; style?: object[] | object; props?: { [key: string]: any }; attrs?: { [key: string]: any }; domProps?: { [key: string]: any }; on?: { [key: string]: Function | Function[] }; nativeOn?: { [key: string]: Function | Function[] }; directives?: VNodeDirective[]; } export interface BaseOption { slot?: string | DefaultSlot } export interface Rule>> extends Data { readonly type: string; readonly field?: string; event?: { [key: string]: Function }; options?: FormOption[]; validate?: any[]; col?: Col; emit?: string[]; template?: string; emitPrefix?: string; title?: string; value?: any; className?: any; defaultSlot?: any; children?: Array | Creator, Col, FormOption> | string>; hidden?: false visibility?: false [key: string]: any; } export class VData { private _data: Data; private init(): this; class(classList: any): this; class(_class: string, status: boolean | any): this; directives(directives: VNodeDirective | VNodeDirective[]): this; get(): Data; ref(ref: string): this; key(key: string | number): this; slot(slot: string): this; scopedSlots(scopedSlots: { [key: string]: ScopedSlot } | string, val?: ScopedSlot): this; nativeOn(nativeOn: { [key: string]: Function | Function[] } | string, val?: Function): this; on(on: { [key: string]: Function | Function[] } | string, val?: Function): this; props(props: { [key: string]: any } | string, val?: any): this; attrs(attrs: { [key: string]: any } | string, val?: any): this; style(style: { [key: string]: any } | string, val?: any): this; domProps(style: { [key: string]: any } | string, val?: any): this; } export interface DefaultSlot { (rule: Rule, $h: CreateElement): ScopedSlotChildren | string } export class Creator extends VData { private rule: Rule; new(type: string, title: string, field: string, value?: any, props?: object): this; type(type: string): this; get(): Data; getRule(): this; setValue(value: any): this; emitPrefix(emitPrefix: string): this; className(className: any): this; defaultSlot(slot: string | DefaultSlot): this; event(event: object): this; col(col: Col): this; validate(validate: any[] | object): this; options(options: FormOption[]): this; children(children: Array | string>): this; emit(emit: string[]): this; } type CommonMaker = (title: string, field: string, value?: any) => Creator; export interface ParseRuleList extends Iterable { find(field: string): FormRule; } // declare const _Components = [ // 'auto', 'autoComplete', 'cascader', 'checkbox', 'color', 'colorPicker', 'date', 'datePicker', 'dateRange', 'dateTime', 'dateTimeRange', // 'email', 'file', 'frame', 'frameFile', 'frameFileOne', 'frameFiles', 'frameImage', 'frameImageOne', 'frameImages', 'frameInput', 'frameInputOne', // 'frameInputs', 'idate', 'image', 'input', 'inputNumber', 'month', 'number', 'password', 'radio', 'rate', 'select', 'selectMultiple', 'selectOne', 'slider', // 'sliderRange', 'switch', 'text', 'textarea', 'time', 'timePicker', 'timeRange', 'tree', 'treeChecked', 'treeSelected', 'upload', 'uploadFile', 'uploadFileOne', // 'uploadImage', 'uploadImageOne', 'url', 'year' // ]; type Components = 'auto' | 'autoComplete' | 'cascader' | 'checkbox' | 'color' | 'colorPicker' | 'date' | 'datePicker' | 'dateRange' | 'dateTime' | 'dateTimeRange' | 'email' | 'file' | 'frame' | 'frameFile' | 'frameFileOne' | 'frameFiles' | 'frameImage' | 'frameImageOne' | 'frameImages' | 'frameInput' | 'frameInputOne' | 'frameInputs' | 'idate' | 'image' | 'input' | 'inputNumber' | 'month' | 'number' | 'password' | 'radio' | 'rate' | 'select' | 'selectMultiple' | 'selectOne' | 'slider' | 'sliderRange' | 'switch' | 'text' | 'textarea' | 'time' | 'timePicker' | 'timeRange' | 'tree' | 'treeChecked' | 'treeSelected' | 'upload' | 'uploadFile' | 'uploadFileOne' | 'uploadImage' | 'uploadImageOne' | 'url' | 'year'; // declare enum Components{ // auto,autoComplete,cascader,checkbox,color,colorPicker,date,datePicker,dateRange,dateTime,dateTimeRange, // email,file,frame,frameFile,frameFileOne,frameFiles,frameImage,frameImageOne,frameImages,frameInput,frameInputOne, // frameInputs,idate,image,input,inputNumber,month,'number',password,radio,rate,select,selectMultiple,selectOne,slider, // sliderRange,'switch',text,textarea,time,timePicker,timeRange,tree,treeChecked,treeSelected,upload,uploadFile,uploadFileOne, // uploadImage,uploadImageOne,url,year // } export interface Maker { hidden(field: string, value: any): Creator; create(type: string, field?: string, title?: string): Creator; createTmp(template: string, vm: Vue, field?: string, title?: string): Creator; template(template: string, vm: Vue, field?: string, title?: string): Creator; parse(rules: string | Array, toMaker?: boolean): ParseRuleList; auto: CommonMaker; autoComplete: CommonMaker; cascader: CommonMaker; checkbox: CommonMaker; color: CommonMaker; colorPicker: CommonMaker; date: CommonMaker; datePicker: CommonMaker; dateRange: CommonMaker; dateTime: CommonMaker; dateTimeRange: CommonMaker; email: CommonMaker; file: CommonMaker; frame: CommonMaker; frameFile: CommonMaker; frameFileOne: CommonMaker; frameFiles: CommonMaker; frameImage: CommonMaker; frameImageOne: CommonMaker; frameImages: CommonMaker; frameInput: CommonMaker; frameInputOne: CommonMaker; frameInputs: CommonMaker; idate: CommonMaker; image: CommonMaker; input: CommonMaker; inputNumber: CommonMaker; month: CommonMaker; number: CommonMaker; password: CommonMaker; radio: CommonMaker; rate: CommonMaker; select: CommonMaker; selectMultiple: CommonMaker; selectOne: CommonMaker; slider: CommonMaker; sliderRange: CommonMaker; 'switch': CommonMaker; text: CommonMaker; textarea: CommonMaker; time: CommonMaker; timePicker: CommonMaker; timeRange: CommonMaker; tree: CommonMaker; treeChecked: CommonMaker; treeSelected: CommonMaker; upload: CommonMaker; uploadFile: CommonMaker; uploadFileOne: CommonMaker; uploadImage: CommonMaker; uploadImageOne: CommonMaker; url: CommonMaker; year: CommonMaker; } interface ButtonHandle { loading(loading?: boolean): void; finish(): void; disabled(disabled?: boolean): void; show(isShow?: boolean): void; } export interface $FApi { config: FormConfig; rule: FormRule[]; formData(): FormData; getValue(field: string): any; setValue(field: string, value: any): void; setValue(formData: FormData): void; changeValue(field: string, value: any): void; changeField(field: string, value: any): void; changeField(formData: FormData): void; removeField(field: string | string[]): void; validate(successFn?: Function, failFn?: Function): void; validateField(field: string, callback?: (errorMessage: string | boolean) => void): void; resetFields(field?: string | string[]): void; destroy(): void; fields(): string[]; append(rule: FormRule): void; append(rule: FormRule, after: string): void; prepend(rule: FormRule): void; prepend(rule: FormRule, before: string): void; submit(successFn?: Function, failFn?: Function): void; hidden(field: string | string[] | undefined, isHidden?: boolean): void; visibility(field: string | string[] | undefined, isVisibility?: boolean): void; disabled(field: string | string[], disabled?: boolean): void; clearValidateState(field?: string | string[]): void; model(): { [field: string]: FormRule }; component(): { [field: string]: FormRule }; bind(field?: string | string[]): BindFormData; submitStatus(props: FormButton): void; resetStatus(props: FormButton): void; btn: ButtonHandle; resetBtn: ButtonHandle; closeModal(field: string): void; set: (object: object, key: string | number, value: T) => T; reload(rules?: FormRule[]): void; options(options: FormConfig): void; onSubmit(callback: Function): void; refresh(): void; show(isShow?: boolean): void; } }