diff --git a/src/boot/qformMixin.js b/src/boot/qformMixin.js index cb31391b33d..182c51e4793 100644 --- a/src/boot/qformMixin.js +++ b/src/boot/qformMixin.js @@ -30,22 +30,5 @@ export default { } catch (error) { console.error(error); } - form.addEventListener('keyup', function (evt) { - if (evt.key === 'Enter' && !that.$attrs['prevent-submit']) { - const input = evt.target; - if (input.type == 'textarea' && evt.shiftKey) { - evt.preventDefault(); - let { selectionStart, selectionEnd } = input; - input.value = - input.value.substring(0, selectionStart) + - '\n' + - input.value.substring(selectionEnd); - selectionStart = selectionEnd = selectionStart + 1; - return; - } - evt.preventDefault(); - that.onSubmit(); - } - }); }, }; diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 633f1254d9e..5681ce11c85 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -1,6 +1,6 @@ <script setup> import axios from 'axios'; -import { onMounted, onUnmounted, computed, ref, watch, nextTick } from 'vue'; +import { onMounted, onUnmounted, computed, ref, watch, nextTick, useAttrs } from 'vue'; import { onBeforeRouteLeave, useRouter, useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; @@ -22,6 +22,7 @@ const { validate } = useValidator(); const { notify } = useNotify(); const route = useRoute(); const myForm = ref(null); +const attrs = useAttrs(); const $props = defineProps({ url: { type: String, @@ -113,7 +114,7 @@ const defaultButtons = computed(() => ({ color: 'primary', icon: 'save', label: 'globals.save', - click: () => myForm.value.onSubmit(false), + click: async () => await save(), type: 'submit', }, reset: { @@ -208,8 +209,7 @@ async function fetch() { } } -async function save(prevent = false) { - if (prevent) return; +async function save() { if ($props.observeFormChanges && !hasChanges.value) return notify('globals.noChanges', 'negative'); @@ -284,6 +284,22 @@ function trimData(data) { return data; } +async function onKeyup(evt) { + if (evt.key === 'Enter' && !('prevent-submit' in attrs)) { + const input = evt.target; + if (input.type == 'textarea' && evt.shiftKey) { + let { selectionStart, selectionEnd } = input; + input.value = + input.value.substring(0, selectionStart) + + '\n' + + input.value.substring(selectionEnd); + selectionStart = selectionEnd = selectionStart + 1; + return; + } + await save(); + } +} + defineExpose({ save, isLoading, @@ -298,12 +314,12 @@ defineExpose({ <QForm ref="myForm" v-if="formData" - @submit="save(!!$event)" + @submit.prevent + @keyup.prevent="onKeyup" @reset="reset" class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" id="formModel" - :prevent-submit="$attrs['prevent-submit']" > <QCard> <slot diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index 98b6117431e..672eeff7a23 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -27,10 +27,15 @@ const formModelRef = ref(null); const closeButton = ref(null); const isSaveAndContinue = ref(false); const onDataSaved = (formData, requestResponse) => { - if (closeButton.value && isSaveAndContinue) closeButton.value.click(); + if (closeButton.value && !isSaveAndContinue.value) closeButton.value.click(); emit('onDataSaved', formData, requestResponse); }; +const onClick = async (saveAndContinue) => { + isSaveAndContinue.value = saveAndContinue; + await formModelRef.value.save(); +}; + const isLoading = computed(() => formModelRef.value?.isLoading); const reset = computed(() => formModelRef.value?.reset); @@ -78,10 +83,7 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" - @click=" - formModelRef.save(); - isSaveAndContinue = false; - " + @click="onClick(false)" color="primary" class="q-ml-sm" :disabled="isLoading" @@ -99,10 +101,7 @@ defineExpose({ :loading="isLoading" data-cy="FormModelPopup_isSaveAndContinue" z-max - @click=" - isSaveAndContinue = true; - formModelRef.save(); - " + @click="onClick(true)" /> </div> </template> diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue index 7f45cd7db6a..8f61bac89ec 100644 --- a/src/pages/Customer/components/CustomerNewPayment.vue +++ b/src/pages/Customer/components/CustomerNewPayment.vue @@ -114,7 +114,7 @@ function onBeforeSave(data) { if (isCash.value && shouldSendEmail.value && !data.email) return notify(t('There is no assigned email for this client'), 'negative'); - data.bankFk = data.bankFk.id; + data.bankFk = data.bankFk?.id; return data; } @@ -189,7 +189,7 @@ async function getAmountPaid() { :url-create="urlCreate" :mapper="onBeforeSave" @on-data-saved="onDataSaved" - :prevent-submit="true" + prevent-submit > <template #form="{ data, validate }"> <span ref="closeButton" class="row justify-end close-icon" v-close-popup> diff --git a/src/pages/Zone/Card/ZoneBasicData.vue b/src/pages/Zone/Card/ZoneBasicData.vue index b38d2749b6f..03013f011b9 100644 --- a/src/pages/Zone/Card/ZoneBasicData.vue +++ b/src/pages/Zone/Card/ZoneBasicData.vue @@ -25,7 +25,7 @@ const setFilteredAddresses = (data) => { @on-fetch="(data) => (validAddresses = data)" /> <FetchData url="Addresses" auto-load @on-fetch="setFilteredAddresses" /> - <FormModel auto-load model="zone"> + <FormModel auto-load model="Zone"> <template #form="{ data, validate }"> <VnRow> <VnInput @@ -33,6 +33,7 @@ const setFilteredAddresses = (data) => { :label="t('Name')" clearable v-model="data.name" + :required="true" /> </VnRow> <VnRow> @@ -83,7 +84,7 @@ const setFilteredAddresses = (data) => { type="number" min="0" /> - <VnInputTime v-model="data.hour" :label="t('Closing')" /> + <VnInputTime v-model="data.hour" :label="t('Closing')" :required="true" /> </VnRow> <VnRow> @@ -92,7 +93,7 @@ const setFilteredAddresses = (data) => { :label="t('Price')" type="number" min="0" - required="true" + :required="true" clearable /> <VnInput @@ -100,7 +101,7 @@ const setFilteredAddresses = (data) => { :label="t('Price optimum')" type="number" min="0" - required="true" + :required="true" clearable /> </VnRow> diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index d6297e9734a..a82bbb28540 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -131,6 +131,7 @@ const columns = computed(() => [ label: t('list.addressFk'), cardVisible: true, columnFilter: false, + columnClass: 'expand', }, { align: 'right',