ymc/chip.rs
1#![allow(unused_variables)]
2#![allow(dead_code)]
3#![allow(unused_imports)]
4
5use super::{event_into_details, to_option, WeakComponentLink};
6use gloo::events::EventListener;
7use wasm_bindgen::prelude::*;
8use web_sys::Node;
9use yew::prelude::*;
10
11pub struct Chip {
12 link: ComponentLink<Self>,
13 label: String,
14 // onsignal: Callback<()>,
15}
16
17pub enum Msg {
18 Clicked,
19}
20
21/// Props for [`Chip`]
22///
23/// [Documentation for properties](https://github.com/material-components/material-components-web-components/tree/master/packages/button#propertiesattributes)
24#[derive(Debug, Properties, Clone)]
25pub struct ChipProps {
26 pub label: String,
27 #[prop_or_default]
28 pub icon: Option<String>,
29 #[prop_or_default]
30 pub raised: bool,
31 #[prop_or_default]
32 pub unelevated: bool,
33 #[prop_or_default]
34 pub outlined: bool,
35 #[prop_or_default]
36 pub dense: bool,
37 #[prop_or_default]
38 pub disabled: bool,
39 #[prop_or_default]
40 pub trailing_icon: bool,
41 // #[prop_or_default]
42 // pub onsignal: Callback<()>,
43}
44
45// label=props.label
46// icon?=props.icon.as_ref()
47// raised?=to_option(props.raised)
48// unelevated?=to_option(props.unelevated)
49// outlined?=to_option(props.outlined)
50// dense?=to_option(props.dense)
51// trailingIcon?=to_option(props.trailing_icon)
52// disabled=props.disabled
53
54impl Component for Chip {
55 type Message = Msg;
56 type Properties = ChipProps;
57
58 fn create(props: Self::Properties, link: ComponentLink<Self>) -> Self {
59 Self {
60 link,
61 label: props.label,
62 // onsignal: props.onsignal,
63 }
64 }
65
66 fn update(&mut self, msg: Self::Message) -> ShouldRender {
67 match msg {
68 Msg::Clicked => {
69 // self.onsignal.emit(());
70 }
71 }
72 false
73 }
74
75 fn change(&mut self, props: Self::Properties) -> ShouldRender {
76 self.label = props.label;
77 // self.onsignal = props.onsignal;
78 true
79 }
80
81 fn view(&self) -> Html {
82 html! {
83 <div class="mdc-chip" role="row">
84 <div class="mdc-chip__ripple"></div>
85 <span role="gridcell">
86 <span role="button" tabindex="0" class="mdc-chip__primary-action">
87 <span class="mdc-chip__text">{ &self.label }</span>
88 </span>
89 </span>
90 </div>
91 }
92 }
93}
94
95// chips
96
97
98pub struct Chips {
99 props: ChipsProps,
100 node_ref: NodeRef,
101 action_listener: Option<EventListener>,
102 selected_listener: Option<EventListener>,
103}
104
105/// Props for [`Chips`]
106///
107/// [Documentation for properties](https://github.com/material-components/material-components-web-components/tree/master/packages/button#propertiesattributes)
108#[derive(Clone, PartialEq, Properties)]
109pub struct ChipsProps {
110 #[prop_or_default]
111 pub activatable: bool,
112 #[prop_or_default]
113 pub root_tabbable: bool,
114 #[prop_or_default]
115 pub multi: bool,
116 #[prop_or_default]
117 pub wrap_focus: bool,
118 #[prop_or_default]
119 pub item_roles: Option<String>,
120 #[prop_or_default]
121 pub inner_role: Option<String>,
122 #[prop_or_default]
123 pub noninteractive: bool,
124 /// Binds to `action` event on `list`
125 // #[prop_or_default]
126 // pub onaction: Callback<ListIndex>,
127 // /// Binds to `selected` event `list`
128 // #[prop_or_default]
129 // pub onselected: Callback<SelectedDetail>,
130 /// [`WeakComponentLink`] for `List` which provides the following methods
131 /// - ```toggle(&self, index: usize, force: bool)```
132 /// - ```get_focused_item_index(&self) -> usize```
133 /// - ```focus_item_at_index(&self, index: usize)```
134 ///
135 /// See [`WeakComponentLink`] documentation for more information
136 #[prop_or_default]
137 pub list_link: WeakComponentLink<Chips>,
138 #[prop_or_default]
139 pub children: Children,
140}
141
142// label=props.label
143// icon?=props.icon.as_ref()
144// raised?=to_option(props.raised)
145// unelevated?=to_option(props.unelevated)
146// outlined?=to_option(props.outlined)
147// dense?=to_option(props.dense)
148// trailingIcon?=to_option(props.trailing_icon)
149// disabled=props.disabled
150
151impl Component for Chips {
152 type Message = Msg;
153 type Properties = ChipsProps;
154
155 fn create(props: Self::Properties, link: ComponentLink<Self>) -> Self {
156 Self {
157 props,
158 node_ref: NodeRef::default(),
159 action_listener: None,
160 selected_listener: None,
161 }
162 }
163
164 fn update(&mut self, msg: Self::Message) -> ShouldRender {
165 match msg {
166 Msg::Clicked => {
167 // self.onsignal.emit(());
168 }
169 }
170 false
171 }
172
173 fn change(&mut self, props: Self::Properties) -> ShouldRender {
174 if self.props != props {
175 self.props = props;
176 true
177 } else {
178 false
179 }
180 }
181
182 fn view(&self) -> Html {
183 html! {
184 <div class="mdc-chip-set" role="grid">
185 { self.view_items() }
186 </div>
187 }
188 }
189}
190
191impl Chips {
192 fn view_items(&self) -> Html {
193 html! {{
194 for self.props.children.iter().enumerate().map(|(i, mut c)| {
195 c
196 })
197 }}
198 }
199}
200
201impl WeakComponentLink<Chips> {
202 /// Binds to `toggle` method.
203 ///
204 /// See [here](https://github.com/material-components/material-components-web-components/tree/master/packages/list#methods) for details
205 pub fn toggle(&self, index: usize, force: bool) {
206 // let list = (*self.borrow().as_ref().unwrap().get_component().unwrap())
207 // .node_ref
208 // .cast::<List>()
209 // .unwrap();
210 // list.toggle(index, force)
211 }
212
213 /// Binds to `getFocusedItemIndex` method.
214 ///
215 /// See [here](https://github.com/material-components/material-components-web-components/tree/master/packages/list#methods) for details
216 pub fn get_focused_item_index(&self) -> usize {
217 // (*self.borrow().as_ref().unwrap().get_component().unwrap())
218 // .node_ref
219 // .cast::<List>()
220 // .unwrap()
221 // .get_focused_item_index()
222 unimplemented!()
223 }
224
225 /// Binds to `focusItemAtIndex` method.
226 ///
227 /// See [here](https://github.com/material-components/material-components-web-components/tree/master/packages/list#methods) for details
228 pub fn focus_item_at_index(&self, index: usize) {
229 // (*self.borrow().as_ref().unwrap().get_component().unwrap())
230 // .node_ref
231 // .cast::<List>()
232 // .unwrap()
233 // .focus_item_at_index(index)
234 }
235}