Commit graph

94 commits

Author SHA1 Message Date
Arthur Bassi
d2e0061b93 chore(ci): add deploy pipeline, CDK scaffold, and board API docs 2026-07-17 11:48:47 -03:00
Alexandre Brandizzi
c68d47af7b
chore: upgrade frontend dependencies (#24)
Some checks failed
CI / ci (push) Has been cancelled
Deploy / deploy (push) Has been cancelled
* chore: upgrade frontend application dependencies

* chore: upgrade frontend infrastructure dependencies

* fix: align lockfiles with CI npm

* fix: preserve ky error semantics

* fix: sanitize timeout error message
2026-07-14 21:35:59 -03:00
Alexandre Brandizzi
166df904ac
feat(infra): AWS S3 + CloudFront CD pipeline on dev.seahaven.com (#21)
Some checks failed
CI / ci (push) Has been cancelled
Deploy / deploy (push) Has been cancelled
Self-contained CDK app (S3 + CloudFront + OIDC deploy role) deployed via the org reusable cd-cdk.yaml. Frontend served on dev.seahaven.com with the *.seahaven.com cert and a Route 53 apex alias; the SPA calls the dev backend directly at https://api.dev.seahaven.com/api.
2026-07-07 06:14:06 -03:00
4464e76228 Convert CI to org reusable workflow caller
Some checks failed
CI / ci (push) Has been cancelled
Replace the inline 5-job ci.yml with a thin caller of the org reusable
workflow ci-typescript-frontend.yaml. The standards gate, changed-line
guard, format/lint/build, unit tests, and Playwright browser smoke now
live centrally in Sea-Haven-Industries/.github and are maintained once.

Renames ci.yml -> ci.yaml (kebab-case .yaml convention) and triggers on
pull_request and push to main and dev, so this branch keeps CI coverage.

The reusable workflow runs as a single `ci` job, so this caller emits the
`ci / ci` status context. Branch-protection rulesets for main and dev must
have their required checks switched from the old job names (Metadata and
standards, Code quality, Build, Unit tests, Browser smoke) to `ci / ci`.
2026-06-24 16:46:47 -04:00
Adam Moussa
0af9d871ab
Add CODEOWNERS requiring internal-dev review (#20)
Assign all files to the internal-dev team so every pull request needs an
approving review from an internal-dev member, giving internal engineering
oversight of changes. The org main-branch-protection ruleset enforces this
via required code-owner review; the internal-dev team has write access, so
it is an eligible code owner.
2026-06-22 16:46:19 -04:00
Arthur Bassi
a0cf7b9ef0
Feat/vite typescript migration (#16)
* chore: add eslint, prettier, husky and commitlint tooling

* ci: add GitHub Actions workflow for lint and build

* build: migrate from CRA to Vite with TypeScript config

* docs: add architecture plan and design system documentation

* fix: scope ESLint to new components and hooks directories

* feat: add HTTP client, query cache and shared utilities

* feat: add theme system and global application styles

* feat: add shared UI, layout and domain badge components

* feat: add auth domain, provider and login page

* feat: add app shell, file-based routing and bootstrap

* feat: add protected layout and dashboard module

* feat: add accounts CRUD module

* feat: add assets CRUD module

* feat: add contacts CRUD module

* feat: add employees CRUD module

* feat: add locations CRUD module

* feat: add calendar events module

* feat: add follow-ups CRUD module

* feat: add PM schedules CRUD module

* feat: add work orders module with dispatch modals

* feat: add vendors CRUD and portal token panel

* feat: add vendor purchase orders module

* feat: add uplifts queue module

* feat: add settings for dropdowns and task templates

* feat: add vendor portal routes and signature capture

* test: add Vitest setup and Playwright login e2e spec

* chore: remove legacy CRA pages, Redux store and JS hooks

* chore: update gitignore and env example for Vite

* docs: translate pt-BR docs and Cursor rules to English

* fix(ci): fix login e2e session mock and prettier formatting

* fix(build): use mjs router script for Node 20 CI compatibility

* chore: remove migration scripts and unused generouted router

* fix(auth): restore JWT and align CRUD with backend routes

* fix(api): add no-content helpers and align paths with backend

* fix(accounts): align detail and mutation payloads with backend

* fix(contacts): resolve detail via GetContacts and map address DTOs

* fix(work-orders): align routes, delete body, and create payload

* fix(vendors): delete vendors via REST route

* fix(pm-schedules): handle empty save and delete responses

* fix(employees): add fallbacks for detail and dropdown calls

* chore(calendar): disable routes until backend exists

* chore(env): switch tracked env vars to Vite prefixes

* fix(api): align frontend contracts with backend review findings

Correct Work Order getById query param, asset site options via Location API,
Employee JobTitleId payload, and remove stale API paths.

* fix(employees,pm-schedules): align forms with backend API contracts

Align PM Schedule form and save payload with PMSchedule_DTO fields.
Bind employee Job Title select to jobTitleId for create/update payloads.
Add regression tests for both flows.

* fix(pm-schedules): gate edit/delete for Dev API contract

Production Dev API exposes only GetList and Save.

Hide unsupported edit/delete UI and block the edit route.

Add regression tests for disabled actions.

* docs(env): document VITE_API_URL must include /api suffix

* refactor(api): extract shared API prefix URL resolution

* feat(build): fail build on misconfigured absolute VITE_API_URL

* test(api): cover API URL contract and prefix resolution

* feat(auth): disable login submit until email and password are valid

* test(auth): align login tests with disabled submit behavior

* Feat/ab/menu-and-header (#17)

* chore(deps): add lucide-react for layout icon migration

* feat(auth): add getPrimaryUserRole helper for header display

* style(theme): add sidebar active tokens and nav group typography

* refactor(menu): migrate nav icons to lucide and trim menu groups

* feat(layout): redesign sidebar, topbar, and admin shell viewport

* chore(menu): hide Reports and Documents from sidebar

---------

Co-authored-by: Arthur Bassi <arthur.winiarski.ranger@outlook.com>

* ci: add frontend PR quality baseline (#18)

* chore(deps): add lucide-react for layout icon migration

* feat(auth): add getPrimaryUserRole helper for header display

* style(theme): add sidebar active tokens and nav group typography

* refactor(menu): migrate nav icons to lucide and trim menu groups

* feat(layout): redesign sidebar, topbar, and admin shell viewport

* chore(menu): hide Reports and Documents from sidebar

* ci: add PR quality baseline checks

* ci: avoid self-matching standards guard

* ci: split frontend quality gates

---------

Co-authored-by: Arthur Bassi <arthur.winiarski.ranger@outlook.com>

---------

Co-authored-by: Arthur Bassi <arthur.winiarski.ranger@outlook.com>
Co-authored-by: Alexandre Brandizzi <alex_brandizzi@hotmail.com>
2026-06-18 14:41:17 -03:00
npalOmega
1632f1e656 pm schedule fix 2026-05-14 11:01:59 -05:00
npalOmega
65bf95b20c refactor: fix compilation errors and centralize constants
- Fixed Redux slice errors
- All query keys now use constants from src/constants/
- Converted LoginPage to CSS Modules
- Consolidated documentation
2026-05-12 20:33:23 -05:00
npalOmega
5151be29ba Add production and development environment configuration files 2026-04-27 08:50:47 -05:00
Adam Moussa
bbcd1eb4e1 Wire Follow Ups list and form to backend
Replaces the mock api with real endpoints, fixes list column mappings
to match the backend payload, and realigns the form to the FollowUps
model (Reason, ScheduleDate, ScheduleStartTime, EmployeeId, AccountId,
LocationId, WorkOrderId) with real lookup dropdowns for Employee,
Account, and Location. Also redesigns the list header to match the
Work Orders toolbar + chip filter look.
2026-04-20 13:49:58 -04:00
Adam Moussa
a349a58822 Group sidebar nav by purpose
Replaces the flat 16-item list with six sections (Overview, Operations,
Vendors, Customers & Sites, Internal, System) and adds section titles
that collapse into dividers when the sidebar is collapsed.
2026-04-20 13:49:52 -04:00
Adam Moussa
2a6fe6f35e Add NTE uplift UI, vendor PO pages, and portal POs tab
Vendors can now request NTE uplifts from the dispatch detail page and
dispatchers can approve or deny them (with tier-gated buttons) from
the work order view. Admin uplift queue page lists all requests with
status/tier filters. New Vendor POs section lists every PO with a
detail page showing vendor, linked WOs, uplift history, checklist,
signoffs, comments, and scoped audit log with print support. Vendor
portal gets a POs tab alongside Work so vendors can reconcile by PO
number.
2026-04-20 13:26:08 -04:00
Adam Moussa
c98a905d4d Merge feature/vendor-portal into dev 2026-04-20 12:45:09 -04:00
Adam Moussa
168fa69a87 Add vendor portal UI
- Separate route tree at /v/:token (no SHOC chrome); session resolved via
  X-Vendor-Token header
- Dashboard lists only the vendor's own dispatches with status filters
- Dispatch detail: accept + status transitions (Acknowledged -> In Progress ->
  Completed), request cancel, checklist toggles, customer signoff before vendor
  signoff, comments attributed by type (dispatcher / vendor / customer)
- SignaturePad component (mouse + touch canvas, drawn or typed)
- Admin vendor form: portal token panel to generate, copy, rotate, or revoke
  the portal link
2026-04-20 12:02:00 -04:00
Adam Moussa
3b3086d873 Update TODO with completed items and vendor portal next steps 2026-04-17 16:33:18 -04:00
Adam Moussa
da51d4a5be Add Cancel Dispatch button to dispatch detail modal
- Red outlined button on the left side of actions row
- Confirmation prompt before cancelling
- Hidden when dispatch is already cancelled or verified
- Updates status to Cancelled and refreshes
2026-04-17 16:31:48 -04:00
Adam Moussa
913d75802c Polish dispatch workflow — custom items, name input, read-only after verify
- Custom checklist items in dispatch modal (type + Enter, removable chips)
- Add checklist item input in dispatch detail modal
- SignatureCapture now has proper Full Name field instead of prompt()
- Verified dispatches are read-only: edit hidden, checkboxes disabled, signoff buttons disabled
- Custom items sent as CustomChecklistItems in dispatch payload
2026-04-17 16:26:22 -04:00
Adam Moussa
dc81078df7 Add multi-WO selection to dispatch modal
- Current WO shown as non-removable chip
- Dropdown shows all WOs at same site, filtered by locationId server-side
- Search bar filters the dropdown list
- Click to add, X to remove additional WOs
- Header shows count when multiple WOs selected
- All selected WO IDs sent to backend
2026-04-17 16:13:18 -04:00
Adam Moussa
199715d5b6 Add Verify & Close button and verified banner to dispatch detail
- 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
2026-04-17 16:03:34 -04:00
Adam Moussa
5c24b9249d Add sign-off UI with signature capture component
- 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
2026-04-17 15:51:20 -04:00
Adam Moussa
31479029e3 Add time tracking to dispatch workflow
- 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
2026-04-17 15:41:51 -04:00
Adam Moussa
5dcfc9d303 Show acceptance status in dispatch detail modal
- Accepted field shows green timestamp when acknowledged
- Shows "Awaiting acceptance" in yellow when status is Sent
2026-04-17 15:39:50 -04:00
Adam Moussa
62bc2f058c Add checklist UI to dispatch workflow
- 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
2026-04-17 15:28:52 -04:00
Adam Moussa
714376c61b Update dispatch for multi-WO support
- Pass WorkOrderIds array in dispatch API call
- DispatchDetailModal shows WO list from junction table in header
- dispatchToVendor API simplified to pass full payload
2026-04-17 15:16:28 -04:00
Adam Moussa
4de6c54fc0 Add Task Templates settings page with shared settings nav
- 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
2026-04-17 14:57:18 -04:00
Adam Moussa
27fb70724b Remove Vendor tab from Activity section
- Vendor communication now lives in the dispatch detail modal
- Activity tabs: Customer, Internal, Audit Log
- Comment input only shows on Internal tab
2026-04-17 14:03:41 -04:00
Adam Moussa
2a23febcec Add dispatch detail modal with vendor communication thread
- Click dispatch row to open detail modal
- View/edit dispatch status, NTE, scheduled/completed dates, description
- Vendor Communication thread with message input
- Send email toggle — messages optionally email the vendor
- Modal sized for long email threads with scrollable communication area
- Dispatch table shows dispatch number, clickable rows
2026-04-17 14:01:13 -04:00
Adam Moussa
7428a6d5e3 Add project TODO tracking deferred work items 2026-04-17 13:08:19 -04:00
Adam Moussa
0d847896db Move status and assignee filters to server-side
- 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
2026-04-17 12:57:37 -04:00
Adam Moussa
ddbe1ae375 Update total count to reflect active filters
- 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
2026-04-17 12:52:59 -04:00
Adam Moussa
e2fc183636 Move sorting to server-side for full dataset ordering
- 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
2026-04-17 12:50:23 -04:00
Adam Moussa
79f7b4782a Add assigned to filter on work order list
- 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
2026-04-17 12:45:29 -04:00
Adam Moussa
1ae58e56c3 Add column sorting, reorder, and show/hide to SharedTable
- 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)
2026-04-17 12:40:41 -04:00
Adam Moussa
4b44237b61 Add Last Updated column to work order list
- Maps lastUpdated from API response
- Formatted as YYYY-MM-DD HH:MM TZ, shows dash when never updated
2026-04-17 12:33:30 -04:00
Adam Moussa
7b544d26db Move pagination bar above the table 2026-04-17 12:28:13 -04:00
Adam Moussa
b26fde454d Redesign pagination bar with button group page size selector
- 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
2026-04-17 12:26:11 -04:00
Adam Moussa
0455fdf2ec Change dispatch to single vendor select per dispatch
- 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
2026-04-17 12:22:37 -04:00
Adam Moussa
766ad20774 Fix vendor item layout — checkbox left, distance right
- Switch from label to div to avoid global label CSS overriding flex layout
- Checkbox, vendor info, and distance badge now on the same row
2026-04-17 12:19:09 -04:00
Adam Moussa
7bb5133523 Redesign vendor item layout in dispatch modal
- 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
2026-04-17 12:16:38 -04:00
Adam Moussa
2769dc23ba Swap trade and address order in dispatch vendor list
- Trade shown directly under company name in blue
- Address and distance shown on the bottom line
2026-04-17 11:59:34 -04:00
Adam Moussa
c09ac4460b Show vendor address and distance in dispatch modal
- 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
2026-04-17 11:56:15 -04:00
Adam Moussa
2a4cd5da75 Add searchable vendor picker and scheduled date to dispatch modal
- 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
2026-04-17 11:47:19 -04:00
Adam Moussa
0167a1aa75 Add vendor pages and dispatch UI
- 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
2026-04-17 11:37:49 -04:00
Adam Moussa
feacb72337 Add WO fields, collapsible sections, assign dropdown, settings page
- 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
2026-04-17 10:40:55 -04:00
Adam Moussa
46bf66a35d Show internal WO number in list WO # column
- Prioritize internalWONumber over workOrderNumber in row mapping
2026-04-16 19:32:52 -04:00
Adam Moussa
fb5bed9647 Revert actions column to original grid layout 2026-04-16 19:31:30 -04:00
Adam Moussa
5aa194c7be Wire up dashboard tiles with live data, keep tables
- 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)
2026-04-16 19:25:42 -04:00
Adam Moussa
2477bcf5a6 Add user dropdown menu and notification panel to topbar
- 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
2026-04-16 19:21:26 -04:00
Adam Moussa
11e3d3d31f Redesign top header bar
- 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
2026-04-16 19:18:27 -04:00
Adam Moussa
3a13d94b71 Add 600ms debounce to search in usePaginatedList
- 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
2026-04-16 19:16:04 -04:00