Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/dave 108 export pdf report #90

Merged
merged 37 commits into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
38d2840
Options beim Laden der Daten uebergeben
Der-Alex-K Mar 6, 2024
a6f897f
Options beim Laden der Daten uebergeben
Der-Alex-K Mar 6, 2024
a0bfd1a
default angepasst
Der-Alex-K Mar 6, 2024
d7d7e1b
default angepasst
Der-Alex-K Mar 7, 2024
dc6605b
fix DateManipulation
Der-Alex-K Mar 8, 2024
27aa693
Merge remote-tracking branch 'origin/sprint' into feat/DAVE-87_Filter…
Der-Alex-K Mar 8, 2024
2ef638b
change preselected Zeitblock Spitzenstunde
Der-Alex-K Mar 11, 2024
aae28f1
fix typo
Der-Alex-K Mar 11, 2024
b019695
darstellungsoptionen angelegt
Der-Alex-K Mar 11, 2024
964cbc2
rename field
Der-Alex-K Mar 12, 2024
b83a245
himmelsrichtung ueberarbeitet
Der-Alex-K Mar 12, 2024
eeae140
Merge remote-tracking branch 'origin/feat/DAVE-87_Filter-Berechnung' …
Der-Alex-K Mar 12, 2024
3c8a201
fix divider, fix rules, Darstellungsoptionen Ganglinie angebunden
Der-Alex-K Mar 12, 2024
bc39e41
neue historie angelegt
Der-Alex-K Mar 13, 2024
fd099ca
Merge remote-tracking branch 'origin/feat/DAVE-92_Filter-Darstellungs…
Der-Alex-K Mar 14, 2024
41a92a3
add TODO
Der-Alex-K Mar 14, 2024
b85e751
Merge branch 'chore/Himmelsrichtung-ueberarbeitet' into feat/DAVE-92_…
Der-Alex-K Mar 14, 2024
2055fe0
Merge branch 'feat/DAVE-92_Filter-Darstellungsoptionen' into feat/DAV…
Der-Alex-K Mar 14, 2024
380fdd3
neue History eingebaut
Der-Alex-K Mar 14, 2024
9e5b773
icon hinzugefuegt
Der-Alex-K Mar 14, 2024
5e28aa7
fix standort error
Der-Alex-K Mar 14, 2024
220d57a
zwei varianten gebaut
Der-Alex-K Mar 14, 2024
64bcd1c
DTO's an Backenddatenstruktur angepasst
Der-Alex-K Mar 15, 2024
3d1c966
Messstelle und Zaehlstelle in eigene Methoden aufgeteilt
Der-Alex-K Mar 15, 2024
cfd147c
Merge branch 'feat/DAVE-109_Export_Suchergebnis' into feat/DAVE-209_A…
Der-Alex-K Mar 15, 2024
724e5be
Report fuer Messstelle Listenausgabe erweitert
Der-Alex-K Mar 18, 2024
fa3c120
Konsolen-Fehler gefixed
Der-Alex-K Mar 18, 2024
1c7718d
fehlerausgaben bei MQ's angeapsst
Der-Alex-K Mar 19, 2024
0438f67
fix it
Der-Alex-K Mar 19, 2024
fd08eda
Merge remote-tracking branch 'origin/sprint' into feat/DAVE-209_Anpas…
Der-Alex-K Mar 19, 2024
9ff3b94
refactor
Der-Alex-K Mar 19, 2024
70da8e6
Merge remote-tracking branch 'origin/feat/DAVE-209_Anpassung-Filter-M…
Der-Alex-K Mar 19, 2024
0dee1c7
pdf report menue erstellt
Der-Alex-K Mar 20, 2024
4786124
reset checkboxes
Der-Alex-K Mar 20, 2024
2d95755
Merge remote-tracking branch 'origin/sprint' into feat/DAVE-108_Expor…
Der-Alex-K Mar 25, 2024
6a4d9ad
fix Anmerkungen
Der-Alex-K Mar 26, 2024
66fae52
Merge remote-tracking branch 'origin/sprint' into feat/DAVE-108_Expor…
Der-Alex-K Mar 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions frontend/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ declare module '@vue/runtime-core' {
MessquerschnittAnzahlInfo: typeof import('./src/components/messstelle/MessquerschnittAnzahlInfo.vue')['default']
MessquerschnittInfo: typeof import('./src/components/messstelle/MessquerschnittInfo.vue')['default']
MessquerschnittPanel: typeof import('./src/components/messstelle/optionsmenue/panels/MessquerschnittPanel.vue')['default']
MessquerschnittPanel2: typeof import('./src/components/messstelle/optionsmenue/panels/MessquerschnittPanel2.vue')['default']
MessstelleDiagramme: typeof import('./src/components/messstelle/charts/MessstelleDiagramme.vue')['default']
MessstelleGeometrie: typeof import('./src/components/messstelle/MessstelleGeometrie.vue')['default']
MessstelleHeaderInfo: typeof import('./src/components/messstelle/MessstelleHeaderInfo.vue')['default']
Expand All @@ -67,6 +68,7 @@ declare module '@vue/runtime-core' {
PanelHeader: typeof import('./src/components/common/PanelHeader.vue')['default']
PdfPreviewDialog: typeof import('./src/components/pdfreport/assetforms/PdfPreviewDialog.vue')['default']
PdfReportMenue: typeof import('./src/components/zaehlstelle/PdfReportMenue.vue')['default']
PdfReportMenueMessstelle: typeof import('./src/components/messstelle/PdfReportMenueMessstelle.vue')['default']
QKFZIcon: typeof import('./src/components/messstelle/icons/FahrzeugklasseIcons/QKFZIcon.vue')['default']
QpkwLkwIcon: typeof import('./src/components/messstelle/icons/FahrzeugklasseIcons/QpkwLkwIcon.vue')['default']
QuelleIcon: typeof import('./src/components/zaehlstelle/icons/QuelleIcon.vue')['default']
Expand Down
246 changes: 246 additions & 0 deletions frontend/src/components/messstelle/PdfReportMenueMessstelle.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
<template>
<div>
<v-dialog
v-model="openDialog"
max-width="900px"
@click:outside="closeDialog"
>
<v-card
width="900px"
flat
>
<v-card-title>
<v-icon left>mdi-file-chart</v-icon>
Auswahl zum PDF Report
</v-card-title>

<v-list
flat
subheader
three-line
>
<v-subheader
>Wählen Sie die Inhalte, die dem PDF Report hinzugefügt
werden sollen.</v-subheader
>
<v-list-item>
<v-list-item-action>
<v-checkbox v-model="messstelleninfo"></v-checkbox>
</v-list-item-action>

<v-list-item-content>
<v-list-item-title
>Messstelleninformationen</v-list-item-title
>
<v-list-item-subtitle
>Folgende Informationen werden im PDF Report
eingetragen: Messstelle-ID, ID & Standort der
Messquerschnitte, Stadtbezirk,
Messstellenkommentar.
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>

<v-list-item>
<v-list-item-action>
<v-checkbox v-model="messinfo"></v-checkbox>
</v-list-item-action>

<v-list-item-content>
<v-list-item-title
>Messinformationen</v-list-item-title
>
<v-list-item-subtitle
>Folgende Informationen werden im PDF Report
eingetragen: Zeitraum von ... bis / Einzeltag,
Wochentag, Statistik zur Auswertung (Anzahl
plausible Wochentage)
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>

<v-list-item>
<v-list-item-action>
<v-checkbox v-model="legende"></v-checkbox>
</v-list-item-action>

<v-list-item-content>
<v-list-item-title>Legende</v-list-item-title>
<v-list-item-subtitle
>Die Legende enthält Kurzbeschreibungen der
einzelnen Zählattribute, z.B. für den
Kraftfahrzeugverkehr, Schwerverkehr etc.
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</v-list>
<v-footer>
<v-spacer></v-spacer>
<v-btn
color="secondary"
@click="saveItems"
>
Aktualisiere PDF Report
</v-btn>
<v-spacer></v-spacer>
<v-btn
color="grey lighten-1"
@click="closeDialog"
>
Abbrechen
</v-btn>
<v-spacer></v-spacer>
</v-footer>
</v-card>
</v-dialog>
</div>
</template>

<script setup lang="ts">
import { computed, Ref, ref } from "vue";
import MessstelleInfoDTO from "@/types/messstelle/MessstelleInfoDTO";
import { useStore } from "@/api/util/useStore";
import { Levels } from "@/api/error";
import HeadingAsset from "@/types/pdfreport/assets/HeadingAsset";
import AssetTypesEnum from "@/types/pdfreport/assets/AssetTypesEnum";
import TextAsset from "@/types/pdfreport/assets/TextAsset";
import MessstelleOptionsDTO from "@/types/messstelle/MessstelleOptionsDTO";
import BaseAsset from "@/types/pdfreport/assets/BaseAsset";
import { useDateUtils } from "@/util/DateUtils";
import { tagesTypText } from "@/types/enum/TagesTyp";

interface Props {
value: boolean;
}
const props = defineProps<Props>();

const openDialog = computed({
get: () => props.value,
set: (payload: boolean) => emits("input", payload),
});

const emits = defineEmits<{
(e: "close"): void;
(e: "input", v: boolean): void;
}>();

const store = useStore();
const dateUtils = useDateUtils();

const messstelleninfo = ref(false);
const messinfo = ref(false);
const legende = ref(false);

const messstelle: Ref<MessstelleInfoDTO> = computed(() => {
return store.getters["messstelleInfo/getMessstelleInfo"];
});

const options: Ref<MessstelleOptionsDTO> = computed(() => {
return store.getters["filteroptionsMessstelle/getFilteroptions"];
});

function closeDialog(): void {
resetCheckboxes();
emits("close");
}

function resetCheckboxes(): void {
messstelleninfo.value = false;
messinfo.value = false;
legende.value = false;
}

function saveItems(): void {
if (messstelleninfo.value) {
createMessstelleInfo();
}

if (messinfo.value) {
createMessInfo();
}

if (legende.value) {
createLegende();
}

store.dispatch("snackbar/showToast", {
snackbarTextPart1: `Die ausgewählten Informationen wurden dem PDF Report hinzugefügt.`,
level: Levels.SUCCESS,
});

closeDialog();
}

function createMessstelleInfo(): void {
const assets: Array<BaseAsset> = [];
const headline = new HeadingAsset(
`Info für Messstelle Id ${messstelle.value.mstId}`,
AssetTypesEnum.HEADING3
);
assets.push(headline);

const messquerschnittIds = options.value.messquerschnittIds;
const messquerschnittInfoDTOS = messstelle.value.messquerschnitte.filter(
(value) => messquerschnittIds.includes(value.mqId)
);
if (messquerschnittInfoDTOS.length > 0) {
let text = "Messquerschnitt(e):<br/>";
messquerschnittInfoDTOS.forEach((value) => {
text += `- ${value.mqId}`;
if (value.standort) {
text += ` - ${value.standort}`;
}
text += "<br/>\n";
});
assets.push(new TextAsset(text));
}
const stadtbezirk = new TextAsset(
`Stadtbezirk: ${messstelle.value.stadtbezirk} (${messstelle.value.stadtbezirkNummer})`
);
assets.push(stadtbezirk);
let kommentar = new TextAsset(
`Messstellenkommentar: ${messstelle.value.kommentar ?? "---"}`
);
assets.push(kommentar);
store.dispatch("addAssets", assets);
}

function createMessInfo(): void {
DanielOber marked this conversation as resolved.
Show resolved Hide resolved
const assets: Array<BaseAsset> = [];

const zeitraum = options.value.zeitraum;
let header = `Info zur Messung vom ${dateUtils.formatDate(zeitraum[0])}`;
if (zeitraum.length === 2) {
header += ` bis ${dateUtils.formatDate(zeitraum[1])}`;
}
header += ` (Mst-Id ${messstelle.value.mstId})`;
assets.push(new HeadingAsset(header, AssetTypesEnum.HEADING3));

if (options.value.tagesTyp) {
const wochentag = new TextAsset(
`Wochentag (Tagestyp): ${tagesTypText.get(options.value.tagesTyp)}`
);
assets.push(wochentag);
}
const statistikAuswertung = new TextAsset(
`Auswertungsstatistik: Exisitiert noch nicht.`
);
assets.push(statistikAuswertung);

store.dispatch("addAssets", assets);
}

function createLegende(): void {
const ueberschrift = new HeadingAsset(
"Legende zu den Kennzahlen",
AssetTypesEnum.HEADING3
);
const legende = new TextAsset(
"<p>- <b>Kraftfahrzeugverkehr (KFZ)</b>: Der Kraftfahrzeugverkehr ist die Summe der Personenkraftwagen, Krafträder, Busse, Lieferwagen, Lastkraftwagen und Lastzüge.</p>\n" +
"<p>- <b>Schwerverkehr\t(SV)</b>: Der Schwerverkehr ist die Summe aller Fahrzeuge > 3,5t zul. Gesamtgewicht (Summe aus Bussen, Lastkraftwagen und Lastzüge).</p>\n" +
"<p>- <b>Güterverkehr (GV)</b>: Der Güterverkehr ist die Summe aller Fahrzeuge > 3,5t zul. Gesamtgewicht ohne Busse (Summe aus Lastkraftwagen und Lastzüge).</p>\n" +
"<p>- <b>Schwer- und Güterverkehrsanteil</b>: Anteil des Schwer- bzw. Güterverkehrs am Kraftfahrzeugverkehr in Prozent [%].</p>"
);
store.dispatch("addAssets", [ueberschrift, legende]);
}
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@
:loading-file="loadingFile"
@addChartToPdfReport="addChartToPdfReport"
@saveGraphAsImage="saveGraphAsImage"
@openPdfReportDialog="openPdfReportDialog"
/>
<pdf-report-menue-messstelle
v-model="pdfReportDialog"
@close="closePdfReportDialog"
/>
</v-sheet>
</template>
Expand All @@ -145,6 +150,7 @@ import MessstelleHistoryItem from "@/types/app/MessstelleHistoryItem";
import MessstelleInfoDTO from "@/types/messstelle/MessstelleInfoDTO";
import MessstelleOptionsDTO from "@/types/messstelle/MessstelleOptionsDTO";
import _ from "lodash";
import PdfReportMenueMessstelle from "@/components/messstelle/PdfReportMenueMessstelle.vue";

// Refactoring: Synergieeffekt mit ZaehldatenDiagramme nutzen

Expand Down Expand Up @@ -176,6 +182,7 @@ const showSpeedial: Ref<boolean> = ref(false);

const isTabListenausgabe: Ref<boolean> = ref(false);
const isNotTabHeatmap: Ref<boolean> = ref(false);
const pdfReportDialog: Ref<boolean> = ref(false);

const activeTab: Ref<number> = ref(0);

Expand Down Expand Up @@ -284,10 +291,16 @@ function addChartToPdfReport(): void {
"Die"
);
}
// Heatmap
if (activeTab.value === TAB_HEATMAP) {
reportTools.addChartToPdfReport(getHeatmapBase64(), "Heatmap", "Die");
}
if (activeTab.value === TAB_LISTENAUSGABE) {
reportTools.addDatatabelToPdfReport(
_.cloneDeep(options.value),
"Datentabelle",
"Die"
);
}
}

/**
Expand Down Expand Up @@ -324,4 +337,12 @@ function getHeatmapBase64(): string {
excludeComponents: ["toolbox"],
});
}

function openPdfReportDialog(): void {
pdfReportDialog.value = true;
}

function closePdfReportDialog(): void {
pdfReportDialog.value = false;
}
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ import OptionsDTO from "@/types/zaehlung/OptionsDTO";

@Component
export default class DatatableAssetForm extends Vue {
@Prop({ default: false }) open = false;
@Prop({ default: false }) open: boolean | undefined;
@Prop() datatable?: DatatableAsset;

asset: DatatableAsset = new DatatableAsset({} as OptionsDTO, "", "");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import { Component, Prop, Vue } from "vue-property-decorator";

@Component
export default class DeleteDialog extends Vue {
@Prop() open = false;
@Prop({ default: false }) open: boolean | undefined;
@Prop() assetId!: number;

deleteAsset(): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ import AssetTypesEnum from "@/types/pdfreport/assets/AssetTypesEnum";

@Component
export default class HeadingAssetForm extends Vue {
@Prop({ default: false }) open = false;
@Prop({ default: false }) open: boolean | undefined;
@Prop() heading?: HeadingAsset;

asset: HeadingAsset = new HeadingAsset("", AssetTypesEnum.HEADING1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ import ImageAsset from "@/types/pdfreport/assets/ImageAsset";

@Component
export default class ImageAssetForm extends Vue {
@Prop({ default: false }) open = false;
@Prop({ default: false }) open: boolean | undefined;
@Prop({ default: new ImageAsset("", "") }) image?: ImageAsset;

asset: ImageAsset = new ImageAsset("", "");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ import VuePdfEmbed from "vue-pdf-embed/dist/vue2-pdf-embed";
export default class DeleteDialog extends Vue {
@Prop() source!: Uint8Array;

@Prop() open = false;
@Prop({ default: false }) open: boolean | undefined;

fab = false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ import TextAsset from "@/types/pdfreport/assets/TextAsset";

@Component
export default class TextAssetForm extends Vue {
@Prop({ default: false }) open = false;
@Prop({ default: false }) open: boolean | undefined;
@Prop() text?: TextAsset;

asset: TextAsset = new TextAsset("");
Expand Down
1 change: 1 addition & 0 deletions frontend/src/types/pdfreport/assets/AssetTypesEnum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export enum AssetTypesEnum {
PAGEBREAK = "PAGEBREAK",
NEWLINE = "NEWLINE",
DATATABLE = "DATATABLE",
DATATABLE_MESSSTELLE = "DATATABLE_MESSSTELLE",
ZAEHLUNGSKENNGROESSEN = "ZAEHLUNGSKENNGROESSEN",
}

Expand Down
Loading
Loading