UNPKG

vuetify

Version:

Vue Material Component Framework

1 lines 16.6 kB
{"version":3,"file":"VTextField.mjs","names":["filterFieldProps","makeVFieldProps","VField","filterInputProps","makeVInputProps","VInput","VCounter","Intersect","forwardRefs","useFocus","useProxiedModel","cloneVNode","computed","nextTick","ref","callEvent","filterInputAttrs","genericComponent","pick","propsFactory","useRender","activeTypes","EventProp","Function","Array","makeVTextFieldProps","autofocus","Boolean","counter","Number","String","counterValue","hint","persistentHint","prefix","placeholder","persistentPlaceholder","persistentCounter","suffix","type","default","VTextField","name","directives","inheritAttrs","props","emits","e","focused","val","setup","attrs","emit","slots","model","isFocused","focus","blur","value","toString","length","max","maxlength","undefined","onIntersect","isIntersecting","entries","target","vInputRef","vFieldRef","inputRef","isActive","includes","messages","onFocus","document","activeElement","onControlMousedown","preventDefault","onControlClick","onClear","stopPropagation","onInput","hasCounter","hasDetails","details","rootAttrs","inputAttrs","modelValue","_","inputProps","fieldProps","variant","id","isDisabled","isDirty","isReadonly","isValid","dirty","class","fieldClass","slotProps","inputNode","handler","filterVTextFieldProps","Object","keys"],"sources":["../../../src/components/VTextField/VTextField.tsx"],"sourcesContent":["// Styles\nimport './VTextField.sass'\n\n// Components\nimport { filterFieldProps, makeVFieldProps, VField } from '@/components/VField/VField'\nimport { filterInputProps, makeVInputProps, VInput } from '@/components/VInput/VInput'\nimport { VCounter } from '@/components/VCounter'\n\n// Directives\nimport Intersect from '@/directives/intersect'\n\n// Composables\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useFocus } from '@/composables/focus'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { cloneVNode, computed, nextTick, ref } from 'vue'\nimport { callEvent, filterInputAttrs, genericComponent, pick, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { ExtractPropTypes, PropType } from 'vue'\nimport type { MakeSlots } from '@/util'\nimport type { VFieldSlots } from '@/components/VField/VField'\nimport type { VInputSlots } from '@/components/VInput/VInput'\n\nconst activeTypes = ['color', 'file', 'time', 'date', 'datetime-local', 'week', 'month']\n\ntype EventProp<T = (...args: any[]) => any> = T | T[]\nconst EventProp = [Function, Array] as PropType<EventProp>\n\nexport const makeVTextFieldProps = propsFactory({\n autofocus: Boolean,\n counter: [Boolean, Number, String] as PropType<true | number | string>,\n counterValue: Function as PropType<(value: any) => number>,\n hint: String,\n persistentHint: Boolean,\n prefix: String,\n placeholder: String,\n persistentPlaceholder: Boolean,\n persistentCounter: Boolean,\n suffix: String,\n type: {\n type: String,\n default: 'text',\n },\n\n ...makeVInputProps(),\n ...makeVFieldProps(),\n}, 'v-text-field')\n\nexport const VTextField = genericComponent<Omit<VInputSlots & VFieldSlots, 'default'> & MakeSlots<{\n default: []\n}>>()({\n name: 'VTextField',\n\n directives: { Intersect },\n\n inheritAttrs: false,\n\n props: makeVTextFieldProps(),\n\n emits: {\n 'click:control': (e: MouseEvent) => true,\n 'mousedown:control': (e: MouseEvent) => true,\n 'update:focused': (focused: boolean) => true,\n 'update:modelValue': (val: string) => true,\n },\n\n setup (props, { attrs, emit, slots }) {\n const model = useProxiedModel(props, 'modelValue')\n const { isFocused, focus, blur } = useFocus(props)\n const counterValue = computed(() => {\n return typeof props.counterValue === 'function'\n ? props.counterValue(model.value)\n : (model.value ?? '').toString().length\n })\n const max = computed(() => {\n if (attrs.maxlength) return attrs.maxlength as unknown as undefined\n\n if (\n !props.counter ||\n (typeof props.counter !== 'number' &&\n typeof props.counter !== 'string')\n ) return undefined\n\n return props.counter\n })\n\n function onIntersect (\n isIntersecting: boolean,\n entries: IntersectionObserverEntry[]\n ) {\n if (!props.autofocus || !isIntersecting) return\n\n (entries[0].target as HTMLInputElement)?.focus?.()\n }\n\n const vInputRef = ref<VInput>()\n const vFieldRef = ref<VField>()\n const inputRef = ref<HTMLInputElement>()\n const isActive = computed(() => (\n activeTypes.includes(props.type) ||\n props.persistentPlaceholder ||\n isFocused.value\n ))\n const messages = computed(() => {\n return props.messages.length\n ? props.messages\n : (isFocused.value || props.persistentHint) ? props.hint : ''\n })\n function onFocus () {\n if (inputRef.value !== document.activeElement) {\n inputRef.value?.focus()\n }\n\n if (!isFocused.value) focus()\n }\n function onControlMousedown (e: MouseEvent) {\n emit('mousedown:control', e)\n\n if (e.target === inputRef.value) return\n\n onFocus()\n e.preventDefault()\n }\n function onControlClick (e: MouseEvent) {\n onFocus()\n\n emit('click:control', e)\n }\n function onClear (e: MouseEvent) {\n e.stopPropagation()\n\n onFocus()\n\n nextTick(() => {\n model.value = null\n\n callEvent(props['onClick:clear'], e)\n })\n }\n function onInput (e: Event) {\n model.value = (e.target as HTMLInputElement).value\n }\n\n useRender(() => {\n const hasCounter = !!(slots.counter || props.counter || props.counterValue)\n const hasDetails = !!(hasCounter || slots.details)\n const [rootAttrs, inputAttrs] = filterInputAttrs(attrs)\n const [{ modelValue: _, ...inputProps }] = filterInputProps(props)\n const [fieldProps] = filterFieldProps(props)\n\n return (\n <VInput\n ref={ vInputRef }\n v-model={ model.value }\n class={[\n 'v-text-field',\n {\n 'v-text-field--prefixed': props.prefix,\n 'v-text-field--suffixed': props.suffix,\n 'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant),\n },\n ]}\n onClick:prepend={ props['onClick:prepend'] }\n onClick:append={ props['onClick:append'] }\n { ...rootAttrs }\n { ...inputProps }\n focused={ isFocused.value }\n messages={ messages.value }\n >\n {{\n ...slots,\n default: ({\n id,\n isDisabled,\n isDirty,\n isReadonly,\n isValid,\n }) => (\n <VField\n ref={ vFieldRef }\n onMousedown={ onControlMousedown }\n onClick={ onControlClick }\n onClick:clear={ onClear }\n onClick:prependInner={ props['onClick:prependInner'] }\n onClick:appendInner={ props['onClick:appendInner'] }\n role=\"textbox\"\n { ...fieldProps }\n id={ id.value }\n active={ isActive.value || isDirty.value }\n dirty={ isDirty.value || props.dirty }\n focused={ isFocused.value }\n error={ isValid.value === false }\n >\n {{\n ...slots,\n default: ({\n props: { class: fieldClass, ...slotProps },\n }) => {\n const inputNode = (\n <input\n ref={ inputRef }\n value={ model.value }\n onInput={ onInput }\n v-intersect={[{\n handler: onIntersect,\n }, null, ['once']]}\n autofocus={ props.autofocus }\n readonly={ isReadonly.value }\n disabled={ isDisabled.value }\n name={ props.name }\n placeholder={ props.placeholder }\n size={ 1 }\n type={ props.type }\n onFocus={ onFocus }\n onBlur={ blur }\n { ...slotProps }\n { ...inputAttrs }\n />\n )\n\n return (\n <>\n { props.prefix && (\n <span class=\"v-text-field__prefix\">\n { props.prefix }\n </span>\n ) }\n\n { slots.default ? (\n <div\n class={ fieldClass }\n data-no-activator=\"\"\n >\n { slots.default() }\n { inputNode }\n </div>\n ) : cloneVNode(inputNode, { class: fieldClass }) }\n\n { props.suffix && (\n <span class=\"v-text-field__suffix\">\n { props.suffix }\n </span>\n ) }\n </>\n )\n },\n }}\n </VField>\n ),\n details: hasDetails ? slotProps => (\n <>\n { slots.details?.(slotProps) }\n\n { hasCounter && (\n <>\n <span />\n\n <VCounter\n active={ props.persistentCounter || isFocused.value }\n value={ counterValue.value }\n max={ max.value }\n v-slots:default={ slots.counter }\n />\n </>\n ) }\n </>\n ) : undefined,\n }}\n </VInput>\n )\n })\n\n return forwardRefs({}, vInputRef, vFieldRef, inputRef)\n },\n})\n\nexport type VTextField = InstanceType<typeof VTextField>\n\nexport function filterVTextFieldProps (props: Partial<ExtractPropTypes<ReturnType<typeof makeVTextFieldProps>>>) {\n return pick(props, Object.keys(VTextField.props) as any)\n}\n"],"mappings":"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"}