VStepperVerticalItem.mjs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { mergeProps as _mergeProps, resolveDirective as _resolveDirective, createVNode as _createVNode, Fragment as _Fragment } from "vue";
  2. // Styles
  3. import "./VStepperVerticalItem.css";
  4. // Components
  5. import { VStepperVerticalActions } from "./VStepperVerticalActions.mjs";
  6. import { VAvatar } from "../../components/VAvatar/VAvatar.mjs";
  7. import { VDefaultsProvider } from "../../components/VDefaultsProvider/VDefaultsProvider.mjs";
  8. import { makeVExpansionPanelProps, VExpansionPanel } from "../../components/VExpansionPanel/VExpansionPanel.mjs";
  9. import { VIcon } from "../../components/VIcon/VIcon.mjs";
  10. import { makeStepperItemProps } from "../../components/VStepper/VStepperItem.mjs"; // Utilities
  11. import { computed, ref } from 'vue';
  12. import { genericComponent, omit, propsFactory, useRender } from "../../util/index.mjs"; // Types
  13. export const makeVStepperVerticalItemProps = propsFactory({
  14. hideActions: Boolean,
  15. ...makeStepperItemProps(),
  16. ...omit(makeVExpansionPanelProps({
  17. expandIcon: '',
  18. collapseIcon: ''
  19. }), ['hideActions'])
  20. }, 'VStepperVerticalItem');
  21. export const VStepperVerticalItem = genericComponent()({
  22. name: 'VStepperVerticalItem',
  23. props: makeVStepperVerticalItemProps(),
  24. emits: {
  25. 'click:next': () => true,
  26. 'click:prev': () => true,
  27. 'click:finish': () => true
  28. },
  29. setup(props, _ref) {
  30. let {
  31. emit,
  32. slots
  33. } = _ref;
  34. const vExpansionPanelRef = ref();
  35. const step = computed(() => !isNaN(parseInt(props.value)) ? Number(props.value) : props.value);
  36. const groupItem = computed(() => vExpansionPanelRef.value?.groupItem);
  37. const isSelected = computed(() => groupItem.value?.isSelected.value ?? false);
  38. const isValid = computed(() => isSelected.value ? props.rules.every(handler => handler() === true) : null);
  39. const canEdit = computed(() => !props.disabled && props.editable);
  40. const hasError = computed(() => props.error || isSelected.value && !isValid.value);
  41. const hasCompleted = computed(() => props.complete || props.rules.length > 0 && isValid.value === true);
  42. const disabled = computed(() => {
  43. if (props.disabled) return props.disabled;
  44. if (groupItem.value?.isFirst.value) return 'prev';
  45. return false;
  46. });
  47. const icon = computed(() => {
  48. if (hasError.value) return props.errorIcon;
  49. if (hasCompleted.value) return props.completeIcon;
  50. if (groupItem.value?.isSelected.value && props.editable) return props.editIcon;
  51. return props.icon;
  52. });
  53. const slotProps = computed(() => ({
  54. canEdit: canEdit.value,
  55. hasError: hasError.value,
  56. hasCompleted: hasCompleted.value,
  57. title: props.title,
  58. subtitle: props.subtitle,
  59. step: step.value,
  60. value: props.value
  61. }));
  62. const actionProps = computed(() => ({
  63. ...slotProps.value,
  64. prev: onClickPrev,
  65. next: onClickNext
  66. }));
  67. function onClickNext() {
  68. emit('click:next');
  69. if (groupItem.value?.isLast.value) return;
  70. groupItem.value.group.next();
  71. }
  72. function onClickPrev() {
  73. emit('click:prev');
  74. groupItem.value.group.prev();
  75. }
  76. useRender(() => {
  77. const hasColor = (hasCompleted.value || groupItem.value?.isSelected.value) && !hasError.value && !props.disabled;
  78. const hasActions = !props.hideActions || !!slots.actions;
  79. const expansionPanelProps = VExpansionPanel.filterProps(props);
  80. return _createVNode(VExpansionPanel, _mergeProps({
  81. "_as": "VStepperVerticalItem",
  82. "ref": vExpansionPanelRef
  83. }, expansionPanelProps, {
  84. "class": ['v-stepper-vertical-item', {
  85. 'v-stepper-vertical-item--complete': hasCompleted.value,
  86. 'v-stepper-vertical-item--disabled': props.disabled,
  87. 'v-stepper-vertical-item--editable': canEdit.value,
  88. 'v-stepper-vertical-item--error': hasError.value
  89. }, props.class],
  90. "readonly": !props.editable,
  91. "style": props.style,
  92. "color": "",
  93. "hide-actions": false,
  94. "value": step.value
  95. }), {
  96. title: () => _createVNode(_Fragment, null, [_createVNode(VAvatar, {
  97. "key": "stepper-avatar",
  98. "class": "v-stepper-vertical-item__avatar",
  99. "color": hasColor ? props.color : undefined,
  100. "size": 24,
  101. "start": true
  102. }, {
  103. default: () => [slots.icon?.(slotProps.value) ?? (icon.value ? _createVNode(VIcon, {
  104. "icon": icon.value
  105. }, null) : step.value)]
  106. }), _createVNode("div", null, [_createVNode("div", {
  107. "class": "v-stepper-vertical-item__title"
  108. }, [slots.title?.(slotProps.value) ?? props.title]), _createVNode("div", {
  109. "class": "v-stepper-vertical-item__subtitle"
  110. }, [slots.subtitle?.(slotProps.value) ?? props.subtitle])])]),
  111. text: () => _createVNode(_Fragment, null, [slots.default?.(slotProps.value) ?? props.text, hasActions && _createVNode(VDefaultsProvider, {
  112. "defaults": {
  113. VStepperVerticalActions: {
  114. disabled: disabled.value,
  115. finish: groupItem.value?.isLast.value
  116. }
  117. }
  118. }, {
  119. default: () => [slots.actions?.(actionProps.value) ?? _createVNode(VStepperVerticalActions, {
  120. "onClick:next": onClickNext,
  121. "onClick:prev": onClickPrev
  122. }, {
  123. prev: slots.prev ? () => slots.prev?.(actionProps.value) : undefined,
  124. next: slots.next ? () => slots.next?.(actionProps.value) : undefined
  125. })]
  126. })])
  127. });
  128. });
  129. return {};
  130. }
  131. });
  132. //# sourceMappingURL=VStepperVerticalItem.mjs.map