Lines
0 %
Functions
Branches
100 %
use std::cell::RefCell;
use std::rc::Rc;
use wasm_bindgen::JsCast;
use web_sys::{Document, Element, HtmlInputElement};
use super::component::{Autocomplete, AutocompleteConfig, attach_autocomplete};
use crate::data_attrs::{AutocompleteAttr, selectors};
use crate::types::AccountSuggestion;
pub struct AccountAutocomplete;
impl AccountAutocomplete {
#[must_use]
pub fn attach(wrapper: Element) -> Option<()> {
let document = web_sys::window()?.document()?;
let fetch_url = wrapper.get_attribute(AutocompleteAttr::FetchUrl.as_str())?;
let display_input_id = wrapper.get_attribute(AutocompleteAttr::DisplayInput.as_str())?;
let hidden_input_id = wrapper.get_attribute(AutocompleteAttr::HiddenInput.as_str())?;
let currency_input_id = wrapper.get_attribute(AutocompleteAttr::CurrencyInput.as_str());
let display_input = get_input_by_id(&document, &display_input_id)?;
let hidden_input = get_input_by_id(&document, &hidden_input_id)?;
let currency_input = currency_input_id.and_then(|id| get_input_by_id(&document, &id));
let container = wrapper
.query_selector(selectors::RESULTS_CONTAINER)
.ok()??;
let autocomplete = Autocomplete::<AccountSuggestion>::new(
display_input,
hidden_input,
currency_input,
container,
);
let config = AutocompleteConfig::get(fetch_url);
let ac = Rc::new(RefCell::new(autocomplete));
attach_autocomplete(ac, config);
Some(())
}
pub fn get_input_by_id(document: &Document, id: &str) -> Option<HtmlInputElement> {
document
.get_element_by_id(id)?
.dyn_into::<HtmlInputElement>()
.ok()