[pdm-devel] [PATCH datacenter-manager 4/4] ui: dashboard: subscriptions details: add a 'force refresh' button
Dominik Csapak
d.csapak at proxmox.com
Thu Nov 27 15:03:48 CET 2025
This simply calls the subscription api with 'max-age: 0', so we force
the backend to fetch all subscriptions.
This is useful when one adds a subscription to the remotes and does not
want to wait for the automatic refresh.
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
ui/src/dashboard/subscription_info.rs | 27 +++++++++++-----------
ui/src/dashboard/view.rs | 33 ++++++++++++++++++++-------
ui/src/load_result.rs | 6 +++++
3 files changed, 45 insertions(+), 21 deletions(-)
diff --git a/ui/src/dashboard/subscription_info.rs b/ui/src/dashboard/subscription_info.rs
index fed2b2c7..d6d13d8c 100644
--- a/ui/src/dashboard/subscription_info.rs
+++ b/ui/src/dashboard/subscription_info.rs
@@ -136,19 +136,20 @@ impl From<SubscriptionInfo> for VNode {
pub fn create_subscriptions_dialog(
subs: SharedState<LoadResult<Vec<RemoteSubscriptions>, Error>>,
on_dialog_close: Callback<()>,
-) -> Option<Dialog> {
- if let Some(subs) = subs.read().data.clone() {
- let dialog = Dialog::new(tr!("Your Subscriptions"))
- .resizable(true)
- .width(500)
- .height(400)
- .min_width(200)
- .min_height(50)
- .with_child(SubscriptionsList::new(subs.clone()))
- .on_close(on_dialog_close);
- return Some(dialog);
- }
- None
+ on_refresh: Callback<MouseEvent>,
+) -> Dialog {
+ let loading = !subs.read().has_data();
+ let subs = subs.read().data.clone();
+ let subs = subs.unwrap_or_default();
+ Dialog::new(tr!("Your Subscriptions"))
+ .with_tool(Button::refresh(loading).on_activate(on_refresh))
+ .resizable(true)
+ .width(500)
+ .height(400)
+ .min_width(200)
+ .min_height(50)
+ .with_child(SubscriptionsList::new(subs))
+ .on_close(on_dialog_close)
}
pub fn create_subscription_panel(
diff --git a/ui/src/dashboard/view.rs b/ui/src/dashboard/view.rs
index 2adcee53..2791277b 100644
--- a/ui/src/dashboard/view.rs
+++ b/ui/src/dashboard/view.rs
@@ -95,6 +95,7 @@ pub enum Msg {
ShowSubscriptionsDialog(bool),
LayoutUpdate(ViewLayout),
UpdateResult(Result<(), Error>),
+ ForceSubscriptionUpdate,
}
struct ViewComp {
@@ -425,6 +426,22 @@ impl Component for ViewComp {
Msg::UpdateResult(res) => {
self.update_result.update(res);
}
+ Msg::ForceSubscriptionUpdate => {
+ let link = ctx.link().clone();
+ let view = ctx.props().view.clone();
+ self.render_args.subscriptions.write().clear();
+ self.async_pool.spawn(async move {
+ let mut params = json!({
+ "verbose": true,
+ "max-age": 0,
+ });
+ if let Some(view) = view {
+ params["view"] = view.to_string().into();
+ }
+ let res = http_get("/resources/subscription", Some(params)).await;
+ link.send_message(Msg::LoadingResult(LoadingResult::SubscriptionInfo(res)));
+ });
+ }
}
true
}
@@ -547,14 +564,14 @@ impl Component for ViewComp {
.on_submit(move |ctx| crate::remotes::create_remote(ctx, remote_type))
}));
- view.add_optional_child(if self.subscriptions_dialog {
- create_subscriptions_dialog(
- self.render_args.subscriptions.clone(),
- ctx.link().callback(|_| Msg::ShowSubscriptionsDialog(false)),
- )
- } else {
- None
- });
+ view.add_optional_child(
+ self.subscriptions_dialog
+ .then_some(create_subscriptions_dialog(
+ self.render_args.subscriptions.clone(),
+ ctx.link().callback(|_| Msg::ShowSubscriptionsDialog(false)),
+ ctx.link().callback(|_| Msg::ForceSubscriptionUpdate),
+ )),
+ );
let view_context = ViewContext {
name: props.view.clone(),
diff --git a/ui/src/load_result.rs b/ui/src/load_result.rs
index 4f3e6d5a..55436fd1 100644
--- a/ui/src/load_result.rs
+++ b/ui/src/load_result.rs
@@ -33,6 +33,12 @@ impl<T, E> LoadResult<T, E> {
pub fn has_data(&self) -> bool {
self.data.is_some() || self.error.is_some()
}
+
+ /// Clears both data and the error from the result.
+ pub fn clear(&mut self) {
+ self.data = None;
+ self.error = None;
+ }
}
impl<T, E> Default for LoadResult<T, E> {
--
2.47.3
More information about the pdm-devel
mailing list