From 2d4e569cc3bdbb948bf551d9c9344a0c6767b590 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 27 Sep 2026 14:29:36 +0000 Subject: [PATCH] =?UTF-8?q?Arbeitsbl=C3=A4tter:=20Git-Push=20nach=20dem=20?= =?UTF-8?q?Nachtragen=20gr=C3=BCn,=20Kommentare=20blau?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Git-Pushes bleiben orange mit "Zeit offen", bis Beginn und Minuten nachgetragen sind; danach grün mit "Zeit eingetragen". - Kommentare sind blau statt grün, damit Grün nur noch "erledigt" heißt. - Hinweise im farbigen Kopf in weißer Schrift (vorher kaum lesbar). - Pro Ticket werden alle Arbeitsblätter geladen (Appwrite lieferte ohne limit nur 25), zugeklappte Ticketkarten laden gar keine mehr. Co-Authored-By: Claude Opus 5.5 --- src/components/WorksheetList.jsx | 55 +++++++++++++++++--------------- src/hooks/useWorksheets.js | 16 ++++++---- src/lib/ticketForm.js | 7 ++++ 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/components/WorksheetList.jsx b/src/components/WorksheetList.jsx index 0d9e365..0f5a31f 100644 --- a/src/components/WorksheetList.jsx +++ b/src/components/WorksheetList.jsx @@ -1,6 +1,17 @@ import { useState } from 'react' -import { FaClock, FaUser, FaExchangeAlt, FaComment, FaChevronDown, FaChevronUp, FaPen } from 'react-icons/fa' -import { serviceTypeLabel, needsTimeEntry } from '../lib/ticketForm' +import { FaClock, FaUser, FaExchangeAlt, FaComment, FaChevronDown, FaChevronUp, FaPen, FaCheck } from 'react-icons/fa' +import { serviceTypeLabel, needsTimeEntry, worksheetTone } from '../lib/ticketForm' + +// Kopffarbe je Zustand (worksheetTone): orange = Git-Zeit fehlt, gruen = Git-Zeit eingetragen +const TONES = { + 'git-open': { border: '#f97316', base: 'linear-gradient(135deg, #f97316 0%, #ea580c 100%)', hover: 'linear-gradient(135deg, #ea580c 0%, #c2410c 100%)' }, + 'git-done': { border: '#10b981', base: 'linear-gradient(135deg, #10b981 0%, #059669 100%)', hover: 'linear-gradient(135deg, #059669 0%, #047857 100%)' }, + comment: { border: '#3b82f6', base: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)', hover: 'linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%)' }, + work: { border: '#4a5568', base: 'linear-gradient(135deg, #4a5568 0%, #2d3748 100%)', hover: 'linear-gradient(135deg, #2d3748 0%, #1a202c 100%)' }, +} + +// Hinweise im farbigen Kopf: mit der grauen Badge-Schrift waeren sie kaum lesbar +const headerBadgeStyle = { background: 'rgba(255,255,255,0.3)', color: 'white', marginLeft: '8px' } const headerButtonStyle = { background: 'rgba(255,255,255,0.25)', @@ -61,13 +72,15 @@ export default function WorksheetList({ worksheets, totalTime, loading, onEditTi {worksheets.map((ws, index) => { const isExpanded = expandedWorksheets[ws.wsid] || false const isGit = ws.serviceType === 'GIT' + const tone = worksheetTone(ws) + const colors = TONES[tone] return (
{ @@ -82,11 +95,7 @@ export default function WorksheetList({ worksheets, totalTime, loading, onEditTi className="card-header d-flex justify-content-between align-items-center py-3" onClick={() => toggleWorksheet(ws.wsid)} style={{ - background: isGit - ? 'linear-gradient(135deg, #f97316 0%, #ea580c 100%)' - : ws.isComment - ? 'linear-gradient(135deg, #10b981 0%, #059669 100%)' - : 'linear-gradient(135deg, #4a5568 0%, #2d3748 100%)', + background: colors.base, color: 'white', border: 'none', cursor: 'pointer', @@ -94,18 +103,10 @@ export default function WorksheetList({ worksheets, totalTime, loading, onEditTi transition: 'background 0.2s ease' }} onMouseEnter={(e) => { - e.currentTarget.style.background = isGit - ? 'linear-gradient(135deg, #ea580c 0%, #c2410c 100%)' - : ws.isComment - ? 'linear-gradient(135deg, #059669 0%, #047857 100%)' - : 'linear-gradient(135deg, #2d3748 0%, #1a202c 100%)' + e.currentTarget.style.background = colors.hover }} onMouseLeave={(e) => { - e.currentTarget.style.background = isGit - ? 'linear-gradient(135deg, #f97316 0%, #ea580c 100%)' - : ws.isComment - ? 'linear-gradient(135deg, #10b981 0%, #059669 100%)' - : 'linear-gradient(135deg, #4a5568 0%, #2d3748 100%)' + e.currentTarget.style.background = colors.base }} >
@@ -117,19 +118,20 @@ export default function WorksheetList({ worksheets, totalTime, loading, onEditTi
WSID {ws.wsid} {ws.isComment && !isGit && ( - + Kommentar )} - {needsTimeEntry(ws) && ( - + {tone === 'git-open' && ( + Zeit offen )} + {tone === 'git-done' && ( + + Zeit eingetragen + + )} {ws.countsToPlan && !ws.isComment && ( {formatTime(ws.totalTime)}
)} - {serviceTypeLabel(ws.serviceType)}
diff --git a/src/hooks/useWorksheets.js b/src/hooks/useWorksheets.js index 4f08761..3777d9a 100644 --- a/src/hooks/useWorksheets.js +++ b/src/hooks/useWorksheets.js @@ -150,8 +150,14 @@ export function useWorksheets(woid = null) { const [error, setError] = useState(null) const fetchWorksheets = useCallback(async () => { + // Zugeklappte Tickets uebergeben keine WOID - dann gibt es nichts zu laden + if (!woid) { + setWorksheets([]) + setLoading(false) + return + } setLoading(true) - + if (DEMO_MODE) { // Filter demo data by WOID if provided const filtered = woid @@ -163,12 +169,8 @@ export function useWorksheets(woid = null) { } try { - const queries = [Query.orderDesc('$createdAt')] - - // Filter by WOID if provided - if (woid) { - queries.push(Query.equal('woid', woid)) - } + // Ohne limit liefert Appwrite nur 25 Eintraege, ein Ticket sammelt aber viele Git-Pushes + const queries = [Query.orderDesc('$createdAt'), Query.equal('woid', woid), Query.limit(5000)] if (import.meta.env.DEV) { console.log('📋 Fetching worksheets:') diff --git a/src/lib/ticketForm.js b/src/lib/ticketForm.js index 54f7eea..070ccd2 100644 --- a/src/lib/ticketForm.js +++ b/src/lib/ticketForm.js @@ -33,6 +33,13 @@ export function needsTimeEntry(worksheet) { return isGitWorksheet(worksheet) && (!worksheet.startTime || !Number(worksheet.totalTime)) } +// Farbe in der Arbeitsblatt-Liste: Git-Pushes sind orange, bis ihre Zeit nachgetragen +// ist, danach gruen. Kommentare blau, normale Arbeitszeit grau. +export function worksheetTone(worksheet) { + if (isGitWorksheet(worksheet)) return needsTimeEntry(worksheet) ? 'git-open' : 'git-done' + return worksheet?.isComment ? 'comment' : 'work' +} + const sameName = (a, b) => String(a || '').trim().toLowerCase() === String(b || '').trim().toLowerCase() /* Wer hat das Arbeitsblatt erstellt? Normale Eintraege tragen die Appwrite-ID des