0
0
Fork 0

Upcoming deliveries

This commit is contained in:
William Buezas 2024-05-14 12:03:43 -03:00
parent dcbf2eb837
commit cbe44c97f6
9 changed files with 155 additions and 180 deletions

View File

@ -91,12 +91,6 @@ async function search() {
if (!props.redirect) return; if (!props.redirect) return;
if (props.customRouteRedirectName)
return router.push({
name: props.customRouteRedirectName,
params: { id: searchText.value },
});
const { matched: matches } = router.currentRoute.value; const { matched: matches } = router.currentRoute.value;
const { path } = matches.at(-1); const { path } = matches.at(-1);
const [, moduleName] = path.split('/'); const [, moduleName] = path.split('/');
@ -105,6 +99,13 @@ async function search() {
return router.push({ path: `/${moduleName}/list` }); return router.push({ path: `/${moduleName}/list` });
const targetId = store.data[0].id; const targetId = store.data[0].id;
if (props.customRouteRedirectName && targetId)
return router.push({
name: props.customRouteRedirectName,
params: { id: targetId },
});
let targetUrl; let targetUrl;
if (path.endsWith('/list')) targetUrl = path.replace('/list', `/${targetId}/summary`); if (path.endsWith('/list')) targetUrl = path.replace('/list', `/${targetId}/summary`);

View File

@ -8,7 +8,7 @@ import ZoneDescriptor from './ZoneDescriptor.vue';
base-url="Zones" base-url="Zones"
:descriptor="ZoneDescriptor" :descriptor="ZoneDescriptor"
searchbar-data-key="ZoneList" searchbar-data-key="ZoneList"
searchbar-url="Zones/filter" searchbar-url="Zones"
searchbar-label="Search zones" searchbar-label="Search zones"
searchbar-info="You can search by zone reference" searchbar-info="You can search by zone reference"
/> />

View File

@ -73,7 +73,6 @@ const setData = (entity) => {
<ZoneDescriptorMenuItems :zone="entity" /> <ZoneDescriptorMenuItems :zone="entity" />
</template> --> </template> -->
<template #body="{ entity }"> <template #body="{ entity }">
{{ console.log('entity', entity) }}
<VnLv :label="t('summary.agency')" :value="entity.agencyMode.name" /> <VnLv :label="t('summary.agency')" :value="entity.agencyMode.name" />
<VnLv :label="t('summary.closeHour')" :value="toTimeFormat(entity.hour)" /> <VnLv :label="t('summary.closeHour')" :value="toTimeFormat(entity.hour)" />
<VnLv :label="t('summary.travelingDays')" :value="entity.travelingDays" /> <VnLv :label="t('summary.travelingDays')" :value="entity.travelingDays" />

View File

@ -2,14 +2,10 @@
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { onMounted, computed } from 'vue'; import { onMounted, computed } from 'vue';
import { dashIfEmpty, toCurrency, toDate } from 'src/filters'; import { toCurrency } from 'src/filters';
import VnPaginate from 'src/components/ui/VnPaginate.vue'; import VnPaginate from 'src/components/ui/VnPaginate.vue';
import CardList from 'components/ui/CardList.vue';
import VnLv from 'components/ui/VnLv.vue';
import ZoneSummary from 'src/pages/Zone/Card/ZoneSummary.vue'; import ZoneSummary from 'src/pages/Zone/Card/ZoneSummary.vue';
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
import ZoneFilterPanel from './ZoneFilterPanel.vue';
import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import { toTimeFormat } from 'src/filters/date'; import { toTimeFormat } from 'src/filters/date';
@ -76,35 +72,6 @@ const columns = computed(() => [
}, },
]); ]);
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':
if (value) {
if (!isNaN(value)) {
return { id: value };
} else {
return {
name: {
like: `%${value}%`,
},
};
}
}
}
};
async function clone(id) { async function clone(id) {
const { data } = await axios.post(`Zones/${id}/clone`); const { data } = await axios.post(`Zones/${id}/clone`);
notify(t('globals.dataSaved'), 'positive'); notify(t('globals.dataSaved'), 'positive');
@ -123,25 +90,6 @@ onMounted(async () => {
</script> </script>
<template> <template>
<template v-if="stateStore.isHeaderMounted()">
<Teleport to="#searchbar">
<VnSearchbar
data-key="ZoneList"
url="Zones"
:filter="{
include: { relation: 'agencyMode', scope: { fields: ['name'] } },
}"
:expr-builder="exprBuilder"
:label="t('list.searchZone')"
:info="t('list.searchInfo')"
/>
</Teleport>
</template>
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
<QScrollArea class="fit text-grey-8">
<ZoneFilterPanel data-key="ZoneList" :expr-builder="exprBuilder" />
</QScrollArea>
</QDrawer>
<QPage class="column items-center q-pa-md"> <QPage class="column items-center q-pa-md">
<div class="vn-card-list"> <div class="vn-card-list">
<VnPaginate <VnPaginate

View File

@ -1,11 +1,72 @@
<script setup> <script setup>
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import { useStateStore } from 'stores/useStateStore'; import { useStateStore } from 'stores/useStateStore';
import LeftMenu from 'src/components/LeftMenu.vue'; import LeftMenu from 'src/components/LeftMenu.vue';
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
import ZoneFilterPanel from './ZoneFilterPanel.vue';
const { t } = useI18n();
const stateStore = useStateStore(); const stateStore = useStateStore();
const route = useRoute();
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':
if (value) {
if (!isNaN(value)) {
return { id: value };
} else {
return {
name: {
like: `%${value}%`,
},
};
}
}
}
};
</script> </script>
<template> <template>
<template v-if="stateStore.isHeaderMounted()">
<Teleport to="#searchbar">
<VnSearchbar
data-key="ZoneList"
url="Zones"
:filter="{
include: { relation: 'agencyMode', scope: { fields: ['name'] } },
}"
:expr-builder="exprBuilder"
:label="t('list.searchZone')"
:info="t('list.searchInfo')"
custom-route-redirect-name="ZoneSummary"
/>
</Teleport>
</template>
<QDrawer
v-if="route.name === 'ZoneList'"
v-model="stateStore.rightDrawer"
side="right"
:width="256"
show-if-above
>
<QScrollArea class="fit text-grey-8">
<ZoneFilterPanel data-key="ZoneList" :expr-builder="exprBuilder" />
</QScrollArea>
</QDrawer>
<QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256"> <QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
<QScrollArea class="fit text-grey-8"> <QScrollArea class="fit text-grey-8">
<LeftMenu /> <LeftMenu />

View File

@ -1,53 +1,84 @@
<script setup> <script setup>
import { ref, computed } from 'vue'; import { ref, computed, onMounted } from 'vue';
import ZoneFilterPanel from 'components/InvoiceOutNegativeFilter.vue';
import VnSubToolbar from 'components/ui/VnSubToolbar.vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import VnSubToolbar from 'components/ui/VnSubToolbar.vue';
import FetchData from 'components/FetchData.vue';
import { toDateFormat } from 'src/filters/date.js';
import { useWeekdayStore } from 'src/stores/useWeekdayStore';
const { t } = useI18n(); const { t } = useI18n();
const arrayData = ref(null); const weekdayStore = useWeekdayStore();
const rows = computed(() => arrayData.value.store.data);
const details = ref([]);
const columns = computed(() => [ const columns = computed(() => [
{ {
label: t('Province'), label: t('upcomingDeliveries.province'),
//field: '', name: 'province',
//name: '', field: 'name',
align: 'left', align: 'left',
}, },
{ {
label: t('Closing'), label: t('upcomingDeliveries.closing'),
//field: '', name: 'closing',
//name: '', field: 'hour',
align: 'left', align: 'left',
}, },
{ {
label: t('Id'), label: t('upcomingDeliveries.id'),
//field: '', name: 'id',
//name: '', field: 'zoneFk',
align: 'left', align: 'left',
}, },
]); ]);
function getWeekDay(jsonDate) { const getWeekDayName = (date) => {
const weekDay = new Date(jsonDate).getDay(); const weekDay = new Date(date).getDay();
return t(`weekdays.${weekdayStore.weekdays[weekDay].code}`);
};
return this.days[weekDay].locale; const getHeaderTitle = (date) => {
} return `${getWeekDayName(date)} - ${toDateFormat(date)}`;
};
onMounted(() => weekdayStore.initStore());
</script> </script>
<template> <template>
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above> <FetchData
<QScrollArea class="fit text-grey-8"> url="Zones/getUpcomingDeliveries"
<ZoneFilterPanel data-key="ZoneUpcoming" /> @on-fetch="(data) => (details = data)"
</QScrollArea> auto-load
</QDrawer> />
<VnSubToolbar /> <VnSubToolbar />
<QPage class="column items-center q-pa-md"> <QPage class="column items-center q-pa-md">
<span> <QCard class="full-width">
{{ t(`${getWeekDay(/*detail.shipped*/)}`) }} - <div
{{ t /*'detail.shipped'*/() }} v-for="(detail, index) in details"
</span> :key="index"
<QTable :columns="columns" :rows="rows" class="full-width q-mt-md"> </QTable> class="full-width flex q-mb-lg"
>
<span class="header">
{{ getHeaderTitle(detail.shipped) }}
</span>
<QTable :columns="columns" :rows="detail.lines" class="full-width" />
</div>
</QCard>
</QPage> </QPage>
</template> </template>
<style scoped lang="scss">
.header {
min-width: 100% !important;
display: flex;
align-items: center;
padding-left: 8px;
height: 35px;
border-bottom: 1px solid $primary;
background-color: black;
font-size: 19px;
font-weight: bold;
}
</style>

View File

@ -2,8 +2,9 @@ zone:
pageTitles: pageTitles:
zones: Zone zones: Zone
zonesList: Zones zonesList: Zones
zoneCreate: Create zone
deliveryList: Delivery days deliveryList: Delivery days
upcomingList: Upcoming deliveries upcomingDeliveries: Upcoming deliveries
list: list:
clone: Clone clone: Clone
id: Id id: Id
@ -13,18 +14,15 @@ list:
price: Price price: Price
create: Create zone create: Create zone
openSummary: Details openSummary: Details
confirmCloneTitle: All it's properties will be copied
confirmCloneSubtitle: Do you want to clone this zone?
searchZone: Search zones searchZone: Search zones
searchInfo: Search zone by id or name searchInfo: Search zone by id or name
confirmCloneTitle: All it's properties will be copied
confirmCloneSubtitle: Do you want to clone this zone?
create: create:
name: Name name: Name
agency: Agency agency: Agency
close: Close close: Close
price: Price price: Price
type:
submit: Save
reset: Reset
summary: summary:
agency: Agency agency: Agency
price: Price price: Price
@ -38,3 +36,7 @@ summary:
filterPanel: filterPanel:
name: Name name: Name
agencyModeFk: Agency agencyModeFk: Agency
upcomingDeliveries:
province: Province
closing: Closing
id: Id

View File

@ -2,8 +2,9 @@ zone:
pageTitles: pageTitles:
zones: Zonas zones: Zonas
zonesList: Zonas zonesList: Zonas
zoneCreate: Nueva zona
deliveryList: Días de entrega deliveryList: Días de entrega
upcomingList: Próximos repartos upcomingDeliveries: Próximos repartos
list: list:
clone: Clonar clone: Clonar
id: Id id: Id
@ -13,18 +14,15 @@ list:
price: Precio price: Precio
create: Crear zona create: Crear zona
openSummary: Detalles openSummary: Detalles
confirmCloneTitle: Todas sus propiedades serán copiadas
confirmCloneSubtitle: ¿Seguro que quieres clonar esta zona?
searchZone: Buscar zonas searchZone: Buscar zonas
searchInfo: Buscar zonas por identificador o nombre searchInfo: Buscar zonas por identificador o nombre
confirmCloneTitle: Todas sus propiedades serán copiadas
confirmCloneSubtitle: ¿Seguro que quieres clonar esta zona?
create: create:
name: Nombre name: Nombre
agency: Agencia agency: Agencia
close: Cierre close: Cierre
price: Precio price: Precio
type:
submit: Guardar
reset: Reiniciar
summary: summary:
agency: Agencia agency: Agencia
price: Precio price: Precio
@ -38,5 +36,7 @@ summary:
filterPanel: filterPanel:
name: Nombre name: Nombre
agencyModeFk: Agencia agencyModeFk: Agencia
Search zones: Buscar zonas upcomingDeliveries:
You can search by zone reference: Puedes buscar por referencia de la zona province: Provincia
closing: Cierre
id: Id

View File

@ -11,7 +11,7 @@ export default {
component: RouterView, component: RouterView,
redirect: { name: 'ZoneMain' }, redirect: { name: 'ZoneMain' },
menus: { menus: {
main: ['ZoneList', 'ZoneDeliveryList', 'ZoneUpcomingList'], main: ['ZoneList', 'ZoneDeliveryList', 'ZoneUpcomingDeliveries'],
card: ['ZoneBasicData'], card: ['ZoneBasicData'],
}, },
children: [ children: [
@ -57,6 +57,15 @@ export default {
}, },
component: () => import('src/pages/Zone/ZoneCounter.vue'), component: () => import('src/pages/Zone/ZoneCounter.vue'),
}, },
{
name: 'ZoneUpcomingDeliveries',
path: 'upcoming-deliveries',
meta: {
title: 'upcomingDeliveries',
icon: 'vn:calendar',
},
component: () => import('src/pages/Zone/ZoneUpcoming.vue'),
},
], ],
}, },
{ {
@ -83,82 +92,6 @@ export default {
}, },
component: () => import('src/pages/Zone/Card/ZoneBasicData.vue'), component: () => import('src/pages/Zone/Card/ZoneBasicData.vue'),
}, },
// {
// path: '/zone/delivery',
// name: 'ZoneDeliveryMain',
// component: () => import('src/pages/Zone/ZoneMain.vue'),
// redirect: { name: 'ZoneDeliveryList' },
// children: [
// {
// path: 'list',
// name: 'ZoneDeliveryList',
// meta: {
// title: 'deliveryList',
// icon: 'today',
// },
// component: () =>
// import('src/pages/Zone/Delivery/ZoneDeliveryList.vue'),
// },
// {
// path: 'create',
// name: 'ZoneDeliveryCreate',
// meta: {
// title: 'deliveryCreate',
// icon: 'create',
// },
// component: () =>
// import('src/pages/Zone/Delivery/ZoneDeliveryCreate.vue'),
// },
// {
// path: ':id/edit',
// name: 'ZoneDeliveryEdit',
// meta: {
// title: 'deliveryEdit',
// icon: 'edit',
// },
// component: () =>
// import('src/pages/Zone/Delivery/ZoneDeliveryCreate.vue'),
// },
// ],
// },
// {
// path: '/zone/upcoming',
// name: 'ZoneUpcomingMain',
// component: () => import('src/pages/Zone/ZoneMain.vue'),
// redirect: { name: 'ZoneUpcomingList' },
// children: [
// {
// path: 'list',
// name: 'ZoneUpcomingList',
// meta: {
// title: 'upcomingList',
// icon: 'today',
// },
// component: () =>
// import('src/pages/Zone/Upcoming/ZoneUpcomingList.vue'),
// },
// {
// path: 'create',
// name: 'ZoneUpcomingCreate',
// meta: {
// title: 'upcomingCreate',
// icon: 'create',
// },
// component: () =>
// import('src/pages/Zone/Upcoming/ZoneUpcomingCreate.vue'),
// },
// {
// path: ':id/edit',
// name: 'ZoneUpcomingEdit',
// meta: {
// title: 'upcomingEdit',
// icon: 'edit',
// },
// component: () =>
// import('src/pages/Zone/Upcoming/ZoneUpcomingCreate.vue'),
// },
// ],
// },
], ],
}, },
], ],