nova-trame 0.24.1__py3-none-any.whl → 0.25.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nova/trame/view/components/file_upload.py +18 -4
- nova/trame/view/components/remote_file_input.py +9 -2
- nova/trame/view/theme/assets/core_style.scss +4 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.0.dist-info}/METADATA +1 -1
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.0.dist-info}/RECORD +8 -8
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.0.dist-info}/LICENSE +0 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.0.dist-info}/WHEEL +0 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.0.dist-info}/entry_points.txt +0 -0
@@ -10,7 +10,14 @@ from .remote_file_input import RemoteFileInput
|
|
10
10
|
class FileUpload(vuetify.VBtn):
|
11
11
|
"""Component for uploading a file from either the user's filesystem or the server filesystem."""
|
12
12
|
|
13
|
-
def __init__(
|
13
|
+
def __init__(
|
14
|
+
self,
|
15
|
+
v_model: str,
|
16
|
+
base_paths: Optional[List[str]] = None,
|
17
|
+
label: str = "",
|
18
|
+
return_contents: bool = True,
|
19
|
+
**kwargs: Any,
|
20
|
+
) -> None:
|
14
21
|
"""Constructor for FileUpload.
|
15
22
|
|
16
23
|
Parameters
|
@@ -23,6 +30,9 @@ class FileUpload(vuetify.VBtn):
|
|
23
30
|
Passed to :ref:`RemoteFileInput <api_remotefileinput>`.
|
24
31
|
label : str, optional
|
25
32
|
The text to display on the upload button.
|
33
|
+
return_contents : bool, optional
|
34
|
+
If true, the file contents will be stored in v_model. If false, a file path will be stored in v_model.
|
35
|
+
Defaults to true.
|
26
36
|
**kwargs
|
27
37
|
All other arguments will be passed to the underlying
|
28
38
|
`Button component <https://trame.readthedocs.io/en/latest/trame.widgets.vuetify3.html#trame.widgets.vuetify3.VBtn>`_.
|
@@ -36,6 +46,7 @@ class FileUpload(vuetify.VBtn):
|
|
36
46
|
self._base_paths = base_paths
|
37
47
|
else:
|
38
48
|
self._base_paths = ["/"]
|
49
|
+
self._return_contents = return_contents
|
39
50
|
self._ref_name = f"nova__fileupload_{self._next_id}"
|
40
51
|
|
41
52
|
super().__init__(label, **kwargs)
|
@@ -49,12 +60,15 @@ class FileUpload(vuetify.VBtn):
|
|
49
60
|
# Serialize the content in a way that will work with nova-mvvm and then push it to the server.
|
50
61
|
update_modelValue=(
|
51
62
|
f"{self._v_model}.arrayBuffer().then((contents) => {{"
|
52
|
-
f"trigger('decode_blob_{self._id}', [contents]); "
|
63
|
+
f" trigger('decode_blob_{self._id}', [contents]); "
|
53
64
|
"});"
|
54
65
|
),
|
55
66
|
)
|
56
67
|
self.remote_file_input = RemoteFileInput(
|
57
|
-
v_model=self._v_model,
|
68
|
+
v_model=self._v_model,
|
69
|
+
base_paths=self._base_paths,
|
70
|
+
input_props={"classes": "d-none"},
|
71
|
+
return_contents=self._return_contents,
|
58
72
|
)
|
59
73
|
|
60
74
|
with self:
|
@@ -65,7 +79,7 @@ class FileUpload(vuetify.VBtn):
|
|
65
79
|
|
66
80
|
@self.server.controller.trigger(f"decode_blob_{self._id}")
|
67
81
|
def _decode_blob(contents: bytes) -> None:
|
68
|
-
self.remote_file_input.decode_file(contents)
|
82
|
+
self.remote_file_input.decode_file(contents, self._return_contents)
|
69
83
|
|
70
84
|
def select_file(self, value: str) -> None:
|
71
85
|
"""Programmatically set the RemoteFileInput path.
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""View implementation for RemoteFileInput."""
|
2
2
|
|
3
3
|
from functools import partial
|
4
|
+
from tempfile import NamedTemporaryFile
|
4
5
|
from typing import Any, Optional, Union, cast
|
5
6
|
|
6
7
|
from trame.app import get_server
|
@@ -207,9 +208,15 @@ class RemoteFileInput:
|
|
207
208
|
with open(file_path, mode="rb") as file:
|
208
209
|
self.decode_file(file.read())
|
209
210
|
|
210
|
-
def decode_file(self, bytestream: bytes) -> None:
|
211
|
+
def decode_file(self, bytestream: bytes, set_contents: bool = False) -> None:
|
211
212
|
decoded_content = bytestream.decode("latin1")
|
212
|
-
|
213
|
+
if set_contents:
|
214
|
+
self.set_v_model(decoded_content)
|
215
|
+
else:
|
216
|
+
with NamedTemporaryFile(mode="w", delete=False, encoding="utf-8") as temp_file:
|
217
|
+
temp_file.write(decoded_content)
|
218
|
+
temp_file.flush()
|
219
|
+
self.set_v_model(temp_file.name)
|
213
220
|
|
214
221
|
def select_file(self, value: str) -> None:
|
215
222
|
"""Programmatically set the v_model value."""
|
@@ -7,12 +7,12 @@ nova/trame/model/remote_file_input.py,sha256=9KAf31ZHzpsh_aXUrNcF81Q5jvUZDWCzW1Q
|
|
7
7
|
nova/trame/view/components/__init__.py,sha256=60BeS69aOrFnkptjuD17rfPE1f4Z35iBH56TRmW5MW8,451
|
8
8
|
nova/trame/view/components/data_selector.py,sha256=EJ8fYCrkhRgDExAcewiUb7jTs7Qzo-GKVYWx7oFlrT0,14592
|
9
9
|
nova/trame/view/components/execution_buttons.py,sha256=fIkrWKI3jFZqk3GHhtmYh3nK2c-HOXpD3D3zd_TUpi0,4049
|
10
|
-
nova/trame/view/components/file_upload.py,sha256=
|
10
|
+
nova/trame/view/components/file_upload.py,sha256=Q3t7TUJ8w6wlEqb1mnJ23yBsM1XmQPtm0awaoBrlLXo,3509
|
11
11
|
nova/trame/view/components/input_field.py,sha256=Rtcl_eszvhgyC1rhTI7OMSLHjrE7DNH44eY08k7UXks,16094
|
12
12
|
nova/trame/view/components/ornl/__init__.py,sha256=HnxzzSsxw0vQSDCVFfWsAxx1n3HnU37LMuQkfiewmSU,90
|
13
13
|
nova/trame/view/components/ornl/neutron_data_selector.py,sha256=YTYuLD5eDn3AsKguT8ksPx2Yme2RxheuXQGlhuTLOOc,12527
|
14
14
|
nova/trame/view/components/progress_bar.py,sha256=fCfPw4MPAvORaeFOXugreok4GLpDVZGMkqvnv-AhMxg,2967
|
15
|
-
nova/trame/view/components/remote_file_input.py,sha256=
|
15
|
+
nova/trame/view/components/remote_file_input.py,sha256=6mUz6JZVhLO_Y4mZaQd_lpPe33KLtSpjxXS7uTNUmFI,10004
|
16
16
|
nova/trame/view/components/tool_outputs.py,sha256=-6pDURd2l_FK_8EWa9BI3KhU_KJXJ6uyJ_rW4nQVc08,2337
|
17
17
|
nova/trame/view/components/visualization/__init__.py,sha256=reqkkbhD5uSksHHlhVMy1qNUCwSekS5HlXk6wCREYxU,152
|
18
18
|
nova/trame/view/components/visualization/interactive_2d_plot.py,sha256=foZCMoqbuahT5dtqIQvm8C4ZJcY9P211eJEcpQJltmM,3421
|
@@ -23,7 +23,7 @@ nova/trame/view/layouts/hbox.py,sha256=cdwnGk93ec6dXAeEamRQx1WTj5T7Ygsmsy0xz130t
|
|
23
23
|
nova/trame/view/layouts/utils.py,sha256=Hg34VQWTG3yHBsgNvmfatR4J-uL3cko7UxSJpT-h3JI,376
|
24
24
|
nova/trame/view/layouts/vbox.py,sha256=XRV14e32MY1HWc9FTVTv1vOatWWbhLMd0lYwZP-isTg,3520
|
25
25
|
nova/trame/view/theme/__init__.py,sha256=70_marDlTigIcPEOGiJb2JTs-8b2sGM5SlY7XBPtBDM,54
|
26
|
-
nova/trame/view/theme/assets/core_style.scss,sha256=
|
26
|
+
nova/trame/view/theme/assets/core_style.scss,sha256=uZKMMhXRsvVy_17dK32ETNJn-4c7_xzj01FRkx7axY0,4262
|
27
27
|
nova/trame/view/theme/assets/favicon.png,sha256=Xbp1nUmhcBDeObjsebEbEAraPDZ_M163M_ZLtm5AbQc,1927
|
28
28
|
nova/trame/view/theme/assets/js/delay_manager.js,sha256=mRV6KoO8-Bxq3tG5Bh9CQYy-CRVbkj3IYlqNb-Og7cI,526
|
29
29
|
nova/trame/view/theme/assets/js/lodash.min.js,sha256=KCyAYJ-fsqtp_HMwbjhy6IKjlA5lrVrtWt1JdMsC57k,73016
|
@@ -38,8 +38,8 @@ nova/trame/view_model/ornl/neutron_data_selector.py,sha256=l1l_e0CFsVZ0h-9MPSjXT
|
|
38
38
|
nova/trame/view_model/progress_bar.py,sha256=6AUKHF3hfzbdsHqNEnmHRgDcBKY5TT8ywDx9S6ovnsc,2854
|
39
39
|
nova/trame/view_model/remote_file_input.py,sha256=ojEOJ8ZPkajpbAaZi9VLj7g-uBjhb8BMrTdMmwf_J6A,3367
|
40
40
|
nova/trame/view_model/tool_outputs.py,sha256=ev6LY7fJ0H2xAJn9f5ww28c8Kpom2SYc2FbvFcoN4zg,829
|
41
|
-
nova_trame-0.
|
42
|
-
nova_trame-0.
|
43
|
-
nova_trame-0.
|
44
|
-
nova_trame-0.
|
45
|
-
nova_trame-0.
|
41
|
+
nova_trame-0.25.0.dist-info/LICENSE,sha256=Iu5QiDbwNbREg75iYaxIJ_V-zppuv4QFuBhAW-qiAlM,1061
|
42
|
+
nova_trame-0.25.0.dist-info/METADATA,sha256=Vr8vS4k_Z0Bi4yHF24w5fYtRDcHh8KxcuSO8BWmv0AM,1688
|
43
|
+
nova_trame-0.25.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
44
|
+
nova_trame-0.25.0.dist-info/entry_points.txt,sha256=J2AmeSwiTYZ4ZqHHp9HO6v4MaYQTTBPbNh6WtoqOT58,42
|
45
|
+
nova_trame-0.25.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|