1
use std::cell::RefCell;
2
use std::rc::Rc;
3
use wasm_bindgen::JsCast;
4
use web_sys::{Document, Element, HtmlInputElement};
5

            
6
use super::component::{Autocomplete, AutocompleteConfig, attach_autocomplete};
7
use crate::data_attrs::{AutocompleteAttr, selectors};
8
use crate::types::AccountSuggestion;
9

            
10
pub struct AccountAutocomplete;
11

            
12
impl AccountAutocomplete {
13
    #[must_use]
14
    pub fn attach(wrapper: Element) -> Option<()> {
15
        let document = web_sys::window()?.document()?;
16

            
17
        let fetch_url = wrapper.get_attribute(AutocompleteAttr::FetchUrl.as_str())?;
18
        let display_input_id = wrapper.get_attribute(AutocompleteAttr::DisplayInput.as_str())?;
19
        let hidden_input_id = wrapper.get_attribute(AutocompleteAttr::HiddenInput.as_str())?;
20
        let currency_input_id = wrapper.get_attribute(AutocompleteAttr::CurrencyInput.as_str());
21

            
22
        let display_input = get_input_by_id(&document, &display_input_id)?;
23
        let hidden_input = get_input_by_id(&document, &hidden_input_id)?;
24
        let currency_input = currency_input_id.and_then(|id| get_input_by_id(&document, &id));
25

            
26
        let container = wrapper
27
            .query_selector(selectors::RESULTS_CONTAINER)
28
            .ok()??;
29

            
30
        let autocomplete = Autocomplete::<AccountSuggestion>::new(
31
            display_input,
32
            hidden_input,
33
            currency_input,
34
            container,
35
        );
36

            
37
        let config = AutocompleteConfig::get(fetch_url);
38
        let ac = Rc::new(RefCell::new(autocomplete));
39
        attach_autocomplete(ac, config);
40

            
41
        Some(())
42
    }
43
}
44

            
45
pub fn get_input_by_id(document: &Document, id: &str) -> Option<HtmlInputElement> {
46
    document
47
        .get_element_by_id(id)?
48
        .dyn_into::<HtmlInputElement>()
49
        .ok()
50
}