1
1
port module Main exposing (main )
2
2
3
3
import Browser
4
+ import Browser.Dom as BD
5
+ import Browser.Events as BE
4
6
import Dict exposing (Dict )
5
7
import Dict.Extra as DE
6
8
import Html exposing (Html , div , text )
@@ -11,6 +13,7 @@ import Json.Decode as JD
11
13
import Json.Decode.Extra as JDE exposing (andMap )
12
14
import Maybe.Extra as ME
13
15
import Query
16
+ import Task
14
17
import Time
15
18
16
19
@@ -50,6 +53,9 @@ type Msg
50
53
= DocumentsFetched ( Result Http . Error BooklitIndex )
51
54
| SetQuery String
52
55
| EmitQueryEvent
56
+ | KeyDown String
57
+ | SearchInputFocused ( Result BD . Error () )
58
+ | SearchInputBlurred ( Result BD . Error () )
53
59
54
60
55
61
searchEmitInterval : Float
@@ -108,10 +114,34 @@ update msg model =
108
114
else
109
115
( { model | queryEventEmitted = True }, emitSearchTerm model. query )
110
116
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
+
111
138
112
139
subscriptions : Model -> Sub Msg
113
140
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
+ ]
115
145
116
146
117
147
performSearch : Model -> Model
@@ -149,6 +179,7 @@ view model =
149
179
[ Html . input
150
180
[ HA . type_ " search"
151
181
, HA . class " search-input"
182
+ , HA . id " search-input"
152
183
, HE . onInput SetQuery
153
184
, HA . placeholder " Search the docs…"
154
185
, HA . required True
@@ -188,7 +219,7 @@ suggestedOrder a b =
188
219
189
220
190
221
viewDocumentResult : Model -> DocumentResult -> Html Msg
191
- viewDocumentResult model { tag, result, doc } =
222
+ viewDocumentResult model ( { tag, result, doc } as dr ) =
192
223
Html . li []
193
224
[ Html . a [ HA . href doc. location ]
194
225
[ Html . article []
0 commit comments