()
| 233 | } |
| 234 | |
| 235 | function bindEvents() { |
| 236 | el.refreshBtn.addEventListener("click", () => { |
| 237 | loadLogs(); |
| 238 | loadStats(); |
| 239 | }); |
| 240 | el.clearFiltersBtn.addEventListener("click", resetFilters); |
| 241 | el.cleanupBtn.addEventListener("click", cleanupLogs); |
| 242 | el.clearLogsBtn?.addEventListener("click", clearAllLogs); |
| 243 | |
| 244 | el.pageSizeSelect.addEventListener("change", () => { |
| 245 | logsState.pageSize = Number(el.pageSizeSelect.value || 100); |
| 246 | logsState.page = 1; |
| 247 | loadLogs(); |
| 248 | }); |
| 249 | el.prevPageBtn.addEventListener("click", () => { |
| 250 | if (logsState.page <= 1) return; |
| 251 | logsState.page -= 1; |
| 252 | loadLogs(); |
| 253 | }); |
| 254 | el.nextPageBtn.addEventListener("click", () => { |
| 255 | const maxPage = Math.max(1, Math.ceil(logsState.total / logsState.pageSize)); |
| 256 | if (logsState.page >= maxPage) return; |
| 257 | logsState.page += 1; |
| 258 | loadLogs(); |
| 259 | }); |
| 260 | |
| 261 | [ |
| 262 | el.filterLevel, |
| 263 | el.filterLogger, |
| 264 | el.filterKeyword, |
| 265 | el.filterSinceMinutes, |
| 266 | ].forEach((node) => { |
| 267 | node.addEventListener("change", () => { |
| 268 | logsState.page = 1; |
| 269 | loadLogs(); |
| 270 | }); |
| 271 | }); |
| 272 | el.filterLogger.addEventListener("input", debounce(() => { |
| 273 | logsState.page = 1; |
| 274 | loadLogs(true); |
| 275 | }, 300)); |
| 276 | el.filterKeyword.addEventListener("input", debounce(() => { |
| 277 | logsState.page = 1; |
| 278 | loadLogs(true); |
| 279 | }, 300)); |
| 280 | |
| 281 | el.autoRefreshSeconds.addEventListener("change", () => { |
| 282 | logsState.autoRefreshSeconds = Number(el.autoRefreshSeconds.value || 0); |
| 283 | restartAutoRefresh(); |
| 284 | }); |
| 285 | } |
| 286 | |
| 287 | document.addEventListener("DOMContentLoaded", async () => { |
| 288 | bindEvents(); |
no test coverage detected