diff --git a/app/helpers/columns_helper.rb b/app/helpers/columns_helper.rb index bc69ace13..a698b409d 100644 --- a/app/helpers/columns_helper.rb +++ b/app/helpers/columns_helper.rb @@ -8,4 +8,13 @@ module ColumnsHelper form_class: "flex align-center gap-half", data: { turbo_frame: "_top" } end + + def column_frame_tag(id, src: nil, data: {}, **options, &block) + data = data.reverse_merge \ + "drag-and-drop-refresh": true, + controller: "frame", + action: "turbo:before-frame-render->frame#morphRender turbo:before-morph-element->frame#morphReload" + + turbo_frame_tag(id, src: src, data: data, **options, &block) + end end diff --git a/app/javascript/controllers/drag_and_drop_controller.js b/app/javascript/controllers/drag_and_drop_controller.js index aea151c0c..5c03853be 100644 --- a/app/javascript/controllers/drag_and_drop_controller.js +++ b/app/javascript/controllers/drag_and_drop_controller.js @@ -78,15 +78,7 @@ export default class extends Controller { #reloadSourceFrame(sourceContainer) { const frame = sourceContainer.querySelector("[data-drag-and-drop-refresh]") - if (frame) { - frame.addEventListener("turbo:before-frame-render", ({ detail }) => { - detail.render = function (currentElement, newElement) { - Turbo.morphChildren(currentElement, newElement) - } - }, { once: true }) - - frame.reload() - } + if (frame) frame.reload() } #decreaseCounter(sourceContainer) { diff --git a/app/javascript/controllers/frame_controller.js b/app/javascript/controllers/frame_controller.js new file mode 100644 index 000000000..7efafe646 --- /dev/null +++ b/app/javascript/controllers/frame_controller.js @@ -0,0 +1,18 @@ +import { Controller } from "@hotwired/stimulus" +import { Turbo } from "@hotwired/turbo-rails" + +export default class extends Controller { + morphRender({ detail }) { + detail.render = function (currentElement, newElement) { + Turbo.morphChildren(currentElement, newElement) + } + } + + morphReload(event) { + const newElement = event.detail.newElement + if (newElement && newElement.tagName === "TURBO-FRAME") { + event.preventDefault() + this.element.reload() + } + } +} diff --git a/app/views/collections/show/_closed.html.erb b/app/views/collections/show/_closed.html.erb index ff8132206..7101a1778 100644 --- a/app/views/collections/show/_closed.html.erb +++ b/app/views/collections/show/_closed.html.erb @@ -7,5 +7,5 @@ <%= cards_expander "Done", collection.cards.closed.count %> - <%= turbo_frame_tag :closed_column, src: collection_columns_closed_path(collection), "data-drag-and-drop-refresh": true, refresh: :morph %> + <%= column_frame_tag :closed_column, src: collection_columns_closed_path(collection) %> diff --git a/app/views/collections/show/_column.html.erb b/app/views/collections/show/_column.html.erb index 7d9fae634..ace6be59e 100644 --- a/app/views/collections/show/_column.html.erb +++ b/app/views/collections/show/_column.html.erb @@ -7,5 +7,5 @@ > <%= cards_expander column.name, column.cards.active.count %> - <%= turbo_frame_tag dom_id(column, :cards), src: collection_column_path(column.collection, column), "data-drag-and-drop-refresh": true, refresh: :morph %> + <%= column_frame_tag dom_id(column, :cards), src: collection_column_path(column.collection, column) %> diff --git a/app/views/collections/show/_not_now.html.erb b/app/views/collections/show/_not_now.html.erb index 1d8e39a25..58b516da5 100644 --- a/app/views/collections/show/_not_now.html.erb +++ b/app/views/collections/show/_not_now.html.erb @@ -7,5 +7,5 @@ <%= cards_expander "Not Now", collection.cards.postponed.count %> - <%= turbo_frame_tag :not_now_column, src: collection_columns_not_now_path(collection), "data-drag-and-drop-refresh": true, refresh: :morph %> + <%= column_frame_tag :not_now_column, src: collection_columns_not_now_path(collection) %>