{ offset = 0; updateItems(); }} defaultValue="10" bind:value={() => limit.toString(), (v) => (limit = parseInt(v))} />
{#snippet editModal(item: Item)}
editsOpen.has(item.id!) ? editsOpen.get(item.id!)! : editsOpen.set(item.id!, false) && editsOpen.get(item.id!)!, (value) => editsOpen.set(item.id!, value) } > {#snippet trigger(props)}
{/snippet} {#snippet title()} Edit '{item.name}' {/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.updateItem({ item: { id: item.id, name: name, description: description, price: parseFloat(price ?? '0'), quantity: parseInt(quantity ?? '0') } }); if (response.item && item.id) { toast.success(`item "${name}" saved`); editsOpen.set(item.id, false); await updateItems(); } } catch (err) { const error = ConnectError.from(err); toast.error(error.rawMessage); } }} >
Name
Description
Price
Quantity
Submit
{/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}"?
Submit
{/snippet}
{/snippet}
Added
Name
Description
Price
Quantity
{#await items}
{:then items} {#each items as item}
{item.added ? timestampDate(item.added).toLocaleString() : ''}
{item.name}
{item.description}
${item.price}
{item.quantity}
{@render editModal(item)} {@render deleteModal(item)}
{/each} {/await}
{#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); } }} >
Name
Description
Price
Quantity
Submit
{/snippet}