Merge pull request #24 from R15-Software-Dev/fix/checkbox-interference
Fix checkbox/radio list button interference
This commit was merged in pull request #24.
This commit is contained in:
5 files changed
+28
-9
No files matched your search
@@ -1,16 +1,20 @@
|
|||||||
use crate::common::ValueType;
|
use crate::common::ValueType;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use crate::components::utils::create_unique_id;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Checkbox(
|
pub fn Checkbox(
|
||||||
#[prop()] checked: Signal<bool>,
|
#[prop()] checked: Signal<bool>,
|
||||||
#[prop(into)] on_change: Callback<(), ()>,
|
#[prop(into)] on_change: Callback<(), ()>,
|
||||||
#[prop(into)] value: String,
|
#[prop(into)] value: String,
|
||||||
|
#[prop(into)] name: String,
|
||||||
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
|
let id = create_unique_id(&name, &value);
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<label for=value class="flex items-center">
|
<label for=id class="flex items-center">
|
||||||
<input
|
<input
|
||||||
// Using the "peer" class links this input with the div "peer" at the same level.
|
// Using the "peer" class links this input with the div "peer" at the same level.
|
||||||
// By using the "peer-checked" selector this div can toggle states based on this
|
// By using the "peer-checked" selector this div can toggle states based on this
|
||||||
@@ -19,7 +23,8 @@ pub fn Checkbox(
|
|||||||
relative peer shrink-0
|
relative peer shrink-0
|
||||||
hidden"
|
hidden"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id=value.clone()
|
id=id.clone()
|
||||||
|
name=name.clone()
|
||||||
on:change=move |_| on_change.run(())
|
on:change=move |_| on_change.run(())
|
||||||
prop:checked=checked
|
prop:checked=checked
|
||||||
disabled=disabled
|
disabled=disabled
|
||||||
@@ -109,6 +114,7 @@ pub fn CheckboxList(
|
|||||||
on_change=on_change
|
on_change=on_change
|
||||||
// The actual selected values are tracked by this element, not by the checkboxes themselves.
|
// The actual selected values are tracked by this element, not by the checkboxes themselves.
|
||||||
value=item.clone()
|
value=item.clone()
|
||||||
|
name=data_member.clone()
|
||||||
disabled=disabled
|
disabled=disabled
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use crate::common::ValueType;
|
use crate::common::ValueType;
|
||||||
|
use crate::components::utils::create_unique_id;
|
||||||
|
|
||||||
/// # Chip Component
|
/// # Chip Component
|
||||||
///
|
///
|
||||||
@@ -31,10 +32,7 @@ pub fn Chip(
|
|||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
// Generate a unique id - ensure that the value doesn't contain spaces.
|
// Generate a unique id - ensure that the value doesn't contain spaces.
|
||||||
// Without this id, checkbox/radio inputs can interfere with each other.
|
// Without this id, checkbox/radio inputs can interfere with each other.
|
||||||
let value_no_spaces = value.clone().chars()
|
let id = create_unique_id(&name, &value);
|
||||||
.filter(|c| !c.is_whitespace())
|
|
||||||
.collect::<String>();
|
|
||||||
let id = format!("{}-{}", name.clone(), value_no_spaces);
|
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<label for=id>
|
<label for=id>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ mod row;
|
|||||||
mod select;
|
mod select;
|
||||||
mod text_field;
|
mod text_field;
|
||||||
mod chips;
|
mod chips;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
action_button::*, checkbox::*, loading::*, multi_entry::*, panel::*, radio::*, row::*,
|
action_button::*, checkbox::*, loading::*, multi_entry::*, panel::*, radio::*, row::*,
|
||||||
|
|||||||
@@ -1,16 +1,20 @@
|
|||||||
use crate::common::ValueType;
|
use crate::common::ValueType;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use crate::components::utils::create_unique_id;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Radio(
|
pub fn Radio(
|
||||||
#[prop()] checked: Signal<bool>,
|
#[prop()] checked: Signal<bool>,
|
||||||
#[prop(into)] on_change: Callback<(), ()>,
|
#[prop(into)] on_change: Callback<(), ()>,
|
||||||
#[prop(into)] value: String,
|
#[prop(into)] value: String,
|
||||||
|
#[prop(into)] name: String,
|
||||||
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
|
let id = create_unique_id(&name, &value);
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<label for=value class="flex items-center">
|
<label for=id class="flex items-center">
|
||||||
<input
|
<input
|
||||||
// Using the "peer" class links this input with the div "peer" at the same level.
|
// Using the "peer" class links this input with the div "peer" at the same level.
|
||||||
// By using the "peer-checked" selector this div can toggle states based on this
|
// By using the "peer-checked" selector this div can toggle states based on this
|
||||||
@@ -18,8 +22,9 @@ pub fn Radio(
|
|||||||
class="
|
class="
|
||||||
relative peer shrink-0
|
relative peer shrink-0
|
||||||
hidden"
|
hidden"
|
||||||
type="checkbox"
|
type="radio"
|
||||||
id=value.clone()
|
id=id.clone()
|
||||||
|
name=name.clone()
|
||||||
on:change=move |_| on_change.run(())
|
on:change=move |_| on_change.run(())
|
||||||
prop:checked=checked
|
prop:checked=checked
|
||||||
disabled=disabled
|
disabled=disabled
|
||||||
@@ -96,6 +101,7 @@ pub fn RadioList(
|
|||||||
on_change=on_change
|
on_change=on_change
|
||||||
// The actual selected values are tracked by this element, not by the checkboxes themselves.
|
// The actual selected values are tracked by this element, not by the checkboxes themselves.
|
||||||
value=item.clone()
|
value=item.clone()
|
||||||
|
name=data_member.clone()
|
||||||
disabled=disabled
|
disabled=disabled
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/// Creates a unique ID for use in components like the [`CheckboxList`],
|
||||||
|
/// [`RadioList`], and [`ChipsList`].
|
||||||
|
pub fn create_unique_id(name: &String, value: &String) -> String {
|
||||||
|
let value_no_spaces = value.clone().chars()
|
||||||
|
.filter(|c| !c.is_whitespace())
|
||||||
|
.collect::<String>();
|
||||||
|
format!("{}-{}", name.clone(), value_no_spaces)
|
||||||
|
}
|
||||||
Reference in new issue
Block a user