UNPKG

vuetify

Version:

Vue Material Component Framework

173 lines (172 loc) 5.33 kB
import { Fragment as _Fragment, createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps } from "vue"; // Styles import "./VStepper.css"; // Components import { VStepperSymbol } from "./shared.js"; import { makeVStepperActionsProps, VStepperActions } from "./VStepperActions.js"; import { VStepperHeader } from "./VStepperHeader.js"; import { VStepperItem } from "./VStepperItem.js"; import { VStepperWindow } from "./VStepperWindow.js"; import { VStepperWindowItem } from "./VStepperWindowItem.js"; import { VDivider } from "../VDivider/index.js"; import { makeVSheetProps, VSheet } from "../VSheet/VSheet.js"; // Composables import { provideDefaults } from "../../composables/defaults.js"; import { makeDisplayProps, useDisplay } from "../../composables/display.js"; import { makeGroupProps, useGroup } from "../../composables/group.js"; import { IconValue } from "../../composables/icons.js"; // Utilities import { computed, toRefs } from 'vue'; import { genericComponent, getPropertyFromItem, pick, propsFactory, useRender } from "../../util/index.js"; // Types export const makeStepperProps = propsFactory({ altLabels: Boolean, bgColor: String, completeIcon: IconValue, editIcon: IconValue, editable: Boolean, errorIcon: IconValue, hideActions: Boolean, items: { type: Array, default: () => [] }, itemTitle: { type: String, default: 'title' }, itemValue: { type: String, default: 'value' }, nonLinear: Boolean, flat: Boolean, ...makeDisplayProps() }, 'Stepper'); export const makeVStepperProps = propsFactory({ ...makeStepperProps(), ...makeGroupProps({ mandatory: 'force', selectedClass: 'v-stepper-item--selected' }), ...makeVSheetProps(), ...pick(makeVStepperActionsProps(), ['prevText', 'nextText']) }, 'VStepper'); export const VStepper = genericComponent()({ name: 'VStepper', props: makeVStepperProps(), emits: { 'update:modelValue': v => true }, setup(props, _ref) { let { slots } = _ref; const { items: _items, next, prev, selected } = useGroup(props, VStepperSymbol); const { displayClasses, mobile } = useDisplay(props); const { completeIcon, editIcon, errorIcon, color, editable, prevText, nextText } = toRefs(props); const items = computed(() => props.items.map((item, index) => { const title = getPropertyFromItem(item, props.itemTitle, item); const value = getPropertyFromItem(item, props.itemValue, index + 1); return { title, value, raw: item }; })); const activeIndex = computed(() => { return _items.value.findIndex(item => selected.value.includes(item.id)); }); const disabled = computed(() => { if (props.disabled) return props.disabled; if (activeIndex.value === 0) return 'prev'; if (activeIndex.value === _items.value.length - 1) return 'next'; return false; }); provideDefaults({ VStepperItem: { editable, errorIcon, completeIcon, editIcon, prevText, nextText }, VStepperActions: { color, disabled, prevText, nextText } }); useRender(() => { const sheetProps = VSheet.filterProps(props); const hasHeader = !!(slots.header || props.items.length); const hasWindow = props.items.length > 0; const hasActions = !props.hideActions && !!(hasWindow || slots.actions); return _createVNode(VSheet, _mergeProps(sheetProps, { "color": props.bgColor, "class": ['v-stepper', { 'v-stepper--alt-labels': props.altLabels, 'v-stepper--flat': props.flat, 'v-stepper--non-linear': props.nonLinear, 'v-stepper--mobile': mobile.value }, displayClasses.value, props.class], "style": props.style }), { default: () => [hasHeader && _createVNode(VStepperHeader, { "key": "stepper-header" }, { default: () => [items.value.map((_ref2, index) => { let { raw, ...item } = _ref2; return _createElementVNode(_Fragment, null, [!!index && _createVNode(VDivider, null, null), _createVNode(VStepperItem, item, { default: slots[`header-item.${item.value}`] ?? slots.header, icon: slots.icon, title: slots.title, subtitle: slots.subtitle })]); })] }), hasWindow && _createVNode(VStepperWindow, { "key": "stepper-window" }, { default: () => [items.value.map(item => _createVNode(VStepperWindowItem, { "value": item.value }, { default: () => slots[`item.${item.value}`]?.(item) ?? slots.item?.(item) }))] }), slots.default?.({ prev, next }), hasActions && (slots.actions?.({ next, prev }) ?? _createVNode(VStepperActions, { "key": "stepper-actions", "onClick:prev": prev, "onClick:next": next }, slots))] }); }); return { prev, next }; } }); //# sourceMappingURL=VStepper.js.map