patternfly_yew/components/dual_list_selector/list/
wrapper.rs1use yew::prelude::*;
4
5use crate::components::dual_list_selector::OnOptionSelectArgsNoChosen;
6
7use super::{super::DualListSelectorItemRenderer as ItemRenderer, DualListSelectorList};
8
9#[derive(Debug, Clone, PartialEq, Properties)]
10pub struct DualListSelectorListWrapperProps<T: ItemRenderer> {
11 #[prop_or_default]
13 pub class: Classes,
14
15 #[prop_or_default]
17 pub options: Vec<T>,
18
19 #[prop_or_default]
21 pub selected_options: Vec<usize>,
22
23 pub onoptionselect: Callback<OnOptionSelectArgsNoChosen>,
25
26 #[prop_or_default]
28 pub disabled: bool,
29
30 #[prop_or_default]
32 pub children: Children,
33}
34
35#[derive(Debug, Clone, PartialEq)]
36pub struct DualListSelectorListContext<T: ItemRenderer> {
37 pub options: Vec<T>,
38 pub selected_options: Vec<usize>,
39 pub onoptionselect: Callback<OnOptionSelectArgsNoChosen>,
40 pub disabled: bool,
41}
42
43#[function_component(DualListSelectorListWrapper)]
44pub fn wrapper<T: ItemRenderer>(props: &DualListSelectorListWrapperProps<T>) -> Html {
45 let context = DualListSelectorListContext {
46 options: props.options.clone(),
47 selected_options: props.selected_options.clone(),
48 onoptionselect: props.onoptionselect.clone(),
49 disabled: props.disabled,
50 };
51 html! {
52 <div class={classes!["pf-v5-c-dual-list-selector__menu", props.class.clone()]} tabindex=0>
53 <ContextProvider<DualListSelectorListContext<T>> {context}>
54 if !props.children.is_empty() {
55 { props.children.clone() }
56 } else {
57 <DualListSelectorList<T>/>
58 }
59 </ContextProvider<DualListSelectorListContext<T>>>
60 </div>
61 }
62}