export const WEEK_LENGTH_DAYS = 7; export function startOfWeek(date) { const copy = new Date(date.getFullYear(), date.getMonth(), date.getDate()); const day = copy.getDay() || 7; copy.setDate(copy.getDate() - day + 1); return copy; } export function parseIsoDate(value) { const [year, month, day] = String(value || '').split('-').map(Number); return year && month && day ? new Date(year, month - 1, day) : new Date(); } export function addDays(date, days) { const copy = new Date(date); copy.setDate(copy.getDate() + days); return copy; } export function toIsoDate(date) { return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } export function formatDate(date) { return date.toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }); } export function formatIsoDate(value) { const [year, month, day] = String(value || '').split('-'); return year && month && day ? `${day}.${month}.${year}` : '—'; } export function dayName(date) { const value = date.toLocaleDateString('ru-RU', { weekday: 'long' }); return value.charAt(0).toUpperCase() + value.slice(1); } export function trimTime(value) { return String(value || '').slice(0, 5); } export function weekDates(weekStart) { return Array.from({ length: WEEK_LENGTH_DAYS }, (_, index) => addDays(weekStart, index)); } export function weekEndIso(weekStart) { return toIsoDate(addDays(weekStart, WEEK_LENGTH_DAYS - 1)); } export function formatWeekLabel(weekStart) { return `${formatDate(weekStart)} - ${formatDate(addDays(weekStart, WEEK_LENGTH_DAYS - 1))}`; }