automatic months

This commit is contained in:
Anton Volnuhin 2026-01-29 13:44:41 +03:00
parent e2272414dc
commit a805914fe6
2 changed files with 39 additions and 7 deletions

15
app.js
View File

@ -875,9 +875,16 @@ function loadTinyColor() {
async function loadAvailableMonths() { async function loadAvailableMonths() {
// Load TinyColor first // Load TinyColor first
await loadTinyColor(); await loadTinyColor();
// Include all available months // Fetch available months from server
const months = ['2025-01', '2025-02']; const response = await fetch('/api/months');
const months = await response.json();
if (months.length === 0) {
console.error('No month data files found');
return;
}
const select = document.getElementById('month-select'); const select = document.getElementById('month-select');
// Clear existing options // Clear existing options
@ -1270,4 +1277,4 @@ function setupHoverEvents(sunburstData) {
// Reset to default view when a section is no longer emphasized // Reset to default view when a section is no longer emphasized
showDefaultView(); showDefaultView();
}); });
} }

View File

@ -13,15 +13,40 @@ const MIME_TYPES = {
}; };
const server = http.createServer((req, res) => { const server = http.createServer((req, res) => {
// API endpoint to list available months
if (req.url === '/api/months') {
fs.readdir('.', (err, files) => {
if (err) {
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Failed to read directory' }));
return;
}
// Find CSV files matching altcats-YYYY-MM.csv pattern
const monthPattern = /^altcats-(\d{4}-\d{2})\.csv$/;
const months = files
.map(file => {
const match = file.match(monthPattern);
return match ? match[1] : null;
})
.filter(Boolean)
.sort();
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(months));
});
return;
}
// Handle URL // Handle URL
let filePath = '.' + req.url; let filePath = '.' + req.url;
if (filePath === './') { if (filePath === './') {
filePath = './index.html'; filePath = './index.html';
} }
const extname = path.extname(filePath); const extname = path.extname(filePath);
const contentType = MIME_TYPES[extname] || 'application/octet-stream'; const contentType = MIME_TYPES[extname] || 'application/octet-stream';
fs.readFile(filePath, (err, data) => { fs.readFile(filePath, (err, data) => {
if (err) { if (err) {
if (err.code === 'ENOENT') { if (err.code === 'ENOENT') {
@ -33,7 +58,7 @@ const server = http.createServer((req, res) => {
} }
return; return;
} }
res.writeHead(200, { 'Content-Type': contentType }); res.writeHead(200, { 'Content-Type': contentType });
res.end(data); res.end(data);
}); });