diff --git a/Makefile b/Makefile index fe84387..8bfbc94 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ build: ## deps: install Node.js, pnpm and native-module build tools (Fedora) deps: require-root - dnf install -y nodejs gcc-c++ make python3 + dnf install -y nodejs gcc-c++ make python3 rsync corepack enable ## install: full production install on a fresh checkout (Fedora) @@ -41,9 +41,14 @@ service: require-root # Dedicated system user (no login, no home). id -u $(SERVICE_USER) >/dev/null 2>&1 || \ useradd --system --no-create-home --shell /usr/sbin/nologin $(SERVICE_USER) - # Copy the whole tree so pnpm's symlinked node_modules stay intact. + # Copy the tree (preserving pnpm's symlinked node_modules) but leave behind + # the repo metadata, local dev database, and editor/nix cruft. mkdir -p $(PREFIX) - cp -a . $(PREFIX)/ + rsync -a --delete \ + --exclude='.git' --exclude='.direnv' --exclude='.env' \ + --exclude='*.db' --exclude='*.db-wal' --exclude='*.db-shm' \ + --exclude='$(PREFIX)' \ + ./ $(PREFIX)/ # Config + secrets — never clobber an existing env file. mkdir -p $(CONFDIR) test -f $(CONFDIR)/wutzcalc.env || \ diff --git a/README.md b/README.md index a21460a..77a4d39 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ sudo useradd --system --no-create-home --shell /usr/sbin/nologin wutzcalc # 2. Install the built app (run `pnpm install && pnpm build` first) sudo mkdir -p /opt/wutzcalc -sudo cp -a . /opt/wutzcalc # or rsync/checkout into place +sudo rsync -a --exclude='.git' --exclude='*.db*' ./ /opt/wutzcalc/ sudo chown -R root:root /opt/wutzcalc # app dir stays read-only to the service # 3. Config + secrets (chmod 600 — holds ADMIN_PASSWORD) diff --git a/client/admin.html b/client/admin.html index aa42195..3d58c4b 100644 --- a/client/admin.html +++ b/client/admin.html @@ -4,6 +4,14 @@ wutzcalc — Backoffice + + diff --git a/client/index.html b/client/index.html index 8a7e6af..d375e0a 100644 --- a/client/index.html +++ b/client/index.html @@ -4,6 +4,14 @@ wutzcalc + + diff --git a/client/public/favicon.svg b/client/public/favicon.svg new file mode 100644 index 0000000..63774fe --- /dev/null +++ b/client/public/favicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/src/admin/Admin.tsx b/client/src/admin/Admin.tsx index 81884d3..40dc8b8 100644 --- a/client/src/admin/Admin.tsx +++ b/client/src/admin/Admin.tsx @@ -62,7 +62,7 @@ function Login({ onAuthed }: { onAuthed: () => void }) { value={pw} onInput={(e: any) => setPw(e.currentTarget.value)} /> - {err &&
{err}
} + {err &&
{err}
} @@ -107,7 +107,7 @@ function Stats() { <>

Umsatz nach Tagen

- +
@@ -227,7 +227,7 @@ function Drinks() { - + @@ -377,7 +377,7 @@ function Bars() { <>

Bars

{bars.map(b => ( -
+
- +
-
{bar.name}
+
+ + {bar.name} +
@@ -92,10 +95,12 @@ export function Sale({ config, onChangeBar }: Props) { )} ))} - + {bar.pfand_cents > 0 && ( + + )}
diff --git a/server/src/time.ts b/server/src/time.ts index e70445b..3302406 100644 --- a/server/src/time.ts +++ b/server/src/time.ts @@ -39,7 +39,7 @@ function localParts(d: Date, tz: string = TZ): LocalParts { hour: '2-digit', minute: '2-digit', second: '2-digit', - hour12: false, + hourCycle: 'h23', // force midnight as 00, never the 24 artifact }); const parts: Record = {}; for (const p of fmt.formatToParts(d)) { @@ -49,7 +49,7 @@ function localParts(d: Date, tz: string = TZ): LocalParts { year: Number(parts.year), month: Number(parts.month), day: Number(parts.day), - hour: Number(parts.hour === '24' ? '0' : parts.hour), + hour: Number(parts.hour), minute: Number(parts.minute), second: Number(parts.second), };
TagTransaktionenBezahltCrew-TransaktionenPfand zurück