public inbox for pdm-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Lukas Wagner <l.wagner@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: [pdm-devel] [PATCH datacenter-manager 11/13] ui: remote updates: don't attempt to load current status for unavailable nodes
Date: Thu, 27 Nov 2025 11:44:45 +0100	[thread overview]
Message-ID: <20251127104447.162951-17-l.wagner@proxmox.com> (raw)
In-Reply-To: <20251127104447.162951-1-l.wagner@proxmox.com>

If the cached update status indicates that a node is unavailable, don't
attempt to load the repo status and update table. Instead, show the
error message from the last poll attempt in-place where the tables would
else be. This avoids annoying error pop-ups when navigating through the
remote/node tree in the global update view.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
---
 ui/src/remotes/updates.rs | 126 +++++++++++++++++++++-----------------
 1 file changed, 69 insertions(+), 57 deletions(-)

diff --git a/ui/src/remotes/updates.rs b/ui/src/remotes/updates.rs
index cf025157..7284fd47 100644
--- a/ui/src/remotes/updates.rs
+++ b/ui/src/remotes/updates.rs
@@ -397,9 +397,19 @@ impl UpdateTreeComponent {
     }
 
     fn render_update_list_panel(&self, ctx: &LoadableComponentContext<Self>) -> Panel {
+        let mut panel = Panel::new()
+            .class(FlexFit)
+            .border(true)
+            .min_width(500)
+            .style("flex", "1 1 0");
+
         match &self.selected_entry {
             Some(UpdateTreeEntry::Node(NodeEntry {
-                remote, node, ty, ..
+                remote,
+                node,
+                ty,
+                summary,
+                ..
             })) => {
                 let title: Html = Row::new()
                     .gap(2)
@@ -408,62 +418,68 @@ impl UpdateTreeComponent {
                     .with_child(tr!("Update List - {} ({})", remote, node))
                     .into();
 
-                let base_url = format!("/{ty}/remotes/{remote}/nodes/{node}/apt",);
-                let task_base_url = format!("/{ty}/remotes/{remote}/tasks");
+                if summary.status == NodeUpdateStatus::Success {
+                    let base_url = format!("/{ty}/remotes/{remote}/nodes/{node}/apt",);
+                    let task_base_url = format!("/{ty}/remotes/{remote}/tasks");
 
-                let apt = AptPackageManager::new()
-                    .base_url(base_url.clone())
-                    .task_base_url(task_base_url)
-                    .enable_upgrade(true)
-                    .on_upgrade({
-                        let remote = remote.clone();
-                        let link = ctx.link().clone();
-                        let remote = remote.clone();
-                        let node = node.clone();
-                        let ty = *ty;
+                    let apt = AptPackageManager::new()
+                        .base_url(base_url.clone())
+                        .task_base_url(task_base_url)
+                        .enable_upgrade(true)
+                        .on_upgrade({
+                            let remote = remote.clone();
+                            let link = ctx.link().clone();
+                            let remote = remote.clone();
+                            let node = node.clone();
+                            let ty = *ty;
 
-                        move |_| match ty {
-                            RemoteType::Pve => {
-                                let id = format!("node/{node}::apt");
-                                if let Some(url) = get_deep_url(link.yew_link(), &remote, None, &id)
-                                {
-                                    let _ = gloo_utils::window().open_with_url(&url.href());
+                            move |_| match ty {
+                                RemoteType::Pve => {
+                                    let id = format!("node/{node}::apt");
+                                    if let Some(url) =
+                                        get_deep_url(link.yew_link(), &remote, None, &id)
+                                    {
+                                        let _ = gloo_utils::window().open_with_url(&url.href());
+                                    }
+                                }
+                                RemoteType::Pbs => {
+                                    let hash = "#pbsServerAdministration:updates";
+                                    if let Some(url) =
+                                        get_deep_url_low_level(link.yew_link(), &remote, None, hash)
+                                    {
+                                        let _ = gloo_utils::window().open_with_url(&url.href());
+                                    }
                                 }
                             }
-                            RemoteType::Pbs => {
-                                let hash = "#pbsServerAdministration:updates";
-                                if let Some(url) =
-                                    get_deep_url_low_level(link.yew_link(), &remote, None, hash)
-                                {
-                                    let _ = gloo_utils::window().open_with_url(&url.href());
-                                }
-                            }
-                        }
-                    });
+                        });
 
-                let product = match ty {
-                    RemoteType::Pve => ExistingProduct::PVE,
-                    RemoteType::Pbs => ExistingProduct::PBS,
-                };
+                    let product = match ty {
+                        RemoteType::Pve => ExistingProduct::PVE,
+                        RemoteType::Pbs => ExistingProduct::PBS,
+                    };
 
-                let repo_status = Container::new().min_height(150).with_child(
-                    AptRepositories::new()
-                        .product(product)
-                        .status_only(true)
-                        .base_url(base_url),
-                );
+                    let repo_status = Container::new().min_height(150).with_child(
+                        AptRepositories::new()
+                            .product(product)
+                            .status_only(true)
+                            .base_url(base_url),
+                    );
 
-                Panel::new()
-                    .class(FlexFit)
-                    .title(title)
-                    .border(true)
-                    .min_width(500)
-                    .with_child(repo_status)
-                    .with_child(
-                        html! {<div role="separator" class="pwt-w-100 pwt-horizontal-rule"/>},
-                    )
-                    .with_child(apt)
-                    .style("flex", "1 1 0")
+                    panel = panel
+                        .title(title)
+                        .with_child(repo_status)
+                        .with_child(
+                            html! {<div role="separator" class="pwt-w-100 pwt-horizontal-rule"/>},
+                        )
+                        .with_child(apt);
+                } else {
+                    let error_widget = pwt::widget::error_message(&tr!(
+                        "Could not fetch update status: {0}",
+                        summary.status_message.as_deref().unwrap_or_default()
+                    ));
+
+                    panel = panel.title(title).with_child(error_widget);
+                }
             }
             _ => {
                 let title: Html = Row::new()
@@ -484,15 +500,11 @@ impl UpdateTreeComponent {
                     .with_child(html! {<h1 class="pwt-font-headline-medium">{header}</h1>})
                     .with_child(Container::new().with_child(msg));
 
-                Panel::new()
-                    .class(FlexFit)
-                    .title(title)
-                    .border(true)
-                    .min_width(500)
-                    .with_child(select_node_msg)
-                    .style("flex", "1 1 0")
+                panel = panel.title(title).with_child(select_node_msg)
             }
         }
+
+        panel
     }
 }
 
-- 
2.47.3



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


  parent reply	other threads:[~2025-11-27 10:45 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-27 10:44 [pdm-devel] [PATCH datacenter-manager/proxmox{, -yew-comp} 00/18] remote update view: include product version and repository status Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH proxmox 1/4] add bindings for /nodes/{node}/apt/versions Lukas Wagner
2025-11-27 20:46   ` [pdm-devel] applied: " Thomas Lamprecht
2025-11-27 10:44 ` [pdm-devel] [PATCH proxmox 2/4] add bindings for /nodes/{node}/apt/repositories Lukas Wagner
2025-11-27 20:46   ` [pdm-devel] applied: " Thomas Lamprecht
2025-11-27 10:44 ` [pdm-devel] [PATCH proxmox 3/4] make refresh Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH proxmox 4/4] proxmox-apt-api-types: make APTStandardRepository compatible with PVE's serialization of the type Lukas Wagner
2025-11-27 20:46   ` [pdm-devel] applied: " Thomas Lamprecht
2025-11-27 10:44 ` [pdm-devel] [PATCH proxmox-yew-comp 1/1] apt repositories: add 'status_only' property Lukas Wagner
2025-11-27 21:26   ` [pdm-devel] applied: " Thomas Lamprecht
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 01/13] pdm-api-types: reuse APTUpdateInfo from proxmox_apt_api_types Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 02/13] pbs-client: add bindings for /nodes/localhost/apt/versions Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 03/13] pbs-client: add bindings for /nodes/localhost/apt/repositories Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 04/13] remote-updates: include version information in node update summary Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 05/13] remote updates: include repository status in node summary Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 06/13] api: pve/pbs: add passthrough endpoint for APT repo configuration Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 07/13] ui: remote updates: show table header Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 08/13] ui: remote updates: show main product version in overview table Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 09/13] ui: remote updates: show repository status column Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 10/13] ui: remote updates: show repo status details when selecting a node Lukas Wagner
2025-11-27 10:44 ` Lukas Wagner [this message]
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 12/13] ui: remote updates: use 'building-o' icon for PBS nodes Lukas Wagner
2025-11-27 10:44 ` [pdm-devel] [PATCH datacenter-manager 13/13] ui: remote updates: use explicit indices for parameters in tr! macro Lukas Wagner
2025-11-27 10:47 ` [pdm-devel] [PATCH datacenter-manager/proxmox{, -yew-comp} 00/18] remote update view: include product version and repository status Lukas Wagner

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=20251127104447.162951-17-l.wagner@proxmox.com \
    --to=l.wagner@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