Workers P3-Endprüfung W5: Reiter Erledigt zeigt Ergebnis, Person und Zeitpunkt
Abgeschlossene Zeilen tragen jetzt ein Badge (Gesendet grün, Verworfen/Erledigt neutral) und die Zeile "Gesendet von Anna · vor 2 Std." aus doneBy/doneAt statt des Alters ab Anlage. Menschen (mensch:<id>) werden über die Mitarbeiterliste aufgelöst, ein Worker wie max über das Rollen-Register als "Max (automatisch)" und nie als "Kollege". Offene Zeilen bleiben unverändert. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
62e7994508
commit
4ec3022df4
4 files changed
+116
-1
No files matched your search
@@ -126,11 +126,13 @@ function PultRow({ api, item, row, text, onText, refresh, onFinished, onDetails
|
||||
<Badge tone="blue">{row.kindLabel}</Badge>
|
||||
<strong className="wk-pult-title">{row.title}</strong>
|
||||
{row.stale.stale && <Badge tone="orange">{row.stale.label}</Badge>}
|
||||
{row.statusLabel && <Badge tone={row.statusTone}>{row.statusLabel}</Badge>}
|
||||
</div>
|
||||
<div className="wk-pult-meta">
|
||||
{row.stale.soon && <span>{row.stale.label}</span>}
|
||||
{row.claimedByLabel && <span>übernommen von {row.claimedByLabel}</span>}
|
||||
{row.ageLabel && <span>{row.ageLabel}</span>}
|
||||
{/* Abgeschlossen: was daraus wurde, wer es tat und wann (das Alter ab Anlage führte dort in die Irre) */}
|
||||
{row.doneLine ? <span>{row.doneLine}</span> : row.ageLabel && <span>{row.ageLabel}</span>}
|
||||
{info && <span>{info}</span>}
|
||||
{row.sourceHref && (
|
||||
<a className="link" href={row.sourceHref} target="_blank" rel="noopener noreferrer">Anzeige öffnen</a>
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
// Kein React, kein Appwrite, kein window/document beim Import: unter Node testbar (loadModule). Nichts hier versendet etwas:
|
||||
// der Mensch schickt die Antwort selbst ab (Plattform oder eigenes Mailprogramm) und markiert sie danach als gesendet.
|
||||
|
||||
import { roleOf } from './workersRoster'
|
||||
|
||||
const MINUTE_MS = 60 * 1000
|
||||
const HOUR_MS = 60 * MINUTE_MS
|
||||
const DAY_MS = 24 * HOUR_MS
|
||||
@@ -33,6 +35,13 @@ const KOLLEGE = 'Kollege'
|
||||
const WARTEND = ['offen', 'in_arbeit'] // der Dienst setzt nur diese beiden auf veraltet
|
||||
const BEARBEITBAR = ['offen', 'in_arbeit', 'veraltet'] // in diesen Status kann ein Mensch den Eintrag abschließen
|
||||
|
||||
// Abgeschlossene Einträge (Reiter „Erledigt“): Bezeichnung und Badge-Ton. gesendet fällt grün auf, verworfen und erledigt bleiben neutral.
|
||||
const DONE_VIEW = Object.freeze({
|
||||
gesendet: Object.freeze({ label: 'Gesendet', tone: 'green' }),
|
||||
verworfen: Object.freeze({ label: 'Verworfen', tone: 'muted' }),
|
||||
erledigt: Object.freeze({ label: 'Erledigt', tone: 'muted' }),
|
||||
})
|
||||
|
||||
const MAIL_SUBJECT_MAX = 78
|
||||
const MAIL_BODY_MAX = 1800
|
||||
|
||||
@@ -117,6 +126,19 @@ export function employeeName(by, employees) {
|
||||
return listedName(by, employees) ?? KOLLEGE
|
||||
}
|
||||
|
||||
/**
|
||||
* Wer einen Eintrag abgeschlossen hat, als Satzteil: `mensch:<userId>` über die Mitarbeiterliste („von Anna“, unbekannt „von Kollege“),
|
||||
* eine Kennung wie `max` (Worker, der automatisch gesendet hat, P4) mit dem Namen aus dem Rollen-Register („von Max (automatisch)“),
|
||||
* jede andere nichtleere Kennung „automatisch“. Ohne doneBy bleibt der Satzteil leer. Wichtig: ein Worker darf nie als „Kollege“ erscheinen,
|
||||
* deshalb geht doneBy nicht durch listedName (das jede Kennung ohne Präfix als Nutzer-ID liest).
|
||||
*/
|
||||
function doneByPhrase(by, employees) {
|
||||
if (typeof by !== 'string' || by === '') return ''
|
||||
if (by.startsWith(MENSCH)) return `von ${employeeName(by, employees)}`
|
||||
const role = roleOf(by)
|
||||
return role ? `von ${role.name} (automatisch)` : 'automatisch'
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeilenmodell eines Pult-Eintrags (GET /pult: Eintrag plus `prospect`). me = { id, name } des Angemeldeten, employees = Mitarbeiterliste.
|
||||
* Rechte nach Status (offen, in_arbeit, veraltet sind bearbeitbar) und Art (nur Antwort-Arten sind sendbar); die Zeile sperrt
|
||||
@@ -143,12 +165,23 @@ export function rowModel(item, { me, nowMs, employees }) {
|
||||
mail = mailtoHref({ to: prospect.email, subject: prospect.name ? `Re: ${prospect.name}` : '', body: draft })
|
||||
}
|
||||
|
||||
// Nur abgeschlossene Einträge: Ergebnis, wer es getan hat und wann (doneAt). Sonst leer, die Zeile zeigt dann das Alter ab Anlage.
|
||||
const doneView = Object.hasOwn(DONE_VIEW, item.status) ? DONE_VIEW[item.status] : null
|
||||
const doneByLabel = doneView ? doneByPhrase(item.doneBy, employees) : ''
|
||||
const doneAgeLabel = doneView ? ageLabel(item.doneAt, nowMs) : ''
|
||||
const doneLine = doneView ? [[doneView.label, doneByLabel].filter(Boolean).join(' '), doneAgeLabel].filter(Boolean).join(' · ') : ''
|
||||
|
||||
return {
|
||||
id: item.$id,
|
||||
kind: item.kind,
|
||||
kindLabel: PULT_KIND_LABELS[item.kind] ?? item.kind,
|
||||
title: item.title,
|
||||
ageLabel: ageLabel(item.createdAt, nowMs),
|
||||
statusLabel: doneView ? doneView.label : '',
|
||||
statusTone: doneView ? doneView.tone : '',
|
||||
doneByLabel,
|
||||
doneAgeLabel,
|
||||
doneLine,
|
||||
stale: staleView(item, nowMs),
|
||||
canClaim: item.status === 'offen' || item.status === 'veraltet',
|
||||
canSend: sendable && editable,
|
||||
|
||||
Reference in new issue
Block a user