From 92711f93d09b55baac480de86809dd2777155257 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 13 Apr 2026 14:40:40 -0700 Subject: [PATCH 1/2] Constrain initial balance inputs to numeric values on admin cohort page The initial balance fields when adding members to a cohort accepted arbitrary text. Changed all three inputs (add by user, add by email, and inline edit) to type="number" with min="0". Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/routes/admin/cohorts/[name]/+page.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/routes/admin/cohorts/[name]/+page.svelte b/frontend/src/routes/admin/cohorts/[name]/+page.svelte index 7273d5fc..486486b2 100644 --- a/frontend/src/routes/admin/cohorts/[name]/+page.svelte +++ b/frontend/src/routes/admin/cohorts/[name]/+page.svelte @@ -271,6 +271,8 @@
Date: Mon, 13 Apr 2026 15:20:52 -0700 Subject: [PATCH 2/2] =?UTF-8?q?Fix=20.trim()=20on=20number=20inputs=20?= =?UTF-8?q?=E2=80=94=20convert=20to=20String()=20instead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit type="number" inputs bind as numbers, not strings, so .trim() fails. Use String() conversion and !== '' checks instead. Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/routes/admin/cohorts/[name]/+page.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/routes/admin/cohorts/[name]/+page.svelte b/frontend/src/routes/admin/cohorts/[name]/+page.svelte index 486486b2..096d3b9c 100644 --- a/frontend/src/routes/admin/cohorts/[name]/+page.svelte +++ b/frontend/src/routes/admin/cohorts/[name]/+page.svelte @@ -115,8 +115,8 @@ const opts: { user_ids: number[]; initial_balance?: string } = { user_ids: [selectedUserId] }; - if (userInitialBalance.trim()) { - opts.initial_balance = userInitialBalance.trim(); + if (userInitialBalance !== '') { + opts.initial_balance = String(userInitialBalance); } const result = await batchAddMembers(cohortName, opts); toast.success(`Added ${result.added} member`); @@ -137,8 +137,8 @@ if (emails.length === 0) return; try { const opts: { emails: string[]; initial_balance?: string } = { emails }; - if (emailInitialBalance.trim()) { - opts.initial_balance = emailInitialBalance.trim(); + if (emailInitialBalance !== '') { + opts.initial_balance = String(emailInitialBalance); } const result = await batchAddMembers(cohortName, opts); toast.success(`Added ${result.added} members`); @@ -167,7 +167,7 @@ async function saveEditingBalance() { if (editingMemberId == null) return; - const value = editingBalance.trim() || null; + const value = editingBalance !== '' ? String(editingBalance) : null; try { await updateMemberInitialBalance(cohortName, editingMemberId, value); const member = members.find((m) => m.id === editingMemberId);