@fleetbase/fleetops-engine 0.6.70 → 0.6.72

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 (510) hide show
  1. package/RELEASE.md +18 -47
  2. package/addon/components/admin/tracking-page-settings.hbs +56 -0
  3. package/addon/components/admin/tracking-page-settings.js +67 -0
  4. package/addon/components/device/form.hbs +2 -2
  5. package/addon/components/driver/details.hbs +1 -1
  6. package/addon/components/driver/form.hbs +1 -1
  7. package/addon/components/equipment/form.hbs +1 -1
  8. package/addon/components/layout/fleet-ops-sidebar.js +11 -3
  9. package/addon/components/maintenance/form.hbs +3 -3
  10. package/addon/components/map/google-live-map.js +2 -2
  11. package/addon/components/map/leaflet-live-map.js +45 -32
  12. package/addon/components/orchestrator/phase-builder.js +2 -1
  13. package/addon/components/orchestrator-workbench.hbs +7 -1
  14. package/addon/components/orchestrator-workbench.js +16 -2
  15. package/addon/components/order/details/activity.hbs +8 -6
  16. package/addon/components/order/details/activity.js +9 -0
  17. package/addon/components/order/details.hbs +29 -0
  18. package/addon/components/order/details.js +26 -0
  19. package/addon/components/order/form/details.hbs +30 -4
  20. package/addon/components/order/form/details.js +46 -0
  21. package/addon/components/order/form/route.hbs +5 -3
  22. package/addon/components/order/form/route.js +24 -1
  23. package/addon/components/order/form.hbs +12 -0
  24. package/addon/components/order/form.js +21 -1
  25. package/addon/components/order/kanban.js +72 -0
  26. package/addon/components/order-config-manager/activity-flow.js +45 -10
  27. package/addon/components/order-config-manager/lifecycle.hbs +250 -0
  28. package/addon/components/order-config-manager/lifecycle.js +358 -0
  29. package/addon/components/order-config-manager.js +5 -1
  30. package/addon/components/service-rate/details.hbs +1 -1
  31. package/addon/components/service-rate/form.hbs +1 -1
  32. package/addon/components/tracking-page/full-view.hbs +276 -0
  33. package/addon/components/tracking-page/full-view.js +474 -0
  34. package/addon/components/tracking-page/locale-selector.js +30 -0
  35. package/addon/components/tracking-page/map.hbs +44 -0
  36. package/addon/components/tracking-page/map.js +328 -0
  37. package/addon/components/tracking-page/order-list.hbs +35 -0
  38. package/addon/components/tracking-page/public-view.hbs +60 -0
  39. package/addon/components/tracking-page/settings-preview.hbs +21 -0
  40. package/addon/components/tracking-page/settings-preview.js +23 -0
  41. package/addon/components/tracking-page/verify-panel.hbs +109 -0
  42. package/addon/components/tracking-page.hbs +142 -0
  43. package/addon/components/tracking-page.js +564 -0
  44. package/addon/components/trailer/form.hbs +2 -2
  45. package/addon/components/vehicle/form.hbs +3 -3
  46. package/addon/components/warranty/form.hbs +2 -2
  47. package/addon/components/widget/live-fleet.js +54 -6
  48. package/addon/components/widget/proof-of-delivery.hbs +49 -0
  49. package/addon/components/widget/proof-of-delivery.js +62 -0
  50. package/addon/components/work-order/form.hbs +3 -3
  51. package/addon/controllers/analytics/reports/index.js +10 -1
  52. package/addon/controllers/connectivity/devices/index/details.js +1 -0
  53. package/addon/controllers/connectivity/devices/index.js +8 -2
  54. package/addon/controllers/connectivity/events/index.js +31 -1
  55. package/addon/controllers/connectivity/sensors/index/details.js +1 -1
  56. package/addon/controllers/connectivity/sensors/index.js +37 -1
  57. package/addon/controllers/maintenance/equipment/index/details.js +2 -2
  58. package/addon/controllers/maintenance/equipment/index.js +28 -9
  59. package/addon/controllers/maintenance/inspection-forms/index.js +32 -12
  60. package/addon/controllers/maintenance/inspection-submissions/index/details.js +2 -1
  61. package/addon/controllers/maintenance/inspection-submissions/index.js +49 -9
  62. package/addon/controllers/maintenance/maintenances/index/details.js +2 -0
  63. package/addon/controllers/maintenance/maintenances/index.js +20 -1
  64. package/addon/controllers/maintenance/parts/index/details.js +2 -2
  65. package/addon/controllers/maintenance/parts/index.js +28 -8
  66. package/addon/controllers/maintenance/schedules/index.js +33 -4
  67. package/addon/controllers/maintenance/work-orders/index/details.js +3 -3
  68. package/addon/controllers/maintenance/work-orders/index.js +39 -8
  69. package/addon/controllers/management/contacts/customers.js +13 -0
  70. package/addon/controllers/management/contacts/index.js +43 -1
  71. package/addon/controllers/management/drivers/index/details.js +1 -0
  72. package/addon/controllers/management/drivers/index.js +32 -2
  73. package/addon/controllers/management/fleets/index/details.js +1 -0
  74. package/addon/controllers/management/fleets/index.js +39 -1
  75. package/addon/controllers/management/fuel-reports/index.js +22 -2
  76. package/addon/controllers/management/fuel-transactions/index.js +43 -7
  77. package/addon/controllers/management/issues/index/details.js +1 -0
  78. package/addon/controllers/management/issues/index.js +22 -2
  79. package/addon/controllers/management/places/index.js +36 -1
  80. package/addon/controllers/management/trailers/index/details.js +1 -0
  81. package/addon/controllers/management/trailers/index.js +50 -2
  82. package/addon/controllers/management/vehicles/index/details.js +1 -0
  83. package/addon/controllers/management/vehicles/index.js +33 -2
  84. package/addon/controllers/management/vendors/index.js +26 -2
  85. package/addon/controllers/operations/orders/index/details.js +50 -7
  86. package/addon/controllers/operations/orders/index.js +59 -4
  87. package/addon/controllers/operations/scheduler/index.js +45 -14
  88. package/addon/controllers/operations/service-rates/index.js +15 -1
  89. package/addon/controllers/settings/index.js +6 -0
  90. package/addon/controllers/settings/map.js +75 -0
  91. package/addon/controllers/settings/orchestrator.js +8 -6
  92. package/addon/controllers/settings/tracking-page.js +212 -0
  93. package/addon/extension.js +97 -1
  94. package/addon/helpers/parcel-box-image.js +16 -0
  95. package/addon/routes/operations/orders/index/details.js +1 -0
  96. package/addon/routes/operations/orders/index/new.js +5 -4
  97. package/addon/routes/operations/scheduler/index.js +1 -1
  98. package/addon/routes/settings/tracking-page.js +31 -0
  99. package/addon/routes.js +1 -0
  100. package/addon/services/contact-actions.js +1 -0
  101. package/addon/services/customer-actions.js +2 -1
  102. package/addon/services/device-actions.js +1 -0
  103. package/addon/services/device-event-actions.js +1 -0
  104. package/addon/services/driver-actions.js +4 -13
  105. package/addon/services/equipment-actions.js +1 -0
  106. package/addon/services/fleet-actions.js +1 -0
  107. package/addon/services/fuel-report-actions.js +1 -0
  108. package/addon/services/inspection-form-actions.js +1 -0
  109. package/addon/services/inspection-submission-actions.js +1 -0
  110. package/addon/services/integrated-vendor-actions.js +1 -0
  111. package/addon/services/issue-actions.js +1 -0
  112. package/addon/services/location.js +69 -21
  113. package/addon/services/maintenance-actions.js +1 -0
  114. package/addon/services/maintenance-schedule-actions.js +2 -1
  115. package/addon/services/map-settings.js +28 -0
  116. package/addon/services/order-actions.js +7 -0
  117. package/addon/services/order-allocation.js +1 -1
  118. package/addon/services/order-presentation.js +129 -0
  119. package/addon/services/part-actions.js +1 -0
  120. package/addon/services/place-actions.js +1 -0
  121. package/addon/services/sensor-actions.js +1 -0
  122. package/addon/services/service-area-actions.js +1 -0
  123. package/addon/services/service-rate-actions.js +1 -0
  124. package/addon/services/telematic-actions.js +1 -0
  125. package/addon/services/trailer-actions.js +4 -14
  126. package/addon/services/vehicle-actions.js +4 -13
  127. package/addon/services/vendor-actions.js +1 -0
  128. package/addon/services/work-order-actions.js +1 -0
  129. package/addon/services/zone-actions.js +1 -0
  130. package/addon/styles/fleetops-engine.css +1391 -0
  131. package/addon/templates/analytics/reports/index/details.hbs +1 -0
  132. package/addon/templates/analytics/reports/index.hbs +1 -0
  133. package/addon/templates/connectivity/devices/index/details.hbs +1 -0
  134. package/addon/templates/connectivity/devices/index.hbs +1 -0
  135. package/addon/templates/connectivity/events/index.hbs +1 -0
  136. package/addon/templates/connectivity/sensors/index/details.hbs +1 -0
  137. package/addon/templates/connectivity/sensors/index.hbs +1 -0
  138. package/addon/templates/maintenance/equipment/index/details.hbs +1 -0
  139. package/addon/templates/maintenance/equipment/index.hbs +2 -0
  140. package/addon/templates/maintenance/inspection-forms/index/details.hbs +1 -0
  141. package/addon/templates/maintenance/inspection-forms/index.hbs +1 -0
  142. package/addon/templates/maintenance/inspection-submissions/index/details.hbs +1 -0
  143. package/addon/templates/maintenance/inspection-submissions/index.hbs +1 -0
  144. package/addon/templates/maintenance/maintenances/index/details.hbs +1 -0
  145. package/addon/templates/maintenance/maintenances/index.hbs +1 -0
  146. package/addon/templates/maintenance/parts/index/details.hbs +1 -0
  147. package/addon/templates/maintenance/parts/index.hbs +2 -0
  148. package/addon/templates/maintenance/schedules/index/details.hbs +1 -0
  149. package/addon/templates/maintenance/schedules/index.hbs +2 -0
  150. package/addon/templates/maintenance/work-orders/index/details.hbs +1 -0
  151. package/addon/templates/maintenance/work-orders/index.hbs +1 -0
  152. package/addon/templates/management/contacts/customers/details.hbs +1 -0
  153. package/addon/templates/management/contacts/customers.hbs +1 -0
  154. package/addon/templates/management/contacts/index/details.hbs +1 -0
  155. package/addon/templates/management/contacts/index.hbs +1 -0
  156. package/addon/templates/management/contacts.hbs +1 -0
  157. package/addon/templates/management/drivers/index/details.hbs +1 -0
  158. package/addon/templates/management/drivers/index.hbs +2 -0
  159. package/addon/templates/management/fleets/index/details.hbs +1 -0
  160. package/addon/templates/management/fleets/index.hbs +1 -0
  161. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  162. package/addon/templates/management/fuel-reports/index.hbs +1 -0
  163. package/addon/templates/management/fuel-transactions/index.hbs +1 -0
  164. package/addon/templates/management/issues/index/details.hbs +1 -0
  165. package/addon/templates/management/issues/index.hbs +1 -0
  166. package/addon/templates/management/places/index/details.hbs +1 -0
  167. package/addon/templates/management/places/index.hbs +1 -0
  168. package/addon/templates/management/trailers/index/details.hbs +1 -0
  169. package/addon/templates/management/trailers/index.hbs +2 -0
  170. package/addon/templates/management/vehicles/index/details.hbs +1 -0
  171. package/addon/templates/management/vehicles/index.hbs +2 -0
  172. package/addon/templates/management/vendors/index/details.hbs +1 -0
  173. package/addon/templates/management/vendors/index.hbs +2 -0
  174. package/addon/templates/management/vendors/integrated.hbs +1 -0
  175. package/addon/templates/operations/orders/index/details.hbs +1 -0
  176. package/addon/templates/operations/orders/index.hbs +1 -0
  177. package/addon/templates/operations/service-rates/index/details.hbs +1 -0
  178. package/addon/templates/operations/service-rates/index.hbs +1 -0
  179. package/addon/templates/settings/map.hbs +46 -0
  180. package/addon/templates/settings/tracking-page.hbs +318 -0
  181. package/addon/utils/identity-cell-resource.js +2 -56
  182. package/addon/utils/map-default-view.js +132 -0
  183. package/addon/utils/normalize-order-config-flow.js +6 -1
  184. package/addon/utils/placeholder-images.js +4 -69
  185. package/addon/utils/resource-descriptors/assets.js +2 -57
  186. package/addon/utils/resource-descriptors/helpers.js +23 -122
  187. package/addon/utils/resource-descriptors/operations.js +2 -61
  188. package/addon/utils/resource-descriptors/people.js +3 -142
  189. package/addon/utils/resource-descriptors/shared.js +18 -0
  190. package/addon/utils/tracking-live-source.js +123 -0
  191. package/addon/utils/tracking-page-theme.js +123 -0
  192. package/app/components/admin/tracking-page-settings.js +1 -0
  193. package/app/components/tracking-page/full-view.js +1 -0
  194. package/app/components/tracking-page/locale-selector.js +1 -0
  195. package/app/components/tracking-page/map.js +1 -0
  196. package/app/components/tracking-page/order-list.js +1 -0
  197. package/app/components/tracking-page/public-view.js +1 -0
  198. package/app/components/tracking-page/settings-preview.js +1 -0
  199. package/app/components/tracking-page/verify-panel.js +1 -0
  200. package/app/components/tracking-page.js +1 -0
  201. package/app/components/widget/proof-of-delivery.js +1 -0
  202. package/app/controllers/settings/tracking-page.js +1 -0
  203. package/app/helpers/parcel-box-image.js +1 -0
  204. package/app/routes/settings/tracking-page.js +1 -0
  205. package/app/services/order-presentation.js +1 -0
  206. package/app/templates/settings/tracking-page.js +1 -0
  207. package/app/utils/map-default-view.js +1 -0
  208. package/app/utils/tracking-live-source.js +1 -0
  209. package/app/utils/tracking-page-theme.js +1 -0
  210. package/composer.json +2 -2
  211. package/extension.json +1 -1
  212. package/package.json +4 -4
  213. package/scripts/pest-bootstrap.php +4 -0
  214. package/server/config/fleetops.php +4 -0
  215. package/server/migrations/2026_10_08_000001_create_tracking_sessions_tables.php +51 -0
  216. package/server/migrations/2026_10_10_000001_add_trashed_index_to_device_events.php +40 -0
  217. package/server/migrations/2026_10_10_000002_add_trashed_index_to_positions.php +40 -0
  218. package/server/migrations/2026_10_12_000001_add_deleted_at_to_tracking_sessions_tables.php +32 -0
  219. package/server/resources/views/labels/default.php +2 -2
  220. package/server/resources/views/labels/entity-label.php +2 -2
  221. package/server/resources/views/labels/waypoint-label.php +2 -2
  222. package/server/src/Auth/Schemas/FleetOps.php +5 -0
  223. package/server/src/Console/Commands/ProcessOperationalAlerts.php +1 -0
  224. package/server/src/Console/Commands/PruneTelematicsData.php +101 -26
  225. package/server/src/Events/OrderChanged.php +257 -0
  226. package/server/src/Events/OrderDriverUnassigned.php +68 -0
  227. package/server/src/Exceptions/OrderEditLockedException.php +32 -0
  228. package/server/src/Expansions/CompanyExpansion.php +3 -2
  229. package/server/src/Expansions/UserExpansion.php +12 -10
  230. package/server/src/Http/Controllers/Api/v1/CustomerController.php +108 -18
  231. package/server/src/Http/Controllers/Api/v1/DriverController.php +95 -10
  232. package/server/src/Http/Controllers/Api/v1/EntityController.php +66 -0
  233. package/server/src/Http/Controllers/Api/v1/FleetController.php +10 -4
  234. package/server/src/Http/Controllers/Api/v1/OrderController.php +139 -36
  235. package/server/src/Http/Controllers/Api/v1/PayloadController.php +76 -8
  236. package/server/src/Http/Controllers/Api/v1/PlaceController.php +3 -3
  237. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +6 -32
  238. package/server/src/Http/Controllers/Api/v1/VehicleController.php +5 -0
  239. package/server/src/Http/Controllers/Internal/v1/ContactController.php +3 -0
  240. package/server/src/Http/Controllers/Internal/v1/DriverController.php +10 -0
  241. package/server/src/Http/Controllers/Internal/v1/FleetController.php +16 -2
  242. package/server/src/Http/Controllers/Internal/v1/InspectionSubmissionController.php +13 -8
  243. package/server/src/Http/Controllers/Internal/v1/IssueController.php +2 -0
  244. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +4 -2
  245. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +93 -11
  246. package/server/src/Http/Controllers/Internal/v1/OrderController.php +118 -28
  247. package/server/src/Http/Controllers/Internal/v1/PositionController.php +22 -0
  248. package/server/src/Http/Controllers/Internal/v1/ProofController.php +55 -4
  249. package/server/src/Http/Controllers/Internal/v1/SettingController.php +303 -10
  250. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +1 -0
  251. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +1 -0
  252. package/server/src/Http/Controllers/Public/TrackingController.php +518 -0
  253. package/server/src/Http/Filter/ContactFilter.php +1 -1
  254. package/server/src/Http/Filter/InspectionFormFilter.php +23 -0
  255. package/server/src/Http/Filter/InspectionSubmissionFilter.php +23 -0
  256. package/server/src/Http/Filter/MaintenanceFilter.php +23 -0
  257. package/server/src/Http/Filter/OrderFilter.php +39 -4
  258. package/server/src/Http/Filter/ProofFilter.php +18 -0
  259. package/server/src/Http/Filter/RouteFilter.php +18 -0
  260. package/server/src/Http/Filter/TelematicFilter.php +23 -0
  261. package/server/src/Http/Filter/WarrantyFilter.php +23 -0
  262. package/server/src/Http/Requests/CancelOrderRequest.php +2 -1
  263. package/server/src/Http/Resources/v1/Concerns/ResolvesPublicRelationFields.php +14 -1
  264. package/server/src/Http/Resources/v1/Index/Customer.php +18 -0
  265. package/server/src/Http/Resources/v1/Index/Order.php +11 -2
  266. package/server/src/Http/Resources/v1/PublicOrderTracking.php +153 -0
  267. package/server/src/Http/Resources/v1/TrackingNumber.php +8 -34
  268. package/server/src/Http/Resources/v1/Zone.php +31 -23
  269. package/server/src/Jobs/FinalizeApiOrderCreation.php +3 -1
  270. package/server/src/Jobs/ProcessAllocationJob.php +16 -6
  271. package/server/src/Jobs/PublishTrackingUpdate.php +50 -0
  272. package/server/src/Listeners/HandleGeofenceEntered.php +31 -15
  273. package/server/src/Listeners/HandleOrderCanceled.php +9 -1
  274. package/server/src/Listeners/HandleUserRemovedFromCompany.php +2 -1
  275. package/server/src/Listeners/PublishTrackingUpdates.php +27 -0
  276. package/server/src/Mail/CustomerCredentialsMail.php +4 -2
  277. package/server/src/Models/AssetConnection.php +3 -0
  278. package/server/src/Models/Contact.php +3 -0
  279. package/server/src/Models/Device.php +28 -0
  280. package/server/src/Models/DeviceEvent.php +7 -0
  281. package/server/src/Models/Driver.php +20 -7
  282. package/server/src/Models/Entity.php +12 -4
  283. package/server/src/Models/Fleet.php +11 -32
  284. package/server/src/Models/FleetDriver.php +3 -0
  285. package/server/src/Models/FleetVehicle.php +3 -0
  286. package/server/src/Models/FuelReport.php +5 -13
  287. package/server/src/Models/Issue.php +4 -16
  288. package/server/src/Models/Order.php +234 -11
  289. package/server/src/Models/OrderConfig.php +129 -0
  290. package/server/src/Models/Payload.php +227 -35
  291. package/server/src/Models/Place.php +7 -1
  292. package/server/src/Models/ServiceArea.php +7 -0
  293. package/server/src/Models/ServiceRate.php +7 -17
  294. package/server/src/Models/TrackingNumber.php +109 -6
  295. package/server/src/Models/TrackingSession.php +33 -0
  296. package/server/src/Models/TrackingSessionGrant.php +22 -0
  297. package/server/src/Models/TrackingStatus.php +6 -0
  298. package/server/src/Models/Vehicle.php +21 -2
  299. package/server/src/Models/Vendor.php +7 -0
  300. package/server/src/Models/Waypoint.php +13 -4
  301. package/server/src/Notifications/OrderAssigned.php +2 -1
  302. package/server/src/Notifications/OrderCanceled.php +7 -1
  303. package/server/src/Notifications/OrderChanged.php +87 -0
  304. package/server/src/Notifications/OrderCompleted.php +2 -1
  305. package/server/src/Notifications/OrderDispatchFailed.php +2 -1
  306. package/server/src/Notifications/OrderDispatched.php +2 -1
  307. package/server/src/Notifications/OrderFailed.php +2 -1
  308. package/server/src/Notifications/OrderUnassigned.php +66 -0
  309. package/server/src/Notifications/WaypointCompleted.php +2 -1
  310. package/server/src/Observers/CompanyUserObserver.php +8 -7
  311. package/server/src/Observers/DriverObserver.php +6 -1
  312. package/server/src/Observers/OrderObserver.php +141 -1
  313. package/server/src/Observers/TrackingNumberObserver.php +18 -6
  314. package/server/src/Observers/UserObserver.php +2 -1
  315. package/server/src/Observers/VehicleObserver.php +8 -3
  316. package/server/src/Orchestration/Engines/RouteSequencingEngine.php +21 -3
  317. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +38 -8
  318. package/server/src/Orchestration/OrchestrationEngineRegistry.php +61 -1
  319. package/server/src/Orchestration/Support/OrchestratorSettings.php +61 -0
  320. package/server/src/Orchestration/Support/RouteMetrics.php +165 -0
  321. package/server/src/Providers/EventServiceProvider.php +11 -0
  322. package/server/src/Providers/FleetOpsServiceProvider.php +13 -0
  323. package/server/src/Support/ApiCacheThrottle.php +76 -0
  324. package/server/src/Support/LiveOrderQuery.php +3 -1
  325. package/server/src/Support/OrderEdit.php +365 -0
  326. package/server/src/Support/OrderEditPolicy.php +292 -0
  327. package/server/src/Support/ProfileAccountManager.php +54 -1
  328. package/server/src/Support/ResolvesOrderServiceStops.php +5 -0
  329. package/server/src/Support/SocketChannels.php +346 -0
  330. package/server/src/Support/Telematics/TelematicService.php +7 -2
  331. package/server/src/Support/Telematics/Telemetry/Inbox.php +8 -1
  332. package/server/src/Support/TrackingChannel.php +55 -0
  333. package/server/src/Support/TrackingCode.php +242 -0
  334. package/server/src/Support/TrackingPage/TrackingAccess.php +356 -0
  335. package/server/src/Support/TrackingPage/TrackingPageConfig.php +264 -0
  336. package/server/src/Support/TrackingPage/TrackingRecipient.php +111 -0
  337. package/server/src/Support/TrackingPage/TrackingResolver.php +201 -0
  338. package/server/src/Support/TrackingPage/TrackingTarget.php +40 -0
  339. package/server/src/Support/TrackingPage/TrackingView.php +543 -0
  340. package/server/src/Support/TrackingPublisher.php +261 -0
  341. package/server/src/Support/TrackingScope.php +182 -0
  342. package/server/src/Support/TrackingUpdate.php +402 -0
  343. package/server/src/Support/Utils.php +15 -3
  344. package/server/src/Traits/HasTrackingNumber.php +2 -0
  345. package/server/src/routes.php +39 -7
  346. package/server/tests/ApiCustomerControllerContractsTest.php +54 -7
  347. package/server/tests/ApiDriverPasswordContractsTest.php +25 -21
  348. package/server/tests/ApiEntityControllerContractsTest.php +84 -0
  349. package/server/tests/ApiOrderControllerContractsTest.php +245 -0
  350. package/server/tests/ApiPayloadControllerContractsTest.php +121 -0
  351. package/server/tests/ApiPlaceControllerContractsTest.php +1 -1
  352. package/server/tests/ApiTrackingNumberControllerContractsTest.php +6 -9
  353. package/server/tests/CompactResourceSerializationTest.php +23 -59
  354. package/server/tests/ControllerFilterContractsTest.php +1 -1
  355. package/server/tests/CustomerContactIdentitySafetyTest.php +1 -1
  356. package/server/tests/EventContractsTest.php +26 -60
  357. package/server/tests/ExpansionContractsTest.php +15 -2
  358. package/server/tests/Feature/Http/Api/CustomerControllerHelperSeamsTest.php +29 -3
  359. package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +23 -0
  360. package/server/tests/Feature/Http/Api/OrderControllerNearbyFiltersTest.php +16 -16
  361. package/server/tests/Feature/Http/Api/OrderControllerQueryFiltersTest.php +41 -14
  362. package/server/tests/Feature/Http/Api/TrackingNumberControllerHelpersTest.php +57 -22
  363. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +23 -9
  364. package/server/tests/Feature/Http/Internal/OrchestrationControllerContractsTest.php +171 -1
  365. package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +72 -0
  366. package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +110 -14
  367. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +26 -0
  368. package/server/tests/Feature/Http/Internal/OrderControllerHelpersTest.php +7 -5
  369. package/server/tests/Feature/Http/Internal/PositionControllerReplayChannelTest.php +135 -0
  370. package/server/tests/Feature/Http/Internal/ProofControllerContractsTest.php +3 -3
  371. package/server/tests/Feature/Http/Internal/ProofControllerRecentTest.php +170 -0
  372. package/server/tests/Feature/Http/Public/TrackingControllerTest.php +495 -0
  373. package/server/tests/IndexCustomerPhotoTest.php +151 -0
  374. package/server/tests/ModelAccessorContractsTest.php +4 -3
  375. package/server/tests/NotificationAndMailContractsTest.php +5 -8
  376. package/server/tests/ObserverContractsTest.php +72 -10
  377. package/server/tests/OrderActivityFlowRegressionTest.php +3 -2
  378. package/server/tests/OrderConfigLifecycleTest.php +120 -0
  379. package/server/tests/OrderFilterExecutionTest.php +167 -2
  380. package/server/tests/ProcessAllocationJobContractsTest.php +20 -0
  381. package/server/tests/PublicOrderTrackingResourceTest.php +221 -0
  382. package/server/tests/QueueJobContractsTest.php +2 -1
  383. package/server/tests/RequestContractsTest.php +1 -1
  384. package/server/tests/RouteRegistrationExecutionTest.php +26 -0
  385. package/server/tests/RouteSequencingEngineTest.php +17 -0
  386. package/server/tests/SettingControllerContractsTest.php +110 -0
  387. package/server/tests/Support/TrackingPageDatabase.php +200 -0
  388. package/server/tests/TenantScopingTest.php +206 -0
  389. package/server/tests/TrackingPageSettingsTest.php +343 -0
  390. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +51 -0
  391. package/server/tests/Unit/Events/OrderDispatchFailedTest.php +2 -1
  392. package/server/tests/Unit/Http/Filter/ContactFilterAddressTest.php +61 -0
  393. package/server/tests/Unit/Http/Resources/IndexOrderResourceTest.php +30 -0
  394. package/server/tests/Unit/Jobs/FinalizeApiOrderCreationDispatchGuardTest.php +266 -0
  395. package/server/tests/Unit/Listeners/HandleGeofenceEnteredTest.php +182 -22
  396. package/server/tests/Unit/Listeners/HandleUserRemovedFromCompanyTest.php +5 -0
  397. package/server/tests/Unit/Models/DriverAssignVehicleTest.php +81 -0
  398. package/server/tests/Unit/Models/FleetTest.php +4 -3
  399. package/server/tests/Unit/Models/OrderCancelReasonTest.php +143 -0
  400. package/server/tests/Unit/Models/OrderPayloadConfigAndDistanceTest.php +60 -0
  401. package/server/tests/Unit/Models/OrderPayloadRouteTest.php +4 -2
  402. package/server/tests/Unit/Models/PayloadTest.php +18 -4
  403. package/server/tests/Unit/Models/ServiceRatePersistenceAndServicabilityTest.php +2 -2
  404. package/server/tests/Unit/Models/TrackingNumberTest.php +67 -6
  405. package/server/tests/Unit/Models/VehicleTest.php +16 -2
  406. package/server/tests/Unit/Models/WaypointTest.php +4 -3
  407. package/server/tests/Unit/Notifications/OrderChangeNotificationsTest.php +59 -0
  408. package/server/tests/Unit/Notifications/TerminalOrderNotificationsTest.php +3 -3
  409. package/server/tests/Unit/Observers/DriverDeletionCleanupTest.php +158 -0
  410. package/server/tests/Unit/Observers/FleetOpsCompanyUserAndServiceAreaObserversTest.php +20 -0
  411. package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +3 -3
  412. package/server/tests/Unit/Observers/OrderAssignmentObserverTest.php +100 -0
  413. package/server/tests/Unit/Observers/OrderDeleteCascadeTest.php +213 -0
  414. package/server/tests/Unit/Observers/VehicleObserverDeleteTest.php +67 -0
  415. package/server/tests/Unit/Orchestration/EngineSelectionAndRouteMetricsTest.php +336 -0
  416. package/server/tests/Unit/Orchestration/Engines/VroomOrchestrationEngineLifecycleTest.php +8 -1
  417. package/server/tests/Unit/Support/ApiCacheDependenciesTest.php +347 -0
  418. package/server/tests/Unit/Support/OrderEditPolicyTest.php +156 -0
  419. package/server/tests/Unit/Support/OrderOperationsTest.php +514 -0
  420. package/server/tests/Unit/Support/OsrmProofAndIssueFilterTest.php +4 -3
  421. package/server/tests/Unit/Support/ProfileAccountManagerTest.php +141 -0
  422. package/server/tests/Unit/Support/QuerySeamsTest.php +5 -1
  423. package/server/tests/Unit/Support/SocketChannelsTest.php +396 -0
  424. package/server/tests/Unit/Support/TrackingChannelTest.php +232 -0
  425. package/server/tests/Unit/Support/TrackingCodeTest.php +186 -0
  426. package/server/tests/Unit/Support/TrackingPage/TrackingAccessTest.php +200 -0
  427. package/server/tests/Unit/Support/TrackingPage/TrackingRecipientTest.php +51 -0
  428. package/server/tests/Unit/Support/TrackingPage/TrackingResolverTest.php +181 -0
  429. package/server/tests/Unit/Support/TrackingPage/TrackingViewTest.php +479 -0
  430. package/server/tests/Unit/Support/TrackingPublisherTest.php +425 -0
  431. package/server/tests/Unit/Support/TrackingUpdateTest.php +363 -0
  432. package/server/tests/Unit/Support/UtilsAdditionalTest.php +9 -0
  433. package/server/tests/Unit/Support/UtilsGeoMatrixAndVendorTest.php +25 -0
  434. package/server/tests/VehicleResourceContractsTest.php +46 -0
  435. package/server/tests/VroomOrchestrationEngineTest.php +34 -1
  436. package/server/tests/ZoneGeofenceSettingsResourceTest.php +121 -0
  437. package/translations/ar-ae.yml +274 -0
  438. package/translations/bg-bg.yaml +274 -0
  439. package/translations/en-us.yaml +347 -0
  440. package/translations/es-pa.yaml +274 -0
  441. package/translations/fr-fr.yaml +274 -0
  442. package/translations/mn-mn.yaml +274 -0
  443. package/translations/pt-br.yaml +274 -0
  444. package/translations/ru-ru.yaml +276 -2
  445. package/translations/uk-ua.yaml +275 -1
  446. package/translations/vi-vn.yaml +274 -0
  447. package/addon/components/cell/contact-identity.hbs +0 -1
  448. package/addon/components/cell/customer-identity.hbs +0 -1
  449. package/addon/components/cell/driver-identity.hbs +0 -1
  450. package/addon/components/cell/fleet-identity.hbs +0 -1
  451. package/addon/components/cell/order-identity.hbs +0 -1
  452. package/addon/components/cell/place-identity.hbs +0 -1
  453. package/addon/components/cell/vehicle-identity.hbs +0 -1
  454. package/addon/components/cell/vendor-identity.hbs +0 -1
  455. package/addon/components/contact/pill.hbs +0 -24
  456. package/addon/components/contact/summary.hbs +0 -1
  457. package/addon/components/customer/pill.hbs +0 -24
  458. package/addon/components/customer/summary.hbs +0 -1
  459. package/addon/components/driver/pill.hbs +0 -24
  460. package/addon/components/driver/summary.hbs +0 -1
  461. package/addon/components/fleet/pill.hbs +0 -24
  462. package/addon/components/fleet/summary.hbs +0 -1
  463. package/addon/components/order/pill.hbs +0 -24
  464. package/addon/components/order/summary.hbs +0 -1
  465. package/addon/components/place/pill.hbs +0 -24
  466. package/addon/components/place/summary.hbs +0 -1
  467. package/addon/components/select-option/contact.hbs +0 -12
  468. package/addon/components/select-option/customer.hbs +0 -12
  469. package/addon/components/select-option/driver.hbs +0 -12
  470. package/addon/components/select-option/fleet.hbs +0 -12
  471. package/addon/components/select-option/order.hbs +0 -12
  472. package/addon/components/select-option/place.hbs +0 -12
  473. package/addon/components/select-option/vehicle.hbs +0 -12
  474. package/addon/components/select-option/vendor.hbs +0 -12
  475. package/addon/components/vehicle/pill.hbs +0 -24
  476. package/addon/components/vehicle/summary.hbs +0 -1
  477. package/addon/components/vendor/pill.hbs +0 -24
  478. package/addon/components/vendor/summary.hbs +0 -1
  479. package/app/components/cell/contact-identity.js +0 -1
  480. package/app/components/cell/customer-identity.js +0 -1
  481. package/app/components/cell/driver-identity.js +0 -1
  482. package/app/components/cell/fleet-identity.js +0 -1
  483. package/app/components/cell/order-identity.js +0 -1
  484. package/app/components/cell/place-identity.js +0 -1
  485. package/app/components/cell/vehicle-identity.js +0 -1
  486. package/app/components/cell/vendor-identity.js +0 -1
  487. package/app/components/contact/pill.js +0 -1
  488. package/app/components/contact/summary.js +0 -1
  489. package/app/components/customer/pill.js +0 -1
  490. package/app/components/customer/summary.js +0 -1
  491. package/app/components/driver/pill.js +0 -1
  492. package/app/components/driver/summary.js +0 -1
  493. package/app/components/fleet/pill.js +0 -1
  494. package/app/components/fleet/summary.js +0 -1
  495. package/app/components/order/pill.js +0 -1
  496. package/app/components/order/summary.js +0 -1
  497. package/app/components/place/pill.js +0 -1
  498. package/app/components/place/summary.js +0 -1
  499. package/app/components/select-option/contact.js +0 -1
  500. package/app/components/select-option/customer.js +0 -1
  501. package/app/components/select-option/driver.js +0 -1
  502. package/app/components/select-option/fleet.js +0 -1
  503. package/app/components/select-option/order.js +0 -1
  504. package/app/components/select-option/place.js +0 -1
  505. package/app/components/select-option/vehicle.js +0 -1
  506. package/app/components/select-option/vendor.js +0 -1
  507. package/app/components/vehicle/pill.js +0 -1
  508. package/app/components/vehicle/summary.js +0 -1
  509. package/app/components/vendor/pill.js +0 -1
  510. package/app/components/vendor/summary.js +0 -1
@@ -9,6 +9,7 @@ import { renderCompleted, waitForInsertedAndSized } from '@fleetbase/ember-ui/ut
9
9
  import LeafletTrackingMarkerComponent from '../leaflet-tracking-marker';
10
10
  import ensureLeafletDrawEditNamespace from '../../utils/leaflet-draw-namespace-guard';
11
11
  import { DEFAULT_LEAFLET_TILE_ATTRIBUTION } from '../../utils/leaflet-tile-url';
12
+ import { FIT_VEHICLES_MAX_ZOOM, positionedBounds } from '../../utils/map-default-view';
12
13
 
13
14
  const DEFAULT_CENTER = [1.31, 103.85];
14
15
  const DEFAULT_ZOOM = 11;
@@ -56,6 +57,8 @@ export default class WidgetLiveFleetComponent extends Component {
56
57
  #map = null;
57
58
  #mapSetPromise = null;
58
59
  #resolveMapSet = null;
60
+ /** Fit to the vehicles only on the first load, never on the periodic reconcile. */
61
+ #fittedToVehicles = false;
59
62
 
60
63
  constructor() {
61
64
  super(...arguments);
@@ -152,15 +155,57 @@ export default class WidgetLiveFleetComponent extends Component {
152
155
  return this.drivers.length + this.vehicles.length;
153
156
  }
154
157
 
155
- /** Center on the first available marker (driver, then vehicle), else default. */
156
- get center() {
158
+ /**
159
+ * Bounds around the positioned vehicles when the company chose "Fit to my
160
+ * vehicles" (Settings > Map), else null.
161
+ */
162
+ get vehicleBounds() {
163
+ if (!this.mapSettings.fitMapToVehicles) return null;
164
+ return positionedBounds(this.vehicles.map((vehicle) => ({ location: [vehicle.lat, vehicle.lng] })));
165
+ }
166
+
167
+ /**
168
+ * Where the map opens, in order: the positioned vehicles (when fitting is
169
+ * on), the company's default centre, the first positioned marker, the
170
+ * centre of the company's country, the hardcoded default.
171
+ */
172
+ get initialView() {
173
+ const bounds = this.vehicleBounds;
174
+ if (bounds) {
175
+ const [[south, west], [north, east]] = bounds;
176
+ return { center: [(south + north) / 2, (west + east) / 2], zoom: DEFAULT_ZOOM, bounds };
177
+ }
178
+
179
+ const defaultCenter = this.mapSettings.defaultMapCenter;
180
+ if (defaultCenter) return { center: [defaultCenter.latitude, defaultCenter.longitude], zoom: defaultCenter.zoom };
181
+
157
182
  const first = this.drivers[0] ?? this.vehicles[0];
158
- if (first?.lat && first?.lng) return [first.lat, first.lng];
159
- return DEFAULT_CENTER;
183
+ if (first?.lat && first?.lng) return { center: [first.lat, first.lng], zoom: DEFAULT_ZOOM };
184
+
185
+ const countryCenter = this.mapSettings.companyCountryCenter;
186
+ if (countryCenter) return { center: [countryCenter.latitude, countryCenter.longitude], zoom: countryCenter.zoom };
187
+
188
+ return { center: DEFAULT_CENTER, zoom: DEFAULT_ZOOM };
189
+ }
190
+
191
+ get center() {
192
+ return this.initialView.center;
160
193
  }
161
194
 
162
195
  get zoom() {
163
- return DEFAULT_ZOOM;
196
+ return this.initialView.zoom;
197
+ }
198
+
199
+ /** Frame the positioned vehicles once, after the first data load. */
200
+ fitToVehicles(map) {
201
+ if (this.#fittedToVehicles) return false;
202
+
203
+ const bounds = this.vehicleBounds;
204
+ if (!bounds || typeof map?.fitBounds !== 'function') return false;
205
+
206
+ map.fitBounds(bounds, { padding: [30, 30], maxZoom: FIT_VEHICLES_MAX_ZOOM });
207
+ this.#fittedToVehicles = true;
208
+ return true;
164
209
  }
165
210
 
166
211
  statusColor(status) {
@@ -182,9 +227,12 @@ export default class WidgetLiveFleetComponent extends Component {
182
227
  // container before we add markers. Without this, markers added to a
183
228
  // not-yet-sized map silently no-op (the data arrives, count chip ticks
184
229
  // up, but nothing paints).
185
- yield this.ensureInteractive();
230
+ const map = yield this.ensureInteractive();
186
231
  this.data = yield this.fetch.get('fleet-ops/analytics/live-fleet');
187
232
  this.error = null;
233
+ // The fit choice lives in the company's map settings, loaded in the constructor.
234
+ yield this.mapSettings.load();
235
+ this.fitToVehicles(map);
188
236
  } catch (e) {
189
237
  this.error = e?.message ?? 'Failed to load live fleet';
190
238
  }
@@ -0,0 +1,49 @@
1
+ <div class="fleet-ops-widget fleet-ops-proof-of-delivery flex flex-col h-full {{@class}}" data-test-proof-of-delivery-widget ...attributes>
2
+ <div class="flex items-center justify-between px-3 py-1.5 border dark:border-gray-700 border-gray-200 dark:bg-gray-800 bg-gray-50 rounded-t-md shadow-sm">
3
+ <span class="text-xs font-bold text-black dark:text-gray-100">{{t "widget.proof-of-delivery.title"}}</span>
4
+ <FaIcon @icon="camera" class="text-gray-400" />
5
+ </div>
6
+
7
+ <div class="flex-1 p-2 border border-t-0 dark:border-gray-700 border-gray-200 rounded-b-md bg-white dark:bg-gray-900 overflow-auto min-h-0">
8
+ {{#if this.load.isRunning}}
9
+ <div class="flex items-center justify-center h-full"><Spinner /></div>
10
+ {{else if this.error}}
11
+ <div class="flex items-center justify-center h-full text-xs text-red-500">{{this.error}}</div>
12
+ {{else if this.photos.length}}
13
+ <div class="grid grid-cols-3 gap-2">
14
+ {{#each this.photos as |proof|}}
15
+ <div class="min-w-0" data-test-proof-of-delivery-photo={{proof.id}}>
16
+ <button
17
+ type="button"
18
+ class="block w-full aspect-square rounded-md overflow-hidden border dark:border-gray-700 border-gray-200 bg-gray-100 dark:bg-gray-800 hover:opacity-90"
19
+ title={{or proof.remarks (t "widget.proof-of-delivery.open-photo")}}
20
+ aria-label={{t "widget.proof-of-delivery.open-photo"}}
21
+ {{on "click" (fn this.openPhoto proof)}}
22
+ >
23
+ <img src={{proof.url}} alt={{or proof.remarks (t "widget.proof-of-delivery.title")}} loading="lazy" class="w-full h-full object-cover" />
24
+ </button>
25
+ <div class="mt-0.5 leading-tight">
26
+ {{#if proof.order_id}}
27
+ <LinkTo
28
+ @route={{this.orderRoute}}
29
+ @model={{proof.order_id}}
30
+ class="block text-[10px] font-semibold text-blue-600 hover:text-blue-700 dark:text-blue-300 dark:hover:text-blue-200 truncate"
31
+ title={{proof.customer_name}}
32
+ data-test-proof-of-delivery-order
33
+ >{{proof.order_id}}</LinkTo>
34
+ {{/if}}
35
+ {{#if proof.timeAgo}}
36
+ <div class="text-[9px] text-gray-500 dark:text-gray-400 truncate">{{proof.timeAgo}}</div>
37
+ {{/if}}
38
+ </div>
39
+ </div>
40
+ {{/each}}
41
+ </div>
42
+ {{else}}
43
+ <div class="flex flex-col items-center justify-center h-full text-center text-gray-500 dark:text-gray-400" data-test-proof-of-delivery-empty>
44
+ <FaIcon @icon="camera" class="text-lg mb-1 text-gray-300 dark:text-gray-600" />
45
+ <div class="text-[11px]">{{t "widget.proof-of-delivery.empty"}}</div>
46
+ </div>
47
+ {{/if}}
48
+ </div>
49
+ </div>
@@ -0,0 +1,62 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+ import { inject as service } from '@ember/service';
5
+ import { getOwner } from '@ember/application';
6
+ import { task } from 'ember-concurrency';
7
+ import { formatDistanceToNowStrict, isValid } from 'date-fns';
8
+ import config from '../../config/environment';
9
+
10
+ /**
11
+ * The latest proof of delivery photos across the fleet, each linking to its order.
12
+ */
13
+ export default class WidgetProofOfDeliveryComponent extends Component {
14
+ static widgetId = 'fleet-ops-proof-of-delivery-widget';
15
+ static limit = 12;
16
+
17
+ @service fetch;
18
+
19
+ @tracked proofs = [];
20
+ @tracked error = null;
21
+
22
+ constructor() {
23
+ super(...arguments);
24
+ this.load.perform();
25
+ }
26
+
27
+ get photos() {
28
+ return (this.proofs ?? [])
29
+ .filter((proof) => proof?.url)
30
+ .map((proof) => ({
31
+ ...proof,
32
+ timeAgo: this.timeAgo(proof.captured_at),
33
+ }));
34
+ }
35
+
36
+ get orderRoute() {
37
+ // Dashboard widgets render under the host owner, outside the engine's routing context.
38
+ return getOwner(this).mountPoint ? 'operations.orders.index.details' : `${config.mountedEngineRoutePrefix}.operations.orders.index.details`;
39
+ }
40
+
41
+ timeAgo(capturedAt) {
42
+ const date = capturedAt ? new Date(capturedAt) : null;
43
+
44
+ return date && isValid(date) ? formatDistanceToNowStrict(date, { addSuffix: true }) : null;
45
+ }
46
+
47
+ @action openPhoto(proof) {
48
+ if (proof?.url) {
49
+ window.open(proof.url, '_blank', 'noopener,noreferrer');
50
+ }
51
+ }
52
+
53
+ @task({ restartable: true }) *load() {
54
+ this.error = null;
55
+ try {
56
+ const response = yield this.fetch.get('fleet-ops/proofs/recent', { limit: WidgetProofOfDeliveryComponent.limit });
57
+ this.proofs = response?.proofs ?? [];
58
+ } catch (err) {
59
+ this.error = err?.message ?? 'Failed to load';
60
+ }
61
+ }
62
+ }
@@ -175,7 +175,7 @@
175
175
  </div>
176
176
  <InputGroup @name="Opened At">
177
177
  <DatePicker
178
- @value={{or (format-date-fns @resource.opened_at "dd-MM-yyyy") null}}
178
+ @value={{or (format-date-fns @resource.opened_at "yyyy-MM-dd") null}}
179
179
  @onChange={{fn (mut @resource.opened_at)}}
180
180
  @placeholder="DD-MM-YYYY"
181
181
  class="filter-date-input w-full flex-1"
@@ -183,7 +183,7 @@
183
183
  </InputGroup>
184
184
  <InputGroup @name="Due At">
185
185
  <DatePicker
186
- @value={{or (format-date-fns @resource.due_at "dd-MM-yyyy") null}}
186
+ @value={{or (format-date-fns @resource.due_at "yyyy-MM-dd") null}}
187
187
  @onChange={{fn (mut @resource.due_at)}}
188
188
  @placeholder="DD-MM-YYYY"
189
189
  class="filter-date-input w-full flex-1"
@@ -191,7 +191,7 @@
191
191
  </InputGroup>
192
192
  <InputGroup @name="Closed At">
193
193
  <DatePicker
194
- @value={{or (format-date-fns @resource.closed_at "dd-MM-yyyy") null}}
194
+ @value={{or (format-date-fns @resource.closed_at "yyyy-MM-dd") null}}
195
195
  @onChange={{fn (mut @resource.closed_at)}}
196
196
  @placeholder="DD-MM-YYYY"
197
197
  class="filter-date-input w-full flex-1"
@@ -8,7 +8,7 @@ export default class AnalyticsReportsIndexController extends Controller {
8
8
  @service intl;
9
9
 
10
10
  /** query params */
11
- @tracked queryParams = ['page', 'limit', 'sort', 'query', 'public_id', 'name', 'created_at'];
11
+ @tracked queryParams = this.reportActions.queryParamsFor(['page', 'limit', 'sort', 'query', 'public_id', 'name', 'created_at']);
12
12
  @tracked page = 1;
13
13
  @tracked limit;
14
14
  @tracked sort = '-created_at';
@@ -20,11 +20,13 @@ export default class AnalyticsReportsIndexController extends Controller {
20
20
  get actionButtons() {
21
21
  return [
22
22
  {
23
+ id: 'refresh',
23
24
  icon: 'refresh',
24
25
  onClick: this.reportActions.refresh,
25
26
  helpText: this.intl.t('common.refresh'),
26
27
  },
27
28
  {
29
+ id: 'create',
28
30
  text: this.intl.t('common.new'),
29
31
  type: 'primary',
30
32
  icon: 'plus',
@@ -37,6 +39,7 @@ export default class AnalyticsReportsIndexController extends Controller {
37
39
  get bulkActions() {
38
40
  return [
39
41
  {
42
+ id: 'bulk-delete',
40
43
  label: 'Delete selected...',
41
44
  class: 'text-red-500',
42
45
  fn: this.reportActions.bulkDelete,
@@ -48,6 +51,7 @@ export default class AnalyticsReportsIndexController extends Controller {
48
51
  get columns() {
49
52
  return [
50
53
  {
54
+ id: 'title',
51
55
  sticky: true,
52
56
  label: 'Title',
53
57
  valuePath: 'title',
@@ -59,6 +63,7 @@ export default class AnalyticsReportsIndexController extends Controller {
59
63
  filterComponent: 'filter/string',
60
64
  },
61
65
  {
66
+ id: 'public-id',
62
67
  label: 'ID',
63
68
  valuePath: 'public_id',
64
69
  cellComponent: 'click-to-copy',
@@ -69,6 +74,7 @@ export default class AnalyticsReportsIndexController extends Controller {
69
74
  filterComponent: 'filter/string',
70
75
  },
71
76
  {
77
+ id: 'row-actions',
72
78
  label: '',
73
79
  cellComponent: 'table/cell/dropdown',
74
80
  ddButtonText: false,
@@ -81,11 +87,13 @@ export default class AnalyticsReportsIndexController extends Controller {
81
87
  width: 60,
82
88
  actions: [
83
89
  {
90
+ id: 'view',
84
91
  label: 'View report...',
85
92
  fn: this.reportActions.transition.view,
86
93
  permission: 'iam view report',
87
94
  },
88
95
  {
96
+ id: 'edit',
89
97
  label: 'Edit report...',
90
98
  fn: this.reportActions.transition.edit,
91
99
  permission: 'iam update report',
@@ -94,6 +102,7 @@ export default class AnalyticsReportsIndexController extends Controller {
94
102
  separator: true,
95
103
  },
96
104
  {
105
+ id: 'delete',
97
106
  label: 'Delete report...',
98
107
  fn: this.reportActions.delete,
99
108
  permission: 'iam delete report',
@@ -39,6 +39,7 @@ export default class ConnectivityDevicesIndexDetailsController extends Controlle
39
39
  permission: 'fleet-ops update device',
40
40
  },
41
41
  {
42
+ id: 'more',
42
43
  icon: 'ellipsis-h',
43
44
  iconPrefix: 'fas',
44
45
  renderInPlace: true,
@@ -17,7 +17,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
17
17
  @service trailerActions;
18
18
 
19
19
  /** query params */
20
- @tracked queryParams = [
20
+ @tracked queryParams = this.deviceActions.queryParamsFor([
21
21
  'name',
22
22
  'status',
23
23
  'attachment_state',
@@ -36,7 +36,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
36
36
  'public_id',
37
37
  'created_at',
38
38
  'updated_at',
39
- ];
39
+ ]);
40
40
  @tracked page = 1;
41
41
  @tracked limit;
42
42
  @tracked sort = '-created_at';
@@ -56,11 +56,13 @@ export default class ConnectivityDevicesIndexController extends Controller {
56
56
  /** action buttons */
57
57
  @tracked actionButtons = [
58
58
  {
59
+ id: 'refresh',
59
60
  icon: 'refresh',
60
61
  onClick: this.deviceActions.refresh,
61
62
  helpText: this.intl.t('common.refresh'),
62
63
  },
63
64
  {
65
+ id: 'create',
64
66
  text: this.intl.t('common.new'),
65
67
  type: 'primary',
66
68
  icon: 'plus',
@@ -68,6 +70,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
68
70
  permission: 'fleet-ops create device',
69
71
  },
70
72
  {
73
+ id: 'import',
71
74
  text: this.intl.t('common.import'),
72
75
  type: 'magic',
73
76
  icon: 'upload',
@@ -75,6 +78,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
75
78
  permission: 'fleet-ops import device',
76
79
  },
77
80
  {
81
+ id: 'export',
78
82
  text: this.intl.t('common.export'),
79
83
  icon: 'long-arrow-up',
80
84
  iconClass: 'rotate-icon-45',
@@ -87,6 +91,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
87
91
  /** bulk action buttons */
88
92
  @tracked bulkActions = [
89
93
  {
94
+ id: 'bulk-delete',
90
95
  label: 'Delete selected...',
91
96
  class: 'text-red-500',
92
97
  fn: this.deviceActions.bulkDelete,
@@ -111,6 +116,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
111
116
  separator: true,
112
117
  },
113
118
  {
119
+ id: 'delete',
114
120
  label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.device') }),
115
121
  fn: this.deviceActions.delete,
116
122
  permission: 'fleet-ops delete device',
@@ -78,7 +78,20 @@ export default class ConnectivityEventsIndexController extends Controller {
78
78
  @service telematicActions;
79
79
 
80
80
  /** query params */
81
- @tracked queryParams = ['page', 'limit', 'sort', 'query', 'telematic', 'device', 'event_type', 'severity', 'processed', 'occurred_at', 'created_at', 'updated_at'];
81
+ @tracked queryParams = this.deviceEventActions.queryParamsFor([
82
+ 'page',
83
+ 'limit',
84
+ 'sort',
85
+ 'query',
86
+ 'telematic',
87
+ 'device',
88
+ 'event_type',
89
+ 'severity',
90
+ 'processed',
91
+ 'occurred_at',
92
+ 'created_at',
93
+ 'updated_at',
94
+ ]);
82
95
  @tracked page = 1;
83
96
  @tracked limit;
84
97
  @tracked sort = '-created_at';
@@ -95,6 +108,7 @@ export default class ConnectivityEventsIndexController extends Controller {
95
108
  /** action buttons */
96
109
  @tracked actionButtons = [
97
110
  {
111
+ id: 'refresh',
98
112
  icon: 'refresh',
99
113
  onClick: this.deviceEventActions.refresh,
100
114
  helpText: this.intl.t('common.refresh'),
@@ -107,6 +121,7 @@ export default class ConnectivityEventsIndexController extends Controller {
107
121
  /** columns */
108
122
  @tracked columns = [
109
123
  {
124
+ id: 'event-type',
110
125
  sticky: true,
111
126
  label: 'Event',
112
127
  valuePath: 'event_type',
@@ -121,6 +136,7 @@ export default class ConnectivityEventsIndexController extends Controller {
121
136
  filterComponent: 'filter/string',
122
137
  },
123
138
  {
139
+ id: 'device-display-name',
124
140
  label: 'Device',
125
141
  valuePath: 'device.displayName',
126
142
  cellComponent: 'cell/device-identity',
@@ -137,6 +153,7 @@ export default class ConnectivityEventsIndexController extends Controller {
137
153
  modelNamePath: 'displayName',
138
154
  },
139
155
  {
156
+ id: 'provider',
140
157
  label: 'Provider',
141
158
  valuePath: 'provider',
142
159
  cellComponent: 'cell/telematic-identity',
@@ -152,6 +169,7 @@ export default class ConnectivityEventsIndexController extends Controller {
152
169
  model: 'telematic',
153
170
  },
154
171
  {
172
+ id: 'severity',
155
173
  label: 'Severity',
156
174
  valuePath: 'severity',
157
175
  cellComponent: 'table/cell/status',
@@ -165,12 +183,14 @@ export default class ConnectivityEventsIndexController extends Controller {
165
183
  filterOptionValue: 'value',
166
184
  },
167
185
  {
186
+ id: 'message',
168
187
  label: 'Message',
169
188
  valuePath: 'message',
170
189
  resizable: true,
171
190
  sortable: false,
172
191
  },
173
192
  {
193
+ id: 'code',
174
194
  label: 'Code',
175
195
  valuePath: 'code',
176
196
  resizable: true,
@@ -180,6 +200,7 @@ export default class ConnectivityEventsIndexController extends Controller {
180
200
  filterComponent: 'filter/string',
181
201
  },
182
202
  {
203
+ id: 'ident',
183
204
  label: 'IDENT',
184
205
  valuePath: 'ident',
185
206
  hidden: true,
@@ -187,6 +208,7 @@ export default class ConnectivityEventsIndexController extends Controller {
187
208
  sortable: true,
188
209
  },
189
210
  {
211
+ id: 'protocol',
190
212
  label: 'Protocol',
191
213
  valuePath: 'protocol',
192
214
  hidden: true,
@@ -194,6 +216,7 @@ export default class ConnectivityEventsIndexController extends Controller {
194
216
  sortable: true,
195
217
  },
196
218
  {
219
+ id: 'state',
197
220
  label: 'State',
198
221
  valuePath: 'state',
199
222
  hidden: true,
@@ -201,6 +224,7 @@ export default class ConnectivityEventsIndexController extends Controller {
201
224
  sortable: true,
202
225
  },
203
226
  {
227
+ id: 'processed-at',
204
228
  label: 'Processed',
205
229
  valuePath: 'processedAt',
206
230
  sortParam: 'processed_at',
@@ -214,6 +238,7 @@ export default class ConnectivityEventsIndexController extends Controller {
214
238
  filterOptionValue: 'value',
215
239
  },
216
240
  {
241
+ id: 'occurred-at',
217
242
  label: 'Occurred',
218
243
  valuePath: 'occurredAt',
219
244
  sortParam: 'occurred_at',
@@ -224,6 +249,7 @@ export default class ConnectivityEventsIndexController extends Controller {
224
249
  filterComponent: 'filter/date',
225
250
  },
226
251
  {
252
+ id: 'created-at',
227
253
  label: this.intl.t('column.created-at'),
228
254
  valuePath: 'createdAt',
229
255
  sortParam: 'created_at',
@@ -234,6 +260,7 @@ export default class ConnectivityEventsIndexController extends Controller {
234
260
  filterComponent: 'filter/date',
235
261
  },
236
262
  {
263
+ id: 'updated-at',
237
264
  label: this.intl.t('column.updated-at'),
238
265
  valuePath: 'updatedAt',
239
266
  sortParam: 'updated_at',
@@ -245,6 +272,7 @@ export default class ConnectivityEventsIndexController extends Controller {
245
272
  hidden: true,
246
273
  },
247
274
  {
275
+ id: 'row-actions',
248
276
  label: '',
249
277
  cellComponent: 'table/cell/dropdown',
250
278
  ddButtonText: false,
@@ -257,11 +285,13 @@ export default class ConnectivityEventsIndexController extends Controller {
257
285
  width: 60,
258
286
  actions: [
259
287
  {
288
+ id: 'view',
260
289
  label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.device-event') }),
261
290
  fn: this.deviceEventActions.transition.view,
262
291
  permission: 'fleet-ops view device-event',
263
292
  },
264
293
  {
294
+ id: 'mark-processed',
265
295
  label: 'Mark processed',
266
296
  fn: this.markProcessed,
267
297
  permission: 'fleet-ops update device-event',
@@ -7,7 +7,7 @@ export default class ConnectivitySensorsIndexDetailsController extends Controlle
7
7
  @service hostRouter;
8
8
 
9
9
  get tabs() {
10
- const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:place:details');
10
+ const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:sensor:details');
11
11
  return [
12
12
  {
13
13
  route: 'connectivity.sensors.index.details.index',