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}