0
0
Fork 0

Merge pull request 'Zone warehouses' (!385) from hyervoni/salix-front-mindshore:feature/ZoneWarehouses into dev

Reviewed-on: verdnatura/salix-front#385
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
This commit is contained in:
Javier Segarra 2024-05-20 06:44:36 +00:00
commit 8787db8622
7 changed files with 207 additions and 128 deletions

View File

@ -1,8 +1,35 @@
<script setup> <script setup>
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import { computed } from 'vue';
import VnCard from 'components/common/VnCard.vue'; import VnCard from 'components/common/VnCard.vue';
import ZoneDescriptor from './ZoneDescriptor.vue'; import ZoneDescriptor from './ZoneDescriptor.vue';
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
import { useStateStore } from 'stores/useStateStore';
const { t } = useI18n();
const stateStore = useStateStore();
const route = useRoute();
const routeName = computed(() => route.name);
const searchBarDataKeys = {
ZoneWarehouses: 'ZoneWarehouses',
ZoneSummary: 'ZoneSummary',
};
</script> </script>
<template> <template>
<template v-if="stateStore.isHeaderMounted()">
<Teleport to="#searchbar">
<VnSearchbar
:data-key="searchBarDataKeys[routeName]"
:custom-route-redirect-name="routeName"
:label="t('list.searchZone')"
:info="t('list.searchInfo')"
/>
</Teleport>
</template>
<VnCard <VnCard
data-key="Zone" data-key="Zone"
base-url="Zones" base-url="Zones"

View File

@ -0,0 +1,47 @@
<script setup>
import { reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import VnSelect from 'src/components/common/VnSelect.vue';
import FetchData from 'components/FetchData.vue';
import VnRow from 'components/ui/VnRow.vue';
import FormPopup from 'components/FormPopup.vue';
const emit = defineEmits(['onSubmitCreateWarehouse']);
const { t } = useI18n();
const ZoneWarehouseFormData = reactive({
warehouseFk: null,
});
const warehousesOptions = ref([]);
</script>
<template>
<FetchData
url="Warehouses"
:filter="{ order: 'name' }"
auto-load
@on-fetch="(data) => (warehousesOptions = data)"
/>
<FormPopup
model="ZoneWarehouse"
@on-submit="emit('onSubmitCreateWarehouse', ZoneWarehouseFormData)"
>
<template #form-inputs>
<VnRow class="row q-gutter-md q-mb-md">
<div class="col">
<VnSelect
:label="t('warehouses.warehouse')"
v-model="ZoneWarehouseFormData.warehouseFk"
:options="warehousesOptions"
option-value="id"
option-label="name"
hide-selected
:required="true"
/>
</div>
</VnRow>
</template>
</FormPopup>
</template>

View File

@ -74,20 +74,20 @@ function openConfirmDialog(callback) {
<QItemSection avatar> <QItemSection avatar>
<QIcon name="delete" /> <QIcon name="delete" />
</QItemSection> </QItemSection>
<QItemSection>{{ t('deleteOrder') }}</QItemSection> <QItemSection>{{ t('deleteZone') }}</QItemSection>
</QItem> </QItem>
</template> </template>
<i18n> <i18n>
en: en:
deleteOrder: Delete order deleteZone: Delete zone
confirmDeletion: Confirm deletion confirmDeletion: Confirm deletion
confirmDeletionMessage: Are you sure you want to delete this order? confirmDeletionMessage: Are you sure you want to delete this zone?
es: es:
To clone zone: Clonar zone To clone zone: Clonar zone
deleteOrder: Eliminar pedido deleteZone: Eliminar zona
confirmDeletion: Confirmar eliminación confirmDeletion: Confirmar eliminación
confirmDeletionMessage: Seguro que quieres eliminar este pedido? confirmDeletionMessage: Seguro que quieres eliminar este zona?
</i18n> </i18n>

View File

@ -1,53 +1,119 @@
<script setup> <script setup>
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import VnPaginate from 'components/ui/VnPaginate.vue'; import VnPaginate from 'components/ui/VnPaginate.vue';
import CardList from 'components/CardList.vue'; import ZoneCreateWarehouse from './ZoneCreateWarehouse.vue';
import VnLv from 'components/ui/VnLv.vue';
import { useVnConfirm } from 'composables/useVnConfirm';
import { useArrayData } from 'composables/useArrayData';
import axios from 'axios';
const { t } = useI18n();
const route = useRoute(); const route = useRoute();
const { openConfirmationModal } = useVnConfirm();
const deleteWarehouse = () => { const paginateRef = ref(null);
return true; const createWarehouseDialogRef = ref(null);
const arrayData = useArrayData('ZoneWarehouses');
const store = arrayData.store;
const data = computed(() => store.data);
const urlPath = computed(() => `Zones/${route.params.id}/warehouses`);
const columns = computed(() => [
{
name: 'name',
},
{
name: 'action',
},
]);
const deleteWarehouse = async (row) => {
try {
await axios.delete(`${urlPath.value}/${row.id}`);
fetchWarehouses();
} catch (error) {
console.error(error);
}
}; };
const createZoneWarehouse = async (ZoneWarehouseFormData) => {
try {
await axios.post(urlPath.value, ZoneWarehouseFormData);
fetchWarehouses();
} catch (error) {
console.error(error);
}
};
watch(
() => route.params.id,
() => {
store.url = urlPath.value;
store.filter.include = 'warehouse';
fetchWarehouses();
}
);
const fetchWarehouses = () => paginateRef.value.fetch();
const openCreateWarehouseForm = () => createWarehouseDialogRef.value.show();
</script> </script>
<template> <template>
<QPage class="column items-center q-pa-md"> <QPage class="column items-center q-pa-md">
<div class="vn-card-list"> <div class="full-width" style="max-width: 400px">
<VnPaginate <VnPaginate
ref="paginateRef"
data-key="ZoneWarehouses" data-key="ZoneWarehouses"
:url="`Zones/${route.params.id}/warehouses`" :filter="{ include: 'warehouse' }"
:url="urlPath"
auto-load auto-load
> >
<template #body="{ rows }"> <template #body="{ rows }">
<CardList <QTable :rows="data" :columns="columns" hide-header>
v-for="row of rows" <template #body="{ row, rowIndex }">
:key="row.id" <QTr>
:title="row.name" <QTd>
:id="row.id" <span>{{ row.warehouse?.name }}</span>
> </QTd>
<template #list-items> <QTd style="width: 50px !important">
<VnLv :value="row.name" /> <QIcon
<QIcon name="delete"
name="delete" size="sm"
size="sm" class="cursor-pointer"
class="cursor-pointer" color="primary"
color="primary" @click="
@click="deleteWarehouse()" openConfirmationModal(
> t('warehouses.deleteTitle'),
<QTooltip> t('warehouses.deleteSubtitle'),
{{ t('Remove row') }} () => deleteWarehouse(row, rows, rowIndex)
</QTooltip> )
</QIcon> "
>
<QTooltip>
{{ t('warehouses.delete') }}
</QTooltip>
</QIcon>
</QTd>
</QTr>
</template> </template>
</CardList> </QTable>
</template> </template>
</VnPaginate> </VnPaginate>
</div> </div>
<QDialog ref="createWarehouseDialogRef">
<ZoneCreateWarehouse @on-submit-create-warehouse="createZoneWarehouse" />
</QDialog>
<QPageSticky position="bottom-right" :offset="[18, 18]">
<QBtn fab icon="add" color="primary" @click="openCreateWarehouseForm()">
<QTooltip>{{ t('warehouses.add') }}</QTooltip>
</QBtn>
</QPageSticky>
</QPage> </QPage>
</template> </template>
<i18n>
es:
Remove row: Eliminar fila
</i18n>

View File

@ -3,8 +3,10 @@ zone:
zones: Zone zones: Zone
zonesList: Zones zonesList: Zones
zoneCreate: Create zone zoneCreate: Create zone
locations: Locations
deliveryDays: Delivery days deliveryDays: Delivery days
upcomingList: Upcoming deliveries upcomingList: Upcoming deliveries
warehouses: Warehouses
list: list:
clone: Clone clone: Clone
id: Id id: Id
@ -56,3 +58,9 @@ zoneClosingTable:
price: Price price: Price
preview: Preview preview: Preview
zones: Zones zones: Zones
warehouses:
delete: Delete
deleteTitle: This item will be deleted
deleteSubtitle: Are you sure you want to continue?
warehouse: Warehouse
add: Add

View File

@ -3,8 +3,10 @@ zone:
zones: Zonas zones: Zonas
zonesList: Zonas zonesList: Zonas
zoneCreate: Nueva zona zoneCreate: Nueva zona
locations: Localizaciones
deliveryDays: Días de entrega deliveryDays: Días de entrega
upcomingList: Próximos repartos upcomingList: Próximos repartos
warehouses: Almacenes
list: list:
clone: Clonar clone: Clonar
id: Id id: Id
@ -58,3 +60,9 @@ zoneClosingTable:
zones: Zonas zones: Zonas
Search zones: Buscar zonas Search zones: Buscar zonas
You can search by zone reference: Puedes buscar por referencia de la zona You can search by zone reference: Puedes buscar por referencia de la zona
warehouses:
delete: Eliminar
deleteTitle: Este elemento será eliminado
deleteSubtitle: ¿Seguro que quieres continuar?
warehouse: Almacén
add: Añadir

View File

@ -12,7 +12,7 @@ export default {
redirect: { name: 'ZoneMain' }, redirect: { name: 'ZoneMain' },
menus: { menus: {
main: ['ZoneList', 'ZoneDeliveryDays', 'ZoneUpcomingList'], main: ['ZoneList', 'ZoneDeliveryDays', 'ZoneUpcomingList'],
card: ['ZoneBasicData', 'ZoneHistory', 'ZoneLocations'], card: ['ZoneBasicData', 'ZoneWarehouses', 'ZoneHistory', 'ZoneLocations'],
}, },
children: [ children: [
{ {
@ -57,15 +57,6 @@ export default {
}, },
component: () => import('src/pages/Zone/ZoneCreate.vue'), component: () => import('src/pages/Zone/ZoneCreate.vue'),
}, },
// {
// path: 'counter',
// name: 'ZoneCounter',
// meta: {
// title: 'zoneCounter',
// icon: 'add_circle',
// },
// component: () => import('src/pages/Zone/ZoneCounter.vue'),
// },
], ],
}, },
{ {
@ -83,6 +74,15 @@ export default {
}, },
component: () => import('src/pages/Zone/Card/ZoneSummary.vue'), 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', name: 'ZoneLocations',
path: 'location', path: 'location',
@ -93,13 +93,13 @@ export default {
component: () => import('src/pages/Zone/Card/ZoneLocations.vue'), component: () => import('src/pages/Zone/Card/ZoneLocations.vue'),
}, },
{ {
name: 'ZoneBasicData', name: 'ZoneWarehouses',
path: 'basic-data', path: 'warehouses',
meta: { meta: {
title: 'basicData', title: 'warehouses',
icon: 'vn:settings', icon: 'home',
}, },
component: () => import('src/pages/Zone/Card/ZoneBasicData.vue'), component: () => import('src/pages/Zone/Card/ZoneWarehouses.vue'),
}, },
{ {
name: 'ZoneHistory', name: 'ZoneHistory',
@ -110,83 +110,6 @@ export default {
}, },
component: () => import('src/pages/Zone/Card/ZoneLog.vue'), component: () => import('src/pages/Zone/Card/ZoneLog.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'),
// },
// ],
// },
], ],
}, },
], ],