From 8c34e932c10b46fc14fe18e40346947b4ce1c281 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 6 Oct 2026 10:15:18 +0000 Subject: [PATCH] Kunden-Reiter Funktionen als Tabelle mit Textaktionen, Bestaetigung als eigene Zeile Alle Funktionen als eine Tabelle: Projektzeile, Funktionszeilen mit Status, Ticket (ticketPath) und Textaktionen, Bestaetigung, Einbauanleitung und Zustimmung in Textform als Zeilen darunter, Webshop-Anfrage als Block unter der Tabelle. Alle .funktionen-*-Regeln aus admin-areas.css in den Block Kunden (P4), Handy mit Zweispalten-Zeilen. Co-Authored-By: Claude Sonnet 5.5 --- .../customer/CustomerFunktionen.jsx | 294 ++++++++++-------- src/components/customer/ZeitenPanel.jsx | 45 ++- src/styles/admin-areas.css | 28 +- src/styles/global.css | 50 +++ 4 files changed, 232 insertions(+), 185 deletions(-) diff --git a/src/components/customer/CustomerFunktionen.jsx b/src/components/customer/CustomerFunktionen.jsx index 4fa8e44..b5c89a9 100644 --- a/src/components/customer/CustomerFunktionen.jsx +++ b/src/components/customer/CustomerFunktionen.jsx @@ -1,6 +1,5 @@ import { Fragment, useCallback, useEffect, useRef, useState } from 'react' import { Link } from 'react-router-dom' -import { FaCheck, FaCopy, FaRotateRight, FaSpinner } from 'react-icons/fa6' import { Card, Badge, Button, EmptyState } from '../ui' import { copyText } from '../CopyableCredential' import { getFunktionen, setFeature, getTermineAnleitung, getShop, entscheideShopAnfrage } from '../../lib/teamApi' @@ -11,9 +10,9 @@ import { } from '../../lib/funktionenView' import { CHANNELS, channelLabel } from '../../lib/analyseView' import { berlinYmd, fmtDateTime } from '../../lib/format' +import { ticketPath } from '../../lib/ticketRoutes' import { zeitenStatusText, mergeTeam, abschaltMeldung } from '../../lib/zeitenView' import ZeitenPanel from './ZeitenPanel' -import '../../styles/admin-areas.css' // Reiter "Funktionen": News-Pinnwand, Terminplaner und Webshop je Projekt an/aus wie im frueheren Admin-Panel (Kundenliste, Zeile "Funktionen") const short = (text) => (text.length > 60 ? `${text.slice(0, 60)}…` : text) @@ -30,13 +29,13 @@ function SiteKey({ value }) { timer.current = setTimeout(() => setCopied(false), 1800) } return ( - - Site-Key +
+ Site-Key {value} - - +
) } @@ -52,8 +51,8 @@ function KopierKnopf({ text, label }) { timer.current = setTimeout(() => setCopied(false), 1800) } return ( - ) } @@ -78,31 +77,31 @@ function AnleitungPanel({ customerId, projectId, feature, reloadKey }) { const hindernis = hindernisText(feature.hindernis) if (fehler || !antwort) { return ( -
- {fehler ?
{fehler}
: } - {hindernis &&
{hindernis}
} - {fehler &&
} +
+ {fehler ?
{fehler}
:
Wird geladen …
} + {hindernis &&
{hindernis}
} + {fehler &&
}
) } const modell = panelModell(antwort, feature) return ( -
+
Einbauanleitung - {modell.kopf && {modell.kopf}} - {modell.ticketPfad && Zum Ticket} - + {modell.kopf && {modell.kopf}} + {antwort.ticketWoid && Zum Ticket} +
{modell.warnungen.length > 0 && ( -
    +
      {modell.warnungen.map((text, i) =>
    • {text}
    • )}
    )} - {modell.hinweis &&
    {modell.hinweis}
    } + {modell.hinweis &&
    {modell.hinweis}
    } {modell.kopien.length > 0 && ( -
    +
    {modell.kopien.map((k) => )}
    )} @@ -122,26 +121,26 @@ function TextformPanel({ funktion, feld, value, onChange, projectId, today, disa const ansicht = textformAnsicht(feld, funktion) const { label, links, vorlage } = ansicht return ( -
    -