@fleetbase/fleetops-engine 0.0.1

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 (446) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +32 -0
  3. package/addon/components/cell/driver-name.hbs +13 -0
  4. package/addon/components/cell/driver-name.js +30 -0
  5. package/addon/components/custom-field-value.hbs +11 -0
  6. package/addon/components/custom-field-value.js +41 -0
  7. package/addon/components/custom-field.hbs +42 -0
  8. package/addon/components/custom-field.js +46 -0
  9. package/addon/components/display-place.hbs +52 -0
  10. package/addon/components/display-place.js +11 -0
  11. package/addon/components/driver-card-mini.hbs +12 -0
  12. package/addon/components/driver-card-mini.js +25 -0
  13. package/addon/components/driver-card.hbs +27 -0
  14. package/addon/components/driver-card.js +14 -0
  15. package/addon/components/event-timeline/event.hbs +5 -0
  16. package/addon/components/event-timeline.hbs +7 -0
  17. package/addon/components/event-timeline.js +423 -0
  18. package/addon/components/file-icon.js +1 -0
  19. package/addon/components/fleet-driver-listing.hbs +73 -0
  20. package/addon/components/fleet-driver-listing.js +117 -0
  21. package/addon/components/full-calendar/draggable.js +1 -0
  22. package/addon/components/full-calendar.js +1 -0
  23. package/addon/components/full-size.js +1 -0
  24. package/addon/components/global-search.hbs +84 -0
  25. package/addon/components/global-search.js +52 -0
  26. package/addon/components/horizontal-route.hbs +33 -0
  27. package/addon/components/horizontal-route.js +48 -0
  28. package/addon/components/integrated-order-details.hbs +117 -0
  29. package/addon/components/integrated-order-details.js +10 -0
  30. package/addon/components/leaflet-draw-control.js +147 -0
  31. package/addon/components/leaflet-rotated-marker.js +24 -0
  32. package/addon/components/live-map.hbs +63 -0
  33. package/addon/components/live-map.js +856 -0
  34. package/addon/components/map-container/toolbar/zones-panel.hbs +41 -0
  35. package/addon/components/map-container/toolbar/zones-panel.js +106 -0
  36. package/addon/components/map-container/toolbar-container.hbs +1 -0
  37. package/addon/components/map-container/toolbar-container.js +3 -0
  38. package/addon/components/map-container/toolbar.hbs +51 -0
  39. package/addon/components/map-container/toolbar.js +34 -0
  40. package/addon/components/map-container/topbar.hbs +1 -0
  41. package/addon/components/map-container/topbar.js +3 -0
  42. package/addon/components/map-container/view-switch.hbs +1 -0
  43. package/addon/components/map-container/view-switch.js +3 -0
  44. package/addon/components/map-container.hbs +1 -0
  45. package/addon/components/map-container.js +15 -0
  46. package/addon/components/modals/assign-driver.hbs +24 -0
  47. package/addon/components/modals/assign-driver.js +3 -0
  48. package/addon/components/modals/clone-config-form.hbs +6 -0
  49. package/addon/components/modals/contact-details.hbs +44 -0
  50. package/addon/components/modals/contact-form.hbs +56 -0
  51. package/addon/components/modals/driver-assign-order.hbs +67 -0
  52. package/addon/components/modals/driver-assign-vehicle.hbs +20 -0
  53. package/addon/components/modals/driver-assign-vendor.hbs +20 -0
  54. package/addon/components/modals/driver-details.hbs +85 -0
  55. package/addon/components/modals/driver-form.hbs +83 -0
  56. package/addon/components/modals/edit-meta-form.hbs +20 -0
  57. package/addon/components/modals/entity-form.hbs +57 -0
  58. package/addon/components/modals/entity-meta-field-prompt.hbs +6 -0
  59. package/addon/components/modals/fleet-details.hbs +31 -0
  60. package/addon/components/modals/fleet-form.hbs +26 -0
  61. package/addon/components/modals/fuel-report-details.hbs +34 -0
  62. package/addon/components/modals/fuel-report-form.hbs +26 -0
  63. package/addon/components/modals/group-details.hbs +42 -0
  64. package/addon/components/modals/group-form.hbs +54 -0
  65. package/addon/components/modals/install-prompt.hbs +21 -0
  66. package/addon/components/modals/map-field-form.hbs +9 -0
  67. package/addon/components/modals/map-field-group-form.hbs +6 -0
  68. package/addon/components/modals/map-layer-form.hbs +29 -0
  69. package/addon/components/modals/meta-field-form.hbs +8 -0
  70. package/addon/components/modals/meta-field-group-form.hbs +5 -0
  71. package/addon/components/modals/new-order-config.hbs +11 -0
  72. package/addon/components/modals/option-prompt.hbs +17 -0
  73. package/addon/components/modals/order-assign-driver.hbs +25 -0
  74. package/addon/components/modals/order-config-new-status.hbs +5 -0
  75. package/addon/components/modals/order-event.hbs +18 -0
  76. package/addon/components/modals/order-form.hbs +63 -0
  77. package/addon/components/modals/order-import.hbs +84 -0
  78. package/addon/components/modals/order-label.hbs +7 -0
  79. package/addon/components/modals/order-meta.hbs +12 -0
  80. package/addon/components/modals/order-new-activity.hbs +62 -0
  81. package/addon/components/modals/order-route-form.hbs +111 -0
  82. package/addon/components/modals/place-assign-vendor.hbs +20 -0
  83. package/addon/components/modals/place-details.hbs +105 -0
  84. package/addon/components/modals/place-form.hbs +30 -0
  85. package/addon/components/modals/point-map.hbs +16 -0
  86. package/addon/components/modals/policy-form.hbs +22 -0
  87. package/addon/components/modals/resend-verification-email.hbs +25 -0
  88. package/addon/components/modals/role-form.hbs +16 -0
  89. package/addon/components/modals/select-payment-method.hbs +12 -0
  90. package/addon/components/modals/service-area-form.hbs +31 -0
  91. package/addon/components/modals/set-password.hbs +15 -0
  92. package/addon/components/modals/uninstall-prompt.hbs +21 -0
  93. package/addon/components/modals/user-form.hbs +56 -0
  94. package/addon/components/modals/vehicle-details.hbs +227 -0
  95. package/addon/components/modals/vehicle-form.hbs +282 -0
  96. package/addon/components/modals/vendor-details.hbs +77 -0
  97. package/addon/components/modals/vendor-form.hbs +168 -0
  98. package/addon/components/modals/view-service-area.hbs +12 -0
  99. package/addon/components/modals/view-zone.hbs +12 -0
  100. package/addon/components/modals/zone-form.hbs +16 -0
  101. package/addon/components/operations-pane/pane.hbs +1 -0
  102. package/addon/components/order/header.hbs +48 -0
  103. package/addon/components/order/header.js +26 -0
  104. package/addon/components/order/place-card.hbs +51 -0
  105. package/addon/components/order/place-card.js +33 -0
  106. package/addon/components/order/schedule-card.hbs +35 -0
  107. package/addon/components/order/schedule-card.js +17 -0
  108. package/addon/components/order/sub-header/item.hbs +16 -0
  109. package/addon/components/order/sub-header.hbs +3 -0
  110. package/addon/components/order-config/activity-flow-editor.hbs +108 -0
  111. package/addon/components/order-config/activity-flow-editor.js +374 -0
  112. package/addon/components/order-config/details-editor.hbs +32 -0
  113. package/addon/components/order-config/details-editor.js +16 -0
  114. package/addon/components/order-config/entities-editor.hbs +84 -0
  115. package/addon/components/order-config/entities-editor.js +123 -0
  116. package/addon/components/order-config/fields-editor.hbs +122 -0
  117. package/addon/components/order-config/fields-editor.js +233 -0
  118. package/addon/components/order-config/selector.hbs +1 -0
  119. package/addon/components/order-config/selector.js +3 -0
  120. package/addon/components/order-config.hbs +66 -0
  121. package/addon/components/order-config.js +296 -0
  122. package/addon/components/order-list-overlay/driver-panel-title.hbs +6 -0
  123. package/addon/components/order-list-overlay/order.hbs +22 -0
  124. package/addon/components/order-list-overlay/order.js +3 -0
  125. package/addon/components/order-list-overlay.hbs +120 -0
  126. package/addon/components/order-list-overlay.js +227 -0
  127. package/addon/components/route-list.hbs +47 -0
  128. package/addon/components/route-list.js +11 -0
  129. package/addon/components/settings-window.hbs +15 -0
  130. package/addon/components/settings-window.js +62 -0
  131. package/addon/components/split-grid.js +1 -0
  132. package/addon/components/widget/fleet-ops-quickstart.hbs +40 -0
  133. package/addon/components/widget/fleet-ops-quickstart.js +58 -0
  134. package/addon/components/widget/issues.hbs +1 -0
  135. package/addon/components/widget/key-metrics.hbs +121 -0
  136. package/addon/components/widget/key-metrics.js +46 -0
  137. package/addon/components/widget/live-order-map.hbs +59 -0
  138. package/addon/components/widget/live-order-map.js +11 -0
  139. package/addon/components/widget/recent-orders.hbs +35 -0
  140. package/addon/components/widget/recent-orders.js +24 -0
  141. package/addon/components/widget/transaction-earnings.hbs +1 -0
  142. package/addon/components/widget/transactions.hbs +36 -0
  143. package/addon/components/widget/transactions.js +29 -0
  144. package/addon/components/widget/weekly-orders.hbs +1 -0
  145. package/addon/components/widget/weekly-orders.js +3 -0
  146. package/addon/controllers/application.js +40 -0
  147. package/addon/controllers/management/contacts/index.js +438 -0
  148. package/addon/controllers/management/drivers/index.js +868 -0
  149. package/addon/controllers/management/fleets/index.js +507 -0
  150. package/addon/controllers/management/fuel-reports/index.js +428 -0
  151. package/addon/controllers/management/issues/index.js +335 -0
  152. package/addon/controllers/management/places/index.js +571 -0
  153. package/addon/controllers/management/vehicles/index.js +616 -0
  154. package/addon/controllers/management/vendors/index.js +626 -0
  155. package/addon/controllers/management.js +5 -0
  156. package/addon/controllers/operations/orders/index/config/types.js +17 -0
  157. package/addon/controllers/operations/orders/index/config.js +13 -0
  158. package/addon/controllers/operations/orders/index/new.js +1213 -0
  159. package/addon/controllers/operations/orders/index/view.js +794 -0
  160. package/addon/controllers/operations/orders/index.js +674 -0
  161. package/addon/controllers/operations/scheduler/index.js +110 -0
  162. package/addon/controllers/operations/service-rates/index/edit.js +59 -0
  163. package/addon/controllers/operations/service-rates/index/new.js +369 -0
  164. package/addon/controllers/operations/service-rates/index.js +275 -0
  165. package/addon/controllers/operations/zones/index.js +470 -0
  166. package/addon/engine.js +19 -0
  167. package/addon/helpers/avatar-url.js +9 -0
  168. package/addon/helpers/extract-coordinates.js +6 -0
  169. package/addon/helpers/feature-group.js +14 -0
  170. package/addon/helpers/flow-raw-status.js +13 -0
  171. package/addon/helpers/format-point.js +13 -0
  172. package/addon/helpers/get-tip-amount.js +19 -0
  173. package/addon/helpers/is-active-route.js +1 -0
  174. package/addon/helpers/is-facilitator-supported-place.js +6 -0
  175. package/addon/helpers/is-not-facilitator-supported-place.js +6 -0
  176. package/addon/helpers/is-waypoint-record.js +6 -0
  177. package/addon/helpers/point-coordinates.js +10 -0
  178. package/addon/helpers/point-to-coordinates.js +28 -0
  179. package/addon/helpers/service-name.js +6 -0
  180. package/addon/helpers/waypoint-label.js +1 -0
  181. package/addon/instance-initializers/register-leaflet-draw-control-layer.js +17 -0
  182. package/addon/instance-initializers/register-leaflet-rotated-marker.js +17 -0
  183. package/addon/modifiers/translate-x.js +5 -0
  184. package/addon/routes/application.js +25 -0
  185. package/addon/routes/comms/chat.js +3 -0
  186. package/addon/routes/comms/intercom.js +3 -0
  187. package/addon/routes/comms.js +3 -0
  188. package/addon/routes/home.js +20 -0
  189. package/addon/routes/management/contacts/index.js +24 -0
  190. package/addon/routes/management/contacts.js +3 -0
  191. package/addon/routes/management/drivers/index.js +33 -0
  192. package/addon/routes/management/drivers.js +3 -0
  193. package/addon/routes/management/fleets/index.js +27 -0
  194. package/addon/routes/management/fleets.js +3 -0
  195. package/addon/routes/management/fuel-reports/index.js +23 -0
  196. package/addon/routes/management/fuel-reports.js +3 -0
  197. package/addon/routes/management/index.js +3 -0
  198. package/addon/routes/management/issues/index.js +24 -0
  199. package/addon/routes/management/issues.js +3 -0
  200. package/addon/routes/management/places/index.js +18 -0
  201. package/addon/routes/management/places.js +3 -0
  202. package/addon/routes/management/vehicles/index.js +35 -0
  203. package/addon/routes/management/vehicles.js +3 -0
  204. package/addon/routes/management/vendors/index.js +34 -0
  205. package/addon/routes/management/vendors.js +3 -0
  206. package/addon/routes/management.js +3 -0
  207. package/addon/routes/operations/dispatch.js +3 -0
  208. package/addon/routes/operations/orders/index/config/types.js +17 -0
  209. package/addon/routes/operations/orders/index/config.js +3 -0
  210. package/addon/routes/operations/orders/index/new.js +16 -0
  211. package/addon/routes/operations/orders/index/view.js +37 -0
  212. package/addon/routes/operations/orders/index.js +35 -0
  213. package/addon/routes/operations/orders.js +4 -0
  214. package/addon/routes/operations/scheduler/index.js +10 -0
  215. package/addon/routes/operations/scheduler.js +3 -0
  216. package/addon/routes/operations/service-rates/index/edit.js +35 -0
  217. package/addon/routes/operations/service-rates/index/new.js +15 -0
  218. package/addon/routes/operations/service-rates/index.js +49 -0
  219. package/addon/routes/operations/service-rates.js +10 -0
  220. package/addon/routes/operations/zones/index.js +25 -0
  221. package/addon/routes/operations/zones.js +7 -0
  222. package/addon/routes/operations.js +3 -0
  223. package/addon/routes.js +55 -0
  224. package/addon/services/map-manager.js +3 -0
  225. package/addon/services/service-areas.js +385 -0
  226. package/addon/templates/application.hbs +27 -0
  227. package/addon/templates/comms/chat.hbs +1 -0
  228. package/addon/templates/comms/intercom.hbs +1 -0
  229. package/addon/templates/comms.hbs +1 -0
  230. package/addon/templates/home.hbs +1 -0
  231. package/addon/templates/management/contacts/index.hbs +23 -0
  232. package/addon/templates/management/contacts.hbs +1 -0
  233. package/addon/templates/management/drivers/index.hbs +35 -0
  234. package/addon/templates/management/drivers.hbs +1 -0
  235. package/addon/templates/management/fleets/index.hbs +22 -0
  236. package/addon/templates/management/fleets.hbs +1 -0
  237. package/addon/templates/management/fuel-reports/index.hbs +21 -0
  238. package/addon/templates/management/fuel-reports.hbs +1 -0
  239. package/addon/templates/management/index.hbs +53 -0
  240. package/addon/templates/management/issues/index.hbs +21 -0
  241. package/addon/templates/management/issues.hbs +1 -0
  242. package/addon/templates/management/places/index.hbs +34 -0
  243. package/addon/templates/management/places.hbs +1 -0
  244. package/addon/templates/management/vehicles/index.hbs +22 -0
  245. package/addon/templates/management/vehicles.hbs +1 -0
  246. package/addon/templates/management/vendors/index.hbs +22 -0
  247. package/addon/templates/management/vendors.hbs +1 -0
  248. package/addon/templates/management.hbs +1 -0
  249. package/addon/templates/operations/dispatch.hbs +1 -0
  250. package/addon/templates/operations/orders/index/config/types.hbs +26 -0
  251. package/addon/templates/operations/orders/index/config.hbs +24 -0
  252. package/addon/templates/operations/orders/index/new.hbs +506 -0
  253. package/addon/templates/operations/orders/index/view.hbs +428 -0
  254. package/addon/templates/operations/orders/index.hbs +48 -0
  255. package/addon/templates/operations/orders.hbs +1 -0
  256. package/addon/templates/operations/scheduler/index.hbs +30 -0
  257. package/addon/templates/operations/scheduler.hbs +1 -0
  258. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  259. package/addon/templates/operations/service-rates/index/new.hbs +308 -0
  260. package/addon/templates/operations/service-rates/index.hbs +23 -0
  261. package/addon/templates/operations/service-rates.hbs +1 -0
  262. package/addon/templates/operations/zones/index.hbs +72 -0
  263. package/addon/templates/operations/zones.hbs +1 -0
  264. package/addon/templates/operations.hbs +1 -0
  265. package/addon/utils/calculate-percentage.js +1 -0
  266. package/addon/utils/extract-coordinates.js +1 -0
  267. package/addon/utils/format-currency.js +1 -0
  268. package/addon/utils/geojson/geo-json.js +17 -0
  269. package/addon/utils/is-facilitator-supported-place.js +14 -0
  270. package/addon/utils/to-model.js +1 -0
  271. package/app/components/cell/driver-name.js +1 -0
  272. package/app/components/custom-field-value.js +1 -0
  273. package/app/components/custom-field.js +1 -0
  274. package/app/components/display-place.js +1 -0
  275. package/app/components/driver-card-mini.js +1 -0
  276. package/app/components/driver-card.js +1 -0
  277. package/app/components/event-timeline/event.js +1 -0
  278. package/app/components/event-timeline.js +1 -0
  279. package/app/components/file-icon.js +1 -0
  280. package/app/components/fleet-driver-listing.js +1 -0
  281. package/app/components/full-calendar/draggable.js +1 -0
  282. package/app/components/full-calendar.js +1 -0
  283. package/app/components/full-size.js +1 -0
  284. package/app/components/global-search.js +1 -0
  285. package/app/components/horizontal-route.js +1 -0
  286. package/app/components/integrated-order-details.js +1 -0
  287. package/app/components/leaflet-draw-control.js +1 -0
  288. package/app/components/leaflet-rotated-marker.js +1 -0
  289. package/app/components/live-map.js +1 -0
  290. package/app/components/map-container/toolbar/zones-panel.js +1 -0
  291. package/app/components/map-container/toolbar-container.js +1 -0
  292. package/app/components/map-container/toolbar.js +1 -0
  293. package/app/components/map-container/topbar.js +1 -0
  294. package/app/components/map-container/view-switch.js +1 -0
  295. package/app/components/map-container.js +1 -0
  296. package/app/components/modals/assign-driver.js +1 -0
  297. package/app/components/modals/clone-config-form.js +1 -0
  298. package/app/components/modals/contact-details.js +1 -0
  299. package/app/components/modals/contact-form.js +1 -0
  300. package/app/components/modals/driver-assign-order.js +1 -0
  301. package/app/components/modals/driver-assign-vehicle.js +1 -0
  302. package/app/components/modals/driver-assign-vendor.js +1 -0
  303. package/app/components/modals/driver-details.js +1 -0
  304. package/app/components/modals/driver-form.js +1 -0
  305. package/app/components/modals/edit-meta-form.js +1 -0
  306. package/app/components/modals/entity-form.js +1 -0
  307. package/app/components/modals/entity-meta-field-prompt.js +1 -0
  308. package/app/components/modals/fleet-details.js +1 -0
  309. package/app/components/modals/fleet-form.js +1 -0
  310. package/app/components/modals/fuel-report-details.js +1 -0
  311. package/app/components/modals/fuel-report-form.js +1 -0
  312. package/app/components/modals/group-details.js +1 -0
  313. package/app/components/modals/group-form.js +1 -0
  314. package/app/components/modals/install-prompt.js +1 -0
  315. package/app/components/modals/map-field-form.js +1 -0
  316. package/app/components/modals/map-field-group-form.js +1 -0
  317. package/app/components/modals/map-layer-form.js +1 -0
  318. package/app/components/modals/meta-field-form.js +1 -0
  319. package/app/components/modals/meta-field-group-form.js +1 -0
  320. package/app/components/modals/new-order-config.js +1 -0
  321. package/app/components/modals/option-prompt.js +1 -0
  322. package/app/components/modals/order-assign-driver.js +1 -0
  323. package/app/components/modals/order-config-new-status.js +1 -0
  324. package/app/components/modals/order-event.js +1 -0
  325. package/app/components/modals/order-form.js +1 -0
  326. package/app/components/modals/order-import.js +1 -0
  327. package/app/components/modals/order-label.js +1 -0
  328. package/app/components/modals/order-meta.js +1 -0
  329. package/app/components/modals/order-new-activity.js +1 -0
  330. package/app/components/modals/order-route-form.js +1 -0
  331. package/app/components/modals/place-assign-vendor.js +1 -0
  332. package/app/components/modals/place-details.js +1 -0
  333. package/app/components/modals/place-form.js +1 -0
  334. package/app/components/modals/point-map.js +1 -0
  335. package/app/components/modals/policy-form.js +1 -0
  336. package/app/components/modals/resend-verification-email.js +1 -0
  337. package/app/components/modals/role-form.js +1 -0
  338. package/app/components/modals/select-payment-method.js +1 -0
  339. package/app/components/modals/service-area-form.js +1 -0
  340. package/app/components/modals/set-password.js +1 -0
  341. package/app/components/modals/uninstall-prompt.js +1 -0
  342. package/app/components/modals/user-form.js +1 -0
  343. package/app/components/modals/vehicle-details.js +1 -0
  344. package/app/components/modals/vehicle-form.js +1 -0
  345. package/app/components/modals/vendor-details.js +1 -0
  346. package/app/components/modals/vendor-form.js +1 -0
  347. package/app/components/modals/view-service-area.js +1 -0
  348. package/app/components/modals/view-zone.js +1 -0
  349. package/app/components/modals/zone-form.js +1 -0
  350. package/app/components/operations-pane/pane.js +1 -0
  351. package/app/components/order/header.js +1 -0
  352. package/app/components/order/place-card.js +1 -0
  353. package/app/components/order/schedule-card.js +1 -0
  354. package/app/components/order/sub-header/item.js +1 -0
  355. package/app/components/order/sub-header.js +1 -0
  356. package/app/components/order-config/activity-flow-editor.js +1 -0
  357. package/app/components/order-config/details-editor.js +1 -0
  358. package/app/components/order-config/entities-editor.js +1 -0
  359. package/app/components/order-config/fields-editor.js +1 -0
  360. package/app/components/order-config/selector.js +1 -0
  361. package/app/components/order-config.js +1 -0
  362. package/app/components/order-list-overlay/driver-panel-title.js +1 -0
  363. package/app/components/order-list-overlay/order.js +1 -0
  364. package/app/components/order-list-overlay.js +1 -0
  365. package/app/components/route-list.js +1 -0
  366. package/app/components/settings-window.js +1 -0
  367. package/app/components/split-grid.js +1 -0
  368. package/app/components/widget/issues.js +1 -0
  369. package/app/components/widget/key-metrics.js +1 -0
  370. package/app/components/widget/live-order-map.js +1 -0
  371. package/app/components/widget/recent-orders.js +1 -0
  372. package/app/components/widget/recommended-todo.js +1 -0
  373. package/app/components/widget/transaction-earnings.js +1 -0
  374. package/app/components/widget/transactions.js +1 -0
  375. package/app/components/widget/weekly-orders.js +1 -0
  376. package/app/controllers/application.js +1 -0
  377. package/app/controllers/management/contacts/index.js +1 -0
  378. package/app/controllers/management/drivers/index/details.js +1 -0
  379. package/app/controllers/management/drivers/index.js +1 -0
  380. package/app/controllers/management/fleets/index/details.js +1 -0
  381. package/app/controllers/management/fleets/index.js +1 -0
  382. package/app/controllers/management/fuel-reports/index.js +1 -0
  383. package/app/controllers/management/issues/index.js +1 -0
  384. package/app/controllers/management/places/index.js +1 -0
  385. package/app/controllers/management/vehicles/index.js +1 -0
  386. package/app/controllers/management/vendors/index/details/remarks.js +1 -0
  387. package/app/controllers/management/vendors/index/details.js +1 -0
  388. package/app/controllers/management/vendors/index.js +1 -0
  389. package/app/controllers/management.js +1 -0
  390. package/app/controllers/operations/orders/index/config/types.js +1 -0
  391. package/app/controllers/operations/orders/index/config.js +1 -0
  392. package/app/controllers/operations/orders/index/new.js +1 -0
  393. package/app/controllers/operations/orders/index/view.js +1 -0
  394. package/app/controllers/operations/scheduler/index.js +1 -0
  395. package/app/controllers/operations/service-rates/index/edit.js +1 -0
  396. package/app/controllers/operations/service-rates/index/new.js +1 -0
  397. package/app/controllers/operations/service-rates/index.js +1 -0
  398. package/app/controllers/operations/zones/index.js +1 -0
  399. package/app/helpers/avatar-url.js +1 -0
  400. package/app/helpers/extract-coordinates.js +1 -0
  401. package/app/helpers/feature-group.js +1 -0
  402. package/app/helpers/flow-raw-status.js +1 -0
  403. package/app/helpers/format-point.js +1 -0
  404. package/app/helpers/get-tip-amount.js +1 -0
  405. package/app/helpers/is-facilitator-supported-place.js +1 -0
  406. package/app/helpers/is-not-facilitator-supported-place.js +1 -0
  407. package/app/helpers/is-waypoint-record.js +1 -0
  408. package/app/helpers/point-coordinates.js +1 -0
  409. package/app/helpers/point-to-coordinates.js +1 -0
  410. package/app/helpers/service-name.js +1 -0
  411. package/app/helpers/waypoint-label.js +1 -0
  412. package/app/modifiers/translate-x.js +1 -0
  413. package/app/routes/home.js +1 -0
  414. package/app/routes/management/fleets/index/details.js +1 -0
  415. package/app/routes/operations/orders/index/config/types.js +1 -0
  416. package/app/routes/operations/orders/index/config.js +1 -0
  417. package/app/routes/operations/orders/index/new.js +1 -0
  418. package/app/routes/operations/orders/index/view.js +1 -0
  419. package/app/routes/operations/scheduler/index.js +1 -0
  420. package/app/routes/operations/scheduler.js +1 -0
  421. package/app/routes/operations/service-rates/index/edit.js +1 -0
  422. package/app/routes/operations/service-rates/index/new.js +1 -0
  423. package/app/services/map-manager.js +1 -0
  424. package/app/services/service-areas.js +1 -0
  425. package/app/templates/home.js +1 -0
  426. package/app/templates/management/fleets/index/details.js +1 -0
  427. package/app/templates/operations/orders/index/config/types.js +1 -0
  428. package/app/templates/operations/orders/index/config.js +1 -0
  429. package/app/templates/operations/orders/index/new.js +1 -0
  430. package/app/templates/operations/orders/index/view.js +1 -0
  431. package/app/templates/operations/scheduler/index.js +1 -0
  432. package/app/templates/operations/scheduler.js +1 -0
  433. package/app/templates/operations/service-rates/index/edit.js +1 -0
  434. package/app/templates/operations/service-rates/index/new.js +1 -0
  435. package/app/utils/calculate-percentage.js +1 -0
  436. package/app/utils/extract-coordinates.js +1 -0
  437. package/app/utils/format-currency.js +1 -0
  438. package/app/utils/geojson/geo-json.js +1 -0
  439. package/app/utils/is-facilitator-supported-place.js +1 -0
  440. package/app/utils/is-latitude.js +1 -0
  441. package/app/utils/to-model.js +1 -0
  442. package/assets/images/drawing-controls-spritesheet-inverted.png +0 -0
  443. package/config/environment.js +25 -0
  444. package/index.js +73 -0
  445. package/package.json +132 -0
  446. package/pnpm-lock.yaml +12613 -0
@@ -0,0 +1,296 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action, computed, set } from '@ember/object';
5
+ import { equal } from '@ember/object/computed';
6
+ import isModel from '@fleetbase/ember-core/utils/is-model';
7
+ import config from 'ember-get-config';
8
+
9
+ export default class OrderConfigComponent extends Component {
10
+ @service modalsManager;
11
+ @service fetch;
12
+ @service store;
13
+ @service notifications;
14
+ @service crud;
15
+ @service currentUser;
16
+ @tracked activeTab = 'details';
17
+
18
+ @equal('activeTab', 'details') isDetailsTab;
19
+ @equal('activeTab', 'activity') isActivityTab;
20
+ @equal('activeTab', 'entities') isEntitiesTab;
21
+
22
+ @tracked selected;
23
+ @tracked isLoading = true;
24
+ @tracked isSaving = false;
25
+ @tracked configurations = [];
26
+ @tracked uninstallChannels = [];
27
+
28
+ @computed('selected', 'configurations.[]') get orderConfig() {
29
+ return this.configurations.find((config) => config.namespace === this.selected);
30
+ }
31
+
32
+ @computed('selected', 'configurations.[]') get orderConfigIndex() {
33
+ return this.configurations.findIndex((config) => config.namespace === this.selected);
34
+ }
35
+
36
+ @computed('orderConfig', 'orderConfig.meta.fields.[]') get configFields() {
37
+ const defaultLogicFields = ['status', 'type', 'internal_id', 'id'];
38
+ const metaFields = Array.from(this.orderConfig.meta.fields ?? []).map((metaField) => `meta.${metaField.key}`);
39
+
40
+ return [...defaultLogicFields, ...metaFields];
41
+ }
42
+
43
+ @action setupComponent() {
44
+ this.loadConfigurations();
45
+ }
46
+
47
+ @action async loadConfigurations() {
48
+ this.configurations = await this.fetchConfigurations();
49
+
50
+ if (typeof this.args.onReady === 'function') {
51
+ this.args.onReady(this.configurations);
52
+ }
53
+ }
54
+
55
+ @action selectConfig(selected) {
56
+ this.selected = selected;
57
+
58
+ if (typeof this.args.onConfigChanged === 'function') {
59
+ this.args.onConfigChanged(this.orderConfig);
60
+ }
61
+ }
62
+
63
+ @action fetchConfigurations() {
64
+ this.isLoading = true;
65
+
66
+ return new Promise((resolve, reject) => {
67
+ this.fetch
68
+ .get('fleet-ops/order-configs/get-installed')
69
+ .then((configs) => {
70
+ const serialized = [];
71
+
72
+ for (let i = 0; i < configs.length; i++) {
73
+ const config = configs.objectAt(i);
74
+ const normalizedConfig = this.store.normalize('order-config', config);
75
+ const serializedConfig = this.store.push(normalizedConfig);
76
+
77
+ serialized.pushObject(serializedConfig);
78
+ }
79
+
80
+ if (typeof this.args.onConfigsLoaded === 'function') {
81
+ this.args.onConfigsLoaded(serialized);
82
+ }
83
+
84
+ this.isLoading = false;
85
+ resolve(serialized);
86
+ })
87
+ .catch((error) => {
88
+ this.isLoading = false;
89
+ reject(error);
90
+ });
91
+ });
92
+ }
93
+
94
+ @action createNewOrderConfig() {
95
+ const tags = [];
96
+
97
+ this.modalsManager.show('modals/new-order-config', {
98
+ title: 'Create a new order configuration',
99
+ acceptButtonIcon: 'check',
100
+ acceptButtonIconPrefix: 'fas',
101
+ declineButtonIcon: 'times',
102
+ declineButtonIconPrefix: 'fas',
103
+ name: null,
104
+ description: null,
105
+ tags,
106
+ addTag: (tag) => {
107
+ tags.pushObject(tag);
108
+ },
109
+ removeTag: (index) => {
110
+ tags.removeAt(index);
111
+ },
112
+ confirm: (modal) => {
113
+ modal.startLoading();
114
+
115
+ const { name, description, tags } = modal.getOptions();
116
+
117
+ if (!name) {
118
+ modal.stopLoading();
119
+ return this.notifications.warning('Order configuration requires a name');
120
+ }
121
+
122
+ return this.fetch
123
+ .post('fleet-ops/order-configs/new', { name, description, tags })
124
+ .then((newConfig) => {
125
+ const newConfigExtension = this.fetch.jsonToModel(newConfig, 'extension');
126
+
127
+ this.configurations.pushObject(newConfigExtension);
128
+ this.notifications.success('New order config created successfully.');
129
+ this.selectConfig(newConfigExtension.namespace);
130
+ })
131
+ .catch((error) => {
132
+ this.notifications.serverError(error);
133
+ });
134
+ },
135
+ });
136
+ }
137
+
138
+ @action saveConfig() {
139
+ const { orderConfig } = this;
140
+
141
+ if (!orderConfig) {
142
+ this.notifications.warning('No order configuration selected.');
143
+
144
+ return;
145
+ }
146
+
147
+ this.isSaving = true;
148
+ this.fetch
149
+ .post(`fleet-ops/order-configs/save`, {
150
+ data: orderConfig,
151
+ })
152
+ .then(() => {
153
+ this.notifications.success(`${orderConfig.name} order configuration saved.`);
154
+ this.isSaving = false;
155
+ })
156
+ .catch((error) => {
157
+ this.notifications.serverError(error);
158
+ this.isSaving = false;
159
+ });
160
+ }
161
+
162
+ @action cloneConfiguration(extension) {
163
+ const name = `${extension.name} Clone`;
164
+ const description = extension.description;
165
+
166
+ this.modalsManager.show('modals/clone-config-form', {
167
+ title: 'Enter name of cloned configuration',
168
+ acceptButtonIcon: 'check',
169
+ acceptButtonIconPrefix: 'fas',
170
+ declineButtonIcon: 'times',
171
+ declineButtonIconPrefix: 'fas',
172
+ name,
173
+ description,
174
+ confirm: (modal) => {
175
+ modal.startLoading();
176
+
177
+ const { name, description } = modal.getOptions();
178
+
179
+ if (!name) {
180
+ return this.notifications.warning('No config name entered.');
181
+ }
182
+
183
+ return this.fetch
184
+ .post('fleet-ops/order-configs/clone', {
185
+ id: extension.id,
186
+ installed: extension.installed,
187
+ name,
188
+ description,
189
+ })
190
+ .then((newConfig) => {
191
+ const clone = this.fetch.jsonToModel(newConfig, 'extension');
192
+ this.configurations.pushObject(clone);
193
+ this.notifications.success('Order config successfully cloned.');
194
+ this.selectConfig(clone.namespace);
195
+ })
196
+ .catch((error) => {
197
+ this.notifications.serverError(error);
198
+ });
199
+ },
200
+ });
201
+ }
202
+
203
+ @action deleteExtension(extension) {
204
+ const uninstall = isModel(extension) ? extension : this.fetch.jsonToModel(extension, 'extension');
205
+
206
+ return this.crud.delete(uninstall, {
207
+ body: 'Once this order configuration is deleted you will not be able to create orders using it anymore. Are you sure?',
208
+ acceptButtonIcon: 'trash',
209
+ declineButtonIcon: 'times',
210
+ declineButtonIconPrefix: 'fas',
211
+ onFinish: () => {
212
+ this.configurations.removeObject(extension);
213
+ this.selected = undefined;
214
+ },
215
+ });
216
+ }
217
+
218
+ @action uninstallConfiguration(extension) {
219
+ const extensionName = extension.display_name ?? extension.name;
220
+
221
+ this.listenForUninstallProgress(extension);
222
+
223
+ this.modalsManager.show('modals/uninstall-prompt', {
224
+ title: 'Uninstall Configuration',
225
+ acceptButtonText: 'Uninstall',
226
+ acceptButtonScheme: 'danger',
227
+ extension,
228
+ extensionName,
229
+ isUninstalling: false,
230
+ uninstallProgress: 0,
231
+ confirm: (modal, done) => {
232
+ modal.startLoading();
233
+ modal.setOption('isUninstalling', true);
234
+
235
+ extension
236
+ .uninstall()
237
+ .then(() => {
238
+ this.closeUninstallChannel();
239
+ this.notifications.success(`Extension '${extensionName}' uninstalled.`);
240
+ this.configurations.removeObject(extension);
241
+ this.selected = undefined;
242
+ done();
243
+ })
244
+ .catch((error) => {
245
+ modal.stopLoading();
246
+ modal.setOption('isInstalling', false);
247
+ this.notifications.serverError(error);
248
+ });
249
+ },
250
+ decline: (modal) => {
251
+ this.closeUninstallChannel();
252
+ modal.done();
253
+ },
254
+ });
255
+ }
256
+
257
+ async listenForUninstallProgress(extension) {
258
+ // get channel identifier
259
+ const channelId = `${extension.id}:${this.currentUser.id}`;
260
+
261
+ // setup socket
262
+ const socket = socketClusterClient.create(config.socket);
263
+
264
+ // get channel
265
+ const channel = socket.subscribe(channelId);
266
+ this.uninstallChannels = channel;
267
+
268
+ // listen to channel for events
269
+ await channel.listener('subscribe').once();
270
+
271
+ // get incoming data and console out
272
+ for await (let data of channel) {
273
+ if (data.progress) {
274
+ this.modalsManager.setOption('uninstallProgress', data.progress);
275
+ }
276
+ }
277
+ }
278
+
279
+ closeUninstallChannel() {
280
+ if (this.uninstallChannels) {
281
+ this.uninstallChannels.close();
282
+ }
283
+ }
284
+
285
+ @action setMetaFields(fields = []) {
286
+ set(this.orderConfig, 'meta.fields', fields);
287
+ }
288
+
289
+ @action setFlow(flow = {}) {
290
+ set(this.orderConfig, 'meta.flow', flow);
291
+ }
292
+
293
+ @action setEntities(entities = {}) {
294
+ set(this.orderConfig, 'meta.entities', entities);
295
+ }
296
+ }
@@ -0,0 +1,6 @@
1
+ <div class="flex flex-row items-center">
2
+ <img src={{@context.vehicle_avatar}} alt={{@context.name}} class="w-5 h-5 mr-1.5" />
3
+ <div>
4
+ <div class="text-sm">{{@context.name}}</div>
5
+ </div>
6
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="{{@wrapperClass}}">
2
+ {{log @order}}
3
+ <a href="javascript:;" class="order-listings-row flex flex-col {{if @isSelected 'selected'}}" {{on "click" (fn @onClick @order)}} {{on "dblclick" (fn @onDoubleClick @order)}} ...attributes>
4
+ <div class="flex flex-row items-center">
5
+ <div class="mr-4 text-gray-600 {{if @isSelected 'text-blue-900'}}">
6
+ {{@index}}
7
+ </div>
8
+ <div>
9
+ <FaIcon @icon="map-marker" class="mr-3" />
10
+ </div>
11
+ <div class="truncate text-sm">
12
+ <div class="flex flex-row items-center justify-between mb-1.5 order-listing-row-header">
13
+ <div class="truncate text-gray-900 dark:text-white font-semibold">{{@order.public_id}}</div>
14
+ <Badge @status={{@order.status}} />
15
+ </div>
16
+ <div class="whitespace-pre-wrap mb-1">{{@order.payload.nextStop.address}}</div>
17
+ <div class="truncate">{{n-a @order.customer.name "No Customer"}}</div>
18
+ </div>
19
+ </div>
20
+ </a>
21
+ {{yield @isSelected}}
22
+ </div>
@@ -0,0 +1,3 @@
1
+ import Component from '@glimmer/component';
2
+
3
+ export default class OrderListOverlayOrderComponent extends Component {}
@@ -0,0 +1,120 @@
1
+ <Overlay class="orders-panel" @position="right" @noBackdrop={{@noBackdrop}} @fullHeight={{@fullHeight}} @outView={{@outView}} @width={{@width}}>
2
+ <Overlay::Header @hideLeftSection={{true}} @onPressCancel={{@onPressCancel}} @actionsWrapperClass="h-full" @cancelButtonHeight="1.5rem" class="pl-0i" {{set-height "2.75rem"}}>
3
+ <div class="h-full flex-1 pl-11 relative">
4
+ <div class="absolute h-full left-0 top-0 bottom-0 pl-4 flex items-center justify-center">
5
+ <FaIcon @icon="search" />
6
+ </div>
7
+ <Input @value={{this.query}} @type="text" placeholder="Search orders..." class="w-full p-0 m-0 h-full bg-transparent order-list-overlay-search" />
8
+ </div>
9
+ {{#if this.selectedOrders.length}}
10
+ <BasicDropdown class="mr-2" @renderInPlace={{true}} as |dd|>
11
+ <dd.Trigger>
12
+ <div role="button" class="next-org-button-trigger has-selections {{if dd.isOpen 'is-open'}}">
13
+ <FaIcon @icon="ellipsis-h" @prefix="fas" class="text-gray-800 dark:text-white" />
14
+ </div>
15
+ </dd.Trigger>
16
+ <dd.Content>
17
+ <div class="next-dd-menu">
18
+ <div class="px-1">
19
+ <div class="text-sm flex flex-row items-center px-3 py-0.5 rounded-md my-1">
20
+ Selected {{pluralize this.selectedOrders.length "Order"}}
21
+ </div>
22
+ </div>
23
+ <div class="next-dd-menu-seperator"></div>
24
+ <div class="px-1">
25
+ <a href="javascript:;" class="next-dd-item" {{on "click" (fn this.onDropdownAction dd "onPressAssignOrders")}}>Assign to driver...</a>
26
+ <a href="javascript:;" class="next-dd-item" {{on "click" (fn this.onDropdownAction dd "onPressCancelOrders" this.selectedOrders)}}>Cancel orders...</a>
27
+ <a href="javascript:;" class="next-dd-item text-danger" {{on "click" (fn this.onDropdownAction dd "onPressDeleteOrders" this.selectedOrders)}}>Delete orders...</a>
28
+ </div>
29
+ </div>
30
+ </dd.Content>
31
+ </BasicDropdown>
32
+ {{/if}}
33
+ <BasicDropdown @renderInPlace={{true}} as |dd|>
34
+ <dd.Trigger>
35
+ <div role="button" class="next-org-button-trigger {{if dd.isOpen 'is-open'}}">
36
+ <FaIcon @icon="ellipsis-h" @prefix="fas" class="text-gray-900 dark:text-gray-500" />
37
+ </div>
38
+ </dd.Trigger>
39
+ <dd.Content>
40
+ <div class="next-dd-menu">
41
+ <div class="px-1">
42
+ <div class="text-sm flex flex-row items-center px-3 py-0.5 rounded-md my-1">
43
+ Actions
44
+ </div>
45
+ </div>
46
+ <div class="next-dd-menu-seperator"></div>
47
+ <div class="px-1">
48
+ <a href="javascript:;" class="next-dd-item" {{on "click" (fn this.onDropdownAction dd "onPressCreateOrder")}}>Create new order...</a>
49
+ <a href="javascript:;" class="next-dd-item" {{on "click" (fn this.onDropdownAction dd "onPressCreateFleet")}}>Create new fleet...</a>
50
+ </div>
51
+ </div>
52
+ </dd.Content>
53
+ </BasicDropdown>
54
+ </Overlay::Header>
55
+
56
+ <Overlay::Body>
57
+ {{#if this.isLoading}}
58
+ <div class="flex items-center p-4">
59
+ <Spinner class="mr-2" />
60
+ <span>Loading...</span>
61
+ </div>
62
+ {{/if}}
63
+
64
+ <div class="space-y-4 orders-panel-fleets">
65
+ <div class="next-content-panel-wrapper mb-2">
66
+ <ContentPanel @title="Active orders" @subtitle={{pluralize this.activeOrders.length "Order"}} @open={{this.activeOrders.length}} @pad={{true}} @panelSubtitleInlineClass="text-xs" @panelBodyClass="order-listings bg-white dark:bg-gray-800">
67
+ {{#each this.activeOrders as |order index|}}
68
+ <OrderListOverlay::Order @order={{order}} @index={{add index 1}} @isSelected={{includes order this.selectedOrders}} @onClick={{this.selectOrder}} @onDoubleClick={{fn this.onAction "onPressViewOrder"}} as |isSelected|>
69
+ {{#if isSelected}}
70
+ <div class="order-listings-row selected px-4 py-2">
71
+ <div class="flex flex-row items-center space-x-2">
72
+ {{!-- <Button @type="default" @icon="map" @text="Map" @size="xs" class="btn-transparent-border" /> --}}
73
+ <Button @type="default" @icon="file-invoice" @text="Details" @size="xs" class="btn-transparent-border" @onClick={{fn this.onAction "onPressViewOrder" order}} />
74
+ </div>
75
+ </div>
76
+ {{/if}}
77
+ </OrderListOverlay::Order>
78
+ {{/each}}
79
+ </ContentPanel>
80
+ <ContentPanel @title="Unassigned orders" @subtitle={{pluralize this.unassignedOrders.length "Order"}} @open={{this.unassignedOrders.length}} @pad={{true}} @panelSubtitleInlineClass="text-xs" @panelBodyClass="order-listings bg-white dark:bg-gray-800">
81
+ {{#each this.unassignedOrders as |order index|}}
82
+ <OrderListOverlay::Order @order={{order}} @index={{add index 1}} @isSelected={{includes order this.selectedOrders}} @onClick={{this.selectOrder}} @onDoubleClick={{fn this.onAction "onPressViewOrder"}} as |isSelected|>
83
+ {{#if isSelected}}
84
+ <div class="order-listings-row selected px-4 py-2">
85
+ <div class="flex flex-row items-center space-x-2">
86
+ {{!-- <Button @type="default" @icon="map" @text="Map" @size="xs" class="btn-transparent-border" /> --}}
87
+ <Button @type="default" @icon="file-invoice" @text="Details" @size="xs" class="btn-transparent-border" @onClick={{fn this.onAction "onPressViewOrder" order}} />
88
+ </div>
89
+ </div>
90
+ {{/if}}
91
+ </OrderListOverlay::Order>
92
+ {{/each}}
93
+ </ContentPanel>
94
+ </div>
95
+ </div>
96
+
97
+ <div class="space-y-4 orders-panel-fleets">
98
+ {{#each this.fleets as |fleet|}}
99
+ <ContentPanel @title={{fleet.name}} @titleIcon="users" @titleIconWrapperClass="flex-inline mr-3" @subtitle={{concat fleet.drivers_online_count " of " fleet.drivers_count " Online"}} @open={{fleet.drivers.length}} @actionButtons={{array (hash type="default" icon="cog" size="xs" onClick=(fn this.onAction "onPressManageFleet" fleet))}} @panelSubtitleInlineClass="dark:text-gray-100 text-xs" @panelHeaderClass="flex" @panelBodyClass="bg-white dark:bg-gray-800">
100
+ {{#each fleet.drivers as |driver|}}
101
+ <ContentPanel @titleComponent="order-list-overlay/driver-panel-title" @titleComponentContext={{driver}} @open={{true}} @panelBodyClass="order-listings bg-white dark:bg-gray-800" @panelHeaderClass="next-orders-driver-header" @containerClass="mt-0i">
102
+ {{#each driver.activeJobs as |order index|}}
103
+ <OrderListOverlay::Order @order={{order}} @index={{add index 1}} @isSelected={{includes order this.selectedOrders}} @onClick={{this.selectOrder}} @onDoubleClick={{fn this.onAction "onPressViewOrder"}} as |isSelected|>
104
+ {{#if isSelected}}
105
+ <div class="order-listings-row selected px-4 py-2">
106
+ <div class="flex flex-row items-center space-x-2">
107
+ {{!-- <Button @type="default" @icon="map" @text="Map" @size="xs" class="btn-transparent-border" /> --}}
108
+ <Button @type="default" @icon="file-invoice" @text="Details" @size="xs" class="btn-transparent-border" @onClick={{fn this.onAction "onPressViewOrder" order}} />
109
+ </div>
110
+ </div>
111
+ {{/if}}
112
+ </OrderListOverlay::Order>
113
+ {{/each}}
114
+ </ContentPanel>
115
+ {{/each}}
116
+ </ContentPanel>
117
+ {{/each}}
118
+ </div>
119
+ </Overlay::Body>
120
+ </Overlay>
@@ -0,0 +1,227 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { all } from 'rsvp';
6
+
7
+ export default class OrderListOverlayComponent extends Component {
8
+ /**
9
+ * Inject the `store` service
10
+ *
11
+ * @memberof OrderListOverlayComponent
12
+ */
13
+ @service store;
14
+
15
+ /**
16
+ * Inject the `fetch` service
17
+ *
18
+ * @memberof OrderListOverlayComponent
19
+ */
20
+ @service fetch;
21
+
22
+ /**
23
+ * Inject the `appCache` service
24
+ *
25
+ * @memberof OrderListOverlayComponent
26
+ */
27
+ @service appCache;
28
+
29
+ /**
30
+ * Inject the `router` service
31
+ *
32
+ * @memberof OrderListOverlayComponent
33
+ */
34
+ @service router;
35
+
36
+ /**
37
+ * Inject the `hostRouter` service
38
+ *
39
+ * @memberof OrderListOverlayComponent
40
+ */
41
+ @service hostRouter;
42
+
43
+ /**
44
+ * The loading state of the orders overlay
45
+ *
46
+ * @memberof OrderListOverlayComponent
47
+ */
48
+ @tracked isLoading = false;
49
+
50
+ /**
51
+ * The loaded fleet records.
52
+ *
53
+ * @memberof OrderListOverlayComponent
54
+ */
55
+ @tracked fleets = [];
56
+
57
+ /**
58
+ * The loaded active order records.
59
+ *
60
+ * @memberof OrderListOverlayComponent
61
+ */
62
+ @tracked activeOrders = [];
63
+
64
+ /**
65
+ * The loaded unassigned order records.
66
+ *
67
+ * @memberof OrderListOverlayComponent
68
+ */
69
+ @tracked unassignedOrders = [];
70
+
71
+ /**
72
+ * The user selected order records.
73
+ *
74
+ * @memberof OrderListOverlayComponent
75
+ */
76
+ @tracked selectedOrders = [];
77
+
78
+ /**
79
+ * Search filter variable
80
+ *
81
+ * @memberof OrderListOverlayComponent
82
+ */
83
+ @tracked query = null;
84
+
85
+ /**
86
+ * Creates an instance of OrderListOverlayComponent.
87
+ * @memberof OrderListOverlayComponent
88
+ */
89
+ constructor() {
90
+ super(...arguments);
91
+
92
+ all([this.fetchFleets(), this.fetchUnassignedOrders(), this.fetchActiveOrders()]);
93
+ }
94
+
95
+ /**
96
+ * Toggles an order selection.
97
+ *
98
+ * @param {OrderModel} order
99
+ * @memberof OrderListOverlayComponent
100
+ */
101
+ @action selectOrder(order) {
102
+ if (this.selectedOrders.includes(order)) {
103
+ this.selectedOrders.removeObject(order);
104
+ } else {
105
+ this.selectedOrders.pushObject(order);
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Transitions to view the order.
111
+ *
112
+ * @param {OrderModel} order
113
+ * @return {Promise}
114
+ * @memberof OrderListOverlayComponent
115
+ */
116
+ @action viewOrder(order) {
117
+ const router = this.router ?? this.hostRouter;
118
+
119
+ return router.transitionTo('console.fleet-ops.operations.orders.index.view', order);
120
+ }
121
+
122
+ /**
123
+ * Triggers a component action.
124
+ *
125
+ * @param {String} actionName
126
+ * @param {...} params
127
+ * @memberof OrderListOverlayComponent
128
+ */
129
+ @action onAction(actionName, ...params) {
130
+ params.pushObject(this);
131
+
132
+ if (typeof this[actionName] === 'function') {
133
+ this[actionName](...params);
134
+ }
135
+
136
+ if (typeof this.args[actionName] === 'function') {
137
+ this.args[actionName](...params);
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Triggers an action from the dropdown menu
143
+ *
144
+ * @param {DropdownActions} dd
145
+ * @param {String} actionName
146
+ * @param {...} params
147
+ * @memberof OrderListOverlayComponent
148
+ */
149
+ @action onDropdownAction(dd, actionName, ...params) {
150
+ if (typeof dd?.actions?.close === 'function') {
151
+ dd.actions.close();
152
+ }
153
+
154
+ this.onAction(actionName, ...params);
155
+ }
156
+
157
+ /**
158
+ * Loads fleets records.
159
+ *
160
+ * @return {Promise}
161
+ * @memberof OrderListOverlayComponent
162
+ */
163
+ @action fetchFleets() {
164
+ this.isLoading = true;
165
+
166
+ // if (this.appCache.has('fleets')) {
167
+ // this.fleets = this.appCache.getEmberData('fleets', 'fleet');
168
+ // }
169
+
170
+ return this.store
171
+ .query('fleet', { with: ['serviceArea', 'drivers.jobs', 'drivers.currentJob'], without: ['drivers.fleets'] })
172
+ .then((fleets) => {
173
+ this.fleets = fleets;
174
+ this.appCache.setEmberData('fleets', fleets);
175
+ })
176
+ .finally(() => {
177
+ this.isLoading = false;
178
+ });
179
+ }
180
+
181
+ /**
182
+ * Loads unassinged orders records.
183
+ *
184
+ * @return {Promise}
185
+ * @memberof OrderListOverlayComponent
186
+ */
187
+ @action fetchUnassignedOrders() {
188
+ this.isLoading = true;
189
+
190
+ return this.store
191
+ .query('order', { unassigned: 1 })
192
+ .then((unassignedOrders) => {
193
+ this.unassignedOrders = unassignedOrders;
194
+ })
195
+ .finally(() => {
196
+ this.isLoading = false;
197
+ });
198
+ }
199
+
200
+ /**
201
+ * Loads active order records.
202
+ *
203
+ * @return {Promise}
204
+ * @memberof OrderListOverlayComponent
205
+ */
206
+ @action fetchActiveOrders() {
207
+ this.isLoading = true;
208
+
209
+ return this.fetch
210
+ .get(
211
+ 'fleet-ops/live/orders',
212
+ {},
213
+ {
214
+ normalizeToEmberData: true,
215
+ normalizeModelType: 'order',
216
+ expirationInterval: 5,
217
+ expirationIntervalUnit: 'minute',
218
+ }
219
+ )
220
+ .then((orders) => {
221
+ this.activeOrders = orders;
222
+ })
223
+ .finally(() => {
224
+ this.isLoading = false;
225
+ });
226
+ }
227
+ }