material_yew/list/
selected_detail.rs

1use crate::list::ListIndex;
2use js_sys::Object;
3use wasm_bindgen::prelude::*;
4use wasm_bindgen::JsCast;
5
6/// The `RequestSelectedDetail` type
7///
8/// [MWC Documentation](https://github.com/material-components/material-components-web-components/tree/v0.27.0/packages/list#mwc-list-2)
9#[derive(Debug)]
10pub struct SelectedDetail {
11    pub index: ListIndex,
12    pub diff: Option<IndexDiff>,
13}
14
15/// Type for [`SelectedDetail::diff`]
16///
17/// See `**` [here on MWC documentation](https://github.com/material-components/material-components-web-components/tree/v0.27.0/packages/list#mwc-list-2).
18#[derive(Debug)]
19pub struct IndexDiff {
20    pub added: Vec<usize>,
21    pub removed: Vec<usize>,
22}
23
24impl From<JsValue> for SelectedDetail {
25    fn from(value: JsValue) -> Self {
26        let detail = value.unchecked_into::<SelectedDetailJS>();
27        let index = ListIndex::from(detail.index());
28
29        let diff = if detail.diff().is_undefined() {
30            None
31        } else {
32            let diff = detail.diff();
33            Some(IndexDiff {
34                added: diff.added(),
35                removed: diff.removed(),
36            })
37        };
38        Self { index, diff }
39    }
40}
41
42#[wasm_bindgen]
43extern "C" {
44    #[derive(Debug)]
45    #[wasm_bindgen(extends = Object)]
46    type SelectedDetailJS;
47
48    #[wasm_bindgen(method, getter)]
49    pub fn index(this: &SelectedDetailJS) -> JsValue;
50
51    #[wasm_bindgen(method, getter)]
52    pub fn diff(this: &SelectedDetailJS) -> IndexDiffJS;
53
54    #[derive(Debug)]
55    #[wasm_bindgen(extends = Object)]
56    type IndexDiffJS;
57
58    #[wasm_bindgen(method, getter)]
59    pub fn added(this: &IndexDiffJS) -> Vec<usize>;
60
61    #[wasm_bindgen(method, getter)]
62    pub fn removed(this: &IndexDiffJS) -> Vec<usize>;
63}