Merge pull request #259 from IBCornelsen/dev-moritz

Verbesserungen
This commit is contained in:
Moritz Utcke
2024-12-26 07:14:20 +07:00
committed by GitHub
15 changed files with 428 additions and 349 deletions

View File

@@ -9,22 +9,20 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "@ibcornelsen/ui"; import { addNotification, deleteNotification } from "@ibcornelsen/ui";
import TagInput from "../TagInput.svelte"; import TagInput from "../TagInput.svelte";
import type {
BedarfsausweisWohnen,
VerbrauchsausweisGewerbe,
} from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { import {
BedarfsausweisWohnenClient,
GebaeudeAufnahmeClient, GebaeudeAufnahmeClient,
GebaeudeClient, GebaeudeClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
export let gebaeude: GebaeudeClient; export let gebaeude: GebaeudeClient;
export let ausweis: export let ausweis:
| VerbrauchsausweisWohnenClient | VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbe | VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnen; | BedarfsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient; export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
</script> </script>

View File

@@ -4,36 +4,25 @@ export let spaeterWeitermachen;
export let automatischAusfüllen; export let automatischAusfüllen;
</script> </script>
<!-- Später weitermachen / Hilfe anfordern --> <!-- Später weitermachen / Hilfe anfordern -->
<div <div
class="w-full mt-5 grid gap-x-4 gap-y-2 px-4 class="w-full mt-5 grid gap-x-4 gap-y-2 px-4
grid-cols-1 grid-cols-1
xs:grid-cols-2 xs:grid-cols-2
" "
> >
<div class="md:justify-self-start"> <div class="md:justify-self-start">
<button <button class="button" type="button" on:click={spaeterWeitermachen}
class="button" >Später Weitermachen
type="button" </button>
on:click={spaeterWeitermachen}>Später Weitermachen
</button
>
</div>
<div class="md:justify-self-end"><Hilfe />
</div> </div>
<div class="md:justify-self-end"><Hilfe /></div>
</div> </div>
<div class="mt-2 px-4"> <div class="mt-2 px-4">
<button <button class="button" on:click={automatischAusfüllen} type="button"
class="button" >Automatisch Ausfüllen
on:click={automatischAusfüllen} </button>
type="button">Automatisch Ausfüllen
</button
>
</div> </div>

View File

@@ -14,6 +14,7 @@
GebaeudeClient, GebaeudeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: GebaeudeClient; export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient; export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
@@ -81,6 +82,22 @@
} }
} }
$: {
console.log(month, year);
if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") {
addNotification({
message: "Monat nicht verfügbar.",
subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
dismissable: true,
type: "warning",
timeout: 0,
uid: "monat_nicht_verfuegbar",
selector: "select[name='energieverbrauch_zeitraum_monat']"
})
}
}
$: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude); $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
</script> </script>
@@ -147,7 +164,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={month} bind:value={month}
required required
> >
<option disabled>Monat</option>
{#if year !== null} {#if year !== null}
{#each availableDates.filter((date) => date.year == year) as date} {#each availableDates.filter((date) => date.year == year) as date}
<option value={date.month} <option value={date.month}
@@ -182,7 +198,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={year} bind:value={year}
required required
> >
<option disabled>Jahr</option>
{#each Array.from(availableDates.reduce((a, c) => { {#each Array.from(availableDates.reduce((a, c) => {
a.add(c.year); a.add(c.year);
return a; return a;

View File

@@ -109,7 +109,7 @@
{#if Object.keys($notifications).length > 0} {#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span> <span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
{/if} {/if}
<button tabindex="0" class="btn btn-square btn-ghost hover:bg-base-200"> <button tabindex="0" class="button btn-square btn-ghost hover:bg-base-200">
<Bell size={24} /> <Bell size={24} />
</button> </button>
</div> </div>
@@ -119,7 +119,7 @@
</div> </div>
<a href="/dashboard/einstellungen" <a href="/dashboard/einstellungen"
class="btn btn-square btn-ghost hover:bg-base-200" class="button btn-square btn-ghost hover:bg-base-200"
> >
<Gear size={24} /> <Gear size={24} />
</a> </a>
@@ -129,7 +129,7 @@
<a <a
href="/dashboard/einstellungen" href="/dashboard/einstellungen"
use:ripple={rippleOptions} use:ripple={rippleOptions}
class="btn btn-ghost no-animation focus:shadow-none justify-start py-4 h-auto hover:bg-base-200 px-8 rounded-none w-full flex flex-row gap-4" class="button btn-ghost no-animation focus:shadow-none justify-start py-4 h-auto hover:bg-base-200 px-8 rounded-none w-full flex flex-row gap-4"
> >
<div class="avatar"> <div class="avatar">
<div class="w-12 rounded-full"> <div class="w-12 rounded-full">
@@ -173,9 +173,9 @@
font-family: Poppins !important; font-family: Poppins !important;
} }
.button-tab { /* .button-tab {
@apply btn btn-primary btn-ghost rounded-none px-8 justify-start outline-0 gap-4 items-center text-base font-normal text-base-content no-animation; @apply btn btn-primary btn-ghost rounded-none px-8 justify-start outline-0 gap-4 items-center text-base font-normal text-base-content no-animation;
} } */
.button-tab:hover { .button-tab:hover {
@apply bg-base-200 outline-0; @apply bg-base-200 outline-0;

View File

@@ -1,3 +1,5 @@
<script lang="ts"></script>
<div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50"> <div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50">
<slot></slot> <slot></slot>
</div> </div>

View File

@@ -20,6 +20,7 @@ export interface Notification {
type: "error" | "success" | "info" | "warning"; type: "error" | "success" | "info" | "warning";
onUserDismiss: () => any; onUserDismiss: () => any;
uid?: string; uid?: string;
selector?: string;
} }
export function updateNotification(uid: string, updater: Partial<Notification>) { export function updateNotification(uid: string, updater: Partial<Notification>) {

View File

@@ -1,5 +1,5 @@
--- ---
import HeaderLogin from "#header/headerLogin.svelte"; import HeaderLogin from "#header/HeaderLogin.svelte";
--- ---
<header id="header"> <header id="header">
@@ -58,7 +58,7 @@ lg:px-0 lg:gap-x-4">
</div> </div>
<div class="w-full justify-self-center"> <div class="w-full justify-self-center">
<HeaderLogin /> <HeaderLogin client:load />
</div> </div>
</div> </div>

View File

@@ -1,15 +1,12 @@
<script lang="ts"> <script lang="ts">
import { loginClient } from "#lib/login"; import { loginClient } from "#lib/login";
import CrossCircled from "radix-svelte-icons/src/lib/icons/CrossCircled.svelte"; import { CrossCircled } from "radix-svelte-icons";
import { fade } from "svelte/transition"; import { fade } from "svelte/transition";
let email: string; let email: string;
let passwort: string; let passwort: string;
async function login(e: SubmitEvent) { async function login(e: SubmitEvent) {
console.log(e);
e.preventDefault(); e.preventDefault();
const response = await loginClient(email, passwort); const response = await loginClient(email, passwort);
@@ -23,8 +20,10 @@
let errorHidden = true; let errorHidden = true;
</script> </script>
<div id="card-login" class="rounded-none lg:rounded-lg lg:card lg:box bg-black/10 md:bg-black/5 lg:ring-2 border-t-2 lg:border-none border-gray-500/50 ring-gray-500/50 xs:px-2 md:px-4 py-2" > <div
id="card-login"
class="rounded-none lg:rounded-lg lg:card lg:box bg-black/10 md:bg-black/5 lg:ring-2 border-t-2 lg:border-none border-gray-500/50 ring-gray-500/50 xs:px-2 md:px-4 py-2"
>
<form on:submit={login}> <form on:submit={login}>
<div class="grid grid-cols-[1fr] xs:grid-cols-[2fr_2fr_1fr] gap-2"> <div class="grid grid-cols-[1fr] xs:grid-cols-[2fr_2fr_1fr] gap-2">
<input <input
@@ -49,39 +48,41 @@
required required
/> />
{#if !errorHidden} {#if !errorHidden}
<div role="alert" class="alert alert-error" in:fade out:fade={{delay: 400}}> <div
role="alert"
class="alert alert-error"
in:fade
out:fade={{ delay: 400 }}
>
<CrossCircled size={24} /> <CrossCircled size={24} />
<span class="font-semibold">Das hat leider nicht geklappt, haben sie ihr Passwort und ihre Email Adresse richtig eingegeben?</span> <span class="font-semibold"
>Das hat leider nicht geklappt, haben sie ihr Passwort
und ihre Email Adresse richtig eingegeben?</span
>
</div> </div>
{/if} {/if}
<button class="button self-center" type="submit">login</button> <button class="button self-center" type="submit">login</button>
</div> </div>
<div
id="passwort-vergessen"
<div id="passwort-vergessen" class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2"> class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2"
>
<div class="w-full text-left self-center"> <div class="w-full text-left self-center">
<a <a
class="justify-self-start text-sm font-bold no-underline hover:text-primary" class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/signup">Registrieren</a href="/auth/signup">Registrieren</a
> / >
/
<a <a
class="justify-self-start text-sm font-bold no-underline hover:text-primary" class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/passwort-vergessen">Passwort vergessen</a href="/auth/passwort-vergessen">Passwort vergessen</a
> >
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<style lang="postcss"> <style lang="postcss">
</style> </style>

View File

@@ -0,0 +1,32 @@
<script lang="ts">
export let bereich: string;
export let title: string;
let open: boolean = true;
let collapse: HTMLDivElement;
</script>
<div class="bereichs-label">
<div>
<div
class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"
>
<div class="formular-abschnitt1">{bereich}</div>
<div class="formular-abschnitt2">{title}</div>
<div
class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm select-none"
on:click={() => {
open = !open
}}
>
{#if open}
-
{:else}
+
{/if}
</div>
</div>
</div>
</div>
<div class="collapseBereich" bind:this={collapse} class:max-h-0={!open} class:overflow-hidden={!open} class:max-h-[1500px]={open} class:overflow-visible={open}>
<slot></slot>
</div>

View File

@@ -1,46 +1,42 @@
<script lang="ts"> <script lang="ts">
export let bereich: string; export let bereich: string;
let label: HTMLDivElement;
let open: boolean = true;
function toggleBereich(event: MouseEvent) {
var collapse = label.nextElementSibling as HTMLDivElement;
function toggleBereich(event){ if (open) {
var x = event.target.parentNode.parentNode.parentNode;
var y = x.nextElementSibling;
var z = event.target.innerHTML;
if(z=='-'){
//y.classList.remove('hidden'); //y.classList.remove('hidden');
y.style.maxHeight = '0px'; collapse.style.maxHeight = "0px";
y.style.overflow = 'hidden'; collapse.style.overflow = "hidden";
event.target.innerHTML = "+";
} else { } else {
//y.classList.add('hidden'); //y.classList.add('hidden');
y.style.maxHeight = '1500px'; collapse.style.maxHeight = "1500px";
y.style.overflow = 'visible'; collapse.style.overflow = "visible";
event.target.innerHTML = "-";
} }
open = !open;
} }
</script> </script>
<div class="bereichs-label" bind:this={label}>
<div class="bereichs-label">
<div> <div>
<div class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"> <div
class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"
>
<div class="formular-abschnitt1">{bereich}</div> <div class="formular-abschnitt1">{bereich}</div>
<div class="formular-abschnitt2"><slot></slot></div> <div class="formular-abschnitt2"><slot></slot></div>
<div id="BereichToggle" class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm" on:click={() => toggleBereich(event)}>-</div> <div
class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm select-none"
on:click={toggleBereich}
>
{#if open}
-
{:else}
+
{/if}
</div>
</div> </div>
</div> </div>
</div> </div>
<style lang="postcss">
</style>

View File

@@ -11,14 +11,23 @@
import moment from "moment"; import moment from "moment";
import { BitChecker } from "src/lib/BitChecker.js"; import { BitChecker } from "src/lib/BitChecker.js";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, BenutzerClient, UploadedGebaeudeBild } from "#components/Ausweis/types.js"; import {
BedarfsausweisWohnenClient,
BenutzerClient,
UploadedGebaeudeBild,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
export let ausweis: BedarfsausweisWohnenClient; export let ausweis: BedarfsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {}; let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {}; let gebaeude =
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || []; ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten
?.gebaeude_bilder || [];
let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4]; let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4];
@@ -40,6 +49,29 @@
"Fenster mit U-Wert 1": 1, "Fenster mit U-Wert 1": 1,
}; };
async function spaeterWeitermachen() {
// const result = await verbrauchsausweisWohnenSpeichern(
// ausweis,
// gebaeude,
// gebaeude_aufnahme_allgemein,
// images,
// user
// );
// if (result !== null) {
// // Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// // Sonst müsste er alles neu eingeben...
// ausweis.uid = result.uid;
// gebaeude.uid = result.gebaeude_uid;
// gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid;
// window.history.pushState(
// {},
// "",
// `${location.pathname}?uid=${result.uid}`
// );
// speichernOverlayHidden = false;
// }
}
const arrayRange = (start: number, stop: number, step: number) => const arrayRange = (start: number, stop: number, step: number) =>
Array.from( Array.from(
{ length: (stop - start) / step + 1 }, { length: (stop - start) / step + 1 },
@@ -112,46 +144,42 @@
} }
</script> </script>
<div class="flex flex-row gap-8 items-center mb-8"> <div class="grid grid-cols-2 gap-x-8 px-4 items-center">
<div class="flex flex-col w-full"> <div class="w-full rounded-lg border-gray/35 border-0 relative px-4">
<h1>Bedarfsausweis erstellen - 75€</h1>
<Progressbar progress={0} /> <Progressbar progress={0} />
</div> </div>
<PerformanceScore {ausweis} {gebaeude} {gebaeude_aufnahme_allgemein} /> <div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
/>
</div> </div>
</div>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<form action="FORM/transfer/VA_1to2" enctype="multipart/form-data"> <form action="FORM/transfer/VA_1to2" enctype="multipart/form-data">
<fieldset <div id="formular-box" class="formular-boxen ring-0">
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]" <Bereich bereich="A" title="Prüfung der Ausweisart">
> <Ausweisart
<div class="flex flex-row justify-between"> bind:gebaeude
<a class="button" href="/speichern">Später Weitermachen</a> bind:gebaeude_aufnahme_allgemein
<div class="flex gap-4"> bind:ausweis
<Hilfe /> />
<button </Bereich>
on:click={automatischAusfüllen}
type="button"
class="button">Automatisch Ausfüllen</button
>
</div>
</div>
<hr /> <hr />
<Label>A - Prüfung der Ausweisart</Label> <Bereich
<Ausweisart bind:gebaeude bereich="B"
bind:gebaeude_aufnahme_allgemein title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Gebäudetyp und Gebäudeteil"
bind:ausweis />
<hr />
<Label
>B - Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Gebäudetyp
und Gebäudeteil</Label
> >
<div class="GRB"> <div class="GRB">
<div> <div>
<HelpLabel title="Straße, Hausnummer *" <HelpLabel title="Straße, Hausnummer *"
>Bitte geben Sie hier die Straße und Hausnummer des Gebäudes >Bitte geben Sie hier die Straße und Hausnummer des
ein.</HelpLabel Gebäudes ein.</HelpLabel
> >
<div> <div>
<input <input
@@ -223,7 +251,9 @@
<option value="Doppelhaushälfte"> <option value="Doppelhaushälfte">
Doppelhaushälfte</option Doppelhaushälfte</option
> >
<option value="Reihenendhaus"> Reihenendhaus</option> <option value="Reihenendhaus">
Reihenendhaus</option
>
<option value="Reihenmittelhaus"> <option value="Reihenmittelhaus">
Reihenmittelhaus</option Reihenmittelhaus</option
> >
@@ -236,19 +266,21 @@
<option value="Atrium-Bungalow"> <option value="Atrium-Bungalow">
Atrium-Bungalow</option Atrium-Bungalow</option
> >
<option value="Winkelbungalow"> Winkelbungalow</option> <option value="Winkelbungalow">
Winkelbungalow</option
>
</select> </select>
</div> </div>
</div> </div>
<div> <div>
<HelpLabel title="Gebäudeteil *" <HelpLabel title="Gebäudeteil *"
>Bitte geben Sie hier den Gebäudeteil ein. In den meisten >Bitte geben Sie hier den Gebäudeteil ein. In den
Fällen handelt es sich um das Gesamtgebäude. Sollte es sich meisten Fällen handelt es sich um das Gesamtgebäude.
allerdings um ein Gebäude mit mehr als 10% Gewerbeanteil Sollte es sich allerdings um ein Gebäude mit mehr als
handeln, so sollten 2 Ausweise erstellt werden. In diesem 10% Gewerbeanteil handeln, so sollten 2 Ausweise
Fall wählen Sie Gebäudeteil 'Wohnen' bzw. Gebäudeteil erstellt werden. In diesem Fall wählen Sie Gebäudeteil
'Gewerbe'.</HelpLabel 'Wohnen' bzw. Gebäudeteil 'Gewerbe'.</HelpLabel
> >
<div> <div>
<select <select
@@ -257,12 +289,15 @@
required required
> >
<option>Bitte auswählen</option> <option>Bitte auswählen</option>
<option value="Gesamtgebäude"> Gesamtgebäude</option> <option value="Gesamtgebäude">
Gesamtgebäude</option
>
<option value="Wohnen"> Wohnen</option> <option value="Wohnen"> Wohnen</option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
</Bereich>
<hr /> <hr />
<Label <Label
@@ -874,9 +909,17 @@
required required
> >
<option> Bitte auswählen</option> <option> Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}> nicht vorhanden</option> <option
<option value={Enums.Heizungsstatus.UNBEHEIZT}> unbeheizt</option> value={Enums.Heizungsstatus.NICHT_VORHANDEN}
<option value={Enums.Heizungsstatus.BEHEIZT}> beheizt</option> >
nicht vorhanden</option
>
<option value={Enums.Heizungsstatus.UNBEHEIZT}>
unbeheizt</option
>
<option value={Enums.Heizungsstatus.BEHEIZT}>
beheizt</option
>
</select> </select>
</div> </div>
</div> </div>
@@ -1304,10 +1347,15 @@
>G - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des >G - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label Gebäudes</Label
> >
<BilderZusatzsysteme {ausweis} {gebaeude} {gebaeude_aufnahme_allgemein} {images} /> <BilderZusatzsysteme
{ausweis}
{gebaeude}
{gebaeude_aufnahme_allgemein}
{images}
/>
<hr /> <hr />
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<button class="button">Weiter</button> <button class="button">Weiter</button>
</div> </div>
</fieldset> </div>
</form> </form>

View File

@@ -98,7 +98,6 @@
gebaeude gebaeude
}) })
}) })
// TODO: Ticket mit Fehldermeldung abschicken.
} }
addNotification({ addNotification({

View File

@@ -3,12 +3,11 @@
import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte";
import Hilfe from "#components/Ausweis/Hilfe.svelte"; import Hilfe from "#components/Ausweis/Hilfe.svelte";
import BereichLabel from "#labels/BereichLabel.svelte"; import Bereich from "#labels/Bereich.svelte";
//import HelpLabel from "#labels/HelpLabel.svelte"; //import HelpLabel from "#labels/HelpLabel.svelte";
//import Inputlabel from "#labels/InputLabel.svelte"; //import Inputlabel from "#labels/InputLabel.svelte";
//import Label from "#components/Label.svelte"; //import Label from "#components/Label.svelte";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte"; import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte"; import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
@@ -29,6 +28,7 @@
RawNotificationWrapper, RawNotificationWrapper,
RawNotification, RawNotification,
notifications, notifications,
deleteNotification,
} from "#components/Notifications/index.js"; } from "#components/Notifications/index.js";
import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js"; import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js";
@@ -57,14 +57,13 @@
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js"; import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
import AusweisWeiter from "./AusweisWeiter.svelte"; import AusweisWeiter from "./AusweisWeiter.svelte";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { OpenInNewWindow } from "radix-svelte-icons";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann // TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert... // wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {}; let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = let gebaeude =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {}; ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
@@ -101,11 +100,13 @@
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952]; gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true; gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1; gebaeude_aufnahme_allgemein.einheiten = 1;
gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus" gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus";
gebaeude_aufnahme_allgemein.keller = Enums.Heizungsstatus.NICHT_VORHANDEN gebaeude_aufnahme_allgemein.keller =
gebaeude_aufnahme_allgemein.dachgeschoss = Enums.Heizungsstatus.NICHT_VORHANDEN Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung" gebaeude_aufnahme_allgemein.dachgeschoss =
gebaeude_aufnahme_allgemein.kuehlung = "1" Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung";
gebaeude_aufnahme_allgemein.kuehlung = "1";
ausweis.ausstellgrund = "Vermietung"; ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000; ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000; ausweis.verbrauch_2 = 14000;
@@ -168,8 +169,6 @@
} }
</script> </script>
<Overlay bind:hidden={speichernOverlayHidden}> <Overlay bind:hidden={speichernOverlayHidden}>
<div class="bg-white w-full max-w-screen-sm py-8 px-8"> <div class="bg-white w-full max-w-screen-sm py-8 px-8">
<AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule> <AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule>
@@ -184,8 +183,6 @@
<h1>Verbrauchsausweis erstellen - 45€</h1> <h1>Verbrauchsausweis erstellen - 45€</h1>
<div class="grid grid-cols-2 gap-x-8 px-4 items-center"> <div class="grid grid-cols-2 gap-x-8 px-4 items-center">
<div class="w-full rounded-lg border-gray/35 border-0 relative px-4"> <div class="w-full rounded-lg border-gray/35 border-0 relative px-4">
<Progressbar progress={0} /> <Progressbar progress={0} />
@@ -204,131 +201,110 @@
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis"> <form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
<div id="formular-box" class="formular-boxen ring-0"> <div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart --> <!-- A Prüfung der Ausweisart -->
<BereichLabel bereich="A">Prüfung der Ausweisart</BereichLabel> <Bereich bereich="A" title="Prüfung der Ausweisart">
<div class="collapseBereich">
<Ausweisart <Ausweisart
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> />
</div> </Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss --> <!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
<BereichLabel bereich="B" <Bereich
>Eingabe&nbsp;der&nbsp;Gebäudeadresse - bereich="B"
Angaben&nbsp;zu&nbsp;Wohnfläche, Keller&nbsp;und&nbsp;Dachgeschoss</BereichLabel title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
><GebaeudeDaten bind:gebaeude_aufnahme_allgemein /></Bereich
> >
<div class="collapseBereich">
<GebaeudeDaten bind:gebaeude_aufnahme_allgemein />
</div>
<!-- C Eingabe von 3 zusammenhängenden Verbrauchsjahren --> <!-- C Eingabe von 3 zusammenhängenden Verbrauchsjahren -->
<BereichLabel bereich="C" <Bereich
>Eingabe von 3&nbsp;zusammenhängenden Verbrauchsjahren</BereichLabel bereich="C"
> title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
<div class="collapseBereich"> ><Verbrauch
<Verbrauch
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- D Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen --> <!-- D Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen -->
<BereichLabel bereich="D" <Bereich
>Eingabe&nbsp;Warmwasseranteil bereich="D"
und&nbsp;Verwendung&nbsp;von&nbsp;alternativen title="Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen"
Energieversorgungssystemen</BereichLabel ><Warmwasseranteil bind:ausweis /></Bereich
> >
<div class="collapseBereich">
<Warmwasseranteil bind:ausweis />
</div>
<!-- E Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand --> <!-- E Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand -->
<BereichLabel bereich="E" <Bereich
>Eingabe&nbsp;von&nbsp;Gebäudeteil, bereich="E"
Lüftung,&nbsp;Kühlung&nbsp;und&nbsp;Leerstand</BereichLabel title="Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand"
><LueftungundLeerstand bind:gebaeude_aufnahme_allgemein /></Bereich
> >
<div class="collapseBereich">
<LueftungundLeerstand bind:gebaeude_aufnahme_allgemein />
</div>
<!-- F Angaben zur Heizungsanlage --> <!-- F Angaben zur Heizungsanlage -->
<BereichLabel bereich="F" <Bereich bereich="F" title="Angaben zur Heizunganlage"
>Angaben zur Heizunganlage</BereichLabel ><SanierungszustandHeizungsanlage
>
<div class="collapseBereich">
<SanierungszustandHeizungsanlage
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- G Angaben zur Fenster, Dachfenster und Türen --> <!-- G Angaben zur Fenster, Dachfenster und Türen -->
<BereichLabel bereich="G" <Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
>Angaben zu Fenster, Dachfenster und Türen</BereichLabel ><SanierungszustandFensterTueren
>
<div class="collapseBereich">
<SanierungszustandFensterTueren
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- H Angaben zur Wärmedammung --> <!-- H Angaben zur Wärmedammung -->
<BereichLabel bereich="H" <Bereich bereich="H" title="Angaben zur Wärmedämmung"
>Angaben zur Wärmedämmung</BereichLabel ><SanierungszustandWaermedammung
>
<div class="collapseBereich">
<SanierungszustandWaermedammung
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- I Gebäudebild und Energieausweis PDF Vorschau --> <!-- I Gebäudebild und Energieausweis PDF Vorschau -->
<BereichLabel bereich="I" <Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
>Gebäudebild und Energieausweis PDF Vorschau</BereichLabel ><AusweisPreviewContainer
>
<div class="collapseBereich">
<AusweisPreviewContainer
bind:images bind:images
bind:ausweis bind:ausweis
bind:gebaeude /> bind:gebaeude
</div> /></Bereich
>
</div> </div>
<div <div
class="w-full px-4 mt-5 grid gap-x-4 gap-y-2 class="w-full px-4 mt-5 grid gap-x-4 gap-y-2
grid-cols-1 grid-cols-1
xs:grid-cols-2" xs:grid-cols-2"
> >
<div class="md:justify-self-start"> <div class="md:justify-self-start">
<AusweisWeiter bind:ausweis bind:images bind:user bind:gebaeude bind:gebaeude_aufnahme_allgemein></AusweisWeiter> <AusweisWeiter
bind:ausweis
bind:images
bind:user
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
></AusweisWeiter>
</div> </div>
<div class="md:justify-self-end"><Hilfe /> <div class="md:justify-self-end"><Hilfe /></div>
</div>
</div> </div>
</form> </form>
@@ -336,6 +312,26 @@ xs:grid-cols-2"
{#each Object.entries($notifications) as [uid, notification] (uid)} {#each Object.entries($notifications) as [uid, notification] (uid)}
<RawNotification notification={{ ...notification, uid }}> <RawNotification notification={{ ...notification, uid }}>
{@html notification.subtext} {@html notification.subtext}
{#if notification.selector}
<button on:click={() => {
const element = document.querySelector(notification.selector);
element?.classList.add("bg-red-300")
element?.scrollIntoView({
behavior: "smooth",
block: "center",
inline: "center"
})
element.focus()
deleteNotification(notification.uid)
setTimeout(() => {
element?.classList.remove("bg-red-300")
}, 3000)
}} class="px-4 py-2 border rounded-lg mt-2 flex flex-row text-base gap-2 font-bold" title="Anzeigen"><OpenInNewWindow size={22}></OpenInNewWindow> Anzeigen</button>
{/if}
</RawNotification> </RawNotification>
{/each} {/each}
@@ -537,10 +533,12 @@ xs:grid-cols-2"
> >
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung( Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
ausweis, ausweis,
gebaeude_aufnahme_allgemein, gebaeude_aufnahme_allgemein
)[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein)[1]} beträgt mehr )[0]} und {auditVerbrauchAbweichung(
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher, ausweis,
dass das stimmt? gebaeude_aufnahme_allgemein
)[1]} beträgt mehr als 30% und sie haben keinen Leerstand angegeben.
Sind sie sich sicher, dass das stimmt?
</RawNotification> </RawNotification>
{/if} {/if}

View File

@@ -146,7 +146,7 @@ xs:grid-cols-2
</div> </div>
<div class="mt-2"><button class="button hidden" on:click={automatischAusfüllen} type="button" >Automatisch Ausfüllen</button></div> <div class="mt-2"><button class="button" on:click={automatischAusfüllen} type="button" >Automatisch Ausfüllen</button></div>
<hr /> <hr />

View File

@@ -1,7 +1,7 @@
--- ---
import AusweisLayout from "#layouts/AusweisLayout.astro"; import AusweisLayout from "#layouts/AusweisLayout.astro";
import BedarfsausweisContent from "#modules/BedarfsausweisWohnen/BedarfsausweisContent.svelte"; import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types"; import { BedarfsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller"; import { createCaller } from "#lib/caller";
@@ -31,5 +31,5 @@ if (uid) {
--- ---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen"> <AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisContent client:load ausweis={ausweis}></BedarfsausweisContent> <BedarfsausweisWohnenModule client:load ausweis={ausweis}></BedarfsausweisWohnenModule>
</AusweisLayout> </AusweisLayout>