<template> <div class="pl-design-portal"> <div class="pl-design-portal-head"> {{index+1 | theRowLang($lang)}} <div class="pl-design-portal-tool"><i class="btn iconfont icon-delete" @click="handleDelPortal"></i></div> </div> <div class="pl-design-portal-body"> <PRow class="pl-design-row" :index="index"> <PCol v-for="(item,colIndex) in cols" :key="colIndex" :span="item" class="pl-design-col"> <div class="pl-design-col-inner" :index="colIndex"> <div v-if="panelsList[colIndex].length==0" class="nullData">{{$t("hivuiMain_des_dragInArea")}}</div> <div class="pl-portal-panel" v-for="(item1,index1) in panelsList[colIndex]" :key="index1"> <div class="pl-portal-panel-head"> <div class="tool"> <i class="iconfont icon-edit" @click="handleEidtColumns(item1,index,colIndex)"></i> <i class="iconfont icon-delete" @click="handleDelColumns(item1,index,colIndex)"></i> </div> <div class="tabs"> <ul> <li v-for="(item2,index2) in item1.columns" @click="handleTabClick">{{item2.name}}</li> </ul> </div> </div> </div> </div> <div class="pl-design-portal-add"> <div class="oper" @click="handleAddPortal(index,colIndex)"> <i class="iconfont icon-add"></i> <span> {{$t("hivuiMain_des_addColunms")}}{{item}}</span> </div> </div> </PCol> </PRow> </div> <ColumnsSelectDialog ref="cmp-columnsDD" :portalPanel="curPortalPanel" @onOk="onAddColumns" @onUpdate="onUpdateColumns"></ColumnsSelectDialog> </div> </template> <script> import Dialog from "@main/components/dialog"; import {PRow,PCol} from "@main/components/grid"; import ColumnsSelectDialog from "./columnsSelect"; import Sortable from 'sortablejs'; import {strFormat} from '@main/utils/index'; export default { components:{ Dialog,PRow,PCol,ColumnsSelectDialog }, inject: ['addPanel','editPanel','delPanel','getPanels','updatePanelPosition'], props:{ cols:{ type:Array, default:[24] }, index:{ type:Number } }, filters:{ theRowLang(value,$lang){ let formatStr = this.$t("hivuiMain_des_serialRowLayout"); let rex = new RegExp("\\{0\\}", "g"); return strFormat(formatStr,value); } }, data(){ let panelsList = this.getPanels(this.index); return { curPosition:[],//当前行、列 位置 SortableList:[],//拖拽对象列表 curPortalPanel:null,//当前门户面板块 panelsList:panelsList,//面板列表 panelsItemEdit:false } }, mounted(){ this.createSortable(); }, beforeDestroy(){ this.removeAllSortable(); }, methods:{ removeAllSortable(){ let me=this; me.SortableList.map(item=>{ item.destroy(); }); me.$set(me,'SortableList',[]); }, /** * 创建门户面板块的拖拽 */ createSortable(){ let me=this; let list = me.$el.getElementsByClassName('pl-design-col-inner'); let items = [...list]; items.map(item => { let obj= new Sortable(item, { group: "portal-Sortable", handle: '.pl-portal-panel-head', // handle's class animation: 150, onUpdate(evt) { console.log(' portal createSortable onUpdate'); }, onEnd(evt){ let oldRowIndex = me.index; let newRowIndex = evt.to.parentNode.parentNode.getAttribute('index'); let oldIndex = evt.from.getAttribute('index'); let newIndex = evt.to.getAttribute('index') ; console.log(`原是第${oldRowIndex}个布局中,第${oldIndex}列第${evt.oldIndex}个,移动到第${newRowIndex}个布局中,第${newIndex}列第${evt.newIndex}个`); //数据要更新 me.updatePanelPosition({ oldRowIndex:oldRowIndex, oldColIndex:oldIndex, oldPanelIndex:evt.oldIndex, newRowIndex:newRowIndex, newColIndex:newIndex, newPanelIndex:evt.newIndex, }); } }); me.SortableList.push(obj); }); // console.info('createSortable:',this.cols,me.SortableList) }, /** * 删除整行布局 */ handleDelPortal(){ this.$emit('onDel',this.index); }, /** * 弹出栏目选择对话框 */ handleAddPortal(row,col){ this.curPosition= [row,col]; this.curPortalPanel = null; this.$refs["cmp-columnsDD"].show(); }, handleEidtColumns(data,row,col){ this.curPosition= [row,col]; this.curPortalPanel = data; this.$refs["cmp-columnsDD"].setForm(data); this.$refs["cmp-columnsDD"].show(); }, handleDelColumns(data){ this.delPanel(data); }, /** * 添加指定列下的栏目门户面板 */ onAddColumns(data=[],panelHeight=300){ if(data.length==0)return; this.addPanel(this.curPosition,{ height:panelHeight, columns:data }); // console.info('onColumnsSelected',data); }, onUpdateColumns(data={}){ this.editPanel(data); }, handleTabClick(evt){ let el = evt.target; let lis = el.parentNode.querySelectorAll('li'); lis.forEach(item=>{ item.className=''; }); el.className = 'seld' } } } </script>