@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
package/README.md CHANGED
@@ -1,122 +1,238 @@
1
1
  <p align="center">
2
- <img src="https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/fleetbase-logo-svg.svg" width="380" height="100" />
2
+ <img src="https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/fleetbase-logo-svg.svg" alt="Fleetbase" width="380" height="100">
3
3
  </p>
4
+
5
+ <p align="center">
6
+ Open-source fleet, dispatch, transport management, and real-time logistics operations for Fleetbase.
7
+ </p>
8
+
4
9
  <p align="center">
5
- Open-source Fleet & Transport Management Extension for Fleetbase
10
+ <a href="https://github.com/fleetbase/fleetops">
11
+ <img src="https://img.shields.io/badge/repo-fleetbase%2Ffleetops-111827?style=flat-square" alt="Repository">
12
+ </a>
13
+ <a href="https://github.com/fleetbase/fleetops/blob/master/LICENSE.md">
14
+ <img src="https://img.shields.io/badge/license-AGPL--3.0--or--later-blue?style=flat-square" alt="License: AGPL-3.0-or-later">
15
+ </a>
16
+ <a href="https://www.npmjs.com/package/@fleetbase/fleetops-engine">
17
+ <img src="https://img.shields.io/badge/npm-%40fleetbase%2Ffleetops--engine-CB3837?style=flat-square" alt="NPM package">
18
+ </a>
19
+ <a href="https://packagist.org/packages/fleetbase/fleetops-api">
20
+ <img src="https://img.shields.io/badge/packagist-fleetbase%2Ffleetops--api-F28D1A?style=flat-square" alt="Packagist package">
21
+ </a>
22
+ <a href="https://www.fleetbase.io/docs/fleet-ops">
23
+ <img src="https://img.shields.io/badge/docs-fleet--ops-0EA5E9?style=flat-square" alt="Fleet-Ops documentation">
24
+ </a>
25
+ <img src="https://img.shields.io/badge/node-%3E%3D18-339933?style=flat-square" alt="Node >= 18">
26
+ <img src="https://img.shields.io/badge/php-%5E8.0-777BB4?style=flat-square" alt="PHP ^8.0">
6
27
  </p>
7
28
 
8
- ---
29
+ <p align="center">
30
+ <img src="https://www.fleetbase.io/images/screenshots/fleet-ops/fleet-ops-multi-waypoint-order.webp" alt="Fleet-Ops multi-waypoint order with live map, route, driver assignment, and order details" width="900">
31
+ </p>
9
32
 
10
- ## Overview
33
+ ## What is Fleet-Ops?
11
34
 
12
- This monorepo contains both the frontend and backend components of the FleetOps extension for Fleetbase. The frontend is built using Ember.js and the backend is implemented in PHP.
35
+ Fleet-Ops is the core logistics and fleet management extension for the [Fleetbase](https://www.fleetbase.io) platform. It gives operations teams a dispatch console for managing orders, drivers, vehicles, fleets, service areas, live maps, route execution, analytics, maintenance, and connected telematics.
13
36
 
14
- ### Requirements
37
+ Fleet-Ops ships as two packages:
15
38
 
16
- * PHP 8.0 or above
17
- * Ember.js v4.8 or above
18
- * Ember CLI v4.8 or above
19
- * Node.js v18 or above
39
+ | Package | Purpose |
40
+ | --- | --- |
41
+ | `@fleetbase/fleetops-engine` | Ember Engine/Add-on that powers the Fleet-Ops console UI. |
42
+ | `fleetbase/fleetops-api` | Laravel/PHP package that provides the Fleet-Ops API, models, jobs, events, and integrations. |
20
43
 
21
- ## Structure
44
+ Fleet-Ops is included with Fleetbase Cloud and self-hosted Fleetbase installations. For product concepts, workflows, and setup guides, start with the [Fleet-Ops documentation](https://www.fleetbase.io/docs/fleet-ops).
22
45
 
23
- ```
24
- ├── addon
25
- ├── app
26
- ├── assets
27
- ├── translations
28
- ├── config
29
- ├── node_modules
30
- ├── server
31
- │ ├── config
32
- │ ├── data
33
- │ ├── migrations
34
- │ ├── resources
35
- │ ├── src
36
- │ ├── tests
37
- │ └── vendor
38
- ├── tests
39
- ├── testem.js
40
- ├── index.js
41
- ├── package.json
42
- ├── phpstan.neon.dist
43
- ├── phpunit.xml.dist
44
- ├── pnpm-lock.yaml
45
- ├── ember-cli-build.js
46
- ├── composer.json
47
- ├── CONTRIBUTING.md
48
- ├── LICENSE.md
49
- ├── README.md
46
+ ## Features
47
+
48
+ ### Operations
49
+
50
+ - Create, import, schedule, dispatch, start, cancel, and complete delivery orders.
51
+ - Manage multi-waypoint routes, payloads, entities, labels, order metadata, notes, comments, files, and proofs.
52
+ - Track live order progress with ETAs, route overlays, driver pings, activity timelines, and configurable status flows.
53
+ - Configure custom order types, activity flows, entity fields, proof requirements, and service-rate rules.
54
+ - Run orchestration workflows for order allocation, driver assignment, vehicle capacity, and route sequencing.
55
+ - Plan work with the scheduler, fleet schedule, service quotes, routes, manifests, and manifest stops.
56
+
57
+ ### Live Map
58
+
59
+ - View live drivers, vehicles, active orders, routes, places, service areas, zones, and geofences.
60
+ - Filter and inspect operational layers with Fleet-Ops map controls and drawer panels.
61
+ - Support Leaflet-based and Google-based map experiences through Fleetbase map settings.
62
+ - Capture positions, replay movement, track vehicles and drivers, and surface geofence events.
63
+
64
+ ### Fleet Management
65
+
66
+ - Manage drivers, vehicles, fleets, places, contacts, customers, vendors, and integrated vendors.
67
+ - Assign drivers and vehicles to fleets, vendors, and orders.
68
+ - Track driver schedules, availability, positions, active shifts, and hours-of-service status.
69
+ - Track vehicle status, devices, positions, equipment, schedules, work orders, and maintenance history.
70
+ - Manage issues, fuel reports, imports, exports, bulk actions, and custom resource fields.
71
+
72
+ ### Maintenance
73
+
74
+ - Define preventive maintenance schedules and calendar feeds.
75
+ - Manage work orders, maintenance records, line items, equipment, parts, and warranties.
76
+ - Send work orders, trigger schedule runs, pause and resume schedules, and review maintenance history.
77
+
78
+ ### Connectivity
79
+
80
+ - Connect telematics providers, devices, sensors, events, and tracking data.
81
+ - Discover and link telematics devices, test provider credentials, and receive telematics webhooks.
82
+ - Use Fleet-Ops tracking providers for calculated, OSRM, and Google Routes-backed route intelligence.
83
+
84
+ ### Analytics and Dashboards
85
+
86
+ - Use Fleet-Ops KPI widgets for earnings, average order value, distance, active orders, online drivers, and open issues.
87
+ - Review analytics for operations pulse, live fleet, revenue trends, order status volume, on-time delivery, top drivers, fuel efficiency, issues, maintenance, and geofence violations.
88
+ - Create and view reports from the Fleet-Ops analytics workspace.
89
+
90
+ ### Settings and Extensions
91
+
92
+ - Configure Navigator app onboarding, routing, tracking, map providers, notifications, scheduling, payments, orchestrator settings, custom fields, and avatars.
93
+ - Expose Fleet-Ops order tracking on the Fleetbase login surface.
94
+ - Integrate Fleet-Ops entities into other Fleetbase extensions through registered components and virtual detail tabs.
95
+
96
+ ## Architecture
97
+
98
+ Fleet-Ops follows the Fleetbase extension architecture: an Ember Engine for the console interface and a Laravel package for API and backend capabilities.
99
+
100
+ ```text
101
+ fleetops/
102
+ +-- addon/ # Ember Engine source: routes, controllers, components, services, templates
103
+ +-- app/ # Ember app re-exports and integration points
104
+ +-- assets/ # Frontend assets bundled with the engine
105
+ +-- translations/ # Fleet-Ops locale files
106
+ +-- server/
107
+ | +-- config/ # Fleet-Ops API configuration
108
+ | +-- migrations/ # Database migrations
109
+ | +-- resources/ # Backend views and resources
110
+ | +-- seeders/ # Seed data
111
+ | +-- src/ # Controllers, models, jobs, events, support services, providers
112
+ | +-- tests/ # Backend test suite
113
+ +-- tests/ # Ember test suite
114
+ +-- package.json # Frontend package metadata and scripts
115
+ +-- composer.json # Backend package metadata and scripts
50
116
  ```
51
117
 
52
- ## Installation
118
+ Core frontend dependencies include Ember Octane, Ember Engines, Fleetbase Ember Core, Fleetbase UI, Fleet-Ops Data, Leaflet, Leaflet Draw, Turf, JointJS, and Stripe Connect. Core backend capabilities are provided by Laravel, Fleetbase Core API, Fleet-Ops models/controllers, orchestration engines, tracking providers, analytics, notifications, jobs, and telematics integrations.
53
119
 
54
- ### Backend
120
+ ## Getting Started
55
121
 
56
- Install the PHP packages using Composer:
122
+ Fleet-Ops comes pre-installed with Fleetbase Cloud and standard self-hosted Fleetbase installations. If you are setting up the Fleetbase platform itself, use the Fleetbase documentation:
123
+
124
+ - [Fleet-Ops documentation](https://www.fleetbase.io/docs/fleet-ops)
125
+ - [Fleetbase documentation](https://www.fleetbase.io/docs)
126
+ - [Fleetbase console](https://console.fleetbase.io)
127
+
128
+ When developing Fleet-Ops from source, install both frontend and backend dependencies:
57
129
 
58
130
  ```bash
59
- composer require fleetbase/core-api
60
- composer require fleetbase/fleetops-api
131
+ pnpm install
132
+ composer install
61
133
  ```
62
- ### Frontend
63
134
 
64
- Install the Ember.js Engine/Addon:
135
+ ### Link Fleet-Ops into Fleetbase
136
+
137
+ When working from the Fleetbase monorepo, use the Fleetbase package linker to connect this local package to the running Console and API applications. From the Fleetbase repository root:
65
138
 
66
139
  ```bash
67
- pnpm install @fleetbase/fleetops-engine
140
+ flb-package-linker enable fleetops
141
+ flb-package-linker install fleetops
68
142
  ```
69
143
 
70
- ## Usage
144
+ This links the local Fleet-Ops Ember engine and Laravel package so Console and API use your source checkout instead of the published packages. See the [Fleetbase development setup guide](https://www.fleetbase.io/docs/platform/quickstart/development-setup) for the full package-linking workflow, Docker setup, Octane reload notes, and frontend hot-reload options.
145
+
146
+ ### Link Fleet-Ops Data
71
147
 
72
- ### Backend
148
+ Fleet-Ops also depends on the shared `@fleetbase/fleetops-data` package. That package contains Fleet-Ops Ember Data models, adapters, and serializers, and can be reused by other Fleetbase modules that need to read or write Fleet-Ops resources without duplicating data-layer definitions.
149
+
150
+ If you are changing shared Fleet-Ops data models or consuming them from another extension, link `fleetops-data` through the root Console workspace:
73
151
 
74
- 🧹 Keep a modern codebase with **PHP CS Fixer**:
75
152
  ```bash
76
- composer lint
153
+ flb-package-linker enable-shared fleetops-data
154
+ flb-package-linker install
77
155
  ```
78
156
 
79
- ⚗️ Run static analysis using **PHPStan**:
157
+ For broader Fleet-Ops frontend work, you may also link the common shared Ember packages used by Fleetbase:
158
+
80
159
  ```bash
81
- composer test:types
160
+ flb-package-linker enable fleetops --shared ember-core ember-ui fleetops-data
161
+ flb-package-linker install fleetops
82
162
  ```
83
163
 
84
- ✅ Run unit tests using **PEST**
164
+ ## Development
165
+
166
+ Start the Ember Engine in development mode:
167
+
85
168
  ```bash
86
- composer test:unit
169
+ pnpm start
87
170
  ```
88
171
 
89
- 🚀 Run the entire test suite:
172
+ Build the production frontend bundle:
173
+
90
174
  ```bash
91
- composer test
175
+ pnpm build
92
176
  ```
93
177
 
94
- ### Frontend
178
+ Run frontend linting:
95
179
 
96
- 🧹 Keep a modern codebase with **ESLint**:
97
180
  ```bash
98
181
  pnpm lint
99
182
  ```
100
183
 
101
- ✅ Run unit tests using **Ember/QUnit**
184
+ Run backend linting:
185
+
186
+ ```bash
187
+ composer test:lint
188
+ ```
189
+
190
+ ## Testing
191
+
192
+ Run the Ember/QUnit test suite:
193
+
102
194
  ```bash
103
- pnpm test
104
195
  pnpm test:ember
105
- pnpm test:ember-compatibility
106
196
  ```
107
197
 
108
- 🚀 Start the Ember Addon/Engine
198
+ Run the full frontend check suite:
199
+
109
200
  ```bash
110
- pnpm start
201
+ pnpm test
111
202
  ```
112
203
 
113
- 🔨 Build the Ember Addon/Engine
204
+ Run the backend test suite:
205
+
114
206
  ```bash
115
- pnpm build
207
+ composer test
116
208
  ```
117
209
 
210
+ Run backend checks individually:
211
+
212
+ ```bash
213
+ composer test:lint
214
+ composer test:types
215
+ composer test:unit
216
+ ```
217
+
218
+ ## Documentation
219
+
220
+ - [Fleet-Ops docs](https://www.fleetbase.io/docs/fleet-ops)
221
+ - [Fleet-Ops quickstart](https://www.fleetbase.io/docs/fleet-ops/getting-started/quickstart)
222
+ - [Fleet-Ops core concepts](https://www.fleetbase.io/docs/fleet-ops/getting-started/core-concepts)
223
+ - [Navigator app setup](https://www.fleetbase.io/docs/fleet-ops/getting-started/navigator-app-setup)
224
+ - [Fleetbase docs](https://www.fleetbase.io/docs)
225
+
118
226
  ## Contributing
119
- See the Contributing Guide for details on how to contribute to this project.
227
+
228
+ Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
229
+
230
+ Useful project files:
231
+
232
+ - [package.json](package.json) for frontend scripts and package metadata.
233
+ - [composer.json](composer.json) for backend scripts and package metadata.
234
+ - [extension.json](extension.json) for Fleetbase extension metadata.
120
235
 
121
236
  ## License
122
- This project is licensed under the MIT License.
237
+
238
+ Fleet-Ops is open-source software licensed under the [GNU Affero General Public License v3.0 or later](LICENSE.md).
@@ -0,0 +1,16 @@
1
+ <div ...attributes>
2
+ <button
3
+ type="button"
4
+ disabled={{and @column.permission (cannot @column.permission)}}
5
+ {{on "click" this.onClick}}
6
+ class="flex min-w-0 max-w-md items-start gap-2 py-1 text-left"
7
+ >
8
+ <div class="pt-0.5">
9
+ <Image src={{this.icon}} class="mr-3 h-8 w-8 flex-shrink-0 rounded-md" />
10
+ </div>
11
+ <div class="min-w-0 text-left">
12
+ <div class="truncate text-sm font-semibold text-gray-900 hover:text-blue-600 dark:text-gray-100 dark:hover:text-blue-300">{{n-a this.name}}</div>
13
+ <div class="mt-0.5 line-clamp-2 whitespace-normal text-left text-xs leading-4 text-gray-500 dark:text-gray-400">{{n-a this.description}}</div>
14
+ </div>
15
+ </button>
16
+ </div>
@@ -0,0 +1,36 @@
1
+ import Component from '@glimmer/component';
2
+ import { action } from '@ember/object';
3
+
4
+ export default class CellTelematicProviderComponent extends Component {
5
+ get descriptor() {
6
+ return this.args.row?.provider_descriptor ?? {};
7
+ }
8
+
9
+ get name() {
10
+ return this.args.row?.name ?? this.descriptor.label ?? this.args.row?.provider;
11
+ }
12
+
13
+ get description() {
14
+ return this.descriptor.description ?? this.args.row?.provider;
15
+ }
16
+
17
+ get icon() {
18
+ return this.descriptor.icon;
19
+ }
20
+
21
+ @action onClick(event) {
22
+ const { row, column, onClick } = this.args;
23
+
24
+ if (typeof onClick === 'function') {
25
+ onClick(row, event);
26
+ }
27
+
28
+ if (typeof column?.action === 'function') {
29
+ column.action(row, event);
30
+ }
31
+
32
+ if (typeof column?.onClick === 'function') {
33
+ column.onClick(row, event);
34
+ }
35
+ }
36
+ }
@@ -0,0 +1 @@
1
+ <Badge @status={{this.badgeStatus}} @hideStatusDot={{true}}>{{this.label}}</Badge>
@@ -0,0 +1,39 @@
1
+ import Component from '@glimmer/component';
2
+
3
+ export default class CellTelematicStatusComponent extends Component {
4
+ get status() {
5
+ return this.args.row?.status;
6
+ }
7
+
8
+ get badgeStatus() {
9
+ switch (this.status) {
10
+ case 'active':
11
+ case 'connected':
12
+ return 'success';
13
+ case 'synchronizing':
14
+ return 'info';
15
+ case 'error':
16
+ case 'degraded':
17
+ case 'disconnected':
18
+ return 'warning';
19
+ default:
20
+ return this.status ?? 'default';
21
+ }
22
+ }
23
+
24
+ get label() {
25
+ switch (this.status) {
26
+ case 'active':
27
+ case 'connected':
28
+ return 'Connected';
29
+ case 'synchronizing':
30
+ return 'Syncing';
31
+ case 'initialized':
32
+ return 'Not tested';
33
+ case 'error':
34
+ return 'Needs attention';
35
+ default:
36
+ return this.status ?? 'Unknown';
37
+ }
38
+ }
39
+ }
@@ -13,55 +13,18 @@
13
13
  </div>
14
14
  </div>
15
15
  <div class="next-view-header-right">
16
- <div class="flex flex-row flex-1 justify-end space-x-2">
16
+ <Layout::Resource::Panel::HeaderActions
17
+ @resource={{@resource}}
18
+ @saveTask={{@saveTask}}
19
+ @saveOptions={{@saveOptions}}
20
+ @saveDisabled={{@saveDisabled}}
21
+ @pojoResource={{@pojoResource}}
22
+ @authSchema={{@authSchema}}
23
+ @actionButtons={{@actionButtons}}
24
+ @onPressCancel={{@onPressCancel}}
25
+ >
17
26
  {{yield}}
18
- {{#if @saveTask}}
19
- <Button
20
- @type="primary"
21
- @icon={{if @resource.isNew "check" "save"}}
22
- @text={{if @resource.isNew (concat "Create " this.modelName) "Save Changes"}}
23
- @onClick={{perform @saveTask @resource}}
24
- @disabled={{cannot-write @resource schema=@authSchema}}
25
- @isLoading={{@saveTask.isRunning}}
26
- />
27
- {{/if}}
28
- {{#each @actionButtons as |actionButton|}}
29
- <Button
30
- @type={{actionButton.type}}
31
- @text={{actionButton.text}}
32
- @onClick={{if actionButton.perform (perform actionButton.perform) (or actionButton.onClick actionButton.fn)}}
33
- @size={{actionButton.size}}
34
- @buttonType={{actionButton.buttonType}}
35
- @disabled={{actionButton.disabled}}
36
- @exampleText={{actionButton.exampleText}}
37
- @helpText={{actionButton.helpText}}
38
- @icon={{actionButton.icon}}
39
- @iconClass={{actionButton.iconClass}}
40
- @iconFlip={{actionButton.iconFlip}}
41
- @iconPrefix={{actionButton.iconPrefix}}
42
- @iconRotation={{actionButton.iconRotation}}
43
- @iconSize={{actionButton.iconSize}}
44
- @isLoading={{actionButton.isLoading}}
45
- @outline={{actionButton.outline}}
46
- @permission={{actionButton.permission}}
47
- @wrapperClass={{actionButton.wrapperClass}}
48
- @textClass={{actionButton.textClass}}
49
- @tooltipPlacement={{actionButton.tooltipPlacement}}
50
- @visible={{actionButton.visible}}
51
- />
52
- {{/each}}
53
- {{#if @onPressCancel}}
54
- <button
55
- type="button"
56
- class="next-content-overlay-panel-cancel-button {{@cancelButtonClass}}"
57
- {{set-height @cancelButtonHeight}}
58
- {{set-width @cancelButtonWidth}}
59
- {{on "click" @onPressCancel}}
60
- >
61
- <FaIcon @icon={{or @cancelIcon "times"}} @size={{@iconSize}} @prefix={{or @iconPrefix "fas"}} class={{@iconClass}} />
62
- </button>
63
- {{/if}}
64
- </div>
27
+ </Layout::Resource::Panel::HeaderActions>
65
28
  </div>
66
29
  </div>
67
30
  </div>
@@ -47,6 +47,5 @@
47
47
  </div>
48
48
  </div>
49
49
  </ContentPanel>
50
-
51
50
  <CustomField::Yield @subject={{@resource}} @viewMode={{true}} @wrapperClass="bordered-top" />
52
- </div>
51
+ </div>
@@ -1,53 +1,4 @@
1
1
  <div class="form-wrapper" ...attributes>
2
- <ContentPanel @title={{t "customer.fields.user-account"}} @open={{true}} @actionButtons={{this.userAccountActionButtons}} @wrapperClass="bordered-top">
3
- <div class="space-y-2">
4
- <InputGroup @name={{t "customer.fields.user-account"}} @helpText={{t "customer.fields.user-account-help-text"}}>
5
- <ModelSelect
6
- @modelName="user"
7
- @selectedModel={{@resource.user}}
8
- @placeholder={{t "customer.fields.select-user"}}
9
- @query={{hash doesnt_have_contact=true is_customer=true}}
10
- @triggerClass="form-select form-input"
11
- @infiniteScroll={{false}}
12
- @renderInPlace={{true}}
13
- @onChange={{fn (mut @resource.user)}}
14
- @permission="fleet-ops update-user-for customer"
15
- as |model|
16
- >
17
- <div class="flex flex-row">
18
- <div class="mr-2 w-6">
19
- <Image src={{model.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-6 h-6 rounded-md" />
20
- </div>
21
- <div class="flex flex-col">
22
- <div class="font-semibold">{{model.name}}</div>
23
- <div class="text-xs flex flex-row items-center leading-4">
24
- <FaIcon @icon="envelope" @size="sm" class="mr-1 opacity-75" />
25
- <span>{{n-a model.email}}</span>
26
- </div>
27
- <div class="text-xs flex flex-row items-center leading-4">
28
- <FaIcon @icon="phone" @size="sm" class="mr-1 opacity-75" />
29
- <span>{{n-a model.phone}}</span>
30
- </div>
31
- </div>
32
- </div>
33
- </ModelSelect>
34
- </InputGroup>
35
- {{#if @resource.user}}
36
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-2 no-input-group-padding">
37
- <InputGroup @name={{t "common.name"}} @wrapperClass="col-span-2 mb-0i">
38
- <Input @value={{@resource.user.name}} @type="text" class="w-full form-input" placeholder={{t "common.name"}} disabled={{true}} />
39
- </InputGroup>
40
- <InputGroup @name={{t "common.email"}} @wrapperClass="mb-0i">
41
- <Input @value={{@resource.user.email}} @type="text" class="w-full form-input" placeholder={{t "common.email"}} disabled={{true}} />
42
- </InputGroup>
43
- <InputGroup @name={{t "common.phone"}} @wrapperClass="mb-0i">
44
- <PhoneInput @value={{@resource.user.phone}} @onInput={{fn (mut @resource.phone)}} class="form-input w-full" disabled={{true}} />
45
- </InputGroup>
46
- </div>
47
- {{/if}}
48
- </div>
49
- </ContentPanel>
50
-
51
2
  <ContentPanel @title={{t "customer.fields.customer-details"}} @open={{true}} @wrapperClass="bordered-top">
52
3
  <div class="flex flex-row space-x-3 mb-3">
53
4
  <div class="flex items-center justify-start rounded-full">
@@ -125,20 +76,81 @@
125
76
  as |model|
126
77
  >
127
78
  <div class="flex items-center flex-row justify-between">
128
- <div class="truncate flex-1">{{n-a model.address}}</div>
79
+ <div class="truncate flex-1">{{place-address-html model}}</div>
129
80
  <Badge @hideStatusDot={{true}} @status="info">{{model.public_id}}</Badge>
130
81
  </div>
131
82
  </ModelSelect>
132
83
  </InputGroup>
84
+ {{#if this.showWelcomeEmailOption}}
85
+ <div class="col-span-2 mt-3">
86
+ <Checkbox
87
+ @value={{this.sendWelcomeEmail}}
88
+ @label={{t "customer.fields.send-welcome-email"}}
89
+ @helpText={{t "customer.fields.send-welcome-email-help-text"}}
90
+ @onToggle={{this.toggleWelcomeEmail}}
91
+ @alignItems="center"
92
+ @labelClass="mb-0i"
93
+ />
94
+ </div>
95
+ {{/if}}
133
96
  <RegistryYield @registry="fleet-ops:component:customer:form:details" as |RegistryComponent|>
134
97
  <RegistryComponent @resource={{@resource}} @controller={{@controller}} @permission={{get-write-permission @resource}} />
135
98
  </RegistryYield>
136
99
  </div>
137
100
  </ContentPanel>
138
101
 
102
+ <ContentPanel @title={{t "customer.fields.user-account"}} @open={{true}} @actionButtons={{this.userAccountActionButtons}} @wrapperClass="bordered-top">
103
+ <div class="space-y-2">
104
+ <InputGroup @name={{t "customer.fields.user-account"}} @helpText={{t "customer.fields.user-account-help-text"}}>
105
+ <ModelSelect
106
+ @modelName="user"
107
+ @selectedModel={{@resource.user}}
108
+ @placeholder={{t "customer.fields.select-user"}}
109
+ @query={{hash doesnt_have_contact=true is_customer=true}}
110
+ @triggerClass="form-select form-input"
111
+ @infiniteScroll={{false}}
112
+ @renderInPlace={{true}}
113
+ @onChange={{fn (mut @resource.user)}}
114
+ @permission="fleet-ops update-user-for customer"
115
+ as |model|
116
+ >
117
+ <div class="flex flex-row">
118
+ <div class="mr-2 w-6">
119
+ <Image src={{model.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-6 h-6 rounded-md" />
120
+ </div>
121
+ <div class="flex flex-col">
122
+ <div class="font-semibold">{{model.name}}</div>
123
+ <div class="text-xs flex flex-row items-center leading-4">
124
+ <FaIcon @icon="envelope" @size="sm" class="mr-1 opacity-75" />
125
+ <span>{{n-a model.email}}</span>
126
+ </div>
127
+ <div class="text-xs flex flex-row items-center leading-4">
128
+ <FaIcon @icon="phone" @size="sm" class="mr-1 opacity-75" />
129
+ <span>{{n-a model.phone}}</span>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </ModelSelect>
134
+ </InputGroup>
135
+ {{#if @resource.user}}
136
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-2 no-input-group-padding">
137
+ <InputGroup @name={{t "common.name"}} @wrapperClass="col-span-2 mb-0i">
138
+ <Input @value={{@resource.user.name}} @type="text" class="w-full form-input" placeholder={{t "common.name"}} disabled={{true}} />
139
+ </InputGroup>
140
+ <InputGroup @name={{t "common.email"}} @wrapperClass="mb-0i">
141
+ <Input @value={{@resource.user.email}} @type="text" class="w-full form-input" placeholder={{t "common.email"}} disabled={{true}} />
142
+ </InputGroup>
143
+ <InputGroup @name={{t "common.phone"}} @wrapperClass="mb-0i">
144
+ <PhoneInput @value={{@resource.user.phone}} @onInput={{fn (mut @resource.phone)}} class="form-input w-full" disabled={{true}} />
145
+ </InputGroup>
146
+ </div>
147
+ {{/if}}
148
+ </div>
149
+ </ContentPanel>
150
+
139
151
  <CustomField::Yield @subject={{@resource}} @wrapperClass="bordered-top" />
140
152
 
141
153
  <RegistryYield @registry="fleet-ops:component:customer:form" as |RegistryComponent|>
142
154
  <RegistryComponent @resource={{@resource}} @controller={{@controller}} @permission={{get-write-permission @resource}} />
143
155
  </RegistryYield>
144
- </div>
156
+ </div>