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 } }
|
static values = { interval: { type: Number, default: 10000 } }
|
||||||
|
|
||||||
connect() {
|
connect() {
|
||||||
this.timer = setInterval(() => {
|
this.timer = setInterval(() => this.refresh(), this.intervalValue)
|
||||||
if (document.hidden) return
|
|
||||||
if (window.Turbo?.visit) {
|
|
||||||
window.Turbo.visit(window.location.href, { action: "replace" })
|
|
||||||
} else {
|
|
||||||
window.location.reload()
|
|
||||||
}
|
|
||||||
}, this.intervalValue)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnect() {
|
disconnect() {
|
||||||
clearInterval(this.timer)
|
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? %>
|
<% 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 %>
|
<%= 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 class="flex flex-wrap items-end justify-between gap-3">
|
||||||
<div>
|
<div>
|
||||||
@@ -135,3 +136,4 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% 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 %>
|
<%= 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="flex flex-wrap items-start justify-between gap-3">
|
||||||
<div class="min-w-0">
|
<div class="min-w-0">
|
||||||
@@ -280,3 +281,4 @@
|
|||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|||||||
@@ -205,4 +205,17 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
assert_equal "invio annullato", recipients.second.skip_reason
|
assert_equal "invio annullato", recipients.second.skip_reason
|
||||||
assert mailing.mailing_recipients.pending.none?
|
assert mailing.mailing_recipients.pending.none?
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user