# crud配置项

# 最简配置

export const crudOptions = {
  columns: [ //字段配置
    {
      title: '地区',  
      key: 'province', 
      type: 'select',
      dict: {url:'/dict/getProvinceList'}
    }
  ]
}

# 配置与element-ui配置的对应关系

export const crudOptions = {
  columns: [ 
    {   //对应el-table-column的配置
        form:{
            itemProps:{} //对应 el-form-item的配置
        }
    }
  ],
  options:{}, //对应el-table的配置
  formOptions:{},  //对应 el-dialog(el-drawer)、el-form  的配置
  pagination:{} // 对应el-pagination的配置
}

# crudOptions

export const crudOptions = {
  columns: [ 
    //字段配置
    // 具体请参考下一节: 字段配置
  ],
  // 下方的配置都是可选的
  viewOptions:{
    disabled: false, // 开启view
    componentType: 'form', // 查看时使用哪种组件展示【form=使用表单组件,row=使用行展示组件】
    defaultRender:(h,scope)=>{return (<span>{scope.value}</span>)} //没有配置组件的,默认渲染render
  },
  pageOptions:{
    onInitAfter: function(){}, //初始化完成后触发,与覆盖this.initAfter()方法效果一样
    compact: false, //是否紧凑页面模式
    export: {
        local:true,//本地导出,false为服务端导出
        title:'数据导出',//导出的文件名
        type:'excel', //导出文件类型,可选: [ csv | excel ]
        formatter(row, context){
            // 数据格式化,row.xxx = parseInt(row.xxx)
        },
        // 以下是 vue-table-export 插件的参数
        // excel
        header:'',// 第一行
        merges: undefined, // 合并单元格
        // csv
        noHeader: undefined, // 不导出表头
        separator:',', // 数据分隔符	非	String		,
        quoted:false	//每项数据是否加引号
    }
  },
  formOptions: { 
    // 支持el-dialog的配置
    // 支持el-form的配置
    // 支持el-drawer的配置
    type:'dialog',//默认对话框模式,drawer 抽屉模式
    size: '50%', //抽屉模式的宽度
    fullscreen: true,//全屏按钮,传null则隐藏全屏按钮,抽屉模式请隐藏
    draggable:true, //是否支持表单对话框拖拽,抽屉模式请关闭
    saveRemind: true, //有修改时是否需要保存提醒,也可以传入一个方法,自定义确认对话框,()=> return vm.$confirm({})
    labelWidth: '100px',
    labelPosition: 'left',
    saveLoading: false,
    gutter: 20,
    maxHeight: true, // 对话框内部显示滚动条
    defaultSpan: 12, // 默认表单字段所占宽度
    updateTableDataAfterEdit: false // 添加和删除提交后,是否直接更新本地table的数据,默认会自动刷新表格,所以不需要更新本地数据
  },
  searchOptions: { //查询配置参数,
    // 支持el-form的配置参数
    form:{ //默认搜索参数
      name:'小明' // 请求列表默认会带上此处配置参数,重置后会恢复成此处配置的值
    },
    size:'small',
    show: true,//是否显示搜索工具条
    disabled: false, //是否禁用搜索工具条
    debounce:{ //自动查询防抖,debounce:false关闭自动查询
      wait: 500, //延迟500毫秒
      ... //options : https://www.lodashjs.com/docs/lodash.debounce
    },
    searchAfterReset:true,//点击重置后是否立即查询
    buttons:{
      search:{ // 配置false,隐藏按钮
        thin: false, //瘦模式,thin=true 且 text=null 可以设置方形按钮节省位置 
        text: '查看', //按钮文字, null= 取消文字,↓↓↓↓也可以传入一个方法↓↓↓↓
        //text(scope){return 'xx'}
        type: 'warning', // 按钮类型
        icon:'el-view', //按钮图标,↓↓↓↓也可以传入一个方法↓↓↓↓
         //icon(scope){return 'xx'}
        size: 'small', // 按钮大小
        circle: false,//圆形按钮 ,需要thin=true,且text=null
        show:true, // 是否显示按钮,↓↓↓↓也可以传入一个方法根据数据决定该按钮是否显示↓↓↓↓↓↓↓↓
        //show(index,row){return row.status==='xxx'} 
        disabled:false, // 是否禁用,↓↓↓↓也可以传入一个方法根据数据决定该按钮是否禁用↓↓↓↓
        //disabled(index,row){return row.status==='xxx'} 
        order: 1 //排序号,数字小,排前面
      }, 
      reset:{} //同上
    }    
  },
  options: { // d2-crud
    // 支持el-table的配置参数
    hide:false, //隐藏表格, 配合 body插槽,可以实现酒店dashboard示例的效果
    stripe: true,
    border: true,
    highlightCurrentRow: false, //是否高亮选中行
    size: 'mini',
    //要想去掉el-table自身的滚动条,内容高度撑开
    //可以配置 height:null,maxHeight:null,然后用空方法覆盖reComputeCrudHeight(){}
    height: '100%', 
    maxHeight: 'auto',
    events:{ //el-table事件监听
      'expand-change':(event)=>{}
    },
    fetchDetail(index,row,mode){return row},// 打开对话框前调用,获取form详情数据
  },
  pagination: { //翻页配置
    // 支持el-pagination
    currentPage: 1,
    pageSize: 20,
    total: 1,
    storage:true //本地保存用户每页条数修改,刷新不会丢失该修改,false=关闭
    // storage:'keysuffix'// 传入字符串,将会给保存的key增加一个后缀,用于区分同一个页面下多个crud
  },
  indexRow: { // 序号列,或者直接传true,不显示title,不居中
    title: '序号',
    align: 'center',
    width: 100
  },
  selectionRow: {  //选择列
    align: 'center',
    width: 100
  },
  expandRow: { // 展开列, 或者直接传true,不显示title,不居中
    title: '展开',
    align: 'center',
    width: 100
  },     
  rowHandle: { 
    //行操作栏,与d2-crud一致,默认配置有修改与删除
    width: 100, // 操作列宽度
    title: '操作',// 操作列名
    view:{},//查看按钮,配置请参考上方searchOptions.buttons
    edit:{}, //编辑按钮,配置同上
    remove:{}, //删除按钮,配置同上
    custom:[//自定义按钮
      {
         //配置同上
         //点击事件,需要在<d2-crud-x @custom-emit="yourHandle"/>
         emit: 'custom-emit' 
      }
    ],
    dropdown: { //配置false关闭dropdown
      // atLeast 至少几个以上按钮才收入下拉框中,配置0全部按钮收入下拉框
      // 注意show=false的按钮也会计算在内(行编辑按钮默认是隐藏的也会占一个位置,虽然它没有显示)
      atLeast: 2, 
      text: '更多' // 按钮文字
    }, 
  },
  formGroup: {  //表单分组
    type: 'collapse', // tab暂未实现
    accordion: false,
    groups: { //分组
      base: { //分组key
        title: '商品基础', //分组标题
        disabled:false, //禁止展开或收起
        // disabled(context){return true} //可以传一个方法
        show: true,//是否显示
        // show(context){return true} //可以传一个方法
        icon: 'el-icon-goods', //分组标题前的图标
        columns: ['title', 'code', 'images'] //该组内包含的字段列表
      }
    }
  },
  format: {
    response (ret) {
      return ret.data //getlist返回结果获取
    },
    page: { // page接口返回的数据结构配置,
      request: { // 请求参数
        current: 'current', //当前页码
        size: 'size' //当前每页条数
        // size(page,size){page[xxx]=size}//你还可以配置为一个方法,自定义操作请求参数
      },
      response: { //返回结果
        current: 'current', // 当前页码 ret.data.current
        size: 'size', // 每页条数,ret.data.size, 
        //size: (data) => { return data.size }, //你也可以配置一个方法,自定义返回
        total: 'total', // 总记录数 ret.data.total
        records: 'records' // 列表数组 ret.data.records
      }
    }
  },
  addTemplate: {}, //根据form配置自动生成,请不要配置
  editTemplate: {}, //根据form配置自动生成,请不要配置
  addRules: {}, //根据form配置自动生成,请不要配置
  editRules: {},//根据form配置自动生成,请不要配置
  list: [], //数据列表,跟pageRequest从后端获取数据
  loading: false //当前是否正在loading,请不要配置
}

# columns

crudOptions={
    columns:[
    {
          title: '地区',  
          key: 'province', 
          // -----下方的配置都是可选的------
          type: 'select', //字段类型,根据类型可生成该字段的默认配置,下方那么多配置基本可以不用写(没有定制化需求的话)
          sortable: true, //是否支持排序,如果传入'custom',则为服务端排序。如果传入其他字符串,则以该字符串作为排序字段名
          search: {
                disabled: false, //是否禁用该字段的查询,默认false
                component:{ //查询框组件配置,默认根据form配置生成 
                   name:'dict-select' //支持任何v-model组件
                },
                order: 10, //查询字段排序,数字越小越靠前
                // 是否启用搜索框的slot插槽,需要d2-crud-x才支持
                // 示例 http://preview.d2-crud-plus.docmirror.cn/D2CrudPlusExample/#/demo/form/slot
                slot:false 
          },
          form: { 
            //添加和编辑表单配置
            // 具体请参考下一节: form配置
          },
          addForm:{
             //添加对话框的特别配置,当添加和修改的配置有差异时,可以在此单独配置差异部分
          },
          editForm:{
             //修改对话框的特别配置,当添加和修改的配置有差异时,可以在此单独配置差异部分
          },
          view:{// 查看对话框组件的单独配置
            disabled: false,
            component:{...}
          }, 
          valueBuilder (row,key) {
            // 某些组件传入的value值可能是一个复杂对象,而row中的单个属性的值不合适传入
            // 则需要在打开编辑对话框前将row里面多个字段组合成组件需要的value对象
            // 例如:国际手机号(mobileValue为此column的key) 
            // 示例 http://preview.d2-crud-plus.docmirror.cn/D2CrudPlusExample/#/demo/form/phone
            // row.mobileValue = { phoneNumber: row.phone, callingCode: row.code, countryCode: row.country }
            // valueBuilder将会在pageRequest成功返回数据后执行
          },
          valueResolve (row,key) { 
            // 组件中传回的值也需要分解成row中多个字段的值,用于提交给后台。
            // 例如:
            // if (row.mobileValue != null) {
            //  row.phone = row.mobileValue.phoneNumber
            //  row.code = row.mobileValue.callingCode
            //  row.country = row.mobileValue.countryCode
            // } 
            // valueResolve 将会在
            //   addRequest(解析添加表单的值)
            //   updateRequest(解析编辑表单的值)
            //   pageRequest(解析查询参数)
            // 之前执行
          },
          dict: { // 数据字典配置, 供select等组件通过value匹配label
            data: [ // 本地数据字典,若data为null,则通过http请求获取远程数据字典
              { value: 'sz', label: '深圳' },
              { value: 'gz', label: '广州' }, 
              { value: 'wh', label: '武汉' }, 
              { value: 'sh', label: '上海' }
            ],
            url:'/dict/get', 
            // url(dict,{form,component}){return '/dict/newUrl'} // 如果url是一个方法,则表示是动态构建url
            cache: true, //是否启用cache,默认开启
            value:'value', // value的属性名
            label:'label', // label的属性名
            children:'children', // children的属性名
            isTree: false, //是否是树形结构
            clone: false, //是否获取到字典数据后clone一份再传递给组件
            getData: (url,dict,{form,component})=>{return Promise}, //  覆盖全局getRemoteDictData方法,返回 Promise<[dictData]>
            getNodes(values){return nodeArr}, //根据value数组,返回节点数据,用于懒加载时,行展示组件的label显示
            transfer:(data,options)=>{return data},// 可以修改获取到的远程数据,比如将字典的id字段转成字符串形式(缓存开启时只会执行一次)
            onReady:(data,dict,options)=>{ }  //每个组件都会执行一次,配置clone=true后可以随便修改字典数据,只会影响自己组件的数据
          },
          //行内单元格显示组件
          component:{  //与form.component类似,更多配置请参考下方form中的component配置
            name:'dict-select', 
            //如果是非vModel组件,则没有value属性
            //此处配置组件的参数名,将row[key]绑定给指定prop
            valueBinding:'propName', 
            props:{...},
            style:{},
            class:{},
            placeholder,
            disabled:false, //可以传入一个方法
            show:true,//是否显示单元格组件
            on:{},//事件绑定,参考下方form中的on配置
            slots:{}, //scoped插槽,参考下方form中的slots配置
            children:[] //子元素,参考下方form中的children配置
          },
          uniqueKey:'',//列的唯一id,多级表头动态更新时会导致无法刷新,可以配置它为不同的key,即可解决
          disabled: false, //是否禁止该列(列配置中不显示),不影响form表单
          show: true, //是否在列表中显示该列(列配置中可选),也可以配置一个无参方法
          // 是否启用该cell的slot插槽,需要d2-crud-x才支持
          // 见 http://preview.d2-crud-plus.docmirror.cn/D2CrudPlusExample/#/demo/form/slot
          rowSlot: false, 
          formatter (row, column, value, index) {
            // cell 格式化,http://d2-crud-plus.docmirror.cn/d2-crud-plus/d2-crud-x/columns.html#formatter
          }
        }
      
    ]
}

# form

crudOptions:{  
    columns:[
        {
            form:{
                title:'表单字段显示的名称', //默认使用column的title
                rules: [ // 表单校验规则
                    //更多帮助请参考 https://element.eleme.cn/#/zh-CN/component/form#zi-ding-yi-xiao-yan-gui-ze
                    { required: true, message: '请选择地区' }
                ],
                component: { //添加和修改时form表单的组件
                  name: 'dict-select', //表单组件名称,支持任何v-model组件
                  value: null, //组件默认值,你还可以通过覆盖doDialogOpened(context)方法,修改context.form.xx的值
                  props: { //表单组件的参数,具体参数请查看对应的组件文档
                    // 如何查找组件配置,请参考
                    // http://d2-crud-plus.docmirror.cn/d2-crud-plus/guide/component.html
                    separator:",",//dict-select的组件参数,[不同组件参数不同]
                    elProps:{ //dict-select内部封装了el-select
                      filterable: true, //可过滤选择项
                      multiple: true, //支持多选
                      clearable: true, //可清除
                    },
                    dict:{},//详细见dict配置。运行时,会将column.dict复制到此处,再由此处配置的dict覆盖
                  },
                  placeholder:'',
                  disabled: false, //是否在表单中禁用组件,可以配置为方法,动态禁用↓  ↓  ↓  ↓   
                  // disabled(context){return false}
                  readonly: false, //表单组件是否是只读,还可以配置为方法,动态只读↓  ↓  ↓  ↓   
                  // readonly(context){return false} 
                  show: true, //是否显示该字段,还可以配置为方法,动态显隐↓  ↓  ↓  ↓   
                  // show(context){return false}       
                  on:{ //除input change事件外,更多组件事件监听
                    select(event){console.log(event)} //监听表单组件的select事件
                  },
                  slots:{ //插槽渲染
                     default:(h,scope)=>{ //默认的scoped插槽
                        return (<div>{scope.data}</div>)
                     }
                  },
                  children:[ //子元素
                      (h)=>{return (<div slot="prefix">非scoped插槽</div>)}
                  ],
                  span: 12 //该字段占据多宽,24为占满一行
                },
                order:10,//排序号,默认为10,数字越小 越靠前
                //注意:↓↓↓↓ 以下三个disabled,仅初始化时有效,不可动态启用,需要动态显隐字段请配置component.show
                disabled:false, //完全关闭该字段在表单中显示
                addDisabled: false, //是否仅在添加编辑框中关闭该字段
                editDisabled: false, //是否仅在修改编辑框中关闭该字段
                /**
                   * @param value 当前选择的值
                   * @param form 当前表单
                   * @param getColumn 获取字段配置的方法,getColumn(keyName) 返回keyName的字段配置,可以动态修改组件配置
                   * @param mode 当前模式:【add、edit、search】
                   * @param component 当前组件的ref
                   * @param immediate 是否是对话框打开后立即触发的
                   * @param getComponent 获取组件Ref的方法, getComponent(keyName), 返回组件ref,可以动态调用该组件的方法
                        注意:当component未初始化或者没有显示时,是获取不到组件ref的
                **/
                valueChange(key ,value ,form, {getColumn, mode, component, immediate, getComponent }){
                    // form表单数据change事件,表单值有改动将触发此事件
                },
                valueChangeImmediate:false, //是否在打开对话框后触发一次valueChange事件
                // 是否启用form编辑框的slot插槽,需要d2-crud-x才支持
                // 示例 http://preview.d2-crud-plus.docmirror.cn/D2CrudPlusExample/#/demo/form/slot
                slot:false,
                itemProps:{
                    // el-form-item的配置
                    //  https://element.eleme.cn/#/zh-CN/component/form#form-item-attributes
                    labelWidth:'0px' //可以隐藏表单项的label
                } 
            }
        }
    ]
}