f047_Edit-der-Namen #15

Closed
jared wants to merge 11 commits from f047_Edit-der-Namen into development
7 changed files with 186 additions and 78 deletions
Showing only changes of commit f5136c2924 - Show all commits

View File

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

View File

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

View File

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

View File

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

View File

@@ -11,7 +11,7 @@
import shortenFileSize from '$lib/helper/shortenFileSize.js'; import shortenFileSize from '$lib/helper/shortenFileSize.js';
import timeElapsed from '$lib/helper/timeElapsed.js'; import timeElapsed from '$lib/helper/timeElapsed.js';
export let data; let { data } = $props();
interface ListItem { interface ListItem {
name: string; name: string;
@@ -23,26 +23,33 @@
const crimesList: ListItem[] = data.crimesList; const crimesList: ListItem[] = data.crimesList;
const token: string = data.caseToken; 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 editingId: number;
// let admin = data?.user?.admin; // let admin = data?.user?.admin;
let admin = true; let admin = true;
let rename_input; let rename_input;
$: rename_input;
$effect(() => {
console.log('rename_input hat sich geändert:', rename_input);
});
function uploadSuccessful() { function uploadSuccessful() {
open = false; open = false;
} }
async function handle_input(ev: KeyboardEvent, i: number) { /* async function handle_input(ev: KeyboardEvent, i: number) {
let item = crimesList[i]; let item = crimesList[i];
if (ev.key == 'Escape') { if (ev.key == 'Escape') {
let text_field_id = `label__${item.name}`; let text_field_id = `label__${item.name}`;
@@ -111,9 +118,62 @@
return; 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> </script>
<div>Hallo</div>
<div class="-z-10 bg-white"> <div class="-z-10 bg-white">
<div class="flex flex-col items-center justify-center w-full"> <div class="flex flex-col items-center justify-center w-full">
<h1 class="text-xl">Vorgang {vorgang}</h1> <h1 class="text-xl">Vorgang {vorgang}</h1>
@@ -133,14 +193,11 @@
<div class="min-w-0 flex-auto"> <div class="min-w-0 flex-auto">
{#if admin} {#if admin}
<EditableItem <EditableItem
id={i} list={crimesList}
inputValue={item.name} bind:editedName={names[i]}
editing={editingId === i} currentName={item.name}
editStart={() => (editingId = i)} onSave={handleSave}
variant="crimename" onDelete={handleDelete}
existings={crimesList}
save={(e) => console.log('Gespeichert:', e)}
deleteItem={(e) => console.log('Gelöscht:', e)}
></EditableItem> ></EditableItem>
{:else} {:else}
<span class="text-sm font-semibold leading-6 text-gray-900 inline-block min-w-1" <span class="text-sm font-semibold leading-6 text-gray-900 inline-block min-w-1"
@@ -153,6 +210,7 @@
</p> </p>
{/if} {/if}
</div> </div>
<div>{item.name}</div>
</div> </div>
<div class="hidden sm:flex sm:flex-col sm:items-end"> <div class="hidden sm:flex sm:flex-col sm:items-end">
<p class="text-sm leading-6 text-gray-900">3D Tatort</p> <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 }) => { export const GET: RequestHandler = async ({ params }) => {
const { filename } = params; const { filename } = params;
// TODO: Datei lesen oder Datenbankabfrage // TODO: Datei lesen oder Datenbankabfrage
return json({ filename, list: mockList }); 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 { filename } = params;
const { oldName, newName } = await request.json(); const { oldName, newName } = await request.json();
@@ -41,43 +71,28 @@ export const PUT: RequestHandler = async ({ request, params }) => {
return json({ success: true, updated: newName }); return json({ success: true, updated: newName });
}; };
*/
export const DELETE: RequestHandler = async ({ request, params }) => { export const DELETE: RequestHandler = async ({ request })=> { //body: {request}, keine params // params= de?param1=value&params2
const { filename } = params; // const vorgang = params.vorgang;
const { name } = await request.json(); const { vorgang } = await request.json();
const index = mockList.findIndex((n) => n === name); const object_list:string[] = await new Promise((resolve, reject) => {
if (index === -1) { const res: string[] = [];
return new Response('Name nicht gefunden', { status: 404 }); 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 });
} }
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 });
};
// export async function DELETE({ params }) {
// const vorgang = params.vorgang;
// const object_list = await new Promise((resolve, reject) => {
// const res = [];
// const items_str = client.listObjects('tatort', vorgang, true);
// 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 });
// }

View File

@@ -1,4 +1,5 @@
import { BUCKET, client } from '$lib/minio'; import { BUCKET, client } from '$lib/minio';
import type { RequestHandler } from '@sveltejs/kit';
export async function GET() { export async function GET() {
const stream = client.listObjectsV2(BUCKET, '', true); 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 url_fragments = request.url.split('/');
const item = url_fragments.at(-1); const item = url_fragments.at(-1);
const vorgang = url_fragments.at(-2); const vorgang = url_fragments.at(-2);
@@ -32,4 +33,38 @@ export async function DELETE({ request }: { request: Request }) {
await client.removeObject(BUCKET, `${vorgang}/${item}`); await client.removeObject(BUCKET, `${vorgang}/${item}`);
return new Response(null, { status: 204 }); 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 }); */
}