- Verify & Close button at bottom of dispatch modal
- Disabled with tooltip showing missing items (checklist, signoffs)
- Green verified banner after verification with verifier name + timestamp
- Verified status badge (dark green)
- Added Verified to DISPATCH_STATUSES constant
- verifyDispatch API function
- SignatureCapture component: canvas drawing pad + typed mode with cursive preview
- Two sign-off slots in dispatch detail modal: Customer and Vendor
- Collect Signature button opens capture modal, prompts for name
- Signed slots show signature thumbnail, name, and timestamp
- Green "All Signed" badge when both complete
- addDispatchSignoff API function
- timeSince utility: relative time display (2h ago, 3d ago)
- timeBetween utility: duration between two timestamps
- waitTimeColor utility: green (<4h), yellow (4-24h), red (>24h)
- Dispatch detail modal shows accepted time with duration
- Awaiting acceptance shows elapsed time with color coding
- Dispatches table shows Wait column with color-coded time for Sent dispatches
- Task List Template picker in dispatch modal
- Checklist section in dispatch detail modal with toggleable items
- Shows completion count, completed by user name + timestamp
- Strikethrough styling on completed items
- fetchTaskTemplates, updateChecklistItem, addChecklistItem API functions
- Pass WorkOrderIds array in dispatch API call
- DispatchDetailModal shows WO list from junction table in header
- dispatchToVendor API simplified to pass full payload
- Task Templates page: create/edit templates with checklist items
- Add/remove/reorder items, save template with name + description
- SettingsNav component with tab links between Dropdown Options and Task Templates
- taskTemplateApi in services/api.js
- Route at /settings/task-templates
- Vendor communication now lives in the dispatch detail modal
- Activity tabs: Customer, Internal, Audit Log
- Comment input only shows on Internal tab
- Pass status and assignee as API query parameters
- Filters applied in SQL for accurate counts across all pages
- Remove client-side row filtering
- Pagination and total count now reflect filtered results
- Toolbar shows "X of Y" when status or assignee filter is active
- Pagination bar totalCount reflects filtered row count
- Extracted filter logic into filteredRows variable for reuse
- usePaginatedList now manages sortBy/sortDir state
- Sort params passed to fetch function and sent to API
- SharedTable receives sort state as props instead of managing internally
- Clicking column headers triggers API refetch with new sort
- Removes client-side sorting that only worked on current page
- Dropdown filter next to status chips with All Assignees, Unassigned, and user list
- Filters combine with status filter
- Styled as rounded select matching filter bar aesthetic
- Click any column header to sort (toggle asc/desc)
- Default sort by Last Updated descending
- Sort indicator arrow on active column
- Gear icon in pagination bar opens column config panel
- Drag to reorder columns in the config panel
- Checkbox to show/hide individual columns
- Column resize still works (stopPropagation on handle)
- Records per page as a button group (12/24/48/96) with active highlight
- First/prev/next/last navigation buttons
- Current page number as blue badge
- Showing X-Y of Z range display
- Resets to page 1 when changing page size
- Switch from checkbox multi-select to radio button single select
- One vendor per dispatch, can dispatch multiple times for multiple vendors
- Selected vendor shown as chip below the list
- Checkbox on the left, vendor info in the middle, distance badge on the right
- Distance shown as large blue number with "miles" label in a rounded badge
- Vendor address on its own line below trades
- Pass locationZip to vendor dropdown API for distance calculation
- Display vendor address and distance in miles (blue, bold)
- Vendors sorted by proximity when site has a zip code
- Include locationZip in WO API response mapping
- Vendor list now has search input to filter by name or trade
- Selected vendors shown as removable chips below the list
- NTE and Vendor Scheduled Date side-by-side in the modal
- Sends ScheduledDate with dispatch request
- Vendor CRUD: list page with search, create/edit form with trade specialty chips
- Vendor routes, sidebar nav item with truck icon
- vendorApi in services/api.js
- Dispatch button on WO view page opens DispatchModal
- DispatchModal: vendor multi-select filtered by trade, NTE field, description
- Dispatches CollapsibleSection with PO table on WO view page
- fetchVendorsDropdown and dispatchToVendor API functions
- dispatches included in getWorkOrderById response mapping
- New Classification section: Problem, Trade, SubTrade dropdowns (SubTrade filters by Trade)
- New Schedule fields: Scheduled, Completed dates
- New Financial section: Vendor NTE, Customer NTE placeholder
- All sections below Details default collapsed with toggle arrows
- Assigned To on view page is now a clickable dropdown like status
- TT moved to Details section
- Dropdown options settings page at /settings/dropdowns with add/edit/delete
- Settings link in sidebar and user dropdown
- Fetch stats from /api/Dashboard/Stats endpoint
- KPI tiles show real counts and navigate on click
- Restore Priority Analysis and Invoice Analysis tables (placeholder data)
- Click user section to open dropdown with profile, settings, password, sign out
- Shows user avatar, name, and email in dropdown header
- Click notification bell to open panel showing empty state
- Both use portal-rendered dropdowns, close on outside click
- Removed standalone logout button, moved into user dropdown
- Remove search box from topbar (search is now on list pages)
- Clean notification bell icon
- User avatar with initials, name, and role displayed
- Divider between notifications and user section
- Logout as subtle icon button instead of red inline-styled button
- Remove inline styles, all styling via CSS classes
- Typing updates the input immediately but delays the API call
- Table keeps showing current results until the search settles
- Resets to page 1 when search changes
- Applies to all list pages using the shared hook
- Replace ActionBar dropdown and search section with clean toolbar
- Prominent "+ New Work Order" button on the right
- Inline search input in the toolbar
- Status filter chips (All, Open, In Progress, On Hold, Done, Cancelled)
- Show total count next to title
- Remove unused ActionBar import and viewMode state
- Remove dropdown selector and search button
- Use standalone woSearchInput class to avoid inherited border issues
- Single text input searches across all fields as you type
- Status column shows colored badge with dropdown to change status
- Assigned To column shows dropdown to reassign work orders
- Both use portal-rendered menus and update rows locally
- Fix grid cell vertical alignment to center content
- Both changes logged in audit trail
- Pass internalWONumber through API mapping
- Edit page header shows "Edit Work Order XXXXXXXX"
- Rename "Work Order Number" field to "Customer WO" (not required)
- View page shows both Internal WO and Customer WO in details
- Breadcrumb uses internal WO number
- List WO # column shows internal number
- Menu now renders on document.body via createPortal
- Positioned using getBoundingClientRect from the badge button
- Eliminates all parent stacking context / overflow issues
- Click the status badge to open a dropdown with all status options
- Status change calls ChangeStatus API and updates locally
- Color-coded status dots in the dropdown menu
- Closes on outside click
- Also logged in audit trail via backend ChangeStatus endpoint
- Add CommentInput component with textarea and send button
- Enter to send, Shift+Enter for new line
- New comments append to the list immediately without reload
- Fixed 400px height for tab content with scrollable overflow
- Comment input bar pinned at bottom of tab container
- Add addComment API function calling AddCommentJson endpoint
- Auto-scroll to newest comment
- Frontend uses workOrderNumber/title/assignedTo, backend expects
WorkerOrderNumber/WorkerOrderTitle/AssignTo
- Prevents null overwrite of existing data on save
- Filter comments by commentType field (customer, vendor, internal)
- Add AuditTimeline component showing field changes with old → new values
- Pass auditLog from API response to view page