Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

turbo:morph-element fires twice #1273

Open
danielfriis opened this issue Jun 4, 2024 · 1 comment
Open

turbo:morph-element fires twice #1273

danielfriis opened this issue Jun 4, 2024 · 1 comment

Comments

@danielfriis
Copy link

danielfriis commented Jun 4, 2024

I need to reconnect a few Stimulus controllers after page has morphed.

To do that, I was making use of turbo:morph@window->controller#reconnect, but that doesn't get triggered when inside a Turbo Frame.

Then I switched to turbo:morph-element->controller#reconnect, which works, but fires twice.

I this expected behaviour, or am I missing something?

@4lllex
Copy link

4lllex commented Sep 1, 2024

Should fire once. I've put together a test script below if you want to try and reproduce the issue:

# Save it to file and run as a ruby script:
#
#   ruby test.rb

require "bundler/inline"

gemfile true do
  source "https://rubygems.org"

  gem "rails"
  gem "propshaft"
  gem "puma"
  gem "sqlite3", "~> 1.4"
  gem "turbo-rails"
  gem "stimulus-rails"

  gem "capybara"
  gem "cuprite", require: "capybara/cuprite"
end

ENV["DATABASE_URL"] = "sqlite3::memory:"
ENV["RAILS_ENV"] = "test"

require "active_record/railtie"
# require "active_storage/engine"
require "action_controller/railtie"
require "action_view/railtie"
# require "action_mailer/railtie"
# require "active_job/railtie"
require "action_cable/engine"
# require "action_mailbox/engine"
# require "action_text/engine"
require "rails/test_unit/railtie"

class App < Rails::Application
  config.load_defaults Rails::VERSION::STRING.to_f
  config.root = __dir__
  config.hosts << "example.org"
  config.eager_load = false
  config.session_store :cookie_store, key: "cookie_store_key"
  config.secret_key_base = "secret_key_base"
  config.consider_all_requests_local = true
  config.action_cable.cable = {"adapter" => "async"}
  config.turbo.draw_routes = false
  Rails.logger = config.logger = Logger.new($stdout)
  routes.append do
    root to: "application#index"
    post "/", to: "application#create"
  end
end

Rails.application.initialize!

class ApplicationController < ActionController::Base
  include Rails.application.routes.url_helpers

  def index
    render inline: <<~TEMPLATE, formats: :html
      <html>
        <head>
          <%= csrf_meta_tags %>
          <script type="importmap" data-turbo-track="reload">
            {
              "imports": {
                "@hotwired/turbo-rails": "<%= asset_path("turbo.js") %>",
                "@hotwired/stimulus": "<%= asset_path("stimulus.js") %>"
              }
            }
          </script>
          <script type="module">
            import "@hotwired/turbo-rails"
            import { Application, Controller } from "@hotwired/stimulus";
            window.Stimulus = Application.start();
            window.count = 0;
            Stimulus.register("hello", class extends Controller {
              reconnect() {
                window.count += 1;
                this.element.textContent = window.count;
              }
            })
          </script>
          <meta name="turbo-refresh-method" content="morph">
        </head>
        <body>

          <div id="reconnected"
            data-controller="hello"
            data-action="turbo:morph-element->hello#reconnect">
          </div>

          <%= button_to "refresh", "/" %>

        </body>
      </html>
    TEMPLATE
  end

  def create
    render turbo_stream: turbo_stream.action(:refresh, nil)
  end
end

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :cuprite,
    using: :chrome,
    screen_size: [1400, 1400],
    options: {
      js_errors: true,
      headless: true
    }
end

Capybara.configure do |config|
  config.server = :puma, {Silent: true}
  config.default_normalize_ws = true
end

require "rails/test_help"

class TurboSystemTest < ApplicationSystemTestCase
  test "a bug" do
    visit "/"
    click_button "refresh"

    assert_selector "#reconnected", text: "1"
  end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants