diff --git a/bun.lock b/bun.lock index b6a068d5..7c5db915 100644 --- a/bun.lock +++ b/bun.lock @@ -40,6 +40,7 @@ "sharp": "^0.33.5", "siema": "^1.5.1", "soap": "^1.1.8", + "sqids": "^0.3.0", "svelte": "^3.59.2", "svelte-dialogs": "^1.2.2", "svelte-preprocess": "^5.1.4", @@ -2190,6 +2191,8 @@ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "sqids": ["sqids@0.3.0", "", {}, "sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw=="], + "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], diff --git a/package.json b/package.json index 56e3bdc8..15b89b45 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "sharp": "^0.33.5", "siema": "^1.5.1", "soap": "^1.1.8", + "sqids": "^0.3.0", "svelte": "^3.59.2", "svelte-dialogs": "^1.2.2", "svelte-preprocess": "^5.1.4", diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index adf94b6b..01c6a1a1 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,7 +5,6 @@ export const createCaller = createCallerFactory({ "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "unterlage": await import("../src/pages/api/unterlage.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), "admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"), "admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"), @@ -13,6 +12,7 @@ export const createCaller = createCallerFactory({ "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "ausweise": await import("../src/pages/api/ausweise/index.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), @@ -30,11 +30,11 @@ export const createCaller = createCallerFactory({ "ticket": await import("../src/pages/api/ticket/index.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), - "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), - "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), - "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), + "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), + "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"), "aufnahme/[uid]/unterlagen": await import("../src/pages/api/aufnahme/[uid]/unterlagen.ts"), diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index e7681631..94cb2d01 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -18,6 +18,7 @@ export let aufnahme: AufnahmeClient; export let ausweisart: Enums.Ausweisart export let form: HTMLFormElement; + export let skala: HTMLDivElement; export let showWeiter: boolean = true; @@ -25,9 +26,26 @@ async function ausweisAbschicken() { if (!form.checkValidity()) { - form.reportValidity() - return - } + // Entferne die Klasse "2xl:mt-[370px]" falls vorhanden + document.getElementById("formInput-1")?.classList.remove("2xl:mt-[370px]"); + + // Verhindere das Scrollen (falls erforderlich) + skala.classList.add("no-scroll"); + + // Zeige die Validierungsmeldungen + form.reportValidity(); + + // Finde das erste ungültige Feld und scrolle sanft darauf + let firstInvalidField = form.querySelector(":invalid"); + if (firstInvalidField) { + let offset = 150; // Abstand für bessere Sichtbarkeit + let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY; + window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" }); + } + + return; +} + openWindowWithPost("/kundendaten", { ausweis, diff --git a/src/components/Dashboard/DashboardSidebar.svelte b/src/components/Dashboard/DashboardSidebar.svelte index df3c89bf..3238864c 100644 --- a/src/components/Dashboard/DashboardSidebar.svelte +++ b/src/components/Dashboard/DashboardSidebar.svelte @@ -31,6 +31,7 @@
{benutzer.vorname} {benutzer.name}
{benutzer.email}
+ Logout diff --git a/src/layouts/AusweisLayoutDaten.astro b/src/layouts/AusweisLayoutDaten.astro index 0b655fd4..199aec85 100644 --- a/src/layouts/AusweisLayoutDaten.astro +++ b/src/layouts/AusweisLayoutDaten.astro @@ -22,6 +22,20 @@ const { title } = Astro.props; const skala = document.getElementById("skala"); if (skala?.classList.contains("no-scroll")) { + if (skala) { + skala.classList.remove( + "2xl:fixed", + "2xl:py-4", + "2xl:top-0", + "2xl:z-20" + ); + skala.classList.add("w-full"); + skala.style.borderBottom = "none"; + } + + document + .getElementById("formInput-1") + ?.classList.remove("2xl:mt-[370px]"); return; } diff --git a/src/lib/server/mail/payment-success.ts b/src/lib/server/mail/payment-success.ts index e95af21b..d97e21d2 100644 --- a/src/lib/server/mail/payment-success.ts +++ b/src/lib/server/mail/payment-success.ts @@ -5,15 +5,21 @@ import { Enums, Rechnung, VerbrauchsausweisWohnen, -} from "#lib/client/prisma"; -import { prisma } from "#lib/server/prisma"; +} from "#lib/client/prisma.js"; +import { prisma } from "#lib/server/prisma.js"; import { getAnsichtsausweis } from "../ausweis.js"; +import Sqids from "sqids"; export async function sendPaymentSuccessMail( ausweis: VerbrauchsausweisWohnen, rechnung: Rechnung, user: Benutzer ) { + const sqids = new Sqids({ + alphabet: "0123456789abcdefghijklmnopqrstuvw", + minLength: 8 + }) + const aufnahme = await prisma.aufnahme.findUnique({ where: { id: ausweis.aufnahme_id, @@ -64,7 +70,7 @@ export async function sendPaymentSuccessMail( attachments, from: `"IBCornelsen" `, to: user.email, - subject: `Bestellbestätigung vom IBCornelsen (ID: ${ausweis.uid})`, + subject: `Bestellbestätigung vom IBCornelsen (ID: ${sqids.encode([ausweis.id])})`, cc: { address: rechnung.email || "", name: rechnung.empfaenger || "", diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte index a9afaf57..0be3748e 100644 --- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte @@ -147,6 +147,7 @@ const ausweisart = Enums.Ausweisart.VerbrauchsausweisWohnen const anliegen = "Energieausweis erstellen"; let form: HTMLFormElement; +let skala: HTMLDivElement; @@ -166,7 +167,7 @@ let form: HTMLFormElement; -
+
@@ -298,9 +300,10 @@ let form: HTMLFormElement; bind:user bind:objekt bind:aufnahme - bind:form + {form} ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen} {ausweistyp} + {skala} > @@ -585,4 +588,10 @@ let form: HTMLFormElement; Die Wohnfläche darf nicht größer als die Nutzfläche sein. {/if} - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/pages/auth/logout.astro b/src/pages/auth/logout.astro index 70a0e361..9977dd14 100644 --- a/src/pages/auth/logout.astro +++ b/src/pages/auth/logout.astro @@ -1,9 +1,36 @@ --- import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "#lib/constants"; -Astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME); -Astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME); -Astro.cookies.delete(API_UID_COOKIE_NAME); -return Astro.redirect("/auth/login"); ---- \ No newline at end of file +Astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME, { + domain: `.${Astro.url.hostname}`, + path: "/", +}); +Astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME, { + domain: `.${Astro.url.hostname}`, + path: "/", +}); +Astro.cookies.delete(API_UID_COOKIE_NAME, { + domain: `.${Astro.url.hostname}`, + path: "/", +}); + + +--- + + + + + + + + + + + + + \ No newline at end of file