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);
mina marked this conversation as resolved Outdated
Outdated
Review

Bitte Console.log entfernen.

Bitte Console.log entfernen.
//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';
@@ -79,15 +80,10 @@
</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 {
Outdated
Review

s. o.

s. o.
Outdated
Review

Ja, das können wir mal im Daily ansprechen, ich habe ein Ticket daraus gemacht.

Ja, das können wir mal im Daily ansprechen, ich habe ein Ticket daraus gemacht.
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 { name } = await request.json();
const index = mockList.findIndex((n) => n === name);
if (index === -1) {
return new Response('Name nicht gefunden', { status: 404 });
}
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 vorgang = params.vorgang;
const { vorgang } = await request.json();
// const object_list = await new Promise((resolve, reject) => { const object_list:string[] = await new Promise((resolve, reject) => {
// const res = []; const res: string[] = [];
// const items_str = client.listObjects('tatort', vorgang, true); const items_str = client.listObjects('tatort', vorgang, true);
// items_str.on('data', (obj) => { items_str.on('data', (obj) => {
// res.push(obj.name); if(obj.name) res.push(obj.name);
// }); });
// items_str.on('error', reject); items_str.on('error', reject);
// items_str.on('end', async () => { items_str.on('end', async () => {
// resolve(res); resolve(res);
// }); });
// }); });
// await client.removeObjects('tatort', object_list); 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 { 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 }); */
} }