From 6eae3c4aae0eb731d4dcca743b10d85f1ba41638 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 6 Oct 2026 12:09:52 +0000 Subject: [PATCH] Design P6: E-Mail-Speicher als Tabelle, Erledigt als Textlink mit data-storage-done Kundenspalte mit Mindestbreite (col-name) und Erledigt/Bestellt ohne Umbruch, damit am Handy und bei 1440 px keine Woerter mitten im Wort brechen. Co-Authored-By: Claude Sonnet 5.5 --- src/pages/StorageTasksPage.jsx | 109 +++++++++++++++++++-------------- src/styles/global.css | 3 + 2 files changed, 66 insertions(+), 46 deletions(-) diff --git a/src/pages/StorageTasksPage.jsx b/src/pages/StorageTasksPage.jsx index 3b2c984..f240e1d 100644 --- a/src/pages/StorageTasksPage.jsx +++ b/src/pages/StorageTasksPage.jsx @@ -1,11 +1,9 @@ import { useCallback, useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { FaSpinner, FaRotateRight } from 'react-icons/fa6' -import { PageHeader, Card, Badge, Button } from '../components/ui' +import { PageHeader, Card, Badge, Button, EmptyState } from '../components/ui' import { listStorageTasks, markStorageDone } from '../lib/teamApi' -import { fmtDate, fmtDateTime } from '../lib/format' -import { changeText, failedText, isOverdue, orderedKind, partialText, scopeText, summaryText, taskText } from '../lib/storageFormat' -import '../styles/admin-areas.css' +import { fmtDateTime } from '../lib/format' +import { changeText, failedText, orderedKind, partialText, scopeText, storageDue, summaryText, taskText } from '../lib/storageFormat' // E-Mail-Speicher (Kunden -> E-Mail-Speicher): Zusatzspeicher-Aufgaben in konsoleH wie im frueheren Admin-Panel export default function StorageTasksPage() { @@ -39,57 +37,76 @@ export default function StorageTasksPage() {
{error && ( -
- {error} +
+ {error} +
)} - {!data && !error && } + {!data && !error &&
Wird geladen …
} {data && ( <> -
{summary.text}
- -
-
FälligKundeAufgabe in konsoleHBestellt
- {data.tasks.length === 0 &&
Keine offenen Speicher-Aufgaben.
} - {data.tasks.map((t) => ( -
- - {t.kind === 'einrichten' - ? <>jetzt einrichten
bestellt {fmtDateTime(t.createdAt)} - : <>zum Periodenende
{fmtDate(t.dueAt)}} -
- - {t.customerName} - {t.customerCode && <>
Kd.-Nr. {t.customerCode}} - {t.email && <>
{t.email}} -
{t.productLabel} -
- - {taskText(t)} -
{scopeText(t)} -
{changeText(t)} - {t.partial && <>
{partialText(t)}} -
- {fmtDateTime(t.createdAt)}
{orderedKind(t)}
- - - -
- ))} -
-
+

{summary.text}

+ {data.tasks.length === 0 ? ( + + ) : ( + + + + + + + + + + + {data.tasks.map((t) => { + const due = storageDue(t) + return ( + + + + + + + + ) + })} + +
FälligKundeAufgabe in konsoleHBestellt +
+ {due.label} +
{due.sub}
+
+
{t.customerName}
+ {t.customerCode &&
Kd.-Nr. {t.customerCode}
} + {t.email &&
{t.email}
} +
{t.productLabel}
+
+
{taskText(t)}
+
{scopeText(t)}
+
{changeText(t)}
+ {t.partial &&
{partialText(t)}
} +
+ {fmtDateTime(t.createdAt)} +
{orderedKind(t)}
+
+ +
+ )} {data.failed.length > 0 && ( - + {data.failed.map((f) => ( -
- {fmtDateTime(f.createdAt)} · {f.customerName} · {failedText(f)} +
+
+ {fmtDateTime(f.createdAt)} · {f.customerName} · {failedText(f)} +
))} )} -

+

Jedes Abo bringt 5 GB E-Mail-Speicher mit, jedes Zusatzpaket 5 GB dazu. „Einrichten“: Postfachgrenze in konsoleH jetzt auf den Zielwert setzen. „Zum Periodenende“: erst am genannten Tag auf den Zielwert senken. Die Grenzen gelten für den Gesamtspeicher des Kunden (5 GB + 5 GB je Paket); er verteilt ihn nach seiner Vorgabe auf seine Postfächer (§ 3 Abs. 4). Angezeigt wird die Domain der Kontakt-Adresse, eine eigene Mail-Domain ist im Portal nicht gespeichert. „Vergeben“ zählt, was konsoleH gerade hält: eine Verringerung zählt erst nach „Erledigt“. Danach „Erledigt“ drücken – der Kunde hat seine Bestätigung schon bekommen.

diff --git a/src/styles/global.css b/src/styles/global.css index e9cd89e..503b6bc 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1220,6 +1220,9 @@ div.cell-actions { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 6p /* gibt ihr die Tabelle (td bricht ueberall) fast nichts ab und "Abschluss" oder "Zurueckziehen" brechen mitten im Wort. */ .table-wrap th.col-status { min-width: 7rem; } @media (min-width: 861px) { .table-wrap th.col-status { min-width: 12rem; } } +/* E-Mail-Speicher: die Kundenspalte wird nicht schmaler als ein ganzer Name ("Physiotherapie"); die Aufgabespalte ist lang und */ +/* nimmt sonst fast die ganze Breite, und td bricht ueberall: am Handy stuende "Physiothe-rapie" in 65 px. */ +.table-wrap th.col-name { min-width: 7rem; } /* ===== ENDE Kunden-Unterseiten (P6) ===== */ /* ===== KOMPAT (bis P10) ===== */