175 lines
4.8 KiB
Markdown
175 lines
4.8 KiB
Markdown
# 🔧 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")
|