Skip to main content

edc_web_components/components/
simple_or_id_field.rs

1use patternfly_yew::prelude::*;
2use yew::prelude::*;
3
4#[derive(Clone, PartialEq, Properties)]
5pub struct Props {
6  pub is_simple: bool,
7  pub value: String,
8  pub onchange: Callback<(bool, String)>,
9}
10
11#[component]
12pub fn SimpleOrIdField(props: &Props) -> Html {
13  let is_simple_target = use_state(|| props.is_simple);
14  let target = use_state(|| props.value.clone());
15
16  let on_target_id = use_callback(
17    (
18      props.onchange.clone(),
19      is_simple_target.clone(),
20      target.clone(),
21    ),
22    move |_, (onchange, is_simple_target, target)| {
23      is_simple_target.set(false);
24      onchange.emit((false, (**target).to_string()))
25    },
26  );
27
28  let on_target_simple = use_callback(
29    (
30      props.onchange.clone(),
31      is_simple_target.clone(),
32      target.clone(),
33    ),
34    move |_, (onchange, is_simple_target, target)| {
35      is_simple_target.set(true);
36      onchange.emit((true, (**target).to_string()))
37    },
38  );
39
40  let oninput_target = use_callback(
41    (
42      props.onchange.clone(),
43      is_simple_target.clone(),
44      target.clone(),
45    ),
46    move |value: String, (onchange, is_simple_target, target)| {
47      target.set(value.clone());
48      onchange.emit((**is_simple_target, value))
49    },
50  );
51
52  let target_mode = if *is_simple_target { "Simple" } else { "ID" };
53
54  html!(
55    <Split>
56      <SplitItem>
57        <Dropdown text={html!(target_mode)}>
58          <MenuAction onclick={on_target_simple}>{ "Simple" }</MenuAction>
59          <MenuAction onclick={on_target_id}>{ "ID" }</MenuAction>
60        </Dropdown>
61      </SplitItem>
62      <SplitItem fill=true>
63        <TextInput value={(*target).clone()} onchange={oninput_target} />
64      </SplitItem>
65    </Split>
66  )
67}