Commit graph

392 commits

Author SHA1 Message Date
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
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
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
07c8c72ee6 Merge remote-tracking branch 'origin/dev' into feat/SH-165-unscheduled-pin 2026-08-18 20:53:13 -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
arthur.bassi
a109a68f40 fix(work-orders): keep SH-188 tooltip when mixed with other gaps
Stop copying WO lifecycle status into uplift primaryStatus on flat board rows.
2026-08-18 17:28:14 -03:00
Codex Review Integration
64caab1832 fix(vendors): do not fail open while the trades facet is loading (SH-249)
An empty tradeOptions array meant two different things: "facets query still in
flight" and "vocabulary genuinely unavailable". Both enabled fail-open free
text and showed the outage warning, so a normal cold fetch looked like an
outage. Anything committed in that window was added to knownTradesRef and stayed
selectable after the canonical list arrived, permanently undermining the gate.

Expose the facets query isLoading as tradesLoading, thread it to the field as
tradeOptionsLoading, and keep the canonical gate active while loading. The
outage warning now shows only once the query has settled empty.
2026-08-18 17:25:44 -03:00
Codex Review Integration
ac9ce34101 fix(work-orders): distinguish loading from empty in Unassigned pin (SH-165)
The pinned Unassigned section folded the queue query's pending state into
isFetching only, which the section never read. On first mount, once GET /board
resolved while the queue was still paging GET /board/search, the pin announced
"No unassigned work orders." instead of a loading state.

Expose the queue query's own isLoading as unassignedLoading, thread it through
the table data hook, and render an aria-busy loading row while it is true so the
loading and empty states are separately observable.
2026-08-18 17:22:32 -03:00
Codex Review Integration
9624c264de fix(vendors): send only user-edited company fields on additive add (SH-250)
Adversarial review found a last-writer-wins window: after a stale 409 the
roster is refetched while the form keeps its pre-conflict values, so the
form-vs-roster diff resent our stale value for any company field another
user changed in that window, silently reverting their edit.

Transmit only fields the user actually edited, taken from react-hook-form
dirty state. Selecting a company calls reset(), so loaded values are never
dirty and only genuine edits are sent.

dirtyFields is resolved during render: formState is a Proxy that only tracks
properties read at render time, so reading it inside the submit callback
returned empty. The vendors E2E caught that; unit tests could not, since
they pass the flags in directly.
2026-08-18 14:42:01 -03:00
Codex Review Integration
63e37dd0bb fix(vendors): keep trades live region out of Stack spacing (SH-249)
The always-mounted aria-live feedback region inherited MUI Stack spacing,
adding a permanent gap under the trades input and shifting the approved
Vendor edit drawer layout. vendor-visual-regression caught it.

Move the region outside the spaced Stack and collapse it while silent, so
the live region stays in the DOM for announcements without claiming layout.
Restores the caption to MUI Typography; that swap was cosmetic and out of
scope for SH-249.
2026-08-18 14:27:42 -03:00
arthur.bassi
090130a2c0 chore(work-orders): merge origin/dev into uplifts PR
Keep upliftSummary fixtures and add isAddOn after the Add-On indicator landed on dev.
2026-08-18 13:24:21 -03:00
arthur.bassi
0c2ef6ac5e merge origin/dev into feature/wo-multi-poc-contacts
Use the extracted inline Schedule On cell from dev and keep additional-contacts fixtures complete.
2026-08-18 13:19:45 -03:00
arthur.bassi
dc9e146080 merge origin/dev into feat/SH-165-unscheduled-pin
Keep SH-165 non-terminal lifecycle statuses next to the Add-On type mapping from dev.
2026-08-18 13:19:44 -03:00
Codex Review Integration
df00e56d6e fix(vendors): gate trades to canonical list, preserve legacy values (SH-249) 2026-08-18 13:12:10 -03:00
Codex Review Integration
a710e21281 fix(vendors): additive technician add for existing companies (SH-250, SH-246) 2026-08-18 13:09:33 -03:00
Codex Review Integration
54c90e0e36 fix(login): design parity — official logo, h1 welcome heading, label color (SH-245) 2026-08-18 12:08:17 -03:00
arthur.bassi
32177e831b fix(work-orders): set isAddOn on pending-uplift StatusCell fixture
Keep the SH-188 fixture assignable to WorkOrderTableRow after the SH-184 merge.
2026-08-18 12:04:55 -03:00
arthur.bassi
bf1def809b chore(work-orders): merge origin/dev into SH-188 closability gate
Keep PastDueStatusCell extraction and SH-185 Schedule On copy from merged #102.
2026-08-18 12:01:23 -03:00
arthur.bassi
0966962d8f fix(work-orders): keep Unassigned pin visible when empty
Render the weekly Unassigned section at count 0 and cover assignment through the board PATCH path.
2026-08-18 11:50:46 -03:00
Arthur Bassi
7902476e2a test(work-orders): cover remaining SH-121 facets and document BE producer on dev 2026-08-18 10:27:45 -03:00
arthur.bassi
96e75f1cca fix(work-orders): format slide-over additional-contacts test (SH-218)
Wrap a long vi.mock so prettier --check passes in the governance job.
2026-08-18 10:06:46 -03:00
arthur.bassi
d93ae683c7 fix(work-orders): restore additionalContacts contract and name+phone extras (SH-218)
Document the backend #66 producer, drop incomplete extras from persist, and show the same required-field errors on POC 2+.
2026-08-18 10:03:14 -03:00
arthur.bassi
b60d0474bc fix(work-orders): keep admin-approved revoke off the WO dialog (SH-214)
SH-214/SH-212 own that action on Uplift Approvals; the WO surface only revokes the requester's auto-approved uplift.
2026-08-18 09:28:49 -03:00
Arthur Bassi
8d1a3340a8 fix(work-orders): align Past Due overlay and copy to Schedule On (SH-185)
Dispatchers were told to change Due Date, which cannot clear Past Due.
Drive the table overlay from Schedule On and match the 422 contract.
2026-08-18 09:20:18 -03:00