[pmg-devel] [RFC pmg-yew-quarantine-gui 2/2] main view: handle optional quarantine action in spamreport links
Dominik Csapak
d.csapak at proxmox.com
Wed Oct 29 10:09:23 CET 2025
This is not correct I'm afraid.
It works, but just "by accident"
Usually doing such things in the 'view' method is not good, since
that can trigger any amount of times, depending on what happens
to the component.
it currently triggers only once, because when we login, we replace the
url via the 'location' which causes a refresh of the page, but seemingly
only after all outstanding javascript is finished running
with that refresh, we lose all state
Also we don't have any feedback here that the action was done.
I'll have an idea how to solve this, but it's a bit more involved than
this. I'd send a patch later if you don't mind
On 10/28/25 5:36 PM, Stoiko Ivanov wrote:
> Our html verbose spamreports have included links for each possible
> action for each mail (delete, deliver, blocklist, welcomelist) in the
> action GET parameter. Currently the yew-based mobile view does not
> handle those actions.
>
> This patch adds the functionality by issueing a POST request in the
> view function if the a cselect (id) and action parameter are present.
>
> I tried adding the same call to the update function, but it seems the
> update function does not get the query-string after a login, or was not
> called in my tests.
>
> Big thanks to Dominik for walking me through our yew framework and
> providing other valuable suggestions!
>
> Reported in our community forum:
> https://forum.proxmox.com/threads/.174685/
>
> Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
> ---
> src/main.rs | 28 +++++++++++++++++++++++++++-
> 1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/src/main.rs b/src/main.rs
> index 8cd8a6b..366cdc7 100644
> --- a/src/main.rs
> +++ b/src/main.rs
> @@ -1,5 +1,7 @@
> mod spam_list;
>
> +use std::str::FromStr;
> +
> pub use spam_list::SpamList;
>
> mod page_mail_view;
> @@ -14,7 +16,7 @@ pub use page_not_found::PageNotFound;
> mod page_login;
> pub use page_login::PageLogin;
>
> -use anyhow::Error;
> +use anyhow::{format_err, Error};
> use gloo_utils::{document, format::JsValueSerdeExt};
> use serde::Deserialize;
> use serde_json::{json, Value};
> @@ -114,6 +116,15 @@ impl Component for PmgQuarantineApp {
> let logged_in = self.login_info.is_some();
> MaterialApp::new(move |path: &str| {
> if logged_in {
> + let document = document();
> + let location = document.location().unwrap();
> + let search = location.search().unwrap();
> + let param = web_sys::UrlSearchParams::new_with_str(&search).unwrap();
> + if let (Some(id), Some(action)) = (param.get("cselect"), param.get("action")) {
> + wasm_bindgen_futures::spawn_local(async move {
> + _ = mail_action(&id, MailAction::from_str(&action).unwrap()).await
> + });
> + }
> switch(path)
> } else {
> vec![PageLogin::new().on_login(link.callback(Msg::Login)).into()]
> @@ -187,6 +198,21 @@ impl std::fmt::Display for MailAction {
> }
> }
>
> +impl std::str::FromStr for MailAction {
> + type Err = anyhow::Error;
> + fn from_str(s: &str) -> Result<Self, Self::Err> {
> + match s {
> + "deliver" => Ok(MailAction::Deliver),
> + "delete" => Ok(MailAction::Delete),
> + "welcomelist" => Ok(MailAction::Welcomelist),
> + "whitelist" => Ok(MailAction::Welcomelist),
> + "blocklist" => Ok(MailAction::Blocklist),
> + "blacklist" => Ok(MailAction::Blocklist),
> + _ => Err(format_err!("unknown quarantine action")),
> + }
> + }
> +}
> +
> pub(crate) async fn mail_action(id: &str, action: MailAction) -> Result<Value, Error> {
> let param = json!({
> "action": action.to_string(),
More information about the pmg-devel
mailing list