[pdm-devel] [PATCH datacenter-manager v2 3/4] ui: main menu: use the AclContext to hide the Notes if appropriate
Shannon Sterz
s.sterz at proxmox.com
Fri Oct 24 16:51:25 CEST 2025
a user that does not have `PRIV_SYS_AUDIT` on `/system` is not allowed
to view the notes and one that lacks `PRIV_SYS_MODIFY` on
`/system/notes` is not allowed to edit them. so hide the respective ui
elements when a user does not have the necessary permissions.
Signed-off-by: Shannon Sterz <s.sterz at proxmox.com>
---
ui/src/main_menu.rs | 68 ++++++++++++++++++++++++++++++++-------------
1 file changed, 48 insertions(+), 20 deletions(-)
diff --git a/ui/src/main_menu.rs b/ui/src/main_menu.rs
index 7650b63..ffcd836 100644
--- a/ui/src/main_menu.rs
+++ b/ui/src/main_menu.rs
@@ -9,9 +9,10 @@ use pwt::state::Selection;
use pwt::widget::nav::{Menu, MenuItem, NavigationDrawer};
use pwt::widget::{Container, Row, SelectionView, SelectionViewRenderInfo};
-use proxmox_yew_comp::{NotesView, XTermJs};
+use proxmox_yew_comp::{AclContext, NotesView, XTermJs};
use pdm_api_types::remotes::RemoteType;
+use pdm_api_types::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
use crate::remotes::RemotesPanel;
use crate::sdn::evpn::EvpnPanel;
@@ -62,11 +63,14 @@ impl MainMenu {
pub enum Msg {
Select(Key),
+ UpdateAcl(AclContext),
}
pub struct PdmMainMenu {
active: Key,
menu_selection: Selection,
+ acl_context: AclContext,
+ _acl_context_listener: ContextHandle<AclContext>,
}
fn register_view(
@@ -109,10 +113,17 @@ impl Component for PdmMainMenu {
type Message = Msg;
type Properties = MainMenu;
- fn create(_ctx: &Context<Self>) -> Self {
+ fn create(ctx: &Context<Self>) -> Self {
+ let (acl_context, acl_context_listener) = ctx
+ .link()
+ .context(ctx.link().callback(Msg::UpdateAcl))
+ .expect("acl context not present");
+
Self {
active: Key::from("dashboard"),
menu_selection: Selection::new(),
+ acl_context,
+ _acl_context_listener: acl_context_listener,
}
}
@@ -122,6 +133,10 @@ impl Component for PdmMainMenu {
self.active = key;
true
}
+ Msg::UpdateAcl(acl_context) => {
+ self.acl_context = acl_context;
+ true
+ }
}
}
@@ -144,25 +159,38 @@ impl Component for PdmMainMenu {
move |_| Dashboard::new().into(),
);
- register_view(
- &mut menu,
- &mut content,
- tr!("Notes"),
- "notes",
- Some("fa fa-sticky-note-o"),
- move |_| {
- let notes = NotesView::new("/config/notes").on_submit(|notes| async move {
- proxmox_yew_comp::http_put("/config/notes", Some(serde_json::to_value(¬es)?))
- .await
- });
+ if self.acl_context.check_privs(&["system"], PRIV_SYS_AUDIT) {
+ let allow_editing = self
+ .acl_context
+ .check_privs(&["system", "notes"], PRIV_SYS_MODIFY);
- Container::new()
- .class("pwt-content-spacer")
- .class(pwt::css::FlexFit)
- .with_child(notes)
- .into()
- },
- );
+ register_view(
+ &mut menu,
+ &mut content,
+ tr!("Notes"),
+ "notes",
+ Some("fa fa-sticky-note-o"),
+ move |_| {
+ let mut notes = NotesView::new("/config/notes");
+
+ if allow_editing {
+ notes.set_on_submit(|notes| async move {
+ proxmox_yew_comp::http_put(
+ "/config/notes",
+ Some(serde_json::to_value(¬es)?),
+ )
+ .await
+ });
+ }
+
+ Container::new()
+ .class("pwt-content-spacer")
+ .class(pwt::css::FlexFit)
+ .with_child(notes)
+ .into()
+ },
+ )
+ }
let mut config_submenu = Menu::new();
--
2.47.3
More information about the pdm-devel
mailing list