quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
183 lines (149 loc) • 5.48 kB
JavaScript
import { h, ref, computed, withDirectives, getCurrentInstance } from 'vue'
import QIcon from '../icon/QIcon.js'
import Ripple from '../../directives/Ripple.js'
import { createComponent } from '../../utils/private/create.js'
export default createComponent({
name: 'StepHeader',
props: {
stepper: {},
step: {},
goToPanel: Function
},
setup (props, { attrs }) {
const { proxy: { $q } } = getCurrentInstance()
const blurRef = ref(null)
const isActive = computed(() => props.stepper.modelValue === props.step.name)
const isDisable = computed(() => {
const opt = props.step.disable
return opt === true || opt === ''
})
const isError = computed(() => {
const opt = props.step.error
return opt === true || opt === ''
})
const isDone = computed(() => {
const opt = props.step.done
return isDisable.value === false && (opt === true || opt === '')
})
const headerNav = computed(() => {
const
opt = props.step.headerNav,
nav = opt === true || opt === '' || opt === void 0
return isDisable.value === false
&& props.stepper.headerNav
&& nav
})
const hasPrefix = computed(() => {
return props.step.prefix
&& (isActive.value === false || props.stepper.activeIcon === 'none')
&& (isError.value === false || props.stepper.errorIcon === 'none')
&& (isDone.value === false || props.stepper.doneIcon === 'none')
})
const icon = computed(() => {
const defaultIcon = props.step.icon || props.stepper.inactiveIcon
if (isActive.value === true) {
const icon = props.step.activeIcon || props.stepper.activeIcon
return icon === 'none'
? defaultIcon
: icon || $q.iconSet.stepper.active
}
if (isError.value === true) {
const icon = props.step.errorIcon || props.stepper.errorIcon
return icon === 'none'
? defaultIcon
: icon || $q.iconSet.stepper.error
}
if (isDisable.value === false && isDone.value === true) {
const icon = props.step.doneIcon || props.stepper.doneIcon
return icon === 'none'
? defaultIcon
: icon || $q.iconSet.stepper.done
}
return defaultIcon
})
const color = computed(() => {
const errorColor = isError.value === true
? props.step.errorColor || props.stepper.errorColor
: void 0
if (isActive.value === true) {
const color = props.step.activeColor || props.stepper.activeColor || props.step.color
return color !== void 0
? color
: errorColor
}
if (errorColor !== void 0) {
return errorColor
}
if (isDisable.value === false && isDone.value === true) {
return props.step.doneColor || props.stepper.doneColor || props.step.color || props.stepper.inactiveColor
}
return props.step.color || props.stepper.inactiveColor
})
const classes = computed(() => {
return 'q-stepper__tab col-grow flex items-center no-wrap relative-position'
+ (color.value !== void 0 ? ` text-${ color.value }` : '')
+ (isError.value === true
? ' q-stepper__tab--error q-stepper__tab--error-with-' + (hasPrefix.value === true ? 'prefix' : 'icon')
: '')
+ (isActive.value === true ? ' q-stepper__tab--active' : '')
+ (isDone.value === true ? ' q-stepper__tab--done' : '')
+ (headerNav.value === true ? ' q-stepper__tab--navigation q-focusable q-hoverable' : '')
+ (isDisable.value === true ? ' q-stepper__tab--disabled' : '')
})
const ripple = computed(() => (
props.stepper.headerNav !== true
? false
: headerNav.value
))
function onActivate () {
blurRef.value !== null && blurRef.value.focus()
isActive.value === false && props.goToPanel(props.step.name)
}
function onKeyup (e) {
if (e.keyCode === 13 && isActive.value === false) {
props.goToPanel(props.step.name)
}
}
return () => {
const data = { class: classes.value }
if (headerNav.value === true) {
data.onClick = onActivate
data.onKeyup = onKeyup
Object.assign(data,
isDisable.value === true
? { tabindex: -1, 'aria-disabled': 'true' }
: { tabindex: attrs.tabindex || 0 }
)
}
const child = [
h('div', { class: 'q-focus-helper', tabindex: -1, ref: blurRef }),
h('div', { class: 'q-stepper__dot row flex-center q-stepper__line relative-position' }, [
h('span', { class: 'row flex-center' }, [
hasPrefix.value === true
? props.step.prefix
: h(QIcon, { name: icon.value })
])
])
]
if (props.step.title !== void 0 && props.step.title !== null) {
const content = [
h('div', { class: 'q-stepper__title' }, props.step.title)
]
if (props.step.caption !== void 0 && props.step.caption !== null) {
content.push(
h('div', { class: 'q-stepper__caption' }, props.step.caption)
)
}
child.push(
h('div', {
class: 'q-stepper__label q-stepper__line relative-position'
}, content)
)
}
return withDirectives(
h('div', data, child),
[ [ Ripple, ripple.value ] ]
)
}
}
})