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// }