diff --git a/nezha-fronted/src/assets/stylus/main.scss b/nezha-fronted/src/assets/stylus/main.scss index e35a498c9..8ef04ff18 100644 --- a/nezha-fronted/src/assets/stylus/main.scss +++ b/nezha-fronted/src/assets/stylus/main.scss @@ -1188,7 +1188,7 @@ li{ border-top: 1px solid #ccc; text-align: center; } -.right-box-bottom-btns :nth-child(2) { +.right-box-bottom-btns :not(:first-child){ margin-left: 40px; } /* end--右侧弹框--底部按钮*/ diff --git a/nezha-fronted/src/components/charts/chart-list.vue b/nezha-fronted/src/components/charts/chart-list.vue index a337701e3..1735c1c67 100644 --- a/nezha-fronted/src/components/charts/chart-list.vue +++ b/nezha-fronted/src/components/charts/chart-list.vue @@ -12,38 +12,34 @@ width: calc(100% - 14px); overflow-x:hidden;/*避免鼠标第一次放到曲线时,x轴出现滚动条后消失*/ } - .dragChartClass{ - cursor:move;/* + .drag-chart-class{ + cursor:move !important; + /* border:solid 2px yellow; color:yellow; - background-color:yellow; - opacity:1;*/ + background-color:yellow !important; + */ /*background-color:red; opacity:1*/ } - .chooseClass{ - cursor:move;/* - border:solid 2px purple; + .choose-class{ + cursor:move; + /* border:solid 2px purple; color:purple; background-color:purple;*/ } - .chosenClass .chartTitle{/* - color:orange; - border:solid 2px orange;*/ + .chosen-class .chartTitle{ } .fallback-class{ cursor:move; /*background-color:green; cursor:pointer;*/ } - .chart-ghost-class{ - /*opacity:1*/ - } - .ghost {/* + .chart-ghost { + /* opacity: 1; border:solid 2px green; - color:green; - background-color:green;*/ + */ } @@ -55,22 +51,41 @@ @dragstart="handleDragStart($event, item)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item)" - @dragend="handleDragEnd($event, item)" ,ghostClass:'' {scroll:true,forceFallback:true,animation:600,handle:'.drag-icon' ---> - @clone="clone" + --> + -
+
- +
@@ -143,11 +158,36 @@ export default { chartTitle.style.background = '#d8dce1'; console.log('start-title',chartTitle); //this.dataListDragTmp = [...this.dataList]; + let dragClass = document.querySelector('.drag-chart-class');//drag-chart-class:yellow chart-ghost:green fallback-class choose-class:purple + console.log('start---class', dragClass); + //dragClass.style.opacity = 1; + //dragClass.style.pointerEvents = 'auto'; +/* + let canvas = item.querySelector('canvas'); + console.log('start-canvas',canvas); + let canvasclone = event.clone.querySelector('canvas'); + console.log('start-canvas-style',canvasclone.style); + canvasclone.style.border='solid 2px green !importmant'; + console.log('start-canvas-style2',canvasclone.style); + if(canvas&&canvasclone) { + let ctx = canvas.getContext("2d"); + let image = new Image(); + image.src = canvas.toDataURL(); + //var a = document.createElement("a"); + //a.href=canvas.toDataURL(); + //a.download="drcQrcode"; + //a.click(); + console.log('clone-image', image) + let ctxClone = canvasclone.getContext("2d"); + image.onload = function () { + console.log('clone-image-load', image) + //ctxClone.drawImage(image, 0, 0); + } + } + */ }, end (event) { let item = event.item; - let chartTitle = item.querySelector('.chartTitle'); - chartTitle.style.background = ''; console.log('end', event, this.dataList); /* let len = this.dataListDragTmp.length; @@ -187,8 +227,10 @@ export default { */ let newIndex = event.newIndex; let newItem = this.dataList[newIndex]; - - if(newIndex===0){//挪动之后为第一个元素 + if(this.dataList.length===1){ + newItem.prev = 0; + newItem.next = -1; + }else if(newIndex===0){//挪动之后为第一个元素 let newNextItem = this.dataList[newIndex+1]; newItem.prev = 0; newItem.next = newNextItem.id; @@ -223,11 +265,112 @@ export default { } } }); + + let chartTitle = item.querySelector('.chartTitle'); + chartTitle.style.background = ''; }, move (event, orgin) { - console.log('move', event, orgin) + console.log('move', event, orgin); + let dragClass = document.querySelector('.drag-chart-class');//drag-chart-class:yellow chart-ghost:green fallback-class choose-class:purple + console.log('move---class', dragClass); + //dragClass.style.opacity = 1; + //dragClass.style.pointerEvents = 'auto';//设置此属性,end事件里newIndex为 列表长度 + + let chartTitle = dragClass.querySelector('.chartTitle'); + console.log('move-title',chartTitle); + chartTitle.style.background = '#d8dce1'; + + }, + choose(event ){ + console.log('choose', event); + let chartTitle = event.item.querySelector('.chartTitle'); + console.log('choose-title',chartTitle); + chartTitle.style.background = '#d8dce1'; + }, + clone(event){ + console.log('clone',event ); + let canvas = event.item.querySelector('canvas'); + console.log('clone-canvas',canvas); + let canvasclone = event.clone.querySelector('canvas'); + canvasclone.style.border='solid 1px yellow'; + console.log('clone-canvasclone',canvasclone); + if(canvas&&canvasclone){ + let ctx = canvas.getContext("2d"); + let image = new Image(); + image.src= canvas.toDataURL(); + /*var a = document.createElement("a"); + a.href=canvas.toDataURL(); + a.download="drcQrcode"; + a.click();*/ + console.log('clone-image',image) + let ctxClone = canvasclone.getContext("2d"); + //ctxClone.drawImage(image,0,0); + image.onload = function(){ + console.log('clone-image-load',image) + ctxClone.drawImage(image,0,0); + } + + } + }, + add(event){ + console.log('add',event ); + }, + update(event){ + console.log('update',event ); + }, + remove(event){ + console.log('remove',event ); + }, + sort(event){ + console.log('sort',event ); + }, + dragPosition:function(e){ + console.log('===',e.clientY,e.clientX); + let odiv=e;//目标元素e.target + console.log('odiv====',odiv); + //var targetDiv= document.getElementById('lineChartDiv'+this.chartIndex); // + //得到点击时该容器的: + var startY=e.clientY; + var startX=e.clientX; + var _this=this; +//鼠标相对元素的位置 + var distY=e.clientY-odiv.offsetLeft; + var distX=e.clientX-odiv.offsetTop; + document.onmousemove=function(e){ + e.preventDefault(); + console.log('===onmousemove',e.clientY,e.clientX); + //e.preventDefault(); + + // var distY=Math.abs(e.clientY-startY); + // var distX=Math.abs(e.clientX-startX); + let left=e.clientX-distX; + let top=e.clientY-distY; + odiv.style.top=top+'px'; + odiv.style.left=left+'px'; + console.log('odiv====',odiv); + /* + //往上方拖动: + if( e.clientY < startY){ + targetDiv.style.top=(startY-distY)+'px'; + } + if( e.clientX < startX){ + targetDiv.style.left=(startX-distX)+'px'; + } + //往下方拖动: + if (e.clientY > startY) { + targetDiv.style.top=(startY+distY)+'px'; + } + if (e.clientX > startX) { + targetDiv.style.left=(startX+distX)+'px'; + } + */ + } + + document.onmouseup=function(){ + document.onmousemove=null; + document.onmouseup = null; + } }, - /* handleDragStart(e,item){ this.dragging = item; }, @@ -252,7 +395,6 @@ export default { this.dataList = newItems }, - */ initCurrentRecordNum(){ this.currentRecordNum = 0; }, diff --git a/nezha-fronted/src/components/charts/chartPreview.vue b/nezha-fronted/src/components/charts/chartPreview.vue new file mode 100644 index 000000000..0007daf63 --- /dev/null +++ b/nezha-fronted/src/components/charts/chartPreview.vue @@ -0,0 +1,995 @@ + + + diff --git a/nezha-fronted/src/components/charts/line-chart-block.vue b/nezha-fronted/src/components/charts/line-chart-block.vue index cd8af7309..5e124a4e7 100644 --- a/nezha-fronted/src/components/charts/line-chart-block.vue +++ b/nezha-fronted/src/components/charts/line-chart-block.vue @@ -64,7 +64,7 @@ --> -
+
@@ -590,14 +590,14 @@ if ( chartInfo.type === 4) {//line,bar this.chartType = 'line'; } - let chartId = ''; + //let chartId = ''; if (chartSite === 'local') { this.echartStore = echarts.init(ele); - chartId='lineChartArea'; + //chartId='lineChartArea'; }else if (chartSite === 'screen') { this.echartModalStore = echarts.init(ele); - chartId='screenShowArea'; + //chartId='screenShowArea'; } var chartWidth = ele.clientWidth; var title = { diff --git a/nezha-fronted/src/components/common/language/cn.js b/nezha-fronted/src/components/common/language/cn.js index 500da90db..514817a68 100644 --- a/nezha-fronted/src/components/common/language/cn.js +++ b/nezha-fronted/src/components/common/language/cn.js @@ -13,6 +13,7 @@ const cn = { esc: '取消', cancel: '取消', save: '保存', + preivew:'预览', search: '搜索', add: "新增", option: "操作", diff --git a/nezha-fronted/src/components/common/language/en.js b/nezha-fronted/src/components/common/language/en.js index 33c084392..1773608b8 100644 --- a/nezha-fronted/src/components/common/language/en.js +++ b/nezha-fronted/src/components/common/language/en.js @@ -20,6 +20,7 @@ const en = { esc: 'Cancel', //'取消' cancel: 'Cancel', //'取消' save: 'Save', //'保存' + preview:'Preview',//预览 search: 'Search', //'搜索' add: 'Create', //"新增" option: 'Operation', //"操作" diff --git a/nezha-fronted/src/components/page/dashboard/chartBox.vue b/nezha-fronted/src/components/page/dashboard/chartBox.vue index 36aaa2dca..3a2aa3c70 100644 --- a/nezha-fronted/src/components/page/dashboard/chartBox.vue +++ b/nezha-fronted/src/components/page/dashboard/chartBox.vue @@ -211,13 +211,17 @@ +
- + + @@ -225,6 +229,7 @@ import bus from '../../../libs/bus'; import ChartMetric from "./chartMetric"; import chartDataFormat from '../../charts/chartDataFormat'; + import chartPreview from '../../charts/chartPreview'; export default { name: "chartBox", props: { @@ -299,6 +304,7 @@ }, components:{ 'chart-metric':ChartMetric, + 'chart-preview':chartPreview, }, methods: { show(show) { @@ -559,7 +565,7 @@ }); }, // 获取每个tag组件内部校验后数据,点击生成图表时触发 - getTarget(target) { + getTarget(target,pointer,optType) { this.elementTarget.push(target); if (this.elementTarget.length === this.elements.length) { this.$refs.chartForm.validate((valid) => { @@ -597,17 +603,23 @@ }); params.elements = elements; if (valid) { - if (this.isedit) { - params.id = this.chart.id; - this.updateCharts(params); - } else { - this.addCharts(params); + if(optType==='preview') { + if (this.isedit) { + params.id = this.chart.id; + } + this.$refs.chartsPreview.show(params); + }else{ + if (this.isedit) { + params.id = this.chart.id; + this.updateCharts(params); + } else { + this.addCharts(params); + } } } }); } }, - // 生成图表 confirmAdd() { this.elementTarget = []; // 初始化清空参数 this.$refs.chartTag.forEach((item, index) => {//循环指标列表 @@ -616,7 +628,6 @@ }); this.$refs.chartForm.validate(); }, - // 获取metric列表 getSuggestMetric() { //this.$get('metric', {pageNo: 1, pageSize: -1}).then(response => { @@ -787,6 +798,19 @@ callback(data); }, + //preview -start + //预览图表 + preview(){ + //验证图表数据是否合法??,合法了再显示预览窗口 + this.elementTarget = []; // 初始化清空参数 + this.$refs.chartTag.forEach((item, index) => {//循环指标列表 + // 触发每个tag组件内部进行校验 + item.saveTarget(index,'preview'); + }); + this.$refs.chartForm.validate(); + }, + //preview--end + }, created() { diff --git a/nezha-fronted/src/components/page/dashboard/chartMetric.vue b/nezha-fronted/src/components/page/dashboard/chartMetric.vue index 38b403b65..5027c6f8d 100644 --- a/nezha-fronted/src/components/page/dashboard/chartMetric.vue +++ b/nezha-fronted/src/components/page/dashboard/chartMetric.vue @@ -296,14 +296,14 @@ export default { // (最后整体保存添加的图标的时候执行)保存, chartdata点击确认后保存本身数据并返回给chartdata - saveTarget(pointer) { + saveTarget(pointer,optType) { if (this.pointer === pointer) { this.$refs.elementInfo.validate((valid) => { if (valid) {//根据设置的rules进行验证,验证通过,则返回,继续进行保存(每个el-form-item都需要验证) if(this.elementInfo.expression){ this.elementInfo.expression = this.elementInfo.expression.replace(/\s+| /ig,''); } - this.$emit('on-add-target-success', this.elementInfo, pointer); + this.$emit('on-add-target-success', this.elementInfo, pointer,optType); } }); }