gabriel / musehub public
branches.ts typescript
38 lines 1.3 KB
Raw
sha256:c73281cffffbc70487969720af074e54b34326d59ec6aff0827fa16512a4e512 docs(mwp-2): mark all acceptance criteria met; add closing … Sonnet 4.6 81 days ago
1 /**
2 * branches.ts — MuseHub branches page module.
3 *
4 * Handles client-side filtering (by type tab) and search across branch rows.
5 */
6
7 export function initBranches(): void {
8 const searchInput = document.getElementById('branch-search') as HTMLInputElement | null;
9 const branchList = document.getElementById('branch-list');
10 const typeTabs = document.querySelectorAll<HTMLAnchorElement>('.br-tab');
11 let activeFilter = 'all';
12
13 function applyFilters(): void {
14 const q = searchInput ? searchInput.value.toLowerCase() : '';
15 const rows = branchList ? branchList.querySelectorAll<HTMLElement>('.br-row') : [];
16 rows.forEach(row => {
17 const name = (row.dataset['branchName'] || '').toLowerCase();
18 const type = (row.dataset['branchType'] || '').toLowerCase();
19 const nameMatch = !q || name.includes(q);
20 const typeMatch = activeFilter === 'all' || type === activeFilter;
21 row.style.display = nameMatch && typeMatch ? '' : 'none';
22 });
23 }
24
25 if (searchInput) {
26 searchInput.addEventListener('input', applyFilters);
27 }
28
29 typeTabs.forEach(tab => {
30 tab.addEventListener('click', e => {
31 e.preventDefault();
32 typeTabs.forEach(t => t.classList.remove('br-tab--active'));
33 tab.classList.add('br-tab--active');
34 activeFilter = tab.dataset['filter'] || 'all';
35 applyFilters();
36 });
37 });
38 }
File History 2 commits
sha256:c73281cffffbc70487969720af074e54b34326d59ec6aff0827fa16512a4e512 docs(mwp-2): mark all acceptance criteria met; add closing … Sonnet 4.6 81 days ago
sha256:4dd2a937f66f8e36d9aa59bd1bf3cb880ca1d503fef67300a0cba3b482784081 test(mwp2): Phase 0 RED — reproduction tests for _walk_comm… Sonnet 4.6 81 days ago