This commit is contained in:
Oliver Walter
2026-06-06 15:37:42 +02:00
commit 5f43c19878
26 changed files with 2881 additions and 0 deletions
+174
View File
@@ -0,0 +1,174 @@
# 🔧 Toollist
Verwaltung von Werkzeugen und Material für ein Renovierungs- / Sanierungsprojekt.
---
## Tech Stack
| Schicht | Technologie |
|---|---|
| Sprache | Rust |
| Framework | [Leptos 0.8](https://leptos.dev) Full-Stack SSR + Hydration |
| Server | Axum 0.8 |
| Datenspeicher | TOML-Datei (`data/tools.toml`) |
| Styles | SCSS (`style/main.scss`) |
| Build-Tool | [cargo-leptos](https://github.com/leptos-rs/cargo-leptos) |
---
## Entwicklung
```bash
# Entwicklungsserver mit Hot-Reload starten
cargo leptos watch
# Browser öffnen
http://localhost:3000
# Im Heimnetz erreichbar unter
http://<server-ip>:3000
```
> **Hinweis:** `site-addr` ist auf `0.0.0.0:3000` gesetzt, die App ist also
> direkt im lokalen Netz erreichbar kein Login, keine Auth.
### Voraussetzungen
```bash
cargo install cargo-leptos
rustup target add wasm32-unknown-unknown
```
> **wasm-bindgen Version:** Die Cargo.toml pinnt `wasm-bindgen = "=0.2.106"`,
> damit es mit dem in cargo-leptos 0.3.6 gebündelten CLI übereinstimmt.
> Falls cargo-leptos aktualisiert wird, ggf. beide Versionen anpassen.
---
## Projektstruktur
```
toollist/
├── Cargo.toml Abhängigkeiten + cargo-leptos Konfiguration
├── data/
│ └── tools.toml Datenspeicher (wird automatisch angelegt)
├── public/ Statische Dateien
├── style/
│ └── main.scss Globales Stylesheet
└── src/
├── main.rs Server-Einstiegspunkt (Axum)
├── lib.rs Crate-Root, Hydration-Einstieg
├── app.rs App-Komponente + Routing
├── models/
│ └── tool.rs Datenmodell (Structs & Enums)
├── server/
│ ├── store.rs TOML lesen/schreiben [nur SSR]
│ └── api.rs Server Functions (HTTP-Endpunkte)
└── components/
├── tool_list.rs Hauptansicht Liste, Filter, CSV-Import
├── tool_form.rs Erstellen / Bearbeiten Formular
└── filter_bar.rs Filterleiste (Suche, Status, Priorität, Tag)
```
---
## Datenmodell
### `Tool` (zentrale Entität)
| Feld | Typ | Beschreibung |
|---|---|---|
| `id` | `String` (UUID) | Eindeutige ID, serverseitig generiert |
| `name` | `String` | Name des Werkzeugs |
| `anzahl` | `Anzahl` | Konkrete Zahl oder „Mehrere" |
| `beschaffung` | `Beschaffung` | Wie das Werkzeug beschafft wird |
| `verwendung` | `Vec<String>` | Liste von Verwendungszwecken |
| `tags` | `Vec<String>` | Stichwörter (z.B. `garten`, `schwer`) |
| `status` | `Status` | `Offen` · `Organisiert` · `VorOrt` |
| `prioritaet` | `Prioritaet` | `Hoch` · `Mittel` · `Niedrig` |
| `notizen` | `Option<String>` | Freitext |
| `verantwortlich` | `Option<String>` | Wer kümmert sich darum? |
| `erstellt_am` | `String` (ISO-8601) | Erstellungszeitpunkt |
### `Beschaffung`
| Art | Zusatzfelder |
|---|---|
| `Unbekannt` | |
| `InBesitz` | |
| `Leihen` | `von: Option<String>` |
| `Mieten` | `wo: Option<String>`, `preis: Option<f64>` |
| `Kaufen` | `wo: Option<String>`, `preis: Option<f64>` |
### TOML-Format (Beispiel)
```toml
[[tools]]
id = "3f2a1b..."
name = "Schubkarren"
status = "Offen"
prioritaet = "Mittel"
erstellt_am = "2025-01-01T10:00:00Z"
verwendung = ["Schutt abtransportieren"]
tags = ["transport", "garten"]
[tools.anzahl]
zahl = 2
[tools.beschaffung]
art = "InBesitz"
```
---
## Server Functions (API)
Alle Endpunkte unter `/api/` automatisch von Leptos registriert.
| Funktion | Beschreibung |
|---|---|
| `tools_laden()` | Alle Werkzeuge laden |
| `tool_erstellen(input)` | Neues Werkzeug anlegen |
| `tool_aktualisieren(id, input)` | Bestehendes Werkzeug aktualisieren |
| `tool_loeschen(id)` | Werkzeug löschen |
| `csv_importieren(inhalt)` | CSV-Text importieren (Name + Anzahl) |
---
## CSV-Import
Einfaches Format nur `name` und `anzahl` werden ausgewertet.
Fehlende oder unbekannte Werte werden toleriert.
```csv
name,anzahl
Schubkarren,2
Betonmischer,1
Nadelrolle,mehrere
Besen,
```
Importierte Einträge erhalten Standardwerte:
`Status = Offen`, `Priorität = Mittel`, `Beschaffung = Unbekannt`.
---
## Features (Stand)
- [x] Werkzeuge anlegen, bearbeiten, löschen
- [x] Listenansicht (Tabelle)
- [x] Filter: Status, Priorität, Tag, Freitextsuche
- [x] Dynamisches Formular (Felder je nach Beschaffungsart)
- [x] CSV-Import (Name + Anzahl)
- [x] Datenspeicherung in `data/tools.toml`
- [x] Im Heimnetz erreichbar (`0.0.0.0:3000`)
## Mögliche nächste Schritte
- [ ] Detailansicht / Klappreihe (Verwendungsliste, alle Felder)
- [ ] Verwendungsliste im Formular als dynamische Liste (statt Textarea)
- [ ] Bauabschnitt als eigenes Feld (oder konsequent via Tags)
- [ ] Druckansicht / Export
- [ ] Sortierung der Tabellenspalten
- [ ] Zähler in der Kopfzeile (z.B. „3 von 12 offen")