diff --git a/src/boot/quasar.js b/src/boot/quasar.js index a4f2ba0fe..7fb814c1f 100644 --- a/src/boot/quasar.js +++ b/src/boot/quasar.js @@ -7,7 +7,7 @@ import { QLayout } from 'quasar'; import mainShortcutMixin from './mainShortcutMixin'; import { useCau } from 'src/composables/useCau'; -export default boot(({ app }) => { +export default boot(({ app, router }) => { QForm.mixins = [qFormMixin]; QLayout.mixins = [mainShortcutMixin]; @@ -22,6 +22,14 @@ export default boot(({ app }) => { } switch (response?.status) { + case 401: + if (!router.currentRoute.value.name.toLowerCase().includes('login')) { + message = 'errors.sessionExpired'; + } else message = 'login.loginError'; + break; + case 403: + if (!message || message.toLowerCase() === 'access denied') + message = 'errors.accessDenied'; case 422: if (error.name == 'ValidationError') message += ` "${responseError.details.context}.${Object.keys( diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue index 3ce62c5de..b6cc5665f 100644 --- a/src/components/VnTable/VnColumn.vue +++ b/src/components/VnTable/VnColumn.vue @@ -180,7 +180,11 @@ const col = computed(() => { ) newColumn.component = 'checkbox'; if ($props.default && !newColumn.component) newColumn.component = $props.default; - + + if (typeof newColumn.component !== 'string') { + newColumn.attrs = { ...newColumn.component.attrs, autofocus: $props.autofocus }; + newColumn.event = { ...newColumn.component.event, ...$props?.eventHandlers }; + } return newColumn; }); diff --git a/src/components/common/VnSelectExpense.vue b/src/components/common/VnSelectExpense.vue new file mode 100644 index 000000000..406715b84 --- /dev/null +++ b/src/components/common/VnSelectExpense.vue @@ -0,0 +1,49 @@ + + + +es: + Create a new expense: Crear nuevo gasto + diff --git a/src/composables/useValidator.js b/src/composables/useValidator.js index ae6c47d91..e887c0c4f 100644 --- a/src/composables/useValidator.js +++ b/src/composables/useValidator.js @@ -47,7 +47,9 @@ export function useValidator() { return !validator.isEmpty(value ? String(value) : '') || message; }, required: (required, value) => { - return required ? !!value || t('globals.fieldRequired') : null; + return required + ? value === 0 || !!value || t('globals.fieldRequired') + : null; }, length: (value) => { const options = { diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 070d384bf..d39a8232a 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -401,6 +401,8 @@ errors: updateUserConfig: Error updating user config tokenConfig: Error fetching token config writeRequest: The requested operation could not be completed + sessionExpired: Your session has expired. Please log in again + accessDenied: Access denied claimBeginningQuantity: Cannot import a line with a claimed quantity of 0 login: title: Login diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 463ac2d40..55b35f14c 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -397,6 +397,8 @@ errors: updateUserConfig: Error al actualizar la configuración de usuario tokenConfig: Error al obtener configuración de token writeRequest: No se pudo completar la operación solicitada + sessionExpired: Tu sesión ha expirado, por favor vuelve a iniciar sesión + accessDenied: Acceso denegado claimBeginningQuantity: No se puede importar una linea sin una cantidad reclamada login: title: Inicio de sesión diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index aa5841ce2..cee671eda 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -6,7 +6,6 @@ import { useQuasar } from 'quasar'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; -import FetchData from 'components/FetchData.vue'; import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; @@ -21,9 +20,6 @@ const { t } = useI18n(); const route = useRoute(); const { notify } = useNotify(); -const typesTaxes = ref([]); -const typesTransactions = ref([]); - function handleLocation(data, location) { const { town, code, provinceFk, countryFk } = location ?? {}; data.postcode = code; @@ -39,6 +35,7 @@ function onBeforeSave(formData, originalData) { } async function checkEtChanges(data, _, originalData) { + isTaxDataChecked.value = data.isTaxDataChecked; const equalizatedHasChanged = originalData.isEqualizated != data.isEqualizated; const hasToInvoiceByAddress = originalData.hasToInvoiceByAddress || data.hasToInvoiceByAddress; @@ -62,15 +59,18 @@ async function acceptPropagate({ isEqualizated }) { }); notify(t('Equivalent tax spreaded'), 'warning'); } +const isTaxDataChecked = ref(false); + +function isRequired({ isTaxDataChecked: taxDataChecked }) { + if (!isTaxDataChecked.value) { + return false; + } else { + return taxDataChecked; + } +}