Verwaltung: Projektstand aendern, Wuensche beziffern, im Projekt antworten
Drei Server-Funktionen existierten seit Tagen und hatten KEINE Oberflaeche.
Erst im Vergleich "was kann der Server" gegen "was ruft die Seite auf"
ist es aufgefallen:
POST /admin/projekte/:id projektAendern
POST /admin/aenderungen/:id/beziffern
POST /admin/projekt-nachricht
Jede davon schliesst einen Kreis, der bisher offen war.
1. DIE SCHMERZHAFTESTE LUECKE: DER STAND
Der Kunde sieht in seinem Portal GANZ OBEN die Phasenleiste und den
"naechsten Schritt". Beides liess sich nirgends aendern. Ein Projekt blieb
also fuer immer im Briefing stehen, egal wie weit es wirklich war -- und
der prominenteste Text im ganzen Kundenportal war dauerhaft leer.
Jetzt: sieben Phasen als Knoepfe (plus Pausiert/Abgebrochen daneben, denn
das sind keine Phasen, sondern Zustaende), "wer ist am Zug", naechster
Schritt, Richttermin, Zahlungsstand, Portfolio-Freigabe.
Phase und "wer ist am Zug" speichern SOFORT ohne Speichern-Knopf: Es ist
ein Klick auf genau einen Wert, ein zweiter Klick waere Zeremonie. Die
Textfelder haben einen Knopf, weil man beim Tippen zwischendurch nicht
speichern will.
2. AENDERUNGSWUENSCHE
Der Kunde konnte Ideen einreichen, seit es das Portal gibt. Beziffern ging
serverseitig auch -- nur gab es keine Oberflaeche. Der Kreis war offen: Er
schickt etwas los und hoert nie wieder davon.
Jetzt stehen alle Wuensche im Projekt, offene mit Feldern fuer Preis,
Dauer und einer kurzen Erklaerung. Ohne Preis geht nichts raus (geprueft)
-- ohne Preis kann der Kunde nicht entscheiden, und ein "Angebot" ohne
Zahl ist keins.
3. NACHRICHTEN ZUM PROJEKT
Getrennt vom allgemeinen Postfach, weil sie zum Projekt gehoeren und im
Portal auch dort erscheinen. Sie hier nicht zu haben hiess: Der Kunde
schreibt im Projekt, und ich kann ihm nur woanders antworten.
AUFBAU
Neuer Endpunkt /admin/projekte/:id/alles liefert Projekt, Aufgaben,
Fortschritt, Aenderungswuensche und Nachrichten in EINER Antwort. Fuenf
Anfragen hintereinander wuerden die Ansicht sichtbar ruckelnd aufbauen.
Dieselbe Aufteilung wie in der Anfrageansicht -- links die Arbeit
(Aufgaben), rechts das Steuern. Wer zwischen beiden Ansichten wechselt,
muss nicht umdenken.
GEPRUEFT: 69 Pruefungen, Computer und Handy, alle bestanden.
Die neuen Pruefungen schauen nicht darauf, ob sich ein Knopf einfaerbt --
das beweist nichts. Sie schneiden mit, was die Seite TATSAECHLICH an den
Server schickt: {"status":"entwicklung"}, {"restBezahlt":true},
{"preisEuro":250,"dauer":"3 Tage"}. Und sie pruefen den Fall, in dem
nichts rausgehen darf: Ohne Preis bleibt die Mitschrift leer.
Ein Fehler im Test selbst behoben: Die Nachrichtenzaehlung war
document-weit und zaehlte die Nachrichten der geschlossenen Projektansicht
mit -- geschlossen heisst nicht aus dem Dokument entfernt. Jetzt auf den
Postfach-Verlauf eingegrenzt.
Versionsstempel und Cache-Name auf v6.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -104,7 +104,7 @@ import {
|
||||
/* Aufgabenliste je Projekt ("was ist schon gemacht von dem, was im Plan
|
||||
war") und allgemeines Postfach fuer Nachrichten OHNE Projektbezug. */
|
||||
import {
|
||||
portalAufgaben, portalAufgabeErledigt, adminAufgaben, adminAufgabeAnlegen,
|
||||
portalAufgaben, portalAufgabeErledigt, adminAufgaben, adminAufgabeAnlegen, adminProjektAlles,
|
||||
adminAufgabeAendern, adminAufgabeLoeschen, adminVorlageAnwenden,
|
||||
} from "./routes/webdesign-aufgaben.js";
|
||||
import {
|
||||
@@ -291,6 +291,10 @@ app.post("/webdesign/admin/projekt-nachricht", wrap(projektNachricht));
|
||||
app.get("/webdesign/portal/projekt/:id/aufgaben", wrap(portalAufgaben));
|
||||
app.post("/webdesign/portal/aufgabe/:id/erledigt", wrap(portalAufgabeErledigt));
|
||||
app.get("/webdesign/admin/projekte/:id/aufgaben", wrap(adminAufgaben));
|
||||
/* Das ganze Projekt in EINER Antwort -- Stand, Aufgaben, Aenderungswuensche
|
||||
und Nachrichten. Fuenf Anfragen hintereinander wuerden die Ansicht
|
||||
sichtbar ruckelnd aufbauen. */
|
||||
app.get("/webdesign/admin/projekte/:id/alles", wrap(adminProjektAlles));
|
||||
app.post("/webdesign/admin/projekte/:id/aufgaben", wrap(adminAufgabeAnlegen));
|
||||
app.post("/webdesign/admin/projekte/:id/aufgaben/vorlage", wrap(adminVorlageAnwenden));
|
||||
app.post("/webdesign/admin/aufgaben/:id", wrap(adminAufgabeAendern));
|
||||
|
||||
@@ -178,6 +178,56 @@ export async function adminAufgaben(req, res) {
|
||||
return json(res, { ok: true, projekt, aufgaben, fortschritt: fortschritt(projektId) });
|
||||
}
|
||||
|
||||
/* GET /webdesign/admin/projekte/:id/alles — das ganze Projekt
|
||||
|
||||
Warum ein zusätzlicher Endpunkt neben adminAufgaben: Die Verwaltung
|
||||
konnte ein Projekt bisher nur ANLEGEN. Ändern, Änderungswünsche
|
||||
beziffern und im Projekt antworten ging serverseitig längst — es gab
|
||||
nur keine Oberfläche dafür.
|
||||
|
||||
Das war die schmerzhafteste Lücke im ganzen Bereich: Der Kunde sieht
|
||||
in seinem Portal ganz oben die Phase und den "nächsten Schritt". Beide
|
||||
liessen sich nirgends ändern. Ein Projekt blieb also für immer im
|
||||
Briefing stehen, egal wie weit es wirklich war.
|
||||
|
||||
Alles in EINER Antwort statt in fünf: Beim Öffnen eines Projekts
|
||||
braucht man ohnehin alles, und fünf Anfragen hintereinander bauen die
|
||||
Ansicht sichtbar ruckelnd auf. */
|
||||
export async function adminProjektAlles(req, res) {
|
||||
const p = await darf(req, "WD_PROJEKTE_MANAGE");
|
||||
if (!p.erlaubt) return json(res, { ok: false, error: "Kein Zugriff." }, p.grund);
|
||||
|
||||
const id = String(req.params.id || "");
|
||||
const projekt = db
|
||||
.prepare(
|
||||
`SELECT p.*, k.name AS kunde_name, k.firma AS kunde_firma, k.email AS kunde_email
|
||||
FROM wd_projekte p JOIN wd_kunden k ON k.id = p.kunde_id WHERE p.id = ?`
|
||||
)
|
||||
.get(id);
|
||||
if (!projekt) return json(res, { ok: false, error: "Projekt nicht gefunden." }, 404);
|
||||
|
||||
const aufgaben = db
|
||||
.prepare(`SELECT * FROM wd_aufgaben WHERE projekt_id = ? ORDER BY reihenfolge, erstellt_am`)
|
||||
.all(id);
|
||||
|
||||
const aenderungen = db
|
||||
.prepare(`SELECT * FROM wd_aenderungen WHERE projekt_id = ? ORDER BY erstellt_am DESC`)
|
||||
.all(id);
|
||||
|
||||
const nachrichten = db
|
||||
.prepare(`SELECT * FROM wd_nachrichten WHERE projekt_id = ? ORDER BY erstellt_am ASC`)
|
||||
.all(id);
|
||||
|
||||
return json(res, {
|
||||
ok: true,
|
||||
projekt,
|
||||
aufgaben,
|
||||
aenderungen,
|
||||
nachrichten,
|
||||
fortschritt: fortschritt(id),
|
||||
});
|
||||
}
|
||||
|
||||
/* POST /webdesign/admin/projekte/:id/aufgaben — neuen Punkt anlegen */
|
||||
export async function adminAufgabeAnlegen(req, res) {
|
||||
const p = await darf(req, "WD_PROJEKTE_MANAGE");
|
||||
|
||||
Reference in New Issue
Block a user