From a6a27237341f27db158378a45d064b6458d33139 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 27 Jan 2025 14:21:09 +0100 Subject: [PATCH 01/44] feat: refs #8463 cardDescriptorBeta --- src/components/common/VnCardBeta.vue | 75 +++-- src/components/ui/CardDescriptorBeta.vue | 262 ++++++++++++++++++ src/pages/Order/Card/OrderCard.vue | 30 ++ src/pages/Order/Card/OrderDescriptor.vue | 45 +-- src/pages/Order/Card/OrderDescriptorProxy.vue | 7 +- src/pages/Order/Card/OrderSummary.vue | 3 +- 6 files changed, 358 insertions(+), 64 deletions(-) create mode 100644 src/components/ui/CardDescriptorBeta.vue diff --git a/src/components/common/VnCardBeta.vue b/src/components/common/VnCardBeta.vue index a1f07ff17..2579bf623 100644 --- a/src/components/common/VnCardBeta.vue +++ b/src/components/common/VnCardBeta.vue @@ -1,5 +1,5 @@ <script setup> -import { onBeforeMount, computed } from 'vue'; +import { onBeforeMount, computed, onMounted, watch, ref } from 'vue'; import { useRoute, useRouter, onBeforeRouteUpdate } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; import { useStateStore } from 'stores/useStateStore'; @@ -7,7 +7,10 @@ import useCardSize from 'src/composables/useCardSize'; import LeftMenu from 'components/LeftMenu.vue'; import VnSubToolbar from '../ui/VnSubToolbar.vue'; +const emit = defineEmits(['onFetch']); + const props = defineProps({ + id: { type: Number, required: false, default: null }, dataKey: { type: String, required: true }, baseUrl: { type: String, default: undefined }, customUrl: { type: String, default: undefined }, @@ -18,52 +21,72 @@ const props = defineProps({ searchDataKey: { type: String, default: undefined }, searchbarProps: { type: Object, default: undefined }, redirectOnError: { type: Boolean, default: false }, + visual: { type: Boolean, default: true }, }); const stateStore = useStateStore(); const route = useRoute(); const router = useRouter(); +const arrayData = ref({}); + +const id = computed(() => props.id || route?.params?.id); const url = computed(() => { if (props.baseUrl) { - return `${props.baseUrl}/${route.params.id}`; + return `${props.baseUrl}/${id.value}`; } return props.customUrl; }); -const arrayData = useArrayData(props.dataKey, { - url: url.value, - filter: props.filter, - userFilter: props.userFilter, -}); - onBeforeMount(async () => { + console.log('asd', id.value); + arrayData.value = useArrayData(props.dataKey); + if (!arrayData.value.store.data && !arrayData.value.isLoading.value) { + arrayData.value = useArrayData(props.dataKey, { + url: url.value, + filter: props.filter, + userFilter: props.userFilter, + }); + } + + if (props.baseUrl && props.visual) { + onBeforeRouteUpdate(async (to, from) => { + if (to.params.id !== from.params.id) { + arrayData.value.store.url = `${props.baseUrl}/${to.params.id}`; + await fetch('router'); + } + }); + } + try { - if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id }; - await arrayData.fetch({ append: false, updateRouter: false }); + if (!props.baseUrl) arrayData.value.store.filter.where = { id: id.value }; + await fetch('montar'); } catch { + if (!props.visual) return; const { matched: matches } = router.currentRoute.value; const { path } = matches.at(-1); router.push({ path: path.replace(/:id.*/, '') }); } }); -if (props.baseUrl) { - onBeforeRouteUpdate(async (to, from) => { - if (to.params.id !== from.params.id) { - arrayData.store.url = `${props.baseUrl}/${to.params.id}`; - await arrayData.fetch({ append: false, updateRouter: false }); - } - }); +watch( + () => arrayData?.value?.isLoading, + (loading) => !loading && emit('onFetch', arrayData.value.store.data), +); + +async function fetch() { + await arrayData.value.fetch({ append: false, updateRouter: false }); } </script> <template> - <Teleport to="#left-panel" v-if="stateStore.isHeaderMounted()"> - <component :is="descriptor" /> - <QSeparator /> - <LeftMenu source="card" /> - </Teleport> - <VnSubToolbar /> - <div :class="[useCardSize(), $attrs.class]"> - <RouterView :key="route.path" /> - </div> + <span v-if="visual"> + <Teleport to="#left-panel" v-if="stateStore.isHeaderMounted()"> + <component :is="descriptor" /> + <QSeparator /> + <LeftMenu source="card" /> + </Teleport> + <VnSubToolbar /> + <div :class="[useCardSize(), $attrs.class]"> + <RouterView :key="route?.path" /> + </div> + </span> </template> diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue new file mode 100644 index 000000000..b2bac234d --- /dev/null +++ b/src/components/ui/CardDescriptorBeta.vue @@ -0,0 +1,262 @@ +<script setup> +import { computed, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; +import { useSummaryDialog } from 'src/composables/useSummaryDialog'; +import { useRoute } from 'vue-router'; +import VnMoreOptions from './VnMoreOptions.vue'; + +const $props = defineProps({ + id: { + type: Number, + default: false, + }, + title: { + type: String, + default: '', + }, + subtitle: { + type: Number, + default: null, + }, + module: { + type: String, + default: null, + }, + summary: { + type: Object, + default: null, + }, + card: { + type: Object, + required: true, + }, + width: { + type: String, + default: 'md-width', + }, +}); + +const route = useRoute(); +const { t } = useI18n(); +const { viewSummary } = useSummaryDialog(); +const entity = ref({}); +const isLoading = ref(false); +const emit = defineEmits(['onFetch']); + +function getValueFromPath(path) { + if (!path) return; + const keys = path.toString().split('.'); + let current = entity.value; + + for (const key of keys) { + if (current[key] === undefined) return undefined; + else current = current[key]; + } + return current; +} + +const iconModule = computed(() => route.matched[1].meta.icon); +const toModule = computed(() => + route.matched[1].path.split('/').length > 2 + ? route.matched[1].redirect + : route.matched[1].children[0].redirect, +); + +function setData(data) { + const newData = (Array.isArray(data) ? data[0] : data) ?? {}; + entity.value = newData; + isLoading.value = false; + if (newData) emit('onFetch', newData); +} +</script> + +<template> + {{ id }} + <component + :is="card" + :id + :visual="false" + @on-fetch="(data) => setData(data)" + v-bind="$attrs" + /> + <div class="descriptor"> + <template v-if="entity && !isLoading"> + <div class="header bg-primary q-pa-sm justify-between"> + <slot name="header-extra-action" + ><QBtn + round + flat + dense + size="md" + :icon="iconModule" + color="white" + class="link" + :to="$attrs['to-module'] ?? toModule" + > + <QTooltip> + {{ t('globals.goToModuleIndex') }} + </QTooltip> + </QBtn></slot + > + <QBtn + @click.stop="viewSummary(entity.id, $props.summary, $props.width)" + round + flat + dense + size="md" + icon="preview" + color="white" + class="link" + v-if="summary" + > + <QTooltip> + {{ t('components.smartCard.openSummary') }} + </QTooltip> + </QBtn> + <RouterLink :to="{ name: `${module}Summary`, params: { id: entity.id } }"> + <QBtn + class="link" + color="white" + dense + flat + icon="launch" + round + size="md" + > + <QTooltip> + {{ t('components.cardDescriptor.summary') }} + </QTooltip> + </QBtn> + </RouterLink> + <VnMoreOptions v-if="$slots.menu"> + <template #menu="{ menuRef }"> + <slot name="menu" :entity="entity" :menu-ref="menuRef" /> + </template> + </VnMoreOptions> + </div> + <slot name="before" /> + <div class="body q-py-sm"> + <QList dense> + <QItemLabel header class="ellipsis text-h5" :lines="1"> + <div class="title"> + <span v-if="$props.title" :title="getValueFromPath(title)"> + {{ getValueFromPath(title) ?? $props.title }} + </span> + <slot v-else name="description" :entity="entity"> + <span :title="entity.name"> + {{ entity.name }} + </span> + </slot> + </div> + </QItemLabel> + <QItem dense> + <QItemLabel class="subtitle" caption> + #{{ getValueFromPath(subtitle) ?? entity.id }} + </QItemLabel> + </QItem> + </QList> + <div class="list-box q-mt-xs"> + <slot name="body" :entity="entity" /> + </div> + </div> + <div class="icons"> + <slot name="icons" :entity="entity" /> + </div> + <div class="actions justify-center"> + <slot name="actions" :entity="entity" /> + </div> + <slot name="after" /> + </template> + <!-- Skeleton --> + <SkeletonDescriptor v-if="!entity || isLoading" /> + </div> + <QInnerLoading + :label="t('globals.pleaseWait')" + :showing="isLoading" + color="primary" + /> +</template> + +<style lang="scss"> +.body { + background-color: var(--vn-section-color); + .text-h5 { + font-size: 20px; + padding-top: 5px; + padding-bottom: 0px; + } + .q-item { + min-height: 20px; + + .link { + margin-left: 10px; + } + } + .vn-label-value { + display: flex; + padding: 0px 16px; + .label { + color: var(--vn-label-color); + font-size: 14px; + + &:not(:has(a))::after { + content: ':'; + } + } + .value { + color: var(--vn-text-color); + font-size: 14px; + margin-left: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + } + .info { + margin-left: 5px; + } + } +} +</style> + +<style lang="scss" scoped> +.title { + overflow: hidden; + text-overflow: ellipsis; + span { + color: var(--vn-text-color); + font-weight: bold; + } +} +.subtitle { + color: var(--vn-text-color); + font-size: 16px; + margin-bottom: 2px; +} +.list-box { + .q-item__label { + color: var(--vn-label-color); + padding-bottom: 0%; + } +} +.descriptor { + width: 256px; + .header { + display: flex; + align-items: center; + } + .icons { + margin: 0 10px; + display: flex; + justify-content: center; + .q-icon { + margin-right: 5px; + } + } + .actions { + margin: 0 5px; + justify-content: center !important; + } +} +</style> diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue index 823815f59..b371509c6 100644 --- a/src/pages/Order/Card/OrderCard.vue +++ b/src/pages/Order/Card/OrderCard.vue @@ -1,12 +1,42 @@ <script setup> import VnCardBeta from 'components/common/VnCardBeta.vue'; import OrderDescriptor from 'pages/Order/Card/OrderDescriptor.vue'; + +const userFilter = { + include: [ + { relation: 'agencyMode', scope: { fields: ['name'] } }, + { + relation: 'address', + scope: { fields: ['nickname'] }, + }, + { relation: 'rows', scope: { fields: ['id'] } }, + { + relation: 'client', + scope: { + fields: [ + 'salesPersonFk', + 'name', + 'isActive', + 'isFreezed', + 'isTaxDataChecked', + ], + include: { + relation: 'salesPersonUser', + scope: { fields: ['id', 'name'] }, + }, + }, + }, + ], +}; </script> <template> <VnCardBeta data-key="Order" base-url="Orders" + :userFilter :descriptor="OrderDescriptor" + v-bind="$attrs" + v-on="$attrs" /> </template> diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue index 0d5f0146f..4c2384f92 100644 --- a/src/pages/Order/Card/OrderDescriptor.vue +++ b/src/pages/Order/Card/OrderDescriptor.vue @@ -6,10 +6,11 @@ import { toCurrency, toDate } from 'src/filters'; import { useState } from 'src/composables/useState'; import useCardDescription from 'src/composables/useCardDescription'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'components/FetchData.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; +import OrderCard from './OrderCard.vue'; +import CardDescriptorBeta from 'src/components/ui/CardDescriptorBeta.vue'; const DEFAULT_ITEMS = 0; @@ -26,37 +27,13 @@ const state = useState(); const { t } = useI18n(); const data = ref(useCardDescription()); const getTotalRef = ref(); +const total = ref(0); const entityId = computed(() => { return $props.id || route.params.id; }); -const filter = { - include: [ - { relation: 'agencyMode', scope: { fields: ['name'] } }, - { - relation: 'address', - scope: { fields: ['nickname'] }, - }, - { relation: 'rows', scope: { fields: ['id'] } }, - { - relation: 'client', - scope: { - fields: [ - 'salesPersonFk', - 'name', - 'isActive', - 'isFreezed', - 'isTaxDataChecked', - ], - include: { - relation: 'salesPersonUser', - scope: { fields: ['id', 'name'] }, - }, - }, - }, - ], -}; +const orderTotal = computed(() => state.get('orderTotal') ?? 0); const setData = (entity) => { if (!entity) return; @@ -68,9 +45,6 @@ const setData = (entity) => { const getConfirmationValue = (isConfirmed) => { return t(isConfirmed ? 'globals.confirmed' : 'order.summary.notConfirmed'); }; - -const orderTotal = computed(() => state.get('orderTotal') ?? 0); -const total = ref(0); </script> <template> @@ -83,15 +57,14 @@ const total = ref(0); } " /> - <CardDescriptor - ref="descriptor" - :url="`Orders/${entityId}`" - :filter="filter" + <CardDescriptorBeta + v-bind="$attrs" + :id + :card="OrderCard" module="Order" :title="data.title" :subtitle="data.subtitle" @on-fetch="setData" - data-key="orderData" > <template #body="{ entity }"> <VnLv @@ -142,5 +115,5 @@ const total = ref(0); </QBtn> </QCardActions> </template> - </CardDescriptor> + </CardDescriptorBeta> </template> diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue index 04ebb054a..7b3d1a871 100644 --- a/src/pages/Order/Card/OrderDescriptorProxy.vue +++ b/src/pages/Order/Card/OrderDescriptorProxy.vue @@ -12,6 +12,11 @@ const $props = defineProps({ <template> <QPopupProxy> - <OrderDescriptor v-if="$props.id" :id="$props.id" :summary="OrderSummary" /> + <OrderDescriptor + v-if="$props.id" + :id="$props.id" + :summary="OrderSummary" + data-key="orderDescriptor" + /> </QPopupProxy> </template> diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue index a289688e4..bef97bc0f 100644 --- a/src/pages/Order/Card/OrderSummary.vue +++ b/src/pages/Order/Card/OrderSummary.vue @@ -13,6 +13,7 @@ import FetchedTags from 'components/ui/FetchedTags.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import OrderDescriptorMenu from 'pages/Order/Card/OrderDescriptorMenu.vue'; +import OrderDescriptorProxy from './OrderDescriptorProxy.vue'; const { t } = useI18n(); const route = useRoute(); @@ -106,7 +107,7 @@ async function handleConfirm() { <template #value> <span class="link"> {{ dashIfEmpty(entity?.address?.nickname) }} - <CustomerDescriptorProxy :id="entity?.clientFk" /> + <OrderDescriptorProxy :id="1" /> </span> </template> </VnLv> From ee3ebc51f1866efd0fc5b7db8facb3250c1bfc29 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Tue, 25 Feb 2025 15:27:01 +0100 Subject: [PATCH 02/44] test: refs #8621 add e2e tests for cmrList --- .../integration/route/cmr/cmrList.spec.js | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 test/cypress/integration/route/cmr/cmrList.spec.js diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js new file mode 100644 index 000000000..fc437f218 --- /dev/null +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -0,0 +1,87 @@ +describe('Cmr list', () => { + const getLinkSelector = (colField) => + `tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`; + + const selectors = { + ticket: getLinkSelector('ticketFk'), + client: getLinkSelector('clientFk'), + lastRowSelectCheckBox: + '.q-virtual-scroll__content > tr:last-child > :nth-child(1) > .q-checkbox', + downloadBtn: '#subToolbar > .q-btn', + viewCmr: 'tableAction-0', + summaryPopupBtn: '.header > :nth-child(2) > .q-btn__content > .q-icon', + summaryPopupHeader: '.summaryHeader > :nth-child(2)', + summaryHeader: '.summaryHeader', + descriptorId: '.q-item > .q-item__label', + descriptorTitle: '.q-item__label--header > .title > span', + summaryGoToSummaryBtn: '.header > .q-icon', + descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn', + }; + + const data = { + ticket: '2', + client: 'Bruce Wayne', + }; + + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('developer'); + cy.visit('/#/route/cmr'); + cy.typeSearchbar('{enter}'); + }); + + it('Should download selected cmr', () => { + const downloadsFolder = Cypress.config('downloadsFolder'); + cy.get(selectors.lastRowSelectCheckBox).click(); + cy.get(selectors.downloadBtn).click(); + cy.wait(3000); + + const fileName = 'cmrs.zip'; + cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); + }); + + it('Should open selected cmr pdf', () => { + cy.window().then((win) => { + cy.stub(win, 'open').as('windowOpen'); + }); + cy.get(selectors.lastRowSelectCheckBox).click(); + cy.dataCy(selectors.viewCmr).last().click(); + cy.get('@windowOpen').should('be.calledWithMatch', '\/api\/Cmrs\/3'); + }); + + describe('Ticket pop-ups', () => { + it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => { + cy.get(selectors.ticket).click(); + cy.get(selectors.descriptorId).should('contain', data.ticket); + cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.client); + }); + + it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => { + cy.get(selectors.ticket).click(); + cy.get(selectors.descriptorId).should('contain', data.ticket); + cy.get(selectors.summaryPopupBtn).click(); + cy.get(selectors.summaryPopupHeader).should('contain', data.client); + cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.client); + }); + }); + + describe('Client pop-ups', () => { + it('Should redirect to the client summary from the client descriptor pop-up', () => { + cy.get(selectors.client).click(); + cy.get(selectors.descriptorTitle).should('contain', data.client); + cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.client); + }); + + it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => { + cy.get(selectors.client).click(); + cy.get(selectors.descriptorTitle).should('contain', data.client); + cy.get(selectors.summaryPopupBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.client); + }); + }); +}); From 083e68c291d97d83fe9f08e1fe028c9db6fd5dd9 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Wed, 26 Feb 2025 09:09:19 +0100 Subject: [PATCH 03/44] test: refs #8621 add functionality to remove filters in cmrList e2e tests --- test/cypress/integration/route/cmr/cmrList.spec.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js index fc437f218..6bcbfc842 100644 --- a/test/cypress/integration/route/cmr/cmrList.spec.js +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -16,6 +16,7 @@ describe('Cmr list', () => { descriptorTitle: '.q-item__label--header > .title > span', summaryGoToSummaryBtn: '.header > .q-icon', descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn', + removeFilter: '.q-chip__icon--remove', }; const data = { @@ -28,6 +29,7 @@ describe('Cmr list', () => { cy.login('developer'); cy.visit('/#/route/cmr'); cy.typeSearchbar('{enter}'); + cy.get(selectors.removeFilter).click(); }); it('Should download selected cmr', () => { From 15e44174badf8fcd351dfff19747589c579f9b39 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Wed, 26 Feb 2025 12:08:40 +0100 Subject: [PATCH 04/44] refactor: refs #8621 update column names in RouteList and add formatting for agency and vehicle fields --- src/pages/Route/RouteList.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue index 9dad8ba22..899b3b8c3 100644 --- a/src/pages/Route/RouteList.vue +++ b/src/pages/Route/RouteList.vue @@ -56,8 +56,9 @@ const columns = computed(() => [ }, { align: 'left', - name: 'agencyName', + name: 'agencyModeFk', label: t('route.Agency'), + format: (row) => row?.agencyName, cardVisible: true, component: 'select', attrs: { @@ -74,8 +75,9 @@ const columns = computed(() => [ }, { align: 'left', - name: 'vehiclePlateNumber', + name: 'vehicleFk', label: t('route.Vehicle'), + format: (row) => row?.vehiclePlateNumber, cardVisible: true, component: 'select', attrs: { @@ -155,6 +157,7 @@ const columns = computed(() => [ <template #body> <VnTable :data-key + ref="tableRef" :columns="columns" :right-search="false" redirect="route" @@ -175,4 +178,4 @@ const columns = computed(() => [ </VnTable> </template> </VnSection> -</template> +</template> \ No newline at end of file From 6a0c58631c4e8d997b93f9f7ebaecdfd7bb53ff5 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Wed, 12 Mar 2025 12:34:03 +0100 Subject: [PATCH 05/44] fix: refs #8621 test for date input selector --- src/pages/Route/RouteList.vue | 30 +++++++------------ .../route/routeExtendedList.spec.js | 2 +- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue index db52dcf6d..f8234c7db 100644 --- a/src/pages/Route/RouteList.vue +++ b/src/pages/Route/RouteList.vue @@ -39,28 +39,24 @@ const columns = computed(() => [ width: '25px', }, { - name: 'workerFk', - label: t('gloabls.worker'), - component: markRaw(VnSelectWorker), - create: true, - format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef), - columnFilter: false, - width: '100px', - }, - { + align: 'left', name: 'workerFk', label: t('globals.worker'), - visible: false, + component: markRaw(VnSelectWorker), + create: true, cardVisible: true, + format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef), + columnFilter: false, }, { - name: 'agencyName', + align: 'left', + name: 'agencyModeFk', label: t('globals.agency'), - visible: false, + format: (row) => row?.agencyName, cardVisible: true, }, { - label: t('globals.Agency'), + label: t('globals.agency'), name: 'agencyModeFk', component: 'select', attrs: { @@ -78,17 +74,13 @@ const columns = computed(() => [ { align: 'left', name: 'vehicleFk', - label: t('route.Vehicle'), + label: t('globals.vehicle'), format: (row) => row?.vehiclePlateNumber, cardVisible: true, }, - { - name: 'vehiclePlateNumber', - label: t('globals.vehicle'), - }, { name: 'vehicleFk', - label: t('globals.Vehicle'), + label: t('globals.vehicle'), cardVisible: true, component: 'select', attrs: { diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index 237729107..b46ce3ba2 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -120,7 +120,7 @@ describe('Route extended list', () => { it('Should clone selected route', () => { cy.get(selectors.lastRowSelectCheckBox).click(); cy.get(selectors.cloneBtn).click(); - cy.dataCy('route.Starting date_inputDate').type('10-05-2001'); + cy.dataCy('Starting date_inputDate').type('10-05-2001'); cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); cy.validateContent(selectors.date, '05/10/2001'); }); From 4d8fb8eb5beaa82573170c8d278f4c351fff4d2f Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 13 Mar 2025 09:01:15 +0100 Subject: [PATCH 06/44] refactor: refs #8463 simplify creating VnDescriptor --- src/components/common/VnCard.vue | 26 +- src/components/ui/CardDescriptorBeta.vue | 256 ++----------------- src/components/ui/VnDescriptor.vue | 298 +++++++++++++++++++++++ src/pages/Order/Card/OrderDescriptor.vue | 9 +- 4 files changed, 333 insertions(+), 256 deletions(-) create mode 100644 src/components/ui/VnDescriptor.vue diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 620dc2ad2..dfa51c8c4 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -1,12 +1,15 @@ <script setup> -import { onBeforeMount } from 'vue'; -import { useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; +import { onBeforeMount, computed } from 'vue'; +import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; import { useStateStore } from 'stores/useStateStore'; import useCardSize from 'src/composables/useCardSize'; import VnSubToolbar from '../ui/VnSubToolbar.vue'; +const emit = defineEmits(['onFetch']); + const props = defineProps({ + id: { type: Number, required: false, default: null }, dataKey: { type: String, required: true }, url: { type: String, default: undefined }, idInWhere: { type: Boolean, default: false }, @@ -16,10 +19,13 @@ const props = defineProps({ searchDataKey: { type: String, default: undefined }, searchbarProps: { type: Object, default: undefined }, redirectOnError: { type: Boolean, default: false }, + visual: { type: Boolean, default: true }, }); +const route = useRoute(); const stateStore = useStateStore(); const router = useRouter(); +const entityId = computed(() => props.id || route?.params?.id); const arrayData = useArrayData(props.dataKey, { url: props.url, userFilter: props.filter, @@ -35,7 +41,7 @@ onBeforeMount(async () => { const route = router.currentRoute.value; try { - await fetch(route.params.id); + await fetch(entityId.value); } catch { const { matched: matches } = route; const { path } = matches.at(-1); @@ -51,8 +57,7 @@ onBeforeRouteUpdate(async (to, from) => { router.push({ name, params: to.params }); } } - const id = to.params.id; - if (id !== from.params.id) await fetch(id, true); + if (entityId.value !== from.params.id) await fetch(entityId.value, true); }); async function fetch(id, append = false) { @@ -61,14 +66,17 @@ async function fetch(id, append = false) { else if (!regex.test(props.url)) arrayData.store.url = `${props.url}/${id}`; else arrayData.store.url = props.url.replace(regex, `/${id}`); await arrayData.fetch({ append, updateRouter: false }); + emit('onFetch', arrayData.store.data); } function hasRouteParam(params, valueToCheck = ':addressId') { return Object.values(params).includes(valueToCheck); } </script> <template> - <VnSubToolbar /> - <div :class="[useCardSize(), $attrs.class]"> - <RouterView :key="$route.path" /> - </div> + <span v-if="visual"> + <VnSubToolbar /> + <div :class="[useCardSize(), $attrs.class]"> + <RouterView :key="$route.path" /> + </div> + </span> </template> diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue index b2bac234d..86f756a7b 100644 --- a/src/components/ui/CardDescriptorBeta.vue +++ b/src/components/ui/CardDescriptorBeta.vue @@ -1,262 +1,38 @@ <script setup> -import { computed, ref } from 'vue'; -import { useI18n } from 'vue-i18n'; -import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; -import { useSummaryDialog } from 'src/composables/useSummaryDialog'; -import { useRoute } from 'vue-router'; -import VnMoreOptions from './VnMoreOptions.vue'; +import { ref } from 'vue'; +import VnDescriptor from './VnDescriptor.vue'; const $props = defineProps({ id: { type: Number, default: false, }, - title: { - type: String, - default: '', - }, - subtitle: { - type: Number, - default: null, - }, - module: { - type: String, - default: null, - }, - summary: { - type: Object, - default: null, - }, card: { type: Object, - required: true, - }, - width: { - type: String, - default: 'md-width', + default: null, }, }); -const route = useRoute(); -const { t } = useI18n(); -const { viewSummary } = useSummaryDialog(); -const entity = ref({}); -const isLoading = ref(false); const emit = defineEmits(['onFetch']); - -function getValueFromPath(path) { - if (!path) return; - const keys = path.toString().split('.'); - let current = entity.value; - - for (const key of keys) { - if (current[key] === undefined) return undefined; - else current = current[key]; - } - return current; -} - -const iconModule = computed(() => route.matched[1].meta.icon); -const toModule = computed(() => - route.matched[1].path.split('/').length > 2 - ? route.matched[1].redirect - : route.matched[1].children[0].redirect, -); - -function setData(data) { - const newData = (Array.isArray(data) ? data[0] : data) ?? {}; - entity.value = newData; - isLoading.value = false; - if (newData) emit('onFetch', newData); -} +const entity = ref(); </script> <template> - {{ id }} <component :is="card" :id :visual="false" - @on-fetch="(data) => setData(data)" v-bind="$attrs" - /> - <div class="descriptor"> - <template v-if="entity && !isLoading"> - <div class="header bg-primary q-pa-sm justify-between"> - <slot name="header-extra-action" - ><QBtn - round - flat - dense - size="md" - :icon="iconModule" - color="white" - class="link" - :to="$attrs['to-module'] ?? toModule" - > - <QTooltip> - {{ t('globals.goToModuleIndex') }} - </QTooltip> - </QBtn></slot - > - <QBtn - @click.stop="viewSummary(entity.id, $props.summary, $props.width)" - round - flat - dense - size="md" - icon="preview" - color="white" - class="link" - v-if="summary" - > - <QTooltip> - {{ t('components.smartCard.openSummary') }} - </QTooltip> - </QBtn> - <RouterLink :to="{ name: `${module}Summary`, params: { id: entity.id } }"> - <QBtn - class="link" - color="white" - dense - flat - icon="launch" - round - size="md" - > - <QTooltip> - {{ t('components.cardDescriptor.summary') }} - </QTooltip> - </QBtn> - </RouterLink> - <VnMoreOptions v-if="$slots.menu"> - <template #menu="{ menuRef }"> - <slot name="menu" :entity="entity" :menu-ref="menuRef" /> - </template> - </VnMoreOptions> - </div> - <slot name="before" /> - <div class="body q-py-sm"> - <QList dense> - <QItemLabel header class="ellipsis text-h5" :lines="1"> - <div class="title"> - <span v-if="$props.title" :title="getValueFromPath(title)"> - {{ getValueFromPath(title) ?? $props.title }} - </span> - <slot v-else name="description" :entity="entity"> - <span :title="entity.name"> - {{ entity.name }} - </span> - </slot> - </div> - </QItemLabel> - <QItem dense> - <QItemLabel class="subtitle" caption> - #{{ getValueFromPath(subtitle) ?? entity.id }} - </QItemLabel> - </QItem> - </QList> - <div class="list-box q-mt-xs"> - <slot name="body" :entity="entity" /> - </div> - </div> - <div class="icons"> - <slot name="icons" :entity="entity" /> - </div> - <div class="actions justify-center"> - <slot name="actions" :entity="entity" /> - </div> - <slot name="after" /> - </template> - <!-- Skeleton --> - <SkeletonDescriptor v-if="!entity || isLoading" /> - </div> - <QInnerLoading - :label="t('globals.pleaseWait')" - :showing="isLoading" - color="primary" - /> -</template> - -<style lang="scss"> -.body { - background-color: var(--vn-section-color); - .text-h5 { - font-size: 20px; - padding-top: 5px; - padding-bottom: 0px; - } - .q-item { - min-height: 20px; - - .link { - margin-left: 10px; - } - } - .vn-label-value { - display: flex; - padding: 0px 16px; - .label { - color: var(--vn-label-color); - font-size: 14px; - - &:not(:has(a))::after { - content: ':'; + @on-fetch=" + (data) => { + entity = data; + isLoading = false; } - } - .value { - color: var(--vn-text-color); - font-size: 14px; - margin-left: 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: left; - } - .info { - margin-left: 5px; - } - } -} -</style> - -<style lang="scss" scoped> -.title { - overflow: hidden; - text-overflow: ellipsis; - span { - color: var(--vn-text-color); - font-weight: bold; - } -} -.subtitle { - color: var(--vn-text-color); - font-size: 16px; - margin-bottom: 2px; -} -.list-box { - .q-item__label { - color: var(--vn-label-color); - padding-bottom: 0%; - } -} -.descriptor { - width: 256px; - .header { - display: flex; - align-items: center; - } - .icons { - margin: 0 10px; - display: flex; - justify-content: center; - .q-icon { - margin-right: 5px; - } - } - .actions { - margin: 0 5px; - justify-content: center !important; - } -} -</style> + " + /> + <VnDescriptor v-model="entity" v-bind="$attrs"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue new file mode 100644 index 000000000..0aad35448 --- /dev/null +++ b/src/components/ui/VnDescriptor.vue @@ -0,0 +1,298 @@ +<script setup> +import { computed, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; +import { useSummaryDialog } from 'src/composables/useSummaryDialog'; +import { useState } from 'src/composables/useState'; +import { useRoute, useRouter } from 'vue-router'; +import { useClipboard } from 'src/composables/useClipboard'; +import VnMoreOptions from './VnMoreOptions.vue'; + +const entity = defineModel({ type: Object, default: null }); +const $props = defineProps({ + title: { + type: String, + default: '', + }, + subtitle: { + type: Number, + default: null, + }, + summary: { + type: Object, + default: null, + }, + width: { + type: String, + default: 'md-width', + }, + module: { + type: String, + default: '', + }, +}); + +const state = useState(); +const route = useRoute(); +const router = useRouter(); +const { t } = useI18n(); +const { copyText } = useClipboard(); +const { viewSummary } = useSummaryDialog(); +const DESCRIPTOR_PROXY = 'DescriptorProxy'; +const moduleName = ref(); +const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; + +function getName() { + let name = $props.module; + if (name.includes(DESCRIPTOR_PROXY)) { + name = name.split(DESCRIPTOR_PROXY)[0]; + } + return name; +} +const routeName = computed(() => { + let routeName = getName(); + return `${routeName}Summary`; +}); + +function getValueFromPath(path) { + if (!path) return; + const keys = path.toString().split('.'); + let current = entity.value; + + for (const key of keys) { + if (current[key] === undefined) return undefined; + else current = current[key]; + } + return current; +} + +function copyIdText(id) { + copyText(id, { + component: { + copyValue: id, + }, + }); +} + +const emit = defineEmits(['onFetch']); + +const iconModule = computed(() => { + moduleName.value = getName(); + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.meta?.icon; + } else { + return route.matched[1].meta.icon; + } +}); + +const toModule = computed(() => { + moduleName.value = getName(); + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.children[0]?.redirect; + } else { + return route.matched[1].path.split('/').length > 2 + ? route.matched[1].redirect + : route.matched[1].children[0].redirect; + } +}); +</script> + +<template> + <div class="descriptor"> + <template v-if="entity"> + <div class="header bg-primary q-pa-sm justify-between"> + <slot name="header-extra-action"> + <QBtn + round + flat + dense + size="md" + :icon="iconModule" + color="white" + class="link" + :to="toModule" + > + <QTooltip> + {{ t('globals.goToModuleIndex') }} + </QTooltip> + </QBtn> + </slot> + <QBtn + @click.stop="viewSummary(entity.id, $props.summary, $props.width)" + round + flat + dense + size="md" + icon="preview" + color="white" + class="link" + v-if="summary" + > + <QTooltip> + {{ t('components.smartCard.openSummary') }} + </QTooltip> + </QBtn> + <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> + <QBtn + class="link" + color="white" + dense + flat + icon="launch" + round + size="md" + > + <QTooltip> + {{ t('components.cardDescriptor.summary') }} + </QTooltip> + </QBtn> + </RouterLink> + <VnMoreOptions v-if="$slots.menu"> + <template #menu="{ menuRef }"> + <slot name="menu" :entity="entity" :menu-ref="menuRef" /> + </template> + </VnMoreOptions> + </div> + <slot name="before" /> + <div class="body q-py-sm"> + <QList dense> + <QItemLabel header class="ellipsis text-h5" :lines="1"> + <div class="title"> + <span v-if="$props.title" :title="getValueFromPath(title)"> + {{ getValueFromPath(title) ?? $props.title }} + </span> + <slot v-else name="description" :entity="entity"> + <span :title="entity.name"> + {{ entity.name }} + </span> + </slot> + </div> + </QItemLabel> + <QItem> + <QItemLabel class="subtitle"> + #{{ getValueFromPath(subtitle) ?? entity.id }} + </QItemLabel> + <QBtn + round + flat + dense + size="sm" + icon="content_copy" + color="primary" + @click.stop="copyIdText(entity.id)" + > + <QTooltip> + {{ t('globals.copyId') }} + </QTooltip> + </QBtn> + </QItem> + </QList> + <div class="list-box q-mt-xs"> + <slot name="body" :entity="entity" /> + </div> + </div> + <div class="icons"> + <slot name="icons" :entity="entity" /> + </div> + <div class="actions justify-center" data-cy="descriptor_actions"> + <slot name="actions" :entity="entity" /> + </div> + <slot name="after" /> + </template> + <SkeletonDescriptor v-if="!entity" /> + </div> + <QInnerLoading :label="t('globals.pleaseWait')" :showing="!entity" color="primary" /> +</template> + +<style lang="scss"> +.body { + background-color: var(--vn-section-color); + .text-h5 { + font-size: 20px; + padding-top: 5px; + padding-bottom: 0px; + } + .q-item { + min-height: 20px; + + .link { + margin-left: 10px; + } + } + .vn-label-value { + display: flex; + padding: 0px 16px; + .label { + color: var(--vn-label-color); + font-size: 14px; + + &:not(:has(a))::after { + content: ':'; + } + } + .value { + color: var(--vn-text-color); + font-size: 14px; + margin-left: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + } + .info { + margin-left: 5px; + } + } +} +</style> + +<style lang="scss" scoped> +.title { + overflow: hidden; + text-overflow: ellipsis; + span { + color: var(--vn-text-color); + font-weight: bold; + } +} +.subtitle { + color: var(--vn-text-color); + font-size: 16px; + margin-bottom: 2px; +} +.list-box { + .q-item__label { + color: var(--vn-label-color); + padding-bottom: 0%; + } +} +.descriptor { + width: 256px; + .header { + display: flex; + align-items: center; + } + .icons { + margin: 0 10px; + display: flex; + justify-content: center; + .q-icon { + margin-right: 5px; + } + } + .actions { + margin: 0 5px; + justify-content: center !important; + } +} +</style> +<i18n> + en: + globals: + copyId: Copy ID + es: + globals: + copyId: Copiar ID +</i18n> diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue index 133d328c0..15e8cf070 100644 --- a/src/pages/Order/Card/OrderDescriptor.vue +++ b/src/pages/Order/Card/OrderDescriptor.vue @@ -4,8 +4,6 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { toCurrency, toDate } from 'src/filters'; import { useState } from 'src/composables/useState'; -import filter from './OrderFilter.js'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'components/FetchData.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; @@ -57,14 +55,11 @@ const getConfirmationValue = (isConfirmed) => { /> <CardDescriptorBeta v-bind="$attrs" - :id + :id="entityId" :card="OrderCard" - ref="descriptor" - :url="`Orders/${entityId}`" - :filter="filter" title="client.name" @on-fetch="setData" - data-key="Order" + module="Order" > <template #body="{ entity }"> <VnLv From c50d6d884ec86786ad4831269b76277e348317d6 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Thu, 13 Mar 2025 09:02:41 +0100 Subject: [PATCH 07/44] test: refs #8621 add data-cy attributes for summary navigation buttons in CMR list tests --- src/components/ui/VnToSummary.vue | 1 + .../integration/route/cmr/cmrList.spec.js | 77 ++++++++++++++----- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/components/ui/VnToSummary.vue b/src/components/ui/VnToSummary.vue index 305d65e02..853d26230 100644 --- a/src/components/ui/VnToSummary.vue +++ b/src/components/ui/VnToSummary.vue @@ -26,6 +26,7 @@ const id = props.entityId; :to="{ name: routeName, params: { id: id } }" class="header link" :href="url" + data-cy="goToSummaryBtn" > <QIcon name="open_in_new" color="white" size="sm" /> </router-link> diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js index 6bcbfc842..5c71132de 100644 --- a/test/cypress/integration/route/cmr/cmrList.spec.js +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -9,13 +9,12 @@ describe('Cmr list', () => { '.q-virtual-scroll__content > tr:last-child > :nth-child(1) > .q-checkbox', downloadBtn: '#subToolbar > .q-btn', viewCmr: 'tableAction-0', - summaryPopupBtn: '.header > :nth-child(2) > .q-btn__content > .q-icon', - summaryPopupHeader: '.summaryHeader > :nth-child(2)', - summaryHeader: '.summaryHeader', - descriptorId: '.q-item > .q-item__label', - descriptorTitle: '.q-item__label--header > .title > span', - summaryGoToSummaryBtn: '.header > .q-icon', - descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn', + descriptorOpenSummaryBtn: '.descriptor [data-cy="openSummaryBtn"]', + summaryTitle: '.summaryHeader', + descriptorId: '.descriptor .subtitle', + descriptorTitle: '.descriptor .title', + summaryGoToSummaryBtn: '.summaryHeader [data-cy="goToSummaryBtn"]', + descriptorGoToSummaryBtn: '.descriptor [data-cy="goToSummaryBtn"]', removeFilter: '.q-chip__icon--remove', }; @@ -54,36 +53,76 @@ describe('Cmr list', () => { describe('Ticket pop-ups', () => { it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => { cy.get(selectors.ticket).click(); - cy.get(selectors.descriptorId).should('contain', data.ticket); + cy.get(selectors.descriptorId) + .invoke('text') + .then((text) => { + expect(text).to.include(data.ticket); + }); cy.get(selectors.descriptorGoToSummaryBtn).click(); - cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); }); it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => { cy.get(selectors.ticket).click(); - cy.get(selectors.descriptorId).should('contain', data.ticket); - cy.get(selectors.summaryPopupBtn).click(); - cy.get(selectors.summaryPopupHeader).should('contain', data.client); + cy.get(selectors.descriptorId) + .invoke('text') + .then((text) => { + expect(text).to.include(data.ticket); + }); + cy.get(selectors.descriptorOpenSummaryBtn).click(); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); cy.get(selectors.summaryGoToSummaryBtn).click(); - cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); }); }); describe('Client pop-ups', () => { it('Should redirect to the client summary from the client descriptor pop-up', () => { cy.get(selectors.client).click(); - cy.get(selectors.descriptorTitle).should('contain', data.client); + cy.get(selectors.descriptorTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); cy.get(selectors.descriptorGoToSummaryBtn).click(); - cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); }); it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => { cy.get(selectors.client).click(); - cy.get(selectors.descriptorTitle).should('contain', data.client); - cy.get(selectors.summaryPopupBtn).click(); - cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.descriptorTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); + cy.get(selectors.descriptorOpenSummaryBtn).click(); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); cy.get(selectors.summaryGoToSummaryBtn).click(); - cy.get(selectors.summaryHeader).should('contain', data.client); + cy.get(selectors.summaryTitle) + .invoke('text') + .then((text) => { + expect(text).to.include(data.client); + }); }); }); }); From 704bf77771621fc44098275aa9291642b28378d6 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 13 Mar 2025 09:05:23 +0100 Subject: [PATCH 08/44] refactor: refs #8463 simplify CardDescriptor --- src/components/ui/CardDescriptor.vue | 287 +-------------------------- 1 file changed, 6 insertions(+), 281 deletions(-) diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index 744f84e6d..a5dced551 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -1,13 +1,9 @@ <script setup> import { onBeforeMount, watch, computed, ref } from 'vue'; -import { useI18n } from 'vue-i18n'; -import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; import { useArrayData } from 'composables/useArrayData'; -import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { useState } from 'src/composables/useState'; -import { useRoute, useRouter } from 'vue-router'; -import { useClipboard } from 'src/composables/useClipboard'; -import VnMoreOptions from './VnMoreOptions.vue'; +import { useRoute } from 'vue-router'; +import VnDescriptor from './VnDescriptor.vue'; const $props = defineProps({ url: { @@ -18,42 +14,19 @@ const $props = defineProps({ type: Object, default: null, }, - title: { - type: String, - default: '', - }, - subtitle: { - type: Number, - default: null, - }, dataKey: { type: String, default: null, }, - summary: { - type: Object, - default: null, - }, - width: { - type: String, - default: 'md-width', - }, }); const state = useState(); const route = useRoute(); -const router = useRouter(); -const { t } = useI18n(); -const { copyText } = useClipboard(); -const { viewSummary } = useSummaryDialog(); let arrayData; let store; let entity; const isLoading = ref(false); const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); -const DESCRIPTOR_PROXY = 'DescriptorProxy'; -const moduleName = ref(); -const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; defineExpose({ getData }); onBeforeMount(async () => { @@ -80,18 +53,6 @@ onBeforeMount(async () => { ); }); -function getName() { - let name = $props.dataKey; - if ($props.dataKey.includes(DESCRIPTOR_PROXY)) { - name = name.split(DESCRIPTOR_PROXY)[0]; - } - return name; -} -const routeName = computed(() => { - let routeName = getName(); - return `${routeName}Summary`; -}); - async function getData() { store.url = $props.url; store.filter = $props.filter ?? {}; @@ -105,249 +66,13 @@ async function getData() { } } -function getValueFromPath(path) { - if (!path) return; - const keys = path.toString().split('.'); - let current = entity.value; - - for (const key of keys) { - if (current[key] === undefined) return undefined; - else current = current[key]; - } - return current; -} - -function copyIdText(id) { - copyText(id, { - component: { - copyValue: id, - }, - }); -} - const emit = defineEmits(['onFetch']); - -const iconModule = computed(() => { - moduleName.value = getName(); - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.meta?.icon; - } else { - return route.matched[1].meta.icon; - } -}); - -const toModule = computed(() => { - moduleName.value = getName(); - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.children[0]?.redirect; - } else { - return route.matched[1].path.split('/').length > 2 - ? route.matched[1].redirect - : route.matched[1].children[0].redirect; - } -}); </script> <template> - <div class="descriptor"> - <template v-if="entity && !isLoading"> - <div class="header bg-primary q-pa-sm justify-between"> - <slot name="header-extra-action"> - <QBtn - round - flat - dense - size="md" - :icon="iconModule" - color="white" - class="link" - :to="toModule" - > - <QTooltip> - {{ t('globals.goToModuleIndex') }} - </QTooltip> - </QBtn> - </slot> - <QBtn - @click.stop="viewSummary(entity.id, $props.summary, $props.width)" - round - flat - dense - size="md" - icon="preview" - color="white" - class="link" - v-if="summary" - > - <QTooltip> - {{ t('components.smartCard.openSummary') }} - </QTooltip> - </QBtn> - <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> - <QBtn - class="link" - color="white" - dense - flat - icon="launch" - round - size="md" - > - <QTooltip> - {{ t('components.cardDescriptor.summary') }} - </QTooltip> - </QBtn> - </RouterLink> - <VnMoreOptions v-if="$slots.menu"> - <template #menu="{ menuRef }"> - <slot name="menu" :entity="entity" :menu-ref="menuRef" /> - </template> - </VnMoreOptions> - </div> - <slot name="before" /> - <div class="body q-py-sm"> - <QList dense> - <QItemLabel header class="ellipsis text-h5" :lines="1"> - <div class="title"> - <span v-if="$props.title" :title="getValueFromPath(title)"> - {{ getValueFromPath(title) ?? $props.title }} - </span> - <slot v-else name="description" :entity="entity"> - <span :title="entity.name"> - {{ entity.name }} - </span> - </slot> - </div> - </QItemLabel> - <QItem> - <QItemLabel class="subtitle"> - #{{ getValueFromPath(subtitle) ?? entity.id }} - </QItemLabel> - <QBtn - round - flat - dense - size="sm" - icon="content_copy" - color="primary" - @click.stop="copyIdText(entity.id)" - > - <QTooltip> - {{ t('globals.copyId') }} - </QTooltip> - </QBtn> - </QItem> - </QList> - <div class="list-box q-mt-xs"> - <slot name="body" :entity="entity" /> - </div> - </div> - <div class="icons"> - <slot name="icons" :entity="entity" /> - </div> - <div class="actions justify-center" data-cy="descriptor_actions"> - <slot name="actions" :entity="entity" /> - </div> - <slot name="after" /> + <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> </template> - <SkeletonDescriptor v-if="!entity || isLoading" /> - </div> - <QInnerLoading - :label="t('globals.pleaseWait')" - :showing="isLoading" - color="primary" - /> + </VnDescriptor> </template> - -<style lang="scss"> -.body { - background-color: var(--vn-section-color); - .text-h5 { - font-size: 20px; - padding-top: 5px; - padding-bottom: 0px; - } - .q-item { - min-height: 20px; - - .link { - margin-left: 10px; - } - } - .vn-label-value { - display: flex; - padding: 0px 16px; - .label { - color: var(--vn-label-color); - font-size: 14px; - - &:not(:has(a))::after { - content: ':'; - } - } - .value { - color: var(--vn-text-color); - font-size: 14px; - margin-left: 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: left; - } - .info { - margin-left: 5px; - } - } -} -</style> - -<style lang="scss" scoped> -.title { - overflow: hidden; - text-overflow: ellipsis; - span { - color: var(--vn-text-color); - font-weight: bold; - } -} -.subtitle { - color: var(--vn-text-color); - font-size: 16px; - margin-bottom: 2px; -} -.list-box { - .q-item__label { - color: var(--vn-label-color); - padding-bottom: 0%; - } -} -.descriptor { - width: 256px; - .header { - display: flex; - align-items: center; - } - .icons { - margin: 0 10px; - display: flex; - justify-content: center; - .q-icon { - margin-right: 5px; - } - } - .actions { - margin: 0 5px; - justify-content: center !important; - } -} -</style> -<i18n> - en: - globals: - copyId: Copy ID - es: - globals: - copyId: Copiar ID -</i18n> From 610075ab5551c54988aefabb6f0fe122d1121c19 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 13 Mar 2025 10:30:39 +0100 Subject: [PATCH 09/44] refactor: refs #8463 update VnCard and Order components for improved data handling and consistency --- src/components/common/VnCard.vue | 2 +- src/components/ui/CardDescriptorBeta.vue | 2 +- src/components/ui/VnDescriptor.vue | 2 -- src/pages/Order/Card/OrderCard.vue | 2 +- src/pages/Order/Card/OrderDescriptorProxy.vue | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index dfa51c8c4..4848f1490 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -57,7 +57,7 @@ onBeforeRouteUpdate(async (to, from) => { router.push({ name, params: to.params }); } } - if (entityId.value !== from.params.id) await fetch(entityId.value, true); + if (entityId.value !== to.params.id) await fetch(to.params.id, true); }); async function fetch(id, append = false) { diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue index 86f756a7b..5f9a89d64 100644 --- a/src/components/ui/CardDescriptorBeta.vue +++ b/src/components/ui/CardDescriptorBeta.vue @@ -26,7 +26,7 @@ const entity = ref(); @on-fetch=" (data) => { entity = data; - isLoading = false; + emit('onFetch', data); } " /> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 0aad35448..2e6d98f16 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -3,7 +3,6 @@ import { computed, ref } from 'vue'; import { useI18n } from 'vue-i18n'; import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; -import { useState } from 'src/composables/useState'; import { useRoute, useRouter } from 'vue-router'; import { useClipboard } from 'src/composables/useClipboard'; import VnMoreOptions from './VnMoreOptions.vue'; @@ -32,7 +31,6 @@ const $props = defineProps({ }, }); -const state = useState(); const route = useRoute(); const router = useRouter(); const { t } = useI18n(); diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue index 20c61b127..11dbbe532 100644 --- a/src/pages/Order/Card/OrderCard.vue +++ b/src/pages/Order/Card/OrderCard.vue @@ -6,7 +6,7 @@ import filter from './OrderFilter.js'; <template> <VnCard - data-key="Order" + :data-key="$attrs['data-key'] ?? 'Order'" url="Orders" :filter="filter" :descriptor="OrderDescriptor" diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue index 7b3d1a871..1dff1b620 100644 --- a/src/pages/Order/Card/OrderDescriptorProxy.vue +++ b/src/pages/Order/Card/OrderDescriptorProxy.vue @@ -16,7 +16,7 @@ const $props = defineProps({ v-if="$props.id" :id="$props.id" :summary="OrderSummary" - data-key="orderDescriptor" + data-key="OrderDescriptor" /> </QPopupProxy> </template> From 911097dae46d6ab1e287f9bee3a250d3a7a7659a Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Fri, 14 Mar 2025 07:25:58 +0100 Subject: [PATCH 10/44] test: refs #8621 remove unnecessary checkbox click in CMR list test --- test/cypress/integration/route/cmr/cmrList.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js index 5c71132de..8d9299ce7 100644 --- a/test/cypress/integration/route/cmr/cmrList.spec.js +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -45,7 +45,6 @@ describe('Cmr list', () => { cy.window().then((win) => { cy.stub(win, 'open').as('windowOpen'); }); - cy.get(selectors.lastRowSelectCheckBox).click(); cy.dataCy(selectors.viewCmr).last().click(); cy.get('@windowOpen').should('be.calledWithMatch', '\/api\/Cmrs\/3'); }); From 1139035e4583310d6c4d6bb4b17453414758081a Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 14 Mar 2025 09:13:45 +0100 Subject: [PATCH 11/44] refactor: refs #8463 replace CardDescriptor with EntityDescriptor in multiple components --- src/components/common/VnCard.vue | 4 +- src/components/ui/CardDescriptor.vue | 78 +++++-------------- src/components/ui/CardDescriptorBeta.vue | 38 --------- src/components/ui/EntityDescriptor.vue | 78 +++++++++++++++++++ src/components/ui/VnDescriptor.vue | 6 +- .../Account/Alias/Card/AliasDescriptor.vue | 6 +- src/pages/Account/Card/AccountDescriptor.vue | 6 +- .../Account/Role/Card/RoleDescriptor.vue | 6 +- src/pages/Claim/Card/ClaimDescriptor.vue | 6 +- .../Customer/Card/CustomerDescriptor.vue | 6 +- src/pages/Entry/Card/EntryDescriptor.vue | 6 +- .../InvoiceIn/Card/InvoiceInDescriptor.vue | 6 +- .../InvoiceOut/Card/InvoiceOutDescriptor.vue | 6 +- src/pages/Item/Card/ItemDescriptor.vue | 6 +- .../Item/ItemType/Card/ItemTypeDescriptor.vue | 6 +- src/pages/Order/Card/OrderDescriptor.vue | 6 +- .../Route/Agency/Card/AgencyDescriptor.vue | 6 +- src/pages/Route/Card/RouteDescriptor.vue | 6 +- src/pages/Route/Roadmap/RoadmapDescriptor.vue | 6 +- .../Route/Vehicle/Card/VehicleDescriptor.vue | 6 +- .../Shelving/Card/ShelvingDescriptor.vue | 6 +- .../Parking/Card/ParkingDescriptor.vue | 6 +- .../Supplier/Card/SupplierDescriptor.vue | 6 +- src/pages/Ticket/Card/TicketDescriptor.vue | 6 +- src/pages/Travel/Card/TravelDescriptor.vue | 6 +- src/pages/Worker/Card/WorkerDescriptor.vue | 6 +- .../Department/Card/DepartmentDescriptor.vue | 6 +- src/pages/Zone/Card/ZoneDescriptor.vue | 6 +- 28 files changed, 171 insertions(+), 171 deletions(-) delete mode 100644 src/components/ui/CardDescriptorBeta.vue create mode 100644 src/components/ui/EntityDescriptor.vue diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 4848f1490..21cdc9df5 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -73,10 +73,10 @@ function hasRouteParam(params, valueToCheck = ':addressId') { } </script> <template> - <span v-if="visual"> + <template v-if="visual"> <VnSubToolbar /> <div :class="[useCardSize(), $attrs.class]"> <RouterView :key="$route.path" /> </div> - </span> + </template> </template> diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index a5dced551..5f9a89d64 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -1,76 +1,36 @@ <script setup> -import { onBeforeMount, watch, computed, ref } from 'vue'; -import { useArrayData } from 'composables/useArrayData'; -import { useState } from 'src/composables/useState'; -import { useRoute } from 'vue-router'; +import { ref } from 'vue'; import VnDescriptor from './VnDescriptor.vue'; const $props = defineProps({ - url: { - type: String, - default: '', + id: { + type: Number, + default: false, }, - filter: { + card: { type: Object, default: null, }, - dataKey: { - type: String, - default: null, - }, }); -const state = useState(); -const route = useRoute(); -let arrayData; -let store; -let entity; -const isLoading = ref(false); -const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); -defineExpose({ getData }); - -onBeforeMount(async () => { - arrayData = useArrayData($props.dataKey, { - url: $props.url, - userFilter: $props.filter, - skip: 0, - oneRecord: true, - }); - store = arrayData.store; - entity = computed(() => { - const data = store.data ?? {}; - if (data) emit('onFetch', data); - return data; - }); - - // It enables to load data only once if the module is the same as the dataKey - if (!isSameDataKey.value || !route.params.id) await getData(); - watch( - () => [$props.url, $props.filter], - async () => { - if (!isSameDataKey.value) await getData(); - }, - ); -}); - -async function getData() { - store.url = $props.url; - store.filter = $props.filter ?? {}; - isLoading.value = true; - try { - const { data } = await arrayData.fetch({ append: false, updateRouter: false }); - state.set($props.dataKey, data); - emit('onFetch', data); - } finally { - isLoading.value = false; - } -} - const emit = defineEmits(['onFetch']); +const entity = ref(); </script> <template> - <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey"> + <component + :is="card" + :id + :visual="false" + v-bind="$attrs" + @on-fetch=" + (data) => { + entity = data; + emit('onFetch', data); + } + " + /> + <VnDescriptor v-model="entity" v-bind="$attrs"> <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> </template> diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue deleted file mode 100644 index 5f9a89d64..000000000 --- a/src/components/ui/CardDescriptorBeta.vue +++ /dev/null @@ -1,38 +0,0 @@ -<script setup> -import { ref } from 'vue'; -import VnDescriptor from './VnDescriptor.vue'; - -const $props = defineProps({ - id: { - type: Number, - default: false, - }, - card: { - type: Object, - default: null, - }, -}); - -const emit = defineEmits(['onFetch']); -const entity = ref(); -</script> - -<template> - <component - :is="card" - :id - :visual="false" - v-bind="$attrs" - @on-fetch=" - (data) => { - entity = data; - emit('onFetch', data); - } - " - /> - <VnDescriptor v-model="entity" v-bind="$attrs"> - <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> - <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> - </template> - </VnDescriptor> -</template> diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue new file mode 100644 index 000000000..a5dced551 --- /dev/null +++ b/src/components/ui/EntityDescriptor.vue @@ -0,0 +1,78 @@ +<script setup> +import { onBeforeMount, watch, computed, ref } from 'vue'; +import { useArrayData } from 'composables/useArrayData'; +import { useState } from 'src/composables/useState'; +import { useRoute } from 'vue-router'; +import VnDescriptor from './VnDescriptor.vue'; + +const $props = defineProps({ + url: { + type: String, + default: '', + }, + filter: { + type: Object, + default: null, + }, + dataKey: { + type: String, + default: null, + }, +}); + +const state = useState(); +const route = useRoute(); +let arrayData; +let store; +let entity; +const isLoading = ref(false); +const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); +defineExpose({ getData }); + +onBeforeMount(async () => { + arrayData = useArrayData($props.dataKey, { + url: $props.url, + userFilter: $props.filter, + skip: 0, + oneRecord: true, + }); + store = arrayData.store; + entity = computed(() => { + const data = store.data ?? {}; + if (data) emit('onFetch', data); + return data; + }); + + // It enables to load data only once if the module is the same as the dataKey + if (!isSameDataKey.value || !route.params.id) await getData(); + watch( + () => [$props.url, $props.filter], + async () => { + if (!isSameDataKey.value) await getData(); + }, + ); +}); + +async function getData() { + store.url = $props.url; + store.filter = $props.filter ?? {}; + isLoading.value = true; + try { + const { data } = await arrayData.fetch({ append: false, updateRouter: false }); + state.set($props.dataKey, data); + emit('onFetch', data); + } finally { + isLoading.value = false; + } +} + +const emit = defineEmits(['onFetch']); +</script> + +<template> + <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 2e6d98f16..7ca9a3a1e 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -118,7 +118,7 @@ const toModule = computed(() => { </QBtn> </slot> <QBtn - @click.stop="viewSummary(entity.id, $props.summary, $props.width)" + @click.stop="viewSummary(entity.id, summary, width)" round flat dense @@ -158,8 +158,8 @@ const toModule = computed(() => { <QList dense> <QItemLabel header class="ellipsis text-h5" :lines="1"> <div class="title"> - <span v-if="$props.title" :title="getValueFromPath(title)"> - {{ getValueFromPath(title) ?? $props.title }} + <span v-if="title" :title="getValueFromPath(title)"> + {{ getValueFromPath(title) ?? title }} </span> <slot v-else name="description" :entity="entity"> <span :title="entity.name"> diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue index 671ef7fbc..c9fdf9540 100644 --- a/src/pages/Account/Alias/Card/AliasDescriptor.vue +++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; @@ -48,7 +48,7 @@ const removeAlias = () => { </script> <template> - <CardDescriptor + <EntityDescriptoror ref="descriptor" :url="`MailAliases/${entityId}`" data-key="Alias" @@ -62,7 +62,7 @@ const removeAlias = () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue index 49328fe87..5537c9693 100644 --- a/src/pages/Account/Card/AccountDescriptor.vue +++ b/src/pages/Account/Card/AccountDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import AccountDescriptorMenu from './AccountDescriptorMenu.vue'; import VnImg from 'src/components/ui/VnImg.vue'; @@ -20,7 +20,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptoror ref="descriptor" :url="`VnUsers/preview`" :filter="{ ...filter, where: { id: entityId } }" @@ -78,7 +78,7 @@ onMounted(async () => { </QIcon> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <style scoped> .q-item__label { diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue index 517517af0..b364001b6 100644 --- a/src/pages/Account/Role/Card/RoleDescriptor.vue +++ b/src/pages/Account/Role/Card/RoleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -32,7 +32,7 @@ const removeRole = async () => { </script> <template> - <CardDescriptor + <EntityDescriptoror url="VnRoles" :filter="{ where: { id: entityId } }" data-key="Role" @@ -46,7 +46,7 @@ const removeRole = async () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue index d789b63d3..e3eeade83 100644 --- a/src/pages/Claim/Card/ClaimDescriptor.vue +++ b/src/pages/Claim/Card/ClaimDescriptor.vue @@ -6,7 +6,7 @@ import { toDateHourMinSec, toPercentage } from 'src/filters'; import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue'; import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; import { getUrl } from 'src/composables/getUrl'; @@ -44,7 +44,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Claims/${entityId}`" :filter="filter" title="client.name" @@ -147,7 +147,7 @@ onMounted(async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <style scoped> .q-item__label { diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index 8978c00f1..7696f086c 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -7,7 +7,7 @@ import { toCurrency, toDate } from 'src/filters'; import useCardDescription from 'src/composables/useCardDescription'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import CustomerDescriptorMenu from './CustomerDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; @@ -54,7 +54,7 @@ const debtWarning = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Clients/${entityId}/getCard`" :summary="$props.summary" data-key="Customer" @@ -232,7 +232,7 @@ const debtWarning = computed(() => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 313ed3d72..962f777ce 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -6,7 +6,7 @@ import { toDate } from 'src/filters'; import { getUrl } from 'src/composables/getUrl'; import { useQuasar } from 'quasar'; import { usePrintService } from 'composables/usePrintService'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue'; import axios from 'axios'; @@ -145,7 +145,7 @@ async function deleteEntry() { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Entries/${entityId}`" :filter="entryFilter" title="supplier.nickname" @@ -264,7 +264,7 @@ async function deleteEntry() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> es: diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue index 3843f5bf7..22ddb25d4 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue @@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n'; import axios from 'axios'; import { toCurrency, toDate } from 'src/filters'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import filter from './InvoiceInFilter.js'; import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue'; @@ -88,7 +88,7 @@ async function setInvoiceCorrection(id) { } </script> <template> - <CardDescriptor + <EntityDescriptoror ref="cardDescriptorRef" data-key="InvoiceIn" :url="`InvoiceIns/${entityId}`" @@ -163,7 +163,7 @@ async function setInvoiceCorrection(id) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <style lang="scss" scoped> .q-dialog { diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue index 2402c0bf6..6b4399ceb 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue'; @@ -34,7 +34,7 @@ function ticketFilter(invoice) { </script> <template> - <CardDescriptor + <EntityDescriptoror ref="descriptor" :url="`InvoiceOuts/${entityId}`" :filter="filter" @@ -93,5 +93,5 @@ function ticketFilter(invoice) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index 84e07a293..d624d8db9 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue'; @@ -90,7 +90,7 @@ const updateStock = async () => { </script> <template> - <CardDescriptor + <EntityDescriptoror data-key="Item" :summary="$props.summary" :url="`Items/${entityId}/getCard`" @@ -162,7 +162,7 @@ const updateStock = async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue index 725fb30aa..7bc1925a1 100644 --- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue +++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import filter from './ItemTypeFilter.js'; @@ -25,7 +25,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`ItemTypes/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { :value="entity.category?.name" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue index 9fcb44580..ee66bb57e 100644 --- a/src/pages/Order/Card/OrderDescriptor.vue +++ b/src/pages/Order/Card/OrderDescriptor.vue @@ -7,7 +7,7 @@ import { useState } from 'src/composables/useState'; import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'components/FetchData.vue'; import OrderCard from './OrderCard.vue'; -import CardDescriptorBeta from 'src/components/ui/CardDescriptorBeta.vue'; +import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; const DEFAULT_ITEMS = 0; @@ -53,7 +53,7 @@ const getConfirmationValue = (isConfirmed) => { } " /> - <CardDescriptorBeta + <CardDescriptor v-bind="$attrs" :id="entityId" :card="OrderCard" @@ -110,5 +110,5 @@ const getConfirmationValue = (isConfirmed) => { </QBtn> </QCardActions> </template> - </CardDescriptorBeta> + </CardDescriptor> </template> diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue index a0472c6c3..f2cb80b98 100644 --- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue +++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue @@ -3,7 +3,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; const props = defineProps({ @@ -21,7 +21,7 @@ const { store } = useArrayData('Parking'); const card = computed(() => store.data); </script> <template> - <CardDescriptor + <EntityDescriptoror data-key="Agency" :url="`Agencies/${entityId}`" :title="card?.name" @@ -30,5 +30,5 @@ const card = computed(() => store.data); <template #body="{ entity: agency }"> <VnLv :label="t('globals.name')" :value="agency.name" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index 01fb9c4ba..4659e8a81 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDate } from 'src/filters'; import RouteDescriptorMenu from 'pages/Route/Card/RouteDescriptorMenu.vue'; @@ -47,7 +47,7 @@ onMounted(async () => { }); </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Routes/${entityId}`" :filter="filter" :title="null" @@ -69,7 +69,7 @@ onMounted(async () => { <template #menu="{ entity }"> <RouteDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> es: diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue index 198bcf8c7..92c471fc4 100644 --- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue +++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDateHourMin } from 'src/filters'; import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue'; @@ -30,7 +30,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Roadmaps/${entityId}`" :filter="filter" data-key="Roadmap" @@ -51,7 +51,7 @@ const entityId = computed(() => { <template #menu="{ entity }"> <RoadmapDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> es: diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue index ad2ae61e4..5966b1abe 100644 --- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue +++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -20,7 +20,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Vehicles/${entityId}`" data-key="Vehicle" title="numberPlate" @@ -53,7 +53,7 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('globals.model')" :value="entity.model" /> <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> es: diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue index 5e618aa7f..5e76e7c2d 100644 --- a/src/pages/Shelving/Card/ShelvingDescriptor.vue +++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import ShelvingDescriptorMenu from 'pages/Shelving/Card/ShelvingDescriptorMenu.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; @@ -24,7 +24,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Shelvings/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { <template #menu="{ entity }"> <ShelvingDescriptorMenu :shelving="entity" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue index 46c9f8ea0..3daf9726d 100644 --- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import filter from './ParkingFilter.js'; const props = defineProps({ @@ -16,7 +16,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptoror data-key="Parking" :url="`Parkings/${entityId}`" title="code" @@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" /> <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue index 462bdf853..42489f201 100644 --- a/src/pages/Supplier/Card/SupplierDescriptor.vue +++ b/src/pages/Supplier/Card/SupplierDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateString } from 'src/filters'; @@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Suppliers/${entityId}`" :filter="filter" data-key="Supplier" @@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue index 743f2188c..6f6fe69a3 100644 --- a/src/pages/Ticket/Card/TicketDescriptor.vue +++ b/src/pages/Ticket/Card/TicketDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import TicketDescriptorMenu from './TicketDescriptorMenu.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateTimeFormat } from 'src/filters/date'; @@ -57,7 +57,7 @@ function getInfo() { </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Tickets/${entityId}`" :filter="filter" data-key="Ticket" @@ -155,7 +155,7 @@ function getInfo() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index 922f89f33..f32034a6a 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import useCardDescription from 'src/composables/useCardDescription'; import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue'; @@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </script> <template> - <CardDescriptor + <EntityDescriptoror :url="`Travels/${entityId}`" :title="data.title" :subtitle="data.subtitle" @@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index 6e3a5e83f..ecaac12f8 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -2,7 +2,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import VnChangePassword from 'src/components/common/VnChangePassword.vue'; @@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => { }; </script> <template> - <CardDescriptor + <EntityDescriptoror ref="cardDescriptorRef" :data-key="dataKey" :summary="$props.summary" @@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> <VnChangePassword ref="changePassRef" :submit-fn=" diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue index 4b7dfd9b8..17bf52a83 100644 --- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue +++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useVnConfirm } from 'composables/useVnConfirm'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -40,7 +40,7 @@ const removeDepartment = async () => { const { openConfirmationModal } = useVnConfirm(); </script> <template> - <CardDescriptor + <EntityDescriptoror ref="DepartmentDescriptorRef" :url="`Departments/${entityId}`" :summary="$props.summary" @@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm(); </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptoror> </template> <i18n> diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue index 27676212e..65cc1ae70 100644 --- a/src/pages/Zone/Card/ZoneDescriptor.vue +++ b/src/pages/Zone/Card/ZoneDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toTimeFormat } from 'src/filters/date'; import { toCurrency } from 'filters/index'; @@ -25,7 +25,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> + <EntityDescriptoror :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> <template #menu="{ entity }"> <ZoneDescriptorMenuItems :zone="entity" /> </template> @@ -36,5 +36,5 @@ const entityId = computed(() => { <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" /> <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" /> </template> - </CardDescriptor> + </EntityDescriptoror> </template> From f7046be50d1c2936b086181193b936a59fd7b4ea Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 14 Mar 2025 09:15:50 +0100 Subject: [PATCH 12/44] fix: refs #8463 fix name --- src/pages/Account/Alias/Card/AliasDescriptor.vue | 4 ++-- src/pages/Account/Card/AccountDescriptor.vue | 4 ++-- src/pages/Account/Role/Card/RoleDescriptor.vue | 4 ++-- src/pages/Claim/Card/ClaimDescriptor.vue | 4 ++-- src/pages/Customer/Card/CustomerDescriptor.vue | 4 ++-- src/pages/Entry/Card/EntryDescriptor.vue | 4 ++-- src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue | 4 ++-- src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue | 4 ++-- src/pages/Item/Card/ItemDescriptor.vue | 4 ++-- src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue | 4 ++-- src/pages/Route/Agency/Card/AgencyDescriptor.vue | 4 ++-- src/pages/Route/Card/RouteDescriptor.vue | 4 ++-- src/pages/Route/Roadmap/RoadmapDescriptor.vue | 4 ++-- src/pages/Route/Vehicle/Card/VehicleDescriptor.vue | 4 ++-- src/pages/Shelving/Card/ShelvingDescriptor.vue | 4 ++-- src/pages/Shelving/Parking/Card/ParkingDescriptor.vue | 4 ++-- src/pages/Supplier/Card/SupplierDescriptor.vue | 4 ++-- src/pages/Ticket/Card/TicketDescriptor.vue | 4 ++-- src/pages/Travel/Card/TravelDescriptor.vue | 4 ++-- src/pages/Worker/Card/WorkerDescriptor.vue | 4 ++-- src/pages/Worker/Department/Card/DepartmentDescriptor.vue | 4 ++-- src/pages/Zone/Card/ZoneDescriptor.vue | 4 ++-- 22 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue index c9fdf9540..cb01473b7 100644 --- a/src/pages/Account/Alias/Card/AliasDescriptor.vue +++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue @@ -48,7 +48,7 @@ const removeAlias = () => { </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="descriptor" :url="`MailAliases/${entityId}`" data-key="Alias" @@ -62,7 +62,7 @@ const removeAlias = () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue index 5537c9693..eb0a9013c 100644 --- a/src/pages/Account/Card/AccountDescriptor.vue +++ b/src/pages/Account/Card/AccountDescriptor.vue @@ -20,7 +20,7 @@ onMounted(async () => { </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="descriptor" :url="`VnUsers/preview`" :filter="{ ...filter, where: { id: entityId } }" @@ -78,7 +78,7 @@ onMounted(async () => { </QIcon> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue index b364001b6..490f811cb 100644 --- a/src/pages/Account/Role/Card/RoleDescriptor.vue +++ b/src/pages/Account/Role/Card/RoleDescriptor.vue @@ -32,7 +32,7 @@ const removeRole = async () => { </script> <template> - <EntityDescriptoror + <EntityDescriptor url="VnRoles" :filter="{ where: { id: entityId } }" data-key="Role" @@ -46,7 +46,7 @@ const removeRole = async () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue index e3eeade83..76ede81ed 100644 --- a/src/pages/Claim/Card/ClaimDescriptor.vue +++ b/src/pages/Claim/Card/ClaimDescriptor.vue @@ -44,7 +44,7 @@ onMounted(async () => { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Claims/${entityId}`" :filter="filter" title="client.name" @@ -147,7 +147,7 @@ onMounted(async () => { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index 7696f086c..cd18cf2c9 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -54,7 +54,7 @@ const debtWarning = computed(() => { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Clients/${entityId}/getCard`" :summary="$props.summary" data-key="Customer" @@ -232,7 +232,7 @@ const debtWarning = computed(() => { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 962f777ce..560114283 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -145,7 +145,7 @@ async function deleteEntry() { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Entries/${entityId}`" :filter="entryFilter" title="supplier.nickname" @@ -264,7 +264,7 @@ async function deleteEntry() { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue index 22ddb25d4..70282c906 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue @@ -88,7 +88,7 @@ async function setInvoiceCorrection(id) { } </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="cardDescriptorRef" data-key="InvoiceIn" :url="`InvoiceIns/${entityId}`" @@ -163,7 +163,7 @@ async function setInvoiceCorrection(id) { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <style lang="scss" scoped> .q-dialog { diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue index 6b4399ceb..b93b8c8b7 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue @@ -34,7 +34,7 @@ function ticketFilter(invoice) { </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="descriptor" :url="`InvoiceOuts/${entityId}`" :filter="filter" @@ -93,5 +93,5 @@ function ticketFilter(invoice) { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index d624d8db9..09f63a3b1 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -90,7 +90,7 @@ const updateStock = async () => { </script> <template> - <EntityDescriptoror + <EntityDescriptor data-key="Item" :summary="$props.summary" :url="`Items/${entityId}/getCard`" @@ -162,7 +162,7 @@ const updateStock = async () => { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue index 7bc1925a1..77ba0c8e9 100644 --- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue +++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue @@ -25,7 +25,7 @@ const entityId = computed(() => { }); </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`ItemTypes/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { :value="entity.category?.name" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue index f2cb80b98..07b46e25b 100644 --- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue +++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue @@ -21,7 +21,7 @@ const { store } = useArrayData('Parking'); const card = computed(() => store.data); </script> <template> - <EntityDescriptoror + <EntityDescriptor data-key="Agency" :url="`Agencies/${entityId}`" :title="card?.name" @@ -30,5 +30,5 @@ const card = computed(() => store.data); <template #body="{ entity: agency }"> <VnLv :label="t('globals.name')" :value="agency.name" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index 4659e8a81..e40dfaab8 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -47,7 +47,7 @@ onMounted(async () => { }); </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Routes/${entityId}`" :filter="filter" :title="null" @@ -69,7 +69,7 @@ onMounted(async () => { <template #menu="{ entity }"> <RouteDescriptorMenu :route="entity" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue index 92c471fc4..93acf1f74 100644 --- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue +++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue @@ -30,7 +30,7 @@ const entityId = computed(() => { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Roadmaps/${entityId}`" :filter="filter" data-key="Roadmap" @@ -51,7 +51,7 @@ const entityId = computed(() => { <template #menu="{ entity }"> <RoadmapDescriptorMenu :route="entity" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue index 5966b1abe..33b0094e3 100644 --- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue +++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue @@ -20,7 +20,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Vehicles/${entityId}`" data-key="Vehicle" title="numberPlate" @@ -53,7 +53,7 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('globals.model')" :value="entity.model" /> <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue index 5e76e7c2d..2405467da 100644 --- a/src/pages/Shelving/Card/ShelvingDescriptor.vue +++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue @@ -24,7 +24,7 @@ const entityId = computed(() => { }); </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Shelvings/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { <template #menu="{ entity }"> <ShelvingDescriptorMenu :shelving="entity" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue index 3daf9726d..bbc2c26fb 100644 --- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue @@ -16,7 +16,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <EntityDescriptoror + <EntityDescriptor data-key="Parking" :url="`Parkings/${entityId}`" title="code" @@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" /> <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue index 42489f201..2863784ab 100644 --- a/src/pages/Supplier/Card/SupplierDescriptor.vue +++ b/src/pages/Supplier/Card/SupplierDescriptor.vue @@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Suppliers/${entityId}`" :filter="filter" data-key="Supplier" @@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue index 6f6fe69a3..96920231c 100644 --- a/src/pages/Ticket/Card/TicketDescriptor.vue +++ b/src/pages/Ticket/Card/TicketDescriptor.vue @@ -57,7 +57,7 @@ function getInfo() { </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Tickets/${entityId}`" :filter="filter" data-key="Ticket" @@ -155,7 +155,7 @@ function getInfo() { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index f32034a6a..d4903f794 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </script> <template> - <EntityDescriptoror + <EntityDescriptor :url="`Travels/${entityId}`" :title="data.title" :subtitle="data.subtitle" @@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index ecaac12f8..746799a50 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => { }; </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="cardDescriptorRef" :data-key="dataKey" :summary="$props.summary" @@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => { </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> <VnChangePassword ref="changePassRef" :submit-fn=" diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue index 17bf52a83..820658593 100644 --- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue +++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue @@ -40,7 +40,7 @@ const removeDepartment = async () => { const { openConfirmationModal } = useVnConfirm(); </script> <template> - <EntityDescriptoror + <EntityDescriptor ref="DepartmentDescriptorRef" :url="`Departments/${entityId}`" :summary="$props.summary" @@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm(); </QBtn> </QCardActions> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue index 65cc1ae70..f2bcc1247 100644 --- a/src/pages/Zone/Card/ZoneDescriptor.vue +++ b/src/pages/Zone/Card/ZoneDescriptor.vue @@ -25,7 +25,7 @@ const entityId = computed(() => { </script> <template> - <EntityDescriptoror :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> + <EntityDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> <template #menu="{ entity }"> <ZoneDescriptorMenuItems :zone="entity" /> </template> @@ -36,5 +36,5 @@ const entityId = computed(() => { <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" /> <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" /> </template> - </EntityDescriptoror> + </EntityDescriptor> </template> From 9befd7317f6d193f2517572327722ef820b80943 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 14 Mar 2025 09:36:59 +0100 Subject: [PATCH 13/44] fix: refs #8463 update entity check and replace OrderDescriptorProxy with CustomerDescriptorProxy --- src/components/ui/VnDescriptor.vue | 2 +- src/pages/Order/Card/OrderSummary.vue | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 7ca9a3a1e..515e09f3a 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -99,7 +99,7 @@ const toModule = computed(() => { <template> <div class="descriptor"> - <template v-if="entity"> + <template v-if="entity && entity?.id"> <div class="header bg-primary q-pa-sm justify-between"> <slot name="header-extra-action"> <QBtn diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue index e4121a0c3..a4bdb2881 100644 --- a/src/pages/Order/Card/OrderSummary.vue +++ b/src/pages/Order/Card/OrderSummary.vue @@ -13,7 +13,6 @@ import FetchedTags from 'components/ui/FetchedTags.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import OrderDescriptorMenu from 'pages/Order/Card/OrderDescriptorMenu.vue'; -import OrderDescriptorProxy from './OrderDescriptorProxy.vue'; const { t } = useI18n(); const route = useRoute(); @@ -107,7 +106,7 @@ async function handleConfirm() { <template #value> <span class="link"> {{ dashIfEmpty(entity?.address?.nickname) }} - <OrderDescriptorProxy :id="1" /> + <CustomerDescriptorProxy :id="entity?.clientFk" /> </span> </template> </VnLv> From e92fbb1e8552745183c6ac17a6b878b68bdbb46c Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 14 Mar 2025 11:43:01 +0100 Subject: [PATCH 14/44] style: refs #8131 replace rounded by filled --- src/components/ItemsFilterPanel.vue | 6 +-- src/components/common/VnLog.vue | 9 +++- src/pages/Account/AccountFilter.vue | 6 +-- src/pages/Account/Acls/AclFilter.vue | 10 ++--- src/pages/Account/Role/AccountRolesFilter.vue | 4 +- src/pages/Claim/ClaimFilter.vue | 18 ++++---- src/pages/Customer/CustomerFilter.vue | 24 +++++----- .../Defaulter/CustomerDefaulterFilter.vue | 18 ++++---- .../Payments/CustomerPaymentsFilter.vue | 18 +++----- src/pages/Entry/EntryFilter.vue | 24 +++++----- src/pages/Entry/EntryLatestBuysFilter.vue | 14 +++--- src/pages/Entry/EntryStockBoughtFilter.vue | 2 +- src/pages/InvoiceIn/InvoiceInFilter.vue | 31 +++++-------- .../Serial/InvoiceInSerialFilter.vue | 4 +- src/pages/InvoiceOut/InvoiceOutFilter.vue | 20 ++++----- src/pages/InvoiceOut/InvoiceOutGlobalForm.vue | 22 ++++------ .../InvoiceOutNegativeBasesFilter.vue | 18 +++----- src/pages/Item/ItemFixedPriceFilter.vue | 10 ++--- src/pages/Item/ItemListFilter.vue | 24 +++++----- src/pages/Item/ItemRequestFilter.vue | 32 +++++--------- .../Monitor/Ticket/MonitorTicketFilter.vue | 34 ++++++-------- .../Order/Card/CatalogFilterValueDialog.vue | 6 +-- src/pages/Order/Card/OrderCatalogFilter.vue | 8 ++-- src/pages/Order/Card/OrderFilter.vue | 14 +++--- .../Route/Card/RouteAutonomousFilter.vue | 32 +++++--------- src/pages/Route/Card/RouteFilter.vue | 18 ++++---- src/pages/Route/Roadmap/RoadmapFilter.vue | 16 +++---- src/pages/Shelving/Card/ShelvingFilter.vue | 4 +- src/pages/Shelving/Parking/ParkingFilter.vue | 8 +--- .../Supplier/Card/SupplierBalanceFilter.vue | 6 +-- .../Card/SupplierConsumptionFilter.vue | 22 +++------- .../Ticket/Negative/TicketLackFilter.vue | 12 ++--- src/pages/Ticket/TicketAdvanceFilter.vue | 14 +++--- src/pages/Ticket/TicketFilter.vue | 44 ++++++------------- src/pages/Ticket/TicketFutureFilter.vue | 18 ++++---- src/pages/Travel/ExtraCommunityFilter.vue | 24 +++++----- src/pages/Travel/TravelFilter.vue | 27 +++++------- .../Worker/Card/WorkerCalendarFilter.vue | 6 +-- src/pages/Worker/WorkerFilter.vue | 30 +++---------- src/pages/Zone/ZoneDeliveryPanel.vue | 4 +- 40 files changed, 276 insertions(+), 385 deletions(-) diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index f73753a6b..c58c7ac3c 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -199,7 +199,7 @@ const setCategoryList = (data) => { :options="itemTypesOptions" dense outlined - rounded + filled use-input :disable="!selectedCategoryFk" @update:model-value=" @@ -236,7 +236,7 @@ const setCategoryList = (data) => { :options="tagOptions" dense outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -253,7 +253,7 @@ const setCategoryList = (data) => { option-label="value" dense outlined - rounded + filled emit-value use-input :disable="!value" diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 8f106a9f1..bbf9ce098 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -700,6 +700,7 @@ watch( v-model="searchInput" class="full-width" clearable + filled clear-icon="close" @keyup.enter="() => selectFilter('search')" @focusout="() => selectFilter('search')" @@ -719,6 +720,7 @@ watch( v-model="selectedFilters.changedModel" option-label="locale" option-value="value" + filled :options="actions" @update:model-value="selectFilter('action')" hide-selected @@ -744,8 +746,7 @@ watch( class="full-width" :label="t('globals.user')" v-model="userSelect" - option-label="name" - option-value="id" + filled :url="`${model}Logs/${route.params.id}/editors`" :fields="['id', 'nickname', 'name', 'image']" sort-by="nickname" @@ -774,6 +775,7 @@ watch( :label="t('globals.changes')" v-model="changeInput" class="full-width" + filled clearable clear-icon="close" @keyup.enter="selectFilter('change')" @@ -810,6 +812,7 @@ watch( @clear="selectFilter('date', 'to')" v-model="dateFrom" clearable + filled clear-icon="close" /> </QItem> @@ -822,6 +825,7 @@ watch( @clear="selectFilter('date', 'from')" v-model="dateTo" clearable + filled clear-icon="close" /> </QItem> @@ -835,6 +839,7 @@ watch( dense flat minimal + filled @update:model-value=" (value) => { dateFromDialog = false; diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue index 50c3ee1ac..7796e3c1a 100644 --- a/src/pages/Account/AccountFilter.vue +++ b/src/pages/Account/AccountFilter.vue @@ -47,7 +47,7 @@ const rolesOptions = ref([]); :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -57,7 +57,7 @@ const rolesOptions = ref([]); :label="t('account.card.alias')" v-model="params.nickname" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -76,7 +76,7 @@ const rolesOptions = ref([]); hide-selected dense outlined - rounded + filled :input-debounce="0" /> </QItemSection> diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue index 8035f92b8..037be525a 100644 --- a/src/pages/Account/Acls/AclFilter.vue +++ b/src/pages/Account/Acls/AclFilter.vue @@ -57,7 +57,7 @@ onBeforeMount(() => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -73,7 +73,7 @@ onBeforeMount(() => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -83,7 +83,7 @@ onBeforeMount(() => { :label="t('acls.aclFilter.property')" v-model="params.property" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -99,7 +99,7 @@ onBeforeMount(() => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -115,7 +115,7 @@ onBeforeMount(() => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Account/Role/AccountRolesFilter.vue b/src/pages/Account/Role/AccountRolesFilter.vue index cbe7a70c8..1358236c6 100644 --- a/src/pages/Account/Role/AccountRolesFilter.vue +++ b/src/pages/Account/Role/AccountRolesFilter.vue @@ -27,7 +27,7 @@ const props = defineProps({ :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -37,7 +37,7 @@ const props = defineProps({ :label="t('role.description')" v-model="params.description" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue index 37146865c..fb3e1b372 100644 --- a/src/pages/Claim/ClaimFilter.vue +++ b/src/pages/Claim/ClaimFilter.vue @@ -33,7 +33,7 @@ const props = defineProps({ :label="t('claim.customerId')" v-model="params.clientFk" lazy-rules - is-outlined + filled > <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> @@ -41,12 +41,12 @@ const props = defineProps({ :label="t('Client Name')" v-model="params.clientName" lazy-rules - is-outlined + filled /> <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -62,7 +62,7 @@ const props = defineProps({ option-filter="firstName" dense outlined - rounded + filled /> <VnSelect :label="t('claim.state')" @@ -71,13 +71,13 @@ const props = defineProps({ option-label="description" dense outlined - rounded + filled /> <VnInputDate v-model="params.created" :label="t('claim.created')" outlined - rounded + filled dense /> <VnSelect @@ -87,7 +87,7 @@ const props = defineProps({ :use-like="false" sort-by="id DESC" outlined - rounded + filled dense /> <VnSelect @@ -99,14 +99,14 @@ const props = defineProps({ option-filter="firstName" dense outlined - rounded + filled /> <VnSelect :label="t('claim.zone')" v-model="params.zoneFk" url="Zones" outlined - rounded + filled dense /> <QCheckbox diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue index 2ace6dd02..e130b8271 100644 --- a/src/pages/Customer/CustomerFilter.vue +++ b/src/pages/Customer/CustomerFilter.vue @@ -41,7 +41,7 @@ const exprBuilder = (param, value) => { <template #body="{ params, searchFn }"> <QItem class="q-my-sm"> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined> + <VnInput :label="t('FI')" v-model="params.fi" filled> <template #prepend> <QIcon name="badge" size="xs" /> </template> @@ -50,7 +50,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Name')" v-model="params.name" is-outlined /> + <VnInput :label="t('Name')" v-model="params.name" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> @@ -58,7 +58,7 @@ const exprBuilder = (param, value) => { <VnInput :label="t('customer.summary.socialName')" v-model="params.socialName" - is-outlined + filled /> </QItemSection> </QItem> @@ -67,7 +67,7 @@ const exprBuilder = (param, value) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -90,7 +90,7 @@ const exprBuilder = (param, value) => { hide-selected dense outlined - rounded + filled auto-load :input-debounce="0" /> @@ -98,12 +98,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('City')" v-model="params.city" is-outlined /> + <VnInput :label="t('City')" v-model="params.city" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Phone')" v-model="params.phone" is-outlined> + <VnInput :label="t('Phone')" v-model="params.phone" filled> <template #prepend> <QIcon name="phone" size="xs" /> </template> @@ -112,7 +112,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined> + <VnInput :label="t('Email')" v-model="params.email" filled> <template #prepend> <QIcon name="email" size="sm" /> </template> @@ -133,18 +133,14 @@ const exprBuilder = (param, value) => { hide-selected dense outlined - rounded + filled auto-load sortBy="name ASC" /></QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput - :label="t('Postcode')" - v-model="params.postcode" - is-outlined - /> + <VnInput :label="t('Postcode')" v-model="params.postcode" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue index 0eab7b7c5..482668dff 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue @@ -46,7 +46,7 @@ const departments = ref(); option-label="name" option-value="id" outlined - rounded + filled emit-value hide-selected map-options @@ -68,7 +68,7 @@ const departments = ref(); option-label="name" option-value="id" outlined - rounded + filled use-input v-model="params.departmentFk" @update:model-value="searchFn()" @@ -92,7 +92,7 @@ const departments = ref(); option-label="name" option-value="id" outlined - rounded + filled use-input v-model="params.countryFk" @update:model-value="searchFn()" @@ -108,7 +108,7 @@ const departments = ref(); <VnInput :label="t('P. Method')" clearable - is-outlined + filled v-model="params.paymentMethod" /> </QItemSection> @@ -119,7 +119,7 @@ const departments = ref(); <VnInput :label="t('Balance D.')" clearable - is-outlined + filled v-model="params.balance" /> </QItemSection> @@ -138,7 +138,7 @@ const departments = ref(); option-label="name" option-value="id" outlined - rounded + filled use-input v-model="params.workerFk" @update:model-value="searchFn()" @@ -154,7 +154,7 @@ const departments = ref(); <VnInputDate :label="t('L. O. Date')" clearable - is-outlined + filled v-model="params.date" /> </QItemSection> @@ -165,7 +165,7 @@ const departments = ref(); <VnInput :label="t('Credit I.')" clearable - is-outlined + filled v-model="params.credit" /> </QItemSection> @@ -175,7 +175,7 @@ const departments = ref(); <QItemSection> <VnInputDate :label="t('From')" - is-outlined + filled v-model="params.defaulterSinced" /> </QItemSection> diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue index 8982cba5a..ec20237b4 100644 --- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue +++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue @@ -25,7 +25,7 @@ const props = defineProps({ <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('Order ID')" v-model="params.orderFk" is-outlined> + <VnInput :label="t('Order ID')" v-model="params.orderFk" filled> <template #prepend> <QIcon name="vn:basket" size="xs" /> </template> @@ -34,11 +34,7 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Customer ID')" - v-model="params.clientFk" - is-outlined - > + <VnInput :label="t('Customer ID')" v-model="params.clientFk" filled> <template #prepend> <QIcon name="vn:client" size="xs" /> </template> @@ -47,19 +43,15 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInputNumber - :label="t('Amount')" - v-model="params.amount" - is-outlined - /> + <VnInputNumber :label="t('Amount')" v-model="params.amount" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue index c283e4a0b..0511e61ef 100644 --- a/src/pages/Entry/EntryFilter.vue +++ b/src/pages/Entry/EntryFilter.vue @@ -101,13 +101,13 @@ const entryFilterPanel = ref(); :label="t('params.landed')" v-model="params.landed" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput v-model="params.id" label="Id" is-outlined /> + <VnInput v-model="params.id" label="Id" filled /> </QItemSection> </QItem> <QItem> @@ -118,14 +118,14 @@ const entryFilterPanel = ref(); hide-selected dense outlined - rounded + filled /> </QItemSection> <QItemSection> <VnInput v-model="params.invoiceNumber" :label="t('params.invoiceNumber')" - is-outlined + filled /> </QItemSection> </QItem> @@ -134,7 +134,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.reference" :label="t('entry.list.tableVisibleColumns.reference')" - is-outlined + filled /> </QItemSection> </QItem> @@ -150,7 +150,7 @@ const entryFilterPanel = ref(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -159,7 +159,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.evaNotes" :label="t('params.evaNotes')" - is-outlined + filled /> </QItemSection> </QItem> @@ -174,7 +174,7 @@ const entryFilterPanel = ref(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -189,7 +189,7 @@ const entryFilterPanel = ref(); hide-selected dense outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -211,7 +211,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.invoiceNumber" :label="t('params.invoiceNumber')" - is-outlined + filled /> </QItemSection> </QItem> @@ -229,7 +229,7 @@ const entryFilterPanel = ref(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -238,7 +238,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.evaNotes" :label="t('params.evaNotes')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Entry/EntryLatestBuysFilter.vue b/src/pages/Entry/EntryLatestBuysFilter.vue index 19b457524..d66eb9cfd 100644 --- a/src/pages/Entry/EntryLatestBuysFilter.vue +++ b/src/pages/Entry/EntryLatestBuysFilter.vue @@ -40,7 +40,7 @@ const tagValues = ref([]); sort-by="nickname ASC" dense outlined - rounded + filled use-input @update:model-value="searchFn()" /> @@ -55,7 +55,7 @@ const tagValues = ref([]); sort-by="name ASC" dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -64,7 +64,7 @@ const tagValues = ref([]); <VnInputDate :label="t('components.itemsFilterPanel.started')" v-model="params.from" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> @@ -74,7 +74,7 @@ const tagValues = ref([]); <VnInputDate :label="t('components.itemsFilterPanel.ended')" v-model="params.to" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> @@ -121,7 +121,7 @@ const tagValues = ref([]); option-label="name" dense outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -138,7 +138,7 @@ const tagValues = ref([]); option-label="value" dense outlined - rounded + filled emit-value use-input :disable="!value" @@ -151,7 +151,7 @@ const tagValues = ref([]); v-model="value.value" :label="t('params.value')" :disable="!value" - is-outlined + filled class="filter-input" :is-clearable="false" @keyup.enter="applyTags(params, searchFn)" diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue index 136881f17..c77444f7e 100644 --- a/src/pages/Entry/EntryStockBoughtFilter.vue +++ b/src/pages/Entry/EntryStockBoughtFilter.vue @@ -50,7 +50,7 @@ onMounted(async () => { } " :label="t('Date')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue index e010a1edb..224eb6bdd 100644 --- a/src/pages/InvoiceIn/InvoiceInFilter.vue +++ b/src/pages/InvoiceIn/InvoiceInFilter.vue @@ -39,17 +39,13 @@ function handleDaysAgo(params, daysAgo) { <VnInputDate :label="$t('globals.from')" v-model="params.from" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - :label="$t('globals.to')" - v-model="params.to" - is-outlined - /> + <VnInputDate :label="$t('globals.to')" v-model="params.to" filled /> </QItemSection> </QItem> <QItem> @@ -57,7 +53,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.daysAgo')" v-model="params.daysAgo" - is-outlined + filled :step="0" @update:model-value="(val) => handleDaysAgo(params, val)" @remove="(val) => handleDaysAgo(params, val)" @@ -66,12 +62,7 @@ function handleDaysAgo(params, daysAgo) { </QItem> <QItem> <QItemSection> - <VnSelectSupplier - v-model="params.supplierFk" - dense - outlined - rounded - /> + <VnSelectSupplier v-model="params.supplierFk" dense outlined filled /> </QItemSection> </QItem> <QItem> @@ -79,7 +70,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('supplierRef')" v-model="params.supplierRef" - is-outlined + filled lazy-rules /> </QItemSection> @@ -89,7 +80,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('fi')" v-model="params.fi" - is-outlined + filled lazy-rules /> </QItemSection> @@ -99,7 +90,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('serial')" v-model="params.serial" - is-outlined + filled lazy-rules /> </QItemSection> @@ -109,7 +100,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('account')" v-model="params.account" - is-outlined + filled lazy-rules /> </QItemSection> @@ -119,7 +110,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('globals.params.awbCode')" v-model="params.awbCode" - is-outlined + filled lazy-rules /> </QItemSection> @@ -129,7 +120,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.amount')" v-model="params.amount" - is-outlined + filled /> </QItemSection> </QItem> @@ -141,7 +132,7 @@ function handleDaysAgo(params, daysAgo) { url="Companies" option-label="code" :fields="['id', 'code']" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue index 19ed73e50..ede7dfd1f 100644 --- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue +++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue @@ -26,7 +26,7 @@ const { t } = useI18n(); v-model="params.daysAgo" :label="t('params.daysAgo')" outlined - rounded + filled dense /> </QItemSection> @@ -37,7 +37,7 @@ const { t } = useI18n(); v-model="params.serial" :label="t('params.serial')" outlined - rounded + filled dense /> </QItemSection> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index 99524e0d6..20d2e5eee 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -33,17 +33,13 @@ const states = ref(); <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.fi" - :label="t('globals.params.fi')" - is-outlined - /> + <VnInput v-model="params.fi" :label="t('globals.params.fi')" filled /> </QItemSection> </QItem> <QItem> @@ -51,7 +47,7 @@ const states = ref(); <VnInputNumber :label="t('globals.amount')" v-model="params.amount" - is-outlined + filled data-cy="InvoiceOutFilterAmountBtn" /> </QItemSection> @@ -63,7 +59,7 @@ const states = ref(); dense lazy-rules outlined - rounded + filled type="number" v-model.number="params.min" /> @@ -74,7 +70,7 @@ const states = ref(); dense lazy-rules outlined - rounded + filled type="number" v-model.number="params.max" /> @@ -94,7 +90,7 @@ const states = ref(); <VnInputDate v-model="params.created" :label="t('invoiceOut.params.created')" - is-outlined + filled /> </QItemSection> </QItem> @@ -103,7 +99,7 @@ const states = ref(); <VnInputDate v-model="params.dued" :label="t('invoiceOut.params.dued')" - is-outlined + filled /> </QItemSection> </QItem> @@ -111,7 +107,7 @@ const states = ref(); <QItemSection> <VnSelect outlined - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue index 392256473..53433c56b 100644 --- a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue +++ b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue @@ -26,7 +26,7 @@ const serialTypesOptions = ref([]); const handleInvoiceOutSerialsFetch = (data) => { serialTypesOptions.value = Array.from( - new Set(data.map((item) => item.type).filter((type) => type)) + new Set(data.map((item) => item.type).filter((type) => type)), ); }; @@ -99,8 +99,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalClientSelect" > <template #option="scope"> @@ -124,19 +123,18 @@ onMounted(async () => { option-label="type" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalSerialSelect" /> <VnInputDate v-model="formData.invoiceDate" :label="t('invoiceDate')" - is-outlined + filled /> <VnInputDate v-model="formData.maxShipped" :label="t('maxShipped')" - is-outlined + filled data-cy="InvoiceOutGlobalMaxShippedDate" /> <VnSelect @@ -145,8 +143,7 @@ onMounted(async () => { :options="companiesOptions" option-label="code" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalCompanySelect" /> <VnSelect @@ -154,8 +151,7 @@ onMounted(async () => { v-model="formData.printer" :options="printersOptions" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalPrinterSelect" /> </div> @@ -166,7 +162,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense /> <QBtn @@ -175,7 +171,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense @click="getStatus = 'stopping'" /> diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index b24c8b247..321f48664 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -35,17 +35,13 @@ const props = defineProps({ <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('globals.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('globals.to')" filled /> </QItemSection> </QItem> <QItem> @@ -58,7 +54,7 @@ const props = defineProps({ option-value="code" dense outlined - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -86,7 +82,7 @@ const props = defineProps({ option-value="name" outlined dense - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -112,7 +108,7 @@ const props = defineProps({ v-model="params.clientId" outlined dense - rounded + filled @update:model-value="searchFn()" /> </QItemSection> @@ -122,7 +118,7 @@ const props = defineProps({ <VnInputNumber v-model="params.amount" :label="t('globals.amount')" - is-outlined + filled :positive="false" /> </QItemSection> @@ -132,7 +128,7 @@ const props = defineProps({ <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue index 8d92e245d..97fbe528a 100644 --- a/src/pages/Item/ItemFixedPriceFilter.vue +++ b/src/pages/Item/ItemFixedPriceFilter.vue @@ -13,7 +13,6 @@ const props = defineProps({ required: true, }, }); - </script> <template> @@ -28,8 +27,7 @@ const props = defineProps({ :fields="['id', 'nickname']" option-label="nickname" dense - outlined - rounded + filled use-input @update:model-value="searchFn()" sort-by="nickname ASC" @@ -47,7 +45,7 @@ const props = defineProps({ v-model="params.warehouseFk" dense outlined - rounded + filled use-input @update:model-value="searchFn()" /> @@ -58,7 +56,7 @@ const props = defineProps({ <VnInputDate :label="t('params.started')" v-model="params.started" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> @@ -68,7 +66,7 @@ const props = defineProps({ <VnInputDate :label="t('params.ended')" v-model="params.ended" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index 22e948e06..b37435a84 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -177,11 +177,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -198,7 +194,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -214,7 +210,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -241,7 +237,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -253,7 +249,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -283,7 +279,7 @@ onMounted(async () => { option-label="name" dense outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -300,7 +296,7 @@ onMounted(async () => { option-label="value" dense outlined - rounded + filled emit-value use-input :disable="!tag" @@ -312,7 +308,7 @@ onMounted(async () => { v-model="tag.value" :label="t('params.value')" :disable="!tag" - is-outlined + filled :is-clearable="false" @keydown.enter.prevent="applyTags(params, searchFn)" /> @@ -352,7 +348,7 @@ onMounted(async () => { option-value="label" dense outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -377,7 +373,7 @@ onMounted(async () => { v-model="fieldFilter.value" :label="t('params.value')" :disable="!fieldFilter.selectedField" - is-outlined + filled @keydown.enter="applyFieldFilters(params, searchFn)" /> </QItemSection> diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue index a29203df3..88f53d1f8 100644 --- a/src/pages/Item/ItemRequestFilter.vue +++ b/src/pages/Item/ItemRequestFilter.vue @@ -87,11 +87,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -99,7 +95,7 @@ onMounted(async () => { <VnInput v-model="params.ticketFk" :label="t('params.ticketFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -115,7 +111,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -124,7 +120,7 @@ onMounted(async () => { <VnInput v-model="params.clientFk" :label="t('params.clientFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -140,7 +136,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -154,24 +150,16 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('params.from')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('params.from')" filled /> </QItemSection> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('params.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('params.to')" filled /> </QItemSection> </QItem> <QItem> @@ -180,7 +168,7 @@ onMounted(async () => { :label="t('params.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -196,7 +184,7 @@ onMounted(async () => { hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 447dd35b8..4d93f2de5 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -77,7 +77,7 @@ const getLocale = (label) => { <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -86,7 +86,7 @@ const getLocale = (label) => { <VnInput :label="t('params.orderFk')" v-model="params.orderFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -95,7 +95,7 @@ const getLocale = (label) => { <VnInputNumber :label="t('params.scopeDays')" v-model="params.scopeDays" - is-outlined + filled @update:model-value="(val) => handleScopeDays(params, val)" @remove="(val) => handleScopeDays(params, val)" /> @@ -106,7 +106,7 @@ const getLocale = (label) => { <VnInput :label="t('params.nickname')" v-model="params.nickname" - is-outlined + filled /> </QItemSection> </QItem> @@ -115,7 +115,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -126,11 +126,7 @@ const getLocale = (label) => { </QItem> <QItem> <QItemSection> - <VnInput - :label="t('params.refFk')" - v-model="params.refFk" - is-outlined - /> + <VnInput :label="t('params.refFk')" v-model="params.refFk" filled /> </QItemSection> </QItem> @@ -139,11 +135,10 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('params.agencyModeFk')" v-model="params.agencyModeFk" url="AgencyModes/isActive" - is-outlined /> </QItemSection> </QItem> @@ -152,11 +147,10 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.stateFk')" v-model="params.stateFk" url="States" - is-outlined /> </QItemSection> </QItem> @@ -165,7 +159,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('params.groupedStates')" v-model="params.alertLevel" :options="groupedStates" @@ -178,7 +172,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.warehouseFk')" v-model="params.warehouseFk" :options="warehouses" @@ -190,7 +184,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.countryFk')" v-model="params.countryFk" url="Countries" @@ -202,7 +196,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.provinceFk')" v-model="params.provinceFk" url="Provinces" @@ -214,7 +208,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.department" option-label="name" @@ -228,7 +222,7 @@ const getLocale = (label) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.packing')" v-model="params.packing" url="ItemPackingTypes" diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index d1bd48c9e..6c2684c27 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -59,7 +59,7 @@ const getSelectedTagValues = async (tag) => { dense outlined class="q-mb-md" - rounded + filled :emit-value="false" use-input @update:model-value="getSelectedTagValues" @@ -80,7 +80,7 @@ const getSelectedTagValues = async (tag) => { option-label="value" dense outlined - rounded + filled emit-value use-input :disable="!value || !selectedTag" @@ -101,7 +101,7 @@ const getSelectedTagValues = async (tag) => { size="md" outlined dense - rounded + filled flat class="filter-icon col-2" @click="tagValues.splice(index, 1)" diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index d16a92017..8b8a563d8 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -222,7 +222,7 @@ function addOrder(value, field, params) { option-label="name" dense outlined - rounded + filled emit-value use-input sort-by="name ASC" @@ -252,7 +252,7 @@ function addOrder(value, field, params) { :options="orderByList" dense outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'field', params)" /> </QItemSection> @@ -265,7 +265,7 @@ function addOrder(value, field, params) { :options="orderWayList" dense outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'way', params)" /> </QItemSection> @@ -276,7 +276,7 @@ function addOrder(value, field, params) { :label="t('components.itemsFilterPanel.value')" dense outlined - rounded + filled :is-clearable="false" v-model="searchByTag" @keyup.enter="(val) => onSearchByTag(val, params)" diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue index 42578423f..127601d04 100644 --- a/src/pages/Order/Card/OrderFilter.vue +++ b/src/pages/Order/Card/OrderFilter.vue @@ -50,7 +50,7 @@ const sourceList = ref([]); lazy-rules dense outlined - rounded + filled /> <VnSelect :label="t('agency')" @@ -59,12 +59,12 @@ const sourceList = ref([]); :input-debounce="0" dense outlined - rounded + filled /> <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -76,20 +76,20 @@ const sourceList = ref([]); :label="t('fromLanded')" dense outlined - rounded + filled /> <VnInputDate v-model="params.to" :label="t('toLanded')" dense outlined - rounded + filled /> <VnInput :label="t('orderId')" v-model="params.orderFk" lazy-rules - is-outlined + filled /> <VnSelect :label="t('application')" @@ -99,7 +99,7 @@ const sourceList = ref([]); option-value="value" dense outlined - rounded + filled :input-debounce="0" /> <QCheckbox diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue index f70f60e1c..96298f515 100644 --- a/src/pages/Route/Card/RouteAutonomousFilter.vue +++ b/src/pages/Route/Card/RouteAutonomousFilter.vue @@ -71,7 +71,7 @@ const exprBuilder = (param, value) => { <QList dense> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.routeFk" :label="t('ID')" is-outlined /> + <VnInput v-model="params.routeFk" :label="t('ID')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm" v-if="agencyList"> @@ -84,7 +84,7 @@ const exprBuilder = (param, value) => { option-label="name" dense outlined - rounded + filled emit-value map-options use-input @@ -103,7 +103,7 @@ const exprBuilder = (param, value) => { option-label="name" dense outlined - rounded + filled emit-value map-options use-input @@ -124,7 +124,7 @@ const exprBuilder = (param, value) => { option-label="name" dense outlined - rounded + filled emit-value map-options use-input @@ -135,20 +135,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.dated" - :label="t('Date')" - is-outlined - /> + <VnInputDate v-model="params.dated" :label="t('Date')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('From')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -156,7 +148,7 @@ const exprBuilder = (param, value) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled is-clearable /> </QItemSection> @@ -166,23 +158,23 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.packages" :label="t('Packages')" - is-outlined + filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" :label="t('m3')" is-outlined /> + <VnInput v-model="params.m3" :label="t('m3')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.kmTotal" :label="t('Km')" is-outlined /> + <VnInput v-model="params.kmTotal" :label="t('Km')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.price" :label="t('Price')" is-outlined /> + <VnInput v-model="params.price" :label="t('Price')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -190,7 +182,7 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.invoiceInFk" :label="t('Received')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue index cb5158517..2fa04559c 100644 --- a/src/pages/Route/Card/RouteFilter.vue +++ b/src/pages/Route/Card/RouteFilter.vue @@ -37,7 +37,7 @@ const emit = defineEmits(['search']); v-model="params.workerFk" dense outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -53,7 +53,7 @@ const emit = defineEmits(['search']); option-label="name" dense outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -63,7 +63,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -74,7 +74,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.to" :label="t('globals.to')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -86,7 +86,7 @@ const emit = defineEmits(['search']); v-model="params.scopeDays" type="number" :label="t('globals.daysOnward')" - is-outlined + filled clearable :disable="Boolean(params.from || params.to)" @update:model-value=" @@ -108,14 +108,14 @@ const emit = defineEmits(['search']); option-filter-value="numberPlate" dense outlined - rounded + filled :input-debounce="0" /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" label="m³" is-outlined clearable /> + <VnInput v-model="params.m3" label="m³" filled clearable /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -128,7 +128,7 @@ const emit = defineEmits(['search']); option-label="name" dense outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -138,7 +138,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.description" :label="t('globals.description')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 982f1efba..15e7e64e4 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -31,12 +31,12 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -44,7 +44,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.tractorPlate" :label="t('Tractor Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -54,7 +54,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.trailerPlate" :label="t('Trailer Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -67,7 +67,7 @@ const emit = defineEmits(['search']); v-model="params.supplierFk" dense outlined - rounded + filled emit-value map-options use-input @@ -81,7 +81,7 @@ const emit = defineEmits(['search']); v-model="params.price" :label="t('Price')" type="number" - is-outlined + filled clearable /> </QItemSection> @@ -91,7 +91,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.driverName" :label="t('Driver name')" - is-outlined + filled clearable /> </QItemSection> @@ -101,7 +101,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.phone" :label="t('Phone')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue index 88d716046..f91622cfd 100644 --- a/src/pages/Shelving/Card/ShelvingFilter.vue +++ b/src/pages/Shelving/Card/ShelvingFilter.vue @@ -40,14 +40,14 @@ const emit = defineEmits(['search']); :filter-options="['id', 'code']" dense outlined - rounded + filled sort-by="code ASC" /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnSelectWorker v-model="params.userFk" outlined rounded /> + <VnSelectWorker v-model="params.userFk" outlined filled /> </QItemSection> </QItem> <QItem class="q-mb-md"> diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue index 1d7c3a4b6..509b08f4c 100644 --- a/src/pages/Shelving/Parking/ParkingFilter.vue +++ b/src/pages/Shelving/Parking/ParkingFilter.vue @@ -36,11 +36,7 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem> <QItemSection> - <VnInput - :label="t('params.code')" - v-model="params.code" - is-outlined - /> + <VnInput :label="t('params.code')" v-model="params.code" filled /> </QItemSection> </QItem> <QItem> @@ -52,7 +48,7 @@ const emit = defineEmits(['search']); :label="t('params.sectorFk')" dense outlined - rounded + filled :options="sectors" use-input input-debounce="0" diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue index c4b63d9c8..b7c5555fa 100644 --- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue +++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue @@ -33,7 +33,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -48,7 +48,7 @@ defineProps({ sort-by="id" dense outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -75,7 +75,7 @@ defineProps({ hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue index 390f7d9ff..4de0c0039 100644 --- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue +++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue @@ -25,20 +25,12 @@ defineProps({ <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.itemId" - :label="t('params.itemId')" - is-outlined - /> + <VnInput v-model="params.itemId" :label="t('params.itemId')" filled /> </QItemSection> </QItem> <QItem> @@ -55,7 +47,7 @@ defineProps({ hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -74,7 +66,7 @@ defineProps({ hide-selected dense outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -103,7 +95,7 @@ defineProps({ hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -113,7 +105,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -123,7 +115,7 @@ defineProps({ :label="t('params.to')" v-model="params.to" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index 3762f453d..e5b34dcf6 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -81,7 +81,7 @@ const setUserParams = (params) => { v-model="params.days" :label="t('negative.days')" dense - is-outlined + filled type="number" @update:model-value=" (value) => { @@ -97,7 +97,7 @@ const setUserParams = (params) => { v-model="params.id" :label="t('negative.id')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -107,7 +107,7 @@ const setUserParams = (params) => { v-model="params.producer" :label="t('negative.producer')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -117,7 +117,7 @@ const setUserParams = (params) => { v-model="params.origen" :label="t('negative.origen')" dense - is-outlined + filled /> </QItemSection> </QItem ><QItem> @@ -134,7 +134,7 @@ const setUserParams = (params) => { hide-selected dense outlined - rounded + filled /> </QItemSection ><QItemSection v-else> <QSkeleton class="full-width" type="QSelect" /> @@ -152,7 +152,7 @@ const setUserParams = (params) => { hide-selected dense outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue index 6d5c7726e..c59db53f2 100644 --- a/src/pages/Ticket/TicketAdvanceFilter.vue +++ b/src/pages/Ticket/TicketAdvanceFilter.vue @@ -71,7 +71,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateFuture" :label="t('params.dateFuture')" - is-outlined + filled /> </QItemSection> </QItem> @@ -80,7 +80,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateToAdvance" :label="t('params.dateToAdvance')" - is-outlined + filled /> </QItemSection> </QItem> @@ -96,7 +96,7 @@ onMounted(async () => await getItemPackingTypes()); @update:model-value="searchFn()" dense outlined - rounded + filled :use-like="false" > </VnSelect> @@ -114,7 +114,7 @@ onMounted(async () => await getItemPackingTypes()); @update:model-value="searchFn()" dense outlined - rounded + filled :use-like="false" > </VnSelect> @@ -125,7 +125,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputNumber v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> @@ -148,7 +148,7 @@ onMounted(async () => await getItemPackingTypes()); :fields="['id', 'name']" dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -163,7 +163,7 @@ onMounted(async () => await getItemPackingTypes()); @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue index f959157f6..ccc42f9be 100644 --- a/src/pages/Ticket/TicketFilter.vue +++ b/src/pages/Ticket/TicketFilter.vue @@ -63,18 +63,10 @@ const getGroupedStates = (data) => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.clientFk" - :label="t('Customer ID')" - is-outlined - /> + <VnInput v-model="params.clientFk" :label="t('Customer ID')" filled /> </QItemSection> <QItemSection> - <VnInput - v-model="params.orderFk" - :label="t('Order ID')" - is-outlined - /> + <VnInput v-model="params.orderFk" :label="t('Order ID')" filled /> </QItemSection> </QItem> <QItem> @@ -82,7 +74,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.from" :label="t('From')" - is-outlined + filled data-cy="From_date" /> </QItemSection> @@ -90,7 +82,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled data-cy="To_date" /> </QItemSection> @@ -100,7 +92,7 @@ const getGroupedStates = (data) => { <VnSelect outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -126,7 +118,7 @@ const getGroupedStates = (data) => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -147,18 +139,14 @@ const getGroupedStates = (data) => { use-input dense outlined - rounded + filled sort-by="name ASC" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.refFk" - :label="t('Invoice Ref.')" - is-outlined - /> + <VnInput v-model="params.refFk" :label="t('Invoice Ref.')" filled /> </QItemSection> </QItem> <QItem> @@ -166,17 +154,13 @@ const getGroupedStates = (data) => { <VnInput v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.nickname" - :label="t('Nickname')" - is-outlined - /> + <VnInput v-model="params.nickname" :label="t('Nickname')" filled /> </QItemSection> </QItem> <QItem> @@ -242,7 +226,7 @@ const getGroupedStates = (data) => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -261,7 +245,7 @@ const getGroupedStates = (data) => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -282,7 +266,7 @@ const getGroupedStates = (data) => { use-input dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -291,7 +275,7 @@ const getGroupedStates = (data) => { <VnInput v-model="params.collectionFk" :label="t('Collection')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue index 64e060a39..92b6bfd62 100644 --- a/src/pages/Ticket/TicketFutureFilter.vue +++ b/src/pages/Ticket/TicketFutureFilter.vue @@ -73,7 +73,7 @@ onMounted(async () => { <VnInputDate v-model="params.originScopeDays" :label="t('params.originScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -82,7 +82,7 @@ onMounted(async () => { <VnInputDate v-model="params.futureScopeDays" :label="t('params.futureScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -91,7 +91,7 @@ onMounted(async () => { <VnInput :label="t('params.litersMax')" v-model="params.litersMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -100,7 +100,7 @@ onMounted(async () => { <VnInput :label="t('params.linesMax')" v-model="params.linesMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -116,7 +116,7 @@ onMounted(async () => { @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> @@ -133,7 +133,7 @@ onMounted(async () => { @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> @@ -149,7 +149,7 @@ onMounted(async () => { @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> @@ -165,7 +165,7 @@ onMounted(async () => { @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> @@ -192,7 +192,7 @@ onMounted(async () => { @update:model-value="searchFn()" dense outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue index ae6e695be..acb8c4e72 100644 --- a/src/pages/Travel/ExtraCommunityFilter.vue +++ b/src/pages/Travel/ExtraCommunityFilter.vue @@ -87,7 +87,7 @@ warehouses(); <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput label="id" v-model="params.id" is-outlined /> + <VnInput label="id" v-model="params.id" filled /> </QItemSection> </QItem> <QItem> @@ -95,7 +95,7 @@ warehouses(); <VnInput :label="t('extraCommunity.filter.reference')" v-model="params.reference" - is-outlined + filled /> </QItemSection> </QItem> @@ -107,7 +107,7 @@ warehouses(); :label="t('extraCommunity.filter.totalEntries')" dense outlined - rounded + filled min="0" class="input-number" > @@ -142,7 +142,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -152,7 +152,7 @@ warehouses(); :label="t('extraCommunity.filter.shippedFrom')" v-model="params.shippedFrom" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -162,7 +162,7 @@ warehouses(); :label="t('extraCommunity.filter.landedTo')" v-model="params.landedTo" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -177,7 +177,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -192,7 +192,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -207,7 +207,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -219,7 +219,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -230,7 +230,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> @@ -246,7 +246,7 @@ warehouses(); hide-selected dense outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue index 4a9c80952..c36ba2ecc 100644 --- a/src/pages/Travel/TravelFilter.vue +++ b/src/pages/Travel/TravelFilter.vue @@ -33,19 +33,14 @@ defineExpose({ states }); </template> <template #body="{ params, searchFn }"> <div class="q-pa-sm q-gutter-y-sm"> - <VnInput - :label="t('travel.Id')" - v-model="params.id" - lazy-rules - is-outlined - > + <VnInput :label="t('travel.Id')" v-model="params.id" lazy-rules filled> <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> <VnInput :label="t('travel.ref')" v-model="params.ref" lazy-rules - is-outlined + filled /> <VnSelect :label="t('travel.agency')" @@ -57,7 +52,7 @@ defineExpose({ states }); option-filter="name" dense outlined - rounded + filled /> <VnSelect :label="t('travel.warehouseInFk')" @@ -70,21 +65,21 @@ defineExpose({ states }); option-filter="name" dense outlined - rounded + filled /> <VnInputDate :label="t('travel.shipped')" v-model="params.shipped" @update:model-value="searchFn()" outlined - rounded + filled /> <VnInputTime v-model="params.shipmentHour" @update:model-value="searchFn()" :label="t('travel.shipmentHour')" outlined - rounded + filled dense /> <VnSelect @@ -98,7 +93,7 @@ defineExpose({ states }); option-filter="name" dense outlined - rounded + filled /> <VnInputDate :label="t('travel.landed')" @@ -106,27 +101,27 @@ defineExpose({ states }); @update:model-value="searchFn()" dense outlined - rounded + filled /> <VnInputTime v-model="params.landingHour" @update:model-value="searchFn()" :label="t('travel.landingHour')" outlined - rounded + filled dense /> <VnInput :label="t('travel.totalEntries')" v-model="params.totalEntries" lazy-rules - is-outlined + filled /> <VnInput :label="t('travel.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </div> </template> diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue index 48fc4094b..47ca04fae 100644 --- a/src/pages/Worker/Card/WorkerCalendarFilter.vue +++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue @@ -40,7 +40,7 @@ watch( (newValue) => { checkHolidays(newValue); }, - { deep: true, immediate: true } + { deep: true, immediate: true }, ); const emit = defineEmits(['update:businessFk', 'update:year', 'update:absenceType']); @@ -175,7 +175,7 @@ const yearList = ref(generateYears()); :options="yearList" dense outlined - rounded + filled use-input :is-clearable="false" /> @@ -189,7 +189,7 @@ const yearList = ref(generateYears()); option-label="businessFk" dense outlined - rounded + filled use-input :is-clearable="false" > diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue index 8210ba0e3..c24797901 100644 --- a/src/pages/Worker/WorkerFilter.vue +++ b/src/pages/Worker/WorkerFilter.vue @@ -35,7 +35,7 @@ const getLocale = (label) => { <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined + <VnInput :label="t('FI')" v-model="params.fi" filled ><template #prepend> <QIcon name="badge" size="xs"></QIcon> </template ></VnInput> @@ -43,29 +43,17 @@ const getLocale = (label) => { </QItem> <QItem> <QItemSection> - <VnInput - :label="t('First Name')" - v-model="params.firstName" - is-outlined - /> + <VnInput :label="t('First Name')" v-model="params.firstName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Last Name')" - v-model="params.lastName" - is-outlined - /> + <VnInput :label="t('Last Name')" v-model="params.lastName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('User Name')" - v-model="params.userName" - is-outlined - /> + <VnInput :label="t('User Name')" v-model="params.userName" filled /> </QItemSection> </QItem> <QItem> @@ -80,22 +68,18 @@ const getLocale = (label) => { map-options dense outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined /> + <VnInput :label="t('Email')" v-model="params.email" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Extension')" - v-model="params.extension" - is-outlined - /> + <VnInput :label="t('Extension')" v-model="params.extension" filled /> </QItemSection> </QItem> <QItem> diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index a8cb05afc..b49e3e1b4 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -96,7 +96,7 @@ watch( hide-selected dense outlined - rounded + filled map-key="geoFk" data-cy="ZoneDeliveryDaysPostcodeSelect" > @@ -129,7 +129,7 @@ watch( hide-selected dense outlined - rounded + filled data-cy="ZoneDeliveryDaysAgencySelect" /> <VnSelect From 3fdf82258e953fc282cf427cd385b265a6307ab4 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 14 Mar 2025 11:45:48 +0100 Subject: [PATCH 15/44] style: refs #8131 remove outlined from filterPanel --- src/components/ItemsFilterPanel.vue | 5 +---- src/pages/Account/AccountFilter.vue | 1 - src/pages/Account/Acls/AclFilter.vue | 4 ---- src/pages/Claim/ClaimFilter.vue | 7 ------- src/pages/Customer/CustomerFilter.vue | 3 --- .../Customer/Defaulter/CustomerDefaulterFilter.vue | 4 ---- src/pages/Entry/EntryFilter.vue | 5 ----- src/pages/Entry/EntryLatestBuysFilter.vue | 4 ---- src/pages/InvoiceIn/InvoiceInFilter.vue | 2 +- .../InvoiceIn/Serial/InvoiceInSerialFilter.vue | 2 -- src/pages/InvoiceOut/InvoiceOutFilter.vue | 3 --- .../InvoiceOut/InvoiceOutNegativeBasesFilter.vue | 4 ---- src/pages/Item/ItemFixedPriceFilter.vue | 1 - src/pages/Item/ItemListFilter.vue | 7 ------- src/pages/Item/ItemRequestFilter.vue | 4 ---- src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 9 --------- src/pages/Order/Card/CatalogFilterValueDialog.vue | 5 +---- src/pages/Order/Card/OrderCatalogFilter.vue | 4 ---- src/pages/Order/Card/OrderFilter.vue | 13 +------------ src/pages/Route/Card/RouteAutonomousFilter.vue | 3 --- src/pages/Route/Card/RouteFilter.vue | 4 ---- src/pages/Route/Roadmap/RoadmapFilter.vue | 1 - src/pages/Shelving/Card/ShelvingFilter.vue | 3 +-- src/pages/Shelving/Parking/ParkingFilter.vue | 1 - src/pages/Supplier/Card/SupplierBalanceFilter.vue | 2 -- .../Supplier/Card/SupplierConsumptionFilter.vue | 3 --- src/pages/Ticket/Negative/TicketLackFilter.vue | 2 -- src/pages/Ticket/TicketAdvanceFilter.vue | 4 ---- src/pages/Ticket/TicketFilter.vue | 6 ------ src/pages/Ticket/TicketFutureFilter.vue | 5 ----- src/pages/Travel/ExtraCommunityFilter.vue | 8 -------- src/pages/Travel/TravelFilter.vue | 7 ------- src/pages/Worker/Card/WorkerCalendarFilter.vue | 2 -- src/pages/Worker/WorkerFilter.vue | 1 - src/pages/Zone/ZoneDeliveryPanel.vue | 3 --- 35 files changed, 5 insertions(+), 137 deletions(-) diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index c58c7ac3c..3c689750a 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -198,7 +198,6 @@ const setCategoryList = (data) => { v-model="params.typeFk" :options="itemTypesOptions" dense - outlined filled use-input :disable="!selectedCategoryFk" @@ -235,7 +234,6 @@ const setCategoryList = (data) => { v-model="value.selectedTag" :options="tagOptions" dense - outlined filled :emit-value="false" use-input @@ -252,7 +250,6 @@ const setCategoryList = (data) => { option-value="value" option-label="value" dense - outlined filled emit-value use-input @@ -265,7 +262,7 @@ const setCategoryList = (data) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined + is- :is-clearable="false" @keyup.enter="applyTags(params, searchFn)" /> diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue index 7796e3c1a..732e92f77 100644 --- a/src/pages/Account/AccountFilter.vue +++ b/src/pages/Account/AccountFilter.vue @@ -75,7 +75,6 @@ const rolesOptions = ref([]); use-input hide-selected dense - outlined filled :input-debounce="0" /> diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue index 037be525a..222fe5b77 100644 --- a/src/pages/Account/Acls/AclFilter.vue +++ b/src/pages/Account/Acls/AclFilter.vue @@ -56,7 +56,6 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined filled /> </QItemSection> @@ -72,7 +71,6 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined filled /> </QItemSection> @@ -98,7 +96,6 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined filled /> </QItemSection> @@ -114,7 +111,6 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined filled /> </QItemSection> diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue index fb3e1b372..51460f7e4 100644 --- a/src/pages/Claim/ClaimFilter.vue +++ b/src/pages/Claim/ClaimFilter.vue @@ -44,7 +44,6 @@ const props = defineProps({ filled /> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -61,7 +60,6 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined filled /> <VnSelect @@ -70,13 +68,11 @@ const props = defineProps({ :options="states" option-label="description" dense - outlined filled /> <VnInputDate v-model="params.created" :label="t('claim.created')" - outlined filled dense /> @@ -86,7 +82,6 @@ const props = defineProps({ url="Items/withName" :use-like="false" sort-by="id DESC" - outlined filled dense /> @@ -98,14 +93,12 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined filled /> <VnSelect :label="t('claim.zone')" v-model="params.zoneFk" url="Zones" - outlined filled dense /> diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue index e130b8271..55a7f565e 100644 --- a/src/pages/Customer/CustomerFilter.vue +++ b/src/pages/Customer/CustomerFilter.vue @@ -65,7 +65,6 @@ const exprBuilder = (param, value) => { <QItem class="q-mb-sm"> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -89,7 +88,6 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined filled auto-load :input-debounce="0" @@ -132,7 +130,6 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined filled auto-load sortBy="name ASC" diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue index 482668dff..64e3baeb5 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue @@ -45,7 +45,6 @@ const departments = ref(); dense option-label="name" option-value="id" - outlined filled emit-value hide-selected @@ -67,7 +66,6 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined filled use-input v-model="params.departmentFk" @@ -91,7 +89,6 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined filled use-input v-model="params.countryFk" @@ -137,7 +134,6 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined filled use-input v-model="params.workerFk" diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue index 0511e61ef..43607e3d7 100644 --- a/src/pages/Entry/EntryFilter.vue +++ b/src/pages/Entry/EntryFilter.vue @@ -117,7 +117,6 @@ const entryFilterPanel = ref(); @update:model-value="searchFn()" hide-selected dense - outlined filled /> </QItemSection> @@ -149,7 +148,6 @@ const entryFilterPanel = ref(); :fields="['id', 'name']" hide-selected dense - outlined filled /> </QItemSection> @@ -173,7 +171,6 @@ const entryFilterPanel = ref(); :fields="['id', 'name']" hide-selected dense - outlined filled /> </QItemSection> @@ -188,7 +185,6 @@ const entryFilterPanel = ref(); :fields="['id', 'name']" hide-selected dense - outlined filled > <template #option="scope"> @@ -228,7 +224,6 @@ const entryFilterPanel = ref(); option-label="description" hide-selected dense - outlined filled /> </QItemSection> diff --git a/src/pages/Entry/EntryLatestBuysFilter.vue b/src/pages/Entry/EntryLatestBuysFilter.vue index d66eb9cfd..6a548fa7f 100644 --- a/src/pages/Entry/EntryLatestBuysFilter.vue +++ b/src/pages/Entry/EntryLatestBuysFilter.vue @@ -39,7 +39,6 @@ const tagValues = ref([]); :fields="['id', 'nickname']" sort-by="nickname ASC" dense - outlined filled use-input @update:model-value="searchFn()" @@ -54,7 +53,6 @@ const tagValues = ref([]); :fields="['id', 'name', 'nickname']" sort-by="name ASC" dense - outlined filled /> </QItemSection> @@ -120,7 +118,6 @@ const tagValues = ref([]); :options="tagOptions" option-label="name" dense - outlined filled :emit-value="false" use-input @@ -137,7 +134,6 @@ const tagValues = ref([]); option-value="value" option-label="value" dense - outlined filled emit-value use-input diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue index 224eb6bdd..2ad25454b 100644 --- a/src/pages/InvoiceIn/InvoiceInFilter.vue +++ b/src/pages/InvoiceIn/InvoiceInFilter.vue @@ -62,7 +62,7 @@ function handleDaysAgo(params, daysAgo) { </QItem> <QItem> <QItemSection> - <VnSelectSupplier v-model="params.supplierFk" dense outlined filled /> + <VnSelectSupplier v-model="params.supplierFk" dense filled /> </QItemSection> </QItem> <QItem> diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue index ede7dfd1f..66b7fa433 100644 --- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue +++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue @@ -25,7 +25,6 @@ const { t } = useI18n(); <VnInputNumber v-model="params.daysAgo" :label="t('params.daysAgo')" - outlined filled dense /> @@ -36,7 +35,6 @@ const { t } = useI18n(); <VnInput v-model="params.serial" :label="t('params.serial')" - outlined filled dense /> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index 20d2e5eee..93a343565 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -58,7 +58,6 @@ const states = ref(); :label="t('invoiceOut.params.min')" dense lazy-rules - outlined filled type="number" v-model.number="params.min" @@ -69,7 +68,6 @@ const states = ref(); :label="t('invoiceOut.params.max')" dense lazy-rules - outlined filled type="number" v-model.number="params.max" @@ -106,7 +104,6 @@ const states = ref(); <QItem> <QItemSection> <VnSelect - outlined filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index 321f48664..1e2f80ec2 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -53,7 +53,6 @@ const props = defineProps({ option-label="code" option-value="code" dense - outlined filled @update:model-value="searchFn()" > @@ -80,7 +79,6 @@ const props = defineProps({ v-model="params.country" option-label="name" option-value="name" - outlined dense filled @update:model-value="searchFn()" @@ -106,7 +104,6 @@ const props = defineProps({ url="Clients" :label="t('globals.client')" v-model="params.clientId" - outlined dense filled @update:model-value="searchFn()" @@ -126,7 +123,6 @@ const props = defineProps({ <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue index 97fbe528a..d68b966c6 100644 --- a/src/pages/Item/ItemFixedPriceFilter.vue +++ b/src/pages/Item/ItemFixedPriceFilter.vue @@ -44,7 +44,6 @@ const props = defineProps({ :label="t('params.warehouseFk')" v-model="params.warehouseFk" dense - outlined filled use-input @update:model-value="searchFn()" diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index b37435a84..f4500d5fa 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -193,7 +193,6 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -209,7 +208,6 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined filled > <template #option="scope"> @@ -236,7 +234,6 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined filled /> </QItemSection> @@ -248,7 +245,6 @@ onMounted(async () => { @update:model-value="searchFn()" hide-selected dense - outlined filled /> </QItemSection> @@ -278,7 +274,6 @@ onMounted(async () => { :options="tagOptions" option-label="name" dense - outlined filled :emit-value="false" use-input @@ -295,7 +290,6 @@ onMounted(async () => { option-value="value" option-label="value" dense - outlined filled emit-value use-input @@ -347,7 +341,6 @@ onMounted(async () => { option-label="label" option-value="label" dense - outlined filled :emit-value="false" use-input diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue index 88f53d1f8..68f36c566 100644 --- a/src/pages/Item/ItemRequestFilter.vue +++ b/src/pages/Item/ItemRequestFilter.vue @@ -110,7 +110,6 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined filled /> </QItemSection> @@ -135,7 +134,6 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -149,7 +147,6 @@ onMounted(async () => { :params="{ departmentCodes: ['VT'] }" hide-selected dense - outlined filled /> </QItemSection> @@ -183,7 +180,6 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined filled /> </QItemSection> diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 4d93f2de5..43af9e7c4 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -113,7 +113,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -133,7 +132,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('params.agencyModeFk')" @@ -145,7 +143,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.stateFk')" @@ -157,7 +154,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('params.groupedStates')" @@ -170,7 +166,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.warehouseFk')" @@ -182,7 +177,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.countryFk')" @@ -194,7 +188,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.provinceFk')" @@ -206,7 +199,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -220,7 +212,6 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.packing')" diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index 6c2684c27..e9a556270 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -57,7 +57,6 @@ const getSelectedTagValues = async (tag) => { option-value="id" option-label="name" dense - outlined class="q-mb-md" filled :emit-value="false" @@ -79,7 +78,6 @@ const getSelectedTagValues = async (tag) => { option-value="value" option-label="value" dense - outlined filled emit-value use-input @@ -92,14 +90,13 @@ const getSelectedTagValues = async (tag) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined + is- class="col" data-cy="catalogFilterValueDialogValueInput" /> <QBtn icon="delete" size="md" - outlined dense filled flat diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index 8b8a563d8..cb380c48f 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -221,7 +221,6 @@ function addOrder(value, field, params) { option-value="id" option-label="name" dense - outlined filled emit-value use-input @@ -251,7 +250,6 @@ function addOrder(value, field, params) { v-model="orderBySelected" :options="orderByList" dense - outlined filled @update:model-value="(value) => addOrder(value, 'field', params)" /> @@ -264,7 +262,6 @@ function addOrder(value, field, params) { v-model="orderWaySelected" :options="orderWayList" dense - outlined filled @update:model-value="(value) => addOrder(value, 'way', params)" /> @@ -275,7 +272,6 @@ function addOrder(value, field, params) { <VnInput :label="t('components.itemsFilterPanel.value')" dense - outlined filled :is-clearable="false" v-model="searchByTag" diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue index 127601d04..609a1215a 100644 --- a/src/pages/Order/Card/OrderFilter.vue +++ b/src/pages/Order/Card/OrderFilter.vue @@ -49,7 +49,6 @@ const sourceList = ref([]); v-model="params.clientFk" lazy-rules dense - outlined filled /> <VnSelect @@ -58,11 +57,9 @@ const sourceList = ref([]); :options="agencyList" :input-debounce="0" dense - outlined filled /> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -75,16 +72,9 @@ const sourceList = ref([]); v-model="params.from" :label="t('fromLanded')" dense - outlined - filled - /> - <VnInputDate - v-model="params.to" - :label="t('toLanded')" - dense - outlined filled /> + <VnInputDate v-model="params.to" :label="t('toLanded')" dense filled /> <VnInput :label="t('orderId')" v-model="params.orderFk" @@ -98,7 +88,6 @@ const sourceList = ref([]); option-label="value" option-value="value" dense - outlined filled :input-debounce="0" /> diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue index 96298f515..fe631a0be 100644 --- a/src/pages/Route/Card/RouteAutonomousFilter.vue +++ b/src/pages/Route/Card/RouteAutonomousFilter.vue @@ -83,7 +83,6 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined filled emit-value map-options @@ -102,7 +101,6 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined filled emit-value map-options @@ -123,7 +121,6 @@ const exprBuilder = (param, value) => { option-value="name" option-label="name" dense - outlined filled emit-value map-options diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue index 2fa04559c..f830b83e2 100644 --- a/src/pages/Route/Card/RouteFilter.vue +++ b/src/pages/Route/Card/RouteFilter.vue @@ -36,7 +36,6 @@ const emit = defineEmits(['search']); :label="t('globals.worker')" v-model="params.workerFk" dense - outlined filled :input-debounce="0" /> @@ -52,7 +51,6 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined filled :input-debounce="0" /> @@ -107,7 +105,6 @@ const emit = defineEmits(['search']); option-label="numberPlate" option-filter-value="numberPlate" dense - outlined filled :input-debounce="0" /> @@ -127,7 +124,6 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined filled :input-debounce="0" /> diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 15e7e64e4..9acbfb740 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -66,7 +66,6 @@ const emit = defineEmits(['search']); :fields="['id', 'nickname']" v-model="params.supplierFk" dense - outlined filled emit-value map-options diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue index f91622cfd..35657a972 100644 --- a/src/pages/Shelving/Card/ShelvingFilter.vue +++ b/src/pages/Shelving/Card/ShelvingFilter.vue @@ -39,7 +39,6 @@ const emit = defineEmits(['search']); option-label="code" :filter-options="['id', 'code']" dense - outlined filled sort-by="code ASC" /> @@ -47,7 +46,7 @@ const emit = defineEmits(['search']); </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnSelectWorker v-model="params.userFk" outlined filled /> + <VnSelectWorker v-model="params.userFk" filled /> </QItemSection> </QItem> <QItem class="q-mb-md"> diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue index 509b08f4c..59cb49459 100644 --- a/src/pages/Shelving/Parking/ParkingFilter.vue +++ b/src/pages/Shelving/Parking/ParkingFilter.vue @@ -47,7 +47,6 @@ const emit = defineEmits(['search']); option-label="description" :label="t('params.sectorFk')" dense - outlined filled :options="sectors" use-input diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue index b7c5555fa..c727688ad 100644 --- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue +++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue @@ -47,7 +47,6 @@ defineProps({ :include="{ relation: 'accountingType' }" sort-by="id" dense - outlined filled > <template #option="scope"> @@ -74,7 +73,6 @@ defineProps({ option-label="name" hide-selected dense - outlined filled /> </QItemSection> diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue index 4de0c0039..e21e37eb3 100644 --- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue +++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue @@ -46,7 +46,6 @@ defineProps({ option-label="nickname" hide-selected dense - outlined filled /> </QItemSection> @@ -65,7 +64,6 @@ defineProps({ option-label="name" hide-selected dense - outlined filled > <template #option="scope"> @@ -94,7 +92,6 @@ defineProps({ option-label="name" hide-selected dense - outlined filled /> </QItemSection> diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index e5b34dcf6..73d53b247 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -133,7 +133,6 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined filled /> </QItemSection ><QItemSection v-else> @@ -151,7 +150,6 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined filled > <template #option="scope"> diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue index c59db53f2..f065eaf2e 100644 --- a/src/pages/Ticket/TicketAdvanceFilter.vue +++ b/src/pages/Ticket/TicketAdvanceFilter.vue @@ -95,7 +95,6 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined filled :use-like="false" > @@ -113,7 +112,6 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined filled :use-like="false" > @@ -147,7 +145,6 @@ onMounted(async () => await getItemPackingTypes()); url="Departments" :fields="['id', 'name']" dense - outlined filled /> </QItemSection> @@ -162,7 +159,6 @@ onMounted(async () => await getItemPackingTypes()); option-label="name" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue index ccc42f9be..b763ef970 100644 --- a/src/pages/Ticket/TicketFilter.vue +++ b/src/pages/Ticket/TicketFilter.vue @@ -90,7 +90,6 @@ const getGroupedStates = (data) => { <QItem> <QItemSection> <VnSelect - outlined dense filled :label="t('globals.params.departmentFk')" @@ -117,7 +116,6 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined filled /> </QItemSection> @@ -138,7 +136,6 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined filled sort-by="name ASC" /> @@ -225,7 +222,6 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined filled /> </QItemSection> @@ -244,7 +240,6 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined filled /> </QItemSection> @@ -265,7 +260,6 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined filled /> </QItemSection> diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue index 92b6bfd62..033b47f72 100644 --- a/src/pages/Ticket/TicketFutureFilter.vue +++ b/src/pages/Ticket/TicketFutureFilter.vue @@ -115,7 +115,6 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> @@ -132,7 +131,6 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> @@ -148,7 +146,6 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> @@ -164,7 +161,6 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> @@ -191,7 +187,6 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined filled > </VnSelect> diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue index acb8c4e72..76ffdba20 100644 --- a/src/pages/Travel/ExtraCommunityFilter.vue +++ b/src/pages/Travel/ExtraCommunityFilter.vue @@ -106,7 +106,6 @@ warehouses(); type="number" :label="t('extraCommunity.filter.totalEntries')" dense - outlined filled min="0" class="input-number" @@ -141,7 +140,6 @@ warehouses(); option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -176,7 +174,6 @@ warehouses(); option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -191,7 +188,6 @@ warehouses(); option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -206,7 +202,6 @@ warehouses(); option-label="name" hide-selected dense - outlined filled /> </QItemSection> @@ -218,7 +213,6 @@ warehouses(); v-model="params.cargoSupplierFk" hide-selected dense - outlined filled /> </QItemSection> @@ -229,7 +223,6 @@ warehouses(); v-model="params.entrySupplierFk" hide-selected dense - outlined filled /> </QItemSection> @@ -245,7 +238,6 @@ warehouses(); :filter-options="['code', 'name']" hide-selected dense - outlined filled /> </QItemSection> diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue index c36ba2ecc..a26cc0ec0 100644 --- a/src/pages/Travel/TravelFilter.vue +++ b/src/pages/Travel/TravelFilter.vue @@ -51,7 +51,6 @@ defineExpose({ states }); :use-like="false" option-filter="name" dense - outlined filled /> <VnSelect @@ -64,21 +63,18 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined filled /> <VnInputDate :label="t('travel.shipped')" v-model="params.shipped" @update:model-value="searchFn()" - outlined filled /> <VnInputTime v-model="params.shipmentHour" @update:model-value="searchFn()" :label="t('travel.shipmentHour')" - outlined filled dense /> @@ -92,7 +88,6 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined filled /> <VnInputDate @@ -100,14 +95,12 @@ defineExpose({ states }); v-model="params.landed" @update:model-value="searchFn()" dense - outlined filled /> <VnInputTime v-model="params.landingHour" @update:model-value="searchFn()" :label="t('travel.landingHour')" - outlined filled dense /> diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue index 47ca04fae..f0e2d758a 100644 --- a/src/pages/Worker/Card/WorkerCalendarFilter.vue +++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue @@ -174,7 +174,6 @@ const yearList = ref(generateYears()); v-model="selectedYear" :options="yearList" dense - outlined filled use-input :is-clearable="false" @@ -188,7 +187,6 @@ const yearList = ref(generateYears()); option-value="businessFk" option-label="businessFk" dense - outlined filled use-input :is-clearable="false" diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue index c24797901..44dfd32b4 100644 --- a/src/pages/Worker/WorkerFilter.vue +++ b/src/pages/Worker/WorkerFilter.vue @@ -67,7 +67,6 @@ const getLocale = (label) => { emit-value map-options dense - outlined filled /> </QItemSection> diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index b49e3e1b4..fc5c04b41 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -95,7 +95,6 @@ watch( :filter-options="['code']" hide-selected dense - outlined filled map-key="geoFk" data-cy="ZoneDeliveryDaysPostcodeSelect" @@ -128,7 +127,6 @@ watch( option-label="name" hide-selected dense - outlined filled data-cy="ZoneDeliveryDaysAgencySelect" /> @@ -144,7 +142,6 @@ watch( option-label="name" hide-selected dense - outlined rounded /> </div> From 7e74ab58da553e24a46586a6fe86fde41bd71f85 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Mon, 17 Mar 2025 12:03:26 +0100 Subject: [PATCH 16/44] fix: refs #8621 intermittent test --- src/pages/Route/Cmr/CmrList.vue | 2 +- .../integration/route/cmr/cmrList.spec.js | 66 +++++-------------- test/cypress/support/commands.js | 8 +++ 3 files changed, 24 insertions(+), 52 deletions(-) diff --git a/src/pages/Route/Cmr/CmrList.vue b/src/pages/Route/Cmr/CmrList.vue index d0683e481..170f73bc0 100644 --- a/src/pages/Route/Cmr/CmrList.vue +++ b/src/pages/Route/Cmr/CmrList.vue @@ -28,7 +28,6 @@ const userParams = { shipped: null, }; - const columns = computed(() => [ { align: 'left', @@ -175,6 +174,7 @@ function downloadPdfs() { :data-key url="Cmrs/filter" :columns="columns" + :order="['shipped DESC', 'cmrFk ASC']" :user-params="userParams" default-mode="table" v-model:selected="selectedRows" diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js index 8d9299ce7..b3561708d 100644 --- a/test/cypress/integration/route/cmr/cmrList.spec.js +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -19,7 +19,7 @@ describe('Cmr list', () => { }; const data = { - ticket: '2', + ticket: '1', client: 'Bruce Wayne', }; @@ -52,76 +52,40 @@ describe('Cmr list', () => { describe('Ticket pop-ups', () => { it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => { cy.get(selectors.ticket).click(); - cy.get(selectors.descriptorId) - .invoke('text') - .then((text) => { - expect(text).to.include(data.ticket); - }); + cy.containContent(selectors.descriptorId, data.ticket); cy.get(selectors.descriptorGoToSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.url().should('include', '/ticket/1/summary'); + cy.containContent(selectors.summaryTitle, data.client); }); it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => { cy.get(selectors.ticket).click(); - cy.get(selectors.descriptorId) - .invoke('text') - .then((text) => { - expect(text).to.include(data.ticket); - }); + cy.containContent(selectors.descriptorId, data.ticket); cy.get(selectors.descriptorOpenSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.containContent(selectors.summaryTitle, data.client); cy.get(selectors.summaryGoToSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.url().should('include', '/ticket/1/summary'); + cy.containContent(selectors.summaryTitle, data.client); }); }); describe('Client pop-ups', () => { it('Should redirect to the client summary from the client descriptor pop-up', () => { cy.get(selectors.client).click(); - cy.get(selectors.descriptorTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.containContent(selectors.descriptorTitle, data.client); cy.get(selectors.descriptorGoToSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.url().should('include', '/customer/1101/summary'); + cy.containContent(selectors.summaryTitle, data.client); }); it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => { cy.get(selectors.client).click(); - cy.get(selectors.descriptorTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.containContent(selectors.descriptorTitle, data.client); cy.get(selectors.descriptorOpenSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.containContent(selectors.summaryTitle, data.client); cy.get(selectors.summaryGoToSummaryBtn).click(); - cy.get(selectors.summaryTitle) - .invoke('text') - .then((text) => { - expect(text).to.include(data.client); - }); + cy.url().should('include', '/customer/1101/summary'); + cy.containContent(selectors.summaryTitle, data.client); }); }); }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 105d021ad..7d9f76349 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -322,6 +322,14 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { cy.get(selector).should('have.text', expectedValue); }); +Cypress.Commands.add('containContent', (selector, expectedValue) => { + cy.get(selector) + .invoke('text') + .then((text) => { + expect(text).to.include(expectedValue); + }); +}); + Cypress.Commands.add('openActionDescriptor', (opt) => { cy.openActionsDescriptor(); const listItem = '[role="menu"] .q-list .q-item'; From 93b5be7628a8aa334e072ed8b8d7a4d1ed17a18f Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Mon, 17 Mar 2025 14:09:14 +0100 Subject: [PATCH 17/44] test: refs #8621 ensure elements are visible before interaction in cmrList tests --- .../integration/route/cmr/cmrList.spec.js | 24 +++++++++---------- test/cypress/support/commands.js | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js index b3561708d..d33508e3a 100644 --- a/test/cypress/integration/route/cmr/cmrList.spec.js +++ b/test/cypress/integration/route/cmr/cmrList.spec.js @@ -33,8 +33,8 @@ describe('Cmr list', () => { it('Should download selected cmr', () => { const downloadsFolder = Cypress.config('downloadsFolder'); - cy.get(selectors.lastRowSelectCheckBox).click(); - cy.get(selectors.downloadBtn).click(); + cy.get(selectors.lastRowSelectCheckBox).should('be.visible').click(); + cy.get(selectors.downloadBtn).should('be.visible').click(); cy.wait(3000); const fileName = 'cmrs.zip'; @@ -51,19 +51,19 @@ describe('Cmr list', () => { describe('Ticket pop-ups', () => { it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => { - cy.get(selectors.ticket).click(); + cy.get(selectors.ticket).should('be.visible').click(); cy.containContent(selectors.descriptorId, data.ticket); - cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.descriptorGoToSummaryBtn).should('be.visible').click(); cy.url().should('include', '/ticket/1/summary'); cy.containContent(selectors.summaryTitle, data.client); }); it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => { - cy.get(selectors.ticket).click(); + cy.get(selectors.ticket).should('be.visible').click(); cy.containContent(selectors.descriptorId, data.ticket); - cy.get(selectors.descriptorOpenSummaryBtn).click(); + cy.get(selectors.descriptorOpenSummaryBtn).should('be.visible').click(); cy.containContent(selectors.summaryTitle, data.client); - cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryGoToSummaryBtn).should('be.visible').click(); cy.url().should('include', '/ticket/1/summary'); cy.containContent(selectors.summaryTitle, data.client); }); @@ -71,19 +71,19 @@ describe('Cmr list', () => { describe('Client pop-ups', () => { it('Should redirect to the client summary from the client descriptor pop-up', () => { - cy.get(selectors.client).click(); + cy.get(selectors.client).should('be.visible').click(); cy.containContent(selectors.descriptorTitle, data.client); - cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.descriptorGoToSummaryBtn).should('be.visible').click(); cy.url().should('include', '/customer/1101/summary'); cy.containContent(selectors.summaryTitle, data.client); }); it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => { - cy.get(selectors.client).click(); + cy.get(selectors.client).should('be.visible').click(); cy.containContent(selectors.descriptorTitle, data.client); - cy.get(selectors.descriptorOpenSummaryBtn).click(); + cy.get(selectors.descriptorOpenSummaryBtn).should('be.visible').click(); cy.containContent(selectors.summaryTitle, data.client); - cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryGoToSummaryBtn).should('be.visible').click(); cy.url().should('include', '/customer/1101/summary'); cy.containContent(selectors.summaryTitle, data.client); }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 90e7e08df..c8fccbd5d 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -324,6 +324,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { Cypress.Commands.add('containContent', (selector, expectedValue) => { cy.get(selector) + .should('be.visible') .invoke('text') .then((text) => { expect(text).to.include(expectedValue); From b6706218fe104434af71b145db065998e908a2a6 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 18 Mar 2025 14:46:51 +0100 Subject: [PATCH 18/44] feat: refs #8463 add data attributes for summary buttons in VnDescriptor component --- src/components/ui/VnDescriptor.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 515e09f3a..03432d745 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -127,6 +127,7 @@ const toModule = computed(() => { color="white" class="link" v-if="summary" + data-cy="openSummaryBtn" > <QTooltip> {{ t('components.smartCard.openSummary') }} @@ -141,6 +142,7 @@ const toModule = computed(() => { icon="launch" round size="md" + data-cy="goToSummaryBtn" > <QTooltip> {{ t('components.cardDescriptor.summary') }} From ab697c951d83d2da591a4193719c5a3fa123e2a2 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 21 Mar 2025 10:36:05 +0100 Subject: [PATCH 19/44] feat(WorkerPDA): refs #5926 send to docuware --- src/components/VnTable/VnTable.vue | 1 + src/composables/downloadFile.js | 20 +- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Worker/Card/WorkerPda.vue | 408 ++++++++++++------ .../integration/worker/workerPda.spec.js | 94 +++- 6 files changed, 365 insertions(+), 160 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index c64217198..e8dd1b526 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -633,6 +633,7 @@ const rowCtrlClickFunction = computed(() => { :data-key="$attrs['data-key']" :columns="columns" :redirect="redirect" + v-bind="$attrs?.['table-filter']" > <template v-for="(_, slotName) in $slots" diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js index 4588265a2..302836e09 100644 --- a/src/composables/downloadFile.js +++ b/src/composables/downloadFile.js @@ -5,20 +5,30 @@ import { exportFile } from 'quasar'; const { getTokenMultimedia } = useSession(); const token = getTokenMultimedia(); +const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) { - const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); const response = await axios.get( url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`, { responseType: 'blob' } ); + download(response); +} + +export async function downloadDocuware(url, params) { + const response = await axios.get(`${appUrl}/api/` + url, { + responseType: 'blob', + params, + }); + + download(response); +} + +function download(response) { const contentDisposition = response.headers['content-disposition']; const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition); - const filename = - matches != null && matches[1] - ? matches[1].replace(/['"]/g, '') - : 'downloaded-file'; + const filename = matches?.[1] ? matches[1].replace(/['"]/g, '') : 'downloaded-file'; exportFile(filename, response.data); } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 6be11b5ed..7374cda68 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -646,6 +646,7 @@ worker: model: Model serialNumber: Serial number removePDA: Deallocate PDA + sendToTablet: Send to tablet create: lastName: Last name birth: Birth diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 55e5abd95..f0ce53e37 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -731,6 +731,7 @@ worker: model: Modelo serialNumber: Número de serie removePDA: Desasignar PDA + sendToTablet: Enviar a la tablet create: lastName: Apellido birth: Fecha de nacimiento diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index d32941494..104f45556 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -5,24 +5,25 @@ import { ref, computed } from 'vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; +import { useVnConfirm } from 'composables/useVnConfirm'; +import { useArrayData } from 'src/composables/useArrayData'; +import { downloadDocuware } from 'src/composables/downloadFile'; + import FetchData from 'components/FetchData.vue'; import FormModelPopup from 'src/components/FormModelPopup.vue'; -import { useVnConfirm } from 'composables/useVnConfirm'; - -import VnPaginate from 'src/components/ui/VnPaginate.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; -import VnInput from 'src/components/common/VnInput.vue'; +import VnTable from 'src/components/VnTable/VnTable.vue'; const { t } = useI18n(); const { notify } = useNotify(); - -const paginate = ref(); +const loadingDocuware = ref(true); +const tableRef = ref(); const dialog = ref(); const route = useRoute(); const { openConfirmationModal } = useVnConfirm(); const routeId = computed(() => route.params.id); - +const worker = computed(() => useArrayData('Worker').store.data); const initialData = computed(() => { return { userFk: routeId.value, @@ -31,154 +32,277 @@ const initialData = computed(() => { }; }); -const deallocatePDA = async (deviceProductionFk) => { - await axios.post(`Workers/${route.params.id}/deallocatePDA`, { - pda: deviceProductionFk, - }); - notify(t('PDA deallocated'), 'positive'); - - paginate.value.fetch(); -}; +const columns = computed(() => [ + { + align: 'center', + label: t('globals.state'), + name: 'state', + format: (row) => row?.docuware?.state, + columnFilter: false, + chip: { + condition: (_, row) => !!row.docuware, + color: (row) => (isSigned(row) ? 'bg-positive' : 'bg-warning'), + }, + visible: false, + }, + { + align: 'right', + label: t('worker.pda.currentPDA'), + name: 'deviceProductionFk', + columnClass: 'shrink', + cardVisible: true, + }, + { + align: 'left', + label: t('Model'), + name: 'modelFk', + format: ({ deviceProduction }) => deviceProduction.modelFk, + cardVisible: true, + }, + { + align: 'right', + label: t('Serial number'), + name: 'serialNumber', + format: ({ deviceProduction }) => deviceProduction.serialNumber, + cardVisible: true, + }, + { + align: 'left', + label: t('Current SIM'), + name: 'simFk', + cardVisible: true, + }, + { + align: 'right', + name: 'actions', + columnFilter: false, + cardVisible: true, + }, +]); function reloadData() { initialData.value.deviceProductionFk = null; initialData.value.simFk = null; - paginate.value.fetch(); + tableRef.value.reload(); +} + +async function fetchDocuware() { + loadingDocuware.value = true; + const id = worker.value?.lastName + ' ' + worker.value?.firstName; + const promises = []; + + for (const row of tableRef.value.CrudModelRef.formData) { + promises.push( + (async () => { + const { data } = await axios.post(`Docuwares/${id}/checkFile`, { + fileCabinet: 'hr', + signed: false, + mergeFilter: [ + { + DBName: 'TIPO_DOCUMENTO', + Value: ['PDA'], + }, + { + DBName: 'FILENAME', + Value: [row.deviceProductionFk + '-pda'], + }, + ], + }); + row.docuware = data; + })(), + ); + } + + await Promise.all(promises); + loadingDocuware.value = false; +} + +async function sendToTablet(rows) { + const promises = []; + for (const row of rows) { + promises.push( + (async () => { + await axios.post(`Docuwares/upload-pda-pdf`, { + ids: [row.deviceProductionFk], + }); + row.docuware = true; + })(), + ); + } + await Promise.all(promises); + notify(t('PDF sended to signed'), 'positive'); + tableRef.value.reload(); +} + +async function deallocatePDA(deviceProductionFk) { + await axios.post(`Workers/${route.params.id}/deallocatePDA`, { + pda: deviceProductionFk, + }); + const index = tableRef.value.CrudModelRef.formData.findIndex( + (data) => data?.deviceProductionFk == deviceProductionFk, + ); + delete tableRef.value.CrudModelRef.formData[index]; + notify(t('PDA deallocated'), 'positive'); +} + +function isSigned(row) { + return row.docuware?.state === 'Firmado'; } </script> <template> - <QPage class="column items-center q-pa-md centerCard"> - <FetchData - url="workers/getAvailablePda" - @on-fetch="(data) => (deviceProductions = data)" - auto-load - /> - <VnPaginate - ref="paginate" - data-key="WorkerPda" - url="DeviceProductionUsers" - :user-filter="{ where: { userFk: routeId } }" - order="id" - search-url="pda" - auto-load - > - <template #body="{ rows }"> - <QCard - flat - bordered - :key="row.id" - v-for="row of rows" - class="card q-px-md q-mb-sm container" - > - <VnRow> - <VnInput - :label="t('worker.pda.currentPDA')" - :model-value="row?.deviceProductionFk" - disable - /> - <VnInput - :label="t('Model')" - :model-value="row?.deviceProduction?.modelFk" - disable - /> - <VnInput - :label="t('Serial number')" - :model-value="row?.deviceProduction?.serialNumber" - disable - /> - <VnInput - :label="t('Current SIM')" - :model-value="row?.simFk" - disable - /> - <QBtn - flat - icon="delete" - color="primary" - class="btn-delete" - @click=" - openConfirmationModal( - t(`Remove PDA`), - t('Do you want to remove this PDA?'), - () => deallocatePDA(row.deviceProductionFk), - ) - " - > - <QTooltip> - {{ t('worker.pda.removePDA') }} - </QTooltip> - </QBtn> - </VnRow> - </QCard> - </template> - </VnPaginate> - <QPageSticky :offset="[18, 18]"> + <FetchData + url="workers/getAvailablePda" + @on-fetch="(data) => (deviceProductions = data)" + auto-load + /> + <VnTable + ref="tableRef" + data-key="WorkerPda" + url="DeviceProductionUsers" + :user-filter="{ order: 'id' }" + :filter="{ where: { userFk: routeId } }" + search-url="pda" + auto-load + :columns="columns" + @onFetch="fetchDocuware" + :hasSubToolbar="true" + :default-remove="false" + :default-reset="false" + :default-save="false" + :table="{ + 'row-key': 'deviceProductionFk', + selection: 'multiple', + }" + :table-filter="{ hiddenTags: ['userFk'] }" + > + <template #moreBeforeActions> <QBtn - @click.stop="dialog.show()" + :label="t('globals.refresh')" + icon="refresh" + @click="tableRef.reload()" + /> + <QBtn + :disable="!tableRef?.selected?.length" + :label="t('globals.send')" + icon="install_mobile" + @click="sendToTablet(tableRef?.selected)" + class="bg-primary" + /> + </template> + <template #column-actions="{ row }"> + <QBtn + flat + icon="delete" color="primary" - fab - icon="add" - v-shortcut="'+'" + @click=" + openConfirmationModal( + t(`Remove PDA`), + t('Do you want to remove this PDA?'), + () => deallocatePDA(row.deviceProductionFk), + ) + " + data-cy="workerPda-remove" > - <QDialog ref="dialog"> - <FormModelPopup - :title="t('Add new device')" - url-create="DeviceProductionUsers" - model="DeviceProductionUser" - :form-initial-data="initialData" - @on-data-saved="reloadData()" - > - <template #form-inputs="{ data }"> - <VnRow> - <VnSelect - :label="t('worker.pda.newPDA')" - v-model="data.deviceProductionFk" - :options="deviceProductions" - option-label="id" - option-value="id" - id="deviceProductionFk" - hide-selected - data-cy="pda-dialog-select" - :required="true" - > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - <QItemSection> - <QItemLabel - >ID: {{ scope.opt?.id }}</QItemLabel - > - <QItemLabel caption> - {{ scope.opt?.modelFk }}, - {{ scope.opt?.serialNumber }} - </QItemLabel> - </QItemSection> - </QItem> - </template> - </VnSelect> - <VnInput - v-model="data.simFk" - :label="t('SIM serial number')" - id="simSerialNumber" - use-input - /> - </VnRow> - </template> - </FormModelPopup> - </QDialog> + <QTooltip> + {{ t('worker.pda.removePDA') }} + </QTooltip> </QBtn> - <QTooltip> - {{ t('globals.new') }} - </QTooltip> - </QPageSticky> - </QPage> + <QBtn + v-if="!isSigned(row)" + :loading="loadingDocuware" + icon="install_mobile" + flat + color="primary" + @click=" + openConfirmationModal( + t('Sign PDA'), + t('Are you sure you want to send it?'), + + () => sendToTablet([row]), + ) + " + data-cy="workerPda-send" + > + <QTooltip> + {{ t('worker.pda.sendToTablet') }} + </QTooltip> + </QBtn> + <QBtn + v-if="isSigned(row)" + :loading="loadingDocuware" + icon="cloud_download" + flat + color="primary" + @click=" + downloadDocuware('Docuwares/download-pda-pdf', { + file: row.deviceProductionFk + '-pda', + worker: worker?.lastName + ' ' + worker?.firstName, + }) + " + data-cy="workerPda-download" + > + <QTooltip> + {{ t('worker.pda.download') }} + </QTooltip> + </QBtn> + </template> + </VnTable> + <QPageSticky :offset="[18, 18]"> + <QBtn @click.stop="dialog.show()" color="primary" fab icon="add" v-shortcut="'+'"> + <QDialog ref="dialog"> + <FormModelPopup + :title="t('Add new device')" + url-create="DeviceProductionUsers" + model="DeviceProductionUser" + :form-initial-data="initialData" + @on-data-saved="reloadData()" + > + <template #form-inputs="{ data }"> + <VnRow> + <VnSelect + :label="t('PDA')" + v-model="data.deviceProductionFk" + :options="deviceProductions" + option-label="modelFk" + option-value="id" + id="deviceProductionFk" + hide-selected + data-cy="pda-dialog-select" + :required="true" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel + >ID: {{ scope.opt?.id }}</QItemLabel + > + <QItemLabel caption> + {{ scope.opt?.modelFk }}, + {{ scope.opt?.serialNumber }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + <VnSelect + url="Sims" + option-label="line" + option-value="code" + v-model="data.simFk" + :label="t('SIM serial number')" + id="simSerialNumber" + /> + </VnRow> + </template> + </FormModelPopup> + </QDialog> + </QBtn> + <QTooltip> + {{ t('globals.new') }} + </QTooltip> + </QPageSticky> </template> -<style lang="scss" scoped> -.btn-delete { - max-width: 4%; - margin-top: 30px; -} -</style> <i18n> es: Model: Modelo diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index 31ec19eda..d00a81ffc 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -1,23 +1,91 @@ describe('WorkerPda', () => { - const select = '[data-cy="pda-dialog-select"]'; + const deviceId = 4; beforeEach(() => { - cy.viewport(1920, 1080); cy.login('developer'); cy.visit(`/#/worker/1110/pda`); }); - it('assign pda', () => { - cy.addBtnClick(); - cy.get(select).click(); - cy.get(select).type('{downArrow}{enter}'); - cy.get('.q-notification__message').should('have.text', 'Data created'); + it('assign and delete pda', () => { + creatNewPDA(); + cy.checkNotification('Data created'); + cy.visit(`/#/worker/1110/pda`); + removeNewPDA(); + cy.checkNotification('PDA deallocated'); }); - it('delete pda', () => { - cy.get('.btn-delete').click(); - cy.get( - '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block' - ).click(); - cy.get('.q-notification__message').should('have.text', 'PDA deallocated'); + it('send to docuware', () => { + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + cy.dataCy('workerPda-send').click(); + confirmButton(); + cy.checkNotification('PDF sended to signed'); + + removeNewPDA(); }); + + it('send 2 pdfs to docuware', () => { + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + creatNewPDA(2); + cy.selectRows([1, 2]); + cy.get('#st-actions').contains('Send').click(); + + confirmButton(); + cy.checkNotification('PDF sended to signed'); + + removeNewPDA(); + }); + + it('download file', () => { + cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => { + req.reply({ + statusCode: 200, + body: { + id: deviceId, + state: 'Firmado', + }, + }); + }); + + cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + cy.get('#st-actions').contains('refresh').click(); + + creatNewPDA(); + cy.dataCy('workerPda-download').click(); + removeNewPDA(); + }); + + function creatNewPDA(id = deviceId) { + cy.addBtnClick(); + cy.selectOption('[data-cy="pda-dialog-select"]', id); + cy.saveCard(); + } + + function removeNewPDA() { + cy.dataCy('workerPda-remove').first().click(); + confirmButton(); + } + + function confirmButton() { + cy.get( + '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block', + ).click(); + } }); From 5e0c133eb3da20777e102ee6a78994ec46d85a33 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 21 Mar 2025 11:15:53 +0100 Subject: [PATCH 20/44] test: refs #5926 improve VnDmsList tests with mock and data structure adjustments --- .../common/__tests__/VnDmsList.spec.js | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js index 9649943a2..22101239e 100644 --- a/src/components/common/__tests__/VnDmsList.spec.js +++ b/src/components/common/__tests__/VnDmsList.spec.js @@ -4,12 +4,15 @@ import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest'; describe('VnDmsList', () => { let vm; - const dms = { - userFk: 1, - name: 'DMS 1' + const dms = { + userFk: 1, + name: 'DMS 1', }; - + beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); vi.spyOn(axios, 'get').mockResolvedValue({ data: [] }); vm = createWrapper(VnDmsList, { props: { @@ -18,8 +21,8 @@ describe('VnDmsList', () => { filter: 'wd.workerFk', updateModel: 'Workers', deleteModel: 'WorkerDms', - downloadModel: 'WorkerDms' - } + downloadModel: 'WorkerDms', + }, }).vm; }); @@ -29,46 +32,45 @@ describe('VnDmsList', () => { describe('setData()', () => { const data = [ - { - userFk: 1, + { + userFk: 1, name: 'Jessica', lastName: 'Jones', file: '4.jpg', - created: '2021-07-28 21:00:00' + created: '2021-07-28 21:00:00', }, - { - userFk: 2, + { + userFk: 2, name: 'Bruce', lastName: 'Banner', created: '2022-07-28 21:00:00', dms: { - userFk: 2, + userFk: 2, name: 'Bruce', lastName: 'BannerDMS', created: '2022-07-28 21:00:00', file: '4.jpg', - } + }, }, { userFk: 3, name: 'Natasha', lastName: 'Romanoff', file: '4.jpg', - created: '2021-10-28 21:00:00' - } - ] + created: '2021-10-28 21:00:00', + }, + ]; it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => { vm.setData(data); expect([vm.rows][0][0].lastName).toEqual('BannerDMS'); expect([vm.rows][0][1].lastName).toEqual('Romanoff'); - }); }); describe('parseDms()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => { const parsedDms = vm.parseDms(dms); expect(parsedDms).toEqual(resultDms); @@ -76,12 +78,12 @@ describe('VnDmsList', () => { }); describe('showFormDialog()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('should call fn parseDms() and set show true if dms is defined', () => { vm.showFormDialog(dms); expect(vm.formDialog.show).toEqual(true); expect(vm.formDialog.dms).toEqual(resultDms); }); }); -}); \ No newline at end of file +}); From 63cf602ab24340e9128cb3511b41f4618e6b2202 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 21 Mar 2025 11:46:42 +0100 Subject: [PATCH 21/44] refactor(WorkerPda): refs #5926 optimize fetchDocuware and sendToTablet functions for better readability --- src/pages/Worker/Card/WorkerPda.vue | 64 +++++++++++++---------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index 104f45556..27313e52c 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -88,48 +88,40 @@ function reloadData() { async function fetchDocuware() { loadingDocuware.value = true; - const id = worker.value?.lastName + ' ' + worker.value?.firstName; - const promises = []; - for (const row of tableRef.value.CrudModelRef.formData) { - promises.push( - (async () => { - const { data } = await axios.post(`Docuwares/${id}/checkFile`, { - fileCabinet: 'hr', - signed: false, - mergeFilter: [ - { - DBName: 'TIPO_DOCUMENTO', - Value: ['PDA'], - }, - { - DBName: 'FILENAME', - Value: [row.deviceProductionFk + '-pda'], - }, - ], - }); - row.docuware = data; - })(), - ); - } + const id = `${worker.value?.lastName} ${worker.value?.firstName}`; + const rows = tableRef.value.CrudModelRef.formData; - await Promise.all(promises); + const promises = rows.map(async (row) => { + const { data } = await axios.post(`Docuwares/${id}/checkFile`, { + fileCabinet: 'hr', + signed: false, + mergeFilter: [ + { + DBName: 'TIPO_DOCUMENTO', + Value: ['PDA'], + }, + { + DBName: 'FILENAME', + Value: [`${row.deviceProductionFk}-pda`], + }, + ], + }); + row.docuware = data; + }); + + await Promise.allSettled(promises); loadingDocuware.value = false; } async function sendToTablet(rows) { - const promises = []; - for (const row of rows) { - promises.push( - (async () => { - await axios.post(`Docuwares/upload-pda-pdf`, { - ids: [row.deviceProductionFk], - }); - row.docuware = true; - })(), - ); - } - await Promise.all(promises); + const promises = rows.map(async (row) => { + await axios.post(`Docuwares/upload-pda-pdf`, { + ids: [row.deviceProductionFk], + }); + row.docuware = true; + }); + await Promise.allSettled(promises); notify(t('PDF sended to signed'), 'positive'); tableRef.value.reload(); } From 4ed1021a67c3c714807ee3fbf233d073e727769c Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Fri, 21 Mar 2025 13:19:43 +0100 Subject: [PATCH 22/44] feat: refs #8638 add AWB field to travel and entry forms, update translations and styles --- src/components/VnTable/VnTable.vue | 2 +- src/components/common/VnDmsInput.vue | 166 ++++++++++++++++++ src/css/app.scss | 1 - src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Entry/Card/EntryBasicData.vue | 47 +++-- src/pages/Entry/Card/EntryBuys.vue | 64 ++++++- src/pages/Entry/Card/EntryDescriptor.vue | 4 +- src/pages/Entry/Card/EntrySummary.vue | 6 +- src/pages/Entry/EntryStockBought.vue | 15 +- src/pages/Entry/locale/es.yml | 11 +- .../InvoiceIn/Card/InvoiceInBasicData.vue | 122 +------------ src/pages/Travel/Card/TravelBasicData.vue | 7 +- src/pages/Travel/Card/TravelFilter.js | 1 + 14 files changed, 290 insertions(+), 158 deletions(-) create mode 100644 src/components/common/VnDmsInput.vue diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 6a547d95d..9ad032ee5 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -1154,7 +1154,7 @@ es: .grid-create { display: grid; - grid-template-columns: 1fr 1fr; + grid-template-columns: repeat(auto-fit, minmax(150px, max-content)); max-width: 100%; grid-gap: 20px; margin: 0 auto; diff --git a/src/components/common/VnDmsInput.vue b/src/components/common/VnDmsInput.vue new file mode 100644 index 000000000..25d625d5d --- /dev/null +++ b/src/components/common/VnDmsInput.vue @@ -0,0 +1,166 @@ +<script setup> +import VnConfirm from '../ui/VnConfirm.vue'; +import VnInput from './VnInput.vue'; +import VnDms from './VnDms.vue'; +import axios from 'axios'; +import { useQuasar } from 'quasar'; +import { ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { downloadFile } from 'src/composables/downloadFile'; + +const { t } = useI18n(); +const quasar = useQuasar(); +const documentDialogRef = ref({}); +const editDownloadDisabled = ref(false); +const $props = defineProps({ + defaultDmsCode: { + type: String, + default: 'InvoiceIn', + }, + disable: { + type: Boolean, + default: true, + }, + data: { + type: Object, + default: null, + }, + formRef: { + type: Object, + default: null, + }, +}); + +function deleteFile(dmsFk) { + quasar + .dialog({ + component: VnConfirm, + componentProps: { + title: t('globals.confirmDeletion'), + message: t('globals.confirmDeletionMessage'), + }, + }) + .onOk(async () => { + await axios.post(`dms/${dmsFk}/removeFile`); + $props.formRef.formData.dmsFk = null; + $props.formRef.formData.dms = undefined; + $props.formRef.hasChanges = true; + $props.formRef.save(); + }); +} +</script> +<template> + <div class="row no-wrap"> + <VnInput + :label="t('Document')" + v-model="data.dmsFk" + clearable + clear-icon="close" + class="full-width" + :disable="disable" + /> + <div + v-if="data.dmsFk" + class="row no-wrap q-pa-xs q-gutter-x-xs" + data-cy="dms-buttons" + > + <QBtn + :disable="editDownloadDisabled" + @click="downloadFile(data.dmsFk)" + icon="cloud_download" + color="primary" + flat + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + padding="xs" + round + > + <QTooltip>{{ t('Download file') }}</QTooltip> + </QBtn> + <QBtn + :disable="editDownloadDisabled" + @click=" + () => { + documentDialogRef.show = true; + documentDialogRef.dms = data.dms; + } + " + icon="edit" + color="primary" + flat + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + padding="xs" + round + > + <QTooltip>{{ t('Edit document') }}</QTooltip> + </QBtn> + <QBtn + :disable="editDownloadDisabled" + @click="deleteFile(data.dmsFk)" + icon="delete" + color="primary" + flat + round + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + padding="xs" + > + <QTooltip>{{ t('Delete file') }}</QTooltip> + </QBtn> + </div> + <QBtn + v-else + icon="add_circle" + color="primary" + flat + round + v-shortcut="'+'" + padding="xs" + @click=" + () => { + documentDialogRef.show = true; + delete documentDialogRef.dms; + } + " + data-cy="dms-create" + > + <QTooltip>{{ t('Create document') }}</QTooltip> + </QBtn> + </div> + <QDialog v-model="documentDialogRef.show"> + <VnDms + model="dms" + :default-dms-code="defaultDmsCode" + :form-initial-data="documentDialogRef.dms" + :url=" + documentDialogRef.dms + ? `Dms/${documentDialogRef.dms.id}/updateFile` + : 'Dms/uploadFile' + " + :description="documentDialogRef.supplierName" + @on-data-saved=" + (_, { data }) => { + let dmsData = data; + if (Array.isArray(data)) dmsData = data[0]; + formRef.formData.dmsFk = dmsData.id; + formRef.formData.dms = dmsData; + formRef.hasChanges = true; + formRef.save(); + } + " + /> + </QDialog> +</template> +<i18n> +es: + Document: Documento + Download file: Descargar archivo + Edit document: Editar documento + Delete file: Eliminar archivo + Create document: Crear documento + +</i18n> diff --git a/src/css/app.scss b/src/css/app.scss index 5befd150b..b299973d1 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -325,7 +325,6 @@ input::-webkit-inner-spin-button { min-height: auto !important; display: flex; align-items: flex-end; - padding-bottom: 2px; .q-field__native.row { min-height: auto !important; } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index c1286267c..594722b96 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -816,6 +816,7 @@ travel: search: Search travel searchInfo: You can search by travel id or name id: Id + awbFk: AWB travelList: tableVisibleColumns: ref: Reference diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 681781d11..a0eb3835d 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -899,6 +899,7 @@ travel: search: Buscar envío searchInfo: Buscar envío por id o nombre id: Id + awbFk: Guía aérea travelList: tableVisibleColumns: ref: Referencia diff --git a/src/pages/Entry/Card/EntryBasicData.vue b/src/pages/Entry/Card/EntryBasicData.vue index 34e4a0f9c..f6d15a977 100644 --- a/src/pages/Entry/Card/EntryBasicData.vue +++ b/src/pages/Entry/Card/EntryBasicData.vue @@ -14,6 +14,8 @@ import VnInputNumber from 'src/components/common/VnInputNumber.vue'; import VnSelectTravelExtended from 'src/components/common/VnSelectTravelExtended.vue'; import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; import VnCheckbox from 'src/components/common/VnCheckbox.vue'; +import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; +import VnDmsInput from 'src/components/common/VnDmsInput.vue'; const route = useRoute(); const { t } = useI18n(); @@ -24,6 +26,7 @@ const user = state.getUser().fn(); const companiesOptions = ref([]); const currenciesOptions = ref([]); +const entryRef = ref({}); onMounted(() => { checkEntryLock(route.params.id, user.id); @@ -48,10 +51,11 @@ onMounted(() => { auto-load /> <FormModel - :url-update="`Entries/${route.params.id}`" + ref="entryRef" model="Entry" - auto-load + :url-update="`Entries/${route.params.id}`" :clear-store-on-unmount="false" + auto-load > <template #form="{ data }"> <VnRow class="q-py-sm"> @@ -67,11 +71,18 @@ onMounted(() => { /> </VnRow> <VnRow class="q-py-sm"> - <VnInput v-model="data.reference" :label="t('globals.reference')" /> - <VnInputNumber - v-model="data.invoiceAmount" - :label="t('entry.summary.invoiceAmount')" - :positive="false" + <VnInput + v-model="data.reference" + :label="t('entry.list.tableVisibleColumns.reference')" + /> + <VnSelect + v-model="data.typeFk" + url="entryTypes" + :fields="['code', 'description']" + option-value="code" + optionLabel="description" + sortBy="description" + :label="t('entry.list.tableVisibleColumns.entryTypeDescription')" /> </VnRow> <VnRow class="q-py-sm"> @@ -113,7 +124,6 @@ onMounted(() => { name="initialTemperature" :label="t('entry.basicData.initialTemperature')" :step="0.5" - :decimal-places="2" :positive="false" /> <VnInputNumber @@ -121,20 +131,21 @@ onMounted(() => { name="finalTemperature" :label="t('entry.basicData.finalTemperature')" :step="0.5" - :decimal-places="2" :positive="false" /> - <VnSelect - v-model="data.typeFk" - url="entryTypes" - :fields="['code', 'description']" - option-value="code" - optionLabel="description" - sortBy="description" - /> </VnRow> <VnRow class="q-py-sm"> - <QInput + <VnInputNumber + v-model="data.invoiceAmount" + :label="t('entry.list.tableVisibleColumns.invoiceAmount')" + :positive="false" + @update:model-value="data.buyerFk = user.id" + /> + <VnSelectWorker v-model="data.buyerFk" hide-selected /> + <VnDmsInput :data="data" :formRef="entryRef" :disable="false" /> + </VnRow> + <VnRow class="q-py-sm"> + <VnInputNumber :label="t('entry.basicData.observation')" type="textarea" v-model="data.observation" diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index 3990fde19..85da5cf1d 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -18,6 +18,7 @@ import VnSelectEnum from 'src/components/common/VnSelectEnum.vue'; import { checkEntryLock } from 'src/composables/checkEntryLock'; import VnRow from 'src/components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; +import VnInputNumber from 'src/components/common/VnInputNumber.vue'; const $props = defineProps({ id: { @@ -44,6 +45,8 @@ const entityId = ref($props.id ?? route.params.id); const entryBuysRef = ref(); const footerFetchDataRef = ref(); const footer = ref({}); +const dialogRef = ref(false); +const newEntryRef = ref(null); const columns = [ { align: 'center', @@ -250,6 +253,7 @@ const columns = [ component: 'number', attrs: { positive: false, + decimalPlaces: 3, }, cellEvent: { 'update:modelValue': async (value, oldValue, row) => { @@ -497,6 +501,23 @@ async function setBuyUltimate(itemFk, data) { }); } +async function transferBuys(rows, newEntry) { + if (!newEntry) return; + + const promises = rows.map((row) => { + return axios.patch('Buys', { id: row.id, entryFk: newEntry }); + }); + + await Promise.all(promises); + + await axios.post(`Entries/${newEntry}/recalcEntryPrices`); + await axios.post(`Entries/${entityId.value}/recalcEntryPrices`); + + entryBuysRef.value.reload(); + newEntryRef.value = null; + dialogRef.value = false; +} + onMounted(() => { stateStore.rightDrawer = false; if ($props.editableMode) checkEntryLock(entityId.value, user.id); @@ -571,6 +592,45 @@ onMounted(() => { </QItem> </QList> </QBtnDropdown> + <QBtn + icon="move_group" + color="primary" + :title="t('Transfer buys')" + flat + @click="dialogRef = true" + :disable="!selectedRows.length" + /> + <QDialog v-model="dialogRef"> + <QCard> + <QCardSection> + <span>{{ t('Transfer buys') }}</span> + </QCardSection> + <QCardSection> + <VnInputNumber + v-model="newEntryRef" + :label="t('Entry')" + type="number" + data-cy="transfer-buy-entry" + /> + </QCardSection> + <QCardSection> + <QCardActions> + <QBtn + label="Cancel" + flat + color="primary" + @click="dialogRef = false" + /> + <QBtn + label="Transfer" + flat + color="primary" + @click="transferBuys(selectedRows, newEntryRef)" + /> + </QCardActions> + </QCardSection> + </QCard> + </QDialog> </QBtnGroup> </Teleport> <FetchData @@ -620,7 +680,7 @@ onMounted(() => { }, columnGridStyle: { 'max-width': '50%', - 'margin-right': '30px', + 'margin-right': '5%', flex: 1, }, previousStyle: { @@ -816,6 +876,8 @@ es: Create buy: Crear compra Invert quantity value: Invertir valor de cantidad Check buy amount: Marcar como correcta la cantidad de compra + Transfer buys: Transferir compras + Entry: Entrada </i18n> <style lang="scss" scoped> .centered-container { diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 313ed3d72..784f6e8a3 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -92,7 +92,7 @@ const getEntryRedirectionFilter = (entry) => { }; function showEntryReport() { - openReport(`Entries/${entityId.value}/entry-order-pdf`); + openReport(`Entries/${entityId.value}/entry-order-pdf`, {}, true); } function showNotification(type, message) { @@ -147,7 +147,7 @@ async function deleteEntry() { <template> <CardDescriptor :url="`Entries/${entityId}`" - :filter="entryFilter" + :user-filter="entryFilter" title="supplier.nickname" data-key="Entry" width="lg-width" diff --git a/src/pages/Entry/Card/EntrySummary.vue b/src/pages/Entry/Card/EntrySummary.vue index 53967e66f..37a28968c 100644 --- a/src/pages/Entry/Card/EntrySummary.vue +++ b/src/pages/Entry/Card/EntrySummary.vue @@ -84,7 +84,10 @@ onMounted(async () => { :label="t('globals.company')" :value="entry?.company?.code" /> - <VnLv :label="t('globals.reference')" :value="entry?.reference" /> + <VnLv + :label="t('entry.list.tableVisibleColumns.reference')" + :value="entry?.reference" + /> <VnLv :label="t('entry.summary.invoiceNumber')" :value="entry?.invoiceNumber" @@ -159,6 +162,7 @@ onMounted(async () => { /> </div> <div class="card-content"> + <VnLv :label="t('travel.awbFk')" :value="entry.travel.awbFk" /> <VnCheckbox :label="t('entry.summary.travelDelivered')" v-model="entry.travel.isDelivered" diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 5da51d5a6..6168f0737 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -162,8 +162,8 @@ async function beforeSave(data, getChanges) { } await Promise.all(patchPromises); - const filteredChanges = changes.filter((change) => change?.isReal !== false); - data.creates = filteredChanges; + data.creates = []; + return data; } </script> <template> @@ -203,7 +203,7 @@ async function beforeSave(data, getChanges) { </VnRow> </template> </VnSubToolbar> - <QDialog v-model="travelDialogRef" :maximized="true" :class="['vn-row', 'wrap']"> + <QDialog v-model="travelDialogRef" :class="['vn-row', 'wrap']"> <FormModelPopup :url-update="`Travels/${travel?.id}`" model="travel" @@ -252,12 +252,15 @@ async function beforeSave(data, getChanges) { </span> </template> <template #column-footer-reserve> - <span> + <span class="q-pr-xs"> {{ round(footer.reserve) }} </span> </template> <template #column-footer-bought> - <span :style="boughtStyle(footer?.bought, footer?.reserve)"> + <span + :style="boughtStyle(footer?.bought, footer?.reserve)" + class="q-pr-xs" + > {{ round(footer.bought) }} </span> </template> @@ -275,7 +278,7 @@ async function beforeSave(data, getChanges) { } .column { min-width: 35%; - margin-top: 5%; + margin-top: 1%; } .text-negative { color: $negative !important; diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 10d863ea2..2c80299bc 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -25,7 +25,7 @@ entry: entryTypeDescription: Tipo entrada invoiceAmount: Importe dated: Fecha - inventoryEntry: Es inventario + inventoryEntry: Es inventario summary: commission: Comisión currency: Moneda @@ -33,7 +33,8 @@ entry: invoiceAmount: Importe ordered: Pedida booked: Contabilizada - excludedFromAvailable: Excluido + excludedFromAvailable: Excluir del disponible + isConfirmed: Lista para etiquetar travelReference: Referencia travelAgency: Agencia travelShipped: F. envio @@ -56,7 +57,7 @@ entry: observation: Observación commission: Comisión booked: Contabilizada - excludedFromAvailable: Excluido + excludedFromAvailable: Excluir del disponible initialTemperature: Ini °C finalTemperature: Fin °C buys: @@ -119,9 +120,9 @@ entry: supplierName: Proveedor entryFilter: params: - isExcludedFromAvailable: Excluido + isExcludedFromAvailable: Excluir del disponible isOrdered: Pedida - isConfirmed: Confirmado + isConfirmed: Lista para etiquetar isReceived: Recibida isRaid: Raid landed: Fecha diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue index 905ddebb2..0995b75b9 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue @@ -2,24 +2,18 @@ import { ref, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import { useQuasar } from 'quasar'; -import { downloadFile } from 'src/composables/downloadFile'; import FormModel from 'components/FormModel.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import FetchData from 'src/components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; import VnInput from 'src/components/common/VnInput.vue'; -import VnDms from 'src/components/common/VnDms.vue'; -import VnConfirm from 'src/components/ui/VnConfirm.vue'; -import axios from 'axios'; import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; +import VnDmsInput from 'src/components/common/VnDmsInput.vue'; const { t } = useI18n(); const route = useRoute(); -const quasar = useQuasar(); -const editDownloadDisabled = ref(false); const userConfig = ref(null); const invoiceId = computed(() => +route.params.id); @@ -37,24 +31,6 @@ const allowedContentTypes = ref([]); const sageWithholdings = ref([]); const documentDialogRef = ref({}); const invoiceInRef = ref({}); - -function deleteFile(dmsFk) { - quasar - .dialog({ - component: VnConfirm, - componentProps: { - title: t('globals.confirmDeletion'), - message: t('globals.confirmDeletionMessage'), - }, - }) - .onOk(async () => { - await axios.post(`dms/${dmsFk}/removeFile`); - invoiceInRef.value.formData.dmsFk = null; - invoiceInRef.value.formData.dms = undefined; - invoiceInRef.value.hasChanges = true; - invoiceInRef.value.save(); - }); -} </script> <template> <FetchData @@ -157,78 +133,7 @@ function deleteFile(dmsFk) { </QItem> </template> </VnSelect> - - <div class="row no-wrap"> - <VnInput - :label="t('Document')" - v-model="data.dmsFk" - clearable - clear-icon="close" - class="full-width" - :disable="true" - /> - <div - v-if="data.dmsFk" - class="row no-wrap q-pa-xs q-gutter-x-xs" - data-cy="dms-buttons" - > - <QBtn - :class="{ - 'no-pointer-events': editDownloadDisabled, - }" - :disable="editDownloadDisabled" - icon="cloud_download" - :title="t('Download file')" - padding="xs" - round - @click="downloadFile(data.dmsFk)" - /> - <QBtn - :class="{ - 'no-pointer-events': editDownloadDisabled, - }" - :disable="editDownloadDisabled" - icon="edit" - round - padding="xs" - @click=" - () => { - documentDialogRef.show = true; - documentDialogRef.dms = data.dms; - } - " - > - <QTooltip>{{ t('Edit document') }}</QTooltip> - </QBtn> - <QBtn - :class="{ - 'no-pointer-events': editDownloadDisabled, - }" - :disable="editDownloadDisabled" - icon="delete" - :title="t('Delete file')" - padding="xs" - round - @click="deleteFile(data.dmsFk)" - /> - </div> - <QBtn - v-else - icon="add_circle" - round - v-shortcut="'+'" - padding="xs" - @click=" - () => { - documentDialogRef.show = true; - delete documentDialogRef.dms; - } - " - data-cy="dms-create" - > - <QTooltip>{{ t('Create document') }}</QTooltip> - </QBtn> - </div> + <VnDmsInput :data="data" :formRef="invoiceInRef" /> </VnRow> <VnRow> <VnSelect @@ -264,29 +169,6 @@ function deleteFile(dmsFk) { </VnRow> </template> </FormModel> - <QDialog v-model="documentDialogRef.show"> - <VnDms - model="dms" - default-dms-code="invoiceIn" - :form-initial-data="documentDialogRef.dms" - :url=" - documentDialogRef.dms - ? `Dms/${documentDialogRef.dms.id}/updateFile` - : 'Dms/uploadFile' - " - :description="documentDialogRef.supplierName" - @on-data-saved=" - (_, { data }) => { - let dmsData = data; - if (Array.isArray(data)) dmsData = data[0]; - invoiceInRef.formData.dmsFk = dmsData.id; - invoiceInRef.formData.dms = dmsData; - invoiceInRef.hasChanges = true; - invoiceInRef.save(); - } - " - /> - </QDialog> </template> <style lang="scss" scoped> @media (max-width: $breakpoint-xs) { diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index b1adc8126..a6ef8ad19 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -36,7 +36,7 @@ const warehousesOptionsIn = ref([]); auto-load :filter="{ where: { isDestiny: TRUE } }" /> - <FormModel :url-update="`Travels/${route.params.id}`" model="Travel" auto-load> + <FormModel :url-update="`Travels/${route.params.id}`" model="Travel"> <template #form="{ data }"> <VnRow> <VnInput v-model="data.ref" :label="t('globals.reference')" /> @@ -57,8 +57,8 @@ const warehousesOptionsIn = ref([]); <VnRow> <VnInputDate v-model="data.availabled" - :label="t('travel.summary.availabled')" - /> + :label="t('travel.summary.availabled')" + /> <VnInputTime v-model="data.availabled" :label="t('travel.summary.availabledHour')" @@ -96,6 +96,7 @@ const warehousesOptionsIn = ref([]); </QIcon> </template> </VnInput> + <VnInput v-model="data.awbFk" :label="t('travel.awbFk')" /> </VnRow> <VnRow> <QCheckbox v-model="data.isRaid" :label="t('travel.basicData.isRaid')" /> diff --git a/src/pages/Travel/Card/TravelFilter.js b/src/pages/Travel/Card/TravelFilter.js index 05436834f..0799e449c 100644 --- a/src/pages/Travel/Card/TravelFilter.js +++ b/src/pages/Travel/Card/TravelFilter.js @@ -12,6 +12,7 @@ export default { 'isRaid', 'daysInForward', 'availabled', + 'awbFk', ], include: [ { From a39f648da045428d1eec2b371d9fc54c9b511fcb Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Fri, 21 Mar 2025 13:25:17 +0100 Subject: [PATCH 23/44] fix: refs #8638 update comment formatting in VnTable.vue --- src/components/VnTable/VnTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 9ad032ee5..8f64dc857 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -895,7 +895,7 @@ const rowCtrlClickFunction = computed(() => { {{ row[splittedColumns.title.name] }} </span> </QCardSection> - <!-- Fields --> + <!-- Fields --> <QCardSection class="q-pl-sm q-py-xs" :class="$props.cardClass" From eb6046f3382b9500563fd3676669931247babb25 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Fri, 21 Mar 2025 13:28:22 +0100 Subject: [PATCH 24/44] fix: refs #8638 restore invoiceInBasicData --- .../InvoiceIn/Card/InvoiceInBasicData.vue | 122 +++++++++++++++++- 1 file changed, 120 insertions(+), 2 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue index 0995b75b9..905ddebb2 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue @@ -2,18 +2,24 @@ import { ref, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; +import { useQuasar } from 'quasar'; +import { downloadFile } from 'src/composables/downloadFile'; import FormModel from 'components/FormModel.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import FetchData from 'src/components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; import VnInput from 'src/components/common/VnInput.vue'; +import VnDms from 'src/components/common/VnDms.vue'; +import VnConfirm from 'src/components/ui/VnConfirm.vue'; +import axios from 'axios'; import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; -import VnDmsInput from 'src/components/common/VnDmsInput.vue'; const { t } = useI18n(); const route = useRoute(); +const quasar = useQuasar(); +const editDownloadDisabled = ref(false); const userConfig = ref(null); const invoiceId = computed(() => +route.params.id); @@ -31,6 +37,24 @@ const allowedContentTypes = ref([]); const sageWithholdings = ref([]); const documentDialogRef = ref({}); const invoiceInRef = ref({}); + +function deleteFile(dmsFk) { + quasar + .dialog({ + component: VnConfirm, + componentProps: { + title: t('globals.confirmDeletion'), + message: t('globals.confirmDeletionMessage'), + }, + }) + .onOk(async () => { + await axios.post(`dms/${dmsFk}/removeFile`); + invoiceInRef.value.formData.dmsFk = null; + invoiceInRef.value.formData.dms = undefined; + invoiceInRef.value.hasChanges = true; + invoiceInRef.value.save(); + }); +} </script> <template> <FetchData @@ -133,7 +157,78 @@ const invoiceInRef = ref({}); </QItem> </template> </VnSelect> - <VnDmsInput :data="data" :formRef="invoiceInRef" /> + + <div class="row no-wrap"> + <VnInput + :label="t('Document')" + v-model="data.dmsFk" + clearable + clear-icon="close" + class="full-width" + :disable="true" + /> + <div + v-if="data.dmsFk" + class="row no-wrap q-pa-xs q-gutter-x-xs" + data-cy="dms-buttons" + > + <QBtn + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + :disable="editDownloadDisabled" + icon="cloud_download" + :title="t('Download file')" + padding="xs" + round + @click="downloadFile(data.dmsFk)" + /> + <QBtn + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + :disable="editDownloadDisabled" + icon="edit" + round + padding="xs" + @click=" + () => { + documentDialogRef.show = true; + documentDialogRef.dms = data.dms; + } + " + > + <QTooltip>{{ t('Edit document') }}</QTooltip> + </QBtn> + <QBtn + :class="{ + 'no-pointer-events': editDownloadDisabled, + }" + :disable="editDownloadDisabled" + icon="delete" + :title="t('Delete file')" + padding="xs" + round + @click="deleteFile(data.dmsFk)" + /> + </div> + <QBtn + v-else + icon="add_circle" + round + v-shortcut="'+'" + padding="xs" + @click=" + () => { + documentDialogRef.show = true; + delete documentDialogRef.dms; + } + " + data-cy="dms-create" + > + <QTooltip>{{ t('Create document') }}</QTooltip> + </QBtn> + </div> </VnRow> <VnRow> <VnSelect @@ -169,6 +264,29 @@ const invoiceInRef = ref({}); </VnRow> </template> </FormModel> + <QDialog v-model="documentDialogRef.show"> + <VnDms + model="dms" + default-dms-code="invoiceIn" + :form-initial-data="documentDialogRef.dms" + :url=" + documentDialogRef.dms + ? `Dms/${documentDialogRef.dms.id}/updateFile` + : 'Dms/uploadFile' + " + :description="documentDialogRef.supplierName" + @on-data-saved=" + (_, { data }) => { + let dmsData = data; + if (Array.isArray(data)) dmsData = data[0]; + invoiceInRef.formData.dmsFk = dmsData.id; + invoiceInRef.formData.dms = dmsData; + invoiceInRef.hasChanges = true; + invoiceInRef.save(); + } + " + /> + </QDialog> </template> <style lang="scss" scoped> @media (max-width: $breakpoint-xs) { From ee4e181777f6e2abaf450cd5ff9e5ee692baf7e4 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 21 Mar 2025 13:46:38 +0100 Subject: [PATCH 25/44] fix: refs #8131 remove unnecessary 'is-' prefix from v-model bindings in filter components --- src/components/ItemsFilterPanel.vue | 1 - src/pages/Order/Card/CatalogFilterValueDialog.vue | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index 3c689750a..0f1e3f1eb 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -262,7 +262,6 @@ const setCategoryList = (data) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is- :is-clearable="false" @keyup.enter="applyTags(params, searchFn)" /> diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index e9a556270..10273a254 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -90,7 +90,6 @@ const getSelectedTagValues = async (tag) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is- class="col" data-cy="catalogFilterValueDialogValueInput" /> From c5e1ebec82478f5298fa707f17bcaecdfeda46e2 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Fri, 21 Mar 2025 13:51:05 +0100 Subject: [PATCH 26/44] fix: refs #8638 update null check for maxlength validation in VnInput.vue --- src/components/common/VnInput.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue index 9821992cb..474d68116 100644 --- a/src/components/common/VnInput.vue +++ b/src/components/common/VnInput.vue @@ -84,7 +84,7 @@ const mixinRules = [ ...($attrs.rules ?? []), (val) => { const maxlength = $props.maxlength; - if (maxlength && +val.length > maxlength) + if (maxlength && +val?.length > maxlength) return t(`maxLength`, { value: maxlength }); const { min, max } = vnInputRef.value.$attrs; if (!min) return null; From 7e0ca4ce6d539889e10d6c8da9dccca36b659379 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 21 Mar 2025 13:54:56 +0100 Subject: [PATCH 27/44] test: refs #5926 simplify test --- src/composables/__tests__/downloadFile.spec.js | 11 ++++++----- src/pages/Worker/Card/WorkerPda.vue | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js index f53b56b3e..f83a973b0 100644 --- a/src/composables/__tests__/downloadFile.spec.js +++ b/src/composables/__tests__/downloadFile.spec.js @@ -6,10 +6,12 @@ const session = useSession(); const token = session.getToken(); describe('downloadFile', () => { - const baseUrl = 'http://localhost:9000'; let defaulCreateObjectURL; beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); defaulCreateObjectURL = window.URL.createObjectURL; window.URL.createObjectURL = vi.fn(() => 'blob:http://localhost:9000/blob-id'); }); @@ -22,15 +24,14 @@ describe('downloadFile', () => { headers: { 'content-disposition': 'attachment; filename="test-file.txt"' }, }; vi.spyOn(axios, 'get').mockImplementation((url) => { - if (url == 'Urls/getUrl') return Promise.resolve({ data: baseUrl }); - else if (url.includes('downloadFile')) return Promise.resolve(res); + if (url.includes('downloadFile')) return Promise.resolve(res); }); await downloadFile(1); expect(axios.get).toHaveBeenCalledWith( - `${baseUrl}/api/dms/1/downloadFile?access_token=${token}`, - { responseType: 'blob' } + `/api/dms/1/downloadFile?access_token=${token}`, + { responseType: 'blob' }, ); }); }); diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index 27313e52c..001eb368a 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -210,7 +210,6 @@ function isSigned(row) { openConfirmationModal( t('Sign PDA'), t('Are you sure you want to send it?'), - () => sendToTablet([row]), ) " @@ -306,4 +305,6 @@ es: Do you want to remove this PDA?: ¿Desea eliminar este PDA? You can only have one PDA: Solo puedes tener un PDA si no eres autonomo This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario + Are you sure you want to send it?: ¿Seguro que quieres enviarlo? + Sign PDA: Firmar PDA </i18n> From 39e0f8838090fb1ca3fc3b3a0b1e43b30c222550 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 21 Mar 2025 14:17:22 +0100 Subject: [PATCH 28/44] refactor: refs #8463 remove unnecessary expose of getData in VnDescriptor component --- src/components/ui/VnDescriptor.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index c4cae7f61..1cb3b57ad 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -39,7 +39,6 @@ const { viewSummary } = useSummaryDialog(); const DESCRIPTOR_PROXY = 'DescriptorProxy'; const moduleName = ref(); const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; -defineExpose({ getData }); function getName() { let name = $props.dataKey; From 057a2520c0d776c10f3f9903d3bb5511b7494dff Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 07:21:17 +0100 Subject: [PATCH 29/44] test(WorkerPda): refs #5926 unify send and download e2e --- .../integration/worker/workerPda.spec.js | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index d00a81ffc..8c539cf70 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -13,7 +13,8 @@ describe('WorkerPda', () => { cy.checkNotification('PDA deallocated'); }); - it('send to docuware', () => { + it('send and download pdf to docuware', () => { + //Send cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { req.reply({ statusCode: 200, @@ -22,10 +23,30 @@ describe('WorkerPda', () => { }); creatNewPDA(); + cy.dataCy('workerPda-send').click(); confirmButton(); cy.checkNotification('PDF sended to signed'); + //Download + cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => { + req.reply({ + statusCode: 200, + body: { + id: deviceId, + state: 'Firmado', + }, + }); + }); + cy.get('#st-actions').contains('refresh').click(); + cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + cy.dataCy('workerPda-download').click(); removeNewPDA(); }); @@ -48,30 +69,6 @@ describe('WorkerPda', () => { removeNewPDA(); }); - it('download file', () => { - cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => { - req.reply({ - statusCode: 200, - body: { - id: deviceId, - state: 'Firmado', - }, - }); - }); - - cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => { - req.reply({ - statusCode: 200, - body: {}, - }); - }); - cy.get('#st-actions').contains('refresh').click(); - - creatNewPDA(); - cy.dataCy('workerPda-download').click(); - removeNewPDA(); - }); - function creatNewPDA(id = deviceId) { cy.addBtnClick(); cy.selectOption('[data-cy="pda-dialog-select"]', id); From 71c91c295cf43554fc980dc8f4c131adda9a9e97 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 07:22:30 +0100 Subject: [PATCH 30/44] test(WorkerPda): refs #5926 replace confirmButton function with cy.clickConfirm for consistency --- test/cypress/integration/worker/workerPda.spec.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index 8c539cf70..5d4496f18 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -25,7 +25,7 @@ describe('WorkerPda', () => { creatNewPDA(); cy.dataCy('workerPda-send').click(); - confirmButton(); + cy.clickConfirm(); cy.checkNotification('PDF sended to signed'); //Download @@ -63,7 +63,7 @@ describe('WorkerPda', () => { cy.selectRows([1, 2]); cy.get('#st-actions').contains('Send').click(); - confirmButton(); + cy.clickConfirm(); cy.checkNotification('PDF sended to signed'); removeNewPDA(); @@ -77,12 +77,6 @@ describe('WorkerPda', () => { function removeNewPDA() { cy.dataCy('workerPda-remove').first().click(); - confirmButton(); - } - - function confirmButton() { - cy.get( - '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block', - ).click(); + cy.clickConfirm(); } }); From 8bdd581764af3a1e1f1240ab045fa65c60188053 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 07:30:05 +0100 Subject: [PATCH 31/44] feat: refs #8463 add module prop to VnDescriptor component for enhanced functionality --- src/components/ui/VnDescriptor.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 1cb3b57ad..7a2347aa5 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -25,6 +25,10 @@ const $props = defineProps({ type: String, default: 'md-width', }, + module: { + type: String, + default: null, + }, toModule: { type: String, default: null, @@ -41,8 +45,8 @@ const moduleName = ref(); const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; function getName() { - let name = $props.dataKey; - if ($props.dataKey.includes(DESCRIPTOR_PROXY)) { + let name = $props.module; + if ($props.module.includes(DESCRIPTOR_PROXY)) { name = name.split(DESCRIPTOR_PROXY)[0]; } return name; From aa3f14e875301ac855d893c6cfd944c7b595e7eb Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 09:17:43 +0100 Subject: [PATCH 32/44] test(WorkerPda): refs #5926 remove redundant cy.clickConfirm call for streamlined flow --- test/cypress/integration/worker/workerPda.spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index 5d4496f18..2623e81cf 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -62,8 +62,6 @@ describe('WorkerPda', () => { creatNewPDA(2); cy.selectRows([1, 2]); cy.get('#st-actions').contains('Send').click(); - - cy.clickConfirm(); cy.checkNotification('PDF sended to signed'); removeNewPDA(); From 944a70be478a67ea953d1b9e4ccccdd43c205d4a Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 09:27:55 +0100 Subject: [PATCH 33/44] feat: refs #8463 update data-cy attributes in VnDescriptor for improved testing and consistency --- src/components/ui/VnDescriptor.vue | 28 ++++++++++++++++++++-------- test/cypress/support/commands.js | 10 +++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 7a2347aa5..47da98d74 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -106,7 +106,7 @@ const toModule = computed(() => { </script> <template> - <div class="descriptor"> + <div class="descriptor" data-cy="vnDescriptor"> <template v-if="entity && entity?.id"> <div class="header bg-primary q-pa-sm justify-between"> <slot name="header-extra-action"> @@ -153,7 +153,7 @@ const toModule = computed(() => { data-cy="goToSummaryBtn" > <QTooltip> - {{ t('components.cardDescriptor.summary') }} + {{ t('components.vnDescriptor.summary') }} </QTooltip> </QBtn> </RouterLink> @@ -168,18 +168,27 @@ const toModule = computed(() => { <QList dense> <QItemLabel header class="ellipsis text-h5" :lines="1"> <div class="title"> - <span v-if="title" :title="getValueFromPath(title)"> + <span + v-if="title" + :title="getValueFromPath(title)" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" + > {{ getValueFromPath(title) ?? title }} </span> <slot v-else name="description" :entity="entity"> - <span :title="entity.name"> - {{ entity.name }} - </span> + <span + :title="entity.name" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_description`" + v-text="entity.name" + /> </slot> </div> </QItemLabel> <QItem> - <QItemLabel class="subtitle"> + <QItemLabel + class="subtitle" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" + > #{{ getValueFromPath(subtitle) ?? entity.id }} </QItemLabel> <QBtn @@ -197,7 +206,10 @@ const toModule = computed(() => { </QBtn> </QItem> </QList> - <div class="list-box q-mt-xs"> + <div + class="list-box q-mt-xs" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_listbox`" + > <slot name="body" :entity="entity" /> </div> </div> diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index de25959b2..fe8d38e79 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -371,7 +371,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { }); Cypress.Commands.add('openActionsDescriptor', () => { - cy.get('[data-cy="cardDescriptor"] [data-cy="descriptor-more-opts"]').click(); + cy.get('[data-cy="vnDescriptor"] [data-cy="descriptor-more-opts"]').click(); }); Cypress.Commands.add('openUserPanel', () => { @@ -466,16 +466,16 @@ Cypress.Commands.add('validateDescriptor', (toCheck = {}) => { const popupSelector = popup ? '[role="menu"] ' : ''; - if (title) cy.get(`${popupSelector}[data-cy="cardDescriptor_title"]`).contains(title); + if (title) cy.get(`${popupSelector}[data-cy="vnDescriptor_title"]`).contains(title); if (description) - cy.get(`${popupSelector}[data-cy="cardDescriptor_description"]`).contains( + cy.get(`${popupSelector}[data-cy="vnDescriptor_description"]`).contains( description, ); if (subtitle) - cy.get(`${popupSelector}[data-cy="cardDescriptor_subtitle"]`).contains(subtitle); + cy.get(`${popupSelector}[data-cy="vnDescriptor_subtitle"]`).contains(subtitle); for (const index in listbox) - cy.get(`${popupSelector}[data-cy="cardDescriptor_listbox"] > *`) + cy.get(`${popupSelector}[data-cy="vnDescriptor_listbox"] > *`) .eq(index) .should('contain.text', listbox[index]); }); From 17cadc7ee78b38a3649e68e2b643c3fb3a271488 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Sun, 23 Mar 2025 10:59:44 +0100 Subject: [PATCH 34/44] fix: refs #8463 update data-cy attribute in VnLog test for consistency with VnDescriptor --- test/cypress/integration/vnComponent/VnLog.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js index e857457a7..ae0013150 100644 --- a/test/cypress/integration/vnComponent/VnLog.spec.js +++ b/test/cypress/integration/vnComponent/VnLog.spec.js @@ -25,7 +25,7 @@ describe('VnLog', () => { it('should show claimDescriptor', () => { cy.dataCy('iconLaunch-claimFk').first().click(); - cy.dataCy('cardDescriptor_subtitle').contains('1'); + cy.dataCy('vnDescriptor_subtitle').contains('1'); cy.dataCy('iconLaunch-claimFk').first().click(); }); }); From bfa375bacd0a8c5efff6831e555d9a58dcfe7270 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 24 Mar 2025 08:22:13 +0100 Subject: [PATCH 35/44] feat: refs #8638 add data attributes for transfer buys functionality in EntryBuys.vue and corresponding tests --- src/pages/Entry/Card/EntryBuys.vue | 4 +++- test/cypress/integration/entry/entryCard/entryBuys.spec.js | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index 85da5cf1d..67f97e09d 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -596,6 +596,7 @@ onMounted(() => { icon="move_group" color="primary" :title="t('Transfer buys')" + data-cy="transferBuys" flat @click="dialogRef = true" :disable="!selectedRows.length" @@ -610,7 +611,7 @@ onMounted(() => { v-model="newEntryRef" :label="t('Entry')" type="number" - data-cy="transfer-buy-entry" + data-cy="entryDestinyInput" /> </QCardSection> <QCardSection> @@ -623,6 +624,7 @@ onMounted(() => { /> <QBtn label="Transfer" + data-cy="transferBuysBtn" flat color="primary" @click="transferBuys(selectedRows, newEntryRef)" diff --git a/test/cypress/integration/entry/entryCard/entryBuys.spec.js b/test/cypress/integration/entry/entryCard/entryBuys.spec.js index f8f5e6b80..b5e185a8e 100644 --- a/test/cypress/integration/entry/entryCard/entryBuys.spec.js +++ b/test/cypress/integration/entry/entryCard/entryBuys.spec.js @@ -80,6 +80,11 @@ describe('EntryBuys', () => { checkColor('amount', COLORS.positive); cy.saveCard(); + cy.get('tbody > tr [tabindex="0"][role="checkbox"]').click(); + cy.dataCy('transferBuys').should('be.enabled').click(); + cy.dataCy('entryDestinyInput').should('be.visible').type('100'); + cy.dataCy('transferBuysBtn').click(); + cy.deleteEntry(); }); From 933736e06be2d26328599954c7e2878c5cd574a4 Mon Sep 17 00:00:00 2001 From: provira <provira@verdnatura.es> Date: Mon, 24 Mar 2025 09:22:51 +0100 Subject: [PATCH 36/44] feat: refs #8237 changed observation type to be SalesPerson by default --- src/components/ui/VnNotes.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue index 6ce28254d..a0621dc1d 100644 --- a/src/components/ui/VnNotes.vue +++ b/src/components/ui/VnNotes.vue @@ -154,6 +154,7 @@ function fetchData([data]) { filled size="lg" autogrow + autofocus @keyup.enter.stop="handleClick" :required="isRequired" clearable @@ -189,7 +190,7 @@ function fetchData([data]) { :search-url="false" @on-fetch=" newNote.text = ''; - newNote.observationTypeFk = null; + newNote.observationTypeFk = 4; " > <template #body="{ rows }"> From 2bdebc1e0d2a0f14fab2f5f4fa2c43782a783de9 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 09:27:35 +0100 Subject: [PATCH 37/44] test: waitSpinner() when load dialog --- test/cypress/integration/ticket/ticketList.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index a3d8fe908..5613a5854 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -35,7 +35,7 @@ describe('TicketList', () => { cy.get('.summaryBody').should('exist'); }); - it.skip('filter client and create ticket', () => { + it('filter client and create ticket', () => { cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar'); searchResults(); cy.wait('@ticketSearchbar'); @@ -44,6 +44,7 @@ describe('TicketList', () => { cy.dataCy('Customer ID_input').type('1101{enter}'); cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); + cy.waitSpinner(); cy.dataCy('Customer_select').should('have.value', 'Bruce Wayne'); cy.dataCy('Address_select').click(); From 61cc8f0813d84a780742ecf6ea86e2c4a484c7f5 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 24 Mar 2025 09:30:09 +0100 Subject: [PATCH 38/44] fix: remove unused VnIconLink component from VnLog.vue --- src/components/common/VnLog.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 136dbf2a4..d29999d45 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -619,7 +619,6 @@ watch( :value="prop.val.val" :name="prop.name" /> - <VnIconLink /> <span v-if=" propIndex < From 4caca33606660668202034b6c89c817c67ed2c90 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 24 Mar 2025 10:44:01 +0100 Subject: [PATCH 39/44] fix: refs #8581 update invoiceInSerial test to correctly compare totals after filtering --- .../invoiceIn/invoiceInSerial.spec.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js b/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js index faad22f12..3750f8f06 100644 --- a/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js @@ -10,14 +10,16 @@ describe('InvoiceInSerial', () => { }); it('should filter by last days ', () => { - let before; cy.dataCy('vnTableCell_total') .invoke('text') - .then((total) => (before = +total)); - - cy.dataCy('Last days_input').type('{selectall}1{enter}'); - cy.dataCy('vnTableCell_total') - .invoke('text') - .then((total) => expect(+total).to.be.lessThan(before)); + .then((before) => { + cy.dataCy('Last days_input') + .type('{selectall}1{enter}') + .then(() => { + cy.dataCy('vnTableCell_total') + .invoke('text') + .then((after) => expect(+after).to.be.lessThan(+before)); + }); + }); }); }); From 798371682c6eede4de615913b50227f33b8db78e Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 24 Mar 2025 12:39:40 +0100 Subject: [PATCH 40/44] feat: refs #6919 enhance filter in AccountSummary component to include entity ID --- src/pages/Account/Card/AccountSummary.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Account/Card/AccountSummary.vue b/src/pages/Account/Card/AccountSummary.vue index f7a16e8c3..0b108807e 100644 --- a/src/pages/Account/Card/AccountSummary.vue +++ b/src/pages/Account/Card/AccountSummary.vue @@ -17,7 +17,7 @@ const entityId = computed(() => $props.id || route.params.id); data-key="Account" ref="AccountSummary" url="VnUsers/preview" - :filter="filter" + :filter="{ ...filter, where: { id: entityId } }" > <template #header="{ entity }">{{ entity.id }} - {{ entity.nickname }}</template> <template #menu> From e1ef6f87f3f4c334d3e7f65cb6fc8617bf67dc24 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 24 Mar 2025 14:01:43 +0100 Subject: [PATCH 41/44] feat: implement onBeforeSave function to handle form data updates --- src/pages/Claim/Card/ClaimBasicData.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue index 43941d1dc..7e7d42ae8 100644 --- a/src/pages/Claim/Card/ClaimBasicData.vue +++ b/src/pages/Claim/Card/ClaimBasicData.vue @@ -2,6 +2,7 @@ import { ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; +import { getDifferences, getUpdatedValues } from 'src/filters'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelectEnum from 'src/components/common/VnSelectEnum.vue'; import FetchData from 'components/FetchData.vue'; @@ -9,12 +10,18 @@ import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; - import VnAvatar from 'src/components/ui/VnAvatar.vue'; const route = useRoute(); const { t } = useI18n(); const workersOptions = ref([]); + +function onBeforeSave(formData, originalData) { + return getUpdatedValues( + Object.keys(getDifferences(formData, originalData)), + formData, + ); +} </script> <template> <FetchData @@ -27,6 +34,7 @@ const workersOptions = ref([]); <FormModel model="Claim" :url-update="`Claims/updateClaim/${route.params.id}`" + :mapper="onBeforeSave" auto-load > <template #form="{ data, validate }"> From 293d51b7413b70e2f95bfe103b2059b86bf62b18 Mon Sep 17 00:00:00 2001 From: provira <provira@verdnatura.es> Date: Mon, 24 Mar 2025 14:06:38 +0100 Subject: [PATCH 42/44] feat: refs #8237 #8237 modified fetch to find default select value by "code" --- src/components/ui/VnNotes.vue | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue index a0621dc1d..b7e6ccbec 100644 --- a/src/components/ui/VnNotes.vue +++ b/src/components/ui/VnNotes.vue @@ -40,6 +40,11 @@ const quasar = useQuasar(); const newNote = reactive({ text: null, observationTypeFk: null }); const observationTypes = ref([]); const vnPaginateRef = ref(); + +const defaultObservationType = computed(() => + observationTypes.value.find(ot => ot.code === 'salesPerson')?.id +); + let originalText; function handleClick(e) { @@ -111,14 +116,22 @@ function fetchData([data]) { originalText = data?.notes; emit('onFetch', data); } + +const handleObservationTypes = (data) => { + observationTypes.value = data; + if(defaultObservationType.value) { + newNote.observationTypeFk = defaultObservationType.value; + } +}; + </script> <template> <FetchData v-if="selectType" url="ObservationTypes" - :filter="{ fields: ['id', 'description'] }" + :filter="{ fields: ['id', 'description', 'code'] }" auto-load - @on-fetch="(data) => (observationTypes = data)" + @on-fetch="handleObservationTypes" /> <FetchData v-if="justInput" @@ -190,7 +203,6 @@ function fetchData([data]) { :search-url="false" @on-fetch=" newNote.text = ''; - newNote.observationTypeFk = 4; " > <template #body="{ rows }"> From 2a560e9548dffc848dfce5594c5490f328be00aa Mon Sep 17 00:00:00 2001 From: provira <provira@verdnatura.es> Date: Mon, 24 Mar 2025 14:07:02 +0100 Subject: [PATCH 43/44] Merge branch '8237-defaultObservationType' of https: refs #8237//gitea.verdnatura.es/verdnatura/salix-front into 8237-defaultObservationType --- src/components/ItemsFilterPanel.vue | 10 +- src/components/VnTable/VnTable.vue | 1 + src/components/common/VnCard.vue | 26 +- src/components/common/VnLog.vue | 9 +- .../common/__tests__/VnDmsList.spec.js | 46 +- src/components/ui/CardDescriptor.vue | 383 +---------------- src/components/ui/EntityDescriptor.vue | 78 ++++ src/components/ui/VnDescriptor.vue | 318 ++++++++++++++ .../__tests__/downloadFile.spec.js | 11 +- src/composables/downloadFile.js | 20 +- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Account/AccountFilter.vue | 7 +- src/pages/Account/Acls/AclFilter.vue | 14 +- .../Account/Alias/Card/AliasDescriptor.vue | 6 +- src/pages/Account/Card/AccountDescriptor.vue | 6 +- src/pages/Account/Role/AccountRolesFilter.vue | 4 +- .../Account/Role/Card/RoleDescriptor.vue | 6 +- src/pages/Claim/Card/ClaimDescriptor.vue | 6 +- src/pages/Claim/ClaimFilter.vue | 25 +- .../Customer/Card/CustomerDescriptor.vue | 6 +- src/pages/Customer/CustomerFilter.vue | 27 +- .../Defaulter/CustomerDefaulterFilter.vue | 22 +- .../Payments/CustomerPaymentsFilter.vue | 18 +- src/pages/Entry/Card/EntryDescriptor.vue | 6 +- src/pages/Entry/EntryFilter.vue | 34 +- .../InvoiceIn/Card/InvoiceInDescriptor.vue | 6 +- src/pages/InvoiceIn/InvoiceInFilter.vue | 31 +- .../Serial/InvoiceInSerialFilter.vue | 6 +- .../InvoiceOut/Card/InvoiceOutDescriptor.vue | 6 +- src/pages/InvoiceOut/InvoiceOutFilter.vue | 23 +- src/pages/InvoiceOut/InvoiceOutGlobalForm.vue | 22 +- .../InvoiceOutNegativeBasesFilter.vue | 22 +- src/pages/Item/Card/ItemDescriptor.vue | 6 +- src/pages/Item/ItemFixedPriceFilter.vue | 11 +- src/pages/Item/ItemListFilter.vue | 31 +- src/pages/Item/ItemRequestFilter.vue | 36 +- .../Item/ItemType/Card/ItemTypeDescriptor.vue | 6 +- .../Monitor/Ticket/MonitorTicketFilter.vue | 45 +- .../Order/Card/CatalogFilterValueDialog.vue | 10 +- src/pages/Order/Card/OrderCard.vue | 4 +- src/pages/Order/Card/OrderCatalogFilter.vue | 12 +- src/pages/Order/Card/OrderDescriptor.vue | 18 +- src/pages/Order/Card/OrderDescriptorProxy.vue | 7 +- src/pages/Order/Card/OrderFilter.vue | 25 +- .../Route/Agency/Card/AgencyDescriptor.vue | 6 +- .../Route/Card/RouteAutonomousFilter.vue | 35 +- src/pages/Route/Card/RouteDescriptor.vue | 7 +- src/pages/Route/Card/RouteFilter.vue | 22 +- src/pages/Route/Roadmap/RoadmapDescriptor.vue | 6 +- src/pages/Route/Roadmap/RoadmapFilter.vue | 17 +- .../Route/Vehicle/Card/VehicleDescriptor.vue | 6 +- .../Shelving/Card/ShelvingDescriptor.vue | 6 +- src/pages/Shelving/Card/ShelvingFilter.vue | 5 +- .../Parking/Card/ParkingDescriptor.vue | 6 +- src/pages/Shelving/Parking/ParkingFilter.vue | 9 +- .../Supplier/Card/SupplierBalanceFilter.vue | 8 +- .../Card/SupplierConsumptionFilter.vue | 25 +- .../Supplier/Card/SupplierDescriptor.vue | 6 +- src/pages/Ticket/Card/TicketDescriptor.vue | 6 +- .../Ticket/Negative/TicketLackFilter.vue | 14 +- src/pages/Ticket/TicketAdvanceFilter.vue | 18 +- src/pages/Ticket/TicketFilter.vue | 50 +-- src/pages/Ticket/TicketFutureFilter.vue | 23 +- src/pages/Travel/Card/TravelDescriptor.vue | 6 +- src/pages/Travel/ExtraCommunityFilter.vue | 32 +- src/pages/Travel/TravelFilter.vue | 34 +- .../Worker/Card/WorkerCalendarFilter.vue | 8 +- src/pages/Worker/Card/WorkerDescriptor.vue | 6 +- src/pages/Worker/Card/WorkerPda.vue | 401 +++++++++++------- .../Department/Card/DepartmentDescriptor.vue | 6 +- src/pages/Worker/WorkerFilter.vue | 31 +- src/pages/Zone/Card/ZoneDescriptor.vue | 6 +- src/pages/Zone/ZoneDeliveryPanel.vue | 7 +- .../integration/vnComponent/VnLog.spec.js | 2 +- .../integration/worker/workerPda.spec.js | 83 +++- test/cypress/support/commands.js | 10 +- 77 files changed, 1178 insertions(+), 1147 deletions(-) create mode 100644 src/components/ui/EntityDescriptor.vue create mode 100644 src/components/ui/VnDescriptor.vue diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index f73753a6b..0f1e3f1eb 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -198,8 +198,7 @@ const setCategoryList = (data) => { v-model="params.typeFk" :options="itemTypesOptions" dense - outlined - rounded + filled use-input :disable="!selectedCategoryFk" @update:model-value=" @@ -235,8 +234,7 @@ const setCategoryList = (data) => { v-model="value.selectedTag" :options="tagOptions" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -252,8 +250,7 @@ const setCategoryList = (data) => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!value" @@ -265,7 +262,6 @@ const setCategoryList = (data) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined :is-clearable="false" @keyup.enter="applyTags(params, searchFn)" /> diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index c64217198..e8dd1b526 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -633,6 +633,7 @@ const rowCtrlClickFunction = computed(() => { :data-key="$attrs['data-key']" :columns="columns" :redirect="redirect" + v-bind="$attrs?.['table-filter']" > <template v-for="(_, slotName) in $slots" diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 620dc2ad2..21cdc9df5 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -1,12 +1,15 @@ <script setup> -import { onBeforeMount } from 'vue'; -import { useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; +import { onBeforeMount, computed } from 'vue'; +import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; import { useStateStore } from 'stores/useStateStore'; import useCardSize from 'src/composables/useCardSize'; import VnSubToolbar from '../ui/VnSubToolbar.vue'; +const emit = defineEmits(['onFetch']); + const props = defineProps({ + id: { type: Number, required: false, default: null }, dataKey: { type: String, required: true }, url: { type: String, default: undefined }, idInWhere: { type: Boolean, default: false }, @@ -16,10 +19,13 @@ const props = defineProps({ searchDataKey: { type: String, default: undefined }, searchbarProps: { type: Object, default: undefined }, redirectOnError: { type: Boolean, default: false }, + visual: { type: Boolean, default: true }, }); +const route = useRoute(); const stateStore = useStateStore(); const router = useRouter(); +const entityId = computed(() => props.id || route?.params?.id); const arrayData = useArrayData(props.dataKey, { url: props.url, userFilter: props.filter, @@ -35,7 +41,7 @@ onBeforeMount(async () => { const route = router.currentRoute.value; try { - await fetch(route.params.id); + await fetch(entityId.value); } catch { const { matched: matches } = route; const { path } = matches.at(-1); @@ -51,8 +57,7 @@ onBeforeRouteUpdate(async (to, from) => { router.push({ name, params: to.params }); } } - const id = to.params.id; - if (id !== from.params.id) await fetch(id, true); + if (entityId.value !== to.params.id) await fetch(to.params.id, true); }); async function fetch(id, append = false) { @@ -61,14 +66,17 @@ async function fetch(id, append = false) { else if (!regex.test(props.url)) arrayData.store.url = `${props.url}/${id}`; else arrayData.store.url = props.url.replace(regex, `/${id}`); await arrayData.fetch({ append, updateRouter: false }); + emit('onFetch', arrayData.store.data); } function hasRouteParam(params, valueToCheck = ':addressId') { return Object.values(params).includes(valueToCheck); } </script> <template> - <VnSubToolbar /> - <div :class="[useCardSize(), $attrs.class]"> - <RouterView :key="$route.path" /> - </div> + <template v-if="visual"> + <VnSubToolbar /> + <div :class="[useCardSize(), $attrs.class]"> + <RouterView :key="$route.path" /> + </div> + </template> </template> diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 136dbf2a4..a05da264b 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -708,6 +708,7 @@ watch( v-model="searchInput" class="full-width" clearable + filled clear-icon="close" @keyup.enter="() => selectFilter('search')" @focusout="() => selectFilter('search')" @@ -727,6 +728,7 @@ watch( v-model="selectedFilters.changedModel" option-label="locale" option-value="value" + filled :options="actions" @update:model-value="selectFilter('action')" hide-selected @@ -752,8 +754,7 @@ watch( class="full-width" :label="t('globals.user')" v-model="userSelect" - option-label="name" - option-value="id" + filled :url="`${model}Logs/${route.params.id}/editors`" :fields="['id', 'nickname', 'name', 'image']" sort-by="nickname" @@ -782,6 +783,7 @@ watch( :label="t('globals.changes')" v-model="changeInput" class="full-width" + filled clearable clear-icon="close" @keyup.enter="selectFilter('change')" @@ -818,6 +820,7 @@ watch( @clear="selectFilter('date', 'to')" v-model="dateFrom" clearable + filled clear-icon="close" /> </QItem> @@ -830,6 +833,7 @@ watch( @clear="selectFilter('date', 'from')" v-model="dateTo" clearable + filled clear-icon="close" /> </QItem> @@ -843,6 +847,7 @@ watch( dense flat minimal + filled @update:model-value=" (value) => { dateFromDialog = false; diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js index 9649943a2..22101239e 100644 --- a/src/components/common/__tests__/VnDmsList.spec.js +++ b/src/components/common/__tests__/VnDmsList.spec.js @@ -4,12 +4,15 @@ import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest'; describe('VnDmsList', () => { let vm; - const dms = { - userFk: 1, - name: 'DMS 1' + const dms = { + userFk: 1, + name: 'DMS 1', }; - + beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); vi.spyOn(axios, 'get').mockResolvedValue({ data: [] }); vm = createWrapper(VnDmsList, { props: { @@ -18,8 +21,8 @@ describe('VnDmsList', () => { filter: 'wd.workerFk', updateModel: 'Workers', deleteModel: 'WorkerDms', - downloadModel: 'WorkerDms' - } + downloadModel: 'WorkerDms', + }, }).vm; }); @@ -29,46 +32,45 @@ describe('VnDmsList', () => { describe('setData()', () => { const data = [ - { - userFk: 1, + { + userFk: 1, name: 'Jessica', lastName: 'Jones', file: '4.jpg', - created: '2021-07-28 21:00:00' + created: '2021-07-28 21:00:00', }, - { - userFk: 2, + { + userFk: 2, name: 'Bruce', lastName: 'Banner', created: '2022-07-28 21:00:00', dms: { - userFk: 2, + userFk: 2, name: 'Bruce', lastName: 'BannerDMS', created: '2022-07-28 21:00:00', file: '4.jpg', - } + }, }, { userFk: 3, name: 'Natasha', lastName: 'Romanoff', file: '4.jpg', - created: '2021-10-28 21:00:00' - } - ] + created: '2021-10-28 21:00:00', + }, + ]; it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => { vm.setData(data); expect([vm.rows][0][0].lastName).toEqual('BannerDMS'); expect([vm.rows][0][1].lastName).toEqual('Romanoff'); - }); }); describe('parseDms()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => { const parsedDms = vm.parseDms(dms); expect(parsedDms).toEqual(resultDms); @@ -76,12 +78,12 @@ describe('VnDmsList', () => { }); describe('showFormDialog()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('should call fn parseDms() and set show true if dms is defined', () => { vm.showFormDialog(dms); expect(vm.formDialog.show).toEqual(true); expect(vm.formDialog.dms).toEqual(resultDms); }); }); -}); \ No newline at end of file +}); diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index b7d03127c..5f9a89d64 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -1,375 +1,38 @@ <script setup> -import { onBeforeMount, watch, computed, ref } from 'vue'; -import { useI18n } from 'vue-i18n'; -import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; -import { useArrayData } from 'composables/useArrayData'; -import { useSummaryDialog } from 'src/composables/useSummaryDialog'; -import { useState } from 'src/composables/useState'; -import { useRoute, useRouter } from 'vue-router'; -import { useClipboard } from 'src/composables/useClipboard'; -import VnMoreOptions from './VnMoreOptions.vue'; +import { ref } from 'vue'; +import VnDescriptor from './VnDescriptor.vue'; const $props = defineProps({ - url: { - type: String, - default: '', - }, - filter: { - type: Object, - default: null, - }, - title: { - type: String, - default: '', - }, - subtitle: { + id: { type: Number, - default: null, + default: false, }, - dataKey: { - type: String, - default: null, - }, - summary: { + card: { type: Object, default: null, }, - width: { - type: String, - default: 'md-width', - }, - toModule: { - type: String, - default: null, - }, }); -const state = useState(); -const route = useRoute(); -const router = useRouter(); -const { t } = useI18n(); -const { copyText } = useClipboard(); -const { viewSummary } = useSummaryDialog(); -let arrayData; -let store; -let entity; -const isLoading = ref(false); -const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); -const DESCRIPTOR_PROXY = 'DescriptorProxy'; -const moduleName = ref(); -const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; -defineExpose({ getData }); - -onBeforeMount(async () => { - arrayData = useArrayData($props.dataKey, { - url: $props.url, - userFilter: $props.filter, - skip: 0, - oneRecord: true, - }); - store = arrayData.store; - entity = computed(() => { - const data = store.data ?? {}; - if (data) emit('onFetch', data); - return data; - }); - - // It enables to load data only once if the module is the same as the dataKey - if (!isSameDataKey.value || !route.params.id) await getData(); - watch( - () => [$props.url, $props.filter], - async () => { - if (!isSameDataKey.value) await getData(); - }, - ); -}); - -function getName() { - let name = $props.dataKey; - if ($props.dataKey.includes(DESCRIPTOR_PROXY)) { - name = name.split(DESCRIPTOR_PROXY)[0]; - } - return name; -} -const routeName = computed(() => { - let routeName = getName(); - return `${routeName}Summary`; -}); - -async function getData() { - store.url = $props.url; - store.filter = $props.filter ?? {}; - isLoading.value = true; - try { - const { data } = await arrayData.fetch({ append: false, updateRouter: false }); - state.set($props.dataKey, data); - emit('onFetch', data); - } finally { - isLoading.value = false; - } -} - -function getValueFromPath(path) { - if (!path) return; - const keys = path.toString().split('.'); - let current = entity.value; - - for (const key of keys) { - if (current[key] === undefined) return undefined; - else current = current[key]; - } - return current; -} - -function copyIdText(id) { - copyText(id, { - component: { - copyValue: id, - }, - }); -} - const emit = defineEmits(['onFetch']); - -const iconModule = computed(() => { - moduleName.value = getName(); - if ($props.toModule) { - return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon; - } - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.meta?.icon; - } else { - return route.matched[1].meta.icon; - } -}); - -const toModule = computed(() => { - moduleName.value = getName(); - if ($props.toModule) return $props.toModule; - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.redirect; - } else { - return route.matched[1].path.split('/').length > 2 - ? route.matched[1].redirect - : route.matched[1].children[0].redirect; - } -}); +const entity = ref(); </script> <template> - <div class="descriptor" data-cy="cardDescriptor"> - <template v-if="entity && !isLoading"> - <div class="header bg-primary q-pa-sm justify-between"> - <slot name="header-extra-action"> - <QBtn - round - flat - dense - size="md" - :icon="iconModule" - color="white" - class="link" - :to="toModule" - > - <QTooltip> - {{ t('globals.goToModuleIndex') }} - </QTooltip> - </QBtn> - </slot> - <QBtn - @click.stop="viewSummary(entity.id, $props.summary, $props.width)" - round - flat - dense - size="md" - icon="preview" - color="white" - class="link" - v-if="summary" - data-cy="openSummaryBtn" - > - <QTooltip> - {{ t('components.smartCard.openSummary') }} - </QTooltip> - </QBtn> - <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> - <QBtn - class="link" - color="white" - dense - flat - icon="launch" - round - size="md" - data-cy="goToSummaryBtn" - > - <QTooltip> - {{ t('components.cardDescriptor.summary') }} - </QTooltip> - </QBtn> - </RouterLink> - <VnMoreOptions v-if="$slots.menu"> - <template #menu="{ menuRef }"> - <slot name="menu" :entity="entity" :menu-ref="menuRef" /> - </template> - </VnMoreOptions> - </div> - <slot name="before" /> - <div class="body q-py-sm"> - <QList dense> - <QItemLabel header class="ellipsis text-h5" :lines="1"> - <div class="title"> - <span - v-if="$props.title" - :title="getValueFromPath(title)" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_title`" - > - {{ getValueFromPath(title) ?? $props.title }} - </span> - <slot v-else name="description" :entity="entity"> - <span - :title="entity.name" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_description`" - v-text="entity.name" - /> - </slot> - </div> - </QItemLabel> - <QItem> - <QItemLabel - class="subtitle" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_subtitle`" - > - #{{ getValueFromPath(subtitle) ?? entity.id }} - </QItemLabel> - <QBtn - round - flat - dense - size="sm" - icon="content_copy" - color="primary" - @click.stop="copyIdText(entity.id)" - > - <QTooltip> - {{ t('globals.copyId') }} - </QTooltip> - </QBtn> - </QItem> - </QList> - <div - class="list-box q-mt-xs" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_listbox`" - > - <slot name="body" :entity="entity" /> - </div> - </div> - <div class="icons"> - <slot name="icons" :entity="entity" /> - </div> - <div class="actions justify-center" data-cy="descriptor_actions"> - <slot name="actions" :entity="entity" /> - </div> - <slot name="after" /> - </template> - <SkeletonDescriptor v-if="!entity || isLoading" /> - </div> - <QInnerLoading - :label="t('globals.pleaseWait')" - :showing="isLoading" - color="primary" - /> -</template> - -<style lang="scss"> -.body { - background-color: var(--vn-section-color); - .text-h5 { - font-size: 20px; - padding-top: 5px; - padding-bottom: 0px; - } - .q-item { - min-height: 20px; - - .link { - margin-left: 10px; - } - } - .vn-label-value { - display: flex; - padding: 0px 16px; - .label { - color: var(--vn-label-color); - font-size: 14px; - - &:not(:has(a))::after { - content: ':'; + <component + :is="card" + :id + :visual="false" + v-bind="$attrs" + @on-fetch=" + (data) => { + entity = data; + emit('onFetch', data); } - } - .value { - color: var(--vn-text-color); - font-size: 14px; - margin-left: 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: left; - } - .info { - margin-left: 5px; - } - } -} -</style> - -<style lang="scss" scoped> -.title { - overflow: hidden; - text-overflow: ellipsis; - span { - color: var(--vn-text-color); - font-weight: bold; - } -} -.subtitle { - color: var(--vn-text-color); - font-size: 16px; - margin-bottom: 2px; -} -.list-box { - .q-item__label { - color: var(--vn-label-color); - padding-bottom: 0%; - } -} -.descriptor { - width: 256px; - .header { - display: flex; - align-items: center; - } - .icons { - margin: 0 10px; - display: flex; - justify-content: center; - .q-icon { - margin-right: 5px; - } - } - .actions { - margin: 0 5px; - justify-content: center !important; - } -} -</style> -<i18n> - en: - globals: - copyId: Copy ID - es: - globals: - copyId: Copiar ID -</i18n> + " + /> + <VnDescriptor v-model="entity" v-bind="$attrs"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue new file mode 100644 index 000000000..a5dced551 --- /dev/null +++ b/src/components/ui/EntityDescriptor.vue @@ -0,0 +1,78 @@ +<script setup> +import { onBeforeMount, watch, computed, ref } from 'vue'; +import { useArrayData } from 'composables/useArrayData'; +import { useState } from 'src/composables/useState'; +import { useRoute } from 'vue-router'; +import VnDescriptor from './VnDescriptor.vue'; + +const $props = defineProps({ + url: { + type: String, + default: '', + }, + filter: { + type: Object, + default: null, + }, + dataKey: { + type: String, + default: null, + }, +}); + +const state = useState(); +const route = useRoute(); +let arrayData; +let store; +let entity; +const isLoading = ref(false); +const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); +defineExpose({ getData }); + +onBeforeMount(async () => { + arrayData = useArrayData($props.dataKey, { + url: $props.url, + userFilter: $props.filter, + skip: 0, + oneRecord: true, + }); + store = arrayData.store; + entity = computed(() => { + const data = store.data ?? {}; + if (data) emit('onFetch', data); + return data; + }); + + // It enables to load data only once if the module is the same as the dataKey + if (!isSameDataKey.value || !route.params.id) await getData(); + watch( + () => [$props.url, $props.filter], + async () => { + if (!isSameDataKey.value) await getData(); + }, + ); +}); + +async function getData() { + store.url = $props.url; + store.filter = $props.filter ?? {}; + isLoading.value = true; + try { + const { data } = await arrayData.fetch({ append: false, updateRouter: false }); + state.set($props.dataKey, data); + emit('onFetch', data); + } finally { + isLoading.value = false; + } +} + +const emit = defineEmits(['onFetch']); +</script> + +<template> + <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue new file mode 100644 index 000000000..47da98d74 --- /dev/null +++ b/src/components/ui/VnDescriptor.vue @@ -0,0 +1,318 @@ +<script setup> +import { computed, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; +import { useSummaryDialog } from 'src/composables/useSummaryDialog'; +import { useRoute, useRouter } from 'vue-router'; +import { useClipboard } from 'src/composables/useClipboard'; +import VnMoreOptions from './VnMoreOptions.vue'; + +const entity = defineModel({ type: Object, default: null }); +const $props = defineProps({ + title: { + type: String, + default: '', + }, + subtitle: { + type: Number, + default: null, + }, + summary: { + type: Object, + default: null, + }, + width: { + type: String, + default: 'md-width', + }, + module: { + type: String, + default: null, + }, + toModule: { + type: String, + default: null, + }, +}); + +const route = useRoute(); +const router = useRouter(); +const { t } = useI18n(); +const { copyText } = useClipboard(); +const { viewSummary } = useSummaryDialog(); +const DESCRIPTOR_PROXY = 'DescriptorProxy'; +const moduleName = ref(); +const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; + +function getName() { + let name = $props.module; + if ($props.module.includes(DESCRIPTOR_PROXY)) { + name = name.split(DESCRIPTOR_PROXY)[0]; + } + return name; +} +const routeName = computed(() => { + let routeName = getName(); + return `${routeName}Summary`; +}); + +function getValueFromPath(path) { + if (!path) return; + const keys = path.toString().split('.'); + let current = entity.value; + + for (const key of keys) { + if (current[key] === undefined) return undefined; + else current = current[key]; + } + return current; +} + +function copyIdText(id) { + copyText(id, { + component: { + copyValue: id, + }, + }); +} + +const emit = defineEmits(['onFetch']); + +const iconModule = computed(() => { + moduleName.value = getName(); + if ($props.toModule) { + return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon; + } + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.meta?.icon; + } else { + return route.matched[1].meta.icon; + } +}); + +const toModule = computed(() => { + moduleName.value = getName(); + if ($props.toModule) return $props.toModule; + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.redirect; + } else { + return route.matched[1].path.split('/').length > 2 + ? route.matched[1].redirect + : route.matched[1].children[0].redirect; + } +}); +</script> + +<template> + <div class="descriptor" data-cy="vnDescriptor"> + <template v-if="entity && entity?.id"> + <div class="header bg-primary q-pa-sm justify-between"> + <slot name="header-extra-action"> + <QBtn + round + flat + dense + size="md" + :icon="iconModule" + color="white" + class="link" + :to="toModule" + > + <QTooltip> + {{ t('globals.goToModuleIndex') }} + </QTooltip> + </QBtn> + </slot> + <QBtn + @click.stop="viewSummary(entity.id, summary, width)" + round + flat + dense + size="md" + icon="preview" + color="white" + class="link" + v-if="summary" + data-cy="openSummaryBtn" + > + <QTooltip> + {{ t('components.smartCard.openSummary') }} + </QTooltip> + </QBtn> + <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> + <QBtn + class="link" + color="white" + dense + flat + icon="launch" + round + size="md" + data-cy="goToSummaryBtn" + > + <QTooltip> + {{ t('components.vnDescriptor.summary') }} + </QTooltip> + </QBtn> + </RouterLink> + <VnMoreOptions v-if="$slots.menu"> + <template #menu="{ menuRef }"> + <slot name="menu" :entity="entity" :menu-ref="menuRef" /> + </template> + </VnMoreOptions> + </div> + <slot name="before" /> + <div class="body q-py-sm"> + <QList dense> + <QItemLabel header class="ellipsis text-h5" :lines="1"> + <div class="title"> + <span + v-if="title" + :title="getValueFromPath(title)" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" + > + {{ getValueFromPath(title) ?? title }} + </span> + <slot v-else name="description" :entity="entity"> + <span + :title="entity.name" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_description`" + v-text="entity.name" + /> + </slot> + </div> + </QItemLabel> + <QItem> + <QItemLabel + class="subtitle" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" + > + #{{ getValueFromPath(subtitle) ?? entity.id }} + </QItemLabel> + <QBtn + round + flat + dense + size="sm" + icon="content_copy" + color="primary" + @click.stop="copyIdText(entity.id)" + > + <QTooltip> + {{ t('globals.copyId') }} + </QTooltip> + </QBtn> + </QItem> + </QList> + <div + class="list-box q-mt-xs" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_listbox`" + > + <slot name="body" :entity="entity" /> + </div> + </div> + <div class="icons"> + <slot name="icons" :entity="entity" /> + </div> + <div class="actions justify-center" data-cy="descriptor_actions"> + <slot name="actions" :entity="entity" /> + </div> + <slot name="after" /> + </template> + <SkeletonDescriptor v-if="!entity" /> + </div> + <QInnerLoading :label="t('globals.pleaseWait')" :showing="!entity" color="primary" /> +</template> + +<style lang="scss"> +.body { + background-color: var(--vn-section-color); + .text-h5 { + font-size: 20px; + padding-top: 5px; + padding-bottom: 0px; + } + .q-item { + min-height: 20px; + + .link { + margin-left: 10px; + } + } + .vn-label-value { + display: flex; + padding: 0px 16px; + .label { + color: var(--vn-label-color); + font-size: 14px; + + &:not(:has(a))::after { + content: ':'; + } + } + .value { + color: var(--vn-text-color); + font-size: 14px; + margin-left: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + } + .info { + margin-left: 5px; + } + } +} +</style> + +<style lang="scss" scoped> +.title { + overflow: hidden; + text-overflow: ellipsis; + span { + color: var(--vn-text-color); + font-weight: bold; + } +} +.subtitle { + color: var(--vn-text-color); + font-size: 16px; + margin-bottom: 2px; +} +.list-box { + .q-item__label { + color: var(--vn-label-color); + padding-bottom: 0%; + } +} +.descriptor { + width: 256px; + .header { + display: flex; + align-items: center; + } + .icons { + margin: 0 10px; + display: flex; + justify-content: center; + .q-icon { + margin-right: 5px; + } + } + .actions { + margin: 0 5px; + justify-content: center !important; + } +} +</style> +<i18n> + en: + globals: + copyId: Copy ID + es: + globals: + copyId: Copiar ID +</i18n> diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js index f53b56b3e..f83a973b0 100644 --- a/src/composables/__tests__/downloadFile.spec.js +++ b/src/composables/__tests__/downloadFile.spec.js @@ -6,10 +6,12 @@ const session = useSession(); const token = session.getToken(); describe('downloadFile', () => { - const baseUrl = 'http://localhost:9000'; let defaulCreateObjectURL; beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); defaulCreateObjectURL = window.URL.createObjectURL; window.URL.createObjectURL = vi.fn(() => 'blob:http://localhost:9000/blob-id'); }); @@ -22,15 +24,14 @@ describe('downloadFile', () => { headers: { 'content-disposition': 'attachment; filename="test-file.txt"' }, }; vi.spyOn(axios, 'get').mockImplementation((url) => { - if (url == 'Urls/getUrl') return Promise.resolve({ data: baseUrl }); - else if (url.includes('downloadFile')) return Promise.resolve(res); + if (url.includes('downloadFile')) return Promise.resolve(res); }); await downloadFile(1); expect(axios.get).toHaveBeenCalledWith( - `${baseUrl}/api/dms/1/downloadFile?access_token=${token}`, - { responseType: 'blob' } + `/api/dms/1/downloadFile?access_token=${token}`, + { responseType: 'blob' }, ); }); }); diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js index 4588265a2..302836e09 100644 --- a/src/composables/downloadFile.js +++ b/src/composables/downloadFile.js @@ -5,20 +5,30 @@ import { exportFile } from 'quasar'; const { getTokenMultimedia } = useSession(); const token = getTokenMultimedia(); +const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) { - const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); const response = await axios.get( url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`, { responseType: 'blob' } ); + download(response); +} + +export async function downloadDocuware(url, params) { + const response = await axios.get(`${appUrl}/api/` + url, { + responseType: 'blob', + params, + }); + + download(response); +} + +function download(response) { const contentDisposition = response.headers['content-disposition']; const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition); - const filename = - matches != null && matches[1] - ? matches[1].replace(/['"]/g, '') - : 'downloaded-file'; + const filename = matches?.[1] ? matches[1].replace(/['"]/g, '') : 'downloaded-file'; exportFile(filename, response.data); } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 6be11b5ed..7374cda68 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -646,6 +646,7 @@ worker: model: Model serialNumber: Serial number removePDA: Deallocate PDA + sendToTablet: Send to tablet create: lastName: Last name birth: Birth diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 55e5abd95..f0ce53e37 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -731,6 +731,7 @@ worker: model: Modelo serialNumber: Número de serie removePDA: Desasignar PDA + sendToTablet: Enviar a la tablet create: lastName: Apellido birth: Fecha de nacimiento diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue index 50c3ee1ac..732e92f77 100644 --- a/src/pages/Account/AccountFilter.vue +++ b/src/pages/Account/AccountFilter.vue @@ -47,7 +47,7 @@ const rolesOptions = ref([]); :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -57,7 +57,7 @@ const rolesOptions = ref([]); :label="t('account.card.alias')" v-model="params.nickname" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -75,8 +75,7 @@ const rolesOptions = ref([]); use-input hide-selected dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue index 8035f92b8..222fe5b77 100644 --- a/src/pages/Account/Acls/AclFilter.vue +++ b/src/pages/Account/Acls/AclFilter.vue @@ -56,8 +56,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -72,8 +71,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -83,7 +81,7 @@ onBeforeMount(() => { :label="t('acls.aclFilter.property')" v-model="params.property" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -98,8 +96,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -114,8 +111,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue index 7f6992bf0..957047cc3 100644 --- a/src/pages/Account/Alias/Card/AliasDescriptor.vue +++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; @@ -48,7 +48,7 @@ const removeAlias = () => { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`MailAliases/${entityId}`" data-key="Alias" @@ -63,7 +63,7 @@ const removeAlias = () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue index 49328fe87..eb0a9013c 100644 --- a/src/pages/Account/Card/AccountDescriptor.vue +++ b/src/pages/Account/Card/AccountDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import AccountDescriptorMenu from './AccountDescriptorMenu.vue'; import VnImg from 'src/components/ui/VnImg.vue'; @@ -20,7 +20,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`VnUsers/preview`" :filter="{ ...filter, where: { id: entityId } }" @@ -78,7 +78,7 @@ onMounted(async () => { </QIcon> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Account/Role/AccountRolesFilter.vue b/src/pages/Account/Role/AccountRolesFilter.vue index cbe7a70c8..1358236c6 100644 --- a/src/pages/Account/Role/AccountRolesFilter.vue +++ b/src/pages/Account/Role/AccountRolesFilter.vue @@ -27,7 +27,7 @@ const props = defineProps({ :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -37,7 +37,7 @@ const props = defineProps({ :label="t('role.description')" v-model="params.description" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue index 051359702..698bea4fa 100644 --- a/src/pages/Account/Role/Card/RoleDescriptor.vue +++ b/src/pages/Account/Role/Card/RoleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -32,7 +32,7 @@ const removeRole = async () => { </script> <template> - <CardDescriptor + <EntityDescriptor url="VnRoles" :filter="{ where: { id: entityId } }" data-key="Role" @@ -47,7 +47,7 @@ const removeRole = async () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue index d789b63d3..76ede81ed 100644 --- a/src/pages/Claim/Card/ClaimDescriptor.vue +++ b/src/pages/Claim/Card/ClaimDescriptor.vue @@ -6,7 +6,7 @@ import { toDateHourMinSec, toPercentage } from 'src/filters'; import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue'; import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; import { getUrl } from 'src/composables/getUrl'; @@ -44,7 +44,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Claims/${entityId}`" :filter="filter" title="client.name" @@ -147,7 +147,7 @@ onMounted(async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue index 37146865c..51460f7e4 100644 --- a/src/pages/Claim/ClaimFilter.vue +++ b/src/pages/Claim/ClaimFilter.vue @@ -33,7 +33,7 @@ const props = defineProps({ :label="t('claim.customerId')" v-model="params.clientFk" lazy-rules - is-outlined + filled > <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> @@ -41,12 +41,11 @@ const props = defineProps({ :label="t('Client Name')" v-model="params.clientName" lazy-rules - is-outlined + filled /> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -61,8 +60,7 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined - rounded + filled /> <VnSelect :label="t('claim.state')" @@ -70,14 +68,12 @@ const props = defineProps({ :options="states" option-label="description" dense - outlined - rounded + filled /> <VnInputDate v-model="params.created" :label="t('claim.created')" - outlined - rounded + filled dense /> <VnSelect @@ -86,8 +82,7 @@ const props = defineProps({ url="Items/withName" :use-like="false" sort-by="id DESC" - outlined - rounded + filled dense /> <VnSelect @@ -98,15 +93,13 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined - rounded + filled /> <VnSelect :label="t('claim.zone')" v-model="params.zoneFk" url="Zones" - outlined - rounded + filled dense /> <QCheckbox diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index 8978c00f1..cd18cf2c9 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -7,7 +7,7 @@ import { toCurrency, toDate } from 'src/filters'; import useCardDescription from 'src/composables/useCardDescription'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import CustomerDescriptorMenu from './CustomerDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; @@ -54,7 +54,7 @@ const debtWarning = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Clients/${entityId}/getCard`" :summary="$props.summary" data-key="Customer" @@ -232,7 +232,7 @@ const debtWarning = computed(() => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue index 2ace6dd02..55a7f565e 100644 --- a/src/pages/Customer/CustomerFilter.vue +++ b/src/pages/Customer/CustomerFilter.vue @@ -41,7 +41,7 @@ const exprBuilder = (param, value) => { <template #body="{ params, searchFn }"> <QItem class="q-my-sm"> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined> + <VnInput :label="t('FI')" v-model="params.fi" filled> <template #prepend> <QIcon name="badge" size="xs" /> </template> @@ -50,7 +50,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Name')" v-model="params.name" is-outlined /> + <VnInput :label="t('Name')" v-model="params.name" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> @@ -58,16 +58,15 @@ const exprBuilder = (param, value) => { <VnInput :label="t('customer.summary.socialName')" v-model="params.socialName" - is-outlined + filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -89,8 +88,7 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined - rounded + filled auto-load :input-debounce="0" /> @@ -98,12 +96,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('City')" v-model="params.city" is-outlined /> + <VnInput :label="t('City')" v-model="params.city" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Phone')" v-model="params.phone" is-outlined> + <VnInput :label="t('Phone')" v-model="params.phone" filled> <template #prepend> <QIcon name="phone" size="xs" /> </template> @@ -112,7 +110,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined> + <VnInput :label="t('Email')" v-model="params.email" filled> <template #prepend> <QIcon name="email" size="sm" /> </template> @@ -132,19 +130,14 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined - rounded + filled auto-load sortBy="name ASC" /></QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput - :label="t('Postcode')" - v-model="params.postcode" - is-outlined - /> + <VnInput :label="t('Postcode')" v-model="params.postcode" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue index 0eab7b7c5..64e3baeb5 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue @@ -45,8 +45,7 @@ const departments = ref(); dense option-label="name" option-value="id" - outlined - rounded + filled emit-value hide-selected map-options @@ -67,8 +66,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.departmentFk" @update:model-value="searchFn()" @@ -91,8 +89,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.countryFk" @update:model-value="searchFn()" @@ -108,7 +105,7 @@ const departments = ref(); <VnInput :label="t('P. Method')" clearable - is-outlined + filled v-model="params.paymentMethod" /> </QItemSection> @@ -119,7 +116,7 @@ const departments = ref(); <VnInput :label="t('Balance D.')" clearable - is-outlined + filled v-model="params.balance" /> </QItemSection> @@ -137,8 +134,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.workerFk" @update:model-value="searchFn()" @@ -154,7 +150,7 @@ const departments = ref(); <VnInputDate :label="t('L. O. Date')" clearable - is-outlined + filled v-model="params.date" /> </QItemSection> @@ -165,7 +161,7 @@ const departments = ref(); <VnInput :label="t('Credit I.')" clearable - is-outlined + filled v-model="params.credit" /> </QItemSection> @@ -175,7 +171,7 @@ const departments = ref(); <QItemSection> <VnInputDate :label="t('From')" - is-outlined + filled v-model="params.defaulterSinced" /> </QItemSection> diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue index 8982cba5a..ec20237b4 100644 --- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue +++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue @@ -25,7 +25,7 @@ const props = defineProps({ <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('Order ID')" v-model="params.orderFk" is-outlined> + <VnInput :label="t('Order ID')" v-model="params.orderFk" filled> <template #prepend> <QIcon name="vn:basket" size="xs" /> </template> @@ -34,11 +34,7 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Customer ID')" - v-model="params.clientFk" - is-outlined - > + <VnInput :label="t('Customer ID')" v-model="params.clientFk" filled> <template #prepend> <QIcon name="vn:client" size="xs" /> </template> @@ -47,19 +43,15 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInputNumber - :label="t('Amount')" - v-model="params.amount" - is-outlined - /> + <VnInputNumber :label="t('Amount')" v-model="params.amount" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 313ed3d72..560114283 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -6,7 +6,7 @@ import { toDate } from 'src/filters'; import { getUrl } from 'src/composables/getUrl'; import { useQuasar } from 'quasar'; import { usePrintService } from 'composables/usePrintService'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue'; import axios from 'axios'; @@ -145,7 +145,7 @@ async function deleteEntry() { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Entries/${entityId}`" :filter="entryFilter" title="supplier.nickname" @@ -264,7 +264,7 @@ async function deleteEntry() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue index 82bcb1a79..19f4bca86 100644 --- a/src/pages/Entry/EntryFilter.vue +++ b/src/pages/Entry/EntryFilter.vue @@ -101,14 +101,14 @@ const entryFilterPanel = ref(); :label="t('params.landed')" v-model="params.landed" @update:model-value="searchFn()" - is-outlined + filled data-cy="landed" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput v-model="params.id" label="Id" is-outlined /> + <VnInput v-model="params.id" label="Id" filled /> </QItemSection> </QItem> <QItem> @@ -118,8 +118,7 @@ const entryFilterPanel = ref(); @update:model-value="searchFn()" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -128,7 +127,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.reference" :label="t('entry.list.tableVisibleColumns.reference')" - is-outlined + filled /> </QItemSection> </QItem> @@ -143,8 +142,7 @@ const entryFilterPanel = ref(); :fields="['id', 'name']" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -153,7 +151,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.evaNotes" :label="t('params.evaNotes')" - is-outlined + filled /> </QItemSection> </QItem> @@ -168,8 +166,7 @@ const entryFilterPanel = ref(); sort-by="name ASC" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -184,8 +181,7 @@ const entryFilterPanel = ref(); sort-by="name ASC" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -207,7 +203,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.invoiceNumber" :label="t('params.invoiceNumber')" - is-outlined + filled /> </QItemSection> </QItem> @@ -224,8 +220,16 @@ const entryFilterPanel = ref(); option-label="description" hide-selected dense - outlined - rounded + filled + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInput + v-model="params.evaNotes" + :label="t('params.evaNotes')" + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue index eb673c546..e8df27511 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue @@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n'; import axios from 'axios'; import { toCurrency, toDate } from 'src/filters'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import filter from './InvoiceInFilter.js'; import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue'; @@ -84,7 +84,7 @@ async function setInvoiceCorrection(id) { } </script> <template> - <CardDescriptor + <EntityDescriptor ref="cardDescriptorRef" data-key="InvoiceIn" :url="`InvoiceIns/${entityId}`" @@ -159,7 +159,7 @@ async function setInvoiceCorrection(id) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style lang="scss" scoped> .q-dialog { diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue index a4fb0d653..6551a7ca9 100644 --- a/src/pages/InvoiceIn/InvoiceInFilter.vue +++ b/src/pages/InvoiceIn/InvoiceInFilter.vue @@ -40,17 +40,13 @@ function handleDaysAgo(params, daysAgo) { <VnInputDate :label="$t('globals.from')" v-model="params.from" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - :label="$t('globals.to')" - v-model="params.to" - is-outlined - /> + <VnInputDate :label="$t('globals.to')" v-model="params.to" filled /> </QItemSection> </QItem> <QItem> @@ -58,7 +54,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.daysAgo')" v-model="params.daysAgo" - is-outlined + filled :step="0" @update:model-value="(val) => handleDaysAgo(params, val)" @remove="(val) => handleDaysAgo(params, val)" @@ -67,12 +63,7 @@ function handleDaysAgo(params, daysAgo) { </QItem> <QItem> <QItemSection> - <VnSelectSupplier - v-model="params.supplierFk" - dense - outlined - rounded - /> + <VnSelectSupplier v-model="params.supplierFk" dense filled /> </QItemSection> </QItem> <QItem> @@ -80,7 +71,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('supplierRef')" v-model="params.supplierRef" - is-outlined + filled lazy-rules /> </QItemSection> @@ -90,7 +81,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('fi')" v-model="params.fi" - is-outlined + filled lazy-rules /> </QItemSection> @@ -100,7 +91,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('serial')" v-model="params.serial" - is-outlined + filled lazy-rules /> </QItemSection> @@ -110,7 +101,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('account')" v-model="params.account" - is-outlined + filled lazy-rules /> </QItemSection> @@ -120,7 +111,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('globals.params.awbCode')" v-model="params.awbCode" - is-outlined + filled lazy-rules /> </QItemSection> @@ -130,7 +121,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.amount')" v-model="params.amount" - is-outlined + filled /> </QItemSection> </QItem> @@ -142,7 +133,7 @@ function handleDaysAgo(params, daysAgo) { url="Companies" option-label="code" :fields="['id', 'code']" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue index 19ed73e50..66b7fa433 100644 --- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue +++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue @@ -25,8 +25,7 @@ const { t } = useI18n(); <VnInputNumber v-model="params.daysAgo" :label="t('params.daysAgo')" - outlined - rounded + filled dense /> </QItemSection> @@ -36,8 +35,7 @@ const { t } = useI18n(); <VnInput v-model="params.serial" :label="t('params.serial')" - outlined - rounded + filled dense /> </QItemSection> diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue index 2402c0bf6..b93b8c8b7 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue'; @@ -34,7 +34,7 @@ function ticketFilter(invoice) { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`InvoiceOuts/${entityId}`" :filter="filter" @@ -93,5 +93,5 @@ function ticketFilter(invoice) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index 99524e0d6..93a343565 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -33,17 +33,13 @@ const states = ref(); <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.fi" - :label="t('globals.params.fi')" - is-outlined - /> + <VnInput v-model="params.fi" :label="t('globals.params.fi')" filled /> </QItemSection> </QItem> <QItem> @@ -51,7 +47,7 @@ const states = ref(); <VnInputNumber :label="t('globals.amount')" v-model="params.amount" - is-outlined + filled data-cy="InvoiceOutFilterAmountBtn" /> </QItemSection> @@ -62,8 +58,7 @@ const states = ref(); :label="t('invoiceOut.params.min')" dense lazy-rules - outlined - rounded + filled type="number" v-model.number="params.min" /> @@ -73,8 +68,7 @@ const states = ref(); :label="t('invoiceOut.params.max')" dense lazy-rules - outlined - rounded + filled type="number" v-model.number="params.max" /> @@ -94,7 +88,7 @@ const states = ref(); <VnInputDate v-model="params.created" :label="t('invoiceOut.params.created')" - is-outlined + filled /> </QItemSection> </QItem> @@ -103,15 +97,14 @@ const states = ref(); <VnInputDate v-model="params.dued" :label="t('invoiceOut.params.dued')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue index 392256473..53433c56b 100644 --- a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue +++ b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue @@ -26,7 +26,7 @@ const serialTypesOptions = ref([]); const handleInvoiceOutSerialsFetch = (data) => { serialTypesOptions.value = Array.from( - new Set(data.map((item) => item.type).filter((type) => type)) + new Set(data.map((item) => item.type).filter((type) => type)), ); }; @@ -99,8 +99,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalClientSelect" > <template #option="scope"> @@ -124,19 +123,18 @@ onMounted(async () => { option-label="type" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalSerialSelect" /> <VnInputDate v-model="formData.invoiceDate" :label="t('invoiceDate')" - is-outlined + filled /> <VnInputDate v-model="formData.maxShipped" :label="t('maxShipped')" - is-outlined + filled data-cy="InvoiceOutGlobalMaxShippedDate" /> <VnSelect @@ -145,8 +143,7 @@ onMounted(async () => { :options="companiesOptions" option-label="code" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalCompanySelect" /> <VnSelect @@ -154,8 +151,7 @@ onMounted(async () => { v-model="formData.printer" :options="printersOptions" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalPrinterSelect" /> </div> @@ -166,7 +162,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense /> <QBtn @@ -175,7 +171,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense @click="getStatus = 'stopping'" /> diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index b24c8b247..1e2f80ec2 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -35,17 +35,13 @@ const props = defineProps({ <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('globals.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('globals.to')" filled /> </QItemSection> </QItem> <QItem> @@ -57,8 +53,7 @@ const props = defineProps({ option-label="code" option-value="code" dense - outlined - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -84,9 +79,8 @@ const props = defineProps({ v-model="params.country" option-label="name" option-value="name" - outlined dense - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -110,9 +104,8 @@ const props = defineProps({ url="Clients" :label="t('globals.client')" v-model="params.clientId" - outlined dense - rounded + filled @update:model-value="searchFn()" /> </QItemSection> @@ -122,7 +115,7 @@ const props = defineProps({ <VnInputNumber v-model="params.amount" :label="t('globals.amount')" - is-outlined + filled :positive="false" /> </QItemSection> @@ -130,9 +123,8 @@ const props = defineProps({ <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index 84e07a293..09f63a3b1 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue'; @@ -90,7 +90,7 @@ const updateStock = async () => { </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Item" :summary="$props.summary" :url="`Items/${entityId}/getCard`" @@ -162,7 +162,7 @@ const updateStock = async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue index 8d92e245d..d68b966c6 100644 --- a/src/pages/Item/ItemFixedPriceFilter.vue +++ b/src/pages/Item/ItemFixedPriceFilter.vue @@ -13,7 +13,6 @@ const props = defineProps({ required: true, }, }); - </script> <template> @@ -28,8 +27,7 @@ const props = defineProps({ :fields="['id', 'nickname']" option-label="nickname" dense - outlined - rounded + filled use-input @update:model-value="searchFn()" sort-by="nickname ASC" @@ -46,8 +44,7 @@ const props = defineProps({ :label="t('params.warehouseFk')" v-model="params.warehouseFk" dense - outlined - rounded + filled use-input @update:model-value="searchFn()" /> @@ -58,7 +55,7 @@ const props = defineProps({ <VnInputDate :label="t('params.started')" v-model="params.started" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> @@ -68,7 +65,7 @@ const props = defineProps({ <VnInputDate :label="t('params.ended')" v-model="params.ended" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index 22e948e06..f4500d5fa 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -177,11 +177,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -197,8 +193,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -213,8 +208,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -240,8 +234,7 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -252,8 +245,7 @@ onMounted(async () => { @update:model-value="searchFn()" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -282,8 +274,7 @@ onMounted(async () => { :options="tagOptions" option-label="name" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -299,8 +290,7 @@ onMounted(async () => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!tag" @@ -312,7 +302,7 @@ onMounted(async () => { v-model="tag.value" :label="t('params.value')" :disable="!tag" - is-outlined + filled :is-clearable="false" @keydown.enter.prevent="applyTags(params, searchFn)" /> @@ -351,8 +341,7 @@ onMounted(async () => { option-label="label" option-value="label" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -377,7 +366,7 @@ onMounted(async () => { v-model="fieldFilter.value" :label="t('params.value')" :disable="!fieldFilter.selectedField" - is-outlined + filled @keydown.enter="applyFieldFilters(params, searchFn)" /> </QItemSection> diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue index a29203df3..68f36c566 100644 --- a/src/pages/Item/ItemRequestFilter.vue +++ b/src/pages/Item/ItemRequestFilter.vue @@ -87,11 +87,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -99,7 +95,7 @@ onMounted(async () => { <VnInput v-model="params.ticketFk" :label="t('params.ticketFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -114,8 +110,7 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -124,7 +119,7 @@ onMounted(async () => { <VnInput v-model="params.clientFk" :label="t('params.clientFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -139,8 +134,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -153,25 +147,16 @@ onMounted(async () => { :params="{ departmentCodes: ['VT'] }" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('params.from')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('params.from')" filled /> </QItemSection> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('params.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('params.to')" filled /> </QItemSection> </QItem> <QItem> @@ -180,7 +165,7 @@ onMounted(async () => { :label="t('params.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -195,8 +180,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue index 972f4cad9..106b005bf 100644 --- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue +++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import filter from './ItemTypeFilter.js'; @@ -25,7 +25,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`ItemTypes/${entityId}`" :filter="filter" title="code" @@ -46,5 +46,5 @@ const entityId = computed(() => { :value="entity.category?.name" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 447dd35b8..535906e17 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -77,7 +77,7 @@ const getLocale = (label) => { <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -86,7 +86,7 @@ const getLocale = (label) => { <VnInput :label="t('params.orderFk')" v-model="params.orderFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -95,7 +95,7 @@ const getLocale = (label) => { <VnInputNumber :label="t('params.scopeDays')" v-model="params.scopeDays" - is-outlined + filled @update:model-value="(val) => handleScopeDays(params, val)" @remove="(val) => handleScopeDays(params, val)" /> @@ -106,66 +106,54 @@ const getLocale = (label) => { <VnInput :label="t('params.nickname')" v-model="params.nickname" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" - option-value="id" - option-label="name" url="Departments" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('params.refFk')" - v-model="params.refFk" - is-outlined - /> + <VnInput :label="t('params.refFk')" v-model="params.refFk" filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('params.agencyModeFk')" v-model="params.agencyModeFk" url="AgencyModes/isActive" - is-outlined /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.stateFk')" v-model="params.stateFk" url="States" - is-outlined /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('params.groupedStates')" v-model="params.alertLevel" :options="groupedStates" @@ -176,9 +164,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.warehouseFk')" v-model="params.warehouseFk" :options="warehouses" @@ -188,9 +175,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.countryFk')" v-model="params.countryFk" url="Countries" @@ -200,9 +186,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.provinceFk')" v-model="params.provinceFk" url="Provinces" @@ -212,9 +197,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.department" option-label="name" @@ -226,9 +210,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.packing')" v-model="params.packing" url="ItemPackingTypes" diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index d1bd48c9e..10273a254 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -57,9 +57,8 @@ const getSelectedTagValues = async (tag) => { option-value="id" option-label="name" dense - outlined class="q-mb-md" - rounded + filled :emit-value="false" use-input @update:model-value="getSelectedTagValues" @@ -79,8 +78,7 @@ const getSelectedTagValues = async (tag) => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!value || !selectedTag" @@ -92,16 +90,14 @@ const getSelectedTagValues = async (tag) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined class="col" data-cy="catalogFilterValueDialogValueInput" /> <QBtn icon="delete" size="md" - outlined dense - rounded + filled flat class="filter-icon col-2" @click="tagValues.splice(index, 1)" diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue index 7dab307a0..11dbbe532 100644 --- a/src/pages/Order/Card/OrderCard.vue +++ b/src/pages/Order/Card/OrderCard.vue @@ -6,9 +6,11 @@ import filter from './OrderFilter.js'; <template> <VnCard - data-key="Order" + :data-key="$attrs['data-key'] ?? 'Order'" url="Orders" :filter="filter" :descriptor="OrderDescriptor" + v-bind="$attrs" + v-on="$attrs" /> </template> diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index d16a92017..cb380c48f 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -221,8 +221,7 @@ function addOrder(value, field, params) { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value use-input sort-by="name ASC" @@ -251,8 +250,7 @@ function addOrder(value, field, params) { v-model="orderBySelected" :options="orderByList" dense - outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'field', params)" /> </QItemSection> @@ -264,8 +262,7 @@ function addOrder(value, field, params) { v-model="orderWaySelected" :options="orderWayList" dense - outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'way', params)" /> </QItemSection> @@ -275,8 +272,7 @@ function addOrder(value, field, params) { <VnInput :label="t('components.itemsFilterPanel.value')" dense - outlined - rounded + filled :is-clearable="false" v-model="searchByTag" @keyup.enter="(val) => onSearchByTag(val, params)" diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue index f34549c1e..ee66bb57e 100644 --- a/src/pages/Order/Card/OrderDescriptor.vue +++ b/src/pages/Order/Card/OrderDescriptor.vue @@ -4,10 +4,10 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { toCurrency, toDate } from 'src/filters'; import { useState } from 'src/composables/useState'; -import filter from './OrderFilter.js'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'components/FetchData.vue'; +import OrderCard from './OrderCard.vue'; +import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; const DEFAULT_ITEMS = 0; @@ -24,11 +24,14 @@ const route = useRoute(); const state = useState(); const { t } = useI18n(); const getTotalRef = ref(); +const total = ref(0); const entityId = computed(() => { return $props.id || route.params.id; }); +const orderTotal = computed(() => state.get('orderTotal') ?? 0); + const setData = (entity) => { if (!entity) return; getTotalRef.value && getTotalRef.value.fetch(); @@ -38,9 +41,6 @@ const setData = (entity) => { const getConfirmationValue = (isConfirmed) => { return t(isConfirmed ? 'globals.confirmed' : 'order.summary.notConfirmed'); }; - -const orderTotal = computed(() => state.get('orderTotal') ?? 0); -const total = ref(0); </script> <template> @@ -54,12 +54,12 @@ const total = ref(0); " /> <CardDescriptor - ref="descriptor" - :url="`Orders/${entityId}`" - :filter="filter" + v-bind="$attrs" + :id="entityId" + :card="OrderCard" title="client.name" @on-fetch="setData" - data-key="Order" + module="Order" > <template #body="{ entity }"> <VnLv diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue index 04ebb054a..1dff1b620 100644 --- a/src/pages/Order/Card/OrderDescriptorProxy.vue +++ b/src/pages/Order/Card/OrderDescriptorProxy.vue @@ -12,6 +12,11 @@ const $props = defineProps({ <template> <QPopupProxy> - <OrderDescriptor v-if="$props.id" :id="$props.id" :summary="OrderSummary" /> + <OrderDescriptor + v-if="$props.id" + :id="$props.id" + :summary="OrderSummary" + data-key="OrderDescriptor" + /> </QPopupProxy> </template> diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue index 42578423f..609a1215a 100644 --- a/src/pages/Order/Card/OrderFilter.vue +++ b/src/pages/Order/Card/OrderFilter.vue @@ -49,8 +49,7 @@ const sourceList = ref([]); v-model="params.clientFk" lazy-rules dense - outlined - rounded + filled /> <VnSelect :label="t('agency')" @@ -58,13 +57,11 @@ const sourceList = ref([]); :options="agencyList" :input-debounce="0" dense - outlined - rounded + filled /> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -75,21 +72,14 @@ const sourceList = ref([]); v-model="params.from" :label="t('fromLanded')" dense - outlined - rounded - /> - <VnInputDate - v-model="params.to" - :label="t('toLanded')" - dense - outlined - rounded + filled /> + <VnInputDate v-model="params.to" :label="t('toLanded')" dense filled /> <VnInput :label="t('orderId')" v-model="params.orderFk" lazy-rules - is-outlined + filled /> <VnSelect :label="t('application')" @@ -98,8 +88,7 @@ const sourceList = ref([]); option-label="value" option-value="value" dense - outlined - rounded + filled :input-debounce="0" /> <QCheckbox diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue index 46aa44be9..64b33cc06 100644 --- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue +++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue @@ -3,7 +3,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; const props = defineProps({ @@ -21,7 +21,7 @@ const { store } = useArrayData(); const card = computed(() => store.data); </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Agency" :url="`Agencies/${entityId}`" :title="card?.name" @@ -31,5 +31,5 @@ const card = computed(() => store.data); <template #body="{ entity: agency }"> <VnLv :label="t('globals.name')" :value="agency.name" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue index f70f60e1c..fe631a0be 100644 --- a/src/pages/Route/Card/RouteAutonomousFilter.vue +++ b/src/pages/Route/Card/RouteAutonomousFilter.vue @@ -71,7 +71,7 @@ const exprBuilder = (param, value) => { <QList dense> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.routeFk" :label="t('ID')" is-outlined /> + <VnInput v-model="params.routeFk" :label="t('ID')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm" v-if="agencyList"> @@ -83,8 +83,7 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -102,8 +101,7 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -123,8 +121,7 @@ const exprBuilder = (param, value) => { option-value="name" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -135,20 +132,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.dated" - :label="t('Date')" - is-outlined - /> + <VnInputDate v-model="params.dated" :label="t('Date')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('From')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -156,7 +145,7 @@ const exprBuilder = (param, value) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled is-clearable /> </QItemSection> @@ -166,23 +155,23 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.packages" :label="t('Packages')" - is-outlined + filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" :label="t('m3')" is-outlined /> + <VnInput v-model="params.m3" :label="t('m3')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.kmTotal" :label="t('Km')" is-outlined /> + <VnInput v-model="params.kmTotal" :label="t('Km')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.price" :label="t('Price')" is-outlined /> + <VnInput v-model="params.price" :label="t('Price')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -190,7 +179,7 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.invoiceInFk" :label="t('Received')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index c57e51473..ee42d8e76 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import useCardDescription from 'composables/useCardDescription'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDate } from 'src/filters'; @@ -41,13 +41,12 @@ const getZone = async () => { zone.value = zoneData.name; }; const data = ref(useCardDescription()); -const setData = (entity) => (data.value = useCardDescription(entity.code, entity.id)); onMounted(async () => { getZone(); }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Routes/${entityId}`" :filter="filter" :title="null" @@ -69,7 +68,7 @@ onMounted(async () => { <template #menu="{ entity }"> <RouteDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue index cb5158517..f830b83e2 100644 --- a/src/pages/Route/Card/RouteFilter.vue +++ b/src/pages/Route/Card/RouteFilter.vue @@ -36,8 +36,7 @@ const emit = defineEmits(['search']); :label="t('globals.worker')" v-model="params.workerFk" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -52,8 +51,7 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -63,7 +61,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -74,7 +72,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.to" :label="t('globals.to')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -86,7 +84,7 @@ const emit = defineEmits(['search']); v-model="params.scopeDays" type="number" :label="t('globals.daysOnward')" - is-outlined + filled clearable :disable="Boolean(params.from || params.to)" @update:model-value=" @@ -107,15 +105,14 @@ const emit = defineEmits(['search']); option-label="numberPlate" option-filter-value="numberPlate" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" label="m³" is-outlined clearable /> + <VnInput v-model="params.m3" label="m³" filled clearable /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -127,8 +124,7 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -138,7 +134,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.description" :label="t('globals.description')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue index bc9230eda..dfa692feb 100644 --- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue +++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDateHourMin } from 'src/filters'; import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue'; @@ -30,7 +30,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Roadmaps/${entityId}`" :filter="filter" data-key="Roadmap" @@ -52,7 +52,7 @@ const entityId = computed(() => { <template #menu="{ entity }"> <RoadmapDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 982f1efba..9acbfb740 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -31,12 +31,12 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -44,7 +44,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.tractorPlate" :label="t('Tractor Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -54,7 +54,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.trailerPlate" :label="t('Trailer Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -66,8 +66,7 @@ const emit = defineEmits(['search']); :fields="['id', 'nickname']" v-model="params.supplierFk" dense - outlined - rounded + filled emit-value map-options use-input @@ -81,7 +80,7 @@ const emit = defineEmits(['search']); v-model="params.price" :label="t('Price')" type="number" - is-outlined + filled clearable /> </QItemSection> @@ -91,7 +90,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.driverName" :label="t('Driver name')" - is-outlined + filled clearable /> </QItemSection> @@ -101,7 +100,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.phone" :label="t('Phone')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue index 10c9fa9e2..bab7fa998 100644 --- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue +++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -20,7 +20,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Vehicles/${entityId}`" data-key="Vehicle" title="numberPlate" @@ -54,7 +54,7 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('globals.model')" :value="entity.model" /> <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue index 5e618aa7f..2405467da 100644 --- a/src/pages/Shelving/Card/ShelvingDescriptor.vue +++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import ShelvingDescriptorMenu from 'pages/Shelving/Card/ShelvingDescriptorMenu.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; @@ -24,7 +24,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Shelvings/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { <template #menu="{ entity }"> <ShelvingDescriptorMenu :shelving="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue index 88d716046..35657a972 100644 --- a/src/pages/Shelving/Card/ShelvingFilter.vue +++ b/src/pages/Shelving/Card/ShelvingFilter.vue @@ -39,15 +39,14 @@ const emit = defineEmits(['search']); option-label="code" :filter-options="['id', 'code']" dense - outlined - rounded + filled sort-by="code ASC" /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnSelectWorker v-model="params.userFk" outlined rounded /> + <VnSelectWorker v-model="params.userFk" filled /> </QItemSection> </QItem> <QItem class="q-mb-md"> diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue index 07b168f87..0e01238a0 100644 --- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import filter from './ParkingFilter.js'; const props = defineProps({ @@ -16,7 +16,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Parking" :url="`Parkings/${entityId}`" title="code" @@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" /> <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue index 1d7c3a4b6..59cb49459 100644 --- a/src/pages/Shelving/Parking/ParkingFilter.vue +++ b/src/pages/Shelving/Parking/ParkingFilter.vue @@ -36,11 +36,7 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem> <QItemSection> - <VnInput - :label="t('params.code')" - v-model="params.code" - is-outlined - /> + <VnInput :label="t('params.code')" v-model="params.code" filled /> </QItemSection> </QItem> <QItem> @@ -51,8 +47,7 @@ const emit = defineEmits(['search']); option-label="description" :label="t('params.sectorFk')" dense - outlined - rounded + filled :options="sectors" use-input input-debounce="0" diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue index c4b63d9c8..c727688ad 100644 --- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue +++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue @@ -33,7 +33,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -47,8 +47,7 @@ defineProps({ :include="{ relation: 'accountingType' }" sort-by="id" dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -74,8 +73,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue index 390f7d9ff..e21e37eb3 100644 --- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue +++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue @@ -25,20 +25,12 @@ defineProps({ <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.itemId" - :label="t('params.itemId')" - is-outlined - /> + <VnInput v-model="params.itemId" :label="t('params.itemId')" filled /> </QItemSection> </QItem> <QItem> @@ -54,8 +46,7 @@ defineProps({ option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -73,8 +64,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -102,8 +92,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -113,7 +102,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -123,7 +112,7 @@ defineProps({ :label="t('params.to')" v-model="params.to" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue index 462bdf853..2863784ab 100644 --- a/src/pages/Supplier/Card/SupplierDescriptor.vue +++ b/src/pages/Supplier/Card/SupplierDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateString } from 'src/filters'; @@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Suppliers/${entityId}`" :filter="filter" data-key="Supplier" @@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue index 743f2188c..96920231c 100644 --- a/src/pages/Ticket/Card/TicketDescriptor.vue +++ b/src/pages/Ticket/Card/TicketDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import TicketDescriptorMenu from './TicketDescriptorMenu.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateTimeFormat } from 'src/filters/date'; @@ -57,7 +57,7 @@ function getInfo() { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Tickets/${entityId}`" :filter="filter" data-key="Ticket" @@ -155,7 +155,7 @@ function getInfo() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index 3762f453d..73d53b247 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -81,7 +81,7 @@ const setUserParams = (params) => { v-model="params.days" :label="t('negative.days')" dense - is-outlined + filled type="number" @update:model-value=" (value) => { @@ -97,7 +97,7 @@ const setUserParams = (params) => { v-model="params.id" :label="t('negative.id')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -107,7 +107,7 @@ const setUserParams = (params) => { v-model="params.producer" :label="t('negative.producer')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -117,7 +117,7 @@ const setUserParams = (params) => { v-model="params.origen" :label="t('negative.origen')" dense - is-outlined + filled /> </QItemSection> </QItem ><QItem> @@ -133,8 +133,7 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection ><QItemSection v-else> <QSkeleton class="full-width" type="QSelect" /> @@ -151,8 +150,7 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue index 6d5c7726e..f065eaf2e 100644 --- a/src/pages/Ticket/TicketAdvanceFilter.vue +++ b/src/pages/Ticket/TicketAdvanceFilter.vue @@ -71,7 +71,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateFuture" :label="t('params.dateFuture')" - is-outlined + filled /> </QItemSection> </QItem> @@ -80,7 +80,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateToAdvance" :label="t('params.dateToAdvance')" - is-outlined + filled /> </QItemSection> </QItem> @@ -95,8 +95,7 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled :use-like="false" > </VnSelect> @@ -113,8 +112,7 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled :use-like="false" > </VnSelect> @@ -125,7 +123,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputNumber v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> @@ -147,8 +145,7 @@ onMounted(async () => await getItemPackingTypes()); url="Departments" :fields="['id', 'name']" dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -162,8 +159,7 @@ onMounted(async () => await getItemPackingTypes()); option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue index f959157f6..b763ef970 100644 --- a/src/pages/Ticket/TicketFilter.vue +++ b/src/pages/Ticket/TicketFilter.vue @@ -63,18 +63,10 @@ const getGroupedStates = (data) => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.clientFk" - :label="t('Customer ID')" - is-outlined - /> + <VnInput v-model="params.clientFk" :label="t('Customer ID')" filled /> </QItemSection> <QItemSection> - <VnInput - v-model="params.orderFk" - :label="t('Order ID')" - is-outlined - /> + <VnInput v-model="params.orderFk" :label="t('Order ID')" filled /> </QItemSection> </QItem> <QItem> @@ -82,7 +74,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.from" :label="t('From')" - is-outlined + filled data-cy="From_date" /> </QItemSection> @@ -90,7 +82,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled data-cy="To_date" /> </QItemSection> @@ -98,9 +90,8 @@ const getGroupedStates = (data) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -125,8 +116,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -146,19 +136,14 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled sort-by="name ASC" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.refFk" - :label="t('Invoice Ref.')" - is-outlined - /> + <VnInput v-model="params.refFk" :label="t('Invoice Ref.')" filled /> </QItemSection> </QItem> <QItem> @@ -166,17 +151,13 @@ const getGroupedStates = (data) => { <VnInput v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.nickname" - :label="t('Nickname')" - is-outlined - /> + <VnInput v-model="params.nickname" :label="t('Nickname')" filled /> </QItemSection> </QItem> <QItem> @@ -241,8 +222,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -260,8 +240,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -281,8 +260,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -291,7 +269,7 @@ const getGroupedStates = (data) => { <VnInput v-model="params.collectionFk" :label="t('Collection')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue index 64e060a39..033b47f72 100644 --- a/src/pages/Ticket/TicketFutureFilter.vue +++ b/src/pages/Ticket/TicketFutureFilter.vue @@ -73,7 +73,7 @@ onMounted(async () => { <VnInputDate v-model="params.originScopeDays" :label="t('params.originScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -82,7 +82,7 @@ onMounted(async () => { <VnInputDate v-model="params.futureScopeDays" :label="t('params.futureScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -91,7 +91,7 @@ onMounted(async () => { <VnInput :label="t('params.litersMax')" v-model="params.litersMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -100,7 +100,7 @@ onMounted(async () => { <VnInput :label="t('params.linesMax')" v-model="params.linesMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -115,8 +115,7 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -132,8 +131,7 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -148,8 +146,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -164,8 +161,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -191,8 +187,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index 922f89f33..d4903f794 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import useCardDescription from 'src/composables/useCardDescription'; import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue'; @@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Travels/${entityId}`" :title="data.title" :subtitle="data.subtitle" @@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue index ae6e695be..76ffdba20 100644 --- a/src/pages/Travel/ExtraCommunityFilter.vue +++ b/src/pages/Travel/ExtraCommunityFilter.vue @@ -87,7 +87,7 @@ warehouses(); <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput label="id" v-model="params.id" is-outlined /> + <VnInput label="id" v-model="params.id" filled /> </QItemSection> </QItem> <QItem> @@ -95,7 +95,7 @@ warehouses(); <VnInput :label="t('extraCommunity.filter.reference')" v-model="params.reference" - is-outlined + filled /> </QItemSection> </QItem> @@ -106,8 +106,7 @@ warehouses(); type="number" :label="t('extraCommunity.filter.totalEntries')" dense - outlined - rounded + filled min="0" class="input-number" > @@ -141,8 +140,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -152,7 +150,7 @@ warehouses(); :label="t('extraCommunity.filter.shippedFrom')" v-model="params.shippedFrom" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -162,7 +160,7 @@ warehouses(); :label="t('extraCommunity.filter.landedTo')" v-model="params.landedTo" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -176,8 +174,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -191,8 +188,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -206,8 +202,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -218,8 +213,7 @@ warehouses(); v-model="params.cargoSupplierFk" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -229,8 +223,7 @@ warehouses(); v-model="params.entrySupplierFk" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -245,8 +238,7 @@ warehouses(); :filter-options="['code', 'name']" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue index 4a9c80952..a26cc0ec0 100644 --- a/src/pages/Travel/TravelFilter.vue +++ b/src/pages/Travel/TravelFilter.vue @@ -33,19 +33,14 @@ defineExpose({ states }); </template> <template #body="{ params, searchFn }"> <div class="q-pa-sm q-gutter-y-sm"> - <VnInput - :label="t('travel.Id')" - v-model="params.id" - lazy-rules - is-outlined - > + <VnInput :label="t('travel.Id')" v-model="params.id" lazy-rules filled> <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> <VnInput :label="t('travel.ref')" v-model="params.ref" lazy-rules - is-outlined + filled /> <VnSelect :label="t('travel.agency')" @@ -56,8 +51,7 @@ defineExpose({ states }); :use-like="false" option-filter="name" dense - outlined - rounded + filled /> <VnSelect :label="t('travel.warehouseInFk')" @@ -69,22 +63,19 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined - rounded + filled /> <VnInputDate :label="t('travel.shipped')" v-model="params.shipped" @update:model-value="searchFn()" - outlined - rounded + filled /> <VnInputTime v-model="params.shipmentHour" @update:model-value="searchFn()" :label="t('travel.shipmentHour')" - outlined - rounded + filled dense /> <VnSelect @@ -97,36 +88,33 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined - rounded + filled /> <VnInputDate :label="t('travel.landed')" v-model="params.landed" @update:model-value="searchFn()" dense - outlined - rounded + filled /> <VnInputTime v-model="params.landingHour" @update:model-value="searchFn()" :label="t('travel.landingHour')" - outlined - rounded + filled dense /> <VnInput :label="t('travel.totalEntries')" v-model="params.totalEntries" lazy-rules - is-outlined + filled /> <VnInput :label="t('travel.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </div> </template> diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue index 48fc4094b..f0e2d758a 100644 --- a/src/pages/Worker/Card/WorkerCalendarFilter.vue +++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue @@ -40,7 +40,7 @@ watch( (newValue) => { checkHolidays(newValue); }, - { deep: true, immediate: true } + { deep: true, immediate: true }, ); const emit = defineEmits(['update:businessFk', 'update:year', 'update:absenceType']); @@ -174,8 +174,7 @@ const yearList = ref(generateYears()); v-model="selectedYear" :options="yearList" dense - outlined - rounded + filled use-input :is-clearable="false" /> @@ -188,8 +187,7 @@ const yearList = ref(generateYears()); option-value="businessFk" option-label="businessFk" dense - outlined - rounded + filled use-input :is-clearable="false" > diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index 910c92fd8..060520e84 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -2,7 +2,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import VnChangePassword from 'src/components/common/VnChangePassword.vue'; @@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => { }; </script> <template> - <CardDescriptor + <EntityDescriptor ref="cardDescriptorRef" :data-key="dataKey" :summary="$props.summary" @@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> <VnChangePassword ref="changePassRef" :submit-fn=" diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index d32941494..001eb368a 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -5,24 +5,25 @@ import { ref, computed } from 'vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; +import { useVnConfirm } from 'composables/useVnConfirm'; +import { useArrayData } from 'src/composables/useArrayData'; +import { downloadDocuware } from 'src/composables/downloadFile'; + import FetchData from 'components/FetchData.vue'; import FormModelPopup from 'src/components/FormModelPopup.vue'; -import { useVnConfirm } from 'composables/useVnConfirm'; - -import VnPaginate from 'src/components/ui/VnPaginate.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; -import VnInput from 'src/components/common/VnInput.vue'; +import VnTable from 'src/components/VnTable/VnTable.vue'; const { t } = useI18n(); const { notify } = useNotify(); - -const paginate = ref(); +const loadingDocuware = ref(true); +const tableRef = ref(); const dialog = ref(); const route = useRoute(); const { openConfirmationModal } = useVnConfirm(); const routeId = computed(() => route.params.id); - +const worker = computed(() => useArrayData('Worker').store.data); const initialData = computed(() => { return { userFk: routeId.value, @@ -31,154 +32,268 @@ const initialData = computed(() => { }; }); -const deallocatePDA = async (deviceProductionFk) => { - await axios.post(`Workers/${route.params.id}/deallocatePDA`, { - pda: deviceProductionFk, - }); - notify(t('PDA deallocated'), 'positive'); - - paginate.value.fetch(); -}; +const columns = computed(() => [ + { + align: 'center', + label: t('globals.state'), + name: 'state', + format: (row) => row?.docuware?.state, + columnFilter: false, + chip: { + condition: (_, row) => !!row.docuware, + color: (row) => (isSigned(row) ? 'bg-positive' : 'bg-warning'), + }, + visible: false, + }, + { + align: 'right', + label: t('worker.pda.currentPDA'), + name: 'deviceProductionFk', + columnClass: 'shrink', + cardVisible: true, + }, + { + align: 'left', + label: t('Model'), + name: 'modelFk', + format: ({ deviceProduction }) => deviceProduction.modelFk, + cardVisible: true, + }, + { + align: 'right', + label: t('Serial number'), + name: 'serialNumber', + format: ({ deviceProduction }) => deviceProduction.serialNumber, + cardVisible: true, + }, + { + align: 'left', + label: t('Current SIM'), + name: 'simFk', + cardVisible: true, + }, + { + align: 'right', + name: 'actions', + columnFilter: false, + cardVisible: true, + }, +]); function reloadData() { initialData.value.deviceProductionFk = null; initialData.value.simFk = null; - paginate.value.fetch(); + tableRef.value.reload(); +} + +async function fetchDocuware() { + loadingDocuware.value = true; + + const id = `${worker.value?.lastName} ${worker.value?.firstName}`; + const rows = tableRef.value.CrudModelRef.formData; + + const promises = rows.map(async (row) => { + const { data } = await axios.post(`Docuwares/${id}/checkFile`, { + fileCabinet: 'hr', + signed: false, + mergeFilter: [ + { + DBName: 'TIPO_DOCUMENTO', + Value: ['PDA'], + }, + { + DBName: 'FILENAME', + Value: [`${row.deviceProductionFk}-pda`], + }, + ], + }); + row.docuware = data; + }); + + await Promise.allSettled(promises); + loadingDocuware.value = false; +} + +async function sendToTablet(rows) { + const promises = rows.map(async (row) => { + await axios.post(`Docuwares/upload-pda-pdf`, { + ids: [row.deviceProductionFk], + }); + row.docuware = true; + }); + await Promise.allSettled(promises); + notify(t('PDF sended to signed'), 'positive'); + tableRef.value.reload(); +} + +async function deallocatePDA(deviceProductionFk) { + await axios.post(`Workers/${route.params.id}/deallocatePDA`, { + pda: deviceProductionFk, + }); + const index = tableRef.value.CrudModelRef.formData.findIndex( + (data) => data?.deviceProductionFk == deviceProductionFk, + ); + delete tableRef.value.CrudModelRef.formData[index]; + notify(t('PDA deallocated'), 'positive'); +} + +function isSigned(row) { + return row.docuware?.state === 'Firmado'; } </script> <template> - <QPage class="column items-center q-pa-md centerCard"> - <FetchData - url="workers/getAvailablePda" - @on-fetch="(data) => (deviceProductions = data)" - auto-load - /> - <VnPaginate - ref="paginate" - data-key="WorkerPda" - url="DeviceProductionUsers" - :user-filter="{ where: { userFk: routeId } }" - order="id" - search-url="pda" - auto-load - > - <template #body="{ rows }"> - <QCard - flat - bordered - :key="row.id" - v-for="row of rows" - class="card q-px-md q-mb-sm container" - > - <VnRow> - <VnInput - :label="t('worker.pda.currentPDA')" - :model-value="row?.deviceProductionFk" - disable - /> - <VnInput - :label="t('Model')" - :model-value="row?.deviceProduction?.modelFk" - disable - /> - <VnInput - :label="t('Serial number')" - :model-value="row?.deviceProduction?.serialNumber" - disable - /> - <VnInput - :label="t('Current SIM')" - :model-value="row?.simFk" - disable - /> - <QBtn - flat - icon="delete" - color="primary" - class="btn-delete" - @click=" - openConfirmationModal( - t(`Remove PDA`), - t('Do you want to remove this PDA?'), - () => deallocatePDA(row.deviceProductionFk), - ) - " - > - <QTooltip> - {{ t('worker.pda.removePDA') }} - </QTooltip> - </QBtn> - </VnRow> - </QCard> - </template> - </VnPaginate> - <QPageSticky :offset="[18, 18]"> + <FetchData + url="workers/getAvailablePda" + @on-fetch="(data) => (deviceProductions = data)" + auto-load + /> + <VnTable + ref="tableRef" + data-key="WorkerPda" + url="DeviceProductionUsers" + :user-filter="{ order: 'id' }" + :filter="{ where: { userFk: routeId } }" + search-url="pda" + auto-load + :columns="columns" + @onFetch="fetchDocuware" + :hasSubToolbar="true" + :default-remove="false" + :default-reset="false" + :default-save="false" + :table="{ + 'row-key': 'deviceProductionFk', + selection: 'multiple', + }" + :table-filter="{ hiddenTags: ['userFk'] }" + > + <template #moreBeforeActions> <QBtn - @click.stop="dialog.show()" + :label="t('globals.refresh')" + icon="refresh" + @click="tableRef.reload()" + /> + <QBtn + :disable="!tableRef?.selected?.length" + :label="t('globals.send')" + icon="install_mobile" + @click="sendToTablet(tableRef?.selected)" + class="bg-primary" + /> + </template> + <template #column-actions="{ row }"> + <QBtn + flat + icon="delete" color="primary" - fab - icon="add" - v-shortcut="'+'" + @click=" + openConfirmationModal( + t(`Remove PDA`), + t('Do you want to remove this PDA?'), + () => deallocatePDA(row.deviceProductionFk), + ) + " + data-cy="workerPda-remove" > - <QDialog ref="dialog"> - <FormModelPopup - :title="t('Add new device')" - url-create="DeviceProductionUsers" - model="DeviceProductionUser" - :form-initial-data="initialData" - @on-data-saved="reloadData()" - > - <template #form-inputs="{ data }"> - <VnRow> - <VnSelect - :label="t('worker.pda.newPDA')" - v-model="data.deviceProductionFk" - :options="deviceProductions" - option-label="id" - option-value="id" - id="deviceProductionFk" - hide-selected - data-cy="pda-dialog-select" - :required="true" - > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - <QItemSection> - <QItemLabel - >ID: {{ scope.opt?.id }}</QItemLabel - > - <QItemLabel caption> - {{ scope.opt?.modelFk }}, - {{ scope.opt?.serialNumber }} - </QItemLabel> - </QItemSection> - </QItem> - </template> - </VnSelect> - <VnInput - v-model="data.simFk" - :label="t('SIM serial number')" - id="simSerialNumber" - use-input - /> - </VnRow> - </template> - </FormModelPopup> - </QDialog> + <QTooltip> + {{ t('worker.pda.removePDA') }} + </QTooltip> </QBtn> - <QTooltip> - {{ t('globals.new') }} - </QTooltip> - </QPageSticky> - </QPage> + <QBtn + v-if="!isSigned(row)" + :loading="loadingDocuware" + icon="install_mobile" + flat + color="primary" + @click=" + openConfirmationModal( + t('Sign PDA'), + t('Are you sure you want to send it?'), + () => sendToTablet([row]), + ) + " + data-cy="workerPda-send" + > + <QTooltip> + {{ t('worker.pda.sendToTablet') }} + </QTooltip> + </QBtn> + <QBtn + v-if="isSigned(row)" + :loading="loadingDocuware" + icon="cloud_download" + flat + color="primary" + @click=" + downloadDocuware('Docuwares/download-pda-pdf', { + file: row.deviceProductionFk + '-pda', + worker: worker?.lastName + ' ' + worker?.firstName, + }) + " + data-cy="workerPda-download" + > + <QTooltip> + {{ t('worker.pda.download') }} + </QTooltip> + </QBtn> + </template> + </VnTable> + <QPageSticky :offset="[18, 18]"> + <QBtn @click.stop="dialog.show()" color="primary" fab icon="add" v-shortcut="'+'"> + <QDialog ref="dialog"> + <FormModelPopup + :title="t('Add new device')" + url-create="DeviceProductionUsers" + model="DeviceProductionUser" + :form-initial-data="initialData" + @on-data-saved="reloadData()" + > + <template #form-inputs="{ data }"> + <VnRow> + <VnSelect + :label="t('PDA')" + v-model="data.deviceProductionFk" + :options="deviceProductions" + option-label="modelFk" + option-value="id" + id="deviceProductionFk" + hide-selected + data-cy="pda-dialog-select" + :required="true" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel + >ID: {{ scope.opt?.id }}</QItemLabel + > + <QItemLabel caption> + {{ scope.opt?.modelFk }}, + {{ scope.opt?.serialNumber }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + <VnSelect + url="Sims" + option-label="line" + option-value="code" + v-model="data.simFk" + :label="t('SIM serial number')" + id="simSerialNumber" + /> + </VnRow> + </template> + </FormModelPopup> + </QDialog> + </QBtn> + <QTooltip> + {{ t('globals.new') }} + </QTooltip> + </QPageSticky> </template> -<style lang="scss" scoped> -.btn-delete { - max-width: 4%; - margin-top: 30px; -} -</style> <i18n> es: Model: Modelo @@ -190,4 +305,6 @@ es: Do you want to remove this PDA?: ¿Desea eliminar este PDA? You can only have one PDA: Solo puedes tener un PDA si no eres autonomo This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario + Are you sure you want to send it?: ¿Seguro que quieres enviarlo? + Sign PDA: Firmar PDA </i18n> diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue index 4b7dfd9b8..820658593 100644 --- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue +++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useVnConfirm } from 'composables/useVnConfirm'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -40,7 +40,7 @@ const removeDepartment = async () => { const { openConfirmationModal } = useVnConfirm(); </script> <template> - <CardDescriptor + <EntityDescriptor ref="DepartmentDescriptorRef" :url="`Departments/${entityId}`" :summary="$props.summary" @@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm(); </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue index 8210ba0e3..44dfd32b4 100644 --- a/src/pages/Worker/WorkerFilter.vue +++ b/src/pages/Worker/WorkerFilter.vue @@ -35,7 +35,7 @@ const getLocale = (label) => { <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined + <VnInput :label="t('FI')" v-model="params.fi" filled ><template #prepend> <QIcon name="badge" size="xs"></QIcon> </template ></VnInput> @@ -43,29 +43,17 @@ const getLocale = (label) => { </QItem> <QItem> <QItemSection> - <VnInput - :label="t('First Name')" - v-model="params.firstName" - is-outlined - /> + <VnInput :label="t('First Name')" v-model="params.firstName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Last Name')" - v-model="params.lastName" - is-outlined - /> + <VnInput :label="t('Last Name')" v-model="params.lastName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('User Name')" - v-model="params.userName" - is-outlined - /> + <VnInput :label="t('User Name')" v-model="params.userName" filled /> </QItemSection> </QItem> <QItem> @@ -79,23 +67,18 @@ const getLocale = (label) => { emit-value map-options dense - outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined /> + <VnInput :label="t('Email')" v-model="params.email" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Extension')" - v-model="params.extension" - is-outlined - /> + <VnInput :label="t('Extension')" v-model="params.extension" filled /> </QItemSection> </QItem> <QItem> diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue index 27676212e..f2bcc1247 100644 --- a/src/pages/Zone/Card/ZoneDescriptor.vue +++ b/src/pages/Zone/Card/ZoneDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toTimeFormat } from 'src/filters/date'; import { toCurrency } from 'filters/index'; @@ -25,7 +25,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> + <EntityDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> <template #menu="{ entity }"> <ZoneDescriptorMenuItems :zone="entity" /> </template> @@ -36,5 +36,5 @@ const entityId = computed(() => { <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" /> <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index a8cb05afc..fc5c04b41 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -95,8 +95,7 @@ watch( :filter-options="['code']" hide-selected dense - outlined - rounded + filled map-key="geoFk" data-cy="ZoneDeliveryDaysPostcodeSelect" > @@ -128,8 +127,7 @@ watch( option-label="name" hide-selected dense - outlined - rounded + filled data-cy="ZoneDeliveryDaysAgencySelect" /> <VnSelect @@ -144,7 +142,6 @@ watch( option-label="name" hide-selected dense - outlined rounded /> </div> diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js index e857457a7..ae0013150 100644 --- a/test/cypress/integration/vnComponent/VnLog.spec.js +++ b/test/cypress/integration/vnComponent/VnLog.spec.js @@ -25,7 +25,7 @@ describe('VnLog', () => { it('should show claimDescriptor', () => { cy.dataCy('iconLaunch-claimFk').first().click(); - cy.dataCy('cardDescriptor_subtitle').contains('1'); + cy.dataCy('vnDescriptor_subtitle').contains('1'); cy.dataCy('iconLaunch-claimFk').first().click(); }); }); diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index 31ec19eda..2623e81cf 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -1,23 +1,80 @@ describe('WorkerPda', () => { - const select = '[data-cy="pda-dialog-select"]'; + const deviceId = 4; beforeEach(() => { - cy.viewport(1920, 1080); cy.login('developer'); cy.visit(`/#/worker/1110/pda`); }); - it('assign pda', () => { - cy.addBtnClick(); - cy.get(select).click(); - cy.get(select).type('{downArrow}{enter}'); - cy.get('.q-notification__message').should('have.text', 'Data created'); + it('assign and delete pda', () => { + creatNewPDA(); + cy.checkNotification('Data created'); + cy.visit(`/#/worker/1110/pda`); + removeNewPDA(); + cy.checkNotification('PDA deallocated'); }); - it('delete pda', () => { - cy.get('.btn-delete').click(); - cy.get( - '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block' - ).click(); - cy.get('.q-notification__message').should('have.text', 'PDA deallocated'); + it('send and download pdf to docuware', () => { + //Send + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + + cy.dataCy('workerPda-send').click(); + cy.clickConfirm(); + cy.checkNotification('PDF sended to signed'); + + //Download + cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => { + req.reply({ + statusCode: 200, + body: { + id: deviceId, + state: 'Firmado', + }, + }); + }); + cy.get('#st-actions').contains('refresh').click(); + cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + cy.dataCy('workerPda-download').click(); + removeNewPDA(); }); + + it('send 2 pdfs to docuware', () => { + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + creatNewPDA(2); + cy.selectRows([1, 2]); + cy.get('#st-actions').contains('Send').click(); + cy.checkNotification('PDF sended to signed'); + + removeNewPDA(); + }); + + function creatNewPDA(id = deviceId) { + cy.addBtnClick(); + cy.selectOption('[data-cy="pda-dialog-select"]', id); + cy.saveCard(); + } + + function removeNewPDA() { + cy.dataCy('workerPda-remove').first().click(); + cy.clickConfirm(); + } }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index de25959b2..fe8d38e79 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -371,7 +371,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { }); Cypress.Commands.add('openActionsDescriptor', () => { - cy.get('[data-cy="cardDescriptor"] [data-cy="descriptor-more-opts"]').click(); + cy.get('[data-cy="vnDescriptor"] [data-cy="descriptor-more-opts"]').click(); }); Cypress.Commands.add('openUserPanel', () => { @@ -466,16 +466,16 @@ Cypress.Commands.add('validateDescriptor', (toCheck = {}) => { const popupSelector = popup ? '[role="menu"] ' : ''; - if (title) cy.get(`${popupSelector}[data-cy="cardDescriptor_title"]`).contains(title); + if (title) cy.get(`${popupSelector}[data-cy="vnDescriptor_title"]`).contains(title); if (description) - cy.get(`${popupSelector}[data-cy="cardDescriptor_description"]`).contains( + cy.get(`${popupSelector}[data-cy="vnDescriptor_description"]`).contains( description, ); if (subtitle) - cy.get(`${popupSelector}[data-cy="cardDescriptor_subtitle"]`).contains(subtitle); + cy.get(`${popupSelector}[data-cy="vnDescriptor_subtitle"]`).contains(subtitle); for (const index in listbox) - cy.get(`${popupSelector}[data-cy="cardDescriptor_listbox"] > *`) + cy.get(`${popupSelector}[data-cy="vnDescriptor_listbox"] > *`) .eq(index) .should('contain.text', listbox[index]); }); From 88c61c8a856b79bd289efaaa022ead0b26f1334c Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 24 Mar 2025 14:27:18 +0100 Subject: [PATCH 44/44] fix: warmFix quasar build async function --- src/composables/downloadFile.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js index 302836e09..0c4e8edb6 100644 --- a/src/composables/downloadFile.js +++ b/src/composables/downloadFile.js @@ -5,18 +5,19 @@ import { exportFile } from 'quasar'; const { getTokenMultimedia } = useSession(); const token = getTokenMultimedia(); -const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) { + const appUrl = await getAppUrl(); const response = await axios.get( url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`, - { responseType: 'blob' } + { responseType: 'blob' }, ); download(response); } export async function downloadDocuware(url, params) { + const appUrl = await getAppUrl(); const response = await axios.get(`${appUrl}/api/` + url, { responseType: 'blob', params, @@ -32,3 +33,7 @@ function download(response) { exportFile(filename, response.data); } + +async function getAppUrl() { + return (await getUrl('', 'lilium')).replace('/#/', ''); +}