code quality fixes
Build and Push Docker Image / build-and-push (pull_request) Successful in 58s
Python Code Quality / python-code-quality (pull_request) Successful in 10s
Python Test / python-test (pull_request) Successful in 18s

This commit is contained in:
Brian Bjarke Jensen
2025-11-11 20:43:47 +01:00
parent 696de14e6b
commit a2b78f7e96
17 changed files with 236 additions and 249 deletions
+112 -83
View File
@@ -547,15 +547,15 @@
const sessionCounts = []; // For reference
// Only use completed sleep sessions
const completedSessions = sleepSessions.filter(s => s.end_time);
const completedSessions = sleepSessions.filter((s) => s.end_time);
// If 24 hours selected, show 3-hour aggregates
if (timeRange === 1) {
// Create 8 three-hour buckets
for (let i = 7; i >= 0; i--) {
const periodStart = new Date(now);
periodStart.setHours(periodStart.getHours() - (i * 3), 0, 0, 0);
periodStart.setHours(periodStart.getHours() - i * 3, 0, 0, 0);
const periodEnd = new Date(periodStart);
periodEnd.setHours(periodEnd.getHours() + 3);
@@ -574,11 +574,12 @@
const startDate = new Date(session.start_time);
return startDate >= periodStart && startDate < periodEnd;
});
const sessionDurations = periodSessions.map(session =>
calculateDuration(session.start_time, session.end_time) / 60
const sessionDurations = periodSessions.map(
(session) =>
calculateDuration(session.start_time, session.end_time) / 60,
);
durations.push(sessionDurations);
sessionCounts.push(periodSessions.length);
}
@@ -586,8 +587,8 @@
// Show 8-hour aggregates for 3 days (9 buckets total)
for (let i = 8; i >= 0; i--) {
const periodStart = new Date(now);
periodStart.setHours(periodStart.getHours() - (i * 8), 0, 0, 0);
periodStart.setHours(periodStart.getHours() - i * 8, 0, 0, 0);
const periodEnd = new Date(periodStart);
periodEnd.setHours(periodEnd.getHours() + 8);
@@ -612,11 +613,12 @@
const startDate = new Date(session.start_time);
return startDate >= periodStart && startDate < periodEnd;
});
const sessionDurations = periodSessions.map(session =>
calculateDuration(session.start_time, session.end_time) / 60
const sessionDurations = periodSessions.map(
(session) =>
calculateDuration(session.start_time, session.end_time) / 60,
);
durations.push(sessionDurations);
sessionCounts.push(periodSessions.length);
}
@@ -641,29 +643,39 @@
const startDate = new Date(session.start_time);
return startDate >= date && startDate < nextDay;
});
const sessionDurations = daySessions.map(session => {
const dur = calculateDuration(session.start_time, session.end_time) / 60;
console.log(` Session: ${session.start_time} to ${session.end_time}, duration: ${dur} hours (${calculateDuration(session.start_time, session.end_time)} minutes)`);
const sessionDurations = daySessions.map((session) => {
const dur =
calculateDuration(session.start_time, session.end_time) / 60;
console.log(
` Session: ${session.start_time} to ${session.end_time}, duration: ${dur} hours (${calculateDuration(session.start_time, session.end_time)} minutes)`,
);
return dur;
});
console.log(`${dateStr}: ${daySessions.length} sessions, durations:`, sessionDurations);
console.log(
`${dateStr}: ${daySessions.length} sessions, durations:`,
sessionDurations,
);
durations.push(sessionDurations);
sessionCounts.push(daySessions.length);
}
}
console.log('Final prepareBarChartData result:', { labels, durations, sessionCounts });
console.log("Final prepareBarChartData result:", {
labels,
durations,
sessionCounts,
});
// Log the actual duration values for debugging
durations.forEach((periodDurations, idx) => {
if (periodDurations.length > 0) {
console.log(` ${labels[idx]}: durations =`, periodDurations);
}
});
return { labels, durations, sessionCounts };
}
@@ -699,31 +711,36 @@
function renderBarChart(chartData) {
const ctx = document.getElementById("barChart");
// Destroy existing chart if it exists
if (barChartInstance) {
barChartInstance.destroy();
}
// Debug: Log the data
console.log('Bar chart data:', chartData);
console.log("Bar chart data:", chartData);
// Find the maximum number of sessions in any period
const maxSessions = Math.max(...chartData.durations.map(d => d.length), 0);
console.log('Max sessions:', maxSessions);
const maxSessions = Math.max(
...chartData.durations.map((d) => d.length),
0,
);
console.log("Max sessions:", maxSessions);
// If no sessions at all, show empty chart
if (maxSessions === 0) {
barChartInstance = new Chart(ctx, {
type: "bar",
data: {
labels: chartData.labels,
datasets: [{
label: "No Data",
data: new Array(chartData.labels.length).fill(0),
backgroundColor: "rgba(79, 172, 254, 0.3)",
}],
datasets: [
{
label: "No Data",
data: new Array(chartData.labels.length).fill(0),
backgroundColor: "rgba(79, 172, 254, 0.3)",
},
],
},
options: {
responsive: true,
@@ -747,57 +764,64 @@
});
return;
}
// Create color palette for different sessions
const colors = [
'rgba(79, 172, 254, 0.8)',
'rgba(0, 242, 254, 0.8)',
'rgba(58, 155, 232, 0.8)',
'rgba(32, 137, 220, 0.8)',
'rgba(21, 119, 208, 0.8)',
'rgba(11, 101, 196, 0.8)',
'rgba(79, 172, 254, 0.6)',
'rgba(0, 242, 254, 0.6)',
'rgba(58, 155, 232, 0.6)',
'rgba(32, 137, 220, 0.6)',
"rgba(79, 172, 254, 0.8)",
"rgba(0, 242, 254, 0.8)",
"rgba(58, 155, 232, 0.8)",
"rgba(32, 137, 220, 0.8)",
"rgba(21, 119, 208, 0.8)",
"rgba(11, 101, 196, 0.8)",
"rgba(79, 172, 254, 0.6)",
"rgba(0, 242, 254, 0.6)",
"rgba(58, 155, 232, 0.6)",
"rgba(32, 137, 220, 0.6)",
];
// Create datasets - one for each session position
const datasets = [];
for (let sessionIndex = 0; sessionIndex < maxSessions; sessionIndex++) {
const dataForSession = chartData.durations.map(periodDurations =>
periodDurations[sessionIndex] || 0
const dataForSession = chartData.durations.map(
(periodDurations) => periodDurations[sessionIndex] || 0,
);
console.log(`Session ${sessionIndex + 1} data:`, dataForSession);
datasets.push({
label: `Session ${sessionIndex + 1}`,
data: dataForSession,
backgroundColor: colors[sessionIndex % colors.length],
borderColor: colors[sessionIndex % colors.length].replace('0.8', '1').replace('0.6', '1'),
borderColor: colors[sessionIndex % colors.length]
.replace("0.8", "1")
.replace("0.6", "1"),
borderWidth: 1,
});
}
console.log('Datasets:', datasets);
console.log("Datasets:", datasets);
// Determine the maximum total duration across all periods (in hours)
const maxDuration = Math.max(...chartData.durations.map(periodDurations =>
periodDurations.reduce((sum, val) => sum + val, 0)
), 0);
console.log('Max duration (hours):', maxDuration);
const maxDuration = Math.max(
...chartData.durations.map((periodDurations) =>
periodDurations.reduce((sum, val) => sum + val, 0),
),
0,
);
console.log("Max duration (hours):", maxDuration);
// Decide whether to use minutes or hours based on max duration
const useMinutes = maxDuration < 2; // Use minutes if max is less than 2 hours
// Convert data to minutes if needed
const finalDatasets = useMinutes ? datasets.map(dataset => ({
...dataset,
data: dataset.data.map(hours => hours * 60) // Convert hours to minutes
})) : datasets;
const finalDatasets = useMinutes
? datasets.map((dataset) => ({
...dataset,
data: dataset.data.map((hours) => hours * 60), // Convert hours to minutes
}))
: datasets;
barChartInstance = new Chart(ctx, {
type: "bar",
data: {
@@ -819,13 +843,13 @@
text: useMinutes ? "Minutes" : "Hours",
},
ticks: {
callback: function(value) {
callback: function (value) {
if (useMinutes) {
return Math.round(value) + 'm';
return Math.round(value) + "m";
} else {
return value.toFixed(1) + 'h';
return value.toFixed(1) + "h";
}
}
},
},
},
},
@@ -835,8 +859,10 @@
},
tooltip: {
callbacks: {
label: function(context) {
const value = useMinutes ? context.parsed.y / 60 : context.parsed.y;
label: function (context) {
const value = useMinutes
? context.parsed.y / 60
: context.parsed.y;
const hours = Math.floor(value);
const minutes = Math.round((value - hours) * 60);
if (hours === 0) {
@@ -844,18 +870,21 @@
}
return `${context.dataset.label}: ${hours}h ${minutes}m`;
},
footer: function(tooltipItems) {
footer: function (tooltipItems) {
const periodIndex = tooltipItems[0].dataIndex;
const totalHours = chartData.durations[periodIndex].reduce((sum, val) => sum + val, 0);
const totalHours = chartData.durations[periodIndex].reduce(
(sum, val) => sum + val,
0,
);
const hours = Math.floor(totalHours);
const minutes = Math.round((totalHours - hours) * 60);
const sessionCount = chartData.sessionCounts[periodIndex];
if (hours === 0) {
return `Total: ${minutes}m (${sessionCount} session${sessionCount !== 1 ? 's' : ''})`;
return `Total: ${minutes}m (${sessionCount} session${sessionCount !== 1 ? "s" : ""})`;
}
return `Total: ${hours}h ${minutes}m (${sessionCount} session${sessionCount !== 1 ? 's' : ''})`;
}
}
return `Total: ${hours}h ${minutes}m (${sessionCount} session${sessionCount !== 1 ? "s" : ""})`;
},
},
},
},
},
@@ -864,12 +893,12 @@
function renderDurationChart(chartData) {
const ctx = document.getElementById("durationChart");
// Destroy existing chart if it exists
if (durationChartInstance) {
durationChartInstance.destroy();
}
durationChartInstance = new Chart(ctx, {
type: "pie",
data: {
@@ -905,7 +934,7 @@
if (avgDurationChartInstance) {
avgDurationChartInstance.destroy();
}
const days = {};
const today = new Date();
today.setHours(0, 0, 0, 0);