f047_Edit-der-Namen #15
@@ -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
|
||||
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
jared
commented
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
jared
commented
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
jared
commented
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 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)}
/>
mina
commented
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
jared
commented
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...
mina
commented
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?
jared
commented
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
jared
commented
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}
|
||||
|
||||
@@ -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[] = [];
|
||||
|
jared
commented
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?
mina
commented
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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
Der Kommentar könnte m.M.n. raus