diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 426d99b9a..dc3e585f6 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -119,9 +119,10 @@ onMounted(async () => { // Podemos enviarle al form la estructura de data inicial sin necesidad de fetchearla state.set(modelValue, $props.formInitialData); - if ($props.autoLoad && !$props.formInitialData && $props.url) await fetch(); - else if (arrayData.store.data) updateAndEmit('onFetch', arrayData.store.data); - + if (!$props.formInitialData) { + if ($props.autoLoad && $props.url) await fetch(); + else if (arrayData.store.data) updateAndEmit(arrayData.store.data, 'onFetch'); + } if ($props.observeFormChanges) { watch( () => formData.value, diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index f4e97c239..1eb9bbc0f 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -24,7 +24,7 @@ const agenciesOptions = ref([]); <FormModel :url="`Travels/${route.params.id}`" :url-update="`Travels/${route.params.id}`" - model="travel" + model="Travel" auto-load > <template #form="{ data }"> diff --git a/src/pages/Travel/Card/TravelCard.vue b/src/pages/Travel/Card/TravelCard.vue index 1d591f064..bf7e6d57a 100644 --- a/src/pages/Travel/Card/TravelCard.vue +++ b/src/pages/Travel/Card/TravelCard.vue @@ -1,7 +1,40 @@ <script setup> import VnCard from 'components/common/VnCard.vue'; import TravelDescriptor from './TravelDescriptor.vue'; + +const filter = { + fields: [ + 'id', + 'ref', + 'shipped', + 'landed', + 'totalEntries', + 'warehouseInFk', + 'warehouseOutFk', + 'cargoSupplierFk', + 'agencyModeFk', + ], + include: [ + { + relation: 'warehouseIn', + scope: { + fields: ['name'], + }, + }, + { + relation: 'warehouseOut', + scope: { + fields: ['name'], + }, + }, + ], +}; </script> <template> - <VnCard data-key="Travel" base-url="Travels" :descriptor="TravelDescriptor" /> + <VnCard + data-key="Travel" + :filter="filter" + base-url="Travels" + :descriptor="TravelDescriptor" + /> </template> diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index c7501b1d4..975beb9ab 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -52,23 +52,15 @@ const filter = { const entityId = computed(() => { return $props.id || route.params.id; }); - -const data = ref(useCardDescription()); - -const setData = (entity) => { - data.value = useCardDescription(entity.ref, entity.id); -}; </script> <template> <CardDescriptor module="Travel" :url="`Travels/${entityId}`" - :title="data.title" - :subtitle="data.subtitle" + title="ref" :filter="filter" - @on-fetch="setData" - data-key="travelData" + data-key="Travel" > <template #header-extra-action> <QBtn diff --git a/src/pages/Travel/Card/TravelDescriptorMenuItems.vue b/src/pages/Travel/Card/TravelDescriptorMenuItems.vue index 17b9333ca..1bb80ff01 100644 --- a/src/pages/Travel/Card/TravelDescriptorMenuItems.vue +++ b/src/pages/Travel/Card/TravelDescriptorMenuItems.vue @@ -32,10 +32,11 @@ const cloneTravel = () => { redirectToCreateView(stringifiedTravelData); }; -const cloneTravelWithEntries = () => { +const cloneTravelWithEntries = async () => { try { - axios.post(`Travels/${$props.travel.id}/cloneWithEntries`); + const { data } = await axios.post(`Travels/${$props.travel.id}/cloneWithEntries`); notify('globals.dataSaved', 'positive'); + router.push({ name: 'TravelBasicData', params: { id: data.id } }); } catch (err) { console.err('Error cloning travel with entries'); } diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 7fc92e7b6..91b36f0cf 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -8,7 +8,6 @@ import VnLv from 'src/components/ui/VnLv.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; import FetchData from 'src/components/FetchData.vue'; -import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue'; import { toDate, toCurrency } from 'src/filters'; import axios from 'axios'; @@ -222,6 +221,8 @@ async function setTravelData(travelData) { console.error(`Error setting travel data`, err); } } + +const getLink = (param) => `#/travel/${entityId.value}/${param}`; </script> <template> @@ -240,21 +241,15 @@ async function setTravelData(travelData) { <template #header> <span>{{ travel.ref }} - {{ travel.id }}</span> </template> - <template #header-right> - <QBtn color="white" dense flat icon="more_vert" round size="md"> - <QTooltip> - {{ t('components.cardDescriptor.moreOptions') }} - </QTooltip> - <QMenu> - <QList> - <TravelDescriptorMenuItems :travel="travel" /> - </QList> - </QMenu> - </QBtn> - </template> <template #body> <QCard class="vn-one"> + <QCardSection class="q-pa-none"> + <VnTitle + :url="getLink('basic-data')" + :text="t('travel.pageTitles.basicData')" + /> + </QCardSection> <VnLv :label="t('globals.shipped')" :value="toDate(travel.shipped)" /> <VnLv :label="t('globals.wareHouseOut')" @@ -267,6 +262,12 @@ async function setTravelData(travelData) { /> </QCard> <QCard class="vn-one"> + <QCardSection class="q-pa-none"> + <VnTitle + :url="getLink('basic-data')" + :text="t('travel.pageTitles.basicData')" + /> + </QCardSection> <VnLv :label="t('globals.landed')" :value="toDate(travel.landed)" /> <VnLv :label="t('globals.wareHouseIn')" @@ -279,12 +280,18 @@ async function setTravelData(travelData) { /> </QCard> <QCard class="vn-one"> + <QCardSection class="q-pa-none"> + <VnTitle + :url="getLink('basic-data')" + :text="t('travel.pageTitles.basicData')" + /> + </QCardSection> <VnLv :label="t('globals.agency')" :value="travel.agency?.name" /> <VnLv :label="t('globals.reference')" :value="travel.ref" /> <VnLv label="m³" :value="travel.m3" /> <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" /> </QCard> - <QCard class="full-width" v-if="entriesTableRows.length > 0"> + <QCard class="full-width"> <VnTitle :text="t('travel.summary.entries')" /> <QTable :rows="entriesTableRows" @@ -299,13 +306,15 @@ async function setTravelData(travelData) { </QTh> </QTr> </template> - <template #body-cell-isConfirmed="{ col, value }"> + <template #body-cell-isConfirmed="{ col, row }"> <QTd> - <QIcon + <QCheckbox v-if="col.name === 'isConfirmed'" - :name="value ? 'check' : 'close'" - :color="value ? 'positive' : 'negative'" - size="sm" + :label="t('travel.summary.received')" + :true-value="1" + :false-value="0" + v-model="row[col.name]" + :disable="true" /> </QTd> </template> diff --git a/src/pages/Travel/TravelCreate.vue b/src/pages/Travel/TravelCreate.vue index 53c8d402d..0c734a367 100644 --- a/src/pages/Travel/TravelCreate.vue +++ b/src/pages/Travel/TravelCreate.vue @@ -15,29 +15,19 @@ const { t } = useI18n(); const route = useRoute(); const router = useRouter(); -const newTravelForm = reactive({ - ref: null, - agencyModeFk: null, - shipped: null, - landed: null, - warehouseOutFk: null, - warehouseInFk: null, -}); - const agenciesOptions = ref([]); const warehousesOptions = ref([]); const viewAction = ref(); +const newTravelForm = ref({}); onBeforeMount(() => { - // Esto nos permite decirle a FormModel si queremos observar los cambios o no - // Ya que si queremos clonar queremos que nos permita guardar inmediatamente sin realizar cambios en el form viewAction.value = route.query.travelData ? 'clone' : 'create'; if (route.query.travelData) { const travelData = JSON.parse(route.query.travelData); - for (let key in newTravelForm) { - newTravelForm[key] = travelData[key]; - } + + newTravelForm.value = { ...newTravelForm.value, ...travelData }; + delete newTravelForm.value.id; } }); @@ -60,8 +50,8 @@ const redirectToTravelBasicData = (_, { id }) => { <QPage> <VnSubToolbar /> <FormModel - url-update="Travels" - model="travel" + url-create="Travels" + model="travelCreate" :form-initial-data="newTravelForm" :observe-form-changes="viewAction === 'create'" @on-data-saved="redirectToTravelBasicData"