vxe-pc-ui
Version:
A vue based PC component library
1 lines • 13.1 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _vue=require("vue"),_comp=require("../../ui/src/comp"),_ui=require("../../ui"),_vn=require("../../ui/src/vn"),_dom=require("../../ui/src/dom"),_utils=require("../../ui/src/utils"),_log=require("../../ui/src/log"),_xeUtils=_interopRequireDefault(require("xe-utils")),_loading=_interopRequireDefault(require("../../loading/src/loading"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let scrollbarOffsetSize=20;var _default=exports.default=(0,_comp.defineVxeComponent)({name:"VxeTabs",props:{modelValue:[String,Number,Boolean],options:Array,width:[String,Number],height:[String,Number],destroyOnClose:{type:Boolean,default:()=>(0,_ui.getConfig)().tabs.destroyOnClose},titleWidth:[String,Number],titleAlign:[String,Number],type:{type:String,default:()=>(0,_ui.getConfig)().tabs.type},position:{type:String,default:()=>(0,_ui.getConfig)().tabs.position},showClose:Boolean,showBody:{type:Boolean,default:!0},padding:{type:Boolean,default:()=>(0,_ui.getConfig)().tabs.padding},trigger:String,beforeChangeMethod:Function,closeConfig:Object,refreshConfig:Object,size:{type:String,default:()=>(0,_ui.getConfig)().tabs.size||(0,_ui.getConfig)().size},beforeCloseMethod:Function},emits:["update:modelValue","change","tab-change","tab-change-fail","tab-close","tab-close-fail","tab-click","tab-load"],setup(d,e){let{slots:w,emit:i}=e;var E=_xeUtils.default.uniqueId();let t=(0,_vue.inject)("$xeTabs",null),h=(0,_ui.useSize)(d).computeSize,c=(0,_vue.ref)(),S=(0,_vue.ref)(),u=(0,_vue.ref)(),v=(0,_vue.ref)(),O=(0,_vue.reactive)({staticTabs:[],activeName:null,initNames:[],lintLeft:0,lintTop:0,lintWidth:0,lintHeight:0,scrollbarWidth:0,scrollbarHeight:0,isTabOver:!1,resizeFlag:1,cacheTabMaps:{}}),m={slTimeout:void 0},M={refElem:c},B=(0,_vue.computed)(()=>{var e=d.type;return e||"default"}),z=(0,_vue.computed)(()=>{var e=d.position;return e||"top"}),L=(0,_vue.computed)(()=>{var e=z.value;return"left"===e||"right"===e}),q=(0,_vue.computed)(()=>{var{lintLeft:e,lintTop:t,lintWidth:a,lintHeight:i}=O;return L.value?{top:t+"px",height:i+"px"}:{left:e+"px",width:a+"px"}}),I=(0,_vue.computed)(()=>{var e=d.width,t={};return e&&(t.width=(0,_dom.toCssUnit)(e)),t}),W=(0,_vue.computed)(()=>Object.assign({},(0,_ui.getConfig)().tabs.closeConfig,d.closeConfig)),H=(0,_vue.computed)(()=>Object.assign({},(0,_ui.getConfig)().tabs.refreshConfig,d.refreshConfig)),g=(0,_vue.computed)(()=>{var e=d.options;return(e||[]).filter(e=>a(e))}),b=(0,_vue.computed)(()=>{var e=O.staticTabs;return e.filter(e=>a(e))});var U=(0,_vue.computed)(()=>t?t.reactData.resizeFlag:null);let V={},A={xID:E,props:d,context:e,reactData:O,getRefMaps:()=>M,getComputeMaps:()=>V},a=e=>{e=e.permissionCode;return!(e&&!_ui.permission.checkVisible(e))},k=(e,t)=>e&&(_xeUtils.default.isString(e)&&(e=w[e]||null),_xeUtils.default.isFunction(e))?(0,_vn.getSlotVNs)(e(t)):[],F=()=>{var e,t,a,i,l,s=L.value,r=S.value,n=u.value,o=v.value;r&&({scrollLeft:r,scrollTop:e,clientWidth:t,clientHeight:a,scrollWidth:i,scrollHeight:l}=r,n&&(0<(s?e:r)?(0,_dom.addClass):(0,_dom.removeClass))(n,"scrolling--middle"),o)&&((s?a<l-Math.ceil(e):t<i-Math.ceil(r))?(0,_dom.addClass):(0,_dom.removeClass))(o,"scrolling--middle")},p=()=>{var e=()=>{let t=O.activeName;var e,a,i,l,s,r=B.value,n=g.value,o=b.value,u=S.value,v=L.value;let c=0,d=0,h=0,m=0,p=0,f=0,_=!1;u&&(o=_xeUtils.default.findIndexOf(o.length?o:n,e=>e.name===t),{children:n,offsetWidth:u,scrollWidth:e,offsetHeight:i,scrollHeight:l,clientWidth:a,clientHeight:s}=u,p=u-a,f=i-s,v?(_=l!==s,-1<o&&(u=n[o])&&(i=u.clientHeight,v=u.clientWidth,m="card"===r?(c=v,d=i,u.offsetTop):"border-card"===r?(c=v,d=i,u.offsetTop-1):(d=Math.max(4,Math.floor(.6*i)),u.offsetTop+Math.floor((i-d)/2)))):(_=e!==a,-1<o&&(l=n[o])&&(s=l.clientWidth,h="card"===r?(c=s+1,l.offsetLeft):"border-card"===r?(c=s,l.offsetLeft-1):(c=Math.max(4,Math.floor(.6*s)),l.offsetLeft+Math.floor((s-c)/2))))),O.scrollbarWidth=p,O.scrollbarHeight=f,O.lintLeft=h,O.lintTop=m,O.lintWidth=c,O.lintHeight=d,O.isTabOver=_,F()};e(),(0,_vue.nextTick)(e)},f=(e,t,a)=>{i(e,(0,_ui.createEvent)(a,{$tabs:A},t))},n=e=>{i("update:modelValue",e)},o=(e,t)=>{var a=O.initNames;return!(!e||a.includes(e)||(f("tab-load",{name:e},t),a.push(e),0))},l=e=>{let i=null,l={};if(e&&e.length){let a=!1;i=d.modelValue,e.forEach(e=>{var{name:e,preload:t}=e||{};e&&(l[""+e]={loading:!1},i===e&&(a=!0),t)&&o(e,null)}),a||(i=e[0].name,o(i,null),n(i))}O.activeName=i,O.cacheTabMaps=l},R=(t,a)=>{var e=d.trigger,i=d.beforeChangeMethod||(0,_ui.getConfig)().tabs.beforeChangeMethod;let l=O.activeName,s=a.name,r=s;f("tab-click",{name:s},t),"manual"!==e&&s!==l&&Promise.resolve(!i||i({$tabs:A,name:s,oldName:l,newName:s,option:a})).then(e=>{e?(O.activeName=s,n(r),o(s,t),f("change",{value:r,name:s,oldName:l,newName:s,option:a},t),f("tab-change",{value:r,name:s,oldName:l,newName:s,option:a},t)):f("tab-change-fail",{value:r,name:s,oldName:l,newName:s,option:a},t)}).catch(()=>{f("tab-change-fail",{value:r,name:s,oldName:l,newName:s,option:a},t)})},P=(e,t)=>{e.stopPropagation();var{activeName:e,cacheTabMaps:a}=O,i=t.name,l=H.value.queryMethod;let s=i?a[""+i]:null;s&&(l?s.loading||(s.loading=!0,Promise.resolve(l({$tabs:A,value:e,name:i,option:t})).finally(()=>{s.loading=!1})):(0,_log.errLog)("vxe.error.notFunc",["refresh-config.queryMethod"]))},$=(t,e,a,i)=>{t.stopPropagation();var l=O.activeName,s=W.value.beforeMethod||d.beforeCloseMethod||(0,_ui.getConfig)().tabs.beforeCloseMethod;let r=e.name,n=l,o=n;l===r&&(l=a<i.length-1?i[a+1]:i[a-1],o=l?l.name:null),Promise.resolve(!s||s({$tabs:A,value:n,name:r,nextName:o,option:e})).then(e=>{e?f("tab-close",{value:n,name:r,nextName:o},t):f("tab-close-fail",{value:n,name:r,nextName:o},t)}).catch(()=>{f("tab-close-fail",{value:n,name:r,nextName:o},t)})},j=(n,e)=>{var t=m.slTimeout;let o=L.value,u=o?0:e,v=o?e:0,c=6,d=35,h=(t&&(clearTimeout(t),m.slTimeout=void 0),()=>{var e,t,a,i,l,s,r=S.value;0<c&&(c--,r)&&({clientWidth:e,clientHeight:t,scrollWidth:a,scrollHeight:i,scrollLeft:l,scrollTop:s}=r,o?(v=Math.floor(v/2),0<n?t+s<i&&(r.scrollTop+=v,d-=4,m.slTimeout=setTimeout(h,d)):0<s&&(r.scrollTop-=v,d-=4,m.slTimeout=setTimeout(h,d))):(u=Math.floor(u/2),0<n?e+l<a&&(r.scrollLeft+=u,d-=4,m.slTimeout=setTimeout(h,d)):0<l&&(r.scrollLeft-=u,d-=4,m.slTimeout=setTimeout(h,d))),p())});h()},s=e=>{var t,a=L.value,i=S.value;i&&({clientWidth:i,clientHeight:t}=i,a=Math.floor(.75*(a?t:i)),j(e,a))},D=()=>{s(-1)},G=()=>{s(1)},r=n=>{let o=g.value,u=b.value,v=L.value;return(0,_vue.nextTick)().then(()=>{var e,t,a,i,l,s,r=S.value;r&&(-1<(i=_xeUtils.default.findIndexOf(u.length?u:o,e=>e.name===n))&&({scrollLeft:e,scrollTop:s,clientWidth:t,clientHeight:l,children:a}=r,a=a[i])&&(v?(0<(l=(i=a.offsetTop)+a.clientHeight-(s+l))&&(r.scrollTop+=l),i<s&&(r.scrollTop=i)):(0<(s=(l=a.offsetLeft)+a.clientWidth-(e+t))&&(r.scrollLeft+=s),l<e&&(r.scrollLeft=l))),p())})},_=t=>{let a=O.activeName;var i=g.value,l=b.value,l=l.length?l:i,i=_xeUtils.default.findIndexOf(l,e=>e.name===a);if(-1<i){let e=null;t?i<l.length-1&&(e=l[i+1]):0<i&&(e=l[i-1]),e&&(l=t=e.name,O.activeName=t,n(l),o(t,null))}return(0,_vue.nextTick)()},x={dispatchEvent:f,scrollToTab:r,prev(){return _(!1)},next(){return _(!0)},prevTab(){return(0,_log.warnLog)("vxe.error.delFunc",["[tabs] prevTab","prev"]),x.prev()},nextTab(){return(0,_log.warnLog)("vxe.error.delFunc",["[tabs] nextTab","next"]),x.next()}};Object.assign(A,x,{});let T=h=>{let{titleWidth:m,titleAlign:p,showClose:f,closeConfig:_,refreshConfig:g}=d,{activeName:b,scrollbarWidth:e,scrollbarHeight:t,isTabOver:a,cacheTabMaps:x}=O,T=B.value,y=z.value;var i=L.value,l=q.value,s=w.tabPrefix||w["tab-prefix"]||w.prefix,r=w.tabSuffix||w["tab-suffix"]||w.suffix||w.extra;let C=W.value,N=C.visibleMethod,E=H.value,M=E.visibleMethod;return(0,_vue.h)("div",{key:"th",class:["vxe-tabs-header","type--"+T,"pos--"+y]},[s?(0,_vue.h)("div",{class:["vxe-tabs-header--prefix","type--"+T,"pos--"+y]},k(s,{name:b})):(0,_ui.renderEmptyElement)(A),a?(0,_vue.h)("div",{ref:u,class:["vxe-tabs-header--bar vxe-tabs-header--prev-bar","type--"+T,"pos--"+y],onClick:D},[(0,_vue.h)("span",{class:i?(0,_ui.getIcon)().TABS_TAB_BUTTON_TOP:(0,_ui.getIcon)().TABS_TAB_BUTTON_LEFT})]):(0,_ui.renderEmptyElement)(A),(0,_vue.h)("div",{class:["vxe-tabs-header--wrapper","type--"+T,"pos--"+y]},[(0,_vue.h)("div",{ref:S,class:"vxe-tabs-header--item-wrapper",style:i?{marginRight:`-${e+scrollbarOffsetSize}px`,paddingRight:scrollbarOffsetSize+"px"}:{marginBottom:`-${t+scrollbarOffsetSize}px`,paddingBottom:scrollbarOffsetSize+"px"},onScroll:F},h.map((t,a)=>{var{title:e,titleWidth:i,titleAlign:l,icon:s,name:r}=t,n=t.slots||{},o=n.title||n.tab,u=n.titlePrefix||n["title-prefix"],n=n.titleSuffix||n["title-suffix"],i=i||m,l=l||p,v={$tabs:A,value:b,name:r,option:t},c=b===r,d=r?x[""+r]:null,d=!!d&&d.loading;return(0,_vue.h)("div",{key:""+r,class:["vxe-tabs-header--item","type--"+T,"pos--"+y,l?"align--"+l:"",{"is--active":c}],style:i?{width:(0,_dom.toCssUnit)(i)}:void 0,onClick(e){R(e,t)}},[(0,_vue.h)("div",{class:"vxe-tabs-header--item-inner"},[(0,_vue.h)("div",{class:"vxe-tabs-header--item-content"},[s?(0,_vue.h)("span",{class:"vxe-tabs-header--item-icon"},[(0,_vue.h)("i",{class:s})]):(0,_ui.renderEmptyElement)(A),u?(0,_vue.h)("span",{class:"vxe-tabs-header--item-prefix"},k(u,{name:r,title:e})):(0,_ui.renderEmptyElement)(A),(0,_vue.h)("span",{class:"vxe-tabs-header--item-name"},o?k(o,{name:r,title:e}):""+e),n?(0,_vue.h)("span",{class:"vxe-tabs-header--item-suffix"},k(n,{name:r,title:e})):(0,_ui.renderEmptyElement)(A)]),!(0,_utils.isEnableConf)(g)&&!E.enabled||M&&!M(v)?(0,_ui.renderEmptyElement)(A):(0,_vue.h)("div",{class:["vxe-tabs-header--refresh-btn",{"is--active":c,"is--loading":d,"is--disabled":d}],onClick(e){P(e,t)}},[(0,_vue.h)("i",{class:d?(0,_ui.getIcon)().TABS_TAB_REFRESH_LOADING:(0,_ui.getIcon)().TABS_TAB_REFRESH})]),!(f||(0,_utils.isEnableConf)(_)||C.enabled)||N&&!N(v)?(0,_ui.renderEmptyElement)(A):(0,_vue.h)("div",{class:["vxe-tabs-header--close-btn",{"is--active":c}],onClick(e){$(e,t,a,h)}},[(0,_vue.h)("i",{class:(0,_ui.getIcon)().TABS_TAB_CLOSE})])])])}).concat([(0,_vue.h)("span",{key:"line",class:["vxe-tabs-header--active-line","type--"+T,"pos--"+y],style:l})]))]),a?(0,_vue.h)("div",{ref:v,class:["vxe-tabs-header--bar vxe-tabs-header--next-bar","type--"+T,"pos--"+y],onClick:G},[(0,_vue.h)("span",{class:i?(0,_ui.getIcon)().TABS_TAB_BUTTON_BOTTOM:(0,_ui.getIcon)().TABS_TAB_BUTTON_RIGHT})]):(0,_ui.renderEmptyElement)(A),r?(0,_vue.h)("div",{class:["vxe-tabs-header--suffix","type--"+T,"pos--"+y]},k(r,{name:b})):(0,_ui.renderEmptyElement)(A)])},y=e=>{var{initNames:t,activeName:a}=O,{name:e,slots:i}=e,i=i?i.default:null;return e&&t.includes(e)?(0,_vue.h)("div",{key:""+e,class:["vxe-tabs-pane--item",{"is--visible":a===e}]},i?k(i,{name:e}):[]):(0,_ui.renderEmptyElement)(A)},J=e=>{var t=d.destroyOnClose;let a=O.activeName;return t?[(t=e.find(e=>e.name===a))?y(t):(0,_ui.renderEmptyElement)(A)]:e.map(e=>y(e))},K=e=>{var{height:t,padding:a,showBody:i}=d,{activeName:l,cacheTabMaps:s}=O,r=h.value,n=B.value,o=z.value,u=H.value.showLoading,v=w.header,c=w.footer;return i?(s=!!(s=l?s[""+l]:null)&&s.loading,l={name:l},(0,_vue.h)("div",{key:"tb",class:["vxe-tabs-pane--wrapper","type--"+n,"pos--"+o,{"is--content":i}]},[v?(0,_vue.h)("div",{class:"vxe-tabs-pane--header"},k(v,l)):(0,_ui.renderEmptyElement)(A),(0,_vue.h)("div",{class:["vxe-tabs-pane--body","type--"+n,"pos--"+o,{["size--"+r]:r,"is--padding":a,"is--height":t}]},J(e)),c?(0,_vue.h)("div",{class:"vxe-tabs-pane--footer"},k(c,l)):(0,_ui.renderEmptyElement)(A),u&&s?(0,_ui.renderEmptyElement)(A):(0,_vue.h)(_loading.default,{class:"vxe-tabs--loading",modelValue:s})])):(0,_ui.renderEmptyElement)(A)};(0,_vue.watch)(()=>d.position,()=>{O.resizeFlag++}),(0,_vue.watch)(()=>d.modelValue,e=>{o(e,null),O.activeName=e}),(0,_vue.watch)(()=>O.activeName,e=>{r(e)});let C=(0,_vue.ref)(0),N=((0,_vue.watch)(()=>d.options?d.options.length:-1,()=>{C.value++}),(0,_vue.watch)(()=>d.options,()=>{C.value++}),(0,_vue.watch)(C,()=>{l(d.options),O.resizeFlag++}),(0,_vue.ref)(0));return(0,_vue.watch)(()=>O.staticTabs?O.staticTabs.length:-1,()=>{N.value++}),(0,_vue.watch)(()=>O.staticTabs,()=>{N.value++}),(0,_vue.watch)(N,()=>{l(O.staticTabs),O.resizeFlag++}),(0,_vue.watch)(U,()=>{O.resizeFlag++}),(0,_vue.watch)(()=>O.resizeFlag,()=>{(0,_vue.nextTick)(()=>{p()})}),(0,_vue.onMounted)(()=>{p(),_ui.globalEvents.on(A,"resize",p)}),(0,_vue.onUnmounted)(()=>{_ui.globalEvents.off(A,"resize")}),(0,_vue.provide)("$xeTabs",A),o(d.modelValue,null),l(O.staticTabs.length?O.staticTabs:d.options),A.renderVN=()=>{var{height:e,padding:t,trigger:a}=d,i=O.activeName,l=h.value,s=g.value,r=b.value,n=B.value,o=z.value,u=I.value,v=w.default,r=v?r:s,s=[(0,_vue.h)("div",{key:"ts",class:"vxe-tabs-slots"},v?v({name:i}):[])];return"right"===o||"bottom"===o?s.push(K(r),T(r)):s.push(T(r),K(r)),(0,_vue.h)("div",{ref:c,class:["vxe-tabs","pos--"+o,"vxe-tabs--"+n,"trigger--"+("manual"===a?"trigger":"default"),{["size--"+l]:l,"is--padding":t,"is--height":e}],style:u},s)},A},render(){return this.renderVN()}});