Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
54002f5
Resolves hydroserver2/hydroserver#371
daniel-slaugh Mar 24, 2026
73679ae
Mount app immediately then async load API data
daniel-slaugh Mar 25, 2026
eca7682
Merge pull request #383 from hydroserver2/375-async-load
daniel-slaugh Mar 25, 2026
6aaeb02
Merge pull request #382 from hydroserver2/371-site-edit-cancel
daniel-slaugh Mar 25, 2026
2241333
Merge branch 'main' into develop
Apr 30, 2026
a848a1a
feat: add QC session editing and history integration
Maurier Jun 22, 2026
cb16a23
fix: return values from router guards instead of next()
Maurier Jun 22, 2026
f2ef3ea
feat: show the data-point toggle in the select view
Maurier Jun 23, 2026
871b1c5
feat: rework QC editing around a managed-datastream chooser
Maurier Jun 23, 2026
fe28efd
feat: base new sessions on the latest committed state and track unsav…
Maurier Aug 3, 2026
a9030e2
fix: create managed datastreams with expand_related so the catalog ke…
Maurier Aug 3, 2026
3df35db
chore: update package lock
Maurier Aug 3, 2026
e7a7116
Merge remote-tracking branch 'origin/main' into 436-integrate-history…
Maurier Aug 3, 2026
f2f8e0f
feat: add session history navigation with per-operation notes and att…
Maurier Aug 3, 2026
3fc52bb
feat: add history snapshot comparison
Maurier Aug 5, 2026
c27a9bf
style: give session rows a container treatment
Maurier Aug 5, 2026
2931eed
docs: document history snapshot comparison
Maurier Aug 5, 2026
72a8028
feat: reload to a session's baseline from the Data loaded row
Maurier Aug 5, 2026
ef326fc
Merge branch 'main' into release/v1.12.0
Aug 12, 2026
4507dc6
Merge branch 'release/v1.12.0' for test deployment.
Aug 12, 2026
f96cdb8
Update version
Aug 13, 2026
f8d3620
Merge branch 'main' into release/v1.12.0
Aug 17, 2026
8440afe
Allow deletion of committed QC sessions with no dependant sessions
Aug 17, 2026
d4a69ca
feat: move session actions into the edit history panel
Maurier Aug 17, 2026
4608188
Merge remote-tracking branch 'origin/436-integrate-history-endpoints'…
Maurier Aug 17, 2026
cbf7787
Merge remote-tracking branch 'origin/main' into 436-integrate-history…
Maurier Aug 17, 2026
426150d
test: scope the unsaved-edits discard selector to the dialog
Maurier Aug 17, 2026
cee0974
Merge remote-tracking branch 'origin/release/v1.12.0' into 436-integr…
Maurier Aug 19, 2026
f46732f
fix: keep comment and attribution when replaying history
Maurier Aug 19, 2026
20d13c6
test: assert session reads send expand_related
Maurier Aug 19, 2026
29a4d2d
feat: delete a session together with the sessions built on it
Maurier Aug 19, 2026
caccfb4
chore: remove planning docs folder
Maurier Aug 31, 2026
20f260a
fix: date picker dialog collapsing to a thin strip
Maurier Sep 1, 2026
ecd6116
style: remove redundant comment on date picker dialog width
Maurier Sep 1, 2026
934084d
Update version
Sep 1, 2026
e6a1533
Update version
Sep 1, 2026
7d21527
Add 1w preset option for plots & make default
daniel-slaugh Sep 9, 2026
e913f6e
Update version
Sep 9, 2026
a8e6c00
feat: choose which QC datastreams to plot from a source row
Maurier Sep 14, 2026
8502b55
refactor: add time range preset resolver
Maurier Sep 14, 2026
a136457
fix: anchor time range presets to the plotted data
Maurier Sep 14, 2026
1475d35
fix: refresh the managed datastream after a commit
Maurier Sep 14, 2026
0ca1329
fix: keep a commit successful when the datastream refresh fails
Maurier Sep 14, 2026
19a112c
fix: keep the time range preset when a date field is left unchanged
Maurier Sep 14, 2026
0e56c95
feat: continue with the current workspace from the picker
Maurier Sep 14, 2026
4965803
test: cover plotting old data with the default preset
Maurier Sep 14, 2026
22d81cf
Merge remote-tracking branch 'origin/develop' into 436-integrate-hist…
Maurier Sep 14, 2026
fc9aa60
fix: freeze the time range while editing and restore only real presets
Maurier Sep 14, 2026
2a1ebc0
fix: stop nesting history row controls inside a button
Maurier Sep 14, 2026
f04141c
test: cover QC session save and commit in the submit spec
Maurier Sep 14, 2026
d7ce519
fix: edit a copy of the base data instead of the cached record
Maurier Sep 14, 2026
6d738ee
feat: add a working copy store for managed datastreams
Maurier Sep 14, 2026
c145dfb
fix: replay committed sessions onto a copy and keep the resume test g…
Maurier Sep 14, 2026
a65996f
test: drain undo timer and auto-unmount in EditHistory spec
Maurier Sep 14, 2026
b552f13
fix: guard working copy builds against stale and concurrent loads
Maurier Sep 14, 2026
fcc8c04
test: assert the resume test checks the raw record identity
Maurier Sep 14, 2026
6edbb27
fix: return only the cached working copy from a superseded rebuild
Maurier Sep 14, 2026
6d624d1
test: capture the commit dialog and commit a session in the golden path
Maurier Sep 14, 2026
49b4ec2
fix: resize the editor plot when it is drawn before its container set…
Maurier Sep 14, 2026
edd13e0
fix: save the session draft from the nav rail exit guard
Maurier Sep 14, 2026
745e6eb
feat: plot the session working copy for managed datastreams
Maurier Sep 14, 2026
8c9cf53
refactor: share the session working copy between the plot and the editor
Maurier Sep 14, 2026
e2bec2a
test: cover the managed datastream working copy preview
Maurier Sep 14, 2026
0afd483
fix: keep the editor consistent when resuming loses its working copy
Maurier Sep 14, 2026
47308f7
test: pin raw and working copy rows by name in the preview spec
Maurier Sep 15, 2026
85e8215
fix: never resume over saved drafts without replaying them and clear …
Maurier Sep 15, 2026
c95cbc7
rollup type declarations
daniel-slaugh Sep 15, 2026
4cfa274
Bump version
daniel-slaugh Sep 15, 2026
07f88b0
Merge pull request #534 from hydroserver2/532-ts-client-types
daniel-slaugh Sep 17, 2026
2542fbc
feat: edit datastreams from a row button with the source as context
Maurier Sep 18, 2026
15185eb
feat: anchor editor context presets around the session window
Maurier Sep 18, 2026
6d35837
style: replace em-dashes with plain punctuation
Maurier Sep 18, 2026
de2655f
fix: show the multiplication sign in gap interval labels
Maurier Sep 18, 2026
3dce0ac
fix: serialize plot loads and draw once the plot element exists
Maurier Sep 18, 2026
91cded6
feat: default new sessions to the full source range
Maurier Sep 18, 2026
b47501e
feat: set description, status and method when creating a managed data…
Maurier Sep 18, 2026
653e1eb
feat: keep the edit session open in the Select view
Maurier Sep 18, 2026
0364eea
feat: ask before leaving an edit session
Maurier Sep 18, 2026
b0ebb86
test: warm the dev server before the e2e suite
Maurier Sep 18, 2026
cd12318
fix: ask before creating a datastream and scope share link zoom to it…
Maurier Sep 18, 2026
c38adb6
feat: only allow deleting the newest session and drop the in-progress…
Maurier Sep 18, 2026
6a55c0a
feat: reserve a plot slot for the edit target and label the row Edit …
Maurier Sep 18, 2026
093e474
feat: add presets and one-click fixes to the session window dialog
Maurier Sep 18, 2026
f707ee4
Merge branch 'main' into release/v1.12.0
Sep 21, 2026
69813a3
feat: draw source context around the edit window, preview before edit…
Maurier Sep 21, 2026
0755bc8
Merge remote-tracking branch 'origin/436-integrate-history-endpoints'…
Maurier Sep 22, 2026
9ab68df
feat: move the time range control to the plot toolbar
Maurier Sep 22, 2026
0f2e9a3
fix: show the overview strip only in the Edit view
Maurier Sep 22, 2026
0f8be1b
Merge changes from main
Sep 22, 2026
3acd5ec
DWRi request - Move OAuth login options to the top of form
daniel-slaugh Sep 24, 2026
a720810
Implement Google Analytics opt-in option
daniel-slaugh Sep 24, 2026
9a334c7
Merge pull request #544 from hydroserver2/move-oauth
daniel-slaugh Sep 24, 2026
c1fe650
Merge pull request #545 from hydroserver2/526-google-analytics
daniel-slaugh Sep 24, 2026
b783d21
fix: block edits while a committed session is on screen
Maurier Sep 29, 2026
9a05672
fix: refit the y axis when a series gets new data
Maurier Sep 29, 2026
7e3d5a2
feat: show the local time zone on date and time inputs
Maurier Sep 29, 2026
b75f720
feat: show the period each history step touched
Maurier Sep 29, 2026
244be06
feat: start new sessions where the last commit ended
Maurier Sep 29, 2026
ea63c36
Updated version
Sep 29, 2026
dcdb343
feat: replace observations over an explicit time range
Maurier Oct 1, 2026
40af26a
feat: read the checksum of an observation range
Maurier Oct 1, 2026
b254033
fix: keep step comments through replays and skip missing delete indices
Maurier Oct 1, 2026
a201aae
fix: QC session review fixes
Maurier Oct 1, 2026
d69103f
feat: choose the time zone dates are shown in
Maurier Oct 1, 2026
174b9be
feat: shift months and years on a saved time zone calendar
Maurier Oct 1, 2026
488946b
chore: leave comment-only punctuation edits out of the diff
Maurier Oct 1, 2026
1bddad0
fix: install qc-utils from the repository
Maurier Oct 1, 2026
0443952
test: fix the store mock and slow imports in plotting specs
Maurier Oct 1, 2026
6f22a6c
fix: keep a plotted datastream as committed context once it is edited
Maurier Oct 1, 2026
396b270
Resolve merge conflicts
daniel-slaugh Oct 1, 2026
ff33cfc
Merge branch '436-integrate-history-endpoints' of https://github.com/…
daniel-slaugh Oct 1, 2026
334d2d1
fix: drop the plot reference when a plot unmounts
Maurier Oct 1, 2026
35c8f61
test: enable WebGL in the Firefox e2e browser
Maurier Oct 1, 2026
8665014
Merge remote-tracking branch 'origin/436-integrate-history-endpoints'…
Maurier Oct 1, 2026
cbb9f46
queue plot draws and dispose the plot on unmount; let date fields set…
daniel-slaugh Oct 1, 2026
07a3ce9
For now, skip WebGL check for Firefox on CI
daniel-slaugh Oct 1, 2026
3802896
Fix Data Management App e2e tests
daniel-slaugh Oct 1, 2026
808a23f
Increase branch coverage to 80%
daniel-slaugh Oct 1, 2026
4f2774f
Resolve branch conflict
daniel-slaugh Oct 1, 2026
608e22f
Merge remote-tracking branch 'origin/release/v1.12.0' into 436-integr…
daniel-slaugh Oct 1, 2026
784ab38
fix: only allow deleting in-progress sessions
Maurier Oct 5, 2026
d3639fa
fix: keep observation values in double precision
Maurier Oct 5, 2026
a51e109
fix: hide the local qualifier tool
Maurier Oct 5, 2026
015eafa
fix: drift correction includes the last selected point
Maurier Oct 5, 2026
35cde75
fix: edits no longer treat no-data values as measurements
Maurier Oct 5, 2026
53c3423
fix: install QC packages from their own lockfiles in the release build
Maurier Oct 5, 2026
f372329
fix: drop staged table edits when the data changes
Maurier Oct 5, 2026
0f32337
fix: fit Y to the points on screen
Maurier Oct 5, 2026
b0a409a
fix: reload reopens the editor with its tab and zoom, under a loading…
Maurier Oct 5, 2026
0844803
fix: stop freezes when panning and fitting large series
Maurier Oct 5, 2026
0d4f801
fix: repeated fits no longer drop the point on the edge
Maurier Oct 5, 2026
7049d16
fix: draw points at their time in any browser zone
Maurier Oct 5, 2026
bd9c4d2
test: type the dispatch mock in the staged table edits test
Maurier Oct 6, 2026
b9bfae1
fix: add the delete session 400 response to the client contract
Maurier Oct 6, 2026
a7b206d
fix: the editor URL no longer cancels a page switch
Maurier Oct 6, 2026
5b3890a
test: cover fits, selection sync, preset hydration and overlapping en…
Maurier Oct 6, 2026
be24c5e
Merge pull request #492 from hydroserver2/436-integrate-history-endpo…
kjlippold Oct 6, 2026
76b0aad
Update version
Oct 6, 2026
5fb2b85
Regenerated OpenAPI contracts
Oct 6, 2026
c3ad66a
Merge pull request #556 from hydroserver2/release/v1.12.0
kjlippold Oct 6, 2026
9749f9a
Updated version
Oct 7, 2026
245b7e0
Merge main into release/v2.0.0
Oct 9, 2026
fe90102
Clean up v2 migrations and add data migration docs
Oct 9, 2026
a593dc5
Fixed signup and admin dashboard issues.
Oct 12, 2026
9ec219a
Deploy v1 docs alongside v2 docs
daniel-slaugh Oct 14, 2026
8751efa
Fixed derivation tasks when input datastreams have different start times
Oct 14, 2026
080d158
Merge pull request #569 from hydroserver2/566-derived-data-alignment
kjlippold Oct 15, 2026
d2d287a
Merge branch 'release/v2.0.0' into merge/v1.12-into-v2.0
kjlippold Oct 15, 2026
8a51875
Merge pull request #568 from hydroserver2/deploy-docs-v1
daniel-slaugh Oct 15, 2026
17e8adf
Updated version
Oct 15, 2026
b60e32d
Resolve merge conflicts
Oct 15, 2026
39e04d9
Resolved merge conflicts
Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 2 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ jobs:
working-directory: packages/hydroserver-ts
run: npm run coverage

- name: Build TypeScript client
- name: Verify packed TypeScript client
working-directory: packages/hydroserver-ts
run: npm run build
run: npm run test:package

data-management:
name: Data Management App 80% Coverage
Expand Down Expand Up @@ -162,10 +162,6 @@ jobs:
working-directory: apps/qc-app
run: npm ci --workspaces=false

- name: Install local QC utils package
working-directory: apps/qc-app
run: npm install ../../packages/qc-utils --no-save --workspaces=false

- name: Run QC app typecheck
working-directory: apps/qc-app
run: npm run typecheck
Expand Down Expand Up @@ -393,10 +389,6 @@ jobs:
working-directory: apps/qc-app
run: npm ci --workspaces=false

- name: Install local QC utils package
working-directory: apps/qc-app
run: npm install ../../packages/qc-utils --no-save --workspaces=false

- name: Install Playwright browsers
working-directory: apps/qc-app
run: npx playwright install --with-deps chromium firefox
Expand Down
21 changes: 20 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,37 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
# Legacy v1.x docs live on the docs-v1 branch and are served at /v1/
# while users migrate. Remove this checkout and the v1 steps below to
# retire them.
- name: Checkout v1.x docs
uses: actions/checkout@v4
with:
ref: docs-v1
path: v1-src
sparse-checkout: apps/docs
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: apps/docs/package-lock.json
cache-dependency-path: |
apps/docs/package-lock.json
v1-src/apps/docs/package-lock.json
- name: Install dependencies
working-directory: apps/docs
run: npm ci
- name: Build
working-directory: apps/docs
run: npm run docs:build
- name: Install v1.x dependencies
working-directory: v1-src/apps/docs
run: npm ci
- name: Build v1.x into /v1
working-directory: v1-src/apps/docs
run: |
npx vitepress build docs --base /v1/
cp -r docs/.vitepress/dist "$GITHUB_WORKSPACE/apps/docs/docs/.vitepress/dist/v1"
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
Expand Down
35 changes: 35 additions & 0 deletions apps/data-management/e2e/specs/sites.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,41 @@ test.describe('sites and workspaces', () => {
await expect(updatedSiteRow).toHaveCount(0)
})

test('canceling or dismissing site edits discards unsaved changes', async ({
page,
}) => {
const stamp = Date.now()
const unsavedProvince = `Unsaved Province ${stamp}`
const unsavedCounty = `Unsaved County ${stamp}`

await authenticateSession(page, users.owner.email, users.owner.password)
await page.goto(`/sites/${fixtures.monitoringSites.mutablePublic.id}`)

await page.getByTestId('edit-site-button').click()
await page.getByLabel('State/Province/Region').fill(unsavedProvince)
await page.getByRole('button', { name: 'Cancel' }).click()

await expect(page.getByText(unsavedProvince, { exact: true })).toHaveCount(0)

await page.getByTestId('edit-site-button').click()
await expect(page.getByLabel('State/Province/Region')).not.toHaveValue(
unsavedProvince
)
await page.getByRole('button', { name: 'Cancel' }).click()

await page.getByTestId('edit-site-button').click()
await page.getByLabel('County/District').fill(unsavedCounty)
await page.keyboard.press('Escape')

await expect(page.getByText(unsavedCounty, { exact: true })).toHaveCount(0)

await page.getByTestId('edit-site-button').click()
await expect(page.getByLabel('County/District')).not.toHaveValue(
unsavedCounty
)
await page.getByRole('button', { name: 'Cancel' }).click()
})

test('owner can edit, toggle privacy for, and delete a site with datastream CRUD', async ({
page,
browser,
Expand Down
8 changes: 5 additions & 3 deletions apps/data-management/e2e/specs/visualization.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,20 +308,22 @@ test.describe("visualization", () => {

await plotPublicDatastream(page);

// Date preset chips use abbreviated labels: 1m, 6m, YTD, 1y, all
// Date preset chips use abbreviated labels: 1w, 1m, 6m, YTD, 1y, all
await expect(page.getByText("1w").first()).toBeVisible();
await expect(page.getByText("1m").first()).toBeVisible();
await expect(page.getByText("6m").first()).toBeVisible();
await expect(page.getByText("1y").first()).toBeVisible();

await page.getByText("1w").first().click();
await page.getByText("1m").first().click();
await page.getByText("6m").first().click();
await page.getByText("1y").first().click();

// Quick-range selection is mirrored into the route query.
await expect(page).toHaveURL(/selectedDateBtnId=3/);
await expect(page).toHaveURL(/selectedDateBtnId=4/);
const copiedUrl = new URL(page.url());

expect(copiedUrl.searchParams.get("selectedDateBtnId")).toBe("3");
expect(copiedUrl.searchParams.get("selectedDateBtnId")).toBe("4");
expect(copiedUrl.searchParams.has("beginDate")).toBe(false);
expect(copiedUrl.searchParams.has("endDate")).toBe(false);
expect(copiedUrl.searchParams.has("xStart")).toBe(false);
Expand Down
4 changes: 3 additions & 1 deletion apps/data-management/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 31 additions & 9 deletions apps/data-management/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,30 +1,52 @@
<template>
<v-app>
<Navbar v-if="!route.meta.hideNavBar" />
<router-view v-slot="{ Component }">
<v-app>
<Navbar v-if="Component && showNavBar" />

<v-main :style="mainLayoutStyle">
<router-view />
</v-main>
<v-main :style="mainLayoutStyle">
<component :is="Component" v-if="Component" />
<HsEmptyState
v-else-if="initializationError"
title="Unable to load HydroServer"
>
Check your connection and refresh the page.
</HsEmptyState>
<HsFullScreenLoader v-else loading-text="Loading HydroServer..." />
</v-main>

<Footer v-if="!route.meta.hideFooter" class="flex-grow-0" />
<Notifications />
</v-app>
<Footer v-if="Component && !route.meta.hideFooter" class="flex-grow-0" />
<Notifications />
</v-app>
</router-view>
</template>

<script setup lang="ts">
import {
initializationError,
isHydroServerReady,
} from '@/bootstrap/appInitialization'
import Navbar from '@/components/base/Navbar.vue'
import Footer from '@/components/base/Footer.vue'
import Notifications from '@/components/base/Notifications.vue'
import {
HsEmptyState,
HsFullScreenLoader,
} from '@hydroserver/design-system/vue'
import { computed } from 'vue'
import { useRoute } from 'vue-router'

const route = useRoute()

// The navbar waits for the client: it reads the session and the user's workspaces.
const showNavBar = computed(
() => isHydroServerReady.value && !route.meta.hideNavBar
)

// Vuetify 4 can initially register a conditionally-rendered app bar with a
// zero layout height in optimized builds. Keep the shared main-content offset
// deterministic so the fixed navbar never covers page controls.
const mainLayoutStyle = computed(() => {
const navbarHeight = route.meta.hideNavBar ? '0px' : '64px'
const navbarHeight = showNavBar.value ? '64px' : '0px'
return {
'--v-layout-top': navbarHeight,
paddingLeft: 'var(--v-layout-left, 0px)',
Expand Down
Loading
Loading