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 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);
// 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 {
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;
@@ -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 }); */
}