WIP: feat: #8115 created new function for adding new parkings massively #1476
|
@ -340,6 +340,7 @@ globals:
|
|||
operator: Operator
|
||||
parking: Parking
|
||||
vehicleList: Vehicles
|
||||
parkingCreate: New parking
|
||||
vehicle: Vehicle
|
||||
unsavedPopup:
|
||||
title: Unsaved changes will be lost
|
||||
|
|
|
@ -344,6 +344,7 @@ globals:
|
|||
parking: Parking
|
||||
vehicleList: Vehículos
|
||||
vehicle: Vehículo
|
||||
parkingCreate: Nuevo parking
|
||||
unsavedPopup:
|
||||
title: Los cambios que no haya guardado se perderán
|
||||
subtitle: ¿Seguro que quiere salir sin guardar?
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
<script setup>
|
||||
import { computed, ref, onMounted } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import axios from 'axios';
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const entityId = computed(() => route.params.id ?? null);
|
||||
const isNew = Boolean(!entityId.value);
|
||||
|
||||
const sectors = ref([]);
|
||||
|
||||
const defaultInitialData = {
|
||||
sector: null,
|
||||
block: null,
|
||||
streetFrom: null,
|
||||
streetTo: null,
|
||||
numberFrom: null,
|
||||
numberTo: null,
|
||||
};
|
||||
|
||||
const onSave = (parking, newParking) => {
|
||||
if (isNew) {
|
||||
router.push({ name: 'ParkingSummary', params: { id: newParking?.id } });
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VnSubToolbar v-if="isNew" />
|
||||
<FormModel
|
||||
:url-create="isNew ? 'Parkings/multipleParkings' : null"
|
||||
:filter="filter"
|
||||
model="Parking"
|
||||
:auto-load="!isNew"
|
||||
:form-initial-data="isNew ? defaultInitialData : null"
|
||||
>
|
||||
<template #form="{ data, validate }">
|
||||
<VnRow>
|
||||
<VnSelect
|
||||
v-model="data.sector"
|
||||
url="Sectors"
|
||||
option-value="id"
|
||||
option-label="description"
|
||||
:filter-options="['id', 'description']"
|
||||
:fields="['id', 'description']"
|
||||
:label="$t('parking.sector')"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
v-model="data.block"
|
||||
:label="$t('parking.block')"
|
||||
:rules="validate('Parking.block')"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
v-model.number="data.streetFrom"
|
||||
type="number"
|
||||
:label="$t('parking.streetFrom')"
|
||||
:rules="validate('Parking.streetFrom')"
|
||||
/>
|
||||
<VnInput
|
||||
v-model.number="data.streetTo"
|
||||
type="number"
|
||||
:label="$t('parking.streetTo')"
|
||||
:rules="validate('Parking.streetTo')"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
v-model.number="data.numberFrom"
|
||||
type="number"
|
||||
:label="$t('parking.numberFrom')"
|
||||
:rules="validate('Parking.numberFrom')"
|
||||
/>
|
||||
<VnInput
|
||||
v-model.number="data.numberTo"
|
||||
type="number"
|
||||
:label="$t('parking.numberTo')"
|
||||
:rules="validate('Parking.numberTo')"
|
||||
/>
|
||||
</VnRow>
|
||||
</template>
|
||||
</FormModel>
|
||||
</template>
|
|
@ -1,18 +1,25 @@
|
|||
<script setup>
|
||||
import { computed, onMounted, onUnmounted } from 'vue';
|
||||
import { ref, computed, onMounted, onUnmounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
|
||||
import { usePrintService } from 'src/composables/usePrintService';
|
||||
import VnTable from 'components/VnTable/VnTable.vue';
|
||||
import VnSection from 'src/components/common/VnSection.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
import ParkingFilter from './ParkingFilter.vue';
|
||||
import exprBuilder from './ParkingExprBuilder.js';
|
||||
import ParkingSummary from './Card/ParkingSummary.vue';
|
||||
import { QBtn, QTooltip } from 'quasar';
|
||||
|
||||
const stateStore = useStateStore();
|
||||
const { t } = useI18n();
|
||||
const { viewSummary } = useSummaryDialog();
|
||||
const { openReport } = usePrintService();
|
||||
const dataKey = 'ParkingList';
|
||||
const tableRef = ref();
|
||||
const selectedRows = ref([]);
|
||||
const hasSelectedCards = computed(() => selectedRows.value.length > 0);
|
||||
|
||||
onMounted(() => (stateStore.rightDrawer = true));
|
||||
onUnmounted(() => (stateStore.rightDrawer = false));
|
||||
|
@ -57,9 +64,38 @@ const columns = computed(() => [
|
|||
action: (row) => viewSummary(row.id, ParkingSummary),
|
||||
isPrimary: true,
|
||||
},
|
||||
{
|
||||
title: t('globals.downloadPdf'),
|
||||
icon: 'cloud_download',
|
||||
isPrimary: true,
|
||||
action: (row) => openPdf(row.id),
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
function openPdf(id) {
|
||||
openReport(`Parkings/${id}/download`);
|
||||
}
|
||||
|
||||
function downloadPdf() {
|
||||
if (selectedRows.value.size === 0) return;
|
||||
const selectedCardsArray = Array.from(selectedRows.value.values());
|
||||
|
||||
if (selectedRows.value.size === 1) {
|
||||
const [parking] = selectedCardsArray;
|
||||
openPdf(parking.id);
|
||||
} else {
|
||||
const parkingIdsArray = selectedCardsArray.map((parking) => parking.id);
|
||||
const parkingIds = parkingIdsArray.join(',');
|
||||
|
||||
const params = {
|
||||
ids: parkingIds,
|
||||
};
|
||||
|
||||
openReport(`Parkings/downloadZip`, params);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -78,14 +114,19 @@ const columns = computed(() => [
|
|||
</template>
|
||||
<template #body>
|
||||
<VnTable
|
||||
ref="tableRef"
|
||||
:data-key="dataKey"
|
||||
:columns="columns"
|
||||
is-editable="false"
|
||||
:right-search="false"
|
||||
:use-model="true"
|
||||
:disable-option="{ table: true }"
|
||||
redirect="shelving/parking"
|
||||
default-mode="card"
|
||||
default-mode="table"
|
||||
v-model:selected="selectedRows"
|
||||
:table="{
|
||||
'row-key': 'id',
|
||||
selection: 'multiple',
|
||||
}"
|
||||
>
|
||||
<template #actions="{ row }">
|
||||
<QBtn
|
||||
|
@ -93,8 +134,23 @@ const columns = computed(() => [
|
|||
@click.stop="viewSummary(row.id, ParkingSummary)"
|
||||
color="primary"
|
||||
/>
|
||||
<QBtn
|
||||
:label="t('globals.downloadPdf')"
|
||||
@click.stop="openPdf(row.id)"
|
||||
color="primary"
|
||||
class="q-ml-sm"
|
||||
icon-right="cloud_download"
|
||||
/>
|
||||
</template>
|
||||
</VnTable>
|
||||
</template>
|
||||
</VnSection>
|
||||
</template>
|
||||
<QPageSticky :offset="[20, 20]">
|
||||
<RouterLink :to="{ name: 'ParkingCreate' }">
|
||||
<QBtn fab icon="add" color="primary" v-shortcut="'+'" />
|
||||
<QTooltip>
|
||||
{{ $t('shelving.list.newShelving') }}
|
||||
</QTooltip>
|
||||
</RouterLink>
|
||||
</QPageSticky>
|
||||
</template>
|
|
@ -2,4 +2,9 @@ parking:
|
|||
pickingOrder: Picking order
|
||||
sector: Sector
|
||||
search: Search parking
|
||||
searchInfo: You can search by parking code
|
||||
searchInfo: You can search by parking code
|
||||
block: Block
|
||||
streetFrom: Street from
|
||||
streetTo: Street to
|
||||
numberFrom: Number from
|
||||
numberTo: Number to
|
||||
|
|
|
@ -2,4 +2,9 @@ parking:
|
|||
pickingOrder: Orden de recogida
|
||||
sector: Sector
|
||||
search: Buscar parking
|
||||
searchInfo: Puedes buscar por código de parking
|
||||
searchInfo: Puedes buscar por código de parking
|
||||
block: Bloque
|
||||
streetFrom: Calle desde
|
||||
streetTo: Calle hasta
|
||||
numberFrom: Número desde
|
||||
numberTo: Número hasta
|
||||
|
|
|
@ -128,6 +128,16 @@ export default {
|
|||
parkingCard,
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'parking/create',
|
||||
name: 'ParkingCreate',
|
||||
meta: {
|
||||
title: 'parkingCreate',
|
||||
icon: 'add',
|
||||
|
||||
},
|
||||
component: () => import('src/pages/Shelving/Parking/ParkingCreate.vue'),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
|
@ -145,5 +145,16 @@
|
|||
"allowedContentTypes": [
|
||||
"application/x-7z-compressed"
|
||||
]
|
||||
},
|
||||
"parkingStorage": {
|
||||
"name": "parkingStorage",
|
||||
"connector": "loopback-component-storage",
|
||||
"provider": "filesystem",
|
||||
"root": "./storage/pdfs/parking",
|
||||
"maxFileSize": "52428800",
|
||||
"allowedContentTypes": [
|
||||
"application/octet-stream",
|
||||
"application/pdf"
|
||||
]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue