From dd0917a57daa6404570965dfb61ae3b06dd57cbd Mon Sep 17 00:00:00 2001 From: provira <provira@verdnatura.es> Date: Fri, 3 Jan 2025 07:37:47 +0100 Subject: [PATCH 01/18] refactor: refs #8322 changed Wagon component to use VnSection/VnCardBeta --- src/pages/Wagon/Card/WagonCard.vue | 4 +- src/pages/Wagon/WagonList.vue | 161 ++++++++++++++++------------- src/router/modules/wagon.js | 47 ++++++--- 3 files changed, 123 insertions(+), 89 deletions(-) diff --git a/src/pages/Wagon/Card/WagonCard.vue b/src/pages/Wagon/Card/WagonCard.vue index ed6c83778..8dadca85c 100644 --- a/src/pages/Wagon/Card/WagonCard.vue +++ b/src/pages/Wagon/Card/WagonCard.vue @@ -1,6 +1,6 @@ <script setup> -import VnCard from 'components/common/VnCard.vue'; +import VnCardBeta from 'src/components/common/VnCardBeta.vue'; </script> <template> - <VnCard data-key="Wagon" base-url="Wagons" /> + <VnCardBeta data-key="Wagon" base-url="Wagons" :descriptor="WagonDescriptor" /> </template> diff --git a/src/pages/Wagon/WagonList.vue b/src/pages/Wagon/WagonList.vue index f306c4c8d..9ee68bcf0 100644 --- a/src/pages/Wagon/WagonList.vue +++ b/src/pages/Wagon/WagonList.vue @@ -8,6 +8,7 @@ import VnTable from 'src/components/VnTable/VnTable.vue'; import { computed, ref } from 'vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; +import VnSection from 'src/components/common/VnSection.vue'; const quasar = useQuasar(); const arrayData = useArrayData('WagonList'); @@ -15,6 +16,7 @@ const store = arrayData.store; const router = useRouter(); const { t } = useI18n(); const tableRef = ref(); +const dataKey = 'WagonList'; const filter = { include: { relation: 'type', @@ -92,79 +94,90 @@ async function remove(row) { <template> <QPage class="column items-center q-pa-md"> - <VnTable - ref="tableRef" - data-key="WagonList" - url="Wagons" - :filter="filter" - :columns="columns" - order="id DESC" - :column-search="false" - :default-mode="'card'" - :disable-option="{ table: true }" - :create="{ - urlCreate: 'Wagons', - title: t('Create new wagon'), - onDataSaved: () => tableRef.reload(), - formInitialData: {}, - }" - > - <template #more-create-dialog="{ data }"> - <VnInput - filled - v-model="data.label" - :label="t('wagon.create.label')" - type="number" - min="0" - :rules="[(val) => !!val || t('wagon.warnings.labelNotEmpty')]" - /> - <VnInput - filled - v-model="data.plate" - :label="t('wagon.list.plate')" - :rules="[(val) => !!val || t('wagon.warnings.plateNotEmpty')]" - /> - <VnInput - filled - v-model="data.volume" - :label="t('wagon.list.volume')" - type="number" - min="0" - :rules="[(val) => !!val || t('wagon.warnings.volumeNotEmpty')]" - /> - <VnSelect - url="WagonTypes" - filled - v-model="data.typeFk" - use-input - fill-input - hide-selected - input-debounce="0" - option-label="name" - option-value="id" - emit-value - map-options - :label="t('globals.type')" - :options="filteredWagonTypes" - :rules="[(val) => !!val || t('wagon.warnings.typeNotEmpty')]" - @filter="filterType" - > - <template v-if="data.typeFk" #append> - <QIcon - name="cancel" - @click.stop.prevent="data.typeFk = null" - class="cursor-pointer" - /> - </template> - <template #no-option> - <QItem> - <QItemSection class="text-grey"> - {{ t('wagon.warnings.noData') }} - </QItemSection> - </QItem> - </template> - </VnSelect> - </template> - </VnTable> + <VnSection + :data-key="dataKey" + :columns="columns" + prefix="card" + :array-data-props="{ + url: 'Wagons', + exprBuilder, + }" + > + <template #body> + <VnTable + ref="tableRef" + :data-key="dataKey" + :create="{ + urlCreate: 'Wagons', + title: t('Create new wagon'), + onDataSaved: () => tableRef.reload(), + formInitialData: {}, + }" + :filter="filter" + :columns="columns" + order="id DESC" + :column-search="false" + :default-mode="'card'" + :disable-option="{ table: true }" + > + <template #more-create-dialog="{ data }"> + <VnInput + filled + v-model="data.label" + :label="t('wagon.create.label')" + type="number" + min="0" + :rules="[(val) => !!val || t('wagon.warnings.labelNotEmpty')]" + /> + <VnInput + filled + v-model="data.plate" + :label="t('wagon.list.plate')" + :rules="[(val) => !!val || t('wagon.warnings.plateNotEmpty')]" + /> + <VnInput + filled + v-model="data.volume" + :label="t('wagon.list.volume')" + type="number" + min="0" + :rules="[(val) => !!val || t('wagon.warnings.volumeNotEmpty')]" + /> + <VnSelect + url="WagonTypes" + filled + v-model="data.typeFk" + use-input + fill-input + hide-selected + input-debounce="0" + option-label="name" + option-value="id" + emit-value + map-options + :label="t('globals.type')" + :options="filteredWagonTypes" + :rules="[(val) => !!val || t('wagon.warnings.typeNotEmpty')]" + @filter="filterType" + > + <template v-if="data.typeFk" #append> + <QIcon + name="cancel" + @click.stop.prevent="data.typeFk = null" + class="cursor-pointer" + /> + </template> + <template #no-option> + <QItem> + <QItemSection class="text-grey"> + {{ t('wagon.warnings.noData') }} + </QItemSection> + </QItem> + </template> + </VnSelect> + </template> + </VnTable> + </template> + </VnSection> </QPage> </template> diff --git a/src/router/modules/wagon.js b/src/router/modules/wagon.js index 4a322d305..d0f4b2281 100644 --- a/src/router/modules/wagon.js +++ b/src/router/modules/wagon.js @@ -1,34 +1,55 @@ import { RouterView } from 'vue-router'; +const wagonCard = { + + name: 'WagonCard', + path: ':id', + component: () => import('src/pages/Ticket/Card/WagonCard.vue'), + redirect: { name: 'WagonSummary' }, + meta: { + //main: ['WagonList', 'WagonTypeList', 'WagonCounter', 'WagonTray'], + menu: [], + }, + children: [ + {}, + ], +}; + export default { - path: '/wagon', name: 'Wagon', + path: '/wagon', meta: { title: 'wagons', icon: 'vn:trolley', moduleName: 'Wagon', + keyBinding: 'w', + menu: ['WagonList', 'WagonTypeList', 'WagonCounter', 'WagonTray'], }, component: RouterView, redirect: { name: 'WagonMain' }, - menus: { - main: ['WagonList', 'WagonTypeList', 'WagonCounter', 'WagonTray'], - card: [], - }, children: [ { - path: '/wagon', + path: '', name: 'WagonMain', component: () => import('src/components/common/VnModule.vue'), - redirect: { name: 'WagonList' }, + redirect: { name: 'WagonIndexMain' }, children: [ { - path: 'list', - name: 'WagonList', - meta: { - title: 'list', - icon: 'vn:trolley', - }, + path: '', + name: 'WagonIndexMain', + redirect: { name: 'WagonList' }, component: () => import('src/pages/Wagon/WagonList.vue'), + children: [ + { + name: 'WagonList', + path: 'list', + meta: { + title: 'list', + icon: 'view_list', + }, + }, + + ] }, { path: 'create', From 705ca0402af04ab6dfd020f5f80efd1a35f6c055 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 21 Feb 2025 10:14:59 +0100 Subject: [PATCH 02/18] feat: refs #8606 adapt module to VnCatdBeta --- src/components/ui/VnSearchbar.vue | 4 + src/composables/useArrayData.js | 3 +- src/css/app.scss | 2 +- src/pages/Zone/Card/ZoneCard.vue | 35 +--- src/pages/Zone/Card/ZoneEvents.vue | 26 ++- src/pages/Zone/Card/ZoneLocationsTree.vue | 24 +-- src/pages/Zone/Card/ZoneLog.vue | 2 +- src/pages/Zone/Card/ZoneSearchbar.vue | 74 --------- src/pages/Zone/Card/ZoneSummary.vue | 3 +- src/pages/Zone/ZoneDeliveryDays.vue | 2 - src/pages/Zone/ZoneFilterPanel.vue | 9 + src/pages/Zone/ZoneList.vue | 181 ++++++++++++--------- src/pages/Zone/ZoneUpcoming.vue | 2 - src/pages/Zone/locale/en.yml | 2 + src/pages/Zone/locale/es.yml | 2 + src/router/modules/zone.js | 190 ++++++++++++---------- 16 files changed, 259 insertions(+), 302 deletions(-) delete mode 100644 src/pages/Zone/Card/ZoneSearchbar.vue diff --git a/src/components/ui/VnSearchbar.vue b/src/components/ui/VnSearchbar.vue index 30e4135e2..d7d8d20ba 100644 --- a/src/components/ui/VnSearchbar.vue +++ b/src/components/ui/VnSearchbar.vue @@ -33,6 +33,10 @@ const props = defineProps({ type: String, default: '', }, + userFilter: { + type: Object, + default: null, + }, filter: { type: Object, default: null, diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index fcc61972a..9943892a1 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -148,8 +148,7 @@ export function useArrayData(key, userOptions) { } async function applyFilter({ filter, params }, fetchOptions = {}) { - if (filter) store.userFilter = filter; - store.filter = {}; + if (filter) store.filter = filter; if (params) store.userParams = { ...params }; const response = await fetch(fetchOptions); diff --git a/src/css/app.scss b/src/css/app.scss index 994ae7ff1..b8b53a929 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -337,5 +337,5 @@ input::-webkit-inner-spin-button { } .containerShrinked { - width: 80%; + width: 70%; } diff --git a/src/pages/Zone/Card/ZoneCard.vue b/src/pages/Zone/Card/ZoneCard.vue index 41daff5c0..205ed074b 100644 --- a/src/pages/Zone/Card/ZoneCard.vue +++ b/src/pages/Zone/Card/ZoneCard.vue @@ -1,38 +1,7 @@ <script setup> -import { useRoute } from 'vue-router'; -import { computed } from 'vue'; - -import VnCard from 'components/common/VnCard.vue'; +import VnCardBeta from 'src/components/common/VnCardBeta.vue'; import ZoneDescriptor from './ZoneDescriptor.vue'; -import ZoneFilterPanel from '../ZoneFilterPanel.vue'; -import filter from './ZoneFilter.js'; - -const route = useRoute(); -const routeName = computed(() => route.name); - -function notIsLocations(ifIsFalse, ifIsTrue) { - if (routeName.value != 'ZoneLocations') return ifIsFalse; - return ifIsTrue; -} </script> - <template> - <VnCard - data-key="Zone" - :url="notIsLocations('Zones', undefined)" - :descriptor="ZoneDescriptor" - :filter="filter" - :filter-panel="notIsLocations(ZoneFilterPanel, undefined)" - :search-data-key="notIsLocations('ZoneList', undefined)" - :searchbar-props="{ - url: notIsLocations('Zones', 'ZoneLocations'), - label: notIsLocations($t('list.searchZone'), $t('list.searchLocation')), - info: $t('list.searchInfo'), - whereFilter: notIsLocations((value) => { - return /^\d+$/.test(value) - ? { id: value } - : { name: { like: `%${value}%` } }; - }), - }" - /> + <VnCardBeta data-key="Zone" url="Zones" :descriptor="ZoneDescriptor" /> </template> diff --git a/src/pages/Zone/Card/ZoneEvents.vue b/src/pages/Zone/Card/ZoneEvents.vue index 1e6debd25..2fa7dfb43 100644 --- a/src/pages/Zone/Card/ZoneEvents.vue +++ b/src/pages/Zone/Card/ZoneEvents.vue @@ -1,18 +1,14 @@ <script setup> -import { ref } from 'vue'; +import { ref, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import ZoneEventsPanel from './ZoneEventsPanel.vue'; import ZoneCalendarGrid from '../ZoneCalendarGrid.vue'; import ZoneEventInclusionForm from './ZoneEventInclusionForm.vue'; import ZoneEventExclusionForm from './ZoneEventExclusionForm.vue'; - -import { useStateStore } from 'stores/useStateStore'; -import { reactive } from 'vue'; +import RightMenu from 'src/components/common/RightMenu.vue'; const { t } = useI18n(); -const stateStore = useStateStore(); - const firstDay = ref(); const lastDay = ref(); @@ -43,14 +39,16 @@ const onZoneEventFormClose = () => { </script> <template> - <Teleport to="#right-panel" v-if="stateStore.isHeaderMounted()"> - <ZoneEventsPanel - :first-day="firstDay" - :last-day="lastDay" - :events="events" - v-model:formModeName="formModeName" - /> - </Teleport> + <RightMenu> + <template #right-panel> + <ZoneEventsPanel + :first-day="firstDay" + :last-day="lastDay" + :events="events" + v-model:formModeName="formModeName" + /> + </template> + </RightMenu> <QPage class="q-pa-md flex justify-center"> <ZoneCalendarGrid v-model:events="events" diff --git a/src/pages/Zone/Card/ZoneLocationsTree.vue b/src/pages/Zone/Card/ZoneLocationsTree.vue index 5c87faf99..0654a3ec2 100644 --- a/src/pages/Zone/Card/ZoneLocationsTree.vue +++ b/src/pages/Zone/Card/ZoneLocationsTree.vue @@ -1,6 +1,7 @@ <script setup> import { onMounted, ref, computed, watch, onUnmounted } from 'vue'; import { useRoute } from 'vue-router'; +import { useStateStore } from 'stores/useStateStore'; import VnInput from 'src/components/common/VnInput.vue'; import { useState } from 'src/composables/useState'; import axios from 'axios'; @@ -30,7 +31,7 @@ const emit = defineEmits(['update:tickedNodes']); const route = useRoute(); const state = useState(); - +const stateStore = useStateStore(); const treeRef = ref(); const expanded = ref([]); @@ -82,7 +83,7 @@ const onNodeExpanded = async (nodeKeysArray) => { await fetchNodeLeaves(lastNodeKey, true); } else { const difference = new Set( - [...previousExpandedNodes.value].filter((x) => !nodeKeysSet.has(x)) + [...previousExpandedNodes.value].filter((x) => !nodeKeysSet.has(x)), ); const collapsedNode = Array.from(difference).pop(); const node = treeRef.value?.getNodeByKey(collapsedNode); @@ -135,7 +136,7 @@ watch( } previousExpandedNodes.value = new Set(expanded.value); }, - { immediate: true } + { immediate: true }, ); const reFetch = async () => { @@ -153,6 +154,16 @@ onUnmounted(() => { </script> <template> + <Teleport to="#section-searchbar" v-if="stateStore.isHeaderMounted()"> + <VnSearchbar + v-if="!showSearchBar" + :data-key="datakey" + :url="url" + :redirect="false" + :search-remove-params="false" + :label="$t('Search locations')" + /> + </Teleport> <VnInput v-if="showSearchBar" v-model="store.userParams.search" @@ -163,13 +174,6 @@ onUnmounted(() => { <QBtn color="primary" icon="search" dense flat @click="reFetch()" /> </template> </VnInput> - <VnSearchbar - v-if="!showSearchBar" - :data-key="datakey" - :url="url" - :redirect="false" - :search-remove-params="false" - /> <QTree ref="treeRef" :nodes="nodes" diff --git a/src/pages/Zone/Card/ZoneLog.vue b/src/pages/Zone/Card/ZoneLog.vue index 373d210b5..99ea0912f 100644 --- a/src/pages/Zone/Card/ZoneLog.vue +++ b/src/pages/Zone/Card/ZoneLog.vue @@ -2,5 +2,5 @@ import VnLog from 'src/components/common/VnLog.vue'; </script> <template> - <VnLog model="Zone" url="/ZoneLogs"></VnLog> + <VnLog model="Zone" /> </template> diff --git a/src/pages/Zone/Card/ZoneSearchbar.vue b/src/pages/Zone/Card/ZoneSearchbar.vue deleted file mode 100644 index d1188a1e8..000000000 --- a/src/pages/Zone/Card/ZoneSearchbar.vue +++ /dev/null @@ -1,74 +0,0 @@ -<script setup> -import { useI18n } from 'vue-i18n'; -import VnSearchbar from 'components/ui/VnSearchbar.vue'; - -const { t } = useI18n(); - -const exprBuilder = (param, value) => { - switch (param) { - case 'name': - return { - name: { like: `%${value}%` }, - }; - case 'code': - return { - code: { like: `%${value}%` }, - }; - case 'agencyModeFk': - return { - agencyModeFk: value, - }; - case 'search': - return /^\d+$/.test(value) ? { id: value } : { name: { like: `%${value}%` } }; - } -}; - -const tableFilter = { - include: [ - { - relation: 'agencyMode', - scope: { - fields: ['id', 'name'], - }, - }, - { - relation: 'address', - scope: { - fields: ['id', 'nickname', 'provinceFk', 'postalCode'], - include: [ - { - relation: 'province', - scope: { - fields: ['id', 'name'], - }, - }, - { - relation: 'postcode', - scope: { - fields: ['code', 'townFk'], - include: { - relation: 'town', - scope: { - fields: ['id', 'name'], - }, - }, - }, - }, - ], - }, - }, - ], -}; -</script> - -<template> - <VnSearchbar - data-key="ZonesList" - url="Zones" - :filter="tableFilter" - :expr-builder="exprBuilder" - :label="t('list.searchZone')" - :info="t('list.searchInfo')" - custom-route-redirect-name="ZoneSummary" - /> -</template> diff --git a/src/pages/Zone/Card/ZoneSummary.vue b/src/pages/Zone/Card/ZoneSummary.vue index 5b29b495b..2c56fa3e2 100644 --- a/src/pages/Zone/Card/ZoneSummary.vue +++ b/src/pages/Zone/Card/ZoneSummary.vue @@ -60,10 +60,11 @@ onMounted(async () => { <template> <CardSummary - data-key="Zone" + data-key="ZoneSummary" ref="summary" :url="`Zones/${entityId}`" :filter="filter" + :entity-id="entityId" > <template #header="{ entity }"> <div>#{{ entity.id }} - {{ entity.name }}</div> diff --git a/src/pages/Zone/ZoneDeliveryDays.vue b/src/pages/Zone/ZoneDeliveryDays.vue index d95c64d8b..ddde3f6b3 100644 --- a/src/pages/Zone/ZoneDeliveryDays.vue +++ b/src/pages/Zone/ZoneDeliveryDays.vue @@ -3,7 +3,6 @@ import { ref } from 'vue'; import ZoneDeliveryPanel from './ZoneDeliveryPanel.vue'; import ZoneCalendarGrid from './ZoneCalendarGrid.vue'; import RightMenu from 'src/components/common/RightMenu.vue'; -import ZoneSearchbar from './Card/ZoneSearchbar.vue'; const firstDay = ref(null); const lastDay = ref(null); @@ -11,7 +10,6 @@ const events = ref([]); </script> <template> - <ZoneSearchbar /> <RightMenu> <template #right-panel> <ZoneDeliveryPanel /> diff --git a/src/pages/Zone/ZoneFilterPanel.vue b/src/pages/Zone/ZoneFilterPanel.vue index bbe12189a..f3f3a81d0 100644 --- a/src/pages/Zone/ZoneFilterPanel.vue +++ b/src/pages/Zone/ZoneFilterPanel.vue @@ -63,6 +63,15 @@ const agencies = ref([]); </VnSelect> </QItemSection> </QItem> + <QItem> + <QItemSection> + <VnInput + :label="t('list.price')" + v-model="params.price" + is-outlined + /> + </QItemSection> + </QItem> </template> </VnFilterPanel> </template> diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index a82bbb285..7ea333484 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -14,9 +14,8 @@ import VnTable from 'src/components/VnTable/VnTable.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnInputTime from 'src/components/common/VnInputTime.vue'; -import RightMenu from 'src/components/common/RightMenu.vue'; +import VnSection from 'src/components/common/VnSection.vue'; import ZoneFilterPanel from './ZoneFilterPanel.vue'; -import ZoneSearchbar from './Card/ZoneSearchbar.vue'; const { t } = useI18n(); const router = useRouter(); @@ -25,7 +24,7 @@ const { viewSummary } = useSummaryDialog(); const { openConfirmationModal } = useVnConfirm(); const tableRef = ref(); const warehouseOptions = ref([]); - +const dataKey = 'ZoneList'; const tableFilter = { include: [ { @@ -115,7 +114,6 @@ const columns = computed(() => [ inWhere: true, }, columnClass: 'shrink-column', - component: 'number', }, { align: 'center', @@ -171,82 +169,113 @@ function formatRow(row) { return dashIfEmpty(`${row?.address?.nickname}, ${row?.address?.postcode?.town?.name} (${row?.address?.province?.name})`); } + +const exprBuilder = (param, value) => { + switch (param) { + case 'name': + return { + name: { like: `%${value}%` }, + }; + case 'code': + return { + code: { like: `%${value}%` }, + }; + case 'agencyModeFk': + return { + agencyModeFk: value, + }; + case 'search': + return /^\d+$/.test(value) ? { id: value } : { name: { like: `%${value}%` } }; + case 'price': + return { + price: value, + }; + } +}; </script> <template> - <ZoneSearchbar /> - <RightMenu> - <template #right-panel> - <ZoneFilterPanel data-key="ZonesList" /> + <VnSection + :data-key="dataKey" + :columns="columns" + prefix="zone" + :array-data-props="{ + url: 'Zones', + order: ['id ASC'], + userFilter: tableFilter, + exprBuilder, + }" + > + <template #advanced-menu> + <ZoneFilterPanel :data-key="dataKey" /> </template> - </RightMenu> - <div class="table-container"> - <div class="column items-center"> - <VnTable - ref="tableRef" - data-key="ZonesList" - url="Zones" - :create="{ - urlCreate: 'Zones', - title: t('list.createZone'), - onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), - formInitialData: {}, - }" - :user-filter="tableFilter" - :columns="columns" - redirect="zone" - :right-search="false" - table-height="85vh" - order="id ASC" - > - <template #column-addressFk="{ row }"> - {{ dashIfEmpty(formatRow(row)) }} - </template> - <template #more-create-dialog="{ data }"> - <VnSelect - url="AgencyModes" - v-model="data.agencyModeFk" - option-value="id" - option-label="name" - :label="t('list.agency')" - /> - <VnInput - v-model="data.price" - :label="t('list.price')" - min="0" - type="number" - required="true" - /> - <VnInput - v-model="data.bonus" - :label="t('zone.bonus')" - min="0" - type="number" - /> - <VnInput - v-model="data.travelingDays" - :label="t('zone.travelingDays')" - type="number" - min="0" - /> - <VnInputTime v-model="data.hour" :label="t('list.close')" /> - <VnSelect - url="Warehouses" - v-model="data.warehouseFK" - option-value="id" - option-label="name" - :label="t('list.warehouse')" - :options="warehouseOptions" - /> - <QCheckbox - v-model="data.isVolumetric" - :label="t('list.isVolumetric')" - :toggle-indeterminate="false" - /> - </template> - </VnTable> - </div> - </div> + <template #body> + <div class="table-container"> + <div class="column items-center"> + <VnTable + ref="tableRef" + :data-key="dataKey" + :columns="columns" + :right-search="false" + redirect="Zone" + :create="{ + urlCreate: 'Zones', + title: t('list.createZone'), + onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), + formInitialData: {}, + }" + table-height="85vh" + > + <template #column-addressFk="{ row }"> + {{ dashIfEmpty(formatRow(row)) }} + </template> + <template #more-create-dialog="{ data }"> + <VnSelect + url="AgencyModes" + v-model="data.agencyModeFk" + option-value="id" + option-label="name" + :label="t('list.agency')" + /> + <VnInput + v-model="data.price" + :label="t('list.price')" + min="0" + type="number" + required="true" + /> + <VnInput + v-model="data.bonus" + :label="t('zone.bonus')" + min="0" + type="number" + /> + <VnInput + v-model="data.travelingDays" + :label="t('zone.travelingDays')" + type="number" + min="0" + /> + <VnInputTime v-model="data.hour" :label="t('list.close')" /> + <VnSelect + url="Warehouses" + v-model="data.warehouseFK" + option-value="id" + option-label="name" + :label="t('list.warehouse')" + :options="warehouseOptions" + /> + <QCheckbox + v-model="data.isVolumetric" + :label="t('list.isVolumetric')" + :toggle-indeterminate="false" + /> + </template> + </VnTable> + </div> + </div> + </template> + </VnSection> </template> <i18n> diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue index adcdfbc04..6fcc00dd2 100644 --- a/src/pages/Zone/ZoneUpcoming.vue +++ b/src/pages/Zone/ZoneUpcoming.vue @@ -7,7 +7,6 @@ import FetchData from 'components/FetchData.vue'; import { toDateFormat } from 'src/filters/date.js'; import { useWeekdayStore } from 'src/stores/useWeekdayStore'; -import ZoneSearchbar from './Card/ZoneSearchbar.vue'; const { t } = useI18n(); const weekdayStore = useWeekdayStore(); @@ -53,7 +52,6 @@ onMounted(() => weekdayStore.initStore()); @on-fetch="(data) => (details = data)" auto-load /> - <ZoneSearchbar /> <VnSubToolbar /> <QPage class="column items-center q-pa-md"> <QCard class="containerShrinked q-pa-md"> diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index e53e7b560..d72c9f9fd 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -15,6 +15,8 @@ zone: bonus: Bonus closing: Closing travelingDays: Traveling days + search: Search zone + searchInfo: Search zone by id or name list: clone: Clone id: Id diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml index bc31e74a9..6e005fc0d 100644 --- a/src/pages/Zone/locale/es.yml +++ b/src/pages/Zone/locale/es.yml @@ -15,6 +15,8 @@ zone: bonus: Bonificación closing: Cierre travelingDays: Días de viaje + search: Buscar zona + searchInfo: Buscar zona por Id o nombre list: clone: Clonar id: Id diff --git a/src/router/modules/zone.js b/src/router/modules/zone.js index f400a708e..a0a7d7c4f 100644 --- a/src/router/modules/zone.js +++ b/src/router/modules/zone.js @@ -1,24 +1,12 @@ import { RouterView } from 'vue-router'; -export default { - path: '/zone', - name: 'Zone', +const zoneCard = { + name: 'ZoneCard', + path: ':id', + component: () => import('src/pages/Zone/Card/ZoneCard.vue'), + redirect: { name: 'ZoneSummary' }, meta: { - title: 'zones', - icon: 'vn:zone', - moduleName: 'Zone', - keyBinding: 'z', - }, - component: RouterView, - redirect: { name: 'ZoneMain' }, - menus: { - main: [ - 'ZoneList', - 'ZoneDeliveryDays', - 'ZoneUpcomingList', - 'ZoneUpcomingDeliveries', - ], - card: [ + menu: [ 'ZoneBasicData', 'ZoneWarehouses', 'ZoneHistory', @@ -28,17 +16,109 @@ export default { }, children: [ { - path: '/zone', + name: 'ZoneSummary', + path: 'summary', + meta: { + title: 'summary', + icon: 'launch', + }, + component: () => import('src/pages/Zone/Card/ZoneSummary.vue'), + }, + { + path: 'basic-data', + name: 'ZoneBasicData', + meta: { + title: 'basicData', + icon: 'vn:settings', + }, + component: () => import('src/pages/Zone/Card/ZoneBasicData.vue'), + }, + { + path: 'location', + name: 'ZoneLocations', + meta: { + title: 'locations', + icon: 'my_location', + }, + component: () => import('src/pages/Zone/Card/ZoneLocations.vue'), + }, + { + path: 'warehouses', + name: 'ZoneWarehouses', + meta: { + title: 'warehouses', + icon: 'home', + }, + component: () => import('src/pages/Zone/Card/ZoneWarehouses.vue'), + }, + { + path: 'log', + name: 'ZoneHistory', + meta: { + title: 'log', + icon: 'history', + }, + component: () => import('src/pages/Zone/Card/ZoneLog.vue'), + }, + { + path: 'events', + name: 'ZoneEvents', + meta: { + title: 'calendar', + icon: 'vn:calendar', + }, + component: () => import('src/pages/Zone/Card/ZoneEvents.vue'), + }, + ], +}; + +export default { + name: 'Zone', + path: '/zone', + meta: { + title: 'zones', + icon: 'vn:zone', + moduleName: 'Zone', + keyBinding: 'z', + menu: [ + 'ZoneList', + 'ZoneDeliveryDays', + 'ZoneUpcomingList', + 'ZoneUpcomingDeliveries', + ], + }, + component: RouterView, + redirect: { name: 'ZoneMain' }, + children: [ + { name: 'ZoneMain', + path: '', component: () => import('src/components/common/VnModule.vue'), - redirect: { name: 'ZoneList' }, + redirect: { name: 'ZoneIndexMain' }, children: [ { - path: 'list', - name: 'ZoneList', + path: '', + name: 'ZoneIndexMain', + redirect: { name: 'ZoneList' }, + component: () => import('src/pages/Zone/ZoneList.vue'), + children: [ + { + name: 'ZoneList', + path: 'list', + meta: { + title: 'list', + icon: 'view_list', + }, + }, + zoneCard, + ], + }, + { + path: 'create', + name: 'ZoneCreate', meta: { - title: 'zonesList', - icon: 'view_list', + title: 'zoneCreate', + icon: 'add', }, component: () => import('src/pages/Zone/ZoneList.vue'), }, @@ -62,67 +142,5 @@ export default { }, ], }, - { - name: 'ZoneCard', - path: ':id', - component: () => import('src/pages/Zone/Card/ZoneCard.vue'), - redirect: { name: 'ZoneSummary' }, - children: [ - { - name: 'ZoneSummary', - path: 'summary', - meta: { - title: 'summary', - icon: 'launch', - }, - component: () => import('src/pages/Zone/Card/ZoneSummary.vue'), - }, - { - name: 'ZoneBasicData', - path: 'basic-data', - meta: { - title: 'basicData', - icon: 'vn:settings', - }, - component: () => import('src/pages/Zone/Card/ZoneBasicData.vue'), - }, - { - name: 'ZoneLocations', - path: 'location', - meta: { - title: 'locations', - icon: 'my_location', - }, - component: () => import('src/pages/Zone/Card/ZoneLocations.vue'), - }, - { - name: 'ZoneWarehouses', - path: 'warehouses', - meta: { - title: 'warehouses', - icon: 'home', - }, - component: () => import('src/pages/Zone/Card/ZoneWarehouses.vue'), - }, - { - name: 'ZoneHistory', - path: 'log', - meta: { - title: 'log', - icon: 'history', - }, - component: () => import('src/pages/Zone/Card/ZoneLog.vue'), - }, - { - name: 'ZoneEvents', - path: 'events', - meta: { - title: 'calendar', - icon: 'vn:calendar', - }, - component: () => import('src/pages/Zone/Card/ZoneEvents.vue'), - }, - ], - }, ], }; From 6c29a5ed671b07813bd4e0aca55304c73990af0a Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Mon, 24 Feb 2025 12:07:22 +0100 Subject: [PATCH 03/18] fix: refs #8619 update route descriptor to handle empty ticket records and adjust test cases --- src/pages/Route/Card/RouteDescriptor.vue | 6 +- .../route/routeExtendedList.spec.js | 55 +++++++++---------- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index 503cd1941..28d042836 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -27,12 +27,14 @@ const getZone = async () => { const filter = { where: { routeFk: $props.id ? $props.id : route.params.id }, }; - const { data } = await axios.get('Tickets/findOne', { + const { data: [firstRecord] = [] } = await axios.get('Tickets/filter', { params: { filter: JSON.stringify(filter), }, }); - zoneId.value = data.zoneFk; + if (!firstRecord) return; + + zoneId.value = firstRecord.zoneFk; const { data: zoneData } = await axios.get(`Zones/${zoneId.value}`); zone.value = zoneData.name; }; diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index e3505ad60..96ff4528d 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -1,4 +1,4 @@ -describe.skip('Route extended list', () => { +describe('Route extended list', () => { const getSelector = (colField) => `tr:last-child > [data-col-field="${colField}"]`; const selectors = { @@ -32,18 +32,18 @@ describe.skip('Route extended list', () => { const originalFields = [ { selector: selectors.worker, type: 'select', value: 'logistic' }, - { selector: selectors.agency, type: 'select', value: 'Super-Man delivery' }, + { selector: selectors.agency, type: 'select', value: 'inhouse pickup' }, { selector: selectors.vehicle, type: 'select', value: '3333-IMK' }, - { selector: selectors.date, type: 'date', value: '01/02/2024' }, + { selector: selectors.date, type: 'date', value: '01/01/2001' }, { selector: selectors.description, type: 'input', value: 'Test route' }, { selector: selectors.served, type: 'checkbox', value: checkboxState.uncheck }, ]; const updateFields = [ { selector: selectors.worker, type: 'select', value: 'salesperson' }, - { selector: selectors.agency, type: 'select', value: 'inhouse pickup' }, + { selector: selectors.agency, type: 'select', value: 'Super-Man delivery' }, { selector: selectors.vehicle, type: 'select', value: '1111-IMK' }, - { selector: selectors.date, type: 'date', value: '01/01/2001' }, + { selector: selectors.date, type: 'date', value: '11/01/2001' }, { selector: selectors.description, type: 'input', value: 'Description updated' }, { selector: selectors.served, type: 'checkbox', value: checkboxState.check }, ]; @@ -57,11 +57,11 @@ describe.skip('Route extended list', () => { break; case 'input': cy.get(selector).should('be.visible').click(); - cy.dataCy('null_input').clear().type(`${value}{enter}`); + cy.dataCy('null_input').clear().type(`${value}`); break; case 'date': cy.get(selector).should('be.visible').click(); - cy.dataCy('null_inputDate').clear().type(`${value}{enter}`); + cy.dataCy('null_inputDate').clear().type(`${value}`); break; case 'checkbox': cy.get(selector).should('be.visible').click().click(); @@ -76,15 +76,6 @@ describe.skip('Route extended list', () => { cy.typeSearchbar('{enter}'); }); - after(() => { - cy.visit(url); - cy.typeSearchbar('{enter}'); - cy.get(selectors.lastRowSelectCheckBox).click(); - - cy.get(selectors.removeBtn).click(); - cy.dataCy(selectors.confirmBtn).click(); - }); - it('Should list routes', () => { cy.get('.q-table') .children() @@ -97,9 +88,9 @@ describe.skip('Route extended list', () => { const data = { Worker: { val: 'logistic', type: 'select' }, - Agency: { val: 'Super-Man delivery', type: 'select' }, + Agency: { val: 'inhouse pickup', type: 'select' }, Vehicle: { val: '3333-IMK', type: 'select' }, - Date: { val: '02-01-2024', type: 'date' }, + Date: { val: '01-01-2001', type: 'date' }, From: { val: '01-01-2024', type: 'date' }, To: { val: '10-01-2024', type: 'date' }, 'Km start': { val: 1000 }, @@ -129,7 +120,7 @@ describe.skip('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{enter}'); + cy.dataCy('route.Starting date_inputDate').type('10-05-2001').click(); cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); cy.validateContent(selectors.date, '05/10/2001'); }); @@ -143,9 +134,9 @@ describe.skip('Route extended list', () => { const fileName = 'download.zip'; cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); - cy.task('deleteFile', `${downloadsFolder}/${fileName}`).then((deleted) => { - expect(deleted).to.be.true; - }); + // cy.task('deleteFile', `${downloadsFolder}/${fileName}`).then((deleted) => { + // expect(deleted).to.be.true; + // }); }); it('Should mark as served the selected route', () => { @@ -165,6 +156,13 @@ describe.skip('Route extended list', () => { cy.checkNotification(dataSaved); }); + it('Should add ticket to route', () => { + cy.dataCy('tableAction-0').last().click(); + cy.get(selectors.firstTicketsRowSelectCheckBox).click(); + cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); + cy.checkNotification(dataSaved); + }); + it('Should save changes in route', () => { updateFields.forEach(({ selector, type, value }) => { fillField(selector, type, value); @@ -175,18 +173,15 @@ describe.skip('Route extended list', () => { cy.typeSearchbar('{enter}'); - updateFields.forEach(({ selector, value }) => { + updateFields.forEach(({ selector, value, type }) => { + if (type === 'date') { + const [month, day, year] = value.split('/'); + value = `${day}/${month}/${year}`; + } cy.validateContent(selector, value); }); }); - it('Should add ticket to route', () => { - cy.dataCy('tableAction-0').last().click(); - cy.get(selectors.firstTicketsRowSelectCheckBox).click(); - cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); - cy.checkNotification(dataSaved); - }); - it('Should open summary pop-up when click summuary icon', () => { cy.dataCy('tableAction-1').last().click(); cy.get('.summaryHeader > :nth-child(2').should('contain', updateFields[4].value); From aa15a31b395bb8411af759dbfef5e3975fe95c48 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Tue, 25 Feb 2025 13:48:18 +0100 Subject: [PATCH 04/18] feat: refs #8045 modified icon and route to redirect from CardDescriptor --- src/components/ui/CardDescriptor.vue | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index 6f122ecd2..72d255906 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -5,7 +5,7 @@ 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 } from 'vue-router'; +import { useRoute, useRouter } from 'vue-router'; import { useClipboard } from 'src/composables/useClipboard'; import VnMoreOptions from './VnMoreOptions.vue'; @@ -42,6 +42,7 @@ const $props = defineProps({ const state = useState(); const route = useRoute(); +const router = useRouter(); const { t } = useI18n(); const { copyText } = useClipboard(); const { viewSummary } = useSummaryDialog(); @@ -111,11 +112,15 @@ function copyIdText(id) { const emit = defineEmits(['onFetch']); -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, +const iconModule = computed( + () => + router.options.routes[1].children.find((r) => r.name === $props.dataKey).meta + .icon, +); +const toModule = computed( + () => + router.options.routes[1].children.find((r) => r.name === $props.dataKey) + .children[0].redirect, ); </script> @@ -123,8 +128,8 @@ const toModule = computed(() => <div class="descriptor"> <template v-if="entity && !isLoading"> <div class="header bg-primary q-pa-sm justify-between"> - <slot name="header-extra-action" - ><QBtn + <slot name="header-extra-action"> + <QBtn round flat dense @@ -132,13 +137,13 @@ const toModule = computed(() => :icon="iconModule" color="white" class="link" - :to="$attrs['to-module'] ?? toModule" + :to="toModule" > <QTooltip> {{ t('globals.goToModuleIndex') }} </QTooltip> - </QBtn></slot - > + </QBtn> + </slot> <QBtn @click.stop="viewSummary(entity.id, $props.summary, $props.width)" round From 955d2dd5c43e1b0d30ecd477e0bd8bf314752cca Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Wed, 26 Feb 2025 10:27:26 +0100 Subject: [PATCH 05/18] fix: refs #8619 handle empty ticket records in RouteDescriptor component --- src/pages/Route/Card/RouteDescriptor.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index 28d042836..b98d99724 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -27,12 +27,14 @@ const getZone = async () => { const filter = { where: { routeFk: $props.id ? $props.id : route.params.id }, }; - const { data: [firstRecord] = [] } = await axios.get('Tickets/filter', { + const { data } = await axios.get('Tickets/filter', { params: { filter: JSON.stringify(filter), }, }); - if (!firstRecord) return; + + if ( data.length == 0 ) return; + const firstRecord = data[0]; zoneId.value = firstRecord.zoneFk; const { data: zoneData } = await axios.get(`Zones/${zoneId.value}`); From b614cb2046d7e3de17497f8ffdf5cc44f7c61894 Mon Sep 17 00:00:00 2001 From: jtubau <jtubau@verdnatura.es> Date: Thu, 27 Feb 2025 11:53:49 +0100 Subject: [PATCH 06/18] refactor: refs #8619 simplify empty data check in RouteDescriptor component --- src/pages/Route/Card/RouteDescriptor.vue | 2 +- test/cypress/integration/route/routeExtendedList.spec.js | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index b98d99724..01fb9c4ba 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -33,7 +33,7 @@ const getZone = async () => { }, }); - if ( data.length == 0 ) return; + if (!data.length) return; const firstRecord = data[0]; zoneId.value = firstRecord.zoneFk; diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index 96ff4528d..da35066c3 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -133,10 +133,6 @@ describe('Route extended list', () => { const fileName = 'download.zip'; cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); - - // cy.task('deleteFile', `${downloadsFolder}/${fileName}`).then((deleted) => { - // expect(deleted).to.be.true; - // }); }); it('Should mark as served the selected route', () => { From d64ac223e32d375035c3f9d172902487ad23b9cd Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 28 Feb 2025 07:53:20 +0100 Subject: [PATCH 07/18] feat: refs #8045 added new logic to show the correct icon and the correct path to redirect --- src/components/ui/CardDescriptor.vue | 49 +++++++++++++++++++--------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index fa733baa5..59d362463 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -51,6 +51,9 @@ 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 () => { @@ -77,15 +80,18 @@ onBeforeMount(async () => { ); }); -const routeName = computed(() => { - const DESCRIPTOR_PROXY = 'DescriptorProxy'; - +function getName() { let name = $props.dataKey; if ($props.dataKey.includes(DESCRIPTOR_PROXY)) { name = name.split(DESCRIPTOR_PROXY)[0]; } - return `${name}Summary`; + return name; +} +const routeName = computed(() => { + let routeName = getName(); + return `${routeName}Summary`; }); + async function getData() { store.url = $props.url; store.filter = $props.filter ?? {}; @@ -121,16 +127,27 @@ function copyIdText(id) { const emit = defineEmits(['onFetch']); -const iconModule = computed( - () => - router.options.routes[1].children.find((r) => r.name === $props.dataKey).meta - .icon, -); -const toModule = computed( - () => - router.options.routes[1].children.find((r) => r.name === $props.dataKey) - .children[0].redirect, -); +const iconModuleV = 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 toModuleV = 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> @@ -143,10 +160,10 @@ const toModule = computed( flat dense size="md" - :icon="iconModule" + :icon="iconModuleV" color="white" class="link" - :to="toModule" + :to="toModuleV" > <QTooltip> {{ t('globals.goToModuleIndex') }} From 01b7b2adeb0abbb1c1804e394dfe62b0bbbf7a12 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Mon, 3 Mar 2025 08:26:02 +0100 Subject: [PATCH 08/18] refactor: refs #8045 modified icon and module const --- src/components/ui/CardDescriptor.vue | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index 59d362463..744f84e6d 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -127,7 +127,7 @@ function copyIdText(id) { const emit = defineEmits(['onFetch']); -const iconModuleV = computed(() => { +const iconModule = computed(() => { moduleName.value = getName(); if (isSameModuleName) { return router.options.routes[1].children.find((r) => r.name === moduleName.value) @@ -137,7 +137,7 @@ const iconModuleV = computed(() => { } }); -const toModuleV = computed(() => { +const toModule = computed(() => { moduleName.value = getName(); if (isSameModuleName) { return router.options.routes[1].children.find((r) => r.name === moduleName.value) @@ -160,10 +160,10 @@ const toModuleV = computed(() => { flat dense size="md" - :icon="iconModuleV" + :icon="iconModule" color="white" class="link" - :to="toModuleV" + :to="toModule" > <QTooltip> {{ t('globals.goToModuleIndex') }} @@ -252,7 +252,6 @@ const toModuleV = computed(() => { </div> <slot name="after" /> </template> - <!-- Skeleton --> <SkeletonDescriptor v-if="!entity || isLoading" /> </div> <QInnerLoading From 94918011e6e256ed736c7d66c55377b7bd4daad3 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 6 Mar 2025 13:22:02 +0100 Subject: [PATCH 09/18] refactor: refs #8322 update WagonCard component and routing structure --- src/pages/Wagon/Card/WagonCard.vue | 2 +- src/pages/Wagon/WagonList.vue | 192 ++++++++++++++--------------- src/router/modules/wagon.js | 100 ++++++--------- 3 files changed, 136 insertions(+), 158 deletions(-) diff --git a/src/pages/Wagon/Card/WagonCard.vue b/src/pages/Wagon/Card/WagonCard.vue index a8c8f2c88..1694dad7b 100644 --- a/src/pages/Wagon/Card/WagonCard.vue +++ b/src/pages/Wagon/Card/WagonCard.vue @@ -2,5 +2,5 @@ import VnCardBeta from 'src/components/common/VnCardBeta.vue'; </script> <template> - <VnCardBeta data-key="Wagon" url="Wagons" :descriptor="WagonDescriptor" /> + <VnCardBeta data-key="Wagon" url="Wagons" :descriptor="{}" /> </template> diff --git a/src/pages/Wagon/WagonList.vue b/src/pages/Wagon/WagonList.vue index fd603243f..ce8ad5e97 100644 --- a/src/pages/Wagon/WagonList.vue +++ b/src/pages/Wagon/WagonList.vue @@ -77,112 +77,110 @@ function navigate(id) { } async function remove(row) { - try { - await axios.delete(`Wagons/${row.id}`).then(async () => { - quasar.notify({ - message: t('wagon.list.removeItem'), - type: 'positive', - }); - store.data.splice(store.data.indexOf(row), 1); - window.location.reload(); + await axios.delete(`Wagons/${row.id}`).then(async () => { + quasar.notify({ + message: t('wagon.list.removeItem'), + type: 'positive', }); - } catch (error) { - // - } + store.data.splice(store.data.indexOf(row), 1); + window.location.reload(); + }); } </script> - <template> <QPage class="column items-center q-pa-md"> <VnSection - :data-key="dataKey" - :columns="columns" - prefix="card" - :array-data-props="{ - url: 'Wagons', - exprBuilder, - }" - > - <template #body> - <VnTable - ref="tableRef" - :data-key="dataKey" - :create="{ - urlCreate: 'Wagons', - title: t('Create new wagon'), - onDataSaved: () => tableRef.reload(), - formInitialData: {}, - }" - :filter="filter" - :columns="columns" - order="id DESC" - :column-search="false" - :default-mode="'card'" - :disable-option="{ table: true }" - > - <template #more-create-dialog="{ data }"> - <VnInput - filled - v-model="data.label" - :label="t('wagon.create.label')" - type="number" - min="0" - :rules="[(val) => !!val || t('wagon.warnings.labelNotEmpty')]" - /> - <VnInput - filled - v-model="data.plate" - :label="t('wagon.list.plate')" - :rules="[(val) => !!val || t('wagon.warnings.plateNotEmpty')]" - /> - <VnInput - filled - v-model="data.volume" - :label="t('wagon.list.volume')" - type="number" - min="0" - :rules="[(val) => !!val || t('wagon.warnings.volumeNotEmpty')]" - /> - <VnSelect - url="WagonTypes" - filled - v-model="data.typeFk" - use-input - fill-input - hide-selected - input-debounce="0" - option-label="name" - option-value="id" - emit-value - map-options - :label="t('globals.type')" - :options="filteredWagonTypes" - :rules="[(val) => !!val || t('wagon.warnings.typeNotEmpty')]" - @filter="filterType" - > - <template v-if="data.typeFk" #append> - <QIcon - name="cancel" - @click.stop.prevent="data.typeFk = null" - class="cursor-pointer" - /> - </template> - <template #no-option> - <QItem> - <QItemSection class="text-grey"> - {{ t('wagon.warnings.noData') }} - </QItemSection> - </QItem> - </template> - </VnSelect> - </template> - </VnTable> - </template> - </VnSection> + :data-key="dataKey" + :columns="columns" + prefix="card" + :array-data-props="{ + url: 'Wagons', + exprBuilder, + }" + > + <template #body> + <VnTable + ref="tableRef" + :data-key="dataKey" + :create="{ + urlCreate: 'Wagons', + title: t('Create new wagon'), + onDataSaved: () => tableRef.reload(), + formInitialData: {}, + }" + :filter="filter" + :columns="columns" + order="id DESC" + :column-search="false" + :default-mode="'card'" + :disable-option="{ table: true }" + :right-search="false" + > + <template #more-create-dialog="{ data }"> + <VnInput + filled + v-model="data.label" + :label="t('wagon.create.label')" + type="number" + min="0" + :rules="[(val) => !!val || t('wagon.warnings.labelNotEmpty')]" + /> + <VnInput + filled + v-model="data.plate" + :label="t('wagon.list.plate')" + :rules="[(val) => !!val || t('wagon.warnings.plateNotEmpty')]" + /> + <VnInput + filled + v-model="data.volume" + :label="t('wagon.list.volume')" + type="number" + min="0" + :rules="[ + (val) => !!val || t('wagon.warnings.volumeNotEmpty'), + ]" + /> + <VnSelect + url="WagonTypes" + filled + v-model="data.typeFk" + use-input + fill-input + hide-selected + input-debounce="0" + option-label="name" + option-value="id" + emit-value + map-options + :label="t('globals.type')" + :options="filteredWagonTypes" + :rules="[(val) => !!val || t('wagon.warnings.typeNotEmpty')]" + @filter="filterType" + > + <template v-if="data.typeFk" #append> + <QIcon + name="cancel" + @click.stop.prevent="data.typeFk = null" + class="cursor-pointer" + /> + </template> + <template #no-option> + <QItem> + <QItemSection class="text-grey"> + {{ t('wagon.warnings.noData') }} + </QItemSection> + </QItem> + </template> + </VnSelect> + </template> + </VnTable> + </template> + </VnSection> </QPage> </template> <i18n> es: Create new wagon: Crear nuevo vagón -</i18n> \ No newline at end of file +</i18n> diff --git a/src/router/modules/wagon.js b/src/router/modules/wagon.js index d0f4b2281..9c0dceed4 100644 --- a/src/router/modules/wagon.js +++ b/src/router/modules/wagon.js @@ -1,17 +1,23 @@ import { RouterView } from 'vue-router'; const wagonCard = { - name: 'WagonCard', path: ':id', - component: () => import('src/pages/Ticket/Card/WagonCard.vue'), - redirect: { name: 'WagonSummary' }, + component: () => import('src/pages/Wagon/Card/WagonCard.vue'), + redirect: { name: 'WagonEdit' }, meta: { - //main: ['WagonList', 'WagonTypeList', 'WagonCounter', 'WagonTray'], - menu: [], + menu: ['WagonEdit'], }, children: [ - {}, + { + path: 'edit', + name: 'WagonEdit', + meta: { + title: 'wagonEdit', + icon: 'edit', + }, + component: () => import('src/pages/Wagon/WagonCreate.vue'), + }, ], }; @@ -23,7 +29,7 @@ export default { icon: 'vn:trolley', moduleName: 'Wagon', keyBinding: 'w', - menu: ['WagonList', 'WagonTypeList', 'WagonCounter', 'WagonTray'], + menu: ['WagonList', 'WagonTypeList', 'WagonCounter'], }, component: RouterView, redirect: { name: 'WagonMain' }, @@ -48,26 +54,8 @@ export default { icon: 'view_list', }, }, - - ] - }, - { - path: 'create', - name: 'WagonCreate', - meta: { - title: 'wagonCreate', - icon: 'create', - }, - component: () => import('src/pages/Wagon/WagonCreate.vue'), - }, - { - path: ':id/edit', - name: 'WagonEdit', - meta: { - title: 'wagonEdit', - icon: 'edit', - }, - component: () => import('src/pages/Wagon/WagonCreate.vue'), + wagonCard, + ], }, { path: 'counter', @@ -78,40 +66,32 @@ export default { }, component: () => import('src/pages/Wagon/WagonCounter.vue'), }, - ], - }, - { - path: '/wagon/type', - name: 'WagonTypeMain', - component: () => import('src/components/common/VnModule.vue'), - redirect: { name: 'WagonTypeList' }, - children: [ { - path: 'list', - name: 'WagonTypeList', - meta: { - title: 'typesList', - icon: 'view_list', - }, - component: () => import('src/pages/Wagon/Type/WagonTypeList.vue'), - }, - { - path: 'create', - name: 'WagonTypeCreate', - meta: { - title: 'typeCreate', - icon: 'create', - }, - component: () => import('src/pages/Wagon/Type/WagonTypeList.vue'), - }, - { - path: ':id/edit', - name: 'WagonTypeEdit', - meta: { - title: 'typeEdit', - icon: 'edit', - }, - component: () => import('src/pages/Wagon/Type/WagonTypeEdit.vue'), + path: 'type', + name: 'WagonTypeMain', + redirect: { name: 'WagonTypeList' }, + children: [ + { + path: 'list', + name: 'WagonTypeList', + meta: { + title: 'typesList', + icon: 'view_list', + }, + component: () => + import('src/pages/Wagon/Type/WagonTypeList.vue'), + }, + { + path: ':id/edit', + name: 'WagonTypeEdit', + meta: { + title: 'typeEdit', + icon: 'edit', + }, + component: () => + import('src/pages/Wagon/Type/WagonTypeEdit.vue'), + }, + ], }, ], }, From 8730bb60e932879eedb5ee2b8977f3c17cfa1d0f Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 6 Mar 2025 13:27:27 +0100 Subject: [PATCH 10/18] test: refs #8322 enable WagonCreate tests and update WagonTypeCreate navigation --- test/cypress/integration/wagon/wagonCreate.spec.js | 4 ++-- .../integration/wagon/wagonType/wagonTypeCreate.spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/cypress/integration/wagon/wagonCreate.spec.js b/test/cypress/integration/wagon/wagonCreate.spec.js index 6d185ea69..88855fdf9 100644 --- a/test/cypress/integration/wagon/wagonCreate.spec.js +++ b/test/cypress/integration/wagon/wagonCreate.spec.js @@ -1,4 +1,4 @@ -describe.skip('WagonCreate', () => { +describe('WagonCreate', () => { beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); @@ -17,7 +17,7 @@ describe.skip('WagonCreate', () => { '.grid-create > [label="Volume"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="Volume_input"]', ).type('100'); cy.selectOption('[data-cy="Type_select"]', '1'); - + cy.dataCy('FormModelPopup_save').click(); cy.get('[title="Remove"] > .q-btn__content > .q-icon').first().click(); }); }); diff --git a/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js b/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js index 49d7d9f01..915927a6d 100644 --- a/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js +++ b/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js @@ -2,7 +2,7 @@ describe('WagonTypeCreate', () => { beforeEach(() => { cy.viewport(1920, 1080); cy.login('developer'); - cy.visit('/#/wagon/type/create'); + cy.visit('/#/wagon/type/list'); cy.waitForElement('.q-page', 6000); }); From fa4a02e066d37b78d3ec36ca544a3f4373b93d76 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 6 Mar 2025 13:29:53 +0100 Subject: [PATCH 11/18] fix: refs #8322 update order property for WagonList component --- src/pages/Wagon/WagonList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Wagon/WagonList.vue b/src/pages/Wagon/WagonList.vue index ce8ad5e97..16c5fca63 100644 --- a/src/pages/Wagon/WagonList.vue +++ b/src/pages/Wagon/WagonList.vue @@ -96,6 +96,7 @@ async function remove(row) { :array-data-props="{ url: 'Wagons', exprBuilder, + order: 'id DESC', }" > <template #body> @@ -110,7 +111,6 @@ async function remove(row) { }" :filter="filter" :columns="columns" - order="id DESC" :column-search="false" :default-mode="'card'" :disable-option="{ table: true }" From 64ad46a4d964619196e02f30f3675a25ff802996 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Thu, 6 Mar 2025 13:44:22 +0100 Subject: [PATCH 12/18] refactor: refs #8322 remove keyBinding from Wagon router module --- src/router/modules/wagon.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/router/modules/wagon.js b/src/router/modules/wagon.js index 9c0dceed4..798c671eb 100644 --- a/src/router/modules/wagon.js +++ b/src/router/modules/wagon.js @@ -28,7 +28,6 @@ export default { title: 'wagons', icon: 'vn:trolley', moduleName: 'Wagon', - keyBinding: 'w', menu: ['WagonList', 'WagonTypeList', 'WagonCounter'], }, component: RouterView, From 6ffb62497b285b1168e3b777c42353ffec8fbd9c Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 6 Mar 2025 13:46:56 +0100 Subject: [PATCH 13/18] refactor: refs #8606 merged previous and e2e changes and corrected minor errors --- src/pages/Zone/Card/ZoneEventExclusionForm.vue | 3 ++- src/pages/Zone/Card/ZoneEventInclusionForm.vue | 2 -- src/pages/Zone/Card/ZoneEventsPanel.vue | 5 +++-- src/pages/Zone/Card/ZoneLocationsTree.vue | 3 ++- src/pages/Zone/ZoneList.vue | 17 +++++++++++++++++ src/pages/Zone/ZoneUpcoming.vue | 2 +- src/pages/Zone/locale/en.yml | 2 ++ src/pages/Zone/locale/es.yml | 2 ++ .../integration/zone/zoneCalendar.spec.js | 10 ++++------ .../cypress/integration/zone/zoneCreate.spec.js | 2 +- test/cypress/integration/zone/zoneList.spec.js | 2 -- .../integration/zone/zoneLocations.spec.js | 9 ++++++--- .../integration/zone/zoneWarehouse.spec.js | 2 +- 13 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 4b6aa52bd..3828c998f 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -171,9 +171,10 @@ onMounted(() => { openConfirmationModal( t('eventsPanel.deleteTitle'), t('eventsPanel.deleteSubtitle'), - () => deleteEvent() + () => deleteEvent(), ) " + data-cy="ZoneEventExclusionDeleteBtn" /> <QBtn :label="isNew ? t('globals.add') : t('globals.save')" diff --git a/src/pages/Zone/Card/ZoneEventInclusionForm.vue b/src/pages/Zone/Card/ZoneEventInclusionForm.vue index 88f8b30e4..b564b5417 100644 --- a/src/pages/Zone/Card/ZoneEventInclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventInclusionForm.vue @@ -159,12 +159,10 @@ onMounted(() => { <VnInputDate :label="t('eventsInclusionForm.from')" v-model="eventInclusionFormData.started" - data-cy="ZoneEventsFromDate" /> <VnInputDate :label="t('eventsInclusionForm.to')" v-model="eventInclusionFormData.ended" - data-cy="ZoneEventsToDate" /> </VnRow> <VnRow> diff --git a/src/pages/Zone/Card/ZoneEventsPanel.vue b/src/pages/Zone/Card/ZoneEventsPanel.vue index bb8c15934..6b8208026 100644 --- a/src/pages/Zone/Card/ZoneEventsPanel.vue +++ b/src/pages/Zone/Card/ZoneEventsPanel.vue @@ -67,7 +67,7 @@ watch( async () => { await fetchData(); }, - { immediate: true, deep: true } + { immediate: true, deep: true }, ); const formatWdays = (event) => { @@ -178,9 +178,10 @@ onMounted(async () => { openConfirmationModal( t('zone.deleteTitle'), t('zone.deleteSubtitle'), - () => deleteEvent(event.id) + () => deleteEvent(event.id), ) " + data-cy="ZoneEventsPanelDeleteBtn" > <QTooltip>{{ t('eventsPanel.delete') }}</QTooltip> </QBtn> diff --git a/src/pages/Zone/Card/ZoneLocationsTree.vue b/src/pages/Zone/Card/ZoneLocationsTree.vue index 0654a3ec2..083436440 100644 --- a/src/pages/Zone/Card/ZoneLocationsTree.vue +++ b/src/pages/Zone/Card/ZoneLocationsTree.vue @@ -161,7 +161,8 @@ onUnmounted(() => { :url="url" :redirect="false" :search-remove-params="false" - :label="$t('Search locations')" + :label="$t('zone.searchLocations')" + :info="$t('zone.searchLocationsInfo')" /> </Teleport> <VnInput diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index a36db8cc9..ea2c187e8 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -278,6 +278,23 @@ const exprBuilder = (param, value) => { </VnSection> </template> +<style lang="scss" scoped> +.table-container { + display: flex; + justify-content: center; +} +.column { + display: flex; + flex-direction: column; + align-items: center; + min-width: 70%; +} + +:deep(.shrink-column) { + width: 8%; +} +</style> + <i18n> es: Search zone: Buscar zona diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue index 6fcc00dd2..b8664dc2f 100644 --- a/src/pages/Zone/ZoneUpcoming.vue +++ b/src/pages/Zone/ZoneUpcoming.vue @@ -30,7 +30,7 @@ const columns = computed(() => [ label: t('list.id'), name: 'id', field: 'zoneFk', - align: 'left', + align: 'center', }, ]); diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index d72c9f9fd..36f5f63c1 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -17,6 +17,8 @@ zone: travelingDays: Traveling days search: Search zone searchInfo: Search zone by id or name + searchLocations: Search locations + searchLocationsInfo: Search locations by post code list: clone: Clone id: Id diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml index 6e005fc0d..777bc1c03 100644 --- a/src/pages/Zone/locale/es.yml +++ b/src/pages/Zone/locale/es.yml @@ -17,6 +17,8 @@ zone: travelingDays: Días de viaje search: Buscar zona searchInfo: Buscar zona por Id o nombre + searchLocations: Buscar localización + searchLocationsInfo: Buscar localización por código postal list: clone: Clonar id: Id diff --git a/test/cypress/integration/zone/zoneCalendar.spec.js b/test/cypress/integration/zone/zoneCalendar.spec.js index d71c29142..07661a17d 100644 --- a/test/cypress/integration/zone/zoneCalendar.spec.js +++ b/test/cypress/integration/zone/zoneCalendar.spec.js @@ -1,20 +1,18 @@ describe('ZoneCalendar', () => { const addEventBtn = '.q-page-sticky > div > .q-btn'; const submitBtn = '.q-mt-lg > .q-btn--standard'; - const deleteBtn = '.q-item__section--side > .q-btn'; - const from = '.q-field__control-container > [data-cy="ZoneEventsFromDate"]'; - const to = '.q-field__control-container > [data-cy="ZoneEventsToDate"]'; + const deleteBtn = '[data-cy="ZoneEventsPanelDeleteBtn"]'; beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit(`/#/zone/11/events`); + cy.visit(`/#/zone/13/events`); }); it('should include a one day event, then delete it', () => { cy.get(addEventBtn).click(); cy.dataCy('ZoneEventInclusionDayRadio').click(); - cy.get('.q-card > :nth-child(5)').type('02/04/2001'); + cy.get('.q-card > :nth-child(5)').type('01/01/2001'); cy.get(submitBtn).click(); cy.get(deleteBtn).click(); cy.dataCy('VnConfirm_confirm').click(); @@ -47,7 +45,7 @@ describe('ZoneCalendar', () => { cy.get( '.q-current-day > .q-calendar-month__day--content > [data-cy="ZoneCalendarDay"]', ).click(); - cy.get('.q-mt-lg > :nth-child(2)').click(); + cy.dataCy('ZoneEventExclusionDeleteBtn').click(); cy.dataCy('VnConfirm_confirm').click(); }); }); diff --git a/test/cypress/integration/zone/zoneCreate.spec.js b/test/cypress/integration/zone/zoneCreate.spec.js index 9ef1945bf..fadf5b07f 100644 --- a/test/cypress/integration/zone/zoneCreate.spec.js +++ b/test/cypress/integration/zone/zoneCreate.spec.js @@ -1,4 +1,4 @@ -describe.skip('ZoneCreate', () => { +describe('ZoneCreate', () => { const data = { Name: { val: 'Zone pickup D' }, Price: { val: '3' }, diff --git a/test/cypress/integration/zone/zoneList.spec.js b/test/cypress/integration/zone/zoneList.spec.js index b1b0db3fc..683f4e460 100644 --- a/test/cypress/integration/zone/zoneList.spec.js +++ b/test/cypress/integration/zone/zoneList.spec.js @@ -29,7 +29,5 @@ describe('ZoneList', () => { cy.dataCy('VnConfirm_confirm').click(); cy.url().should('not.include', 'zone/2/'); cy.url().should('match', /zone\/\d+\/basic-data/); - cy.get('.list-box > :nth-child(1)').should('include.text', agency); - cy.get('.title > span').should('include.text', 'Zone pickup B'); }); }); diff --git a/test/cypress/integration/zone/zoneLocations.spec.js b/test/cypress/integration/zone/zoneLocations.spec.js index 04b7f1991..cdc2c778b 100644 --- a/test/cypress/integration/zone/zoneLocations.spec.js +++ b/test/cypress/integration/zone/zoneLocations.spec.js @@ -3,7 +3,8 @@ describe('ZoneLocations', () => { Warehouse: { val: 'Warehouse One', type: 'select' }, }; - const postalCode = '[style=""] > :nth-child(1) > :nth-child(1) > :nth-child(2) > :nth-child(1) > :nth-child(1) > :nth-child(2) > :nth-child(1) > .q-tree__node--parent > .q-tree__node-collapsible > .q-tree__children' + const postalCode = + '[style=""] > :nth-child(1) > :nth-child(1) > :nth-child(2) > :nth-child(1) > :nth-child(1) > :nth-child(2) > :nth-child(1) > .q-tree__node--parent > .q-tree__node-collapsible > .q-tree__children'; beforeEach(() => { cy.viewport(1280, 720); @@ -12,12 +13,14 @@ describe('ZoneLocations', () => { }); it('should show all locations on entry', () => { - cy.get('.q-tree > :nth-child(1) > :nth-child(2) > :nth-child(1)').children().should('have.length', 9); + cy.get('.q-tree > :nth-child(1) > :nth-child(2) > :nth-child(1)') + .children() + .should('have.length', 9); }); it('should be able to search by postal code', () => { cy.get('#searchbarForm').type('46680'); cy.get('.router-link-active > .q-icon').click(); - cy.get(postalCode).should('include.text', '46680') + cy.get(postalCode).should('include.text', '46680'); }); }); diff --git a/test/cypress/integration/zone/zoneWarehouse.spec.js b/test/cypress/integration/zone/zoneWarehouse.spec.js index b2c1c1ed2..bca5ced22 100644 --- a/test/cypress/integration/zone/zoneWarehouse.spec.js +++ b/test/cypress/integration/zone/zoneWarehouse.spec.js @@ -1,4 +1,4 @@ -describe.skip('ZoneWarehouse', () => { +describe('ZoneWarehouse', () => { const data = { Warehouse: { val: 'Warehouse Two', type: 'select' }, }; From ac84537e19e425536ccd8bc82010da0c2ca24fd6 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 6 Mar 2025 13:49:32 +0100 Subject: [PATCH 14/18] refactor: refs #8606 clear some warnings --- src/components/TransferInvoiceForm.vue | 5 ++--- src/pages/InvoiceOut/InvoiceOutList.vue | 3 +-- src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue | 2 +- src/pages/Zone/Card/ZoneEventInclusionForm.vue | 1 - src/pages/Zone/Card/ZoneEventsPanel.vue | 3 +-- src/pages/Zone/ZoneDeliveryPanel.vue | 2 +- 6 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/components/TransferInvoiceForm.vue b/src/components/TransferInvoiceForm.vue index c4ef1454a..1434b79bc 100644 --- a/src/components/TransferInvoiceForm.vue +++ b/src/components/TransferInvoiceForm.vue @@ -87,7 +87,7 @@ const makeInvoice = async () => { (data) => ( (rectificativeTypeOptions = data), (transferInvoiceParams.cplusRectificationTypeFk = data.filter( - (type) => type.description == 'I – Por diferencias' + (type) => type.description == 'I – Por diferencias', )[0].id) ) " @@ -100,7 +100,7 @@ const makeInvoice = async () => { (data) => ( (siiTypeInvoiceOutsOptions = data), (transferInvoiceParams.siiTypeInvoiceOutFk = data.filter( - (type) => type.code == 'R4' + (type) => type.code == 'R4', )[0].id) ) " @@ -122,7 +122,6 @@ const makeInvoice = async () => { <VnRow> <VnSelect :label="t('Client')" - :options="clientsOptions" hide-selected option-label="name" option-value="id" diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index a6ec9923e..8038b1284 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -185,7 +185,7 @@ watchEffect(selectedRows); prefix="invoiceOut" :array-data-props="{ url: 'InvoiceOuts/filter', - order: ['id DESC'], + order: 'id DESC', }" > <template #advanced-menu> @@ -396,7 +396,6 @@ watchEffect(selectedRows); :label=" t('invoiceOutList.tableVisibleColumns.taxArea') " - :options="taxAreasOptions" option-label="code" option-value="code" /> diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index cd9836bb7..579ab8871 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -20,7 +20,7 @@ const props = defineProps({ <VnFilterPanel :data-key="props.dataKey" :search-button="true" - :un-removable-params="['from', 'to']" + :unremovable-params="['from', 'to']" :hidden-tags="['from', 'to']" > <template #tags="{ tag, formatFn }"> diff --git a/src/pages/Zone/Card/ZoneEventInclusionForm.vue b/src/pages/Zone/Card/ZoneEventInclusionForm.vue index b564b5417..fb552bb93 100644 --- a/src/pages/Zone/Card/ZoneEventInclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventInclusionForm.vue @@ -18,7 +18,6 @@ import axios from 'axios'; const props = defineProps({ date: { type: Date, - required: true, default: null, }, event: { diff --git a/src/pages/Zone/Card/ZoneEventsPanel.vue b/src/pages/Zone/Card/ZoneEventsPanel.vue index 6b8208026..48e900bf2 100644 --- a/src/pages/Zone/Card/ZoneEventsPanel.vue +++ b/src/pages/Zone/Card/ZoneEventsPanel.vue @@ -14,12 +14,10 @@ import { useVnConfirm } from 'composables/useVnConfirm'; const props = defineProps({ firstDay: { type: Date, - required: true, default: null, }, lastDay: { type: Date, - required: true, default: null, }, events: { @@ -49,6 +47,7 @@ const params = computed(() => ({ started: props.firstDay, ended: props.lastDay, })); +console.log('params: ', params); const arrayData = useArrayData('ZoneEvents', { params: params, url: `Zones/getEventsFiltered`, diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index 993ec274f..a8cb05afc 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -89,7 +89,7 @@ watch( v-model="formData.geoFk" url="Postcodes/location" :fields="['geoFk', 'code', 'townFk', 'countryFk']" - :sort-by="['code ASC']" + :sort-by="'code ASC'" option-value="geoFk" option-label="code" :filter-options="['code']" From 504f70ab5565cebd87a2ae25f6e5f2b35315dea7 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 7 Mar 2025 07:44:31 +0100 Subject: [PATCH 15/18] refactor: refs #8606 deleted code and fixed translation --- src/pages/Zone/Card/ZoneEventsPanel.vue | 1 - src/pages/Zone/locale/en.yml | 2 +- src/router/modules/zone.js | 9 --------- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/pages/Zone/Card/ZoneEventsPanel.vue b/src/pages/Zone/Card/ZoneEventsPanel.vue index 48e900bf2..82b34e3a2 100644 --- a/src/pages/Zone/Card/ZoneEventsPanel.vue +++ b/src/pages/Zone/Card/ZoneEventsPanel.vue @@ -47,7 +47,6 @@ const params = computed(() => ({ started: props.firstDay, ended: props.lastDay, })); -console.log('params: ', params); const arrayData = useArrayData('ZoneEvents', { params: params, url: `Zones/getEventsFiltered`, diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index 36f5f63c1..22f4b1ae6 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -11,7 +11,6 @@ zone: m3Max: Max m³ deleteTitle: This item will be deleted deleteSubtitle: Are you sure you want to continue? - volumetric: Volumetric bonus: Bonus closing: Closing travelingDays: Traveling days @@ -34,6 +33,7 @@ list: confirmCloneTitle: All it's properties will be copied confirmCloneSubtitle: Do you want to clone this zone? warehouse: Warehouse + isVolumetric: Volumetric createZone: Create zone zoneSummary: Summary addressFk: Address diff --git a/src/router/modules/zone.js b/src/router/modules/zone.js index a0a7d7c4f..f48a715b9 100644 --- a/src/router/modules/zone.js +++ b/src/router/modules/zone.js @@ -113,15 +113,6 @@ export default { zoneCard, ], }, - { - path: 'create', - name: 'ZoneCreate', - meta: { - title: 'zoneCreate', - icon: 'add', - }, - component: () => import('src/pages/Zone/ZoneList.vue'), - }, { path: 'delivery-days', name: 'ZoneDeliveryDays', From 69e5495ccb167682b7ba03a466115378faebdcaa Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 7 Mar 2025 11:23:34 +0100 Subject: [PATCH 16/18] refactor: refs #8606 requested changes --- cypress.config.js | 2 +- src/pages/Zone/ZoneFilterPanel.vue | 78 ------------------- src/pages/Zone/ZoneList.vue | 5 -- .../cypress/integration/zone/zoneList.spec.js | 18 ++--- 4 files changed, 6 insertions(+), 97 deletions(-) delete mode 100644 src/pages/Zone/ZoneFilterPanel.vue diff --git a/cypress.config.js b/cypress.config.js index d9cdbe728..645c4bbe2 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -45,7 +45,7 @@ export default defineConfig({ videosFolder: 'test/cypress/videos', downloadsFolder: 'test/cypress/downloads', video: false, - specPattern: 'test/cypress/integration/**/*.spec.js', + specPattern: 'test/cypress/integration/zone/*.spec.js', experimentalRunAllSpecs: true, watchForFileChanges: true, reporter, diff --git a/src/pages/Zone/ZoneFilterPanel.vue b/src/pages/Zone/ZoneFilterPanel.vue deleted file mode 100644 index 4a6f01038..000000000 --- a/src/pages/Zone/ZoneFilterPanel.vue +++ /dev/null @@ -1,78 +0,0 @@ -<script setup> -import { ref } from 'vue'; -import { useI18n } from 'vue-i18n'; -import VnInput from 'components/common/VnInput.vue'; -import FetchData from 'components/FetchData.vue'; -import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; -import VnSelect from 'components/common/VnSelect.vue'; -import order from 'src/router/modules/order'; - -const { t } = useI18n(); -const props = defineProps({ - dataKey: { - type: String, - required: true, - }, - exprBuilder: { - type: Function, - default: null, - }, -}); - -const agencies = ref([]); -</script> - -<template> - <FetchData - url="AgencyModes" - :filter="{ fields: ['id', 'name'], order: ['name ASC'] }" - @on-fetch="(data) => (agencies = data)" - auto-load - /> - <VnFilterPanel :data-key="props.dataKey" :search-button="true"> - <template #tags="{ tag }"> - <div class="q-gutter-x-xs"> - <strong>{{ t(`filterPanel.${tag.label}`) }}: </strong> - <span>{{ tag.value }}</span> - </div> - </template> - <template #body="{ params, searchFn }"> - <QItem> - <QItemSection> - <VnInput - :label="t('list.name')" - v-model="params.name" - is-outlined - data-cy="zoneFilterPanelNameInput" - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnSelect - :label="t('filterPanel.agencyModeFk')" - v-model="params.agencyModeFk" - :options="agencies" - option-value="id" - option-label="name" - @update:model-value="searchFn()" - dense - outlined - rounded - data-cy="zoneFilterPanelAgencySelect" - > - </VnSelect> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnInput - :label="t('list.price')" - v-model="params.price" - is-outlined - /> - </QItemSection> - </QItem> - </template> - </VnFilterPanel> -</template> diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index ea2c187e8..869b0c12c 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -15,7 +15,6 @@ import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnInputTime from 'src/components/common/VnInputTime.vue'; import VnSection from 'src/components/common/VnSection.vue'; -import ZoneFilterPanel from './ZoneFilterPanel.vue'; const { t } = useI18n(); const router = useRouter(); @@ -206,9 +205,6 @@ const exprBuilder = (param, value) => { exprBuilder, }" > - <template #advanced-menu> - <ZoneFilterPanel :data-key="dataKey" /> - </template> <template #body> <div class="table-container"> <div class="column items-center"> @@ -216,7 +212,6 @@ const exprBuilder = (param, value) => { ref="tableRef" :data-key="dataKey" :columns="columns" - :right-search="false" redirect="Zone" :create="{ urlCreate: 'Zones', diff --git a/test/cypress/integration/zone/zoneList.spec.js b/test/cypress/integration/zone/zoneList.spec.js index 683f4e460..c84b1b017 100644 --- a/test/cypress/integration/zone/zoneList.spec.js +++ b/test/cypress/integration/zone/zoneList.spec.js @@ -1,26 +1,18 @@ describe('ZoneList', () => { const agency = 'inhouse pickup'; + const firstSummaryIcon = + ':nth-child(1) > .q-table--col-auto-width > [data-cy="tableAction-0"]'; beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); cy.visit('/#/zone/list'); - }); - - it('should filter by agency', () => { - cy.dataCy('zoneFilterPanelAgencySelect').type(agency); - cy.get('.q-menu .q-item').contains(agency).click(); - cy.get(':nth-child(1) > [data-col-field="agencyModeFk"]').should( - 'include.text', - agency, - ); + cy.typeSearchbar('{enter}'); }); it('should open the zone summary', () => { - cy.dataCy('zoneFilterPanelAgencySelect').type(agency); - cy.get('.q-menu .q-item').contains(agency).click(); - cy.dataCy('tableAction-0').eq(1).click(); + cy.get(firstSummaryIcon).click(); cy.get('.header > .q-icon').click(); - cy.url().should('include', 'zone/2/summary'); + cy.url().should('include', 'zone/1/summary'); }); it('should clone the zone', () => { From 60ae21747f7098ed67d0b6360ab22f32a51dc8b7 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 7 Mar 2025 11:25:24 +0100 Subject: [PATCH 17/18] fix: refs #8606 deleted code --- cypress.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress.config.js b/cypress.config.js index 645c4bbe2..d9cdbe728 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -45,7 +45,7 @@ export default defineConfig({ videosFolder: 'test/cypress/videos', downloadsFolder: 'test/cypress/downloads', video: false, - specPattern: 'test/cypress/integration/zone/*.spec.js', + specPattern: 'test/cypress/integration/**/*.spec.js', experimentalRunAllSpecs: true, watchForFileChanges: true, reporter, From dfddab0892b11d5c1f8c5cf72fad4d34df7898b2 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 7 Mar 2025 13:19:31 +0100 Subject: [PATCH 18/18] test: skip route extended list tests in Cypress --- test/cypress/integration/route/routeExtendedList.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index da35066c3..5fda93b25 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -1,4 +1,4 @@ -describe('Route extended list', () => { +describe.skip('Route extended list', () => { const getSelector = (colField) => `tr:last-child > [data-col-field="${colField}"]`; const selectors = {