class LogScraperApp { constructor() { this.form = document.getElementById('scrapingForm'); this.stopButton = document.getElementById('stopButton'); this.logsElement = document.getElementById('logs'); this.prevPageButton = document.getElementById('prevPage'); this.nextPageButton = document.getElementById('nextPage'); this.pageInfo = document.getElementById('pageInfo'); this.startButton = document.getElementById('startButton'); this.currentPage = 0; this.linesPerPage = null; this.autoRefreshInterval = null; this.init(); } async init() { await this.fetchConfig(); await this.checkScrapingStatus(); this.addEventListeners(); } async fetchConfig() { try { const response = await fetch('/config/lines_per_page'); const data = await response.json(); this.linesPerPage = data.lines_per_page; this.fetchLogs(this.currentPage); } catch (error) { console.error('Error fetching config:', error); } } async fetchLogs(page) { try { const response = await fetch(`/logfile?page=${page}&lines_per_page=${this.linesPerPage}`); const data = await response.json(); if (data.error) { this.logsElement.textContent = data.error; } else { this.logsElement.innerHTML = data.log.map((line, index) => { const lineNumber = data.start_line - index; return `${lineNumber} ${line}`; }).join(''); this.updatePagination(data.total_lines); } } catch (error) { console.error('Error fetching logs:', error); } } updatePagination(totalLines) { this.prevPageButton.disabled = this.currentPage === 0; this.nextPageButton.disabled = (this.currentPage + 1) * this.linesPerPage >= totalLines; this.pageInfo.textContent = `Page ${this.currentPage + 1} of ${Math.ceil(totalLines / this.linesPerPage)}`; } startAutoRefresh() { this.autoRefreshInterval = setInterval(() => this.fetchLogs(this.currentPage), 5000); } stopAutoRefresh() { clearInterval(this.autoRefreshInterval); } async checkScrapingStatus() { try { const response = await fetch('/scraping_status'); const data = await response.json(); if (data.scraping_active) { this.startButton.disabled = true; this.stopButton.disabled = false; this.startAutoRefresh(); } else { this.startButton.disabled = false; this.stopButton.disabled = true; } this.fetchLogs(this.currentPage); } catch (error) { console.error('Error checking scraping status:', error); } } async startScraping(event) { event.preventDefault(); const formData = new FormData(this.form); try { const response = await fetch('/start_scraping', { method: 'POST', body: formData }); const data = await response.json(); console.log(data); if (data.status === "Scraping started") { this.startButton.disabled = true; this.stopButton.disabled = false; this.startAutoRefresh(); } } catch (error) { console.error('Error starting scraping:', error); } } async stopScraping() { try { const response = await fetch('/stop_scraping', { method: 'POST' }); const data = await response.json(); console.log(data); if (data.status === "Scraping stopped") { this.startButton.disabled = false; this.stopButton.disabled = true; this.stopAutoRefresh(); } } catch (error) { console.error('Error stopping scraping:', error); } } addEventListeners() { this.prevPageButton.addEventListener('click', () => { if (this.currentPage > 0) { this.currentPage--; this.fetchLogs(this.currentPage); } }); this.nextPageButton.addEventListener('click', () => { this.currentPage++; this.fetchLogs(this.currentPage); }); this.form.addEventListener('submit', (event) => this.startScraping(event)); this.stopButton.addEventListener('click', () => this.stopScraping()); } } // Initialize the application when DOM is fully loaded document.addEventListener('DOMContentLoaded', () => new LogScraperApp());