feat: 仪表板编辑

This commit is contained in:
fit2cloud-chenyw 2021-03-23 17:16:51 +08:00
parent 1c6b6336fb
commit 1e21d68157
6 changed files with 60 additions and 137 deletions

View File

@ -0,0 +1,3 @@
import Vue from 'vue'
const bus = new Vue()
export default bus

View File

@ -2,15 +2,15 @@
<el-row class="panel-design-show">
<div class="container" :style="panelDetails.gridStyle">
<vue-drag-resize-rotate
v-for="panelDesign in panelDetails.panelDesigns"
v-show="panelDesign.keepFlag"
:key="panelDesign.id"
:panel-design="panelDesign"
v-for="item in panelDetails.panelDesigns"
v-show="item.keepFlag"
:key="item.id"
:panel-design="item"
:parent="true"
@newStyle="newStyle"
>
<!--视图显示 panelDesign.componentType==='view'-->
<chart-component v-if="panelDesign.componentType==='view'" :ref="panelDesign.id" :chart-id="panelDesign.id" :chart="panelDesign.chartView" />
<chart-component v-if="item.componentType==='view'" :ref="item.id" :chart-id="item.id" :chart="item.chartView" />
<!--组件显示待开发-->
@ -24,9 +24,9 @@ import { post, get } from '@/api/panel/panel'
import ChartComponent from '@/views/chart/components/ChartComponent'
import VueDragResizeRotate from '@/components/vue-drag-resize-rotate'
import { uuid } from 'vue-uuid'
import bus from '@/utils/bus'
export default {
name: 'PanelViewShow',
name: 'DrawingBoard',
components: { ChartComponent, VueDragResizeRotate },
data() {
return {
@ -56,17 +56,27 @@ export default {
this.panelDesign(newVal.id)
}
},
created() {
// this.get(this.$store.state.chart.viewId);
},
mounted() {
const panelId = this.$store.state.panel.panelInfo.id
if (panelId) {
this.panelDesign(panelId)
}
bus.$on('panel-drawing-load', (panelId) => {
panelId && this.panelDesign(panelId)
})
bus.$on('panel-view-add', (view) => {
view && this.panelViewAdd(view)
})
bus.$on('panel-drawing-save', () => {
this.savePanel()
})
bus.$on('panel-drawing-preview', () => {
this.preViewShow()
})
},
activated() {
},
methods: {
//
@ -97,20 +107,12 @@ export default {
}
})
},
// removeView(panelDesignId) {
// this.panelDetails.panelDesigns.forEach(function(panelDesign, index) {
// if (panelDesign.id === panelDesignId) {
// panelDesign.keepFlag = false
// }
// })
// },
newStyle(viewId, newStyleInfo) {
this.$nextTick(() => {
this.$refs[viewId][0].chartResize()
})
this.panelInfo.preStyle = JSON.stringify(newStyleInfo)
console.log(viewId)
console.log(JSON.stringify(newStyleInfo))
},
//

View File

@ -33,6 +33,7 @@
<script>
import { tree } from '@/api/panel/view'
import { addClass, removeClass } from '@/utils'
import bus from '@/utils/bus'
export default {
name: 'ViewSelect',
data() {
@ -81,7 +82,7 @@ export default {
},
renderNode(h, { node, data, store }) {
return (
<div class='custom-tree-node' on-click={() => this.detail(data)} >
<div class='custom-tree-node' on-click={() => this.detail(data)} on-dblclick={() => this.addView2Drawing(data.id)} >
<span class='label-span'>{node.label}</span>
{data.type !== 'group' && data.type !== 'scene' ? (
@ -99,6 +100,14 @@ export default {
closeDetail() {
this.showdetail = false
this.detailItem = null
},
addView2Drawing(viewId) {
// viewInfo(viewId).then(res => {
// const info = res.data
// this.$emit('panel-view-add', info)
// })
bus.$emit('panel-view-add', { id: viewId })
// this.$emit('panel-view-add', viewId)
}
}
}

View File

@ -18,6 +18,10 @@
<el-button class="el-icon-full-screen" size="mini" circle />
</el-tooltip>
<el-tooltip content="保存">
<el-button class="el-icon-circle-check" size="mini" circle @click="saveDrawing" />
</el-tooltip>
<el-tooltip content="预览">
<el-button class="el-icon-view" size="mini" circle @click="save" />
</el-tooltip>
@ -95,6 +99,7 @@ import { addClass, removeClass } from '@/utils'
import FilterGroup from '../filter'
import ViewSelect from '../ViewSelect'
import DrawingBoard from '../DrawingBoard'
import bus from '@/utils/bus'
export default {
components: {
DeMainContainer,
@ -160,6 +165,9 @@ export default {
const body = document.querySelector('body')
body.insertBefore(elx, body.firstChild)
})
},
saveDrawing() {
bus.$emit('panel-drawing-save')
}
}

View File

@ -495,6 +495,7 @@ export default {
this.authVisible = false
},
edit(data) {
this.$store.dispatch('panel/setPanelInfo', data)
this.$router.replace('/panelEdit')
}
}

View File

@ -12,21 +12,22 @@
</span>
<span style="float: right;line-height: 40px;">
<el-tooltip content="返回目录">
<el-button class="el-icon-refresh-left" size="mini" circle />
</el-tooltip>
<el-tooltip content="背景图">
<el-button class="el-icon-full-screen" size="mini" circle />
</el-tooltip>
<!-- <el-tooltip content="保存">
<el-button class="el-icon-success" size="mini" circle @click="savePanel" />
</el-tooltip> -->
<el-tooltip content="预览">
<el-button class="el-icon-view" size="mini" circle @click="save" />
<el-button class="el-icon-view" size="mini" circle @click="preViewShow" />
</el-tooltip>
</span>
</el-row>
<el-row class="panel-design-show">
<drawing-board />
<!-- <el-row class="panel-design-show">
<div class="container" :style="panelDetails.gridStyle">
<vue-drag-resize-rotate
v-for="panelDesign in panelDetails.panelDesigns"
@ -36,43 +37,26 @@
:parent="true"
@newStyle="newStyle"
>
<!--视图显示 panelDesign.componentType==='view'-->
<chart-component v-if="panelDesign.componentType==='view'" :ref="panelDesign.id" :chart-id="panelDesign.id" :chart="panelDesign.chartView" />
<!--组件显示待开发-->
</vue-drag-resize-rotate>
</div>
</el-row></el-col>
</el-row> -->
</el-col>
</el-row>
</el-row>
</template>
<script>
import { post, get } from '@/api/panel/panel'
import ChartComponent from '../../chart/components/ChartComponent'
import VueDragResizeRotate from '@/components/vue-drag-resize-rotate'
import { uuid } from 'vue-uuid'
import DrawingBoard from '../DrawingBoard'
import bus from '@/utils/bus'
export default {
name: 'PanelViewShow',
components: { ChartComponent, VueDragResizeRotate },
components: { DrawingBoard },
data() {
return {
panelDetails: {
viewsUsable: [],
panelDesigns: [],
gridStyle: null
},
gridStyleDefault: {
position: 'relative',
height: '100%',
width: '100%',
backgroundColor: '#f2f2f2',
// background: 'linear-gradient(-90deg, rgba(0, 0, 0, .1) 1px, transparent 1px), linear-gradient(rgba(0, 0, 0, .1) 1px, transparent 1px)',
backgroundSize: '20px 20px, 20px 20px'
},
ViewActiveName: 'Views'
}
},
computed: {
@ -80,97 +64,13 @@ export default {
return this.$store.state.panel.panelInfo
}
},
watch: {
panelInfo(newVal, oldVal) {
this.panelDesign(newVal.id)
}
},
created() {
// this.get(this.$store.state.chart.viewId);
},
mounted() {
const panelId = this.$store.state.panel.panelInfo.id
if (panelId) {
this.panelDesign(panelId)
}
},
activated() {
},
methods: {
//
// panel design
panelDesign(panelId) {
get('panel/group/findOne/' + panelId).then(res => {
const panelDetailsInfo = res.data
if (panelDetailsInfo) {
this.panelDetails = panelDetailsInfo
}
if (!panelDetailsInfo.gridStyle) {
this.panelDetails.gridStyle = this.gridStyleDefault
}
})
},
panelViewAdd(view) {
const panelDesigns = this.panelDetails.panelDesigns
this.panelDetails.viewsUsable.forEach(function(item, index) {
if (item.id === view.id) {
const newComponent = {
id: uuid.v1(),
keepFlag: true,
chartView: item,
componentType: 'view',
styleInit: false
}
panelDesigns.push(newComponent)
}
})
},
// removeView(panelDesignId) {
// this.panelDetails.panelDesigns.forEach(function(panelDesign, index) {
// if (panelDesign.id === panelDesignId) {
// panelDesign.keepFlag = false
// }
// })
// },
newStyle(viewId, newStyleInfo) {
this.$nextTick(() => {
this.$refs[viewId][0].chartResize()
})
this.panelInfo.preStyle = JSON.stringify(newStyleInfo)
console.log(viewId)
console.log(JSON.stringify(newStyleInfo))
},
//
start1(e) {
console.log(e)
},
end1(e) {
console.log(e)
},
//
start2(e) {
console.log(e)
},
end2(e) {
console.log(e)
},
// move
onMove(e, originalEvent) {
console.log(e)
return true
},
preViewShow() {
bus.$emit('panel-drawing-preview')
},
savePanel() {
post('panel/group/saveGroupWithDesign', this.panelDetails, () => {
})
this.$success(this.$t('commons.save_success'))
},
save() {
bus.$emit('panel-drawing-save')
}
}
}