Skip to content

Commit 54e415c

Browse files
authored
keep active focus when reconnecting (#3699)
* keep active focus when reconnecting Relates to: https://elixirforum.com/t/how-to-reduce-impact-of-deployments-on-a-liveview/69660 * remove test for unused field
1 parent 513aee4 commit 54e415c

File tree

5 files changed

+16
-5
lines changed

5 files changed

+16
-5
lines changed

assets/js/phoenix_live_view/live_socket.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ export default class LiveSocket {
138138
this.viewLogger = opts.viewLogger
139139
this.metadataCallbacks = opts.metadata || {}
140140
this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {})
141-
this.activeElement = null
142141
this.prevActive = null
143142
this.silenced = false
144143
this.main = null

assets/js/phoenix_live_view/view.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -888,8 +888,6 @@ export default class View {
888888
}
889889
this.destroyAllChildren()
890890
this.liveSocket.dropActiveElement(this)
891-
// document.activeElement can be null in Internet Explorer 11
892-
if(document.activeElement){ document.activeElement.blur() }
893891
if(this.liveSocket.isUnloaded()){
894892
this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT)
895893
}

assets/test/live_socket_test.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ describe("LiveSocket", () => {
3939
expect(liveSocket.viewLogger).toBeUndefined()
4040
expect(liveSocket.unloaded).toBe(false)
4141
expect(liveSocket.bindingPrefix).toBe("phx-")
42-
expect(liveSocket.activeElement).toBe(null)
4342
expect(liveSocket.prevActive).toBe(null)
4443
})
4544

@@ -49,7 +48,6 @@ describe("LiveSocket", () => {
4948
expect(liveSocket.socket.onOpen).toBeDefined()
5049
expect(liveSocket.unloaded).toBe(false)
5150
expect(liveSocket.bindingPrefix).toBe("phx-")
52-
expect(liveSocket.activeElement).toBe(null)
5351
expect(liveSocket.prevActive).toBe(null)
5452
})
5553

test/e2e/support/form_live.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ defmodule Phoenix.LiveViewTest.E2E.FormLive do
7070
Enum.into(params, %{
7171
"a" => "foo",
7272
"b" => "bar",
73+
"c" => "baz",
7374
"id" => "test-form",
7475
"phx-change" => "validate"
7576
})
@@ -141,6 +142,7 @@ defmodule Phoenix.LiveViewTest.E2E.FormLive do
141142
>
142143
<input type="text" name="a" readonly value={@params["a"]} />
143144
<input type="text" name="b" value={@params["b"]} />
145+
<input type="text" name="c" value={@params["c"]} />
144146
<button type="submit" phx-disable-with="Submitting" phx-click={JS.dispatch("test")}>
145147
Submit with JS
146148
</button>

test/e2e/tests/forms.spec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ for(let path of ["/form/nested", "/form"]){
8484
await syncLV(page)
8585

8686
await page.locator("input[name=b]").fill("test")
87+
await page.locator("input[name=c]").fill("hello world")
88+
await expect(page.locator("input[name=c]")).toBeFocused()
8789
await syncLV(page)
8890

8991
await page.evaluate(() => new Promise((resolve) => window.liveSocket.disconnect(resolve)))
@@ -102,6 +104,10 @@ for(let path of ["/form/nested", "/form"]){
102104
await expect(page.locator(".phx-loading")).toHaveCount(0)
103105

104106
await expect(page.locator("input[name=b]")).toHaveValue("test")
107+
// c should still be focused (at least when not using a nested LV)
108+
if(path === "/form"){
109+
await expect(page.locator("input[name=c]")).toBeFocused()
110+
}
105111

106112
expect(webSocketEvents).toEqual(expect.arrayContaining([
107113
{type: "sent", payload: expect.stringContaining("phx_join")},
@@ -115,6 +121,8 @@ for(let path of ["/form/nested", "/form"]){
115121
await syncLV(page)
116122

117123
await page.locator("input[name=b]").fill("test")
124+
// blur, otherwise the input would not be morphed anyway
125+
await page.locator("input[name=b]").blur()
118126
await expect(page.locator("form")).toHaveAttribute("phx-change", /push/)
119127
await syncLV(page)
120128

@@ -132,6 +140,8 @@ for(let path of ["/form/nested", "/form"]){
132140
await syncLV(page)
133141

134142
await page.locator("input[name=b]").fill("test")
143+
// blur, otherwise the input would not be morphed anyway
144+
await page.locator("input[name=b]").blur()
135145
await syncLV(page)
136146

137147
await page.evaluate(() => new Promise((resolve) => window.liveSocket.disconnect(resolve)))
@@ -149,6 +159,8 @@ for(let path of ["/form/nested", "/form"]){
149159
await syncLV(page)
150160

151161
await page.locator("input[name=b]").fill("test")
162+
// blur, otherwise the input would not be morphed anyway
163+
await page.locator("input[name=b]").blur()
152164
await syncLV(page)
153165

154166
await page.evaluate(() => new Promise((resolve) => window.liveSocket.disconnect(resolve)))
@@ -166,6 +178,8 @@ for(let path of ["/form/nested", "/form"]){
166178
await syncLV(page)
167179

168180
await page.locator("input[name=b]").fill("test")
181+
// blur, otherwise the input would not be morphed anyway
182+
await page.locator("input[name=b]").blur()
169183
await syncLV(page)
170184

171185
await page.evaluate(() => new Promise((resolve) => window.liveSocket.disconnect(resolve)))

0 commit comments

Comments
 (0)