08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / views / design / portal.vue
<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>