Dispatch Visual Review¶
Review Context¶
- Playwright MCP opened
http://localhost:3000/dispatchwith an authenticated session. - Captures:
scratch/dispatch-visual-review/dispatch-authenticated-desktop.pngat 1440x900scratch/dispatch-visual-review/dispatch-authenticated-tablet.pngat 1024x768scratch/dispatch-visual-review/dispatch-authenticated-desktop-snapshot.mdscratch/dispatch-visual-review/dispatch-authenticated-tablet-snapshot.mdscratch/dispatch-visual-review/dispatch-existing-empty-state-desktop-final.pngafter routing all no-block cases through the shared empty statescratch/dispatch-visual-review/dispatch-existing-empty-state-tablet-final.pngafter routing all no-block cases through the shared empty statescratch/dispatch-visual-review/dispatch-empty-state-after-revision-snapshot.mdscratch/dispatch-visual-review/dispatch-empty-state-no-schedules-button-desktop.pngafter adding the no-schedules upload actionscratch/dispatch-visual-review/dispatch-empty-state-no-schedules-button-tablet.pngafter adding the no-schedules upload actionscratch/dispatch-visual-review/dispatch-empty-state-no-schedules-button-snapshot.mdscratch/dispatch-visual-review/dispatch-populated-review-current.pngwith blocks available but the activeFuturetab emptyscratch/dispatch-visual-review/dispatch-populated-review-finished-desktop.pngwith three finished blocks visiblescratch/dispatch-visual-review/dispatch-populated-review-selected-finished-desktop.pngwith a selected finished blockscratch/dispatch-visual-review/dispatch-populated-review-selected-finished-tablet.pngwith the selected finished block at 1024x768scratch/dispatch-visual-review/dispatch-populated-panels-fixed-desktop.pngafter the first populated-panel layout passscratch/dispatch-visual-review/dispatch-populated-panels-fixed-tablet.pngafter the first populated-panel layout passscratch/dispatch-visual-review/dispatch-populated-panels-fixed-finished-readiness-desktop.pngafter changing selected finished blocks to a readiness review statescratch/dispatch-visual-review/dispatch-populated-panels-fixed-finished-readiness-tablet.pngafter changing selected finished blocks to a readiness review statescratch/dispatch-visual-review/dispatch-populated-control-strips-aligned-desktop.pngafter aligning control-strip heights and reverting finished-block logic changesscratch/dispatch-visual-review/dispatch-populated-control-strips-aligned-tablet.pngafter aligning control-strip heights and reverting finished-block logic changesscratch/dispatch-visual-review/dispatch-populated-fullscreen-alignment-review.pngat 1920x1080 before separating vehicle header and controlsscratch/dispatch-visual-review/dispatch-populated-fullscreen-panel-header-aligned.pngat 1920x1080 after separating vehicle header and controlsscratch/dispatch-visual-review/dispatch-populated-fullscreen-matched-vehicle-tabs.pngat 1920x1080 after replacing the static vehicle header with vehicle tabsscratch/dispatch-visual-review/dispatch-populated-tablet-matched-vehicle-tabs.pngat 1024x768 after replacing the static vehicle header with vehicle tabsscratch/dispatch-visual-review/dispatch-visual-slice-final-fullscreen.pngfinal visual slice check at 1920x1080scratch/dispatch-visual-review/dispatch-visual-slice-final-tablet.pngfinal visual slice check at 1024x768- The live seeded state showed no scheduled blocks for the selected day, so populated-list findings also use current Dispatch help screenshots.
- Related implementation:
bf-manage-web/src/pages/Dispatch/index.tsx,BlockList, andVehicleList.
Empty-State Path Check¶
- Staging already showed the shared page-level
EmptyStatefor some no-block cases. - The local authenticated state had no schedules available, which caused
useDayOfOpsSetupto disable setup and bypass the original shared empty-state branch. - That fallback rendered the normal split block and vehicle panes, so the operator saw a visually noisy no-block workspace with sparse vehicle fragments.
- The implementation fix keeps the shared
EmptyStateand changes the no-block condition so local no-schedule, no-block states use the same full-panel empty state as the staged path. - The no-schedules empty state now keeps an action button that links to Dispatch settings so the operator can upload a schedule before returning to setup.
Findings¶
- The top command row is visually busy and has weak grouping.
Depot local time, date navigation, setup actions, destructive actions, undo, and settings sit in one long row with limited hierarchy.- Icon-only buttons on the right have unclear meaning without hover, especially delete, undo, and settings.
- The disabled
Set up daybutton still consumes primary attention even when it is unavailable. - At 1024px, the page controls wrap into two rows while the setup/settings actions float right, making the action order harder to follow.
-
Likely implementation area:
bf-manage-web/src/pages/Dispatch/index.tsx. -
The two-pane split is functional but visually heavy.
- The center divider and shared bordered container make the page feel like one large table, while the two sides actually represent different tasks.
- The panels are crashed together with only a 1px divider, so the block controls and vehicle controls feel like one compressed surface rather than two related work areas.
- The left and right panel headers do not share a consistent baseline, type scale, or divider rhythm: block tabs sit at the top edge while the vehicle heading starts lower and uses much larger type.
- The vehicle pane has a large empty lower area when the list is shorter than the block list.
- The equal-width layout gives vehicle rows too much horizontal space and block cards too little scanning structure in some states.
- In the empty/sparse state, the left pane is grey and the right pane is white, which makes the split feel accidental rather than purposeful.
-
Likely implementation area:
ContentContainerinbf-manage-web/src/pages/Dispatch/index.tsx. -
Block cards are hard to scan.
- The purple time-span line dominates each card but does not clearly explain itself at a glance.
- Block name, relative start time, absolute times, duration, assignment state, and actions compete for attention in a small vertical area.
- The
Unassignedpill repeats on every card and creates visual noise because nearly all visible cards share the same state. -
Likely implementation area:
BlockListandBlockCardunderbf-manage-web/src/evenergi-ui/components/Dispatch/. -
Controls inside panels are uneven.
- Block tabs, the unassigned toggle, and sort control occupy separate horizontal bands, which costs vertical space before work items begin.
- Vehicle search and sort align better, but the
All Vehiclesheading is oversized for a dense operations panel. - Horizontal rules and panel section lines do not line up across left and right panes, which makes the interface feel assembled from separate components rather than one coordinated dispatch surface.
- The block side lacks a search control while the vehicle side has one, making the two panes feel inconsistent.
- At 1024px, labels such as
Show unassigned onlyandSort bywrap awkwardly inside the toolbar. - The
Show unassigned onlytoggle appears only halfway open/clipped in the tablet layout, which makes the control state ambiguous and visually broken. - The block tab dropdown, toggle, and sort control form a crowded toolbar that competes with the vehicle toolbar.
-
Likely implementation area:
BlockList.controlRibbonandVehicleList.controlRibbon. -
Vehicle rows have spacing and contrast issues.
Allocatebuttons are repeated in a disabled state, drawing attention to actions the user cannot take.- The battery bar is long and visually dominant, while vehicle identity and operational state are comparatively small.
- Percentage, kWh value, charging state, and vehicle type are spread across the full row, increasing eye travel.
- In the sparse live state,
Unknown nowand-render as detached fragments rather than a coherent readiness summary. -
Likely implementation area:
VehicleListandVehicleCard. -
Selected block detail improves context but still feels dense.
- The selected card adds useful energy, distance, route, vehicle class, and allocation data, but the hierarchy is flat.
- The selected outline is strong, while the inner allocation panel uses similar button and pill weight as the surrounding card.
- The energy bar and allocation action sit on the same row as identity details, which makes the selected state harder to parse quickly.
- Likely implementation area:
BlockCardandVehicleSlot.
Populated-State Review¶
- Tab state is technically accurate but operationally confusing.
- The page opened on
Futurewith zero blocks whileFinishedhad three blocks, so the visible body still looked like a near-empty state. - The tab counts are helpful, but there is no prompt in the empty active tab to guide the operator toward the populated tabs.
-
Likely implementation area:
BlockList.renderBlockCardsno-block callout copy and tab presentation. -
The selected finished block is too visually similar to actionable future work.
- Finished blocks still show a prominent
Unassignedstate and selected-block allocation panel. - The right pane offers red
Force allocateactions against finished work, even though the block is already in the past. - This weakens operator trust because historical status and active assignment actions are mixed.
-
Likely implementation area:
BlockCard,VehicleList, and selected-block viability/action gating. -
The tablet layout is usable but cramped.
- The block tab dropdown, unassigned toggle, and sort control stack into a dense toolbar before the first block.
- The toggle track is partially clipped in the toolbar, so the switch reads as broken before the operator even reaches the block list.
- The two panels meet too tightly at the divider; there is no breathing room between the selected block card and the vehicle recommendation panel.
- Selected block details wrap awkwardly:
Block 1, finished timing, vehicle class, and estimate labels fight for space. - Vehicle rows become hard to compare because force-allocate actions, status, unknown energy values, and vehicle name wrap into uneven columns.
-
Likely implementation area:
BlockList.controlRibbon,BlockCardselected layout, andVehicleCard. -
Sparse vehicle telemetry is still visually noisy.
Unknown now,Unknown end, and-repeat on every row without a compact explanation.- The repeated red action buttons dominate more important readiness context.
-
Likely implementation area:
VehicleCardreadiness summary and action priority. -
Panel typography and line rhythm need a coordinated pass.
- The left pane leads with tabs and small toolbar labels, while the right pane leads with a large
Recommended Vehicles/All Vehiclesheading. - Divider lines, header heights, and content starts are misaligned between panes, so the eye cannot scan left-to-right cleanly.
- This should be treated as a layout-system issue, not a one-off card tweak.
- Likely implementation area: shared
Panel,BlockList,VehicleList, and the page-levelContentContainer.
First Populated-Panel Fix¶
- Replaced the hard 1px center divider with a deliberate gutter between the block and vehicle panes.
- Added panel framing to both panes so they read as related but distinct work areas.
- Reduced the vehicle panel heading scale so it better matches the block-side tab/header rhythm.
- Stabilized the block toolbar at tablet width so the
Show unassigned onlytoggle no longer appears clipped or half-rendered. - Reverted the selected-finished-block behavior change. Finished-block allocation behavior needs a separate workflow decision before changing the logic.
- Aligned block and vehicle control-strip minimum heights at desktop and tablet widths, so toolbar rows occupy a steadier vertical rhythm across panes.
- Added a vehicle panel header row so search and sort sit in the second control row, matching the block side where tabs occupy the first row and filters/sort occupy the second row.
- Replaced the static vehicle header with real vehicle tabs (
Available,Needs attention,All) based on the currentrequiresAttentionsignal, so both panels use the same tab/dropdown visual language. - Moved vehicle lists onto the same grey work surface as the block list and rendered each vehicle as a compact white card.
- Reduced vehicle list section headings to compact labels with counts, and removed the redundant
Allsection break because the active vehicle tab already provides that context. - Tuned vehicle-card spacing to use a smaller block-like gap with slightly more internal padding.
- Remaining visual debt: finished block cards still show
Unassignedprominently, block-card internals still have dense border/outline layers, and unknown telemetry still needs a more compact readiness summary.
Suggested First Fixes¶
- Tighten the Dispatch shell before changing business behavior.
- Give the page-level command row clearer left, center, and right groups.
- Add accessible labels to icon-only action buttons.
- Reduce visual priority for disabled setup actions.
-
Define a wrapped tablet layout where date controls and page actions keep a predictable order.
-
Improve panel structure.
- Give each pane a clear compact header:
BlocksandVehicles. - Move tabs, search, filters, and sort into stable panel toolbars.
- Add a deliberate gap or stronger panel framing between the block and vehicle panes instead of relying on a single 1px divider.
- Align header baselines, typography scale, divider lines, and toolbar heights across both panes.
- Fix the tablet toolbar so the
Show unassigned onlytoggle has stable width and cannot be clipped. - Use sticky panel headers so controls remain visible while scrolling each list.
-
Make empty and sparse states visually balanced across both panes.
-
Improve dense scanning.
- Reduce the visual dominance of repeated disabled actions and repeated
Unassignedstates. - Make block timing and vehicle readiness easier to compare by aligning key values in predictable columns or compact rows.
- Tone down decorative lines and make them secondary to block identity, start time, and assignment state.
-
Replace detached unknown/empty vehicle values with a compact readiness summary.
-
Validate visually in browser before and after.
- Use Playwright MCP at desktop and tablet widths.
- Capture screenshots for default future view, selected block view, no selected block vehicle view, and narrow desktop/tablet layout.