Feature: Neuer-Auftrag-Formular — Ihr Zeichen Pflicht, Liefertermin, Freigabe [deploy]
All checks were successful
Deploy baustelle-pwa / deploy (push) Successful in 13s

- Feldreihenfolge getauscht: "Ihr Zeichen" (ref_client) jetzt an erster
  Stelle und Pflicht; "Auftragsbeschreibung" (Titel) an zweiter Stelle
  und optional (vorher genau umgekehrt)
- Neues Feld "Geplanter Liefertermin" (datetime-local -> date_livraison)
- Neue Checkbox "Auftrag direkt freigeben" (validate-Flag ans Backend)
- Erfolgsmeldung zeigt Freigabe-Status bzw. Warnung aus dem Backend
This commit is contained in:
Eddy 2026-07-18 13:35:41 +02:00
parent 125e2fd196
commit ad8779ce75

38
app.js
View file

@ -1579,11 +1579,19 @@ async function openNewOrderModal() {
</div> </div>
<div class="new-order-defaults" id="no-defaults"></div> <div class="new-order-defaults" id="no-defaults"></div>
<label class="label">Titel / Kurzbeschreibung</label> <label class="label">Ihr Zeichen <span style="color:#e66">*</span></label>
<input type="text" id="no-refclient" placeholder="z. B. Angebot Nr. 123" style="padding:12px;background:#2a2a30;color:#fff;border:1px solid #444;border-radius:6px;">
<label class="label">Auftragsbeschreibung</label>
<input type="text" id="no-title" placeholder="z. B. Wallbox-Installation" style="padding:12px;background:#2a2a30;color:#fff;border:1px solid #444;border-radius:6px;"> <input type="text" id="no-title" placeholder="z. B. Wallbox-Installation" style="padding:12px;background:#2a2a30;color:#fff;border:1px solid #444;border-radius:6px;">
<label class="label">Kunden-Referenz (optional)</label> <label class="label">Geplanter Liefertermin</label>
<input type="text" id="no-refclient" placeholder="z. B. Angebot Nr. 123" style="padding:12px;background:#2a2a30;color:#fff;border:1px solid #444;border-radius:6px;"> <input type="datetime-local" id="no-delivery" style="padding:12px;background:#2a2a30;color:#fff;border:1px solid #444;border-radius:6px;color-scheme:dark;">
<label class="no-check" style="display:flex;align-items:center;gap:10px;margin-top:12px;font-size:15px;color:#eee;cursor:pointer;">
<input type="checkbox" id="no-validate" style="width:20px;height:20px;">
Auftrag direkt freigeben
</label>
</div> </div>
</div> </div>
`; `;
@ -1601,6 +1609,8 @@ async function openNewOrderModal() {
const defaultsEl = modal.querySelector('#no-defaults'); const defaultsEl = modal.querySelector('#no-defaults');
const titleIn = modal.querySelector('#no-title'); const titleIn = modal.querySelector('#no-title');
const refIn = modal.querySelector('#no-refclient'); const refIn = modal.querySelector('#no-refclient');
const deliveryIn = modal.querySelector('#no-delivery');
const validateCb = modal.querySelector('#no-validate');
const changeBtn = modal.querySelector('#no-change-customer'); const changeBtn = modal.querySelector('#no-change-customer');
let selectedCustomer = null; let selectedCustomer = null;
@ -1675,7 +1685,7 @@ async function openNewOrderModal() {
stepCust.hidden = true; stepCust.hidden = true;
stepDet.hidden = false; stepDet.hidden = false;
saveBtn.disabled = false; saveBtn.disabled = false;
titleIn.focus(); refIn.focus();
} catch (err) { } catch (err) {
showToast('Fehler: ' + err.message, 'error'); showToast('Fehler: ' + err.message, 'error');
} }
@ -1692,16 +1702,26 @@ async function openNewOrderModal() {
/* ---- Anlegen ---- */ /* ---- Anlegen ---- */
saveBtn.onclick = async () => { saveBtn.onclick = async () => {
if (!selectedCustomer) { showToast('Bitte zuerst Kunde wählen', 'error'); return; } if (!selectedCustomer) { showToast('Bitte zuerst Kunde wählen', 'error'); return; }
const refClient = refIn.value.trim();
if (!refClient) { showToast('Ihr Zeichen ist Pflicht', 'error'); refIn.focus(); return; }
const title = titleIn.value.trim(); const title = titleIn.value.trim();
if (!title) { showToast('Titel ist Pflicht', 'error'); titleIn.focus(); return; } const doValidate = validateCb.checked;
// datetime-local liefert lokale Zeit -> Unix-Timestamp (Sekunden); leer = 0
let deliveryTs = 0;
if (deliveryIn.value) {
const d = new Date(deliveryIn.value);
if (!isNaN(d.getTime())) deliveryTs = Math.floor(d.getTime() / 1000);
}
saveBtn.disabled = true; saveBtn.disabled = true;
showToast('Lege Auftrag an…'); showToast(doValidate ? 'Lege Auftrag an & gebe frei…' : 'Lege Auftrag an…');
try { try {
const res = await api.createOrder({ const res = await api.createOrder({
socid: selectedCustomer.id, socid: selectedCustomer.id,
ref_client: refClient,
title: title, title: title,
ref_client: refIn.value.trim(), date_livraison: deliveryTs,
validate: doValidate,
}); });
// Recent-Liste in IDB aktualisieren (letzte 5) // Recent-Liste in IDB aktualisieren (letzte 5)
try { try {
@ -1716,7 +1736,9 @@ async function openNewOrderModal() {
await idb.set('recent_customers', filtered.slice(0, 5)); await idb.set('recent_customers', filtered.slice(0, 5));
} catch (e) {} } catch (e) {}
showToast('✓ Auftrag ' + (res.order.ref || '') + ' angelegt'); const ref = res.order.ref || '';
showToast('✓ Auftrag ' + ref + (res.order.validated ? ' angelegt & freigegeben' : ' angelegt'));
if (res.validate_warning) showToast(res.validate_warning, 'error');
closeModal(modal); closeModal(modal);
router.go('#/orders/' + res.order.id); router.go('#/orders/' + res.order.id);
} catch (e) { } catch (e) {