Commit graph

462 commits

Author SHA1 Message Date
Arthur Bassi
e3b8360a68 fix(work-orders): treat Canceled and Refused dispatches as inactive (SH-183)
Backend returns Cancelled, Canceled, and Refused; only Cancelled was skipped,
so Complete stayed enabled with no live vendor.
2026-08-19 15:04:50 -03:00
Alexandre Brandizzi
871b7b0964
Merge pull request #118 from Sea-Haven-Industries/feat/sh-245-login-parity
Some checks are pending
CI / ci (push) Waiting to run
CI / governance (push) Waiting to run
CI / vendor-visual-regression (push) Waiting to run
Deploy / deploy (push) Waiting to run
fix(login): design parity — official logo, h1 welcome heading, label colour (SH-245)
2026-08-19 14:55:17 -03:00
Arthur Bassi
8ab56d9782 refactor(work-orders): extract WoTable loading and empty shells
Keep the list table under the changed-file function length gate.
2026-08-19 14:48:04 -03:00
Arthur Bassi
2c14b08945 feat(work-orders): day-scoped week navigation (SH-240)
Let dispatchers pick one week and one weekday so the board
replaces rows instead of stacking the full week.
2026-08-19 14:45:59 -03:00
Codex Review Integration
670d03d572 test(vendors): update the deactivation e2e to the confirmation flow (SH-254)
The browser smoke encoded the behaviour this ticket changes: it asserted
the Deactivate button was disabled when work orders were linked. It now
asserts the opposite — the work orders are listed as links, "Deactivate
anyway" is enabled, and confirming sends confirmOpenWorkOrders=true.

Also fixes the mock's DELETE route, whose anchored pattern stopped
matching once the request carried a query string. The raced-409 case is
unchanged and still preserves the vendor.
2026-08-19 14:29:01 -03:00
Codex Review Integration
4e5863def5 test(vendors): refresh the vendor detail visual baseline (SH-253)
Regenerated in the CI Playwright image so the baseline matches the
container's rendering. Only vendor-detail changed; the list and edit
baselines are untouched, which confirms extracting the table's status
badge left that view pixel-identical.
2026-08-19 13:43:02 -03:00
Codex Review Integration
22b03b8ac0 fix(vendors): deactivation dialog follows the approved design (SH-254)
The dialog's wording, its actions and its behaviour all diverged from the
design prototype. It refused deactivation outright when the vendor had
open work orders, which SH-44 and SH-82 left as an open question rather
than a decided requirement.

Deactivation with open work orders now proceeds on explicit confirmation:
the design's title and body copy, the affected work orders listed as
links, and "Deactivate anyway" in place of a disabled button. The API
call carries confirmOpenWorkOrders so the server-side guard is cleared
deliberately rather than removed.
2026-08-19 13:36:37 -03:00
Codex Review Integration
038ce263da fix(vendors): vendor detail parity with the design prototype (SH-253)
Three divergences in the vendor detail drawer:

- The header rendered the company as a subtitle under a title that had
  already fallen back to the company, printing the same name twice when
  the row carried no technician. The subtitle is now dropped when it
  would repeat the title.
- The Google Maps link appeared only when a URL was stored, unlabelled,
  so an empty value left no trace of the field. It is now a labelled
  field below Address that reads em-dash when unset, as every other
  field in the panel does.
- The status sat immediately beside Total Jobs. It now sits opposite it
  at the right edge, and reuses the vendors table's dot-plus-text badge
  so the state never reads by colour alone.
2026-08-19 13:22:11 -03:00
Codex Review Integration
90a5256dee fix(vendors): gate deactivation prompt on saved status (SH-255)
The drawer's Active toggle asked to deactivate whenever the switch moved
from on to off, reading the unsaved form value. An inactive vendor toggled
on and back off without saving therefore raised "Deactivate this vendor"
for a vendor that was already inactive.

Gate on the persisted technician status from the loaded roster instead,
falling back to the clicked row. Deactivation is a property of the saved
vendor, not of the toggle.
2026-08-19 13:18:17 -03:00
Adam Moussa
d5a04d318a
Merge branch 'dev' into feat/sh-245-login-parity 2026-08-19 11:03:37 -04:00
Arthur Bassi
a43de20ed4 fix(work-orders): ignore cancelled dispatches in detail closability (SH-183) 2026-08-19 12:02:17 -03:00
Arthur Bassi
1554cf30d0 fix(work-orders): require vendor company not technician to complete (SH-183) 2026-08-19 11:49:19 -03:00
Arthur Bassi
772d7f94df
Merge pull request #107 from Sea-Haven-Industries/feature/wo-multi-poc-contacts
Some checks are pending
CI / ci (push) Waiting to run
CI / governance (push) Waiting to run
CI / vendor-visual-regression (push) Waiting to run
Deploy / deploy (push) Waiting to run
feat(work-orders): multiple additional POC contacts (SH-218)
2026-08-19 10:51:40 -03:00
Arthur Bassi
afdf667364
Merge branch 'dev' into feature/wo-multi-poc-contacts 2026-08-19 10:29:18 -03:00
Arthur Bassi
93f504a7b4
Merge pull request #101 from Sea-Haven-Industries/feature/sh-114-wo-closability-gate
feat(work-orders): SH-114 - Closability gate for Completed status
2026-08-19 10:28:44 -03:00
Alexandre Brandizzi
a71407b426
Merge branch 'dev' into feat/sh-250-fe-additive-add 2026-08-19 10:28:04 -03:00
Alexandre Brandizzi
13d9aa2034
Merge branch 'dev' into feat/sh-249-fe-trades 2026-08-19 10:28:01 -03:00
Codex Review Integration
1305bf35dd fix(vendors): bypass the query cache when reloading after a conflict (SH-250)
The reload fix re-seeded the form from queryClient.fetchQuery, which inherits the
global 5-minute staleTime. A 409 never invalidates that key -
useSaveVendorCompanyRoster invalidates only in onSuccess and its onError returns
early for conflicts - and the Add flow has no mounted observer on it, so reload
returned the cached roster with the same stale rowVersion and every retry 409'd
again. Update mode was unaffected because it recovers via query.refetch(), which
bypasses staleTime.

Pass staleTime: 0 on that fetch, since its sole purpose is the freshest
rowVersion. The regression test uses a client with the app's real staleTime; the
default test client uses 0, which masked this entirely.
2026-08-19 10:26:28 -03:00
Alexandre Brandizzi
4b73af9688
Merge branch 'dev' into feat/sh-245-login-parity 2026-08-19 10:23:56 -03:00
Arthur Bassi
15dbda3c8f
Merge branch 'dev' into feature/sh-114-wo-closability-gate 2026-08-19 09:43:05 -03:00
Arthur Bassi
5718ca2b92
Merge branch 'dev' into feature/wo-multi-poc-contacts 2026-08-19 09:42:54 -03:00
Arthur Bassi
28846a0c5a test(work-orders): add additionalContacts to uplift affordances fixture after merging origin/dev 2026-08-19 09:40:22 -03:00
Arthur Bassi
a62d66a2d1
Merge pull request #109 from Sea-Haven-Industries/feature/wo-advanced-filters-parity
Some checks are pending
CI / ci (push) Waiting to run
CI / governance (push) Waiting to run
CI / vendor-visual-regression (push) Waiting to run
Deploy / deploy (push) Waiting to run
feat(work-orders): advanced filter facets for severity and uplift (SH-121/SH-196)
2026-08-19 09:40:14 -03:00
Arthur Bassi
d534e92d03
Merge branch 'dev' into feature/wo-advanced-filters-parity 2026-08-19 09:33:07 -03:00
Arthur Bassi
a75b094564
Merge branch 'dev' into feature/wo-multi-poc-contacts 2026-08-19 09:32:29 -03:00
arthur.bassi
0182345ba3 refactor(work-orders): address SH-114 review naming and utils placement 2026-08-19 09:28:32 -03:00
arthur.bassi
1485903898 merge(dev): resolve SH-114 closability conflicts with uplifts overlays 2026-08-19 09:28:05 -03:00
Arthur Bassi
88b04a2481
Merge pull request #104 from Sea-Haven-Industries/feature/wo-uplifts-column-and-tab
feat(work-orders): uplift column and dialog with admin revoke (SH-196)
2026-08-19 09:05:26 -03:00
arthur.bassi
9801d6a50e chore(work-orders): merge origin/dev and keep both search date windows
Keep SH-121 all-weeks constants and the SH-165 unassigned Custom range.
2026-08-18 22:13:51 -03:00
arthur.bassi
c2a7044905 test(work-orders): add additionalContacts to Unassigned/uplift fixtures after merging origin/dev 2026-08-18 21:53:37 -03:00
arthur.bassi
081d9b67c6 Merge remote-tracking branch 'origin/dev' into feature/wo-multi-poc-contacts
# Conflicts:
#	src/test/domain/work-orders/mappers/work-order-mapper.test.ts
2026-08-18 21:52:04 -03:00
arthur.bassi
93df28335f fix(work-orders): keep SH-196 uplift mapping typed after merging origin/dev 2026-08-18 21:44:55 -03:00
arthur.bassi
fe86d46bec Merge remote-tracking branch 'origin/dev' into feature/wo-uplifts-column-and-tab
# Conflicts:
#	src/domain/work-orders/mappers/work-order-table-row-mapper.ts
#	src/domain/work-orders/types/work-order-table-row.ts
2026-08-18 21:42:53 -03:00
arthur.bassi
ce6e19ebaa Merge remote-tracking branch 'origin/dev' into feature/sh-114-wo-closability-gate
# Conflicts:
#	src/app/(protected)/workorders/_components/list/table/cells/status-cell.tsx
#	src/domain/work-orders/utils/wo-closability.ts
#	src/test/domain/work-orders/utils/wo-closability.test.ts
2026-08-18 21:18:49 -03:00
Arthur Bassi
b3180ef886
Merge pull request #111 from Sea-Haven-Industries/feat/SH-165-unscheduled-pin
Some checks are pending
CI / ci (push) Waiting to run
CI / governance (push) Waiting to run
CI / vendor-visual-regression (push) Waiting to run
Deploy / deploy (push) Waiting to run
feat(work-orders): align Unscheduled board pin with design (SH-165)
2026-08-18 21:04:51 -03:00
arthur.bassi
07c8c72ee6 Merge remote-tracking branch 'origin/dev' into feat/SH-165-unscheduled-pin 2026-08-18 20:53:13 -03:00
Arthur Bassi
08a32b71dd
Merge pull request #105 from Sea-Haven-Industries/feature/wo-uplift-pending-close-gate
Some checks are pending
CI / ci (push) Waiting to run
CI / governance (push) Waiting to run
CI / vendor-visual-regression (push) Waiting to run
Deploy / deploy (push) Waiting to run
fix(work-orders): unify closability and block Completed on pending uplift (SH-188)
2026-08-18 18:37:41 -03:00
arthur.bassi
2554e40fd8 test(work-orders): assert all-weeks total and Clear All restores the bar 2026-08-18 18:13:43 -03:00
Codex Review Integration
cccb0e4ca7 refactor(vendors): extract trade rejection message to satisfy length gate (SH-249)
The loading-aware gate pushed VendorTradeSpecialtiesField to 151 lines, one over
the changed-file maintainability cap. Move the rejection-message resolution and
the contract explanation to module scope; no behavior change.
2026-08-18 18:09:23 -03:00
Codex Review Integration
14ff8c5481 style(work-orders): format SH-114 closability test 2026-08-18 17:56:29 -03:00
Codex Review Integration
4449e49149 fix(work-orders): align detail type mapping with Add-On indicator (SH-114)
Merging dev broke this branch: SH-126/SH-184 made Add-On a backend-authoritative
indicator (isAddOn) and removed it from the WOType union, but
read-detail-closability-fields still accepted "Add-On" and mapped "AddOn" onto
it, so tsc failed on both the mapper and the closability test.

Drop Add-On from the detail type set so a legacy payload normalizes to "", and
cover the normalization directly instead of asserting it through
detailToClosabilityInput, which only forwards the already-typed value.
2026-08-18 17:53:41 -03:00
Alexandre Brandizzi
5ad13d38ca
Merge branch 'dev' into feature/sh-114-wo-closability-gate 2026-08-18 17:46:59 -03:00
Alexandre Brandizzi
2c10d2b7cb
Merge branch 'dev' into feature/wo-advanced-filters-parity 2026-08-18 17:46:53 -03:00
Alexandre Brandizzi
0de695362a
Merge branch 'dev' into feat/sh-250-fe-additive-add 2026-08-18 17:46:49 -03:00
Alexandre Brandizzi
5d18b76143
Merge branch 'dev' into feat/sh-249-fe-trades 2026-08-18 17:46:46 -03:00
Alexandre Brandizzi
defdc4c75b
Merge branch 'dev' into feat/sh-245-login-parity 2026-08-18 17:46:44 -03:00
arthur.bassi
b0b94e8a53 merge origin/feat/SH-165-unscheduled-pin 2026-08-18 17:44:39 -03:00
arthur.bassi
bea2858c81 fix(work-orders): search all weeks when advanced filters are applied 2026-08-18 17:40:47 -03:00
arthur.bassi
358495cfe9 fix(work-orders): distinguish unassigned loading from empty pin 2026-08-18 17:40:16 -03:00
Codex Review Integration
9a066092b3 fix(vendors): correct additive add reload, phone and contact (SH-250, SH-246)
Three review findings on the additive add path:

- Create-mode reload refreshed selectedRoster (including rowVersion) but left
  the form company fields on their pre-conflict values, so a retry diffed stale
  fields against the reloaded roster and could overwrite the concurrent company
  update that caused the 409. Reload now resets the form from the fresh roster,
  matching the select path.
- mapVendorRosterAdditivePatchToBackend copied companyFields verbatim while the
  reconcile write mapper canonicalizes companyPhone, so PATCH and PUT could send
  different phone shapes for the same input.
- emptyRosterTechnician seeded preferredContact "Phone" even though that
  control was removed from the form, so filling the first blank row submitted a
  fabricated value. append already omitted it; both paths now agree.
2026-08-18 17:28:48 -03:00