From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id DA7781FF17C for ; Wed, 20 Aug 2025 10:45:45 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id ACB48357A9; Wed, 20 Aug 2025 10:47:29 +0200 (CEST) From: Stefan Hanreich To: pdm-devel@lists.proxmox.com Date: Wed, 20 Aug 2025 10:47:25 +0200 Message-ID: <20250820084726.51170-1-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.47.2 MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.193 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [column.rs] Subject: [pdm-devel] [PATCH proxmox-yew-widget-toolkit v2 1/1] data table: add get_property helper for displaying optional values X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" 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 --- 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 DataTableColumn { .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( + 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( + self, + get_property_fn: impl 'static + Fn(&T) -> Option, + ) -> 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>>) -> Self { self.set_tree_column(store); -- 2.47.2 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel