1
use std::cell::RefCell;
2
use std::rc::Rc;
3
use web_sys::Element;
4

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

            
10
pub struct TagNameAutocomplete;
11

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

            
17
        let fetch_url = wrapper
18
            .get_attribute(AutocompleteAttr::FetchUrl.as_str())
19
            .unwrap_or_else(|| "/api/tags/transaction/names".to_string());
20
        let display_input_id = wrapper.get_attribute(AutocompleteAttr::DisplayInput.as_str())?;
21
        let hidden_input_id = wrapper.get_attribute(AutocompleteAttr::HiddenInput.as_str());
22

            
23
        let display_input = get_input_by_id(&document, &display_input_id)?;
24
        let hidden_input = hidden_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::<TagSuggestion>::new(
31
            display_input.clone(),
32
            hidden_input.unwrap_or_else(|| display_input.clone()),
33
            None,
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 struct TagValueAutocomplete;
46

            
47
impl TagValueAutocomplete {
48
    #[must_use]
49
    pub fn attach(wrapper: Element) -> Option<()> {
50
        let document = web_sys::window()?.document()?;
51

            
52
        let fetch_url = wrapper
53
            .get_attribute(AutocompleteAttr::FetchUrl.as_str())
54
            .unwrap_or_else(|| "/api/tags/transaction/values".to_string());
55
        let display_input_id = wrapper.get_attribute(AutocompleteAttr::DisplayInput.as_str())?;
56
        let hidden_input_id = wrapper.get_attribute(AutocompleteAttr::HiddenInput.as_str());
57
        let depends_on_id = wrapper.get_attribute(AutocompleteAttr::DependsOn.as_str());
58

            
59
        let display_input = get_input_by_id(&document, &display_input_id)?;
60
        let hidden_input = hidden_input_id.and_then(|id| get_input_by_id(&document, &id));
61

            
62
        let container = wrapper
63
            .query_selector(selectors::RESULTS_CONTAINER)
64
            .ok()??;
65

            
66
        let autocomplete = Autocomplete::<TagSuggestion>::new(
67
            display_input.clone(),
68
            hidden_input.unwrap_or_else(|| display_input.clone()),
69
            None,
70
            container,
71
        );
72

            
73
        let mut config = AutocompleteConfig::get(fetch_url);
74

            
75
        if let Some(dep_id) = depends_on_id
76
            && let Some(dep_input) = get_input_by_id(&document, &dep_id)
77
        {
78
            config = config.with_dependency(dep_input);
79
        }
80

            
81
        let ac = Rc::new(RefCell::new(autocomplete));
82
        attach_autocomplete(ac, config);
83

            
84
        Some(())
85
    }
86
}