High-Volume Data UX, Server Filtering & Batch Operations
This example is the Enterprise Work Queue, built as a runnable Wisej.NET 4 app.
One screen (UI/WorkQueuePage) over 6,000 seeded work orders: server-side filters, saved views, a pager that
loads exactly one page, sort kept in server-side grid state, and a batch reassignment with progress, a per-row
result report (UI/BatchResultDialog) and a retry for the failures only.
Nothing is deployed anywhere and nothing talks to a network: in-memory stores only.
Run it
cd "LearnWisej-Samples/Enterprise Wisej.NET Course/Module 5/EnterpriseOps"
dotnet run -f net10.0 --urls http://localhost:5205
Then open http://localhost:5205. (Visual Studio: open EnterpriseOps.slnx, press F5 — launchSettings.json
already points at port 5205.) The project multi-targets net10.0-windows;net10.0, so dotnet run needs -f.
The screen
Header with the screen title; one card with the filter bar (txtSearch, cboStatus, cboAssigned, cboSort,
btnSearch), the saved views (cboSavedView, btnApplyView, btnSaveView, the ★ lblViewBadge), dgvQueue, the
pager (btnFirst/btnPrev/lblPage/btnNext/btnLast, cboPageSize, lblSelection), the batch bar
(cboTechnician, btnBatchReassign, btnSelectPage, btnClearSelection), the progress line (lblProgress,
progressBatch), an error banner (lblBanner) and the dark status bar (lblStatusBar).
What to click
Signed in as ana.ops (Manager) in tenant contoso.
| Action | What you should see |
|---|---|
| (the app opens) | 50 rows, status bar Page 1 of 47 · 50 of 2,319 matching · sorted by Priority ↓ · N ms, badge ★ Saved view: “My critical queue” |
Type pump, press Enter (or Search) | ~110 matching rows, page back to 1 |
| Click ▶ / ⏭ / ◀ / ⏮ | the next page is fetched from the server — one page at a time |
| Click the Priority or Due header | the arrow moves, the sort is stored in GridState, the page resets to 1 |
| Choose Overdue HVAC → Apply view | filters, sort and the ★ badge follow the stored query |
| Edit a filter, Search | the badge falls back to custom filters |
| ★ Save current as view | a new view appears in the drop-down |
| Ctrl-click rows (or Select page), change page, come back | the selection is still there — it lives in GridState |
Search WO-10023, select WO-100234 / 100235 / 100236, target s.patel, Reassign 3 selected… → Yes | progress Reassigning to s.patel — 0 of 3… before the first row, the button becomes ■ Cancel batch; then status bar Batch complete — 2 succeeded · 1 failed · per-row report · audited and the report: WO-100236 locked by an open approval (APR-1042) — not changed (the failure path) |
| Retry 1 failed row(s) in the report | only the failed row is retried, with its version re-read — it fails again while the approval is open |
| Reassign a row needing a certification to j.kim | j.kim lacks the … certification → certification |
| ■ Cancel batch mid-run | amber banner: the rows already committed were not rolled back |
| Reload the browser (F5) | the same page, sort, filters and selection come back from SessionContext |
The services log every decision (Service:, Data:, Security:, Job:) to System.Diagnostics.Trace through
Services/ActivityTrace.cs — visible in the debugger's Output window.
Where things live
EnterpriseOps/
├─ Program.cs Application.MainPage = new UI.WorkQueuePage()
├─ UI/ WorkQueuePage (.cs/.Designer.cs) · BatchResultDialog (.cs/.Designer.cs)
├─ Domain/ WorkOrder.cs · Technician.cs
├─ Services/
│ ├─ ActivityTrace.cs · CommandContext.cs · SessionContext.cs (grid state + saved views, per session)
│ └─ WorkQueues/ HighVolumeGridPatterns.cs · WorkQueueQueryService.cs · GridState.cs · SavedView.cs
│ ReassignBatchCommand.cs · BatchReassignWorkflow.cs
├─ Data/ WorkOrderStore.cs (6,000 deterministic rows) · SavedViewStore.cs
├─ Security/ PermissionService.cs · AuditTrail.cs
└─ docs/ PagedQueryService.md · SearchProjectionModel.md · SavedViewDefinition.md
BatchReassignmentWorkflow.md (+ .svg) · PerformanceNotes.md