@fleetbase/fleetops-engine 0.6.50 → 0.6.52

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 (494) hide show
  1. package/README.md +183 -67
  2. package/addon/components/cell/telematic-provider.hbs +16 -0
  3. package/addon/components/cell/telematic-provider.js +36 -0
  4. package/addon/components/cell/telematic-status.hbs +1 -0
  5. package/addon/components/cell/telematic-status.js +39 -0
  6. package/addon/components/contact/panel-header.hbs +11 -48
  7. package/addon/components/customer/details.hbs +1 -2
  8. package/addon/components/customer/form.hbs +63 -51
  9. package/addon/components/customer/form.js +27 -1
  10. package/addon/components/customer/orders.hbs +48 -0
  11. package/addon/components/customer/orders.js +67 -5
  12. package/addon/components/device/manager.hbs +5 -6
  13. package/addon/components/device/manager.js +12 -15
  14. package/addon/components/driver/details.hbs +1 -1
  15. package/addon/components/driver/form.hbs +1 -1
  16. package/addon/components/fleet/vehicle-listing.js +1 -0
  17. package/addon/components/fuel-integration/form.hbs +200 -0
  18. package/addon/components/fuel-integration/form.js +242 -0
  19. package/addon/components/fuel-integration/hub.hbs +154 -0
  20. package/addon/components/fuel-integration/hub.js +165 -0
  21. package/addon/components/fuel-integration/matching-priority.hbs +76 -0
  22. package/addon/components/fuel-integration/matching-priority.js +145 -0
  23. package/addon/components/fuel-report/details.hbs +13 -1
  24. package/addon/components/home/getting-started-guidance.hbs +113 -0
  25. package/addon/components/home/getting-started-guidance.js +107 -0
  26. package/addon/components/issue/details/comments.hbs +3 -0
  27. package/addon/components/issue/details/comments.js +3 -0
  28. package/addon/components/issue/details/correspondence.hbs +9 -0
  29. package/addon/components/issue/details/correspondence.js +83 -0
  30. package/addon/components/issue/details/documents.hbs +69 -0
  31. package/addon/components/issue/details/documents.js +85 -0
  32. package/addon/components/issue/details.hbs +166 -59
  33. package/addon/components/issue/details.js +149 -0
  34. package/addon/components/issue/form.hbs +19 -1
  35. package/addon/components/issue/panel-header.hbs +43 -0
  36. package/addon/components/issue/panel-header.js +22 -0
  37. package/addon/components/issue/timeline.hbs +40 -0
  38. package/addon/components/issue/timeline.js +45 -0
  39. package/addon/components/layout/fleet-ops-sidebar.js +20 -2
  40. package/addon/components/leaflet-tracking-marker.js +3 -0
  41. package/addon/components/map/drawer/device-event-listing.hbs +12 -2
  42. package/addon/components/map/drawer/driver-listing.hbs +14 -1
  43. package/addon/components/map/drawer/place-listing.hbs +14 -1
  44. package/addon/components/map/drawer/position-listing.hbs +12 -2
  45. package/addon/components/map/drawer/position-listing.js +3 -0
  46. package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
  47. package/addon/components/map/leaflet-live-map.hbs +2 -2
  48. package/addon/components/map/leaflet-live-map.js +17 -0
  49. package/addon/components/map/order-list-overlay.hbs +4 -4
  50. package/addon/components/modals/assigned-orders.hbs +40 -0
  51. package/addon/components/modals/attach-device.hbs +4 -3
  52. package/addon/components/modals/attach-telematic-device.hbs +25 -0
  53. package/addon/components/modals/attach-telematic-device.js +3 -0
  54. package/addon/components/modals/convert-customer-to-vendor.hbs +30 -0
  55. package/addon/components/modals/convert-customer-to-vendor.js +55 -0
  56. package/addon/components/modals/driver-assign-order.hbs +7 -58
  57. package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
  58. package/addon/components/modals/fleet-assign-driver.hbs +18 -0
  59. package/addon/components/modals/fleet-assign-driver.js +3 -0
  60. package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
  61. package/addon/components/modals/fleet-assign-vehicle.js +3 -0
  62. package/addon/components/modals/issue-assign.hbs +20 -0
  63. package/addon/components/modals/issue-assign.js +49 -0
  64. package/addon/components/modals/issue-close.hbs +30 -0
  65. package/addon/components/modals/issue-close.js +73 -0
  66. package/addon/components/modals/issue-status.hbs +20 -0
  67. package/addon/components/modals/issue-status.js +43 -0
  68. package/addon/components/modals/reset-customer-credentials.js +12 -6
  69. package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
  70. package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
  71. package/addon/components/modals/update-order-activity.hbs +51 -17
  72. package/addon/components/modals/update-order-activity.js +59 -5
  73. package/addon/components/modals/vehicle-details.hbs +6 -1
  74. package/addon/components/modals/vehicle-form.hbs +8 -1
  75. package/addon/components/order/card.hbs +106 -0
  76. package/addon/components/order/card.js +257 -0
  77. package/addon/components/order/details/activity.js +2 -2
  78. package/addon/components/order/details/proof.hbs +40 -38
  79. package/addon/components/order/details/proof.js +31 -4
  80. package/addon/components/order/details.hbs +5 -5
  81. package/addon/components/order/details.js +19 -1
  82. package/addon/components/order/form/service-rate.hbs +2 -0
  83. package/addon/components/order/header.hbs +1 -1
  84. package/addon/components/route-list.hbs +0 -12
  85. package/addon/components/service-rate/details.hbs +1 -1
  86. package/addon/components/service-rate/form.hbs +4 -3
  87. package/addon/components/service-rate/form.js +4 -0
  88. package/addon/components/telematic/details.hbs +98 -87
  89. package/addon/components/telematic/details.js +230 -1
  90. package/addon/components/telematic/form.hbs +303 -72
  91. package/addon/components/telematic/form.js +519 -3
  92. package/addon/components/telematic/hub.hbs +149 -0
  93. package/addon/components/telematic/hub.js +142 -0
  94. package/addon/components/telematic/settings.hbs +152 -0
  95. package/addon/components/telematic/settings.js +45 -0
  96. package/addon/components/telematic/tab-empty-state.hbs +29 -0
  97. package/addon/components/telematic/tab-empty-state.js +33 -0
  98. package/addon/components/vehicle/details.hbs +6 -1
  99. package/addon/components/vehicle/form.hbs +2 -1
  100. package/addon/components/vendor/personnel-manager.hbs +166 -0
  101. package/addon/components/vendor/personnel-manager.js +143 -0
  102. package/addon/components/widget/fuel-providers.hbs +43 -0
  103. package/addon/components/widget/fuel-providers.js +27 -0
  104. package/addon/components/widget/live-fleet.hbs +1 -0
  105. package/addon/components/widget/live-fleet.js +2 -7
  106. package/addon/components/widget/revenue-trend.hbs +1 -1
  107. package/addon/components/widget/revenue-trend.js +75 -2
  108. package/addon/controllers/connectivity/devices/index/details.js +27 -1
  109. package/addon/controllers/connectivity/devices/index.js +14 -0
  110. package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
  111. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
  112. package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
  113. package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
  114. package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
  115. package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
  116. package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
  117. package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
  118. package/addon/controllers/connectivity/telematics/details/events.js +244 -0
  119. package/addon/controllers/connectivity/telematics/details/index.js +3 -0
  120. package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
  121. package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
  122. package/addon/controllers/connectivity/telematics/details.js +149 -0
  123. package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
  124. package/addon/controllers/connectivity/telematics/index.js +25 -5
  125. package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
  126. package/addon/controllers/management/contacts/customers/details.js +31 -13
  127. package/addon/controllers/management/contacts/customers.js +16 -5
  128. package/addon/controllers/management/contacts/index/details.js +31 -13
  129. package/addon/controllers/management/contacts/index.js +7 -0
  130. package/addon/controllers/management/drivers/index/details.js +78 -1
  131. package/addon/controllers/management/drivers/index.js +39 -0
  132. package/addon/controllers/management/fleets/index/details.js +23 -1
  133. package/addon/controllers/management/fleets/index.js +6 -1
  134. package/addon/controllers/management/fuel-reports/index.js +37 -1
  135. package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
  136. package/addon/controllers/management/fuel-transactions/index.js +240 -0
  137. package/addon/controllers/management/issues/index/details.js +52 -6
  138. package/addon/controllers/management/vehicles/index/details.js +32 -0
  139. package/addon/controllers/management/vehicles/index.js +26 -0
  140. package/addon/controllers/management/vendors/index/details.js +4 -0
  141. package/addon/controllers/operations/orders/index/details.js +11 -3
  142. package/addon/controllers/operations/orders/index.js +5 -1
  143. package/addon/controllers/settings/payments/index.js +5 -0
  144. package/addon/extension.js +29 -12
  145. package/addon/helpers/format-duration.js +1 -38
  146. package/addon/initializers/load-leaflet-assets.js +5 -6
  147. package/addon/initializers/patch-ember-leaflet-tooltip-layer.js +51 -0
  148. package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
  149. package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
  150. package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
  151. package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
  152. package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
  153. package/addon/routes/connectivity/fuel-providers/details.js +18 -0
  154. package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
  155. package/addon/routes/connectivity/fuel-providers/index.js +20 -0
  156. package/addon/routes/connectivity/fuel-providers/new.js +3 -0
  157. package/addon/routes/connectivity/fuel-providers.js +3 -0
  158. package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
  159. package/addon/routes/connectivity/telematics/details/devices.js +30 -0
  160. package/addon/routes/connectivity/telematics/details/events.js +33 -0
  161. package/addon/routes/connectivity/telematics/details/index.js +3 -0
  162. package/addon/routes/connectivity/telematics/details/logs.js +17 -0
  163. package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
  164. package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
  165. package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
  166. package/addon/routes/connectivity/telematics/new.js +3 -0
  167. package/addon/routes/management/drivers/index/details/activity.js +3 -0
  168. package/addon/routes/management/fuel-reports/index.js +2 -0
  169. package/addon/routes/management/fuel-transactions/index/details.js +18 -0
  170. package/addon/routes/management/fuel-transactions/index.js +21 -0
  171. package/addon/routes/management/fuel-transactions.js +3 -0
  172. package/addon/routes/management/issues/index/details.js +1 -1
  173. package/addon/routes.js +29 -9
  174. package/addon/services/contact-actions.js +231 -1
  175. package/addon/services/device-actions.js +64 -1
  176. package/addon/services/device-event-actions.js +12 -1
  177. package/addon/services/driver-actions.js +147 -11
  178. package/addon/services/fleet-actions.js +66 -1
  179. package/addon/services/fuel-integration-actions.js +31 -0
  180. package/addon/services/getting-started.js +44 -0
  181. package/addon/services/issue-actions.js +72 -1
  182. package/addon/services/leaflet-map-manager.js +2 -0
  183. package/addon/services/map-adapter/leaflet.js +19 -0
  184. package/addon/services/service-areas.js +3 -0
  185. package/addon/services/telematic-actions.js +9 -3
  186. package/addon/services/vehicle-actions.js +125 -0
  187. package/addon/styles/fleetops-engine.css +1313 -1
  188. package/addon/templates/analytics/reports/index.hbs +19 -1
  189. package/addon/templates/connectivity/devices/index.hbs +19 -1
  190. package/addon/templates/connectivity/events/index.hbs +16 -1
  191. package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
  192. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
  193. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
  194. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
  195. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
  196. package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
  197. package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
  198. package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
  199. package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
  200. package/addon/templates/connectivity/fuel-providers.hbs +1 -0
  201. package/addon/templates/connectivity/sensors/index.hbs +19 -1
  202. package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
  203. package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
  204. package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
  205. package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
  206. package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
  207. package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
  208. package/addon/templates/connectivity/telematics/details.hbs +53 -0
  209. package/addon/templates/connectivity/telematics/edit.hbs +27 -0
  210. package/addon/templates/connectivity/telematics/index.hbs +6 -8
  211. package/addon/templates/connectivity/telematics/new.hbs +24 -0
  212. package/addon/templates/maintenance/equipment/index.hbs +19 -1
  213. package/addon/templates/maintenance/maintenances/index.hbs +15 -1
  214. package/addon/templates/maintenance/parts/index.hbs +19 -1
  215. package/addon/templates/maintenance/schedules/index.hbs +19 -1
  216. package/addon/templates/maintenance/work-orders/index.hbs +19 -1
  217. package/addon/templates/management/contacts/customers/details.hbs +1 -1
  218. package/addon/templates/management/contacts/customers.hbs +15 -1
  219. package/addon/templates/management/contacts/index/details.hbs +1 -1
  220. package/addon/templates/management/contacts/index.hbs +19 -1
  221. package/addon/templates/management/contacts.hbs +2 -2
  222. package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
  223. package/addon/templates/management/drivers/index.hbs +19 -1
  224. package/addon/templates/management/fleets/index.hbs +19 -1
  225. package/addon/templates/management/fuel-reports/index.hbs +19 -1
  226. package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
  227. package/addon/templates/management/fuel-transactions/index.hbs +58 -0
  228. package/addon/templates/management/fuel-transactions.hbs +1 -0
  229. package/addon/templates/management/issues/index/details/index.hbs +3 -1
  230. package/addon/templates/management/issues/index/details.hbs +3 -2
  231. package/addon/templates/management/issues/index.hbs +19 -1
  232. package/addon/templates/management/places/index.hbs +19 -1
  233. package/addon/templates/management/vehicles/index.hbs +19 -1
  234. package/addon/templates/management/vendors/index/details/personnel.hbs +1 -2
  235. package/addon/templates/management/vendors/index.hbs +19 -1
  236. package/addon/templates/management/vendors/integrated.hbs +13 -1
  237. package/addon/templates/operations/orders/index/details/index.hbs +2 -2
  238. package/addon/templates/operations/orders/index.hbs +20 -2
  239. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  240. package/addon/templates/operations/service-rates/index/new.hbs +1 -0
  241. package/addon/templates/operations/service-rates/index.hbs +19 -1
  242. package/addon/templates/settings/payments/index.hbs +15 -1
  243. package/addon/templates/settings/payments/onboard.hbs +8 -8
  244. package/addon/utils/fleet-ops-options.js +3 -0
  245. package/addon/utils/leaflet-draw-namespace-guard.js +22 -0
  246. package/addon/utils/leaflet-plugin-loader.js +219 -0
  247. package/addon/utils/setup-customer-portal.js +4 -64
  248. package/app/components/cell/telematic-provider.js +1 -0
  249. package/app/components/cell/telematic-status.js +1 -0
  250. package/app/components/fuel-integration/form.js +1 -0
  251. package/app/components/fuel-integration/hub.js +1 -0
  252. package/app/components/fuel-integration/matching-priority.js +1 -0
  253. package/app/components/home/getting-started-guidance.js +1 -0
  254. package/app/components/issue/details/comments.js +1 -0
  255. package/app/components/issue/details/correspondence.js +1 -0
  256. package/app/components/issue/details/documents.js +1 -0
  257. package/app/components/issue/panel-header.js +1 -0
  258. package/app/components/modals/assigned-orders.js +1 -0
  259. package/app/components/modals/attach-telematic-device.js +1 -0
  260. package/app/components/modals/convert-customer-to-vendor.js +1 -0
  261. package/app/components/modals/fleet-assign-driver.js +1 -0
  262. package/app/components/modals/fleet-assign-vehicle.js +1 -0
  263. package/app/components/modals/issue-assign.js +1 -0
  264. package/app/components/modals/issue-close.js +1 -0
  265. package/app/components/modals/issue-status.js +1 -0
  266. package/app/components/modals/telematic-connection-diagnostics.js +1 -0
  267. package/app/components/order/card.js +1 -0
  268. package/app/components/telematic/hub.js +1 -0
  269. package/app/components/telematic/settings.js +1 -0
  270. package/app/components/telematic/tab-empty-state.js +1 -0
  271. package/app/components/vendor/personnel-manager.js +1 -0
  272. package/app/components/widget/fuel-providers.js +1 -0
  273. package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
  274. package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  275. package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  276. package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  277. package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
  278. package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  279. package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
  280. package/app/controllers/connectivity/telematics/details/devices.js +1 -0
  281. package/app/controllers/connectivity/telematics/details/events.js +1 -0
  282. package/app/controllers/connectivity/telematics/details/index.js +1 -0
  283. package/app/controllers/connectivity/telematics/details/logs.js +1 -0
  284. package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
  285. package/app/controllers/connectivity/telematics/details.js +1 -0
  286. package/app/controllers/connectivity/telematics/edit.js +1 -0
  287. package/app/controllers/connectivity/telematics/new.js +1 -0
  288. package/app/controllers/management/fuel-transactions/index/details.js +1 -0
  289. package/app/controllers/management/fuel-transactions/index.js +1 -0
  290. package/app/helpers/format-duration.js +1 -1
  291. package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  292. package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  293. package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
  294. package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
  295. package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  296. package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  297. package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  298. package/app/routes/connectivity/fuel-providers/index.js +1 -0
  299. package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  300. package/app/routes/connectivity/fuel-providers.js +1 -0
  301. package/app/routes/connectivity/telematics/details/attachments.js +1 -0
  302. package/app/routes/connectivity/telematics/details/devices.js +1 -0
  303. package/app/routes/connectivity/telematics/details/events.js +1 -0
  304. package/app/routes/connectivity/telematics/details/index.js +1 -0
  305. package/app/routes/connectivity/telematics/details/logs.js +1 -0
  306. package/app/routes/connectivity/telematics/details/sensors.js +1 -0
  307. package/app/routes/connectivity/telematics/details.js +1 -0
  308. package/app/routes/connectivity/telematics/edit.js +1 -0
  309. package/app/routes/connectivity/telematics/new.js +1 -0
  310. package/app/routes/management/drivers/index/details/activity.js +1 -0
  311. package/app/routes/management/fuel-transactions/index/details.js +1 -0
  312. package/app/routes/management/fuel-transactions/index.js +1 -0
  313. package/app/routes/management/fuel-transactions.js +1 -0
  314. package/app/services/fuel-integration-actions.js +1 -0
  315. package/app/services/getting-started.js +1 -0
  316. package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  317. package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  318. package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
  319. package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
  320. package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  321. package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  322. package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  323. package/app/templates/connectivity/fuel-providers/index.js +1 -0
  324. package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  325. package/app/templates/connectivity/fuel-providers.js +1 -0
  326. package/app/templates/connectivity/telematics/details/attachments.js +1 -0
  327. package/app/templates/connectivity/telematics/details/devices.js +1 -0
  328. package/app/templates/connectivity/telematics/details/events.js +1 -0
  329. package/app/templates/connectivity/telematics/details/index.js +1 -0
  330. package/app/templates/connectivity/telematics/details/logs.js +1 -0
  331. package/app/templates/connectivity/telematics/details/sensors.js +1 -0
  332. package/app/templates/connectivity/telematics/details.js +1 -0
  333. package/app/templates/connectivity/telematics/edit.js +1 -0
  334. package/app/templates/connectivity/telematics/new.js +1 -0
  335. package/app/templates/management/drivers/index/details/activity.js +1 -0
  336. package/app/templates/management/fuel-transactions/index/details.js +1 -0
  337. package/app/templates/management/fuel-transactions/index.js +1 -0
  338. package/app/templates/management/fuel-transactions.js +1 -0
  339. package/app/utils/leaflet-draw-namespace-guard.js +1 -0
  340. package/app/utils/leaflet-plugin-loader.js +1 -0
  341. package/assets/images/telematics/providers/afaqy.webp +0 -0
  342. package/assets/images/telematics/providers/default.webp +0 -0
  343. package/assets/images/telematics/providers/flespi.webp +0 -0
  344. package/assets/images/telematics/providers/geotab.webp +0 -0
  345. package/assets/images/telematics/providers/safee.webp +0 -0
  346. package/assets/images/telematics/providers/samsara.webp +0 -0
  347. package/composer.json +1 -1
  348. package/extension.json +1 -1
  349. package/package.json +5 -5
  350. package/server/config/fuel-providers.php +42 -0
  351. package/server/config/telematics.php +139 -130
  352. package/server/migrations/2026_05_31_000001_add_portal_fields_to_vendor_personnels_table.php +30 -0
  353. package/server/migrations/2026_06_03_000000_ensure_tags_column_on_issues_table.php +31 -0
  354. package/server/migrations/2026_06_03_000001_add_order_uuid_to_issues_table.php +25 -0
  355. package/server/migrations/2026_06_04_000001_backfill_order_transaction_subjects.php +39 -0
  356. package/server/migrations/2026_06_04_000002_backfill_order_transaction_directions.php +24 -0
  357. package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
  358. package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
  359. package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
  360. package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
  361. package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
  362. package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
  363. package/server/resources/views/mail/customer-credentials.blade.php +16 -13
  364. package/server/src/Contracts/FuelProvider.php +30 -0
  365. package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
  366. package/server/src/Events/FuelProviderTransactionImported.php +17 -0
  367. package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
  368. package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
  369. package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
  370. package/server/src/Expansions/UserFilterExpansion.php +28 -0
  371. package/server/src/Http/Controllers/Api/v1/IssueController.php +2 -0
  372. package/server/src/Http/Controllers/Api/v1/OrderController.php +26 -25
  373. package/server/src/Http/Controllers/Api/v1/PlaceController.php +10 -58
  374. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
  375. package/server/src/Http/Controllers/Internal/v1/ContactController.php +135 -0
  376. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +116 -6
  377. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +76 -2
  378. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
  379. package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
  380. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
  381. package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
  382. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
  383. package/server/src/Http/Controllers/Internal/v1/GettingStartedController.php +17 -0
  384. package/server/src/Http/Controllers/Internal/v1/IssueController.php +251 -0
  385. package/server/src/Http/Controllers/Internal/v1/OrderController.php +172 -97
  386. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +10 -68
  387. package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
  388. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
  389. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
  390. package/server/src/Http/Controllers/Internal/v1/VendorController.php +89 -0
  391. package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
  392. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
  393. package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
  394. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
  395. package/server/src/Http/Filter/FuelReportFilter.php +10 -0
  396. package/server/src/Http/Requests/CreateIssueRequest.php +4 -0
  397. package/server/src/Http/Requests/UpdateIssueRequest.php +4 -0
  398. package/server/src/Http/Resources/v1/Driver.php +15 -0
  399. package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
  400. package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
  401. package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
  402. package/server/src/Http/Resources/v1/FuelReport.php +28 -22
  403. package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
  404. package/server/src/Http/Resources/v1/Index/Order.php +12 -9
  405. package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
  406. package/server/src/Http/Resources/v1/Issue.php +25 -0
  407. package/server/src/Http/Resources/v1/Order.php +20 -18
  408. package/server/src/Http/Resources/v1/Vehicle.php +17 -0
  409. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
  410. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
  411. package/server/src/Jobs/SyncTelematicDevicesJob.php +36 -6
  412. package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
  413. package/server/src/Mail/CustomerCredentialsMail.php +5 -6
  414. package/server/src/Models/Asset.php +2 -1
  415. package/server/src/Models/Contact.php +32 -52
  416. package/server/src/Models/Device.php +27 -4
  417. package/server/src/Models/DeviceEvent.php +40 -3
  418. package/server/src/Models/Driver.php +2 -1
  419. package/server/src/Models/Equipment.php +2 -1
  420. package/server/src/Models/Fleet.php +2 -1
  421. package/server/src/Models/FuelProviderConnection.php +60 -0
  422. package/server/src/Models/FuelProviderSyncRun.php +58 -0
  423. package/server/src/Models/FuelProviderTransaction.php +119 -0
  424. package/server/src/Models/FuelReport.php +16 -1
  425. package/server/src/Models/Issue.php +47 -6
  426. package/server/src/Models/Order.php +33 -6
  427. package/server/src/Models/Part.php +2 -1
  428. package/server/src/Models/Sensor.php +21 -4
  429. package/server/src/Models/ServiceArea.php +1 -1
  430. package/server/src/Models/ServiceRate.php +39 -2
  431. package/server/src/Models/Vehicle.php +14 -2
  432. package/server/src/Models/Vendor.php +2 -1
  433. package/server/src/Models/VendorPersonnel.php +10 -1
  434. package/server/src/Models/Zone.php +1 -1
  435. package/server/src/Observers/PurchaseRateObserver.php +20 -0
  436. package/server/src/Observers/ZoneObserver.php +56 -0
  437. package/server/src/Providers/FleetOpsServiceProvider.php +11 -0
  438. package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
  439. package/server/src/Support/Analytics/TopDrivers.php +9 -1
  440. package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
  441. package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
  442. package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
  443. package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
  444. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
  445. package/server/src/Support/GettingStarted.php +144 -0
  446. package/server/src/Support/PlaceSearch.php +282 -0
  447. package/server/src/Support/ResolvesOrderServiceStops.php +22 -12
  448. package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
  449. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +55 -26
  450. package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
  451. package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
  452. package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
  453. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
  454. package/server/src/Support/Telematics/TelematicService.php +340 -21
  455. package/server/src/routes.php +74 -5
  456. package/server/tests/AnalyticsRoutesTest.php +8 -0
  457. package/server/tests/CustomerContactIdentitySafetyTest.php +41 -0
  458. package/server/tests/DriverVehicleStatusDefaultTest.php +2 -2
  459. package/server/tests/FuelProviderRegistryTest.php +416 -0
  460. package/server/tests/GettingStartedStatusTest.php +21 -0
  461. package/server/tests/OrderActivityFlowRegressionTest.php +116 -0
  462. package/server/tests/ServiceAreaZoneApiShapeTest.php +44 -0
  463. package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
  464. package/server/tests/TelematicsHardeningTest.php +268 -0
  465. package/server/tests/VehicleDriverAssignmentTest.php +51 -0
  466. package/translations/ar-ae.yml +31 -0
  467. package/translations/bg-bg.yaml +81 -0
  468. package/translations/en-us.yaml +94 -0
  469. package/translations/es-pa.yaml +81 -0
  470. package/translations/fr-fr.yaml +81 -0
  471. package/translations/mn-mn.yaml +81 -0
  472. package/translations/pt-br.yaml +81 -0
  473. package/translations/ru-ru.yaml +81 -0
  474. package/translations/vi-vn.yaml +106 -0
  475. package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
  476. package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
  477. package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
  478. package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
  479. package/addon/controllers/connectivity/telematics/index/details.js +0 -24
  480. package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
  481. package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
  482. package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
  483. package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
  484. package/addon/routes/connectivity/telematics/index/new.js +0 -3
  485. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  486. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  487. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  488. package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
  489. package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
  490. package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
  491. package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
  492. package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
  493. package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
  494. package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
@@ -0,0 +1,101 @@
1
+ <div class="flex flex-col gap-4 p-4 md:p-6">
2
+ <div class="flex flex-col gap-1">
3
+ <h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Event Review + Triage</h2>
4
+ <p class="text-sm text-gray-500 dark:text-gray-300">Review provider events, warning signals, and unprocessed telemetry for this connection.</p>
5
+ </div>
6
+
7
+ <section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
8
+ {{#each this.metrics as |metric|}}
9
+ <div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
10
+ <div class="flex h-full items-start justify-between gap-3 p-3">
11
+ <div class="min-w-0">
12
+ <div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
13
+ <div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
14
+ </div>
15
+ <div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
16
+ <FaIcon @icon={{metric.icon}} />
17
+ </div>
18
+ </div>
19
+ </div>
20
+ {{/each}}
21
+ </section>
22
+
23
+ <section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
24
+ <div class="fleetops-provider-connections-header border-b border-gray-200 px-4 py-3 dark:border-gray-700">
25
+ <div>
26
+ <h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Telemetry Events</h3>
27
+ <p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Filter events by severity, device, type, and processed state before opening details.</p>
28
+ </div>
29
+ <div class="fleetops-provider-connections-actions flex min-w-0 flex-wrap items-center gap-2 lg:ml-auto lg:flex-nowrap lg:justify-end">
30
+ <Layout::Resource::TabularActions
31
+ @title="Telemetry Events"
32
+ @searchQuery={{this.query}}
33
+ @onSearch={{perform this.deviceEventActions.controllerSearchTask this}}
34
+ @columns={{this.columns}}
35
+ @page={{this.page}}
36
+ @onPageChange={{fn (mut this.page)}}
37
+ @actionButtons={{this.actionButtons}}
38
+ @bulkActions={{this.bulkActions}}
39
+ @controller={{this}}
40
+ @searchInputClass="fleetops-provider-connections-search"
41
+ @filterPickerButtonClass="fleetops-provider-connections-action-button"
42
+ @columnPickerButtonClass="fleetops-provider-connections-action-button"
43
+ />
44
+ </div>
45
+ </div>
46
+
47
+ {{#if this.emptyStateContent}}
48
+ <div class="p-4">
49
+ <Telematic::TabEmptyState
50
+ @tone={{this.emptyStateContent.tone}}
51
+ @icon={{this.emptyStateContent.icon}}
52
+ @title={{this.emptyStateContent.title}}
53
+ @message={{this.emptyStateContent.message}}
54
+ @note={{this.emptyStateContent.note}}
55
+ @primaryText={{this.emptyStateContent.primaryText}}
56
+ @primaryIcon={{this.emptyStateContent.primaryIcon}}
57
+ @primaryAction={{this.emptyStateContent.primaryAction}}
58
+ @secondaryText={{this.emptyStateContent.secondaryText}}
59
+ @secondaryIcon={{this.emptyStateContent.secondaryIcon}}
60
+ @secondaryAction={{this.emptyStateContent.secondaryAction}}
61
+ />
62
+ </div>
63
+ {{else}}
64
+ {{#if this.hasHealthyEventState}}
65
+ <div class="p-4 pb-0">
66
+ <Telematic::TabEmptyState
67
+ @tone="success"
68
+ @icon="check"
69
+ @title="No warning or unprocessed events"
70
+ @message="Recent telemetry is reviewed and no warning-level events are currently visible in this connection."
71
+ @primaryText="Refresh"
72
+ @primaryIcon="refresh"
73
+ @primaryAction={{this.refresh}}
74
+ />
75
+ </div>
76
+ {{/if}}
77
+ <Layout::Resource::Tabular
78
+ @resource="device-event"
79
+ @title="Telemetry Events"
80
+ @data={{@model}}
81
+ @columns={{this.columns}}
82
+ @page={{this.page}}
83
+ @onPageChange={{fn (mut this.page)}}
84
+ @controller={{this}}
85
+ @withoutHeader={{true}}
86
+ @emptyStateComponent={{component
87
+ "table/empty-state"
88
+ variant="compact"
89
+ icon="bolt"
90
+ title="No telemetry events"
91
+ description="Events appear after synced devices report provider activity."
92
+ filteredTitle="No events match your filters"
93
+ filteredDescription="Adjust the search, severity, or date filters to review other events."
94
+ primaryText="Refresh"
95
+ primaryIcon="refresh"
96
+ primaryAction=this.refresh
97
+ }}
98
+ />
99
+ {{/if}}
100
+ </section>
101
+ </div>
@@ -1,2 +1 @@
1
1
  <Telematic::Details @resource={{@model}} />
2
- <Spacer @height="200px" />
@@ -0,0 +1,69 @@
1
+ <div class="flex flex-col gap-4 p-4 md:p-6">
2
+ <div class="flex flex-col gap-1 md:flex-row md:items-start md:justify-between">
3
+ <div>
4
+ <h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Connection Logs</h2>
5
+ <p class="text-sm text-gray-500 dark:text-gray-300">Review connection tests, device sync outcomes, and saved audit activity for this provider connection.</p>
6
+ </div>
7
+ <Button @icon="refresh" @text="Refresh" @size="xs" @onClick={{this.refresh}} />
8
+ </div>
9
+
10
+ <section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
11
+ {{#each this.metrics as |metric|}}
12
+ <div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
13
+ <div class="flex h-full items-start justify-between gap-3 p-3">
14
+ <div class="min-w-0">
15
+ <div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
16
+ <div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
17
+ </div>
18
+ <div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
19
+ <FaIcon @icon={{metric.icon}} />
20
+ </div>
21
+ </div>
22
+ </div>
23
+ {{/each}}
24
+ </section>
25
+
26
+ <section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
27
+ <div class="border-b border-gray-200 px-4 py-3 dark:border-gray-700">
28
+ <h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Saved Activity</h3>
29
+ <p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Operational server logs are not shown here; this view only includes persisted audit and sync/test summary data.</p>
30
+ </div>
31
+
32
+ {{#if this.hasLogs}}
33
+ <div class="divide-y divide-gray-100 dark:divide-gray-700">
34
+ {{#each this.logs as |log|}}
35
+ <article class="flex flex-col gap-3 px-4 py-3 md:flex-row md:items-start md:justify-between">
36
+ <div class="flex min-w-0 items-start gap-3">
37
+ <div class="mt-0.5 flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-gray-100 text-gray-600 dark:bg-gray-900 dark:text-gray-300">
38
+ <FaIcon @icon={{or log.icon "circle-info"}} />
39
+ </div>
40
+ <div class="min-w-0">
41
+ <div class="flex flex-wrap items-center gap-2">
42
+ <h4 class="text-sm font-bold text-gray-900 dark:text-gray-100">{{log.label}}</h4>
43
+ <Badge @status={{or log.status "default"}} @hideStatusDot={{true}}>{{or log.status "log"}}</Badge>
44
+ </div>
45
+ <p class="mt-1 text-sm leading-5 text-gray-500 dark:text-gray-300">{{log.description}}</p>
46
+ {{#if log.metadata.job_id}}
47
+ <div class="mt-2 font-mono text-[11px] text-gray-400 dark:text-gray-500">Job {{log.metadata.job_id}}</div>
48
+ {{/if}}
49
+ </div>
50
+ </div>
51
+ <time class="flex-shrink-0 text-xs text-gray-400 dark:text-gray-500">{{n-a (format-date-fns log.created_at "dd MMM yyyy, HH:mm")}}</time>
52
+ </article>
53
+ {{/each}}
54
+ </div>
55
+ {{else}}
56
+ <div class="p-4">
57
+ <Telematic::TabEmptyState
58
+ @tone="info"
59
+ @icon="list"
60
+ @title="No saved logs yet"
61
+ @message="Run a connection test or sync devices to create persisted log entries for this provider connection."
62
+ @primaryText="Refresh"
63
+ @primaryIcon="refresh"
64
+ @primaryAction={{this.refresh}}
65
+ />
66
+ </div>
67
+ {{/if}}
68
+ </section>
69
+ </div>
@@ -0,0 +1,88 @@
1
+ <div class="flex flex-col gap-4 p-4 md:p-6">
2
+ <div class="flex flex-col gap-1">
3
+ <h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Sensor Inventory + Health</h2>
4
+ <p class="text-sm text-gray-500 dark:text-gray-300">Review sensor readings discovered from synced devices and identify sensors that are not reporting.</p>
5
+ </div>
6
+
7
+ <section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
8
+ {{#each this.metrics as |metric|}}
9
+ <div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
10
+ <div class="flex h-full items-start justify-between gap-3 p-3">
11
+ <div class="min-w-0">
12
+ <div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
13
+ <div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
14
+ </div>
15
+ <div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
16
+ <FaIcon @icon={{metric.icon}} />
17
+ </div>
18
+ </div>
19
+ </div>
20
+ {{/each}}
21
+ </section>
22
+
23
+ <section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
24
+ <div class="fleetops-provider-connections-header border-b border-gray-200 px-4 py-3 dark:border-gray-700">
25
+ <div>
26
+ <h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Sensor Readings</h3>
27
+ <p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Filter by type, device, and reporting status to understand what telemetry this connection is producing.</p>
28
+ </div>
29
+ <div class="fleetops-provider-connections-actions flex min-w-0 flex-wrap items-center gap-2 lg:ml-auto lg:flex-nowrap lg:justify-end">
30
+ <Layout::Resource::TabularActions
31
+ @title="Sensor Readings"
32
+ @searchQuery={{this.query}}
33
+ @onSearch={{perform this.sensorActions.controllerSearchTask this}}
34
+ @columns={{this.columns}}
35
+ @page={{this.page}}
36
+ @onPageChange={{fn (mut this.page)}}
37
+ @actionButtons={{this.actionButtons}}
38
+ @bulkActions={{this.bulkActions}}
39
+ @controller={{this}}
40
+ @searchInputClass="fleetops-provider-connections-search"
41
+ @filterPickerButtonClass="fleetops-provider-connections-action-button"
42
+ @columnPickerButtonClass="fleetops-provider-connections-action-button"
43
+ />
44
+ </div>
45
+ </div>
46
+
47
+ {{#if this.emptyStateContent}}
48
+ <div class="p-4">
49
+ <Telematic::TabEmptyState
50
+ @tone={{this.emptyStateContent.tone}}
51
+ @icon={{this.emptyStateContent.icon}}
52
+ @title={{this.emptyStateContent.title}}
53
+ @message={{this.emptyStateContent.message}}
54
+ @note={{this.emptyStateContent.note}}
55
+ @primaryText={{this.emptyStateContent.primaryText}}
56
+ @primaryIcon={{this.emptyStateContent.primaryIcon}}
57
+ @primaryAction={{this.emptyStateContent.primaryAction}}
58
+ @secondaryText={{this.emptyStateContent.secondaryText}}
59
+ @secondaryIcon={{this.emptyStateContent.secondaryIcon}}
60
+ @secondaryAction={{this.emptyStateContent.secondaryAction}}
61
+ />
62
+ </div>
63
+ {{else}}
64
+ <Layout::Resource::Tabular
65
+ @resource="sensor"
66
+ @title="Sensor Readings"
67
+ @data={{@model}}
68
+ @columns={{this.columns}}
69
+ @page={{this.page}}
70
+ @onPageChange={{fn (mut this.page)}}
71
+ @controller={{this}}
72
+ @withoutHeader={{true}}
73
+ @emptyStateComponent={{component
74
+ "table/empty-state"
75
+ variant="compact"
76
+ icon="satellite-dish"
77
+ title="No sensor readings"
78
+ description="Sensor readings appear after devices sync telemetry from this provider."
79
+ filteredTitle="No readings match your filters"
80
+ filteredDescription="Adjust the search or filters to find other sensor readings."
81
+ primaryText="Refresh"
82
+ primaryIcon="refresh"
83
+ primaryAction=this.refresh
84
+ }}
85
+ />
86
+ {{/if}}
87
+ </section>
88
+ </div>
@@ -0,0 +1,53 @@
1
+ <div class="h-full overflow-y-auto bg-gray-50 dark:bg-gray-900">
2
+ <div class="flex w-full flex-col">
3
+ <section class="sticky top-0 z-50 bg-white pt-4 shadow-sm dark:bg-gray-900">
4
+ <div class="mx-auto flex w-full max-w-7xl flex-col gap-4 px-4 lg:flex-row lg:items-start lg:justify-between md:px-6">
5
+ <div class="flex min-w-0 items-start gap-3">
6
+ <Image src={{@model.provider_descriptor.icon}} class="mt-1 h-10 w-10 rounded" />
7
+ <div class="min-w-0">
8
+ <div class="flex flex-wrap items-center gap-2">
9
+ <h1 class="truncate text-lg font-bold text-gray-900 dark:text-gray-100">{{or @model.name @model.provider_descriptor.label @model.provider}}</h1>
10
+ <Badge @status={{this.healthStatus}} @hideStatusDot={{true}}>{{this.statusLabel}}</Badge>
11
+ </div>
12
+ <div class="mt-1 text-sm text-gray-500 dark:text-gray-300">
13
+ {{@model.provider_descriptor.label}}
14
+ {{#if @model.public_id}}
15
+ <span class="mx-1 text-gray-300 dark:text-gray-600">/</span>
16
+ <span class="font-mono text-xs">{{@model.public_id}}</span>
17
+ {{/if}}
18
+ </div>
19
+ <div class="mt-2 flex flex-wrap gap-2 text-xs text-gray-500 dark:text-gray-300">
20
+ <span>Connection test: {{this.connectionTestLabel}}</span>
21
+ <span>Last test: {{n-a (format-date-fns @model.meta.last_connection_test "dd MMM HH:mm")}}</span>
22
+ <span>Last sync: {{n-a (format-date-fns this.lastSyncAt "dd MMM HH:mm")}}</span>
23
+ <span>Devices: {{n-a @model.meta.last_sync_total}}</span>
24
+ </div>
25
+ </div>
26
+ </div>
27
+
28
+ <div class="flex flex-shrink-0 flex-nowrap items-center gap-2 whitespace-nowrap">
29
+ <Button @icon="arrow-left" @text="Back" @size="xs" @onClick={{transition-to "connectivity.telematics.index"}} />
30
+ <Button @icon="plug" @text="Test" @size="xs" @onClick={{this.openConnectionTestDialog}} />
31
+ <Button @icon="satellite-dish" @text="Sync Devices" @type="primary" @size="xs" @isLoading={{this.discoverDevices.isRunning}} @onClick={{perform this.discoverDevices}} />
32
+ <Button @icon="cog" @text="Settings" @size="xs" @onClick={{transition-to "connectivity.telematics.edit" @model}} />
33
+ </div>
34
+ </div>
35
+
36
+ <nav class="mt-4 flex w-full gap-1 overflow-x-auto border-b border-gray-200 text-sm dark:border-gray-700" aria-label="Telematic connection sections">
37
+ {{#each this.tabs as |tab|}}
38
+ <LinkTo
39
+ @route={{tab.route}}
40
+ class="inline-flex flex-shrink-0 items-center border-b-2 px-3 py-3 font-medium
41
+ {{if tab.active 'border-blue-500 text-gray-900 dark:text-white' 'border-transparent text-gray-500 hover:border-blue-400 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white'}}"
42
+ >
43
+ {{tab.label}}
44
+ </LinkTo>
45
+ {{/each}}
46
+ </nav>
47
+ </section>
48
+
49
+ <section class="min-w-0">
50
+ {{outlet}}
51
+ </section>
52
+ </div>
53
+ </div>
@@ -0,0 +1,27 @@
1
+ <div class="flex h-full flex-col bg-gray-50 dark:bg-gray-900">
2
+ <section class="flex-shrink-0 border-b border-gray-200 bg-white px-4 py-4 shadow-sm dark:border-gray-700 dark:bg-gray-900 dark:shadow-sm dark:shadow-black/30 md:px-6">
3
+ <div class="mx-auto flex w-full max-w-6xl flex-col gap-3 md:flex-row md:items-start md:justify-between">
4
+ <div class="min-w-0">
5
+ <div class="text-xs font-semibold uppercase text-gray-400 dark:text-gray-500">Connection settings</div>
6
+ <h1 class="truncate text-lg font-bold text-gray-900 dark:text-gray-100">Edit {{or @model.name @model.provider}}</h1>
7
+ <p class="mt-1 text-sm text-gray-500 dark:text-gray-300">Update credentials, webhook configuration, and hardware identity for this provider connection.</p>
8
+ </div>
9
+ <div class="flex items-center gap-2">
10
+ <Button @icon="plug" @text="Test" @size="sm" @onClick={{this.openConnectionTestDialog}} />
11
+ <Button @icon="eye" @text="View" @size="sm" @onClick={{this.view}} />
12
+ <Button @icon="times" @text="Cancel" @size="sm" @onClick={{this.cancel}} />
13
+ </div>
14
+ </div>
15
+ </section>
16
+
17
+ <Telematic::Settings
18
+ @resource={{@model}}
19
+ @controller={{this}}
20
+ @saveLabel="Save Changes"
21
+ @savingLabel="Saving changes"
22
+ @footerHelp="Changes affect provider sync, webhook ingestion, and device discovery."
23
+ @isSaving={{this.save.isRunning}}
24
+ @onCancel={{this.cancel}}
25
+ @onSave={{perform this.save @model}}
26
+ />
27
+ </div>
@@ -1,14 +1,12 @@
1
- <Layout::Resource::Tabular
2
- @resource="telematic"
3
- @title={{t "resource.telematics"}}
4
- @searchQuery={{this.query}}
5
- @onSearch={{perform this.telematicActions.controllerSearchTask this}}
6
- @data={{@model}}
1
+ <Telematic::Hub
2
+ @integrations={{@model}}
3
+ @providers={{this.providers}}
4
+ @providersLoading={{this.loadProviders.isRunning}}
7
5
  @columns={{this.columns}}
8
6
  @page={{this.page}}
9
7
  @onPageChange={{fn (mut this.page)}}
10
- @actionButtons={{this.actionButtons}}
11
8
  @bulkActions={{this.bulkActions}}
12
9
  @controller={{this}}
10
+ @searchQuery={{this.query}}
11
+ @onSearch={{perform this.telematicActions.controllerSearchTask this}}
13
12
  />
14
- {{outlet}}
@@ -0,0 +1,24 @@
1
+ <div class="flex h-full flex-col bg-gray-50 dark:bg-gray-900">
2
+ <section class="flex-shrink-0 border-b border-gray-200 bg-white px-4 py-4 shadow-sm dark:border-gray-700 dark:bg-gray-900 dark:shadow-sm dark:shadow-black/30 md:px-6">
3
+ <div class="mx-auto flex w-full max-w-6xl flex-col gap-3 md:flex-row md:items-start md:justify-between">
4
+ <div>
5
+ <div class="text-xs font-semibold uppercase text-gray-400 dark:text-gray-500">Connectivity setup</div>
6
+ <h1 class="text-lg font-bold text-gray-900 dark:text-gray-100">Connect Provider</h1>
7
+ <p class="mt-1 text-sm text-gray-500 dark:text-gray-300">Create a provider connection, test credentials, and prepare device sync.</p>
8
+ </div>
9
+ <Button @icon="times" @text="Cancel" @size="sm" @onClick={{transition-to "connectivity.telematics.index"}} />
10
+ </div>
11
+ </section>
12
+
13
+ <Telematic::Form
14
+ @resource={{this.telematic}}
15
+ @controller={{this}}
16
+ @initialProviderKey={{this.setupProvider}}
17
+ @saveLabel="Create Connection"
18
+ @savingLabel="Creating connection"
19
+ @footerHelp="Save the connection, then open it to sync devices and attach them to vehicles."
20
+ @isSaving={{this.save.isRunning}}
21
+ @onCancel={{this.cancel}}
22
+ @onSave={{perform this.save this.telematic}}
23
+ />
24
+ </div>
@@ -12,6 +12,24 @@
12
12
  @actionButtons={{this.actionButtons}}
13
13
  @bulkActions={{this.bulkActions}}
14
14
  @controller={{this}}
15
+ @emptyStateComponent={{component
16
+ "table/empty-state"
17
+ icon="toolbox"
18
+ title="Add your first equipment item"
19
+ description="Equipment records help track assigned assets, condition, service history, and operational readiness."
20
+ filteredTitle="No equipment matches your filters"
21
+ filteredDescription="Adjust the search or filters to find another equipment item."
22
+ primaryText="New equipment"
23
+ primaryIcon="plus"
24
+ primaryAction=this.equipmentActions.transition.create
25
+ secondaryText="Import"
26
+ secondaryIcon="upload"
27
+ secondaryAction=this.equipmentActions.import
28
+ docsSlug="fleet-ops/maintenance/equipment/overview"
29
+ docsTitle="Equipment guide"
30
+ docsText="Equipment guide"
31
+ docsSource="fleet-ops-empty-equipment"
32
+ }}
15
33
  />
16
34
  {{else}}
17
35
  <Layout::Section::Header @title={{t "resource.equipment"}} @actionsWrapperClass="space-x-1">
@@ -46,4 +64,4 @@
46
64
  </Layout::Resource::CardsGrid>
47
65
  </Layout::Section::Body>
48
66
  {{/if}}
49
- {{outlet}}
67
+ {{outlet}}
@@ -10,5 +10,19 @@
10
10
  @actionButtons={{this.actionButtons}}
11
11
  @bulkActions={{this.bulkActions}}
12
12
  @controller={{this}}
13
+ @emptyStateComponent={{component
14
+ "table/empty-state"
15
+ icon="screwdriver-wrench"
16
+ title="No maintenance records yet"
17
+ description="Log maintenance events to keep service history, costs, and asset readiness visible."
18
+ filteredTitle="No maintenance records match your filters"
19
+ filteredDescription="Adjust the search or filters to find another maintenance record."
20
+ primaryText="New maintenance"
21
+ primaryIcon="plus"
22
+ primaryAction=this.maintenanceActions.transition.create
23
+ secondaryText="Import"
24
+ secondaryIcon="upload"
25
+ secondaryAction=this.maintenanceActions.import
26
+ }}
13
27
  />
14
- {{outlet}}
28
+ {{outlet}}
@@ -12,6 +12,24 @@
12
12
  @actionButtons={{this.actionButtons}}
13
13
  @bulkActions={{this.bulkActions}}
14
14
  @controller={{this}}
15
+ @emptyStateComponent={{component
16
+ "table/empty-state"
17
+ icon="gears"
18
+ title="Add your first part"
19
+ description="Parts keep replacement inventory and compatibility details ready for maintenance work."
20
+ filteredTitle="No parts match your filters"
21
+ filteredDescription="Adjust the search or filters to find another part."
22
+ primaryText="New part"
23
+ primaryIcon="plus"
24
+ primaryAction=this.partActions.transition.create
25
+ secondaryText="Import"
26
+ secondaryIcon="upload"
27
+ secondaryAction=this.partActions.import
28
+ docsSlug="fleet-ops/maintenance/parts/overview"
29
+ docsTitle="Parts guide"
30
+ docsText="Parts guide"
31
+ docsSource="fleet-ops-empty-parts"
32
+ }}
15
33
  />
16
34
  {{else}}
17
35
  <Layout::Section::Header @title={{t "resource.parts"}} @actionsWrapperClass="space-x-1">
@@ -46,4 +64,4 @@
46
64
  </Layout::Resource::CardsGrid>
47
65
  </Layout::Section::Body>
48
66
  {{/if}}
49
- {{outlet}}
67
+ {{outlet}}
@@ -35,6 +35,24 @@
35
35
  @actionButtons={{this.actionButtons}}
36
36
  @bulkActions={{this.bulkActions}}
37
37
  @controller={{this}}
38
+ @emptyStateComponent={{component
39
+ "table/empty-state"
40
+ icon="calendar-check"
41
+ title="Create your first maintenance schedule"
42
+ description="Schedules help automate preventive work and keep service intervals visible before assets fall behind."
43
+ filteredTitle="No maintenance schedules match your filters"
44
+ filteredDescription="Adjust the search or filters to find another schedule."
45
+ primaryText="New schedule"
46
+ primaryIcon="plus"
47
+ primaryAction=this.maintenanceScheduleActions.transition.create
48
+ secondaryText="Import"
49
+ secondaryIcon="upload"
50
+ secondaryAction=this.maintenanceScheduleActions.import
51
+ docsSlug="fleet-ops/maintenance/schedules/overview"
52
+ docsTitle="Schedules guide"
53
+ docsText="Schedules guide"
54
+ docsSource="fleet-ops-empty-maintenance-schedules"
55
+ }}
38
56
  />
39
57
  {{/if}}
40
- {{outlet}}
58
+ {{outlet}}
@@ -10,5 +10,23 @@
10
10
  @actionButtons={{this.actionButtons}}
11
11
  @bulkActions={{this.bulkActions}}
12
12
  @controller={{this}}
13
+ @emptyStateComponent={{component
14
+ "table/empty-state"
15
+ icon="clipboard-list"
16
+ title="No work orders yet"
17
+ description="Create work orders to assign maintenance tasks, track progress, and close out repairs."
18
+ filteredTitle="No work orders match your filters"
19
+ filteredDescription="Adjust the search or filters to find another work order."
20
+ primaryText="New work order"
21
+ primaryIcon="plus"
22
+ primaryAction=this.workOrderActions.transition.create
23
+ secondaryText="Import"
24
+ secondaryIcon="upload"
25
+ secondaryAction=this.workOrderActions.import
26
+ docsSlug="fleet-ops/maintenance/work-orders/overview"
27
+ docsTitle="Work orders guide"
28
+ docsText="Work orders guide"
29
+ docsSource="fleet-ops-empty-work-orders"
30
+ }}
13
31
  />
14
- {{outlet}}
32
+ {{outlet}}
@@ -1,7 +1,7 @@
1
1
  <Layout::Resource::Panel
2
2
  @resource={{@model}}
3
3
  @controller={{this}}
4
- @headerComponent={{component "contact/panel-header" resource=@model}}
4
+ @headerComponent={{component "contact/panel-header" resource=@model actionButtons=this.actionButtons}}
5
5
  @headerTitle={{or @model.name}}
6
6
  @actionButtons={{this.actionButtons}}
7
7
  @onPressCancel={{transition-to "management.contacts.customers"}}
@@ -11,6 +11,20 @@
11
11
  @actionButtons={{this.actionButtons}}
12
12
  @bulkActions={{this.bulkActions}}
13
13
  @controller={{this}}
14
+ @emptyStateComponent={{component
15
+ "table/empty-state"
16
+ icon="user-group"
17
+ title="Add your first customer"
18
+ description="Customers give orders an owner, contact details, and account context for service history."
19
+ filteredTitle="No customers match your filters"
20
+ filteredDescription="Adjust the search or filters to find another customer."
21
+ primaryText="New customer"
22
+ primaryIcon="plus"
23
+ primaryAction=this.customerActions.transition.create
24
+ secondaryText="Import"
25
+ secondaryIcon="upload"
26
+ secondaryAction=this.customerActions.import
27
+ }}
14
28
  @withoutHeader={{true}}
15
29
  />
16
- {{outlet}}
30
+ {{outlet}}
@@ -1,7 +1,7 @@
1
1
  <Layout::Resource::Panel
2
2
  @resource={{@model}}
3
3
  @controller={{this}}
4
- @headerComponent={{component "contact/panel-header" resource=@model}}
4
+ @headerComponent={{component "contact/panel-header" resource=@model actionButtons=this.actionButtons}}
5
5
  @headerTitle={{or @model.name}}
6
6
  @actionButtons={{this.actionButtons}}
7
7
  @onPressCancel={{transition-to "management.contacts.index"}}
@@ -11,6 +11,24 @@
11
11
  @actionButtons={{this.actionButtons}}
12
12
  @bulkActions={{this.bulkActions}}
13
13
  @controller={{this}}
14
+ @emptyStateComponent={{component
15
+ "table/empty-state"
16
+ icon="address-book"
17
+ title="Add your first contact"
18
+ description="Contacts keep customer, vendor, and internal stakeholder details ready for orders and communication."
19
+ filteredTitle="No contacts match your filters"
20
+ filteredDescription="Adjust the search or filters to find another contact."
21
+ primaryText="New contact"
22
+ primaryIcon="plus"
23
+ primaryAction=this.contactActions.transition.create
24
+ secondaryText="Import"
25
+ secondaryIcon="upload"
26
+ secondaryAction=this.contactActions.import
27
+ docsSlug="fleet-ops/resources/contacts/overview"
28
+ docsTitle="Contacts guide"
29
+ docsText="Contacts guide"
30
+ docsSource="fleet-ops-empty-contacts"
31
+ }}
14
32
  @withoutHeader={{true}}
15
33
  />
16
- {{outlet}}
34
+ {{outlet}}
@@ -1,4 +1,4 @@
1
- <TabNavigation @tabs={{this.tabs}} @size="lg" @tablistClass="next-view-section-subheader-fixed-height pl-2">
1
+ <TabNavigation @tabs={{this.tabs}} @size="lg" @containerClass="tab-navigation-fill" @tablistClass="next-view-section-subheader-fixed-height pl-2">
2
2
  <:actions>
3
3
  <div class="flex flex-row items-center space-x-1 pr-4">
4
4
  <Layout::Resource::TabularActions
@@ -16,4 +16,4 @@
16
16
  <:default>
17
17
  {{outlet}}
18
18
  </:default>
19
- </TabNavigation>
19
+ </TabNavigation>
@@ -0,0 +1 @@
1
+ <ActivityLog @subjectId={{@model.id}} class="p-3" />
@@ -11,5 +11,23 @@
11
11
  @actionButtons={{this.actionButtons}}
12
12
  @bulkActions={{this.bulkActions}}
13
13
  @controller={{this}}
14
+ @emptyStateComponent={{component
15
+ "table/empty-state"
16
+ icon="id-card"
17
+ title="Add your first driver"
18
+ description="Drivers power dispatching, live fleet visibility, assignments, and delivery activity."
19
+ filteredTitle="No drivers match your search"
20
+ filteredDescription="Adjust the search or filters to find another driver."
21
+ primaryText="New driver"
22
+ primaryIcon="plus"
23
+ primaryAction=this.driverActions.transition.create
24
+ secondaryText="Import"
25
+ secondaryIcon="upload"
26
+ secondaryAction=this.driverActions.import
27
+ docsSlug="fleet-ops/resources/drivers/overview"
28
+ docsTitle="Drivers guide"
29
+ docsText="Driver guide"
30
+ docsSource="fleet-ops-empty-drivers"
31
+ }}
14
32
  />
15
- {{outlet}}
33
+ {{outlet}}