@fleetbase/fleetops-engine 0.6.18 → 0.6.19

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 (1443) hide show
  1. package/addon/components/activity/event-selector.hbs +59 -0
  2. package/addon/components/activity/event-selector.js +82 -0
  3. package/addon/components/activity/form.hbs +62 -0
  4. package/addon/components/activity/form.js +78 -0
  5. package/addon/components/activity/logic-builder.hbs +150 -0
  6. package/addon/components/activity/logic-builder.js +280 -0
  7. package/addon/components/admin/avatar-management.hbs +7 -7
  8. package/addon/components/admin/avatar-management.js +35 -59
  9. package/addon/components/admin/navigator-app.hbs +3 -3
  10. package/addon/components/asset/form.js +3 -0
  11. package/addon/components/avatar-picker.hbs +34 -12
  12. package/addon/components/avatar-picker.js +55 -25
  13. package/addon/components/cell/driver-name.hbs +1 -1
  14. package/addon/components/contact/details.hbs +42 -0
  15. package/addon/components/contact/details.js +3 -0
  16. package/addon/components/contact/form.hbs +89 -0
  17. package/addon/components/contact/form.js +57 -0
  18. package/addon/components/contact/panel-header.hbs +67 -0
  19. package/addon/components/contact/panel-header.js +3 -0
  20. package/addon/components/custom-entity/form.hbs +61 -0
  21. package/addon/components/custom-entity/form.js +90 -0
  22. package/addon/components/customer/admin-settings.hbs +1 -1
  23. package/addon/components/customer/create-order-form.hbs +57 -75
  24. package/addon/components/customer/create-order-form.js +32 -103
  25. package/addon/components/customer/details.hbs +52 -0
  26. package/addon/components/customer/details.js +3 -0
  27. package/addon/components/customer/form.hbs +144 -0
  28. package/addon/components/customer/form.js +109 -0
  29. package/addon/components/customer/leaflet-map.js +3 -0
  30. package/addon/components/customer/order-details.js +3 -0
  31. package/addon/components/customer/order-form.hbs +476 -0
  32. package/addon/components/customer/order-form.js +140 -0
  33. package/addon/components/customer/orders.hbs +2 -2
  34. package/addon/components/customer/orders.js +12 -1
  35. package/addon/components/device/details.hbs +105 -0
  36. package/addon/components/device/details.js +3 -0
  37. package/addon/components/device/form.hbs +194 -0
  38. package/addon/components/device/form.js +13 -0
  39. package/addon/components/display-place.hbs +4 -4
  40. package/addon/components/driver/details.hbs +56 -0
  41. package/addon/components/driver/details.js +3 -0
  42. package/addon/components/driver/form.hbs +171 -0
  43. package/addon/components/driver/form.js +84 -0
  44. package/addon/components/driver/panel-header.hbs +40 -0
  45. package/addon/components/driver/panel-header.js +3 -0
  46. package/addon/components/driver-onboard-settings.hbs +14 -14
  47. package/addon/components/entity/card.hbs +28 -0
  48. package/addon/components/entity/card.js +6 -0
  49. package/addon/components/entity/details.js +3 -0
  50. package/addon/components/entity/form.hbs +86 -0
  51. package/addon/components/entity/form.js +32 -0
  52. package/addon/components/entity-field-editing-settings.hbs +8 -8
  53. package/addon/components/equipment/details.hbs +95 -0
  54. package/addon/components/equipment/details.js +3 -0
  55. package/addon/components/equipment/form.hbs +127 -0
  56. package/addon/components/equipment/form.js +27 -0
  57. package/addon/components/fleet/details.hbs +32 -0
  58. package/addon/components/fleet/details.js +3 -0
  59. package/addon/components/fleet/driver-listing.hbs +81 -0
  60. package/addon/components/fleet/driver-listing.js +77 -0
  61. package/addon/components/fleet/form.hbs +108 -0
  62. package/addon/components/fleet/form.js +20 -0
  63. package/addon/components/fleet/vehicle-listing.hbs +86 -0
  64. package/addon/components/fleet/vehicle-listing.js +76 -0
  65. package/addon/components/fleet-driver-listing.hbs +5 -5
  66. package/addon/components/fleet-panel/details.hbs +13 -13
  67. package/addon/components/fleet-panel/driver-listing.hbs +5 -5
  68. package/addon/components/fleet-panel/vehicle-listing.hbs +5 -5
  69. package/addon/components/fleet-panel/vehicle-listing.js +11 -74
  70. package/addon/components/fleet-vehicle-listing.hbs +5 -5
  71. package/addon/components/fuel-report/details.hbs +48 -0
  72. package/addon/components/fuel-report/details.js +3 -0
  73. package/addon/components/fuel-report/form.hbs +110 -0
  74. package/addon/components/fuel-report/form.js +14 -0
  75. package/addon/components/global-search.hbs +6 -6
  76. package/addon/components/global-search.js +30 -32
  77. package/addon/components/integrated-order-details.hbs +22 -22
  78. package/addon/components/integrated-vendor/details.hbs +34 -0
  79. package/addon/components/integrated-vendor/form.hbs +80 -0
  80. package/addon/components/integrated-vendor/form.js +11 -0
  81. package/addon/components/issue/details.hbs +68 -0
  82. package/addon/components/issue/form.hbs +183 -0
  83. package/addon/components/issue/form.js +3 -0
  84. package/addon/components/layout/fleet-ops-sidebar/driver-listing.hbs +3 -1
  85. package/addon/components/layout/fleet-ops-sidebar/driver-listing.js +96 -100
  86. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.hbs +2 -0
  87. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.js +73 -80
  88. package/addon/components/layout/fleet-ops-sidebar.hbs +6 -1
  89. package/addon/components/layout/fleet-ops-sidebar.js +150 -49
  90. package/addon/components/leaflet-draw-control.js +1 -0
  91. package/addon/components/maintenance/details.hbs +123 -0
  92. package/addon/components/maintenance/details.js +3 -0
  93. package/addon/components/maintenance/form.hbs +174 -0
  94. package/addon/components/maintenance/form.js +18 -0
  95. package/addon/components/map/container.hbs +3 -0
  96. package/addon/components/map/container.js +10 -0
  97. package/addon/components/map/drawer/driver-listing.hbs +11 -0
  98. package/addon/components/map/drawer/driver-listing.js +149 -0
  99. package/addon/components/map/drawer/event-listing.hbs +1 -0
  100. package/addon/components/map/drawer/event-listing.js +3 -0
  101. package/addon/components/map/drawer/place-listing.hbs +11 -0
  102. package/addon/components/map/drawer/place-listing.js +116 -0
  103. package/addon/components/map/drawer/vehicle-listing.hbs +11 -0
  104. package/addon/components/map/drawer/vehicle-listing.js +125 -0
  105. package/addon/components/map/drawer.hbs +5 -0
  106. package/addon/components/map/drawer.js +23 -0
  107. package/addon/components/map/leaflet-live-map.hbs +177 -0
  108. package/addon/components/map/leaflet-live-map.js +437 -0
  109. package/addon/components/map/leaflet-tracking-layer.hbs +1 -0
  110. package/addon/components/map/leaflet-tracking-layer.js +3 -0
  111. package/addon/components/map/order-list-overlay/driver-panel-title.hbs +11 -0
  112. package/addon/components/map/order-list-overlay/driver-panel-title.js +3 -0
  113. package/addon/components/map/order-list-overlay/order.hbs +106 -0
  114. package/addon/components/map/order-list-overlay/order.js +35 -0
  115. package/addon/components/map/order-list-overlay.hbs +176 -0
  116. package/addon/components/map/order-list-overlay.js +8 -0
  117. package/addon/components/map/search.hbs +1 -0
  118. package/addon/components/map/search.js +3 -0
  119. package/addon/components/map/toolbar/visibility-control-panel.hbs +130 -0
  120. package/addon/components/map/toolbar/visibility-control-panel.js +78 -0
  121. package/addon/components/map/toolbar/zones-panel.hbs +55 -0
  122. package/addon/components/map/toolbar/zones-panel.js +24 -0
  123. package/addon/components/map/toolbar.hbs +115 -0
  124. package/addon/components/map/toolbar.js +42 -0
  125. package/addon/components/map.hbs +11 -0
  126. package/addon/components/map.js +3 -0
  127. package/addon/components/modals/assign-driver.hbs +2 -2
  128. package/addon/components/modals/bulk-assign-driver.hbs +1 -1
  129. package/addon/components/modals/clone-config-form.hbs +2 -2
  130. package/addon/components/modals/contact-details.hbs +12 -12
  131. package/addon/components/modals/contact-form.hbs +11 -11
  132. package/addon/components/modals/driver-assign-order.hbs +2 -2
  133. package/addon/components/modals/driver-assign-vehicle.hbs +2 -2
  134. package/addon/components/modals/driver-assign-vendor.hbs +2 -2
  135. package/addon/components/modals/driver-details.hbs +21 -21
  136. package/addon/components/modals/driver-form.hbs +18 -18
  137. package/addon/components/modals/edit-meta-form.hbs +2 -2
  138. package/addon/components/modals/entity-form.hbs +21 -21
  139. package/addon/components/modals/entity-meta-field-prompt.hbs +1 -1
  140. package/addon/components/modals/fleet-details.hbs +12 -12
  141. package/addon/components/modals/fleet-form.hbs +8 -8
  142. package/addon/components/modals/fuel-report-details.hbs +16 -16
  143. package/addon/components/modals/fuel-report-form.hbs +8 -8
  144. package/addon/components/modals/group-details.hbs +4 -4
  145. package/addon/components/modals/group-form.hbs +5 -5
  146. package/addon/components/modals/install-prompt.hbs +2 -2
  147. package/addon/components/modals/issue-details.hbs +16 -16
  148. package/addon/components/modals/issue-from.hbs +21 -21
  149. package/addon/components/modals/map-field-form.hbs +2 -2
  150. package/addon/components/modals/map-field-group-form.hbs +1 -1
  151. package/addon/components/modals/map-layer-form.hbs +10 -10
  152. package/addon/components/modals/meta-field-form.hbs +2 -2
  153. package/addon/components/modals/meta-field-group-form.hbs +1 -1
  154. package/addon/components/modals/new-custom-field-group.hbs +1 -1
  155. package/addon/components/modals/new-order-config.hbs +4 -4
  156. package/addon/components/modals/order-assign-driver.hbs +2 -2
  157. package/addon/components/modals/order-config-new-status.hbs +2 -2
  158. package/addon/components/modals/order-event.hbs +4 -4
  159. package/addon/components/modals/order-form.hbs +12 -12
  160. package/addon/components/modals/order-import.hbs +10 -10
  161. package/addon/components/modals/order-label.hbs +1 -1
  162. package/addon/components/modals/order-meta.hbs +1 -10
  163. package/addon/components/modals/order-new-activity.hbs +10 -10
  164. package/addon/components/modals/order-route-form.hbs +18 -18
  165. package/addon/components/modals/place-assign-vendor.hbs +2 -2
  166. package/addon/components/modals/place-details.hbs +24 -24
  167. package/addon/components/modals/place-form.hbs +1 -44
  168. package/addon/components/modals/point-map.hbs +6 -3
  169. package/addon/components/modals/policy-form.hbs +5 -5
  170. package/addon/components/modals/role-form.hbs +3 -3
  171. package/addon/components/modals/select-payment-method.hbs +1 -1
  172. package/addon/components/modals/service-area-form.hbs +9 -9
  173. package/addon/components/modals/set-password.hbs +5 -5
  174. package/addon/components/modals/uninstall-prompt.hbs +2 -2
  175. package/addon/components/modals/update-order-activity.hbs +88 -0
  176. package/addon/components/modals/update-order-activity.js +51 -0
  177. package/addon/components/modals/user-form.hbs +8 -9
  178. package/addon/components/modals/vehicle-details.hbs +78 -78
  179. package/addon/components/modals/vehicle-form.hbs +74 -74
  180. package/addon/components/modals/vendor-details.hbs +21 -21
  181. package/addon/components/modals/vendor-form.hbs +50 -50
  182. package/addon/components/modals/view-service-area.hbs +1 -1
  183. package/addon/components/modals/zone-form.hbs +8 -8
  184. package/addon/components/order/activity-list.hbs +34 -0
  185. package/addon/components/order/activity-list.js +3 -0
  186. package/addon/components/order/activity-timeline.hbs +33 -0
  187. package/addon/components/order/activity-timeline.js +3 -0
  188. package/addon/components/order/customer-avatar-stack.hbs +21 -0
  189. package/addon/components/order/customer-avatar-stack.js +39 -0
  190. package/addon/components/order/details/activity.hbs +13 -0
  191. package/addon/components/order/details/activity.js +58 -0
  192. package/addon/components/order/details/comments.hbs +3 -0
  193. package/addon/components/order/details/comments.js +3 -0
  194. package/addon/components/order/details/custom-fields.hbs +1 -0
  195. package/addon/components/order/details/custom-fields.js +19 -0
  196. package/addon/components/order/details/detail.hbs +169 -0
  197. package/addon/components/order/details/detail.js +42 -0
  198. package/addon/components/order/details/documents.hbs +76 -0
  199. package/addon/components/order/details/documents.js +64 -0
  200. package/addon/components/order/details/integrated-vendor-details.hbs +5 -0
  201. package/addon/components/order/details/map.hbs +1 -0
  202. package/addon/components/order/details/map.js +3 -0
  203. package/addon/components/order/details/metadata.hbs +3 -0
  204. package/addon/components/order/details/metadata.js +26 -0
  205. package/addon/components/order/details/notes.hbs +43 -0
  206. package/addon/components/order/details/notes.js +42 -0
  207. package/addon/components/order/details/payload.hbs +97 -0
  208. package/addon/components/order/details/payload.js +75 -0
  209. package/addon/components/order/details/proof.hbs +42 -0
  210. package/addon/components/order/details/proof.js +3 -0
  211. package/addon/components/order/details/purchase-rate.hbs +39 -0
  212. package/addon/components/order/details/purchase-rate.js +3 -0
  213. package/addon/components/order/details/route.hbs +26 -0
  214. package/addon/components/order/details/route.js +55 -0
  215. package/addon/components/order/details/tracking.hbs +41 -0
  216. package/addon/components/order/details/tracking.js +21 -0
  217. package/addon/components/order/details.hbs +41 -0
  218. package/addon/components/order/details.js +3 -0
  219. package/addon/components/order/form/custom-fields.hbs +11 -0
  220. package/addon/components/order/form/custom-fields.js +3 -0
  221. package/addon/components/order/form/details.hbs +249 -0
  222. package/addon/components/order/form/details.js +76 -0
  223. package/addon/components/order/form/documents.hbs +76 -0
  224. package/addon/components/order/form/documents.js +64 -0
  225. package/addon/components/order/form/metadata.hbs +5 -0
  226. package/addon/components/order/form/metadata.js +3 -0
  227. package/addon/components/order/form/notes.hbs +11 -0
  228. package/addon/components/order/form/notes.js +3 -0
  229. package/addon/components/order/form/payload.hbs +139 -0
  230. package/addon/components/order/form/payload.js +73 -0
  231. package/addon/components/order/form/route.hbs +283 -0
  232. package/addon/components/order/form/route.js +214 -0
  233. package/addon/components/order/form/service-rate.hbs +109 -0
  234. package/addon/components/order/form/service-rate.js +26 -0
  235. package/addon/components/order/form.hbs +28 -0
  236. package/addon/components/order/form.js +65 -0
  237. package/addon/components/order/header.hbs +12 -12
  238. package/addon/components/order/kanban-card.hbs +85 -0
  239. package/addon/components/order/kanban-card.js +6 -0
  240. package/addon/components/order/kanban.hbs +10 -0
  241. package/addon/components/order/kanban.js +111 -0
  242. package/addon/components/order/panel-header.hbs +36 -0
  243. package/addon/components/order/panel-header.js +3 -0
  244. package/addon/components/order/place-card.hbs +2 -2
  245. package/addon/components/order/route-editor.hbs +192 -0
  246. package/addon/components/order/route-editor.js +233 -0
  247. package/addon/components/order/schedule-card.hbs +10 -10
  248. package/addon/components/order/schedule-card.js +10 -9
  249. package/addon/components/order-config-manager/activity-flow.hbs +1 -1
  250. package/addon/components/order-config-manager/activity-flow.js +47 -46
  251. package/addon/components/order-config-manager/custom-fields.hbs +5 -5
  252. package/addon/components/order-config-manager/custom-fields.js +17 -23
  253. package/addon/components/order-config-manager/details.hbs +10 -10
  254. package/addon/components/order-config-manager/details.js +4 -4
  255. package/addon/components/order-config-manager/entities.hbs +9 -10
  256. package/addon/components/order-config-manager/entities.js +30 -32
  257. package/addon/components/order-config-manager.hbs +1 -1
  258. package/addon/components/order-config-manager.js +25 -24
  259. package/addon/components/order-list-overlay/driver-panel-title.hbs +1 -1
  260. package/addon/components/order-progress-card.hbs +6 -6
  261. package/addon/components/part/details.hbs +108 -0
  262. package/addon/components/part/details.js +3 -0
  263. package/addon/components/part/form.hbs +163 -0
  264. package/addon/components/part/form.js +44 -0
  265. package/addon/components/place/activity.hbs +1 -0
  266. package/addon/components/place/activity.js +3 -0
  267. package/addon/components/place/card.hbs +1 -0
  268. package/addon/components/place/card.js +3 -0
  269. package/addon/components/place/comments.hbs +1 -0
  270. package/addon/components/place/comments.js +3 -0
  271. package/addon/components/place/details.hbs +106 -0
  272. package/addon/components/place/details.js +3 -0
  273. package/addon/components/place/documents.hbs +1 -0
  274. package/addon/components/place/documents.js +3 -0
  275. package/addon/components/place/driver-visits.hbs +1 -0
  276. package/addon/components/place/driver-visits.js +3 -0
  277. package/addon/components/place/form.hbs +60 -0
  278. package/addon/components/place/form.js +15 -0
  279. package/addon/components/place/frequency-map.hbs +1 -0
  280. package/addon/components/place/frequency-map.js +3 -0
  281. package/addon/components/place/map.hbs +1 -0
  282. package/addon/components/place/map.js +3 -0
  283. package/addon/components/place/operations.hbs +1 -0
  284. package/addon/components/place/operations.js +3 -0
  285. package/addon/components/place/performance.hbs +1 -0
  286. package/addon/components/place/performance.js +3 -0
  287. package/addon/components/place/recent-orders.hbs +1 -0
  288. package/addon/components/place/recent-orders.js +3 -0
  289. package/addon/components/place/rules.hbs +1 -0
  290. package/addon/components/place/rules.js +3 -0
  291. package/addon/components/place/service-areas.hbs +1 -0
  292. package/addon/components/place/service-areas.js +3 -0
  293. package/addon/components/route-list.hbs +2 -2
  294. package/addon/components/sensor/details.hbs +108 -0
  295. package/addon/components/sensor/details.js +3 -0
  296. package/addon/components/sensor/form.hbs +114 -0
  297. package/addon/components/sensor/form.js +29 -0
  298. package/addon/components/service-area/details.hbs +43 -0
  299. package/addon/components/service-area/form.hbs +49 -0
  300. package/addon/components/service-area/form.js +3 -0
  301. package/addon/components/service-rate/details.hbs +284 -0
  302. package/addon/components/service-rate/details.js +3 -0
  303. package/addon/components/service-rate/form.hbs +589 -0
  304. package/addon/components/service-rate/form.js +27 -0
  305. package/addon/components/telematic/details.hbs +85 -0
  306. package/addon/components/telematic/details.js +3 -0
  307. package/addon/components/telematic/form.hbs +84 -0
  308. package/addon/components/telematic/form.js +8 -0
  309. package/addon/components/vehicle/card.hbs +29 -0
  310. package/addon/components/vehicle/card.js +6 -0
  311. package/addon/components/vehicle/details.hbs +50 -0
  312. package/addon/components/vehicle/details.js +3 -0
  313. package/addon/components/vehicle/form.hbs +129 -0
  314. package/addon/components/vehicle/form.js +54 -0
  315. package/addon/components/vehicle/panel-header.hbs +79 -0
  316. package/addon/components/vehicle/panel-header.js +3 -0
  317. package/addon/components/vendor/details.hbs +50 -0
  318. package/addon/components/vendor/details.js +3 -0
  319. package/addon/components/vendor/form.hbs +149 -0
  320. package/addon/components/vendor/form.js +52 -0
  321. package/addon/components/warranty/details.hbs +81 -0
  322. package/addon/components/warranty/details.js +3 -0
  323. package/addon/components/warranty/form.hbs +82 -0
  324. package/addon/components/warranty/form.js +3 -0
  325. package/addon/components/widget/fleet-ops-key-metrics.hbs +1 -1
  326. package/addon/components/work-order/details.hbs +93 -0
  327. package/addon/components/work-order/details.js +3 -0
  328. package/addon/components/work-order/form.hbs +113 -0
  329. package/addon/components/work-order/form.js +13 -0
  330. package/addon/components/zone/details.hbs +38 -0
  331. package/addon/components/zone/form.hbs +33 -0
  332. package/addon/components/zone/form.js +3 -0
  333. package/addon/controllers/analytics/reports/index/details.js +24 -0
  334. package/addon/controllers/analytics/reports/index/edit.js +78 -0
  335. package/addon/controllers/analytics/reports/index/new.js +51 -0
  336. package/addon/controllers/analytics/reports/index.js +103 -0
  337. package/addon/controllers/application.js +7 -30
  338. package/addon/controllers/connectivity/devices/index/details/events.js +3 -0
  339. package/addon/controllers/connectivity/devices/index/details/index.js +3 -0
  340. package/addon/controllers/connectivity/devices/index/details.js +3 -0
  341. package/addon/controllers/connectivity/devices/index/edit.js +3 -0
  342. package/addon/controllers/connectivity/devices/index/new.js +32 -0
  343. package/addon/controllers/connectivity/devices/index.js +129 -0
  344. package/addon/controllers/connectivity/events/index/details.js +3 -0
  345. package/addon/controllers/connectivity/events/index.js +91 -0
  346. package/addon/controllers/connectivity/sensors/index/details/index.js +3 -0
  347. package/addon/controllers/connectivity/sensors/index/details.js +3 -0
  348. package/addon/controllers/connectivity/sensors/index/edit.js +3 -0
  349. package/addon/controllers/connectivity/sensors/index/new.js +32 -0
  350. package/addon/controllers/connectivity/sensors/index.js +129 -0
  351. package/addon/controllers/connectivity/telematics/index/details/devices.js +3 -0
  352. package/addon/controllers/connectivity/telematics/index/details/events.js +3 -0
  353. package/addon/controllers/connectivity/telematics/index/details/index.js +3 -0
  354. package/addon/controllers/connectivity/telematics/index/details/sensors.js +3 -0
  355. package/addon/controllers/connectivity/telematics/index/details.js +3 -0
  356. package/addon/controllers/connectivity/telematics/index/edit.js +3 -0
  357. package/addon/controllers/connectivity/telematics/index/new.js +32 -0
  358. package/addon/controllers/connectivity/telematics/index.js +129 -0
  359. package/addon/controllers/connectivity/tracking/index.js +3 -0
  360. package/addon/controllers/maintenance/equipment/index/details/index.js +3 -0
  361. package/addon/controllers/maintenance/equipment/index/details.js +3 -0
  362. package/addon/controllers/maintenance/equipment/index/edit.js +3 -0
  363. package/addon/controllers/maintenance/equipment/index/new.js +3 -0
  364. package/addon/controllers/maintenance/equipment/index.js +129 -0
  365. package/addon/controllers/maintenance/parts/index/details/index.js +3 -0
  366. package/addon/controllers/maintenance/parts/index/details.js +3 -0
  367. package/addon/controllers/maintenance/parts/index/edit.js +3 -0
  368. package/addon/controllers/maintenance/parts/index/new.js +3 -0
  369. package/addon/controllers/maintenance/parts/index.js +129 -0
  370. package/addon/controllers/maintenance/work-orders/index/details/index.js +3 -0
  371. package/addon/controllers/maintenance/work-orders/index/details.js +3 -0
  372. package/addon/controllers/maintenance/work-orders/index/edit.js +3 -0
  373. package/addon/controllers/maintenance/work-orders/index/new.js +3 -0
  374. package/addon/controllers/maintenance/work-orders/index.js +129 -0
  375. package/addon/controllers/management/contacts/customers/details.js +16 -52
  376. package/addon/controllers/management/contacts/customers/edit.js +40 -76
  377. package/addon/controllers/management/contacts/customers/new.js +25 -60
  378. package/addon/controllers/management/contacts/customers.js +137 -167
  379. package/addon/controllers/management/contacts/index/details.js +16 -52
  380. package/addon/controllers/management/contacts/index/edit.js +40 -76
  381. package/addon/controllers/management/contacts/index/new.js +25 -60
  382. package/addon/controllers/management/contacts/index.js +177 -338
  383. package/addon/controllers/management/contacts.js +23 -0
  384. package/addon/controllers/management/drivers/index/details.js +16 -58
  385. package/addon/controllers/management/drivers/index/edit.js +40 -93
  386. package/addon/controllers/management/drivers/index/new.js +25 -83
  387. package/addon/controllers/management/drivers/index.js +267 -500
  388. package/addon/controllers/management/fleets/index/details.js +24 -58
  389. package/addon/controllers/management/fleets/index/edit.js +40 -93
  390. package/addon/controllers/management/fleets/index/new.js +25 -83
  391. package/addon/controllers/management/fleets/index.js +244 -416
  392. package/addon/controllers/management/fuel-reports/index/details.js +15 -59
  393. package/addon/controllers/management/fuel-reports/index/edit.js +40 -93
  394. package/addon/controllers/management/fuel-reports/index/new.js +26 -90
  395. package/addon/controllers/management/fuel-reports/index.js +188 -365
  396. package/addon/controllers/management/issues/index/details.js +16 -51
  397. package/addon/controllers/management/issues/index/edit.js +40 -93
  398. package/addon/controllers/management/issues/index/new.js +25 -89
  399. package/addon/controllers/management/issues/index.js +219 -404
  400. package/addon/controllers/management/places/index/details.js +16 -52
  401. package/addon/controllers/management/places/index/edit.js +40 -93
  402. package/addon/controllers/management/places/index/new.js +25 -83
  403. package/addon/controllers/management/places/index.js +227 -437
  404. package/addon/controllers/management/vehicles/index/details.js +16 -58
  405. package/addon/controllers/management/vehicles/index/edit.js +39 -92
  406. package/addon/controllers/management/vehicles/index/new.js +26 -82
  407. package/addon/controllers/management/vehicles/index.js +268 -465
  408. package/addon/controllers/management/vendors/index/details.js +16 -52
  409. package/addon/controllers/management/vendors/index/edit.js +39 -92
  410. package/addon/controllers/management/vendors/index/new.js +32 -82
  411. package/addon/controllers/management/vendors/index.js +234 -435
  412. package/addon/controllers/management/vendors/integrated/details.js +3 -0
  413. package/addon/controllers/management/vendors/integrated/edit.js +3 -0
  414. package/addon/controllers/management/vendors/integrated/new.js +3 -0
  415. package/addon/controllers/management/vendors/integrated.js +3 -0
  416. package/addon/controllers/operations/orders/index/details/index.js +5 -0
  417. package/addon/controllers/operations/orders/index/details.js +129 -0
  418. package/addon/controllers/operations/orders/index/new.js +69 -1520
  419. package/addon/controllers/operations/orders/index.js +329 -1141
  420. package/addon/controllers/operations/routes/index/new.js +0 -1
  421. package/addon/controllers/operations/scheduler/index.js +5 -5
  422. package/addon/controllers/operations/service-rates/index/details.js +19 -0
  423. package/addon/controllers/operations/service-rates/index/edit.js +60 -28
  424. package/addon/controllers/operations/service-rates/index/new.js +30 -354
  425. package/addon/controllers/operations/service-rates/index.js +122 -218
  426. package/addon/controllers/settings/custom-fields.js +56 -0
  427. package/addon/controllers/settings/routing.js +1 -1
  428. package/addon/engine.js +26 -30
  429. package/addon/helpers/get-fleet-ops-options.js +6 -0
  430. package/addon/helpers/is-model-leaflet-layer-hidden.js +10 -0
  431. package/addon/helpers/point-coordinates.js +1 -1
  432. package/addon/initializers/leaflet-intersects-polyfill.js +23 -0
  433. package/addon/routes/analytics/reports/index/details/index.js +3 -0
  434. package/addon/routes/analytics/reports/index/details/result.js +3 -0
  435. package/addon/routes/analytics/reports/index/details.js +33 -0
  436. package/addon/routes/analytics/reports/index/edit.js +29 -0
  437. package/addon/routes/analytics/reports/index/new.js +3 -0
  438. package/addon/routes/analytics/reports/index.js +21 -0
  439. package/addon/routes/analytics/reports.js +3 -0
  440. package/addon/routes/analytics.js +3 -0
  441. package/addon/routes/application.js +2 -2
  442. package/addon/routes/connectivity/devices/index/details/events.js +3 -0
  443. package/addon/routes/connectivity/devices/index/details/index.js +3 -0
  444. package/addon/routes/connectivity/devices/index/details.js +3 -0
  445. package/addon/routes/connectivity/devices/index/edit.js +3 -0
  446. package/addon/routes/connectivity/devices/index/new.js +3 -0
  447. package/addon/routes/connectivity/devices/index.js +21 -0
  448. package/addon/routes/connectivity/devices.js +3 -0
  449. package/addon/routes/connectivity/events/index/details.js +3 -0
  450. package/addon/routes/connectivity/events/index.js +21 -0
  451. package/addon/routes/connectivity/events.js +3 -0
  452. package/addon/routes/connectivity/sensors/index/details/index.js +3 -0
  453. package/addon/routes/connectivity/sensors/index/details.js +3 -0
  454. package/addon/routes/connectivity/sensors/index/edit.js +3 -0
  455. package/addon/routes/connectivity/sensors/index/new.js +3 -0
  456. package/addon/routes/connectivity/sensors/index.js +21 -0
  457. package/addon/routes/connectivity/sensors.js +3 -0
  458. package/addon/routes/connectivity/telematics/index/details/devices.js +3 -0
  459. package/addon/routes/connectivity/telematics/index/details/events.js +3 -0
  460. package/addon/routes/connectivity/telematics/index/details/index.js +3 -0
  461. package/addon/routes/connectivity/telematics/index/details/sensors.js +3 -0
  462. package/addon/routes/connectivity/telematics/index/details.js +3 -0
  463. package/addon/routes/connectivity/telematics/index/edit.js +3 -0
  464. package/addon/routes/connectivity/telematics/index/new.js +3 -0
  465. package/addon/routes/connectivity/telematics/index.js +21 -0
  466. package/addon/routes/connectivity/telematics.js +3 -0
  467. package/addon/routes/connectivity/tracking/index.js +3 -0
  468. package/addon/routes/connectivity/tracking.js +3 -0
  469. package/addon/routes/connectivity.js +3 -0
  470. package/addon/routes/maintenance/equipment/index/details/index.js +3 -0
  471. package/addon/routes/maintenance/equipment/index/details.js +3 -0
  472. package/addon/routes/maintenance/equipment/index/edit.js +3 -0
  473. package/addon/routes/maintenance/equipment/index/new.js +3 -0
  474. package/addon/routes/maintenance/equipment/index.js +21 -0
  475. package/addon/routes/maintenance/equipment.js +3 -0
  476. package/addon/routes/maintenance/parts/index/details/index.js +3 -0
  477. package/addon/routes/maintenance/parts/index/details.js +3 -0
  478. package/addon/routes/maintenance/parts/index/edit.js +3 -0
  479. package/addon/routes/maintenance/parts/index/new.js +3 -0
  480. package/addon/routes/maintenance/parts/index.js +21 -0
  481. package/addon/routes/maintenance/parts.js +3 -0
  482. package/addon/routes/maintenance/work-orders/index/details/index.js +3 -0
  483. package/addon/routes/maintenance/work-orders/index/details.js +3 -0
  484. package/addon/routes/maintenance/work-orders/index/edit.js +3 -0
  485. package/addon/routes/maintenance/work-orders/index/new.js +3 -0
  486. package/addon/routes/maintenance/work-orders/index.js +21 -0
  487. package/addon/routes/maintenance/work-orders.js +3 -0
  488. package/addon/routes/maintenance.js +3 -0
  489. package/addon/routes/management/contacts/customers/details/index.js +3 -0
  490. package/addon/routes/management/contacts/customers.js +2 -10
  491. package/addon/routes/management/contacts/index/details/index.js +3 -0
  492. package/addon/routes/management/contacts/index.js +1 -1
  493. package/addon/routes/management/drivers/index/details/index.js +3 -0
  494. package/addon/routes/management/drivers/index/details/orders.js +3 -0
  495. package/addon/routes/management/drivers/index/details/schedule.js +3 -0
  496. package/addon/routes/management/fleets/index/details/drivers.js +3 -0
  497. package/addon/routes/management/fleets/index/details/index.js +3 -0
  498. package/addon/routes/management/fleets/index/details/vehicles.js +3 -0
  499. package/addon/routes/management/fuel-reports/index/details/index.js +3 -0
  500. package/addon/routes/management/issues/index/details/index.js +3 -0
  501. package/addon/routes/management/places/index/details/activity.js +3 -0
  502. package/addon/routes/management/places/index/details/comments.js +3 -0
  503. package/addon/routes/management/places/index/details/documents.js +3 -0
  504. package/addon/routes/management/places/index/details/index.js +3 -0
  505. package/addon/routes/management/places/index/details/map.js +3 -0
  506. package/addon/routes/management/places/index/details/operations.js +3 -0
  507. package/addon/routes/management/places/index/details/performance.js +3 -0
  508. package/addon/routes/management/places/index/details/rules.js +3 -0
  509. package/addon/routes/management/places/index/details.js +0 -4
  510. package/addon/routes/management/places/index.js +2 -2
  511. package/addon/routes/management/vehicles/index/details/devices.js +3 -0
  512. package/addon/routes/management/vehicles/index/details/equipment.js +3 -0
  513. package/addon/routes/management/vehicles/index/details/index.js +3 -0
  514. package/addon/routes/management/vendors/index/details/index.js +3 -0
  515. package/addon/routes/management/vendors/index/details/personnel.js +3 -0
  516. package/addon/routes/management/vendors/integrated/details.js +3 -0
  517. package/addon/routes/management/vendors/integrated/edit.js +3 -0
  518. package/addon/routes/management/vendors/integrated/new.js +3 -0
  519. package/addon/routes/management/vendors/integrated.js +3 -0
  520. package/addon/routes/operations/orders/index/details/index.js +3 -0
  521. package/addon/routes/operations/orders/index/details.js +61 -0
  522. package/addon/routes/operations/orders/index/new.js +1 -7
  523. package/addon/routes/operations/orders/index.js +2 -11
  524. package/addon/routes/operations/routes/index/details.js +3 -0
  525. package/addon/routes/operations/service-rates/index/details/index.js +3 -0
  526. package/addon/routes/operations/service-rates/index/details.js +29 -0
  527. package/addon/routes/operations/service-rates/index/edit.js +13 -36
  528. package/addon/routes/settings/custom-fields.js +3 -0
  529. package/addon/routes.js +143 -28
  530. package/addon/services/contact-actions.js +115 -0
  531. package/addon/services/customer-actions.js +84 -0
  532. package/addon/services/device-actions.js +81 -0
  533. package/addon/services/device-event-actions.js +37 -0
  534. package/addon/services/driver-actions.js +147 -68
  535. package/addon/services/entity-actions.js +41 -0
  536. package/addon/services/equipment-actions.js +81 -0
  537. package/addon/services/fleet-actions.js +84 -0
  538. package/addon/services/fuel-report-actions.js +102 -0
  539. package/addon/services/geofence.js +285 -0
  540. package/addon/services/global-search.js +19 -0
  541. package/addon/services/integrated-vendor-actions.js +84 -0
  542. package/addon/services/issue-actions.js +108 -0
  543. package/addon/services/leaflet-draw-restriction.js +150 -0
  544. package/addon/services/leaflet-layer-visibility-manager.js +305 -0
  545. package/addon/services/leaflet-map-manager.js +388 -54
  546. package/addon/services/leaflet-routing-control.js +8 -1
  547. package/addon/services/maintenance-actions.js +81 -0
  548. package/addon/services/map-drawer.js +81 -0
  549. package/addon/services/order-actions.js +500 -0
  550. package/addon/services/order-config-actions.js +19 -0
  551. package/addon/services/order-creation.js +33 -27
  552. package/addon/services/order-import.js +149 -0
  553. package/addon/services/order-list-overlay.js +206 -0
  554. package/addon/services/order-socket-events.js +296 -0
  555. package/addon/services/order-validation.js +51 -0
  556. package/addon/services/part-actions.js +81 -0
  557. package/addon/services/place-actions.js +140 -0
  558. package/addon/services/report-actions.js +11 -0
  559. package/addon/services/route-optimization.js +1 -1
  560. package/addon/services/sensor-actions.js +81 -0
  561. package/addon/services/service-area-actions.js +98 -0
  562. package/addon/services/service-area-manager.js +24 -0
  563. package/addon/services/service-areas.js +6 -6
  564. package/addon/services/service-rate-actions.js +186 -0
  565. package/addon/services/telematic-actions.js +81 -0
  566. package/addon/services/vehicle-actions.js +113 -29
  567. package/addon/services/vendor-actions.js +137 -0
  568. package/addon/services/work-order-actions.js +81 -0
  569. package/addon/services/zone-actions.js +81 -0
  570. package/addon/styles/fleetops-engine.css +25 -1
  571. package/addon/templates/analytics/reports/index/details/index.hbs +1 -0
  572. package/addon/templates/analytics/reports/index/details/result.hbs +1 -0
  573. package/addon/templates/analytics/reports/index/details.hbs +15 -0
  574. package/addon/templates/analytics/reports/index/edit.hbs +13 -0
  575. package/addon/templates/analytics/reports/index/new.hbs +14 -0
  576. package/addon/templates/analytics/reports/index.hbs +15 -0
  577. package/addon/templates/application.hbs +5 -7
  578. package/addon/templates/connectivity/devices/index/details/events.hbs +2 -0
  579. package/addon/templates/connectivity/devices/index/details/index.hbs +2 -0
  580. package/addon/templates/connectivity/devices/index/details.hbs +2 -0
  581. package/addon/templates/connectivity/devices/index/edit.hbs +12 -0
  582. package/addon/templates/connectivity/devices/index/new.hbs +12 -0
  583. package/addon/templates/connectivity/devices/index.hbs +14 -0
  584. package/addon/templates/connectivity/devices.hbs +2 -0
  585. package/addon/templates/connectivity/events/index/details.hbs +2 -0
  586. package/addon/templates/connectivity/events/index.hbs +14 -0
  587. package/addon/templates/connectivity/events.hbs +2 -0
  588. package/addon/templates/connectivity/sensors/index/details/index.hbs +2 -0
  589. package/addon/templates/connectivity/sensors/index/details.hbs +2 -0
  590. package/addon/templates/connectivity/sensors/index/edit.hbs +12 -0
  591. package/addon/templates/connectivity/sensors/index/new.hbs +12 -0
  592. package/addon/templates/connectivity/sensors/index.hbs +14 -0
  593. package/addon/templates/connectivity/sensors.hbs +2 -0
  594. package/addon/templates/connectivity/telematics/index/details/devices.hbs +2 -0
  595. package/addon/templates/connectivity/telematics/index/details/events.hbs +2 -0
  596. package/addon/templates/connectivity/telematics/index/details/index.hbs +2 -0
  597. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +2 -0
  598. package/addon/templates/connectivity/telematics/index/details.hbs +2 -0
  599. package/addon/templates/connectivity/telematics/index/edit.hbs +12 -0
  600. package/addon/templates/connectivity/telematics/index/new.hbs +12 -0
  601. package/addon/templates/connectivity/telematics/index.hbs +14 -0
  602. package/addon/templates/connectivity/telematics.hbs +2 -0
  603. package/addon/templates/connectivity/tracking.hbs +2 -0
  604. package/addon/templates/connectivity.hbs +2 -0
  605. package/addon/templates/maintenance/equipment/index/details/index.hbs +2 -0
  606. package/addon/templates/maintenance/equipment/index/details.hbs +2 -0
  607. package/addon/templates/maintenance/equipment/index/edit.hbs +2 -0
  608. package/addon/templates/maintenance/equipment/index/new.hbs +12 -0
  609. package/addon/templates/maintenance/equipment/index.hbs +14 -0
  610. package/addon/templates/maintenance/equipment.hbs +2 -0
  611. package/addon/templates/maintenance/parts/index/details/index.hbs +2 -0
  612. package/addon/templates/maintenance/parts/index/details.hbs +2 -0
  613. package/addon/templates/maintenance/parts/index/edit.hbs +2 -0
  614. package/addon/templates/maintenance/parts/index/new.hbs +12 -0
  615. package/addon/templates/maintenance/parts/index.hbs +14 -0
  616. package/addon/templates/maintenance/parts.hbs +2 -0
  617. package/addon/templates/maintenance/work-orders/index/details/index.hbs +1 -0
  618. package/addon/templates/maintenance/work-orders/index/details.hbs +14 -0
  619. package/addon/templates/maintenance/work-orders/index/edit.hbs +14 -0
  620. package/addon/templates/maintenance/work-orders/index/new.hbs +12 -0
  621. package/addon/templates/maintenance/work-orders/index.hbs +14 -0
  622. package/addon/templates/maintenance/work-orders.hbs +2 -0
  623. package/addon/templates/management/contacts/customers/details/index.hbs +1 -0
  624. package/addon/templates/management/contacts/customers/details.hbs +15 -1
  625. package/addon/templates/management/contacts/customers/edit.hbs +13 -7
  626. package/addon/templates/management/contacts/customers/new.hbs +14 -1
  627. package/addon/templates/management/contacts/customers.hbs +16 -59
  628. package/addon/templates/management/contacts/index/details/index.hbs +1 -0
  629. package/addon/templates/management/contacts/index/details.hbs +15 -1
  630. package/addon/templates/management/contacts/index/edit.hbs +12 -7
  631. package/addon/templates/management/contacts/index/new.hbs +13 -1
  632. package/addon/templates/management/contacts/index.hbs +15 -58
  633. package/addon/templates/management/contacts.hbs +18 -9
  634. package/addon/templates/management/drivers/index/details/index.hbs +1 -0
  635. package/addon/templates/management/drivers/index/details/orders.hbs +2 -0
  636. package/addon/templates/management/drivers/index/details/schedule.hbs +2 -0
  637. package/addon/templates/management/drivers/index/details.hbs +15 -1
  638. package/addon/templates/management/drivers/index/edit.hbs +12 -7
  639. package/addon/templates/management/drivers/index/new.hbs +13 -1
  640. package/addon/templates/management/drivers/index.hbs +13 -83
  641. package/addon/templates/management/fleets/index/details/drivers.hbs +1 -0
  642. package/addon/templates/management/fleets/index/details/index.hbs +1 -0
  643. package/addon/templates/management/fleets/index/details/vehicles.hbs +1 -0
  644. package/addon/templates/management/fleets/index/details.hbs +14 -1
  645. package/addon/templates/management/fleets/index/edit.hbs +12 -7
  646. package/addon/templates/management/fleets/index/new.hbs +13 -1
  647. package/addon/templates/management/fleets/index.hbs +15 -57
  648. package/addon/templates/management/fuel-reports/index/details/index.hbs +1 -0
  649. package/addon/templates/management/fuel-reports/index/details.hbs +14 -1
  650. package/addon/templates/management/fuel-reports/index/edit.hbs +12 -7
  651. package/addon/templates/management/fuel-reports/index/new.hbs +13 -1
  652. package/addon/templates/management/fuel-reports/index.hbs +15 -59
  653. package/addon/templates/management/issues/index/details/index.hbs +1 -0
  654. package/addon/templates/management/issues/index/details.hbs +14 -1
  655. package/addon/templates/management/issues/index/edit.hbs +12 -7
  656. package/addon/templates/management/issues/index/new.hbs +13 -1
  657. package/addon/templates/management/issues/index.hbs +15 -58
  658. package/addon/templates/management/places/index/details/activity.hbs +2 -0
  659. package/addon/templates/management/places/index/details/comments.hbs +2 -0
  660. package/addon/templates/management/places/index/details/documents.hbs +2 -0
  661. package/addon/templates/management/places/index/details/index.hbs +1 -0
  662. package/addon/templates/management/places/index/details/map.hbs +2 -0
  663. package/addon/templates/management/places/index/details/operations.hbs +2 -0
  664. package/addon/templates/management/places/index/details/performance.hbs +2 -0
  665. package/addon/templates/management/places/index/details/rules.hbs +2 -0
  666. package/addon/templates/management/places/index/details.hbs +14 -1
  667. package/addon/templates/management/places/index/edit.hbs +13 -7
  668. package/addon/templates/management/places/index/new.hbs +12 -1
  669. package/addon/templates/management/places/index.hbs +13 -57
  670. package/addon/templates/management/vehicles/index/details/devices.hbs +2 -0
  671. package/addon/templates/management/vehicles/index/details/equipment.hbs +2 -0
  672. package/addon/templates/management/vehicles/index/details/index.hbs +1 -0
  673. package/addon/templates/management/vehicles/index/details.hbs +15 -1
  674. package/addon/templates/management/vehicles/index/edit.hbs +12 -7
  675. package/addon/templates/management/vehicles/index/new.hbs +13 -1
  676. package/addon/templates/management/vehicles/index.hbs +45 -60
  677. package/addon/templates/management/vendors/index/details/index.hbs +1 -0
  678. package/addon/templates/management/vendors/index/details/personnel.hbs +2 -0
  679. package/addon/templates/management/vendors/index/details.hbs +14 -1
  680. package/addon/templates/management/vendors/index/edit.hbs +12 -7
  681. package/addon/templates/management/vendors/index/new.hbs +13 -1
  682. package/addon/templates/management/vendors/index.hbs +15 -57
  683. package/addon/templates/management/vendors/integrated/details.hbs +2 -0
  684. package/addon/templates/management/vendors/integrated/edit.hbs +2 -0
  685. package/addon/templates/management/vendors/integrated/new.hbs +2 -0
  686. package/addon/templates/management/vendors/integrated.hbs +16 -0
  687. package/addon/templates/operations/order-config.hbs +4 -4
  688. package/addon/templates/operations/orders/index/details/index.hbs +2 -0
  689. package/addon/templates/operations/orders/index/details.hbs +16 -0
  690. package/addon/templates/operations/orders/index/new.hbs +15 -976
  691. package/addon/templates/operations/orders/index.hbs +40 -153
  692. package/addon/templates/operations/routes/index/details.hbs +2 -0
  693. package/addon/templates/operations/scheduler/index.hbs +12 -13
  694. package/addon/templates/operations/service-rates/index/details/index.hbs +1 -0
  695. package/addon/templates/operations/service-rates/index/details.hbs +14 -0
  696. package/addon/templates/operations/service-rates/index/edit.hbs +12 -1
  697. package/addon/templates/operations/service-rates/index/new.hbs +12 -606
  698. package/addon/templates/operations/service-rates/index.hbs +13 -47
  699. package/addon/templates/settings/custom-fields.hbs +10 -0
  700. package/addon/templates/settings/navigator-app.hbs +1 -1
  701. package/addon/templates/settings/notifications.hbs +4 -4
  702. package/addon/templates/settings/payments/index.hbs +5 -5
  703. package/addon/templates/settings/payments/onboard.hbs +14 -7
  704. package/addon/templates/settings/routing.hbs +7 -7
  705. package/addon/utils/fleet-ops-options.js +440 -0
  706. package/addon/utils/leaflet-to-geojson.js +124 -0
  707. package/addon/utils/leaflet.js +56 -0
  708. package/addon/utils/serialize-payload.js +13 -0
  709. package/addon/utils/setup-customer-portal.js +60 -0
  710. package/addon/utils/to-multi-polygon.js +62 -0
  711. package/addon/utils/vendor-integration.js +106 -0
  712. package/app/components/activity/event-selector.js +1 -0
  713. package/app/components/activity/form.js +1 -0
  714. package/app/components/activity/logic-builder.js +1 -0
  715. package/app/components/asset/form.js +1 -0
  716. package/app/components/contact/details.js +1 -0
  717. package/app/components/contact/form.js +1 -0
  718. package/app/components/contact/panel-header.js +1 -0
  719. package/app/components/custom-entity/form.js +1 -0
  720. package/app/components/customer/details.js +1 -0
  721. package/app/components/customer/form.js +1 -0
  722. package/app/components/customer/leaflet-map.js +1 -0
  723. package/app/components/customer/order-details.js +1 -0
  724. package/app/components/customer/order-form.js +1 -0
  725. package/app/components/device/details.js +1 -0
  726. package/app/components/device/form.js +1 -0
  727. package/app/components/driver/details.js +1 -0
  728. package/app/components/driver/form.js +1 -0
  729. package/app/components/driver/panel-header.js +1 -0
  730. package/app/components/entity/card.js +1 -0
  731. package/app/components/entity/details.js +1 -0
  732. package/app/components/entity/form.js +1 -0
  733. package/app/components/equipment/details.js +1 -0
  734. package/app/components/equipment/form.js +1 -0
  735. package/app/components/fleet/details.js +1 -0
  736. package/app/components/fleet/driver-listing.js +1 -0
  737. package/app/components/fleet/form.js +1 -0
  738. package/app/components/fleet/vehicle-listing.js +1 -0
  739. package/app/components/fuel-report/details.js +1 -0
  740. package/app/components/fuel-report/form.js +1 -0
  741. package/app/components/integrated-vendor/details.js +1 -0
  742. package/app/components/integrated-vendor/form.js +1 -0
  743. package/app/components/issue/details.js +1 -0
  744. package/app/components/issue/form.js +1 -0
  745. package/app/components/maintenance/details.js +1 -0
  746. package/app/components/maintenance/form.js +1 -0
  747. package/app/components/map/container.js +1 -0
  748. package/app/components/map/drawer/driver-listing.js +1 -0
  749. package/app/components/map/drawer/event-listing.js +1 -0
  750. package/app/components/map/drawer/place-listing.js +1 -0
  751. package/app/components/map/drawer/vehicle-listing.js +1 -0
  752. package/app/components/map/drawer.js +1 -0
  753. package/app/components/map/leaflet-live-map.js +1 -0
  754. package/app/components/map/leaflet-tracking-layer.js +1 -0
  755. package/app/components/map/order-list-overlay/driver-panel-title.js +1 -0
  756. package/app/components/map/order-list-overlay/order.js +1 -0
  757. package/app/components/map/order-list-overlay.js +1 -0
  758. package/app/components/map/search.js +1 -0
  759. package/app/components/map/toolbar/visibility-control-panel.js +1 -0
  760. package/app/components/map/toolbar/zones-panel.js +1 -0
  761. package/app/components/map/toolbar.js +1 -0
  762. package/app/components/map.js +1 -0
  763. package/app/components/modals/update-order-activity.js +1 -0
  764. package/app/components/order/activity-list.js +1 -0
  765. package/app/components/order/activity-timeline.js +1 -0
  766. package/app/components/order/customer-avatar-stack.js +1 -0
  767. package/app/components/order/details/activity.js +1 -0
  768. package/app/components/order/details/comments.js +1 -0
  769. package/app/components/order/details/custom-fields.js +1 -0
  770. package/app/components/order/details/detail.js +1 -0
  771. package/app/components/order/details/documents.js +1 -0
  772. package/app/components/order/details/integrated-vendor-details.js +1 -0
  773. package/app/components/order/details/map.js +1 -0
  774. package/app/components/order/details/metadata.js +1 -0
  775. package/app/components/order/details/notes.js +1 -0
  776. package/app/components/order/details/payload.js +1 -0
  777. package/app/components/order/details/proof.js +1 -0
  778. package/app/components/order/details/purchase-rate.js +1 -0
  779. package/app/components/order/details/route.js +1 -0
  780. package/app/components/order/details/tracking.js +1 -0
  781. package/app/components/order/details.js +1 -0
  782. package/app/components/order/form/custom-fields.js +1 -0
  783. package/app/components/order/form/details.js +1 -0
  784. package/app/components/order/form/documents.js +1 -0
  785. package/app/components/order/form/metadata.js +1 -0
  786. package/app/components/order/form/notes.js +1 -0
  787. package/app/components/order/form/payload.js +1 -0
  788. package/app/components/order/form/route.js +1 -0
  789. package/app/components/order/form/service-rate.js +1 -0
  790. package/app/components/order/form.js +1 -0
  791. package/app/components/order/kanban-card.js +1 -0
  792. package/app/components/order/kanban.js +1 -0
  793. package/app/components/order/panel-header.js +1 -0
  794. package/app/components/order/route-editor.js +1 -0
  795. package/app/components/part/details.js +1 -0
  796. package/app/components/part/form.js +1 -0
  797. package/app/components/place/activity.js +1 -0
  798. package/app/components/place/card.js +1 -0
  799. package/app/components/place/comments.js +1 -0
  800. package/app/components/place/details.js +1 -0
  801. package/app/components/place/documents.js +1 -0
  802. package/app/components/place/driver-visits.js +1 -0
  803. package/app/components/place/form.js +1 -0
  804. package/app/components/place/frequency-map.js +1 -0
  805. package/app/components/place/map.js +1 -0
  806. package/app/components/place/operations.js +1 -0
  807. package/app/components/place/performance.js +1 -0
  808. package/app/components/place/recent-orders.js +1 -0
  809. package/app/components/place/rules.js +1 -0
  810. package/app/components/place/service-areas.js +1 -0
  811. package/app/components/sensor/details.js +1 -0
  812. package/app/components/sensor/form.js +1 -0
  813. package/app/components/service-area/details.js +1 -0
  814. package/app/components/service-area/form.js +1 -0
  815. package/app/components/service-rate/details.js +1 -0
  816. package/app/components/service-rate/form.js +1 -0
  817. package/app/components/telematic/details.js +1 -0
  818. package/app/components/telematic/form.js +1 -0
  819. package/app/components/vehicle/card.js +1 -0
  820. package/app/components/vehicle/details.js +1 -0
  821. package/app/components/vehicle/form.js +1 -0
  822. package/app/components/vehicle/panel-header.js +1 -0
  823. package/app/components/vendor/details.js +1 -0
  824. package/app/components/vendor/form.js +1 -0
  825. package/app/components/warranty/details.js +1 -0
  826. package/app/components/warranty/form.js +1 -0
  827. package/app/components/work-order/details.js +1 -0
  828. package/app/components/work-order/form.js +1 -0
  829. package/app/components/zone/details.js +1 -0
  830. package/app/components/zone/form.js +1 -0
  831. package/app/controllers/analytics/reports/index/details.js +1 -0
  832. package/app/controllers/analytics/reports/index/edit.js +1 -0
  833. package/app/controllers/analytics/reports/index/new.js +1 -0
  834. package/app/controllers/analytics/reports/index.js +1 -0
  835. package/app/controllers/connectivity/devices/index/details/events.js +1 -0
  836. package/app/controllers/connectivity/devices/index/details/index.js +1 -0
  837. package/app/controllers/connectivity/devices/index/details.js +1 -0
  838. package/app/controllers/connectivity/devices/index/edit.js +1 -0
  839. package/app/controllers/connectivity/devices/index/new.js +1 -0
  840. package/app/controllers/connectivity/devices/index.js +1 -0
  841. package/app/controllers/connectivity/events/index/details.js +1 -0
  842. package/app/controllers/connectivity/events/index.js +1 -0
  843. package/app/controllers/connectivity/sensors/index/details/index.js +1 -0
  844. package/app/controllers/connectivity/sensors/index/details.js +1 -0
  845. package/app/controllers/connectivity/sensors/index/edit.js +1 -0
  846. package/app/controllers/connectivity/sensors/index/new.js +1 -0
  847. package/app/controllers/connectivity/sensors/index.js +1 -0
  848. package/app/controllers/connectivity/telematics/index/details/devices.js +1 -0
  849. package/app/controllers/connectivity/telematics/index/details/events.js +1 -0
  850. package/app/controllers/connectivity/telematics/index/details/index.js +1 -0
  851. package/app/controllers/connectivity/telematics/index/details/sensors.js +1 -0
  852. package/app/controllers/connectivity/telematics/index/details.js +1 -0
  853. package/app/controllers/connectivity/telematics/index/edit.js +1 -0
  854. package/app/controllers/connectivity/telematics/index/new.js +1 -0
  855. package/app/controllers/connectivity/telematics/index.js +1 -0
  856. package/app/controllers/connectivity/tracking/index.js +1 -0
  857. package/app/controllers/maintenance/equipment/index/details/index.js +1 -0
  858. package/app/controllers/maintenance/equipment/index/details.js +1 -0
  859. package/app/controllers/maintenance/equipment/index/edit.js +1 -0
  860. package/app/controllers/maintenance/equipment/index/new.js +1 -0
  861. package/app/controllers/maintenance/equipment/index.js +1 -0
  862. package/app/controllers/maintenance/parts/index/details/index.js +1 -0
  863. package/app/controllers/maintenance/parts/index/details.js +1 -0
  864. package/app/controllers/maintenance/parts/index/edit.js +1 -0
  865. package/app/controllers/maintenance/parts/index/new.js +1 -0
  866. package/app/controllers/maintenance/parts/index.js +1 -0
  867. package/app/controllers/maintenance/work-orders/index/details/index.js +1 -0
  868. package/app/controllers/maintenance/work-orders/index/details.js +1 -0
  869. package/app/controllers/maintenance/work-orders/index/edit.js +1 -0
  870. package/app/controllers/maintenance/work-orders/index/new.js +1 -0
  871. package/app/controllers/maintenance/work-orders/index.js +1 -0
  872. package/app/controllers/management/contacts.js +1 -0
  873. package/app/controllers/management/vendors/integrated/details.js +1 -0
  874. package/app/controllers/management/vendors/integrated/edit.js +1 -0
  875. package/app/controllers/management/vendors/integrated/new.js +1 -0
  876. package/app/controllers/management/vendors/integrated.js +1 -0
  877. package/app/controllers/operations/orders/index/details/index.js +1 -0
  878. package/app/controllers/operations/orders/index/details.js +1 -0
  879. package/app/controllers/operations/service-rates/index/details.js +1 -0
  880. package/app/controllers/settings/custom-fields.js +1 -0
  881. package/app/helpers/get-fleet-ops-options.js +1 -0
  882. package/app/helpers/is-model-leaflet-layer-hidden.js +1 -0
  883. package/app/routes/analytics/reports/index/details/index.js +1 -0
  884. package/app/routes/analytics/reports/index/details/result.js +1 -0
  885. package/app/routes/analytics/reports/index/details.js +1 -0
  886. package/app/routes/analytics/reports/index/edit.js +1 -0
  887. package/app/routes/analytics/reports/index/new.js +1 -0
  888. package/app/routes/analytics/reports/index.js +1 -0
  889. package/app/routes/analytics/reports.js +1 -0
  890. package/app/routes/analytics.js +1 -0
  891. package/app/routes/connectivity/devices/index/details/events.js +1 -0
  892. package/app/routes/connectivity/devices/index/details/index.js +1 -0
  893. package/app/routes/connectivity/devices/index/details.js +1 -0
  894. package/app/routes/connectivity/devices/index/edit.js +1 -0
  895. package/app/routes/connectivity/devices/index/new.js +1 -0
  896. package/app/routes/connectivity/devices/index.js +1 -0
  897. package/app/routes/connectivity/devices.js +1 -0
  898. package/app/routes/connectivity/events/index/details.js +1 -0
  899. package/app/routes/connectivity/events/index.js +1 -0
  900. package/app/routes/connectivity/events.js +1 -0
  901. package/app/routes/connectivity/sensors/index/details/index.js +1 -0
  902. package/app/routes/connectivity/sensors/index/details.js +1 -0
  903. package/app/routes/connectivity/sensors/index/edit.js +1 -0
  904. package/app/routes/connectivity/sensors/index/new.js +1 -0
  905. package/app/routes/connectivity/sensors/index.js +1 -0
  906. package/app/routes/connectivity/sensors.js +1 -0
  907. package/app/routes/connectivity/telematics/index/details/devices.js +1 -0
  908. package/app/routes/connectivity/telematics/index/details/events.js +1 -0
  909. package/app/routes/connectivity/telematics/index/details/index.js +1 -0
  910. package/app/routes/connectivity/telematics/index/details/sensors.js +1 -0
  911. package/app/routes/connectivity/telematics/index/details.js +1 -0
  912. package/app/routes/connectivity/telematics/index/edit.js +1 -0
  913. package/app/routes/connectivity/telematics/index/new.js +1 -0
  914. package/app/routes/connectivity/telematics/index.js +1 -0
  915. package/app/routes/connectivity/telematics.js +1 -0
  916. package/app/routes/connectivity/tracking/index.js +1 -0
  917. package/app/routes/connectivity/tracking.js +1 -0
  918. package/app/routes/connectivity.js +1 -0
  919. package/app/routes/maintenance/equipment/index/details/index.js +1 -0
  920. package/app/routes/maintenance/equipment/index/details.js +1 -0
  921. package/app/routes/maintenance/equipment/index/edit.js +1 -0
  922. package/app/routes/maintenance/equipment/index/new.js +1 -0
  923. package/app/routes/maintenance/equipment/index.js +1 -0
  924. package/app/routes/maintenance/equipment.js +1 -0
  925. package/app/routes/maintenance/parts/index/details/index.js +1 -0
  926. package/app/routes/maintenance/parts/index/details.js +1 -0
  927. package/app/routes/maintenance/parts/index/edit.js +1 -0
  928. package/app/routes/maintenance/parts/index/new.js +1 -0
  929. package/app/routes/maintenance/parts/index.js +1 -0
  930. package/app/routes/maintenance/parts.js +1 -0
  931. package/app/routes/maintenance/work-orders/index/details/index.js +1 -0
  932. package/app/routes/maintenance/work-orders/index/details.js +1 -0
  933. package/app/routes/maintenance/work-orders/index/edit.js +1 -0
  934. package/app/routes/maintenance/work-orders/index/new.js +1 -0
  935. package/app/routes/maintenance/work-orders/index.js +1 -0
  936. package/app/routes/maintenance/work-orders.js +1 -0
  937. package/app/routes/maintenance.js +1 -0
  938. package/app/routes/management/contacts/customers/details/index.js +1 -0
  939. package/app/routes/management/contacts/index/details/index.js +1 -0
  940. package/app/routes/management/drivers/index/details/index.js +1 -0
  941. package/app/routes/management/drivers/index/details/orders.js +1 -0
  942. package/app/routes/management/drivers/index/details/schedule.js +1 -0
  943. package/app/routes/management/fleets/index/details/drivers.js +1 -0
  944. package/app/routes/management/fleets/index/details/index.js +1 -0
  945. package/app/routes/management/fleets/index/details/vehicles.js +1 -0
  946. package/app/routes/management/fuel-reports/index/details/index.js +1 -0
  947. package/app/routes/management/issues/index/details/index.js +1 -0
  948. package/app/routes/management/places/index/details/activity.js +1 -0
  949. package/app/routes/management/places/index/details/comments.js +1 -0
  950. package/app/routes/management/places/index/details/documents.js +1 -0
  951. package/app/routes/management/places/index/details/index.js +1 -0
  952. package/app/routes/management/places/index/details/map.js +1 -0
  953. package/app/routes/management/places/index/details/operations.js +1 -0
  954. package/app/routes/management/places/index/details/performance.js +1 -0
  955. package/app/routes/management/places/index/details/rules.js +1 -0
  956. package/app/routes/management/vehicles/index/details/devices.js +1 -0
  957. package/app/routes/management/vehicles/index/details/equipment.js +1 -0
  958. package/app/routes/management/vehicles/index/details/index.js +1 -0
  959. package/app/routes/management/vendors/index/details/index.js +1 -0
  960. package/app/routes/management/vendors/index/details/personnel.js +1 -0
  961. package/app/routes/management/vendors/integrated/details.js +1 -0
  962. package/app/routes/management/vendors/integrated/edit.js +1 -0
  963. package/app/routes/management/vendors/integrated/new.js +1 -0
  964. package/app/routes/management/vendors/integrated.js +1 -0
  965. package/app/routes/operations/orders/index/details/index.js +1 -0
  966. package/app/routes/operations/orders/index/details.js +1 -0
  967. package/app/routes/operations/routes/index/details.js +1 -0
  968. package/app/routes/operations/service-rates/index/details/index.js +1 -0
  969. package/app/routes/operations/service-rates/index/details.js +1 -0
  970. package/app/routes/settings/custom-fields.js +1 -0
  971. package/app/services/contact-actions.js +1 -0
  972. package/app/services/customer-actions.js +1 -0
  973. package/app/services/device-actions.js +1 -0
  974. package/app/services/device-event-actions.js +1 -0
  975. package/app/services/entity-actions.js +1 -0
  976. package/app/services/equipment-actions.js +1 -0
  977. package/app/services/fleet-actions.js +1 -0
  978. package/app/services/fuel-report-actions.js +1 -0
  979. package/app/services/geofence.js +1 -0
  980. package/app/services/global-search.js +1 -0
  981. package/app/services/integrated-vendor-actions.js +1 -0
  982. package/app/services/issue-actions.js +1 -0
  983. package/app/services/leaflet-draw-restriction.js +1 -0
  984. package/app/services/leaflet-layer-visibility-manager.js +1 -0
  985. package/app/services/maintenance-actions.js +1 -0
  986. package/app/services/map-drawer.js +1 -0
  987. package/app/services/order-actions.js +1 -0
  988. package/app/services/order-config-actions.js +1 -0
  989. package/app/services/order-import.js +1 -0
  990. package/app/services/order-list-overlay.js +1 -0
  991. package/app/services/order-socket-events.js +1 -0
  992. package/app/services/order-validation.js +1 -0
  993. package/app/services/part-actions.js +1 -0
  994. package/app/services/place-actions.js +1 -0
  995. package/app/services/report-actions.js +1 -0
  996. package/app/services/sensor-actions.js +1 -0
  997. package/app/services/service-area-actions.js +1 -0
  998. package/app/services/service-area-manager.js +1 -0
  999. package/app/services/service-rate-actions.js +1 -0
  1000. package/app/services/telematic-actions.js +1 -0
  1001. package/app/services/vendor-actions.js +1 -0
  1002. package/app/services/work-order-actions.js +1 -0
  1003. package/app/services/zone-actions.js +1 -0
  1004. package/app/templates/analytics/reports/index/details/index.js +1 -0
  1005. package/app/templates/analytics/reports/index/details/result.js +1 -0
  1006. package/app/templates/analytics/reports/index/details.js +1 -0
  1007. package/app/templates/analytics/reports/index/edit.js +1 -0
  1008. package/app/templates/analytics/reports/index/new.js +1 -0
  1009. package/app/templates/analytics/reports/index.js +1 -0
  1010. package/app/templates/analytics/reports.js +1 -0
  1011. package/app/templates/analytics.js +1 -0
  1012. package/app/templates/connectivity/devices/index/details/events.js +1 -0
  1013. package/app/templates/connectivity/devices/index/details/index.js +1 -0
  1014. package/app/templates/connectivity/devices/index/details.js +1 -0
  1015. package/app/templates/connectivity/devices/index/edit.js +1 -0
  1016. package/app/templates/connectivity/devices/index/new.js +1 -0
  1017. package/app/templates/connectivity/devices/index.js +1 -0
  1018. package/app/templates/connectivity/devices.js +1 -0
  1019. package/app/templates/connectivity/events/index/details.js +1 -0
  1020. package/app/templates/connectivity/events/index.js +1 -0
  1021. package/app/templates/connectivity/events.js +1 -0
  1022. package/app/templates/connectivity/sensors/index/details/index.js +1 -0
  1023. package/app/templates/connectivity/sensors/index/details.js +1 -0
  1024. package/app/templates/connectivity/sensors/index/edit.js +1 -0
  1025. package/app/templates/connectivity/sensors/index/new.js +1 -0
  1026. package/app/templates/connectivity/sensors/index.js +1 -0
  1027. package/app/templates/connectivity/sensors.js +1 -0
  1028. package/app/templates/connectivity/telematics/index/details/devices.js +1 -0
  1029. package/app/templates/connectivity/telematics/index/details/events.js +1 -0
  1030. package/app/templates/connectivity/telematics/index/details/index.js +1 -0
  1031. package/app/templates/connectivity/telematics/index/details/sensors.js +1 -0
  1032. package/app/templates/connectivity/telematics/index/details.js +1 -0
  1033. package/app/templates/connectivity/telematics/index/edit.js +1 -0
  1034. package/app/templates/connectivity/telematics/index/new.js +1 -0
  1035. package/app/templates/connectivity/telematics/index.js +1 -0
  1036. package/app/templates/connectivity/telematics.js +1 -0
  1037. package/app/templates/connectivity/tracking/index.js +1 -0
  1038. package/app/templates/connectivity/tracking.js +1 -0
  1039. package/app/templates/connectivity.js +1 -0
  1040. package/app/templates/maintenance/equipment/index/details/index.js +1 -0
  1041. package/app/templates/maintenance/equipment/index/details.js +1 -0
  1042. package/app/templates/maintenance/equipment/index/edit.js +1 -0
  1043. package/app/templates/maintenance/equipment/index/new.js +1 -0
  1044. package/app/templates/maintenance/equipment/index.js +1 -0
  1045. package/app/templates/maintenance/equipment.js +1 -0
  1046. package/app/templates/maintenance/parts/index/details/index.js +1 -0
  1047. package/app/templates/maintenance/parts/index/details.js +1 -0
  1048. package/app/templates/maintenance/parts/index/edit.js +1 -0
  1049. package/app/templates/maintenance/parts/index/new.js +1 -0
  1050. package/app/templates/maintenance/parts/index.js +1 -0
  1051. package/app/templates/maintenance/parts.js +1 -0
  1052. package/app/templates/maintenance/work-orders/index/details/index.js +1 -0
  1053. package/app/templates/maintenance/work-orders/index/details.js +1 -0
  1054. package/app/templates/maintenance/work-orders/index/edit.js +1 -0
  1055. package/app/templates/maintenance/work-orders/index/new.js +1 -0
  1056. package/app/templates/maintenance/work-orders/index.js +1 -0
  1057. package/app/templates/maintenance/work-orders.js +1 -0
  1058. package/app/templates/maintenance.js +1 -0
  1059. package/app/templates/management/contacts/customers/details/index.js +1 -0
  1060. package/app/templates/management/contacts/index/details/index.js +1 -0
  1061. package/app/templates/management/drivers/index/details/index.js +1 -0
  1062. package/app/templates/management/drivers/index/details/orders.js +1 -0
  1063. package/app/templates/management/drivers/index/details/schedule.js +1 -0
  1064. package/app/templates/management/fleets/index/details/drivers.js +1 -0
  1065. package/app/templates/management/fleets/index/details/index.js +1 -0
  1066. package/app/templates/management/fleets/index/details/vehicles.js +1 -0
  1067. package/app/templates/management/fuel-reports/index/details/index.js +1 -0
  1068. package/app/templates/management/issues/index/details/index.js +1 -0
  1069. package/app/templates/management/places/index/details/activity.js +1 -0
  1070. package/app/templates/management/places/index/details/comments.js +1 -0
  1071. package/app/templates/management/places/index/details/documents.js +1 -0
  1072. package/app/templates/management/places/index/details/index.js +1 -0
  1073. package/app/templates/management/places/index/details/map.js +1 -0
  1074. package/app/templates/management/places/index/details/operations.js +1 -0
  1075. package/app/templates/management/places/index/details/performance.js +1 -0
  1076. package/app/templates/management/places/index/details/rules.js +1 -0
  1077. package/app/templates/management/vehicles/index/details/devices.js +1 -0
  1078. package/app/templates/management/vehicles/index/details/equipment.js +1 -0
  1079. package/app/templates/management/vehicles/index/details/index.js +1 -0
  1080. package/app/templates/management/vendors/index/details/index.js +1 -0
  1081. package/app/templates/management/vendors/index/details/personnel.js +1 -0
  1082. package/app/templates/management/vendors/integrated/details.js +1 -0
  1083. package/app/templates/management/vendors/integrated/edit.js +1 -0
  1084. package/app/templates/management/vendors/integrated/new.js +1 -0
  1085. package/app/templates/management/vendors/integrated.js +1 -0
  1086. package/app/templates/operations/orders/index/details/index.js +1 -0
  1087. package/app/templates/operations/orders/index/details.js +1 -0
  1088. package/app/templates/operations/routes/index/details.js +1 -0
  1089. package/app/templates/operations/service-rates/index/details/index.js +1 -0
  1090. package/app/templates/operations/service-rates/index/details.js +1 -0
  1091. package/app/templates/settings/custom-fields.js +1 -0
  1092. package/app/utils/fleet-ops-options.js +1 -0
  1093. package/app/utils/leaflet-to-geojson.js +1 -0
  1094. package/app/utils/leaflet.js +1 -0
  1095. package/app/utils/serialize-payload.js +1 -0
  1096. package/app/utils/setup-customer-portal.js +1 -0
  1097. package/app/utils/to-multi-polygon.js +1 -0
  1098. package/app/utils/vendor-integration.js +1 -0
  1099. package/composer.json +1 -1
  1100. package/extension.json +1 -1
  1101. package/index.js +3 -2
  1102. package/package.json +5 -2
  1103. package/server/migrations/2025_09_10_010724_create_additional_spec_columns_for_assets_vehicles_table.php +77 -0
  1104. package/server/migrations/2025_09_14_031758_add_provider_options_column_to_integrated_vendors_tabl.php +27 -0
  1105. package/server/migrations/2025_09_15_031052_add_title_column_to_issues_table.php +27 -0
  1106. package/server/migrations/2025_09_24_004700_add_vehicle_columns.php +49 -0
  1107. package/server/migrations/2025_10_07_020406_add_max_distance_to_service_rates_table.php +28 -0
  1108. package/server/migrations/2025_10_08_091812_add_details_column_to_vehicles_table.php +27 -0
  1109. package/server/src/Auth/Schemas/FleetOps.php +12 -0
  1110. package/server/src/Console/Commands/DispatchAdhocOrders.php +21 -8
  1111. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +1 -1
  1112. package/server/src/Http/Controllers/Internal/v1/ContactController.php +12 -0
  1113. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +15 -0
  1114. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +15 -0
  1115. package/server/src/Http/Controllers/Internal/v1/DriverController.php +17 -8
  1116. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +15 -0
  1117. package/server/src/Http/Controllers/Internal/v1/FleetController.php +17 -5
  1118. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +13 -0
  1119. package/server/src/Http/Controllers/Internal/v1/IssueController.php +13 -0
  1120. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
  1121. package/server/src/Http/Controllers/Internal/v1/OrderController.php +141 -70
  1122. package/server/src/Http/Controllers/Internal/v1/PartController.php +15 -0
  1123. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +11 -0
  1124. package/server/src/Http/Controllers/Internal/v1/SensorController.php +15 -0
  1125. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +13 -0
  1126. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +15 -0
  1127. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +12 -0
  1128. package/server/src/Http/Controllers/Internal/v1/VendorController.php +11 -0
  1129. package/server/src/Http/Controllers/Internal/v1/WarrantyController.php +15 -0
  1130. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +15 -0
  1131. package/server/src/Http/Controllers/Internal/v1/ZoneController.php +13 -0
  1132. package/server/src/Http/Filter/DriverFilter.php +5 -2
  1133. package/server/src/Http/Filter/FleetFilter.php +5 -2
  1134. package/server/src/Http/Filter/IssueFilter.php +3 -8
  1135. package/server/src/Http/Filter/PlaceFilter.php +5 -0
  1136. package/server/src/Http/Filter/VendorFilter.php +5 -2
  1137. package/server/src/Http/Requests/CreateServiceRateRequest.php +4 -2
  1138. package/server/src/Http/Resources/v1/Contact.php +6 -4
  1139. package/server/src/Http/Resources/v1/CurrentJob.php +2 -2
  1140. package/server/src/Http/Resources/v1/Driver.php +2 -2
  1141. package/server/src/Http/Resources/v1/Fleet.php +2 -2
  1142. package/server/src/Http/Resources/v1/FuelReport.php +2 -2
  1143. package/server/src/Http/Resources/v1/Issue.php +34 -31
  1144. package/server/src/Http/Resources/v1/Order.php +0 -29
  1145. package/server/src/Http/Resources/v1/ParentFleet.php +2 -2
  1146. package/server/src/Http/Resources/v1/Place.php +3 -3
  1147. package/server/src/Http/Resources/v1/ServiceArea.php +2 -2
  1148. package/server/src/Http/Resources/v1/ServiceRate.php +45 -34
  1149. package/server/src/Http/Resources/v1/SubFleet.php +2 -2
  1150. package/server/src/Http/Resources/v1/Vehicle.php +3 -3
  1151. package/server/src/Http/Resources/v1/Vendor.php +5 -3
  1152. package/server/src/Http/Resources/v1/Zone.php +2 -2
  1153. package/server/src/Models/Asset.php +9 -0
  1154. package/server/src/Models/Contact.php +22 -1
  1155. package/server/src/Models/Driver.php +1 -1
  1156. package/server/src/Models/IntegratedVendor.php +4 -2
  1157. package/server/src/Models/Issue.php +21 -0
  1158. package/server/src/Models/Order.php +26 -46
  1159. package/server/src/Models/Place.php +2 -0
  1160. package/server/src/Models/ServiceArea.php +2 -0
  1161. package/server/src/Models/ServiceRate.php +22 -4
  1162. package/server/src/Models/Vehicle.php +88 -16
  1163. package/server/src/Models/VehicleDeviceEvent.php +1 -1
  1164. package/server/src/Models/Vendor.php +13 -0
  1165. package/server/src/Models/Waypoint.php +58 -0
  1166. package/server/src/Models/Zone.php +2 -0
  1167. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  1168. package/server/src/Providers/ReportSchemaServiceProvider.php +22 -0
  1169. package/server/src/Support/Reporting/FleetOpsReportSchema.php +729 -0
  1170. package/server/src/Traits/HasTrackingNumber.php +10 -6
  1171. package/server/src/routes.php +9 -0
  1172. package/translations/bg-bg.yaml +1799 -0
  1173. package/translations/en-us.yaml +1691 -1625
  1174. package/translations/fr-fr.yaml +1824 -0
  1175. package/translations/mn-mn.yaml +1768 -0
  1176. package/translations/pt-br.yaml +1789 -0
  1177. package/translations/ru-ru.yaml +1782 -0
  1178. package/addon/components/activity-event-selector.hbs +0 -45
  1179. package/addon/components/activity-event-selector.js +0 -89
  1180. package/addon/components/activity-form-panel.hbs +0 -89
  1181. package/addon/components/activity-form-panel.js +0 -109
  1182. package/addon/components/activity-logic-builder.hbs +0 -128
  1183. package/addon/components/activity-logic-builder.js +0 -260
  1184. package/addon/components/contact-form-panel.hbs +0 -158
  1185. package/addon/components/contact-form-panel.js +0 -168
  1186. package/addon/components/contact-panel/details.hbs +0 -40
  1187. package/addon/components/contact-panel/details.js +0 -3
  1188. package/addon/components/contact-panel.hbs +0 -74
  1189. package/addon/components/contact-panel.js +0 -112
  1190. package/addon/components/context-panel.hbs +0 -5
  1191. package/addon/components/context-panel.js +0 -6
  1192. package/addon/components/custom-entity-form-panel.hbs +0 -98
  1193. package/addon/components/custom-entity-form-panel.js +0 -129
  1194. package/addon/components/custom-field-form-panel/options-input.hbs +0 -17
  1195. package/addon/components/custom-field-form-panel/options-input.js +0 -139
  1196. package/addon/components/custom-field-form-panel.hbs +0 -121
  1197. package/addon/components/custom-field-form-panel.js +0 -147
  1198. package/addon/components/custom-field-value.hbs +0 -11
  1199. package/addon/components/custom-field-value.js +0 -41
  1200. package/addon/components/custom-field.hbs +0 -89
  1201. package/addon/components/custom-field.js +0 -145
  1202. package/addon/components/customer-form-panel.hbs +0 -215
  1203. package/addon/components/customer-form-panel.js +0 -219
  1204. package/addon/components/customer-panel/details.hbs +0 -52
  1205. package/addon/components/customer-panel/details.js +0 -3
  1206. package/addon/components/customer-panel.hbs +0 -95
  1207. package/addon/components/customer-panel.js +0 -124
  1208. package/addon/components/driver-card-mini.hbs +0 -12
  1209. package/addon/components/driver-card-mini.js +0 -46
  1210. package/addon/components/driver-card.hbs +0 -27
  1211. package/addon/components/driver-card.js +0 -14
  1212. package/addon/components/driver-form-panel.hbs +0 -276
  1213. package/addon/components/driver-form-panel.js +0 -243
  1214. package/addon/components/driver-panel/details.hbs +0 -55
  1215. package/addon/components/driver-panel/orders.hbs +0 -144
  1216. package/addon/components/driver-panel/orders.js +0 -44
  1217. package/addon/components/driver-panel.hbs +0 -84
  1218. package/addon/components/driver-panel.js +0 -164
  1219. package/addon/components/edit-order-route-panel.hbs +0 -183
  1220. package/addon/components/edit-order-route-panel.js +0 -322
  1221. package/addon/components/event-timeline/event.hbs +0 -5
  1222. package/addon/components/fleet-form-panel.hbs +0 -151
  1223. package/addon/components/fleet-form-panel.js +0 -128
  1224. package/addon/components/fleet-panel.hbs +0 -35
  1225. package/addon/components/fleet-panel.js +0 -129
  1226. package/addon/components/fuel-report-form-panel.hbs +0 -170
  1227. package/addon/components/fuel-report-form-panel.js +0 -167
  1228. package/addon/components/fuel-report-panel/details.hbs +0 -42
  1229. package/addon/components/fuel-report-panel.hbs +0 -46
  1230. package/addon/components/fuel-report-panel.js +0 -148
  1231. package/addon/components/full-size.js +0 -1
  1232. package/addon/components/horizontal-route.hbs +0 -38
  1233. package/addon/components/horizontal-route.js +0 -48
  1234. package/addon/components/issue-form-panel.hbs +0 -226
  1235. package/addon/components/issue-form-panel.js +0 -182
  1236. package/addon/components/issue-panel/details.hbs +0 -48
  1237. package/addon/components/issue-panel.hbs +0 -39
  1238. package/addon/components/issue-panel.js +0 -148
  1239. package/addon/components/live-map-drawer/driver-listing.hbs +0 -12
  1240. package/addon/components/live-map-drawer/driver-listing.js +0 -246
  1241. package/addon/components/live-map-drawer/place-listing.hbs +0 -12
  1242. package/addon/components/live-map-drawer/place-listing.js +0 -209
  1243. package/addon/components/live-map-drawer/vehicle-listing.hbs +0 -12
  1244. package/addon/components/live-map-drawer/vehicle-listing.js +0 -222
  1245. package/addon/components/live-map-drawer.hbs +0 -17
  1246. package/addon/components/live-map-drawer.js +0 -86
  1247. package/addon/components/live-map.hbs +0 -260
  1248. package/addon/components/live-map.js +0 -1925
  1249. package/addon/components/map-container/toolbar/visibility-control-panel.hbs +0 -66
  1250. package/addon/components/map-container/toolbar/visibility-control-panel.js +0 -74
  1251. package/addon/components/map-container/toolbar/zones-panel.hbs +0 -56
  1252. package/addon/components/map-container/toolbar/zones-panel.js +0 -138
  1253. package/addon/components/map-container/toolbar-container.hbs +0 -1
  1254. package/addon/components/map-container/toolbar-container.js +0 -3
  1255. package/addon/components/map-container/toolbar.hbs +0 -123
  1256. package/addon/components/map-container/toolbar.js +0 -63
  1257. package/addon/components/operations-pane/pane.hbs +0 -1
  1258. package/addon/components/order-board.hbs +0 -27
  1259. package/addon/components/order-board.js +0 -81
  1260. package/addon/components/order-config/activity-flow-editor.hbs +0 -149
  1261. package/addon/components/order-config/activity-flow-editor.js +0 -374
  1262. package/addon/components/order-config/details-editor.hbs +0 -69
  1263. package/addon/components/order-config/details-editor.js +0 -16
  1264. package/addon/components/order-config/entities-editor.hbs +0 -89
  1265. package/addon/components/order-config/entities-editor.js +0 -120
  1266. package/addon/components/order-config/fields-editor.hbs +0 -169
  1267. package/addon/components/order-config/fields-editor.js +0 -227
  1268. package/addon/components/order-config/selector.js +0 -3
  1269. package/addon/components/order-config-manager-overlay.hbs +0 -36
  1270. package/addon/components/order-config-manager-overlay.js +0 -60
  1271. package/addon/components/order-flow.js +0 -3
  1272. package/addon/components/order-list-overlay.hbs +0 -178
  1273. package/addon/components/order-list-overlay.js +0 -217
  1274. package/addon/components/place-form-panel.hbs +0 -118
  1275. package/addon/components/place-form-panel.js +0 -179
  1276. package/addon/components/place-panel/details.hbs +0 -81
  1277. package/addon/components/place-panel.hbs +0 -40
  1278. package/addon/components/place-panel.js +0 -112
  1279. package/addon/components/settings-window.hbs +0 -39
  1280. package/addon/components/settings-window.js +0 -63
  1281. package/addon/components/split-grid.js +0 -1
  1282. package/addon/components/vehicle-form-panel.hbs +0 -219
  1283. package/addon/components/vehicle-form-panel.js +0 -203
  1284. package/addon/components/vehicle-panel/details.hbs +0 -44
  1285. package/addon/components/vehicle-panel.hbs +0 -79
  1286. package/addon/components/vehicle-panel.js +0 -153
  1287. package/addon/components/vendor-form-panel/create-form.hbs +0 -250
  1288. package/addon/components/vendor-form-panel/create-form.js +0 -153
  1289. package/addon/components/vendor-form-panel/edit-form.hbs +0 -234
  1290. package/addon/components/vendor-form-panel/edit-form.js +0 -57
  1291. package/addon/components/vendor-form-panel.hbs +0 -115
  1292. package/addon/components/vendor-form-panel.js +0 -160
  1293. package/addon/components/vendor-panel/details.hbs +0 -77
  1294. package/addon/components/vendor-panel/details.js +0 -12
  1295. package/addon/components/vendor-panel/drivers.hbs +0 -81
  1296. package/addon/components/vendor-panel/drivers.js +0 -139
  1297. package/addon/components/vendor-panel/personnel.js +0 -3
  1298. package/addon/components/vendor-panel.hbs +0 -73
  1299. package/addon/components/vendor-panel.js +0 -124
  1300. package/addon/controllers/base-controller.js +0 -31
  1301. package/addon/controllers/management.js +0 -3
  1302. package/addon/controllers/operations/orders/index/config/types.js +0 -17
  1303. package/addon/controllers/operations/orders/index/config.js +0 -13
  1304. package/addon/controllers/operations/orders/index/view.js +0 -1028
  1305. package/addon/helpers/feature-group.js +0 -13
  1306. package/addon/helpers/flow-raw-status.js +0 -13
  1307. package/addon/helpers/get-tip-amount.js +0 -19
  1308. package/addon/helpers/is-facilitator-supported-place.js +0 -6
  1309. package/addon/helpers/is-section-visible.js +0 -5
  1310. package/addon/helpers/is-visibility-control-visible.js +0 -18
  1311. package/addon/helpers/is-waypoint-record.js +0 -6
  1312. package/addon/helpers/service-name.js +0 -6
  1313. package/addon/routes/comms/chat.js +0 -3
  1314. package/addon/routes/comms/intercom.js +0 -3
  1315. package/addon/routes/comms.js +0 -3
  1316. package/addon/routes/operations/orders/index/config/types.js +0 -18
  1317. package/addon/routes/operations/orders/index/config.js +0 -3
  1318. package/addon/routes/operations/orders/index/view.js +0 -113
  1319. package/addon/routes/operations/routes/index/view.js +0 -3
  1320. package/addon/services/context-panel.js +0 -352
  1321. package/addon/services/leaflet-router-control.js +0 -64
  1322. package/addon/templates/operations/orders/index/config/types.hbs +0 -30
  1323. package/addon/templates/operations/orders/index/config.hbs +0 -23
  1324. package/addon/templates/operations/orders/index/view.hbs +0 -876
  1325. package/addon/utils/calculate-percentage.js +0 -1
  1326. package/addon/utils/find-leaflet-layer.js +0 -13
  1327. package/addon/utils/fly-to-leaflet-layer.js +0 -32
  1328. package/addon/utils/format-currency.js +0 -1
  1329. package/addon/utils/get-custom-field-type-map.js +0 -34
  1330. package/addon/utils/get-issue-categories.js +0 -30
  1331. package/addon/utils/get-issue-types.js +0 -3
  1332. package/addon/utils/get-leaflet-layer-by-id.js +0 -12
  1333. package/addon/utils/get-vendor-status-options.js +0 -3
  1334. package/addon/utils/get-vendor-type-options.js +0 -44
  1335. package/addon/utils/layer-can-bind-contextmenu.js +0 -3
  1336. package/addon/utils/to-model.js +0 -1
  1337. package/app/components/activity-event-selector.js +0 -1
  1338. package/app/components/activity-form-panel.js +0 -1
  1339. package/app/components/activity-logic-builder.js +0 -1
  1340. package/app/components/contact-form-panel.js +0 -1
  1341. package/app/components/contact-panel/details.js +0 -1
  1342. package/app/components/contact-panel.js +0 -1
  1343. package/app/components/context-panel.js +0 -1
  1344. package/app/components/custom-entity-form-panel.js +0 -1
  1345. package/app/components/custom-field-form-panel/options-input.js +0 -1
  1346. package/app/components/custom-field-form-panel.js +0 -1
  1347. package/app/components/custom-field-value.js +0 -1
  1348. package/app/components/custom-field.js +0 -1
  1349. package/app/components/customer-form-panel.js +0 -1
  1350. package/app/components/customer-panel/details.js +0 -1
  1351. package/app/components/customer-panel.js +0 -1
  1352. package/app/components/driver-card-mini.js +0 -1
  1353. package/app/components/driver-card.js +0 -1
  1354. package/app/components/driver-form-panel.js +0 -1
  1355. package/app/components/driver-panel/details.js +0 -1
  1356. package/app/components/driver-panel/orders.js +0 -1
  1357. package/app/components/driver-panel.js +0 -1
  1358. package/app/components/event-timeline/event.js +0 -1
  1359. package/app/components/fleet-form-panel.js +0 -1
  1360. package/app/components/fleet-panel.js +0 -1
  1361. package/app/components/fuel-report-form-panel.js +0 -1
  1362. package/app/components/fuel-report-panel.js +0 -1
  1363. package/app/components/full-size.js +0 -1
  1364. package/app/components/horizontal-route.js +0 -1
  1365. package/app/components/issue-form-panel.js +0 -1
  1366. package/app/components/issue-panel.js +0 -1
  1367. package/app/components/live-map-drawer/driver-listing.js +0 -1
  1368. package/app/components/live-map-drawer/place-listing.js +0 -1
  1369. package/app/components/live-map-drawer/vehicle-listing.js +0 -1
  1370. package/app/components/live-map-drawer.js +0 -1
  1371. package/app/components/live-map.js +0 -1
  1372. package/app/components/map-container/toolbar/visibility-control-panel.js +0 -1
  1373. package/app/components/map-container/toolbar/zones-panel.js +0 -1
  1374. package/app/components/map-container/toolbar-container.js +0 -1
  1375. package/app/components/map-container/toolbar.js +0 -1
  1376. package/app/components/operations-pane/pane.js +0 -1
  1377. package/app/components/order-board.js +0 -1
  1378. package/app/components/order-config/activity-flow-editor.js +0 -1
  1379. package/app/components/order-config/details-editor.js +0 -1
  1380. package/app/components/order-config/entities-editor.js +0 -1
  1381. package/app/components/order-config/fields-editor.js +0 -1
  1382. package/app/components/order-config/selector.js +0 -1
  1383. package/app/components/order-config-manager-overlay.js +0 -1
  1384. package/app/components/order-flow.js +0 -1
  1385. package/app/components/order-list-overlay.js +0 -1
  1386. package/app/components/place-form-panel.js +0 -1
  1387. package/app/components/place-panel.js +0 -1
  1388. package/app/components/settings-window.js +0 -1
  1389. package/app/components/split-grid.js +0 -1
  1390. package/app/components/vehicle-form-panel.js +0 -1
  1391. package/app/components/vehicle-panel/details.js +0 -1
  1392. package/app/components/vehicle-panel/tracking.js +0 -1
  1393. package/app/components/vehicle-panel.js +0 -1
  1394. package/app/components/vendor-form-panel/create-form.js +0 -1
  1395. package/app/components/vendor-form-panel/edit-form.js +0 -1
  1396. package/app/components/vendor-form-panel.js +0 -1
  1397. package/app/components/vendor-panel/details.js +0 -1
  1398. package/app/components/vendor-panel/drivers.js +0 -1
  1399. package/app/components/vendor-panel/personnel.js +0 -1
  1400. package/app/components/vendor-panel.js +0 -1
  1401. package/app/controllers/base-controller.js +0 -1
  1402. package/app/controllers/management.js +0 -1
  1403. package/app/controllers/operations/orders/index/config/types.js +0 -1
  1404. package/app/controllers/operations/orders/index/config.js +0 -1
  1405. package/app/controllers/operations/orders/index/view.js +0 -1
  1406. package/app/helpers/feature-group.js +0 -1
  1407. package/app/helpers/flow-raw-status.js +0 -1
  1408. package/app/helpers/get-tip-amount.js +0 -1
  1409. package/app/helpers/is-facilitator-supported-place.js +0 -1
  1410. package/app/helpers/is-section-visible.js +0 -1
  1411. package/app/helpers/is-visibility-control-visible.js +0 -1
  1412. package/app/helpers/is-waypoint-record.js +0 -1
  1413. package/app/helpers/service-name.js +0 -1
  1414. package/app/routes/operations/orders/index/config/types.js +0 -1
  1415. package/app/routes/operations/orders/index/config.js +0 -1
  1416. package/app/routes/operations/orders/index/view.js +0 -1
  1417. package/app/routes/operations/routes/index/view.js +0 -1
  1418. package/app/services/context-panel.js +0 -1
  1419. package/app/services/leaflet-router-control.js +0 -1
  1420. package/app/templates/operations/orders/index/config/types.js +0 -1
  1421. package/app/templates/operations/orders/index/config.js +0 -1
  1422. package/app/templates/operations/orders/index/view.js +0 -1
  1423. package/app/templates/operations/routes/index/view.js +0 -1
  1424. package/app/utils/calculate-percentage.js +0 -1
  1425. package/app/utils/find-leaflet-layer.js +0 -1
  1426. package/app/utils/fly-to-leaflet-layer.js +0 -1
  1427. package/app/utils/format-currency.js +0 -1
  1428. package/app/utils/get-custom-field-type-map.js +0 -1
  1429. package/app/utils/get-issue-categories.js +0 -1
  1430. package/app/utils/get-issue-types.js +0 -1
  1431. package/app/utils/get-leaflet-layer-by-id.js +0 -1
  1432. package/app/utils/get-vendor-status-options.js +0 -1
  1433. package/app/utils/get-vendor-type-options.js +0 -1
  1434. package/app/utils/layer-can-bind-contextmenu.js +0 -1
  1435. package/app/utils/to-model.js +0 -1
  1436. /package/addon/components/{order-config/selector.hbs → asset/form.hbs} +0 -0
  1437. /package/addon/components/{order-flow.hbs → customer/leaflet-map.hbs} +0 -0
  1438. /package/addon/components/{vehicle-panel/tracking.hbs → customer/order-details.hbs} +0 -0
  1439. /package/addon/components/{vendor-panel/personnel.hbs → entity/details.hbs} +0 -0
  1440. /package/addon/templates/{comms/chat.hbs → analytics/reports.hbs} +0 -0
  1441. /package/addon/templates/{comms.hbs → analytics.hbs} +0 -0
  1442. /package/addon/templates/{comms/intercom.hbs → connectivity/tracking/index.hbs} +0 -0
  1443. /package/addon/templates/{operations/routes/index/view.hbs → maintenance.hbs} +0 -0
@@ -1,1549 +1,98 @@
1
- import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
- import { inject as controller } from '@ember/controller';
3
- import { inject as service } from '@ember/service';
1
+ import Controller, { inject as controller } from '@ember/controller';
4
2
  import { tracked } from '@glimmer/tracking';
5
- import { action, computed, setProperties, set, get } from '@ember/object';
6
- import { not, equal, alias } from '@ember/object/computed';
7
- import { isArray } from '@ember/array';
8
- import { isBlank } from '@ember/utils';
9
- import { dasherize } from '@ember/string';
10
- import { next } from '@ember/runloop';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
11
5
  import { task } from 'ember-concurrency';
12
- import { Control as RoutingControl } from '@fleetbase/leaflet-routing-machine';
13
6
  import { debug } from '@ember/debug';
14
- import isNotEmpty from '@fleetbase/ember-core/utils/is-not-empty';
15
- import getWithDefault from '@fleetbase/ember-core/utils/get-with-default';
16
- import isModel from '@fleetbase/ember-core/utils/is-model';
17
-
18
- L.Bounds.prototype.intersects = function (bounds) {
19
- var min = this.min,
20
- max = this.max,
21
- min2 = bounds.min,
22
- max2 = bounds.max,
23
- xIntersects = max2.x >= min.x && min2.x <= max.x,
24
- yIntersects = max2.y >= min.y && min2.y <= max.y;
25
-
26
- return xIntersects && yIntersects;
27
- };
28
7
 
29
- export default class OperationsOrdersIndexNewController extends BaseController {
30
- @controller('operations.orders.index') ordersController;
31
-
32
- @service modalsManager;
33
- @service notifications;
8
+ export default class OperationsOrdersIndexNewController extends Controller {
9
+ @controller('operations.orders.index') index;
34
10
  @service loader;
35
- @service currentUser;
36
- @service hostRouter;
37
- @service fileQueue;
38
11
  @service intl;
39
- @service fetch;
40
- @service store;
41
- @service contextPanel;
42
12
  @service universe;
43
- @service routeOptimization;
44
- @service leafletRoutingControl;
45
- @service osrm;
46
-
47
- @tracked order = this.store.createRecord('order', { meta: [] });
48
- @tracked payload = this.store.createRecord('payload');
49
- @tracked driversQuery = {};
50
- @tracked vehiclesQuery = {};
51
- @tracked meta = [];
52
- @tracked entities = [];
53
- @tracked waypoints = [];
54
- @tracked payloadCoordinates = [];
55
- @tracked orderConfig;
56
- @tracked orderConfigs = [];
57
- @tracked customFieldGroups = [];
58
- @tracked customFields = [];
59
- @tracked customFieldValues = {};
60
- @tracked serviceRates = [];
61
- @tracked selectedServiceRate;
62
- @tracked selectedServiceQuote;
63
- @tracked isCustomFieldsValid = true;
64
- @tracked isCreatingOrder = false;
65
- @tracked isMultipleDropoffOrder = false;
66
- @tracked isViewingRoutePreview = false;
67
- @tracked optimizedRouteMarkers = [];
68
- @tracked optimizedRoutePolyline;
69
- @tracked isFetchingQuotes = false;
70
- @tracked servicable = false;
71
- @tracked scheduledDate;
72
- @tracked scheduledTime;
73
- @tracked leafletRoute;
74
- @tracked leafletOptimizedRoute;
75
- @tracked currentLeafletRoute;
76
- @tracked leafletLayers = [];
77
- @tracked routeProfile = 'driving';
78
- @tracked routeProfileOptions = ['driving', 'bycicle', 'walking'];
79
- @tracked podOptions = ['scan', 'signature', 'photo'];
80
- @tracked isCsvImportedOrder = false;
81
- @tracked routePreviewArray = [];
82
- @tracked previewRouteControl;
83
- @tracked isSubscriptionValid = true;
84
- @tracked isUsingIntegratedVendor = false;
85
- @tracked integratedVendorServiceType;
86
- @tracked invalidReason;
87
- @tracked metadataButtons = [
88
- {
89
- type: 'default',
90
- text: 'Edit metadata',
91
- icon: 'edit',
92
- onClick: this.editMetaData,
93
- },
94
- ];
95
- @tracked uploadQueue = [];
96
- acceptedFileTypes = [
97
- 'application/vnd.ms-excel',
98
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
99
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
100
- 'application/msword',
101
- 'application/pdf',
102
- 'application/x-pdf',
103
- 'image/jpeg',
104
- 'image/png',
105
- 'image/gif',
106
- 'image/webp',
107
- 'video/mp4',
108
- 'video/quicktime',
109
- 'video/x-msvideo',
110
- 'video/x-flv',
111
- 'video/x-ms-wmv',
112
- 'audio/mpeg',
113
- 'video/x-msvideo',
114
- 'application/zip',
115
- 'application/x-tar',
116
- ];
117
-
118
- get hasRouteOptimizationEngines() {
119
- return this.routeOptimization.availableEngines.length > 1;
120
- }
121
-
122
- @not('isServicable') isNotServicable;
123
- @alias('currentUser.latitude') userLatitude;
124
- @alias('currentUser.longitude') userLongitude;
125
- @alias('ordersController.leafletMap') leafletMap;
126
- @equal('isCsvImportedOrder', false) isNotCsvImportedOrder;
127
-
128
- @computed('isCustomFieldsValid', 'entities.length', 'isMultipleDropoffOrder', 'isFetchingQuotes', 'isSubscriptionValid', 'order.type', 'payload.{dropoff,pickup}', 'waypoints.length')
129
- get isValid() {
130
- const { isMultipleDropoffOrder, isSubscriptionValid, isFetchingQuotes } = this;
131
- const isOrderTypeSet = isNotEmpty(this.order?.type);
132
- const isWaypointsSet = this.waypoints?.length > 1;
133
- const isPickupSet = isNotEmpty(this.payload?.pickup);
134
- const isDropoffSet = isNotEmpty(this.payload?.dropoff);
135
- // const isPayloadSet = this.entities?.length > 0;
136
-
137
- if (isFetchingQuotes) {
138
- return false;
139
- }
140
-
141
- if (!isSubscriptionValid) {
142
- return false;
143
- }
144
-
145
- if (isMultipleDropoffOrder) {
146
- return isOrderTypeSet && isWaypointsSet;
147
- }
148
-
149
- return isOrderTypeSet && isPickupSet && isDropoffSet && this.isCustomFieldsValid;
150
- }
151
-
152
- updatePayloadCoordinates() {
153
- let waypoints = [];
154
- let coordinates = [];
155
-
156
- waypoints.pushObjects([this.payload.pickup, ...this.waypoints.map((waypoint) => waypoint.place), this.payload.dropoff]);
157
- waypoints.forEach((place) => {
158
- if (place && place.get('longitude') && place.get('latitude')) {
159
- if (place.hasInvalidCoordinates) {
160
- return;
161
- }
162
-
163
- coordinates.pushObject([place.get('longitude'), place.get('latitude')]);
164
- }
165
- });
166
-
167
- this.payloadCoordinates = coordinates;
168
- }
169
-
170
- @computed('payloadCoordinates.length', 'waypoints.[]') get isServicable() {
171
- return this.payloadCoordinates.length >= 2;
172
- }
173
-
174
- @computed('routePreviewArray.[]') get routePreviewCoordinates() {
175
- // return this.routePreviewArray.filter((place) => place.get('hasValidCoordinates')).map((place) => place.get('latlng'));
176
- return (
177
- this.routePreviewArray
178
- // .filter((place) => place.get('hasValidCoordinates'))
179
- .map((place) => place.get('latlng'))
180
- );
181
- }
182
-
183
- @computed('entities.[]', 'waypoints.[]') get entitiesByImportId() {
184
- const groups = [];
185
-
186
- // create groups
187
- this.waypoints.forEach((waypoint) => {
188
- const importId = waypoint.place._import_id ?? null;
189
-
190
- if (importId) {
191
- const entities = this.entities.filter((entity) => entity._import_id === importId);
192
- const group = {
193
- importId,
194
- waypoint,
195
- entities,
196
- };
197
-
198
- groups.pushObject(group);
199
- }
200
- });
201
-
202
- return groups;
203
- }
204
-
205
- checkIfCustomFieldsValid() {
206
- this.isCustomFieldsValid = this.customFields.every((customField) => {
207
- if (!customField.required) {
208
- return true;
209
- }
210
- const customFieldValue = this.customFieldValues[customField.id];
211
- return customFieldValue && !isBlank(customFieldValue.value);
212
- });
213
- }
214
-
215
- @action async createOrder() {
216
- if (!this.isValid) {
217
- return;
218
- }
219
-
220
- this.previewRoute(false);
221
- this.loader.showLoader('body', { loadingMessage: 'Creating Order...' });
222
-
223
- const { order, groupedMetaFields, payload, entities, waypoints } = this;
224
- const route = this.leafletOptimizedRoute ? this.getOptimizedRoute() : this.getRoute();
225
-
226
- // set service quote if applicable
227
- if (this.selectedServiceQuote) {
228
- order.service_quote_uuid = this.selectedServiceQuote;
229
- }
230
-
231
- try {
232
- order.serializeMeta().serializeMetaFromGroupedFields(groupedMetaFields).setPayload(payload).setRoute(route).get('payload').setWaypoints(waypoints).setEntities(entities);
233
- } catch (error) {
234
- this.notifications.serverError(error);
235
- this.loader.removeLoader();
236
- return;
237
- }
238
-
239
- // valiadate custom field inputs
240
- for (let i = 0; i < this.customFields.length; i++) {
241
- const customField = this.customFields[i];
242
- if (customField.required) {
243
- const customFieldValue = this.customFieldValues[customField.id];
244
- if (!customFieldValue || isBlank(customFieldValue.value)) {
245
- this.loader.removeLoader();
246
- return this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.new.input-field-required', { inputFieldName: customField.label }));
247
- }
248
- }
249
- }
250
-
251
- // create custom field values
252
- for (let customFieldId in this.customFieldValues) {
253
- const { value, value_type } = this.customFieldValues[customFieldId];
254
- const customFieldValue = this.store.createRecord('custom-field-value', {
255
- custom_field_uuid: customFieldId,
256
- value,
257
- value_type,
258
- });
259
- this.order.custom_field_values.push(customFieldValue);
260
- }
261
-
262
- // send event that fleetops is `creating` an order
263
- this.universe.trigger('fleet-ops.order.creating', order);
264
- this.isCreatingOrder = true;
265
-
266
- try {
267
- const createdOrder = await order.save();
268
-
269
- // trigger event that fleet-ops created an order
270
- this.universe.trigger('fleet-ops.order.created', createdOrder);
271
-
272
- // transition to order view
273
- await this.hostRouter.transitionTo('console.fleet-ops.operations.orders.index.view', createdOrder);
274
-
275
- // order created successfully
276
- this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.new.success-message', { orderId: createdOrder.public_id }));
277
- this.loader.removeLoader();
278
- this.resetForm();
279
- } catch (error) {
280
- debug(`Error Creating Order : ${error.message}`);
281
- this.notifications.serverError(error);
282
- this.loader.removeLoader();
283
- } finally {
284
- this.isCreatingOrder = false;
285
- }
286
- }
287
-
288
- @action importOrder() {
289
- const checkQueue = () => {
290
- const uploadQueue = this.modalsManager.getOption('uploadQueue');
291
-
292
- if (uploadQueue.length) {
293
- this.modalsManager.setOption('acceptButtonDisabled', false);
294
- } else {
295
- this.modalsManager.setOption('acceptButtonDisabled', true);
296
- }
297
- };
298
-
299
- this.modalsManager.show('modals/order-import', {
300
- title: 'Import order(s) with spreadsheets',
301
- acceptButtonText: 'Start Upload',
302
- acceptButtonScheme: 'magic',
303
- acceptButtonIcon: 'upload',
304
- acceptButtonDisabled: true,
305
- isProcessing: false,
306
- uploadQueue: [],
307
- fileQueueColumns: [
308
- { name: 'Type', valuePath: 'extension', key: 'type' },
309
- { name: 'File Name', valuePath: 'name', key: 'fileName' },
310
- { name: 'File Size', valuePath: 'size', key: 'fileSize' },
311
- { name: 'Upload Date', valuePath: 'file.lastModifiedDate', key: 'uploadDate' },
312
- { name: '', valuePath: '', key: 'delete' },
313
- ],
314
- acceptedFileTypes: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/csv'],
315
- queueFile: (file) => {
316
- const uploadQueue = this.modalsManager.getOption('uploadQueue');
317
-
318
- uploadQueue.pushObject(file);
319
- checkQueue();
320
- },
321
- removeFile: (file) => {
322
- const { queue } = file;
323
- const uploadQueue = this.modalsManager.getOption('uploadQueue');
324
-
325
- uploadQueue.removeObject(file);
326
- queue.remove(file);
327
- checkQueue();
328
- },
329
- confirm: async (modal) => {
330
- const uploadQueue = this.modalsManager.getOption('uploadQueue');
331
- const uploadedFiles = [];
332
- const uploadTask = (file) => {
333
- return new Promise((resolve) => {
334
- this.fetch.uploadFile.perform(
335
- file,
336
- {
337
- path: `uploads/fleet-ops/order-imports/${this.currentUser.companyId}`,
338
- type: `order_import`,
339
- },
340
- (uploadedFile) => {
341
- uploadedFiles.pushObject(uploadedFile);
342
-
343
- resolve(uploadedFile);
344
- }
345
- );
346
- });
347
- };
348
-
349
- if (!uploadQueue.length) {
350
- return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.warning-message'));
351
- }
352
-
353
- modal.startLoading();
354
- modal.setOption('acceptButtonText', 'Uploading...');
355
-
356
- for (let i = 0; i < uploadQueue.length; i++) {
357
- const file = uploadQueue.objectAt(i);
358
-
359
- await uploadTask(file);
360
- }
361
-
362
- this.modalsManager.setOption('acceptButtonText', 'Processing...');
363
- this.modalsManager.setOption('isProcessing', true);
364
-
365
- const files = uploadedFiles.map((file) => file.id);
366
- let results;
367
-
368
- try {
369
- results = await this.fetch.post('orders/process-imports', { files });
370
- } catch (error) {
371
- return this.notifications.serverError(error);
372
- }
373
-
374
- const places = get(results, 'places');
375
- const entities = get(results, 'entities');
376
-
377
- if (isArray(places)) {
378
- this.isMultipleDropoffOrder = true;
379
- this.waypoints = places.map((_place) => {
380
- const place = this.store.createRecord('place', _place);
381
- return this.store.createRecord('waypoint', { place });
382
- });
383
- }
384
-
385
- if (isArray(entities)) {
386
- this.entities = entities.map((entity) => {
387
- return this.store.createRecord('entity', entity);
388
- });
389
- }
390
-
391
- this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.new.import-success'));
392
- this.isCsvImportedOrder = true;
393
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
394
- modal.done();
395
- },
396
- decline: (modal) => {
397
- this.modalsManager.setOption('uploadQueue', []);
398
- modal.done();
399
- },
400
- });
401
- }
402
-
403
- @action async toggleAdhoc(on) {
404
- const defaultDistanceInMeters = 5000;
405
-
406
- if (on) {
407
- const company = this.store.peekRecord('company', this.currentUser.companyId);
408
- this.order.adhoc_distance = getWithDefault(company, 'options.fleetops.adhoc_distance', defaultDistanceInMeters);
409
- } else {
410
- this.order.adhoc_distance = defaultDistanceInMeters;
411
- }
412
-
413
- this.order.adhoc = on;
414
- }
415
-
416
- @action async toggleProofOfDelivery(on) {
417
- this.order.pod_required = on;
418
-
419
- if (on) {
420
- this.order.pod_method = 'scan';
421
- } else {
422
- this.order.pod_method = null;
423
- }
424
- }
425
-
426
- @action async checkServiceRates(shouldCheck) {
427
- this.servicable = shouldCheck;
428
- const params = {
429
- coordinates: this.getCoordinatesFromPayload().join(';'),
430
- };
431
- let serviceRates = [];
432
-
433
- if (this.isUsingIntegratedVendor) {
434
- params.facilitator = this.order.facilitator.public_id;
435
- }
436
-
437
- // filter by order config type
438
- if (this.orderConfig) {
439
- params.service_type = this.orderConfig.key;
440
- }
441
-
442
- if (shouldCheck) {
443
- try {
444
- serviceRates = await this.fetch.get(`service-rates/for-route`, params);
445
-
446
- serviceRates.unshiftObject({
447
- service_name: 'Quote from all Service Rates',
448
- id: 'all',
449
- });
450
- } catch (error) {
451
- this.notifications.serverError(error);
452
- }
453
-
454
- this.serviceRates = serviceRates;
455
- }
456
- }
457
-
458
- @action createPlace() {
459
- const place = this.store.createRecord('place');
460
- this.contextPanel.focus(place, 'editing', {
461
- onAfterSave: () => {
462
- this.contextPanel.clear();
463
- },
464
- });
465
- }
466
-
467
- @action editPlace(place) {
468
- this.contextPanel.focus(place, 'editing', {
469
- onAfterSave: () => {
470
- this.contextPanel.clear();
471
- },
472
- });
473
- }
474
-
475
- @action async getQuotes(service) {
476
- this.isFetchingQuotes = true;
477
-
478
- let payload = this.payload.serialize();
479
- let route = this.getRoute();
480
- let distance = get(route, 'details.summary.totalDistance');
481
- let time = get(route, 'details.summary.totalTime');
482
- let service_type = this.order.type;
483
- let scheduled_at = this.order.scheduled_at;
484
- let facilitator = this.order.facilitator?.get('public_id');
485
- let is_route_optimized = this.order.get('is_route_optimized');
486
- let { waypoints, entities } = this;
487
- let places = [];
488
-
489
- if (this.payloadCoordinates?.length < 2) {
490
- this.isFetchingQuotes = false;
491
- return;
492
- }
493
-
494
- if (this.isUsingIntegratedVendor && this.integratedVendorServiceType) {
495
- service_type = this.integratedVendorServiceType;
496
- }
497
-
498
- // get place instances from WaypointModel
499
- for (let i = 0; i < waypoints.length; i++) {
500
- let place = await waypoints[i].place;
501
-
502
- places.pushObject(place);
503
- }
504
-
505
- setProperties(payload, { waypoints: places, entities });
506
-
507
- if (!payload.type && this.order.type) {
508
- setProperties(payload, { type: this.order.type });
509
- }
510
-
511
- try {
512
- const serviceQuotes = await this.fetch.post('service-quotes/preliminary', {
513
- payload: this._getSerializedPayload(payload),
514
- distance,
515
- time,
516
- service,
517
- service_type,
518
- facilitator,
519
- scheduled_at,
520
- is_route_optimized,
521
- });
522
-
523
- set(this, 'serviceQuotes', isArray(serviceQuotes) ? serviceQuotes : []);
524
-
525
- if (this.serviceQuotes.length && this.isUsingIntegratedVendor) {
526
- set(this, 'selectedServiceQuote', this.serviceQuotes.firstObject?.uuid);
527
- }
528
- } catch {
529
- this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.service-warning'));
530
- } finally {
531
- this.isFetchingQuotes = false;
532
- }
533
- }
534
-
535
- _getSerializedPayload(payload) {
536
- const serialized = {
537
- pickup: this._seriailizeModel(payload.pickup),
538
- dropoff: this._seriailizeModel(payload.dropoff),
539
- entitities: this._serializeArray(payload.entities),
540
- waypoints: this._serializeArray(payload.waypoints),
541
- };
542
-
543
- return serialized;
544
- }
545
-
546
- _seriailizeModel(model) {
547
- if (isModel(model)) {
548
- if (typeof model.toJSON === 'function') {
549
- return model.toJSON();
550
- }
551
-
552
- if (typeof model.serialize === 'function') {
553
- return model.serialize();
554
- }
555
- }
556
-
557
- return model;
558
- }
559
-
560
- _serializeArray(array) {
561
- return isArray(array) ? array.map((item) => this._seriailizeModel(item)) : array;
562
- }
563
-
564
- @action scheduleOrder(dateInstance) {
565
- this.order.scheduled_at = dateInstance;
566
- }
567
-
568
- @action setupInterface() {
569
- if (this.leafletMap && this.leafletMap.liveMap) {
570
- this.leafletMap.liveMap.hideAll();
571
-
572
- // track all layers added from this view
573
- this.leafletMap.on('layeradd', ({ layer }) => {
574
- // disable dragging of layer
575
- if (layer.dragging && typeof layer.dragging.disable === 'function') {
576
- layer.dragging.disable();
577
- }
578
-
579
- next(this, function () {
580
- if (isArray(this.leafletLayers) && !this.leafletLayers.includes(layer)) {
581
- this.leafletLayers.pushObject(layer);
582
- }
583
- });
584
- });
585
- }
586
-
587
- // setup interface when livemap is ready
588
- this.universe.on('fleet-ops.live-map.loaded', () => {
589
- this.setupInterface();
590
- });
591
-
592
- // switch to map mode
593
- this.ordersController.setLayoutMode('map');
594
- }
595
-
596
- @action resetInterface() {
597
- if (this.leafletMap && this.leafletMap.liveMap) {
598
- this.leafletMap.liveMap.showAll();
599
- }
600
- }
601
-
602
- @action getRoute() {
603
- const details = this.leafletRoute;
604
- const route = this.store.createRecord('route', { details });
605
-
606
- return route;
607
- }
608
-
609
- @action getOptimizedRoute() {
610
- const details = this.leafletOptimizedRoute;
611
- const route = this.store.createRecord('route', { details });
612
-
613
- return route;
614
- }
615
-
616
- @action setOptimizedRoute(route, trip, waypoints, engine = 'osrm') {
617
- let summary = { totalDistance: trip.distance, totalTime: trip.duration };
618
- let payload = {
619
- optimized: true,
620
- coordinates: route,
621
- waypoints,
622
- trip,
623
- summary,
624
- engine,
625
- };
626
-
627
- this.leafletOptimizedRoute = payload;
628
- }
629
-
630
- @action removeRoutingControlPreview() {
631
- return new Promise((resolve) => {
632
- const leafletMap = this.leafletMap;
633
- const previewRouteControl = this.previewRouteControl;
634
-
635
- let removed = false;
636
-
637
- if (leafletMap && previewRouteControl instanceof RoutingControl) {
638
- try {
639
- previewRouteControl.remove();
640
- removed = true;
641
- } catch (e) {
642
- // silent
643
- }
644
-
645
- if (!removed) {
646
- try {
647
- leafletMap.removeControl(previewRouteControl);
648
- } catch (e) {
649
- // silent
650
- }
651
- }
652
- }
653
-
654
- if (!removed) {
655
- this.forceRemoveRoutePreview();
656
- }
657
-
658
- resolve(true);
659
- });
660
- }
661
-
662
- @action forceRemoveRoutePreview() {
663
- const { leafletMap } = this;
664
-
665
- leafletMap.eachLayer((layer) => {
666
- if (layer instanceof L.Polyline || layer instanceof L.Marker) {
667
- try {
668
- if (layer.record_id === this.order.driver_assigned?.id) {
669
- return;
670
- }
671
- layer.remove();
672
- } catch (error) {
673
- // silent error just continue with order processing if any
674
- }
675
- }
676
- });
677
- }
678
-
679
- @action removePreviewRouteLayers() {
680
- const { currentLeafletRoute, leafletMap } = this;
681
-
682
- if (currentLeafletRoute) {
683
- // target is the route, and waypoints is the markers
684
- const { target, waypoints } = currentLeafletRoute;
685
-
686
- leafletMap.removeLayer(target);
687
- waypoints?.forEach((waypoint) => {
688
- try {
689
- leafletMap.removeLayer(waypoint);
690
- } catch (error) {
691
- // silent error just continue with order processing if any
692
- }
693
- });
694
- }
695
- }
696
-
697
- @action clearLayers() {
698
- if (this.leafletMap) {
699
- try {
700
- this.leafletMap.eachLayer((layer) => {
701
- // if driver assigned do not remove focused driver
702
- if (layer.record_id === this.order.driver_assigned?.id) {
703
- return;
704
- }
705
-
706
- if (isArray(this.leafletLayers) && this.leafletLayers.includes(layer)) {
707
- this.leafletMap.removeLayer(layer);
708
- }
709
- });
710
- } catch (error) {
711
- // fallback method with tracked layers
712
- if (isArray(this.leafletLayers)) {
713
- this.leafletLayers.forEach((layer) => {
714
- // if driver assigned do not remove focused driver
715
- if (layer.record_id === this.order.driver_assigned?.id) {
716
- return;
717
- }
718
-
719
- try {
720
- this.leafletMap.removeLayer(layer);
721
- } catch (error) {
722
- // silent error just continue with order processing if any
723
- }
724
- });
725
- }
726
- }
727
- }
728
- }
729
-
730
- @action clearAllLayers() {
731
- if (this.leafletMap) {
732
- try {
733
- this.leafletMap.eachLayer((layer) => {
734
- this.leafletMap.removeLayer(layer);
735
- });
736
- } catch (error) {
737
- // fallback method with tracked layers
738
- if (isArray(this.leafletLayers)) {
739
- this.leafletLayers.forEach((layer) => {
740
- try {
741
- this.leafletMap.removeLayer(layer);
742
- } catch (error) {
743
- // silent error just continue with order processing if any
744
- }
745
- });
746
- }
747
- }
748
- }
749
- }
750
-
751
- @action createPlaceArrayFromPayload(payload, waypoints, isMultipleDropoffOrder = false) {
752
- const routePreviewArray = [];
753
-
754
- if (isMultipleDropoffOrder) {
755
- for (let i = 0; i < waypoints.length; i++) {
756
- if (waypoints[i].place) {
757
- routePreviewArray.pushObject(waypoints[i].place);
758
- }
759
- }
760
- } else {
761
- if (payload.pickup) {
762
- routePreviewArray.pushObject(payload.pickup);
763
- }
764
-
765
- if (payload.dropoff) {
766
- routePreviewArray.pushObject(payload.dropoff);
767
- }
768
- }
769
-
770
- return routePreviewArray;
771
- }
772
-
773
- @action createCoordinatesFromRoutePlaceArray(array) {
774
- return array.filter((place) => place.get('hasValidCoordinates')).map((place) => place.get('latlng'));
775
- }
776
-
777
- @action previewDraftOrderRoute(payload, waypoints, isMultipleDropoffOrder = false) {
778
- const leafletMap = this.leafletMap;
779
-
780
- // if existing route preview on the map - remove it
781
- this.removeRoutingControlPreview();
782
- this.removeOptimizedRoute();
783
- this.clearLayers();
784
-
785
- if (!this.isRoutePreviewAnimationActive) {
786
- this.previewRoute(true);
787
- }
788
-
789
- this.isViewingRoutePreview = true;
790
- this.routePreviewArray = this.createPlaceArrayFromPayload(payload, waypoints, isMultipleDropoffOrder);
791
-
792
- const canPreviewRoute = this.routePreviewArray.length > 0;
793
-
794
- if (canPreviewRoute) {
795
- const routingService = this.currentUser.getOption('routing', { router: 'osrm' }).router;
796
- const { router, formatter } = this.leafletRoutingControl.get(routingService);
797
-
798
- this.previewRouteControl = new RoutingControl({
799
- router,
800
- formatter,
801
- waypoints: this.routePreviewCoordinates,
802
- alternativeClassName: 'hidden',
803
- addWaypoints: false,
804
- markerOptions: {
805
- icon: L.icon({
806
- iconUrl: '/assets/images/marker-icon.png',
807
- iconRetinaUrl: '/assets/images/marker-icon-2x.png',
808
- shadowUrl: '/assets/images/marker-shadow.png',
809
- iconSize: [25, 41],
810
- iconAnchor: [12, 41],
811
- }),
812
- },
813
- }).addTo(leafletMap);
814
-
815
- this.previewRouteControl.on('routesfound', (event) => {
816
- const { routes } = event;
817
- const leafletRoute = routes.firstObject;
818
- this.currentLeafletRoute = event;
819
-
820
- this.setProperties({ leafletRoute });
821
- });
822
-
823
- if (this.routePreviewCoordinates.length === 1) {
824
- leafletMap.flyTo(this.routePreviewCoordinates[0], 18);
825
- leafletMap.once('moveend', function () {
826
- leafletMap.panBy([200, 0]);
827
- });
828
- } else {
829
- leafletMap.flyToBounds(this.routePreviewCoordinates, {
830
- paddingBottomRight: [300, 0],
831
- maxZoom: this.routePreviewCoordinates.length === 2 ? 15 : 14,
832
- animate: true,
833
- });
834
- leafletMap.once('moveend', function () {
835
- leafletMap.panBy([150, 0]);
836
- });
837
- }
838
- } else {
839
- this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.no-route-warning'));
840
- }
841
- }
842
-
843
- @action previewRoute(isViewingRoutePreview) {
844
- this.isViewingRoutePreview = isViewingRoutePreview;
845
- this.isRoutePreviewAnimationActive = isViewingRoutePreview;
846
-
847
- if (isViewingRoutePreview === true) {
848
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
849
- }
850
-
851
- if (isViewingRoutePreview === false) {
852
- this.removeRoutingControlPreview();
853
- this.removeOptimizedRoute();
854
- this.removePreviewRouteLayers();
855
- this.clearLayers();
856
- }
857
- }
858
-
859
- @task *optimizeRouteWithService(service) {
860
- try {
861
- const result = yield this.routeOptimization.optimize(service, {
862
- context: 'create_order',
863
- order: this.order,
864
- payload: this.payload,
865
- waypoints: this.waypoints,
866
- coordinates: this.getCoordinatesFromPayload(),
867
- });
868
- this.handleRouteOptimization(result);
869
- } catch (err) {
870
- this.notifications.error(err.message ?? this.intl.t('fleet-ops.operations.orders.index.new.route-error'));
871
- }
872
- }
873
-
874
- @task *optimizeRoute() {
875
- try {
876
- const result = yield this.osrm.optimize({
877
- context: 'create_order',
878
- order: this.order,
879
- payload: this.payload,
880
- waypoints: this.waypoints,
881
- coordinates: this.getCoordinatesFromPayload(),
882
- });
883
-
884
- this.handleRouteOptimization(result);
885
- } catch (err) {
886
- this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.new.route-error'));
887
- }
888
- }
889
-
890
- handleRouteOptimization({ sortedWaypoints, route, trip, result, engine = 'osrm' }) {
891
- // Update map layers & UI
892
- this.removeRoutingControlPreview();
893
- this.removeOptimizedRoute(this.leafletMap);
894
- this.clearLayers();
895
-
896
- // Update controller state
897
- this.waypoints = sortedWaypoints;
898
- if (route) {
899
- this.setOptimizedRoute(route, trip, result.waypoints, engine);
900
- }
901
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
902
- this.updatePayloadCoordinates();
903
-
904
- this.order.set('is_route_optimized', true);
905
- if (this.isUsingIntegratedVendor) {
906
- this.getQuotes();
907
- }
908
- }
909
-
910
- @action removeOptimizedRoute(_leafletMap = null) {
911
- this.leafletOptimizedRoute = undefined;
912
-
913
- const leafletMap = _leafletMap || this.leafletMap;
914
-
915
- if (!leafletMap) {
916
- return;
917
- }
918
-
919
- if (this.optimizedRoutePolyline) {
920
- leafletMap.removeLayer(this.optimizedRoutePolyline);
921
- }
922
-
923
- for (let i = 0; i < this.optimizedRouteMarkers.length; i++) {
924
- let marker = this.optimizedRouteMarkers.objectAt(i);
925
-
926
- leafletMap.removeLayer(marker);
927
- }
928
- }
929
-
930
- @action getCoordinatesFromPayload() {
931
- this.notifyPropertyChange('payloadCoordinates');
932
-
933
- return this.payloadCoordinates;
934
- }
935
-
936
- @action toggleMultiDropOrder(isMultipleDropoffOrder) {
937
- this.isMultipleDropoffOrder = isMultipleDropoffOrder;
938
-
939
- const { pickup, dropoff } = this.payload;
940
-
941
- if (isMultipleDropoffOrder) {
942
- if (pickup) {
943
- this.addWaypoint({ place: pickup, customer: this.order.customer });
944
-
945
- if (dropoff) {
946
- this.addWaypoint({ place: dropoff, customer: this.order.customer });
947
- }
948
-
949
- // clear pickup and dropoff
950
- this.payload.setProperties({ pickup: null, dropoff: null });
951
- } else {
952
- this.addWaypoint({ customer: this.order.customer });
953
- }
954
- } else {
955
- const pickup = get(this.waypoints, '0.place');
956
- const dropoff = get(this.waypoints, '1.place');
957
-
958
- if (pickup) {
959
- this.setPayloadPlace('pickup', pickup);
960
- }
961
-
962
- if (dropoff) {
963
- this.setPayloadPlace('dropoff', dropoff);
964
- }
965
-
966
- this.clearWaypoints();
967
- }
968
- }
969
-
970
- @action async resetForm() {
971
- const order = this.store.createRecord('order', { meta: [] });
972
- const payload = this.store.createRecord('payload');
973
- const driversQuery = {};
974
- const meta = [];
975
- const entities = [];
976
- const waypoints = [];
977
- const orderConfigs = [];
978
- const orderConfig = undefined;
979
- const isCreatingOrder = false;
980
- const isMultipleDropoffOrder = false;
981
- const leafletRoute = undefined;
982
- const serviceRates = [];
983
- const selectedServiceRate = undefined;
984
- const selectedServiceQuote = undefined;
985
- const servicable = false;
986
- const customFieldGroups = [];
987
- const customFields = [];
988
- const customFieldValues = {};
989
-
990
- this.setProperties({
991
- order,
992
- payload,
993
- driversQuery,
994
- meta,
995
- entities,
996
- waypoints,
997
- orderConfigs,
998
- orderConfig,
999
- isCreatingOrder,
1000
- isMultipleDropoffOrder,
1001
- leafletRoute,
1002
- serviceRates,
1003
- selectedServiceQuote,
1004
- selectedServiceRate,
1005
- servicable,
1006
- customFieldGroups,
1007
- customFields,
1008
- customFieldValues,
1009
- });
1010
-
1011
- await this.removeRoutingControlPreview();
1012
- this.removeOptimizedRoute();
1013
- this.resetInterface();
1014
- }
1015
-
1016
- @action setConfig(event) {
1017
- const orderConfigId = event.target.value;
1018
- if (!orderConfigId) {
1019
- return;
1020
- }
1021
-
1022
- const orderConfig = this.store.peekRecord('order-config', orderConfigId);
1023
- this.orderConfig = orderConfig;
1024
- this.order.set('order_config_uuid', orderConfig.id);
1025
- this.order.set('type', orderConfig.key);
1026
-
1027
- // load custom fields
1028
- this.loadCustomFields.perform(orderConfig);
1029
- }
1030
-
1031
- /**
1032
- * A task method to load custom fields from the store and group them.
1033
- * @task
1034
- */
1035
- @task *loadCustomFields(orderConfig) {
1036
- this.store.unloadAll('custom-field');
1037
-
1038
- this.customFieldGroups = yield this.store.query('category', { owner_uuid: orderConfig.id, for: 'custom_field_group' });
1039
- this.customFields = yield this.store.query('custom-field', { subject_uuid: orderConfig.id });
1040
- this.groupCustomFields();
1041
- this.checkIfCustomFieldsValid();
1042
- }
1043
-
1044
- /**
1045
- * Organizes custom fields into their respective groups.
1046
- */
1047
- groupCustomFields() {
1048
- const customFieldGroups = [];
1049
- for (let i = 0; i < this.customFieldGroups.length; i++) {
1050
- const group = this.customFieldGroups[i];
1051
- group.set(
1052
- 'customFields',
1053
- this.customFields.filter((customField) => {
1054
- customField.set('value', null);
1055
- return customField.category_uuid === group.id;
1056
- })
1057
- );
1058
- customFieldGroups.push(group);
1059
- }
1060
-
1061
- this.customFieldGroups = customFieldGroups;
1062
- }
1063
-
1064
- @action setCustomFieldValue(value, customField) {
1065
- this.customFieldValues = {
1066
- ...this.customFieldValues,
1067
- [customField.id]: {
1068
- value,
1069
- value_type: this._getCustomFieldValueType(customField),
1070
- },
1071
- };
1072
- this.checkIfCustomFieldsValid();
1073
- }
1074
-
1075
- _getCustomFieldValueType(customField) {
1076
- if (customField.type === 'file-upload') {
1077
- return 'file';
1078
- }
1079
-
1080
- if (customField.type === 'date-time-input') {
1081
- return 'date';
1082
- }
1083
-
1084
- if (customField.type === 'model-select') {
1085
- return 'model';
1086
- }
1087
-
1088
- return 'text';
1089
- }
1090
-
1091
- @action setOrderFacilitator(model) {
1092
- this.order.set('facilitator', model);
1093
- // this.order.set('facilitator_type', `fleet-ops:${model.facilitator_type}`);
1094
- this.order.set('driver', null);
1095
-
1096
- this.isUsingIntegratedVendor = model?.isIntegratedVendor;
1097
- this.servicable = model?.isIntegratedVendor;
1098
-
1099
- if (model?.service_types?.length) {
1100
- this.integratedVendorServiceType = model.service_types.firstObject.key;
1101
- }
1102
-
1103
- if (model?.isIntegratedVendor) {
1104
- this.getQuotes();
1105
- }
1106
-
1107
- if (model) {
1108
- this.driversQuery = { facilitator: model.id };
1109
- } else {
1110
- this.driversQuery = {};
1111
- }
1112
- }
1113
-
1114
- @action setOrderCustomer(model) {
1115
- this.order.set('customer', model);
1116
- }
1117
-
1118
- @action setWaypointCustomer(waypoint, model) {
1119
- waypoint.set('customer', model);
1120
- waypoint.set('customer_type', `fleet-ops:${model.customer_type}`);
1121
- }
1122
-
1123
- @action selectIntegratedServiceType(key) {
1124
- this.integratedVendorServiceType = key;
1125
-
1126
- if (this.isUsingIntegratedVendor) {
1127
- this.getQuotes();
1128
- }
1129
- }
1130
-
1131
- @action async selectDriver(driver) {
1132
- this.order.set('driver_assigned', driver);
1133
- if (driver && driver.vehicle) {
1134
- const vehicle = await driver.vehicle;
1135
- this.order.set('vehicle_assigned', vehicle);
1136
- }
1137
-
1138
- if (this.leafletMap.liveMap) {
1139
- this.leafletMap.liveMap.focusDriver(driver);
1140
- // If route is optimized - re-optimize route
1141
- if (this.order.get('is_route_optimized')) {
1142
- this.optimizeRoute.perform();
1143
- }
1144
- }
1145
- }
1146
-
1147
- @action addCustomField() {
1148
- let label, value;
1149
-
1150
- this.modalsManager.show('modals/meta-field-form', {
1151
- title: this.intl.t('fleet-ops.operations.orders.index.new.custom-field-title'),
1152
- acceptButtonIcon: 'check',
1153
- acceptButtonIconPrefix: 'fas',
1154
- acceptButtonText: 'Done',
1155
- declineButtonIcon: 'times',
1156
- declineButtonIconPrefix: 'fas',
1157
- label,
1158
- value,
1159
- confirm: (modal) => {
1160
- const label = modal.getOption('label');
1161
- const value = modal.getOption('value');
1162
-
1163
- if (!label) {
1164
- return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.label-warning'));
1165
- }
1166
-
1167
- if (!value) {
1168
- return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.value-warning'));
1169
- }
1170
-
1171
- modal.startLoading();
1172
-
1173
- this.order.meta.pushObject({
1174
- key: dasherize(label),
1175
- label,
1176
- value,
1177
- });
1178
-
1179
- modal.done();
13
+ @service notifications;
14
+ @service hostRouter;
15
+ @service placeActions;
16
+ @service customerActions;
17
+ @service vendorActions;
18
+ @service entityActions;
19
+ @service orderImport;
20
+ @service orderCreation;
21
+ @service orderValidation;
22
+ @tracked order = this.orderCreation.newOrder();
23
+ @tracked overlay;
24
+
25
+ /** action buttons */
26
+ get actionButtons() {
27
+ return [
28
+ {
29
+ text: this.intl.t('common.import'),
30
+ icon: 'upload',
31
+ type: 'magic',
32
+ onClick: () => this.orderImport.promptImport(this.order),
1180
33
  },
1181
- });
1182
- }
1183
-
1184
- @action editCustomField(index) {
1185
- const metaField = this.order.meta.objectAt(index);
1186
- const { label, value } = metaField;
1187
-
1188
- this.modalsManager.show('modals/meta-field-form', {
1189
- title: this.intl.t('fleet-ops.operations.orders.index.new.edit-field-title'),
1190
- acceptButtonIcon: 'save',
1191
- acceptButtonText: 'Save Changes',
1192
- label,
1193
- value,
1194
- confirm: (modal) => {
1195
- const label = modal.getOption('label');
1196
- const value = modal.getOption('value');
1197
-
1198
- if (!label) {
1199
- return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.label-warning'));
1200
- }
1201
-
1202
- if (!value) {
1203
- return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.value-warning'));
1204
- }
1205
-
1206
- modal.startLoading();
1207
-
1208
- this.order.meta.replace(index, 1, [
34
+ {
35
+ icon: 'ellipsis-h',
36
+ triggerClass: 'hidden md:flex',
37
+ items: [
1209
38
  {
1210
- key: dasherize(label),
1211
- label,
1212
- value,
39
+ icon: 'user-plus',
40
+ text: this.intl.t('order.actions.create-new-customer'),
41
+ fn: this.customerActions.modal.create,
1213
42
  },
1214
- ]);
1215
-
1216
- modal.done();
1217
- },
1218
- });
1219
- }
1220
-
1221
- @action editMetaData() {
1222
- let { meta } = this.order;
1223
-
1224
- if (!isArray(meta)) {
1225
- meta = [];
1226
- }
1227
-
1228
- this.modalsManager.show('modals/edit-meta-form', {
1229
- title: this.intl.t('fleet-ops.operations.orders.index.new.edit-metadata'),
1230
- hideDeclineButton: true,
1231
- acceptButtonIcon: 'check',
1232
- acceptButtonIconPrefix: 'fas',
1233
- acceptButtonText: 'Done',
1234
- meta,
1235
- addMetaField: (meta) => {
1236
- const label = 'New field';
1237
- meta.pushObject({
1238
- key: dasherize(label),
1239
- label,
1240
- value: null,
1241
- });
1242
- },
1243
- removeMetaField: (meta, index) => {
1244
- meta.removeAt(index);
1245
- },
1246
- confirm: (modal) => {
1247
- const meta = modal.getOption('meta');
1248
-
1249
- this.order.meta = meta;
1250
-
1251
- modal.done();
1252
- },
1253
- });
1254
- }
1255
-
1256
- @action removeMeta(meta) {
1257
- this.meta.removeObject(meta);
1258
- }
1259
-
1260
- @action setPayloadPlace(prop, place) {
1261
- this.payload[prop] = place;
1262
-
1263
- // this.previewRoute(true);
1264
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
1265
-
1266
- if (this.isUsingIntegratedVendor) {
1267
- this.getQuotes();
1268
- }
1269
-
1270
- this.updatePayloadCoordinates();
1271
- }
1272
-
1273
- @action sortWaypoints({ sourceList, sourceIndex, targetList, targetIndex }) {
1274
- if (sourceList === targetList && sourceIndex === targetIndex) {
1275
- return;
1276
- }
1277
-
1278
- const item = sourceList.objectAt(sourceIndex);
1279
-
1280
- sourceList.removeAt(sourceIndex);
1281
- targetList.insertAt(targetIndex, item);
1282
-
1283
- if (this.isViewingRoutePreview) {
1284
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
1285
- }
1286
- }
1287
-
1288
- @action addWaypoint(properties = {}) {
1289
- if (this.order.customer) {
1290
- properties.customer = this.order.customer;
1291
- }
1292
-
1293
- const waypoint = this.store.createRecord('waypoint', { ...properties, type: 'dropoff' });
1294
- this.waypoints.pushObject(waypoint);
1295
- this.updatePayloadCoordinates();
1296
- }
1297
-
1298
- @action setWaypointPlace(index, place) {
1299
- if (!this.waypoints[index]) {
1300
- return;
1301
- }
1302
-
1303
- this.waypoints[index].place = place;
1304
-
1305
- if (this.waypoints.length) {
1306
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
1307
- }
1308
-
1309
- if (this.isUsingIntegratedVendor) {
1310
- this.getQuotes();
1311
- }
1312
-
1313
- this.updatePayloadCoordinates();
1314
- }
1315
-
1316
- @action removeWaypoint(waypoint) {
1317
- if (this.isMultipleDropoffOrder && this.waypoints.length === 1) {
1318
- return;
1319
- }
1320
-
1321
- this.waypoints.removeObject(waypoint);
1322
-
1323
- if (this.waypoints.length === 1) {
1324
- this.previewRoute(false);
1325
- } else {
1326
- this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
1327
- }
1328
-
1329
- this.updatePayloadCoordinates();
1330
- }
1331
-
1332
- @action clearWaypoints() {
1333
- this.waypoints.clear();
1334
-
1335
- if (this.isViewingRoutePreview) {
1336
- this.previewRoute(false);
1337
- }
1338
- }
1339
-
1340
- @action setEntityDestionation(index, { target }) {
1341
- const { value } = target;
1342
-
1343
- this.entities[index].destination_uuid = value;
1344
- }
1345
-
1346
- @action addFromCustomEntity(customEntity) {
1347
- const entity = this.store.createRecord('entity', {
1348
- ...customEntity,
1349
- id: undefined,
1350
- });
1351
-
1352
- this.entities.pushObject(entity);
1353
- }
1354
-
1355
- @action addEntities(entities = []) {
1356
- if (isArray(entities)) {
1357
- this.entities.pushObjects(entities);
1358
- }
1359
- }
1360
-
1361
- @action addEntity(importId = null) {
1362
- const entity = this.store.createRecord('entity', {
1363
- _import_id: typeof importId === 'string' ? importId : null,
1364
- });
1365
-
1366
- this.entities.pushObject(entity);
1367
- }
1368
-
1369
- @action removeEntity(entity) {
1370
- if (this.entities.length === 1) {
1371
- return;
1372
- }
1373
-
1374
- if (!entity.get('isNew')) {
1375
- return entity.destroyRecord();
1376
- }
1377
-
1378
- this.entities.removeObject(entity);
1379
- }
1380
-
1381
- @action editEntity(entity) {
1382
- this.modalsManager.show('modals/entity-form', {
1383
- title: this.intl.t('fleet-ops.operations.orders.index.new.edit-item'),
1384
- acceptButtonText: 'Save Changes',
1385
- entity,
1386
- uploadNewPhoto: (file) => {
1387
- const fileUrl = URL.createObjectURL(file.file);
1388
-
1389
- if (entity.get('isNew')) {
1390
- const { queue } = file;
1391
-
1392
- this.modalsManager.setOption('pendingFileUpload', file);
1393
- entity.set('photo_url', fileUrl);
1394
- queue.remove(file);
1395
- return;
1396
- } else {
1397
- entity.set('photo_url', fileUrl);
1398
- }
1399
-
1400
- // Indicate loading
1401
- this.modalsManager.startLoading();
1402
-
1403
- // Perform upload
1404
- return this.fetch.uploadFile.perform(
1405
- file,
1406
43
  {
1407
- path: `uploads/${this.currentUser.companyId}/entities/${entity.id}`,
1408
- subject_uuid: entity.id,
1409
- subject_type: 'fleet-ops:entity',
1410
- type: 'entity_photo',
44
+ icon: 'truck',
45
+ text: this.intl.t('order.actions.create-new-facilitator'),
46
+ fn: this.vendorActions.modal.create,
1411
47
  },
1412
- (uploadedFile) => {
1413
- entity.setProperties({
1414
- photo_uuid: uploadedFile.id,
1415
- photo_url: uploadedFile.url,
1416
- photo: uploadedFile,
1417
- });
1418
-
1419
- // Stop loading
1420
- this.modalsManager.stopLoading();
48
+ {
49
+ icon: 'map-pin',
50
+ text: this.intl.t('order.actions.create-new-place'),
51
+ fn: this.placeActions.modal.create,
1421
52
  },
1422
- () => {
1423
- // Stop loading
1424
- this.modalsManager.stopLoading();
1425
- }
1426
- );
1427
- },
1428
- confirm: async (modal) => {
1429
- modal.startLoading();
1430
-
1431
- try {
1432
- const pendingFileUpload = modal.getOption('pendingFileUpload');
1433
- const savedEntity = await entity.save();
1434
- if (pendingFileUpload) {
1435
- return modal.invoke('uploadNewPhoto', pendingFileUpload);
1436
- }
1437
-
1438
- return savedEntity;
1439
- } catch (error) {
1440
- this.notifications.serverError(error);
1441
- }
53
+ ],
1442
54
  },
1443
- });
55
+ ];
1444
56
  }
1445
57
 
1446
- @action transitionBack() {
1447
- return this.transitionToRoute('operations.orders.index');
1448
- }
1449
-
1450
- @action async newFacilitator() {
1451
- const type = await this.modalsManager.userSelectOption('Select facilitator type', ['contact', 'vendor']);
58
+ @task *save(order) {
59
+ if (this.orderValidation.validationFails(order)) return;
1452
60
 
1453
- if (type === 'vendor') {
1454
- const vendor = this.store.createRecord('vendor', { type: 'facilitator', status: 'active' });
1455
- return this.contextPanel.focus(vendor, 'editing', {
1456
- onAfterSave: (vendor) => {
1457
- this.setOrderFacilitator(vendor);
1458
- this.contextPanel.clear();
1459
- },
1460
- });
1461
- }
1462
-
1463
- if (type === 'contact') {
1464
- const contact = this.store.createRecord('contact', { type: 'facilitator', status: 'active' });
1465
- return this.contextPanel.focus(contact, 'editing', {
1466
- onAfterSave: (contact) => {
1467
- this.setOrderFacilitator(contact);
1468
- this.contextPanel.clear();
1469
- },
1470
- });
1471
- }
1472
- }
1473
-
1474
- @action async newCustomer() {
1475
- const type = await this.modalsManager.userSelectOption('Select customer type', ['contact', 'vendor']);
1476
-
1477
- if (type === 'vendor') {
1478
- const vendor = this.store.createRecord('vendor', { type: 'customer', status: 'active' });
1479
- return this.contextPanel.focus(vendor, 'editing', {
1480
- onAfterSave: (vendor) => {
1481
- this.setOrderCustomer(vendor);
1482
- this.contextPanel.clear();
1483
- },
1484
- });
1485
- }
61
+ // Display loader
62
+ this.loader.showLoader('body', { loadingMessage: this.intl.t('common.creating-resource', { resource: this.intl.t('resource.order') }) + '...' });
1486
63
 
1487
- if (type === 'contact') {
1488
- const contact = this.store.createRecord('contact', { type: 'customer', status: 'active' });
1489
- return this.contextPanel.focus(contact, 'editing', {
1490
- onAfterSave: (contact) => {
1491
- this.setOrderCustomer(contact);
1492
- this.contextPanel.clear();
1493
- },
1494
- });
1495
- }
1496
- }
64
+ try {
65
+ // Trigger creating event
66
+ this.universe.trigger('fleet-ops.order.creating', order);
1497
67
 
1498
- @action applyCustomMetaFields(typeKey) {
1499
- const type = this.types.find((type) => type.key === typeKey);
68
+ // Save custom field values
69
+ const { created: customFieldValues } = yield order.cfManager.saveTo(order);
70
+ order.custom_field_values.pushObjects(customFieldValues);
1500
71
 
1501
- if (!type || !type.meta) {
1502
- return;
1503
- }
72
+ // Save order
73
+ const createdOrder = yield order.save();
1504
74
 
1505
- if (isArray(type.meta.fields)) {
1506
- for (let i = 0; i < type.meta.fields.length; i++) {
1507
- let field = type.meta.fields[i];
75
+ // Trigger created event
76
+ this.universe.trigger('fleet-ops.order.created', createdOrder);
1508
77
 
1509
- this.meta.pushObject({
1510
- ...field,
1511
- value: null,
1512
- });
1513
- }
78
+ // Order creation completed
79
+ yield this.hostRouter.transitionTo('console.fleet-ops.operations.orders.index.details', createdOrder);
80
+ this.notifications.success(this.intl.t('common.resource-created-success-name', { resource: this.intl.t('resource.order'), resourceName: createdOrder.tracking }));
81
+ } catch (err) {
82
+ console.error(err);
83
+ debug('Error creating order: ' + err.message);
84
+ this.notifications.serverError(err);
85
+ } finally {
86
+ this.loader.removeLoader();
1514
87
  }
1515
88
  }
1516
89
 
1517
- @action queueFile(file) {
1518
- // since we have dropzone and upload button within dropzone validate the file state first
1519
- // as this method can be called twice from both functions
1520
- if (['queued', 'failed', 'timed_out', 'aborted'].indexOf(file.state) === -1) {
1521
- return;
1522
- }
1523
-
1524
- // Queue and upload immediatley
1525
- this.uploadQueue.pushObject(file);
1526
- this.fetch.uploadFile.perform(
1527
- file,
1528
- {
1529
- path: 'uploads/fleet-ops/order-files',
1530
- type: 'order_file',
1531
- },
1532
- (uploadedFile) => {
1533
- this.order.files.pushObject(uploadedFile);
1534
- this.uploadQueue.removeObject(file);
1535
- },
1536
- () => {
1537
- this.uploadQueue.removeObject(file);
1538
- // remove file from queue
1539
- if (file.queue && typeof file.queue.remove === 'function') {
1540
- file.queue.remove(file);
1541
- }
1542
- }
1543
- );
90
+ @action setup() {
91
+ // Change to map layout
92
+ this.index.changeLayout('map');
1544
93
  }
1545
94
 
1546
- @action removeFile(file) {
1547
- return file.destroyRecord();
95
+ reset() {
96
+ this.order = this.orderCreation.newOrder();
1548
97
  }
1549
98
  }