diff --git a/src/boot/quasar.js b/src/boot/quasar.js index e2035c880..5db6edd24 100644 --- a/src/boot/quasar.js +++ b/src/boot/quasar.js @@ -2,9 +2,15 @@ import { boot } from 'quasar/wrappers'; import qFormMixin from './qformMixin'; import mainShortcutMixin from './mainShortcutMixin'; import keyShortcut from './keyShortcut'; +import useNotify from 'src/composables/useNotify.js'; +const { notify } = useNotify(); export default boot(({ app }) => { app.mixin(qFormMixin); app.mixin(mainShortcutMixin); app.directive('shortcut', keyShortcut); + app.config.errorHandler = function (err) { + console.error(err); + notify('globals.error', 'negative', 'error'); + }; }); diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index a3c439cc7..3e982919b 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -69,10 +69,7 @@ const $props = defineProps({ type: Boolean, default: false, }, - disableInfiniteScroll: { - type: Boolean, - default: false, - }, + hasSubToolbar: { type: Boolean, default: null, @@ -373,9 +370,7 @@ function handleOnDataSaved(_) { ref="CrudModelRef" @on-fetch="(...args) => emit('onFetch', ...args)" :search-url="searchUrl" - :disable-infinite-scroll=" - $attrs['disableInfiniteScroll'] ? isTableMode : !disableInfiniteScroll - " + :disable-infinite-scroll="isTableMode" @save-changes="reload" :has-sub-toolbar="$props.hasSubToolbar ?? isEditable" :auto-load="hasParams || $attrs['auto-load']" @@ -395,7 +390,7 @@ function handleOnDataSaved(_) { card-container-class="grid-three" flat :style="isTableMode && `max-height: ${tableHeight}`" - :virtual-scroll="!isTableMode" + :virtual-scroll="isTableMode" @virtual-scroll=" (event) => event.index > rows.length - 2 && diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index e27dc7bd4..2e2365f7b 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -103,6 +103,7 @@ globals: ticket: Ticket campaign: Campaign weight: Weight + error: Ups! Something went wrong pageTitles: logIn: Login addressEdit: Update address diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index ed34c8761..53b487e9f 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -105,6 +105,7 @@ globals: ticket: Ticket campaign: Campaña weight: Peso + error: ¡Ups! Algo salió mal pageTitles: logIn: Inicio de sesión addressEdit: Modificar consignatario diff --git a/src/pages/Customer/components/CustomerSummaryTable.vue b/src/pages/Customer/components/CustomerSummaryTable.vue index 374769a57..946296e67 100644 --- a/src/pages/Customer/components/CustomerSummaryTable.vue +++ b/src/pages/Customer/components/CustomerSummaryTable.vue @@ -35,6 +35,7 @@ const filter = { ], where: { clientFk: route.params.id }, order: ['shipped DESC', 'id'], + limit: 30, }; const columns = computed(() => [ @@ -149,7 +150,6 @@ const setShippedColor = (date) => { auto-load order="shipped DESC, id" :disable-option="{ card: true, table: true }" - limit="5" class="full-width" :disable-infinite-scroll="true" > diff --git a/src/pages/Wagon/Type/WagonTypeList.vue b/src/pages/Wagon/Type/WagonTypeList.vue index 2f0d55fbe..c0943c58e 100644 --- a/src/pages/Wagon/Type/WagonTypeList.vue +++ b/src/pages/Wagon/Type/WagonTypeList.vue @@ -103,7 +103,7 @@ async function remove(row) { url-create="WagonTypes" model="WagonType" :form-initial-data="initialData" - @on-data-saved="window.location.reload()" + @on-data-saved="tableRef.reload()" auto-load > <template #form-inputs="{ data }"> diff --git a/src/pages/Wagon/WagonList.vue b/src/pages/Wagon/WagonList.vue index 129e803f5..02e3b6d16 100644 --- a/src/pages/Wagon/WagonList.vue +++ b/src/pages/Wagon/WagonList.vue @@ -5,7 +5,7 @@ import { useArrayData } from 'src/composables/useArrayData'; import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; import VnTable from 'src/components/VnTable/VnTable.vue'; -import { computed } from 'vue'; +import { computed, ref } from 'vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; @@ -14,7 +14,7 @@ const arrayData = useArrayData('WagonList'); const store = arrayData.store; const router = useRouter(); const { t } = useI18n(); - +const tableRef = ref(); const filter = { include: { relation: 'type', @@ -107,9 +107,7 @@ async function remove(row) { :create="{ urlCreate: 'Wagons', title: t('Create new wagon'), - onDataSaved: () => { - window.location.reload(); - }, + onDataSaved: () => tableRef.reload(), formInitialData: {}, }" > diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index be30537df..3675d40f8 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -152,7 +152,11 @@ const refetch = async () => await cardDescriptorRef.value.getData(); </template> <template #body="{ entity }"> <VnLv :label="t('worker.card.user')" :value="entity.user?.name" /> - <VnLv :label="t('worker.card.email')" :value="entity.user?.email" copy /> + <VnLv + :label="t('worker.card.email')" + :value="entity.user?.emailUser?.email" + copy + /> <VnLv :label="t('worker.list.department')" :value="entity.department ? entity.department.department.name : null" diff --git a/src/pages/Worker/Card/WorkerSummary.vue b/src/pages/Worker/Card/WorkerSummary.vue index 0e7bfd863..8fee52dd3 100644 --- a/src/pages/Worker/Card/WorkerSummary.vue +++ b/src/pages/Worker/Card/WorkerSummary.vue @@ -1,9 +1,9 @@ <script setup> -import { ref, onMounted, computed } from 'vue'; +import { ref, onBeforeMount, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; +import axios from 'axios'; import { dashIfEmpty, toDate } from 'src/filters'; -import { getUrl } from 'src/composables/getUrl'; import VnLv from 'src/components/ui/VnLv.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import CardSummary from 'components/ui/CardSummary.vue'; @@ -11,6 +11,7 @@ import VnUserLink from 'src/components/ui/VnUserLink.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; import RoleDescriptorProxy from 'src/pages/Account/Role/Card/RoleDescriptorProxy.vue'; import DepartmentDescriptorProxy from 'src/pages/Department/Card/DepartmentDescriptorProxy.vue'; +import { useRole } from 'src/composables/useRole'; const route = useRoute(); const { t } = useI18n(); @@ -23,64 +24,27 @@ const $props = defineProps({ }); const entityId = computed(() => $props.id || route.params.id); -const workerUrl = ref(); +const basicDataUrl = ref(null); +const isHr = computed(() => useRole().hasAny(['hr'])); +const advancedSummary = ref(); -onMounted(async () => { - workerUrl.value = (await getUrl('')) + `worker/${entityId.value}/`; +onBeforeMount(async () => { + if (isHr.value) { + advancedSummary.value = ( + await axios.get('Workers/advancedSummary', { + params: { filter: { where: { id: entityId.value } } }, + }) + ).data[0]; + basicDataUrl.value = `#/worker/${entityId.value}/basic-data`; + } }); - -const filter = { - include: [ - { - relation: 'user', - scope: { - fields: ['name', 'nickname', 'roleFk'], - - include: [ - { - relation: 'role', - scope: { - fields: ['name'], - }, - }, - { - relation: 'emailUser', - scope: { - fields: ['email'], - }, - }, - ], - }, - }, - { - relation: 'department', - scope: { - include: { - relation: 'department', - scope: { - fields: ['name'], - }, - }, - }, - }, - { - relation: 'boss', - }, - { - relation: 'client', - }, - { - relation: 'sip', - }, - ], -}; </script> <template> <CardSummary ref="summary" - :url="`Workers/${entityId}`" - :filter="filter" + :url="`Workers/summary`" + :filter="{ where: { id: entityId } }" data-key="WorkerSummary" > <template #header="{ entity }"> @@ -88,10 +52,7 @@ const filter = { </template> <template #body="{ entity: worker }"> <QCard class="vn-one"> - <VnTitle - :url="`#/worker/${entityId}/basic-data`" - :text="t('worker.summary.basicData')" - /> + <VnTitle :url="basicDataUrl" :text="t('worker.summary.basicData')" /> <VnLv :label="t('worker.card.name')" :value="worker.user?.nickname" /> <VnLv :label="t('worker.list.department')"> <template #value> @@ -128,13 +89,9 @@ const filter = { <VnLinkPhone :phone-number="worker.client?.phone" /> </template> </VnLv> - <VnLv :label="t('worker.summary.locker')" :value="worker.locker" /> </QCard> - <QCard class="vn-one"> - <VnTitle - :url="`#/worker/${entityId}/basic-data`" - :text="t('worker.summary.basicData')" - /> + <QCard class="vn-one" v-if="advancedSummary"> + <VnTitle :url="basicDataUrl" :text="t('worker.summary.basicData')" /> <VnLv :label="t('worker.summary.fiDueDate')" :value="toDate(worker.fiDueDate)" @@ -162,7 +119,6 @@ const filter = { </QCard> <QCard class="vn-one"> <VnTitle :text="t('worker.summary.userData')" /> - <VnLv :label="t('worker.summary.userId')" :value="worker?.user?.id" /> <VnLv :label="t('worker.card.name')" :value="worker?.user?.nickname" /> <VnLv :label="t('worker.list.email')"