Repository navigation
UI node list, hover editors, pinning, tree interactions - #1122
Merged
Merged
Conversation
Print the node type and Hermes message when /node-params/validate rejects a node, so the red text in the UI also appears in the server output.
Closing a document's details tab now closes its canvas tab. The open effect was keyed on the document object, which is rebuilt on every read, so a closed canvas came straight back. Key it on the docid and remember closed canvases.
Closing a details tab moves the url to the tab that is left, or to the project root. The tree highlight follows the url. New projectPath helper builds the path.
Move the tab id, node, document and panel of each kind into its own class under layout/tabs. LayoutModel drops its prefixes and node builders, LayoutPanel drops its switch, ProjectLayout drops its string checks.
Covers issue #1119 : with two canvases open, an auto reload must not pull the view back to the active document's canvas.
Add the dark mode switch to the header, keeping it in settings too. Move auto-reload into settings. Put the add project button next to the project list. Move build info, the user name and the CORS tag to the bottom of settings. Name the project list after the server user. Make the tab island maximize button easier to see in both themes.
Fix issue #1120. Dataflow lines were keyed by a parameter name and only top-level string values were scanned, so a reference inside a dict or a list got no line. Key them by a parameter path instead. Add paramPath.ts to read and write values at a path, scan every string in input_parameters, and put a target handle on every leaf row. Right-click and the inline reference menu now work on nested rows too. Add a template that reproduces the bug, and tests.
A canvas of many nodes was unreadable. A node is now a small card: its name, its type, and one row per parameter with its source dot and no value. Hovering lays the full editor over that card. The editor is absolutely positioned, so opening it leaves the node's measured size alone and the nodes below it stay put. A dataflow line to or from a collapsed node lands on the node's edge, so no line disappears. Also cut the test workers from 4 to 2, to keep the machine usable while the suite runs.
The gaps were sized for the old tall nodes. Shrink them to the summary card: columns 420 apart, 40 between nodes, and an estimate of 52 plus 22 per parameter. Add WorkflowLayout.compact, which sits each node one gap under the one above using the measured heights, and use it for the measured pass. fixOverlaps only pushed down, so a column never closed up again after a node shrank. Drop countRows with the old estimate.
Add a pin button that keeps a node's editor open after the pointer leaves. Several nodes can be open at once. The node now takes one actionButtons slot for its top-right icons instead of placing the delete X itself. The canvas builds them and tracks which nodes are expanded.
A node's editor is laid over the canvas, so the node needs to be on top; without it the nodes drawn later covered the editor. Give an open node a z-index of 999, just under the dataflow lines, so the lines still reach the rows they end on.
A pinned node now holds its editor in its own box instead of laying it over the canvas, and drops its summary card. A hovered node still floats, so a passing pointer moves nothing. WorkflowLayout.compact also places the columns now: each starts one gap right of the widest node in the column before it, using the measured widths. So a pinned node pushes the columns and the nodes around it aside, and lets them back when unpinned.
A node pinned open and the hovered one shared a z-index, so hovering did not always bring the editor to the front. Open nodes now sit at 998 and the hovered one at 999, both still under the dataflow lines. Mark the hovered node with a thin cyan outline, drawn on the floating editor when there is one and on the node card otherwise.
A new top-left panel shows every node of the workflow. It is one icon until opened. Clicking a row centres the canvas on that node and opens it, through the same focus store the output tab uses.
The node list gets a search box that filters it by name. The cursor goes there as soon as the list opens.
Every row of the canvas node list carries the node's pin and close icons, the same ones the node itself shows. The icons sit in a flex row so they line up.
Parse the part after the node name as section plus key, picking the
known section by prefix. The key may now be a JSONPath, so
{A.output.items[0].name} makes a line like a plain output does.
Lines for sub-fields leave from the output's own dot. The inline menu
still offers top-level names only, and closes once a path is typed -
the output shape is not known anywhere.
Single click selects, double click opens. A branch click takes all the documents under it. A click on the background clears the selection. Right click on a document or branch gives a menu with duplicate and delete; the delete question names the document. In the repositories tree, right click or double click offers to load the repository into the project. Both menus have a cancel row. Split the panel: DocumentTreeWhole holds the documents tree and its menu, RepoTreeWhole holds the repositories tree and its menu, and ProjectTreeView keeps the search, the selection and the URL. The delete and repository-load python moved into src/io.
The tree now opens a document on double click, not single click.
erasta
added a commit
that referenced
this pull request
Oct 19, 2026
A repo row's double click loaded it into the project, so no row ever reached the details panel and DetailsViewRepo never showed. Lost in #1122, when single click stopped opening. Now a double click opens the row, like the document tree. Loading into the project stays on the right click menu.
erasta
added a commit
that referenced
this pull request
Oct 19, 2026
* requirements-minimal.txt * requirements-minimal.txt must track requirements.txt pins * UI: plan the document entrypoints #1129 * UI: document entrypoints replace the exec calls #1129 Three named routes, /document/create, /document/update and /document/delete, with the python in ui/server/document_api/. Each answers the whole project, so the write-then-reload pairs become one call. No per-document read: /project/documents already brings them all, so PreviewPanel reads the store. Duplicate builds each copy from the store too, and the free-name rule moves to TypeScript. Gone: buildAddDocumentCode, buildNotebookCommand, fetchDocument and stringifyToPython. Eight exec call sites left, all repos. * UI: plan the repository entrypoints #1129 * UI: double click opens a repository again A repo row's double click loaded it into the project, so no row ever reached the details panel and DetailsViewRepo never showed. Lost in #1122, when single click stopped opening. Now a double click opens the row, like the document tree. Loading into the project stays on the right click menu. * UI: repository entrypoints replace the last exec calls #1129 Four routes under /repository/*, python in ui/server/repository_api/. Paths cross the wire, not repository names. A load answers added and problems, so one that added nothing says why. matplotlib, rasterio and Unum join requirements-minimal.txt: without them no toolkit in a repository can be built. * build the minimal requirements from requirements.txt requirements-minimal.txt holds names only, minimal_requirements.py takes the pins, the dockerfile pipes them into pip. Plus the plan for the next three tasks. * plan the API package as classes * UI: one api package, a class per route group All server calls move to src/api/, on an ApiCall base class that does the fetching. Toasts come in through a reporter, so src/api/ imports no React, no store and no snackbar. entrypoint.ts and the pure fetchers are gone. src/io/ keeps the components, the snackbar and the store-writing wrappers. * one requirements list, not three requirements-server.txt and requirements-integ.txt are gone. requirements-minimal.txt had all their names but pytest. The two CI jobs that installed them build the minimal set with the script instead. * add npm run test:server Runs the ui/server pytest suite in the hera-server image, with the repo mounted. * reuild ui
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.