Add Compare button to map view school list
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 56s

- Add orange Compare button alongside Details button
- Toggle to Remove when school is in comparison
- Stack buttons vertically with consistent sizing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Tudor
2026-01-15 12:02:21 +00:00
parent 1913af4e7f
commit 5bd49d3a03
2 changed files with 57 additions and 6 deletions

View File

@@ -1138,6 +1138,10 @@ function renderCompactSchoolList(schools) {
? `<span class="distance-badge">${school.distance.toFixed(1)} mi</span>` ? `<span class="distance-badge">${school.distance.toFixed(1)} mi</span>`
: ""; : "";
const isInCompare = state.selectedSchools.some((s) => s.urn === school.urn);
const compareButtonText = isInCompare ? "Remove" : "Compare";
const compareButtonClass = isInCompare ? "btn-compare active" : "btn-compare";
return ` return `
<div class="school-list-item" data-urn="${school.urn}"> <div class="school-list-item" data-urn="${school.urn}">
<div class="school-list-item-content"> <div class="school-list-item-content">
@@ -1158,8 +1162,11 @@ function renderCompactSchoolList(schools) {
</span> </span>
</div> </div>
</div> </div>
<div class="school-list-item-actions">
<button class="btn ${compareButtonClass}" data-urn="${school.urn}">${compareButtonText}</button>
<button class="btn btn-secondary school-list-item-details" data-urn="${school.urn}">Details</button> <button class="btn btn-secondary school-list-item-details" data-urn="${school.urn}">Details</button>
</div> </div>
</div>
`; `;
}) })
.join(""); .join("");
@@ -1169,8 +1176,8 @@ function renderCompactSchoolList(schools) {
// Add click handlers for list items (to highlight on map) // Add click handlers for list items (to highlight on map)
elements.schoolsGrid.querySelectorAll(".school-list-item").forEach((item) => { elements.schoolsGrid.querySelectorAll(".school-list-item").forEach((item) => {
item.addEventListener("click", (e) => { item.addEventListener("click", (e) => {
// Don't trigger if clicking the details button // Don't trigger if clicking buttons
if (e.target.closest(".school-list-item-details")) return; if (e.target.closest(".school-list-item-actions")) return;
const urn = parseInt(item.dataset.urn, 10); const urn = parseInt(item.dataset.urn, 10);
highlightSchoolCard(urn, true); highlightSchoolCard(urn, true);
}); });
@@ -1184,6 +1191,27 @@ function renderCompactSchoolList(schools) {
openSchoolModal(urn); openSchoolModal(urn);
}); });
}); });
// Add click handlers for compare buttons
elements.schoolsGrid.querySelectorAll(".btn-compare").forEach((btn) => {
btn.addEventListener("click", (e) => {
e.stopPropagation();
const urn = parseInt(btn.dataset.urn, 10);
const school = schools.find((s) => s.urn === urn);
if (!school) return;
const isInCompare = state.selectedSchools.some((s) => s.urn === urn);
if (isInCompare) {
removeFromComparison(urn);
btn.textContent = "Compare";
btn.classList.remove("active");
} else {
addToComparison(school);
btn.textContent = "Remove";
btn.classList.add("active");
}
});
});
} }
// ============================================================================= // =============================================================================

View File

@@ -570,10 +570,33 @@ body {
color: var(--text-primary); color: var(--text-primary);
} }
.school-list-item-details { .school-list-item-actions {
display: flex;
flex-direction: column;
gap: 0.375rem;
flex-shrink: 0; flex-shrink: 0;
padding: 0.5rem 0.875rem; }
font-size: 0.8rem;
.school-list-item-actions .btn {
padding: 0.4rem 0.75rem;
font-size: 0.75rem;
white-space: nowrap;
}
.btn-compare {
background: var(--accent-coral);
color: white;
border: 1px solid var(--accent-coral);
}
.btn-compare:hover {
background: #d4654a;
border-color: #d4654a;
}
.btn-compare.active {
background: var(--text-muted);
border-color: var(--text-muted);
} }
/* Search location marker on map */ /* Search location marker on map */