public inbox for pdm-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: Re: [pdm-devel] [PATCH proxmox-yew-widget-toolkit v2 1/1] data table: add get_property helper for displaying optional values
Date: Wed, 20 Aug 2025 13:59:26 +0200	[thread overview]
Message-ID: <a8ccc7ff-58ae-46e9-8aed-1d2ff97406dc@proxmox.com> (raw)
In-Reply-To: <20250820084726.51170-1-s.hanreich@proxmox.com>

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@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);



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


      reply	other threads:[~2025-08-20 11:58 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-20  8:47 Stefan Hanreich
2025-08-20 11:59 ` Stefan Hanreich [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a8ccc7ff-58ae-46e9-8aed-1d2ff97406dc@proxmox.com \
    --to=s.hanreich@proxmox.com \
    --cc=pdm-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal