Skip to content

[#436] Integrate history endpoints - #492

Merged
kjlippold merged 123 commits into
release/v1.12.0from
436-integrate-history-endpoints
Oct 6, 2026
Merged

kjlippold merged 123 commits into
release/v1.12.0from
436-integrate-history-endpoints

Conversation

@Maurier

@Maurier Maurier commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Integrates QC history and session management end to end.

  • Edit QC data in sessions saved to the API, with drafts, commits and deletes
  • Edit history panel with step notes, attribution, snapshots and reload to any step
  • New sessions start where the last commit ended
  • Managed datastream working copy, plotted next to its source
  • Ask before leaving an edit session with unsaved changes
  • Time range control on the plot toolbar, with presets anchored to the data
  • Choose the time zone dates are shown in (UTC, fixed offset or IANA)
  • Month and year shifts follow the saved time zone calendar
  • API: replace observations over a time range, and read a range checksum
  • Client: methods for the new observation endpoints
  • QC app installs qc-utils from the repo instead of npm
  • Docs and tests updated

daniel-slaugh and others added 14 commits March 24, 2026 13:44
Mount app immediately then async load API data
Start editing opens a chooser of the source's managed datastreams and their
sessions: continue an in-progress session, start a new one over the selected
time range, or create and delete managed datastreams. Managed datastreams are
hidden from the catalog and reached through the chooser. Also adds inline
processing-level creation, the session description captured at commit time,
reuse of the source's loaded series as the working copy, clamping the session
window to the source extent, and session resume that replays saved operations.
@Maurier
Maurier marked this pull request as draft August 3, 2026 22:29
Maurier and others added 15 commits August 5, 2026 15:50
Plot a QC session's state at any operation as a separate, frozen line so
it can be compared against the session being edited. Buttons sit on every
operation row and on the "Data loaded" row, which plots the state the
session started from.

Snapshots ride in plottedDatastreams under the synthetic id
snap:<sessionId>:<opIndex>, so legend rendering, colour assignment,
visibility and reorder work unchanged. isSnapshotId guards the paths that
would otherwise treat one as real: refreshGraphSeriesArray skips its
fetch, releaseManagedDatastream drops them when the editor closes, and
the share encoder keeps them out of ds in favour of its own snap key.

The base is always the session chain's own window, never the plot's time
range, because operations replay against array indices. Snapshots build
on a detached ObservationRecord since the observation store hands back
one shared instance per datastream and the replay mutates what it is
given.

Also fixes two pre-existing problems in the history panel that this work
surfaced:

- Reloading from a step restored the pre-replay entries wholesale, which
  put the old timings back over the ones the replay had just measured.
  Only the "Data loaded" row updated. The panel now keeps the replayed
  entries and appends only what the replay dropped.
- hasUnsavedChanges compared entries by identity, so a replay while
  viewing a committed session read as pending edits and prompted "You
  have unsaved edits". A committed session cannot be edited, so both it
  and unsavedEditCount now short-circuit on isReadOnly.
Covers the feature in the user guide, the id convention, guards and
detached-fetcher rule in the architecture doc, the axis behaviour in the
plotting doc, and the two new store actions in the API reference.
The Data loaded row is step -1, so a session's starting state is now
reachable the same way any operation is, and it carries the "Showing"
chip when it is the step on screen.

Its reload-from-server button moves to a cloud icon so the row no longer
shows two identical glyphs doing different things: one replays the
history to a step, the other refetches and drops the history.
Save, Commit and Close now sit in a footer below the history and stay
visible while it is collapsed. Also drops the author name from collapsed
rows, puts the comment icon beside the operation title, and retitles
reload-from-server to discard and reload, hidden on committed sessions.
…-endpoints

# Conflicts:
#	django/contracts/openapi/auth.openapi.json
#	django/contracts/openapi/data.openapi.json
#	django/hydroserver/__init__.py
#	packages/hydroserverpy/setup.cfg
Undo, redo, step reload, and removing an entry all rebuild each item from
its method and args, which dropped the operator's comment and the server's
attribution. Re-stamp both afterwards, paired positionally and only when
the method still matches. Execution timings are left to be re-measured.
Deleting removes descendants first so each delete meets the server's
no-dependents rule. The confirmation names every session going and asks
for an acknowledgement when the cascade reaches past the one picked.

Also in the editor: session actions sit in a container in the edit history
footer, with Discard and a New session action after a commit; history
steps replay by clicking the row instead of a button; steps after the one
shown are dimmed; and the chooser lists sessions as a timeline.
Maurier and others added 25 commits October 1, 2026 11:13
…tle in edit selection spec

This commit should resolve the broken e2e tests for the QC app
@Maurier

Maurier commented Oct 6, 2026

Copy link
Copy Markdown
Contributor Author

@daniel-slaugh - This should be ready for another round. I tested some more yesterday and fixed some regressions:

  • Fit Y to visible fits the points on screen instead of the whole series
  • Repeated fits keep the point on the edge of the view
  • No more freezes when panning, zooming or fitting large series (tested with 400k points)
  • Points are plotted at the right time in any browser time zone, and the visible points count matches what's drawn
  • Reloading the page reopens the editor in the same tab and zoom, with a loading state while the session opens
  • Leaving the editor for another page no longer gets cancelled by the editor's own URL updates
  • Client contract includes the 400 response for deleting a session
  • Tests for the above, and branch coverage is back above 80%

@daniel-slaugh daniel-slaugh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All looks good! I ran through the blockers I flagged in the Review Doc and all are either resolved or in a stable position ready for a followup PR in a post v1.12 release.

@kjlippold
kjlippold merged commit be24c5e into release/v1.12.0 Oct 6, 2026
22 checks passed
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.

3 participants