ymc/
dialog.rs

1#![allow(unused_variables)]
2#![allow(dead_code)]
3
4mod dialog_action;
5pub use dialog_action::*;
6
7use super::{event_details_into, to_option, WeakComponentLink};
8use gloo::events::EventListener;
9use wasm_bindgen::prelude::*;
10use web_sys::{Element, Node};
11use yew::prelude::*;
12
13/// The `dialog` component.
14///
15/// [Documentation](https://github.com/material-components/material-components-web-components/tree/master/packages/dialog)
16///
17/// ## Actions
18///
19/// In order to pass actions, [`DialogAction`] component should be
20/// used.
21pub struct Dialog {
22    props: DialogProps,
23    node_ref: NodeRef,
24    opening_listener: Option<EventListener>,
25    opened_listener: Option<EventListener>,
26    closing_listener: Option<EventListener>,
27    closed_listener: Option<EventListener>,
28}
29
30/// Props for [`Dialog`]
31///
32/// Documentation:
33///
34/// - [Properties](https://github.com/material-components/material-components-web-components/tree/master/packages/dialog#propertiesattributes)
35/// - [Events](https://github.com/material-components/material-components-web-components/tree/master/packages/dialog#events)
36#[derive(Clone, PartialEq, Properties)]
37pub struct DialogProps {
38    #[prop_or_default]
39    pub open: bool,
40    #[prop_or_default]
41    pub hide_action: bool,
42    #[prop_or_default]
43    pub stacked: bool,
44    #[prop_or_default]
45    pub heading: Option<String>,
46    #[prop_or_default]
47    pub scrim_click_action: Option<String>,
48    #[prop_or_default]
49    pub escape_key_action: Option<String>,
50    #[prop_or_default]
51    pub default_action: Option<String>,
52    #[prop_or_default]
53    pub action_attribute: Option<String>,
54    #[prop_or_default]
55    pub initial_focus_attribute: Option<String>,
56    /// Binds to `opening` event on `dialog`
57    ///
58    /// See events docs to learn more.
59    #[prop_or_default]
60    pub onopening: Callback<()>,
61    /// Binds to `opened` event on `dialog`
62    ///
63    /// See events docs to learn more.
64    #[prop_or_default]
65    pub onopened: Callback<()>,
66    /// Binds to `closing` event on `dialog`
67    ///
68    /// See events docs to learn more.
69    #[prop_or_default]
70    pub onclosing: Callback<String>,
71    /// Binds to `closed` event on `dialog`
72    ///
73    /// See events docs to learn more.
74    #[prop_or_default]
75    pub onclosed: Callback<String>,
76    /// [`WeakComponentLink`] for `Dialog` which provides the following
77    /// methods:
78    /// - ```focus(&self)```
79    /// - ```blur(&self)```
80    /// - ```show(&self)```
81    /// - ```close(&self)```
82    ///
83    /// See [`WeakComponentLink`] documentation for more information
84    #[prop_or_default]
85    pub dialog_link: WeakComponentLink<Dialog>,
86    #[prop_or_default]
87    pub children: Children,
88}
89
90impl Component for Dialog {
91    type Message = ();
92    type Properties = DialogProps;
93
94    fn create(props: Self::Properties, link: ComponentLink<Self>) -> Self {
95        // props.dialog_link.borrow_mut().replace(link);
96        // Dialog::ensure_loaded();
97        Self {
98            props,
99            node_ref: NodeRef::default(),
100            opening_listener: None,
101            opened_listener: None,
102            closing_listener: None,
103            closed_listener: None,
104        }
105    }
106
107    fn update(&mut self, _msg: Self::Message) -> ShouldRender {
108        false
109    }
110
111    fn change(&mut self, props: Self::Properties) -> bool {
112        if self.props != props {
113            self.props = props;
114            true
115        } else {
116            false
117        }
118    }
119
120    fn view(&self) -> Html {
121        //         open=self.props.open
122        //         hideActions?=to_option(self.props.hide_action)
123        //         stacked?=to_option(self.props.stacked)
124        //         heading?=self.props.heading.as_ref()
125        //         scrimClickAction?=self.props.scrim_click_action.as_ref()
126        //         escapeKeyAction?=self.props.escape_key_action.as_ref()
127        //         defaultAction?=self.props.default_action.as_ref()
128        //         actionAttribute?=self.props.action_attribute.as_ref()
129        //         initialFocusAttribute?=self.props.initial_focus_attribute.as_ref()
130        //         ref=self.node_ref.clone()>
131        //         { self.props.children.clone() }
132        
133        html! {
134            <div class="mdc-dialog">
135                <div class="mdc-dialog__container">
136                    <div class="mdc-dialog__surface"
137                        role="alertdialog"
138                        aria-modal="true"
139                        aria-labelledby="my-dialog-title"
140                        aria-describedby="my-dialog-content">
141                        <div class="mdc-dialog__content" id="my-dialog-content">{ "Discard draft?" }</div>
142                        <div class="mdc-dialog__actions">
143                            <button type="button" class="mdc-button mdc-dialog__button" data-mdc-dialog-action="cancel">
144                                <div class="mdc-button__ripple"></div>
145                                <span class="mdc-button__label">{ "Cancel" }</span>
146                            </button>
147                            <button type="button" class="mdc-button mdc-dialog__button" data-mdc-dialog-action="discard">
148                                <div class="mdc-button__ripple"></div>
149                                <span class="mdc-button__label">{ "Discard" }</span>
150                            </button>
151                        </div>
152                    </div>
153                </div>
154                <div class="mdc-dialog__scrim"></div>
155            </div>
156        }
157    }
158
159    fn rendered(&mut self, first_render: bool) {
160        // if first_render {
161        //     let onopening = self.props.onopening.clone();
162        //     let onopened = self.props.onopened.clone();
163        //     let onclosing = self.props.onclosing.clone();
164        //     let onclosed = self.props.onclosed.clone();
165
166        //     let element = self.node_ref.cast::<Element>().unwrap();
167
168        //     self.opening_listener = Some(EventListener::new(&element, "opening", move |_| {
169        //         onopening.emit(())
170        //     }));
171
172        //     self.opened_listener = Some(EventListener::new(&element, "opened", move |_| {
173        //         onopened.emit(())
174        //     }));
175
176        //     self.closing_listener = Some(EventListener::new(&element, "closing", move |event| {
177        //         onclosing.emit(action_from_event(event))
178        //     }));
179
180        //     self.closed_listener = Some(EventListener::new(&element, "closed", move |event| {
181        //         onclosed.emit(action_from_event(event))
182        //     }));
183        // }
184    }
185}
186
187impl WeakComponentLink<Dialog> {
188    pub fn focus(&self) {
189        // (*self.borrow().as_ref().unwrap().get_component().unwrap())
190        //     .node_ref
191        //     .cast::<Dialog>()
192        //     .unwrap()
193        //     .focus()
194    }
195
196    pub fn blur(&self) {
197        // (*self.borrow().as_ref().unwrap().get_component().unwrap())
198        //     .node_ref
199        //     .cast::<Dialog>()
200        //     .unwrap()
201        //     .blur()
202    }
203
204    pub fn show(&self) {
205        // (*self.borrow().as_ref().unwrap().get_component().unwrap())
206        //     .node_ref
207        //     .cast::<Dialog>()
208        //     .unwrap()
209        //     .show()
210    }
211
212    pub fn close(&self) {
213        // (*self.borrow().as_ref().unwrap().get_component().unwrap())
214        //     .node_ref
215        //     .cast::<Dialog>()
216        //     .unwrap()
217        //     .close()
218    }
219}
220
221// fn action_from_event(event: &Event) -> String {
222//     event_details_into::<DialogActionType>(event).action()
223// }