forked from verdnatura/salix-front
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:
commit
8787db8622
|
@ -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"
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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="deleteWarehouse()"
|
@click="
|
||||||
|
openConfirmationModal(
|
||||||
|
t('warehouses.deleteTitle'),
|
||||||
|
t('warehouses.deleteSubtitle'),
|
||||||
|
() => deleteWarehouse(row, rows, rowIndex)
|
||||||
|
)
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<QTooltip>
|
<QTooltip>
|
||||||
{{ t('Remove row') }}
|
{{ t('warehouses.delete') }}
|
||||||
</QTooltip>
|
</QTooltip>
|
||||||
</QIcon>
|
</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>
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'),
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// },
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
Loading…
Reference in New Issue