@fleetbase/fleetops-engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +32 -0
  3. package/addon/components/cell/driver-name.hbs +13 -0
  4. package/addon/components/cell/driver-name.js +30 -0
  5. package/addon/components/custom-field-value.hbs +11 -0
  6. package/addon/components/custom-field-value.js +41 -0
  7. package/addon/components/custom-field.hbs +42 -0
  8. package/addon/components/custom-field.js +46 -0
  9. package/addon/components/display-place.hbs +52 -0
  10. package/addon/components/display-place.js +11 -0
  11. package/addon/components/driver-card-mini.hbs +12 -0
  12. package/addon/components/driver-card-mini.js +25 -0
  13. package/addon/components/driver-card.hbs +27 -0
  14. package/addon/components/driver-card.js +14 -0
  15. package/addon/components/event-timeline/event.hbs +5 -0
  16. package/addon/components/event-timeline.hbs +7 -0
  17. package/addon/components/event-timeline.js +423 -0
  18. package/addon/components/file-icon.js +1 -0
  19. package/addon/components/fleet-driver-listing.hbs +73 -0
  20. package/addon/components/fleet-driver-listing.js +117 -0
  21. package/addon/components/full-calendar/draggable.js +1 -0
  22. package/addon/components/full-calendar.js +1 -0
  23. package/addon/components/full-size.js +1 -0
  24. package/addon/components/global-search.hbs +84 -0
  25. package/addon/components/global-search.js +52 -0
  26. package/addon/components/horizontal-route.hbs +33 -0
  27. package/addon/components/horizontal-route.js +48 -0
  28. package/addon/components/integrated-order-details.hbs +117 -0
  29. package/addon/components/integrated-order-details.js +10 -0
  30. package/addon/components/leaflet-draw-control.js +147 -0
  31. package/addon/components/leaflet-rotated-marker.js +24 -0
  32. package/addon/components/live-map.hbs +63 -0
  33. package/addon/components/live-map.js +856 -0
  34. package/addon/components/map-container/toolbar/zones-panel.hbs +41 -0
  35. package/addon/components/map-container/toolbar/zones-panel.js +106 -0
  36. package/addon/components/map-container/toolbar-container.hbs +1 -0
  37. package/addon/components/map-container/toolbar-container.js +3 -0
  38. package/addon/components/map-container/toolbar.hbs +51 -0
  39. package/addon/components/map-container/toolbar.js +34 -0
  40. package/addon/components/map-container/topbar.hbs +1 -0
  41. package/addon/components/map-container/topbar.js +3 -0
  42. package/addon/components/map-container/view-switch.hbs +1 -0
  43. package/addon/components/map-container/view-switch.js +3 -0
  44. package/addon/components/map-container.hbs +1 -0
  45. package/addon/components/map-container.js +15 -0
  46. package/addon/components/modals/assign-driver.hbs +24 -0
  47. package/addon/components/modals/assign-driver.js +3 -0
  48. package/addon/components/modals/clone-config-form.hbs +6 -0
  49. package/addon/components/modals/contact-details.hbs +44 -0
  50. package/addon/components/modals/contact-form.hbs +56 -0
  51. package/addon/components/modals/driver-assign-order.hbs +67 -0
  52. package/addon/components/modals/driver-assign-vehicle.hbs +20 -0
  53. package/addon/components/modals/driver-assign-vendor.hbs +20 -0
  54. package/addon/components/modals/driver-details.hbs +85 -0
  55. package/addon/components/modals/driver-form.hbs +83 -0
  56. package/addon/components/modals/edit-meta-form.hbs +20 -0
  57. package/addon/components/modals/entity-form.hbs +57 -0
  58. package/addon/components/modals/entity-meta-field-prompt.hbs +6 -0
  59. package/addon/components/modals/fleet-details.hbs +31 -0
  60. package/addon/components/modals/fleet-form.hbs +26 -0
  61. package/addon/components/modals/fuel-report-details.hbs +34 -0
  62. package/addon/components/modals/fuel-report-form.hbs +26 -0
  63. package/addon/components/modals/group-details.hbs +42 -0
  64. package/addon/components/modals/group-form.hbs +54 -0
  65. package/addon/components/modals/install-prompt.hbs +21 -0
  66. package/addon/components/modals/map-field-form.hbs +9 -0
  67. package/addon/components/modals/map-field-group-form.hbs +6 -0
  68. package/addon/components/modals/map-layer-form.hbs +29 -0
  69. package/addon/components/modals/meta-field-form.hbs +8 -0
  70. package/addon/components/modals/meta-field-group-form.hbs +5 -0
  71. package/addon/components/modals/new-order-config.hbs +11 -0
  72. package/addon/components/modals/option-prompt.hbs +17 -0
  73. package/addon/components/modals/order-assign-driver.hbs +25 -0
  74. package/addon/components/modals/order-config-new-status.hbs +5 -0
  75. package/addon/components/modals/order-event.hbs +18 -0
  76. package/addon/components/modals/order-form.hbs +63 -0
  77. package/addon/components/modals/order-import.hbs +84 -0
  78. package/addon/components/modals/order-label.hbs +7 -0
  79. package/addon/components/modals/order-meta.hbs +12 -0
  80. package/addon/components/modals/order-new-activity.hbs +62 -0
  81. package/addon/components/modals/order-route-form.hbs +111 -0
  82. package/addon/components/modals/place-assign-vendor.hbs +20 -0
  83. package/addon/components/modals/place-details.hbs +105 -0
  84. package/addon/components/modals/place-form.hbs +30 -0
  85. package/addon/components/modals/point-map.hbs +16 -0
  86. package/addon/components/modals/policy-form.hbs +22 -0
  87. package/addon/components/modals/resend-verification-email.hbs +25 -0
  88. package/addon/components/modals/role-form.hbs +16 -0
  89. package/addon/components/modals/select-payment-method.hbs +12 -0
  90. package/addon/components/modals/service-area-form.hbs +31 -0
  91. package/addon/components/modals/set-password.hbs +15 -0
  92. package/addon/components/modals/uninstall-prompt.hbs +21 -0
  93. package/addon/components/modals/user-form.hbs +56 -0
  94. package/addon/components/modals/vehicle-details.hbs +227 -0
  95. package/addon/components/modals/vehicle-form.hbs +282 -0
  96. package/addon/components/modals/vendor-details.hbs +77 -0
  97. package/addon/components/modals/vendor-form.hbs +168 -0
  98. package/addon/components/modals/view-service-area.hbs +12 -0
  99. package/addon/components/modals/view-zone.hbs +12 -0
  100. package/addon/components/modals/zone-form.hbs +16 -0
  101. package/addon/components/operations-pane/pane.hbs +1 -0
  102. package/addon/components/order/header.hbs +48 -0
  103. package/addon/components/order/header.js +26 -0
  104. package/addon/components/order/place-card.hbs +51 -0
  105. package/addon/components/order/place-card.js +33 -0
  106. package/addon/components/order/schedule-card.hbs +35 -0
  107. package/addon/components/order/schedule-card.js +17 -0
  108. package/addon/components/order/sub-header/item.hbs +16 -0
  109. package/addon/components/order/sub-header.hbs +3 -0
  110. package/addon/components/order-config/activity-flow-editor.hbs +108 -0
  111. package/addon/components/order-config/activity-flow-editor.js +374 -0
  112. package/addon/components/order-config/details-editor.hbs +32 -0
  113. package/addon/components/order-config/details-editor.js +16 -0
  114. package/addon/components/order-config/entities-editor.hbs +84 -0
  115. package/addon/components/order-config/entities-editor.js +123 -0
  116. package/addon/components/order-config/fields-editor.hbs +122 -0
  117. package/addon/components/order-config/fields-editor.js +233 -0
  118. package/addon/components/order-config/selector.hbs +1 -0
  119. package/addon/components/order-config/selector.js +3 -0
  120. package/addon/components/order-config.hbs +66 -0
  121. package/addon/components/order-config.js +296 -0
  122. package/addon/components/order-list-overlay/driver-panel-title.hbs +6 -0
  123. package/addon/components/order-list-overlay/order.hbs +22 -0
  124. package/addon/components/order-list-overlay/order.js +3 -0
  125. package/addon/components/order-list-overlay.hbs +120 -0
  126. package/addon/components/order-list-overlay.js +227 -0
  127. package/addon/components/route-list.hbs +47 -0
  128. package/addon/components/route-list.js +11 -0
  129. package/addon/components/settings-window.hbs +15 -0
  130. package/addon/components/settings-window.js +62 -0
  131. package/addon/components/split-grid.js +1 -0
  132. package/addon/components/widget/fleet-ops-quickstart.hbs +40 -0
  133. package/addon/components/widget/fleet-ops-quickstart.js +58 -0
  134. package/addon/components/widget/issues.hbs +1 -0
  135. package/addon/components/widget/key-metrics.hbs +121 -0
  136. package/addon/components/widget/key-metrics.js +46 -0
  137. package/addon/components/widget/live-order-map.hbs +59 -0
  138. package/addon/components/widget/live-order-map.js +11 -0
  139. package/addon/components/widget/recent-orders.hbs +35 -0
  140. package/addon/components/widget/recent-orders.js +24 -0
  141. package/addon/components/widget/transaction-earnings.hbs +1 -0
  142. package/addon/components/widget/transactions.hbs +36 -0
  143. package/addon/components/widget/transactions.js +29 -0
  144. package/addon/components/widget/weekly-orders.hbs +1 -0
  145. package/addon/components/widget/weekly-orders.js +3 -0
  146. package/addon/controllers/application.js +40 -0
  147. package/addon/controllers/management/contacts/index.js +438 -0
  148. package/addon/controllers/management/drivers/index.js +868 -0
  149. package/addon/controllers/management/fleets/index.js +507 -0
  150. package/addon/controllers/management/fuel-reports/index.js +428 -0
  151. package/addon/controllers/management/issues/index.js +335 -0
  152. package/addon/controllers/management/places/index.js +571 -0
  153. package/addon/controllers/management/vehicles/index.js +616 -0
  154. package/addon/controllers/management/vendors/index.js +626 -0
  155. package/addon/controllers/management.js +5 -0
  156. package/addon/controllers/operations/orders/index/config/types.js +17 -0
  157. package/addon/controllers/operations/orders/index/config.js +13 -0
  158. package/addon/controllers/operations/orders/index/new.js +1213 -0
  159. package/addon/controllers/operations/orders/index/view.js +794 -0
  160. package/addon/controllers/operations/orders/index.js +674 -0
  161. package/addon/controllers/operations/scheduler/index.js +110 -0
  162. package/addon/controllers/operations/service-rates/index/edit.js +59 -0
  163. package/addon/controllers/operations/service-rates/index/new.js +369 -0
  164. package/addon/controllers/operations/service-rates/index.js +275 -0
  165. package/addon/controllers/operations/zones/index.js +470 -0
  166. package/addon/engine.js +19 -0
  167. package/addon/helpers/avatar-url.js +9 -0
  168. package/addon/helpers/extract-coordinates.js +6 -0
  169. package/addon/helpers/feature-group.js +14 -0
  170. package/addon/helpers/flow-raw-status.js +13 -0
  171. package/addon/helpers/format-point.js +13 -0
  172. package/addon/helpers/get-tip-amount.js +19 -0
  173. package/addon/helpers/is-active-route.js +1 -0
  174. package/addon/helpers/is-facilitator-supported-place.js +6 -0
  175. package/addon/helpers/is-not-facilitator-supported-place.js +6 -0
  176. package/addon/helpers/is-waypoint-record.js +6 -0
  177. package/addon/helpers/point-coordinates.js +10 -0
  178. package/addon/helpers/point-to-coordinates.js +28 -0
  179. package/addon/helpers/service-name.js +6 -0
  180. package/addon/helpers/waypoint-label.js +1 -0
  181. package/addon/instance-initializers/register-leaflet-draw-control-layer.js +17 -0
  182. package/addon/instance-initializers/register-leaflet-rotated-marker.js +17 -0
  183. package/addon/modifiers/translate-x.js +5 -0
  184. package/addon/routes/application.js +25 -0
  185. package/addon/routes/comms/chat.js +3 -0
  186. package/addon/routes/comms/intercom.js +3 -0
  187. package/addon/routes/comms.js +3 -0
  188. package/addon/routes/home.js +20 -0
  189. package/addon/routes/management/contacts/index.js +24 -0
  190. package/addon/routes/management/contacts.js +3 -0
  191. package/addon/routes/management/drivers/index.js +33 -0
  192. package/addon/routes/management/drivers.js +3 -0
  193. package/addon/routes/management/fleets/index.js +27 -0
  194. package/addon/routes/management/fleets.js +3 -0
  195. package/addon/routes/management/fuel-reports/index.js +23 -0
  196. package/addon/routes/management/fuel-reports.js +3 -0
  197. package/addon/routes/management/index.js +3 -0
  198. package/addon/routes/management/issues/index.js +24 -0
  199. package/addon/routes/management/issues.js +3 -0
  200. package/addon/routes/management/places/index.js +18 -0
  201. package/addon/routes/management/places.js +3 -0
  202. package/addon/routes/management/vehicles/index.js +35 -0
  203. package/addon/routes/management/vehicles.js +3 -0
  204. package/addon/routes/management/vendors/index.js +34 -0
  205. package/addon/routes/management/vendors.js +3 -0
  206. package/addon/routes/management.js +3 -0
  207. package/addon/routes/operations/dispatch.js +3 -0
  208. package/addon/routes/operations/orders/index/config/types.js +17 -0
  209. package/addon/routes/operations/orders/index/config.js +3 -0
  210. package/addon/routes/operations/orders/index/new.js +16 -0
  211. package/addon/routes/operations/orders/index/view.js +37 -0
  212. package/addon/routes/operations/orders/index.js +35 -0
  213. package/addon/routes/operations/orders.js +4 -0
  214. package/addon/routes/operations/scheduler/index.js +10 -0
  215. package/addon/routes/operations/scheduler.js +3 -0
  216. package/addon/routes/operations/service-rates/index/edit.js +35 -0
  217. package/addon/routes/operations/service-rates/index/new.js +15 -0
  218. package/addon/routes/operations/service-rates/index.js +49 -0
  219. package/addon/routes/operations/service-rates.js +10 -0
  220. package/addon/routes/operations/zones/index.js +25 -0
  221. package/addon/routes/operations/zones.js +7 -0
  222. package/addon/routes/operations.js +3 -0
  223. package/addon/routes.js +55 -0
  224. package/addon/services/map-manager.js +3 -0
  225. package/addon/services/service-areas.js +385 -0
  226. package/addon/templates/application.hbs +27 -0
  227. package/addon/templates/comms/chat.hbs +1 -0
  228. package/addon/templates/comms/intercom.hbs +1 -0
  229. package/addon/templates/comms.hbs +1 -0
  230. package/addon/templates/home.hbs +1 -0
  231. package/addon/templates/management/contacts/index.hbs +23 -0
  232. package/addon/templates/management/contacts.hbs +1 -0
  233. package/addon/templates/management/drivers/index.hbs +35 -0
  234. package/addon/templates/management/drivers.hbs +1 -0
  235. package/addon/templates/management/fleets/index.hbs +22 -0
  236. package/addon/templates/management/fleets.hbs +1 -0
  237. package/addon/templates/management/fuel-reports/index.hbs +21 -0
  238. package/addon/templates/management/fuel-reports.hbs +1 -0
  239. package/addon/templates/management/index.hbs +53 -0
  240. package/addon/templates/management/issues/index.hbs +21 -0
  241. package/addon/templates/management/issues.hbs +1 -0
  242. package/addon/templates/management/places/index.hbs +34 -0
  243. package/addon/templates/management/places.hbs +1 -0
  244. package/addon/templates/management/vehicles/index.hbs +22 -0
  245. package/addon/templates/management/vehicles.hbs +1 -0
  246. package/addon/templates/management/vendors/index.hbs +22 -0
  247. package/addon/templates/management/vendors.hbs +1 -0
  248. package/addon/templates/management.hbs +1 -0
  249. package/addon/templates/operations/dispatch.hbs +1 -0
  250. package/addon/templates/operations/orders/index/config/types.hbs +26 -0
  251. package/addon/templates/operations/orders/index/config.hbs +24 -0
  252. package/addon/templates/operations/orders/index/new.hbs +506 -0
  253. package/addon/templates/operations/orders/index/view.hbs +428 -0
  254. package/addon/templates/operations/orders/index.hbs +48 -0
  255. package/addon/templates/operations/orders.hbs +1 -0
  256. package/addon/templates/operations/scheduler/index.hbs +30 -0
  257. package/addon/templates/operations/scheduler.hbs +1 -0
  258. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  259. package/addon/templates/operations/service-rates/index/new.hbs +308 -0
  260. package/addon/templates/operations/service-rates/index.hbs +23 -0
  261. package/addon/templates/operations/service-rates.hbs +1 -0
  262. package/addon/templates/operations/zones/index.hbs +72 -0
  263. package/addon/templates/operations/zones.hbs +1 -0
  264. package/addon/templates/operations.hbs +1 -0
  265. package/addon/utils/calculate-percentage.js +1 -0
  266. package/addon/utils/extract-coordinates.js +1 -0
  267. package/addon/utils/format-currency.js +1 -0
  268. package/addon/utils/geojson/geo-json.js +17 -0
  269. package/addon/utils/is-facilitator-supported-place.js +14 -0
  270. package/addon/utils/to-model.js +1 -0
  271. package/app/components/cell/driver-name.js +1 -0
  272. package/app/components/custom-field-value.js +1 -0
  273. package/app/components/custom-field.js +1 -0
  274. package/app/components/display-place.js +1 -0
  275. package/app/components/driver-card-mini.js +1 -0
  276. package/app/components/driver-card.js +1 -0
  277. package/app/components/event-timeline/event.js +1 -0
  278. package/app/components/event-timeline.js +1 -0
  279. package/app/components/file-icon.js +1 -0
  280. package/app/components/fleet-driver-listing.js +1 -0
  281. package/app/components/full-calendar/draggable.js +1 -0
  282. package/app/components/full-calendar.js +1 -0
  283. package/app/components/full-size.js +1 -0
  284. package/app/components/global-search.js +1 -0
  285. package/app/components/horizontal-route.js +1 -0
  286. package/app/components/integrated-order-details.js +1 -0
  287. package/app/components/leaflet-draw-control.js +1 -0
  288. package/app/components/leaflet-rotated-marker.js +1 -0
  289. package/app/components/live-map.js +1 -0
  290. package/app/components/map-container/toolbar/zones-panel.js +1 -0
  291. package/app/components/map-container/toolbar-container.js +1 -0
  292. package/app/components/map-container/toolbar.js +1 -0
  293. package/app/components/map-container/topbar.js +1 -0
  294. package/app/components/map-container/view-switch.js +1 -0
  295. package/app/components/map-container.js +1 -0
  296. package/app/components/modals/assign-driver.js +1 -0
  297. package/app/components/modals/clone-config-form.js +1 -0
  298. package/app/components/modals/contact-details.js +1 -0
  299. package/app/components/modals/contact-form.js +1 -0
  300. package/app/components/modals/driver-assign-order.js +1 -0
  301. package/app/components/modals/driver-assign-vehicle.js +1 -0
  302. package/app/components/modals/driver-assign-vendor.js +1 -0
  303. package/app/components/modals/driver-details.js +1 -0
  304. package/app/components/modals/driver-form.js +1 -0
  305. package/app/components/modals/edit-meta-form.js +1 -0
  306. package/app/components/modals/entity-form.js +1 -0
  307. package/app/components/modals/entity-meta-field-prompt.js +1 -0
  308. package/app/components/modals/fleet-details.js +1 -0
  309. package/app/components/modals/fleet-form.js +1 -0
  310. package/app/components/modals/fuel-report-details.js +1 -0
  311. package/app/components/modals/fuel-report-form.js +1 -0
  312. package/app/components/modals/group-details.js +1 -0
  313. package/app/components/modals/group-form.js +1 -0
  314. package/app/components/modals/install-prompt.js +1 -0
  315. package/app/components/modals/map-field-form.js +1 -0
  316. package/app/components/modals/map-field-group-form.js +1 -0
  317. package/app/components/modals/map-layer-form.js +1 -0
  318. package/app/components/modals/meta-field-form.js +1 -0
  319. package/app/components/modals/meta-field-group-form.js +1 -0
  320. package/app/components/modals/new-order-config.js +1 -0
  321. package/app/components/modals/option-prompt.js +1 -0
  322. package/app/components/modals/order-assign-driver.js +1 -0
  323. package/app/components/modals/order-config-new-status.js +1 -0
  324. package/app/components/modals/order-event.js +1 -0
  325. package/app/components/modals/order-form.js +1 -0
  326. package/app/components/modals/order-import.js +1 -0
  327. package/app/components/modals/order-label.js +1 -0
  328. package/app/components/modals/order-meta.js +1 -0
  329. package/app/components/modals/order-new-activity.js +1 -0
  330. package/app/components/modals/order-route-form.js +1 -0
  331. package/app/components/modals/place-assign-vendor.js +1 -0
  332. package/app/components/modals/place-details.js +1 -0
  333. package/app/components/modals/place-form.js +1 -0
  334. package/app/components/modals/point-map.js +1 -0
  335. package/app/components/modals/policy-form.js +1 -0
  336. package/app/components/modals/resend-verification-email.js +1 -0
  337. package/app/components/modals/role-form.js +1 -0
  338. package/app/components/modals/select-payment-method.js +1 -0
  339. package/app/components/modals/service-area-form.js +1 -0
  340. package/app/components/modals/set-password.js +1 -0
  341. package/app/components/modals/uninstall-prompt.js +1 -0
  342. package/app/components/modals/user-form.js +1 -0
  343. package/app/components/modals/vehicle-details.js +1 -0
  344. package/app/components/modals/vehicle-form.js +1 -0
  345. package/app/components/modals/vendor-details.js +1 -0
  346. package/app/components/modals/vendor-form.js +1 -0
  347. package/app/components/modals/view-service-area.js +1 -0
  348. package/app/components/modals/view-zone.js +1 -0
  349. package/app/components/modals/zone-form.js +1 -0
  350. package/app/components/operations-pane/pane.js +1 -0
  351. package/app/components/order/header.js +1 -0
  352. package/app/components/order/place-card.js +1 -0
  353. package/app/components/order/schedule-card.js +1 -0
  354. package/app/components/order/sub-header/item.js +1 -0
  355. package/app/components/order/sub-header.js +1 -0
  356. package/app/components/order-config/activity-flow-editor.js +1 -0
  357. package/app/components/order-config/details-editor.js +1 -0
  358. package/app/components/order-config/entities-editor.js +1 -0
  359. package/app/components/order-config/fields-editor.js +1 -0
  360. package/app/components/order-config/selector.js +1 -0
  361. package/app/components/order-config.js +1 -0
  362. package/app/components/order-list-overlay/driver-panel-title.js +1 -0
  363. package/app/components/order-list-overlay/order.js +1 -0
  364. package/app/components/order-list-overlay.js +1 -0
  365. package/app/components/route-list.js +1 -0
  366. package/app/components/settings-window.js +1 -0
  367. package/app/components/split-grid.js +1 -0
  368. package/app/components/widget/issues.js +1 -0
  369. package/app/components/widget/key-metrics.js +1 -0
  370. package/app/components/widget/live-order-map.js +1 -0
  371. package/app/components/widget/recent-orders.js +1 -0
  372. package/app/components/widget/recommended-todo.js +1 -0
  373. package/app/components/widget/transaction-earnings.js +1 -0
  374. package/app/components/widget/transactions.js +1 -0
  375. package/app/components/widget/weekly-orders.js +1 -0
  376. package/app/controllers/application.js +1 -0
  377. package/app/controllers/management/contacts/index.js +1 -0
  378. package/app/controllers/management/drivers/index/details.js +1 -0
  379. package/app/controllers/management/drivers/index.js +1 -0
  380. package/app/controllers/management/fleets/index/details.js +1 -0
  381. package/app/controllers/management/fleets/index.js +1 -0
  382. package/app/controllers/management/fuel-reports/index.js +1 -0
  383. package/app/controllers/management/issues/index.js +1 -0
  384. package/app/controllers/management/places/index.js +1 -0
  385. package/app/controllers/management/vehicles/index.js +1 -0
  386. package/app/controllers/management/vendors/index/details/remarks.js +1 -0
  387. package/app/controllers/management/vendors/index/details.js +1 -0
  388. package/app/controllers/management/vendors/index.js +1 -0
  389. package/app/controllers/management.js +1 -0
  390. package/app/controllers/operations/orders/index/config/types.js +1 -0
  391. package/app/controllers/operations/orders/index/config.js +1 -0
  392. package/app/controllers/operations/orders/index/new.js +1 -0
  393. package/app/controllers/operations/orders/index/view.js +1 -0
  394. package/app/controllers/operations/scheduler/index.js +1 -0
  395. package/app/controllers/operations/service-rates/index/edit.js +1 -0
  396. package/app/controllers/operations/service-rates/index/new.js +1 -0
  397. package/app/controllers/operations/service-rates/index.js +1 -0
  398. package/app/controllers/operations/zones/index.js +1 -0
  399. package/app/helpers/avatar-url.js +1 -0
  400. package/app/helpers/extract-coordinates.js +1 -0
  401. package/app/helpers/feature-group.js +1 -0
  402. package/app/helpers/flow-raw-status.js +1 -0
  403. package/app/helpers/format-point.js +1 -0
  404. package/app/helpers/get-tip-amount.js +1 -0
  405. package/app/helpers/is-facilitator-supported-place.js +1 -0
  406. package/app/helpers/is-not-facilitator-supported-place.js +1 -0
  407. package/app/helpers/is-waypoint-record.js +1 -0
  408. package/app/helpers/point-coordinates.js +1 -0
  409. package/app/helpers/point-to-coordinates.js +1 -0
  410. package/app/helpers/service-name.js +1 -0
  411. package/app/helpers/waypoint-label.js +1 -0
  412. package/app/modifiers/translate-x.js +1 -0
  413. package/app/routes/home.js +1 -0
  414. package/app/routes/management/fleets/index/details.js +1 -0
  415. package/app/routes/operations/orders/index/config/types.js +1 -0
  416. package/app/routes/operations/orders/index/config.js +1 -0
  417. package/app/routes/operations/orders/index/new.js +1 -0
  418. package/app/routes/operations/orders/index/view.js +1 -0
  419. package/app/routes/operations/scheduler/index.js +1 -0
  420. package/app/routes/operations/scheduler.js +1 -0
  421. package/app/routes/operations/service-rates/index/edit.js +1 -0
  422. package/app/routes/operations/service-rates/index/new.js +1 -0
  423. package/app/services/map-manager.js +1 -0
  424. package/app/services/service-areas.js +1 -0
  425. package/app/templates/home.js +1 -0
  426. package/app/templates/management/fleets/index/details.js +1 -0
  427. package/app/templates/operations/orders/index/config/types.js +1 -0
  428. package/app/templates/operations/orders/index/config.js +1 -0
  429. package/app/templates/operations/orders/index/new.js +1 -0
  430. package/app/templates/operations/orders/index/view.js +1 -0
  431. package/app/templates/operations/scheduler/index.js +1 -0
  432. package/app/templates/operations/scheduler.js +1 -0
  433. package/app/templates/operations/service-rates/index/edit.js +1 -0
  434. package/app/templates/operations/service-rates/index/new.js +1 -0
  435. package/app/utils/calculate-percentage.js +1 -0
  436. package/app/utils/extract-coordinates.js +1 -0
  437. package/app/utils/format-currency.js +1 -0
  438. package/app/utils/geojson/geo-json.js +1 -0
  439. package/app/utils/is-facilitator-supported-place.js +1 -0
  440. package/app/utils/is-latitude.js +1 -0
  441. package/app/utils/to-model.js +1 -0
  442. package/assets/images/drawing-controls-spritesheet-inverted.png +0 -0
  443. package/config/environment.js +25 -0
  444. package/index.js +73 -0
  445. package/package.json +132 -0
  446. package/pnpm-lock.yaml +12613 -0
@@ -0,0 +1,47 @@
1
+ <div class="order-route-list" ...attributes>
2
+ {{#if @order.payload.firstWaypoint}}
3
+ <div class="order-route-stop {{@routeStopClass}}">
4
+ <div class="order-route-stop-index {{@routeStopIndexClass}}">
5
+ <div class="index-count">1</div>
6
+ </div>
7
+ <div class="order-route-location {{@routeLocationClass}} dark:text-gray-100">
8
+ <DisplayPlace @place={{@order.payload.firstWaypoint}} />
9
+ </div>
10
+ </div>
11
+ {{/if}}
12
+
13
+ {{#if (gt @order.payload.waypoints.length 2)}}
14
+ <Button class="border-0 m-0 p-0 shadow-none w-full mb-3" @wrapperClass="w-full" @onClick={{this.toggleWaypointsCollapse}}>
15
+ <div class="px-3 py-2 w-full bg-yellow-200 text-yellow-900 rounded shadow-sm flex flex-col justify-center items-start">
16
+ <div class="flex flex-row items-center">
17
+ <FaIcon @icon="eye" class="mr-2 text-yellow-900" />
18
+ <span class="font-bold">{{if this.isWaypointsCollapsed "Tap to expand" "Tap to collapse"}}</span>
19
+ </div>
20
+ <div>{{@order.payload.middleWaypoints.length}} more waypoints</div>
21
+ </div>
22
+ </Button>
23
+ {{#unless this.isWaypointsCollapsed}}
24
+ {{#each @order.payload.middleWaypoints as |waypoint index|}}
25
+ <div class="order-route-stop {{@routeStopClass}}">
26
+ <div class="order-route-stop-index {{@routeStopIndexClass}}">
27
+ <div class="index-count">{{add index 2}}</div>
28
+ </div>
29
+ <div class="order-route-location {{@routeLocationClass}} dark:text-gray-100">
30
+ <DisplayPlace @place={{waypoint}} />
31
+ </div>
32
+ </div>
33
+ {{/each}}
34
+ {{/unless}}
35
+ {{/if}}
36
+
37
+ {{#if @order.payload.lastWaypoint}}
38
+ <div class="order-route-stop {{@routeStopClass}}">
39
+ <div class="order-route-stop-index {{@routeStopIndexClass}}">
40
+ <div class="index-count">{{add @order.payload.middleWaypoints.length 2}}</div>
41
+ </div>
42
+ <div class="order-route-location {{@routeLocationClass}} dark:text-gray-100">
43
+ <DisplayPlace @place={{@order.payload.lastWaypoint}} />
44
+ </div>
45
+ </div>
46
+ {{/if}}
47
+ </div>
@@ -0,0 +1,11 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class RouteListComponent extends Component {
6
+ @tracked isWaypointsCollapsed = true;
7
+
8
+ @action toggleWaypointsCollapse() {
9
+ this.isWaypointsCollapsed = !this.isWaypointsCollapsed;
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ <Overlay @onLoad={{this.onLoad}} @isOpen={{@isOpen}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizable={{true}} @isMaximizable={{true}} @isMinimizable={{true}} as |overlay|>
2
+ <Overlay::Header @overlay={{overlay}} @title="FleetOps Settings" @onPressCancel={{@onPressCancel}}>
3
+ <Button @icon="save" @type="primary" @text={{if (media 'isMobile') "" "Save Changes"}} @onClick={{this.saveSettings}} @isLoading={{this.isSaving}} @disabled={{or this.isLoading this.isSaving}} @isSubscriptionRequired={{true}} />
4
+ </Overlay::Header>
5
+
6
+ <Overlay::Body>
7
+ <div class="px-5 py-4">
8
+ <InputGroup @name="Default Adhoc Ping Distance" @type="number" @value={{this.company.options.fleetops.adhoc_distance}} @wrapperClass="mb-0" @helpText="This setting determines the default distance in meters adhoc orders should ping drivers within vicinity of the order pickup point." />
9
+ <div class="mt-2 px-3 py-1 rounded-lg border border-blue-600 bg-blue-100 flex items-center">
10
+ <FaIcon @icon="comment-exclamation" class="text-blue-900 mr-1.5" />
11
+ <span class="text-blue-900 text-xs">Distance must be in meters</span>
12
+ </div>
13
+ </div>
14
+ </Overlay::Body>
15
+ </Overlay>
@@ -0,0 +1,62 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+
6
+ export default class SettingsWindowComponent extends Component {
7
+ @service currentUser;
8
+ @service store;
9
+ @service notifications;
10
+
11
+ @tracked isSaving = false;
12
+ @tracked isLoading = false;
13
+ @tracked company;
14
+
15
+ @action onLoad() {
16
+ if (typeof this.args.onLoad === 'function') {
17
+ this.args.onLoad(...arguments);
18
+ }
19
+
20
+ this.fetchCurrentCompany();
21
+ }
22
+
23
+ @action fetchCurrentCompany() {
24
+ this.isLoading = true;
25
+
26
+ this.store
27
+ .findRecord('company', this.currentUser.companyId)
28
+ .then((company) => {
29
+ company.options = this.createDefaultSettings(company.options);
30
+ this.company = company;
31
+ })
32
+ .finally(() => {
33
+ this.isLoading = false;
34
+ });
35
+ }
36
+
37
+ @action createDefaultSettings(settings) {
38
+ if (!settings) {
39
+ settings = {
40
+ fleetops: {
41
+ adhoc_distance: 6000,
42
+ },
43
+ storefront: {},
44
+ };
45
+ }
46
+
47
+ return settings;
48
+ }
49
+
50
+ @action saveSettings() {
51
+ this.isSaving = true;
52
+
53
+ return this.company
54
+ .save()
55
+ .then(() => {
56
+ this.notifications.success('Settings successfully saved.');
57
+ })
58
+ .finally(() => {
59
+ this.isSaving = false;
60
+ });
61
+ }
62
+ }
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/console/components/split-grid';
@@ -0,0 +1,40 @@
1
+ <div class="quickstart-widget {{if this.isHidden 'hidden'}}" {{did-insert this.getTasks}} ...attributes>
2
+ <div class="shadow-sm content-panel">
3
+ <div class="content-panel-header">
4
+ <h3 class="text-sm font-bold dark:text-gray-100">
5
+ {{this.title}}
6
+ </h3>
7
+ </div>
8
+ <div class="text-sm content-panel-body no-padding dark:text-gray-100">
9
+ <div class="p-3">
10
+ {{#if this.isLoading}}
11
+ <div class="flex text-center items-center justify-center p-4">
12
+ <Spinner class="mr-2" />
13
+ <span>Let's see what you can do to jumpstart operations...</span>
14
+ </div>
15
+ {{else}}
16
+ <div class="space-y-3">
17
+ {{#each-in this.tasks as |action task|}}
18
+ <div
19
+ class="rounded-md bg-gray-900 px-3 py-2 flex items-center justify-between space-x-2">
20
+ <div class="flex items-center">
21
+ <div class="mr-4">
22
+ <div class="text-center flex items-center justify-center w-6">
23
+ <FaIcon @icon={{if task.should "lightbulb-exclamation" "check-circle"}} class={{if task.should "text-yellow-400" "text-green-500"}} @size="lg" />
24
+ </div>
25
+ </div>
26
+ <div class="text-gray-100">{{task.description}}</div>
27
+ </div>
28
+ <div>
29
+ {{#if task.should}}
30
+ <a href="javascript:;" class="text-yellow-700 dark:text-yellow-700 hover:text-yellow-700 font-semibold underline" {{on "click" (fn this.startTask action)}}>Start Task</a>
31
+ {{/if}}
32
+ </div>
33
+ </div>
34
+ {{/each-in}}
35
+ </div>
36
+ {{/if}}
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
@@ -0,0 +1,58 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action, computed } from '@ember/object';
5
+
6
+ export default class WidgetFleetOpsQuickstartComponent extends Component {
7
+ @service fetch;
8
+ @service hostRouter;
9
+ @tracked tasks = {};
10
+ @tracked isLoading = true;
11
+ @tracked isHidden = false;
12
+
13
+ @computed('args.title') get title() {
14
+ return this.args.title || 'Quickstart tasks for Fleet Ops';
15
+ }
16
+
17
+ @action async getTasks() {
18
+ this.tasks = await this.fetchTasks();
19
+ }
20
+
21
+ @action startTask(action) {
22
+ switch (action) {
23
+ case 'add_drivers':
24
+ break;
25
+ case 'add_fleet':
26
+ break;
27
+ case 'add_order_config':
28
+ break;
29
+ case 'add_service_area':
30
+ break;
31
+ case 'add_users':
32
+ break;
33
+ case 'add_vehicles':
34
+ break;
35
+ case 'create_first_order':
36
+ break;
37
+ }
38
+ }
39
+
40
+ fetchTasks() {
41
+ this.isLoading = true;
42
+
43
+ return new Promise((resolve) => {
44
+ this.fetch.get('actions/get-fleet-ops-quickstart-actions').then((tasks) => {
45
+ this.isLoading = false;
46
+ resolve(tasks);
47
+ });
48
+ });
49
+ }
50
+
51
+ shouldHideWidget(tasks) {
52
+ const shouldHide = Object.values(tasks).every((task) => task.should === false);
53
+
54
+ if (shouldHide) {
55
+ this.isHidden = true;
56
+ }
57
+ }
58
+ }
@@ -0,0 +1 @@
1
+ {{yield}}
@@ -0,0 +1,121 @@
1
+ <div class="key-metrics-widget" {{did-insert this.getMetrics}} ...attributes>
2
+ <div class="flex items-center">
3
+ <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100 mr-2">
4
+ {{this.title}}
5
+ </h3>
6
+ {{#if this.isLoading}}
7
+ <div>
8
+ <Spinner class="text-sky-400" />
9
+ </div>
10
+ {{/if}}
11
+ </div>
12
+ <dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-2 md:grid-cols-4">
13
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
14
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
15
+ Earnings
16
+ </dt>
17
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
18
+ {{format-currency this.metrics.earnings}}
19
+ </dd>
20
+ </div>
21
+
22
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
23
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
24
+ Fuel Expenses
25
+ </dt>
26
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
27
+ {{format-currency this.metrics.fuel_cost}}
28
+ </dd>
29
+ </div>
30
+
31
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
32
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
33
+ Distance Traveled
34
+ </dt>
35
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
36
+ {{format-meters this.metrics.distance_traveled}}
37
+ </dd>
38
+ </div>
39
+
40
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
41
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
42
+ Total Time
43
+ </dt>
44
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
45
+ {{format-duration this.metrics.total_time_traveled}}
46
+ </dd>
47
+ </div>
48
+
49
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
50
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
51
+ Orders Scheduled
52
+ </dt>
53
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
54
+ {{this.metrics.orders_scheduled}}
55
+ </dd>
56
+ </div>
57
+
58
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
59
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
60
+ Orders Completed
61
+ </dt>
62
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
63
+ {{this.metrics.orders_completed}}
64
+ </dd>
65
+ </div>
66
+
67
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
68
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
69
+ Orders In Progress
70
+ </dt>
71
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
72
+ {{this.metrics.orders_in_progress}}
73
+ </dd>
74
+ </div>
75
+
76
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
77
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
78
+ Orders Canceled
79
+ </dt>
80
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
81
+ {{this.metrics.orders_canceled}}
82
+ </dd>
83
+ </div>
84
+
85
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
86
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
87
+ Drivers Online
88
+ </dt>
89
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
90
+ {{this.metrics.drivers_online}}
91
+ </dd>
92
+ </div>
93
+
94
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
95
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
96
+ Customers
97
+ </dt>
98
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
99
+ {{this.metrics.customers}}
100
+ </dd>
101
+ </div>
102
+
103
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
104
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
105
+ Open Issue
106
+ </dt>
107
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
108
+ {{this.metrics.open_issues}}
109
+ </dd>
110
+ </div>
111
+
112
+ <div class="px-4 py-5 bg-white dark:bg-gray-900 shadow rounded-lg overflow-hidden sm:p-6">
113
+ <dt class="text-sm font-medium text-gray-500 dark:text-gray-100 truncate">
114
+ Closed Issues
115
+ </dt>
116
+ <dd class="mt-1 text-3xl font-semibold text-gray-900 dark:text-white">
117
+ {{this.metrics.resolved_issues}}
118
+ </dd>
119
+ </div>
120
+ </dl>
121
+ </div>
@@ -0,0 +1,46 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action, computed } from '@ember/object';
5
+ import moment from 'moment';
6
+
7
+ export default class WidgetKeyMetricsComponent extends Component {
8
+ @service fetch;
9
+ @tracked metrics = {
10
+ distance_traveled: 0,
11
+ total_time_traveled: 0,
12
+ drivers_online: 0,
13
+ customers: 0,
14
+ earnings: 0,
15
+ fuel_cost: 0,
16
+ orders_canceled: 0,
17
+ orders_completed: 0,
18
+ orders_in_progress: 0,
19
+ orders_scheduled: 0,
20
+ open_issues: 0,
21
+ resolved_issues: 0,
22
+ };
23
+ @tracked isLoading = true;
24
+
25
+ @computed('args.title') get title() {
26
+ return this.args.title || 'This Month';
27
+ }
28
+
29
+ @action async getMetrics() {
30
+ const start = moment().startOf('month').toString();
31
+ const end = moment().endOf('month').toString();
32
+
33
+ this.metrics = await this.fetchMetrics(start, end);
34
+ }
35
+
36
+ fetchMetrics(start, end) {
37
+ this.isLoading = true;
38
+
39
+ return new Promise((resolve) => {
40
+ this.fetch.get('actions/get-fleet-ops-key-metrics', { start, end }).then((metrics) => {
41
+ this.isLoading = false;
42
+ resolve(metrics);
43
+ });
44
+ });
45
+ }
46
+ }
@@ -0,0 +1,59 @@
1
+ <div class="shadow-sm content-panel">
2
+ <div class="content-panel-header">
3
+ <h3 class="text-sm font-bold dark:text-gray-100">
4
+ {{this.title}}
5
+ </h3>
6
+ </div>
7
+ <div class="text-sm content-panel-body no-padding dark:text-gray-100">
8
+ <div class="grid grid-cols-8">
9
+ <div class="col-span-5 border-r border-gray-900">
10
+ <LiveMap @mapClass="z-0 shadow-md rounded-bl h-screen-40 w-full" @onReady={{fn (mut this.isLoading) false}} @onRoutesLoaded={{fn (mut this.routes)}} />
11
+ </div>
12
+
13
+ <div class="col-span-3">
14
+ <div class="dark:border-gray-900 bg-gray-100 dark:bg-gray-800 shadow-sm">
15
+ {{#if this.isLoading}}
16
+ <div class="flex text-center items-center justify-center p-4">
17
+ <Spinner class="mr-2" />
18
+ <span>Loading orders in progress...</span>
19
+ </div>
20
+ {{else}}
21
+ {{#each this.routes as |route|}}
22
+ <div class="border-b border-gray-900 px-3 py-2">
23
+ <div class="flex justify-between">
24
+ <div class="flex-1">
25
+ <div class="flex justify-between border border-gray-900 bg-gray-900 shadow-sm rounded-md px-3 py-2 mb-6">
26
+ <div>
27
+ <h4 class="font-semibold mb-2">{{route.order_public_id}}</h4>
28
+ <Badge @status={{route.order_status}} @helpText={{concat "Dispatched at " route.order_dispatched_at}} />
29
+ </div>
30
+ <div>
31
+ <div>
32
+ <div class="mb-1 text-xs text-gray-100">Driver Assigned</div>
33
+ <DriverCardMini @driver={{route.driver}} />
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <div>
38
+ <HorizontalRoute @payload={{route.payload}} />
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ {{else}}
44
+ <div class="h-70 p-3 flex flex-col items-center justify-center">
45
+ <div class="mb-4">
46
+ <FaIcon @icon="satellite-dish" @size="3x" />
47
+ </div>
48
+ <div class="dark:text-gray-100 text-center">
49
+ <div class="font-semibold text-lg mb-2">No orders in progress</div>
50
+ <p class="">When orders are in progress they will display in this widget and show real time activity.</p>
51
+ </div>
52
+ </div>
53
+ {{/each}}
54
+ {{/if}}
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </div>
@@ -0,0 +1,11 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { computed } from '@ember/object';
4
+
5
+ export default class WidgetLiveOrderMapComponent extends Component {
6
+ @tracked routes = [];
7
+ @tracked isLoading = false;
8
+ @computed('args.title') get title() {
9
+ return this.args.title || 'Live Orders';
10
+ }
11
+ }
@@ -0,0 +1,35 @@
1
+ <div class="recent-orders-widget" {{did-insert this.getRecentOrders}} ...attributes>
2
+ <div class="shadow-sm content-panel">
3
+ <div class="content-panel-header">
4
+ <h3 class="text-sm font-bold dark:text-gray-100">
5
+ Recent Orders
6
+ </h3>
7
+ </div>
8
+ <div class="text-sm content-panel-body no-padding dark:text-gray-100">
9
+ {{#if this.isLoading}}
10
+ <div class="flex text-center items-center justify-center p-4">
11
+ Loading recent orders...
12
+ </div>
13
+ {{else}}
14
+ {{#each this.recentOrders as |order|}}
15
+ <div class="p-4 border-b border-gray-900 flex justify-between items-center">
16
+ <div>{{order.public_id}}</div>
17
+ <div>
18
+ <Badge @status={{order.status}} />
19
+ </div>
20
+ </div>
21
+ {{else}}
22
+ <div class="h-64 p-8 flex flex-col items-center justify-center">
23
+ <div class="mb-4">
24
+ <FaIcon @icon="calendar-exclamation" @size="3x" />
25
+ </div>
26
+ <div class="dark:text-gray-100 text-center">
27
+ <div class="font-semibold text-lg mb-2">No orders for this week</div>
28
+ <p class="">There hasn't been any orders this week, get movement going by <LinkTo @route="operations.orders.index.new">creating a new order</LinkTo> or allow your customers to submit orders via API.</p>
29
+ </div>
30
+ </div>
31
+ {{/each}}
32
+ {{/if}}
33
+ </div>
34
+ </div>
35
+ </div>
@@ -0,0 +1,24 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import moment from 'moment';
6
+
7
+ export default class WidgetRecentOrdersComponent extends Component {
8
+ @service store;
9
+ @tracked recentOrders = [];
10
+ @tracked isLoading = false;
11
+ @action async getRecentOrders() {
12
+ const start = moment().startOf('week').toString();
13
+ const end = moment().endOf('week').toString();
14
+
15
+ this.isLoading = true;
16
+ const recentOrders = await this.store.query('order', {
17
+ limit: 12,
18
+ after: start,
19
+ before: end,
20
+ });
21
+ this.isLoading = false;
22
+ this.recentOrders = recentOrders;
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ {{yield}}
@@ -0,0 +1,36 @@
1
+ <div class="recent-orders-widget" {{did-insert this.getRecentTransactions}} ...attributes>
2
+ <div class="shadow-sm content-panel">
3
+ <div class="content-panel-header">
4
+ <h3 class="text-sm font-bold dark:text-gray-100">
5
+ Recent Transactions
6
+ </h3>
7
+ </div>
8
+ <div class="text-sm content-panel-body no-padding dark:text-gray-100">
9
+ {{#if this.isLoading}}
10
+ <div class="flex text-center items-center justify-center p-4">
11
+ <Spinner class="mr-2" />
12
+ <span>Loading recent transactions...</span>
13
+ </div>
14
+ {{else}}
15
+ {{#each this.recentTransactions as |transaction|}}
16
+ <div class="p-4 border-b border-gray-900 flex justify-between items-center">
17
+ <div>{{transaction.public_id}}</div>
18
+ <div>
19
+ <Badge @status={{transaction.status}} />
20
+ </div>
21
+ </div>
22
+ {{else}}
23
+ <div class="h-64 p-8 flex flex-col items-center justify-center">
24
+ <div class="mb-4">
25
+ <FaIcon @icon="funnel-dollar" @size="3x" />
26
+ </div>
27
+ <div class="dark:text-gray-100 text-center">
28
+ <div class="font-semibold text-lg mb-2">No transactions this week</div>
29
+ <p class="">When orders are going through with service rates, Fleetbase tracks transactions automatically.</p>
30
+ </div>
31
+ </div>
32
+ {{/each}}
33
+ {{/if}}
34
+ </div>
35
+ </div>
36
+ </div>
@@ -0,0 +1,29 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import moment from 'moment';
6
+
7
+ export default class WidgetTransactionsComponent extends Component {
8
+ @service store;
9
+ @tracked recentTransactions = [];
10
+ @tracked isLoading = true;
11
+
12
+ @action async getRecentTransactions() {
13
+ const start = moment().startOf('week').toString();
14
+ const end = moment().endOf('week').toString();
15
+
16
+ this.recentTransactions = await this.fetchTransactions(start, end);
17
+ }
18
+
19
+ fetchTransactions(after, before) {
20
+ this.isLoading = true;
21
+
22
+ return new Promise((resolve) => {
23
+ this.store.query('transaction', { limit: 12, after, before }).then((recentTransactions) => {
24
+ this.isLoading = false;
25
+ resolve(recentTransactions);
26
+ });
27
+ });
28
+ }
29
+ }
@@ -0,0 +1 @@
1
+ {{yield}}
@@ -0,0 +1,3 @@
1
+ import Component from '@glimmer/component';
2
+
3
+ export default class WidgetWeeklyOrdersComponent extends Component {}