Commit Graph

20 Commits

Author SHA1 Message Date
Nathnael
4a4d3077d7 feat: Stripe-style filter bar for freight backoffice (pilot: contracts)
Replace the ad-hoc filter controls with a URL-linkable pill filter bar:
each filter is a pill that opens a type-aware popover (text/enum/date/
number/boolean, each with the right operator set), overflow filters live
behind a searchable "More filters" menu, sorting is a separate control,
and filter state round-trips through the URL query string (shareable,
back/forward-safe, backward compatible with existing ?statuses=A,B links).

Frontend (apps/edr-freight-web/backoffice/src/components/filters/):
- FilterDef schema + a pure url.ts codec (parse/serialize/toApiParams),
  with a 24-case round-trip + malformed-input test suite
- useFilters hook driving react-query params straight from useSearchParams,
  debounced search, saved views in localStorage (@mantine/hooks
  useLocalStorage), page-reset-on-filter-change baked into one
  setSearchParams call instead of a separate effect
- FilterBar/FilterPill/OperatorSelect/MoreFiltersMenu/SortControl +
  per-type popover bodies (Mantine)
- ContractRequestsPage migrated end to end as the pilot

Backend (apps/edr-freight-api):
- pagination.util: applySort() — whitelisted sortBy resolved against a
  per-module column map (never interpolated), with a mandatory `id ASC`
  tiebreaker so paginating a non-unique sort can't drop/duplicate rows
- facets.util: computeFacets() — one GROUP BY per enum column, each
  omitting its own predicate, so picking a value doesn't hide its siblings
- contracts/bookings: list-summary now returns real filter-scoped facet
  counts (contracts' getStatusCounts was unfiltered/global; superseded)
- deleted drivers/vehicles findAllWithFilters — dead code that
  interpolated an unwhitelisted sortBy straight into orderBy()
- migration: missing bookings(status)/wagons(status) indexes +
  (created_at DESC, id ASC) partials on the hot list tables

UI polish pass: inactive pill uses the opaque "default" variant instead
of a faint tinted outline, active pill uses "light" not "filled", larger
X hit target, applied filters sort first, sort control separated behind
a divider on the right and wraps independently from the filter row,
popover option rows are fully clickable (count moved inside the native
label) with bigger hit area and font, fixed a real date-filter bug where
the calendar's own portal falsely registered as an "outside click" and
closed the popover, and fixed a timezone bug where bare YYYY-MM-DD
strings were parsed as UTC instead of local time (shifts a day for EAT).

Not in this commit: rollout to the other ~59 list pages, the Ethiopian-
calendar DateBody branch, and the Family-B (client-side) bridge mode —
tracked in the filter-bar plan.
2026-08-14 13:18:46 +00:00
Nathnael
da08a9b085 fix(auth): list every route key on the class-level guard
Nest runs class and method guards together, so a class gate naming only
the view key silently required view AND action. Staff granted just an
action were denied before their key was checked. Each class gate now
names every key its routes use, and FleetView accepts an array so the
fleet controllers keep their coarse fallback.

Drops the one-off grant mapping SQL with it: already applied to dev, and
this fix removes the companion-view rule that was its recurring part.
2026-08-07 08:43:20 +00:00
Marshal
41fe04652f fix issue 2026-07-16 00:33:31 +00:00
natib21
b300fd1de5 user permition 2026-07-07 10:00:48 +00:00
natib21
42710261e2 fix 2026-07-06 13:49:30 +00:00
natib21
0e6ebda6f6 fix 2026-07-03 15:21:23 +00:00
natib21
e14e02e7f2 fix 2026-07-03 14:07:43 +00:00
natib21
782f4184ef fix 2026-07-03 13:49:55 +00:00
natib21
e4b0c73c63 fix fayda 2026-07-03 09:10:05 +00:00
natib21
2424e96e74 fix 2026-07-02 14:34:22 +00:00
natib21
58bfb5045a vehicle 2026-06-19 12:25:00 +00:00
natib21
5ca107f781 vehicle 2026-06-19 12:17:18 +00:00
natib21
b2f1ce7d48 vehicle 2026-06-19 12:14:31 +00:00
natib21
fb8ade77cd vehicle 2026-06-19 12:06:01 +00:00
natib21
4c37426040 vehicle 2026-06-19 12:03:26 +00:00
natib21
ce28856352 vehicle 2026-06-19 12:01:15 +00:00
natib21
0397a36370 vehicle 2026-06-19 11:54:12 +00:00
natib21
f1c2943854 driver 2026-06-18 09:51:31 +00:00
natib21
fc702f0fbe driver 2026-06-18 09:46:35 +00:00
yaschalew
4b46c44147 fix 2026-06-18 12:33:45 +03:00