Aggiorna lo stato dell'invio email senza ricaricare la pagina.
Così la lista destinatari si aggiorna in corso d'opera senza riportare lo scroll in cima. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,17 +4,46 @@ export default class extends Controller {
|
||||
static values = { interval: { type: Number, default: 10000 } }
|
||||
|
||||
connect() {
|
||||
this.timer = setInterval(() => {
|
||||
if (document.hidden) return
|
||||
if (window.Turbo?.visit) {
|
||||
window.Turbo.visit(window.location.href, { action: "replace" })
|
||||
} else {
|
||||
window.location.reload()
|
||||
}
|
||||
}, this.intervalValue)
|
||||
this.timer = setInterval(() => this.refresh(), this.intervalValue)
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
clearInterval(this.timer)
|
||||
}
|
||||
|
||||
refresh() {
|
||||
if (document.hidden) return
|
||||
|
||||
const frame = this.element.closest("turbo-frame")
|
||||
if (frame && typeof frame.reload === "function") {
|
||||
this.reloadFrame(frame)
|
||||
return
|
||||
}
|
||||
|
||||
this.refreshPreservingScroll()
|
||||
}
|
||||
|
||||
reloadFrame(frame) {
|
||||
if (frame.hasAttribute("busy")) return
|
||||
|
||||
const url = window.location.href
|
||||
if (frame.getAttribute("src") === url) {
|
||||
frame.reload()
|
||||
} else {
|
||||
frame.setAttribute("src", url)
|
||||
}
|
||||
}
|
||||
|
||||
refreshPreservingScroll() {
|
||||
const { scrollX, scrollY } = window
|
||||
const restore = () => window.scrollTo(scrollX, scrollY)
|
||||
document.addEventListener("turbo:render", restore, { once: true })
|
||||
document.addEventListener("turbo:load", restore, { once: true })
|
||||
|
||||
if (window.Turbo?.visit) {
|
||||
window.Turbo.visit(window.location.href, { action: "replace" })
|
||||
} else {
|
||||
window.location.reload()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<% refresh = @active_mailings.any? %>
|
||||
<%= turbo_frame_tag "mailings_dashboard_live", target: "_top", refresh: "morph" do %>
|
||||
<%= tag.div class: "space-y-6", data: (refresh ? { controller: "auto-reload", auto_reload_interval_value: 10_000 } : {}) do %>
|
||||
<div class="flex flex-wrap items-end justify-between gap-3">
|
||||
<div>
|
||||
@@ -135,3 +136,4 @@
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<%= turbo_frame_tag "mailing_live", target: "_top", refresh: "morph" do %>
|
||||
<%= tag.div class: "space-y-6", data: (@mailing.sending? ? { controller: "auto-reload", auto_reload_interval_value: 10_000 } : {}) do %>
|
||||
<div class="flex flex-wrap items-start justify-between gap-3">
|
||||
<div class="min-w-0">
|
||||
@@ -280,3 +281,4 @@
|
||||
</section>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -205,4 +205,17 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
|
||||
assert_equal "invio annullato", recipients.second.skip_reason
|
||||
assert mailing.mailing_recipients.pending.none?
|
||||
end
|
||||
|
||||
test "sending mailing show updates inside a turbo frame" do
|
||||
login_as users(:admin)
|
||||
follow_redirect! if response.redirect?
|
||||
mailing = create_mailing(identity: @identity, audience: "to_send")
|
||||
mailing.rebuild_recipients!
|
||||
mailing.update!(status: "sending", queued_at: Time.current, test_sent_at: Time.current, test_sent_to: "test@example.com")
|
||||
|
||||
get mailing_path(mailing, project_code: @project.code)
|
||||
assert_response :success
|
||||
assert_select "turbo-frame#mailing_live[target=_top]"
|
||||
assert_select "[data-controller='auto-reload']"
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user