|
|
@ -2,9 +2,7 @@ |
|
|
|
<div class="container"> |
|
|
|
<div class="container"> |
|
|
|
<div class="left-board"> |
|
|
|
<div class="left-board"> |
|
|
|
<div class="logo-wrapper"> |
|
|
|
<div class="logo-wrapper"> |
|
|
|
<div class="logo"> |
|
|
|
<div class="logo"><img :src="logo" alt="logo" /> Form Generator</div> |
|
|
|
<img :src="logo" alt="logo"> Form Generator |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<el-scrollbar class="left-scrollbar"> |
|
|
|
<el-scrollbar class="left-scrollbar"> |
|
|
|
<div class="components-list"> |
|
|
|
<div class="components-list"> |
|
|
@ -21,7 +19,9 @@ |
|
|
|
@end="onEnd" |
|
|
|
@end="onEnd" |
|
|
|
> |
|
|
|
> |
|
|
|
<div |
|
|
|
<div |
|
|
|
v-for="(element, index) in inputComponents" :key="index" class="components-item" |
|
|
|
v-for="(element, index) in inputComponents" |
|
|
|
|
|
|
|
:key="index" |
|
|
|
|
|
|
|
class="components-item" |
|
|
|
@click="addComponent(element)" |
|
|
|
@click="addComponent(element)" |
|
|
|
> |
|
|
|
> |
|
|
|
<div class="components-body"> |
|
|
|
<div class="components-body"> |
|
|
@ -58,12 +58,18 @@ |
|
|
|
<svg-icon icon-class="component" /> 布局型组件 |
|
|
|
<svg-icon icon-class="component" /> 布局型组件 |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<draggable |
|
|
|
<draggable |
|
|
|
class="components-draggable" :list="layoutComponents" |
|
|
|
class="components-draggable" |
|
|
|
:group="{ name: 'componentsGroup', pull: 'clone', put: false }" :clone="cloneComponent" |
|
|
|
:list="layoutComponents" |
|
|
|
draggable=".components-item" :sort="false" @end="onEnd" |
|
|
|
:group="{ name: 'componentsGroup', pull: 'clone', put: false }" |
|
|
|
|
|
|
|
:clone="cloneComponent" |
|
|
|
|
|
|
|
draggable=".components-item" |
|
|
|
|
|
|
|
:sort="false" |
|
|
|
|
|
|
|
@end="onEnd" |
|
|
|
> |
|
|
|
> |
|
|
|
<div |
|
|
|
<div |
|
|
|
v-for="(element, index) in layoutComponents" :key="index" class="components-item" |
|
|
|
v-for="(element, index) in layoutComponents" |
|
|
|
|
|
|
|
:key="index" |
|
|
|
|
|
|
|
class="components-item" |
|
|
|
@click="addComponent(element)" |
|
|
|
@click="addComponent(element)" |
|
|
|
> |
|
|
|
> |
|
|
|
<div class="components-body"> |
|
|
|
<div class="components-body"> |
|
|
@ -81,10 +87,20 @@ |
|
|
|
<el-button icon="el-icon-download" type="text" @click="download"> |
|
|
|
<el-button icon="el-icon-download" type="text" @click="download"> |
|
|
|
导出vue文件 |
|
|
|
导出vue文件 |
|
|
|
</el-button> |
|
|
|
</el-button> |
|
|
|
<el-button class="copy-btn-main" icon="el-icon-document-copy" type="text" @click="copy"> |
|
|
|
<el-button |
|
|
|
|
|
|
|
class="copy-btn-main" |
|
|
|
|
|
|
|
icon="el-icon-document-copy" |
|
|
|
|
|
|
|
type="text" |
|
|
|
|
|
|
|
@click="copy" |
|
|
|
|
|
|
|
> |
|
|
|
复制代码 |
|
|
|
复制代码 |
|
|
|
</el-button> |
|
|
|
</el-button> |
|
|
|
<el-button class="delete-btn" icon="el-icon-delete" type="text" @click="empty"> |
|
|
|
<el-button |
|
|
|
|
|
|
|
class="delete-btn" |
|
|
|
|
|
|
|
icon="el-icon-delete" |
|
|
|
|
|
|
|
type="text" |
|
|
|
|
|
|
|
@click="empty" |
|
|
|
|
|
|
|
> |
|
|
|
清空 |
|
|
|
清空 |
|
|
|
</el-button> |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
@ -96,7 +112,12 @@ |
|
|
|
:disabled="formConf.disabled" |
|
|
|
:disabled="formConf.disabled" |
|
|
|
:label-width="formConf.labelWidth + 'px'" |
|
|
|
:label-width="formConf.labelWidth + 'px'" |
|
|
|
> |
|
|
|
> |
|
|
|
<draggable class="drawing-board" :list="drawingList" :animation="340" group="componentsGroup"> |
|
|
|
<draggable |
|
|
|
|
|
|
|
class="drawing-board" |
|
|
|
|
|
|
|
:list="drawingList" |
|
|
|
|
|
|
|
:animation="340" |
|
|
|
|
|
|
|
group="componentsGroup" |
|
|
|
|
|
|
|
> |
|
|
|
<draggable-item |
|
|
|
<draggable-item |
|
|
|
v-for="(element, index) in drawingList" |
|
|
|
v-for="(element, index) in drawingList" |
|
|
|
:key="element.renderKey" |
|
|
|
:key="element.renderKey" |
|
|
@ -131,28 +152,38 @@ |
|
|
|
:show-file-name="showFileName" |
|
|
|
:show-file-name="showFileName" |
|
|
|
@confirm="generate" |
|
|
|
@confirm="generate" |
|
|
|
/> |
|
|
|
/> |
|
|
|
<input id="copyNode" type="hidden"> |
|
|
|
<input id="copyNode" type="hidden" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
<script> |
|
|
|
import draggable from 'vuedraggable' |
|
|
|
import draggable from "vuedraggable"; |
|
|
|
import beautifier from 'js-beautify' |
|
|
|
import beautifier from "js-beautify"; |
|
|
|
import ClipboardJS from 'clipboard' |
|
|
|
import ClipboardJS from "clipboard"; |
|
|
|
import render from '@/utils/generator/render' |
|
|
|
import render from "@/utils/generator/render"; |
|
|
|
import RightPanel from './RightPanel' |
|
|
|
import RightPanel from "./RightPanel"; |
|
|
|
import { inputComponents, selectComponents, layoutComponents, formConf } from '@/utils/generator/config' |
|
|
|
import { |
|
|
|
import { beautifierConf, titleCase } from '@/utils/index' |
|
|
|
inputComponents, |
|
|
|
import { makeUpHtml, vueTemplate, vueScript, cssStyle } from '@/utils/generator/html' |
|
|
|
selectComponents, |
|
|
|
import { makeUpJs } from '@/utils/generator/js' |
|
|
|
layoutComponents, |
|
|
|
import { makeUpCss } from '@/utils/generator/css' |
|
|
|
formConf, |
|
|
|
import drawingDefault from '@/utils/generator/drawingDefault' |
|
|
|
} from "@/utils/generator/config"; |
|
|
|
import logo from '@/assets/logo/logo.png' |
|
|
|
import { beautifierConf, titleCase } from "@/utils/index"; |
|
|
|
import CodeTypeDialog from './CodeTypeDialog' |
|
|
|
import { |
|
|
|
import DraggableItem from './DraggableItem' |
|
|
|
makeUpHtml, |
|
|
|
|
|
|
|
vueTemplate, |
|
|
|
|
|
|
|
vueScript, |
|
|
|
|
|
|
|
cssStyle, |
|
|
|
|
|
|
|
} from "@/utils/generator/html"; |
|
|
|
|
|
|
|
import { makeUpJs } from "@/utils/generator/js"; |
|
|
|
|
|
|
|
import { makeUpCss } from "@/utils/generator/css"; |
|
|
|
|
|
|
|
import drawingDefault from "@/utils/generator/drawingDefault"; |
|
|
|
|
|
|
|
import logo from "@/assets/logo/logo.png"; |
|
|
|
|
|
|
|
import CodeTypeDialog from "./CodeTypeDialog"; |
|
|
|
|
|
|
|
import DraggableItem from "./DraggableItem"; |
|
|
|
|
|
|
|
|
|
|
|
let oldActiveId |
|
|
|
let oldActiveId; |
|
|
|
let tempActiveData |
|
|
|
let tempActiveData; |
|
|
|
|
|
|
|
|
|
|
|
export default { |
|
|
|
export default { |
|
|
|
components: { |
|
|
|
components: { |
|
|
@ -160,7 +191,7 @@ export default { |
|
|
|
render, |
|
|
|
render, |
|
|
|
RightPanel, |
|
|
|
RightPanel, |
|
|
|
CodeTypeDialog, |
|
|
|
CodeTypeDialog, |
|
|
|
DraggableItem |
|
|
|
DraggableItem, |
|
|
|
}, |
|
|
|
}, |
|
|
|
data() { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
return { |
|
|
@ -179,208 +210,214 @@ export default { |
|
|
|
dialogVisible: false, |
|
|
|
dialogVisible: false, |
|
|
|
generateConf: null, |
|
|
|
generateConf: null, |
|
|
|
showFileName: false, |
|
|
|
showFileName: false, |
|
|
|
activeData: drawingDefault[0] |
|
|
|
activeData: drawingDefault[0], |
|
|
|
} |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
created() { |
|
|
|
created() { |
|
|
|
// 防止 firefox 下 拖拽 会新打卡一个选项卡 |
|
|
|
// 防止 firefox 下 拖拽 会新打卡一个选项卡 |
|
|
|
document.body.ondrop = event => { |
|
|
|
document.body.ondrop = (event) => { |
|
|
|
event.preventDefault() |
|
|
|
event.preventDefault(); |
|
|
|
event.stopPropagation() |
|
|
|
event.stopPropagation(); |
|
|
|
} |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
watch: { |
|
|
|
watch: { |
|
|
|
// eslint-disable-next-line func-names |
|
|
|
// eslint-disable-next-line func-names |
|
|
|
'activeData.label': function (val, oldVal) { |
|
|
|
"activeData.label": function (val, oldVal) { |
|
|
|
if ( |
|
|
|
if ( |
|
|
|
this.activeData.placeholder === undefined |
|
|
|
this.activeData.placeholder === undefined || |
|
|
|
|| !this.activeData.tag |
|
|
|
!this.activeData.tag || |
|
|
|
|| oldActiveId !== this.activeId |
|
|
|
oldActiveId !== this.activeId |
|
|
|
) { |
|
|
|
) { |
|
|
|
return |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
this.activeData.placeholder = this.activeData.placeholder.replace(oldVal, '') + val |
|
|
|
this.activeData.placeholder = |
|
|
|
|
|
|
|
this.activeData.placeholder.replace(oldVal, "") + val; |
|
|
|
}, |
|
|
|
}, |
|
|
|
activeId: { |
|
|
|
activeId: { |
|
|
|
handler(val) { |
|
|
|
handler(val) { |
|
|
|
oldActiveId = val |
|
|
|
oldActiveId = val; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
immediate: true, |
|
|
|
}, |
|
|
|
}, |
|
|
|
immediate: true |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
mounted() { |
|
|
|
const clipboard = new ClipboardJS('#copyNode', { |
|
|
|
const clipboard = new ClipboardJS("#copyNode", { |
|
|
|
text: trigger => { |
|
|
|
text: (trigger) => { |
|
|
|
const codeStr = this.generateCode() |
|
|
|
const codeStr = this.generateCode(); |
|
|
|
this.$notify({ |
|
|
|
this.$notify({ |
|
|
|
title: '成功', |
|
|
|
title: "成功", |
|
|
|
message: '代码已复制到剪切板,可粘贴。', |
|
|
|
message: "代码已复制到剪切板,可粘贴。", |
|
|
|
type: 'success' |
|
|
|
type: "success", |
|
|
|
}) |
|
|
|
}); |
|
|
|
return codeStr |
|
|
|
return codeStr; |
|
|
|
} |
|
|
|
}, |
|
|
|
}) |
|
|
|
}); |
|
|
|
clipboard.on('error', e => { |
|
|
|
clipboard.on("error", (e) => { |
|
|
|
this.$message.error('代码复制失败') |
|
|
|
this.$message.error("代码复制失败"); |
|
|
|
}) |
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
methods: { |
|
|
|
activeFormItem(element) { |
|
|
|
activeFormItem(element) { |
|
|
|
this.activeData = element |
|
|
|
this.activeData = element; |
|
|
|
this.activeId = element.formId |
|
|
|
this.activeId = element.formId; |
|
|
|
}, |
|
|
|
}, |
|
|
|
onEnd(obj, a) { |
|
|
|
onEnd(obj, a) { |
|
|
|
if (obj.from !== obj.to) { |
|
|
|
if (obj.from !== obj.to) { |
|
|
|
this.activeData = tempActiveData |
|
|
|
this.activeData = tempActiveData; |
|
|
|
this.activeId = this.idGlobal |
|
|
|
this.activeId = this.idGlobal; |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
addComponent(item) { |
|
|
|
addComponent(item) { |
|
|
|
const clone = this.cloneComponent(item) |
|
|
|
const clone = this.cloneComponent(item); |
|
|
|
this.drawingList.push(clone) |
|
|
|
this.drawingList.push(clone); |
|
|
|
this.activeFormItem(clone) |
|
|
|
this.activeFormItem(clone); |
|
|
|
}, |
|
|
|
}, |
|
|
|
cloneComponent(origin) { |
|
|
|
cloneComponent(origin) { |
|
|
|
const clone = JSON.parse(JSON.stringify(origin)) |
|
|
|
const clone = JSON.parse(JSON.stringify(origin)); |
|
|
|
clone.formId = ++this.idGlobal |
|
|
|
clone.formId = ++this.idGlobal; |
|
|
|
clone.span = formConf.span |
|
|
|
clone.span = formConf.span; |
|
|
|
clone.renderKey = +new Date() // 改变renderKey后可以实现强制更新组件 |
|
|
|
clone.renderKey = +new Date(); // 改变renderKey后可以实现强制更新组件 |
|
|
|
if (!clone.layout) clone.layout = 'colFormItem' |
|
|
|
if (!clone.layout) clone.layout = "colFormItem"; |
|
|
|
if (clone.layout === 'colFormItem') { |
|
|
|
if (clone.layout === "colFormItem") { |
|
|
|
clone.vModel = `field${this.idGlobal}` |
|
|
|
clone.vModel = `field${this.idGlobal}`; |
|
|
|
clone.placeholder !== undefined && (clone.placeholder += clone.label) |
|
|
|
clone.placeholder !== undefined && (clone.placeholder += clone.label); |
|
|
|
tempActiveData = clone |
|
|
|
tempActiveData = clone; |
|
|
|
} else if (clone.layout === 'rowFormItem') { |
|
|
|
} else if (clone.layout === "rowFormItem") { |
|
|
|
delete clone.label |
|
|
|
delete clone.label; |
|
|
|
clone.componentName = `row${this.idGlobal}` |
|
|
|
clone.componentName = `row${this.idGlobal}`; |
|
|
|
clone.gutter = this.formConf.gutter |
|
|
|
clone.gutter = this.formConf.gutter; |
|
|
|
tempActiveData = clone |
|
|
|
tempActiveData = clone; |
|
|
|
} |
|
|
|
} |
|
|
|
return tempActiveData |
|
|
|
return tempActiveData; |
|
|
|
}, |
|
|
|
}, |
|
|
|
AssembleFormData() { |
|
|
|
AssembleFormData() { |
|
|
|
this.formData = { |
|
|
|
this.formData = { |
|
|
|
fields: JSON.parse(JSON.stringify(this.drawingList)), |
|
|
|
fields: JSON.parse(JSON.stringify(this.drawingList)), |
|
|
|
...this.formConf |
|
|
|
...this.formConf, |
|
|
|
} |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
generate(data) { |
|
|
|
generate(data) { |
|
|
|
const func = this[`exec${titleCase(this.operationType)}`] |
|
|
|
const func = this[`exec${titleCase(this.operationType)}`]; |
|
|
|
this.generateConf = data |
|
|
|
this.generateConf = data; |
|
|
|
func && func(data) |
|
|
|
func && func(data); |
|
|
|
}, |
|
|
|
}, |
|
|
|
execRun(data) { |
|
|
|
execRun(data) { |
|
|
|
this.AssembleFormData() |
|
|
|
this.AssembleFormData(); |
|
|
|
this.drawerVisible = true |
|
|
|
this.drawerVisible = true; |
|
|
|
}, |
|
|
|
}, |
|
|
|
execDownload(data) { |
|
|
|
execDownload(data) { |
|
|
|
const codeStr = this.generateCode() |
|
|
|
const codeStr = this.generateCode(); |
|
|
|
const blob = new Blob([codeStr], { type: 'text/plain;charset=utf-8' }) |
|
|
|
const blob = new Blob([codeStr], { type: "text/plain;charset=utf-8" }); |
|
|
|
this.$download.saveAs(blob, data.fileName) |
|
|
|
this.$download.saveAs(blob, data.fileName); |
|
|
|
}, |
|
|
|
}, |
|
|
|
execCopy(data) { |
|
|
|
execCopy(data) { |
|
|
|
document.getElementById('copyNode').click() |
|
|
|
document.getElementById("copyNode").click(); |
|
|
|
}, |
|
|
|
}, |
|
|
|
empty() { |
|
|
|
empty() { |
|
|
|
this.$confirm('确定要清空所有组件吗?', '提示', { type: 'warning' }).then( |
|
|
|
this.$confirm("确定要清空所有组件吗?", "提示", { type: "warning" }).then( |
|
|
|
() => { |
|
|
|
() => { |
|
|
|
this.drawingList = [] |
|
|
|
this.drawingList = []; |
|
|
|
} |
|
|
|
} |
|
|
|
) |
|
|
|
); |
|
|
|
}, |
|
|
|
}, |
|
|
|
drawingItemCopy(item, parent) { |
|
|
|
drawingItemCopy(item, parent) { |
|
|
|
let clone = JSON.parse(JSON.stringify(item)) |
|
|
|
let clone = JSON.parse(JSON.stringify(item)); |
|
|
|
clone = this.createIdAndKey(clone) |
|
|
|
clone = this.createIdAndKey(clone); |
|
|
|
parent.push(clone) |
|
|
|
parent.push(clone); |
|
|
|
this.activeFormItem(clone) |
|
|
|
this.activeFormItem(clone); |
|
|
|
}, |
|
|
|
}, |
|
|
|
createIdAndKey(item) { |
|
|
|
createIdAndKey(item) { |
|
|
|
item.formId = ++this.idGlobal |
|
|
|
item.formId = ++this.idGlobal; |
|
|
|
item.renderKey = +new Date() |
|
|
|
item.renderKey = +new Date(); |
|
|
|
if (item.layout === 'colFormItem') { |
|
|
|
if (item.layout === "colFormItem") { |
|
|
|
item.vModel = `field${this.idGlobal}` |
|
|
|
item.vModel = `field${this.idGlobal}`; |
|
|
|
} else if (item.layout === 'rowFormItem') { |
|
|
|
} else if (item.layout === "rowFormItem") { |
|
|
|
item.componentName = `row${this.idGlobal}` |
|
|
|
item.componentName = `row${this.idGlobal}`; |
|
|
|
} |
|
|
|
} |
|
|
|
if (Array.isArray(item.children)) { |
|
|
|
if (Array.isArray(item.children)) { |
|
|
|
item.children = item.children.map(childItem => this.createIdAndKey(childItem)) |
|
|
|
item.children = item.children.map((childItem) => |
|
|
|
|
|
|
|
this.createIdAndKey(childItem) |
|
|
|
|
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
return item |
|
|
|
return item; |
|
|
|
}, |
|
|
|
}, |
|
|
|
drawingItemDelete(index, parent) { |
|
|
|
drawingItemDelete(index, parent) { |
|
|
|
parent.splice(index, 1) |
|
|
|
parent.splice(index, 1); |
|
|
|
this.$nextTick(() => { |
|
|
|
this.$nextTick(() => { |
|
|
|
const len = this.drawingList.length |
|
|
|
const len = this.drawingList.length; |
|
|
|
if (len) { |
|
|
|
if (len) { |
|
|
|
this.activeFormItem(this.drawingList[len - 1]) |
|
|
|
this.activeFormItem(this.drawingList[len - 1]); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
generateCode() { |
|
|
|
generateCode() { |
|
|
|
const { type } = this.generateConf |
|
|
|
const { type } = this.generateConf; |
|
|
|
this.AssembleFormData() |
|
|
|
this.AssembleFormData(); |
|
|
|
const script = vueScript(makeUpJs(this.formData, type)) |
|
|
|
const script = vueScript(makeUpJs(this.formData, type)); |
|
|
|
const html = vueTemplate(makeUpHtml(this.formData, type)) |
|
|
|
const html = vueTemplate(makeUpHtml(this.formData, type)); |
|
|
|
const css = cssStyle(makeUpCss(this.formData)) |
|
|
|
const css = cssStyle(makeUpCss(this.formData)); |
|
|
|
return beautifier.html(html + script + css, beautifierConf.html) |
|
|
|
return beautifier.html(html + script + css, beautifierConf.html); |
|
|
|
}, |
|
|
|
}, |
|
|
|
download() { |
|
|
|
download() { |
|
|
|
this.dialogVisible = true |
|
|
|
this.dialogVisible = true; |
|
|
|
this.showFileName = true |
|
|
|
this.showFileName = true; |
|
|
|
this.operationType = 'download' |
|
|
|
this.operationType = "download"; |
|
|
|
}, |
|
|
|
}, |
|
|
|
run() { |
|
|
|
run() { |
|
|
|
this.dialogVisible = true |
|
|
|
this.dialogVisible = true; |
|
|
|
this.showFileName = false |
|
|
|
this.showFileName = false; |
|
|
|
this.operationType = 'run' |
|
|
|
this.operationType = "run"; |
|
|
|
}, |
|
|
|
}, |
|
|
|
copy() { |
|
|
|
copy() { |
|
|
|
this.dialogVisible = true |
|
|
|
this.dialogVisible = true; |
|
|
|
this.showFileName = false |
|
|
|
this.showFileName = false; |
|
|
|
this.operationType = 'copy' |
|
|
|
this.operationType = "copy"; |
|
|
|
}, |
|
|
|
}, |
|
|
|
tagChange(newTag) { |
|
|
|
tagChange(newTag) { |
|
|
|
newTag = this.cloneComponent(newTag) |
|
|
|
newTag = this.cloneComponent(newTag); |
|
|
|
newTag.vModel = this.activeData.vModel |
|
|
|
newTag.vModel = this.activeData.vModel; |
|
|
|
newTag.formId = this.activeId |
|
|
|
newTag.formId = this.activeId; |
|
|
|
newTag.span = this.activeData.span |
|
|
|
newTag.span = this.activeData.span; |
|
|
|
delete this.activeData.tag |
|
|
|
delete this.activeData.tag; |
|
|
|
delete this.activeData.tagIcon |
|
|
|
delete this.activeData.tagIcon; |
|
|
|
delete this.activeData.document |
|
|
|
delete this.activeData.document; |
|
|
|
Object.keys(newTag).forEach(key => { |
|
|
|
Object.keys(newTag).forEach((key) => { |
|
|
|
if (this.activeData[key] !== undefined |
|
|
|
if ( |
|
|
|
&& typeof this.activeData[key] === typeof newTag[key]) { |
|
|
|
this.activeData[key] !== undefined && |
|
|
|
newTag[key] = this.activeData[key] |
|
|
|
typeof this.activeData[key] === typeof newTag[key] |
|
|
|
} |
|
|
|
) { |
|
|
|
}) |
|
|
|
newTag[key] = this.activeData[key]; |
|
|
|
this.activeData = newTag |
|
|
|
} |
|
|
|
this.updateDrawingList(newTag, this.drawingList) |
|
|
|
}); |
|
|
|
|
|
|
|
this.activeData = newTag; |
|
|
|
|
|
|
|
this.updateDrawingList(newTag, this.drawingList); |
|
|
|
}, |
|
|
|
}, |
|
|
|
updateDrawingList(newTag, list) { |
|
|
|
updateDrawingList(newTag, list) { |
|
|
|
const index = list.findIndex(item => item.formId === this.activeId) |
|
|
|
const index = list.findIndex((item) => item.formId === this.activeId); |
|
|
|
if (index > -1) { |
|
|
|
if (index > -1) { |
|
|
|
list.splice(index, 1, newTag) |
|
|
|
list.splice(index, 1, newTag); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
list.forEach(item => { |
|
|
|
list.forEach((item) => { |
|
|
|
if (Array.isArray(item.children)) this.updateDrawingList(newTag, item.children) |
|
|
|
if (Array.isArray(item.children)) |
|
|
|
}) |
|
|
|
this.updateDrawingList(newTag, item.children); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
</script> |
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style lang='scss'> |
|
|
|
<style lang="scss"> |
|
|
|
.editor-tabs{ |
|
|
|
.editor-tabs { |
|
|
|
background: #121315; |
|
|
|
background: #121315; |
|
|
|
.el-tabs__header{ |
|
|
|
.el-tabs__header { |
|
|
|
margin: 0; |
|
|
|
margin: 0; |
|
|
|
border-bottom-color: #121315; |
|
|
|
border-bottom-color: #121315; |
|
|
|
.el-tabs__nav{ |
|
|
|
.el-tabs__nav { |
|
|
|
border-color: #121315; |
|
|
|
border-color: #121315; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.el-tabs__item{ |
|
|
|
.el-tabs__item { |
|
|
|
height: 32px; |
|
|
|
height: 32px; |
|
|
|
line-height: 32px; |
|
|
|
line-height: 32px; |
|
|
|
color: #888a8e; |
|
|
|
color: #888a8e; |
|
|
@ -389,15 +426,15 @@ export default { |
|
|
|
margin-right: 5px; |
|
|
|
margin-right: 5px; |
|
|
|
user-select: none; |
|
|
|
user-select: none; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-tabs__item.is-active{ |
|
|
|
.el-tabs__item.is-active { |
|
|
|
background: #1e1e1e; |
|
|
|
background: #1e1e1e; |
|
|
|
border-bottom-color: #1e1e1e!important; |
|
|
|
border-bottom-color: #1e1e1e !important; |
|
|
|
color: #fff; |
|
|
|
color: #fff; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-icon-edit{ |
|
|
|
.el-icon-edit { |
|
|
|
color: #f1fa8c; |
|
|
|
color: #f1fa8c; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-icon-document{ |
|
|
|
.el-icon-document { |
|
|
|
color: #a95812; |
|
|
|
color: #a95812; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -413,24 +450,24 @@ export default { |
|
|
|
overflow-x: hidden !important; |
|
|
|
overflow-x: hidden !important; |
|
|
|
margin-bottom: 0 !important; |
|
|
|
margin-bottom: 0 !important; |
|
|
|
} |
|
|
|
} |
|
|
|
.center-tabs{ |
|
|
|
.center-tabs { |
|
|
|
.el-tabs__header{ |
|
|
|
.el-tabs__header { |
|
|
|
margin-bottom: 0!important; |
|
|
|
margin-bottom: 0 !important; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-tabs__item{ |
|
|
|
.el-tabs__item { |
|
|
|
width: 50%; |
|
|
|
width: 50%; |
|
|
|
text-align: center; |
|
|
|
text-align: center; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-tabs__nav{ |
|
|
|
.el-tabs__nav { |
|
|
|
width: 100%; |
|
|
|
width: 100%; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.reg-item{ |
|
|
|
.reg-item { |
|
|
|
padding: 12px 6px; |
|
|
|
padding: 12px 6px; |
|
|
|
background: #f8f8f8; |
|
|
|
background: #f8f8f8; |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
|
border-radius: 4px; |
|
|
|
border-radius: 4px; |
|
|
|
.close-btn{ |
|
|
|
.close-btn { |
|
|
|
position: absolute; |
|
|
|
position: absolute; |
|
|
|
right: -6px; |
|
|
|
right: -6px; |
|
|
|
top: -6px; |
|
|
|
top: -6px; |
|
|
@ -445,16 +482,16 @@ export default { |
|
|
|
z-index: 1; |
|
|
|
z-index: 1; |
|
|
|
cursor: pointer; |
|
|
|
cursor: pointer; |
|
|
|
font-size: 12px; |
|
|
|
font-size: 12px; |
|
|
|
&:hover{ |
|
|
|
&:hover { |
|
|
|
background: rgba(210, 23, 23, 0.5) |
|
|
|
background: rgba(210, 23, 23, 0.5); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
& + .reg-item{ |
|
|
|
& + .reg-item { |
|
|
|
margin-top: 18px; |
|
|
|
margin-top: 18px; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.action-bar{ |
|
|
|
.action-bar { |
|
|
|
& .el-button+.el-button { |
|
|
|
& .el-button + .el-button { |
|
|
|
margin-left: 15px; |
|
|
|
margin-left: 15px; |
|
|
|
} |
|
|
|
} |
|
|
|
& i { |
|
|
|
& i { |
|
|
@ -465,37 +502,37 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.custom-tree-node{ |
|
|
|
.custom-tree-node { |
|
|
|
width: 100%; |
|
|
|
width: 100%; |
|
|
|
font-size: 14px; |
|
|
|
font-size: 14px; |
|
|
|
.node-operation{ |
|
|
|
.node-operation { |
|
|
|
float: right; |
|
|
|
float: right; |
|
|
|
} |
|
|
|
} |
|
|
|
i[class*="el-icon"] + i[class*="el-icon"]{ |
|
|
|
i[class*="el-icon"] + i[class*="el-icon"] { |
|
|
|
margin-left: 6px; |
|
|
|
margin-left: 6px; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-icon-plus{ |
|
|
|
.el-icon-plus { |
|
|
|
color: #409EFF; |
|
|
|
color: #409eff; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-icon-delete{ |
|
|
|
.el-icon-delete { |
|
|
|
color: #157a0c; |
|
|
|
color: #157a0c; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.left-scrollbar .el-scrollbar__view{ |
|
|
|
.left-scrollbar .el-scrollbar__view { |
|
|
|
overflow-x: hidden; |
|
|
|
overflow-x: hidden; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.el-rate{ |
|
|
|
.el-rate { |
|
|
|
display: inline-block; |
|
|
|
display: inline-block; |
|
|
|
vertical-align: text-top; |
|
|
|
vertical-align: text-top; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-upload__tip{ |
|
|
|
.el-upload__tip { |
|
|
|
line-height: 1.2; |
|
|
|
line-height: 1.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
$selectedColor: #f6f7ff; |
|
|
|
$selectedColor: #f6f7ff; |
|
|
|
$lighterBlue: #409EFF; |
|
|
|
$lighterBlue: #409eff; |
|
|
|
|
|
|
|
|
|
|
|
.container { |
|
|
|
.container { |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
@ -514,14 +551,14 @@ $lighterBlue: #409EFF; |
|
|
|
transition: transform 0ms !important; |
|
|
|
transition: transform 0ms !important; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.components-draggable{ |
|
|
|
.components-draggable { |
|
|
|
padding-bottom: 20px; |
|
|
|
padding-bottom: 20px; |
|
|
|
} |
|
|
|
} |
|
|
|
.components-title{ |
|
|
|
.components-title { |
|
|
|
font-size: 14px; |
|
|
|
font-size: 14px; |
|
|
|
color: #ffffff; |
|
|
|
color: #ffffff; |
|
|
|
margin: 6px 2px; |
|
|
|
margin: 6px 2px; |
|
|
|
.svg-icon{ |
|
|
|
.svg-icon { |
|
|
|
color: #666; |
|
|
|
color: #666; |
|
|
|
font-size: 18px; |
|
|
|
font-size: 18px; |
|
|
|
} |
|
|
|
} |
|
|
@ -534,7 +571,7 @@ $lighterBlue: #409EFF; |
|
|
|
cursor: move; |
|
|
|
cursor: move; |
|
|
|
border: 1px dashed #436efc; |
|
|
|
border: 1px dashed #436efc; |
|
|
|
border-radius: 3px; |
|
|
|
border-radius: 3px; |
|
|
|
.svg-icon{ |
|
|
|
.svg-icon { |
|
|
|
color: #777; |
|
|
|
color: #777; |
|
|
|
font-size: 15px; |
|
|
|
font-size: 15px; |
|
|
|
} |
|
|
|
} |
|
|
@ -554,15 +591,15 @@ $lighterBlue: #409EFF; |
|
|
|
top: 0; |
|
|
|
top: 0; |
|
|
|
height: 100vh; |
|
|
|
height: 100vh; |
|
|
|
} |
|
|
|
} |
|
|
|
.left-scrollbar{ |
|
|
|
.left-scrollbar { |
|
|
|
height: calc(100vh - 42px); |
|
|
|
height: calc(100vh - 42px); |
|
|
|
overflow: hidden; |
|
|
|
overflow: hidden; |
|
|
|
} |
|
|
|
} |
|
|
|
.center-scrollbar { |
|
|
|
.center-scrollbar { |
|
|
|
height: calc(100vh - 42px); |
|
|
|
height: calc(100vh - 42px); |
|
|
|
overflow: hidden; |
|
|
|
overflow: hidden; |
|
|
|
border-left: 1px solid #f1e8e8; |
|
|
|
border-left: 1px solid #0e5191; |
|
|
|
border-right: 1px solid #f1e8e8; |
|
|
|
border-left: 1px solid #0e5191; |
|
|
|
box-sizing: border-box; |
|
|
|
box-sizing: border-box; |
|
|
|
} |
|
|
|
} |
|
|
|
.center-board { |
|
|
|
.center-board { |
|
|
@ -571,7 +608,7 @@ $lighterBlue: #409EFF; |
|
|
|
margin: 0 350px 0 260px; |
|
|
|
margin: 0 350px 0 260px; |
|
|
|
box-sizing: border-box; |
|
|
|
box-sizing: border-box; |
|
|
|
} |
|
|
|
} |
|
|
|
.empty-info{ |
|
|
|
.empty-info { |
|
|
|
position: absolute; |
|
|
|
position: absolute; |
|
|
|
top: 46%; |
|
|
|
top: 46%; |
|
|
|
left: 0; |
|
|
|
left: 0; |
|
|
@ -581,27 +618,27 @@ $lighterBlue: #409EFF; |
|
|
|
color: #ccb1ea; |
|
|
|
color: #ccb1ea; |
|
|
|
letter-spacing: 4px; |
|
|
|
letter-spacing: 4px; |
|
|
|
} |
|
|
|
} |
|
|
|
.action-bar{ |
|
|
|
.action-bar { |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
|
height: 42px; |
|
|
|
height: 42px; |
|
|
|
text-align: right; |
|
|
|
text-align: right; |
|
|
|
padding: 0 15px; |
|
|
|
padding: 0 15px; |
|
|
|
box-sizing: border-box;; |
|
|
|
box-sizing: border-box; |
|
|
|
border: 1px solid #f1e8e8; |
|
|
|
border: 1px solid #0e5191; |
|
|
|
border-top: none; |
|
|
|
border-top: none; |
|
|
|
border-left: none; |
|
|
|
border-left: none; |
|
|
|
.delete-btn{ |
|
|
|
.delete-btn { |
|
|
|
color: #F56C6C; |
|
|
|
color: #f56c6c; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.logo-wrapper{ |
|
|
|
.logo-wrapper { |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
|
height: 42px; |
|
|
|
height: 42px; |
|
|
|
background: #4b6e91; |
|
|
|
background: #4b6e91; |
|
|
|
border-bottom: 1px solid #f1e8e8; |
|
|
|
border-bottom: 1px solid #0e5191; |
|
|
|
box-sizing: border-box; |
|
|
|
box-sizing: border-box; |
|
|
|
} |
|
|
|
} |
|
|
|
.logo{ |
|
|
|
.logo { |
|
|
|
position: absolute; |
|
|
|
position: absolute; |
|
|
|
left: 12px; |
|
|
|
left: 12px; |
|
|
|
top: 6px; |
|
|
|
top: 6px; |
|
|
@ -610,16 +647,16 @@ $lighterBlue: #409EFF; |
|
|
|
font-weight: 600; |
|
|
|
font-weight: 600; |
|
|
|
font-size: 17px; |
|
|
|
font-size: 17px; |
|
|
|
white-space: nowrap; |
|
|
|
white-space: nowrap; |
|
|
|
> img{ |
|
|
|
> img { |
|
|
|
width: 30px; |
|
|
|
width: 30px; |
|
|
|
height: 30px; |
|
|
|
height: 30px; |
|
|
|
vertical-align: top; |
|
|
|
vertical-align: top; |
|
|
|
} |
|
|
|
} |
|
|
|
.github{ |
|
|
|
.github { |
|
|
|
display: inline-block; |
|
|
|
display: inline-block; |
|
|
|
vertical-align: sub; |
|
|
|
vertical-align: sub; |
|
|
|
margin-left: 15px; |
|
|
|
margin-left: 15px; |
|
|
|
> img{ |
|
|
|
> img { |
|
|
|
height: 22px; |
|
|
|
height: 22px; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -662,32 +699,33 @@ $lighterBlue: #409EFF; |
|
|
|
background-color: $selectedColor; |
|
|
|
background-color: $selectedColor; |
|
|
|
} |
|
|
|
} |
|
|
|
.active-from-item { |
|
|
|
.active-from-item { |
|
|
|
& > .el-form-item{ |
|
|
|
& > .el-form-item { |
|
|
|
background: #4b6e91; |
|
|
|
background: #4b6e91; |
|
|
|
border-radius: 6px; |
|
|
|
border-radius: 6px; |
|
|
|
} |
|
|
|
} |
|
|
|
& > .drawing-item-copy, & > .drawing-item-delete{ |
|
|
|
& > .drawing-item-copy, |
|
|
|
|
|
|
|
& > .drawing-item-delete { |
|
|
|
display: initial; |
|
|
|
display: initial; |
|
|
|
} |
|
|
|
} |
|
|
|
& > .component-name{ |
|
|
|
& > .component-name { |
|
|
|
color: $lighterBlue; |
|
|
|
color: $lighterBlue; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.el-form-item{ |
|
|
|
.el-form-item { |
|
|
|
margin-bottom: 15px; |
|
|
|
margin-bottom: 15px; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.drawing-item{ |
|
|
|
.drawing-item { |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
|
cursor: move; |
|
|
|
cursor: move; |
|
|
|
&.unfocus-bordered:not(.activeFromItem) > div:first-child { |
|
|
|
&.unfocus-bordered:not(.activeFromItem) > div:first-child { |
|
|
|
border: 1px dashed #ccc; |
|
|
|
border: 1px dashed #ccc; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-form-item{ |
|
|
|
.el-form-item { |
|
|
|
padding: 12px 10px; |
|
|
|
padding: 12px 10px; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.drawing-row-item{ |
|
|
|
.drawing-row-item { |
|
|
|
position: relative; |
|
|
|
position: relative; |
|
|
|
cursor: move; |
|
|
|
cursor: move; |
|
|
|
box-sizing: border-box; |
|
|
|
box-sizing: border-box; |
|
|
@ -698,19 +736,19 @@ $lighterBlue: #409EFF; |
|
|
|
.drawing-row-item { |
|
|
|
.drawing-row-item { |
|
|
|
margin-bottom: 2px; |
|
|
|
margin-bottom: 2px; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-col{ |
|
|
|
.el-col { |
|
|
|
margin-top: 22px; |
|
|
|
margin-top: 22px; |
|
|
|
} |
|
|
|
} |
|
|
|
.el-form-item{ |
|
|
|
.el-form-item { |
|
|
|
margin-bottom: 0; |
|
|
|
margin-bottom: 0; |
|
|
|
} |
|
|
|
} |
|
|
|
.drag-wrapper{ |
|
|
|
.drag-wrapper { |
|
|
|
min-height: 80px; |
|
|
|
min-height: 80px; |
|
|
|
} |
|
|
|
} |
|
|
|
&.active-from-item{ |
|
|
|
&.active-from-item { |
|
|
|
border: 1px dashed $lighterBlue; |
|
|
|
border: 1px dashed $lighterBlue; |
|
|
|
} |
|
|
|
} |
|
|
|
.component-name{ |
|
|
|
.component-name { |
|
|
|
position: absolute; |
|
|
|
position: absolute; |
|
|
|
top: 0; |
|
|
|
top: 0; |
|
|
|
left: 0; |
|
|
|
left: 0; |
|
|
@ -720,17 +758,20 @@ $lighterBlue: #409EFF; |
|
|
|
padding: 0 6px; |
|
|
|
padding: 0 6px; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.drawing-item, .drawing-row-item{ |
|
|
|
.drawing-item, |
|
|
|
|
|
|
|
.drawing-row-item { |
|
|
|
&:hover { |
|
|
|
&:hover { |
|
|
|
& > .el-form-item{ |
|
|
|
& > .el-form-item { |
|
|
|
background: $selectedColor; |
|
|
|
background: $selectedColor; |
|
|
|
border-radius: 6px; |
|
|
|
border-radius: 6px; |
|
|
|
} |
|
|
|
} |
|
|
|
& > .drawing-item-copy, & > .drawing-item-delete{ |
|
|
|
& > .drawing-item-copy, |
|
|
|
|
|
|
|
& > .drawing-item-delete { |
|
|
|
display: initial; |
|
|
|
display: initial; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
& > .drawing-item-copy, & > .drawing-item-delete{ |
|
|
|
& > .drawing-item-copy, |
|
|
|
|
|
|
|
& > .drawing-item-delete { |
|
|
|
display: none; |
|
|
|
display: none; |
|
|
|
position: absolute; |
|
|
|
position: absolute; |
|
|
|
top: -10px; |
|
|
|
top: -10px; |
|
|
@ -744,29 +785,29 @@ $lighterBlue: #409EFF; |
|
|
|
cursor: pointer; |
|
|
|
cursor: pointer; |
|
|
|
z-index: 1; |
|
|
|
z-index: 1; |
|
|
|
} |
|
|
|
} |
|
|
|
& > .drawing-item-copy{ |
|
|
|
& > .drawing-item-copy { |
|
|
|
right: 56px; |
|
|
|
right: 56px; |
|
|
|
border-color: $lighterBlue; |
|
|
|
border-color: $lighterBlue; |
|
|
|
color: $lighterBlue; |
|
|
|
color: $lighterBlue; |
|
|
|
background: #fff; |
|
|
|
background: #fff; |
|
|
|
&:hover{ |
|
|
|
&:hover { |
|
|
|
background: $lighterBlue; |
|
|
|
background: $lighterBlue; |
|
|
|
color: #fff; |
|
|
|
color: #fff; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
& > .drawing-item-delete{ |
|
|
|
& > .drawing-item-delete { |
|
|
|
right: 24px; |
|
|
|
right: 24px; |
|
|
|
border-color: #F56C6C; |
|
|
|
border-color: #f56c6c; |
|
|
|
color: #F56C6C; |
|
|
|
color: #f56c6c; |
|
|
|
background: #fff; |
|
|
|
background: #fff; |
|
|
|
&:hover{ |
|
|
|
&:hover { |
|
|
|
background: #F56C6C; |
|
|
|
background: #f56c6c; |
|
|
|
color: #fff; |
|
|
|
color: #fff; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.delete-btn::before, |
|
|
|
.delete-btn::before, |
|
|
|
.delete-btn::after{ |
|
|
|
.delete-btn::after { |
|
|
|
display: none !important; |
|
|
|
display: none !important; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |
|
|
|
</style> |
|
|
|