245 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="basicInfo">
 | |
|     <ai-card title="搜索字段" class="search-wrapper">
 | |
|       <template #content>
 | |
|         <el-checkbox-group v-model="queryFields">
 | |
|           <el-checkbox
 | |
|             :label="`${item.fieldDbName}~${item.fieldName}`"
 | |
|             v-for="(item, index) in tableInfos"
 | |
|             :key="index">
 | |
|             {{ item.fieldName }}
 | |
|           </el-checkbox>
 | |
|         </el-checkbox-group>
 | |
|       </template>
 | |
|     </ai-card>
 | |
|     <ai-card title="表格字段">
 | |
|       <template #content>
 | |
|         <div class="ai-table">
 | |
|           <div class="el-table el-table--border ai-header__border">
 | |
|             <el-scrollbar>
 | |
|               <table cellspacing="0" cellpadding="0" border="0" class="el-table__body">
 | |
|                 <draggable element="thead" animation="500" class="el-table__header is-leaf ai-table__header" :sort="true" v-model="showFields">
 | |
|                   <th v-for="(item, index) in showFields" style="background: #f3f4f5; text-align: center;" class="ai-table__header" :key="index">{{ item.fieldName }}</th>
 | |
|                 </draggable> 
 | |
|                 <tbody element="tbody">
 | |
|                   <tr>
 | |
|                     <td @click="handleShow(index, item.isShow)" v-for="(item, index) in showFields" :key="index">{{ item.isShow ? '已显示' : '已隐藏' }}</td>
 | |
|                   </tr>
 | |
|                 </tbody> 
 | |
|               </table>
 | |
|             </el-scrollbar>
 | |
|           </div>
 | |
|         </div>
 | |
|       </template>
 | |
|     </ai-card>
 | |
|     <ai-card title="排序和操作按钮">
 | |
|       <template #content>
 | |
|         <el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right">
 | |
|           <el-form-item label="排序字段" prop="field">
 | |
|             <el-select
 | |
|               size="small"
 | |
|               placeholder="默认按创建时间排序"
 | |
|               clearable
 | |
|               v-model="form.field">
 | |
|               <el-option
 | |
|                 v-for="(filed, index) in tableInfos"
 | |
|                 :key="index"
 | |
|                 :label="filed.fieldName"
 | |
|                 :value="`${filed.fieldDbName}~${filed.fieldName}`">
 | |
|               </el-option>
 | |
|             </el-select>
 | |
|           </el-form-item>
 | |
|           <el-form-item label="排序类型" prop="orderType" :rules="[{ required: true, message: '请输入排序类型', trigger: 'change' }]">
 | |
|             <el-radio-group v-model="form.orderType">
 | |
|               <el-radio label="asc">升序</el-radio>
 | |
|               <el-radio label="desc">降序</el-radio>
 | |
|             </el-radio-group>
 | |
|           </el-form-item>
 | |
|           <el-form-item label="按钮配置" prop="btns" style="width: 100%;" :rules="[{ required: true, message: '请输入按钮配置', trigger: 'change' }]">
 | |
|             <el-checkbox-group v-model="form.btns">
 | |
|               <el-checkbox label="insertEnable">添加</el-checkbox>
 | |
|               <el-checkbox label="importEnable">导入</el-checkbox>
 | |
|               <el-checkbox label="exportEnalbe">导出</el-checkbox>
 | |
|               <el-checkbox label="editEnable">编辑</el-checkbox>
 | |
|               <el-checkbox label="deleteEnable">删除</el-checkbox>
 | |
|               <el-checkbox label="batchDelEnable">批量删除</el-checkbox>
 | |
|             </el-checkbox-group>
 | |
|           </el-form-item>
 | |
|         </el-form>
 | |
|       </template>
 | |
|     </ai-card>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
|   import draggable from 'vuedraggable'
 | |
|   export default {
 | |
|     name: 'configForm',
 | |
| 
 | |
|     props: {
 | |
|       tableInfos: Array,
 | |
|       btns: Array,
 | |
|       showListFields: Array,
 | |
|       orderFields: Array,
 | |
|       fuzzyQueryFields: Array
 | |
|     },
 | |
| 
 | |
|     components: {
 | |
|       draggable
 | |
|     },
 | |
| 
 | |
|     data () {
 | |
|       return {
 | |
|         queryFields: [],
 | |
|         tableData: [{}],
 | |
|         btnKeys: ['insertEnable', 'importEnable', 'exportEnalbe', 'editEnable', 'deleteEnable', 'batchDelEnable'],
 | |
|         form: {
 | |
|           btns: [],
 | |
|           orderType: 'asc',
 | |
|           field: ''
 | |
|         },
 | |
|         showFields: []
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     mounted () {
 | |
|       const showIds = this.showListFields.map(v => v.fieldDbName)
 | |
|       this.showFields = JSON.parse(JSON.stringify(this.tableInfos)).map(item => {
 | |
|         item.isShow = showIds.indexOf(item.fieldDbName) > -1 ? true : false
 | |
| 
 | |
|         return item
 | |
|       })
 | |
| 
 | |
|       if (!this.showListFields.length) {
 | |
|         this.showFields.map(v => {
 | |
|           v.isShow = true
 | |
|           return v
 | |
|         })
 | |
|       }
 | |
| 
 | |
|       this.tableInfos.map(item => {
 | |
|         this.tableData[0][item.fieldDbName] = '删除'
 | |
|       })
 | |
| 
 | |
|       if (this.btns.length) {
 | |
|         this.form.btns = this.btns
 | |
|       }
 | |
| 
 | |
|       const tableInfosIds = this.tableInfos.map(v => v.fieldDbName)
 | |
| 
 | |
|       if (this.orderFields.length) {
 | |
|         let arr = this.orderFields.filter(v => {
 | |
|           return tableInfosIds.indexOf(v.fieldDbName) > -1
 | |
|         }).map(item => {
 | |
|           return `${item.fieldDbName}~${item.fieldName}`
 | |
|         })
 | |
| 
 | |
|         if (arr.length) {
 | |
|           this.form.field = arr[0]
 | |
|         }
 | |
|       }
 | |
|       if (this.fuzzyQueryFields.length) {
 | |
|         this.queryFields = this.fuzzyQueryFields.filter(v => {
 | |
|           return tableInfosIds.indexOf(v.fieldDbName) > -1
 | |
|         }).map(item => {
 | |
|           return `${item.fieldDbName}~${item.fieldName}`
 | |
|         })
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     methods: {
 | |
|       validate () {
 | |
|         let result = false
 | |
|         this.$refs.form.validate(valid => {
 | |
|           result = valid
 | |
|         })
 | |
| 
 | |
|         if (!result) {
 | |
|           return false
 | |
|         }
 | |
| 
 | |
|         const btns = {}
 | |
|         this.btnKeys.forEach(item => {
 | |
|           btns[item] = this.form.btns.indexOf(item) > -1 ? 1 : 0 
 | |
|         })
 | |
| 
 | |
|         return {
 | |
|           btns,
 | |
|           orderFields: [{
 | |
|             fieldName: this.form.field.split('~')[1],
 | |
|             fieldDbName: this.form.field.split('~')[0],
 | |
|             orderType: this.form.orderType
 | |
|           }],
 | |
|           showListFields: this.showFields.filter(v => v.isShow).map((v, index) => {
 | |
|             return {
 | |
|               fieldName: v.fieldName,
 | |
|               fieldDbName: v.fieldDbName,
 | |
|               showListIndex: index
 | |
|             }
 | |
|           }),
 | |
|           fuzzyQueryFields: this.queryFields.map(v => {
 | |
|             return {
 | |
|               fieldName: v.split('~')[1],
 | |
|               fieldDbName: v.split('~')[0]
 | |
|             }
 | |
|           })
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       handleShow (index, isShow) {
 | |
|         const total = this.showFields.map(v => v.isShow).filter(v => !!v)
 | |
|         if (total.length <= 1 && isShow) {
 | |
|           return this.$message.error('表格列数不能小于1')
 | |
|         }
 | |
| 
 | |
|         this.$set(this.showFields[index], 'isShow', !isShow)
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <style scoped lang="scss">
 | |
|   .basicInfo {
 | |
|     .search-wrapper {
 | |
|       ::v-deep .el-checkbox-group {
 | |
|         display: flex;
 | |
|         flex-wrap: wrap;
 | |
| 
 | |
|         .el-checkbox {
 | |
|           width: 16.66%;
 | |
|           margin-bottom: 10px;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .ai-table {
 | |
|     .el-table--border {
 | |
|       border: 1px solid #d0d4dc;
 | |
|       border-bottom: none;
 | |
|       border-right: none;
 | |
|     }
 | |
|     table {
 | |
|       min-width: 100%;
 | |
|     }
 | |
| 
 | |
|     th, tr {
 | |
|       min-width: 100px;
 | |
|       cursor: move;
 | |
|     }
 | |
| 
 | |
|     tr {
 | |
|       td {
 | |
|         cursor: pointer;
 | |
|         color: #26f;
 | |
|         text-align: center;
 | |
|         user-select: none;
 | |
| 
 | |
|         &:hover {
 | |
|           opacity: 0.7;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </style>
 |