08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / views / layout / components / tabpanel / tabNav.vue
caibinghong on 4 Jun 2021 add
<script>
import vueContextMenu from "@main/components/contextMenu";
 function noop() {}
export default {
    props:{
        panels:Array,
        onTabClick: {
        type: Function,
        default: noop
      },
      onTabRemove: {
        type: Function,
        default: noop
      },
      onTabCloseAll: {
        type: Function,
        default: noop
      }
    },
    data(){
        return {
            curContextMenuName:'',//右击tab
            curContextMenuIndex:null
        }
    },
    methods:{
        resize(){
            let tabWidth=0;
            let children = this.$el.querySelectorAll('li');
            Array.prototype.map.call(children, function (el, index, list) {
                let rct = el.getBoundingClientRect();        
                tabWidth += rct.width;
            });
            this.$el.style.width = (tabWidth+2)+'px';


            
            let id = this.$parent.currentName;
            if (this.$refs[id] == null) return;
                let scrollLeft = this.$refs[id].offsetLeft,
                scrollArea = this.$refs[id].parentNode.parentNode.parentNode;
            if (scrollArea.offsetWidth < scrollLeft) {
                scrollArea.scrollLeft = scrollLeft;
            } else if (scrollArea.scrollLeft > scrollLeft) {
                scrollArea.scrollLeft = scrollLeft;
            }

        },
        onClose(panel,e){
            e.stopPropagation();
            if(panel.$listeners&&panel.$listeners.onBeforeClose(panel,e)===false){
                return;
            }
            this.$emit('onTabClose',panel.name);
        },
        onActive(panel,evt){
            panel.$listeners&&panel.$listeners.onSelected(panel,evt)
            this.$emit('onTabChange',panel.name);
        },
        onContextMenu(panel,index,e) {
            e.preventDefault()
            this.curContextMenuName = panel.name;
            this.curContextMenuIndex = index,
            this.$refs['cmp-tabContextMenu'].open(e);
        },
        handleContextMenuRefresh() {
            let panel = this.panels[this.curContextMenuIndex];
            if(panel){
                let ifm = panel.$el.querySelector('iframe');
                if (ifm&&ifm.src&&ifm.src.indexOf('about:blank')==-1) {
                    ifm.contentWindow.window.location.reload();
                }
            }
        },
        handleContextMenuClose(e) {
            // e.stopPropagation();
            let panel = this.panels[this.curContextMenuIndex];
            if(panel.$listeners&&panel.$listeners.onBeforeClose(panel,e)===false){
                return;
            }
            this.$emit('onTabClose',panel.name);
        },
        handleContextMenuCloseAll(e) {
            this.$emit('onTabCloseAll');
        },
        handleContextMenuCloseRt() {
            this.$emit('onTabCloseRt',this.curContextMenuName,this.curContextMenuIndex);
        },
        handleContextMenuCloseLt() {
            this.$emit('onTabCloseLt',this.curContextMenuName,this.curContextMenuIndex);
        },
        handleContextMenuCloseOt() {
            this.$emit('onTabCloseOt',this.curContextMenuName,this.curContextMenuIndex);
        }
    },
    render(h){
        let {
            $lang,
            onClose,
            onActive,
            onContextMenu
        }=this;
        let tabs = this._l(this.panels,(panel,index)=>{           
            const nodeProps = {
                class:{                
                    ['pl-tabs-item']:1,
                    ['pl-tabs-itemSeld']:panel.name == this.$parent.currentName
                },
                attrs:{
                    id:'tab_'+panel.name
                }
            };
            const closeTpl = (
                <i class="pl-tabs-itemClose iconfont icon-close" on-click={(ev) => { onClose(panel, ev); }}></i>
            )  
            return (
                <li ref={panel.name} on-contextmenu={(ev) => { onContextMenu(panel,index, ev); }}>
                    <div {...nodeProps} on-click={(ev) => {onActive(panel, ev); }}>
                        <span class="pl-tabs-itemTxt sys-tab-item-text">{panel.title}</span>
                        {(panel.close===""||panel.close===true)&&closeTpl}
                    </div>
                </li>
            )
        });
        const ctxMenuProp = {
            props: {
                ['menu-items']: [
                    {
                        title: $lang('refresh')||'刷新',
                        iconClass: 'icon-refresh',
                        handler: this.handleContextMenuRefresh,
                    },
                    {
                        title:  $lang('close')||'关闭',
                        iconClass: 'icon-close-circle',
                        handler: this.handleContextMenuClose,
                    },
                    {
                        title:  $lang('closeLeft')||'关闭左侧',
                        iconClass: 'icon-arrow-leftMore-circle',
                        handler: this.handleContextMenuCloseLt,
                    },
                    {
                        title:  $lang('closeRight')||'关闭右侧',
                        iconClass: 'icon-arrow-rightMore-circle',
                        handler: this.handleContextMenuCloseRt,
                    },
                    {
                        title:  $lang('closeOther')||'关闭其它',
                        iconClass: 'icon-closeOther',
                        handler: this.handleContextMenuCloseOt,
                    },
                    {
                        title:  $lang('closeAll')||'关闭所有',
                        iconClass: 'icon-closeAll',
                        handler: this.handleContextMenuCloseAll,
                    },
                ]
            }
        };
        return (
            <div>
                <ul>{tabs}</ul>       
                <vueContextMenu ref="cmp-tabContextMenu" {...ctxMenuProp}></vueContextMenu>
            </div>    
        )
    },
    updated(){
        this.$parent.resize();
    }
}
</script>