Tickets: Anzeige-Helfer fuer Termin, Faellig, Zustaendig und Status-Auswahl (Altdaten sicher)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
54fc44ed11
commit
32746727ed
4 files changed
+145
-1
No files matched your search
@@ -32,6 +32,14 @@ export function statusLabel(status) {
|
||||
return LABELS[status] || status
|
||||
}
|
||||
|
||||
// Auswahl fuer das Status-Feld: die sechs waehlbaren Werte, ein alter Wert des Tickets bleibt zusaetzlich sichtbar
|
||||
export function statusSelectOptions(current) {
|
||||
const options = TICKET_STATUSES.map((s) => ({ ...s }))
|
||||
const value = current || 'Open'
|
||||
if (!options.some((o) => o.value === value)) options.push({ value, label: statusLabel(value) })
|
||||
return options
|
||||
}
|
||||
|
||||
// Filter: jede Gruppe fasst die gespeicherten Werte zusammen, auch die alten
|
||||
export const STATUS_GROUPS = [
|
||||
{ id: 'open', label: 'Offen', values: ['Open'] },
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/* Anzeige-Helfer der Ticketseite und -liste.
|
||||
Termin- und Faelligkeitsfelder sind Freitext aus Altdaten ("2.5.2026", "0930"): lesbare Werte
|
||||
erscheinen normalisiert, alles andere als Rohtext - nie ein Rueckfall auf das Erstellungsdatum. */
|
||||
|
||||
import { formatTime } from './planboard'
|
||||
import { isoToGermanDate, germanDateToIso } from './ticketForm'
|
||||
|
||||
const text = (value) => String(value ?? '').trim()
|
||||
|
||||
// "2.5.2026" -> "02.05.2026"; Unlesbares ("31.02.2026", ISO-Zeitstempel) bleibt als Text stehen
|
||||
export function displayDate(value) {
|
||||
return isoToGermanDate(germanDateToIso(value)) || text(value)
|
||||
}
|
||||
|
||||
// "0930" oder "9:30" -> "09:30"; Unlesbares ("2560") bleibt als Text stehen
|
||||
export function displayTime(value) {
|
||||
return formatTime(value) || text(value)
|
||||
}
|
||||
|
||||
// "02.05.2026, 09:30–10:30"; ohne Startdatum leer, das Ende steht nur mit Beginn
|
||||
export function appointmentText(ticket) {
|
||||
if (!text(ticket?.startDate)) return ''
|
||||
let out = displayDate(ticket.startDate)
|
||||
const start = displayTime(ticket.startTime)
|
||||
if (start) {
|
||||
out += ', ' + start
|
||||
const end = displayTime(ticket.endTime)
|
||||
if (end) out += '–' + end
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// "Faellig" nutzt nur die Frist, nie die Uhrzeit des Termins
|
||||
export function dueText(ticket) {
|
||||
return displayDate(ticket?.deadline)
|
||||
}
|
||||
|
||||
// Nummer: woid, sonst die letzten fuenf Zeichen der $id (wie bisher in der Karte)
|
||||
export function ticketNumber(ticket) {
|
||||
return text(ticket?.woid) || text(ticket?.$id).slice(-5)
|
||||
}
|
||||
|
||||
// Erstellzeitpunkt als Date, null wenn fehlt oder kaputt
|
||||
export function createdDate(ticket) {
|
||||
const raw = ticket?.$createdAt || ticket?.createdAt
|
||||
if (!raw) return null
|
||||
const date = new Date(raw)
|
||||
return Number.isNaN(date.getTime()) ? null : date
|
||||
}
|
||||
|
||||
// "Kenso Grimm" -> "Kenso G.", "Anna Maria Meier" -> "Anna M."
|
||||
export function shortName(name) {
|
||||
const words = text(name).split(/\s+/).filter(Boolean)
|
||||
if (words.length < 2) return words[0] || ''
|
||||
return `${words[0]} ${Array.from(words[words.length - 1])[0]}.`
|
||||
}
|
||||
|
||||
// Zustaendig in der Liste: Person aus der Mitarbeiterliste, sonst der am Ticket gespeicherte Name
|
||||
export function assigneeLabel(ticket, employees = []) {
|
||||
const id = text(ticket?.assignedTo)
|
||||
if (!id) return { text: 'Niemand', none: true }
|
||||
const employee = employees.find((e) => e.userId === id)
|
||||
return { text: shortName(employee?.displayName) || shortName(ticket.assignedName) || 'Unbekannt', none: false }
|
||||
}
|
||||
|
||||
// Auswahl "Zustaendig": der aktuelle Wert bleibt immer waehlbar, auch wenn die Person nicht (mehr) in der Liste steht
|
||||
export function assigneeOptions(ticket, employees = []) {
|
||||
const options = [{ value: '', label: 'Nicht zugewiesen' }]
|
||||
for (const e of employees) {
|
||||
if (e.userId) options.push({ value: e.userId, label: e.displayName || e.email || e.userId })
|
||||
}
|
||||
const id = text(ticket?.assignedTo)
|
||||
if (id && !options.some((o) => o.value === id)) {
|
||||
options.push({ value: id, label: text(ticket.assignedName) || 'Unbekannte Person' })
|
||||
}
|
||||
return options
|
||||
}
|
||||
Reference in new issue
Block a user