Autofocus search when opened

This commit is contained in:
Mikko Ahlroth 2023-10-16 20:32:46 +03:00
parent 4f12db5cb9
commit fb889ea32f
2 changed files with 28 additions and 2 deletions

View file

@ -5,9 +5,12 @@ import lustre/element/html.{button, div, input}
import lustre/attribute import lustre/attribute
import lustre/event import lustre/event
import elekf/web/components/icon.{Alt, icon} import elekf/web/components/icon.{Alt, icon}
import elekf/utils/lustre
const search_bar_input_id = "search-bar-input" const search_bar_input_id = "search-bar-input"
type SearchElement
pub type Model { pub type Model {
Model(search_text: String, show_search: Bool) Model(search_text: String, show_search: Bool)
} }
@ -21,9 +24,14 @@ pub fn init() {
Model(search_text: "", show_search: False) Model(search_text: "", show_search: False)
} }
pub fn update(model, msg) { pub fn update(model: Model, msg) {
case msg { case msg {
ToggleShow -> Model(..model, show_search: !model.show_search) ToggleShow -> {
let show_search = !model.show_search
lustre.after_next_render(focus)
Model(..model, show_search: show_search)
}
UpdateSearch(text) -> Model(..model, search_text: text) UpdateSearch(text) -> Model(..model, search_text: text)
} }
} }
@ -60,3 +68,14 @@ pub fn view(model: Model) {
], ],
) )
} }
fn focus() {
get_elem(search_bar_input_id)
|> do_focus()
}
@external(javascript, "../../../search_ffi.mjs", "focus")
fn do_focus(elem: SearchElement) -> Nil
@external(javascript, "../../../search_ffi.mjs", "getElem")
fn get_elem(id: String) -> SearchElement

7
src/search_ffi.mjs Normal file
View file

@ -0,0 +1,7 @@
export function getElem(id) {
return document.getElementById(id);
}
export function focus(elem) {
elem.focus();
}