VInput.mjs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
  2. // Styles
  3. import "./VInput.css";
  4. // Components
  5. import { useInputIcon } from "./InputIcon.mjs";
  6. import { VMessages } from "../VMessages/VMessages.mjs"; // Composables
  7. import { makeComponentProps } from "../../composables/component.mjs";
  8. import { makeDensityProps, useDensity } from "../../composables/density.mjs";
  9. import { makeDimensionProps, useDimension } from "../../composables/dimensions.mjs";
  10. import { IconValue } from "../../composables/icons.mjs";
  11. import { useRtl } from "../../composables/locale.mjs";
  12. import { makeThemeProps, provideTheme } from "../../composables/theme.mjs";
  13. import { makeValidationProps, useValidation } from "../../composables/validation.mjs"; // Utilities
  14. import { computed } from 'vue';
  15. import { EventProp, genericComponent, getUid, only, propsFactory, useRender } from "../../util/index.mjs"; // Types
  16. export const makeVInputProps = propsFactory({
  17. id: String,
  18. appendIcon: IconValue,
  19. centerAffix: {
  20. type: Boolean,
  21. default: true
  22. },
  23. prependIcon: IconValue,
  24. hideDetails: [Boolean, String],
  25. hideSpinButtons: Boolean,
  26. hint: String,
  27. persistentHint: Boolean,
  28. messages: {
  29. type: [Array, String],
  30. default: () => []
  31. },
  32. direction: {
  33. type: String,
  34. default: 'horizontal',
  35. validator: v => ['horizontal', 'vertical'].includes(v)
  36. },
  37. 'onClick:prepend': EventProp(),
  38. 'onClick:append': EventProp(),
  39. ...makeComponentProps(),
  40. ...makeDensityProps(),
  41. ...only(makeDimensionProps(), ['maxWidth', 'minWidth', 'width']),
  42. ...makeThemeProps(),
  43. ...makeValidationProps()
  44. }, 'VInput');
  45. export const VInput = genericComponent()({
  46. name: 'VInput',
  47. props: {
  48. ...makeVInputProps()
  49. },
  50. emits: {
  51. 'update:modelValue': value => true
  52. },
  53. setup(props, _ref) {
  54. let {
  55. attrs,
  56. slots,
  57. emit
  58. } = _ref;
  59. const {
  60. densityClasses
  61. } = useDensity(props);
  62. const {
  63. dimensionStyles
  64. } = useDimension(props);
  65. const {
  66. themeClasses
  67. } = provideTheme(props);
  68. const {
  69. rtlClasses
  70. } = useRtl();
  71. const {
  72. InputIcon
  73. } = useInputIcon(props);
  74. const uid = getUid();
  75. const id = computed(() => props.id || `input-${uid}`);
  76. const messagesId = computed(() => `${id.value}-messages`);
  77. const {
  78. errorMessages,
  79. isDirty,
  80. isDisabled,
  81. isReadonly,
  82. isPristine,
  83. isValid,
  84. isValidating,
  85. reset,
  86. resetValidation,
  87. validate,
  88. validationClasses
  89. } = useValidation(props, 'v-input', id);
  90. const slotProps = computed(() => ({
  91. id,
  92. messagesId,
  93. isDirty,
  94. isDisabled,
  95. isReadonly,
  96. isPristine,
  97. isValid,
  98. isValidating,
  99. reset,
  100. resetValidation,
  101. validate
  102. }));
  103. const messages = computed(() => {
  104. if (props.errorMessages?.length || !isPristine.value && errorMessages.value.length) {
  105. return errorMessages.value;
  106. } else if (props.hint && (props.persistentHint || props.focused)) {
  107. return props.hint;
  108. } else {
  109. return props.messages;
  110. }
  111. });
  112. useRender(() => {
  113. const hasPrepend = !!(slots.prepend || props.prependIcon);
  114. const hasAppend = !!(slots.append || props.appendIcon);
  115. const hasMessages = messages.value.length > 0;
  116. const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
  117. return _createVNode("div", {
  118. "class": ['v-input', `v-input--${props.direction}`, {
  119. 'v-input--center-affix': props.centerAffix,
  120. 'v-input--hide-spin-buttons': props.hideSpinButtons
  121. }, densityClasses.value, themeClasses.value, rtlClasses.value, validationClasses.value, props.class],
  122. "style": [dimensionStyles.value, props.style]
  123. }, [hasPrepend && _createVNode("div", {
  124. "key": "prepend",
  125. "class": "v-input__prepend"
  126. }, [slots.prepend?.(slotProps.value), props.prependIcon && _createVNode(InputIcon, {
  127. "key": "prepend-icon",
  128. "name": "prepend"
  129. }, null)]), slots.default && _createVNode("div", {
  130. "class": "v-input__control"
  131. }, [slots.default?.(slotProps.value)]), hasAppend && _createVNode("div", {
  132. "key": "append",
  133. "class": "v-input__append"
  134. }, [props.appendIcon && _createVNode(InputIcon, {
  135. "key": "append-icon",
  136. "name": "append"
  137. }, null), slots.append?.(slotProps.value)]), hasDetails && _createVNode("div", {
  138. "class": "v-input__details"
  139. }, [_createVNode(VMessages, {
  140. "id": messagesId.value,
  141. "active": hasMessages,
  142. "messages": messages.value
  143. }, {
  144. message: slots.message
  145. }), slots.details?.(slotProps.value)])]);
  146. });
  147. return {
  148. reset,
  149. resetValidation,
  150. validate,
  151. isValid,
  152. errorMessages
  153. };
  154. }
  155. });
  156. //# sourceMappingURL=VInput.mjs.map