@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,794 @@
1
+ import Controller, { inject as controller } from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+ import { tracked } from '@glimmer/tracking';
4
+ import { action, computed } from '@ember/object';
5
+ import { isArray } from '@ember/array';
6
+ import { later } from '@ember/runloop';
7
+ import { not, notEmpty, alias } from '@ember/object/computed';
8
+ import { OSRMv1, Control as RoutingControl } from '@fleetbase/leaflet-routing-machine';
9
+ import groupBy from '@fleetbase/ember-core/utils/macros/group-by';
10
+ import findClosestWaypoint from '@fleetbase/ember-core/utils/find-closest-waypoint';
11
+ import getRoutingHost from '@fleetbase/ember-core/utils/get-routing-host';
12
+ import extractCoordinates from '@fleetbase/ember-core/utils/extract-coordinates';
13
+ import getModelName from '@fleetbase/ember-core/utils/get-model-name';
14
+
15
+ export default class OperationsOrdersIndexViewController extends Controller {
16
+ /**
17
+ * Inject the `operations.orders.index` controller
18
+ *
19
+ * @var {Controller}
20
+ */
21
+ @controller('operations.orders.index') ordersController;
22
+
23
+ /**
24
+ * Inject the `operations.orders.index` controller
25
+ *
26
+ * @var {Controller}
27
+ */
28
+ @controller('management.places.index') placesController;
29
+
30
+ /**
31
+ * Inject the `management.contacts.index` controller
32
+ *
33
+ * @var {Controller}
34
+ */
35
+ @controller('management.contacts.index') contactsController;
36
+
37
+ /**
38
+ * Inject the `management.vendors.index` controller
39
+ *
40
+ * @var {Controller}
41
+ */
42
+ @controller('management.vendors.index') vendorsController;
43
+
44
+ /**
45
+ * Inject the `management.drivers.index` controller
46
+ *
47
+ * @var {Controller}
48
+ */
49
+ @controller('management.drivers.index') driversController;
50
+
51
+ /**
52
+ * Inject the `modals-manager` service
53
+ *
54
+ * @var {Service}
55
+ */
56
+ @service modalsManager;
57
+
58
+ /**
59
+ * Inject the `notifications` service
60
+ *
61
+ * @var {Service}
62
+ */
63
+ @service notifications;
64
+
65
+ /**
66
+ * Inject the `currentUser` service
67
+ *
68
+ * @var {Service}
69
+ */
70
+ @service currentUser;
71
+
72
+ /**
73
+ * Inject the `fetch` service
74
+ *
75
+ * @var {Service}
76
+ */
77
+ @service fetch;
78
+
79
+ /**
80
+ * Inject the `hostRouter` service
81
+ *
82
+ * @var {Service}
83
+ */
84
+ @service hostRouter;
85
+
86
+ @tracked isLoadingAdditionalData = false;
87
+ @tracked isWaypointsCollapsed;
88
+ @tracked leafletRoute;
89
+ @tracked routeControl;
90
+
91
+ @alias('currentUser.latitude') userLatitude;
92
+ @alias('currentUser.longitude') userLongitude;
93
+
94
+ @tracked detailPanelButtons = [
95
+ {
96
+ type: 'default',
97
+ text: 'Edit',
98
+ icon: 'pencil',
99
+ iconPrefix: 'fas',
100
+ onClick: () => {
101
+ const order = this.model;
102
+ this.editOrder(order);
103
+ },
104
+ },
105
+ ];
106
+
107
+ @tracked routePanelButtons = [
108
+ {
109
+ type: 'default',
110
+ text: 'Edit',
111
+ icon: 'pencil',
112
+ iconPrefix: 'fas',
113
+ onClick: () => {
114
+ const order = this.model;
115
+ this.editOrderRoute(order);
116
+ },
117
+ },
118
+ ];
119
+
120
+ @not('isWaypointsCollapsed') waypointsIsNotCollapsed;
121
+ @notEmpty('model.payload.waypoints') isMultiDropOrder;
122
+ @alias('ordersController.leafletMap') leafletMap;
123
+ @groupBy('model.order_config.meta.fields', 'group') groupedMetaFields;
124
+
125
+ /** @var entitiesByDestination */
126
+ @computed('model.payload.{entities.[],waypoints.[]}')
127
+ get entitiesByDestination() {
128
+ const groups = [];
129
+
130
+ // create groups
131
+ this.model.payload.waypoints.forEach((waypoint) => {
132
+ const destinationId = waypoint.id || null;
133
+
134
+ if (destinationId) {
135
+ const entities = this.model.payload.entities.filter((entity) => entity.destination_uuid === destinationId);
136
+
137
+ if (entities.length === 0) {
138
+ return;
139
+ }
140
+
141
+ const group = {
142
+ destinationId,
143
+ waypoint,
144
+ entities,
145
+ };
146
+
147
+ groups.pushObject(group);
148
+ }
149
+ });
150
+
151
+ return groups;
152
+ }
153
+
154
+ @action resetView() {
155
+ this.removeRoutingControlPreview();
156
+ this.resetInterface();
157
+ }
158
+
159
+ @action resetInterface() {
160
+ this.leafletMap?.liveMap?.showDrivers();
161
+ this.leafletMap?.liveMap?.showRoutes();
162
+ }
163
+
164
+ @action removeRoutingControlPreview() {
165
+ const { leafletMap, routeControl } = this;
166
+ let removed = false;
167
+
168
+ if (routeControl instanceof RoutingControl) {
169
+ try {
170
+ routeControl.remove();
171
+ removed = true;
172
+ } catch (e) {
173
+ // silent
174
+ }
175
+
176
+ if (!removed) {
177
+ try {
178
+ leafletMap?.removeControl(routeControl);
179
+ } catch (e) {
180
+ // silent
181
+ }
182
+ }
183
+ }
184
+
185
+ if (!removed) {
186
+ this.forceRemoveRoutePreview();
187
+ }
188
+ }
189
+
190
+ @action forceRemoveRoutePreview() {
191
+ const { leafletMap } = this;
192
+
193
+ leafletMap.eachLayer((layer) => {
194
+ if (layer instanceof L.Polyline || layer instanceof L.Marker) {
195
+ layer.remove();
196
+ }
197
+ });
198
+ }
199
+
200
+ @action setupInterface() {
201
+ // always set map layout
202
+ this.ordersController.setLayoutMode('map');
203
+
204
+ setTimeout(() => {
205
+ this.leafletMap?.liveMap?.hideDrivers();
206
+ this.leafletMap?.liveMap?.hideRoutes();
207
+
208
+ // display order route on map
209
+ this.displayOrderRoute();
210
+ }, 600);
211
+ }
212
+
213
+ @action displayOrderRoute() {
214
+ // map coordinates from lng, lat -> lat, lng
215
+ const payload = this.model.payload;
216
+ const waypoints = payload?.payloadCoordinates?.map((coord) => extractCoordinates(coord));
217
+ const leafletMap = this.leafletMap;
218
+ const routingHost = getRoutingHost(payload, payload?.waypoints?.toArray());
219
+
220
+ if (!waypoints || waypoints.length < 2 || !leafletMap) {
221
+ return;
222
+ }
223
+
224
+ // center on first coordinate
225
+ leafletMap.stop();
226
+ leafletMap.flyTo(waypoints.firstObject);
227
+
228
+ const router = new OSRMv1({
229
+ serviceUrl: `${routingHost}/route/v1`,
230
+ profile: 'driving',
231
+ });
232
+
233
+ this.routeControl = new RoutingControl({
234
+ waypoints,
235
+ alternativeClassName: 'hidden',
236
+ addWaypoints: false,
237
+ router,
238
+ }).addTo(leafletMap);
239
+
240
+ this.routeControl?.on('routesfound', (event) => {
241
+ const { routes } = event;
242
+
243
+ this.leafletRoute = routes.firstObject;
244
+ });
245
+
246
+ setTimeout(() => {
247
+ leafletMap?.flyToBounds(waypoints, {
248
+ paddingBottomRight: [200, 0],
249
+ maxZoom: 14,
250
+ animate: true,
251
+ });
252
+ leafletMap.once('moveend', function () {
253
+ leafletMap.panBy([250, 0]);
254
+ });
255
+ }, 300);
256
+ }
257
+
258
+ /**
259
+ * Edit order details.
260
+ *
261
+ * @param {OrderModel} order
262
+ * @param {Object} options
263
+ * @void
264
+ */
265
+ @action toggleWaypointsCollapse() {
266
+ const _isWaypointsCollapsed = this.isWaypointsCollapsed;
267
+
268
+ this.isWaypointsCollapsed = !_isWaypointsCollapsed;
269
+ }
270
+
271
+ /**
272
+ * Edit order details.
273
+ *
274
+ * @param {OrderModel} order
275
+ * @param {Object} options
276
+ * @void
277
+ */
278
+ @action editOrder(order, options = {}) {
279
+ options = options === null ? {} : options;
280
+
281
+ this.modalsManager.show('modals/order-form', {
282
+ title: 'Edit Order Details',
283
+ acceptButtonText: 'Save Changes',
284
+ acceptButtonIcon: 'save',
285
+ setOrderFacilitator: (model) => {
286
+ order.set('facilitator', model);
287
+ order.set('facilitator_type', `fleet-ops:${model.facilitator_type}`);
288
+ order.set('driver', null);
289
+
290
+ if (model) {
291
+ this.modalsManager.setOptions('driversQuery', {
292
+ facilitator: model.id,
293
+ });
294
+ }
295
+ },
296
+ setOrderCustomer: (model) => {
297
+ order.set('customer', model);
298
+ order.set('customer_type', `fleet-ops:${model.customer_type}`);
299
+ },
300
+ setDriver: (driver) => {
301
+ order.set('driver_assigned', driver);
302
+
303
+ if (!driver) {
304
+ order.set('driver_assigned_uuid', null);
305
+ }
306
+ },
307
+ scheduleOrder: (dateInstance) => {
308
+ order.scheduled_at = dateInstance.toDate();
309
+ },
310
+ driversQuery: {},
311
+ order,
312
+ confirm: (modal) => {
313
+ modal.startLoading();
314
+ return order.save().then(() => {
315
+ this.notifications.success(options.successNotification || `'${order.public_id}' details has been updated.`);
316
+ });
317
+ },
318
+ decline: () => {
319
+ order.payload.rollbackAttributes();
320
+ this.modalsManager.done();
321
+ },
322
+ ...options,
323
+ });
324
+ }
325
+
326
+ /**
327
+ * View order RAW order meta.
328
+ *
329
+ * @param {OrderModel} order
330
+ * @void
331
+ */
332
+ @action viewOrderMeta(order) {
333
+ this.modalsManager.show('modals/order-meta', {
334
+ title: 'Order Metadata',
335
+ acceptButtonText: 'Done',
336
+ acceptButtonIcon: 'check',
337
+ acceptButtonIconPrefix: 'fas',
338
+ hideDeclineButton: true,
339
+ order,
340
+ });
341
+ }
342
+
343
+ @action unassignDriver(order, options = {}) {
344
+ this.modalsManager.confirm({
345
+ title: `Are you sure you wish to unassing the driver (${order.driver_assigned.name}) from this order?`,
346
+ body: `Once the driver is unassigned, the driver will no longer have access to this orders details.`,
347
+ order,
348
+ confirm: (modal) => {
349
+ modal.startLoading();
350
+
351
+ order.setProperties({
352
+ driver_assigned: null,
353
+ driver_assigned_uuid: null,
354
+ });
355
+
356
+ return order
357
+ .save()
358
+ .then(() => {
359
+ this.notifications.success(`Driver has been unassigned from this order.`);
360
+ })
361
+ .catch((error) => {
362
+ this.notifications.serverError(error);
363
+ });
364
+ },
365
+ ...options,
366
+ });
367
+ }
368
+
369
+ /**
370
+ * Edit order routing details.
371
+ *
372
+ * @param {OrderModel} order
373
+ * @param {Object} options
374
+ * @void
375
+ */
376
+ @action async editOrderRoute(order, options = {}) {
377
+ options = options === null ? {} : options;
378
+
379
+ await this.modalsManager.done();
380
+
381
+ this.modalsManager.show('modals/order-route-form', {
382
+ title: 'Edit Order Route',
383
+ acceptButtonText: 'Save Changes',
384
+ acceptButtonIcon: 'save',
385
+ order,
386
+ userLatitude: this.userLatitude,
387
+ userLongitude: this.userLongitude,
388
+ isOptimizingRoute: false,
389
+ editPlace: async (place) => {
390
+ await this.modalsManager.done();
391
+ this.placesController.editPlace(place, {
392
+ onFinish: () => {
393
+ this.editOrderRoute(order);
394
+ },
395
+ });
396
+ },
397
+ toggleMultiDropOrder: () => {
398
+ if (order.payload.isMultiDrop) {
399
+ order.payload.waypoints.clear();
400
+ order.payload.setProperties({
401
+ pickup_uuid: '#',
402
+ dropoff_uuid: '#',
403
+ });
404
+ } else {
405
+ const waypoint = this.store.createRecord('waypoint');
406
+ order.payload.waypoints.pushObject(waypoint);
407
+
408
+ order.payload.setProperties({
409
+ pickup_uuid: null,
410
+ dropoff_uuid: null,
411
+ pickup: null,
412
+ dropoff: null,
413
+ });
414
+ }
415
+ },
416
+ removeWaypoint: (waypoint) => {
417
+ order.payload.waypoints.removeObject(waypoint);
418
+ },
419
+ addWaypoint: () => {
420
+ const waypoint = this.store.createRecord('waypoint');
421
+ order.payload.waypoints.pushObject(waypoint);
422
+ },
423
+ setWaypointPlace: (index, place) => {
424
+ if (!order.payload.waypoints?.objectAt(index)) {
425
+ return;
426
+ }
427
+
428
+ order.payload.waypoints.objectAt(index).setProperties({
429
+ name: place.name,
430
+ place_uuid: place.id,
431
+ place,
432
+ });
433
+ },
434
+ setPayloadPlace: (prop, place) => {
435
+ order.payload.set(prop, place);
436
+ },
437
+ optimizeRoute: async () => {
438
+ this.modalsManager.setOption('isOptimizingRoute', true);
439
+
440
+ const coordinates = order.payload.payloadCoordinates;
441
+ const routingHost = getRoutingHost(order.payload, order.payload.waypoints);
442
+
443
+ const response = await this.fetch.routing(coordinates, { source: 'any', destination: 'any', annotations: true }, { host: routingHost }).catch(() => {
444
+ this.notifications.error('Route optimization failed, check route entry and try again.');
445
+ this.modalsManager.setOption('isOptimizingRoute', false);
446
+ });
447
+
448
+ if (response && response.code === 'Ok') {
449
+ if (response.waypoints && isArray(response.waypoints)) {
450
+ const responseWaypoints = response.waypoints.sortBy('waypoint_index');
451
+ const sortedWaypoints = [];
452
+
453
+ for (let i = 0; i < responseWaypoints.length; i++) {
454
+ const optimizedWaypoint = responseWaypoints.objectAt(i);
455
+ const optimizedWaypointLongitude = optimizedWaypoint.location.firstObject;
456
+ const optimizedWaypointLatitude = optimizedWaypoint.location.lastObject;
457
+ const waypointModel = findClosestWaypoint(optimizedWaypointLatitude, optimizedWaypointLongitude, order.payload.waypoints);
458
+
459
+ sortedWaypoints.pushObject(waypointModel);
460
+ }
461
+
462
+ order.payload.waypoints = sortedWaypoints;
463
+ }
464
+ } else {
465
+ this.notifications.error('Route optimization failed, check route entry and try again.');
466
+ }
467
+
468
+ this.modalsManager.setOption('isOptimizingRoute', false);
469
+ },
470
+ confirm: (modal) => {
471
+ modal.startLoading();
472
+
473
+ return order.payload.save().then(() => {
474
+ this.notifications.success(options.successNotification ?? `'${order.public_id}' route details updated.`);
475
+ });
476
+ },
477
+ decline: () => {
478
+ order.payload.rollbackAttributes();
479
+ this.modalsManager.done();
480
+ },
481
+ ...options,
482
+ });
483
+ }
484
+
485
+ /**
486
+ * Cancel the currently viewing order
487
+ *
488
+ * @param {OrderModel} order
489
+ * @void
490
+ */
491
+ @action cancelOrder(order) {
492
+ this.ordersController.cancelOrder(order, {
493
+ onConfirm: () => {
494
+ order.loadTrackingActivity();
495
+ },
496
+ });
497
+ }
498
+
499
+ /**
500
+ * Delete the currently viewing order
501
+ *
502
+ * @param {OrderModel} order
503
+ * @void
504
+ */
505
+ @action deleteOrder(order) {
506
+ this.ordersController.deleteOrder(order, {
507
+ onConfirm: () => {
508
+ return this.transitionBack();
509
+ },
510
+ });
511
+ }
512
+
513
+ /**
514
+ * Sends the order for dispatch
515
+ *
516
+ * @param {OrderModel} order
517
+ * @void
518
+ */
519
+ @action dispatchOrder(order) {
520
+ this.ordersController.dispatchOrder(order, {
521
+ onConfirm: () => {
522
+ order.loadTrackingActivity();
523
+ },
524
+ });
525
+ }
526
+
527
+ /**
528
+ * Sends user to this orders socket channel
529
+ *
530
+ * @param {OrderModel} order
531
+ * @void
532
+ */
533
+ @action listenToSocket(order) {
534
+ this.hostRouter.transitionTo('console.developers.sockets.view', `order.${order.public_id}`);
535
+ }
536
+
537
+ /**
538
+ * Prompt user to update order activity
539
+ *
540
+ * @param {OrderModel} order
541
+ * @void
542
+ */
543
+ @action async createNewActivity(order) {
544
+ this.modalsManager.displayLoader();
545
+
546
+ const activityOptions = await this.fetch.get(`orders/next-activity/${order.id}`);
547
+ await this.modalsManager.done();
548
+
549
+ this.modalsManager.show(`modals/order-new-activity`, {
550
+ title: 'Add new activity to order',
551
+ acceptButton: false,
552
+ selected: null,
553
+ custom: {
554
+ status: '',
555
+ details: '',
556
+ code: '',
557
+ },
558
+ order,
559
+ activityOptions,
560
+ confirm: (modal) => {
561
+ modal.startLoading();
562
+
563
+ let { selected, custom } = modal.getOptions(['custom', 'selected']);
564
+ let activity = selected !== 'custom' ? activityOptions[selected] : null;
565
+
566
+ if (selected === 'custom') {
567
+ if (!custom.status || !custom.details || !custom.code) {
568
+ modal.stopLoading();
569
+
570
+ return this.notifications.warning('Invalid custom status entry.');
571
+ }
572
+
573
+ activity = custom;
574
+ }
575
+
576
+ return this.fetch
577
+ .patch(`orders/update-activity/${order.id}`, {
578
+ activity,
579
+ })
580
+ .then(() => {
581
+ modal.stopLoading();
582
+ return later(
583
+ this,
584
+ () => {
585
+ return this.hostRouter.refresh();
586
+ },
587
+ 100
588
+ );
589
+ })
590
+ .catch((error) => {
591
+ modal.stopLoading();
592
+ this.notifications.serverError(error);
593
+ });
594
+ },
595
+ });
596
+ }
597
+
598
+ /**
599
+ * Prompt user to assign a driver
600
+ *
601
+ * @param {OrderModel} order
602
+ * @void
603
+ */
604
+ @action async assignDriver(order) {
605
+ if (order.canLoadDriver) {
606
+ this.modalsManager.displayLoader();
607
+
608
+ order.driver = await this.store.findRecord('driver', order.driver_uuid);
609
+ await this.modalsManager.done();
610
+ }
611
+
612
+ this.modalsManager.show(`modals/order-assign-driver`, {
613
+ title: order.driver_uuid ? 'Change order driver' : 'Assign driver to order',
614
+ acceptButtonText: 'Save Changes',
615
+ order,
616
+ confirm: (modal) => {
617
+ modal.startLoading();
618
+ return order.save().then(() => {
619
+ this.notifications.success(`${order.public_id} assigned driver updated.`);
620
+ });
621
+ },
622
+ });
623
+ }
624
+
625
+ /**
626
+ * View order label
627
+ *
628
+ * @param {OrderModel} order
629
+ * @void
630
+ */
631
+ @action async viewOrderLabel(order) {
632
+ // render dialog to display label within
633
+ this.modalsManager.show(`modals/order-label`, {
634
+ title: 'Order Label',
635
+ modalClass: 'modal-xl',
636
+ acceptButtonText: 'Done',
637
+ order,
638
+ });
639
+
640
+ // load the pdf label from base64
641
+ // eslint-disable-next-line no-undef
642
+ const fileReader = new FileReader();
643
+ const pdfStream = await this.fetch.get(`orders/label/${order.public_id}?format=base64`).then((resp) => resp.data);
644
+ // eslint-disable-next-line no-undef
645
+ const base64 = await fetch(`data:application/pdf;base64,${pdfStream}`);
646
+ const blob = await base64.blob();
647
+ // load into file reader
648
+ fileReader.onload = (event) => {
649
+ const data = event.target.result;
650
+ this.modalsManager.setOption('data', data);
651
+ };
652
+ fileReader.readAsDataURL(blob);
653
+ }
654
+
655
+ /**
656
+ * View order label
657
+ *
658
+ * @param {WaypointModel} waypoint
659
+ * @void
660
+ */
661
+ @action async viewWaypointLabel(waypoint, dd) {
662
+ if (dd && typeof dd.actions.close === 'function') {
663
+ dd.actions.close();
664
+ }
665
+
666
+ // render dialog to display label within
667
+ this.modalsManager.show(`modals/order-label`, {
668
+ title: 'Waypoint Label',
669
+ modalClass: 'modal-xl',
670
+ acceptButtonText: 'Done',
671
+ });
672
+
673
+ // load the pdf label from base64
674
+ // eslint-disable-next-line no-undef
675
+ const fileReader = new FileReader();
676
+ const pdfStream = await this.fetch.get(`orders/label/${waypoint.waypoint_public_id}?format=base64`).then((resp) => resp.data);
677
+ // eslint-disable-next-line no-undef
678
+ const base64 = await fetch(`data:application/pdf;base64,${pdfStream}`);
679
+ const blob = await base64.blob();
680
+ // load into file reader
681
+ fileReader.onload = (event) => {
682
+ const data = event.target.result;
683
+ this.modalsManager.setOption('data', data);
684
+ };
685
+ fileReader.readAsDataURL(blob);
686
+ }
687
+
688
+ /**
689
+ * Reloads tracking activity for this order.
690
+ *
691
+ * @void
692
+ */
693
+ @action reloadTrackingStatuses() {
694
+ return this.model.loadTrackingActivity();
695
+ }
696
+
697
+ /**
698
+ * Uses router service to transition back to `orders.index`
699
+ *
700
+ * @void
701
+ */
702
+ @action transitionBack() {
703
+ return this.transitionToRoute('operations.orders.index');
704
+ }
705
+
706
+ @action async viewCustomer({ customer, customer_is_contact }) {
707
+ if (customer_is_contact) {
708
+ this.contactsController.viewContact(customer);
709
+ return;
710
+ }
711
+
712
+ this.vendorsController.viewVendor(customer);
713
+ }
714
+
715
+ @action async viewDriver(order) {
716
+ if (order.canLoadDriver) {
717
+ this.modalsManager.displayLoader();
718
+
719
+ order.driver = await this.store.findRecord('driver', order.driver_uuid);
720
+ await this.modalsManager.done();
721
+ }
722
+
723
+ this.driversController.viewDriver(order.driver_assigned);
724
+ }
725
+
726
+ @action async viewFacilitator({ facilitator, facilitator_is_contact }) {
727
+ if (facilitator_is_contact) {
728
+ this.contactsController.viewContact(facilitator);
729
+ return;
730
+ }
731
+
732
+ this.vendorsController.viewVendor(facilitator);
733
+ }
734
+
735
+ @action addEntity(destination = null) {
736
+ const entity = this.store.createRecord('entity', {
737
+ payload_uuid: this.model.payload.id,
738
+ destination_uuid: destination ? destination.id : null,
739
+ });
740
+
741
+ this.model.payload.entities.pushObject(entity);
742
+ }
743
+
744
+ @action removeEntity(entity) {
745
+ entity.destroyRecord();
746
+ }
747
+
748
+ @action editEntity(entity) {
749
+ this.modalsManager.show('modals/entity-form', {
750
+ title: 'Edit Item',
751
+ acceptButtonText: 'Save Changes',
752
+ entity,
753
+ uploadNewPhoto: (file) => {
754
+ if (entity.get('isNew')) {
755
+ const { queue } = file;
756
+ const fileUrl = URL.createObjectURL(file.blob);
757
+
758
+ this.modalsManager.setOption('pendingFileUpload', file);
759
+ entity.set('photo_url', fileUrl);
760
+ queue.remove(file);
761
+ return;
762
+ }
763
+
764
+ return this.fetch.uploadFile.perform(
765
+ file,
766
+ {
767
+ path: `uploads/${this.currentUser.companyId}/entities/${entity.id}`,
768
+ subject_uuid: entity.id,
769
+ subject_type: `entity`,
770
+ type: `entity_photo`,
771
+ },
772
+ (uploadedFile) => {
773
+ entity.setProperties({
774
+ photo_uuid: uploadedFile.id,
775
+ photo_url: uploadedFile.s3url,
776
+ photo: uploadedFile,
777
+ });
778
+ }
779
+ );
780
+ },
781
+ confirm: async (modal) => {
782
+ modal.startLoading();
783
+
784
+ const pendingFileUpload = modal.getOption('pendingFileUpload');
785
+
786
+ return entity.save().then(() => {
787
+ if (pendingFileUpload) {
788
+ return modal.invoke('uploadNewPhoto', pendingFileUpload);
789
+ }
790
+ });
791
+ },
792
+ });
793
+ }
794
+ }