FIX: Modal onClose was being called repeatedly

This happened because the modal controller was not clearing the `name`
attribute, which is used for looking up the controller to call `onClose`
on.

Every page navigation would call the method over and over, breaking
state in odd ways.
This commit is contained in:
Robin Ward 2019-08-01 15:40:51 -04:00
parent e44d56e4d2
commit f57fdee2f6
2 changed files with 17 additions and 6 deletions

View File

@ -156,11 +156,18 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, {
this.render("hide-modal", { into: "modal", outlet: "modalBody" });
const route = getOwner(this).lookup("route:application");
const name = route.controllerFor("modal").get("name");
const controller = getOwner(this).lookup(`controller:${name}`);
let modalController = route.controllerFor("modal");
const controllerName = modalController.get("name");
if (controllerName) {
const controller = getOwner(this).lookup(
`controller:${controllerName}`
);
if (controller && controller.onClose) {
controller.onClose();
}
modalController.set("name", null);
}
},
/**

View File

@ -1,9 +1,9 @@
import { acceptance } from "helpers/qunit-helpers";
import { acceptance, controllerFor } from "helpers/qunit-helpers";
import showModal from "discourse/lib/show-modal";
acceptance("Modal");
QUnit.test("modal", async assert => {
QUnit.test("modal", async function(assert) {
await visit("/");
assert.ok(
@ -14,11 +14,15 @@ QUnit.test("modal", async assert => {
await click(".login-button");
assert.ok(find(".d-modal:visible").length === 1, "modal should appear");
let controller = controllerFor("modal");
assert.equal(controller.name, "login");
await click(".modal-outer-container");
assert.ok(
find(".d-modal:visible").length === 0,
"modal should disappear when you click outside"
);
assert.equal(controller.name, null);
await click(".login-button");
assert.ok(find(".d-modal:visible").length === 1, "modal should reappear");