Skip to content

Commit 02b574e

Browse files
author
Jamie Klassen
committed
add keyboard shortcuts to focus/blur search input
Signed-off-by: Jamie Klassen <[email protected]>
1 parent e7d9e64 commit 02b574e

File tree

2 files changed

+715
-447
lines changed

2 files changed

+715
-447
lines changed

elm/Search.elm

+33-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
port module Main exposing (main)
22

33
import Browser
4+
import Browser.Dom as BD
5+
import Browser.Events as BE
46
import Dict exposing (Dict)
57
import Dict.Extra as DE
68
import Html exposing (Html, div, text)
@@ -11,6 +13,7 @@ import Json.Decode as JD
1113
import Json.Decode.Extra as JDE exposing (andMap)
1214
import Maybe.Extra as ME
1315
import Query
16+
import Task
1417
import Time
1518

1619

@@ -50,6 +53,9 @@ type Msg
5053
= DocumentsFetched (Result Http.Error BooklitIndex)
5154
| SetQuery String
5255
| EmitQueryEvent
56+
| KeyDown String
57+
| SearchInputFocused (Result BD.Error ())
58+
| SearchInputBlurred (Result BD.Error ())
5359

5460

5561
searchEmitInterval : Float
@@ -108,10 +114,34 @@ update msg model =
108114
else
109115
( { model | queryEventEmitted = True }, emitSearchTerm model.query )
110116

117+
KeyDown s ->
118+
case s of
119+
"/" ->
120+
( model
121+
, Task.attempt SearchInputFocused <| BD.focus "search-input"
122+
)
123+
124+
"Escape" ->
125+
( model
126+
, Task.attempt SearchInputBlurred <| BD.blur "search-input"
127+
)
128+
129+
_ ->
130+
( model, Cmd.none )
131+
132+
SearchInputFocused _ ->
133+
( model, Cmd.none )
134+
135+
SearchInputBlurred _ ->
136+
( model, Cmd.none )
137+
111138

112139
subscriptions : Model -> Sub Msg
113140
subscriptions model =
114-
Time.every searchEmitInterval (always EmitQueryEvent)
141+
Sub.batch
142+
[ Time.every searchEmitInterval (always EmitQueryEvent)
143+
, BE.onKeyDown <| JD.map KeyDown <| JD.field "key" JD.string
144+
]
115145

116146

117147
performSearch : Model -> Model
@@ -149,6 +179,7 @@ view model =
149179
[ Html.input
150180
[ HA.type_ "search"
151181
, HA.class "search-input"
182+
, HA.id "search-input"
152183
, HE.onInput SetQuery
153184
, HA.placeholder "Search the docs…"
154185
, HA.required True
@@ -188,7 +219,7 @@ suggestedOrder a b =
188219

189220

190221
viewDocumentResult : Model -> DocumentResult -> Html Msg
191-
viewDocumentResult model { tag, result, doc } =
222+
viewDocumentResult model ({ tag, result, doc } as dr) =
192223
Html.li []
193224
[ Html.a [ HA.href doc.location ]
194225
[ Html.article []

0 commit comments

Comments
 (0)