Loading poetry.lock +17 −1 Original line number Diff line number Diff line Loading @@ -1558,6 +1558,22 @@ pyspark = ["pyspark (>=3.5.0)"] pyspark-connect = ["pyspark[connect] (>=3.5.0)"] sqlframe = ["sqlframe (>=3.22.0)"] [[package]] name = "natsort" version = "8.4.0" description = "Simple yet flexible natural sorting in Python." optional = false python-versions = ">=3.7" groups = ["main"] files = [ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] [package.extras] fast = ["fastnumbers (>=2.0.0)"] icu = ["PyICU (>=1.0.0)"] [[package]] name = "nodeenv" version = "1.9.1" Loading Loading @@ -3382,4 +3398,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" content-hash = "928d2f9b4435bebdc59a8b590ec2afb95379253c8b28d9ba5f5bad75b4fb0f3d" content-hash = "91e8e1d24d36005c14cd33cb029fdb422626ec28ab50005ff22ca07f642ae839" pyproject.toml +2 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Changelog = "https://code.ornl.gov/ndip/public-packages/nova-trame/blob/main/CHA [tool.poetry] name = "nova-trame" version = "0.20.1" version = "0.20.2" description = "A Python Package for injecting curated themes and custom components into Trame applications" authors = ["Duggan, John <dugganjw@ornl.gov>"] readme = "README.md" Loading @@ -30,6 +30,7 @@ nova-mvvm = "*" pydantic = "*" nova-common = ">=0.2.0" blinker = "^1.9.0" natsort = "^8.4.0" [build-system] requires = ["poetry-core"] Loading src/nova/trame/model/data_selector.py +7 −6 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from pathlib import Path from typing import Any, List, Optional from warnings import warn from natsort import natsorted from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self Loading Loading @@ -116,13 +117,13 @@ class DataSelectorModel: self.state.show_user_directories = show_user_directories def get_facilities(self) -> List[str]: return sorted(self.state.get_facilities()) return natsorted(self.state.get_facilities()) def get_instrument_dir(self) -> str: return INSTRUMENTS.get(self.state.facility, {}).get(self.state.instrument, "") def get_instruments(self) -> List[str]: return sorted(self.state.get_instruments()) return natsorted(self.state.get_instruments()) def get_experiments(self) -> List[str]: experiments = [] Loading @@ -135,11 +136,11 @@ class DataSelectorModel: except OSError: pass return sorted(experiments) return natsorted(experiments) def sort_directories(self, directories: List[Any]) -> List[Any]: # Sort the current level of dictionaries sorted_dirs = sorted(directories, key=lambda x: x["title"]) sorted_dirs = natsorted(directories, key=lambda x: x["title"]) # Process each sorted item to sort their children for item in sorted_dirs: Loading @@ -158,7 +159,7 @@ class DataSelectorModel: if not self.state.user_directory: return None return Path("/SNS/users") / self.state.user_directory return Path("/SNS/users") / self.state.user_directory / "nova" def get_directories(self) -> List[str]: if self.state.facility == "User Directory": Loading Loading @@ -224,7 +225,7 @@ class DataSelectorModel: except OSError: pass return sorted(datafiles) return natsorted(datafiles) def set_directory(self, directory_path: str) -> None: self.state.directory = directory_path Loading src/nova/trame/view/components/data_selector.py +18 −10 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ from typing import Any, List, Optional, cast from warnings import warn from trame.app import get_server from trame.widgets import client, html from trame.widgets import client, datagrid, html from trame.widgets import vuetify3 as vuetify from nova.mvvm.trame_binding import TrameBinding Loading @@ -17,7 +17,7 @@ from .input_field import InputField vuetify.enable_lab() class DataSelector(vuetify.VDataTableVirtual): class DataSelector(datagrid.VGrid): """Allows the user to select datafiles from an IPTS experiment.""" def __init__( Loading Loading @@ -137,18 +137,26 @@ class DataSelector(vuetify.VDataTableVirtual): super().__init__( v_model=self._v_model, classes="h-100 overflow-y-auto", fixed_header=True, headers=("[{ align: 'left', key: 'title', title: 'Available Datafiles' }]",), item_title="title", item_value="path", select_strategy=self._select_strategy, show_select=True, can_focus=False, columns=( "[{" " cellTemplate: (createElement, props) => window.rvCellTemplate(createElement, props)," " columnTemplate: (createElement, props) => window.rvColumnTemplate(createElement, props)," f" datafiles_key: '{self._datafiles_name}'," f" model_key: '{self._v_model}'," " name: 'Available Datafiles'," " prop: 'title'" "}]", ), hide_attribution=True, readonly=True, stretch=True, source=(self._datafiles_name,), theme="compact", **kwargs, ) if self._label: self.label = self._label self.items = (self._datafiles_name,) if "update_modelValue" not in kwargs: self.update_modelValue = self._flush_state Loading src/nova/trame/view/theme/assets/core_style.scss +23 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,29 @@ html { display: none !important; } .nova-data-selector revo-grid { font-size: 0.75rem !important; overflow-x: hidden; .header-content, .rgCell label { align-items: center; display: flex; input { cursor: pointer; margin-right: 0.25em; } } .header-content { height: 40px; } .inner-content-table { width: 100% !important; } } .nova-mpl * { resize: none !important; } Loading Loading
poetry.lock +17 −1 Original line number Diff line number Diff line Loading @@ -1558,6 +1558,22 @@ pyspark = ["pyspark (>=3.5.0)"] pyspark-connect = ["pyspark[connect] (>=3.5.0)"] sqlframe = ["sqlframe (>=3.22.0)"] [[package]] name = "natsort" version = "8.4.0" description = "Simple yet flexible natural sorting in Python." optional = false python-versions = ">=3.7" groups = ["main"] files = [ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] [package.extras] fast = ["fastnumbers (>=2.0.0)"] icu = ["PyICU (>=1.0.0)"] [[package]] name = "nodeenv" version = "1.9.1" Loading Loading @@ -3382,4 +3398,4 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" content-hash = "928d2f9b4435bebdc59a8b590ec2afb95379253c8b28d9ba5f5bad75b4fb0f3d" content-hash = "91e8e1d24d36005c14cd33cb029fdb422626ec28ab50005ff22ca07f642ae839"
pyproject.toml +2 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Changelog = "https://code.ornl.gov/ndip/public-packages/nova-trame/blob/main/CHA [tool.poetry] name = "nova-trame" version = "0.20.1" version = "0.20.2" description = "A Python Package for injecting curated themes and custom components into Trame applications" authors = ["Duggan, John <dugganjw@ornl.gov>"] readme = "README.md" Loading @@ -30,6 +30,7 @@ nova-mvvm = "*" pydantic = "*" nova-common = ">=0.2.0" blinker = "^1.9.0" natsort = "^8.4.0" [build-system] requires = ["poetry-core"] Loading
src/nova/trame/model/data_selector.py +7 −6 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from pathlib import Path from typing import Any, List, Optional from warnings import warn from natsort import natsorted from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self Loading Loading @@ -116,13 +117,13 @@ class DataSelectorModel: self.state.show_user_directories = show_user_directories def get_facilities(self) -> List[str]: return sorted(self.state.get_facilities()) return natsorted(self.state.get_facilities()) def get_instrument_dir(self) -> str: return INSTRUMENTS.get(self.state.facility, {}).get(self.state.instrument, "") def get_instruments(self) -> List[str]: return sorted(self.state.get_instruments()) return natsorted(self.state.get_instruments()) def get_experiments(self) -> List[str]: experiments = [] Loading @@ -135,11 +136,11 @@ class DataSelectorModel: except OSError: pass return sorted(experiments) return natsorted(experiments) def sort_directories(self, directories: List[Any]) -> List[Any]: # Sort the current level of dictionaries sorted_dirs = sorted(directories, key=lambda x: x["title"]) sorted_dirs = natsorted(directories, key=lambda x: x["title"]) # Process each sorted item to sort their children for item in sorted_dirs: Loading @@ -158,7 +159,7 @@ class DataSelectorModel: if not self.state.user_directory: return None return Path("/SNS/users") / self.state.user_directory return Path("/SNS/users") / self.state.user_directory / "nova" def get_directories(self) -> List[str]: if self.state.facility == "User Directory": Loading Loading @@ -224,7 +225,7 @@ class DataSelectorModel: except OSError: pass return sorted(datafiles) return natsorted(datafiles) def set_directory(self, directory_path: str) -> None: self.state.directory = directory_path Loading
src/nova/trame/view/components/data_selector.py +18 −10 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ from typing import Any, List, Optional, cast from warnings import warn from trame.app import get_server from trame.widgets import client, html from trame.widgets import client, datagrid, html from trame.widgets import vuetify3 as vuetify from nova.mvvm.trame_binding import TrameBinding Loading @@ -17,7 +17,7 @@ from .input_field import InputField vuetify.enable_lab() class DataSelector(vuetify.VDataTableVirtual): class DataSelector(datagrid.VGrid): """Allows the user to select datafiles from an IPTS experiment.""" def __init__( Loading Loading @@ -137,18 +137,26 @@ class DataSelector(vuetify.VDataTableVirtual): super().__init__( v_model=self._v_model, classes="h-100 overflow-y-auto", fixed_header=True, headers=("[{ align: 'left', key: 'title', title: 'Available Datafiles' }]",), item_title="title", item_value="path", select_strategy=self._select_strategy, show_select=True, can_focus=False, columns=( "[{" " cellTemplate: (createElement, props) => window.rvCellTemplate(createElement, props)," " columnTemplate: (createElement, props) => window.rvColumnTemplate(createElement, props)," f" datafiles_key: '{self._datafiles_name}'," f" model_key: '{self._v_model}'," " name: 'Available Datafiles'," " prop: 'title'" "}]", ), hide_attribution=True, readonly=True, stretch=True, source=(self._datafiles_name,), theme="compact", **kwargs, ) if self._label: self.label = self._label self.items = (self._datafiles_name,) if "update_modelValue" not in kwargs: self.update_modelValue = self._flush_state Loading
src/nova/trame/view/theme/assets/core_style.scss +23 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,29 @@ html { display: none !important; } .nova-data-selector revo-grid { font-size: 0.75rem !important; overflow-x: hidden; .header-content, .rgCell label { align-items: center; display: flex; input { cursor: pointer; margin-right: 0.25em; } } .header-content { height: 40px; } .inner-content-table { width: 100% !important; } } .nova-mpl * { resize: none !important; } Loading