import * as React from 'react'; import {observable, computed} from 'mobx'; import * as classNames from 'classnames'; import * as _ from 'lodash'; import {FormView} from '../formView'; import {Field} from '../field'; import {Face} from '../face'; import {Rule} from '../rule'; export abstract class ControlBase { protected formView: FormView; constructor(formView:FormView) { this.formView = formView; } render():JSX.Element { return
{this.renderControl()}
; } protected abstract renderControl():JSX.Element; @computed get hasError():boolean {return false;} @computed get filled():boolean {return false;} clear() {} clearErrors() {} readValues(values:any):any {} setError(fieldName:string, error:string) {} setInitValues(values: any) {} isOk():boolean {this.validate(); return !this.hasError;} protected validate() {} } export abstract class Control extends ControlBase { protected field: Field; protected face: Face; protected props: any; protected rules: Rule[]; protected element: HTMLElement; @observable protected isOK?: boolean; @observable protected error: string; @observable protected value: any; constructor(formView:FormView, field:Field, face:Face) { super(formView); this.field = field; this.face = face; this.init(); this.setProps(); } protected ref(element: HTMLElement) { this.element = element; } protected init() { this.rules = []; let r = this.field.rules; if (r !== undefined) { if (Array.isArray(r) === true) this.rules.push(...(r as Rule[])); else this.rules.push(r as Rule); } }; protected setProps():any { return this.props = { ref: this.ref.bind(this), name: this.field.name, } }; @computed get hasError():boolean {return this.error !== undefined;} @computed get filled():boolean { let ret = this.value !== undefined && this.value !== this.field.defaultValue; return ret; } clearValue() { this.value = undefined; } clear() { this.clearErrors(); this.clearValue(); } clearErrors() { this.isOK = undefined; this.error = undefined; } readValues(values:any):any { values[this.field.name] = this.value; } setError(fieldName:string, error:string) {} setInitValues(values: any) {} protected getValueFromElement():any {return this.value;} protected validate() { try { let v = this.getValueFromElement(); if (this.rules.length > 0) { let isOk:boolean; for (let rule of this.rules) { console.log('validate: %s', v); let err = rule(v); console.log('validate: %s err: %s', v, err); if (err === true) { this.error = undefined; isOk = true; } else if (err !== undefined) { //console.log('field %s onBlur v=%s rule=%s err=%s', // this.field.name, JSON.stringify(v), rule, err); this.error = err; this.isOK = false; return; } } this.isOK = isOk; } this.value = v; } catch (e) { this.error = e.message; } } render():JSX.Element { let n; if (this.face !== undefined) { let {notes} = this.face; if (notes !== undefined) n = {notes}; } return
{this.renderControl()} {n}
; } }