From cf9dea657a691a22bd504bf4603ce56b874b0aca Mon Sep 17 00:00:00 2001 From: sharpener6 <1sc2l4qi@duck.com> Date: Wed, 15 Oct 2025 12:23:40 -0400 Subject: [PATCH] webui fixes: * preserve zoom level across task stream updates; * ignore value in capabilities This PR and previous PR is done by cloakedclock --- scaler/ui/task_graph.py | 20 +++++++++++++++++--- scaler/ui/utility.py | 5 ++--- scaler/version.txt | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/scaler/ui/task_graph.py b/scaler/ui/task_graph.py index a54b48a56..f63ca78ff 100644 --- a/scaler/ui/task_graph.py +++ b/scaler/ui/task_graph.py @@ -69,6 +69,7 @@ def __init__(self): self._start_time = datetime.datetime.now() - datetime.timedelta(minutes=30) self._last_task_tick = datetime.datetime.now() + self._user_axis_range: Optional[List[int]] = None self._current_tasks: Dict[str, Dict[bytes, datetime.datetime]] = {} self._completed_data_cache: Dict[str, Dict] = {} @@ -212,8 +213,17 @@ def setup_task_stream(self, settings: Settings): self._figure = fig self._completed_data_cache = {} self._plot = ui.plotly(self._figure).classes("w-full h-full") + self._plot.on("plotly_relayout", self._on_plotly_relayout) self._settings = settings + def _on_plotly_relayout(self, e): + x0 = e.args.get("xaxis.range[0]") + x1 = e.args.get("xaxis.range[1]") + if x0 is not None and x1 is not None: + self._user_axis_range = [x0, x1] + else: + self._user_axis_range = None + def __setup_row_cache(self, row_label: str): if row_label in self._completed_data_cache: return @@ -430,9 +440,9 @@ def __handle_task_result(self, state: StateTask, now: datetime.datetime): task_state = state.state task_time = format_timediff(start, now) + row_label = self.__add_task_to_chart(worker, state.task_id, task_state, task_time) with self._data_update_lock: self.__remove_task_from_worker(worker=worker, task_id=state.task_id, now=now, force_new_time=False) - row_label = self.__add_task_to_chart(worker, state.task_id, task_state, task_time) self._row_last_used[row_label] = now self._task_id_to_printable_capabilities.pop(state.task_id, None) @@ -455,6 +465,7 @@ def __handle_new_worker(self, worker: str, now: datetime.datetime): def __remove_task_from_worker(self, worker: str, task_id: bytes, now: datetime.datetime, force_new_time: bool): # Remove a single task from the worker's current task mapping. + self._task_row_assignment.pop(task_id, None) task_map = self._current_tasks.get(worker) if not task_map: return @@ -558,7 +569,7 @@ def __remove_worker_from_history(self, worker: str): for row_label in self._worker_rows.pop(worker, []): if row_label in self._completed_data_cache: self._completed_data_cache.pop(row_label) - self._seen_workers.remove(worker) + self._seen_workers.remove(worker) def __remove_old_tasks_from_history(self, store_duration: datetime.timedelta): for row_label in self._completed_data_cache.keys(): @@ -690,7 +701,10 @@ def __render_plot(self, now: datetime.datetime): ticks = make_ticks(lower_bound, upper_bound) tick_text = make_tick_text(int(self._settings.stream_window.total_seconds())) - self._figure["layout"]["xaxis"]["range"] = [lower_bound, upper_bound] + if self._user_axis_range: + self._figure["layout"]["xaxis"]["range"] = self._user_axis_range + else: + self._figure["layout"]["xaxis"]["range"] = [lower_bound, upper_bound] self._figure["layout"]["xaxis"]["tickvals"] = ticks self._figure["layout"]["xaxis"]["ticktext"] = tick_text self._plot.update() diff --git a/scaler/ui/utility.py b/scaler/ui/utility.py index a7bf6a631..bc9c09fa0 100644 --- a/scaler/ui/utility.py +++ b/scaler/ui/utility.py @@ -47,6 +47,5 @@ def display_capabilities(capabilities: Dict[str, int]) -> str: if not capabilities or len(capabilities) == 0: return "" - # Ensure equivalent capabilities produce the same string - sorted_items = sorted(capabilities.items(), key=lambda item: (item[0], item[1])) - return " & ".join([f"{key}: {value}" for key, value in sorted_items]) + # Capabilities is just the keys, value is ignored. + return " & ".join(sorted(capabilities.keys())) diff --git a/scaler/version.txt b/scaler/version.txt index d49ade8e7..0c86ae8ce 100644 --- a/scaler/version.txt +++ b/scaler/version.txt @@ -1 +1 @@ -1.12.14 +1.12.15