[pdm-devel] [PATCH proxmox-yew-widget-toolkit 1/1] data table: add get_property helper for displaying optional values

Dominik Csapak d.csapak at proxmox.com
Wed Aug 20 11:13:01 CEST 2025


wouldn't it also be possible to simply unwrap the option on the source side?


e.g. for a string
...
.get_property(|rec: &Record| rec.option.as_deref().unwrap_or(""))
```
?

of course you can always implement the renderer and sorter yourself 
(which should only be a single line each if the value has Display + Ord)

in general I'm not sure we want to show None values as nothing, this 
largely depends on the data (e.g. valid things to show/expect could be 
'-', 'N/A', etc.)

Also one comment inline

On 8/19/25 15:25, 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 a get_property helper 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.
> 
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
>   src/widget/data_table/column.rs | 18 +++++++++++++++++-
>   1 file changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/src/widget/data_table/column.rs b/src/widget/data_table/column.rs
> index 016be99..770d7c7 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,22 @@ 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
> +    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()}},

mhmm since we require the Display trait as boundary, wouldn't a 
to_string() be better here? The default for VNode is a VList, but an 
empty string produces a VText

> +        )
> +    }
> +
>       /// 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