refactor(VnAccountNumber): refs #8718 simplify model handling and input management
This commit is contained in:
parent
5e087d9e3a
commit
110b6ef548
|
@ -1,12 +1,9 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { nextTick, ref, watch } from 'vue';
|
import { nextTick, ref } from 'vue';
|
||||||
import { QInput } from 'quasar';
|
import VnInput from './VnInput.vue';
|
||||||
|
import { useAccountShortToStandard } from 'src/composables/useAccountShortToStandard';
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
modelValue: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
insertable: {
|
insertable: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
|
@ -14,70 +11,26 @@ const $props = defineProps({
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue', 'accountShortToStandard']);
|
const emit = defineEmits(['update:modelValue', 'accountShortToStandard']);
|
||||||
|
const model = defineModel({ prop: 'modelValue' });
|
||||||
|
const inputRef = ref(false);
|
||||||
|
|
||||||
let internalValue = ref($props.modelValue);
|
function setCursorPosition(pos) {
|
||||||
|
const input = inputRef.value.vnInputRef.$el.querySelector('input');
|
||||||
watch(
|
input.focus();
|
||||||
() => $props.modelValue,
|
input.setSelectionRange(pos, pos);
|
||||||
(newVal) => {
|
|
||||||
internalValue.value = newVal;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => internalValue.value,
|
|
||||||
(newVal) => {
|
|
||||||
emit('update:modelValue', newVal);
|
|
||||||
accountShortToStandard();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleKeydown = (e) => {
|
|
||||||
if (e.key === 'Backspace') return;
|
|
||||||
if (e.key === '.') {
|
|
||||||
accountShortToStandard();
|
|
||||||
// TODO: Fix this setTimeout, with nextTick doesn't work
|
|
||||||
setTimeout(() => {
|
|
||||||
setCursorPosition(0, e.target);
|
|
||||||
}, 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($props.insertable && e.key.match(/[0-9]/)) {
|
|
||||||
handleInsertMode(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
function setCursorPosition(pos, el = vnInputRef.value) {
|
|
||||||
el.focus();
|
|
||||||
el.setSelectionRange(pos, pos);
|
|
||||||
}
|
}
|
||||||
const vnInputRef = ref(false);
|
|
||||||
const handleInsertMode = (e) => {
|
async function handleUpdateModel(val) {
|
||||||
e.preventDefault();
|
model.value = val?.at(-1) === '.' ? useAccountShortToStandard(val) : val;
|
||||||
const input = e.target;
|
await nextTick(() => setCursorPosition(0));
|
||||||
const cursorPos = input.selectionStart;
|
|
||||||
const { maxlength } = vnInputRef.value;
|
|
||||||
let currentValue = internalValue.value;
|
|
||||||
if (!currentValue) currentValue = e.key;
|
|
||||||
const newValue = e.key;
|
|
||||||
if (newValue && !isNaN(newValue) && cursorPos < maxlength) {
|
|
||||||
internalValue.value =
|
|
||||||
currentValue.substring(0, cursorPos) +
|
|
||||||
newValue +
|
|
||||||
currentValue.substring(cursorPos + 1);
|
|
||||||
}
|
|
||||||
nextTick(() => {
|
|
||||||
input.setSelectionRange(cursorPos + 1, cursorPos + 1);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
function accountShortToStandard() {
|
|
||||||
internalValue.value = internalValue.value?.replace(
|
|
||||||
'.',
|
|
||||||
'0'.repeat(11 - internalValue.value.length)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<QInput @keydown="handleKeydown" ref="vnInputRef" v-model="internalValue" />
|
<VnInput
|
||||||
|
v-model="model"
|
||||||
|
ref="inputRef"
|
||||||
|
v-bind="$attrs"
|
||||||
|
:insertable
|
||||||
|
@update:model-value="handleUpdateModel"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -83,7 +83,7 @@ const mixinRules = [
|
||||||
requiredFieldRule,
|
requiredFieldRule,
|
||||||
...($attrs.rules ?? []),
|
...($attrs.rules ?? []),
|
||||||
(val) => {
|
(val) => {
|
||||||
const { maxlength } = vnInputRef.value;
|
const maxlength = $props.maxlength;
|
||||||
if (maxlength && +val.length > maxlength)
|
if (maxlength && +val.length > maxlength)
|
||||||
return t(`maxLength`, { value: maxlength });
|
return t(`maxLength`, { value: maxlength });
|
||||||
const { min, max } = vnInputRef.value.$attrs;
|
const { min, max } = vnInputRef.value.$attrs;
|
||||||
|
@ -108,7 +108,7 @@ const handleInsertMode = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const input = e.target;
|
const input = e.target;
|
||||||
const cursorPos = input.selectionStart;
|
const cursorPos = input.selectionStart;
|
||||||
const { maxlength } = vnInputRef.value;
|
const maxlength = $props.maxlength;
|
||||||
let currentValue = value.value;
|
let currentValue = value.value;
|
||||||
if (!currentValue) currentValue = e.key;
|
if (!currentValue) currentValue = e.key;
|
||||||
const newValue = e.key;
|
const newValue = e.key;
|
||||||
|
|
|
@ -108,7 +108,6 @@ function handleLocation(data, location) {
|
||||||
<VnAccountNumber
|
<VnAccountNumber
|
||||||
v-model="data.account"
|
v-model="data.account"
|
||||||
:label="t('supplier.fiscalData.account')"
|
:label="t('supplier.fiscalData.account')"
|
||||||
clearable
|
|
||||||
data-cy="supplierFiscalDataAccount"
|
data-cy="supplierFiscalDataAccount"
|
||||||
insertable
|
insertable
|
||||||
:maxlength="10"
|
:maxlength="10"
|
||||||
|
|
Loading…
Reference in New Issue