/*! * chartjs-adapter-date-fns v3.0.0 - Lightweight date adapter for Chart.js * Uses native Date parsing (no external dependencies) */ (function() { 'use strict'; const FORMATS = { datetime: 'MMM d, yyyy, h:mm:ss a', millisecond: 'h:mm:ss.SSS a', second: 'h:mm:ss a', minute: 'h:mm a', hour: 'ha', day: 'MMM d', week: 'PP', month: 'MMM yyyy', quarter: "'Q'Q - yyyy", year: 'yyyy' }; function formatDate(date, fmt) { const d = new Date(date); if (isNaN(d.getTime())) return ''; const h = d.getHours(); const m = d.getMinutes(); const s = d.getSeconds(); const ms = d.getMilliseconds(); const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; const ampm = h >= 12 ? 'PM' : 'AM'; const h12 = h % 12 || 12; switch(fmt) { case 'h:mm:ss.SSS a': return `${h12}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')}.${String(ms).padStart(3,'0')} ${ampm}`; case 'h:mm:ss a': return `${h12}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')} ${ampm}`; case 'h:mm a': return `${h12}:${String(m).padStart(2,'0')} ${ampm}`; case 'ha': return `${h12}${ampm}`; case 'MMM d': return `${months[d.getMonth()]} ${d.getDate()}`; case 'MMM yyyy': return `${months[d.getMonth()]} ${d.getFullYear()}`; case 'yyyy': return `${d.getFullYear()}`; default: return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}, ${h12}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')} ${ampm}`; } } const UNITS = ['millisecond','second','minute','hour','day','week','month','quarter','year']; const UNIT_MS = { millisecond: 1, second: 1000, minute: 60000, hour: 3600000, day: 86400000, week: 604800000, month: 2592000000, quarter: 7776000000, year: 31536000000 }; if (typeof Chart !== 'undefined' && Chart._adapters && Chart._adapters._date) { const adapter = Chart._adapters._date; adapter.override({ _id: 'date-fns-lite', formats: function() { return FORMATS; }, parse: function(value) { if (value === null || value === undefined) return null; if (typeof value === 'number') return value; const d = new Date(value); return isNaN(d.getTime()) ? null : d.getTime(); }, format: function(time, fmt) { return formatDate(time, fmt); }, add: function(time, amount, unit) { const d = new Date(time); switch(unit) { case 'millisecond': d.setTime(d.getTime() + amount); break; case 'second': d.setSeconds(d.getSeconds() + amount); break; case 'minute': d.setMinutes(d.getMinutes() + amount); break; case 'hour': d.setHours(d.getHours() + amount); break; case 'day': d.setDate(d.getDate() + amount); break; case 'week': d.setDate(d.getDate() + amount * 7); break; case 'month': d.setMonth(d.getMonth() + amount); break; case 'quarter': d.setMonth(d.getMonth() + amount * 3); break; case 'year': d.setFullYear(d.getFullYear() + amount); break; } return d.getTime(); }, diff: function(max, min, unit) { return (max - min) / (UNIT_MS[unit] || 1); }, startOf: function(time, unit) { const d = new Date(time); switch(unit) { case 'second': d.setMilliseconds(0); break; case 'minute': d.setSeconds(0,0); break; case 'hour': d.setMinutes(0,0,0); break; case 'day': d.setHours(0,0,0,0); break; case 'week': d.setHours(0,0,0,0); d.setDate(d.getDate() - d.getDay()); break; case 'month': d.setHours(0,0,0,0); d.setDate(1); break; case 'quarter': d.setHours(0,0,0,0); d.setMonth(d.getMonth() - d.getMonth() % 3, 1); break; case 'year': d.setHours(0,0,0,0); d.setMonth(0,1); break; } return d.getTime(); }, endOf: function(time, unit) { const d = new Date(time); switch(unit) { case 'second': d.setMilliseconds(999); break; case 'minute': d.setSeconds(59,999); break; case 'hour': d.setMinutes(59,59,999); break; case 'day': d.setHours(23,59,59,999); break; case 'month': d.setMonth(d.getMonth()+1,0); d.setHours(23,59,59,999); break; case 'year': d.setMonth(11,31); d.setHours(23,59,59,999); break; } return d.getTime(); } }); } })();