mirror of
https://github.com/smittix/intercept.git
synced 2026-04-24 22:59:59 -07:00
- DMR/P25 digital voice decoder mode with DSD-FME integration - WebSDR mode with KiwiSDR audio proxy and websocket-client support - Listening post waterfall/spectrogram visualization and audio streaming - Dockerfile updates for mbelib and DSD-FME build dependencies - New tests for DMR, WebSDR, KiwiSDR, waterfall, and signal guess API - Chart.js date adapter for time-scale axes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
125 lines
4.5 KiB
JavaScript
125 lines
4.5 KiB
JavaScript
/*!
|
|
* 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();
|
|
}
|
|
});
|
|
}
|
|
})();
|