diff --git a/data/.DS_Store b/data/.DS_Store
index 5670e83..17b8034 100644
Binary files a/data/.DS_Store and b/data/.DS_Store differ
diff --git a/frontend/app.js b/frontend/app.js
index 7a99e7b..776f0a9 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -468,12 +468,21 @@ async function updateComparisonChart() {
}
function updateComparisonTable(comparison, metric, years) {
- // Build header
+ const firstYear = years[0];
+ const lastYear = years[years.length - 1];
+ const prevYear = years.length > 1 ? years[years.length - 2] : null;
+
+ // Build header with explicit year ranges
let headerHtml = '
School | ';
years.forEach(year => {
headerHtml += `${year} | `;
});
- headerHtml += 'Change | ';
+ if (prevYear && prevYear !== firstYear) {
+ headerHtml += `Δ 1yr | `;
+ }
+ if (years.length > 1) {
+ headerHtml += `Δ ${firstYear}→${lastYear} | `;
+ }
elements.tableHeader.innerHTML = headerHtml;
// Build body - iterate in same order as selectedSchools for color consistency
@@ -487,19 +496,34 @@ function updateComparisonTable(comparison, metric, years) {
yearlyMap[d.year] = d[metric];
});
- const firstValue = yearlyMap[years[0]];
- const lastValue = yearlyMap[years[years.length - 1]];
- const change = firstValue && lastValue ? (lastValue - firstValue).toFixed(2) : 'N/A';
- const changeClass = parseFloat(change) >= 0 ? 'positive' : 'negative';
+ const firstValue = yearlyMap[firstYear];
+ const lastValue = yearlyMap[lastYear];
+ const prevValue = prevYear ? yearlyMap[prevYear] : null;
+
+ // Calculate 1-year change
+ const oneYearChange = prevValue != null && lastValue != null ? (lastValue - prevValue) : null;
+ const oneYearChangeStr = oneYearChange !== null ? oneYearChange.toFixed(1) : 'N/A';
+ const oneYearClass = oneYearChange !== null ? (oneYearChange >= 0 ? 'positive' : 'negative') : '';
+
+ // Calculate total change
+ const totalChange = firstValue != null && lastValue != null ? (lastValue - firstValue) : null;
+ const totalChangeStr = totalChange !== null ? totalChange.toFixed(1) : 'N/A';
+ const totalChangeClass = totalChange !== null ? (totalChange >= 0 ? 'positive' : 'negative') : '';
+
const color = CHART_COLORS[index % CHART_COLORS.length];
bodyHtml += ``;
bodyHtml += `| ${escapeHtml(schoolData.school_info.school_name)} | `;
years.forEach(year => {
const value = yearlyMap[year];
- bodyHtml += `${value !== undefined ? formatMetricValue(value, metric) : '-'} | `;
+ bodyHtml += `${value != null ? formatMetricValue(value, metric) : '-'} | `;
});
- bodyHtml += `${change !== 'N/A' ? (parseFloat(change) >= 0 ? '+' : '') + change : change} | `;
+ if (prevYear && prevYear !== firstYear) {
+ bodyHtml += `${oneYearChangeStr !== 'N/A' ? (oneYearChange >= 0 ? '+' : '') + oneYearChangeStr : oneYearChangeStr} | `;
+ }
+ if (years.length > 1) {
+ bodyHtml += `${totalChangeStr !== 'N/A' ? (totalChange >= 0 ? '+' : '') + totalChangeStr : totalChangeStr} | `;
+ }
bodyHtml += `
`;
});
elements.tableBody.innerHTML = bodyHtml;