Files
baffle-hub/app/javascript/controllers/data_import_progress_controller.js

76 lines
1.9 KiB
JavaScript

import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["progressBar", "totalRecords", "processedRecords", "failedRecords", "recordsPerSecond"]
static values = {
importId: Number,
refreshInterval: { type: Number, default: 2000 }
}
connect() {
if (this.hasImportIdValue) {
this.startUpdating()
}
}
disconnect() {
this.stopUpdating()
}
startUpdating() {
this.updateProgress()
this.interval = setInterval(() => {
this.updateProgress()
}, this.refreshIntervalValue)
}
stopUpdating() {
if (this.interval) {
clearInterval(this.interval)
}
}
async updateProgress() {
try {
const response = await fetch(`/data_imports/${this.importIdValue}/progress`)
const data = await response.json()
this.updateProgressBar(data.progress_percentage)
this.updateStats(data)
// If completed or failed, reload the page
if (data.status === 'completed' || data.status === 'failed') {
setTimeout(() => {
window.location.reload()
}, 2000)
this.stopUpdating()
}
} catch (error) {
console.error('Error updating progress:', error)
}
}
updateProgressBar(percentage) {
if (this.hasProgressBarTarget) {
this.progressBarTarget.style.width = `${percentage}%`
}
}
updateStats(data) {
if (this.hasTotalRecordsTarget) {
this.totalRecordsTarget.textContent = data.total_records.toLocaleString()
}
if (this.hasProcessedRecordsTarget) {
this.processedRecordsTarget.textContent = data.processed_records.toLocaleString()
}
if (this.hasFailedRecordsTarget) {
this.failedRecordsTarget.textContent = data.failed_records.toLocaleString()
}
if (this.hasRecordsPerSecondTarget) {
this.recordsPerSecondTarget.textContent = data.records_per_second.toLocaleString()
}
}
}