fix: add auto-refresh for processing exports on index page (#715)

Wrap export list in turbo_frame_tag with conditional polling attributes.
When exports are pending/processing, page polls every 3 seconds for updates.
Add turbo_frame: _top to download/delete buttons for proper frame handling.
This commit is contained in:
Dream
2026-01-23 05:08:38 -05:00
committed by GitHub
parent 69d9f51d57
commit 0316b848eb
2 changed files with 186 additions and 114 deletions

View File

@@ -0,0 +1,64 @@
import { Controller } from "@hotwired/stimulus";
// Connects to data-controller="polling"
// Automatically refreshes a turbo frame at a specified interval
export default class extends Controller {
static values = {
url: String,
interval: { type: Number, default: 3000 },
};
connect() {
this.startPolling();
}
disconnect() {
this.stopPolling();
}
startPolling() {
if (!this.hasUrlValue) return;
this.poll = setInterval(() => {
this.refresh();
}, this.intervalValue);
}
stopPolling() {
if (this.poll) {
clearInterval(this.poll);
this.poll = null;
}
}
async refresh() {
try {
const response = await fetch(this.urlValue, {
headers: {
Accept: "text/vnd.turbo-stream.html",
"Turbo-Frame": this.element.id,
},
});
if (response.ok) {
const html = await response.text();
const template = document.createElement("template");
template.innerHTML = html;
const newFrame = template.content.querySelector(
`turbo-frame#${this.element.id}`,
);
if (newFrame) {
this.element.innerHTML = newFrame.innerHTML;
// Check if we should stop polling (no more pending/processing exports)
if (!newFrame.hasAttribute("data-polling-url-value")) {
this.stopPolling();
}
}
}
} catch (error) {
console.error("Polling error:", error);
}
}
}