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 @@
{#each all_prefixes as prefix}
-
{#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();
+ }
+ });
}