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