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 4B1461FF184 for ; Thu, 20 Nov 2025 11:36:52 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id AA78431D3; Thu, 20 Nov 2025 11:36:58 +0100 (CET) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Date: Thu, 20 Nov 2025 11:36:19 +0100 Message-ID: <20251120103620.128741-4-l.wagner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251120103620.128741-1-l.wagner@proxmox.com> References: <20251120103620.128741-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1763634953412 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.032 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: [pdm-devel] [PATCH datacenter-manager 3/4] ui: pbs: move node overview to tab and add update tab 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" PVE remote had an 'Updates' tab for a while now. This commit adds the same thing for PBS remotes. Signed-off-by: Lukas Wagner --- ui/src/pbs/mod.rs | 4 +- ui/src/pbs/node/mod.rs | 114 ++++++++++++++++++++++++++++++++++++ ui/src/pbs/node/overview.rs | 11 +--- 3 files changed, 118 insertions(+), 11 deletions(-) diff --git a/ui/src/pbs/mod.rs b/ui/src/pbs/mod.rs index 1fdb417f..75ed9926 100644 --- a/ui/src/pbs/mod.rs +++ b/ui/src/pbs/mod.rs @@ -24,11 +24,11 @@ pub use datastore::DatastorePanel; mod namespace_selector; mod node; -use node::overview::PbsNodeOverviewPanel; mod snapshot_list; pub use snapshot_list::SnapshotList; +use crate::pbs::node::PbsNodePanel; use crate::pbs::tree::PbsTree; use crate::{get_deep_url, pdm_client}; @@ -108,7 +108,7 @@ impl LoadableComponent for PbsRemoteComp { let props = ctx.props(); let content: Html = match &self.view { - tree::PbsTreeNode::Root => PbsNodeOverviewPanel::new(props.remote.clone()).into(), + tree::PbsTreeNode::Root => PbsNodePanel::new(props.remote.clone()).into(), tree::PbsTreeNode::Datastore(data_store_config) => { DatastorePanel::new(props.remote.clone(), data_store_config.clone()).into() } diff --git a/ui/src/pbs/node/mod.rs b/ui/src/pbs/node/mod.rs index 8468a02a..5cd210f8 100644 --- a/ui/src/pbs/node/mod.rs +++ b/ui/src/pbs/node/mod.rs @@ -1 +1,115 @@ +use std::rc::Rc; + +use proxmox_yew_comp::AptPackageManager; +use yew::{ + virtual_dom::{VComp, VNode}, + Context, +}; + +use pwt::{ + css::{AlignItems, ColorScheme}, + prelude::*, + props::{ContainerBuilder, WidgetBuilder}, + widget::{Fa, Row, TabBarItem, TabPanel}, +}; + pub(crate) mod overview; + +use overview::PbsNodeOverviewPanel; + +use crate::get_deep_url_low_level; + +#[derive(Clone, Debug, Eq, PartialEq, Properties)] +pub struct PbsNodePanel { + /// The remote to show + pub remote: String, +} + +impl PbsNodePanel { + pub fn new(remote: String) -> Self { + yew::props!(Self { remote }) + } +} + +impl From for VNode { + fn from(val: PbsNodePanel) -> Self { + VComp::new::(Rc::new(val), None).into() + } +} + +struct PbsNodePanelComp; + +impl yew::Component for PbsNodePanelComp { + type Message = (); + type Properties = PbsNodePanel; + + fn create(_ctx: &yew::Context) -> Self { + Self + } + + fn changed(&mut self, ctx: &Context, old_props: &Self::Properties) -> bool { + let props = ctx.props(); + + props.remote != old_props.remote + } + + fn view(&self, ctx: &yew::Context) -> yew::Html { + let props = ctx.props(); + + let title: Html = Row::new() + .gap(2) + .class(AlignItems::Baseline) + .with_child(Fa::new("building")) + .with_child(tr!("Node")) + .into(); + + TabPanel::new() + .class(pwt::css::FlexFit) + .title(title) + .class(ColorScheme::Neutral) + .with_item_builder( + TabBarItem::new() + .key("status_view") + .label(tr!("Overview")) + .icon_class("fa fa-tachometer"), + { + let remote = props.remote.clone(); + move |_| PbsNodeOverviewPanel::new(remote.clone()).into() + }, + ) + .with_item_builder( + TabBarItem::new() + .key("update_view") + .label(tr!("Updates")) + .icon_class("fa fa-refresh"), + { + let remote = props.remote.clone(); + let link = ctx.link().clone(); + move |_| { + let base_url = format!("/pbs/remotes/{remote}/nodes/localhost/apt"); + let task_base_url = format!("/pbs/remotes/{remote}/tasks"); + + AptPackageManager::new() + .base_url(base_url) + .task_base_url(task_base_url) + .enable_upgrade(true) + .on_upgrade({ + let remote = remote.clone(); + let link = link.clone(); + + move |_| { + let hash = "#pbsServerAdministration:updates"; + if let Some(url) = + get_deep_url_low_level(&link, &remote, None, hash) + { + let _ = gloo_utils::window().open_with_url(&url.href()); + } + } + }) + .into() + } + }, + ) + .into() + } +} diff --git a/ui/src/pbs/node/overview.rs b/ui/src/pbs/node/overview.rs index d15eda04..da5a4085 100644 --- a/ui/src/pbs/node/overview.rs +++ b/ui/src/pbs/node/overview.rs @@ -7,10 +7,10 @@ use yew::{ use proxmox_yew_comp::{node_info, RRDGraph, RRDTimeframe, RRDTimeframeSelector, Series}; use pwt::{ - css::{AlignItems, ColorScheme, FlexFit, JustifyContent}, + css::{ColorScheme, FlexFit, JustifyContent}, prelude::*, props::{ContainerBuilder, WidgetBuilder}, - widget::{error_message, Column, Container, Fa, Panel, Progress, Row}, + widget::{error_message, Column, Container, Panel, Progress, Row}, AsyncPool, }; @@ -197,14 +197,7 @@ impl yew::Component for PbsNodeOverviewPanelComp { fn view(&self, ctx: &yew::Context) -> yew::Html { let status_comp = node_info(self.status.data.as_ref().map(|s| s.into())); - let title: Html = Row::new() - .gap(2) - .class(AlignItems::Baseline) - .with_child(Fa::new("tachometer")) - .with_child(tr! {"Overview"}) - .into(); Panel::new() - .title(title) .class(FlexFit) .class(ColorScheme::Neutral) .with_child( -- 2.47.3 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel