53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
use futures::{future::FutureExt, pin_mut, select};
|
|
use web_sys::{Element, HtmlDialogElement};
|
|
|
|
use crate::{
|
|
on_click,
|
|
utils::{by_id, selector_and_clone, SelectorExt},
|
|
};
|
|
|
|
pub enum DialogContent<'a, T>
|
|
where
|
|
T: Fn(&Element),
|
|
{
|
|
Text(&'a str),
|
|
CloneFromElement(&'a str, T),
|
|
}
|
|
|
|
pub async fn show<T>(content: DialogContent<'_, T>) -> bool
|
|
where
|
|
T: Fn(&Element),
|
|
{
|
|
let dialog: HtmlDialogElement = by_id("modal-dialog");
|
|
|
|
let input_ok: Element = dialog.selector(".ok");
|
|
let input_cancel: Element = dialog.selector(".cancel");
|
|
|
|
let content_element = dialog.selector::<Element>(".content");
|
|
|
|
match content {
|
|
DialogContent::Text(message) => content_element.set_inner_html(message),
|
|
DialogContent::CloneFromElement(element_selector, initilizer) => {
|
|
let element: Element = selector_and_clone(element_selector);
|
|
content_element.set_inner_html("");
|
|
content_element.append_child(&element).unwrap();
|
|
initilizer(&element);
|
|
}
|
|
}
|
|
|
|
dialog.show_modal().unwrap();
|
|
|
|
let click_ok = on_click::OnClick::new(&input_ok).fuse();
|
|
let click_cancel = on_click::OnClick::new(&input_cancel).fuse();
|
|
|
|
pin_mut!(click_ok, click_cancel);
|
|
|
|
let result = select! {
|
|
() = click_ok => true,
|
|
() = click_cancel => false,
|
|
};
|
|
|
|
dialog.close();
|
|
|
|
result
|
|
}
|