+
+
+ handleChange('totalTime', value)}
+ disabled={formData.isComment}
+ />
+
+
+ {!formData.isComment && (
+ handleChange('supporters', list)}
+ excludeUserId={user?.$id}
+ minutes={formData.totalTime}
+ employeesState={employeesState}
+ />
+ )}
+
+
+
+
)
}
-
diff --git a/src/components/OwnSupportModal.jsx b/src/components/OwnSupportModal.jsx
index 3be0aa3..b55230e 100644
--- a/src/components/OwnSupportModal.jsx
+++ b/src/components/OwnSupportModal.jsx
@@ -1,7 +1,8 @@
-import { useState } from 'react'
-import { FaTimes } from 'react-icons/fa'
+import { useEffect, useRef, useState } from 'react'
+import { useScrollIntoView } from '../hooks/useScrollIntoView'
import { parseSupporters, supportMinutes } from '../lib/support'
import { stepLabel } from '../lib/timeSteps'
+import { Button, Dialog, Field } from './ui'
/* "Ich habe unterstuetzt": die eigene Unterstuetzung bei einem fremden Arbeitsblatt
eintragen, aendern oder entfernen. Andere Eintraege und die Zeiten bleiben unberuehrt. */
@@ -10,6 +11,14 @@ export default function OwnSupportModal({ worksheet, currentUserId, onClose, onS
const [task, setTask] = useState(existing?.task || '')
const [saving, setSaving] = useState(false)
const [error, setError] = useState('')
+ const taskRef = useRef(null)
+ const errorRef = useRef(null)
+ useScrollIntoView(errorRef, error)
+
+ // Der Dialog setzt den Fokus beim Oeffnen auf sich selbst; dieser Effekt laeuft danach (Kinder vor Eltern) und holt ihn ins Feld
+ useEffect(() => {
+ taskRef.current?.focus()
+ }, [])
const save = async (value) => {
setSaving(true)
@@ -33,48 +42,48 @@ export default function OwnSupportModal({ worksheet, currentUserId, onClose, onS
}
return (
-
-
-
-
-
-
Unterstützung eintragen
-
- WSID {worksheet.wsid} · {worksheet.employeeName}
- Dir werden {stepLabel(supportMinutes(worksheet.totalTime))} angerechnet.
-
+
-
+
+ setTask(e.target.value)}
+ />
+
+
)
}
diff --git a/src/components/SupportersEditor.jsx b/src/components/SupportersEditor.jsx
index 1f671c5..d25329a 100644
--- a/src/components/SupportersEditor.jsx
+++ b/src/components/SupportersEditor.jsx
@@ -1,14 +1,16 @@
import { useState } from 'react'
-import { FaTimes } from 'react-icons/fa'
-import { useEmployees } from '../hooks/useEmployees'
import { supportMinutes } from '../lib/support'
import { stepLabel } from '../lib/timeSteps'
+// Stabile Vorgabe, damit `choices` und die Effekte der Aufrufer nicht bei jedem Render neu entstehen
+const NO_EMPLOYEES_STATE = { employees: [], loading: false, error: null }
+
/* Haken "Unterstuetzung" mit Zeilen Mitarbeiter + "Wobei?". Nur fuer die Person, die das
Arbeitsblatt angelegt hat (sie selbst steht nicht in der Auswahl). Die Mitarbeiterliste
- laedt erst hier, damit nicht jede Ticket-Karte sie abruft. */
-export default function SupportersEditor({ value, onChange, excludeUserId, minutes }) {
- const { employees, loading, error } = useEmployees()
+ kommt von der Seite (employeesState = Werte von useEmployees, dort einmal geladen),
+ der Editor ruft den Hook nicht selbst auf. */
+export default function SupportersEditor({ value, onChange, excludeUserId, minutes, employeesState = NO_EMPLOYEES_STATE }) {
+ const { employees, loading, error } = employeesState
const [enabled, setEnabled] = useState(value.length > 0)
const perPerson = stepLabel(supportMinutes(minutes))
const choices = employees.filter((e) => e.userId && e.userId !== excludeUserId)
@@ -29,20 +31,20 @@ export default function SupportersEditor({ value, onChange, excludeUserId, minut
}
return (
-