vuetify
Version:
Vue Material Component Framework
174 lines (173 loc) • 5.49 kB
JavaScript
import { createVNode as _createVNode } from "vue";
// Styles
import "./VInput.css";
// Components
import { useInputIcon } from "./InputIcon.js";
import { VMessages } from "../VMessages/VMessages.js"; // Composables
import { makeComponentProps } from "../../composables/component.js";
import { makeDensityProps, useDensity } from "../../composables/density.js";
import { makeDimensionProps, useDimension } from "../../composables/dimensions.js";
import { IconValue } from "../../composables/icons.js";
import { useRtl } from "../../composables/locale.js";
import { makeThemeProps, provideTheme } from "../../composables/theme.js";
import { makeValidationProps, useValidation } from "../../composables/validation.js"; // Utilities
import { computed, toRef, useId } from 'vue';
import { EventProp, genericComponent, pick, propsFactory, useRender } from "../../util/index.js"; // Types
export const makeVInputProps = propsFactory({
id: String,
appendIcon: IconValue,
baseColor: String,
centerAffix: {
type: Boolean,
default: true
},
color: String,
glow: Boolean,
iconColor: [Boolean, String],
prependIcon: IconValue,
hideDetails: [Boolean, String],
hideSpinButtons: Boolean,
hint: String,
persistentHint: Boolean,
messages: {
type: [Array, String],
default: () => []
},
direction: {
type: String,
default: 'horizontal',
validator: v => ['horizontal', 'vertical'].includes(v)
},
'onClick:prepend': EventProp(),
'onClick:append': EventProp(),
...makeComponentProps(),
...makeDensityProps(),
...pick(makeDimensionProps(), ['maxWidth', 'minWidth', 'width']),
...makeThemeProps(),
...makeValidationProps()
}, 'VInput');
export const VInput = genericComponent()({
name: 'VInput',
props: {
...makeVInputProps()
},
emits: {
'update:modelValue': value => true
},
setup(props, _ref) {
let {
attrs,
slots,
emit
} = _ref;
const {
densityClasses
} = useDensity(props);
const {
dimensionStyles
} = useDimension(props);
const {
themeClasses
} = provideTheme(props);
const {
rtlClasses
} = useRtl();
const {
InputIcon
} = useInputIcon(props);
const uid = useId();
const id = computed(() => props.id || `input-${uid}`);
const messagesId = computed(() => `${id.value}-messages`);
const {
errorMessages,
isDirty,
isDisabled,
isReadonly,
isPristine,
isValid,
isValidating,
reset,
resetValidation,
validate,
validationClasses
} = useValidation(props, 'v-input', id);
const slotProps = computed(() => ({
id,
messagesId,
isDirty,
isDisabled,
isReadonly,
isPristine,
isValid,
isValidating,
reset,
resetValidation,
validate
}));
const color = toRef(() => {
return props.error || props.disabled ? undefined : props.focused ? props.color : props.baseColor;
});
const iconColor = toRef(() => {
if (!props.iconColor) return undefined;
return props.iconColor === true ? color.value : props.iconColor;
});
const messages = computed(() => {
if (props.errorMessages?.length || !isPristine.value && errorMessages.value.length) {
return errorMessages.value;
} else if (props.hint && (props.persistentHint || props.focused)) {
return props.hint;
} else {
return props.messages;
}
});
useRender(() => {
const hasPrepend = !!(slots.prepend || props.prependIcon);
const hasAppend = !!(slots.append || props.appendIcon);
const hasMessages = messages.value.length > 0;
const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
return _createVNode("div", {
"class": ['v-input', `v-input--${props.direction}`, {
'v-input--center-affix': props.centerAffix,
'v-input--focused': props.focused,
'v-input--glow': props.glow,
'v-input--hide-spin-buttons': props.hideSpinButtons
}, densityClasses.value, themeClasses.value, rtlClasses.value, validationClasses.value, props.class],
"style": [dimensionStyles.value, props.style]
}, [hasPrepend && _createVNode("div", {
"key": "prepend",
"class": "v-input__prepend"
}, [slots.prepend?.(slotProps.value), props.prependIcon && _createVNode(InputIcon, {
"key": "prepend-icon",
"name": "prepend",
"color": iconColor.value
}, null)]), slots.default && _createVNode("div", {
"class": "v-input__control"
}, [slots.default?.(slotProps.value)]), hasAppend && _createVNode("div", {
"key": "append",
"class": "v-input__append"
}, [props.appendIcon && _createVNode(InputIcon, {
"key": "append-icon",
"name": "append",
"color": iconColor.value
}, null), slots.append?.(slotProps.value)]), hasDetails && _createVNode("div", {
"id": messagesId.value,
"class": "v-input__details",
"role": "alert",
"aria-live": "polite"
}, [_createVNode(VMessages, {
"active": hasMessages,
"messages": messages.value
}, {
message: slots.message
}), slots.details?.(slotProps.value)])]);
});
return {
reset,
resetValidation,
validate,
isValid,
errorMessages
};
}
});
//# sourceMappingURL=VInput.js.map