Browse Source

优化

master
陈裕财 3 years ago
parent
commit
eab943ebb3
  1. 112
      src/views/xm/rpt/CompsCard.vue
  2. 2
      src/views/xm/rpt/CompsSet.vue
  3. 5
      src/views/xm/rpt/project/taskAgeDist.vue
  4. 282
      src/views/xm/rpt/rptDataList.vue

112
src/views/xm/rpt/CompsCard.vue

@ -7,7 +7,7 @@
<el-col :span="18"> <el-col :span="18">
<el-row class="padding"> <el-row class="padding">
<span style="float:right;"> <span style="float:right;">
<el-button type="text" v-if="isRptShow==true && isRptCfg==false" @click="isRptShow=true" icon="el-icon-time">查看历史报告</el-button>
<el-button type="text" v-if="isRptShow==true && isRptCfg==false" @click="toQueryRptData" icon="el-icon-time">查看历史报告</el-button>
<el-button type="primary" v-if="isRptShow==true && isRptCfg==false" @click="createRptData" icon="el-icon-time">保存报告(可供历史查询)</el-button> <el-button type="primary" v-if="isRptShow==true && isRptCfg==false" @click="createRptData" icon="el-icon-time">保存报告(可供历史查询)</el-button>
<el-button type="text" v-if="isRptShow==false && isRptCfg==false" @click="isRptShow=true" icon="el-icon-time">查看报告</el-button> <el-button type="text" v-if="isRptShow==false && isRptCfg==false" @click="isRptShow=true" icon="el-icon-time">查看报告</el-button>
<el-button type="warning" v-if="isRptShow==true" @click="undoRptShow" icon="el-icon-error">退出报告</el-button> <el-button type="warning" v-if="isRptShow==true" @click="undoRptShow" icon="el-icon-error">退出报告</el-button>
@ -25,12 +25,15 @@
<el-empty description="暂未选择报表,请至少选择一个报表"></el-empty> <el-empty description="暂未选择报表,请至少选择一个报表"></el-empty>
</div> </div>
<div v-else id="printBody" ref="rptBox"> <div v-else id="printBody" ref="rptBox">
<component style="margin-bottom:80px;" v-for="(item,index) in compCfgList" :key="index" :is="item.compId" :xm-test-plan="xmTestPlan" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration" :xm-test-casedb="xmTestCasedb" :category="category" :cfg="item.cfg" :ref="item.id" @delete="doDelete(item)" :init-group-by="item.initGroupBy" :show-tool-bar="false" :id="item.id" :show-params="paramsVisible"></component>
<component style="margin-bottom:80px;" v-for="(item,index) in compCfgList" :key="index" :is="item.compId" :xm-test-plan="xmTestPlan" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration" :xm-test-casedb="xmTestCasedb" :category="category" :cfg="item.cfg" :ref="item.id" @delete="doDelete(item)" :init-group-by="item.initGroupBy" :show-tool-bar="false" :id="item.id" :rpt-data="item.rawDatas" :show-params="paramsVisible"></component>
</div> </div>
</el-row> </el-row>
</el-col> </el-col>
</el-row> </el-row>
<el-dialog append-to-body modal-append-to-body :visible.sync="rptDataListVisible" top="20px" width="60%">
<rpt-data-list :xm-rpt-config="xmRptConfig" v-if="rptDataListVisible" @select="onRptDataSelect"/>
</el-dialog>
</section> </section>
</template> </template>
@ -41,15 +44,17 @@ import seq from '@/common/js/sequence';//全局公共库
import VueGridLayout from 'vue-grid-layout'; import VueGridLayout from 'vue-grid-layout';
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import CompsSet from '@/views/xm/rpt/CompsSet' import CompsSet from '@/views/xm/rpt/CompsSet'
import rptDataList from '@/views/xm/rpt/rptDataList'
import { addXmRptData } from '@/api/xm/core/xmRptData';
import { initDicts,listXmRptConfig, delXmRptConfig,editXmRptConfig,addXmRptConfig,batchDelXmRptConfig,editSomeFieldsXmRptConfig } from '@/api/xm/core/xmRptConfig';
import { listXmRptConfig,editXmRptConfig,addXmRptConfig } from '@/api/xm/core/xmRptConfig';
export default { export default {
components: { components: {
GridLayout: VueGridLayout.GridLayout, GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem, GridItem: VueGridLayout.GridItem,
CompsSet,
CompsSet, rptDataList,
xmTestRptOverview:()=>import("../core/xmTestPlan/xmTestRptOverview.vue"), xmTestRptOverview:()=>import("../core/xmTestPlan/xmTestRptOverview.vue"),
xmMenuDayTrend:()=>import("./product/menuDayTrend.vue"), xmMenuDayTrend:()=>import("./product/menuDayTrend.vue"),
xmMenuDayAccumulate:()=>import("./product/menuDayTrend.vue"), xmMenuDayAccumulate:()=>import("./product/menuDayTrend.vue"),
@ -120,12 +125,7 @@ export default {
}, },
rptConfigParamsCpd(){ rptConfigParamsCpd(){
//1-2-3-4-5- //1-2-3-4-5-
if(this.rptDatas){
this.rawDatas=this.rptDatas
return;
}
var params={bizType:'5',bizId:this.userInfo.branchId,name:''}
var params={bizType:'5',bizId:this.userInfo.branchId,name:''}
if(this.category=='企业级'){ if(this.category=='企业级'){
params.bizType='5'; params.bizType='5';
params.bizId=this.userInfo.branchId params.bizId=this.userInfo.branchId
@ -192,12 +192,13 @@ export default {
isRptCfg:false, isRptCfg:false,
isRptShow:false, isRptShow:false,
xmRptConfig:null, xmRptConfig:null,
xmRptData:null,
compCfgList:[], compCfgList:[],
maxTableHeight:300, maxTableHeight:300,
// //
layoutColNum: 12, layoutColNum: 12,
paramsVisible:true, paramsVisible:true,
exportToolBarVisible:true,
rptDataListVisible:false,
} }
}, },
@ -213,33 +214,34 @@ export default {
} }
}, },
toQueryRptData(){
this.rptDataListVisible=true;
},
createRptData(){ createRptData(){
if(this.xmRptConfig==null){ if(this.xmRptConfig==null){
this.$message.error("还没制作报告,请先制作报告") this.$message.error("还没制作报告,请先制作报告")
return; return;
} }
var rptData={cfgId:this.xmRptConfig.id,rptName:this.xmRptConfig.name,rptData:{}}
var compCfgList=JSON.parse(JSON.stringify(this.compCfgList))
compCfgList=compCfgList.map(k=>{
return {compId:k.compId,id:k.id}
})
compCfgList.forEach(k=>{
var xmRptData={cfgId:this.xmRptConfig.id,rptName:this.xmRptConfig.name,rptData:[]}
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){ if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id] var com=this.$refs[k.id][0].$refs[k.id]
k.params=com.params
k.title=com.title
k.remark=com.remark
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptData.rptData.push(comData)
}else{ }else{
var com=this.$refs[k.id][0]
k.params=com.params
k.title=com.title
k.remark=com.remark
var com=this.$refs[k.id][0]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptData.rptData.push(comData)
} }
}) })
xmRptConfig.cfg=JSON.stringify(compCfgList)
editXmRptConfig(xmRptConfig).then(res=>{
this.xmRptConfig=xmRptConfig;
callback(res)
xmRptData.rptData=JSON.stringify(xmRptData.rptData)
addXmRptData(xmRptData).then(res=>{
var tips = res.data.tips
if(tips.isOk){
this.$message.success("报告保存成功")
}else{
this.$message.error(tips.msg)
}
}) })
}, },
undoRptCfg(){ undoRptCfg(){
@ -285,18 +287,20 @@ export default {
initCompCfgList(){ initCompCfgList(){
if(this.xmRptConfig && this.xmRptConfig.cfg){ if(this.xmRptConfig && this.xmRptConfig.cfg){
var cfgJson=JSON.parse(this.xmRptConfig.cfg) var cfgJson=JSON.parse(this.xmRptConfig.cfg)
cfgJson.forEach(k=>k.id=k.compId+seq.sn())
this.compCfgList=cfgJson; this.compCfgList=cfgJson;
}else{ }else{
var defList=this.$refs['compsSet'].rptListCpd var defList=this.$refs['compsSet'].rptListCpd
if(defList && defList.length>3){ if(defList && defList.length>3){
defList=defList.slice(0,3); defList=defList.slice(0,3);
} }
defList.forEach(k=>k.id=k.compId+seq.sn())
this.compCfgList=JSON.parse(JSON.stringify(defList)) this.compCfgList=JSON.parse(JSON.stringify(defList))
} }
}, },
onCompSelect(comp){ onCompSelect(comp){
if(this.compCfgList.some(k=>k.id==comp.id)){
var compCfg=this.compCfgList.find(k=>k.id==comp.id)
if(this.compCfgList.some(k=>k.compId==comp.compId)){
var compCfg=this.compCfgList.find(k=>k.compId==comp.compId)
this.$nextTick(()=>{ this.$nextTick(()=>{
this.scrollToComp(compCfg) this.scrollToComp(compCfg)
}) })
@ -329,25 +333,19 @@ export default {
submitXmPrtConfig(callback){ submitXmPrtConfig(callback){
if(this.xmRptConfig==null){ if(this.xmRptConfig==null){
var xmRptConfig={...this.rptConfigParamsCpd,cfg:[]} var xmRptConfig={...this.rptConfigParamsCpd,cfg:[]}
var compCfgList=JSON.parse(JSON.stringify(this.compCfgList))
compCfgList=compCfgList.map(k=>{
return {compId:k.compId,id:k.id}
})
compCfgList.forEach(k=>{
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){ if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id] var com=this.$refs[k.id][0].$refs[k.id]
k.params=com.params
k.title=com.title
k.remark=com.remark
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}else{ }else{
var com=this.$refs[k.id][0] var com=this.$refs[k.id][0]
k.params=com.params
k.title=com.title
k.remark=com.remark
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
} }
}) })
xmRptConfig.cfg=JSON.stringify(compCfgList)
xmRptConfig.cfg=JSON.stringify(xmRptConfig.cfg)
addXmRptConfig(xmRptConfig).then(res=>{ addXmRptConfig(xmRptConfig).then(res=>{
this.xmRptConfig=xmRptConfig; this.xmRptConfig=xmRptConfig;
@ -355,24 +353,18 @@ export default {
}) })
}else{ }else{
var xmRptConfig={...this.xmRptConfig,cfg:[]} var xmRptConfig={...this.xmRptConfig,cfg:[]}
var compCfgList=JSON.parse(JSON.stringify(this.compCfgList))
compCfgList=compCfgList.map(k=>{
return {compId:k.compId,id:k.id}
})
compCfgList.forEach(k=>{
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){ if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id] var com=this.$refs[k.id][0].$refs[k.id]
k.params=com.params
k.title=com.title
k.remark=com.remark
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}else{ }else{
var com=this.$refs[k.id][0] var com=this.$refs[k.id][0]
k.params=com.params
k.title=com.title
k.remark=com.remark
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
} }
}) })
xmRptConfig.cfg=JSON.stringify(compCfgList)
xmRptConfig.cfg=JSON.stringify(xmRptConfig.cfg)
editXmRptConfig(xmRptConfig).then(res=>{ editXmRptConfig(xmRptConfig).then(res=>{
this.xmRptConfig=xmRptConfig; this.xmRptConfig=xmRptConfig;
callback(res) callback(res)
@ -388,6 +380,18 @@ export default {
sizeAutoChange(k){ sizeAutoChange(k){
},
onRptDataSelect(rptData){
this.xmRptData=rptData
this.rptDataListVisible=false;
if(this.xmRptData && this.xmRptData.id ){
if( this.xmRptData.cfgId==this.xmRptConfig.id){
this.xmRptConfig.name=this.xmRptData.rptName
var cfgList=JSON.parse(this.xmRptData.rptData)
cfgList.forEach(k=>k.id=k.compId+seq.sn())
this.compCfgList=cfgList
}
}
}, },
exportToPdf(){ exportToPdf(){
this.paramsVisible=false this.paramsVisible=false

2
src/views/xm/rpt/CompsSet.vue

@ -183,7 +183,7 @@ export default {
}, },
mounted(){ mounted(){
this.comps.forEach(k=>k.id=k.id?k.id:k.compId)
//this.comps.forEach(k=>k.id=k.id?k.id:k.compId)
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el) this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
if(this.category){ if(this.category){
this.filters.category=this.category this.filters.category=this.category

5
src/views/xm/rpt/project/taskAgeDist.vue

@ -19,11 +19,6 @@
<el-form :model="params" class="padding" :style="{width:'100%',overflow: 'auto'}" ref="filtersRef"> <el-form :model="params" class="padding" :style="{width:'100%',overflow: 'auto'}" ref="filtersRef">
<el-row> <el-row>
<el-col :span="15"> <el-col :span="15">
<el-form-item label="分组属性">
<el-select style="width:100px;" size="small" v-model="params.groupBy" @change="onXmTaskSomeFieldsChange('groupBy',$event)" clearable>
<el-option v-for="i in this.groupBys" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="归属项目" > <el-form-item label="归属项目" >
<xm-project-select v-if="!xmProject || !xmProject.id" ref="xmProjectSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProjectSelected" @clear="onProjectClear"></xm-project-select> <xm-project-select v-if="!xmProject || !xmProject.id" ref="xmProjectSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProjectSelected" @clear="onProjectClear"></xm-project-select>
<span v-else>{{xmProject.id}} <span v-if="xmProject.name"><br/>{{ xmProject.name }} </span> </span> <span v-else>{{xmProject.id}} <span v-if="xmProject.name"><br/>{{ xmProject.name }} </span> </span>

282
src/views/xm/rpt/rptDataList.vue

@ -0,0 +1,282 @@
<template>
<section class="page-container border padding">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"></el-input>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmRptDatas" icon="el-icon-search">查询</el-button>
<span style="float:right;">
<el-button type="danger" v-loading="load.del" @click="batchDel" :disabled="this.sels.length===0 || load.del==true" icon="el-icon-delete" plain></el-button>
</span>
</el-row>
<el-row class="padding-top">
<!--列表 XmRptData xm_rpt_data-->
<el-table ref="xmRptDataTable" :data="xmRptDatas" :height="maxTableHeight" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column prop="rptName" label="报告名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.rptName}} </span>
</template>
</el-table-column>
<el-table-column prop="cuserid" label="创建人编号" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.cuserid}} </span>
</template>
</el-table-column>
<el-table-column prop="cusername" label="创建人名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.cusername}} </span>
</template>
</el-table-column>
<el-table-column prop="bizDate" label="业务日期" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.bizDate}} </span>
</template>
</el-table-column>
<el-table-column label="操作" width="100" fixed="right">
<template scope="scope">
<el-button type="primary" @click="$emit('select',scope.row)" icon="el-icon-edit" plain>选择</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { initDicts,listXmRptData, delXmRptData, batchDelXmRptData,editSomeFieldsXmRptData } from '@/api/xm/core/xmRptData';
import { mapGetters } from 'vuex'
export default {
name:'xmRptDataList',
components: {
},
props:['visible','xmRptConfig'],
computed: {
...mapGetters(['userInfo']),
},
watch:{
visible(val){
if(val==true){
this.initData();
this.searchXmRptDatas()
}
}
},
data() {
return {
filters: {
key: ''
},
xmRptDatas: [],//
pageInfo:{//
total:0,//0>0
pageSize:10,//
count:false,//
pageNum:1,//1
orderFields:[],// ['sex','student_id']
orderDirs:[]// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts:{
//sex: [{id:'1',name:''},{id:'2',name:''}]
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
addFormVisible: false,//xmRptData
addForm: {
cfgId:'',id:'',rptName:'',rptData:'',cuserid:'',cbranchId:'',cusername:'',ctime:'',bizDate:'',bizType:''
},
editFormVisible: false,//
editForm: {
cfgId:'',id:'',rptName:'',rptData:'',cuserid:'',cbranchId:'',cusername:'',ctime:'',bizDate:'',bizType:''
},
maxTableHeight:300,
}
},//end data
methods: {
...util,
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmRptDatas();
},
handleCurrentChange(pageNum) {
this.pageInfo.pageNum = pageNum;
this.getXmRptDatas();
},
// obj.order=ascending/descending, asc/desc ; obj.prop=,
sortChange( obj ){
if(obj.order==null){
this.pageInfo.orderFields=[];
this.pageInfo.orderDirs=[];
}else{
var dir='asc';
if(obj.order=='ascending'){
dir='asc'
}else{
dir='desc';
}
this.pageInfo.orderFields=[util.toLine(obj.prop)];
this.pageInfo.orderDirs=[dir];
}
this.getXmRptDatas();
},
searchXmRptDatas(){
this.pageInfo.count=true;
this.getXmRptDatas();
},
// XmRptData xm_rpt_data
getXmRptDatas() {
let params = {
pageSize: this.pageInfo.pageSize,
pageNum: this.pageInfo.pageNum,
total: this.pageInfo.total,
count:this.pageInfo.count
};
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.pageInfo.orderFields.length;i++){
orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
}
params.orderBy= orderBys.join(",")
}
if(this.filters.key){
params.key=this.filters.key
}
if(!this.xmRptConfig || !this.xmRptConfig.id){
return;
}
params.cfgId=this.xmRptConfig.id
this.load.list = true;
listXmRptData(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmRptDatas = res.data.data;
}else{
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
// XmRptData xm_rpt_data
showEdit: function ( row,index ) {
this.editFormVisible = true;
this.editForm = Object.assign({}, row);
},
// XmRptData xm_rpt_data
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
afterAddSubmit(){
this.addFormVisible=false;
this.pageInfo.count=true;
this.getXmRptDatas();
},
afterEditSubmit(){
this.editFormVisible=false;
},
//xmRptData
selsChange: function (sels) {
this.sels = sels;
},
//xmRptData
handleDel: function (row,index) {
this.$confirm('确认删除该记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
let params = { id:row.id };
delXmRptData(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.searchXmRptDatas();
}
this.$notify({ position:'bottom-left', showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
});
},
//xmRptData
batchDel: function () {
if(this.sels.length<=0){
return;
}
var params=this.sels.map(i=>{
return { id:i.id}
})
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
batchDelXmRptData(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if( tips.isOk ){
this.searchXmRptDatas();
}
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.del=false );
});
},
editSomeFields(row,fieldName,$event){
let params={};
if(this.sels.length>0){
if(!this.sels.some(k=> k.id==row.id)){
this.$notify({position:'bottom-left',showClose:true,message:'请编辑选中的行',type:'warning'})
Object.assign(this.editForm,this.editFormBak)
return;
}
params['ids']=this.sels.map(i=>i.id)
}else{
params['ids']=[row].map(i=>i.id)
}
params[fieldName]=$event
var func = editSomeFieldsXmRptData
func(params).then(res=>{
let tips = res.data.tips;
if(tips.isOk){
if(this.sels.length>0){
this.searchXmRptDatas();
}
this.editFormBak=[...this.editForm]
}else{
Object.assign(this.editForm,this.editFormBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
}).catch((e)=>Object.assign(this.editForm,this.editFormBak))
},
rowClick: function(row, event, column){
this.editForm=row
this.editFormBak={...row};
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
initData: function(){
},
},//end methods
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
this.searchXmRptDatas();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.xmRptDataTable.$el)
});
}
}
</script>
<style scoped>
</style>
Loading…
Cancel
Save