"value: " { move || format!("{:?}", value.get()) }
@@ -39,11 +41,13 @@ pub fn CheckboxPage() -> impl IntoView {
-
-
-
-
+ view! {
+
+
+
+
+
+ }
"#, "rust")>
""
diff --git a/src/checkbox/checkbox_group.rs b/src/checkbox/checkbox_group.rs
index 4a1da42..212b2f2 100644
--- a/src/checkbox/checkbox_group.rs
+++ b/src/checkbox/checkbox_group.rs
@@ -1,12 +1,13 @@
+use crate::utils::maybe_rw_signal::MaybeRwSignal;
use leptos::*;
use std::collections::HashSet;
#[component]
pub fn CheckboxGroup(
- #[prop(into)] value: RwSignal
>,
+ #[prop(optional, into)] value: MaybeRwSignal>,
children: Children,
) -> impl IntoView {
- let injection_key = CheckboxGroupInjectionKey::new(value);
+ let injection_key = CheckboxGroupInjectionKey::new(value.into());
provide_context(injection_key);
children()
diff --git a/src/checkbox/checkbox_item.rs b/src/checkbox/checkbox_item.rs
index 3bbe308..b4359b7 100644
--- a/src/checkbox/checkbox_item.rs
+++ b/src/checkbox/checkbox_item.rs
@@ -1,28 +1,36 @@
-use crate::checkbox::{checkbox_group::use_checkbox_group, Checkbox};
+use crate::{
+ checkbox::{checkbox_group::use_checkbox_group, Checkbox},
+ SignalWatch,
+};
use leptos::*;
#[component]
-pub fn CheckboxItem(#[prop(into)] label: String, #[prop(into)] value: String) -> impl IntoView {
+pub fn CheckboxItem(
+ #[prop(optional, into)] label: Option,
+ #[prop(into)] key: String,
+) -> impl IntoView {
let checkbox_group = use_checkbox_group();
let checked = checkbox_group
.value
- .with_untracked(|checkbox_group| checkbox_group.contains(&value));
+ .with_untracked(|checkbox_group| checkbox_group.contains(&key));
let checked = create_rw_signal(checked);
- let item_value = store_value(value);
+ let item_key = store_value(key);
- _ = watch(
- move || checked.get(),
- move |checked, _prev, _| {
- checkbox_group.value.update(move |checkbox_group| {
- if *checked {
- checkbox_group.insert(item_value.get_value());
- } else {
- checkbox_group.remove(&item_value.get_value());
- }
- });
- },
- false,
- );
+ _ = checked.watch(move |checked| {
+ checkbox_group.value.update(move |checkbox_group| {
+ if *checked {
+ checkbox_group.insert(item_key.get_value());
+ } else {
+ checkbox_group.remove(&item_key.get_value());
+ }
+ });
+ });
+
+ let label = if let Some(label) = label {
+ label
+ } else {
+ item_key.get_value()
+ };
view! {
diff --git a/src/checkbox/mod.rs b/src/checkbox/mod.rs
index 3cf3b11..8c9fc9c 100644
--- a/src/checkbox/mod.rs
+++ b/src/checkbox/mod.rs
@@ -1,7 +1,13 @@
mod checkbox_group;
mod checkbox_item;
-use crate::{components::*, icon::*, theme::use_theme, utils::mount_style::mount_style, Theme};
+use crate::{
+ components::*,
+ icon::*,
+ theme::use_theme,
+ utils::{maybe_rw_signal::MaybeRwSignal, mount_style::mount_style},
+ Theme,
+};
pub use checkbox_group::CheckboxGroup;
pub use checkbox_item::CheckboxItem;
use icondata::AiIcon;
@@ -9,7 +15,10 @@ use leptos::*;
use stylers::style_sheet_str;
#[component]
-pub fn Checkbox(#[prop(into)] checked: RwSignal, children: Children) -> impl IntoView {
+pub fn Checkbox(
+ #[prop(optional, into)] checked: MaybeRwSignal,
+ children: Children,
+) -> impl IntoView {
let theme = use_theme(Theme::light);
let class_name = mount_style("checkbox", || {
style_sheet_str!("./src/checkbox/checkbox.css")
@@ -23,12 +32,12 @@ pub fn Checkbox(#[prop(into)] checked: RwSignal, children: Children) -> im
css_vars
});
- view! { class=class_name,
+ view! {class=class_name,