yew_autocomplete/view/
bulma.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(Bulma)]
11pub fn bulma<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, &["dropdown-item"], &["is-active"])
15 .into_iter()
16 .collect::<Vec<_>>();
17 let selected_lis = view_ctx
18 .selected_items
19 .iter()
20 .map(|value| {
21 html! { <li class={classes!("autocomplete-item", "selected")}>{value.render()}</li>}
22 })
23 .collect::<Html>();
24
25 let input_cb = view_ctx.callbacks.on_input.clone();
26 let oninput = move |e: InputEvent| {
27 let input = e.target_dyn_into::<HtmlInputElement>().unwrap();
28 input_cb.emit(input.value());
29 };
30 let onclick = view_ctx.callbacks.resolve.clone();
31
32 html! {
33 <div>
34 {
35 render_if(!view_ctx.selected_items.is_empty(), html!{
36 <ul class="selected-items">
37 { selected_lis }
38 </ul>
39 })
40 }
41 <div class="field">
42 <div class="field has-addons" style="margin-bottom: 0">
43 <div class="control is-expanded">
44 <input
45 class="input"
46 type="text"
47 value={view_ctx.value.clone()}
48 {oninput}
49 onkeydown={view_ctx.callbacks.on_keydown.clone()}
50 />
51 </div>
52 {
53 render_if(
54 !view_ctx.auto,
55 html! {
56 <div class="control">
57 <input class="button is-primary" type="button" value="Search" {onclick}/>
58 </div>
59 }
60 )
61 }
62 </div>
63 {
64 render_if(!view_ctx.items.is_empty(), html!{
65 <div class="dropdown is-active autocomplete-items">
66 <div class="dropdown-menu">
67 <div class="dropdown-content">
68 { items }
69 </div>
70 </div>
71 </div>
72 })
73 }
74 </div>
75 </div>
76 }
77}