Pārlūkot izejas kodu

make download work for state vars (#2092)

Thomas Brandého 1 gadu atpakaļ
vecāks
revīzija
96c09b0f6b
2 mainītis faili ar 12 papildinājumiem un 7 dzēšanām
  1. 2 1
      reflex/.templates/web/utils/state.js
  2. 10 6
      reflex/event.py

+ 2 - 1
reflex/.templates/web/utils/state.js

@@ -171,7 +171,8 @@ export const applyEvent = async (event, socket) => {
     const a = document.createElement('a');
     a.hidden = true;
     a.href = event.payload.url;
-    a.download = event.payload.filename;
+    if (event.payload.filename)
+      a.download = event.payload.filename;
     a.click();
     a.remove();
     return false;

+ 10 - 6
reflex/event.py

@@ -434,7 +434,7 @@ def set_clipboard(content: str) -> EventSpec:
     )
 
 
-def download(url: str, filename: Optional[str] = None) -> EventSpec:
+def download(url: str | Var, filename: Optional[str | Var] = None) -> EventSpec:
     """Download the file at a given path.
 
     Args:
@@ -447,12 +447,16 @@ def download(url: str, filename: Optional[str] = None) -> EventSpec:
     Returns:
         EventSpec: An event to download the associated file.
     """
-    if not url.startswith("/"):
-        raise ValueError("The URL argument should start with a /")
+    if isinstance(url, Var) and filename is None:
+        filename = ""
 
-    # if filename is not provided, infer it from url
-    if filename is None:
-        filename = url.rpartition("/")[-1]
+    if isinstance(url, str):
+        if not url.startswith("/"):
+            raise ValueError("The URL argument should start with a /")
+
+        # if filename is not provided, infer it from url
+        if filename is None:
+            filename = url.rpartition("/")[-1]
 
     return server_side(
         "_download",