diff --git a/client/src/App.css b/client/src/App.css index 6bbdcbf..7b421fe 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -672,9 +672,18 @@ html.scheme-dark .themed-select-option.is-selected { font-size: 13px; padding: 6px 12px; border-radius: 20px; - background: var(--app-btn-secondary-bg); - border: 1px solid var(--app-btn-secondary-border); - color: var(--app-btn-secondary-text); + background: rgba(148, 163, 184, 0.08); + border: 1px solid rgba(148, 163, 184, 0.18); + color: var(--app-text-muted); + cursor: default; + user-select: none; +} + +.skipper-badge__name { + max-width: 140px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .btn-icon { diff --git a/client/src/components/LogbookDashboard.tsx b/client/src/components/LogbookDashboard.tsx index b81b644..85690b9 100644 --- a/client/src/components/LogbookDashboard.tsx +++ b/client/src/components/LogbookDashboard.tsx @@ -206,9 +206,13 @@ export default function LogbookDashboard({ onSelectLogbook, onLogout }: LogbookD {/* Skipper profile */} -
- - {username} +
+
{/* Lang toggle */} diff --git a/client/src/i18n/locales/de.json b/client/src/i18n/locales/de.json index d95c7b2..c159b2f 100644 --- a/client/src/i18n/locales/de.json +++ b/client/src/i18n/locales/de.json @@ -243,6 +243,7 @@ "create_btn": "Logbuch erstellen", "new_logbook_placeholder": "Name des Logbuchs oder der Yacht", "logout": "Abmelden", + "logged_in_as": "Angemeldet als {{name}}", "delete_confirm": "Sind Sie sicher, dass Sie dieses Logbuch unwiderruflich löschen möchten? Alle lokalen Daten und Server-Kopien werden vernichtet.\n\nTipp: Erstellen Sie vorher unter Einstellungen → Backup & Wiederherstellung eine Sicherungskopie (.daagbok.json), falls Sie die Daten später behalten möchten.", "no_logbooks": "Keine Logbücher gefunden. Erstellen Sie Ihr erstes Logbuch, um zu beginnen!", "loading": "Logbücher werden geladen...", diff --git a/client/src/i18n/locales/en.json b/client/src/i18n/locales/en.json index 495c9df..018aaa6 100644 --- a/client/src/i18n/locales/en.json +++ b/client/src/i18n/locales/en.json @@ -243,6 +243,7 @@ "create_btn": "Create Logbook", "new_logbook_placeholder": "Logbook or Yacht Name", "logout": "Logout", + "logged_in_as": "Signed in as {{name}}", "delete_confirm": "Are you sure you want to permanently delete this logbook? All local data and server copies will be destroyed.\n\nTip: Create a backup first under Settings → Backup & restore (.daagbok.json) if you may need the data later.", "no_logbooks": "No logbooks found. Create your first logbook to begin!", "loading": "Loading logbooks...", diff --git a/docker-compose.yml b/docker-compose.yml index 2028163..83d69d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,9 @@ services: VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY:-} VAPID_SUBJECT: ${VAPID_SUBJECT:-mailto:support@kapteins-daagbok.eu} OpenWeatherMapAPIKey: ${OpenWeatherMapAPIKey:-} + NTFY_SERVER: ${NTFY_SERVER:-https://ntfy.sh} + NTFY_TOPIC: ${NTFY_TOPIC:-} + NTFY_TOKEN: ${NTFY_TOKEN:-} command: sh -c "npx prisma db push && node dist/index.js" depends_on: db: diff --git a/scripts/start-dev.sh b/scripts/start-dev.sh index 092af8f..3da25f1 100755 --- a/scripts/start-dev.sh +++ b/scripts/start-dev.sh @@ -3,12 +3,66 @@ # Configuration SERVER_PORT=5000 CLIENT_PORT=5173 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +resolve_node_toolchain() { + # Common install locations when login shell PATH is not loaded + if command -v npm >/dev/null 2>&1; then + return 0 + fi + + if [ -s "$HOME/.nvm/nvm.sh" ]; then + # shellcheck disable=SC1090 + . "$HOME/.nvm/nvm.sh" + elif [ -s "/usr/local/nvm/nvm.sh" ]; then + # shellcheck disable=SC1090 + . "/usr/local/nvm/nvm.sh" + fi + + if [ -d "$HOME/.fnm" ] && command -v fnm >/dev/null 2>&1; then + eval "$(fnm env)" + fi + + for candidate in \ + /usr/local/bin/npm \ + /usr/bin/npm \ + "$HOME/.local/share/fnm/current/bin/npm" \ + "$HOME/.nvm/versions/node/"*/bin/npm; do + if [ -x "$candidate" ]; then + export PATH="$(dirname "$candidate"):$PATH" + break + fi + done + + command -v npm >/dev/null 2>&1 +} + +require_node_toolchain() { + if resolve_node_toolchain; then + echo "Using Node $(node -v), npm $(npm -v)" + return 0 + fi + + echo "Error: npm was not found in PATH." + echo "" + echo "This script starts local Vite/Express dev servers and requires Node.js 20+ with npm." + echo "Install Node.js on this machine, or use the Docker-based stack instead:" + echo " ./scripts/start-dev-docker.sh" + echo "" + echo "On the production host, prefer updating the running stack:" + echo " docker compose -f docker-compose.yml up -d --build" + echo " # or from your workstation: ./scripts/update-prod.sh" + exit 1 +} echo "========================================" echo " Kapteins Daagbok Dev Environment " echo "========================================" echo "Preparing to (re)start services..." +require_node_toolchain + # Clean up processes running on ports cleanup_port() { local port=$1 @@ -77,18 +131,40 @@ fi # Start backend server echo "Starting backend API server..." -cd server +cd "$REPO_ROOT/server" || exit 1 +if [ ! -d node_modules ]; then + echo "Error: server/node_modules missing. Run: cd server && npm ci" + exit 1 +fi npm run dev & -cd .. +BACKEND_PID=$! +cd "$REPO_ROOT" || exit 1 # Sleep briefly to let server start up sleep 1.5 +if ! kill -0 "$BACKEND_PID" 2>/dev/null; then + echo "Error: Backend dev server exited immediately. Check server logs above." + exit 1 +fi # Start frontend client echo "Starting frontend dev server..." -cd client +cd "$REPO_ROOT/client" || exit 1 +if [ ! -d node_modules ]; then + echo "Error: client/node_modules missing. Run: cd client && npm ci" + kill "$BACKEND_PID" 2>/dev/null + exit 1 +fi npm run dev & -cd .. +CLIENT_PID=$! +cd "$REPO_ROOT" || exit 1 + +sleep 1.5 +if ! kill -0 "$CLIENT_PID" 2>/dev/null; then + echo "Error: Frontend dev server exited immediately. Check client logs above." + kill "$BACKEND_PID" 2>/dev/null + exit 1 +fi echo "========================================" echo "Dev services are now running:" diff --git a/server/src/services/ntfyNotify.ts b/server/src/services/ntfyNotify.ts index 97632bc..40a2e5b 100644 --- a/server/src/services/ntfyNotify.ts +++ b/server/src/services/ntfyNotify.ts @@ -30,7 +30,7 @@ export async function sendFeedbackViaNtfy(payload: FeedbackPayload): Promise