|
375 | 375 | let activeTag = ''; |
376 | 376 | let selectedFaculties = []; // multi-select faculty |
377 | 377 | let selectedTags = []; // multi-select categories/tags |
| 378 | + let selectedStatus = ''; // filter by project status |
378 | 379 | let recruitFilter = null; // null = any, true = open, false = closed |
379 | 380 |
|
380 | 381 | function normalizeText(value) { |
|
595 | 596 | closedBtn.addEventListener('click', () => { recruitFilter = recruitFilter === false ? null : false; updateAndRender(); }); |
596 | 597 | recruitList.appendChild(closedBtn); |
597 | 598 |
|
598 | | - // Categories (tags) - derived from projects after applying faculty & recruit filters |
599 | | - const tagPool = projects.filter(p => (!selectedFaculties.length || p.faculty.some(f => selectedFaculties.includes(f))) && (recruitFilter === null || p.recruiting === recruitFilter)); |
| 599 | + const statusSection = document.createElement('div'); |
| 600 | + statusSection.className = 'filter-section'; |
| 601 | + statusSection.innerHTML = `<div class="filter-title">Project Status</div><div class="filter-list" id="status-list"></div>`; |
| 602 | + sidebar.appendChild(statusSection); |
| 603 | + |
| 604 | + const statusList = statusSection.querySelector('#status-list'); |
| 605 | + const statusAllBtn = document.createElement('button'); |
| 606 | + statusAllBtn.type = 'button'; |
| 607 | + statusAllBtn.className = `filter-item ${selectedStatus === '' ? 'active' : ''}`; |
| 608 | + statusAllBtn.textContent = 'All'; |
| 609 | + statusAllBtn.addEventListener('click', () => { selectedStatus = ''; updateAndRender(); }); |
| 610 | + statusList.appendChild(statusAllBtn); |
| 611 | + |
| 612 | + const activeStatusBtn = document.createElement('button'); |
| 613 | + activeStatusBtn.type = 'button'; |
| 614 | + activeStatusBtn.className = `filter-item ${selectedStatus === 'active' ? 'active' : ''}`; |
| 615 | + activeStatusBtn.textContent = 'Active'; |
| 616 | + activeStatusBtn.addEventListener('click', () => { selectedStatus = selectedStatus === 'active' ? '' : 'active'; updateAndRender(); }); |
| 617 | + statusList.appendChild(activeStatusBtn); |
| 618 | + |
| 619 | + const newStatusBtn = document.createElement('button'); |
| 620 | + newStatusBtn.type = 'button'; |
| 621 | + newStatusBtn.className = `filter-item ${selectedStatus === 'new' ? 'active' : ''}`; |
| 622 | + newStatusBtn.textContent = 'New'; |
| 623 | + newStatusBtn.addEventListener('click', () => { selectedStatus = selectedStatus === 'new' ? '' : 'new'; updateAndRender(); }); |
| 624 | + statusList.appendChild(newStatusBtn); |
| 625 | + |
| 626 | + // Categories (tags) - derived from projects after applying faculty, status, & recruit filters |
| 627 | + const tagPool = projects.filter(p => (!selectedFaculties.length || p.faculty.some(f => selectedFaculties.includes(f))) && (recruitFilter === null || p.recruiting === recruitFilter) && (!selectedStatus || p.status.toLowerCase() === selectedStatus)); |
600 | 628 | const tags = [...new Set(tagPool.flatMap(p => p.tags))].sort(); |
601 | 629 |
|
602 | 630 | const tagSection = document.createElement('div'); |
|
636 | 664 | if (selectedTags.length && !project.tags.some(t => selectedTags.includes(t))) return false; |
637 | 665 | if (selectedFaculties.length && !project.faculty.some(f => selectedFaculties.includes(f))) return false; |
638 | 666 | if (recruitFilter !== null && project.recruiting !== recruitFilter) return false; |
| 667 | + if (selectedStatus && project.status.toLowerCase() !== selectedStatus) return false; |
639 | 668 | return true; |
640 | 669 | }); |
641 | 670 | } |
@@ -774,6 +803,7 @@ <h2 id="modal-title">${project.name}</h2> |
774 | 803 | // initialize filters and render |
775 | 804 | selectedFaculties = []; |
776 | 805 | selectedTags = []; |
| 806 | + selectedStatus = ''; |
777 | 807 | recruitFilter = null; |
778 | 808 | activeTag = ''; |
779 | 809 | updateAndRender(); |
|
0 commit comments