Commit Graph

4827 Commits

Author SHA1 Message Date
Nathnael
839dfdbae3 feat(filters): route filter, select-styled trigger, tune default pin set
- New "route" FilterType: RouteBody popover (searchable origin +
  destination selects, apply once both are picked), wired into
  ContractRequestsPage and BookingRequestsPage. Bookings already had
  server-side originYardId/destinationYardId; contracts gets both new
  (contract_routes is one-to-many, so origin/destination are separate
  EXISTS subqueries, not a join).
- Inactive FilterPill trigger restyled to read like a closed Mantine
  Select (opaque solid border, trailing chevron) instead of a dashed
  "+" pill — trigger only, popover body/position unchanged.
- Search box text set to regular weight.
- A couple more filters (Direction, Freight) pinned by default per
  page on top of the existing always-pinned ones; the rest stay behind
  More filters.
2026-08-15 07:23:43 +00:00
Nathnael
e5e75b4166 feat(filter-bar): migrate 3 more fleet pages, extract footer adapter
- ruleEngineFooterProps.ts: toRuleEngineFooterProps() — the
  useFilters-to-RuleEngineListFooter pagination adapter had already been
  hand-written twice (TrucksOnSitePage, CompliancePage) with the same
  pageSize-drop risk useFilters itself just had fixed; extracted before a
  third copy could drift.
- CompliancePage, FuelPurchasePage, IncidentsPage: ListControls ->
  FilterBar + applyClientFilters, same mechanical pattern as the
  warehouse pages (search + one date range, endpoints take no params at
  all per the inventory sweep — confirmed correct bucket, not assumed).
2026-08-14 14:13:11 +00:00
Nathnael
fa32fa6a96 feat(filter-bar): migrate BookingRequestsPage (richest Family A page)
13 useState fields -> 11 FilterDef entries + useFilters. Notable pieces:

- the deep-link-follow useEffect is gone entirely — controls.values reads
  live off the URL every render, so a link opened while the page is
  already mounted (the header document-review alarm) just works, and
  every filter auto-pins its own pill once it has a value (FilterBar's
  secondary/pinned split), so a deep link can never land behind "More
  filters" hidden. Confirmed the encoding stays back-compatible with the
  existing ?statuses=A,B&tradeDirection=IMPORT links via url.test.ts.
- "Paid, not allocated" (a checkbox that overrides the payment-status
  filter) became a boolean FilterDef with a custom toParams — ordered
  after paymentStatus in the defs array so its toParams wins on merge,
  matching the original override semantics exactly.
- booking kind and status stay pinned pills (always visible, matching the
  old primary row); direction/freight/payment/ownership/yards/dates are
  secondary (behind "More filters", matching the old advanced collapse).
2026-08-14 14:08:08 +00:00
Nathnael
d94c444a51 feat(filter-bar): fix pageSize bug, add client bridge, migrate 4 more pages
fix(useFilters): pageSize was a hardcoded constant, never read from the
URL, with no setter — the DataTable/RuleEngineListFooter page-size
dropdown silently did nothing on every page using the filter bar,
including the already-shipped ContractRequestsPage pilot. Added a `size`
URL param (mirrors `page`), `setPageSize`, and wired
`tableProps().onPaginationChange` to route page-size vs page-index
changes to the right setter instead of only ever calling setPage().

feat(clientFilter): applyClientFilters — the Family-B bridge the plan
called for. Generalizes ListControls'/useListControls' one hardcoded
search box + one date range to every FilterDef, matched against
`row[def.key]`. Reuses matchesDayRange/toDayString from
hooks/useListControls.ts (imported, not duplicated) so the inclusive-
range/timezone-safe semantics stay defined in exactly one place. Lets a
page ship the full pill-bar UI immediately and flip to server-side
filtering later by deleting one function call — no endpoint changes
required up front.

Migrated to the filter bar (mechanical, pattern established by
ContractRequestsPage):
- WarehouseInvoicesPage, LoadedInventoryPage, TrucksOnSitePage — Family B
  (ListControls/useListControls → FilterBar + applyClientFilters)
- CustomersPage — Family A (useState bag → useFilters), no filter pills
  needed here (search + sort only), the SegmentedControl "view" stays
  page-level tab state (like ContractStatusTabs), not a filter pill —
  it now resets the page via controls.setPage(1) on change, the same
  hazard useFilters already guards its own filters against
2026-08-14 14:03:33 +00:00
Nathnael
a15d4d922e Merge branch 'dev' into freight/nati-2 2026-08-14 13:52:23 +00:00
Nathnael
524f9aab56 fix(filter-bar): responsive layout broken on narrow viewports
The two-zone layout (left: filters, right: sort+save) hardcoded
flexWrap: "nowrap" on the outer container so the right zone would never
get pushed below the left on desktop. On a phone that's the same
two-column squeeze with no room for either side: the search box and
right-hand controls got clipped/overlapped instead of stacking.

- outer container: flex-col below the `sm` breakpoint (stacks to two full-
  width rows), flex-row + nowrap at `sm` and up (the original two-zone,
  right-pinned behavior)
- right zone swapped from <Group wrap="nowrap"> to a plain div with
  Tailwind classes — Group's `wrap` prop sets an inline flex-wrap style,
  which always wins over a `sm:flex-nowrap` class regardless of
  breakpoint, so the old responsive attempt could never have worked
- search input's hardcoded minWidth: 220 (wider than a lot of phones)
  dropped to a shrinkable 160
- saved-view card grid: base 2 columns forced text-clipping card overflow
  on a phone; base is now 1, growing to 2+ only once there's room
2026-08-14 13:51:48 +00:00
Nathnael
bec9575311 refactor(filter-bar): saved views as auto-named cards, not a name-prompt menu
Replace the modal "type a name to save" flow with a one-click Save that
auto-generates the label from the active filters (describeQuery, reusing
the same formatter FilterPill uses for pill text — one source of truth,
nothing to type, nothing to fall out of sync). Saved views render as a
grid of cards at the top of the filter bar instead of being buried in a
dropdown.

- useSavedViews: localStorage state, extracted so FilterBar owns one
  instance instead of two components each subscribing separately
- SaveViewButton: filled (not outline) since it's the one action-y
  control among a row of filter pills; flashes to a disabled "Saved" +
  checkmark state for 1.5s on click, in addition to the corner toast —
  the toast alone wasn't registering as feedback
- SavedViewCards: click to apply, per-card delete, active one highlighted
- moved from the wrapping filter-pill row into the pinned right-hand zone
  (with sort) behind its own divider, so it can't shove pills around
- Save icon: BookmarkPlus -> Save (floppy disk reads as "save" faster)
- More filters button: outline/gray -> default variant — same low-
  contrast-outline problem the inactive filter pill had
- Clear button font bumped xs -> sm to match the rest of the bar
2026-08-14 13:48:54 +00:00
Abubeker Yasin
086c4fe8c9 Merge pull request #1293 from Tria-plc/alpha
fix: ( portal ) opt out of browser translation to stop booking crash
2026-08-14 16:41:35 +03:00
Hagernesh Tadesse
3caf5f66e9 Merge pull request #1292 from Tria-plc/dev
Empty Container wagon assignment and return handled
2026-08-14 16:38:37 +03:00
Abubeker Yasin
d952792e15 fix: ( portal ) opt out of browser translation to stop booking crash 2026-08-14 16:37:51 +03:00
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
Hagernesh Tadesse
60f0824fd3 Merge pull request #1291 from Tria-plc/eims-integration
feat(train-scheduling): show loaded empties on the marshalling document
2026-08-14 14:39:22 +03:00
Hagernesh
1adc19baef feat(train-scheduling): show loaded empties on the marshalling document
Empty containers loaded onto an export departure carry no booking and no
wagon allocation, so their wagons printed as EMPTY — no cargo allocated —
staff checking the paper against the consist found boxes the list denied.
Those wagons now print the container numbers with cargo type EMPTY
CONTAINER, count toward the 40ft/20ft tallies, and get their own summary
tile; only genuinely bare wagons keep the empty wording.
2026-08-14 11:30:25 +00:00
Hagernesh Tadesse
4a836428c0 Merge pull request #1290 from Tria-plc/eims-integration
feat(train-scheduling): load returned empties onto an export train
2026-08-14 14:18:31 +03:00
Hagernesh
b4f2ec1c75 feat(train-scheduling): load returned empties onto an export train
Empties had no way onto a departure: the return record could name a train
but nothing seated it on a wagon. Export schedules now expose a loading
action that packs selected returns onto free wagons at one 40ft or two 20ft
each, enforced both in the picker and in the API (existing empties on the
schedule count against their wagon).

Adds container_size, train_schedule_id and wagon_sequence_no to
freight.empty_container_returns.
2026-08-14 09:57:50 +00:00
Hagernesh Tadesse
30c3567048 Merge pull request #1289 from Tria-plc/eims-integration
feat(warehouses): pick export train when allocating empty return to w…
2026-08-14 11:25:39 +03:00
Hagernesh
daee3eac0e feat(warehouses): pick export train when allocating empty return to wagon
Advancing an empty container return to WAGON_ALLOCATED opened no dialog,
so the wagon_allocation_reference column stayed null and nobody knew which
departure carried the empty. Now the action opens a picker of scheduled
EXPORT trains (DRAFT/SCHEDULED) and records the selection.
2026-08-14 08:17:35 +00:00
Hagernesh Tadesse
48762dccd1 Merge pull request #1288 from Tria-plc/eims-integration
feat(billing): add PNR row to freight invoice from booking payment re…
2026-08-14 10:28:06 +03:00
Hagernesh
41f480554c feat(billing): add PNR row to freight invoice from booking payment reference
PNR isn't a column on Invoice/Payment — it's written onto Booking.pnrCode
when a CBE_BILL payment initiates. toDocumentModel() now looks it up by
invoice.sourceId and adds it to the existing summary grid, shown only
when present.
2026-08-14 07:19:23 +00:00
Nathnael Wondisha
e56e1c3009 Merge pull request #1287 from Tria-plc/freight/nati-2
fix: ui
2026-08-14 10:08:08 +03:00
Nathnael
ab5a4117df fix: ui 2026-08-14 07:04:57 +00:00
mulish77
3bfff77bfb Merge pull request #1286 from Tria-plc/dev
Dev to Staging for demo purpose
2026-08-14 08:44:44 +03:00
robiman
a33494a3ae Fix price on voucher
Fix price on voucher
2026-08-14 08:25:12 +03:00
Roba Boru
f3ac818d58 Merge branch 'main' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-14 08:23:45 +03:00
Roba Boru
f41402422b Merge branch 'dev' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-14 08:23:17 +03:00
Roba Boru
aa850146dc Fix price on voucher 2026-08-14 08:22:50 +03:00
Abubeker Yasin
1a1e985d7f Merge pull request #1284 from Tria-plc/staging
Staging
2026-08-13 23:46:16 +03:00
Abubeker Yasin
ec52f15039 Merge pull request #1283 from Tria-plc/dev
merge dev to staging
2026-08-13 23:33:15 +03:00
Abubeker Yasin
62bb190752 Merge pull request #1282 from Tria-plc/alpha
feat: ( dashboard ) add booking charts
2026-08-13 23:32:25 +03:00
Abubeker Yasin
449dea78ab feat: ( dashboard ) add booking charts 2026-08-13 23:31:20 +03:00
robiman
cdc9db77ae Updated financial report and exclude fayda for Ethiopian when origin is outside of Ethiopia 2026-08-13 22:50:41 +03:00
Roba Boru
1f0d3d3a22 Merge branch 'dev' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-13 22:48:00 +03:00
Roba Boru
376c23a0ad Updated financial report and sms outside of Ethiopia 2026-08-13 22:47:22 +03:00
Nathnael Wondisha
553524ee56 Merge pull request #1280 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-13 22:16:04 +03:00
Nathnael
6cee9a2676 fix:contract page 2026-08-13 19:13:18 +00:00
marshal
e17df57a37 Merge pull request #1279 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-08-13 21:58:33 +03:00
Marshal
b9ba830a09 shipping line 2026-08-13 18:56:52 +00:00
Nathnael
147887b7c5 feat: dashbaord overview 2026-08-13 18:13:42 +00:00
Marshal
0e00a98ef3 feat: implement shipping line booking completion functionality
- Added ShippingLineBookingCompletionController and associated service to handle the completion of shipping line bookings.
- Introduced a new module for booking completion to maintain module separation and avoid cyclic dependencies.
- Updated the train scheduling global rules to set default desk hours to 24 hours.
- Modified existing services and entities to accommodate the new booking completion logic.
- Enhanced the front-end components to support the new booking completion flow, including updates to the booking detail and bookings pages.
- Implemented validation and error handling for booking completion, ensuring that only approved bookings can be completed.
- Added migration to set default desk hours in the database.
2026-08-13 15:10:27 +00:00
Marshal
5837ac7b6e Merge branch 'dev' 2026-08-13 14:14:31 +00:00
Nathnael Wondisha
df2faa1ee9 Merge pull request #1278 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-13 16:50:04 +03:00
Nathnael
89cdc0ad06 style: ui fixes 2026-08-13 13:46:46 +00:00
Roba Boru
f5a19a705a Merge branch 'main' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-13 16:36:29 +03:00
Abubeker Yasin
be7ea17841 Merge pull request #1277 from Tria-plc/alpha
feat: ( reports ) add fleet passenger overview to passengers landing …
2026-08-13 16:21:47 +03:00
Abubeker Yasin
62b2080aaf feat: ( reports ) add fleet passenger overview to passengers landing page 2026-08-13 16:20:21 +03:00
marshalyordanos
9fff469ffa feat: implement shipping line bookings management
- Add ShippingLineBookingsPage for listing and managing shipping line bookings.
- Create ShippingLineDocumentsModal for document uploads related to bookings.
- Introduce ShippingLineInitiateModal for initiating new shipping line bookings.
- Implement booking document state management with booking-doc-state utility.
- Add shipping line bookings service for API interactions.
- Update index to export new components and services.
- Enhance types for freight to include shipping line credits.
2026-08-13 15:54:40 +03:00
Nathnael
0df4be1820 style: overview revamp 2026-08-13 12:44:06 +00:00
Abubeker Yasin
2bb8d96eeb Merge pull request #1276 from Tria-plc/alpha
feat: ( reports ) add fleet seat overview to seat status landing page
2026-08-13 15:34:25 +03:00
Abubeker Yasin
aabf58320a feat: ( reports ) add fleet seat overview to seat status landing page 2026-08-13 15:32:56 +03:00
Hagernesh Tadesse
c3c27d9fcf Merge pull request #1274 from Tria-plc/eims-integration
fix(warehouses): free warehouse/yard/zone capacity on export dispatch
2026-08-13 15:05:24 +03:00