+
{label}
+
+ {items
+ .into_iter()
+ .map(|item| {
+ let checked_signal = Signal::derive({
+ let item_name = item.clone();
+ let data_member = data_member.clone();
+ move || {
+ data_map.get()
+ .get(&data_member)
+ .unwrap_or(&ValueType::List(None))
+ .as_list()
+ .unwrap_or(Some(vec!()))
+ .unwrap_or(vec!())
+ .contains(&ValueType::String(Some(item_name.clone())))
+ }
+ });
+
+ let on_change = {
+ let item_name = item.clone();
+ let data_member = data_member.clone();
+ move || {
+ let result = ValueType::String(Some(item_name.clone()));
+ data_map.update(|map| {
+ // Attempt to get the value type from the hash map.
+ match map.get_mut(&data_member) {
+ Some(value_type) => {
+ // Attempt to get the value as a list.
+ match value_type.as_list().unwrap_or(None) {
+ Some(mut list) => {
+ // Attempt to find the selected value in the selected list.
+ // If it's present, remove it, or vice versa.
+ match list.iter().position(|val| *val == result) {
+ Some(index) => { list.remove(index); },
+ None => { list.push(result); }
+ };
+ // Update the existing value_type entry in the hash map.
+ *value_type = ValueType::List(Some(list));
+ },
+ // Insert a new value_type entry.
+ None => { *value_type = ValueType::List(Some(vec![result])); }
+ };
+ },
+ // Insert a new value_type entry.
+ None => { map.insert(data_member.clone(), ValueType::List(Some(vec![result]))); }
+ };
+ });
+ }
+ };
+
+ view! {
+
+ }
+ })
+ .collect_view()
+ }
+
+
+ }
+}
diff --git a/src/components/mod.rs b/src/components/mod.rs
index 50c55ce..2616640 100644
--- a/src/components/mod.rs
+++ b/src/components/mod.rs
@@ -7,8 +7,9 @@ mod radio;
mod row;
mod select;
mod text_field;
+mod chips;
pub use self::{
action_button::*, checkbox::*, loading::*, multi_entry::*, panel::*, radio::*, row::*,
- select::*, text_field::*,
+ select::*, text_field::*, chips::*
};
diff --git a/src/pages/home_page.rs b/src/pages/home_page.rs
index 4ff687e..4f0451f 100644
--- a/src/pages/home_page.rs
+++ b/src/pages/home_page.rs
@@ -9,9 +9,8 @@ use crate::common::{ExpandableInfo, UserClaims};
use crate::pages::UnauthenticatedPage;
use crate::components::{
ActionButton, CheckboxList, Loading, MultiEntry, OutlinedTextField, Panel, RadioList, Row,
- Select,
+ Select, ChipsList
};
-use crate::input;
use leptos::leptos_dom::logging::console_log;
use leptos::prelude::*;
use leptos_oidc::{Algorithm, AuthLoaded, AuthSignal, Authenticated};
@@ -267,6 +266,35 @@ pub fn HomePage() -> impl IntoView {
data_map=expandable_react.data
/>
+