initial
This commit is contained in:
@@ -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")
|
||||
Reference in New Issue
Block a user