material_yew/list/
list_item.rs1use crate::list::request_selected::request_selected_listener;
2use crate::list::{GraphicType, RequestSelectedDetail};
3use crate::{bool_to_option, to_option_string};
4use gloo::events::EventListener;
5use wasm_bindgen::prelude::*;
6use yew::prelude::*;
7use yew::virtual_dom::AttrValue;
8
9#[wasm_bindgen(module = "/build/mwc-list-item.js")]
10extern "C" {
11 #[derive(Debug)]
12 type ListItem;
13
14 #[wasm_bindgen(getter, static_method_of = ListItem)]
15 fn _dummy_loader() -> JsValue;
16}
17
18loader_hack!(ListItem);
19
20pub struct MatListItem {
24 node_ref: NodeRef,
25 request_selected_listener: Option<EventListener>,
26}
27
28#[derive(Debug, Properties, PartialEq, Clone)]
33pub struct ListItemProps {
34 #[prop_or_default]
35 pub value: Option<AttrValue>,
36 #[prop_or_default]
37 pub group: bool,
38 #[prop_or(- 1)]
39 pub tabindex: i32,
40 #[prop_or_default]
41 pub disabled: bool,
42 #[prop_or_default]
43 pub twoline: bool,
44 #[prop_or_default]
45 pub activated: bool,
46 #[prop_or(GraphicType::Null)]
47 pub graphic: GraphicType,
48 #[prop_or_default]
49 pub multiple_graphics: bool,
50 #[prop_or_default]
51 pub has_meta: bool,
52 #[prop_or_default]
53 pub noninteractive: bool,
54 #[prop_or_default]
55 pub selected: bool,
56 #[prop_or_default]
58 pub on_request_selected: Callback<RequestSelectedDetail>,
59 pub children: Children,
60}
61
62impl Component for MatListItem {
63 type Message = ();
64 type Properties = ListItemProps;
65
66 fn create(_: &Context<Self>) -> Self {
67 ListItem::ensure_loaded();
68 Self {
69 node_ref: NodeRef::default(),
70 request_selected_listener: None,
71 }
72 }
73
74 fn view(&self, ctx: &Context<Self>) -> Html {
75 let props = ctx.props();
76 html! {
77 <mwc-list-item
78 value={props.value.clone()}
79 group={bool_to_option(props.group)}
80 tabindex={to_option_string(props.tabindex)}
81 disabled={props.disabled}
82 twoline={bool_to_option(props.twoline)}
83 activated={bool_to_option(props.activated)}
84 graphic={to_option_string(props.graphic.to_string())}
85 multipleGraphics={bool_to_option(props.multiple_graphics)}
86 hasMeta={bool_to_option(props.has_meta)}
87 noninteractive={bool_to_option(props.noninteractive)}
88 selected={props.selected}
89 ref={self.node_ref.clone()}
90 >{props.children.clone()}</mwc-list-item>
91 }
92 }
93
94 fn rendered(&mut self, ctx: &Context<Self>, _first_render: bool) {
95 let props = ctx.props();
96 if self.request_selected_listener.is_none() {
97 self.request_selected_listener = Some(request_selected_listener(
98 &self.node_ref,
99 props.on_request_selected.clone(),
100 ));
101 }
102 }
103}