f047_Edit-der-Namen #15

Closed
jared wants to merge 11 commits from f047_Edit-der-Namen into development
4 changed files with 67 additions and 44 deletions
Showing only changes of commit 1c471b4239 - Show all commits

View File

@@ -1,7 +1,6 @@
<script lang="ts">
import Edit from '$lib/icons/Edit.svelte';
import Trash from '$lib/icons/Trash.svelte';
import { createEventDispatcher } from 'svelte';
import { validateInput } from '$lib/helper/error-utils';
interface ListItem {
@@ -10,39 +9,45 @@
// add other properties as needed
}
export let value: string = '';
export let variant: '' | 'casename' | 'crimename' = ''; // casename | crimename
type Variant = '' | 'casename' | 'crimename';
export let inputValue: string = '';
mina marked this conversation as resolved Outdated
Outdated
Review

Der Kommentar könnte m.M.n. raus

Der Kommentar könnte m.M.n. raus
export let variant: Variant = '';
export let existings: ListItem[];
export let id: number;
export let editable: boolean = true;
export let editing: boolean;
mina marked this conversation as resolved Outdated
Outdated
Review

Bitte Console.log entfernen.

Bitte Console.log entfernen.
console.log('Debug editing', editing);
//CustomEvents:
export let editStart: (payload: {
id: number;
inputValue: string;
variant: Variant;
mina marked this conversation as resolved Outdated
Outdated
Review

Typo editSart to editStart

Typo editSart to editS**t**art
editing: boolean;
}) => void;
export let save: (payload: { newValue: string; oldValue: string; variant: Variant }) => void;
export let deleteItem: (payload: {
jared marked this conversation as resolved Outdated
Outdated
Review

The signature '(): EventDispatcher<{ editSart: {}; save: {}; delete: {}; cancel: void; }>' of 'createEventDispatcher' is deprecated.

Mittlerweile wird ein Event mittels Callback function dispatched. Gucke ggf. noch einmal in die Docs.

Zum Beispiel:

<script type="ts"> const props: { onClick(): void; onExplode(name: string, age: number): void; } = $props(); </script>

<MyComponent
onClick={() => alert('clicked')}
onExplode={(name, age) => alert(name + ' ' + age)}
/>

The signature '(): EventDispatcher<{ editSart: {}; save: {}; delete: {}; cancel: void; }>' of 'createEventDispatcher' is deprecated. Mittlerweile wird ein Event mittels Callback function dispatched. Gucke ggf. noch einmal in die Docs. Zum Beispiel: <script type="ts"> const props: { onClick(): void; onExplode(name: string, age: number): void; } = $props(); </script> <MyComponent onClick={() => alert('clicked')} onExplode={(name, age) => alert(name + ' ' + age)} />
Outdated
Review

Ich habe es angepasst, es musste einiges verändert werden, bitte schaue es dir nochmal an.

Ich habe es angepasst, es musste einiges verändert werden, bitte schaue es dir nochmal an.
inputValue: string;
jared marked this conversation as resolved Outdated
Outdated
Review

Villt die Variable noch besser bennennen. InternalValue oder oldValue, kann halt alles sein...

Villt die Variable noch besser bennennen. InternalValue oder oldValue, kann halt alles sein...
Outdated
Review

Allgemein, weil es eine Komponente ist, die vielseitig einsetzbar. Es geht darum quasi den Startwert? zu speichern, für den Abbruch und den aktuellen Wert, um ein editieren in Gang zu bringen. Man könnte es auch cancelValue und EditValue nennen? Vielleicht besser?

Allgemein, weil es eine Komponente ist, die vielseitig einsetzbar. Es geht darum quasi den Startwert? zu speichern, für den Abbruch und den aktuellen Wert, um ein editieren in Gang zu bringen. Man könnte es auch cancelValue und EditValue nennen? Vielleicht besser?
Outdated
Review

Naja, der Begriff Value bringt halt nicht, weil das quasi immer ein value ist. Daher so explizit bennen wie es geht

Naja, der Begriff Value bringt halt nicht, weil das quasi immer ein value ist. Daher so explizit bennen wie es geht
variant: Variant;
customEvent: Event;
}) => void;
export let cancel: () => void = () => {};
const existingNames = existings.map((item) => item.name);
mina marked this conversation as resolved Outdated
Outdated
Review

Wird im weiteren Verlauf nicht verwendet, daher löschen

Wird im weiteren Verlauf nicht verwendet, daher löschen
const dispatch = createEventDispatcher<{
editSart: {};
save: {};
delete: {};
cancel: void;
}>();
export { classNames as class };
let internalValue = value;
let oldValue = value;
let internalValue = inputValue;
let oldValue = inputValue;
let showWarning = false;
let duplicate = false;
let errors: string[] = [];
let errorText = '';
$: errors = validateInput(oldValue, internalValue, { minLength: 3, existingNames });
function startEdit() {
oldValue = value;
internalValue = value;
oldValue = inputValue;
internalValue = inputValue;
editing = true;
dispatch('editSart', { id, value, variant, editing });
editStart({ id, inputValue, variant, editing });
}
function cancelEdit() {
@@ -52,7 +57,7 @@
console.log('Abgebrochen');
dispatch('cancel');
cancel();
}
function saveEdit(ev?: MouseEvent | KeyboardEvent) {
@@ -80,13 +85,7 @@
editing = false;
showWarning = false;
duplicate = false;
dispatch('save', { newValue: internalValue, oldValue, variant });
}
function deleteItem() {
dispatch('delete', { value, variant });
save({ newValue: internalValue, oldValue, variant });
}
function handleKey(e: KeyboardEvent) {
@@ -95,23 +94,27 @@
}
</script>
<div class="" {...$$restProps}>
<div class="">
<div class="flex gap-x-2">
{#if editing}
<input
bind:value={internalValue}
on:keydown={handleKey}
on:keydown|preventDefault={handleKey}
on:blur|preventDefault|stopPropagation={cancelEdit}
class=""
class:bg-red-200={(showWarning && editing) || errors.length !== 0}
/>
{:else}
<span>{value}</span>
<span>{inputValue}</span>
{#if !editing && editable}
<button on:click|preventDefault|stopPropagation={startEdit}>
<Edit />
</button>
<button on:click|preventDefault={deleteItem}>
<button
on:click|preventDefault={(e: Event) => {
deleteItem({ inputValue, variant, customEvent: e });
}}
>
<Trash />
</button>
{/if}

View File

@@ -1,9 +1,27 @@
export function validateInput(oldValue:string, value: string, options: { minLength?: number; existingNames?: string[] }) {
/**
*
* @param oldValue
* @param inputValue
* @param options
* @returns
*/
export function validateNameInput(oldValue:string, inputValue: string, options: { minLength?: number; existingNames?: string[] }) {
const errors: string[] = [];
Review

Grundsätzlich wird hier der Value in diesem Fall ein Name validiert. Es ist keine generische validateInput Funktion. Daher sollte sie entsprechend benannt werden. Darüber hinaus wird sie nur in EditableItem verwendet. Daher ist ggf. ein Auslagern nicht sinnvoll, oder soll sie noch wo anders verwendet werden?

Grundsätzlich wird hier der Value in diesem Fall ein Name validiert. Es ist keine generische validateInput Funktion. Daher sollte sie entsprechend benannt werden. Darüber hinaus wird sie nur in EditableItem verwendet. Daher ist ggf. ein Auslagern nicht sinnvoll, oder soll sie noch wo anders verwendet werden?
Review

Werde ich nochmal überarbeiten

Werde ich nochmal überarbeiten
if (!value.trim()) errors.push('Feld darf nicht leer sein');
if (options.existingNames?.includes(value) && oldValue !== value)
if (!inputValue.trim()) errors.push('Feld darf nicht leer sein');
if (options.existingNames?.includes(inputValue) && oldValue !== inputValue)
errors.push('Name existiert bereits');
return errors;
}
// siehe suche: fail
// Button
// BaseInputField
// fetch siehe b038
// api/list/vorgang/tatort/server.ts
// api/list/vorgang/server.ts

View File

@@ -60,15 +60,17 @@
<EditableItem
class=""
id={i}
value={item.name}
inputValue={item.name}
editing={editingId === i}
on:editStart={() => (editingId = i)}
editStart={() => (editingId = i)}
variant="casename"
existings={caseList}
on:save={(e) => console.log('Gespeichert:', e.detail)}
on:delete={(e) => {
console.log('Gelöscht:', e.detail);
delete_item(e);
save={(data) => {
console.log('Gespeichert:', data);
}}
deleteItem={(data) => {
console.log('Gelöscht:', data);
delete_item(data.customEvent);
}}
></EditableItem>
</div>

View File

@@ -134,13 +134,13 @@
<EditableItem
class="bg-lred-500"
id={i}
value={item.name}
inputValue={item.name}
editing={editingId === i}
on:editStart={() => (editingId = i)}
editStart={() => (editingId = i)}
variant="crimename"
existings={crimesList}
on:save={(e) => console.log('Gespeichert:', e.detail)}
on:delete={(e) => console.log('Gelöscht:', e.detail)}
save={(e) => console.log('Gespeichert:', e)}
deleteItem={(e) => console.log('Gelöscht:', e)}
></EditableItem>
{:else}
<span class="text-sm font-semibold leading-6 text-gray-900 inline-block min-w-1"