// assets/scripts/duration.js export const DURATION_CONFIG = { roundToQuarter: true, }; export function parseDuration(input) { input = String(input).trim(); if (!input || input === '0' || input === '0:00') return 0; // "8 12" -> von 8 bis 12 Uhr if (/^\d+\s+\d+$/.test(input)) { const parts = input.split(/\s+/).map(Number); return Math.max(0, (parts[1] - parts[0]) * 60); } // "1:30" -> Stunden:Minuten if (input.includes(':')) { const [h, m] = input.split(':').map(s => parseInt(s, 10) || 0); return h * 60 + m; } // "1,75" oder "1.75" -> Dezimalstunden if (input.includes(',') || input.includes('.')) { const hours = parseFloat(input.replace(',', '.')); return isNaN(hours) ? 0 : Math.round(hours * 60); } // "2" -> 2 Stunden const hours = parseInt(input, 10); return isNaN(hours) ? 0 : hours * 60; } export function roundToQuarter(minutes) { if (!DURATION_CONFIG.roundToQuarter) return minutes; if (minutes === 0) return 0; const interval = window.TT?.trackingInterval ?? window.Report?.trackingInterval ?? 15; return Math.ceil(minutes / interval) * interval; } export function formatMinutes(minutes) { const h = Math.floor(minutes / 60); const m = minutes % 60; return `${h}:${String(m).padStart(2, '0')}`; } export function validateDuration(minutes) { if (minutes > 1440) return { status: 'error' }; if (minutes > 480) return { status: 'warn' }; return { status: 'ok' }; } export function parseAndValidate(raw) { const minutes = roundToQuarter(parseDuration(raw)); const formatted = formatMinutes(minutes); if (minutes === 0) return { minutes, formatted, error: 'errorZeroDuration' }; const v = validateDuration(minutes); if (v.status === 'error') return { minutes, formatted, error: 'errorDurationTooLong' }; if (v.status === 'warn') return { minutes, formatted, warn: 'warnDurationLong' }; return { minutes, formatted }; } export function initDurationBlurHandler() { document.addEventListener('blur', e => { if (!(e.target instanceof Element)) return; if (!e.target.matches('#create-duration, .edit-duration')) return; const minutes = roundToQuarter(parseDuration(e.target.value)); e.target.value = formatMinutes(minutes); }, true); }