nova-trame 0.24.1__py3-none-any.whl → 0.25.2__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/_internal/utils.py +8 -1
- nova/trame/view/components/data_selector.py +1 -0
- nova/trame/view/components/execution_buttons.py +15 -4
- nova/trame/view/components/file_upload.py +18 -4
- nova/trame/view/components/ornl/neutron_data_selector.py +10 -1
- nova/trame/view/components/progress_bar.py +2 -1
- nova/trame/view/components/remote_file_input.py +9 -2
- nova/trame/view/components/tool_outputs.py +2 -1
- nova/trame/view/components/visualization/interactive_2d_plot.py +4 -2
- nova/trame/view/components/visualization/matplotlib_figure.py +9 -5
- nova/trame/view/theme/assets/core_style.scss +4 -0
- nova/trame/view/theme/assets/js/revo_grid.js +24 -8
- nova/trame/view_model/data_selector.py +2 -0
- nova/trame/view_model/ornl/neutron_data_selector.py +2 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.2.dist-info}/METADATA +2 -1
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.2.dist-info}/RECORD +19 -19
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.2.dist-info}/LICENSE +0 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.2.dist-info}/WHEEL +0 -0
- {nova_trame-0.24.1.dist-info → nova_trame-0.25.2.dist-info}/entry_points.txt +0 -0
nova/trame/_internal/utils.py
CHANGED
@@ -7,6 +7,13 @@ from trame_server.core import State
|
|
7
7
|
from nova.mvvm._internal.utils import rgetdictvalue, rsetdictvalue
|
8
8
|
|
9
9
|
|
10
|
+
# Trame state handlers don't work on nested properties. When writing Trame state handlers (e.g. flushState, dirty, or
|
11
|
+
# change), we instead use the name of the top-level property. For example, "config.parameter_group_a.option_x" becomes
|
12
|
+
# "config".
|
13
|
+
def get_state_name(name: str) -> str:
|
14
|
+
return name.split(".")[0]
|
15
|
+
|
16
|
+
|
10
17
|
# Reads a state parameter from Trame. For internal use only, if you're using this in your application you're violating
|
11
18
|
# the MVVM framework. :)
|
12
19
|
def get_state_param(state: State, value: Union[Any, Tuple]) -> Any:
|
@@ -25,6 +32,6 @@ def set_state_param(state: State, value: Union[Any, Tuple], new_value: Any = Non
|
|
25
32
|
rsetdictvalue(state, value[0], new_value)
|
26
33
|
elif len(value) > 1:
|
27
34
|
rsetdictvalue(state, value[0], value[1])
|
28
|
-
state.dirty(value[0]
|
35
|
+
state.dirty(get_state_name(value[0]))
|
29
36
|
|
30
37
|
return get_state_param(state, value)
|
@@ -226,6 +226,7 @@ class DataSelector(datagrid.VGrid):
|
|
226
226
|
self._vm.directories_bind.connect(self._directories_name)
|
227
227
|
self._vm.datafiles_bind.connect(self._datafiles_name)
|
228
228
|
self._vm.reset_bind.connect(self.reset)
|
229
|
+
self._vm.reset_grid_bind.connect(self._reset_rv_grid)
|
229
230
|
|
230
231
|
def refresh_contents(self) -> None:
|
231
232
|
self._vm.update_view(refresh_directories=True)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
"""Module for the Progress Tab."""
|
2
2
|
|
3
|
+
from typing import Tuple, Union
|
4
|
+
|
3
5
|
from trame.app import get_server
|
4
6
|
from trame.widgets import client
|
5
7
|
from trame.widgets import vuetify3 as vuetify
|
@@ -15,16 +17,17 @@ class ExecutionButtons:
|
|
15
17
|
This is intended to be used with the `nova-galaxy ToolRunner <https://nova-application-development.readthedocs.io/projects/nova-galaxy/en/latest/core_concepts/tool_runner.html>`__.
|
16
18
|
"""
|
17
19
|
|
18
|
-
def __init__(self, id: str, stop_btn: bool = False, download_btn: bool = False) -> None:
|
20
|
+
def __init__(self, id: str, stop_btn: Union[bool, Tuple] = False, download_btn: Union[bool, Tuple] = False) -> None:
|
19
21
|
"""Constructor for ExecutionButtons.
|
20
22
|
|
21
23
|
Parameters
|
22
24
|
----------
|
23
25
|
id : str
|
24
|
-
Component id. Should be used consistently with ToolRunner and other components.
|
25
|
-
|
26
|
+
Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
|
27
|
+
does not support Trame bindings.
|
28
|
+
stop_btn: Union[bool, Tuple]
|
26
29
|
Display stop button.
|
27
|
-
download_btn : bool
|
30
|
+
download_btn : Union[bool, Tuple]
|
28
31
|
Display download button.
|
29
32
|
|
30
33
|
Returns
|
@@ -69,6 +72,9 @@ class ExecutionButtons:
|
|
69
72
|
click=self.run,
|
70
73
|
)
|
71
74
|
if self.stop_btn:
|
75
|
+
extra_params = {}
|
76
|
+
if isinstance(self.stop_btn, tuple):
|
77
|
+
extra_params["v_if"] = self.stop_btn
|
72
78
|
vuetify.VBtn(
|
73
79
|
"Stop",
|
74
80
|
disabled=(f"{self.id}.stop_disabled",),
|
@@ -77,6 +83,7 @@ class ExecutionButtons:
|
|
77
83
|
id=f"{self.id}_stop",
|
78
84
|
prepend_icon="mdi-stop",
|
79
85
|
click=self.stop,
|
86
|
+
**extra_params,
|
80
87
|
)
|
81
88
|
vuetify.VBtn(
|
82
89
|
"Cancel",
|
@@ -89,12 +96,16 @@ class ExecutionButtons:
|
|
89
96
|
click=self.cancel,
|
90
97
|
)
|
91
98
|
if self.download_btn:
|
99
|
+
extra_params = {}
|
100
|
+
if isinstance(self.download_btn, tuple):
|
101
|
+
extra_params["v_if"] = self.download_btn
|
92
102
|
vuetify.VBtn(
|
93
103
|
"Download Results",
|
94
104
|
disabled=(f"{self.id}.download_disabled",),
|
95
105
|
loading=(f"{self.id}.download_in_progress",),
|
96
106
|
id=f"{self.id}.download",
|
97
107
|
click=self.download,
|
108
|
+
**extra_params,
|
98
109
|
)
|
99
110
|
|
100
111
|
async def download(self) -> None:
|
@@ -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.
|
@@ -154,6 +154,7 @@ class NeutronDataSelector(DataSelector):
|
|
154
154
|
self._vm.directories_bind.connect(self._directories_name)
|
155
155
|
self._vm.datafiles_bind.connect(self._datafiles_name)
|
156
156
|
self._vm.reset_bind.connect(self.reset)
|
157
|
+
self._vm.reset_grid_bind.connect(self._reset_rv_grid)
|
157
158
|
|
158
159
|
self._vm.update_view()
|
159
160
|
|
@@ -207,8 +208,12 @@ class NeutronDataSelector(DataSelector):
|
|
207
208
|
@self.state.change(self._experiment[0].split(".")[0])
|
208
209
|
def on_experiment_change(**kwargs: Any) -> None:
|
209
210
|
experiment = rgetdictvalue(kwargs, self._experiment[0])
|
210
|
-
if experiment != self._last_experiment:
|
211
|
+
if experiment and experiment != self._last_experiment:
|
211
212
|
self._last_experiment = experiment
|
213
|
+
# See the note in the update_experiment method for why we call this twice.
|
214
|
+
self._vm.set_binding_parameters(
|
215
|
+
experiment=set_state_param(self.state, (self._selected_experiment_name,), ""),
|
216
|
+
)
|
212
217
|
self._vm.set_binding_parameters(
|
213
218
|
experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment)
|
214
219
|
)
|
@@ -244,6 +249,10 @@ class NeutronDataSelector(DataSelector):
|
|
244
249
|
self._vm.reset()
|
245
250
|
|
246
251
|
def update_experiment(self, experiment: str) -> None:
|
252
|
+
# Setting the experiment to an empty string forces the treeview to clear it's selection state.
|
253
|
+
self._vm.set_binding_parameters(
|
254
|
+
experiment=set_state_param(self.state, (self._selected_experiment_name,), ""),
|
255
|
+
)
|
247
256
|
self._vm.set_binding_parameters(
|
248
257
|
experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment),
|
249
258
|
)
|
@@ -20,7 +20,8 @@ class ProgressBar:
|
|
20
20
|
Parameters
|
21
21
|
----------
|
22
22
|
id : str
|
23
|
-
Component id. Should be used consistently with ToolRunner and other components
|
23
|
+
Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
|
24
|
+
does not support Trame bindings.
|
24
25
|
|
25
26
|
Returns
|
26
27
|
-------
|
@@ -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."""
|
@@ -21,7 +21,8 @@ class ToolOutputWindows:
|
|
21
21
|
Parameters
|
22
22
|
----------
|
23
23
|
id : str
|
24
|
-
Component id. Should be used consistently with ToolRunner and other components
|
24
|
+
Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
|
25
|
+
does not support Trame bindings.
|
25
26
|
|
26
27
|
Returns
|
27
28
|
-------
|
@@ -30,7 +30,7 @@ class Interactive2DPlot(vega.Figure):
|
|
30
30
|
|
31
31
|
Parameters
|
32
32
|
----------
|
33
|
-
figure : `altair.Chart <https://altair-viz.github.io/user_guide/generated/toplevel/altair.Chart.html#altair.Chart>`
|
33
|
+
figure : `altair.Chart <https://altair-viz.github.io/user_guide/generated/toplevel/altair.Chart.html#altair.Chart>`__, optional
|
34
34
|
Altair chart object
|
35
35
|
kwargs
|
36
36
|
Arguments to be passed to `AbstractElement <https://trame.readthedocs.io/en/latest/core.widget.html#trame_client.widgets.core.AbstractElement>`_
|
@@ -38,7 +38,7 @@ class Interactive2DPlot(vega.Figure):
|
|
38
38
|
Returns
|
39
39
|
-------
|
40
40
|
None
|
41
|
-
"""
|
41
|
+
""" # noqa: E501
|
42
42
|
self._initialized = False
|
43
43
|
|
44
44
|
super().__init__(figure=figure, **kwargs)
|
@@ -83,3 +83,5 @@ class Interactive2DPlot(vega.Figure):
|
|
83
83
|
|
84
84
|
if hasattr(self, "_start_update_handlers"):
|
85
85
|
self._start_update_handlers()
|
86
|
+
|
87
|
+
self.server.state.flush()
|
@@ -200,18 +200,20 @@ class MatplotlibFigure(matplotlib.Figure):
|
|
200
200
|
|
201
201
|
Parameters
|
202
202
|
----------
|
203
|
-
figure : `
|
204
|
-
|
205
|
-
webagg : bool
|
203
|
+
figure : `matplotlib.figure.Figure <https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure>`__, optional
|
204
|
+
Initial Matplotlib figure.
|
205
|
+
webagg : bool, optional
|
206
206
|
If true, then the WebAgg backend for Matplotlib is used. If not, then the default Trame matplotlib plugin
|
207
|
-
is used.
|
207
|
+
is used. Note that this parameter does not supporting Trame bindings since the user experiences are
|
208
|
+
fundamentally different between the two options and toggling them is not considered a good idea by the
|
209
|
+
author of this component.
|
208
210
|
kwargs
|
209
211
|
Arguments to be passed to `AbstractElement <https://trame.readthedocs.io/en/latest/core.widget.html#trame_client.widgets.core.AbstractElement>`_
|
210
212
|
|
211
213
|
Returns
|
212
214
|
-------
|
213
215
|
None
|
214
|
-
"""
|
216
|
+
""" # noqa: E501
|
215
217
|
self._webagg = webagg
|
216
218
|
if webagg:
|
217
219
|
self._port = MatplotlibFigure._get_free_port()
|
@@ -253,6 +255,8 @@ class MatplotlibFigure(matplotlib.Figure):
|
|
253
255
|
else:
|
254
256
|
super().update(figure)
|
255
257
|
|
258
|
+
self._server.state.flush()
|
259
|
+
|
256
260
|
def _setup_figure_websocket(self) -> None:
|
257
261
|
thread = Thread(target=self._mpl_run_ws_server, daemon=True)
|
258
262
|
thread.start()
|
@@ -12,6 +12,11 @@ class RevoGrid {
|
|
12
12
|
}
|
13
13
|
|
14
14
|
updateCheckboxes() {
|
15
|
+
// Wait for the DOM to update after the Trame state is updated.
|
16
|
+
setTimeout(this._updateCheckboxes.bind(this), 10)
|
17
|
+
}
|
18
|
+
|
19
|
+
_updateCheckboxes() {
|
15
20
|
const trameState = window.trame.state.state
|
16
21
|
const modelValue = _.get(trameState, this.modelKey)
|
17
22
|
const availableData = _.get(trameState, this.dataKey)
|
@@ -22,23 +27,34 @@ class RevoGrid {
|
|
22
27
|
return
|
23
28
|
}
|
24
29
|
|
30
|
+
let allSelected = null
|
31
|
+
rowCheckboxes.forEach((element) => {
|
32
|
+
const input = element.querySelector('input')
|
33
|
+
|
34
|
+
const rowIndex = element.dataset.rgrow
|
35
|
+
if (availableData[rowIndex] !== undefined) {
|
36
|
+
input.checked = modelValue.includes(availableData[rowIndex].path)
|
37
|
+
} else {
|
38
|
+
input.checked = false
|
39
|
+
}
|
40
|
+
|
41
|
+
if (allSelected === null && input.checked) {
|
42
|
+
allSelected = true
|
43
|
+
} else if (!input.checked) {
|
44
|
+
allSelected = false
|
45
|
+
}
|
46
|
+
})
|
47
|
+
|
25
48
|
if (modelValue.length === 0) {
|
26
49
|
selectAllCheckbox.checked = false
|
27
50
|
selectAllCheckbox.indeterminate = false
|
28
|
-
} else if (
|
51
|
+
} else if (allSelected === true) {
|
29
52
|
selectAllCheckbox.checked = true
|
30
53
|
selectAllCheckbox.indeterminate = false
|
31
54
|
} else {
|
32
55
|
selectAllCheckbox.checked = false
|
33
56
|
selectAllCheckbox.indeterminate = true
|
34
57
|
}
|
35
|
-
|
36
|
-
rowCheckboxes.forEach((element) => {
|
37
|
-
const input = element.querySelector('input')
|
38
|
-
|
39
|
-
const rowIndex = element.dataset.rgrow
|
40
|
-
input.checked = modelValue.includes(availableData[rowIndex].path)
|
41
|
-
})
|
42
58
|
}
|
43
59
|
|
44
60
|
cellTemplate(createElement, props) {
|
@@ -22,6 +22,7 @@ class DataSelectorViewModel:
|
|
22
22
|
self.directories_bind = binding.new_bind()
|
23
23
|
self.datafiles_bind = binding.new_bind()
|
24
24
|
self.reset_bind = binding.new_bind()
|
25
|
+
self.reset_grid_bind = binding.new_bind()
|
25
26
|
|
26
27
|
def expand_directory(self, paths: List[str]) -> None:
|
27
28
|
if paths[-1] in self.expanded:
|
@@ -76,3 +77,4 @@ class DataSelectorViewModel:
|
|
76
77
|
{"path": datafile, "title": os.path.basename(datafile)} for datafile in self.model.get_datafiles()
|
77
78
|
]
|
78
79
|
self.datafiles_bind.update_in_view(self.datafiles)
|
80
|
+
self.reset_grid_bind.update_in_view(None)
|
@@ -22,6 +22,8 @@ class NeutronDataSelectorViewModel(DataSelectorViewModel):
|
|
22
22
|
self.model.set_subdirectory("")
|
23
23
|
self.directories = self.model.get_directories()
|
24
24
|
self.expanded = {}
|
25
|
+
|
26
|
+
self.update_view()
|
25
27
|
self.reset_bind.update_in_view(None)
|
26
28
|
|
27
29
|
def on_state_updated(self, results: Dict[str, Any]) -> None:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: nova-trame
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.25.2
|
4
4
|
Summary: A Python Package for injecting curated themes and custom components into Trame applications
|
5
5
|
License: MIT
|
6
6
|
Keywords: NDIP,Python,Trame,Vuetify
|
@@ -17,6 +17,7 @@ Requires-Dist: altair
|
|
17
17
|
Requires-Dist: blinker (>=1.9.0,<2.0.0)
|
18
18
|
Requires-Dist: libsass
|
19
19
|
Requires-Dist: mergedeep
|
20
|
+
Requires-Dist: mpld3 (>=0.5.11,<0.6.0)
|
20
21
|
Requires-Dist: natsort (>=8.4.0,<9.0.0)
|
21
22
|
Requires-Dist: nova-common (>=0.2.2)
|
22
23
|
Requires-Dist: nova-mvvm
|
@@ -1,45 +1,45 @@
|
|
1
1
|
nova/__init__.py,sha256=ED6jHcYiuYpr_0vjGz0zx2lrrmJT9sDJCzIljoDfmlM,65
|
2
2
|
nova/trame/__init__.py,sha256=gFrAg1qva5PIqR5TjvPzAxLx103IKipJLqp3XXvrQL8,59
|
3
|
-
nova/trame/_internal/utils.py,sha256=
|
3
|
+
nova/trame/_internal/utils.py,sha256=lTTJnfqbbIe21Tg2buf5MXqKUEUop7Va5PZgpWMzRkI,1381
|
4
4
|
nova/trame/model/data_selector.py,sha256=rDmWDtHVGgi5e2fBEYvChM2vVKNu798m67Sq8MUN2UI,4463
|
5
5
|
nova/trame/model/ornl/neutron_data_selector.py,sha256=Eu-CnX4Gr_T-Kz_l3SsMhyGf61hlHhRCYpcn7em7TCk,6168
|
6
6
|
nova/trame/model/remote_file_input.py,sha256=9KAf31ZHzpsh_aXUrNcF81Q5jvUZDWCzW1QATKls-Jk,3675
|
7
7
|
nova/trame/view/components/__init__.py,sha256=60BeS69aOrFnkptjuD17rfPE1f4Z35iBH56TRmW5MW8,451
|
8
|
-
nova/trame/view/components/data_selector.py,sha256
|
9
|
-
nova/trame/view/components/execution_buttons.py,sha256=
|
10
|
-
nova/trame/view/components/file_upload.py,sha256=
|
8
|
+
nova/trame/view/components/data_selector.py,sha256=-bTYB--oGIbJSJyi_UYr12lk3x4oh7-FGxxslQ9fxPQ,14654
|
9
|
+
nova/trame/view/components/execution_buttons.py,sha256=Br6uAmE5bY67TTYc5ZTHECNJ_RJqKmv17HAKPpQtbeg,4576
|
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
|
-
nova/trame/view/components/ornl/neutron_data_selector.py,sha256=
|
14
|
-
nova/trame/view/components/progress_bar.py,sha256=
|
15
|
-
nova/trame/view/components/remote_file_input.py,sha256=
|
16
|
-
nova/trame/view/components/tool_outputs.py,sha256
|
13
|
+
nova/trame/view/components/ornl/neutron_data_selector.py,sha256=g633Ie3GSNu0QFEuexYl_XUxjUiGEJKjWLP7ZB5PRR0,13122
|
14
|
+
nova/trame/view/components/progress_bar.py,sha256=zhbJwPy_HPQ8YL-ISN8sCRUQ7qY6qqo9wiV59BmvL8I,3038
|
15
|
+
nova/trame/view/components/remote_file_input.py,sha256=6mUz6JZVhLO_Y4mZaQd_lpPe33KLtSpjxXS7uTNUmFI,10004
|
16
|
+
nova/trame/view/components/tool_outputs.py,sha256=IbYV4VjrkWAE354Bh5KH76SPsxGLIkOXChijS4-ce_Y,2408
|
17
17
|
nova/trame/view/components/visualization/__init__.py,sha256=reqkkbhD5uSksHHlhVMy1qNUCwSekS5HlXk6wCREYxU,152
|
18
|
-
nova/trame/view/components/visualization/interactive_2d_plot.py,sha256=
|
19
|
-
nova/trame/view/components/visualization/matplotlib_figure.py,sha256=
|
18
|
+
nova/trame/view/components/visualization/interactive_2d_plot.py,sha256=z2s1janxAclpMEdDJk3z-CQ6r3KPNoR_SXPx9ppWnuQ,3481
|
19
|
+
nova/trame/view/components/visualization/matplotlib_figure.py,sha256=q0HLaaLFjM3_V1oUk-VBHWvokFY6AQZzmnMcynTroik,12488
|
20
20
|
nova/trame/view/layouts/__init__.py,sha256=cMrlB5YMUoK8EGB83b34UU0kPTVrH8AxsYvKRtpUNEc,141
|
21
21
|
nova/trame/view/layouts/grid.py,sha256=vqEX-jghs6j9_sVtijdRH7uhlD9loWNi90k2qgg4Dhg,5534
|
22
22
|
nova/trame/view/layouts/hbox.py,sha256=cdwnGk93ec6dXAeEamRQx1WTj5T7Ygsmsy0xz130tWM,3519
|
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
|
30
|
-
nova/trame/view/theme/assets/js/revo_grid.js,sha256=
|
30
|
+
nova/trame/view/theme/assets/js/revo_grid.js,sha256=81s0fUo8HbHmAyWag7pW0jP796Ttb1noAPOgTJlxJss,4069
|
31
31
|
nova/trame/view/theme/assets/vuetify_config.json,sha256=a0FSgpLYWGFlRGSMhMq61MyDFBEBwvz55G4qjkM08cs,5627
|
32
32
|
nova/trame/view/theme/exit_button.py,sha256=Kqv1GVJZGrSsj6_JFjGU3vm3iNuMolLC2T1x2IsdmV0,3094
|
33
33
|
nova/trame/view/theme/theme.py,sha256=8JqSrEbhxK1SccXE1_jUdel9Wtc2QNObVEwtbVWG_QY,13146
|
34
34
|
nova/trame/view/utilities/local_storage.py,sha256=vD8f2VZIpxhIKjZwEaD7siiPCTZO4cw9AfhwdawwYLY,3218
|
35
|
-
nova/trame/view_model/data_selector.py,sha256=
|
35
|
+
nova/trame/view_model/data_selector.py,sha256=d8qdn6Q2b5fNo5lCXi1LTRdesfmy7wErIvGBa0UjOt8,3075
|
36
36
|
nova/trame/view_model/execution_buttons.py,sha256=MfKSp95D92EqpD48C15cBo6dLO0Yld4FeRZMJNxJf7Y,3551
|
37
|
-
nova/trame/view_model/ornl/neutron_data_selector.py,sha256=
|
37
|
+
nova/trame/view_model/ornl/neutron_data_selector.py,sha256=zpwvqETPuw0sEUvv0A2sU5Ha2_BKG_3xFYSaUuixLXw,1579
|
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.2.dist-info/LICENSE,sha256=Iu5QiDbwNbREg75iYaxIJ_V-zppuv4QFuBhAW-qiAlM,1061
|
42
|
+
nova_trame-0.25.2.dist-info/METADATA,sha256=8N20sxd5ibPTenDcHNWUIpBTTsO3YKObHHwiK9nHLtM,1727
|
43
|
+
nova_trame-0.25.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
44
|
+
nova_trame-0.25.2.dist-info/entry_points.txt,sha256=J2AmeSwiTYZ4ZqHHp9HO6v4MaYQTTBPbNh6WtoqOT58,42
|
45
|
+
nova_trame-0.25.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|