• form 表单


    import JInput from "./JInput";
    import JUpload from "./JUpload";
    import { Button, Grid } from "@material-ui/core";
    import JToggle from './JToggle';
    import PageLoading from './../layout/PageLoading';
    import JSelect from './JSelect';
    
    /***
     * @todo 内容输入对列.
     * @param {object} input 当前数据
     * @param {function} onChange (key,value)
     * @property key 传输标识.  key为NULL,则标识更新数据值.
     * @property value 当前传输的数据值.
     * @param {boolean} showLabel 是否显示标签,默认为TRUE
     * @param {object} center  是否居中展示 默认居中
     * @param {object} columns 展示参数,参数可选值如下
     * @property label 显示说明
     * @property type 类型,类型定义固定值.
     * @property append 追加的数据.
     * @property extra 追加的属性值.
     * @property def 默认值,如果存在的话
     * @property renderForm 自定义界面数据 (key,input,valueChange)
     * @property remark 备注说明等另起一行.
     * @property style 内容样式
     * @property labelStyle 标签样式
     * @property edit 是否显示编辑
     * @property required 是否必填.
     * @param {array} actions [{label,value,icon}]
     * @property label 显示的数据
     * @property value 默认的数据值.
     * 
     */
    class JEdit extends React.Component {
    
        constructor(props) {
            super(props);
            this.state = {
                loading: true,
                saving: false,  /***是否在保存中 */
                record: {},  /***state中的数据*/
            }
        }
    
        componentDidMount() {
            const { input } = this.props;
         
            this.setState({ loading: false, record: input });
        }
    
        // static getDerivedStateFromProps(nextProps) {
        //     /***只有定义了处理方法,才会更新数据 */
        //     if (nextProps && null != nextProps && undefined != nextProps.onChange) {
        //         return {
        //             input: undefined == nextProps.input ? {} : nextProps.input,
        //         }
        //     }
        //     return null;
        // }
    
        actionChange = (item) => {
            const { record } = this.state;
            //TODO 此处进行数据完整性校验.
            const { onChange, columns } = this.props;
            if (item.value == 0) {
                this.setState({ record: this.props.input });
                if(onChange){
                    onChange(item.value, record, item);
                }
            } else {
              
                // debugger;//
                if (onChange) {
                    for (const key in columns) {
                        if (columns.hasOwnProperty(key)) {
                            const element = columns[key];
                            if (undefined == record[key]) {
                                record[key] = element.def;
                            }
                        }
                    } //此处添加默认值.
    
                    //此处需要进行数据校验.
                    onChange(item.value, record, item);
                }
            }
        }
    
    
        sync = (item, keyword) => {
            const { record } = this.state;//
            const { columns = {} } = this.props;
            const fix = columns[keyword];
            const fixType = fix.type;
            let app = {};
          
          
            if (fixType == JEdit.TOGGLE) {
                app[keyword] = item ? 1 : 0;
            } else if (fixType == JEdit.WEEK) {
    
            } else if (fixType == JEdit.SELECT) {
                app[keyword] = item.value;
            } else {
                app[keyword] = item;
            }
            let newRecord = { ...record, ...app };
            this.setState({ record: newRecord });
        }
    
        wrapForm = () => {  /***返回显示队列 */
            const { columns = {}, } = this.props;//
            let input = this.state.record;
            const result = [];
            for (const key in columns) {
                if (columns.hasOwnProperty(key)) {
                    const element = columns[key];
                    const { type = JEdit.TEXT,
                        append = [],
                        extra = {},
                        remark,
                        label,
                        required = false,
                        renderForm,
                        style,
                        labelStyle,
                        edit = true } = element;
                    let fixValue = input[key];
                    let innerView = null;//内部的界面数据.
                    if (type == JEdit.TOGGLE) {
                        innerView = (<JToggle key={'input-' + key} name={key}
                            value={fixValue == 1 ? true : false}
                            placeholder={label} disabled={!edit} remark={remark}
                            required={required} onChange={this.sync}  {...extra}/>);
                    } else if (type == JEdit.IMAGE) {
                        
                    } else if (type == JEdit.SELECT) {
                        innerView = (<JSelect key={'input-' + key} name={key} 
                            placeholder={label} 
                            disabled={!edit} value={fixValue} 
                            remark={remark} required={required}
                           data={append}  onChange={this.sync}  {...extra}/>);
                    } else if (type == JEdit.WEEK) {
    
                    }else if (type == JEdit.NUMBER) {
                        innerView = (<JInput key={'input-' + key} name={key}
                        placeholder={label} disabled={!edit} value={fixValue} type='number'
                        remark={remark} required={required} onChange={this.sync}
                        {...extra} />);
                    }else {
                        innerView = (<JInput key={'input-' + key} name={key}
                            placeholder={label} disabled={!edit} value={fixValue}
                            remark={remark} required={required} onChange={this.sync}
                            {...extra} />);
                    }
                    if (null != innerView)
                        result.push(innerView);
                }
            }
            return result;//
        }
    
    
        wrapTable = () => {
            const { columns = {}, wide = { xs: 12, md: 6 } } = this.props;
            const fix = this.wrapForm(columns);
            return fix.map((v, j) => {
                return (<Grid key={'form-g-' + j} item {...wide}>
                    {v}
                </Grid>);
            });
        }
    
        renderActions = () => {
            const { actions = JEdit.def_actions } = this.props;
            return (<div style={{ margin: '1rem 0', display: 'flex', justifyContent: 'space-around' }}>
                {actions.map((v, j) => {
                    const { extra = {} } = v;//
                    return (
                        <Button variant="contained" style={{ margin: '0 2rem' }} color="primary" {...extra} onClick={() => {
                            this.actionChange(v);
                        }} key={`form-btn-${j}`}>{v.label}</Button>
                    );
                })}
            </div>);
        }
    
        render() {
            const { loading } = this.state;//
            if (loading)
                return (<PageLoading />);
            const { center = true } = this.props;
            return (<Grid container spacing={2}
                alignContent="center" direction="column"
                justify={center ? 'center' : 'left'} >
                {this.wrapTable()}
                {this.renderActions()}
            </Grid>);
        }
    }
    JEdit.def_actions = [
        { label: '重置', value: 0 },
        { label: '保存', value: 1, extra: { primary: true, floated: 'right' } }
    ];
    JEdit.PLAIN = "plain"; //展示值
    JEdit.IMAGE = "image"; //图片
    JEdit.FILE = "file"; //文件
    JEdit.RADIO = "radio"; //单选
    JEdit.TOGGLE = "toggle"; //toggle
    JEdit.SELECT = "select"; //单选
    JEdit.DATE_RANGE = "date_range";//日期时间段
    JEdit.DATE = "date";  //日期 09-12
    JEdit.TIME = "time";  //时间 02:34
    JEdit.TIME_RANGE = "time_range"; //时间段 09:00-12:00
    JEdit.TEXTAREA = "textarea"; //多行输入 
    JEdit.NUMBER = "number"; //数字输入 
    JEdit.TEXT = "text";  //文本输入
    JEdit.TAGS = "tags";  //列表多选
    JEdit.WEEK = "week"; //排列星期
    
    export default JEdit;
    import JInput from "./JInput";
    import JUpload from "./JUpload";
    import { Button, Grid } from "@material-ui/core";
    import JToggle from './JToggle';
    import PageLoading from './../layout/PageLoading';
    import JSelect from './JSelect';
    
    /***
     * @todo 内容输入对列.
     * @param {object} input 当前数据
     * @param {function} onChange (key,value)
     * @property key 传输标识.  key为NULL,则标识更新数据值.
     * @property value 当前传输的数据值.
     * @param {boolean} showLabel 是否显示标签,默认为TRUE
     * @param {object} center  是否居中展示 默认居中
     * @param {object} columns 展示参数,参数可选值如下
     * @property label 显示说明
     * @property type 类型,类型定义固定值.
     * @property append 追加的数据.
     * @property extra 追加的属性值.
     * @property def 默认值,如果存在的话
     * @property renderForm 自定义界面数据 (key,input,valueChange)
     * @property remark 备注说明等另起一行.
     * @property style 内容样式
     * @property labelStyle 标签样式
     * @property edit 是否显示编辑
     * @property required 是否必填.
     * @param {array} actions [{label,value,icon}]
     * @property label 显示的数据
     * @property value 默认的数据值.
     * 
     */
    class JEdit extends React.Component {
    
        constructor(props) {
            super(props);
            this.state = {
                loading: true,
                saving: false,  /***是否在保存中 */
                record: {},  /***state中的数据*/
            }
        }
    
        componentDidMount() {
            const { input } = this.props;
         
            this.setState({ loading: false, record: input });
        }
    
        // static getDerivedStateFromProps(nextProps) {
        //     /***只有定义了处理方法,才会更新数据 */
        //     if (nextProps && null != nextProps && undefined != nextProps.onChange) {
        //         return {
        //             input: undefined == nextProps.input ? {} : nextProps.input,
        //         }
        //     }
        //     return null;
        // }
    
        actionChange = (item) => {
            const { record } = this.state;
            //TODO 此处进行数据完整性校验.
            const { onChange, columns } = this.props;
            if (item.value == 0) {
                this.setState({ record: this.props.input });
                if(onChange){
                    onChange(item.value, record, item);
                }
            } else {
              
                // debugger;//
                if (onChange) {
                    for (const key in columns) {
                        if (columns.hasOwnProperty(key)) {
                            const element = columns[key];
                            if (undefined == record[key]) {
                                record[key] = element.def;
                            }
                        }
                    } //此处添加默认值.
    
                    //此处需要进行数据校验.
                    onChange(item.value, record, item);
                }
            }
        }
    
    
        sync = (item, keyword) => {
            const { record } = this.state;//
            const { columns = {} } = this.props;
            const fix = columns[keyword];
            const fixType = fix.type;
            let app = {};
          
          
            if (fixType == JEdit.TOGGLE) {
                app[keyword] = item ? 1 : 0;
            } else if (fixType == JEdit.WEEK) {
    
            } else if (fixType == JEdit.SELECT) {
                app[keyword] = item.value;
            } else {
                app[keyword] = item;
            }
            let newRecord = { ...record, ...app };
            this.setState({ record: newRecord });
        }
    
        wrapForm = () => {  /***返回显示队列 */
            const { columns = {}, } = this.props;//
            let input = this.state.record;
            const result = [];
            for (const key in columns) {
                if (columns.hasOwnProperty(key)) {
                    const element = columns[key];
                    const { type = JEdit.TEXT,
                        append = [],
                        extra = {},
                        remark,
                        label,
                        required = false,
                        renderForm,
                        style,
                        labelStyle,
                        edit = true } = element;
                    let fixValue = input[key];
                    let innerView = null;//内部的界面数据.
                    if (type == JEdit.TOGGLE) {
                        innerView = (<JToggle key={'input-' + key} name={key}
                            value={fixValue == 1 ? true : false}
                            placeholder={label} disabled={!edit} remark={remark}
                            required={required} onChange={this.sync}  {...extra}/>);
                    } else if (type == JEdit.IMAGE) {
                        
                    } else if (type == JEdit.SELECT) {
                        innerView = (<JSelect key={'input-' + key} name={key} 
                            placeholder={label} 
                            disabled={!edit} value={fixValue} 
                            remark={remark} required={required}
                           data={append}  onChange={this.sync}  {...extra}/>);
                    } else if (type == JEdit.WEEK) {
    
                    }else if (type == JEdit.NUMBER) {
                        innerView = (<JInput key={'input-' + key} name={key}
                        placeholder={label} disabled={!edit} value={fixValue} type='number'
                        remark={remark} required={required} onChange={this.sync}
                        {...extra} />);
                    }else {
                        innerView = (<JInput key={'input-' + key} name={key}
                            placeholder={label} disabled={!edit} value={fixValue}
                            remark={remark} required={required} onChange={this.sync}
                            {...extra} />);
                    }
                    if (null != innerView)
                        result.push(innerView);
                }
            }
            return result;//
        }
    
    
        wrapTable = () => {
            const { columns = {}, wide = { xs: 12, md: 6 } } = this.props;
            const fix = this.wrapForm(columns);
            return fix.map((v, j) => {
                return (<Grid key={'form-g-' + j} item {...wide}>
                    {v}
                </Grid>);
            });
        }
    
        renderActions = () => {
            const { actions = JEdit.def_actions } = this.props;
            return (<div style={{ margin: '1rem 0', display: 'flex', justifyContent: 'space-around' }}>
                {actions.map((v, j) => {
                    const { extra = {} } = v;//
                    return (
                        <Button variant="contained" style={{ margin: '0 2rem' }} color="primary" {...extra} onClick={() => {
                            this.actionChange(v);
                        }} key={`form-btn-${j}`}>{v.label}</Button>
                    );
                })}
            </div>);
        }
    
        render() {
            const { loading } = this.state;//
            if (loading)
                return (<PageLoading />);
            const { center = true } = this.props;
            return (<Grid container spacing={2}
                alignContent="center" direction="column"
                justify={center ? 'center' : 'left'} >
                {this.wrapTable()}
                {this.renderActions()}
            </Grid>);
        }
    }
    JEdit.def_actions = [
        { label: '重置', value: 0 },
        { label: '保存', value: 1, extra: { primary: true, floated: 'right' } }
    ];
    JEdit.PLAIN = "plain"; //展示值
    JEdit.IMAGE = "image"; //图片
    JEdit.FILE = "file"; //文件
    JEdit.RADIO = "radio"; //单选
    JEdit.TOGGLE = "toggle"; //toggle
    JEdit.SELECT = "select"; //单选
    JEdit.DATE_RANGE = "date_range";//日期时间段
    JEdit.DATE = "date";  //日期 09-12
    JEdit.TIME = "time";  //时间 02:34
    JEdit.TIME_RANGE = "time_range"; //时间段 09:00-12:00
    JEdit.TEXTAREA = "textarea"; //多行输入 
    JEdit.NUMBER = "number"; //数字输入 
    JEdit.TEXT = "text";  //文本输入
    JEdit.TAGS = "tags";  //列表多选
    JEdit.WEEK = "week"; //排列星期
    
    export default JEdit;
    import JInput from "./JInput";
    import JUpload from "./JUpload";
    import { Button, Grid } from "@material-ui/core";
    import JToggle from './JToggle';
    import PageLoading from './../layout/PageLoading';
    import JSelect from './JSelect';

    /***
    * @todo 内容输入对列.
    * @param{object}input 当前数据
    * @param{function}onChange (key,value)
    * @property key 传输标识. key为NULL,则标识更新数据值.
    * @property value 当前传输的数据值.
    * @param{boolean}showLabel 是否显示标签,默认为TRUE
    * @param{object}center 是否居中展示 默认居中
    * @param{object}columns 展示参数,参数可选值如下
    * @property label 显示说明
    * @property type 类型,类型定义固定值.
    * @property append 追加的数据.
    * @property extra 追加的属性值.
    * @property def 默认值,如果存在的话
    * @property renderForm 自定义界面数据 (key,input,valueChange)
    * @property remark 备注说明等另起一行.
    * @property style 内容样式
    * @property labelStyle 标签样式
    * @property edit 是否显示编辑
    * @property required 是否必填.
    * @param{array}actions [{label,value,icon}]
    * @property label 显示的数据
    * @property value 默认的数据值.
    *
    */
    class JEdit extends React.Component {

    constructor(props) {
    super(props);
    this.state = {
    loading: true,
    saving: false, /***是否在保存中 */
    record: {}, /***state中的数据*/
    }
    }

    componentDidMount() {
    const { input } = this.props;
     
    this.setState({ loading: false, record: input });
    }

    // static getDerivedStateFromProps(nextProps) {
    // /***只有定义了处理方法,才会更新数据 */
    // if (nextProps && null != nextProps && undefined != nextProps.onChange) {
    // return {
    // input: undefined == nextProps.input ? {} : nextProps.input,
    // }
    // }
    // return null;
    // }

    actionChange = (item) => {
    const { record } = this.state;
    //TODO 此处进行数据完整性校验.
    const { onChange, columns } = this.props;
    if (item.value == 0) {
    this.setState({ record: this.props.input });
    if(onChange){
    onChange(item.value, record, item);
    }
    } else {
     
    // debugger;//
    if (onChange) {
    for (const key in columns) {
    if (columns.hasOwnProperty(key)) {
    const element = columns[key];
    if (undefined == record[key]) {
    record[key] = element.def;
    }
    }
    } //此处添加默认值.

    //此处需要进行数据校验.
    onChange(item.value, record, item);
    }
    }
    }


    sync = (item, keyword) => {
    const { record } = this.state;//
    const { columns = {} } = this.props;
    const fix = columns[keyword];
    const fixType = fix.type;
    let app = {};
     
     
    if (fixType == JEdit.TOGGLE) {
    app[keyword] = item ? 1 : 0;
    } else if (fixType == JEdit.WEEK) {

    } else if (fixType == JEdit.SELECT) {
    app[keyword] = item.value;
    } else {
    app[keyword] = item;
    }
    let newRecord = { ...record, ...app };
    this.setState({ record: newRecord });
    }

    wrapForm = () => { /***返回显示队列 */
    const { columns = {}, } = this.props;//
    let input = this.state.record;
    const result = [];
    for (const key in columns) {
    if (columns.hasOwnProperty(key)) {
    const element = columns[key];
    const { type = JEdit.TEXT,
    append = [],
    extra = {},
    remark,
    label,
    required = false,
    renderForm,
    style,
    labelStyle,
    edit = true } = element;
    let fixValue = input[key];
    let innerView = null;//内部的界面数据.
    if (type == JEdit.TOGGLE) {
    innerView = (<JToggle key={'input-' + key} name={key}
    value={fixValue == 1 ? true : false}
    placeholder={label} disabled={!edit} remark={remark}
    required={required} onChange={this.sync} {...extra}/>);
    } else if (type == JEdit.IMAGE) {
     
    } else if (type == JEdit.SELECT) {
    innerView = (<JSelect key={'input-' + key} name={key}
    placeholder={label}
    disabled={!edit} value={fixValue}
    remark={remark} required={required}
    data={append} onChange={this.sync} {...extra}/>);
    } else if (type == JEdit.WEEK) {

    }else if (type == JEdit.NUMBER) {
    innerView = (<JInput key={'input-' + key} name={key}
    placeholder={label} disabled={!edit} value={fixValue} type='number'
    remark={remark} required={required} onChange={this.sync}
    {...extra} />);
    }else {
    innerView = (<JInput key={'input-' + key} name={key}
    placeholder={label} disabled={!edit} value={fixValue}
    remark={remark} required={required} onChange={this.sync}
    {...extra} />);
    }
    if (null != innerView)
    result.push(innerView);
    }
    }
    return result;//
    }


    wrapTable = () => {
    const { columns = {}, wide = { xs: 12, md: 6 } } = this.props;
    const fix = this.wrapForm(columns);
    return fix.map((v, j) => {
    return (<Grid key={'form-g-' + j} item {...wide}>
    {v}
    </Grid>);
    });
    }

    renderActions = () => {
    const { actions = JEdit.def_actions } = this.props;
    return (<div style={{ margin: '1rem 0', display: 'flex', justifyContent: 'space-around' }}>
    {actions.map((v, j) => {
    const { extra = {} } = v;//
    return (
    <Button variant="contained" style={{ margin: '0 2rem' }} color="primary" {...extra} onClick={() => {
    this.actionChange(v);
    }} key={`form-btn-${j}`}>{v.label}</Button>
    );
    })}
    </div>);
    }

    render() {
    const { loading } = this.state;//
    if (loading)
    return (<PageLoading />);
    const { center = true } = this.props;
    return (<Grid container spacing={2}
    alignContent="center" direction="column"
    justify={center ? 'center' : 'left'} >
    {this.wrapTable()}
    {this.renderActions()}
    </Grid>);
    }
    }
    JEdit.def_actions = [
    { label: '重置', value: 0 },
    { label: '保存', value: 1, extra: { primary: true, floated: 'right' } }
    ];
    JEdit.PLAIN = "plain"; //展示值
    JEdit.IMAGE = "image"; //图片
    JEdit.FILE = "file"; //文件
    JEdit.RADIO = "radio"; //单选
    JEdit.TOGGLE = "toggle"; //toggle
    JEdit.SELECT = "select"; //单选
    JEdit.DATE_RANGE = "date_range";//日期时间段
    JEdit.DATE = "date"; //日期 09-12
    JEdit.TIME = "time"; //时间 02:34
    JEdit.TIME_RANGE = "time_range"; //时间段 09:00-12:00
    JEdit.TEXTAREA = "textarea"; //多行输入
    JEdit.NUMBER = "number"; //数字输入
    JEdit.TEXT = "text"; //文本输入
    JEdit.TAGS = "tags"; //列表多选
    JEdit.WEEK = "week"; //排列星期

    export default JEdit;
    未闻花名
  • 相关阅读:
    CDQ分治
    K-th Number POJ
    A * B Problem Plus HDU
    Prime Test POJ
    数据结构
    FFT
    mysql查询出相同数据出现的次数,统计相同值的数量
    Laravel 清空配置缓存
    php7 数据导出Excel office 2011中文乱码问题
    PHP file_put_contents函数数据导出csv文件,屏幕字符串逗号分隔符
  • 原文地址:https://www.cnblogs.com/duokexiao/p/13808527.html
Copyright © 2020-2023  润新知