VStepper.mjs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { mergeProps as _mergeProps, resolveDirective as _resolveDirective, createVNode as _createVNode, Fragment as _Fragment } from "vue";
  2. // Styles
  3. import "./VStepper.css";
  4. // Components
  5. import { VStepperSymbol } from "./shared.mjs";
  6. import { makeVStepperActionsProps, VStepperActions } from "./VStepperActions.mjs";
  7. import { VStepperHeader } from "./VStepperHeader.mjs";
  8. import { VStepperItem } from "./VStepperItem.mjs";
  9. import { VStepperWindow } from "./VStepperWindow.mjs";
  10. import { VStepperWindowItem } from "./VStepperWindowItem.mjs";
  11. import { VDivider } from "../VDivider/index.mjs";
  12. import { makeVSheetProps, VSheet } from "../VSheet/VSheet.mjs"; // Composables
  13. import { provideDefaults } from "../../composables/defaults.mjs";
  14. import { makeDisplayProps, useDisplay } from "../../composables/display.mjs";
  15. import { makeGroupProps, useGroup } from "../../composables/group.mjs";
  16. import { IconValue } from "../../composables/icons.mjs"; // Utilities
  17. import { computed, toRefs } from 'vue';
  18. import { genericComponent, getPropertyFromItem, only, propsFactory, useRender } from "../../util/index.mjs"; // Types
  19. export const makeStepperProps = propsFactory({
  20. altLabels: Boolean,
  21. bgColor: String,
  22. completeIcon: IconValue,
  23. editIcon: IconValue,
  24. editable: Boolean,
  25. errorIcon: IconValue,
  26. hideActions: Boolean,
  27. items: {
  28. type: Array,
  29. default: () => []
  30. },
  31. itemTitle: {
  32. type: String,
  33. default: 'title'
  34. },
  35. itemValue: {
  36. type: String,
  37. default: 'value'
  38. },
  39. nonLinear: Boolean,
  40. flat: Boolean,
  41. ...makeDisplayProps()
  42. }, 'Stepper');
  43. export const makeVStepperProps = propsFactory({
  44. ...makeStepperProps(),
  45. ...makeGroupProps({
  46. mandatory: 'force',
  47. selectedClass: 'v-stepper-item--selected'
  48. }),
  49. ...makeVSheetProps(),
  50. ...only(makeVStepperActionsProps(), ['prevText', 'nextText'])
  51. }, 'VStepper');
  52. export const VStepper = genericComponent()({
  53. name: 'VStepper',
  54. props: makeVStepperProps(),
  55. emits: {
  56. 'update:modelValue': v => true
  57. },
  58. setup(props, _ref) {
  59. let {
  60. slots
  61. } = _ref;
  62. const {
  63. items: _items,
  64. next,
  65. prev,
  66. selected
  67. } = useGroup(props, VStepperSymbol);
  68. const {
  69. displayClasses,
  70. mobile
  71. } = useDisplay(props);
  72. const {
  73. completeIcon,
  74. editIcon,
  75. errorIcon,
  76. color,
  77. editable,
  78. prevText,
  79. nextText
  80. } = toRefs(props);
  81. const items = computed(() => props.items.map((item, index) => {
  82. const title = getPropertyFromItem(item, props.itemTitle, item);
  83. const value = getPropertyFromItem(item, props.itemValue, index + 1);
  84. return {
  85. title,
  86. value,
  87. raw: item
  88. };
  89. }));
  90. const activeIndex = computed(() => {
  91. return _items.value.findIndex(item => selected.value.includes(item.id));
  92. });
  93. const disabled = computed(() => {
  94. if (props.disabled) return props.disabled;
  95. if (activeIndex.value === 0) return 'prev';
  96. if (activeIndex.value === _items.value.length - 1) return 'next';
  97. return false;
  98. });
  99. provideDefaults({
  100. VStepperItem: {
  101. editable,
  102. errorIcon,
  103. completeIcon,
  104. editIcon,
  105. prevText,
  106. nextText
  107. },
  108. VStepperActions: {
  109. color,
  110. disabled,
  111. prevText,
  112. nextText
  113. }
  114. });
  115. useRender(() => {
  116. const sheetProps = VSheet.filterProps(props);
  117. const hasHeader = !!(slots.header || props.items.length);
  118. const hasWindow = props.items.length > 0;
  119. const hasActions = !props.hideActions && !!(hasWindow || slots.actions);
  120. return _createVNode(VSheet, _mergeProps(sheetProps, {
  121. "color": props.bgColor,
  122. "class": ['v-stepper', {
  123. 'v-stepper--alt-labels': props.altLabels,
  124. 'v-stepper--flat': props.flat,
  125. 'v-stepper--non-linear': props.nonLinear,
  126. 'v-stepper--mobile': mobile.value
  127. }, displayClasses.value, props.class],
  128. "style": props.style
  129. }), {
  130. default: () => [hasHeader && _createVNode(VStepperHeader, {
  131. "key": "stepper-header"
  132. }, {
  133. default: () => [items.value.map((_ref2, index) => {
  134. let {
  135. raw,
  136. ...item
  137. } = _ref2;
  138. return _createVNode(_Fragment, null, [!!index && _createVNode(VDivider, null, null), _createVNode(VStepperItem, item, {
  139. default: slots[`header-item.${item.value}`] ?? slots.header,
  140. icon: slots.icon,
  141. title: slots.title,
  142. subtitle: slots.subtitle
  143. })]);
  144. })]
  145. }), hasWindow && _createVNode(VStepperWindow, {
  146. "key": "stepper-window"
  147. }, {
  148. default: () => [items.value.map(item => _createVNode(VStepperWindowItem, {
  149. "value": item.value
  150. }, {
  151. default: () => slots[`item.${item.value}`]?.(item) ?? slots.item?.(item)
  152. }))]
  153. }), slots.default?.({
  154. prev,
  155. next
  156. }), hasActions && (slots.actions?.({
  157. next,
  158. prev
  159. }) ?? _createVNode(VStepperActions, {
  160. "key": "stepper-actions",
  161. "onClick:prev": prev,
  162. "onClick:next": next
  163. }, slots))]
  164. });
  165. });
  166. return {
  167. prev,
  168. next
  169. };
  170. }
  171. });
  172. //# sourceMappingURL=VStepper.mjs.map