import Vue from 'vue' import './tab_switcher.scss' export default Vue.component('tab-switcher', { name: 'TabSwitcher', props: { renderOnlyFocused: { required: false, type: Boolean, default: false }, onSwitch: { required: false, type: Function, default: undefined }, activeTab: { required: false, type: String, default: undefined }, scrollableTabs: { required: false, type: Boolean, default: false }, sideTabBar: { required: false, type: Boolean, default: false } }, data () { return { active: this.$slots.default.findIndex(_ => _.tag) } }, computed: { activeIndex () { // In case of controlled component if (this.activeTab) { return this.$slots.default.findIndex(slot => this.activeTab === slot.key) } else { return this.active } } }, beforeUpdate () { const currentSlot = this.$slots.default[this.active] if (!currentSlot.tag) { this.active = this.$slots.default.findIndex(_ => _.tag) } }, methods: { activateTab (index) { return (e) => { e.preventDefault() if (typeof this.onSwitch === 'function') { this.onSwitch.call(null, this.$slots.default[index].key) } this.active = index if (this.scrollableTabs) { this.$refs.contents.scrollTop = 0 } } } }, render (h) { const tabs = this.$slots.default .map((slot, index) => { if (!slot.tag) return const classesTab = ['tab'] const classesWrapper = ['tab-wrapper'] if (this.activeIndex === index) { classesTab.push('active') classesWrapper.push('active') } if (slot.data.attrs.image) { return ( <div class={classesWrapper.join(' ')}> <button disabled={slot.data.attrs.disabled} onClick={this.activateTab(index)} class={classesTab.join(' ')}> <img src={slot.data.attrs.image} title={slot.data.attrs['image-tooltip']}/> {slot.data.attrs.label ? '' : slot.data.attrs.label} </button> </div> ) } return ( <div class={classesWrapper.join(' ')}> <button disabled={slot.data.attrs.disabled} onClick={this.activateTab(index)} class={classesTab.join(' ')} > {!slot.data.attrs.icon ? '' : (<i class={'tab-icon icon-' + slot.data.attrs.icon}/>)} {slot.data.attrs.label} </button> </div> ) }) const contents = this.$slots.default.map((slot, index) => { if (!slot.tag) return const active = this.activeIndex === index const classes = [ active ? 'active' : 'hidden' ] if (slot.data.attrs.fullHeight) { classes.push('full-height') } if (this.renderOnlyFocused) { return active ? <div class={classes.join(' ')}>{slot}</div> : <div class={classes.join(' ')}></div> } return <div class={classes.join(' ')}>{slot}</div> }) return ( <div class={'tab-switcher ' + (this.sideTabBar ? 'side-tabs' : 'top-tabs')}> <div class="tabs"> {tabs} </div> <div ref="contents" class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')}> {contents} </div> </div> ) } })