Skip to content

Commit af8d17e

Browse files
authored
Handle all commandInput events in the hook (#136)
1 parent 30a989a commit af8d17e

4 files changed

Lines changed: 23 additions & 26 deletions

File tree

assets/js/app.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ Hooks.CommandInput = {
2626
this.handleEvent('reset', () => {
2727
el.value = '';
2828
});
29+
el.addEventListener('keydown', (e) => {
30+
if (e.code === 'Tab') {
31+
this.pushEventTo(
32+
'#commandInput',
33+
'suggest',
34+
{'value': el.value, 'caret_position': el.selectionEnd}
35+
);
36+
} else if (e.code === 'ArrowUp') {
37+
this.pushEventTo('#commandInput', 'cycle_history_up');
38+
} else if (e.code === 'ArrowDown') {
39+
this.pushEventTo('#commandInput', 'cycle_history_down');
40+
} else {
41+
this.pushEventTo('#commandInput', 'reset_history', {});
42+
}
43+
});
2944
},
3045
updated() {
3146
const newValue = this.el.dataset.input_value;

lib/elixir_console_web/live/console_live/command_input_component.ex

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ defmodule ElixirConsoleWeb.ConsoleLive.CommandInputComponent do
99
import ElixirConsoleWeb.ConsoleLive.Helpers
1010
alias ElixirConsole.Autocomplete
1111

12-
@tab_keycode "Tab"
13-
@up_keycode "ArrowUp"
14-
@down_keycode "ArrowDown"
15-
1612
def mount(socket) do
1713
{:ok,
1814
assign(
@@ -28,11 +24,7 @@ defmodule ElixirConsoleWeb.ConsoleLive.CommandInputComponent do
2824

2925
defp ensure_number(value), do: String.to_integer(value)
3026

31-
def handle_event(
32-
"keydown",
33-
%{"key" => @tab_keycode, "value" => value, "caret_position" => caret_position},
34-
socket
35-
) do
27+
def handle_event("suggest", %{"value" => value, "caret_position" => caret_position}, socket) do
3628
%{bindings: bindings} = socket.assigns
3729

3830
# When testing this event using render_keydown/up, even if the metadata is defined as a number,
@@ -60,7 +52,7 @@ defmodule ElixirConsoleWeb.ConsoleLive.CommandInputComponent do
6052
end
6153
end
6254

63-
def handle_event("keydown", %{"key" => @up_keycode}, socket) do
55+
def handle_event("cycle_history_up", _params, socket) do
6456
%{history_counter: counter, history: history} = socket.assigns
6557
{input_value, new_counter} = get_previous_history_entry(history, counter)
6658
new_caret_position = String.length(input_value)
@@ -73,7 +65,7 @@ defmodule ElixirConsoleWeb.ConsoleLive.CommandInputComponent do
7365
)}
7466
end
7567

76-
def handle_event("keydown", %{"key" => @down_keycode}, socket) do
68+
def handle_event("cycle_history_down", _params, socket) do
7769
%{history_counter: counter, history: history} = socket.assigns
7870
{input_value, new_counter} = get_next_history_entry(history, counter)
7971
new_caret_position = String.length(input_value)
@@ -86,7 +78,7 @@ defmodule ElixirConsoleWeb.ConsoleLive.CommandInputComponent do
8678
)}
8779
end
8880

89-
def handle_event("keydown", _key, socket) do
81+
def handle_event("reset_history", _key, socket) do
9082
{:noreply, assign(socket, history_counter: -1, input_value: "")}
9183
end
9284

lib/elixir_console_web/live/console_live/command_input_component.html.leex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
autocomplete="off"
99
autofocus
1010
name="command"
11-
phx-keydown="keydown"
1211
phx-target="#command_input"
1312
phx-hook="CommandInput"
1413
data-input_value="<%= @input_value %>"

test/elixir_console_web/live/console_live_test.exs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ defmodule ElixirConsoleWeb.ConsoleLiveTest do
103103
{:ok, view, _html} = live(conn, "/")
104104

105105
input = element(view, "#command_input input")
106-
render_keydown(input, %{"key" => "Tab", "value" => "Enum.co", "caret_position" => 7})
106+
render_hook(input, :suggest, %{"value" => "Enum.co", "caret_position" => 7})
107107

108108
html = render(view)
109109

@@ -114,7 +114,7 @@ defmodule ElixirConsoleWeb.ConsoleLiveTest do
114114
{:ok, view, _html} = live(conn, "/")
115115

116116
input = element(view, "#command_input input")
117-
render_keydown(input, %{"key" => "Tab", "value" => "Enum.conc", "caret_position" => 9})
117+
render_hook(input, :suggest, %{"value" => "Enum.conc", "caret_position" => 9})
118118

119119
html = render(view)
120120

@@ -128,12 +128,7 @@ defmodule ElixirConsoleWeb.ConsoleLiveTest do
128128
{:ok, view, _html} = live(conn, "/")
129129

130130
input = element(view, "#command_input input")
131-
132-
render_keydown(input, %{
133-
"key" => "Tab",
134-
"value" => "Enum.co([1,2]) - 2",
135-
"caret_position" => 7
136-
})
131+
render_hook(input, :suggest, %{"value" => "Enum.co([1,2]) - 2", "caret_position" => 7})
137132

138133
html = render(view)
139134

@@ -146,11 +141,7 @@ defmodule ElixirConsoleWeb.ConsoleLiveTest do
146141
input = element(view, "#command_input input")
147142

148143
html =
149-
render_keydown(input, %{
150-
"key" => "Tab",
151-
"value" => "Enum.conc([1,2], [3])",
152-
"caret_position" => 9
153-
})
144+
render_hook(input, :suggest, %{"value" => "Enum.conc([1,2], [3])", "caret_position" => 9})
154145

155146
assert html =~ ~r/\<input .* data-input_value\="Enum.concat\(\[1,2\], \[3\]\)"/
156147
assert html =~ ~r/\<input .* data-caret_position\="11"/

0 commit comments

Comments
 (0)