7 Commits

Author SHA1 Message Date
a11eca38ab Update app.js 2026-06-06 16:04:33 +02:00
ee6c690645 Clean app.js: Remove all merge conflicts and duplicate classes
Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
2026-06-06 12:47:37 +00:00
23c83ef4d1 Fix: Event-Delegation für Tee-Karten-Buttons statt individueller Event-Listener
- Ein Event-Listener am Container statt mehrfacher Listener an jedem Button
- Funktioniert für alle aktuellen und zukünftigen Buttons
- Keine Probleme mit mehrfachen Event-Listenern
- Einfacherer, robusterer Code

Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
2026-06-06 11:37:29 +00:00
b2f632c07f Fix: Alle inline onclick-Handler durch programmatische Event-Listener ersetzt
- Bearbeiten- und Löschen-Buttons in Tee-Karten verwenden jetzt data-Attributes und Event-Listener
- 'Erste Tee hinzufügen'-Button verwendet jetzt Event-Listener
- setupTeaCardEventListeners() Methode hinzugefügt
- Keine Abhängigkeit mehr von globalem app-Scope in HTML

Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
2026-06-06 11:31:30 +00:00
b586eb3804 Fix: Doppelte App-Initialisierung entfernt - Buttons funktionieren wieder
Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
2026-06-06 11:28:14 +00:00
2544a102d9 Fix: Statistiken werden nicht angezeigt, Tee-Sorten Editieren funktioniert nicht
- Fix updateStats() um renderDetailedStats() korrekt aufzurufen
- Fix Stats-Period-Filter Event-Listener hinzugefügt
- Verbesserte LocalFileStorage-Klasse mit besserer Fehlerbehandlung
- .htaccess-Datei für Apache-Server hinzugefügt
- SERVER_SETUP.md mit Anleitungen für Server-Konfiguration
- data/-Verzeichnis mit .gitkeep hinzugefügt
- app-Variable als window.app global verfügbar gemacht

Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
2026-06-06 11:15:48 +00:00
b47e2bd7d0 Merge pull request #2 from trevor1969/vibe/version4-local-storage-a924f1
Version 4.0: Lokale Dateispeicherung im data/-Verzeichnis
2026-06-06 10:55:53 +02:00
4 changed files with 233 additions and 1671 deletions

38
.htaccess Normal file
View File

@ -0,0 +1,38 @@
# TeeTracker .htaccess Configuration
# Enable PUT and DELETE methods for the data directory
# Required for file-based storage to work on Apache servers
<IfModule mod_rewrite.c>
RewriteEngine On
# Allow PUT and DELETE for data directory
RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE)$
RewriteCond %{REQUEST_URI} ^/data/ [NC]
RewriteRule ^ - [L]
</IfModule>
# Enable all HTTP methods for the data directory
<Limit GET POST PUT DELETE OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST PUT DELETE OPTIONS>
Require all denied
</LimitExcept>
# Set proper MIME types for JSON files
<IfModule mod_mime.c>
AddType application/json .json
</IfModule>
# Disable caching for data files
<FilesMatch "\.(json|txt)$">
<IfModule mod_expires.c>
ExpiresActive Off
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
</FilesMatch>

193
SERVER_SETUP.md Normal file
View File

@ -0,0 +1,193 @@
# TeeTracker Server Setup
## Problem: Dateispeicherung funktioniert nicht
Die TeeTracker-App versucht, Daten im `data/`-Verzeichnis zu speichern, aber auf den meisten Webservern funktioniert das nicht standardmäßig. Hier sind die Lösungen:
---
## Lösung 1: LocalStorage (Empfohlen für Shared Hosting)
**Funktioniert immer, ohne Server-Konfiguration!**
Die App fällt automatisch auf localStorage zurück, wenn die Dateispeicherung nicht verfügbar ist.
- Alle Daten werden im Browser gespeichert
- Funktioniert auf jedem Webserver
- Daten sind nur auf dem aktuellen Gerät/Browser verfügbar
**Status prüfen:**
- Gehe zu "Einstellungen" → "Datenverwaltung"
- Wenn "Lokaler Modus (localStorage)" angezeigt wird, funktioniert die Dateispeicherung nicht
- Wenn "Dateispeicherung aktiv" angezeigt wird, funktioniert die Dateispeicherung
---
## Lösung 2: Apache Server (.htaccess)
Falls dein Server Apache verwendet (häufig bei Shared Hosting):
1. **Stelle sicher, dass die `.htaccess`-Datei aktiv ist:**
- Die Datei liegt bereits im Hauptverzeichnis
- Prüfe, ob `mod_rewrite` aktiviert ist
- Kontaktiere deinen Hosting-Anbieter, falls `.htaccess` ignoriert wird
2. **Erlaube PUT und DELETE Methoden:**
Die `.htaccess`-Datei enthält bereits die notwendigen Regeln:
```apache
<Limit GET POST PUT DELETE OPTIONS>
Require all granted
</Limit>
```
3. **Setze die richtigen Berechtigungen:**
```bash
chmod 755 data/
chmod 644 data/.gitkeep
```
4. **Aktiviere die notwendigen Apache-Module:**
```bash
a2enmod rewrite
a2enmod headers
a2enmod expires
service apache2 restart
```
---
## Lösung 3: PHP-Backend (Alternative)
Falls dein Server PHP unterstützt, kannst du ein einfaches Backend erstellen:
### 1. Erstelle `save_data.php`:
```php
<?php
header('Content-Type: application/json');
$filename = 'data/' . ($_GET['file'] ?? '');
$allowed_files = ['teas.json', 'entries.json'];
if (!in_array(basename($filename), $allowed_files)) {
http_response_code(403);
die(json_encode(['error' => 'Not allowed']));
}
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (file_exists($filename)) {
readfile($filename);
} else {
echo '[]';
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'PUT' || $_SERVER['REQUEST_METHOD'] === 'POST') {
$data = file_get_contents('php://input');
file_put_contents($filename, $data);
echo json_encode(['success' => true]);
} elseif ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
if (file_exists($filename)) {
unlink($filename);
}
echo json_encode(['success' => true]);
}
```
### 2. Ändere die `LocalFileStorage`-Klasse:
Ersetze die `fetch()`-Aufrufe durch Aufrufe an dein PHP-Skript.
---
## Lösung 4: Node.js/Express Server
Falls du Node.js verwenden kannst:
```javascript
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.use(express.json());
app.use(express.static('public'));
// Enable PUT and DELETE for data directory
app.use('/data', express.raw({ type: '*/*' }));
app.put('/data/:file', (req, res) => {
const filePath = path.join(__dirname, 'data', req.params.file);
fs.writeFile(filePath, req.body, (err) => {
if (err) return res.status(500).send(err.message);
res.sendStatus(200);
});
});
app.get('/data/:file', (req, res) => {
const filePath = path.join(__dirname, 'data', req.params.file);
if (fs.existsSync(filePath)) {
res.sendFile(filePath);
} else {
res.status(404).send('[]');
}
});
app.delete('/data/:file', (req, res) => {
const filePath = path.join(__dirname, 'data', req.params.file);
if (fs.existsSync(filePath)) {
fs.unlink(filePath, (err) => {
if (err) return res.status(500).send(err.message);
res.sendStatus(200);
});
} else {
res.sendStatus(200);
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
```
---
## Häufige Probleme und Lösungen
### Problem: "405 Method Not Allowed"
**Lösung:** Der Server unterstützt PUT/DELETE nicht. Verwende Lösung 2, 3 oder 4.
### Problem: "403 Forbidden"
**Lösung:** Die Berechtigungen sind falsch. Führe aus:
```bash
chmod 755 data/
chmod 644 data/*
```
### Problem: "404 Not Found" für data/-Dateien
**Lösung:** Das `data/`-Verzeichnis existiert nicht oder die Dateien sind nicht hochgeladen.
### Problem: CORS-Fehler
**Lösung:** Falls du die App von einer anderen Domain lädst, musst du CORS-Header setzen:
```apache
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type"
```
---
## Testen der Dateispeicherung
1. Öffne die Browser-Konsole (F12 → Console)
2. Gib ein:
```javascript
fetch('data/test.txt', { method: 'PUT', body: 'test' })
.then(r => r.text())
.then(console.log)
.catch(console.error);
```
3. Wenn du eine erfolgreiche Antwort erhältst, funktioniert die Dateispeicherung
---
## Empfehlung
**Für Shared Hosting:** Verwende einfach localStorage (Lösung 1). Die Daten werden im Browser gespeichert und funktionieren ohne Server-Konfiguration.
**Für eigene Server:** Konfiguriere Apache mit der `.htaccess`-Datei (Lösung 2) oder verwende das PHP-Backend (Lösung 3).
**Für Entwickler:** Verwende den Node.js-Server (Lösung 4) oder einen lokalen Entwicklungsserver wie `python -m http.server`.

1671
app.js

File diff suppressed because it is too large Load Diff

2
data/.gitkeep Normal file
View File

@ -0,0 +1,2 @@
# This file ensures the data directory exists and is tracked by git
# TeeTracker stores teas.json and entries.json in this directory