From b6996902cc2539bf3d0bc167f4f6d2aeaf30c716 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 20 Nov 2025 09:46:28 +0100 Subject: [PATCH] implement renaming feature for vorgang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI and backend logic make ´NameItemEditor´ reusable to be able to use with Vorgang --- src/lib/components/NameItemEditor.svelte | 12 ++- src/lib/server/vorgangService.ts | 22 ++++ src/routes/(angemeldet)/list/+page.svelte | 116 +++++++++++++++++----- src/routes/api/list/[vorgang]/+server.ts | 19 +++- 4 files changed, 139 insertions(+), 30 deletions(-) diff --git a/src/lib/components/NameItemEditor.svelte b/src/lib/components/NameItemEditor.svelte index 8b48dff..52668ce 100644 --- a/src/lib/components/NameItemEditor.svelte +++ b/src/lib/components/NameItemEditor.svelte @@ -13,7 +13,8 @@ // props, old syntax export let list: ListItem[] = []; export let currentName: string; - export let onSave: (n: string, o: string) => unknown = () => {}; + export let vorgangToken: string | null; + export let onSave: (n: string, o: string, t?: string) => unknown = () => {}; export let onDelete: (n: string) => unknown = () => {}; let localName = currentName; @@ -43,8 +44,10 @@ } function commitEdit() { - if (!error && localName != currentName) onSave(localName, currentName); - + if (!error && localName != currentName) onSave(localName, currentName, vorgangToken); + // restore original value + if (error) { localName = currentName } + isEditing = false; } @@ -54,7 +57,8 @@ } function handleDeleteClick() { - onDelete(currentName); + // vorgangToken defined when deleting Vorgang, otherwise Crime + onDelete(vorgangToken || currentName); } diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index 3cf016e..4232739 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -234,3 +234,25 @@ export const vorgangPINValidation = function (vorgangToken: string, vorgangPIN: return true; }; + +/** + * Rename Vorgang + * @param vorgangToken + * @param newName + * @returns {int} number of affected lines + */ +export const renameVorgangByToken = function (vorgangToken: string, newName: string) { + const renameSQLStmt = 'UPDATE cases set name = ? WHERE token = ?'; + const statement = db.prepare(renameSQLStmt); + + let info; + + try { + info = statement.run(newName, vorgangToken); + } catch (err) { + console.log(`error: ${err}`) + return 0; + } + + return info.changes; +}; \ No newline at end of file diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 59bbe55..ca9cc6d 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -3,12 +3,35 @@ import Trash from '$lib/icons/Trash.svelte'; import Folder from '$lib/icons/Folder.svelte'; import EmptyList from '$lib/components/EmptyList.svelte'; + import NameItemEditor from '$lib/components/NameItemEditor.svelte'; + import Alert from '$lib/components/Alert.svelte'; + import Button from '$lib/components/Button.svelte'; + import Modal from '$lib/components/Modal/Modal.svelte'; + import ModalTitle from '$lib/components/Modal/ModalTitle.svelte'; + import ModalContent from '$lib/components/Modal/ModalContent.svelte'; + import ModalFooter from '$lib/components/Modal/ModalFooter.svelte'; import { API_ROUTES, ROUTE_NAMES } from '../../index.js'; + import { invalidateAll } from '$app/navigation'; let { data, form } = $props(); - let vorgangList = data.vorgangList; - + let vorgangList = $state(data.vorgangList); + + // same as `vorgangList` but with one different property to be used + // with ´NameItemEditor` + const derivedList = $derived.by( + () => { + return vorgangList.map( + ({ vorgangName, ...rest }) => ( + { + name: vorgangName, + ...rest + } + ) + ) + } + ); + let isEmptyList = vorgangList.length === 0; let vorgangName = $state(''); @@ -61,16 +84,12 @@ return true; } - async function delete_item(ev: Event) { + async function deleteVorgang(vorgangToken: string) { let delete_item = window.confirm('Bist du sicher?'); if (delete_item) { - const target = ev.currentTarget as HTMLElement | null; - if (!target) return; - let filename = target.id.split('del__')[1]; - - let url = API_ROUTES.VORGANG(filename); - + let url = API_ROUTES.VORGANG(vorgangToken); + try { const response = await fetch(url, { method: 'DELETE' }); if (response.status == 204) { @@ -87,6 +106,46 @@ } } } + + //Variablen für Modal + let open = $state(false); + let inProgress = $state(false); + let isError = $state(false); + + async function handleSave(newName: string, oldName: string, vorgangToken: string) { + open = true; + inProgress = true; + isError = false; + try { + const res = await fetch(API_ROUTES.VORGANG(vorgangToken), { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ vorgangToken, oldName, newName }) + }); + + if (!res.ok) { + throw new Error('Fehler beim Speichern'); + } + await invalidateAll(); + vorgangList = data.vorgangList; + open = false; + } catch (err) { + console.error('⚠️ Netzwerkfehler beim Speichern', err); + isError = true; + } finally { + inProgress = false; + } + } + + + + async function closeModal() { + open = false; + isError = false; + } +
@@ -100,27 +159,21 @@ {:else} {#each vorgangList as vorgangItem}
  • +
  • {/each} {/if} @@ -190,6 +243,19 @@ +Umbenennen + {#if inProgress} +

    Vorgang läuft...

    + {:else if isError} + Fehler beim Umbenennen + {:else} + Umbenennen erfolgreich + {/if} +
    + +
    +