{/snippet} {/snippet} {#snippet deleteModal(item: Item)} deletesOpen.has(item.id!) ? deletesOpen.get(item.id!)! : deletesOpen.set(item.id!, false) && deletesOpen.get(item.id!)!, (value) => deletesOpen.set(item.id!, value) } > {#snippet trigger(props)} {/snippet} {#snippet title()} Delete '{item.name}' {/snippet} {#snippet content()}
{ e.preventDefault(); try { await ItemClient.deleteItem({ id: item.id }); toast.success(`item "${item.name}" deleted`); deletesOpen.set(item.id!, false); await updateItems(); } catch (err) { const error = ConnectError.from(err); toast.error(error.rawMessage); } }} >
Are you sure you want to delete "{item.name}"?
{/snippet}
{/snippet}
{#await items}
Added
Name
Description
Price
Quantity
{:then items} {#each items as item}
Added {item.added ? timestampDate(item.added).toLocaleString() : ''}
Name {item.name}
Description {item.description}
Price ${item.price}
Quantity {item.quantity}
{@render editModal(item)} {@render deleteModal(item)}
{/each} {/await}
{#snippet trigger(props)} {/snippet} {#snippet title()} Add Item {/snippet} {#snippet content()}
{ e.preventDefault(); const form = e.target as HTMLFormElement; const formData = new FormData(form); const name = formData.get('name')?.toString(); const description = formData.get('description')?.toString(); const price = formData.get('price')?.toString(); const quantity = formData.get('quantity')?.toString(); try { const response = await ItemClient.createItem({ item: { name: name, description: description, price: parseFloat(price ?? '0'), quantity: parseInt(quantity ?? '0') } }); if (response.item) { form.reset(); toast.success(`item "${name}" added`); addedOpen = false; await updateItems(); } } catch (err) { const error = ConnectError.from(err); toast.error(error.rawMessage); } }} >
{/snippet}