diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 5ca6975..7451286 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -7,6 +7,8 @@ COPY . . RUN npm install && npm run build ENV DATABASE_URL=file:/data/local.db +ENV BODY_SIZE_LIMIT=100M +ENV NODE_TLS_REJECT_UNAUTHORIZED=0 COPY deploy/start-server.sh start-server.sh diff --git a/webapp/src/lib/css/main.css b/webapp/src/lib/css/main.css index 5f02a45..b713bba 100644 --- a/webapp/src/lib/css/main.css +++ b/webapp/src/lib/css/main.css @@ -15,6 +15,15 @@ a.styled, button.styled { border-radius: 0.25rem; } +.p025 { + padding: 0.25rem; +} + +.active { + border: 1px solid #000000; + border-radius: 0.13rem; +} + a.styled:hover, button.styled:hover { text-decoration: underline; cursor: pointer; diff --git a/webapp/src/routes/+page.svelte b/webapp/src/routes/+page.svelte index 39c372a..69efa6b 100644 --- a/webapp/src/routes/+page.svelte +++ b/webapp/src/routes/+page.svelte @@ -36,6 +36,7 @@ TAM3 Icon - Red ticket with TAM3 on it

{venue} - Main Menu

+ {#if prefix_name !== ""}
Counts
@@ -47,7 +48,7 @@
{#each all_prefixes as prefix} -
+
@@ -65,6 +66,7 @@ By Name By Basket ID
+ {/if}
{#if admin_mode}

Admin Mode:

diff --git a/webapp/src/routes/api/backuprestore/+server.js b/webapp/src/routes/api/backuprestore/+server.js index 075d572..bf7b9da 100644 --- a/webapp/src/routes/api/backuprestore/+server.js +++ b/webapp/src/routes/api/backuprestore/+server.js @@ -1,6 +1,15 @@ import { env } from "$env/dynamic/private"; import { db } from "$lib/server/db"; import { prefixes, tickets, baskets } from "$lib/server/db/schema"; +import { sql } from "drizzle-orm"; + +function chunkArray(arr, chunkSize) { + const chunks = []; + for (let i = 0; i < arr.length; i += chunkSize) { + chunks.push(arr.slice(i, i + chunkSize)); + } + return chunks; +} export async function GET() { if (env.TAM3_REMOTE) { @@ -20,16 +29,16 @@ export async function GET() { export async function POST({ request }) { const req = await request.json(); - for (let prefix of req.prefixes) { - await db.insert(prefixes).values({name: prefix.name, color: prefix.color, weight: prefix.weight}).onConflictDoUpdate({target: prefixes.name, set: {color: prefix.color, weight: prefix.weight}}); + for (let prefixChunk of chunkArray(req.prefixes, 300)) { + await db.insert(prefixes).values(prefixChunk).onConflictDoUpdate({target: prefixes.name, set: {color: sql`excluded.color`, weight: sql`excluded.weight`}}); }; - for (let ticket of req.tickets) { - await db.insert(tickets).values({prefix: ticket.prefix, t_id: ticket.t_id, first_name: ticket.first_name, last_name: ticket.last_name, phone_number: ticket.phone_number, preference: ticket.preference}) - .onConflictDoUpdate({target: [tickets.prefix, tickets.t_id], set: {first_name: ticket.first_name, last_name: ticket.last_name, phone_number: ticket.phone_number, preference: ticket.preference}}); + for (let ticketChunk of chunkArray(req.tickets, 300)) { + await db.insert(tickets).values(ticketChunk) + .onConflictDoUpdate({target: [tickets.prefix, tickets.t_id], set: {first_name: sql`excluded.first_name`, last_name: sql`excluded.last_name`, phone_number: sql`excluded.phone_number`, preference: sql`excluded.preference`}}); }; - for (let basket of req.baskets) { - await db.insert(baskets).values({prefix: basket.prefix, b_id: basket.b_id, description: basket.description, donors: basket.donors, winning_ticket: basket.winning_ticket}) - .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: basket.description, donors: basket.donors, winning_ticket: basket.winning_ticket}}) + for (let basketChunk of chunkArray(req.baskets, 300)) { + await db.insert(baskets).values(basketChunk) + .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: sql`excluded.description`, donors: sql`excluded.donors`, winning_ticket: sql`excluded.winning_ticket`}}) }; if (env.TAM3_REMOTE) { const res = await fetch(`${env.TAM3_REMOTE}/api/backuprestore/?api_key=${env.TAM3_REMOTE_KEY}`, { diff --git a/webapp/src/routes/baskets/[prefix]/+page.svelte b/webapp/src/routes/baskets/[prefix]/+page.svelte index 3007edd..35fa2a4 100644 --- a/webapp/src/routes/baskets/[prefix]/+page.svelte +++ b/webapp/src/routes/baskets/[prefix]/+page.svelte @@ -94,6 +94,11 @@ if (browser) { document.title = `${prefix.name} Basket Entry` + window.addEventListener("beforeunload", function(e) { + if (current_baskets.filter(basket => basket.changed === true).length > 0) { + e.preventDefault(); + } + }) } diff --git a/webapp/src/routes/drawing/[prefix]/+page.svelte b/webapp/src/routes/drawing/[prefix]/+page.svelte index 45cf2a1..9b6b501 100644 --- a/webapp/src/routes/drawing/[prefix]/+page.svelte +++ b/webapp/src/routes/drawing/[prefix]/+page.svelte @@ -93,6 +93,11 @@ if (browser) { document.title = `${prefix.name} Drawing Form` + window.addEventListener("beforeunload", function(e) { + if (current_drawings.filter(drawing => drawing.changed === true).length > 0) { + e.preventDefault(); + } + }); } diff --git a/webapp/src/routes/reports/bybasket/[prefix]/+page.svelte b/webapp/src/routes/reports/bybasket/[prefix]/+page.svelte index f215417..5ffb331 100644 --- a/webapp/src/routes/reports/bybasket/[prefix]/+page.svelte +++ b/webapp/src/routes/reports/bybasket/[prefix]/+page.svelte @@ -9,7 +9,7 @@ let report_subject = $state("All Preferences"); if (browser) { - document.title = `${prefix.name} Report By Name` + document.title = `${prefix.name} Report By Basket ID` } diff --git a/webapp/src/routes/tickets/[prefix]/+page.svelte b/webapp/src/routes/tickets/[prefix]/+page.svelte index 9cde7ef..ddc0ea6 100644 --- a/webapp/src/routes/tickets/[prefix]/+page.svelte +++ b/webapp/src/routes/tickets/[prefix]/+page.svelte @@ -95,6 +95,11 @@ if (browser) { document.title = `${prefix.name} Ticket Entry`; + window.addEventListener("beforeunload", function(e) { + if (current_tickets.filter(ticket => ticket.changed === true).length > 0) { + e.preventDefault(); + } + }); }