Skip to content

Unify regular and virtual device table behavior - #6

Merged
yellowman merged 6 commits into
mainfrom
openai/virtual-regular-parity
Sep 19, 2026
Merged

yellowman merged 6 commits into
mainfrom
openai/virtual-regular-parity

Conversation

@yellowman

@yellowman yellowman commented Sep 19, 2026

Copy link
Copy Markdown
Owner

Unifies the regular and virtual Dashboard device-table behavior and incorporates the follow-up review fixes for PR #5/#6.

Shared regular/virtual behavior

  • One filtered/sorted/hierarchical device-list path for both table modes.
  • One canonical row-cell renderer and shared row-state classes.
  • Consistent selected/managed/STA/not-alertable styling and live row refresh.
  • Regular live updates rebuild from the canonical device object instead of patching only a subset of cells.
  • Refresh/delete behavior is shared across modes.
  • Virtual WebSocket batches refresh warnings and the antenna modal without forcing full store notifications.
  • Virtual empty state and horizontal scrolling match regular-table behavior.
  • Scope/column dropdowns close on the real scrolling element in either mode.
  • Device discovery rendering is debounced and preserves scroll across 500↔501 mode transitions.

Review fixes

  • Removed the duplicate Batch Configuration submit listener introduced by PR Fix search, virtual bulk actions, refresh jobs, and CI #5; there is now exactly one submit path.
  • Config-page and bulk-selection entry points share the same modal population/reset flow.
  • SSIDs are limited to 32 bytes client- and server-side.
  • Channels must be positive integers client- and server-side.
  • Batch configuration propagates request cancellation through device login and PATCH. Once a password change has been accepted by the device, credential persistence deliberately detaches from request cancellation and is bounded by a 10-second timeout.
  • Virtual header width now sums border-box min-widths without double-counting padding and gives the directional column a stable min-width, avoiding width ratcheting/premature horizontal scroll.

Async batch-config note

The existing persistent job runner stores job parameters as JSON. Moving password changes into it directly would persist the new device password in plaintext. This PR therefore keeps batch config synchronous but cancellation-aware. A safe async config job should first add encrypted/ephemeral secret parameters.

Validation

CI run 35411207216 is green on head a508325:

  • Go tests: passed
  • Server build: passed
  • JavaScript syntax: passed

Note

Overview
Dashboard device tables now share one filtered/sorted/hierarchical list, one row-cell renderer, and shared row-state classes. Live WebSocket updates rebuild rows from the store (including parent AP rows when STAs change) instead of hand-patching cells; the virtual table gains horizontal scroll with a synced header, an empty state, stable Dir column sizing, and throttled side effects (warnings panel, antenna modal) after batched updates.

Batch configuration is consolidated behind a single modal/submit path with matching client checks: SSID capped at 32 bytes and channel as a positive integer. The API enforces the same rules and calls ApplyConfigContext so login and PATCH honor request cancellation; after a password change is accepted on-device, credential persistence uses a bounded WithoutCancel timeout so a disconnect does not skip saving the new password.

Smaller UX fixes include capture-phase scroll listeners so scope/column menus close in both table modes, debounced discovery re-renders that preserve scroll across regular/virtual mode switches, and cache-bust bumps for static assets.

Reviewed by Cursor Bugbot for commit a508325. Bugbot is set up for automated code reviews on this repo. Configure here.

@cursor

cursor Bot commented Sep 19, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_7cec7b3d-4c26-406b-aa0b-b907ffa58ea4)

@cursor

cursor Bot commented Sep 19, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_c1b658e3-f771-4f89-b4ca-108d1dfdcc86)

@cursor

cursor Bot commented Sep 19, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_77b51d6f-7567-42f3-bccc-b7436969908c)

@cursor

cursor Bot commented Sep 19, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_0fdc7d89-78b5-4781-91b1-af7bb4ae94e3)

@cursor

cursor Bot commented Sep 19, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_08e09244-ddb9-4de5-8c34-d3828d3dea0e)

@yellowman
yellowman merged commit 577aa08 into main Sep 19, 2026
2 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.

1 participant