yew_autocomplete/view/
plain.rs1use web_sys::HtmlInputElement;
2use yew::prelude::*;
3use yew::Html;
4
5use crate::render_if;
6
7use super::render_items;
8use super::RenderHtml;
9
10#[function_component(Plain)]
11pub fn plain<T: 'static + Clone + PartialEq + RenderHtml>() -> Html {
12 let view_ctx = use_context::<super::Context<T>>().expect("view::Context wasn't provided");
13
14 let items = render_items(&view_ctx, &[], &[])
15 .into_iter()
16 .map(|item| {
17 html! { <li>{item}</li>}
18 })
19 .collect::<Html>();
20 let selected_lis = view_ctx
21 .selected_items
22 .iter()
23 .map(|value| {
24 html! { <li class={classes!("autocomplete-item", "selected")}>{value.render()}</li> }
25 })
26 .collect::<Html>();
27
28 let input_cb = view_ctx.callbacks.on_input.clone();
29 let oninput = move |e: InputEvent| {
30 let input = e.target_dyn_into::<HtmlInputElement>().unwrap();
31 input_cb.emit(input.value());
32 };
33 let onsearch = view_ctx.callbacks.resolve.clone();
34
35 html! {
36 <div>
37 {
38 render_if(!view_ctx.selected_items.is_empty(), html!{
39 <ul class="selected-items">
40 { selected_lis }
41 </ul>
42 })
43 }
44 <input
45 type="text"
46 value={view_ctx.value.clone()}
47 {oninput}
48 onkeydown={view_ctx.callbacks.on_keydown.clone()}
49 />
50 {
51 render_if(
52 !view_ctx.auto,
53 html! {
54 <input type="button" value="Search" onclick={onsearch}/>
55 }
56 )
57 }
58 {
59 render_if(!view_ctx.items.is_empty(), html!{
60 <ul class="autocomplete-items">
61 { items }
62 </ul>
63 })
64 }
65 </div>
66 }
67}