[pdm-devel] [PATCH proxmox-yew-widget-toolkit v2 1/1] data table: add get_property helper for displaying optional values
Stefan Hanreich
s.hanreich at proxmox.com
Wed Aug 20 13:59:26 CEST 2025
rather, obsoleted by:
https://lore.proxmox.com/pdm-devel/20250820115809.196115-1-s.hanreich@proxmox.com/T/#u
On 8/20/25 10:46 AM, Stefan Hanreich wrote:
> In some cases, particularly for tree views, it might make sense to not
> show values for some cells. In order to simplify handling optional
> values, add two get_property helpers that can work with optional
> values. It renders the values if it exists and nothing otherwise.
> Since Option implements Ord, the widget can use its Ord implementation
> for sorting. The current helpers cannot be used, since Option does not
> implement Display, so the trait bounds are not satisfied. Analogous to
> the existing helpers, add one for owned values and one for references.
>
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
>
> Notes:
> Changes from v1:
> * add helper for owned values as well
>
> src/widget/data_table/column.rs | 36 ++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/src/widget/data_table/column.rs b/src/widget/data_table/column.rs
> index 016be99..6cd8e1b 100644
> --- a/src/widget/data_table/column.rs
> +++ b/src/widget/data_table/column.rs
> @@ -5,7 +5,7 @@ use derivative::Derivative;
> use yew::html::IntoPropValue;
> use yew::prelude::*;
>
> -use yew::virtual_dom::Key;
> +use yew::virtual_dom::{Key, VNode};
>
> use crate::props::{CallbackMut, IntoEventCallbackMut, IntoSorterFn, RenderFn, SorterFn};
> use crate::state::TreeStore;
> @@ -328,6 +328,40 @@ impl<T: 'static> DataTableColumn<T> {
> .render(move |item: &T| html! {{get_property_fn(item)}})
> }
>
> + /// Builder style method to set a get_property_fn for renderer and sorter
> + /// the given fn must return the value as an Option containing a reference.
> + pub fn get_property_optional<E: Ord + std::fmt::Display>(
> + self,
> + get_property_fn: impl 'static + Fn(&T) -> Option<&E>,
> + ) -> Self {
> + let get_property_fn = Rc::new(get_property_fn);
> + self.sorter({
> + let get_property_fn = get_property_fn.clone();
> + move |itema: &T, itemb: &T| get_property_fn(itema).cmp(&get_property_fn(itemb))
> + })
> + .render(
> + move |item: &T| html! {{get_property_fn(item).map(VNode::from).unwrap_or_default()}},
> + )
> + }
> +
> + /// Builder style method to set a get_property_fn for renderer and sorter
> + /// the given fn must return the value as an Option containing an owned value.
> + /// NOTE: on sort this will be called multiple times per entry, so use with caution for large
> + /// lists.
> + pub fn get_property_optional_owned<E: Ord + std::fmt::Display>(
> + self,
> + get_property_fn: impl 'static + Fn(&T) -> Option<E>,
> + ) -> Self {
> + let get_property_fn = Rc::new(get_property_fn);
> + self.sorter({
> + let get_property_fn = get_property_fn.clone();
> + move |itema: &T, itemb: &T| get_property_fn(itema).cmp(&get_property_fn(itemb))
> + })
> + .render(
> + move |item: &T| html! {{get_property_fn(item).map(VNode::from).unwrap_or_default()}},
> + )
> + }
> +
> /// Builder style method for [`Self::set_tree_column`]
> pub fn tree_column(mut self, store: impl IntoPropValue<Option<TreeStore<T>>>) -> Self {
> self.set_tree_column(store);
More information about the pdm-devel
mailing list