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
+
+
+
{: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}
+
+
+
+
+
+ |
+
+ By Name Reports:
+ {#each data.prefixes as p (p.prefix)}
+ {p.prefix}
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ {pageTitle} |
+
+
+ {filterTitle} |
+
+
+ {#each headers as header (header)}
+ | {header} |
+ {/each}
+
+
+
+ {#each reportLines as line, idx (idx)}
+
+ | {line.b_id} |
+ {line.description || ''} |
+ {line.winning_ticket} |
+ {line.last_name || ''}, {line.first_name || ''} |
+ {line.phone_number || ''} |
+
+ {/each}
+
+
+
+ | {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}
+
+
+
+
+
+ |
+
+ By Name Reports:
+ {#each data.prefixes as p (p.prefix)}
+ {p.prefix}
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ {pageTitle} |
+
+
+ {filterTitle} |
+
+
+ {#each headers as header (header)}
+ | {header} |
+ {/each}
+
+
+
+ {#each reportLines as line, idx (idx)}
+
+ | {line.last_name || ''}, {line.first_name || ''} |
+ {line.phone_number || ''} |
+ {line.b_id} |
+ {line.winning_ticket} |
+ {line.description || ''} |
+
+ {/each}
+
+
+
+ | {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}
Color
-
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
+
-
+
- | Prefix |
- Color |
- Weight |
- Actions |
+ Prefix |
+ Color |
+ Weight |
+ Actions |
{#each prefixes as prefix (prefix.prefix)}
- | {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' });
| |