From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E482B1FF165 for ; Thu, 23 Oct 2025 13:18:58 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 12C387CC5; Thu, 23 Oct 2025 13:19:26 +0200 (CEST) Mime-Version: 1.0 Date: Thu, 23 Oct 2025 13:19:22 +0200 Message-Id: To: "Dominik Csapak" X-Mailer: aerc 0.20.0 References: <20251023083253.1038119-1-d.csapak@proxmox.com> <20251023083253.1038119-7-d.csapak@proxmox.com> In-Reply-To: <20251023083253.1038119-7-d.csapak@proxmox.com> From: "Shannon Sterz" X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1761218353981 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.057 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pdm-devel] [PATCH datacenter-manager v2 06/16] ui: dashboard: refactor task summary panel creation to its own module 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 Cc: 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" On Thu Oct 23, 2025 at 10:28 AM CEST, Dominik Csapak wrote: > so we can easily reuse it outside the dashboard struct. > > Signed-off-by: Dominik Csapak > --- > ui/src/dashboard/mod.rs | 65 +++++++++++++++------------------------ > ui/src/dashboard/tasks.rs | 30 ++++++++++++++++++ > 2 files changed, 54 insertions(+), 41 deletions(-) > > diff --git a/ui/src/dashboard/mod.rs b/ui/src/dashboard/mod.rs > index fa0fe2fc..c0b20b36 100644 > --- a/ui/src/dashboard/mod.rs > +++ b/ui/src/dashboard/mod.rs > @@ -54,7 +54,7 @@ use status_row::DashboardStatusRow; > mod filtered_tasks; > > mod tasks; > -use tasks::TaskSummary; > +use tasks::create_task_summary_panel; > > /// The initial 'max-age' parameter in seconds. The backend polls every 15 minutes, so to increase > /// the chance of showing some data quickly use that as max age at the very first load. > @@ -145,44 +145,6 @@ pub struct PdmDashboard { > } > > impl PdmDashboard { > - fn create_task_summary_panel( > - &self, > - statistics: &StatisticsOptions, > - remotes: Option, > - ) -> Panel { > - let (hours, since) = Self::get_task_options(&self.config); > - let title = match remotes { > - Some(_count) => tr!("Task Summary Sorted by Failed Tasks (Last {0}h)", hours), > - None => tr!("Task Summary by Category (Last {0}h)", hours), > - }; > - Panel::new() > - .flex(1.0) > - .width(500) > - .border(true) > - .title(create_title_with_icon("list", title)) > - .with_child( > - Container::new() > - .class(FlexFit) > - .padding(2) > - .with_optional_child( > - statistics > - .data > - .clone() > - .map(|data| TaskSummary::new(data, since, remotes)), > - ) > - .with_optional_child( > - (statistics.error.is_none() && statistics.data.is_none()) > - .then_some(loading_column()), > - ) > - .with_optional_child( > - statistics > - .error > - .as_ref() > - .map(|err| error_message(&err.to_string())), > - ), > - ) > - } > - > fn create_top_entities_panel( > &self, > icon: &str, > @@ -383,6 +345,7 @@ impl Component for PdmDashboard { > } > > fn view(&self, ctx: &yew::Context) -> yew::Html { > + let (hours, since) = Self::get_task_options(&self.config); > let content = Column::new() > .class(FlexFit) > .with_child( > @@ -541,8 +504,28 @@ impl Component for PdmDashboard { > .style("padding-top", "0") > .class(pwt::css::Flex::Fill) > .class(FlexWrap::Wrap) > - .with_child(self.create_task_summary_panel(&self.statistics, None)) > - .with_child(self.create_task_summary_panel(&self.statistics, Some(5))) > + .with_child( > + create_task_summary_panel( > + self.statistics.data.clone(), > + self.statistics.error.as_ref(), > + None, > + hours, > + since, > + ) > + .flex(1.0) > + .width(500), could these be moved to the function as well here? at least the `flex(1.0)` is probably used fairly often here? > + ) > + .with_child( > + create_task_summary_panel( > + self.statistics.data.clone(), > + self.statistics.error.as_ref(), > + Some(5), > + hours, > + since, > + ) > + .flex(1.0) > + .width(500), > + ) > .with_child(create_sdn_panel(self.status.clone()).flex(1.0).width(200)), > ); > > diff --git a/ui/src/dashboard/tasks.rs b/ui/src/dashboard/tasks.rs > index d32cf378..cdb0d9c6 100644 > --- a/ui/src/dashboard/tasks.rs > +++ b/ui/src/dashboard/tasks.rs > @@ -2,6 +2,7 @@ use std::collections::BTreeMap; > use std::collections::HashMap; > use std::rc::Rc; > > +use anyhow::Error; > use yew::html::Scope; > use yew::virtual_dom::Key; > > @@ -11,11 +12,15 @@ use pwt::prelude::*; > use pwt::props::ExtractPrimaryKey; > use pwt::state::Store; > use pwt::widget::data_table::{DataTable, DataTableColumn, DataTableHeader}; > +use pwt::widget::error_message; > +use pwt::widget::Panel; > use pwt::widget::{ActionIcon, Container, Tooltip}; > use pwt_macros::{builder, widget}; > > use pdm_api_types::TaskStatistics; > > +use crate::dashboard::create_title_with_icon; > +use crate::dashboard::loading_column; > use crate::tasks::TaskWorkerType; > > use super::filtered_tasks::FilteredTasks; > @@ -295,3 +300,28 @@ impl Component for ProxmoxTaskSummary { > .into() > } > } > + > +pub fn create_task_summary_panel( > + statistics: Option, > + error: Option<&Error>, > + remotes: Option, > + hours: u32, > + since: i64, > +) -> Panel { > + let title = match remotes { > + Some(_count) => tr!("Task Summary Sorted by Failed Tasks (Last {0}h)", hours), > + None => tr!("Task Summary by Category (Last {0}h)", hours), > + }; > + let loading = error.is_none() && statistics.is_none(); > + Panel::new() > + .border(true) > + .title(create_title_with_icon("list", title)) > + .with_child( > + Container::new() > + .class(css::FlexFit) > + .padding(2) > + .with_optional_child(statistics.map(|data| TaskSummary::new(data, since, remotes))) > + .with_optional_child((loading).then_some(loading_column())) > + .with_optional_child(error.map(|err| error_message(&err.to_string()))), > + ) > +} _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel