From: Hannes Laimer <h.laimer@proxmox.com>
To: Proxmox Datacenter Manager development discussion
<pdm-devel@lists.proxmox.com>,
Lukas Wagner <l.wagner@proxmox.com>
Subject: Re: [pdm-devel] [PATCH proxmox-datacenter-manager v2 4/4] ui: add firewall status tree
Date: Mon, 10 Nov 2025 16:29:40 +0100 [thread overview]
Message-ID: <98efbc2c-378a-4c35-b461-a5549fdba17f@proxmox.com> (raw)
In-Reply-To: <DE2GN9DSJVJQ.2MYYHEK5JS4QF@proxmox.com>
On 11/7/25 13:27, Lukas Wagner wrote:
> Looks good from what I can tell (not a super deep review though), some
> notes inline.
>
> There is some small bug that I've found, when you use the << button to
> collapse the tree and then expand it again, it is slightly smaller than
> before, noticable from the "x out of y rules enabled" text not fitting
> the view any more.
>
hmm, I couldn't reproduce this here. For v3 I'll replace the .flex(1)
with a fixed size, that should eliminate any potential _wonkiness_
> Also we need to find some way to handle unavailable remotes more
> gracefully. Right now, a single unavailable remote can block the entire
> loading progress until that one eventually times out; this is definitely
> not great UX-wise. But I think this can also be improved in a future
> patch series, IMO no need to block this until then.
>
yes. they are loaded in parallel, so max wait time is ~whatever our
timeout is. Maybe a lower timeout could make sense? (I *think* we have
that for remote resources...)
> On Wed Nov 5, 2025 at 5:35 PM CET, Hannes Laimer wrote:
>> + let mut remote_handle = root.append(remote_entry);
>> + remote_handle.set_expanded(cluster_is_enabled);
>> +
>> + for node_status in remote_status.nodes {
>> + let node_name = node_status.node.clone();
>> + let node_firewall_status = node_status.status;
>> +
>> + let node_entry = TreeEntry::Node(NodeEntry {
>> + remote: remote_name.clone(),
>> + name: node_name.clone(),
>> + status: node_firewall_status,
>> + masked: !cluster_is_enabled,
>> + });
>> +
>> + let mut node_handle = remote_handle.append(node_entry);
>> + node_handle.set_expanded(!node_status.guests.is_empty());
>> +
>> + for guest in node_status.guests {
>> + let guest_entry = GuestEntry::new(
>> + guest.clone(),
>> + node_name.clone(),
>> + remote_name.clone(),
>> + !cluster_is_enabled,
>> + );
>> +
>> + let tree_entry = match guest.kind {
>> + GuestKind::Lxc => TreeEntry::Guest(guest_entry, GuestKind::Lxc),
>> + GuestKind::Qemu => TreeEntry::Guest(guest_entry, GuestKind::Qemu),
>> + };
>
> This can just be:
>
> let tree_entry = TreeEntry::Guest(guest_entry, guest.kind);
>
>> +
>> + node_handle.append(tree_entry);
>> + }
>> + }
>> +}
>> +
>> +fn sort_entries(a: &TreeEntry, b: &TreeEntry) -> Ordering {
>> + let rank_a = a.sort_rank();
>> + let rank_b = b.sort_rank();
>> + match rank_a.cmp(&rank_b) {
>> + Ordering::Equal => a.name().cmp(&b.name()),
>> + other => other,
>> + }
>> +}
>> +
>> +pub enum Msg {
>> + DataLoaded {
>> + generation: usize,
>> + data: Vec<pdm_api_types::firewall::RemoteFirewallStatus>,
>> + },
>> + RemoteListChanged,
>> + Reload,
>> + FilterChanged(String),
>> + ScopeChanged(Scope),
>> + RemotesLoaded(Vec<String>),
>> + NodesLoaded {
>> + generation: usize,
>> + nodes: Vec<String>,
>> + },
>> + SelectionChanged(Option<yew::virtual_dom::Key>),
>> + ToggleTreePanel,
>> + Error(FirewallError),
>> + NoOp,
>> +}
>> +
>
> [...]
>
>> +
>> +fn create_remote_combobox(
>> + ctx: &LoadableComponentContext<FirewallTreeComponent>,
>> + available_remotes: &[String],
>> + options_loading: bool,
>> + current_scope: &Scope,
>> +) -> Html {
>> + if options_loading {
>> + return Combobox::new()
>> + .items(Rc::new(vec![]))
>> + .placeholder(tr!("Loading..."))
>> + .disabled(true)
>> + .key("remote-combobox-loading")
>> + .on_change(ctx.link().callback(|_: String| Msg::NoOp))
>> + .into();
>> + }
>> +
>> + let items: Vec<yew::AttrValue> = available_remotes
>> + .iter()
>> + .map(|remote| yew::AttrValue::from(remote.clone()))
>> + .collect();
>> +
>> + let current_value = current_scope
>> + .remote_name()
>> + .map(|s| yew::AttrValue::from(s.to_string()));
>> +
>> + Combobox::new()
>> + .items(Rc::new(items))
>> + .default(current_value)
>> + .placeholder(tr!("All remotes"))
>
> This combobox also shows PBS remotes, I guess they need to be filtered
> out somewhere along the way.
>
>> + .disabled(false)
>> + .key("remote-combobox")
>> + .on_change(ctx.link().callback(move |value: String| {
>> + if value.is_empty() {
>> + Msg::ScopeChanged(Scope::All)
>> + } else {
>> + Msg::ScopeChanged(Scope::Remote { name: value })
>> + }
>> + }))
>> + .into()
>> +}
>> +
>
>
>
> _______________________________________________
> pdm-devel mailing list
> pdm-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel
>
>
_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel
next prev parent reply other threads:[~2025-11-10 15:29 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-05 16:35 [pdm-devel] [PATCH proxmox{, -yew-comp, -datacenter-manager} v2 00/12] add basic integration of PVE firewall Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox v2 1/4] pve-api-types: update pve-api.json Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox v2 2/4] pve-api-types: add get/update firewall options endpoints Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox v2 3/4] pve-api-types: add list firewall rules endpoints Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox v2 4/4] pve-api-types: regenerate Hannes Laimer
2025-11-10 13:47 ` Michael Köppl
2025-11-10 14:04 ` Hannes Laimer
2025-11-10 15:25 ` Michael Köppl
2025-11-10 15:33 ` Hannes Laimer
2025-11-10 15:40 ` Hannes Laimer
2025-11-10 15:47 ` Michael Köppl
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-yew-comp v2 1/4] form: add helpers for extractig data out of schemas Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-yew-comp v2 2/4] firewall: add FirewallContext Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-yew-comp v2 3/4] firewall: add options edit form Hannes Laimer
2025-11-07 12:26 ` Lukas Wagner
2025-11-10 12:36 ` Michael Köppl
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-yew-comp v2 4/4] firewall: add rules table Hannes Laimer
2025-11-07 12:26 ` Lukas Wagner
2025-11-10 14:51 ` Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-datacenter-manager v2 1/4] pdm-api-types: add firewall status types Hannes Laimer
2025-11-07 12:27 ` Lukas Wagner
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-datacenter-manager v2 2/4] api: firewall: add option, rules and status endpoints Hannes Laimer
2025-11-06 16:58 ` Michael Köppl
2025-11-07 6:43 ` Hannes Laimer
2025-11-07 12:27 ` Lukas Wagner
2025-11-10 14:56 ` Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-datacenter-manager v2 3/4] pdm-client: add api methods for firewall options, " Hannes Laimer
2025-11-05 16:35 ` [pdm-devel] [PATCH proxmox-datacenter-manager v2 4/4] ui: add firewall status tree Hannes Laimer
2025-11-07 12:27 ` Lukas Wagner
2025-11-10 15:29 ` Hannes Laimer [this message]
2025-11-10 17:26 ` [pdm-devel] superseded: [PATCH proxmox{, -yew-comp, -datacenter-manager} v2 00/12] add basic integration of PVE firewall Hannes Laimer
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=98efbc2c-378a-4c35-b461-a5549fdba17f@proxmox.com \
--to=h.laimer@proxmox.com \
--cc=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