| <template> | 
|   <el-form-item v-if="element && element.key" :class="{active: selectWidget && selectWidget.key === element.key, 'is_req': element.options.required,'no-margin':element.options.noMargin}" :label="element.options.noLabel?null:element.label" :label-width="element.options['label-width']!=null?element.options['label-width']+'px':null" class="widget-view" @click.native.stop="handleSelectWidget(index)"> | 
|     <template v-if="element.type === 'input'"> | 
|       <el-input v-model="element.options.defaultValue" :style="{width: element.options.width}" :placeholder="element.options.placeholder" v-bind="element.options"></el-input> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'textarea'"> | 
|       <el-input v-model="element.options.defaultValue" :style="{width: element.options.width}" :placeholder="element.options.placeholder" :rows="5" type="textarea"></el-input> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'number'"> | 
|       <el-input-number v-model="element.options.defaultValue" :disabled="element.options.disabled" :controls-position="element.options.controlsPosition" :style="{width: element.options.width}"></el-input-number> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'radio'"> | 
|       <el-radio-group v-model="element.options.defaultValue" :style="{width: element.options.width}"> | 
|         <el-radio v-for="(item, index) in element.options.options" :key="item.value + index" :style="{display: element.options.inline ? 'inline-block' : 'block'}" :label="item.value"> | 
|           {{ element.options.showLabel ? item.label : item.value }} | 
|         </el-radio> | 
|       </el-radio-group> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'checkbox'"> | 
|       <el-checkbox-group v-model="element.options.defaultValue" :style="{width: element.options.width}"> | 
|         <el-checkbox v-for="(item, index) in element.options.options" :key="item.value + index" :style="{display: element.options.inline ? 'inline-block' : 'block'}" :label="item.value"> | 
|           {{ element.options.showLabel ? item.label : item.value }} | 
|         </el-checkbox> | 
|       </el-checkbox-group> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'cascader'"> | 
|       <el-cascader :placeholder="element.options.placeholder" :options="element.options.options" :style="{width: element.options.width}" filterable change-on-select></el-cascader> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'tree'"> | 
|       <el-popover placement="bottom" title="标题" width="200" trigger="click"> | 
|         <el-input slot="reference" v-model="element.options.defaultValue" :style="{width: element.options.width}" :placeholder="element.options.placeholder" suffix-icon="el-icon-yrt-xiangxiajiantou1"></el-input> | 
|       </el-popover> | 
|     </template> | 
|   | 
|     <!-- 输入选择框 --> | 
|     <template v-if="element.type === 'input-select'"> | 
|       <input-select v-model="element.options.defaultValue" :style="{width: element.options.width}" :options="[]"> | 
|       </input-select> | 
|     </template> | 
|   | 
|     <!-- 表格选择框 --> | 
|     <template v-if="element.type === 'table-select'"> | 
|       <table-select v-model="element.options.defaultValue" :input-width="element.options.width" :options="element.options"> | 
|       </table-select> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'time'"> | 
|       <el-time-picker v-model="element.options.defaultValue" :is-range="element.options.isRange" :placeholder="element.options.placeholder" :start-placeholder="element.options.startPlaceholder" :end-placeholder="element.options.endPlaceholder" :readonly="element.options.readonly" :disabled="element.options.disabled" :editable="element.options.editable" :clearable="element.options.clearable" :arrow-control="element.options.arrowControl" :style="{width: element.options.width}"> | 
|       </el-time-picker> | 
|     </template> | 
|   | 
|     <template v-if="['date', 'datetime'].indexOf(element.type)>=0"> | 
|       <el-date-picker v-model="element.options.defaultValue" :type="element.options.type" :is-range="element.options.isRange" :placeholder="element.options.placeholder" :start-placeholder="element.options.startPlaceholder" :end-placeholder="element.options.endPlaceholder" :readonly="element.options.readonly" :disabled="element.options.disabled" :editable="element.options.editable" :clearable="element.options.clearable" :style="{width: element.options.width}"> | 
|       </el-date-picker> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'rate'"> | 
|       <el-rate v-model="element.options.defaultValue" :max="element.options.max" :disabled="element.options.disabled" :allow-half="element.options.allowHalf"></el-rate> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'color'"> | 
|       <el-color-picker v-model="element.options.defaultValue" :disabled="element.options.disabled" :show-alpha="element.options.showAlpha"></el-color-picker> | 
|     </template> | 
|   | 
|     <template v-if="element.type === 'select'"> | 
|       <el-select v-model="element.options.defaultValue" :disabled="element.options.disabled" :multiple="element.options.multiple" :clearable="element.options.clearable" :placeholder="element.options.placeholder" :style="{width: element.options.width}"> | 
|         <el-option v-for="item in element.options.options" :key="item.value" :value="item.value" :label="element.options.showLabel?item.label:item.value"></el-option> | 
|       </el-select> | 
|     </template> | 
|   | 
|     <template v-if="element.type==='switch'"> | 
|       <el-switch v-model="element.options.defaultValue" v-bind="element.options" :disabled="element.options.disabled"> | 
|       </el-switch> | 
|     </template> | 
|   | 
|     <template v-if="element.type==='slider'"> | 
|       <el-slider v-model="element.options.defaultValue" :min="element.options.min" :max="element.options.max" :disabled="element.options.disabled" :step="element.options.step" :show-input="element.options.showInput" :range="element.options.range" :style="{width: element.options.width}"></el-slider> | 
|     </template> | 
|   | 
|     <template v-if="element.type==='upload-image'"> | 
|       <el-upload :action="element.options.serverAction" :list-type="element.options.listType"> | 
|         <i v-if="element.options.listType=='picture-card'" class="el-icon-plus"></i> | 
|         <el-button v-else size="small" type="primary">点击上传</el-button> | 
|       </el-upload> | 
|     </template> | 
|   | 
|     <template v-if="element.type==='imgupload'"> | 
|       <fm-upload v-model="element.options.defaultValue" :disabled="element.options.disabled" :style="{'width': element.options.width}" :width="element.options.size.width" :height="element.options.size.height" token="xxx" domain="xxx"> | 
|       </fm-upload> | 
|     </template> | 
|   | 
|     <template v-if="element.type==='blank'"> | 
|     </template> | 
|   | 
|     <!--富文本编辑器--> | 
|     <template v-if="element.type==='tinymce-editor'"> | 
|       <tinymce :height="element.options.size.height" v-model="element.options.defaultValue" /> | 
|     </template> | 
|   | 
|     <el-button v-if="selectWidget && selectWidget.key === element.key" title="删除" class="widget-action-delete" circle plain type="danger" @click.stop="handleWidgetDelete(index)"> | 
|       <i class="el-icon-yrt-shanchu2"></i> | 
|     </el-button> | 
|     <el-button v-if="selectWidget && selectWidget.key === element.key" title="复制" class="widget-action-clone" circle plain type="primary" @click.stop="handleWidgetClone(index)"> | 
|       <i class="el-icon-yrt-fuzhi4"></i> | 
|     </el-button> | 
|   | 
|   </el-form-item> | 
| </template> | 
|   | 
| <script> | 
| import FmUpload from "./Upload"; | 
| import Tinymce from "@/components/Tinymce"; | 
| import InputSelect from "@/components/base/InputSelect"; | 
| import TableSelect from "@/components/base/TableSelect"; | 
|   | 
| export default { | 
|   components: { | 
|     FmUpload, | 
|     Tinymce, | 
|     InputSelect, | 
|     TableSelect | 
|   }, | 
|   props: { | 
|     element: { | 
|       type: Object, | 
|       default: () => { | 
|         return {}; | 
|       } | 
|     }, | 
|     select: { | 
|       type: Object, | 
|       default: () => { | 
|         return {}; | 
|       } | 
|     }, | 
|     index: { | 
|       type: Number, | 
|       default: null | 
|     }, | 
|     fields: { | 
|       type: Array, | 
|       default: () => { | 
|         return []; | 
|       } | 
|     }, | 
|     configType: { | 
|       type: String, | 
|       default: null | 
|     } | 
|   }, | 
|   data() { | 
|     return { | 
|       selectWidget: this.select | 
|     }; | 
|   }, | 
|   watch: { | 
|     select(val) { | 
|       this.selectWidget = val; | 
|     }, | 
|     selectWidget: { | 
|       handler(val) { | 
|         this.$emit("update:select", val); | 
|       }, | 
|       deep: true | 
|     } | 
|   }, | 
|   methods: { | 
|     handleSelectWidget(index) { | 
|       this.selectWidget = this.fields[index]; | 
|       this.$emit("update:configType", "WidgetConfig"); | 
|     }, | 
|     handleWidgetDelete(index) { | 
|       if (this.fields.length - 1 === index) { | 
|         if (index === 0) { | 
|           this.selectWidget = {}; | 
|         } else { | 
|           this.selectWidget = this.fields[index - 1]; | 
|         } | 
|       } else { | 
|         this.selectWidget = this.fields[index + 1]; | 
|       } | 
|   | 
|       this.$nextTick(() => { | 
|         this.fields.splice(index, 1); | 
|       }); | 
|     }, | 
|     handleWidgetClone(index) { | 
|       let cloneData = { | 
|         ...this.fields[index], | 
|         options: { ...this.fields[index].options }, | 
|         key: Date.parse(new Date()) + "_" + Math.ceil(Math.random() * 99999) | 
|       }; | 
|   | 
|       if (this.fields[index].type === "radio" || this.fields[index].type === "checkbox") { | 
|         cloneData = { | 
|           ...cloneData, | 
|           options: { | 
|             ...cloneData.options, | 
|             options: cloneData.options.options.map(item => ({ ...item })) | 
|           } | 
|         }; | 
|       } | 
|   | 
|       this.fields.splice(index, 0, cloneData); | 
|   | 
|       this.$nextTick(() => { | 
|         this.selectWidget = this.fields[index + 1]; | 
|       }); | 
|     } | 
|   } | 
| }; | 
| </script> | 
|   | 
| <style rel="stylesheet/scss" lang="scss" scoped> | 
| .widget-view { | 
|   div.el-input:not(.no-bg) { | 
|     /deep/ input.el-input__inner[readonly] { | 
|       background-color: #f5f7fa; | 
|       cursor: not-allowed; | 
|     } | 
|   } | 
| } | 
| </style> |