{#snippet rail()} (activeSection = id as Section)} /> {/snippet}
{#if activeSection === 'profile'}

Profile

Update your display name and email address.

{ e.preventDefault(); saveProfile(); }}>
{:else if activeSection === 'security'}

Security

Choose a strong password with at least 8 characters.

{ e.preventDefault(); savePassword(); }}>
{#if passwordError}

{passwordError}

{/if}
{:else if activeSection === 'import' && canImportThroughput}

Import throughput entries

Upload a CSV or Excel (.xlsx) file of packing runs. Each row is saved as a throughput entry.

Required columns

Your file needs a header row with at least Date, Product and Quantity columns. These optional columns are also recognised:

  • Typebags or kg (inferred from bag size if omitted)
  • Bag Size — kg per bag (required when packing as bags)
  • Item ID — matches an existing product; otherwise matched by name
  • Packed By, Notes
  • For Order, Job Number, For Stock, Stock Quantity

Products that don't already exist are created automatically. Dates accept YYYY-MM-DD or DD/MM/YYYY.

{#if importError}

{importError}

{/if} {#if importResult}

Imported {importResult.entries_imported} {importResult.entries_imported === 1 ? 'entry' : 'entries'}.

    {#if importResult.products_created > 0}
  • {importResult.products_created} new product{importResult.products_created === 1 ? '' : 's'} created
  • {/if} {#if importResult.entries_skipped > 0}
  • {importResult.entries_skipped} row{importResult.entries_skipped === 1 ? '' : 's'} skipped
  • {/if}
{#if importResult.errors.length > 0}
{importResult.errors.length} issue{importResult.errors.length === 1 ? '' : 's'} to review
    {#each importResult.errors as err (err)}
  • {err}
  • {/each}
{/if}
{/if}

Delete all entries

Permanently remove every throughput entry. Products are kept, but all packing runs are erased. This cannot be undone — use it to clear a bad import before re-uploading.

{#if deleteAllResult !== null}

Deleted {deleteAllResult} {deleteAllResult === 1 ? 'entry' : 'entries'}.

{/if}
{:else if activeSection === 'users' && canManageUsers} {:else if activeSection === 'roles' && canManageRoles} {/if}
{#if showDeleteAll} {/if}