diff --git a/CHANGELOG.md b/CHANGELOG.md index a66bafa..d58b183 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ This file is the running release and change log for CODEXIUM. Keep it updated wh - Planning timeline now includes station day-load rollups, and Workbench slot suggestions use that server-backed per-day capacity data instead of only summary-level utilization heuristics - Workbench now surfaces day-level capacity directly in the planner, including hot-station day counts on heatmap cells, selected-day station load breakdowns, and per-station hot-day chips in station grouping mode - Workbench exception prioritization now scores and ranks projects, work orders, agenda rows, and dispatch exceptions by lateness, blockage, shortage, readiness, and overload pressure, with inline priority chips for faster triage +- Workbench now surfaces top-priority action lanes for `DO NOW`, `UNBLOCK`, and `RELEASE READY` records so planners can jump straight into ranked dispatch queues before working deeper lists - Project-side milestone and work-order rollups surfaced on project list and detail pages - Inventory SKU master builder with family-level sequence codes, branch-aware taxonomy management, and generated SKU previews on the item form - Thumbnail image attachment staging on inventory item create/edit pages, with upload-on-save and replacement/removal support diff --git a/client/src/modules/workbench/WorkbenchPage.tsx b/client/src/modules/workbench/WorkbenchPage.tsx index 1743f24..aa8c04b 100644 --- a/client/src/modules/workbench/WorkbenchPage.tsx +++ b/client/src/modules/workbench/WorkbenchPage.tsx @@ -551,6 +551,18 @@ export function WorkbenchPage() { .slice(0, 18), [focusRecords, workbenchFilter] ); + const prioritizedRecords = useMemo(() => [...filteredFocusRecords].sort(comparePriority), [filteredFocusRecords]); + const actionLanes = useMemo(() => ({ + doNow: prioritizedRecords + .filter((record) => record.overdue || (record.kind === "OPERATION" && (record.utilizationPercent ?? 0) > 100)) + .slice(0, 4), + unblock: prioritizedRecords + .filter((record) => record.readinessState === "BLOCKED" || record.readinessState === "SHORTAGE" || record.readinessState === "PENDING_SUPPLY" || Boolean(record.blockedReason)) + .slice(0, 4), + releaseReady: prioritizedRecords + .filter((record) => canQueueRelease(record)) + .slice(0, 4), + }), [prioritizedRecords]); const keyboardRecords = useMemo(() => { if (workbenchMode === "agenda") { return agendaItems; @@ -1064,6 +1076,30 @@ export function WorkbenchPage() { +
+ + + +
+