From cc469f67a5c13c9dc0ff6216e2191e335724253f Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 5 Nov 2025 12:19:34 +0100 Subject: [PATCH 1/8] allow for addition of Vorgaenge on Vorgang overview --- src/lib/server/vorgangService.ts | 26 +++++ src/routes/(angemeldet)/list/+page.server.ts | 24 +++- src/routes/(angemeldet)/list/+page.svelte | 110 ++++++++++++++++++- 3 files changed, 157 insertions(+), 3 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index dc85f84..3cf016e 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,6 +1,7 @@ import { fail } from '@sveltejs/kit'; import { BUCKET, client, CONFIGFILENAME, TOKENFILENAME } from '$lib/minio'; import { checkIfExactDirectoryExists, getContentOfTextObject } from './s3ClientService'; +import { v4 as uuidv4 } from 'uuid'; import { db } from './dbService'; @@ -45,6 +46,31 @@ export const getVorgangByToken = ( return result; }; +/** + * Create Vorgang, using a vorgangName and vorgangPIN + * @param vorgangName + * @param vorgangPIN + * @returns {string || false} vorgangToken if successful + */ +export const createVorgang = (vorgangName: string, vorgangPIN: string): string | boolean => { + const vorgangExists = vorgangNameExists(vorgangName); + if (vorgangExists) { + return false; + } + + const vorgangToken = uuidv4(); + + const insertSQLStatement = `INSERT INTO cases (token, name, pin) VALUES (?, ?, ?)`; + const statement = db.prepare(insertSQLStatement); + const info = statement.run(vorgangToken, vorgangName, vorgangPIN); + + if (info.changes) { + return vorgangToken; + } else { + return false; + } +}; + /** * Get Vorgang * @param vorgangName diff --git a/src/routes/(angemeldet)/list/+page.server.ts b/src/routes/(angemeldet)/list/+page.server.ts index ab89231..af7e6c6 100644 --- a/src/routes/(angemeldet)/list/+page.server.ts +++ b/src/routes/(angemeldet)/list/+page.server.ts @@ -1,6 +1,6 @@ -import { getVorgaenge } from '$lib/server/vorgangService'; +import { createVorgang, getVorgaenge } from '$lib/server/vorgangService'; import type { PageServerLoad } from '../../(token-based)/view/$types'; -import { error } from '@sveltejs/kit'; +import { error, fail } from '@sveltejs/kit'; export const load: PageServerLoad = async (event) => { if (!event.locals.user) { @@ -13,3 +13,23 @@ export const load: PageServerLoad = async (event) => { vorgangList }; }; + + +export const actions = { + default: async ({ request }: { request: Request }) => { + const data = await request.formData(); + const vorgangName: string | null = data.get('vorgang') as string; + const vorgangPIN: string | null = data.get('pin') as string; + + const err = {}; + + const token = createVorgang(vorgangName, vorgangPIN); + if (!token) { + err.message = "Der Vorgang konnte nicht angelegt werden" + return fail(400, err) + } else { + // success + return { token } + } + } +}; \ No newline at end of file diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 1a7f888..45892dc 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -4,12 +4,62 @@ import EmptyList from '$lib/components/EmptyList.svelte'; import { API_ROUTES, ROUTE_NAMES } from '../../index.js'; - let { data } = $props(); + let { data, form } = $props(); let vorgangList = data.vorgangList; let isEmptyList = vorgangList.length === 0; + let vorgangName = $state(''); + let vorgangPIN = $state(''); + let errorMsg = $state(''); + + // reset input fields when submission successful + $effect(() => { + if (form?.token) { + vorgangName = ''; + vorgangPIN = ''; + errorMsg = ''; + } + }); + + async function submitVorgang(ev: Event) { + const isValid = inputValid(vorgangName, vorgangPIN); + if (!isValid) { + ev.preventDefault(); + return; + } + + // continue form action on server + } + + /** + * Check for required fields + * @param vorgangName + * @param vorgangPIN + * @returns {boolean} Indicates whether input is valid + */ + function inputValid(vorgangName, vorgangPIN) { + if (!(vorgangName || vorgangPIN)) { + errorMsg = 'Bitte beide Felder ausfüllen.'; + return false; + } else if (!vorgangName) { + errorMsg = 'Bitte einen Vorgangsnamen vergeben.'; + return false; + } else if (!vorgangPIN) { + errorMsg = 'Bitte einen Vorgangs-PIN eingeben.'; + return false; + } + + const existing = vorgangList.some((vorg) => vorg.vorgangName === vorgangName); + if (existing) { + errorMsg = 'Der Name existiert bereits.'; + return false; + } + + return true; + } + async function delete_item(ev: Event) { let delete_item = window.confirm('Bist du sicher?'); @@ -80,6 +130,64 @@ +
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+ + {#if errorMsg} +

{errorMsg}

+ {/if} + {#if form?.message} +

{form.message}

+ {/if} + +
+ + From b26080f4c173c816672f8ad14290ed2d0c56367d Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 10 Nov 2025 08:40:52 +0100 Subject: [PATCH 4/8] successful upload modal for crimes --- .../(token-based)/list/[vorgang]/+page.svelte | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 971f1a5..4b46499 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -51,22 +51,21 @@ return; } const url = await getUrl(); - open = true; - inProgress = true; + openUL = true; + inProgressUL = true; fetch(url, { method: 'PUT', body: files[0] }) .then((response) => { - inProgress = false; + inProgressUL = false; etag = '123'; }) .catch((err) => { - inProgress = false; + inProgressUL = false; etag = null; console.log('ERROR', err); }); } - async function validateForm() { let data = new FormData(); data.append('vorgang', vorgangName); @@ -94,6 +93,14 @@ return success; } + async function uploadSuccessful() { + openUL = false; + name = ''; + files = null; + await invalidateAll(); + crimesList = data.crimesList; + } + // `val` is hex string function swap_endian(val) { // from https://www.geeksforgeeks.org/bit-manipulation-swap-endianness-of-a-number/ @@ -401,7 +408,7 @@ Mit freundlichen Grüßen, - Upload {#if inProgressUL}

Upload läuft...

@@ -411,9 +418,10 @@ Mit freundlichen Grüßen, Fehler beim Upload {/if}
- +
- {/if} @@ -422,4 +430,3 @@ Mit freundlichen Grüßen, min-width: 24rem; } - From 1c4b154e410c4174b01d33e2393665de828179b0 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 11 Nov 2025 07:57:29 +0100 Subject: [PATCH 5/8] add + (plus) button for addition of Vorgaenge and Crimes --- src/lib/components/ExpandableForm.svelte | 53 +++++++++++++++++++ src/routes/(angemeldet)/list/+page.svelte | 7 ++- .../(token-based)/list/[vorgang]/+page.svelte | 5 ++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/lib/components/ExpandableForm.svelte diff --git a/src/lib/components/ExpandableForm.svelte b/src/lib/components/ExpandableForm.svelte new file mode 100644 index 0000000..674440c --- /dev/null +++ b/src/lib/components/ExpandableForm.svelte @@ -0,0 +1,53 @@ + + +
+ + + + + {#if expanded} +
+
+ +
+
+ {/if} +
diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 45892dc..c7fedbf 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -1,4 +1,5 @@ -
+