diff --git a/frontend/src/ui/pages/IngredientsPage/index.tsx b/frontend/src/ui/pages/IngredientsPage/index.tsx index 51ebbfa..7f23662 100644 --- a/frontend/src/ui/pages/IngredientsPage/index.tsx +++ b/frontend/src/ui/pages/IngredientsPage/index.tsx @@ -1,8 +1,29 @@ -import {h, frag, Rung, RungOptions, Capsule} from "@djledda/ladder"; +import {h, frag, Rung, RungOptions, Capsule, ICapsule} from "@djledda/ladder"; + +function list(list: ICapsule, transform: (item: Item) => Transform, reuse?: (old: Transform) => Transform) { + let items: (Comment | Transform)[] = list.val.map(item => transform(item)); + list.watch((newList) => { + const firstItem = items[0]; + if (!firstItem) { + return; + } + const newItems = newList.map(item => transform(item)); + for (const item of newItems) { + firstItem.parentElement?.replaceChildren(...newItems); + } + items = newItems; + if (items.length < 1) { + items.push(document.createComment("")); + } + }); + if (items.length < 1) { + items.push(document.createComment("")); + } + return items; +} export default class IngredientsPage extends Rung { - private ingredients: any[] = []; - private list = Capsule.new(null); + private ingredients = Capsule.new([]); private ingredientInput = Capsule.new(null); constructor(options: RungOptions) { @@ -14,30 +35,22 @@ export default class IngredientsPage extends Rung { body: this.ingredientInput.val?.value ?? "{}", method: "POST", }); - this.ingredients.push(JSON.parse(this.ingredientInput.val?.value ?? "{}")); - this.refreshList(); + this.ingredients.val.push(JSON.parse(this.ingredientInput.val?.value ?? "{}")); + this.ingredients.val = this.ingredients.val; } async getIngredients() { const result = await (await fetch("http://localhost:8080/ingredients/all")).json(); - this.ingredients = result.data.ingredients; - this.refreshList(); - } - - refreshList() { - this.list.val?.replaceWith(); - } - - List = (): HTMLUListElement => { - const thing =
{...this.ingredients.map((ingredient) => { - return
{ingredient.displayNameDE}, hinzugefügt von {`${ingredient.addedBy}`}
; - })}
as HTMLUListElement; - return thing; + this.ingredients.val = result.data.ingredients; } build(): Node { const node = <> - +
    + {...list(this.ingredients, _ => +
  • {_.displayNameDE}, hinzugefügt von {`${_.addedBy}`}
  • as HTMLDivElement) + } +
;