use leptos::{ IntoView, component, error::Error, html::Input, prelude::{ ClassAttribute, CollectView, ElementChild, Get, GlobalAttributes, LocalResource, NodeRef, NodeRefAttribute, OnAttribute, OnTargetAttribute, PropAttribute, Set, Show, WriteSignal, signal, }, view, }; use log::{error, info}; use crate::components::get_id; #[component] #[expect(clippy::too_many_lines)] pub fn InputPlaceholder( input_type: &'static str, label: &'static str, node_ref: NodeRef, #[prop(default = None)] initial_value: Option, #[prop(default = None)] reactive: Option>>, #[prop(default = None)] auto_complete: Option< LocalResource>, Error>>, >, ) -> impl IntoView { let id = get_id(); let (autocomplete_signal, autocomplete_set) = signal(String::new()); view! { // TODO: Reference `var(--tw-border-2)` instead of the `2 px` <2025-10-01> {label} // TODO: Reference `var(--tw-border-8)` instead of the `8 px` <2025-10-11> {move || { auto_complete .map(|auto_complete| { provide_auto_completion( auto_complete, autocomplete_set, reactive ) }) }} } } fn provide_auto_completion( auto_complete: LocalResource>, Error>>, autocomplete_set: WriteSignal, reactive: Option>>, ) -> impl IntoView { match auto_complete.get() { Some(resource_result) => match resource_result { Ok(resource_fetch) => resource_fetch.map(|_| { view! { {move || { auto_complete .get() .expect("Worked before") .unwrap() .unwrap() .into_iter() .map(|item| { let item2 = item.clone(); view! { {item} } }) .collect_view() }} } }), Err(err) => { error!( "Error while loading \ autocompletion: {err}" ); None } }, None => None, } }