Skip to content

UI node list, hover editors, pinning, tree interactions - #1122

Merged
erasta merged 24 commits into
masterfrom
ui-cmd-type
Oct 4, 2026
Merged

erasta merged 24 commits into
masterfrom
ui-cmd-type

Conversation

@erasta

@erasta erasta commented Oct 4, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

erasta added 24 commits October 4, 2026 09:30
  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
erasta merged commit 86541ed into master Oct 4, 2026
4 checks passed
@erasta
erasta deleted the ui-cmd-type branch October 4, 2026 17:47
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant