Commit 69a6aa251baa8cc3f31244d048c0540f71704d1b
1 parent
2d40e4bc
Form 动态表单的清理,去除无用的代码
Showing
6 changed files
with
5 additions
and
1328 deletions
yudao-admin-ui/src/router/index.js
| @@ -157,7 +157,7 @@ export const constantRoutes = [ | @@ -157,7 +157,7 @@ export const constantRoutes = [ | ||
| 157 | children: [ | 157 | children: [ |
| 158 | { | 158 | { |
| 159 | path: 'manager/form/edit', | 159 | path: 'manager/form/edit', |
| 160 | - component: (resolve) => require(['@/views/bpm/form/build/index'], resolve), | 160 | + component: (resolve) => require(['@/views/bpm/form/formEditor'], resolve), |
| 161 | name: '流程表单-编辑', | 161 | name: '流程表单-编辑', |
| 162 | meta: { title: '流程表单-编辑' } | 162 | meta: { title: '流程表单-编辑' } |
| 163 | } | 163 | } |
yudao-admin-ui/src/views/bpm/form/build/DraggableItem.vue deleted
| 1 | -<script> | ||
| 2 | -import draggable from 'vuedraggable' | ||
| 3 | -import render from '@/utils/generator/render' | ||
| 4 | - | ||
| 5 | -const components = { | ||
| 6 | - itemBtns(h, element, index, parent) { | ||
| 7 | - const { copyItem, deleteItem } = this.$listeners | ||
| 8 | - return [ | ||
| 9 | - <span class="drawing-item-copy" title="复制" onClick={event => { | ||
| 10 | - copyItem(element, parent); event.stopPropagation() | ||
| 11 | - }}> | ||
| 12 | - <i class="el-icon-copy-document" /> | ||
| 13 | - </span>, | ||
| 14 | - <span class="drawing-item-delete" title="删除" onClick={event => { | ||
| 15 | - deleteItem(index, parent); event.stopPropagation() | ||
| 16 | - }}> | ||
| 17 | - <i class="el-icon-delete" /> | ||
| 18 | - </span> | ||
| 19 | - ] | ||
| 20 | - } | ||
| 21 | -} | ||
| 22 | -const layouts = { | ||
| 23 | - colFormItem(h, element, index, parent) { | ||
| 24 | - const { activeItem } = this.$listeners | ||
| 25 | - let className = this.activeId === element.formId ? 'drawing-item active-from-item' : 'drawing-item' | ||
| 26 | - if (this.formConf.unFocusedComponentBorder) className += ' unfocus-bordered' | ||
| 27 | - return ( | ||
| 28 | - <el-col span={element.span} class={className} | ||
| 29 | - nativeOnClick={event => { activeItem(element); event.stopPropagation() }}> | ||
| 30 | - <el-form-item label-width={element.labelWidth ? `${element.labelWidth}px` : null} | ||
| 31 | - label={element.label} required={element.required}> | ||
| 32 | - <render key={element.renderKey} conf={element} onInput={ event => { | ||
| 33 | - this.$set(element, 'defaultValue', event) | ||
| 34 | - }} /> | ||
| 35 | - </el-form-item> | ||
| 36 | - {components.itemBtns.apply(this, arguments)} | ||
| 37 | - </el-col> | ||
| 38 | - ) | ||
| 39 | - }, | ||
| 40 | - rowFormItem(h, element, index, parent) { | ||
| 41 | - const { activeItem } = this.$listeners | ||
| 42 | - const className = this.activeId === element.formId ? 'drawing-row-item active-from-item' : 'drawing-row-item' | ||
| 43 | - let child = renderChildren.apply(this, arguments) | ||
| 44 | - if (element.type === 'flex') { | ||
| 45 | - child = <el-row type={element.type} justify={element.justify} align={element.align}> | ||
| 46 | - {child} | ||
| 47 | - </el-row> | ||
| 48 | - } | ||
| 49 | - return ( | ||
| 50 | - <el-col span={element.span}> | ||
| 51 | - <el-row gutter={element.gutter} class={className} | ||
| 52 | - nativeOnClick={event => { activeItem(element); event.stopPropagation() }}> | ||
| 53 | - <span class="component-name">{element.componentName}</span> | ||
| 54 | - <draggable list={element.children} animation={340} group="componentsGroup" class="drag-wrapper"> | ||
| 55 | - {child} | ||
| 56 | - </draggable> | ||
| 57 | - {components.itemBtns.apply(this, arguments)} | ||
| 58 | - </el-row> | ||
| 59 | - </el-col> | ||
| 60 | - ) | ||
| 61 | - } | ||
| 62 | -} | ||
| 63 | - | ||
| 64 | -function renderChildren(h, element, index, parent) { | ||
| 65 | - if (!Array.isArray(element.children)) return null | ||
| 66 | - return element.children.map((el, i) => { | ||
| 67 | - const layout = layouts[el.layout] | ||
| 68 | - if (layout) { | ||
| 69 | - return layout.call(this, h, el, i, element.children) | ||
| 70 | - } | ||
| 71 | - return layoutIsNotFound() | ||
| 72 | - }) | ||
| 73 | -} | ||
| 74 | - | ||
| 75 | -function layoutIsNotFound() { | ||
| 76 | - throw new Error(`没有与${this.element.layout}匹配的layout`) | ||
| 77 | -} | ||
| 78 | - | ||
| 79 | -export default { | ||
| 80 | - components: { | ||
| 81 | - render, | ||
| 82 | - draggable | ||
| 83 | - }, | ||
| 84 | - props: [ | ||
| 85 | - 'element', | ||
| 86 | - 'index', | ||
| 87 | - 'drawingList', | ||
| 88 | - 'activeId', | ||
| 89 | - 'formConf' | ||
| 90 | - ], | ||
| 91 | - render(h) { | ||
| 92 | - const layout = layouts[this.element.layout] | ||
| 93 | - | ||
| 94 | - if (layout) { | ||
| 95 | - return layout.call(this, h, this.element, this.index, this.drawingList) | ||
| 96 | - } | ||
| 97 | - return layoutIsNotFound() | ||
| 98 | - } | ||
| 99 | -} | ||
| 100 | -</script> |
yudao-admin-ui/src/views/bpm/form/build/IconsDialog.vue deleted
| 1 | -<template> | ||
| 2 | - <div class="icon-dialog"> | ||
| 3 | - <el-dialog | ||
| 4 | - v-bind="$attrs" | ||
| 5 | - width="980px" | ||
| 6 | - :modal-append-to-body="false" | ||
| 7 | - v-on="$listeners" | ||
| 8 | - @open="onOpen" | ||
| 9 | - @close="onClose" | ||
| 10 | - > | ||
| 11 | - <div slot="title"> | ||
| 12 | - 选择图标 | ||
| 13 | - <el-input | ||
| 14 | - v-model="key" | ||
| 15 | - size="mini" | ||
| 16 | - :style="{width: '260px'}" | ||
| 17 | - placeholder="请输入图标名称" | ||
| 18 | - prefix-icon="el-icon-search" | ||
| 19 | - clearable | ||
| 20 | - /> | ||
| 21 | - </div> | ||
| 22 | - <ul class="icon-ul"> | ||
| 23 | - <li | ||
| 24 | - v-for="icon in iconList" | ||
| 25 | - :key="icon" | ||
| 26 | - :class="active===icon?'active-item':''" | ||
| 27 | - @click="onSelect(icon)" | ||
| 28 | - > | ||
| 29 | - <i :class="icon" /> | ||
| 30 | - <div>{{ icon }}</div> | ||
| 31 | - </li> | ||
| 32 | - </ul> | ||
| 33 | - </el-dialog> | ||
| 34 | - </div> | ||
| 35 | -</template> | ||
| 36 | -<script> | ||
| 37 | -import iconList from '@/utils/generator/icon.json' | ||
| 38 | - | ||
| 39 | -const originList = iconList.map(name => `el-icon-${name}`) | ||
| 40 | - | ||
| 41 | -export default { | ||
| 42 | - inheritAttrs: false, | ||
| 43 | - props: ['current'], | ||
| 44 | - data() { | ||
| 45 | - return { | ||
| 46 | - iconList: originList, | ||
| 47 | - active: null, | ||
| 48 | - key: '' | ||
| 49 | - } | ||
| 50 | - }, | ||
| 51 | - watch: { | ||
| 52 | - key(val) { | ||
| 53 | - if (val) { | ||
| 54 | - this.iconList = originList.filter(name => name.indexOf(val) > -1) | ||
| 55 | - } else { | ||
| 56 | - this.iconList = originList | ||
| 57 | - } | ||
| 58 | - } | ||
| 59 | - }, | ||
| 60 | - methods: { | ||
| 61 | - onOpen() { | ||
| 62 | - this.active = this.current | ||
| 63 | - this.key = '' | ||
| 64 | - }, | ||
| 65 | - onClose() {}, | ||
| 66 | - onSelect(icon) { | ||
| 67 | - this.active = icon | ||
| 68 | - this.$emit('select', icon) | ||
| 69 | - this.$emit('update:visible', false) | ||
| 70 | - } | ||
| 71 | - } | ||
| 72 | -} | ||
| 73 | -</script> | ||
| 74 | -<style lang="scss" scoped> | ||
| 75 | -.icon-ul { | ||
| 76 | - margin: 0; | ||
| 77 | - padding: 0; | ||
| 78 | - font-size: 0; | ||
| 79 | - li { | ||
| 80 | - list-style-type: none; | ||
| 81 | - text-align: center; | ||
| 82 | - font-size: 14px; | ||
| 83 | - display: inline-block; | ||
| 84 | - width: 16.66%; | ||
| 85 | - box-sizing: border-box; | ||
| 86 | - height: 108px; | ||
| 87 | - padding: 15px 6px 6px 6px; | ||
| 88 | - cursor: pointer; | ||
| 89 | - overflow: hidden; | ||
| 90 | - &:hover { | ||
| 91 | - background: #f2f2f2; | ||
| 92 | - } | ||
| 93 | - &.active-item{ | ||
| 94 | - background: #e1f3fb; | ||
| 95 | - color: #7a6df0 | ||
| 96 | - } | ||
| 97 | - > i { | ||
| 98 | - font-size: 30px; | ||
| 99 | - line-height: 50px; | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | -} | ||
| 103 | -.icon-dialog { | ||
| 104 | - ::v-deep .el-dialog { | ||
| 105 | - border-radius: 8px; | ||
| 106 | - margin-bottom: 0; | ||
| 107 | - margin-top: 4vh !important; | ||
| 108 | - display: flex; | ||
| 109 | - flex-direction: column; | ||
| 110 | - max-height: 92vh; | ||
| 111 | - overflow: hidden; | ||
| 112 | - box-sizing: border-box; | ||
| 113 | - .el-dialog__header { | ||
| 114 | - padding-top: 14px; | ||
| 115 | - } | ||
| 116 | - .el-dialog__body { | ||
| 117 | - margin: 0 20px 20px 20px; | ||
| 118 | - padding: 0; | ||
| 119 | - overflow: auto; | ||
| 120 | - } | ||
| 121 | - } | ||
| 122 | -} | ||
| 123 | -</style> |
yudao-admin-ui/src/views/bpm/form/build/RightPanel.vue deleted
| 1 | -<template> | ||
| 2 | - <div class="right-board"> | ||
| 3 | - <el-tabs v-model="currentTab" class="center-tabs"> | ||
| 4 | - <el-tab-pane label="组件属性" name="field" /> | ||
| 5 | - <el-tab-pane label="表单属性" name="form" /> | ||
| 6 | - </el-tabs> | ||
| 7 | - <div class="field-box"> | ||
| 8 | -<!-- <a class="document-link" target="_blank" :href="documentLink" title="查看组件文档">--> | ||
| 9 | -<!-- <i class="el-icon-link" />--> | ||
| 10 | -<!-- </a>--> | ||
| 11 | - <el-scrollbar class="right-scrollbar"> | ||
| 12 | - <!-- 组件属性 --> | ||
| 13 | - <el-form v-show="currentTab==='field' && showField" size="small" label-width="90px"> | ||
| 14 | - <el-form-item v-if="activeData.changeTag" label="组件类型"> | ||
| 15 | - <el-select | ||
| 16 | - v-model="activeData.tagIcon" | ||
| 17 | - placeholder="请选择组件类型" | ||
| 18 | - :style="{width: '100%'}" | ||
| 19 | - @change="tagChange" | ||
| 20 | - > | ||
| 21 | - <el-option-group v-for="group in tagList" :key="group.label" :label="group.label"> | ||
| 22 | - <el-option | ||
| 23 | - v-for="item in group.options" | ||
| 24 | - :key="item.label" | ||
| 25 | - :label="item.label" | ||
| 26 | - :value="item.tagIcon" | ||
| 27 | - > | ||
| 28 | - <svg-icon class="node-icon" :icon-class="item.tagIcon" /> | ||
| 29 | - <span> {{ item.label }}</span> | ||
| 30 | - </el-option> | ||
| 31 | - </el-option-group> | ||
| 32 | - </el-select> | ||
| 33 | - </el-form-item> | ||
| 34 | - <el-form-item v-if="activeData.vModel!==undefined" label="字段名"> | ||
| 35 | - <el-input v-model="activeData.vModel" placeholder="请输入字段名(v-model)" /> | ||
| 36 | - </el-form-item> | ||
| 37 | - <el-form-item v-if="activeData.componentName!==undefined" label="组件名"> | ||
| 38 | - {{ activeData.componentName }} | ||
| 39 | - </el-form-item> | ||
| 40 | - <el-form-item v-if="activeData.label!==undefined" label="标题"> | ||
| 41 | - <el-input v-model="activeData.label" placeholder="请输入标题" /> | ||
| 42 | - </el-form-item> | ||
| 43 | - <el-form-item v-if="activeData.placeholder!==undefined" label="占位提示"> | ||
| 44 | - <el-input v-model="activeData.placeholder" placeholder="请输入占位提示" /> | ||
| 45 | - </el-form-item> | ||
| 46 | - <el-form-item v-if="activeData['start-placeholder']!==undefined" label="开始占位"> | ||
| 47 | - <el-input v-model="activeData['start-placeholder']" placeholder="请输入占位提示" /> | ||
| 48 | - </el-form-item> | ||
| 49 | - <el-form-item v-if="activeData['end-placeholder']!==undefined" label="结束占位"> | ||
| 50 | - <el-input v-model="activeData['end-placeholder']" placeholder="请输入占位提示" /> | ||
| 51 | - </el-form-item> | ||
| 52 | - <el-form-item v-if="activeData.span!==undefined" label="表单栅格"> | ||
| 53 | - <el-slider v-model="activeData.span" :max="24" :min="1" :marks="{12:''}" @change="spanChange" /> | ||
| 54 | - </el-form-item> | ||
| 55 | - <el-form-item v-if="activeData.layout==='rowFormItem'" label="栅格间隔"> | ||
| 56 | - <el-input-number v-model="activeData.gutter" :min="0" placeholder="栅格间隔" /> | ||
| 57 | - </el-form-item> | ||
| 58 | - <el-form-item v-if="activeData.layout==='rowFormItem'" label="布局模式"> | ||
| 59 | - <el-radio-group v-model="activeData.type"> | ||
| 60 | - <el-radio-button label="default" /> | ||
| 61 | - <el-radio-button label="flex" /> | ||
| 62 | - </el-radio-group> | ||
| 63 | - </el-form-item> | ||
| 64 | - <el-form-item v-if="activeData.justify!==undefined&&activeData.type==='flex'" label="水平排列"> | ||
| 65 | - <el-select v-model="activeData.justify" placeholder="请选择水平排列" :style="{width: '100%'}"> | ||
| 66 | - <el-option | ||
| 67 | - v-for="(item, index) in justifyOptions" | ||
| 68 | - :key="index" | ||
| 69 | - :label="item.label" | ||
| 70 | - :value="item.value" | ||
| 71 | - /> | ||
| 72 | - </el-select> | ||
| 73 | - </el-form-item> | ||
| 74 | - <el-form-item v-if="activeData.align!==undefined&&activeData.type==='flex'" label="垂直排列"> | ||
| 75 | - <el-radio-group v-model="activeData.align"> | ||
| 76 | - <el-radio-button label="top" /> | ||
| 77 | - <el-radio-button label="middle" /> | ||
| 78 | - <el-radio-button label="bottom" /> | ||
| 79 | - </el-radio-group> | ||
| 80 | - </el-form-item> | ||
| 81 | - <el-form-item v-if="activeData.labelWidth!==undefined" label="标签宽度"> | ||
| 82 | - <el-input v-model.number="activeData.labelWidth" type="number" placeholder="请输入标签宽度" /> | ||
| 83 | - </el-form-item> | ||
| 84 | - <el-form-item v-if="activeData.style&&activeData.style.width!==undefined" label="组件宽度"> | ||
| 85 | - <el-input v-model="activeData.style.width" placeholder="请输入组件宽度" clearable /> | ||
| 86 | - </el-form-item> | ||
| 87 | - <el-form-item v-if="activeData.vModel!==undefined" label="默认值"> | ||
| 88 | - <el-input | ||
| 89 | - :value="setDefaultValue(activeData.defaultValue)" | ||
| 90 | - placeholder="请输入默认值" | ||
| 91 | - @input="onDefaultValueInput" | ||
| 92 | - /> | ||
| 93 | - </el-form-item> | ||
| 94 | - <el-form-item v-if="activeData.tag==='el-checkbox-group'" label="至少应选"> | ||
| 95 | - <el-input-number | ||
| 96 | - :value="activeData.min" | ||
| 97 | - :min="0" | ||
| 98 | - placeholder="至少应选" | ||
| 99 | - @input="$set(activeData, 'min', $event?$event:undefined)" | ||
| 100 | - /> | ||
| 101 | - </el-form-item> | ||
| 102 | - <el-form-item v-if="activeData.tag==='el-checkbox-group'" label="最多可选"> | ||
| 103 | - <el-input-number | ||
| 104 | - :value="activeData.max" | ||
| 105 | - :min="0" | ||
| 106 | - placeholder="最多可选" | ||
| 107 | - @input="$set(activeData, 'max', $event?$event:undefined)" | ||
| 108 | - /> | ||
| 109 | - </el-form-item> | ||
| 110 | - <el-form-item v-if="activeData.prepend!==undefined" label="前缀"> | ||
| 111 | - <el-input v-model="activeData.prepend" placeholder="请输入前缀" /> | ||
| 112 | - </el-form-item> | ||
| 113 | - <el-form-item v-if="activeData.append!==undefined" label="后缀"> | ||
| 114 | - <el-input v-model="activeData.append" placeholder="请输入后缀" /> | ||
| 115 | - </el-form-item> | ||
| 116 | - <el-form-item v-if="activeData['prefix-icon']!==undefined" label="前图标"> | ||
| 117 | - <el-input v-model="activeData['prefix-icon']" placeholder="请输入前图标名称"> | ||
| 118 | - <el-button slot="append" icon="el-icon-thumb" @click="openIconsDialog('prefix-icon')"> | ||
| 119 | - 选择 | ||
| 120 | - </el-button> | ||
| 121 | - </el-input> | ||
| 122 | - </el-form-item> | ||
| 123 | - <el-form-item v-if="activeData['suffix-icon'] !== undefined" label="后图标"> | ||
| 124 | - <el-input v-model="activeData['suffix-icon']" placeholder="请输入后图标名称"> | ||
| 125 | - <el-button slot="append" icon="el-icon-thumb" @click="openIconsDialog('suffix-icon')"> | ||
| 126 | - 选择 | ||
| 127 | - </el-button> | ||
| 128 | - </el-input> | ||
| 129 | - </el-form-item> | ||
| 130 | - <el-form-item v-if="activeData.tag === 'el-cascader'" label="选项分隔符"> | ||
| 131 | - <el-input v-model="activeData.separator" placeholder="请输入选项分隔符" /> | ||
| 132 | - </el-form-item> | ||
| 133 | - <el-form-item v-if="activeData.autosize !== undefined" label="最小行数"> | ||
| 134 | - <el-input-number v-model="activeData.autosize.minRows" :min="1" placeholder="最小行数" /> | ||
| 135 | - </el-form-item> | ||
| 136 | - <el-form-item v-if="activeData.autosize !== undefined" label="最大行数"> | ||
| 137 | - <el-input-number v-model="activeData.autosize.maxRows" :min="1" placeholder="最大行数" /> | ||
| 138 | - </el-form-item> | ||
| 139 | - <el-form-item v-if="activeData.min !== undefined" label="最小值"> | ||
| 140 | - <el-input-number v-model="activeData.min" placeholder="最小值" /> | ||
| 141 | - </el-form-item> | ||
| 142 | - <el-form-item v-if="activeData.max !== undefined" label="最大值"> | ||
| 143 | - <el-input-number v-model="activeData.max" placeholder="最大值" /> | ||
| 144 | - </el-form-item> | ||
| 145 | - <el-form-item v-if="activeData.step !== undefined" label="步长"> | ||
| 146 | - <el-input-number v-model="activeData.step" placeholder="步数" /> | ||
| 147 | - </el-form-item> | ||
| 148 | - <el-form-item v-if="activeData.tag === 'el-input-number'" label="精度"> | ||
| 149 | - <el-input-number v-model="activeData.precision" :min="0" placeholder="精度" /> | ||
| 150 | - </el-form-item> | ||
| 151 | - <el-form-item v-if="activeData.tag === 'el-input-number'" label="按钮位置"> | ||
| 152 | - <el-radio-group v-model="activeData['controls-position']"> | ||
| 153 | - <el-radio-button label=""> | ||
| 154 | - 默认 | ||
| 155 | - </el-radio-button> | ||
| 156 | - <el-radio-button label="right"> | ||
| 157 | - 右侧 | ||
| 158 | - </el-radio-button> | ||
| 159 | - </el-radio-group> | ||
| 160 | - </el-form-item> | ||
| 161 | - <el-form-item v-if="activeData.maxlength !== undefined" label="最多输入"> | ||
| 162 | - <el-input v-model="activeData.maxlength" placeholder="请输入字符长度"> | ||
| 163 | - <template slot="append"> | ||
| 164 | - 个字符 | ||
| 165 | - </template> | ||
| 166 | - </el-input> | ||
| 167 | - </el-form-item> | ||
| 168 | - <el-form-item v-if="activeData['active-text'] !== undefined" label="开启提示"> | ||
| 169 | - <el-input v-model="activeData['active-text']" placeholder="请输入开启提示" /> | ||
| 170 | - </el-form-item> | ||
| 171 | - <el-form-item v-if="activeData['inactive-text'] !== undefined" label="关闭提示"> | ||
| 172 | - <el-input v-model="activeData['inactive-text']" placeholder="请输入关闭提示" /> | ||
| 173 | - </el-form-item> | ||
| 174 | - <el-form-item v-if="activeData['active-value'] !== undefined" label="开启值"> | ||
| 175 | - <el-input | ||
| 176 | - :value="setDefaultValue(activeData['active-value'])" | ||
| 177 | - placeholder="请输入开启值" | ||
| 178 | - @input="onSwitchValueInput($event, 'active-value')" | ||
| 179 | - /> | ||
| 180 | - </el-form-item> | ||
| 181 | - <el-form-item v-if="activeData['inactive-value'] !== undefined" label="关闭值"> | ||
| 182 | - <el-input | ||
| 183 | - :value="setDefaultValue(activeData['inactive-value'])" | ||
| 184 | - placeholder="请输入关闭值" | ||
| 185 | - @input="onSwitchValueInput($event, 'inactive-value')" | ||
| 186 | - /> | ||
| 187 | - </el-form-item> | ||
| 188 | - <el-form-item | ||
| 189 | - v-if="activeData.type !== undefined && 'el-date-picker' === activeData.tag" | ||
| 190 | - label="时间类型" | ||
| 191 | - > | ||
| 192 | - <el-select | ||
| 193 | - v-model="activeData.type" | ||
| 194 | - placeholder="请选择时间类型" | ||
| 195 | - :style="{ width: '100%' }" | ||
| 196 | - @change="dateTypeChange" | ||
| 197 | - > | ||
| 198 | - <el-option | ||
| 199 | - v-for="(item, index) in dateOptions" | ||
| 200 | - :key="index" | ||
| 201 | - :label="item.label" | ||
| 202 | - :value="item.value" | ||
| 203 | - /> | ||
| 204 | - </el-select> | ||
| 205 | - </el-form-item> | ||
| 206 | - <el-form-item v-if="activeData.name !== undefined" label="文件字段名"> | ||
| 207 | - <el-input v-model="activeData.name" placeholder="请输入上传文件字段名" /> | ||
| 208 | - </el-form-item> | ||
| 209 | - <el-form-item v-if="activeData.accept !== undefined" label="文件类型"> | ||
| 210 | - <el-select | ||
| 211 | - v-model="activeData.accept" | ||
| 212 | - placeholder="请选择文件类型" | ||
| 213 | - :style="{ width: '100%' }" | ||
| 214 | - clearable | ||
| 215 | - > | ||
| 216 | - <el-option label="图片" value="image/*" /> | ||
| 217 | - <el-option label="视频" value="video/*" /> | ||
| 218 | - <el-option label="音频" value="audio/*" /> | ||
| 219 | - <el-option label="excel" value=".xls,.xlsx" /> | ||
| 220 | - <el-option label="word" value=".doc,.docx" /> | ||
| 221 | - <el-option label="pdf" value=".pdf" /> | ||
| 222 | - <el-option label="txt" value=".txt" /> | ||
| 223 | - </el-select> | ||
| 224 | - </el-form-item> | ||
| 225 | - <el-form-item v-if="activeData.fileSize !== undefined" label="文件大小"> | ||
| 226 | - <el-input v-model.number="activeData.fileSize" placeholder="请输入文件大小"> | ||
| 227 | - <el-select slot="append" v-model="activeData.sizeUnit" :style="{ width: '66px' }"> | ||
| 228 | - <el-option label="KB" value="KB" /> | ||
| 229 | - <el-option label="MB" value="MB" /> | ||
| 230 | - <el-option label="GB" value="GB" /> | ||
| 231 | - </el-select> | ||
| 232 | - </el-input> | ||
| 233 | - </el-form-item> | ||
| 234 | - <el-form-item v-if="activeData.action !== undefined" label="上传地址"> | ||
| 235 | - <el-input v-model="activeData.action" placeholder="请输入上传地址" clearable /> | ||
| 236 | - </el-form-item> | ||
| 237 | - <el-form-item v-if="activeData['list-type'] !== undefined" label="列表类型"> | ||
| 238 | - <el-radio-group v-model="activeData['list-type']" size="small"> | ||
| 239 | - <el-radio-button label="text"> | ||
| 240 | - text | ||
| 241 | - </el-radio-button> | ||
| 242 | - <el-radio-button label="picture"> | ||
| 243 | - picture | ||
| 244 | - </el-radio-button> | ||
| 245 | - <el-radio-button label="picture-card"> | ||
| 246 | - picture-card | ||
| 247 | - </el-radio-button> | ||
| 248 | - </el-radio-group> | ||
| 249 | - </el-form-item> | ||
| 250 | - <el-form-item | ||
| 251 | - v-if="activeData.buttonText !== undefined" | ||
| 252 | - v-show="'picture-card' !== activeData['list-type']" | ||
| 253 | - label="按钮文字" | ||
| 254 | - > | ||
| 255 | - <el-input v-model="activeData.buttonText" placeholder="请输入按钮文字" /> | ||
| 256 | - </el-form-item> | ||
| 257 | - <el-form-item v-if="activeData['range-separator'] !== undefined" label="分隔符"> | ||
| 258 | - <el-input v-model="activeData['range-separator']" placeholder="请输入分隔符" /> | ||
| 259 | - </el-form-item> | ||
| 260 | - <el-form-item v-if="activeData['picker-options'] !== undefined" label="时间段"> | ||
| 261 | - <el-input | ||
| 262 | - v-model="activeData['picker-options'].selectableRange" | ||
| 263 | - placeholder="请输入时间段" | ||
| 264 | - /> | ||
| 265 | - </el-form-item> | ||
| 266 | - <el-form-item v-if="activeData.format !== undefined" label="时间格式"> | ||
| 267 | - <el-input | ||
| 268 | - :value="activeData.format" | ||
| 269 | - placeholder="请输入时间格式" | ||
| 270 | - @input="setTimeValue($event)" | ||
| 271 | - /> | ||
| 272 | - </el-form-item> | ||
| 273 | - <template v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.tag) > -1"> | ||
| 274 | - <el-divider>选项</el-divider> | ||
| 275 | - <draggable | ||
| 276 | - :list="activeData.options" | ||
| 277 | - :animation="340" | ||
| 278 | - group="selectItem" | ||
| 279 | - handle=".option-drag" | ||
| 280 | - > | ||
| 281 | - <div v-for="(item, index) in activeData.options" :key="index" class="select-item"> | ||
| 282 | - <div class="select-line-icon option-drag"> | ||
| 283 | - <i class="el-icon-s-operation" /> | ||
| 284 | - </div> | ||
| 285 | - <el-input v-model="item.label" placeholder="选项名" size="small" /> | ||
| 286 | - <el-input | ||
| 287 | - placeholder="选项值" | ||
| 288 | - size="small" | ||
| 289 | - :value="item.value" | ||
| 290 | - @input="setOptionValue(item, $event)" | ||
| 291 | - /> | ||
| 292 | - <div class="close-btn select-line-icon" @click="activeData.options.splice(index, 1)"> | ||
| 293 | - <i class="el-icon-remove-outline" /> | ||
| 294 | - </div> | ||
| 295 | - </div> | ||
| 296 | - </draggable> | ||
| 297 | - <div style="margin-left: 20px;"> | ||
| 298 | - <el-button | ||
| 299 | - style="padding-bottom: 0" | ||
| 300 | - icon="el-icon-circle-plus-outline" | ||
| 301 | - type="text" | ||
| 302 | - @click="addSelectItem" | ||
| 303 | - > | ||
| 304 | - 添加选项 | ||
| 305 | - </el-button> | ||
| 306 | - </div> | ||
| 307 | - <el-divider /> | ||
| 308 | - </template> | ||
| 309 | - | ||
| 310 | - <template v-if="['el-cascader'].indexOf(activeData.tag) > -1"> | ||
| 311 | - <el-divider>选项</el-divider> | ||
| 312 | - <el-form-item label="数据类型"> | ||
| 313 | - <el-radio-group v-model="activeData.dataType" size="small"> | ||
| 314 | - <el-radio-button label="dynamic"> | ||
| 315 | - 动态数据 | ||
| 316 | - </el-radio-button> | ||
| 317 | - <el-radio-button label="static"> | ||
| 318 | - 静态数据 | ||
| 319 | - </el-radio-button> | ||
| 320 | - </el-radio-group> | ||
| 321 | - </el-form-item> | ||
| 322 | - | ||
| 323 | - <template v-if="activeData.dataType === 'dynamic'"> | ||
| 324 | - <el-form-item label="标签键名"> | ||
| 325 | - <el-input v-model="activeData.labelKey" placeholder="请输入标签键名" /> | ||
| 326 | - </el-form-item> | ||
| 327 | - <el-form-item label="值键名"> | ||
| 328 | - <el-input v-model="activeData.valueKey" placeholder="请输入值键名" /> | ||
| 329 | - </el-form-item> | ||
| 330 | - <el-form-item label="子级键名"> | ||
| 331 | - <el-input v-model="activeData.childrenKey" placeholder="请输入子级键名" /> | ||
| 332 | - </el-form-item> | ||
| 333 | - </template> | ||
| 334 | - | ||
| 335 | - <el-tree | ||
| 336 | - v-if="activeData.dataType === 'static'" | ||
| 337 | - draggable | ||
| 338 | - :data="activeData.options" | ||
| 339 | - node-key="id" | ||
| 340 | - :expand-on-click-node="false" | ||
| 341 | - :render-content="renderContent" | ||
| 342 | - /> | ||
| 343 | - <div v-if="activeData.dataType === 'static'" style="margin-left: 20px"> | ||
| 344 | - <el-button | ||
| 345 | - style="padding-bottom: 0" | ||
| 346 | - icon="el-icon-circle-plus-outline" | ||
| 347 | - type="text" | ||
| 348 | - @click="addTreeItem" | ||
| 349 | - > | ||
| 350 | - 添加父级 | ||
| 351 | - </el-button> | ||
| 352 | - </div> | ||
| 353 | - <el-divider /> | ||
| 354 | - </template> | ||
| 355 | - | ||
| 356 | - <el-form-item v-if="activeData.optionType !== undefined" label="选项样式"> | ||
| 357 | - <el-radio-group v-model="activeData.optionType"> | ||
| 358 | - <el-radio-button label="default"> | ||
| 359 | - 默认 | ||
| 360 | - </el-radio-button> | ||
| 361 | - <el-radio-button label="button"> | ||
| 362 | - 按钮 | ||
| 363 | - </el-radio-button> | ||
| 364 | - </el-radio-group> | ||
| 365 | - </el-form-item> | ||
| 366 | - <el-form-item v-if="activeData['active-color'] !== undefined" label="开启颜色"> | ||
| 367 | - <el-color-picker v-model="activeData['active-color']" /> | ||
| 368 | - </el-form-item> | ||
| 369 | - <el-form-item v-if="activeData['inactive-color'] !== undefined" label="关闭颜色"> | ||
| 370 | - <el-color-picker v-model="activeData['inactive-color']" /> | ||
| 371 | - </el-form-item> | ||
| 372 | - | ||
| 373 | - <el-form-item v-if="activeData['allow-half'] !== undefined" label="允许半选"> | ||
| 374 | - <el-switch v-model="activeData['allow-half']" /> | ||
| 375 | - </el-form-item> | ||
| 376 | - <el-form-item v-if="activeData['show-text'] !== undefined" label="辅助文字"> | ||
| 377 | - <el-switch v-model="activeData['show-text']" @change="rateTextChange" /> | ||
| 378 | - </el-form-item> | ||
| 379 | - <el-form-item v-if="activeData['show-score'] !== undefined" label="显示分数"> | ||
| 380 | - <el-switch v-model="activeData['show-score']" @change="rateScoreChange" /> | ||
| 381 | - </el-form-item> | ||
| 382 | - <el-form-item v-if="activeData['show-stops'] !== undefined" label="显示间断点"> | ||
| 383 | - <el-switch v-model="activeData['show-stops']" /> | ||
| 384 | - </el-form-item> | ||
| 385 | - <el-form-item v-if="activeData.range !== undefined" label="范围选择"> | ||
| 386 | - <el-switch v-model="activeData.range" @change="rangeChange" /> | ||
| 387 | - </el-form-item> | ||
| 388 | - <el-form-item | ||
| 389 | - v-if="activeData.border !== undefined && activeData.optionType === 'default'" | ||
| 390 | - label="是否带边框" | ||
| 391 | - > | ||
| 392 | - <el-switch v-model="activeData.border" /> | ||
| 393 | - </el-form-item> | ||
| 394 | - <el-form-item v-if="activeData.tag === 'el-color-picker'" label="颜色格式"> | ||
| 395 | - <el-select | ||
| 396 | - v-model="activeData['color-format']" | ||
| 397 | - placeholder="请选择颜色格式" | ||
| 398 | - :style="{ width: '100%' }" | ||
| 399 | - @change="colorFormatChange" | ||
| 400 | - > | ||
| 401 | - <el-option | ||
| 402 | - v-for="(item, index) in colorFormatOptions" | ||
| 403 | - :key="index" | ||
| 404 | - :label="item.label" | ||
| 405 | - :value="item.value" | ||
| 406 | - /> | ||
| 407 | - </el-select> | ||
| 408 | - </el-form-item> | ||
| 409 | - <el-form-item | ||
| 410 | - v-if="activeData.size !== undefined && | ||
| 411 | - (activeData.optionType === 'button' || | ||
| 412 | - activeData.border || | ||
| 413 | - activeData.tag === 'el-color-picker')" | ||
| 414 | - label="选项尺寸" | ||
| 415 | - > | ||
| 416 | - <el-radio-group v-model="activeData.size"> | ||
| 417 | - <el-radio-button label="medium"> | ||
| 418 | - 中等 | ||
| 419 | - </el-radio-button> | ||
| 420 | - <el-radio-button label="small"> | ||
| 421 | - 较小 | ||
| 422 | - </el-radio-button> | ||
| 423 | - <el-radio-button label="mini"> | ||
| 424 | - 迷你 | ||
| 425 | - </el-radio-button> | ||
| 426 | - </el-radio-group> | ||
| 427 | - </el-form-item> | ||
| 428 | - <el-form-item v-if="activeData['show-word-limit'] !== undefined" label="输入统计"> | ||
| 429 | - <el-switch v-model="activeData['show-word-limit']" /> | ||
| 430 | - </el-form-item> | ||
| 431 | - <el-form-item v-if="activeData.tag === 'el-input-number'" label="严格步数"> | ||
| 432 | - <el-switch v-model="activeData['step-strictly']" /> | ||
| 433 | - </el-form-item> | ||
| 434 | - <el-form-item v-if="activeData.tag === 'el-cascader'" label="是否多选"> | ||
| 435 | - <el-switch v-model="activeData.props.props.multiple" /> | ||
| 436 | - </el-form-item> | ||
| 437 | - <el-form-item v-if="activeData.tag === 'el-cascader'" label="展示全路径"> | ||
| 438 | - <el-switch v-model="activeData['show-all-levels']" /> | ||
| 439 | - </el-form-item> | ||
| 440 | - <el-form-item v-if="activeData.tag === 'el-cascader'" label="可否筛选"> | ||
| 441 | - <el-switch v-model="activeData.filterable" /> | ||
| 442 | - </el-form-item> | ||
| 443 | - <el-form-item v-if="activeData.clearable !== undefined" label="能否清空"> | ||
| 444 | - <el-switch v-model="activeData.clearable" /> | ||
| 445 | - </el-form-item> | ||
| 446 | - <el-form-item v-if="activeData.showTip !== undefined" label="显示提示"> | ||
| 447 | - <el-switch v-model="activeData.showTip" /> | ||
| 448 | - </el-form-item> | ||
| 449 | - <el-form-item v-if="activeData.multiple !== undefined" label="多选文件"> | ||
| 450 | - <el-switch v-model="activeData.multiple" /> | ||
| 451 | - </el-form-item> | ||
| 452 | - <el-form-item v-if="activeData['auto-upload'] !== undefined" label="自动上传"> | ||
| 453 | - <el-switch v-model="activeData['auto-upload']" /> | ||
| 454 | - </el-form-item> | ||
| 455 | - <el-form-item v-if="activeData.readonly !== undefined" label="是否只读"> | ||
| 456 | - <el-switch v-model="activeData.readonly" /> | ||
| 457 | - </el-form-item> | ||
| 458 | - <el-form-item v-if="activeData.disabled !== undefined" label="是否禁用"> | ||
| 459 | - <el-switch v-model="activeData.disabled" /> | ||
| 460 | - </el-form-item> | ||
| 461 | - <el-form-item v-if="activeData.tag === 'el-select'" label="是否可搜索"> | ||
| 462 | - <el-switch v-model="activeData.filterable" /> | ||
| 463 | - </el-form-item> | ||
| 464 | - <el-form-item v-if="activeData.tag === 'el-select'" label="是否多选"> | ||
| 465 | - <el-switch v-model="activeData.multiple" @change="multipleChange" /> | ||
| 466 | - </el-form-item> | ||
| 467 | - <el-form-item v-if="activeData.required !== undefined" label="是否必填"> | ||
| 468 | - <el-switch v-model="activeData.required" /> | ||
| 469 | - </el-form-item> | ||
| 470 | - | ||
| 471 | - <template v-if="activeData.layoutTree"> | ||
| 472 | - <el-divider>布局结构树</el-divider> | ||
| 473 | - <el-tree | ||
| 474 | - :data="[activeData]" | ||
| 475 | - :props="layoutTreeProps" | ||
| 476 | - node-key="renderKey" | ||
| 477 | - default-expand-all | ||
| 478 | - draggable | ||
| 479 | - > | ||
| 480 | - <span slot-scope="{ node, data }"> | ||
| 481 | - <span class="node-label"> | ||
| 482 | - <svg-icon class="node-icon" :icon-class="data.tagIcon" /> | ||
| 483 | - {{ node.label }} | ||
| 484 | - </span> | ||
| 485 | - </span> | ||
| 486 | - </el-tree> | ||
| 487 | - </template> | ||
| 488 | - | ||
| 489 | - <template v-if="activeData.layout === 'colFormItem'"> | ||
| 490 | - <el-divider>正则校验</el-divider> | ||
| 491 | - <div | ||
| 492 | - v-for="(item, index) in activeData.regList" | ||
| 493 | - :key="index" | ||
| 494 | - class="reg-item" | ||
| 495 | - > | ||
| 496 | - <span class="close-btn" @click="activeData.regList.splice(index, 1)"> | ||
| 497 | - <i class="el-icon-close" /> | ||
| 498 | - </span> | ||
| 499 | - <el-form-item label="表达式"> | ||
| 500 | - <el-input v-model="item.pattern" placeholder="请输入正则" /> | ||
| 501 | - </el-form-item> | ||
| 502 | - <el-form-item label="错误提示" style="margin-bottom:0"> | ||
| 503 | - <el-input v-model="item.message" placeholder="请输入错误提示" /> | ||
| 504 | - </el-form-item> | ||
| 505 | - </div> | ||
| 506 | - <div style="margin-left: 20px"> | ||
| 507 | - <el-button icon="el-icon-circle-plus-outline" type="text" @click="addReg"> | ||
| 508 | - 添加规则 | ||
| 509 | - </el-button> | ||
| 510 | - </div> | ||
| 511 | - </template> | ||
| 512 | - </el-form> | ||
| 513 | - <!-- 表单属性 --> | ||
| 514 | - <el-form v-show="currentTab === 'form'" size="small" label-width="90px"> | ||
| 515 | - <el-form-item label="表单名"> | ||
| 516 | - <el-input v-model="formConf.formRef" placeholder="请输入表单名(ref)" /> | ||
| 517 | - </el-form-item> | ||
| 518 | - <el-form-item label="表单模型"> | ||
| 519 | - <el-input v-model="formConf.formModel" placeholder="请输入数据模型" /> | ||
| 520 | - </el-form-item> | ||
| 521 | - <el-form-item label="校验模型"> | ||
| 522 | - <el-input v-model="formConf.formRules" placeholder="请输入校验模型" /> | ||
| 523 | - </el-form-item> | ||
| 524 | - <el-form-item label="表单尺寸"> | ||
| 525 | - <el-radio-group v-model="formConf.size"> | ||
| 526 | - <el-radio-button label="medium"> | ||
| 527 | - 中等 | ||
| 528 | - </el-radio-button> | ||
| 529 | - <el-radio-button label="small"> | ||
| 530 | - 较小 | ||
| 531 | - </el-radio-button> | ||
| 532 | - <el-radio-button label="mini"> | ||
| 533 | - 迷你 | ||
| 534 | - </el-radio-button> | ||
| 535 | - </el-radio-group> | ||
| 536 | - </el-form-item> | ||
| 537 | - <el-form-item label="标签对齐"> | ||
| 538 | - <el-radio-group v-model="formConf.labelPosition"> | ||
| 539 | - <el-radio-button label="left"> | ||
| 540 | - 左对齐 | ||
| 541 | - </el-radio-button> | ||
| 542 | - <el-radio-button label="right"> | ||
| 543 | - 右对齐 | ||
| 544 | - </el-radio-button> | ||
| 545 | - <el-radio-button label="top"> | ||
| 546 | - 顶部对齐 | ||
| 547 | - </el-radio-button> | ||
| 548 | - </el-radio-group> | ||
| 549 | - </el-form-item> | ||
| 550 | - <el-form-item label="标签宽度"> | ||
| 551 | - <el-input-number v-model="formConf.labelWidth" placeholder="标签宽度" /> | ||
| 552 | - </el-form-item> | ||
| 553 | - <el-form-item label="栅格间隔"> | ||
| 554 | - <el-input-number v-model="formConf.gutter" :min="0" placeholder="栅格间隔" /> | ||
| 555 | - </el-form-item> | ||
| 556 | - <el-form-item label="禁用表单"> | ||
| 557 | - <el-switch v-model="formConf.disabled" /> | ||
| 558 | - </el-form-item> | ||
| 559 | - <el-form-item label="表单按钮"> | ||
| 560 | - <el-switch v-model="formConf.formBtns" /> | ||
| 561 | - </el-form-item> | ||
| 562 | - <el-form-item label="显示未选中组件边框"> | ||
| 563 | - <el-switch v-model="formConf.unFocusedComponentBorder" /> | ||
| 564 | - </el-form-item> | ||
| 565 | - </el-form> | ||
| 566 | - </el-scrollbar> | ||
| 567 | - </div> | ||
| 568 | - | ||
| 569 | - <treeNode-dialog :visible.sync="dialogVisible" title="添加选项" @commit="addNode" /> | ||
| 570 | - <icons-dialog :visible.sync="iconsVisible" :current="activeData[currentIconModel]" @select="setIcon" /> | ||
| 571 | - </div> | ||
| 572 | -</template> | ||
| 573 | - | ||
| 574 | -<script> | ||
| 575 | -import { isArray } from 'util' | ||
| 576 | -import TreeNodeDialog from './TreeNodeDialog' | ||
| 577 | -import { isNumberStr } from '@/utils/index' | ||
| 578 | -import IconsDialog from './IconsDialog' | ||
| 579 | -import { | ||
| 580 | - inputComponents, | ||
| 581 | - selectComponents, | ||
| 582 | - layoutComponents | ||
| 583 | -} from '@/utils/generator/config' | ||
| 584 | - | ||
| 585 | -const dateTimeFormat = { | ||
| 586 | - date: 'yyyy-MM-dd', | ||
| 587 | - week: 'yyyy 第 WW 周', | ||
| 588 | - month: 'yyyy-MM', | ||
| 589 | - year: 'yyyy', | ||
| 590 | - datetime: 'yyyy-MM-dd HH:mm:ss', | ||
| 591 | - daterange: 'yyyy-MM-dd', | ||
| 592 | - monthrange: 'yyyy-MM', | ||
| 593 | - datetimerange: 'yyyy-MM-dd HH:mm:ss' | ||
| 594 | -} | ||
| 595 | - | ||
| 596 | -export default { | ||
| 597 | - components: { | ||
| 598 | - TreeNodeDialog, | ||
| 599 | - IconsDialog | ||
| 600 | - }, | ||
| 601 | - props: ['showField', 'activeData', 'formConf'], | ||
| 602 | - data() { | ||
| 603 | - return { | ||
| 604 | - currentTab: 'field', | ||
| 605 | - currentNode: null, | ||
| 606 | - dialogVisible: false, | ||
| 607 | - iconsVisible: false, | ||
| 608 | - currentIconModel: null, | ||
| 609 | - dateTypeOptions: [ | ||
| 610 | - { | ||
| 611 | - label: '日(date)', | ||
| 612 | - value: 'date' | ||
| 613 | - }, | ||
| 614 | - { | ||
| 615 | - label: '周(week)', | ||
| 616 | - value: 'week' | ||
| 617 | - }, | ||
| 618 | - { | ||
| 619 | - label: '月(month)', | ||
| 620 | - value: 'month' | ||
| 621 | - }, | ||
| 622 | - { | ||
| 623 | - label: '年(year)', | ||
| 624 | - value: 'year' | ||
| 625 | - }, | ||
| 626 | - { | ||
| 627 | - label: '日期时间(datetime)', | ||
| 628 | - value: 'datetime' | ||
| 629 | - } | ||
| 630 | - ], | ||
| 631 | - dateRangeTypeOptions: [ | ||
| 632 | - { | ||
| 633 | - label: '日期范围(daterange)', | ||
| 634 | - value: 'daterange' | ||
| 635 | - }, | ||
| 636 | - { | ||
| 637 | - label: '月范围(monthrange)', | ||
| 638 | - value: 'monthrange' | ||
| 639 | - }, | ||
| 640 | - { | ||
| 641 | - label: '日期时间范围(datetimerange)', | ||
| 642 | - value: 'datetimerange' | ||
| 643 | - } | ||
| 644 | - ], | ||
| 645 | - colorFormatOptions: [ | ||
| 646 | - { | ||
| 647 | - label: 'hex', | ||
| 648 | - value: 'hex' | ||
| 649 | - }, | ||
| 650 | - { | ||
| 651 | - label: 'rgb', | ||
| 652 | - value: 'rgb' | ||
| 653 | - }, | ||
| 654 | - { | ||
| 655 | - label: 'rgba', | ||
| 656 | - value: 'rgba' | ||
| 657 | - }, | ||
| 658 | - { | ||
| 659 | - label: 'hsv', | ||
| 660 | - value: 'hsv' | ||
| 661 | - }, | ||
| 662 | - { | ||
| 663 | - label: 'hsl', | ||
| 664 | - value: 'hsl' | ||
| 665 | - } | ||
| 666 | - ], | ||
| 667 | - justifyOptions: [ | ||
| 668 | - { | ||
| 669 | - label: 'start', | ||
| 670 | - value: 'start' | ||
| 671 | - }, | ||
| 672 | - { | ||
| 673 | - label: 'end', | ||
| 674 | - value: 'end' | ||
| 675 | - }, | ||
| 676 | - { | ||
| 677 | - label: 'center', | ||
| 678 | - value: 'center' | ||
| 679 | - }, | ||
| 680 | - { | ||
| 681 | - label: 'space-around', | ||
| 682 | - value: 'space-around' | ||
| 683 | - }, | ||
| 684 | - { | ||
| 685 | - label: 'space-between', | ||
| 686 | - value: 'space-between' | ||
| 687 | - } | ||
| 688 | - ], | ||
| 689 | - layoutTreeProps: { | ||
| 690 | - label(data, node) { | ||
| 691 | - return data.componentName || `${data.label}: ${data.vModel}` | ||
| 692 | - } | ||
| 693 | - } | ||
| 694 | - } | ||
| 695 | - }, | ||
| 696 | - computed: { | ||
| 697 | - documentLink() { | ||
| 698 | - return ( | ||
| 699 | - this.activeData.document | ||
| 700 | - || 'https://element.eleme.cn/#/zh-CN/component/installation' | ||
| 701 | - ) | ||
| 702 | - }, | ||
| 703 | - dateOptions() { | ||
| 704 | - if ( | ||
| 705 | - this.activeData.type !== undefined | ||
| 706 | - && this.activeData.tag === 'el-date-picker' | ||
| 707 | - ) { | ||
| 708 | - if (this.activeData['start-placeholder'] === undefined) { | ||
| 709 | - return this.dateTypeOptions | ||
| 710 | - } | ||
| 711 | - return this.dateRangeTypeOptions | ||
| 712 | - } | ||
| 713 | - return [] | ||
| 714 | - }, | ||
| 715 | - tagList() { | ||
| 716 | - return [ | ||
| 717 | - { | ||
| 718 | - label: '输入型组件', | ||
| 719 | - options: inputComponents | ||
| 720 | - }, | ||
| 721 | - { | ||
| 722 | - label: '选择型组件', | ||
| 723 | - options: selectComponents | ||
| 724 | - } | ||
| 725 | - ] | ||
| 726 | - } | ||
| 727 | - }, | ||
| 728 | - methods: { | ||
| 729 | - addReg() { | ||
| 730 | - this.activeData.regList.push({ | ||
| 731 | - pattern: '', | ||
| 732 | - message: '' | ||
| 733 | - }) | ||
| 734 | - }, | ||
| 735 | - addSelectItem() { | ||
| 736 | - this.activeData.options.push({ | ||
| 737 | - label: '', | ||
| 738 | - value: '' | ||
| 739 | - }) | ||
| 740 | - }, | ||
| 741 | - addTreeItem() { | ||
| 742 | - ++this.idGlobal | ||
| 743 | - this.dialogVisible = true | ||
| 744 | - this.currentNode = this.activeData.options | ||
| 745 | - }, | ||
| 746 | - renderContent(h, { node, data, store }) { | ||
| 747 | - return ( | ||
| 748 | - <div class="custom-tree-node"> | ||
| 749 | - <span>{node.label}</span> | ||
| 750 | - <span class="node-operation"> | ||
| 751 | - <i on-click={() => this.append(data)} | ||
| 752 | - class="el-icon-plus" | ||
| 753 | - title="添加" | ||
| 754 | - ></i> | ||
| 755 | - <i on-click={() => this.remove(node, data)} | ||
| 756 | - class="el-icon-delete" | ||
| 757 | - title="删除" | ||
| 758 | - ></i> | ||
| 759 | - </span> | ||
| 760 | - </div> | ||
| 761 | - ) | ||
| 762 | - }, | ||
| 763 | - append(data) { | ||
| 764 | - if (!data.children) { | ||
| 765 | - this.$set(data, 'children', []) | ||
| 766 | - } | ||
| 767 | - this.dialogVisible = true | ||
| 768 | - this.currentNode = data.children | ||
| 769 | - }, | ||
| 770 | - remove(node, data) { | ||
| 771 | - const { parent } = node | ||
| 772 | - const children = parent.data.children || parent.data | ||
| 773 | - const index = children.findIndex(d => d.id === data.id) | ||
| 774 | - children.splice(index, 1) | ||
| 775 | - }, | ||
| 776 | - addNode(data) { | ||
| 777 | - this.currentNode.push(data) | ||
| 778 | - }, | ||
| 779 | - setOptionValue(item, val) { | ||
| 780 | - item.value = isNumberStr(val) ? +val : val | ||
| 781 | - }, | ||
| 782 | - setDefaultValue(val) { | ||
| 783 | - if (Array.isArray(val)) { | ||
| 784 | - return val.join(',') | ||
| 785 | - } | ||
| 786 | - if (['string', 'number'].indexOf(val) > -1) { | ||
| 787 | - return val | ||
| 788 | - } | ||
| 789 | - if (typeof val === 'boolean') { | ||
| 790 | - return `${val}` | ||
| 791 | - } | ||
| 792 | - return val | ||
| 793 | - }, | ||
| 794 | - onDefaultValueInput(str) { | ||
| 795 | - if (isArray(this.activeData.defaultValue)) { | ||
| 796 | - // 数组 | ||
| 797 | - this.$set( | ||
| 798 | - this.activeData, | ||
| 799 | - 'defaultValue', | ||
| 800 | - str.split(',').map(val => (isNumberStr(val) ? +val : val)) | ||
| 801 | - ) | ||
| 802 | - } else if (['true', 'false'].indexOf(str) > -1) { | ||
| 803 | - // 布尔 | ||
| 804 | - this.$set(this.activeData, 'defaultValue', JSON.parse(str)) | ||
| 805 | - } else { | ||
| 806 | - // 字符串和数字 | ||
| 807 | - this.$set( | ||
| 808 | - this.activeData, | ||
| 809 | - 'defaultValue', | ||
| 810 | - isNumberStr(str) ? +str : str | ||
| 811 | - ) | ||
| 812 | - } | ||
| 813 | - }, | ||
| 814 | - onSwitchValueInput(val, name) { | ||
| 815 | - if (['true', 'false'].indexOf(val) > -1) { | ||
| 816 | - this.$set(this.activeData, name, JSON.parse(val)) | ||
| 817 | - } else { | ||
| 818 | - this.$set(this.activeData, name, isNumberStr(val) ? +val : val) | ||
| 819 | - } | ||
| 820 | - }, | ||
| 821 | - setTimeValue(val, type) { | ||
| 822 | - const valueFormat = type === 'week' ? dateTimeFormat.date : val | ||
| 823 | - this.$set(this.activeData, 'defaultValue', null) | ||
| 824 | - this.$set(this.activeData, 'value-format', valueFormat) | ||
| 825 | - this.$set(this.activeData, 'format', val) | ||
| 826 | - }, | ||
| 827 | - spanChange(val) { | ||
| 828 | - this.formConf.span = val | ||
| 829 | - }, | ||
| 830 | - multipleChange(val) { | ||
| 831 | - this.$set(this.activeData, 'defaultValue', val ? [] : '') | ||
| 832 | - }, | ||
| 833 | - dateTypeChange(val) { | ||
| 834 | - this.setTimeValue(dateTimeFormat[val], val) | ||
| 835 | - }, | ||
| 836 | - rangeChange(val) { | ||
| 837 | - this.$set( | ||
| 838 | - this.activeData, | ||
| 839 | - 'defaultValue', | ||
| 840 | - val ? [this.activeData.min, this.activeData.max] : this.activeData.min | ||
| 841 | - ) | ||
| 842 | - }, | ||
| 843 | - rateTextChange(val) { | ||
| 844 | - if (val) this.activeData['show-score'] = false | ||
| 845 | - }, | ||
| 846 | - rateScoreChange(val) { | ||
| 847 | - if (val) this.activeData['show-text'] = false | ||
| 848 | - }, | ||
| 849 | - colorFormatChange(val) { | ||
| 850 | - this.activeData.defaultValue = null | ||
| 851 | - this.activeData['show-alpha'] = val.indexOf('a') > -1 | ||
| 852 | - this.activeData.renderKey = +new Date() // 更新renderKey,重新渲染该组件 | ||
| 853 | - }, | ||
| 854 | - openIconsDialog(model) { | ||
| 855 | - this.iconsVisible = true | ||
| 856 | - this.currentIconModel = model | ||
| 857 | - }, | ||
| 858 | - setIcon(val) { | ||
| 859 | - this.activeData[this.currentIconModel] = val | ||
| 860 | - }, | ||
| 861 | - tagChange(tagIcon) { | ||
| 862 | - let target = inputComponents.find(item => item.tagIcon === tagIcon) | ||
| 863 | - if (!target) target = selectComponents.find(item => item.tagIcon === tagIcon) | ||
| 864 | - this.$emit('tag-change', target) | ||
| 865 | - } | ||
| 866 | - } | ||
| 867 | -} | ||
| 868 | -</script> | ||
| 869 | - | ||
| 870 | -<style lang="scss" scoped> | ||
| 871 | -.right-board { | ||
| 872 | - width: 350px; | ||
| 873 | - position: absolute; | ||
| 874 | - right: 0; | ||
| 875 | - top: 0; | ||
| 876 | - padding-top: 3px; | ||
| 877 | - .field-box { | ||
| 878 | - position: relative; | ||
| 879 | - height: calc(100vh - 42px); | ||
| 880 | - box-sizing: border-box; | ||
| 881 | - overflow: hidden; | ||
| 882 | - } | ||
| 883 | - .el-scrollbar { | ||
| 884 | - height: 100%; | ||
| 885 | - } | ||
| 886 | -} | ||
| 887 | -.select-item { | ||
| 888 | - display: flex; | ||
| 889 | - border: 1px dashed #fff; | ||
| 890 | - box-sizing: border-box; | ||
| 891 | - & .close-btn { | ||
| 892 | - cursor: pointer; | ||
| 893 | - color: #f56c6c; | ||
| 894 | - } | ||
| 895 | - & .el-input + .el-input { | ||
| 896 | - margin-left: 4px; | ||
| 897 | - } | ||
| 898 | -} | ||
| 899 | -.select-item + .select-item { | ||
| 900 | - margin-top: 4px; | ||
| 901 | -} | ||
| 902 | -.select-item.sortable-chosen { | ||
| 903 | - border: 1px dashed #409eff; | ||
| 904 | -} | ||
| 905 | -.select-line-icon { | ||
| 906 | - line-height: 32px; | ||
| 907 | - font-size: 22px; | ||
| 908 | - padding: 0 4px; | ||
| 909 | - color: #777; | ||
| 910 | -} | ||
| 911 | -.option-drag { | ||
| 912 | - cursor: move; | ||
| 913 | -} | ||
| 914 | -.time-range { | ||
| 915 | - .el-date-editor { | ||
| 916 | - width: 227px; | ||
| 917 | - } | ||
| 918 | - ::v-deep .el-icon-time { | ||
| 919 | - display: none; | ||
| 920 | - } | ||
| 921 | -} | ||
| 922 | -.document-link { | ||
| 923 | - position: absolute; | ||
| 924 | - display: block; | ||
| 925 | - width: 26px; | ||
| 926 | - height: 26px; | ||
| 927 | - top: 0; | ||
| 928 | - left: 0; | ||
| 929 | - cursor: pointer; | ||
| 930 | - background: #409eff; | ||
| 931 | - z-index: 1; | ||
| 932 | - border-radius: 0 0 6px 0; | ||
| 933 | - text-align: center; | ||
| 934 | - line-height: 26px; | ||
| 935 | - color: #fff; | ||
| 936 | - font-size: 18px; | ||
| 937 | -} | ||
| 938 | -.node-label{ | ||
| 939 | - font-size: 14px; | ||
| 940 | -} | ||
| 941 | -.node-icon{ | ||
| 942 | - color: #bebfc3; | ||
| 943 | -} | ||
| 944 | -</style> |
yudao-admin-ui/src/views/bpm/form/build/TreeNodeDialog.vue deleted
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <el-dialog | ||
| 4 | - v-bind="$attrs" | ||
| 5 | - :close-on-click-modal="false" | ||
| 6 | - :modal-append-to-body="false" | ||
| 7 | - v-on="$listeners" | ||
| 8 | - @open="onOpen" | ||
| 9 | - @close="onClose" | ||
| 10 | - > | ||
| 11 | - <el-row :gutter="0"> | ||
| 12 | - <el-form | ||
| 13 | - ref="elForm" | ||
| 14 | - :model="formData" | ||
| 15 | - :rules="rules" | ||
| 16 | - size="small" | ||
| 17 | - label-width="100px" | ||
| 18 | - > | ||
| 19 | - <el-col :span="24"> | ||
| 20 | - <el-form-item | ||
| 21 | - label="选项名" | ||
| 22 | - prop="label" | ||
| 23 | - > | ||
| 24 | - <el-input | ||
| 25 | - v-model="formData.label" | ||
| 26 | - placeholder="请输入选项名" | ||
| 27 | - clearable | ||
| 28 | - /> | ||
| 29 | - </el-form-item> | ||
| 30 | - </el-col> | ||
| 31 | - <el-col :span="24"> | ||
| 32 | - <el-form-item | ||
| 33 | - label="选项值" | ||
| 34 | - prop="value" | ||
| 35 | - > | ||
| 36 | - <el-input | ||
| 37 | - v-model="formData.value" | ||
| 38 | - placeholder="请输入选项值" | ||
| 39 | - clearable | ||
| 40 | - > | ||
| 41 | - <el-select | ||
| 42 | - slot="append" | ||
| 43 | - v-model="dataType" | ||
| 44 | - :style="{width: '100px'}" | ||
| 45 | - > | ||
| 46 | - <el-option | ||
| 47 | - v-for="(item, index) in dataTypeOptions" | ||
| 48 | - :key="index" | ||
| 49 | - :label="item.label" | ||
| 50 | - :value="item.value" | ||
| 51 | - :disabled="item.disabled" | ||
| 52 | - /> | ||
| 53 | - </el-select> | ||
| 54 | - </el-input> | ||
| 55 | - </el-form-item> | ||
| 56 | - </el-col> | ||
| 57 | - </el-form> | ||
| 58 | - </el-row> | ||
| 59 | - <div slot="footer"> | ||
| 60 | - <el-button | ||
| 61 | - type="primary" | ||
| 62 | - @click="handelConfirm" | ||
| 63 | - > | ||
| 64 | - 确定 | ||
| 65 | - </el-button> | ||
| 66 | - <el-button @click="close"> | ||
| 67 | - 取消 | ||
| 68 | - </el-button> | ||
| 69 | - </div> | ||
| 70 | - </el-dialog> | ||
| 71 | - </div> | ||
| 72 | -</template> | ||
| 73 | -<script> | ||
| 74 | -import { isNumberStr } from '@/utils/index' | ||
| 75 | - | ||
| 76 | -export default { | ||
| 77 | - components: {}, | ||
| 78 | - inheritAttrs: false, | ||
| 79 | - props: [], | ||
| 80 | - data() { | ||
| 81 | - return { | ||
| 82 | - id: 100, | ||
| 83 | - formData: { | ||
| 84 | - label: undefined, | ||
| 85 | - value: undefined | ||
| 86 | - }, | ||
| 87 | - rules: { | ||
| 88 | - label: [ | ||
| 89 | - { | ||
| 90 | - required: true, | ||
| 91 | - message: '请输入选项名', | ||
| 92 | - trigger: 'blur' | ||
| 93 | - } | ||
| 94 | - ], | ||
| 95 | - value: [ | ||
| 96 | - { | ||
| 97 | - required: true, | ||
| 98 | - message: '请输入选项值', | ||
| 99 | - trigger: 'blur' | ||
| 100 | - } | ||
| 101 | - ] | ||
| 102 | - }, | ||
| 103 | - dataType: 'string', | ||
| 104 | - dataTypeOptions: [ | ||
| 105 | - { | ||
| 106 | - label: '字符串', | ||
| 107 | - value: 'string' | ||
| 108 | - }, | ||
| 109 | - { | ||
| 110 | - label: '数字', | ||
| 111 | - value: 'number' | ||
| 112 | - } | ||
| 113 | - ] | ||
| 114 | - } | ||
| 115 | - }, | ||
| 116 | - computed: {}, | ||
| 117 | - watch: { | ||
| 118 | - // eslint-disable-next-line func-names | ||
| 119 | - 'formData.value': function (val) { | ||
| 120 | - this.dataType = isNumberStr(val) ? 'number' : 'string' | ||
| 121 | - } | ||
| 122 | - }, | ||
| 123 | - created() {}, | ||
| 124 | - mounted() {}, | ||
| 125 | - methods: { | ||
| 126 | - onOpen() { | ||
| 127 | - this.formData = { | ||
| 128 | - label: undefined, | ||
| 129 | - value: undefined | ||
| 130 | - } | ||
| 131 | - }, | ||
| 132 | - onClose() {}, | ||
| 133 | - close() { | ||
| 134 | - this.$emit('update:visible', false) | ||
| 135 | - }, | ||
| 136 | - handelConfirm() { | ||
| 137 | - this.$refs.elForm.validate(valid => { | ||
| 138 | - if (!valid) return | ||
| 139 | - if (this.dataType === 'number') { | ||
| 140 | - this.formData.value = parseFloat(this.formData.value) | ||
| 141 | - } | ||
| 142 | - this.formData.id = this.id++ | ||
| 143 | - this.$emit('commit', this.formData) | ||
| 144 | - this.close() | ||
| 145 | - }) | ||
| 146 | - } | ||
| 147 | - } | ||
| 148 | -} | ||
| 149 | -</script> |
yudao-admin-ui/src/views/bpm/form/build/index.vue renamed to yudao-admin-ui/src/views/bpm/form/formEditor.vue
| @@ -97,18 +97,13 @@ | @@ -97,18 +97,13 @@ | ||
| 97 | <script> | 97 | <script> |
| 98 | import draggable from 'vuedraggable' | 98 | import draggable from 'vuedraggable' |
| 99 | import render from '@/utils/generator/render' | 99 | import render from '@/utils/generator/render' |
| 100 | -import RightPanel from './RightPanel' | ||
| 101 | -import { | ||
| 102 | - inputComponents, | ||
| 103 | - selectComponents, | ||
| 104 | - layoutComponents, | ||
| 105 | - formConf | ||
| 106 | -} from '@/utils/generator/config' | 100 | +import { inputComponents, selectComponents, layoutComponents, formConf} from '@/utils/generator/config' |
| 107 | import drawingDefalut from '@/utils/generator/drawingDefalut' | 101 | import drawingDefalut from '@/utils/generator/drawingDefalut' |
| 108 | // import logo from '@/assets/logo/logo.png' | 102 | // import logo from '@/assets/logo/logo.png' |
| 109 | -import DraggableItem from './DraggableItem' | 103 | +import DraggableItem from './../../tool/build/DraggableItem' |
| 104 | +import RightPanel from './../../tool/build/RightPanel' | ||
| 110 | 105 | ||
| 111 | -const emptyActiveData = { style: {}, autosize: {} } | 106 | +// const emptyActiveData = { style: {}, autosize: {} } |
| 112 | let oldActiveId | 107 | let oldActiveId |
| 113 | let tempActiveData | 108 | let tempActiveData |
| 114 | 109 | ||
| @@ -147,8 +142,6 @@ export default { | @@ -147,8 +142,6 @@ export default { | ||
| 147 | } | 142 | } |
| 148 | } | 143 | } |
| 149 | }, | 144 | }, |
| 150 | - computed: { | ||
| 151 | - }, | ||
| 152 | watch: { | 145 | watch: { |
| 153 | // eslint-disable-next-line func-names | 146 | // eslint-disable-next-line func-names |
| 154 | 'activeData.label': function (val, oldVal) { | 147 | 'activeData.label': function (val, oldVal) { |