zwischenstand: bug delete tatort

This commit is contained in:
2025-07-08 14:48:06 +02:00
parent f335f7a13f
commit f5136c2924
7 changed files with 186 additions and 78 deletions

View File

@@ -18,7 +18,6 @@
let names = list.map((l: ListItem) => l.name);
let localName = $state(currentName);
//let names = list;
let wasCancelled = $state(false);
// Automatisch berechneter Fehler
@@ -51,10 +50,11 @@
// Speichern, wenn gültig und zurück an Eltern
function commitIfValid() {
if (!validateName(localName) && !wasCancelled && localName != currentName) {
if (!error && !wasCancelled && localName != currentName) {
editedName = localName.trim();
onSave(editedName, currentName); //Eltern benachrichtigen
} else {
localName = currentName;
resetEdit();
}
}
@@ -74,7 +74,7 @@
commitIfValid();
} else if (event.key === 'Escape') {
event.preventDefault();
editedName = currentName;
localName = currentName;
resetEdit();
}
}

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import Folder from '$lib/icons/Folder.svelte';
import EditableItem from '$lib/components/EditableItem.svelte';
import { invalidate } from '$app/navigation';
interface ListItem {
name: string;
@@ -16,9 +17,6 @@
let names: string[] = $state(caseList.map((l) => l.name));
let editedName: string = $state('');
function getNameById(list: ListItem[], id: number) {
return list[id].name;
}
async function delete_item(ev: Event) {
let delete_item = window.confirm('Bist du sicher?');
@@ -71,23 +69,28 @@
}
}
async function handleDelete(name: string) {
async function handleDelete(vorgang: string) {
let url = `/api/list/${vorgang}`;
try {
const res = await fetch(`/api/list/${name}`, {
const res = await fetch(url, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name })
body: JSON.stringify({ vorgang })
});
if (!res.ok) {
const msg = await res.text();
console.error('❌ Fehler beim Löschen:', msg);
} else {
console.log('🗑️ Erfolgreich gelöscht:', name);
// Optional: Lokale Liste aktualisieren
//S items = items.filter((item) => item.name !== name);
setTimeout(() => {
window.location.reload();
}, 500);
//await invalidate('/api/list');
console.log('🗑️ Erfolgreich gelöscht:', vorgang);
await invalidate('/api/list'); // funktioniert nicht vernünftig
}
} catch (err) {
console.error('⚠️ Netzwerkfehler beim Löschen:', err);

View File

@@ -1,4 +1,5 @@
<script lang="ts">
//Kann komplett gelöscht werden
import Alert from '$lib/components/Alert.svelte';
import Button from '$lib/components/Button.svelte';
import Modal from '$lib/components/Modal/Modal.svelte';
@@ -75,19 +76,14 @@
</div>
<label for="code">
<span >Zugangscode (optional) </span>
<span>Zugangscode (optional) </span>
</label>
<div class="mt-2">
<div
>
<input
type="text"
id="code"
/>
<div>
<input type="text" id="code" />
</div>
</div>
</div>
</div>
</div>

View File

@@ -8,6 +8,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
const crimesList = await getVorgangByCaseId(caseId);
return {
caseId,
crimesList,
caseToken
};

View File

@@ -11,7 +11,7 @@
import shortenFileSize from '$lib/helper/shortenFileSize.js';
import timeElapsed from '$lib/helper/timeElapsed.js';
export let data;
let { data } = $props();
interface ListItem {
name: string;
@@ -23,26 +23,33 @@
const crimesList: ListItem[] = data.crimesList;
const token: string = data.caseToken;
export let vorgang = $page.params.vorgang;
let vorgang = data.caseId;
/* export let vorgang = $page.params.vorgang; */
//Variabeln für EditableItem
let names: string[] = $state(crimesList.map((l) => l.name));
let editedName: string = $state('');
let open = $state(false);
let inProgress = $state(false);
let err = $state(false);
let open = false;
$: open;
let inProgress = false;
$: inProgress;
let err = false;
$: err;
let editingId: number;
// let admin = data?.user?.admin;
let admin = true;
let rename_input;
$: rename_input;
$effect(() => {
console.log('rename_input hat sich geändert:', rename_input);
});
function uploadSuccessful() {
open = false;
}
async function handle_input(ev: KeyboardEvent, i: number) {
/* async function handle_input(ev: KeyboardEvent, i: number) {
let item = crimesList[i];
if (ev.key == 'Escape') {
let text_field_id = `label__${item.name}`;
@@ -111,9 +118,62 @@
return;
}
} */
async function handleSave(newName: string, oldName: string) {
console.log('Eltern, speichern erfolgreich', newName, oldName);
try {
const res = await fetch(`/api/list/${vorgang}/${oldName}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ oldName, newName })
});
if (!res.ok) {
const msg = await res.text();
console.error('❌ Fehler beim Speichern:', msg);
} else {
console.log('✅ Erfolgreich gespeichert:', newName);
}
} catch (err) {
console.error('⚠️ Netzwerkfehler:', err);
}
}
async function handleDelete(tatort: string) {
let url = `/api/tatort/`;
console.log('Delete tatort: ', vorgang, tatort, data.caseId);
try {
const res = await fetch(url, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ vorgang })
});
if (!res.ok) {
const msg = await res.text();
console.error('❌ Fehler beim Löschen:', msg);
} else if (res.status == 204) {
setTimeout(() => {
window.location.reload();
}, 500);
// await invalidate(url);
} else {
console.log('🗑️ Erfolgreich gelöscht:', vorgang);
}
} catch (err) {
console.error('⚠️ Netzwerkfehler beim Löschen:', err);
}
}
</script>
<div>Hallo</div>
<div class="-z-10 bg-white">
<div class="flex flex-col items-center justify-center w-full">
<h1 class="text-xl">Vorgang {vorgang}</h1>
@@ -133,14 +193,11 @@
<div class="min-w-0 flex-auto">
{#if admin}
<EditableItem
id={i}
inputValue={item.name}
editing={editingId === i}
editStart={() => (editingId = i)}
variant="crimename"
existings={crimesList}
save={(e) => console.log('Gespeichert:', e)}
deleteItem={(e) => console.log('Gelöscht:', e)}
list={crimesList}
bind:editedName={names[i]}
currentName={item.name}
onSave={handleSave}
onDelete={handleDelete}
></EditableItem>
{:else}
<span class="text-sm font-semibold leading-6 text-gray-900 inline-block min-w-1"
@@ -153,6 +210,7 @@
</p>
{/if}
</div>
<div>{item.name}</div>
</div>
<div class="hidden sm:flex sm:flex-col sm:items-end">
<p class="text-sm leading-6 text-gray-900">3D Tatort</p>

View File

@@ -4,17 +4,47 @@ import { json } from '@sveltejs/kit';
// Beispiel-Datenquelle (ersetzen durch echte DB oder Datei)
let mockList = [ "202505-test-se", "Minas-TestVorgang", "Testing-Mina", "xyz-123" ];
/*
export const GET: RequestHandler = async ({ params }) => {
const { filename } = params;
// TODO: Datei lesen oder Datenbankabfrage
return json({ filename, list: mockList });
}; */
// rename operation
export async function PUT({ request }: {request: Request}) {
const data = await request.json();
// Vorgang
const vorgang = request.url.split('/').at(-1);
// prepare copy, incl. check if new name exists already
const old_name = data["old_name"];
const src_full_path = `/tatort/${vorgang}/${old_name}`;
const new_name = `${vorgang}/${data["new_name"]}`;
try {
await client.statObject('tatort', new_name);
return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 });
} catch (error) {
// continue operation
console.log(error, 'continue operation');
}
// actual copy operation
await client.copyObject('tatort', new_name, src_full_path)
// delete
await client.removeObject('tatort', `${vorgang}/${old_name}`)
// return success or failure
return json({ success: 'success' }, { status: 200 });
};
export const PUT: RequestHandler = async ({ request, params }) => {
/* export const PUT: RequestHandler = async ({ request, params }) => {
const { filename } = params;
const { oldName, newName } = await request.json();
@@ -41,43 +71,28 @@ export const PUT: RequestHandler = async ({ request, params }) => {
return json({ success: true, updated: newName });
};
*/
export const DELETE: RequestHandler = async ({ request, params }) => {
const { filename } = params;
const { name } = await request.json();
export const DELETE: RequestHandler = async ({ request })=> { //body: {request}, keine params // params= de?param1=value&params2
// const vorgang = params.vorgang;
const { vorgang } = await request.json();
const index = mockList.findIndex((n) => n === name);
if (index === -1) {
return new Response('Name nicht gefunden', { status: 404 });
}
const object_list:string[] = await new Promise((resolve, reject) => {
const res: string[] = [];
const items_str = client.listObjects('tatort', vorgang, true);
items_str.on('data', (obj) => {
if(obj.name) res.push(obj.name);
});
console.log('📥 DELETE-Request empfangen:', mockList);
mockList.splice(index, 1);
console.log('📄 Datei:', filename);
console.log('🔁 gelöscht', mockList);
return json({ success: true, deleted: name });
};
items_str.on('error', reject);
// export async function DELETE({ params }) {
// const vorgang = params.vorgang;
items_str.on('end', async () => {
resolve(res);
});
});
// const object_list = await new Promise((resolve, reject) => {
// const res = [];
// const items_str = client.listObjects('tatort', vorgang, true);
await client.removeObjects('tatort', object_list);
// items_str.on('data', (obj) => {
// res.push(obj.name);
// });
// items_str.on('error', reject);
// items_str.on('end', async () => {
// resolve(res);
// });
// });
// await client.removeObjects('tatort', object_list);
// return new Response(null, { status: 204 });
// }
return new Response(null, { status: 204 });
}

View File

@@ -1,4 +1,5 @@
import { BUCKET, client } from '$lib/minio';
import type { RequestHandler } from '@sveltejs/kit';
export async function GET() {
const stream = client.listObjectsV2(BUCKET, '', true);
@@ -24,7 +25,7 @@ export async function GET() {
}
export async function DELETE({ request }: { request: Request }) {
/* export async function DELETE({ request }: { request: Request }) {
const url_fragments = request.url.split('/');
const item = url_fragments.at(-1);
const vorgang = url_fragments.at(-2);
@@ -32,4 +33,38 @@ export async function DELETE({ request }: { request: Request }) {
await client.removeObject(BUCKET, `${vorgang}/${item}`);
return new Response(null, { status: 204 });
}
} */
export const DELETE: RequestHandler = async ({ request,params })=> { //body: {request}, keine params // params= de?param1=value&params2
const token = params;
let {vorgang, tatort} = await request.json();
console.log("Server Delete ", vorgang, tatort, token );
const url_fragments = request.url.split('/');
tatort = url_fragments.at(-1);
vorgang = url_fragments.at(-2);
await client.removeObject(BUCKET, `${vorgang}/${tatort}?token=${token}`)
return new Response(null, { status: 204 });
// const vorgang = params.vorgang;
/*
const object_list:string[] = await new Promise((resolve, reject) => {
const res: string[] = [];
const items_str = client.listObjects('tatort', vorgang, true);
items_str.on('data', (obj) => {
if(obj.name) res.push(obj.name);
});
items_str.on('error', reject);
items_str.on('end', async () => {
resolve(res);
});
});
await client.removeObjects('tatort', object_list);
return new Response(null, { status: 204 }); */
}