Dashboard, Datenblatt usw.

This commit is contained in:
Moritz Utcke
2025-02-19 18:12:48 +11:00
parent 198912c792
commit 69566f1c74
39 changed files with 1479 additions and 420 deletions

View File

@@ -1,33 +1,20 @@
<script lang="ts">
import { BenutzerClient, ObjektClient, UploadedGebaeudeBild } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/server";
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte";
export let user: BenutzerClient;
export let objekte: (ObjektClient & {bilder: UploadedGebaeudeBild[]})[];
console.log(objekte);
export let objekte: ObjektKomplettClient[];
</script>
<h1 class="text-4xl font-medium my-8">Willkommen zurück, {user.vorname}!</h1>
<h1 class="text-4xl font-medium">Willkommen zurück, {user.vorname}!</h1>
<p class="text-lg">
Hier finden Sie eine Übersicht über all ihre Ausweise und Gebäude.
</p>
<h1 class="text-4xl font-medium my-8">Gebäude</h1>
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
{#each objekte as objekt}
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
<figure class="lg:w-1/2">
<img
src={(objekt.bilder && `/bilder/${objekt.bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude)?.uid}.webp`) || "/images/placeholder.jpg"}
class="object-cover w-full h-full"
alt="Gebäudebild"
/>
</figure>
<div class="card-body lg:w-1/2 p-4">
<h4 class="text-lg font-semibold">{objekt.adresse}, {objekt.plz} {objekt.ort}</h4>
</div>
</div>
{/each}
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
{#each objekte as objekt}
<DashboardObjekt {objekt}></DashboardObjekt>
{/each}
</div>

View File

@@ -0,0 +1,31 @@
<script lang="ts">
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
import Carousel from "#components/Carousel.svelte";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import { ChevronLeft, ChevronRight } from "radix-svelte-icons";
export let user: BenutzerClient;
export let objekt: ObjektKomplettClient;
</script>
<h1 class="text-4xl font-medium mb-8">{objekt.adresse}</h1>
<Carousel perPage={1}>
{#each objekt.bilder as bild, i (i)}
<img src="/bilder/{bild.uid}.webp" alt={bild.kategorie} class="max-h-[60vh] h-full w-full object-contain">
{/each}
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
</Carousel>
<div class="my-8 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
{#each objekt.aufnahmen as aufnahme}
{@const ausweis = aufnahme.verbrauchsausweis_wohnen ?? aufnahme.verbrauchsausweis_gewerbe ?? aufnahme.bedarfsausweis_wohnen}
{#if !ausweis}
<p>Diese Aufnahme hat noch keinen Ausweis.</p>
{:else}
<DashboardAusweis {ausweis} {aufnahme} {objekt} progress={0}></DashboardAusweis>
{/if}
{/each}
</div>

View File

@@ -115,6 +115,10 @@
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
}
async function anfordern() {
// TODO Angebot anfordern
}
async function bestellen() {
const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart;
@@ -174,6 +178,7 @@
2xl:grid-cols-2 2xl:gap-x-8
"
>
{#if !ausweis.geg_anfrage}
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1">
<PerformanceScore
bind:ausweis
@@ -182,6 +187,7 @@
{ausweisart}
/>
</div>
{/if}
<div
id="progress-box"
@@ -191,7 +197,11 @@
<h2 class="text-primary text-xl">
Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]}
</h2>
{#if ausweis.geg_anfrage}
<Progressbar active={1} steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}/>
{:else}
<Progressbar active={1}/>
{/if}
</div>
</div>
@@ -208,10 +218,10 @@
<Rechnungsadresse bind:user bind:rechnung /></Bereich
>
{#if !ausweis.geg_anfrage}
<Bereich bereich="3" title="Bezahlmethode">
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich
>
<div class="grid grid-cols-2 gap-x-6 my-6">
<div class="zusaetze bereich-box bg-white">
<h3>Zusatzleistungen:</h3>
@@ -275,6 +285,7 @@
</div>
</div>
</div>
{/if}
<div
class="w-full grid grid-cols-[min-content_1fr_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
@@ -285,7 +296,11 @@
<button class="button">Speichern</button>
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>
{#if ausweis.geg_anfrage}
<button class="button cursor-pointer" data-cy="bestellen" on:click={anfordern} >Angebot anfordern</button>
{:else}
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>
{/if}
</div>
</div>
</div>

View File

@@ -30,7 +30,7 @@
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
objekt: ObjektClient,
aufnahme: AufnahmeClient,
unterlagen: (UnterlageClient & { data?: string | ArrayBuffer })[],
unterlagen: (UnterlageClient & { data?: string })[],
ausweisart: Enums.Ausweisart
) {
if (objekt.uid) {
@@ -60,7 +60,7 @@
if (aufnahme.uid) {
await api.aufnahme._uid.PATCH.fetch({
...exclude(aufnahme, ["uid"])
...exclude({...aufnahme, baujahr_klima: []}, ["uid"])
}, {
params: {
uid: aufnahme.uid
@@ -71,7 +71,7 @@
})
} else {
const { uid } = await api.aufnahme.PUT.fetch({
aufnahme,
aufnahme: {...aufnahme, baujahr_klima: []},
uid_objekt: objekt.uid
}, {
headers: {
@@ -123,7 +123,7 @@
}
for (const unterlage of unterlagen) {
if (unterlage.uid) {
if (unterlage.uid || !unterlage.data) {
continue;
}
@@ -158,7 +158,16 @@
return;
}
ausweisSpeichern(ausweis, objekt, aufnahme, unterlagen, Enums.Ausweisart.VerbrauchsausweisGewerbe)
const result = await ausweisSpeichern(ausweis, objekt, aufnahme, unterlagen, Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen)
if (result !== null) {
window.history.pushState(
{},
"",
`${location.pathname}?uid=${result.uid_ausweis}`
);
window.location.href = `/kundendaten?uid=${result.uid_ausweis}`;
}
loginOverlayHidden = true;
}
@@ -179,10 +188,10 @@
export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: UploadedGebaeudeBild[] = [];
export let plaene: (UnterlageClient & { data: string | ArrayBuffer })[] =
export let plaene: (UnterlageClient & { data: string })[] =
[];
export let unterlagen: (UnterlageClient & {
data: string | ArrayBuffer;
data: string;
})[] = [];
@@ -270,7 +279,7 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10"></textarea>
<textarea class="rounded-e-none" rows="10" bind:value={ausweis.beschreibung}></textarea>
<div class="help-label">
<HelpLabel>