(props: SelectMultiProps<T>)
| 299 | /// - `data-state`: Indicates the current state of the select. Values are `open` or `closed`. |
| 300 | #[component] |
| 301 | pub fn SelectMulti<T: Clone + PartialEq + 'static>(props: SelectMultiProps<T>) -> Element { |
| 302 | let (multi_values, set_multi_internal) = |
| 303 | use_controlled(props.values, props.default_values, props.on_values_change); |
| 304 | |
| 305 | let values = use_memo(move || { |
| 306 | multi_values() |
| 307 | .into_iter() |
| 308 | .map(RcPartialEqValue::new) |
| 309 | .collect() |
| 310 | }); |
| 311 | let set_value = use_callback(move |value: RcPartialEqValue| { |
| 312 | let value_t = value |
| 313 | .as_ref::<T>() |
| 314 | .unwrap_or_else(|| panic!("The values of select and all options must match types")) |
| 315 | .clone(); |
| 316 | let mut current = multi_values(); |
| 317 | if let Some(pos) = current.iter().position(|v| v == &value_t) { |
| 318 | current.remove(pos); |
| 319 | } else { |
| 320 | current.push(value_t); |
| 321 | } |
| 322 | set_multi_internal.call(current); |
| 323 | }); |
| 324 | |
| 325 | let open = use_select_root( |
| 326 | values, |
| 327 | set_value, |
| 328 | SelectionMode::Multiple, |
| 329 | props.disabled, |
| 330 | props.roving_loop, |
| 331 | Controlled { |
| 332 | value: props.open, |
| 333 | default: props.default_open, |
| 334 | on_change: props.on_open_change, |
| 335 | }, |
| 336 | props.typeahead_timeout, |
| 337 | ); |
| 338 | |
| 339 | rsx! { |
| 340 | div { |
| 341 | "data-state": if open() { "open" } else { "closed" }, |
| 342 | "data-disabled": (props.disabled)(), |
| 343 | ..props.attributes, |
| 344 | {props.children} |
| 345 | } |
| 346 | } |
| 347 | } |
nothing calls this directly
no test coverage detected