Unterstützung: Anzeige in Arbeitsblatt-Liste und Gesamtzeit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bc9d673ff7
commit
24e4f054c4
3 files changed
+23
-5
No files matched your search
@@ -2,7 +2,7 @@ import { useState } from 'react'
|
|||||||
import { FaClock, FaUser, FaExchangeAlt, FaComment, FaChevronDown, FaChevronUp, FaPen, FaCheck, FaHandsHelping } from 'react-icons/fa'
|
import { FaClock, FaUser, FaExchangeAlt, FaComment, FaChevronDown, FaChevronUp, FaPen, FaCheck, FaHandsHelping } from 'react-icons/fa'
|
||||||
import { serviceTypeLabel, needsTimeEntry, worksheetTone } from '../lib/ticketForm'
|
import { serviceTypeLabel, needsTimeEntry, worksheetTone } from '../lib/ticketForm'
|
||||||
import { statusLabel } from '../lib/ticketStatus'
|
import { statusLabel } from '../lib/ticketStatus'
|
||||||
import { parseSupporters } from '../lib/support'
|
import { parseSupporters, supportMinutes, firstName } from '../lib/support'
|
||||||
|
|
||||||
// Kopffarbe je Zustand (worksheetTone): orange = Git-Zeit fehlt, gruen = Git-Zeit eingetragen
|
// Kopffarbe je Zustand (worksheetTone): orange = Git-Zeit fehlt, gruen = Git-Zeit eingetragen
|
||||||
const TONES = {
|
const TONES = {
|
||||||
@@ -76,6 +76,7 @@ export default function WorksheetList({ worksheets, totalTime, loading, onToggle
|
|||||||
const isGit = ws.serviceType === 'GIT'
|
const isGit = ws.serviceType === 'GIT'
|
||||||
const tone = worksheetTone(ws)
|
const tone = worksheetTone(ws)
|
||||||
const colors = TONES[tone]
|
const colors = TONES[tone]
|
||||||
|
const supporters = ws.isComment ? [] : parseSupporters(ws.supporters)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={ws.$id} className="timeline-item mb-4" style={{
|
<div key={ws.$id} className="timeline-item mb-4" style={{
|
||||||
@@ -134,6 +135,11 @@ export default function WorksheetList({ worksheets, totalTime, loading, onToggle
|
|||||||
<FaCheck className="me-1" /> Zeit eingetragen
|
<FaCheck className="me-1" /> Zeit eingetragen
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
{supporters.length > 0 && (
|
||||||
|
<span className="badge ms-2" title="Weitere Personen haben unterstützt" style={headerBadgeStyle}>
|
||||||
|
+{supporters.length} Unterstützung
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
{ws.countsToPlan && !ws.isComment && (
|
{ws.countsToPlan && !ws.isComment && (
|
||||||
<span className="badge ms-2" title="Wird vom Stundenguthaben des Wartungs-Abos abgezogen" style={{ ...headerBadgeStyle, background: '#9d3dfe' }}>
|
<span className="badge ms-2" title="Wird vom Stundenguthaben des Wartungs-Abos abgezogen" style={{ ...headerBadgeStyle, background: '#9d3dfe' }}>
|
||||||
Abo-Stunden
|
Abo-Stunden
|
||||||
@@ -255,6 +261,17 @@ export default function WorksheetList({ worksheets, totalTime, loading, onToggle
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Unterstuetzung: je Person die Haelfte der Arbeitszeit, aufgerundet auf 15 Minuten */}
|
||||||
|
{supporters.length > 0 && (
|
||||||
|
<div className="mb-3 worksheet-supporters">
|
||||||
|
{supporters.map((sup) => (
|
||||||
|
<div key={sup.employeeId} style={{ fontSize: '0.9rem', color: 'var(--text-muted)' }}>
|
||||||
|
↳ Unterstützung {firstName(sup.name)} · {sup.task} · {formatTime(supportMinutes(ws.totalTime))}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Service Type */}
|
{/* Service Type */}
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<span className="badge px-3 py-2" style={{
|
<span className="badge px-3 py-2" style={{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { needsTimeEntry } from '../lib/ticketForm'
|
import { needsTimeEntry } from '../lib/ticketForm'
|
||||||
|
import { worksheetMinutes } from '../lib/support'
|
||||||
|
|
||||||
const formatTime = (minutes) => {
|
const formatTime = (minutes) => {
|
||||||
const hours = Math.floor(minutes / 60)
|
const hours = Math.floor(minutes / 60)
|
||||||
@@ -6,12 +7,12 @@ const formatTime = (minutes) => {
|
|||||||
return hours > 0 ? `${hours}h ${mins}min` : `${mins}min`
|
return hours > 0 ? `${hours}h ${mins}min` : `${mins}min`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eine Zeile ueber der Arbeitsblatt-Liste: Arbeitszeit, Anzahl, offene Git-Zeiten
|
// Eine Zeile ueber der Arbeitsblatt-Liste: Arbeitszeit (inkl. Unterstuetzung), Anzahl, offene Git-Zeiten
|
||||||
export default function WorksheetSummary({ worksheets }) {
|
export default function WorksheetSummary({ worksheets }) {
|
||||||
if (!worksheets || worksheets.length === 0) return null
|
if (!worksheets || worksheets.length === 0) return null
|
||||||
const minutes = worksheets
|
const minutes = worksheets
|
||||||
.filter((ws) => !ws.isComment)
|
.filter((ws) => !ws.isComment)
|
||||||
.reduce((sum, ws) => sum + (Number(ws.totalTime) || 0), 0)
|
.reduce((sum, ws) => sum + worksheetMinutes(ws), 0)
|
||||||
const open = worksheets.filter(needsTimeEntry).length
|
const open = worksheets.filter(needsTimeEntry).length
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { useState, useEffect, useCallback } from 'react'
|
|||||||
import { databases, DATABASE_ID, COLLECTIONS, Query, ID } from '../lib/appwrite'
|
import { databases, DATABASE_ID, COLLECTIONS, Query, ID } from '../lib/appwrite'
|
||||||
import { canEditWorksheetTimes, isGitWorksheet } from '../lib/ticketForm'
|
import { canEditWorksheetTimes, isGitWorksheet } from '../lib/ticketForm'
|
||||||
import { roundUpToStep, isValidStep } from '../lib/timeSteps'
|
import { roundUpToStep, isValidStep } from '../lib/timeSteps'
|
||||||
import { parseSupporters, serializeSupporters, canAddOwnSupport, upsertSupporter, removeSupporter } from '../lib/support'
|
import { parseSupporters, serializeSupporters, canAddOwnSupport, upsertSupporter, removeSupporter, worksheetMinutes } from '../lib/support'
|
||||||
|
|
||||||
const STEP_ERROR = 'Die Arbeitszeit muss in 15-Minuten-Schritten angegeben werden.'
|
const STEP_ERROR = 'Die Arbeitszeit muss in 15-Minuten-Schritten angegeben werden.'
|
||||||
|
|
||||||
@@ -307,7 +307,7 @@ export function useWorksheets(woid = null) {
|
|||||||
const getTotalTime = useCallback(() => {
|
const getTotalTime = useCallback(() => {
|
||||||
return worksheets
|
return worksheets
|
||||||
.filter(ws => !ws.isComment)
|
.filter(ws => !ws.isComment)
|
||||||
.reduce((sum, ws) => sum + (ws.totalTime || 0), 0)
|
.reduce((sum, ws) => sum + worksheetMinutes(ws), 0)
|
||||||
}, [worksheets])
|
}, [worksheets])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in new issue
Block a user