From f83a48ac3fd309f4dfa750922a717a58c4d0c915 Mon Sep 17 00:00:00 2001 From: Franz Dietrich Date: Mon, 7 Jun 2021 14:00:59 +0200 Subject: [PATCH] all in --- app/Cargo.toml | 2 +- app/src/pages/list_links.rs | 31 +++++++++++++++++++++---------- pslink/static/admin.css | 5 +++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/Cargo.toml b/app/Cargo.toml index 754fd3e..0812f13 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -26,4 +26,4 @@ enum-map = "1" qrcode = "0.12" image = "0.23" -shared = { path = "../shared" } +shared = { path = "../shared" } \ No newline at end of file diff --git a/app/src/pages/list_links.rs b/app/src/pages/list_links.rs index 9d2cd32..3c15903 100644 --- a/app/src/pages/list_links.rs +++ b/app/src/pages/list_links.rs @@ -38,6 +38,7 @@ pub fn init(mut url: Url, orders: &mut impl Orders, i18n: I18n) -> Model { formconfig: LinkRequestForm::default(), // when requesting links the form is stored here inputs: EnumMap::default(), // the input fields for the searches dialog, + handle: None, } } @@ -48,6 +49,7 @@ pub struct Model { formconfig: LinkRequestForm, // when requesting links the form is stored here inputs: EnumMap, // the input fields for the searches dialog: Dialog, // User interaction - there can only ever be one dialog open. + handle: Option, // Rendering qr-codes takes time... it is aborted when this handle is dropped and replaced. } #[derive(Debug, Clone)] @@ -68,15 +70,14 @@ pub struct QrGuard { } impl QrGuard { - fn new(link_delta: LinkDelta) -> Self { + fn new(code: &str) -> Self { use std::iter::FromIterator; log!("Generating new QrCode"); - let LinkDelta { code, .. } = link_delta; - let svg = generate_qr_from_code(&code); + let svg = generate_qr_from_code(code); let mut properties = web_sys::BlobPropertyBag::new(); properties.type_("image/png"); - let png_vec = generate_qr_png(&code); + let png_vec = generate_qr_png(code); let png_jsarray: JsValue = js_sys::Uint8Array::from(&png_vec[..]).into(); // the buffer has to be an array of arrays @@ -89,6 +90,12 @@ impl QrGuard { } } +impl Drop for QrGuard { + fn drop(&mut self) { + let _ = web_sys::Url::revoke_object_url(&self.url); + } +} + #[derive(Default, Debug, Clone)] struct FilterInput { filter_input: ElRef, @@ -270,10 +277,10 @@ pub fn process_edit_messages(msg: EditMsg, model: &mut Model, orders: &mut impl qr: Loadable::Data(None), }; log!("#loaded dialog"); - orders.perform_cmd(async move { - let qr_code = Loadable::Data(Some(QrGuard::new(link_delta))); + model.handle = Some(orders.perform_cmd_with_handle(async move { + let qr_code = Loadable::Data(Some(QrGuard::new(&link_delta.code))); Msg::Edit(EditMsg::QrGeneration(qr_code)) - }); + })); orders.force_render_now(); log!("#after async"); } @@ -315,7 +322,11 @@ pub fn process_edit_messages(msg: EditMsg, model: &mut Model, orders: &mut impl ref mut link_delta, .. } = model.dialog { - link_delta.code = s; + link_delta.code = s.clone(); + model.handle = Some(orders.perform_cmd_with_handle(async move { + let qr_code = Loadable::Data(Some(QrGuard::new(&s))); + Msg::Edit(EditMsg::QrGeneration(qr_code)) + })); } } EditMsg::EditDescriptionChanged(s) => { @@ -667,7 +678,7 @@ fn edit_or_create_link String>( attrs! { At::Value => &link.code, At::Type => "text", - At::Placeholder => t("password") + At::Placeholder => t("link-code") }, input_ev(Ev::Input, |s| { Msg::Edit(EditMsg::EditCodeChanged(s)) }), ],] @@ -676,7 +687,7 @@ fn edit_or_create_link String>( th![t("qr-code")], if let Loadable::Data(Some(qr)) = qr { td![a![ - span!["Download", raw!(&qr.svg),], + span![C!["qrdownload"], "Download", raw!(&qr.svg),], attrs!(At::Href => qr.url, At::Download => "qr-code.png") ]] } else { diff --git a/pslink/static/admin.css b/pslink/static/admin.css index 542ecb5..2184eca 100644 --- a/pslink/static/admin.css +++ b/pslink/static/admin.css @@ -208,4 +208,9 @@ a { img.trashicon { width: 0.5cm; +} + +qrdownload { + display: flex; + vertical-align: middle; } \ No newline at end of file