Nichts verschwindet mehr ohne eine Nachfrage, die sagt was passiert
Filipe: "Es darf vor allem keine Stellen geben, an denen ein Benutzer
etwas falsch machen kann, nur weil die Seite es nicht verstaendlich
genug erklaert."
Gemessen: 30 Stellen in 16 Dateien benutzten confirm() oder prompt().
Das Haus hatte die richtige Bauweise laengst -- einen <dialog>, in
aufgaben.html sogar ausfuehrlich begruendet -- aber sie stand IN EINER
SEITE. Wer anderswo etwas loeschen liess, hatte sie nicht.
confirm('Wirklich loeschen?') stellt die falsche Frage: Es fragt, ob
man sicher ist, und nennt nicht, WAS passiert, was BLEIBT und ob es
ZURUECK geht. Jetzt beantwortet jeder der 41 Dialoge alle drei.
Neu: workspace/assets/js/nachfrage.js -- window.frageNach() mit
Pflichtgrund, Zahlenfeld, einzeiliger Eingabe und Abtippsicherung.
Drei Ausgaenge: <dialog> / confirm()-Notnagel fuer Safari vor 15.4 /
Abbruch (Esc, Klick daneben, "Doch nicht" -- immer false).
DREIMAL DERSELBE FALLSTRICK, dreimal nachgemessen statt vermutet:
.dialog stand in aufgaben.css und leistung.css -> auf dateien.html
waere der Dialog ein weisser Systemkasten gewesen. 14 Regeln
klammergenau nach module.css verschoben (Klammern gezaehlt, nicht
per Muster geschnitten -- heute frueh hat ein nicht-gieriges
Muster schon einmal CSS zerrissen).
Das Formular trug .neu neu--blank -- und .neu gibt seine Abstaende
nur in aufgaben.css. Gemessen: padding 0px, und die Felder
verloren ihre height:44px. Jetzt steht alles unter
.nachfrage__form in module.css; der Dialog borgt nichts mehr.
Die erste Fassung der Pruefung zaehlte nachfrage.js SELBST als
Nutzer -- damit war jede Seite trivialerweise "Nutzer" und die
Pruefung gruen ohne Inhalt. Jetzt ausdruecklich ausgenommen.
ZWEI FUNDE NEBENBEI:
hilfeAufraeumen() wird im Betrieb NIE aufgerufen. Der Kommentar
behauptete "wird beim Start aufgerufen (siehe index.js)" -- das
war nie wahr; einziger Aufrufer ist die eigene Pruefung. Folge:
geschlossene vertrauliche Faelle bleiben unbegrenzt stehen. NICHT
eingeschaltet (das loescht echte Daten und ist Filipes
Entscheidung), sondern der Kommentar richtiggestellt.
Einen Hilfe-Fall zu schliessen ist endgueltig -- es gibt keine
Route, die ihn wieder oeffnet. Vorher stand darueber nur die
Frage nach einem Schlusswort. Jetzt sagt der Dialog es.
pruef-struktur hat meine eigene Pruefung von heute Nachmittag
erwischt: Sie bildete ihr Datum aus UTC. Beim Beheben erst
heuteLokal(datum) genommen -- die Funktion nimmt gar kein Argument
und haette still "heute" statt "+3 Tage" geliefert. Jetzt tagLokal(3),
nachgerechnet: Abstand 3 Tage.
Am Bildschirm angesehen (Rechner 1280, Handy 390): passt rein, Esc
ergibt false, Fokus liegt auf dem harmlosen Knopf, Knoepfe 44px auf
Touch. Der Platzhalter im Abtippfeld zeigte den erwarteten Namen --
das sah aus wie ein schon ausgefuelltes Feld, entfernt.
Neu: server/pruef-nachfrage.mjs -- 17/0, mit sechs Gegenproben und
beiden Richtungen (wer fragt, laedt die Datei; wer nie fragt, laedt
sie nicht -- sonst truege die Anmeldewand 4,8 KB fuer nichts).
pruef-meldungen 8/0, pruef-css-klassen gruen, pruef-struktur gruen,
pruef-leistung gruen.
This commit is contained in:
@@ -949,11 +949,14 @@
|
||||
if (s.darf_aendern) {
|
||||
const knoepfe = el('div', 'k-serie__knoepfe');
|
||||
knoepfe.append(tuKnopf(s.aktiv ? 'abstellen' : 'wieder starten', async () => {
|
||||
if (s.aktiv && !confirm(
|
||||
'Wiederholung „' + s.titel + '" abstellen?\n\n'
|
||||
+ 'Kommende Termine, die noch niemand angefasst hat, werden aus dem '
|
||||
+ 'Kalender genommen. Vergangene und bearbeitete Termine bleiben stehen.\n\n'
|
||||
+ 'Du kannst sie jederzeit wieder starten.')) return;
|
||||
if (s.aktiv && !await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" abstellen?',
|
||||
was: 'Kommende Termine, die noch niemand angefasst hat, werden aus '
|
||||
+ 'dem Kalender genommen.',
|
||||
bleibt: 'Vergangene und bearbeitete Termine bleiben stehen. Du kannst '
|
||||
+ 'die Wiederholung jederzeit wieder starten.',
|
||||
ja: 'Abstellen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/serien/' + s.id, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -963,10 +966,14 @@
|
||||
await laden();
|
||||
}));
|
||||
knoepfe.append(tuKnopf('löschen', async () => {
|
||||
if (!confirm('Wiederholung „' + s.titel + '" ganz löschen?\n\n'
|
||||
+ 'Die Regel ist damit weg. Kommende, unangetastete Termine werden '
|
||||
+ 'entfernt; vergangene und bearbeitete bleiben als normale Termine '
|
||||
+ 'stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" ganz löschen?',
|
||||
was: 'Die Regel ist damit weg. Kommende, noch unangetastete Termine '
|
||||
+ 'werden entfernt.',
|
||||
bleibt: 'Vergangene und schon bearbeitete Termine bleiben als '
|
||||
+ 'normale Termine stehen.',
|
||||
endgueltig: true, ja: 'Wiederholung löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/serien/' + s.id, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
@@ -1221,12 +1228,20 @@
|
||||
dass NUR dieser eine Tag entfällt. Sonst löscht jemand ihn
|
||||
in der Annahme, die Wiederholung sei damit abgestellt --
|
||||
und wundert sich nächste Woche. */
|
||||
const frage = e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?\n\n'
|
||||
+ 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
|
||||
+ 'den Schalter unter „Läuft von allein" benutzen.'
|
||||
: 'Termin „' + e.titel + '" löschen?';
|
||||
if (!confirm(frage)) return;
|
||||
|
||||
if (!await frageNach({
|
||||
titel: e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?'
|
||||
: 'Termin „' + e.titel + '" löschen?',
|
||||
was: e.serie_id
|
||||
? 'Nur dieser eine Tag entfällt.'
|
||||
: 'Der Termin verschwindet aus dem Kalender.',
|
||||
bleibt: e.serie_id
|
||||
? 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
|
||||
+ 'den Schalter unter „Läuft von allein" benutzen.'
|
||||
: 'Alle anderen Termine bleiben stehen.',
|
||||
endgueltig: true, ja: e.serie_id ? 'Diesen Tag streichen' : 'Löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/termine/' + e.id, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
|
||||
Reference in New Issue
Block a user