diff --git a/client/src/lib/client/styles.js b/client/src/lib/client/styles.js index e68e77d..c356ba9 100644 --- a/client/src/lib/client/styles.js +++ b/client/src/lib/client/styles.js @@ -13,6 +13,8 @@ export const bS = { green: 'px-2 py-1 bg-green-300 border border-gray-700 rounded hover:bg-green-400 cursor-pointer', orange: 'px-2 py-1 bg-orange-300 border border-gray-700 rounded hover:bg-orange-400 cursor-pointer', + purple: + 'px-2 py-1 bg-purple-300 border border-gray-700 rounded hover:bg-purple-400 cursor-pointer', red: 'px-2 py-1 bg-red-300 border border-gray-700 rounded hover:bg-red-400 cursor-pointer' }; @@ -26,9 +28,21 @@ export const bAS = { 'px-2 py-1 bg-green-300 border-4 border-gray-700 rounded hover:bg-green-400 cursor-pointer', orange: 'px-2 py-1 bg-orange-300 border-4 border-gray-700 rounded hover:bg-orange-400 cursor-pointer', + purple: + 'px-2 py-1 bg-purple-300 border-4 border-gray-700 rounded hover:bg-purple-400 cursor-pointer', red: 'px-2 py-1 bg-red-300 border-4 border-gray-700 rounded hover:bg-red-400 cursor-pointer' }; export const iS = { normal: 'p-1 border border-black' }; + +export const rBS = { + white: 'even:bg-gray-100', + blue: 'even:bg-blue-100', + yellow: 'even:bg-yellow-100', + green: 'even:bg-green-100', + orange: 'even:bg-orange-100', + purple: 'even:bg-purple-100', + red: 'even:bg-red-100' +}; diff --git a/client/src/lib/server/db/schema.js b/client/src/lib/server/db/schema.js index 129d6a8..6a21462 100644 --- a/client/src/lib/server/db/schema.js +++ b/client/src/lib/server/db/schema.js @@ -33,41 +33,44 @@ export const baskets = sqliteTable( ); export const drawing = sqliteView('drawing', { - prefix: text('prefix'), - b_id: integer('b_id'), - description: text('description'), - winning_ticket: integer('winning_ticket'), - last_name: text('last_name'), - first_name: text('first_name'), - phone_number: text('phone_number') -}).as(sql`SELECT b.prefix, b.b_id, b.description, b.winning_ticket, t.last_name, t.first_name, t.phone_number + prefix: text('prefix'), + b_id: integer('b_id'), + description: text('description'), + winning_ticket: integer('winning_ticket'), + last_name: text('last_name'), + first_name: text('first_name'), + phone_number: text('phone_number') +}) + .as(sql`SELECT b.prefix, b.b_id, b.description, b.winning_ticket, t.last_name, t.first_name, t.phone_number FROM baskets b LEFT JOIN tickets t ON b.prefix = t.prefix AND b.winning_ticket = t.t_id - ORDER BY b.prefix, b.b_id`) + ORDER BY b.prefix, b.b_id`); export const reportByName = sqliteView('report_by_name', { - last_name: text('last_name'), - first_name: text('first_name'), - phone_number: text('phone_number'), - pref: text('pref'), - prefix: text('prefix'), - b_id: integer('b_id'), - description: text('description'), - donors: text('donors'), - winning_ticket: integer('winning_ticket') -}).as(sql`SELECT t.last_name, t.first_name, t.phone_number, t.pref, b.prefix, b.b_id, b.description, b.donors, b.winning_ticket + last_name: text('last_name'), + first_name: text('first_name'), + phone_number: text('phone_number'), + pref: text('pref'), + prefix: text('prefix'), + b_id: integer('b_id'), + description: text('description'), + donors: text('donors'), + winning_ticket: integer('winning_ticket') +}) + .as(sql`SELECT t.last_name, t.first_name, t.phone_number, t.pref, b.prefix, b.b_id, b.description, b.donors, b.winning_ticket FROM baskets b LEFT JOIN tickets t ON b.prefix = t.prefix AND b.winning_ticket = t.t_id - ORDER BY t.last_name, t.first_name, t.phone_number, b.prefix, b.b_id`) + ORDER BY t.last_name, t.first_name, t.phone_number, b.prefix, b.b_id`); export const reportByBasket = sqliteView('report_by_basket', { - prefix: text('prefix'), - b_id: integer('b_id'), - description: text('description'), - donors: text('donors'), - winning_ticket: integer('winning_ticket'), - last_name: text('last_name'), - first_name: text('first_name'), - phone_number: text('phone_number'), - pref: text('pref') -}).as(sql`SELECT b.prefix, b.b_id, b.description, b.donors, b.winning_ticket, t.last_name, t.first_name, t.phone_number, t.pref + prefix: text('prefix'), + b_id: integer('b_id'), + description: text('description'), + donors: text('donors'), + winning_ticket: integer('winning_ticket'), + last_name: text('last_name'), + first_name: text('first_name'), + phone_number: text('phone_number'), + pref: text('pref') +}) + .as(sql`SELECT b.prefix, b.b_id, b.description, b.donors, b.winning_ticket, t.last_name, t.first_name, t.phone_number, t.pref FROM baskets b LEFT JOIN tickets t on b.prefix = t.prefix AND b.winning_ticket = t.t_id - ORDER BY b.prefix, b.b_id`) + ORDER BY b.prefix, b.b_id`); diff --git a/client/src/routes/+page.svelte b/client/src/routes/+page.svelte index d26dccd..17a88b8 100644 --- a/client/src/routes/+page.svelte +++ b/client/src/routes/+page.svelte @@ -59,6 +59,8 @@ class={curPrefix == prefix.prefix ? bAS[prefix.color] : bS[prefix.color]} onclick={() => (curPrefix = prefix.prefix)}>{prefix.prefix} + {:else} +
No Prefixes
{/each} {#if curPrefix} @@ -71,7 +73,21 @@ Baskets - Drawing Form + Drawing Form + + +
+

Reports:

+
+ Winners By Name + Winners By Basket
{:else} diff --git a/client/src/routes/api/drawing/+server.js b/client/src/routes/api/drawing/+server.js index eed5cab..c63d6cb 100644 --- a/client/src/routes/api/drawing/+server.js +++ b/client/src/routes/api/drawing/+server.js @@ -1,39 +1,45 @@ -import { db } from "$lib/server/db"; -import { baskets, drawing } from "$lib/server/db/schema"; -import { getPath, getSettings } from "$lib/server/settings" -import { error, json } from "@sveltejs/kit"; -import { sql } from "drizzle-orm"; +import { db } from '$lib/server/db'; +import { baskets, drawing } from '$lib/server/db/schema'; +import { getPath, getSettings } from '$lib/server/settings'; +import { error, json } from '@sveltejs/kit'; +import { sql } from 'drizzle-orm'; export const GET = async () => { - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/drawing`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const data = await res.json(); - return json(data); - } catch { - return json([]); - } - } else { - const data = await db.select().from(drawing).orderBy(drawing.prefix, drawing.b_id); - return json(data); - } -} + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/drawing`, { headers: { 'TAM-KEY': s.remote_key } }); + if (!res.ok) throw error(res.status); + const data = await res.json(); + return json(data); + } catch { + return json([]); + } + } else { + const data = await db.select().from(drawing).orderBy(drawing.prefix, drawing.b_id); + return json(data); + } +}; export const POST = async ({ request }) => { - const reqData = await request.json(); - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - const res = await fetch(`${connStr}/api/drawing`, { - method: 'POST', - headers: {'TAM-KEY': s.remote_key, 'Content-Type': 'application/json'}, - body: JSON.stringify(reqData) - }); - if (!res.ok) throw error(res.status); - } - await db.insert(baskets).values(reqData).onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {winning_ticket: sql`EXCLUDED.winning_ticket`}}); - return json(reqData); -} + const reqData = await request.json(); + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + const res = await fetch(`${connStr}/api/drawing`, { + method: 'POST', + headers: { 'TAM-KEY': s.remote_key, 'Content-Type': 'application/json' }, + body: JSON.stringify(reqData) + }); + if (!res.ok) throw error(res.status); + } + await db + .insert(baskets) + .values(reqData) + .onConflictDoUpdate({ + target: [baskets.prefix, baskets.b_id], + set: { winning_ticket: sql`EXCLUDED.winning_ticket` } + }); + return json(reqData); +}; diff --git a/client/src/routes/api/drawing/[prefix]/+server.js b/client/src/routes/api/drawing/[prefix]/+server.js index 9801a27..dd44daa 100644 --- a/client/src/routes/api/drawing/[prefix]/+server.js +++ b/client/src/routes/api/drawing/[prefix]/+server.js @@ -5,20 +5,26 @@ import { error, json } from '@sveltejs/kit'; import { eq } from 'drizzle-orm'; export const GET = async ({ params }) => { - const { prefix } = params; - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/drawing/${prefix}`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const data = await res.json(); - return json(data); - } catch { - return json([]); - } - } else { - const data = await db.select().from(drawing).where(eq(drawing.prefix, prefix)).orderBy(drawing.prefix, drawing.b_id); - return json(data); - } -} + const { prefix } = params; + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/drawing/${prefix}`, { + headers: { 'TAM-KEY': s.remote_key } + }); + if (!res.ok) throw error(res.status); + const data = await res.json(); + return json(data); + } catch { + return json([]); + } + } else { + const data = await db + .select() + .from(drawing) + .where(eq(drawing.prefix, prefix)) + .orderBy(drawing.prefix, drawing.b_id); + return json(data); + } +}; diff --git a/client/src/routes/api/drawing/[prefix]/[b_id]/+server.js b/client/src/routes/api/drawing/[prefix]/[b_id]/+server.js index 3497a61..73e6f5f 100644 --- a/client/src/routes/api/drawing/[prefix]/[b_id]/+server.js +++ b/client/src/routes/api/drawing/[prefix]/[b_id]/+server.js @@ -5,40 +5,46 @@ import { error, json } from '@sveltejs/kit'; import { and, eq } from 'drizzle-orm'; const placeholder_data = (prefix, b_id) => { - return { - prefix, - b_id, - description: "", - winning_ticket: 0, - last_name: "", - first_name: "", - phone_number: "" - } -} + return { + prefix, + b_id, + description: '', + winning_ticket: 0, + last_name: '', + first_name: '', + phone_number: '' + }; +}; export const GET = async ({ params }) => { - const [prefix, b_id] = [params.prefix, parseInt(params.b_id)]; - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/drawing/${prefix}/${b_id}`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const [data] = await res.json(); - if (data) { - return json(data); - } else { - return json(placeholder_data(prefix, b_id)); - }; - } catch { - return json(placeholder_data(prefix, b_id)); - } - } else { - const [data] = await db.select().from(drawing).where(and(eq(drawing.prefix, prefix), eq(drawing.b_id, b_id))).orderBy(drawing.prefix, drawing.b_id); - if (data) { - return json(data); - } else { - return json(placeholder_data(prefix, b_id)); - } - } -} + const [prefix, b_id] = [params.prefix, parseInt(params.b_id)]; + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/drawing/${prefix}/${b_id}`, { + headers: { 'TAM-KEY': s.remote_key } + }); + if (!res.ok) throw error(res.status); + const [data] = await res.json(); + if (data) { + return json(data); + } else { + return json(placeholder_data(prefix, b_id)); + } + } catch { + return json(placeholder_data(prefix, b_id)); + } + } else { + const [data] = await db + .select() + .from(drawing) + .where(and(eq(drawing.prefix, prefix), eq(drawing.b_id, b_id))) + .orderBy(drawing.prefix, drawing.b_id); + if (data) { + return json(data); + } else { + return json(placeholder_data(prefix, b_id)); + } + } +}; diff --git a/client/src/routes/api/drawing/[prefix]/[id_from]/[id_to]/+server.js b/client/src/routes/api/drawing/[prefix]/[id_from]/[id_to]/+server.js index b03d65e..1d7f7cb 100644 --- a/client/src/routes/api/drawing/[prefix]/[id_from]/[id_to]/+server.js +++ b/client/src/routes/api/drawing/[prefix]/[id_from]/[id_to]/+server.js @@ -5,37 +5,47 @@ import { error, json } from '@sveltejs/kit'; import { and, between, eq } from 'drizzle-orm'; const placeholder_data = (prefix, b_id) => { - return { - prefix, - b_id, - description: "", - winning_ticket: 0, - last_name: "", - first_name: "", - phone_number: "" - }; + return { + prefix, + b_id, + description: '', + winning_ticket: 0, + last_name: '', + first_name: '', + phone_number: '' + }; }; export const GET = async ({ params }) => { - const [prefix, id_from, id_to] = [params.prefix, parseInt(params.id_from), parseInt(params.id_to)]; - const s = getSettings(); - const rtnData = {}; - for (let i = id_from; i <= id_to; i++) { - rtnData[i] = {...placeholder_data(prefix, i)}; - }; - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/drawing/${prefix}/${id_from}/${id_to}`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const data = Array.from(await res.json()); - data.forEach((b) => rtnData[b.b_id] = b); - } catch { - return json([]); - } - } else { - const data = await db.select().from(drawing).where(and(eq(drawing.prefix, prefix), between(drawing.b_id, id_from, id_to))).orderBy(drawing.prefix, drawing.b_id); - data.forEach((b) => rtnData[b.b_id] = b); - }; - return json(Object.values(rtnData)); -} + const [prefix, id_from, id_to] = [ + params.prefix, + parseInt(params.id_from), + parseInt(params.id_to) + ]; + const s = getSettings(); + const rtnData = {}; + for (let i = id_from; i <= id_to; i++) { + rtnData[i] = { ...placeholder_data(prefix, i) }; + } + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/drawing/${prefix}/${id_from}/${id_to}`, { + headers: { 'TAM-KEY': s.remote_key } + }); + if (!res.ok) throw error(res.status); + const data = Array.from(await res.json()); + data.forEach((b) => (rtnData[b.b_id] = b)); + } catch { + return json([]); + } + } else { + const data = await db + .select() + .from(drawing) + .where(and(eq(drawing.prefix, prefix), between(drawing.b_id, id_from, id_to))) + .orderBy(drawing.prefix, drawing.b_id); + data.forEach((b) => (rtnData[b.b_id] = b)); + } + return json(Object.values(rtnData)); +}; diff --git a/client/src/routes/api/reports/bybasket/[prefix]/+server.js b/client/src/routes/api/reports/bybasket/[prefix]/+server.js index 478e900..2e5069b 100644 --- a/client/src/routes/api/reports/bybasket/[prefix]/+server.js +++ b/client/src/routes/api/reports/bybasket/[prefix]/+server.js @@ -5,20 +5,22 @@ import { error, json } from '@sveltejs/kit'; import { eq } from 'drizzle-orm'; export const GET = async ({ params }) => { - const { prefix } = params; - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/reports/bybasket/${prefix}`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const data = await res.json(); - return json(data); - } catch { - return json([]); - } - } else { - const data = await db.select().from(reportByBasket).where(eq(reportByBasket.prefix, prefix)); - return json(data); - } -} + const { prefix } = params; + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/reports/bybasket/${prefix}`, { + headers: { 'TAM-KEY': s.remote_key } + }); + if (!res.ok) throw error(res.status); + const data = await res.json(); + return json(data); + } catch { + return json([]); + } + } else { + const data = await db.select().from(reportByBasket).where(eq(reportByBasket.prefix, prefix)); + return json(data); + } +}; diff --git a/client/src/routes/api/reports/byname/[prefix]/+server.js b/client/src/routes/api/reports/byname/[prefix]/+server.js index b59be8c..3d751d1 100644 --- a/client/src/routes/api/reports/byname/[prefix]/+server.js +++ b/client/src/routes/api/reports/byname/[prefix]/+server.js @@ -5,20 +5,22 @@ import { error, json } from '@sveltejs/kit'; import { eq } from 'drizzle-orm'; export const GET = async ({ params }) => { - const { prefix } = params; - const s = getSettings(); - if (s.remote_server) { - const connStr = getPath(s); - try { - const res = await fetch(`${connStr}/api/reports/byname/${prefix}`, {headers: {'TAM-KEY': s.remote_key}}); - if (!res.ok) throw error(res.status); - const data = await res.json(); - return json(data); - } catch { - return json([]); - } - } else { - const data = await db.select().from(reportByName).where(eq(reportByName.prefix, prefix)); - return json(data); - } -} + const { prefix } = params; + const s = getSettings(); + if (s.remote_server) { + const connStr = getPath(s); + try { + const res = await fetch(`${connStr}/api/reports/byname/${prefix}`, { + headers: { 'TAM-KEY': s.remote_key } + }); + if (!res.ok) throw error(res.status); + const data = await res.json(); + return json(data); + } catch { + return json([]); + } + } else { + const data = await db.select().from(reportByName).where(eq(reportByName.prefix, prefix)); + return json(data); + } +}; diff --git a/client/src/routes/baskets/[prefix]/+page.svelte b/client/src/routes/baskets/[prefix]/+page.svelte index 1949739..73ca1be 100644 --- a/client/src/routes/baskets/[prefix]/+page.svelte +++ b/client/src/routes/baskets/[prefix]/+page.svelte @@ -2,7 +2,7 @@ import { resolve } from '$app/paths'; import { afterNavigate, beforeNavigate } from '$app/navigation'; import { browser } from '$app/environment'; - import { bS, bAS, iS } from '$lib/client/styles'; + import { bS, bAS, iS, rBS } from '$lib/client/styles'; import HeaderBar from '$lib/client/components/HeaderBar.svelte'; import PagerBar from '$lib/client/components/PagerBar.svelte'; import CommandBar from '$lib/client/components/CommandBar.svelte'; @@ -28,7 +28,7 @@ let pager = $state({ idFrom: 0, idTo: 0 }); let items = $state([]); - let itemsLength = $derived(items.length); + let itemsLength = $derived.by(() => (items.length ? items.length : 0)); let itemsBuffer = $derived(items.filter((i) => i.changed)); const functions = { getPage: async () => { @@ -181,7 +181,7 @@ {#each items as item, idx (item.b_id)} { changeIdx(idx); e.target.scrollIntoView({ block: 'center' }); diff --git a/client/src/routes/drawing/[prefix]/+page.svelte b/client/src/routes/drawing/[prefix]/+page.svelte index 1c138d6..fda2b79 100644 --- a/client/src/routes/drawing/[prefix]/+page.svelte +++ b/client/src/routes/drawing/[prefix]/+page.svelte @@ -2,7 +2,7 @@ import { resolve } from '$app/paths'; import { afterNavigate, beforeNavigate } from '$app/navigation'; import { browser } from '$app/environment'; - import { bS, bAS, iS } from '$lib/client/styles'; + import { bS, bAS, iS, rBS } from '$lib/client/styles'; import HeaderBar from '$lib/client/components/HeaderBar.svelte'; import PagerBar from '$lib/client/components/PagerBar.svelte'; import CommandBar from '$lib/client/components/CommandBar.svelte'; @@ -28,7 +28,7 @@ let pager = $state({ idFrom: 0, idTo: 0 }); let items = $state([]); - let itemsLength = $derived(items.length); + let itemsLength = $derived.by(() => (items.length ? items.length : 0)); let itemsBuffer = $derived(items.filter((i) => i.changed)); const functions = { getPage: async () => { @@ -159,7 +159,7 @@ -
Baskets:
+
Drawing Forms:
{#each prefixes as p (p.prefix)} {#each items as item, idx (item.b_id)} { changeIdx(idx); e.target.scrollIntoView({ block: 'center' }); }} > {item.b_id} - {item.description} + {item.description} { - item.changed = true; - const res = await fetch(`/api/tickets/${prefix.prefix}/${item.winning_ticket}`); - if (res.ok) { - const data = await res.json(); - [item.last_name, item.first_name, item.phone_number] = [(data.last_name || ""), (data.first_name || ""), (data.phone_number || "")]; - } + item.changed = true; + const res = await fetch(`/api/tickets/${prefix.prefix}/${item.winning_ticket}`); + if (res.ok) { + const data = await res.json(); + [item.last_name, item.first_name, item.phone_number] = [ + data.last_name || '', + data.first_name || '', + data.phone_number || '' + ]; + } }} bind:value={item.winning_ticket} /> - {item.last_name || ""}, {item.first_name || ""}: {item.phone_number || ""} + {item.last_name || ''}, {item.first_name || ''}: {item.phone_number || ''} { + const prefixRes = await fetch('/api/prefixes'); + const prefixes = await prefixRes.json(); + const prefix = Array.from(prefixes).find((p) => p.prefix == params.prefix); + const reportRes = await fetch(`/api/reports/bybasket/${params.prefix}`); + const reportLines = await reportRes.json(); + const { venue_name } = getSettings(); + return { prefixes, prefix, reportLines, venueName: venue_name }; +}; diff --git a/client/src/routes/reports/bybasket/[prefix]/+page.svelte b/client/src/routes/reports/bybasket/[prefix]/+page.svelte new file mode 100644 index 0000000..a0c903e --- /dev/null +++ b/client/src/routes/reports/bybasket/[prefix]/+page.svelte @@ -0,0 +1,104 @@ + + + + {pageTitle} + + + + + + + + + + + + + + + {#each headers as header (header)} + + {/each} + + + + {#each reportLines as line, idx (idx)} + + + + + + + + {/each} + + + + + + + + + +
+ +
By Name Reports:
+ {#each data.prefixes as p (p.prefix)} + {p.prefix} + {/each} +
+
+
+ + + +
+
+ +
+
+

{pageTitle}

{filterTitle}

{header}
{line.b_id}{line.description || ''}{line.winning_ticket}{line.last_name || ''}, {line.first_name || ''}{line.phone_number || ''}
{data.venueName}
© 2026 Ticket Auction Manager
diff --git a/client/src/routes/reports/byname/[prefix]/+page.server.js b/client/src/routes/reports/byname/[prefix]/+page.server.js new file mode 100644 index 0000000..6f84aba --- /dev/null +++ b/client/src/routes/reports/byname/[prefix]/+page.server.js @@ -0,0 +1,11 @@ +import { getSettings } from '$lib/server/settings/index.js'; + +export const load = async ({ params, fetch }) => { + const prefixRes = await fetch('/api/prefixes'); + const prefixes = await prefixRes.json(); + const prefix = Array.from(prefixes).find((p) => p.prefix == params.prefix); + const reportRes = await fetch(`/api/reports/byname/${params.prefix}`); + const reportLines = await reportRes.json(); + const { venue_name } = getSettings(); + return { prefixes, prefix, reportLines, venueName: venue_name }; +}; diff --git a/client/src/routes/reports/byname/[prefix]/+page.svelte b/client/src/routes/reports/byname/[prefix]/+page.svelte new file mode 100644 index 0000000..5b5442f --- /dev/null +++ b/client/src/routes/reports/byname/[prefix]/+page.svelte @@ -0,0 +1,104 @@ + + + + {pageTitle} + + + + + + + + + + + + + + + {#each headers as header (header)} + + {/each} + + + + {#each reportLines as line, idx (idx)} + + + + + + + + {/each} + + + + + + + + + +
+ +
By Name Reports:
+ {#each data.prefixes as p (p.prefix)} + {p.prefix} + {/each} +
+
+
+ + + +
+
+ +
+
+

{pageTitle}

{filterTitle}

{header}
{line.last_name || ''}, {line.first_name || ''}{line.phone_number || ''}{line.b_id}{line.winning_ticket}{line.description || ''}
{data.venueName}
© 2026 Ticket Auction Manager
diff --git a/client/src/routes/settings/prefixes/+page.svelte b/client/src/routes/settings/prefixes/+page.svelte index 7ce7e79..71a5e85 100644 --- a/client/src/routes/settings/prefixes/+page.svelte +++ b/client/src/routes/settings/prefixes/+page.svelte @@ -13,6 +13,8 @@ onMount(() => { prefixes = [...data.prefixes]; + const form_prefix = document.getElementById('form_prefix'); + if (form_prefix) form_prefix.select(); }); @@ -20,31 +22,31 @@ {pageTitle} - -
Back to Settings -
-
+ + Back to Settings +

{pageTitle}

Prefix
- +
Color
- +
Weight
- +
Actions
@@ -59,6 +61,9 @@ }); if (req.ok) window.location.reload(); } + editPrefix.prefix = ''; + const form_prefix = document.getElementById('form_prefix'); + if (form_prefix) form_prefix.select(); }}>Add/Change
@@ -85,27 +90,33 @@ class={editPrefix.color == 'orange' ? bAS.orange : bS.orange} onclick={() => (editPrefix.color = 'orange')}>Orange +
- +
- - - - + + + + {#each prefixes as prefix (prefix.prefix)} - - - - + + +
PrefixColorWeightActionsPrefixColorWeightActions
{prefix.prefix}{prefix.color.charAt(0).toUpperCase() + prefix.color.slice(1)}{prefix.weight} + {prefix.prefix}{prefix.color.charAt(0).toUpperCase() + prefix.color.slice(1)}{prefix.weight}
- - diff --git a/client/src/routes/tickets/[prefix]/+page.svelte b/client/src/routes/tickets/[prefix]/+page.svelte index f2ef543..9a28df2 100644 --- a/client/src/routes/tickets/[prefix]/+page.svelte +++ b/client/src/routes/tickets/[prefix]/+page.svelte @@ -2,7 +2,7 @@ import { resolve } from '$app/paths'; import { afterNavigate, beforeNavigate } from '$app/navigation'; import { browser } from '$app/environment'; - import { bS, bAS, iS } from '$lib/client/styles'; + import { bS, bAS, iS, rBS } from '$lib/client/styles'; import HeaderBar from '$lib/client/components/HeaderBar.svelte'; import PagerBar from '$lib/client/components/PagerBar.svelte'; import CommandBar from '$lib/client/components/CommandBar.svelte'; @@ -28,7 +28,7 @@ let pager = $state({ idFrom: 0, idTo: 0 }); let items = $state([]); - let itemsLength = $derived(items.length); + let itemsLength = $derived.by(() => (items.length ? items.length : 0)); let itemsBuffer = $derived(items.filter((i) => i.changed)); const functions = { getPage: async () => { @@ -181,7 +181,7 @@ {#each items as item, idx (item.t_id)} { changeIdx(idx); e.target.scrollIntoView({ block: 'center' });