Frontend: Code-Vorschlag beim Objekt-Anlegen/Duplizieren einbinden
CI / backend-tests (push) Successful in 1m0s
CI / frontend-build (push) Successful in 15s

Präfix-Feld + "Code vorschlagen"-Button ruft GET /objekte/naechster-code
und füllt das Code-Feld vor, bleibt überschreibbar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
2026-09-04 17:37:15 +02:00
co-authored by Claude Sonnet 5
parent 69e7d0c8d0
commit f06d704168
3 changed files with 113 additions and 1 deletions
+36
View File
@@ -2542,3 +2542,39 @@ Keine Commits in dieser Session.
- frontend/src/pages/admin/VorlageSection.tsx | 26 +++--- - frontend/src/pages/admin/VorlageSection.tsx | 26 +++---
--- ---
## 2026-09-04 17:35 17:35 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
- 69e7d0c Karte 10: Geräte-Code für Objektpositionen (Code128-Vorbereitung) + Code-Vorschlag
### Geänderte Dateien
- DEVLOG.md | 147 +++++++++++++++++++++
- backend/DEVLOG.md | 78 +++++++++++
- .../versions/0005_add_objektposition_code.py | 32 +++++
- backend/app/api/v1/endpoints/objekte.py | 58 +++++++-
- backend/app/models/objektposition.py | 4 +
- backend/app/schemas/objekt.py | 2 +
- backend/app/services/objekte.py | 21 +++
- backend/tests/test_objekte.py | 83 ++++++++++++
---
## 2026-09-04 17:35 17:35 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 147 +++++++++++++++++++++
- backend/DEVLOG.md | 78 +++++++++++
- .../versions/0005_add_objektposition_code.py | 32 +++++
- backend/app/api/v1/endpoints/objekte.py | 58 +++++++-
- backend/app/models/objektposition.py | 4 +
- backend/app/schemas/objekt.py | 2 +
- backend/app/services/objekte.py | 21 +++
- backend/tests/test_objekte.py | 83 ++++++++++++
---
+20
View File
@@ -0,0 +1,20 @@
# frontend Dev Log
## 2026-09-04 17:35 17:36 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 147 +++++++++++++++++++++
- backend/DEVLOG.md | 78 +++++++++++
- .../versions/0005_add_objektposition_code.py | 32 +++++
- backend/app/api/v1/endpoints/objekte.py | 58 +++++++-
- backend/app/models/objektposition.py | 4 +
- backend/app/schemas/objekt.py | 2 +
- backend/app/services/objekte.py | 21 +++
- backend/tests/test_objekte.py | 83 ++++++++++++
---
+57 -1
View File
@@ -14,6 +14,7 @@ interface Props {
} }
export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGeaendert, onFehler }: Props) { export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGeaendert, onFehler }: Props) {
const [praefix, setPraefix] = useState("");
const [code, setCode] = useState(""); const [code, setCode] = useState("");
const [name, setName] = useState(""); const [name, setName] = useState("");
const [vorlageId, setVorlageId] = useState<number | "">(""); const [vorlageId, setVorlageId] = useState<number | "">("");
@@ -21,10 +22,41 @@ export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGea
const [wirdAngelegt, setWirdAngelegt] = useState(false); const [wirdAngelegt, setWirdAngelegt] = useState(false);
const [ausgeklapptId, setAusgeklapptId] = useState<number | null>(null); const [ausgeklapptId, setAusgeklapptId] = useState<number | null>(null);
const [duplizierId, setDuplizierId] = useState<number | null>(null); const [duplizierId, setDuplizierId] = useState<number | null>(null);
const [neuerPraefix, setNeuerPraefix] = useState("");
const [neuerCode, setNeuerCode] = useState(""); const [neuerCode, setNeuerCode] = useState("");
const [neuerName, setNeuerName] = useState(""); const [neuerName, setNeuerName] = useState("");
const [neuerStandortId, setNeuerStandortId] = useState<number | "">(""); const [neuerStandortId, setNeuerStandortId] = useState<number | "">("");
async function codeVorschlagen() {
if (!praefix) {
onFehler("Präfix eingeben (z. B. RK, FZ).");
return;
}
try {
const antwort = await apiRequest<{ code: string }>(
`/objekte/naechster-code?praefix=${encodeURIComponent(praefix.toUpperCase())}`
);
setCode(antwort.code);
} catch {
onFehler("Code-Vorschlag fehlgeschlagen.");
}
}
async function neuerCodeVorschlagen() {
if (!neuerPraefix) {
onFehler("Präfix eingeben (z. B. RK, FZ).");
return;
}
try {
const antwort = await apiRequest<{ code: string }>(
`/objekte/naechster-code?praefix=${encodeURIComponent(neuerPraefix.toUpperCase())}`
);
setNeuerCode(antwort.code);
} catch {
onFehler("Code-Vorschlag fehlgeschlagen.");
}
}
async function anlegen() { async function anlegen() {
if (vorlageId === "" || standortId === "") { if (vorlageId === "" || standortId === "") {
onFehler("Vorlage und Standort auswählen."); onFehler("Vorlage und Standort auswählen.");
@@ -43,6 +75,7 @@ export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGea
standort_id: standortId, standort_id: standortId,
}, },
}); });
setPraefix("");
setCode(""); setCode("");
setName(""); setName("");
await onGeaendert(); await onGeaendert();
@@ -55,6 +88,7 @@ export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGea
function duplizierenStarten(o: Objekt) { function duplizierenStarten(o: Objekt) {
setDuplizierId(duplizierId === o.id ? null : o.id); setDuplizierId(duplizierId === o.id ? null : o.id);
setNeuerPraefix("");
setNeuerCode(""); setNeuerCode("");
setNeuerName(`${o.name} (Kopie)`); setNeuerName(`${o.name} (Kopie)`);
setNeuerStandortId(o.standort_id); setNeuerStandortId(o.standort_id);
@@ -115,7 +149,19 @@ export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGea
</div> </div>
<div className="field"> <div className="field">
<label>Code (eindeutig)</label> <label>Code (eindeutig)</label>
<input className="input" value={code} onChange={(e) => setCode(e.target.value)} /> <div className="row" style={{ flexWrap: "wrap" }}>
<input
className="input"
style={{ maxWidth: "6rem" }}
value={praefix}
onChange={(e) => setPraefix(e.target.value)}
placeholder="Präfix (RK, FZ…)"
/>
<button type="button" className="btn btn-secondary" onClick={codeVorschlagen}>
Code vorschlagen
</button>
<input className="input" value={code} onChange={(e) => setCode(e.target.value)} />
</div>
</div> </div>
<div className="field"> <div className="field">
<label>Name</label> <label>Name</label>
@@ -154,6 +200,16 @@ export function ObjektSection({ objekte, vorlagen, standorte, materialien, onGea
)} )}
{duplizierId === o.id && ( {duplizierId === o.id && (
<div className="row" style={{ marginTop: "0.5rem", flexWrap: "wrap" }}> <div className="row" style={{ marginTop: "0.5rem", flexWrap: "wrap" }}>
<input
className="input"
style={{ maxWidth: "6rem" }}
value={neuerPraefix}
onChange={(e) => setNeuerPraefix(e.target.value)}
placeholder="Präfix (RK, FZ…)"
/>
<button type="button" className="btn btn-secondary" onClick={neuerCodeVorschlagen}>
Code vorschlagen
</button>
<input <input
className="input" className="input"
value={neuerCode} value={neuerCode}