vuetify
Version:
Vue Material Component Framework
112 lines (91 loc) • 2.22 kB
text/typescript
// Mixins
import { factory as GroupableFactory } from '../../mixins/groupable'
import Routable from '../../mixins/routable'
import Themeable from '../../mixins/themeable'
// Utilities
import { keyCodes } from './../../util/helpers'
import mixins from '../../util/mixins'
import { ExtractVue } from './../../util/mixins'
// Types
import { VNode } from 'vue/types'
const baseMixins = mixins(
Routable,
// Must be after routable
// to overwrite activeClass
GroupableFactory('tabsBar'),
Themeable
)
interface options extends ExtractVue<typeof baseMixins> {
$el: HTMLElement
}
export default baseMixins.extend<options>().extend(
/* @vue/component */
).extend({
name: 'v-tab',
props: {
ripple: {
type: [Boolean, Object],
default: true,
},
},
data: () => ({
proxyClass: 'v-tab--active',
}),
computed: {
classes (): object {
return {
'v-tab': true,
...Routable.options.computed.classes.call(this),
'v-tab--disabled': this.disabled,
...this.groupClasses,
}
},
value (): any {
let to = this.to || this.href || ''
if (this.$router &&
this.to === Object(this.to)
) {
const resolve = this.$router.resolve(
this.to,
this.$route,
this.append
)
to = resolve.href
}
return to.replace('#', '')
},
},
mounted () {
this.onRouteChange()
},
methods: {
click (e: KeyboardEvent | MouseEvent): void {
// If user provides an
// actual link, do not
// prevent default
if (this.href &&
this.href.indexOf('#') > -1
) e.preventDefault()
if (e.detail) this.$el.blur()
this.$emit('click', e)
this.to || this.toggle()
},
},
render (h): VNode {
const { tag, data } = this.generateRouteLink()
data.attrs = {
...data.attrs,
'aria-selected': String(this.isActive),
role: 'tab',
tabindex: 0,
}
data.on = {
...data.on,
keydown: (e: KeyboardEvent) => {
if (e.keyCode === keyCodes.enter) this.click(e)
this.$emit('keydown', e)
},
}
return h(tag, data, this.$slots.default)
},
})