@fleetbase/fleetops-engine 0.6.48 → 0.6.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/addon/components/customer/create-order-form.hbs +2 -2
  2. package/addon/components/customer/form.hbs +2 -2
  3. package/addon/components/customer/order-form.hbs +2 -2
  4. package/addon/components/customer/orders.hbs +2 -2
  5. package/addon/components/display-place.hbs +2 -2
  6. package/addon/components/driver/details.hbs +5 -1
  7. package/addon/components/driver/form.hbs +11 -1
  8. package/addon/components/fleet-listing-panel.hbs +2 -2
  9. package/addon/components/fleet-listing-panel.js +10 -0
  10. package/addon/components/map/google-live-map.js +18 -75
  11. package/addon/components/map/leaflet-live-map.hbs +187 -37
  12. package/addon/components/map/leaflet-live-map.js +184 -20
  13. package/addon/components/modals/order-change-destination.hbs +46 -0
  14. package/addon/components/modals/order-change-destination.js +106 -0
  15. package/addon/components/modals/stop-activity.hbs +28 -0
  16. package/addon/components/modals/stop-activity.js +52 -0
  17. package/addon/components/modals/update-order-activity.hbs +45 -3
  18. package/addon/components/modals/update-order-activity.js +143 -5
  19. package/addon/components/orchestrator/phase-builder.hbs +21 -0
  20. package/addon/components/orchestrator/phase-builder.js +13 -0
  21. package/addon/components/orchestrator/resource-panel.hbs +0 -10
  22. package/addon/components/orchestrator/resource-panel.js +2 -4
  23. package/addon/components/orchestrator-workbench.js +1 -0
  24. package/addon/components/order/activity-list.hbs +2 -2
  25. package/addon/components/order/activity-timeline.hbs +31 -29
  26. package/addon/components/order/details/activity.hbs +3 -3
  27. package/addon/components/order/details/activity.js +11 -0
  28. package/addon/components/order/details/documents.js +2 -0
  29. package/addon/components/order/details/purchase-rate.hbs +2 -2
  30. package/addon/components/order/details/route.hbs +11 -3
  31. package/addon/components/order/details/route.js +91 -14
  32. package/addon/components/order/details/tracking.hbs +101 -72
  33. package/addon/components/order/details/tracking.js +149 -2
  34. package/addon/components/order/form/details.hbs +3 -3
  35. package/addon/components/order/form/documents.js +11 -4
  36. package/addon/components/order/form/route.hbs +108 -104
  37. package/addon/components/order/form/route.js +37 -1
  38. package/addon/components/order/form/service-rate.hbs +2 -2
  39. package/addon/components/order/form.hbs +2 -2
  40. package/addon/components/order-config-manager/activity-flow.hbs +4 -1
  41. package/addon/components/order-config-manager/activity-flow.js +178 -12
  42. package/addon/components/place/address.js +1 -1
  43. package/addon/components/route-list.hbs +17 -17
  44. package/addon/components/route-list.js +42 -10
  45. package/addon/components/service-rate/details.hbs +41 -0
  46. package/addon/components/service-rate/form.hbs +118 -0
  47. package/addon/components/service-rate/form.js +55 -0
  48. package/addon/components/vehicle/form.js +1 -1
  49. package/addon/components/vehicle/pill.hbs +1 -1
  50. package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
  51. package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
  52. package/addon/components/widget/fuel-efficiency.hbs +26 -0
  53. package/addon/components/widget/fuel-efficiency.js +43 -0
  54. package/addon/components/widget/geofence-violations.hbs +44 -0
  55. package/addon/components/widget/geofence-violations.js +55 -0
  56. package/addon/components/widget/issues-insights.hbs +43 -0
  57. package/addon/components/widget/issues-insights.js +62 -0
  58. package/addon/components/widget/kpi-active-orders.hbs +10 -0
  59. package/addon/components/widget/kpi-active-orders.js +5 -0
  60. package/addon/components/widget/kpi-aov.hbs +10 -0
  61. package/addon/components/widget/kpi-aov.js +5 -0
  62. package/addon/components/widget/kpi-distance.hbs +10 -0
  63. package/addon/components/widget/kpi-distance.js +5 -0
  64. package/addon/components/widget/kpi-drivers-online.hbs +10 -0
  65. package/addon/components/widget/kpi-drivers-online.js +5 -0
  66. package/addon/components/widget/kpi-earnings.hbs +10 -0
  67. package/addon/components/widget/kpi-earnings.js +5 -0
  68. package/addon/components/widget/kpi-open-issues.hbs +11 -0
  69. package/addon/components/widget/kpi-open-issues.js +5 -0
  70. package/addon/components/widget/kpi-tile.hbs +59 -0
  71. package/addon/components/widget/kpi-tile.js +168 -0
  72. package/addon/components/widget/live-fleet.hbs +122 -0
  73. package/addon/components/widget/live-fleet.js +365 -0
  74. package/addon/components/widget/maintenance-overview.hbs +45 -0
  75. package/addon/components/widget/maintenance-overview.js +40 -0
  76. package/addon/components/widget/on-time-delivery.hbs +27 -0
  77. package/addon/components/widget/on-time-delivery.js +73 -0
  78. package/addon/components/widget/operations-pulse.hbs +51 -0
  79. package/addon/components/widget/operations-pulse.js +173 -0
  80. package/addon/components/widget/orders-by-status.hbs +26 -0
  81. package/addon/components/widget/orders-by-status.js +54 -0
  82. package/addon/components/widget/revenue-trend.hbs +34 -0
  83. package/addon/components/widget/revenue-trend.js +67 -0
  84. package/addon/components/widget/top-drivers.hbs +44 -0
  85. package/addon/components/widget/top-drivers.js +54 -0
  86. package/addon/controllers/management/vehicles/index/new.js +1 -1
  87. package/addon/controllers/operations/orders/index/details.js +4 -4
  88. package/addon/controllers/operations/orders/index.js +14 -0
  89. package/addon/controllers/settings/routing.js +26 -0
  90. package/addon/extension.js +172 -3
  91. package/addon/helpers/place-address-html.js +2 -2
  92. package/addon/routes/operations/service-rates/index.js +1 -1
  93. package/addon/services/geofence.js +163 -19
  94. package/addon/services/leaflet-contextmenu-manager.js +27 -0
  95. package/addon/services/map-adapter/google.js +13 -2
  96. package/addon/services/vehicle-actions.js +1 -1
  97. package/addon/styles/fleetops-engine.css +205 -88
  98. package/addon/templates/maintenance/equipment/index.hbs +1 -1
  99. package/addon/templates/maintenance/parts/index.hbs +1 -1
  100. package/addon/templates/maintenance/schedules/index.hbs +1 -1
  101. package/addon/templates/management/vehicles/index.hbs +1 -1
  102. package/addon/templates/settings/avatars.hbs +1 -1
  103. package/addon/templates/settings/custom-fields.hbs +1 -1
  104. package/addon/templates/settings/map.hbs +1 -1
  105. package/addon/templates/settings/navigator-app.hbs +1 -1
  106. package/addon/templates/settings/notifications.hbs +1 -1
  107. package/addon/templates/settings/orchestrator.hbs +1 -1
  108. package/addon/templates/settings/payments/index.hbs +1 -1
  109. package/addon/templates/settings/payments/onboard.hbs +1 -1
  110. package/addon/templates/settings/routing.hbs +22 -2
  111. package/addon/templates/settings/scheduling.hbs +1 -1
  112. package/addon/utils/fleet-ops-options.js +2 -1
  113. package/addon/utils/live-map-card-content.js +171 -0
  114. package/addon/utils/normalize-order-config-flow.js +41 -0
  115. package/addon/utils/place-address-html.js +3 -2
  116. package/addon/utils/route-visualization.js +54 -7
  117. package/app/components/modals/order-change-destination.js +1 -0
  118. package/app/components/modals/stop-activity.js +1 -0
  119. package/app/components/widget/fuel-efficiency.js +1 -0
  120. package/app/components/widget/geofence-violations.js +1 -0
  121. package/app/components/widget/issues-insights.js +1 -0
  122. package/app/components/widget/kpi-active-orders.js +1 -0
  123. package/app/components/widget/kpi-aov.js +1 -0
  124. package/app/components/widget/kpi-distance.js +1 -0
  125. package/app/components/widget/kpi-drivers-online.js +1 -0
  126. package/app/components/widget/kpi-earnings.js +1 -0
  127. package/app/components/widget/kpi-open-issues.js +1 -0
  128. package/app/components/widget/kpi-tile.js +1 -0
  129. package/app/components/widget/live-fleet.js +1 -0
  130. package/app/components/widget/maintenance-overview.js +1 -0
  131. package/app/components/widget/on-time-delivery.js +1 -0
  132. package/app/components/widget/operations-pulse.js +1 -0
  133. package/app/components/widget/orders-by-status.js +1 -0
  134. package/app/components/widget/revenue-trend.js +1 -0
  135. package/app/components/widget/top-drivers.js +1 -0
  136. package/app/utils/live-map-card-content.js +1 -0
  137. package/composer.json +1 -1
  138. package/extension.json +1 -1
  139. package/package.json +3 -3
  140. package/pnpm-workspace.yaml +1 -0
  141. package/server/config/telematics.php +111 -1
  142. package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
  143. package/server/migrations/2026_05_21_000001_add_geographic_rules_to_service_rate_fees_table.php +37 -0
  144. package/server/migrations/2026_05_25_000001_add_endpoint_tracking_refs_to_payloads_table.php +50 -0
  145. package/server/migrations/2026_05_27_000001_default_driver_vehicle_statuses_to_available.php +48 -0
  146. package/server/resources/views/labels/default.php +57 -49
  147. package/server/resources/views/labels/waypoint-label.php +27 -20
  148. package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
  149. package/server/seeders/Testing/ConnectivitySeeder.php +213 -0
  150. package/server/seeders/Testing/FleetSeeder.php +341 -0
  151. package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
  152. package/server/seeders/Testing/NetworkSeeder.php +250 -0
  153. package/server/seeders/Testing/OrdersSeeder.php +198 -0
  154. package/server/seeders/Testing/TestingSeeder.php +40 -0
  155. package/server/seeders/{VroomOrchestrationSeeder.php → Testing/VroomOrchestrationSeeder.php} +29 -22
  156. package/server/src/Console/Commands/AuditCustomerUserConflicts.php +75 -0
  157. package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
  158. package/server/src/Exceptions/CustomerUserConflictException.php +13 -0
  159. package/server/src/Http/Controllers/Api/v1/ContactController.php +17 -2
  160. package/server/src/Http/Controllers/Api/v1/CustomerController.php +876 -0
  161. package/server/src/Http/Controllers/Api/v1/DriverController.php +1 -1
  162. package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +54 -0
  163. package/server/src/Http/Controllers/Api/v1/OrderController.php +98 -70
  164. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -2
  165. package/server/src/Http/Controllers/Api/v1/VehicleController.php +20 -3
  166. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
  167. package/server/src/Http/Controllers/Internal/v1/ContactController.php +19 -0
  168. package/server/src/Http/Controllers/Internal/v1/LiveController.php +101 -66
  169. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
  170. package/server/src/Http/Controllers/Internal/v1/OrderController.php +441 -32
  171. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
  172. package/server/src/Http/Controllers/Internal/v1/SettingController.php +46 -1
  173. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +54 -1
  174. package/server/src/Http/Middleware/AuthenticateCustomerToken.php +34 -0
  175. package/server/src/Http/Requests/CreateCustomerOrderRequest.php +63 -0
  176. package/server/src/Http/Requests/CreateCustomerRequest.php +48 -0
  177. package/server/src/Http/Requests/CreateDriverRequest.php +1 -1
  178. package/server/src/Http/Requests/CreateVehicleRequest.php +25 -1
  179. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -1
  180. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +29 -0
  181. package/server/src/Http/Resources/Internal/v1/OrderConfig.php +41 -0
  182. package/server/src/Http/Resources/v1/Customer.php +79 -0
  183. package/server/src/Http/Resources/v1/Driver.php +2 -0
  184. package/server/src/Http/Resources/v1/Fleet.php +4 -0
  185. package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
  186. package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
  187. package/server/src/Http/Resources/v1/OrderConfig.php +74 -0
  188. package/server/src/Http/Resources/v1/Payload.php +23 -20
  189. package/server/src/Http/Resources/v1/ServiceArea.php +33 -19
  190. package/server/src/Http/Resources/v1/ServiceRateFee.php +7 -0
  191. package/server/src/Listeners/HandleOrderDispatched.php +2 -2
  192. package/server/src/Models/Contact.php +92 -15
  193. package/server/src/Models/Customer.php +64 -0
  194. package/server/src/Models/Driver.php +14 -3
  195. package/server/src/Models/Entity.php +2 -2
  196. package/server/src/Models/Order.php +29 -4
  197. package/server/src/Models/OrderConfig.php +14 -11
  198. package/server/src/Models/Payload.php +17 -1
  199. package/server/src/Models/ServiceRate.php +273 -1
  200. package/server/src/Models/ServiceRateFee.php +39 -9
  201. package/server/src/Models/TrackingNumber.php +8 -2
  202. package/server/src/Models/Vehicle.php +18 -2
  203. package/server/src/Models/Waypoint.php +2 -2
  204. package/server/src/Notifications/LateDeparture.php +48 -0
  205. package/server/src/Notifications/ProlongedStoppage.php +48 -0
  206. package/server/src/Notifications/RouteDeviation.php +48 -0
  207. package/server/src/Observers/ContactObserver.php +2 -0
  208. package/server/src/Observers/ServiceRateObserver.php +6 -6
  209. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +29 -2
  210. package/server/src/Providers/FleetOpsServiceProvider.php +6 -0
  211. package/server/src/Providers/NotificationServiceProvider.php +3 -0
  212. package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
  213. package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
  214. package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
  215. package/server/src/Support/Analytics/IssuesInsights.php +67 -0
  216. package/server/src/Support/Analytics/LiveFleet.php +127 -0
  217. package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
  218. package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
  219. package/server/src/Support/Analytics/OperationsPulse.php +86 -0
  220. package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
  221. package/server/src/Support/Analytics/RevenueTrend.php +78 -0
  222. package/server/src/Support/Analytics/TopDrivers.php +92 -0
  223. package/server/src/Support/CustomerAuth.php +98 -0
  224. package/server/src/Support/LabelPdf.php +52 -0
  225. package/server/src/Support/Metrics/AbstractMetric.php +170 -0
  226. package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
  227. package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
  228. package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
  229. package/server/src/Support/Metrics/EarningsMetric.php +30 -0
  230. package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
  231. package/server/src/Support/Metrics/MoneyMetric.php +30 -0
  232. package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
  233. package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
  234. package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
  235. package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
  236. package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
  237. package/server/src/Support/Metrics/Registry.php +46 -0
  238. package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
  239. package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
  240. package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
  241. package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
  242. package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
  243. package/server/src/Support/Metrics.php +46 -249
  244. package/server/src/Support/ResolvesOrderServiceStops.php +512 -0
  245. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
  246. package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
  247. package/server/src/Tracking/TrackingContextBuilder.php +41 -38
  248. package/server/src/Tracking/TrackingIntelligenceService.php +109 -9
  249. package/server/src/Tracking/TrackingStop.php +13 -11
  250. package/server/src/routes.php +50 -0
  251. package/server/tests/AnalyticsRoutesTest.php +41 -0
  252. package/server/tests/CapacityAllocationEngineTest.php +10 -10
  253. package/server/tests/CustomerContactIdentitySafetyTest.php +54 -0
  254. package/server/tests/CustomerEndpointTest.php +199 -0
  255. package/server/tests/DriverVehicleStatusDefaultTest.php +39 -0
  256. package/server/tests/LabelPdfRenderingTest.php +23 -0
  257. package/server/tests/LiveControllerViewportTest.php +60 -0
  258. package/server/tests/MetricsRegistryTest.php +84 -0
  259. package/server/tests/OrchestrationPayloadBuilderTest.php +2 -2
  260. package/server/tests/OrderConfigEndpointTest.php +86 -0
  261. package/server/tests/OrderFileAttachmentTest.php +20 -0
  262. package/server/tests/ServiceAreaZoneApiShapeTest.php +34 -0
  263. package/server/tests/VehicleDriverAssignmentTest.php +18 -0
  264. package/server/tests/VroomOrchestrationEngineTest.php +91 -0
  265. package/translations/en-us.yaml +38 -0
  266. package/server/migrations/2026_05_13_000001_repair_customer_contact_user_types.php +0 -86
@@ -28,7 +28,7 @@
28
28
  @hideColumnsPicker={{true}}
29
29
  />
30
30
  </Layout::Section::Header>
31
- <Layout::Section::Body class="overflow-y-scroll h-full">
31
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
32
32
  <Layout::Resource::CardsGrid
33
33
  @resource="equipment"
34
34
  @data={{@model}}
@@ -28,7 +28,7 @@
28
28
  @hideColumnsPicker={{true}}
29
29
  />
30
30
  </Layout::Section::Header>
31
- <Layout::Section::Body class="overflow-y-scroll h-full">
31
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
32
32
  <Layout::Resource::CardsGrid
33
33
  @resource="part"
34
34
  @data={{@model}}
@@ -16,7 +16,7 @@
16
16
  />
17
17
  </Layout::Section::Header>
18
18
 
19
- <Layout::Section::Body class="overflow-y-scroll h-full">
19
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
20
20
  <div class="p-4">
21
21
  <FullCalendar @events={{this.calendarEventSource}} @onEventClick={{this.onCalendarEventClick}} @onInit={{this.setCalendarApi}} />
22
22
  </div>
@@ -29,7 +29,7 @@
29
29
  />
30
30
  </Layout::Section::Header>
31
31
 
32
- <Layout::Section::Body class="overflow-y-scroll h-full">
32
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
33
33
  <Layout::Resource::CardsGrid
34
34
  @resource="vehicle"
35
35
  @data={{@model}}
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.avatar-management"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <AvatarManager />
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.custom-fields"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <CustomFieldsManager @subjects={{this.subjects}} />
@@ -10,7 +10,7 @@
10
10
  @permission="fleet-ops update map-settings"
11
11
  />
12
12
  </Layout::Section::Header>
13
- <Layout::Section::Body class="overflow-y-scroll h-full">
13
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
14
14
  <div class="container mx-auto h-screen">
15
15
  <div class="max-w-3xl my-10 mx-auto space-y-6">
16
16
 
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.navigator-app.navigator-app-settings"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <EntityFieldEditingSettings />
@@ -10,7 +10,7 @@
10
10
  />
11
11
  </Layout::Section::Header>
12
12
 
13
- <Layout::Section::Body class="overflow-y-scroll h-full">
13
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
14
14
  <div class="container mx-auto h-screen">
15
15
  <div class="max-w-3xl my-10 mx-auto space-y-6">
16
16
  <ContentPanel @title={{t "settings.notifications.configure-notifications"}} @open={{true}} @wrapperClass="bordered-classic">
@@ -9,7 +9,7 @@
9
9
  @isLoading={{or this.saveSettings.isRunning this.loadSettings.isRunning}}
10
10
  />
11
11
  </Layout::Section::Header>
12
- <Layout::Section::Body class="overflow-y-scroll h-full">
12
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
13
13
  <div class="container mx-auto h-screen">
14
14
  <div class="max-w-3xl my-10 mx-auto space-y-6">
15
15
  {{#if this.loadSettings.isRunning}}
@@ -11,7 +11,7 @@
11
11
  {{/if}}
12
12
  </Layout::Section::Header>
13
13
 
14
- <Layout::Section::Body class="overflow-y-scroll h-full">
14
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
15
15
  {{#if this.lookupStripeConnectAccount.isRunning}}
16
16
  <div class="flex items-center justify-center flex-1 p-4">
17
17
  <Spinner @loadingMessage={{t "settings.payments.loading-settings"}} @loadingMessageClass="ml-2 text-black dark:text-white" @wrapperClass="flex flex-row items-center" />
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "payment.settings.onboard.header-title"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container">
5
5
  <div class="max-w-3xl mx-auto mt-4">
6
6
  <div class="content">
@@ -10,7 +10,7 @@
10
10
  />
11
11
  </Layout::Section::Header>
12
12
 
13
- <Layout::Section::Body class="overflow-y-scroll h-full">
13
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
14
14
  <div class="container mx-auto h-screen">
15
15
  <div class="max-w-3xl my-10 mx-auto space-y-6">
16
16
  <ContentPanel @title={{t "settings.routing.configure-routing"}} @open={{true}} @wrapperClass="bordered-classic">
@@ -106,10 +106,30 @@
106
106
  </div>
107
107
  {{/if}}
108
108
  </ContentPanel>
109
+ <ContentPanel @title="Operational Alerts" @open={{true}} @wrapperClass="bordered-classic">
110
+ <InputGroup @name="Late Departures" @helpText="Notify when an order has not departed after the scheduled pickup window plus the configured grace period.">
111
+ <Toggle @isToggled={{this.lateDepartureAlertsEnabled}} @onToggle={{fn (mut this.lateDepartureAlertsEnabled)}} />
112
+ </InputGroup>
113
+ <InputGroup @name="Late Departure Grace Period" @helpText="Minutes after scheduled pickup before the order is considered late to depart.">
114
+ <Input @type="number" @value={{this.lateDepartureGracePeriodMinutes}} min="0" max="1440" class="form-input w-full" />
115
+ </InputGroup>
116
+ <InputGroup @name="Route Deviations" @helpText="Notify when tracked vehicle location drifts beyond the configured distance from the active route.">
117
+ <Toggle @isToggled={{this.routeDeviationAlertsEnabled}} @onToggle={{fn (mut this.routeDeviationAlertsEnabled)}} />
118
+ </InputGroup>
119
+ <InputGroup @name="Route Deviation Threshold" @helpText="Meters from the active route before a deviation alert is eligible.">
120
+ <Input @type="number" @value={{this.routeDeviationDistanceThresholdMeters}} min="0" max="100000" class="form-input w-full" />
121
+ </InputGroup>
122
+ <InputGroup @name="Prolonged Stoppages" @helpText="Notify when a vehicle remains stopped beyond the configured duration during an active trip.">
123
+ <Toggle @isToggled={{this.prolongedStoppageAlertsEnabled}} @onToggle={{fn (mut this.prolongedStoppageAlertsEnabled)}} />
124
+ </InputGroup>
125
+ <InputGroup @name="Prolonged Stoppage Duration" @helpText="Minutes stopped before a stoppage alert is eligible.">
126
+ <Input @type="number" @value={{this.prolongedStoppageDurationThresholdMinutes}} min="0" max="1440" class="form-input w-full" />
127
+ </InputGroup>
128
+ </ContentPanel>
109
129
  <RegistryYield @registry="fleet-ops:template:settings:routing" as |RegistryComponent|>
110
130
  <RegistryComponent @controller={{this}} />
111
131
  </RegistryYield>
112
132
  </div>
133
+ <Spacer @height="600px" />
113
134
  </div>
114
- <Spacer @height="600px" />
115
135
  </Layout::Section::Body>
@@ -9,7 +9,7 @@
9
9
  @isLoading={{or this.saveSettings.isRunning this.getSettings.isRunning}}
10
10
  />
11
11
  </Layout::Section::Header>
12
- <Layout::Section::Body class="overflow-y-scroll h-full">
12
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
13
13
  <div class="container mx-auto h-screen">
14
14
  <div class="max-w-3xl my-10 mx-auto space-y-6">
15
15
 
@@ -15,7 +15,7 @@ export const driverTypes = [
15
15
  ];
16
16
 
17
17
  export const driverStatuses = [
18
- { label: 'Active', value: 'active', description: 'Driver is available for assignments' },
18
+ { label: 'Available', value: 'available', description: 'Driver is available for assignments' },
19
19
  { label: 'Inactive', value: 'inactive', description: 'Driver is not currently active' },
20
20
  { label: 'On Duty', value: 'on_duty', description: 'Driver is working and available' },
21
21
  { label: 'Off Duty', value: 'off_duty', description: 'Driver is not working' },
@@ -382,6 +382,7 @@ export const podOptions = [
382
382
  export const serviceRateCalculationMethods = [
383
383
  { label: 'Per Meter', value: 'per_meter', description: 'Calculate cost based on the number of meters traveled.' },
384
384
  { label: 'Fixed Rate', value: 'fixed_meter', description: 'Charge a fixed rate per meter regardless of distance.' },
385
+ { label: 'Multi-zone Distance', value: 'multi_zone_distance', description: 'Calculate cost by splitting route distance across priced service areas and zones.' },
385
386
  { label: 'Parcel Rate', value: 'parcel', description: 'Charge a dynamic rate based on parcel/payload weight and dimensions.' },
386
387
  { label: 'Per Drop-off', value: 'per_drop', description: 'Cost applied per drop-off point.' },
387
388
  { label: 'Algorithm', value: 'algo', description: 'Cost calculated dynamically using algorithmic logic.' },
@@ -0,0 +1,171 @@
1
+ import { isArray } from '@ember/array';
2
+ import { dasherize } from '@ember/string';
3
+ import titleize from 'ember-cli-string-helpers/utils/titleize';
4
+
5
+ function resolveStatusClass(status) {
6
+ const statusKey = dasherize(status ?? 'default');
7
+
8
+ return `status-badge ${statusKey}-status-badge status-badge-${statusKey}`;
9
+ }
10
+
11
+ function titleizeStatus(status) {
12
+ if (!status) {
13
+ return '-';
14
+ }
15
+
16
+ return titleize(`${status}`.replace(/[_-]+/g, ' '));
17
+ }
18
+
19
+ function buildStatusBadge(status, label = status) {
20
+ return `
21
+ <div class="${resolveStatusClass(status)} shadow-none ml-auto">
22
+ <span class="rounded-full text-[9px] px-1.5 py-0.5">${titleizeStatus(label)}</span>
23
+ </div>`;
24
+ }
25
+
26
+ function buildMetaCell(label, value, valueClass = '') {
27
+ const shouldTruncate = valueClass.split(' ').includes('truncate');
28
+ const flowClass = shouldTruncate ? 'min-w-0 w-full' : 'whitespace-normal break-words';
29
+
30
+ return `
31
+ <div class="rounded bg-gray-900 shadow-md px-1.5 py-1 min-w-0">
32
+ <div class="text-[9px] font-semibold uppercase text-gray-400 leading-none">${label}</div>
33
+ <div class="text-[11px] text-white leading-tight ${flowClass} ${valueClass}">${value ?? '-'}</div>
34
+ </div>`;
35
+ }
36
+
37
+ function buildLiveMapCard(content, framed = false) {
38
+ const frameClasses = framed ? 'relative rounded-lg bg-gray-900 shadow-lg p-1.5 text-white' : '';
39
+ const closeButton = framed ? '<button type="button" class="fleetops-google-popover__close" data-fleetops-google-popover-close aria-label="Close">&times;</button>' : '';
40
+
41
+ return `<div class="w-[280px] max-w-[calc(100vw-2rem)] ${frameClasses}">${closeButton}${content}</div>`;
42
+ }
43
+
44
+ function resolveDriverStatus(driver) {
45
+ return driver.meta?.status_label ?? titleizeStatus(driver.status);
46
+ }
47
+
48
+ function resolveDriverLocation(driver) {
49
+ return driver.meta?.location_coordinates ?? resolveLocationCoordinates(driver.location);
50
+ }
51
+
52
+ function resolveDriverSpeed(driver) {
53
+ return driver.meta?.speed_label ?? `${driver.speed ?? '-'} km/h`;
54
+ }
55
+
56
+ function resolveDriverHeading(driver) {
57
+ return driver.meta?.heading_label ?? driver.heading ?? '-';
58
+ }
59
+
60
+ function resolveDriverId(driver) {
61
+ return driver.public_id ?? driver.id ?? '-';
62
+ }
63
+
64
+ function resolveVehicleNumber(vehicle) {
65
+ return vehicle.internal_id ?? vehicle.public_id ?? vehicle.plate_number ?? vehicle.serial_number ?? vehicle.vin ?? '-';
66
+ }
67
+
68
+ function resolveVehicleStatus(vehicle) {
69
+ return vehicle.meta?.status_label ?? vehicle.current_status ?? vehicle.status ?? '-';
70
+ }
71
+
72
+ function resolveVehicleLocation(vehicle) {
73
+ return vehicle.meta?.location_coordinates ?? resolveLocationCoordinates(vehicle.location);
74
+ }
75
+
76
+ function resolveVehicleSpeed(vehicle) {
77
+ return vehicle.meta?.speed_label ?? `${vehicle.speed ?? '-'} km/h`;
78
+ }
79
+
80
+ function resolveVehicleHeading(vehicle) {
81
+ return vehicle.meta?.heading_label ?? vehicle.heading ?? '-';
82
+ }
83
+
84
+ function resolveLocationCoordinates(location) {
85
+ if (!location) {
86
+ return '-';
87
+ }
88
+
89
+ if (location?.coordinates && isArray(location.coordinates)) {
90
+ const [lng, lat] = location.coordinates;
91
+ return Number.isFinite(lat) && Number.isFinite(lng) ? `${formatCoordinate(lat)} ${formatCoordinate(lng)}` : '-';
92
+ }
93
+
94
+ if (isArray(location) && location.length >= 2) {
95
+ const [lat, lng] = location;
96
+ return Number.isFinite(lat) && Number.isFinite(lng) ? `${formatCoordinate(lat)} ${formatCoordinate(lng)}` : '-';
97
+ }
98
+
99
+ return '-';
100
+ }
101
+
102
+ function formatCoordinate(coordinate) {
103
+ return `${Math.round(coordinate * 10000) / 10000}`;
104
+ }
105
+
106
+ export function buildDriverLiveMapContent(driver, framed = false) {
107
+ const status = resolveDriverStatus(driver);
108
+ const onlineClass = driver.online ? 'bg-green-400' : 'bg-red-500';
109
+
110
+ return buildLiveMapCard(
111
+ `
112
+ <div class="fleetops-google-hover-tooltip__title mb-1.5 flex items-center gap-1.5">
113
+ <span class="inline-block w-2 h-2 rounded-full ${onlineClass}"></span>
114
+ <span>${driver.name ?? '-'}</span>
115
+ ${buildStatusBadge(driver.status, status)}
116
+ </div>
117
+ <div class="grid grid-cols-2 gap-1">
118
+ ${buildMetaCell('ID', resolveDriverId(driver))}
119
+ ${buildMetaCell('Phone', driver.phone ?? '-')}
120
+ ${buildMetaCell('Vehicle', driver.vehicle_name ?? '-')}
121
+ ${buildMetaCell('Email', driver.email ?? '-', 'truncate')}
122
+ ${buildMetaCell('Order', driver.meta?.current_order_reference ?? '-')}
123
+ ${buildMetaCell('Speed', resolveDriverSpeed(driver))}
124
+ ${buildMetaCell('Heading', resolveDriverHeading(driver))}
125
+ ${buildMetaCell('Location', resolveDriverLocation(driver))}
126
+ </div>
127
+ `,
128
+ framed
129
+ );
130
+ }
131
+
132
+ export function buildVehicleLiveMapContent(vehicle, framed = false) {
133
+ const status = resolveVehicleStatus(vehicle);
134
+ const onlineClass = vehicle.online ? 'bg-green-400' : 'bg-red-500';
135
+
136
+ return buildLiveMapCard(
137
+ `
138
+ <div class="fleetops-google-hover-tooltip__title mb-1.5 flex items-center gap-1.5">
139
+ <span class="inline-block w-2 h-2 rounded-full ${onlineClass}"></span>
140
+ <span>${vehicle.displayName ?? '-'}</span>
141
+ ${buildStatusBadge(vehicle.status, status)}
142
+ </div>
143
+ <div class="grid grid-cols-2 gap-1">
144
+ ${buildMetaCell('Vehicle #', resolveVehicleNumber(vehicle))}
145
+ ${buildMetaCell('Driver', vehicle.driver_name ?? vehicle.driver?.name ?? '-')}
146
+ ${buildMetaCell('Order', vehicle.meta?.current_order_reference ?? '-')}
147
+ ${buildMetaCell('Speed', resolveVehicleSpeed(vehicle))}
148
+ ${buildMetaCell('Heading', resolveVehicleHeading(vehicle))}
149
+ ${buildMetaCell('Location', resolveVehicleLocation(vehicle))}
150
+ </div>
151
+ `,
152
+ framed
153
+ );
154
+ }
155
+
156
+ export function buildPlaceInfoWindowContent(place) {
157
+ return `
158
+ <div class="fleetops-google-popover fleetops-google-popover--compact">
159
+ <div class="fleetops-google-popover__body">
160
+ <div class="fleetops-google-popover__title">${place.name ?? place.address ?? '-'}</div>
161
+ <div class="fleetops-google-popover__meta">${place.address ?? ''}</div>
162
+ </div>
163
+ </div>`;
164
+ }
165
+
166
+ export function buildPlaceTooltipContent(place) {
167
+ return `
168
+ <div class="fleetops-google-hover-tooltip__title">${place.name ?? place.address ?? '-'}</div>
169
+ <div class="fleetops-google-hover-tooltip__meta">${place.address ?? ''}</div>
170
+ `;
171
+ }
@@ -0,0 +1,41 @@
1
+ import { isArray } from '@ember/array';
2
+
3
+ export function getOrderConfigFlowRootCode(flow = {}) {
4
+ if (flow.created) {
5
+ return 'created';
6
+ }
7
+
8
+ return Object.keys(flow)[0];
9
+ }
10
+
11
+ export default function normalizeOrderConfigFlow(flow = {}) {
12
+ if (isArray(flow)) {
13
+ return flow.reduce((normalized, activity, index) => {
14
+ if (!activity || typeof activity !== 'object') {
15
+ return normalized;
16
+ }
17
+
18
+ const code = activity.code ?? activity.key;
19
+ if (!code) {
20
+ return normalized;
21
+ }
22
+
23
+ const nextActivity = flow.slice(index + 1).find((candidate) => candidate && typeof candidate === 'object' && (candidate.code ?? candidate.key));
24
+
25
+ normalized[code] = {
26
+ ...activity,
27
+ code,
28
+ key: activity.key ?? code,
29
+ activities: isArray(activity.activities) ? activity.activities : nextActivity ? [nextActivity.code ?? nextActivity.key] : [],
30
+ };
31
+
32
+ return normalized;
33
+ }, {});
34
+ }
35
+
36
+ if (flow && typeof flow === 'object') {
37
+ return flow;
38
+ }
39
+
40
+ return {};
41
+ }
@@ -11,17 +11,18 @@ function line(content, className = '') {
11
11
  return `<div${classAttribute}>${escapeHtml(content)}</div>`;
12
12
  }
13
13
 
14
- export default function placeAddressHtml(place) {
14
+ export default function placeAddressHtml(place, options = {}) {
15
15
  if (!place) {
16
16
  return htmlSafe('');
17
17
  }
18
18
 
19
+ const { showTitle = true } = options;
19
20
  const name = place.name === place.street1 ? null : place.name;
20
21
  const cityStatePostalCode = [place.city, place.province, place.postal_code].filter((value) => !isBlank(value)).join(', ');
21
22
  const lines = [];
22
23
 
23
24
  if (name) {
24
- lines.push(line(name, 'font-semibold'));
25
+ if (showTitle) lines.push(line(name, 'font-semibold'));
25
26
  lines.push(line(place.street1));
26
27
  } else if (place.street1) {
27
28
  lines.push(line(place.street1, 'font-semibold'));
@@ -8,6 +8,18 @@ export function waypointToPlace(waypoint) {
8
8
  return waypoint.place ?? waypoint;
9
9
  }
10
10
 
11
+ export function endpointTrackingNumberUuid(payload, role) {
12
+ if (!payload || !role) {
13
+ return null;
14
+ }
15
+
16
+ return payload[`${role}_tracking_number_uuid`] ?? null;
17
+ }
18
+
19
+ export function waypointTrackingNumberUuid(waypoint) {
20
+ return waypoint?.tracking_number_uuid ?? waypoint?.tracking_number?.uuid ?? waypoint?.trackingNumber?.uuid ?? null;
21
+ }
22
+
11
23
  export function buildPlaceAddressTooltip(title, place) {
12
24
  if (!place) {
13
25
  return title;
@@ -38,30 +50,65 @@ export function buildRoutePointsFromPayload(payload) {
38
50
  const waypoints = payload.waypoints ?? [];
39
51
 
40
52
  if (hasValidCoordinates(payload.pickup)) {
41
- points.push({ role: 'pickup', place: payload.pickup });
53
+ points.push({ role: 'pickup', place: payload.pickup, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'pickup') });
42
54
  }
43
55
 
44
56
  waypoints.forEach((waypoint, index) => {
45
57
  const place = waypointToPlace(waypoint);
46
58
 
47
59
  if (hasValidCoordinates(place)) {
48
- points.push({ role: 'waypoint', place, stopNumber: index + 1 });
60
+ points.push({ role: 'waypoint', place, stopNumber: index + 1, trackingNumberUuid: waypointTrackingNumberUuid(waypoint) });
49
61
  }
50
62
  });
51
63
 
52
64
  if (hasValidCoordinates(payload.dropoff)) {
53
- points.push({ role: 'dropoff', place: payload.dropoff });
65
+ points.push({ role: 'dropoff', place: payload.dropoff, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'dropoff') });
66
+ }
67
+
68
+ if (hasValidCoordinates(payload.return)) {
69
+ points.push({ role: 'return', place: payload.return, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'return') });
54
70
  }
55
71
 
56
72
  return points;
57
73
  }
58
74
 
75
+ export function buildServiceStopsFromPayload(payload) {
76
+ if (!payload) {
77
+ return [];
78
+ }
79
+
80
+ const stops = [];
81
+ const waypoints = payload.waypoints ?? [];
82
+
83
+ if (payload.pickup) {
84
+ stops.push({ role: 'pickup', place: payload.pickup, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'pickup') });
85
+ }
86
+
87
+ waypoints.forEach((waypoint, index) => {
88
+ const place = waypointToPlace(waypoint);
89
+
90
+ if (place) {
91
+ stops.push({ role: 'waypoint', place, stopNumber: index + 1, trackingNumberUuid: waypointTrackingNumberUuid(waypoint) });
92
+ }
93
+ });
94
+
95
+ if (payload.dropoff) {
96
+ stops.push({ role: 'dropoff', place: payload.dropoff, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'dropoff') });
97
+ }
98
+
99
+ if (payload.return) {
100
+ stops.push({ role: 'return', place: payload.return, trackingNumberUuid: endpointTrackingNumberUuid(payload, 'return') });
101
+ }
102
+
103
+ return stops;
104
+ }
105
+
59
106
  export function describeRoutePoint(routePoint, routeColor) {
60
107
  const role = routePoint?.role;
61
108
  const stopNumber = routePoint?.stopNumber ?? 1;
62
- const label = role === 'pickup' ? 'P' : role === 'dropoff' ? 'D' : String(stopNumber);
63
- const markerColor = role === 'pickup' ? '#22C55E' : role === 'dropoff' ? '#EF4444' : routeColor;
64
- const title = role === 'pickup' ? 'Pickup' : role === 'dropoff' ? 'Dropoff' : `Stop ${stopNumber}`;
109
+ const label = role === 'pickup' ? 'P' : role === 'dropoff' ? 'D' : role === 'return' ? 'R' : String(stopNumber);
110
+ const markerColor = role === 'pickup' ? '#22C55E' : role === 'dropoff' ? '#EF4444' : role === 'return' ? '#F97316' : routeColor;
111
+ const title = role === 'pickup' ? 'Pickup' : role === 'dropoff' ? 'Dropoff' : role === 'return' ? 'Return' : `Stop ${stopNumber}`;
65
112
 
66
113
  return {
67
114
  label,
@@ -74,7 +121,7 @@ export function buildRoutePointMarkerPresentation(routePoint, routeColor, option
74
121
  const role = routePoint?.role;
75
122
  const place = routePoint?.place;
76
123
  const { label, markerColor, title } = describeRoutePoint(routePoint, routeColor);
77
- const zIndexOffset = role === 'pickup' ? 2200 : role === 'dropoff' ? 2100 : 1800;
124
+ const zIndexOffset = role === 'pickup' ? 2200 : role === 'dropoff' ? 2100 : role === 'return' ? 2000 : 1800;
78
125
 
79
126
  return {
80
127
  waypointLabel: label,
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/modals/order-change-destination';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/modals/stop-activity';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/fuel-efficiency';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/geofence-violations';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/issues-insights';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-active-orders';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-aov';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-distance';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-drivers-online';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-earnings';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-open-issues';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/kpi-tile';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/live-fleet';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/maintenance-overview';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/on-time-delivery';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/operations-pulse';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/orders-by-status';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/revenue-trend';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/widget/top-drivers';
@@ -0,0 +1 @@
1
+ export * from '@fleetbase/fleetops-engine/utils/live-map-card-content';
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.6.48",
3
+ "version": "0.6.50",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Fleet-Ops",
3
- "version": "0.6.48",
3
+ "version": "0.6.50",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/fleetops",
6
6
  "license": "AGPL-3.0-or-later",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/fleetops-engine",
3
- "version": "0.6.48",
3
+ "version": "0.6.50",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "fleet-ops"
@@ -43,8 +43,8 @@
43
43
  "dependencies": {
44
44
  "@babel/core": "^7.23.2",
45
45
  "@fleetbase/ember-core": "^0.3.19",
46
- "@fleetbase/ember-ui": "^0.3.29",
47
- "@fleetbase/fleetops-data": "^0.1.32",
46
+ "@fleetbase/ember-ui": "^0.3.32",
47
+ "@fleetbase/fleetops-data": "^0.1.34",
48
48
  "@fleetbase/leaflet-routing-machine": "^3.2.17",
49
49
  "@fortawesome/ember-fontawesome": "^2.0.0",
50
50
  "@fortawesome/fontawesome-svg-core": "6.4.0",
@@ -5,3 +5,4 @@ allowBuilds:
5
5
  '@fortawesome/free-solid-svg-icons': false
6
6
  core-js: false
7
7
  fsevents: false
8
+ minimumReleaseAge: 0