Frontend: Code-Vorschlag beim Objekt-Anlegen/Duplizieren einbinden
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:
@@ -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 ++++++++++++
|
||||||
|
|
||||||
|
---
|
||||||
|
|||||||
@@ -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 ++++++++++++
|
||||||
|
|
||||||
|
---
|
||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user