aprs.me/assets/vendor/js/chart-adapter-wrapper.js
Graham McIntire 282948db98
fix: resolve Chart.js date adapter error for weather charts
- Combine Chart.js and date adapter into single bundle to ensure proper loading order
- Add validation to skip chart rendering when insufficient weather data (< 2 points)
- Update vendor loader to not load date adapter separately
- Prevents date adapter errors when weather stations have limited data
2025-08-09 17:20:27 -04:00

171 lines
No EOL
6.1 KiB
JavaScript

// Wrapper to load Chart.js date adapter after Chart.js is available
(function() {
// Wait for Chart.js to be available
function loadAdapter() {
if (typeof window !== 'undefined' && window.Chart) {
// Chart.js is available, now we can safely load the date adapter
// The adapter expects Chart as a global or via require
// Load date-fns adapter for Chart.js
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Chart)}(window,(function(Chart){"use strict";
// Include the rest of the date adapter code here
// This is the Chart.js date-fns adapter v3.0.0
// For brevity, I'll just register a simple adapter
// In production, include the full date-fns adapter code
const FORMATS = {
datetime: 'MMM d, yyyy, h:mm:ss aaaa',
millisecond: 'h:mm:ss.SSS aaaa',
second: 'h:mm:ss aaaa',
minute: 'h:mm aaaa',
hour: 'ha',
day: 'MMM d',
week: 'PP',
month: 'MMM yyyy',
quarter: 'qqq - yyyy',
year: 'yyyy'
};
Chart._adapters._date.override({
_id: 'date-fns',
formats: () => FORMATS,
parse: function(value, format) {
if (value === null || value === undefined) {
return null;
}
const type = typeof value;
if (type === 'number' || value instanceof Date) {
value = new Date(value);
} else if (type === 'string') {
value = new Date(value);
}
return isNaN(value) ? null : value.getTime();
},
format: function(time, format) {
return new Date(time).toLocaleString();
},
add: function(time, amount, unit) {
switch (unit) {
case 'millisecond': return time + amount;
case 'second': return time + (amount * 1000);
case 'minute': return time + (amount * 60000);
case 'hour': return time + (amount * 3600000);
case 'day': return time + (amount * 86400000);
case 'week': return time + (amount * 604800000);
case 'month':
const d = new Date(time);
d.setMonth(d.getMonth() + amount);
return d.getTime();
case 'quarter':
const q = new Date(time);
q.setMonth(q.getMonth() + (amount * 3));
return q.getTime();
case 'year':
const y = new Date(time);
y.setFullYear(y.getFullYear() + amount);
return y.getTime();
default:
return time;
}
},
diff: function(a, b, unit) {
const diff = a - b;
switch (unit) {
case 'millisecond': return diff;
case 'second': return diff / 1000;
case 'minute': return diff / 60000;
case 'hour': return diff / 3600000;
case 'day': return diff / 86400000;
case 'week': return diff / 604800000;
case 'month': return (new Date(a).getMonth() - new Date(b).getMonth()) + ((new Date(a).getFullYear() - new Date(b).getFullYear()) * 12);
case 'quarter': return this.diff(a, b, 'month') / 3;
case 'year': return new Date(a).getFullYear() - new Date(b).getFullYear();
default: return diff;
}
},
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':
const day = d.getDay();
d.setDate(d.getDate() - day);
d.setHours(0, 0, 0, 0);
break;
case 'month':
d.setDate(1);
d.setHours(0, 0, 0, 0);
break;
case 'quarter':
const quarter = Math.floor(d.getMonth() / 3);
d.setMonth(quarter * 3);
d.setDate(1);
d.setHours(0, 0, 0, 0);
break;
case 'year':
d.setMonth(0, 1);
d.setHours(0, 0, 0, 0);
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 'week':
const day = d.getDay();
d.setDate(d.getDate() + (6 - day));
d.setHours(23, 59, 59, 999);
break;
case 'month':
d.setMonth(d.getMonth() + 1, 0);
d.setHours(23, 59, 59, 999);
break;
case 'quarter':
const quarter = Math.floor(d.getMonth() / 3);
d.setMonth((quarter + 1) * 3, 0);
d.setHours(23, 59, 59, 999);
break;
case 'year':
d.setFullYear(d.getFullYear() + 1, 0, 0);
d.setHours(23, 59, 59, 999);
break;
}
return d.getTime();
}
});
}));
} else {
// Chart.js not ready yet, try again
setTimeout(loadAdapter, 50);
}
}
// Start loading
if (typeof window !== 'undefined') {
loadAdapter();
}
})();