use leptos::{either::Either, ev::MouseEvent, prelude::*}; use reactive_stores::Field; use src_common::models::loot_filter::{ Filter, FilterGroup, FilterGroupStoreFields, FilterLeaf, FilterLeafStoreFields, FilterRemain, FilterRemainStoreFields, FilterStoreFields, }; use crate::components::icons; fn group( filter: Field, group: Field, on_action: Callback<(Action,)>, selected: Field>>, root: bool, ) -> impl IntoView { let header = move || { if root { "Root".to_string() } else { filter.id().get().to_string() } }; let (expanded, set_expanded) = signal(false); let new_rule = move |ev: MouseEvent| { ev.stop_propagation(); group.filters().write().push(Filter::default_leaf()); set_expanded.set(true); }; let new_group = move |ev: MouseEvent| { ev.stop_propagation(); group.filters().write().push(Filter::default_group()); set_expanded.set(true); }; let nav_icon = move || { view! { } }; let active = move || match selected.get() { Some(f) => filter.id().get() == f.id().get(), None => false, }; view! {
  • {nav_icon}
    {header}
      { if i > 0 { group.filters().write().swap(i, i - 1); } } Action::Down => { if i < group.filters().get().len() - 1 { group.filters().write().swap(i, i + 1); } } a @ Action::Select(_) => { on_action.run((a,)); } } } /> } } />
  • } } fn leaf( filter: Field, leaf: Field, on_action: Callback<(Action,)>, selected: Field>>, ) -> impl IntoView { let header = move || filter.id().get().to_string(); let icon = move || { if leaf.show().get() { Either::Left(view! { }) } else { Either::Right(view! { }) } }; let active = move || match selected.get() { Some(f) => filter.id().get() == f.id().get(), None => false, }; view! {
  • {icon}
    {header}
  • } } pub enum Action { Up, Down, Select(Field), } #[component] pub fn Filter( #[prop(into)] filter: Field, #[prop(into)] on_action: Callback<(Action,)>, #[prop(into)] selected: Field>>, #[prop(optional)] root: bool, ) -> impl IntoView { let remain = filter.remain(); match remain.get_untracked() { FilterRemain::Leaf(_) => { leaf(filter, remain.leaf_0().unwrap().into(), on_action, selected).into_any() } FilterRemain::Group(_) => group( filter, remain.group_0().unwrap().into(), on_action, selected, root, ) .into_any(), } }