yanzili 3 years ago
commit 09172e102c

@ -13,6 +13,7 @@
},
"dependencies": {
"@ckeditor/ckeditor5-build-decoupled-document": "^23.1.0",
"@smallwei/avue": "^2.8.14",
"axios": "0.18.0",
"chokidar": "^3.5.2",
"codemirror": "^5.58.1",

@ -27,6 +27,10 @@ import '@/permission'
import '@/extend'
import Avue from '@smallwei/avue';
import '@smallwei/avue/lib/index.css';
Vue.use(Avue);
// enable element zh-cn
Vue.use(ElementUI, { zhLocale })

@ -7,182 +7,242 @@
!-->
<template>
<div class="collapse-input-style">
<el-form label-width="80px"
label-position="left">
<el-form label-width="80px" label-position="left">
<template v-for="(item, index) in options">
<div v-if="isShowForm(item, '[object Object]')"
:key="index">
<el-form-item v-if="inputShow[item.name]"
<div v-if="isShowForm(item, '[object Object]')" :key="index">
<el-form-item
v-if="inputShow[item.name]"
:label="item.label"
:prop="item.name"
:required="item.required">
<el-input-number v-if="item.type == 'el-input-number'"
:required="item.required"
>
<el-input-number
v-if="item.type == 'el-input-number'"
size="mini"
style="width:100%"
v-model="formData[item.name]"
controls-position="right"
:placeholder="item.placeholder"
@change="changed($event, item.name)" />
@change="changed($event, item.name)"
/>
<el-input v-if="item.type == 'el-input-text'"
<el-input
v-if="item.type == 'el-input-text'"
v-model.trim="formData[item.name]"
type="text"
size="mini"
placeholder="请输入内容"
clearable
@change="changed($event, item.name)" />
@change="changed($event, item.name)"
/>
<el-input v-if="item.type == 'el-input-textarea'"
<el-input
v-if="item.type == 'el-input-textarea'"
v-model.trim="formData[item.name]"
type="textarea"
size="mini"
rows="2"
placeholder="请输入内容"
@change="changed($event, item.name)" />
@change="changed($event, item.name)"
/>
<el-switch v-if="item.type == 'el-switch'"
<el-switch
v-if="item.type == 'el-switch'"
v-model="formData[item.name]"
size="mini"
placeholder="请输入内容"
@change="changed($event, item.name)" />
@change="changed($event, item.name)"
/>
<ColorPicker v-if="item.type == 'vue-color'"
<ColorPicker
v-if="item.type == 'vue-color'"
v-model="formData[item.name]"
@change="(val) => changed(val, item.name)" />
@change="val => changed(val, item.name)"
/>
<el-upload v-if="item.type == 'el-upload-picture'"
<el-upload
v-if="item.type == 'el-upload-picture'"
size="mini"
action="https://jsonplaceholder.typicode.com/posts/"
list-type="picture-card" />
list-type="picture-card"
/>
<el-radio-group v-if="item.type == 'el-radio-group'"
<el-radio-group
v-if="item.type == 'el-radio-group'"
v-model="formData[item.name]"
@change="(val) => changed(val, item.name)">
<el-radio v-for="itemChild in item.selectOptions"
@change="val => changed(val, item.name)"
>
<el-radio
v-for="itemChild in item.selectOptions"
:key="itemChild.code"
:label="itemChild.code">{{ itemChild.name }}</el-radio>
:label="itemChild.code"
>{{ itemChild.name }}</el-radio
>
</el-radio-group>
<el-select v-if="item.type == 'el-select'"
<el-select
v-if="item.type == 'el-select'"
size="mini"
v-model="formData[item.name]"
clearable
placeholder="请选择"
@change="(val) => changed(val, item.name)">
<el-option v-for="itemChild in item.selectOptions"
@change="val => changed(val, item.name)"
>
<el-option
v-for="itemChild in item.selectOptions"
:key="itemChild.code"
:label="itemChild.name"
:value="itemChild.code" />
:value="itemChild.code"
/>
</el-select>
<el-slider v-if="item.type == 'el-slider'"
<el-slider
v-if="item.type == 'el-slider'"
v-model="formData[item.name]"
@change="(val) => changed(val, item.name)" />
@change="val => changed(val, item.name)"
/>
<el-button v-if="item.type == 'el-button'"
<el-button
v-if="item.type == 'el-button'"
type="primary"
plain
@click="addStaticData">编辑</el-button>
@click="addStaticData"
>编辑</el-button
>
<!-- 弹窗 -->
<el-dialog title="代码编辑"
<el-dialog
title="代码编辑"
:visible.sync="dialogVisibleStaticData"
width="50%"
:before-close="handleClose">
<codemirror v-model.trim="formData[item.name]"
:before-close="handleClose"
>
<codemirror
v-model.trim="formData[item.name]"
class="code-mirror"
:options="optionsJavascript"
style="height: 190px" />
<span slot="footer"
class="dialog-footer">
<el-button @click="dialogVisibleStaticData = false"> </el-button>
<el-button type="primary"
@click="saveData"> </el-button>
style="height: 190px"
/>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisibleStaticData = false"
> </el-button
>
<el-button type="primary" @click="saveData"> </el-button>
</span>
</el-dialog>
</el-form-item>
<dynamicComponents v-if="item.type == 'dycustComponents' && inputShow[item.name]"
<dynamicComponents
v-if="item.type == 'dycustComponents' && inputShow[item.name]"
v-model="formData[item.name]"
:chart-type="item.chartType" />
:chart-type="item.chartType"
/>
</div>
<div v-else-if="isShowForm(item, '[object Array]')"
:key="'a-' + index">
<div v-else-if="isShowForm(item, '[object Array]')" :key="'a-' + index">
<el-collapse accordion>
<el-collapse-item v-for="(itemChild, indexChild) in item"
<el-collapse-item
v-for="(itemChild, indexChild) in item"
:key="indexChild"
:title="itemChild.name"
:name="indexChild">
:name="indexChild"
>
<template v-for="(itemChildList, idx) in itemChild.list">
<el-form-item :key="idx"
<el-form-item
:key="idx"
:label="itemChildList.label"
:prop="itemChildList.name"
:required="itemChildList.required">
<el-input-number v-if="itemChildList.type == 'el-input-number'"
:required="itemChildList.required"
>
<el-input-number
v-if="itemChildList.type == 'el-input-number'"
size="mini"
style="width:100%"
v-model="formData[itemChildList.name]"
controls-position="right"
:placeholder="itemChildList.placeholder"
@change="changed($event, itemChildList.name)" />
@change="changed($event, itemChildList.name)"
/>
<el-input v-if="itemChildList.type == 'el-input-text'"
<el-input
v-if="itemChildList.type == 'el-input-text'"
v-model.trim="formData[itemChildList.name]"
type="text"
size="mini"
placeholder="请输入内容"
clearable
@change="changed($event, itemChildList.name)" />
@change="changed($event, itemChildList.name)"
/>
<el-input v-if="itemChildList.type == 'el-input-textarea'"
<el-input
v-if="itemChildList.type == 'el-input-textarea'"
v-model.trim="formData[itemChildList.name]"
size="mini"
type="textarea"
rows="2"
placeholder="请输入内容"
@change="changed($event, itemChildList.name)" />
@change="changed($event, itemChildList.name)"
/>
<el-switch v-if="itemChildList.type == 'el-switch'"
<el-switch
v-if="itemChildList.type == 'el-switch'"
v-model="formData[itemChildList.name]"
placeholder="请输入内容"
size="mini"
@change="changed($event, itemChildList.name)" />
@change="changed($event, itemChildList.name)"
/>
<ColorPicker v-if="itemChildList.type == 'vue-color'"
<ColorPicker
v-if="itemChildList.type == 'vue-color'"
v-model="formData[itemChildList.name]"
@change="(val) => changed(val, itemChildList.name)" />
@change="val => changed(val, itemChildList.name)"
/>
<el-upload v-if="itemChildList.type == 'el-upload-picture'"
<el-upload
v-if="itemChildList.type == 'el-upload-picture'"
size="mini"
action="https://jsonplaceholder.typicode.com/posts/"
list-type="picture-card" />
list-type="picture-card"
/>
<el-radio-group v-if="itemChildList.type == 'el-radio-group'"
<el-radio-group
v-if="itemChildList.type == 'el-radio-group'"
v-model="formData[itemChildList.name]"
@change="(val) => changed(val, itemChildList.name)">
<el-radio v-for="it in itemChildList.selectOptions"
@change="val => changed(val, itemChildList.name)"
>
<el-radio
v-for="it in itemChildList.selectOptions"
:key="it.code"
:label="it.code">{{ it.name }}</el-radio>
:label="it.code"
>{{ it.name }}</el-radio
>
</el-radio-group>
<el-select v-if="itemChildList.type == 'el-select'"
<el-select
v-if="itemChildList.type == 'el-select'"
size="mini"
v-model="formData[itemChildList.name]"
clearable
placeholder="请选择"
@change="(val) => changed(val, itemChildList.name)">
<el-option v-for="it in itemChildList.selectOptions"
@change="val => changed(val, itemChildList.name)"
>
<el-option
v-for="it in itemChildList.selectOptions"
:key="it.code"
:label="it.name"
:value="it.code" />
:value="it.code"
/>
</el-select>
<el-slider v-if="itemChildList.type == 'el-slider'"
<el-slider
v-if="itemChildList.type == 'el-slider'"
v-model="formData[itemChildList.name]"
@change="(val) => changed(val, itemChildList.name)" />
@change="val => changed(val, itemChildList.name)"
/>
</el-form-item>
<customColorComponents v-if="itemChildList.type == 'customColor'"
<customColorComponents
v-if="itemChildList.type == 'customColor'"
:key="'b-' + idx"
v-model="formData[itemChildList.name]" />
v-model="formData[itemChildList.name]"
/>
</template>
</el-collapse-item>
</el-collapse>
@ -193,44 +253,44 @@
</template>
<script>
import ColorPicker from './colorPicker.vue'
import { codemirror } from 'vue-codemirror' // codeMirror
import 'codemirror/lib/codemirror.css' //
import 'codemirror/theme/cobalt.css' // options
import ColorPicker from "./colorPicker.vue";
import { codemirror } from "vue-codemirror"; // codeMirror
import "codemirror/lib/codemirror.css"; //
import "codemirror/theme/cobalt.css"; // options
// language
import 'codemirror/mode/vue/vue.js'
import 'codemirror/mode/javascript/javascript.js'
import 'codemirror/mode/sql/sql.js'
import 'codemirror/mode/shell/shell.js'
import dynamicComponents from './dynamicComponents.vue'
import customColorComponents from './customColorComponents'
import "codemirror/mode/vue/vue.js";
import "codemirror/mode/javascript/javascript.js";
import "codemirror/mode/sql/sql.js";
import "codemirror/mode/shell/shell.js";
import dynamicComponents from "./dynamicComponents.vue";
import customColorComponents from "./customColorComponents";
export default {
name: 'DynamicForm',
name: "DynamicForm",
components: {
ColorPicker,
codemirror,
dynamicComponents,
customColorComponents,
customColorComponents
},
model: {
prop: 'value',
event: 'input',
prop: "value",
event: "input"
},
props: {
options: Array,
value: {
type: [Object],
default: () => { },
},
default: () => {}
}
},
data () {
data() {
return {
formData: {},
inputShow: {}, //
dialogVisibleStaticData: false,
validationRules: '',
validationRules: "",
optionsJavascript: {
mode: 'text/javascript',
mode: "text/javascript",
tabSize: 2, //
// theme: 'cobalt', // monokai JS
lineNumbers: true, //
@ -238,104 +298,106 @@ export default {
styleActiveLine: true, //
hintOptions: {
completeSingle: true, //
},
},
completeSingle: true //
}
}
};
},
watch: {
value (newValue, oldValue) {
this.formData = newValue || {}
},
options () {
this.setDefaultValue()
this.isShowData()
},
formData: {
handler () {
this.$emit('onChanged', this.formData)
},
deep: true,
value(newValue, oldValue) {
this.formData = newValue || {};
},
options(val) {
this.setDefaultValue();
this.isShowData();
}
// formData: {
// handler () {
// this.$emit('onChanged', this.formData)
// },
// deep: true,
// },
},
created () {
this.isShowData()
this.setDefaultValue()
created() {
this.isShowData();
this.setDefaultValue();
},
mounted () { },
mounted() {},
methods: {
//
changed (val, key) {
changed(val, key) {
if (val.extend) {
this.$set(this.formData, key, val.value)
this.$set(this.formData, key, val.value);
} else {
this.$set(this.formData, key, val)
this.$set(this.formData, key, val);
}
this.$emit('onChanged', this.formData)
this.$emit("onChanged", this.formData);
// key
for (var i = 0; i < this.options.length; i++) {
var item = this.options[i]
var item = this.options[i];
if (item.relactiveDom == key) {
this.inputShow[item.name] = val == item.relactiveDomValue
this.inputShow = Object.assign({}, this.inputShow)
this.inputShow[item.name] = val == item.relactiveDomValue;
this.inputShow = Object.assign({}, this.inputShow);
}
}
},
saveData () {
this.$emit('onChanged', this.formData)
this.dialogVisibleStaticData = false
saveData() {
this.$emit("onChanged", this.formData);
this.dialogVisibleStaticData = false;
},
//
addStaticData () {
this.dialogVisibleStaticData = true
addStaticData() {
this.dialogVisibleStaticData = true;
},
handleClose () {
this.dialogVisibleStaticData = false
handleClose() {
this.dialogVisibleStaticData = false;
},
//
isShowData () {
let currentData = {}
const data = []
isShowData() {
let currentData = {};
const data = [];
for (let i = 0; i < this.options.length; i++) {
// inputShow
this.inputShow[this.options[i].name] = true
this.inputShow[this.options[i].name] = true;
if (this.options[i].selectValue) {
currentData = this.options[i]
currentData = this.options[i];
} else {
data.push(this.options[i])
data.push(this.options[i]);
}
}
data.forEach((el) => {
data.forEach(el => {
if (el.relactiveDomValue != currentData.value) {
this.inputShow[el.name] = false
this.inputShow[el.name] = false;
}
})
});
},
//
setDefaultValue () {
setDefaultValue() {
if (this.options && this.options.length > 0) {
for (let i = 0; i < this.options.length; i++) {
const obj = this.options[i]
if (Object.prototype.toString.call(obj) == '[object Object]') {
this.formData[this.options[i].name] = this.deepClone(this.options[i].value)
} else if (Object.prototype.toString.call(obj) == '[object Array]') {
const obj = this.options[i];
if (Object.prototype.toString.call(obj) == "[object Object]") {
this.formData[this.options[i].name] = this.deepClone(
this.options[i].value
);
} else if (Object.prototype.toString.call(obj) == "[object Array]") {
for (let j = 0; j < obj.length; j++) {
const list = obj[j].list
list.forEach((el) => {
this.formData[el.name] = el.value
})
const list = obj[j].list;
list.forEach(el => {
this.formData[el.name] = el.value;
});
}
}
}
this.formData = Object.assign({}, this.formData)
this.formData = Object.assign({}, this.formData);
}
},
//
isShowForm (val, type) {
return Object.prototype.toString.call(val) == type
},
},
}
isShowForm(val, type) {
return Object.prototype.toString.call(val) == type;
}
}
};
</script>
<style scoped lang="scss">

@ -84,6 +84,7 @@
width: bigscreenWidthInWorkbench + 'px',
height: bigscreenHeightInWorkbench + 'px'
}"
@mousedown="handleMouseDown"
>
<vue-ruler-tool
v-model="dashboard.presetLine"
@ -110,9 +111,10 @@
'background-origin': 'initial',
'background-clip': 'initial'
}"
@click="setOptionsOnClickScreen"
@click.self="setOptionsOnClickScreen"
>
<widget
ref="widgets"
v-for="(widget, index) in widgets"
:key="index"
v-model="widget.value"
@ -121,6 +123,7 @@
:bigscreen="{ bigscreenWidth, bigscreenHeight }"
@onActivated="setOptionsOnClickWidget"
@contextmenu.prevent.native="rightClick($event, index)"
@click.prevent.native="widgetsClick(index)"
/>
</div>
</vue-ruler-tool>
@ -519,27 +522,41 @@ export default {
},
//
setOptionsOnClickWidget(index) {
//
this.activeName = "first";
this.screenCode = "";
if (typeof index == "number") {
if (index < 0 || index >= this.widgets.length) {
setOptionsOnClickWidget(obj) {
if (obj.index < 0 || obj.index >= this.widgets.length) {
return;
}
this.widgetIndex = index;
this.widgetOptions = this.deepClone(this.widgets[index]["options"]);
return;
this.widgetIndex = obj.index;
this.widgetOptions = this.deepClone(this.widgets[obj.index]["options"]);
this.widgets[obj.index].value.position = obj;
this.widgets[obj.index].options.position.forEach(el => {
for (const key in obj) {
if (el.name == key) {
el.value = obj[key];
}
}
});
console.log(this.widgets);
},
widgetsClick(index) {
const draggableArr = this.$refs.widgets;
for (let i = 0; i < draggableArr.length; i++) {
if (i == index) {
this.$refs.widgets[i].$refs.draggable.setActive(true);
} else {
//
this.widgets[index.index].value.position = index.obj;
this.$refs.widgets[i].$refs.draggable.setActive(false);
}
}
},
handleMouseDown() {
console.log(1);
const draggableArr = this.$refs.widgets;
for (let i = 0; i < draggableArr.length; i++) {
this.$refs.widgets[i].$refs.draggable.setActive(false);
}
},
//
widgetValueChanged(key, val) {
console.log(key);
console.log(val);
/* this.widgets this.widgetIndex value
widgets: [{
type: 'widget-text',
@ -559,7 +576,6 @@ export default {
this.setDefaultValue(this.widgets[i].options[key], val);
}
}
console.log(this.widgets);
},
rightClick(event, index) {
this.rightClickIndex = index;

@ -5,47 +5,21 @@
* @Last Modified time: 2021-3-13 11:04:24
!-->
<template>
<!-- <vue-draggable-resizable class="vue-draggalbe" :w="data.position.width" :h="data.position.height" :x="data.position.left" :y="data.position.top" :z="data.position.zIndex" :parent="true" :is-conflict-check="true" :snap="true" :resizable="true" :draggable="true" :prevent-deactivation="false" :active="true" :snap-tolerance="20" :class-name="'widget-container'" :class-name-active="'widget-active'" @activated="onActivated(index)" @resizestop="onResizstop" @dragstop="onDragstop">
<component :is="type" :value="value" />
</vue-draggable-resizable> -->
<div @click.stop>
<vue-drag-resize
:w="widgetsWidth"
:h="widgetsHeight"
:x="widgetsLeft"
:y="widgetsTop"
:z="widgetsZIndex"
:minw="10"
:minh="10"
:parent-w="bigscreen.bigscreenWidth"
:parent-h="bigscreen.bigscreenHeight"
:snap-tolerance="20"
:is-conflict-check="true"
:class-name="'widget-container'"
:class-name-active="'widget-active'"
:prevent-deactivation="false"
:is-active="true"
:is-draggable="true"
:is-resizable="true"
:parent-limitation="true"
:snap-to-grid="false"
:aspect-ratio="false"
@clicked="onActivated(index)"
@activated="onActivated(index)"
@dragstop="ev => onDragstop(ev, index)"
@resizing="ev => onResizing(ev, index)"
<avue-draggable
:width="widgetsWidth"
:height="widgetsHeight"
:left="widgetsLeft"
:top="widgetsTop"
ref="draggable"
:index="index"
@focus="handleFocus"
@blur="handleBlur"
>
<component :is="type" :value="value" />
</vue-drag-resize>
</div>
</avue-draggable>
</template>
<script>
// https://gitee.com/charact/vue-draggable-resizable-gorkys#dragstop
// import VueDraggableResizable from 'vue-draggable-resizable-gorkys'
// import 'vue-draggable-resizable-gorkys/dist/VueDraggableResizable.css'
import VueDragResize from "vue-drag-resize";
import widgetHref from "./widgetHref.vue";
import widgetText from "./widgetText.vue";
import WidgetMarquee from "./widgetMarquee.vue";
@ -65,8 +39,6 @@ import WidgetGauge from "./widgetGauge.vue";
export default {
name: "Widget",
components: {
// VueDraggableResizable,
VueDragResize,
widgetHref,
widgetText,
WidgetMarquee,
@ -129,14 +101,14 @@ export default {
},
mounted() {},
methods: {
onActivated(index) {
this.$emit("onActivated", index);
//
handleFocus({ index, left, top, width, height }) {
// console.log(index, left, top, width, height);
},
onDragstop(obj, index) {
this.$emit("onActivated", { index, obj });
},
onResizing(obj, index) {
this.$emit("onActivated", { index, obj });
//
handleBlur({ index, left, top, width, height }) {
this.$emit("onActivated", { index, left, top, width, height });
this.$refs.draggable.setActive(true);
}
}
};
@ -153,4 +125,7 @@ export default {
border: 1px dashed #09f;
background-color: rgba(115, 170, 229, 0.5);
}
.avue-draggable {
padding: 0 !important;
}
</style>

@ -335,8 +335,6 @@ export default {
.echarts {
width: 100%;
height: 100%;
min-width: 200px;
min-height: 200px;
overflow: hidden;
}
</style>

@ -26,7 +26,6 @@ export default {
return this.objToOne(this.options);
},
styleColor() {
console.log(this.transStyle);
return {
position: this.ispreview ? "absolute" : "static",
color: this.transStyle.color,

Loading…
Cancel
Save