diff --git a/src/pages/Shelving/Parking/ParkingList.vue b/src/pages/Shelving/Parking/ParkingList.vue index d746b0d5b..dfd853e06 100644 --- a/src/pages/Shelving/Parking/ParkingList.vue +++ b/src/pages/Shelving/Parking/ParkingList.vue @@ -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,6 +134,13 @@ 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> @@ -105,4 +153,4 @@ const columns = computed(() => [ </QTooltip> </RouterLink> </QPageSticky> -</template> +</template> \ No newline at end of file diff --git a/test/cypress/back/datasources.json b/test/cypress/back/datasources.json index fa7b81e1c..afdc3134a 100644 --- a/test/cypress/back/datasources.json +++ b/test/cypress/back/datasources.json @@ -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" + ] } } \ No newline at end of file