()
| 156 | } |
| 157 | |
| 158 | export async function initInstructionsPage(): Promise<void> { |
| 159 | const list = document.getElementById('resource-list'); |
| 160 | const clearFiltersBtn = document.getElementById('clear-filters'); |
| 161 | const sortSelect = document.getElementById('sort-select') as HTMLSelectElement | null; |
| 162 | |
| 163 | if (!modalReady) { |
| 164 | setupModal(); |
| 165 | modalReady = true; |
| 166 | } |
| 167 | |
| 168 | setupResourceListHandlers(list as HTMLElement | null); |
| 169 | |
| 170 | const data = await fetchData<InstructionsData>('instructions.json'); |
| 171 | if (!data || !data.items) { |
| 172 | if (list) list.innerHTML = '<div class="empty-state"><h3>Failed to load data</h3></div>'; |
| 173 | return; |
| 174 | } |
| 175 | |
| 176 | allItems = data.items; |
| 177 | instructionByPath = new Map(allItems.map((item) => [item.path, item])); |
| 178 | |
| 179 | extensionSelectEl = document.getElementById('filter-extension') as HTMLSelectElement | null; |
| 180 | if (extensionSelectEl) { |
| 181 | extensionSelectEl.innerHTML = ''; |
| 182 | data.filters.extensions.forEach((ext) => { |
| 183 | const option = document.createElement('option'); |
| 184 | option.value = ext; |
| 185 | option.textContent = ext; |
| 186 | extensionSelectEl?.appendChild(option); |
| 187 | }); |
| 188 | } |
| 189 | |
| 190 | const initialExtensions = getQueryParamValues('extension').filter((extension) => data.filters.extensions.includes(extension)); |
| 191 | const initialSort = getQueryParam('sort'); |
| 192 | |
| 193 | if (initialExtensions.length > 0) { |
| 194 | currentFilters.extensions = initialExtensions; |
| 195 | setSelectValues(extensionSelectEl, initialExtensions); |
| 196 | } |
| 197 | if (initialSort === 'lastUpdated') { |
| 198 | currentSort = initialSort; |
| 199 | if (sortSelect) sortSelect.value = initialSort; |
| 200 | } |
| 201 | |
| 202 | extensionSelectEl?.addEventListener('change', () => { |
| 203 | currentFilters.extensions = getSelectValues(extensionSelectEl); |
| 204 | applyFiltersAndRender(); |
| 205 | syncUrlState(); |
| 206 | }); |
| 207 | |
| 208 | sortSelect?.addEventListener('change', () => { |
| 209 | currentSort = sortSelect.value as InstructionSortOption; |
| 210 | applyFiltersAndRender(); |
| 211 | syncUrlState(); |
| 212 | }); |
| 213 | |
| 214 | clearFiltersBtn?.addEventListener('click', () => { |
| 215 | currentFilters = { extensions: [] }; |
nothing calls this directly
no test coverage detected