@fleetbase/fleetops-engine 0.3.1 → 0.3.3

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 (264) hide show
  1. package/addon/components/admin/visibility-controls.js +1 -0
  2. package/addon/components/contact-form-panel.hbs +82 -0
  3. package/addon/components/contact-form-panel.js +195 -0
  4. package/addon/components/contact-panel/details.hbs +36 -0
  5. package/addon/components/contact-panel/details.js +3 -0
  6. package/addon/components/contact-panel.hbs +52 -0
  7. package/addon/components/contact-panel.js +161 -0
  8. package/addon/components/driver-form-panel.hbs +39 -55
  9. package/addon/components/driver-form-panel.js +41 -0
  10. package/addon/components/driver-panel/details.hbs +2 -2
  11. package/addon/components/driver-panel.hbs +12 -10
  12. package/addon/components/driver-panel.js +13 -0
  13. package/addon/components/fleet-form-panel.hbs +28 -28
  14. package/addon/components/fleet-form-panel.js +150 -1
  15. package/addon/components/fleet-listing-panel.hbs +8 -0
  16. package/addon/components/fleet-listing-panel.js +34 -0
  17. package/addon/components/fleet-panel/details.hbs +30 -0
  18. package/addon/components/fleet-panel/driver-listing.hbs +72 -0
  19. package/addon/components/fleet-panel/driver-listing.js +149 -0
  20. package/addon/components/fleet-panel/vehicle-listing.hbs +72 -0
  21. package/addon/components/fleet-panel/vehicle-listing.js +149 -0
  22. package/addon/components/fleet-panel.hbs +12 -58
  23. package/addon/components/fleet-panel.js +148 -26
  24. package/addon/components/fleet-vehicle-listing.hbs +0 -1
  25. package/addon/components/fuel-report-form-panel.hbs +41 -0
  26. package/addon/components/fuel-report-form-panel.js +122 -0
  27. package/addon/components/fuel-report-panel/details.hbs +38 -0
  28. package/addon/components/fuel-report-panel.hbs +30 -0
  29. package/addon/components/fuel-report-panel.js +161 -0
  30. package/addon/components/issue-form-panel.hbs +85 -0
  31. package/addon/components/issue-form-panel.js +211 -0
  32. package/addon/components/issue-panel/details.hbs +48 -0
  33. package/addon/components/issue-panel.hbs +30 -0
  34. package/addon/components/issue-panel.js +160 -0
  35. package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
  36. package/addon/components/layout/fleet-ops-sidebar.js +2 -1
  37. package/addon/components/live-map-drawer/driver-listing.hbs +6 -0
  38. package/addon/components/live-map-drawer/driver-listing.js +240 -0
  39. package/addon/components/live-map-drawer/place-listing.hbs +6 -0
  40. package/addon/components/live-map-drawer/place-listing.js +204 -0
  41. package/addon/components/live-map-drawer/vehicle-listing.hbs +6 -0
  42. package/addon/components/live-map-drawer/vehicle-listing.js +216 -0
  43. package/addon/components/live-map-drawer.hbs +17 -0
  44. package/addon/components/live-map-drawer.js +104 -0
  45. package/addon/components/live-map.hbs +5 -1
  46. package/addon/components/live-map.js +109 -15
  47. package/addon/components/map-container/toolbar.hbs +15 -9
  48. package/addon/components/map-container/topbar.hbs +1 -1
  49. package/addon/components/modals/issue-details.hbs +38 -0
  50. package/addon/components/modals/issue-from.hbs +138 -0
  51. package/addon/components/modals/order-event.hbs +1 -1
  52. package/addon/components/order/schedule-card.hbs +4 -4
  53. package/addon/components/order/schedule-card.js +13 -6
  54. package/addon/components/place-form-panel.hbs +50 -0
  55. package/addon/components/place-form-panel.js +134 -0
  56. package/addon/components/place-panel/details.hbs +95 -0
  57. package/addon/components/place-panel.hbs +30 -0
  58. package/addon/components/place-panel.js +161 -0
  59. package/addon/components/vehicle-form-panel.hbs +35 -44
  60. package/addon/components/vehicle-form-panel.js +41 -0
  61. package/addon/components/vehicle-panel/details.hbs +8 -2
  62. package/addon/components/vehicle-panel.hbs +8 -6
  63. package/addon/components/vendor-form-panel/create-form.hbs +114 -0
  64. package/addon/components/vendor-form-panel/create-form.js +158 -0
  65. package/addon/components/vendor-form-panel/edit-form.hbs +98 -0
  66. package/addon/components/vendor-form-panel/edit-form.js +51 -0
  67. package/addon/components/vendor-form-panel.hbs +48 -0
  68. package/addon/components/vendor-form-panel.js +226 -0
  69. package/addon/components/vendor-panel/details.hbs +77 -0
  70. package/addon/components/vendor-panel/details.js +12 -0
  71. package/addon/components/vendor-panel.hbs +58 -0
  72. package/addon/components/vendor-panel.js +161 -0
  73. package/addon/controllers/management/contacts/index/details.js +55 -0
  74. package/addon/controllers/management/contacts/index/edit.js +111 -0
  75. package/addon/controllers/management/contacts/index/new.js +88 -0
  76. package/addon/controllers/management/contacts/index.js +23 -128
  77. package/addon/controllers/management/drivers/index/new.js +2 -2
  78. package/addon/controllers/management/drivers/index.js +18 -32
  79. package/addon/controllers/management/fleets/index/details.js +53 -0
  80. package/addon/controllers/management/fleets/index/edit.js +75 -41
  81. package/addon/controllers/management/fleets/index/new.js +42 -57
  82. package/addon/controllers/management/fleets/index.js +0 -1
  83. package/addon/controllers/management/fuel-reports/index/details.js +63 -0
  84. package/addon/controllers/management/fuel-reports/index/edit.js +111 -0
  85. package/addon/controllers/management/fuel-reports/index/new.js +95 -0
  86. package/addon/controllers/management/fuel-reports/index.js +57 -127
  87. package/addon/controllers/management/issues/index/details.js +54 -0
  88. package/addon/controllers/management/issues/index/edit.js +111 -0
  89. package/addon/controllers/management/issues/index/new.js +94 -0
  90. package/addon/controllers/management/issues/index.js +131 -26
  91. package/addon/controllers/management/places/index/details.js +55 -0
  92. package/addon/controllers/management/places/index/edit.js +111 -0
  93. package/addon/controllers/management/places/index/new.js +88 -0
  94. package/addon/controllers/management/places/index.js +21 -182
  95. package/addon/controllers/management/vehicles/index/new.js +2 -6
  96. package/addon/controllers/management/vendors/index/details.js +55 -0
  97. package/addon/controllers/management/vendors/index/edit.js +111 -0
  98. package/addon/controllers/management/vendors/index/new.js +88 -0
  99. package/addon/controllers/management/vendors/index.js +43 -247
  100. package/addon/controllers/operations/orders/index.js +29 -15
  101. package/addon/controllers/operations/scheduler/index.js +45 -30
  102. package/addon/routes/management/contacts/index/details.js +14 -0
  103. package/addon/routes/management/contacts/index/edit.js +10 -0
  104. package/addon/routes/management/contacts/index/new.js +3 -0
  105. package/addon/routes/management/contacts/index.js +1 -1
  106. package/addon/routes/management/fleets/index/details.js +1 -1
  107. package/addon/routes/management/fleets/index/edit.js +1 -1
  108. package/addon/routes/management/fleets/index.js +1 -1
  109. package/addon/routes/management/fuel-reports/index/details.js +14 -0
  110. package/addon/routes/management/fuel-reports/index/edit.js +10 -0
  111. package/addon/routes/management/fuel-reports/index/new.js +3 -0
  112. package/addon/routes/management/fuel-reports/index.js +3 -1
  113. package/addon/routes/management/issues/index/details.js +14 -0
  114. package/addon/routes/management/issues/index/edit.js +10 -0
  115. package/addon/routes/management/issues/index/new.js +3 -0
  116. package/addon/routes/management/issues/index.js +1 -1
  117. package/addon/routes/management/places/index/details.js +14 -0
  118. package/addon/routes/management/places/index/edit.js +10 -0
  119. package/addon/routes/management/places/index/new.js +3 -0
  120. package/addon/routes/management/places/index.js +6 -1
  121. package/addon/routes/management/vendors/index/details.js +15 -0
  122. package/addon/routes/management/vendors/index/edit.js +11 -0
  123. package/addon/routes/management/vendors/index/new.js +3 -0
  124. package/addon/routes/management/vendors/index.js +1 -0
  125. package/addon/routes/operations/scheduler/index.js +25 -0
  126. package/addon/routes.js +27 -7
  127. package/addon/services/context-panel.js +60 -0
  128. package/addon/styles/fleetops-engine.css +28 -0
  129. package/addon/templates/management/contacts/index/details.hbs +1 -0
  130. package/addon/templates/management/contacts/index/edit.hbs +1 -0
  131. package/addon/templates/management/contacts/index/new.hbs +1 -0
  132. package/addon/templates/management/contacts/index.hbs +22 -3
  133. package/addon/templates/management/drivers/index.hbs +29 -5
  134. package/addon/templates/management/fleets/index/details.hbs +1 -1
  135. package/addon/templates/management/fleets/index/edit.hbs +1 -1
  136. package/addon/templates/management/fleets/index/new.hbs +1 -1
  137. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  138. package/addon/templates/management/fuel-reports/index/edit.hbs +1 -0
  139. package/addon/templates/management/fuel-reports/index/new.hbs +1 -0
  140. package/addon/templates/management/fuel-reports/index.hbs +25 -4
  141. package/addon/templates/management/issues/index/details.hbs +1 -0
  142. package/addon/templates/management/issues/index/edit.hbs +1 -0
  143. package/addon/templates/management/issues/index/new.hbs +1 -0
  144. package/addon/templates/management/issues/index.hbs +5 -3
  145. package/addon/templates/management/places/index/details.hbs +1 -0
  146. package/addon/templates/management/places/index/edit.hbs +1 -0
  147. package/addon/templates/management/places/index/new.hbs +1 -0
  148. package/addon/templates/management/vendors/index/details.hbs +1 -0
  149. package/addon/templates/management/vendors/index/edit.hbs +1 -0
  150. package/addon/templates/management/vendors/index/new.hbs +1 -0
  151. package/addon/templates/operations/orders/index.hbs +5 -5
  152. package/addon/templates/operations/scheduler/index.hbs +33 -9
  153. package/addon/utils/create-full-calendar-event-from-order.js +8 -0
  154. package/app/components/contact-form-panel.js +1 -0
  155. package/app/components/contact-panel/details.js +1 -0
  156. package/app/components/contact-panel.js +1 -0
  157. package/app/components/{full-calendar/draggable.js → fleet-listing-panel.js} +1 -1
  158. package/app/components/fleet-panel/details.js +1 -0
  159. package/app/components/fleet-panel/driver-listing.js +1 -0
  160. package/app/components/fleet-panel/vehicle-listing.js +1 -0
  161. package/app/components/fuel-report-form-panel.js +1 -0
  162. package/app/components/{full-calendar.js → fuel-report-panel.js} +1 -1
  163. package/app/components/issue-form-panel.js +1 -0
  164. package/app/components/issue-panel.js +1 -0
  165. package/app/components/live-map-drawer/driver-listing.js +1 -0
  166. package/app/components/live-map-drawer/place-listing.js +1 -0
  167. package/app/components/live-map-drawer/vehicle-listing.js +1 -0
  168. package/app/components/live-map-drawer.js +1 -0
  169. package/app/components/place-form-panel.js +1 -0
  170. package/app/components/place-panel.js +1 -0
  171. package/app/components/vendor-form-panel/create-form.js +1 -0
  172. package/app/components/vendor-form-panel/edit-form.js +1 -0
  173. package/app/components/vendor-form-panel.js +1 -0
  174. package/app/components/vendor-panel/details.js +1 -0
  175. package/app/components/vendor-panel.js +1 -0
  176. package/app/controllers/management/contacts/index/details.js +1 -0
  177. package/app/controllers/management/contacts/index/edit.js +1 -0
  178. package/app/controllers/management/contacts/index/new.js +1 -0
  179. package/app/controllers/management/fuel-reports/index/details.js +1 -0
  180. package/app/controllers/management/fuel-reports/index/edit.js +1 -0
  181. package/app/controllers/management/fuel-reports/index/new.js +1 -0
  182. package/app/controllers/management/issues/index/details.js +1 -0
  183. package/app/controllers/management/issues/index/edit.js +1 -0
  184. package/app/controllers/management/issues/index/new.js +1 -0
  185. package/app/controllers/management/places/index/details.js +1 -0
  186. package/app/controllers/management/places/index/edit.js +1 -0
  187. package/app/controllers/management/places/index/new.js +1 -0
  188. package/app/controllers/management/vendors/index/edit.js +1 -0
  189. package/app/controllers/management/vendors/index/new.js +1 -0
  190. package/app/routes/addon/routes/management/places/index/new.js +1 -0
  191. package/app/routes/management/contacts/index/details.js +1 -0
  192. package/app/routes/management/contacts/index/edit.js +1 -0
  193. package/app/routes/management/contacts/index/new.js +1 -0
  194. package/app/routes/management/fuel-reports/index/details.js +1 -0
  195. package/app/routes/management/fuel-reports/index/edit.js +1 -0
  196. package/app/routes/management/fuel-reports/index/new.js +1 -0
  197. package/app/routes/management/issues/index/details.js +1 -0
  198. package/app/routes/management/issues/index/edit.js +1 -0
  199. package/app/routes/management/issues/index/new.js +1 -0
  200. package/app/routes/management/places/index/details.js +1 -0
  201. package/app/routes/management/places/index/edit.js +1 -0
  202. package/app/routes/management/places/index/new.js +1 -0
  203. package/app/routes/management/vendors/index/details.js +1 -0
  204. package/app/routes/management/vendors/index/edit.js +1 -0
  205. package/app/routes/management/vendors/index/new.js +1 -0
  206. package/app/templates/addon/routes/management/places/index/new.js +1 -0
  207. package/app/templates/management/contacts/index/details.js +1 -0
  208. package/app/templates/management/contacts/index/edit.js +1 -0
  209. package/app/templates/management/contacts/index/new.js +1 -0
  210. package/app/templates/management/fuel-reports/index/details.js +1 -0
  211. package/app/templates/management/fuel-reports/index/edit.js +1 -0
  212. package/app/templates/management/fuel-reports/index/new.js +1 -0
  213. package/app/templates/management/issues/index/details.js +1 -0
  214. package/app/templates/management/issues/index/edit.js +1 -0
  215. package/app/templates/management/issues/index/new.js +1 -0
  216. package/app/templates/management/places/index/details.js +1 -0
  217. package/app/templates/management/places/index/edit.js +1 -0
  218. package/app/templates/management/places/index/new.js +1 -0
  219. package/app/templates/management/vendors/index/details.js +1 -0
  220. package/app/templates/management/vendors/index/edit.js +1 -0
  221. package/app/templates/management/vendors/index/new.js +1 -0
  222. package/app/utils/create-full-calendar-event-from-order.js +1 -0
  223. package/composer.json +1 -1
  224. package/config/environment.js +2 -1
  225. package/extension.json +1 -1
  226. package/package.json +5 -4
  227. package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +42 -0
  228. package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +38 -0
  229. package/server/src/Casts/Point.php +15 -1
  230. package/server/src/Http/Controllers/Internal/v1/DriverController.php +33 -15
  231. package/server/src/Http/Filter/FleetFilter.php +7 -0
  232. package/server/src/Http/Filter/FuelReportFilter.php +58 -0
  233. package/server/src/Http/Filter/IssueFilter.php +69 -0
  234. package/server/src/Http/Filter/VehicleFilter.php +10 -0
  235. package/server/src/Http/Middleware/TransformLocationMiddleware.php +48 -0
  236. package/server/src/Http/Resources/v1/Driver.php +1 -0
  237. package/server/src/Http/Resources/v1/Fleet.php +20 -21
  238. package/server/src/Http/Resources/v1/FuelReport.php +37 -35
  239. package/server/src/Http/Resources/v1/Issue.php +77 -0
  240. package/server/src/Http/Resources/v1/ParentFleet.php +60 -0
  241. package/server/src/Http/Resources/v1/SubFleet.php +60 -0
  242. package/server/src/Http/Resources/v1/Vehicle.php +4 -2
  243. package/server/src/Integrations/Lalamove/Lalamove.php +6 -6
  244. package/server/src/Models/Contact.php +7 -0
  245. package/server/src/Models/Driver.php +1 -1
  246. package/server/src/Models/Fleet.php +35 -4
  247. package/server/src/Models/FuelReport.php +53 -3
  248. package/server/src/Models/Issue.php +106 -7
  249. package/server/src/Models/Order.php +22 -0
  250. package/server/src/Models/Vehicle.php +1 -1
  251. package/server/src/Models/VehicleDevice.php +4 -2
  252. package/server/src/Models/VehicleDeviceEvent.php +8 -4
  253. package/server/src/Notifications/OrderAssigned.php +0 -6
  254. package/server/src/Notifications/OrderCanceled.php +0 -6
  255. package/server/src/Notifications/OrderDispatchFailed.php +0 -6
  256. package/server/src/Notifications/OrderDispatched.php +0 -6
  257. package/server/src/Notifications/OrderPing.php +0 -6
  258. package/server/src/Notifications/OrderSplit.php +0 -6
  259. package/server/src/Observers/FleetObserver.php +19 -0
  260. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  261. package/server/src/Providers/NotificationServiceProvider.php +1 -1
  262. package/server/src/routes.php +2 -2
  263. package/addon/components/full-calendar/draggable.js +0 -1
  264. package/addon/components/full-calendar.js +0 -1
@@ -3,11 +3,8 @@ import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
5
5
  import { isBlank } from '@ember/utils';
6
- import { isArray } from '@ember/array';
7
- import { capitalize } from '@ember/string';
8
6
  import { timeout } from 'ember-concurrency';
9
7
  import { task } from 'ember-concurrency-decorators';
10
- import apiUrl from '@fleetbase/ember-core/utils/api-url';
11
8
 
12
9
  export default class ManagementVendorsIndexController extends Controller {
13
10
  /**
@@ -133,6 +130,7 @@ export default class ManagementVendorsIndexController extends Controller {
133
130
  valuePath: 'name',
134
131
  width: '180px',
135
132
  cellComponent: 'table/cell/media-name',
133
+ mediaPath: 'logo_url',
136
134
  action: this.viewVendor,
137
135
  resizable: true,
138
136
  sortable: true,
@@ -305,24 +303,6 @@ export default class ManagementVendorsIndexController extends Controller {
305
303
  this.query = value;
306
304
  }
307
305
 
308
- /**
309
- * Bulk deletes selected `driver` via confirm prompt
310
- *
311
- * @param {Array} selected an array of selected models
312
- * @void
313
- */
314
- @action bulkDeleteVendors() {
315
- const selected = this.table.selectedRows;
316
-
317
- this.crud.bulkDelete(selected, {
318
- modelNamePath: `name`,
319
- acceptButtonText: 'Delete Vendors',
320
- onSuccess: () => {
321
- return this.hostRouter.refresh();
322
- },
323
- });
324
- }
325
-
326
306
  /**
327
307
  * Toggles dialog to export `vendor`
328
308
  *
@@ -336,225 +316,29 @@ export default class ManagementVendorsIndexController extends Controller {
336
316
  * View a `vendor` details in modal
337
317
  *
338
318
  * @param {VendorModel} vendor
339
- * @param {Object} options
340
319
  * @void
341
320
  */
342
- @action viewVendor(vendor, options) {
343
- const isIntegratedVendor = vendor.get('type') === 'integrated-vendor';
344
-
345
- this.modalsManager.show('modals/vendor-details', {
346
- title: vendor.name,
347
- titleComponent: 'modal/title-with-buttons',
348
- acceptButtonText: 'Done',
349
- hideDeclineButton: true,
350
- headerButtons: [
351
- {
352
- icon: 'cog',
353
- iconPrefix: 'fas',
354
- type: 'link',
355
- size: 'xs',
356
- options: [
357
- {
358
- title: 'Edit Vendor',
359
- action: () => {
360
- this.modalsManager.done().then(() => {
361
- return this.editVendor(vendor, {
362
- onFinish: () => {
363
- this.viewVendor(vendor);
364
- },
365
- });
366
- });
367
- },
368
- },
369
- {
370
- title: 'Delete Vendor',
371
- action: () => {
372
- this.modalsManager.done().then(() => {
373
- return this.deleteVendor(vendor, {
374
- onDecline: () => {
375
- this.viewVendor(vendor);
376
- },
377
- });
378
- });
379
- },
380
- },
381
- ],
382
- },
383
- ],
384
- isIntegratedVendor,
385
- vendor,
386
- ...options,
387
- });
321
+ @action viewVendor(vendor) {
322
+ return this.transitionToRoute('management.vendors.index.details', vendor);
388
323
  }
389
324
 
390
325
  /**
391
326
  * Create a new `vendor` in modal
392
327
  *
393
- * @param {Object} options
394
328
  * @void
395
329
  */
396
330
  @action async createVendor() {
397
- const vendor = this.store.createRecord('vendor', { status: 'active' });
398
- const supportedIntegratedVendors = await this.fetch.get('integrated-vendors/supported');
399
-
400
- return this.editVendor(vendor, {
401
- title: 'New Vendor',
402
- acceptButtonText: 'Confirm & Create',
403
- acceptButtonIcon: 'check',
404
- acceptButtonIconPrefix: 'fas',
405
- action: 'select',
406
- supportedIntegratedVendors,
407
- selectedIntegratedVendor: null,
408
- integratedVendor: null,
409
- selectIntegratedVendor: (integratedVendor) => {
410
- this.modalsManager.setOption('selectedIntegratedVendor', integratedVendor);
411
-
412
- const { credential_params, option_params } = integratedVendor;
413
-
414
- // create credentials object
415
- const credentials = {};
416
- if (isArray(integratedVendor.credential_params)) {
417
- for (let i = 0; i < integratedVendor.credential_params.length; i++) {
418
- const param = integratedVendor.credential_params.objectAt(i);
419
- credentials[param] = null;
420
- }
421
- }
422
-
423
- // create options object
424
- const options = {};
425
- if (isArray(integratedVendor.option_params)) {
426
- for (let i = 0; i < integratedVendor.option_params.length; i++) {
427
- const param = integratedVendor.option_params.objectAt(i);
428
- options[param.key] = null;
429
- }
430
- }
431
-
432
- const vendor = this.store.createRecord('integrated-vendor', {
433
- provider: integratedVendor.code,
434
- webhook_url: apiUrl(`listeners/${integratedVendor.code}`),
435
- credentials: {},
436
- options: {},
437
- credential_params,
438
- option_params,
439
- });
440
-
441
- this.modalsManager.setOption('integratedVendor', vendor);
442
- },
443
- successNotification: (vendor) => `New vendor '${vendor.name}' successfully created.`,
444
- });
331
+ return this.transitionToRoute('management.vendors.index.new');
445
332
  }
446
333
 
447
334
  /**
448
335
  * Edit a `vendor` details
449
336
  *
450
337
  * @param {VendorModel} vendor
451
- * @param {Object} options
452
338
  * @void
453
339
  */
454
- @action editVendor(vendor, options = {}) {
455
- const editVendorOptions = options;
456
- const isIntegratedVendor = vendor.get('type') === 'integrated-vendor';
457
-
458
- this.modalsManager.show('modals/vendor-form', {
459
- title: isIntegratedVendor ? 'Integrated Vendor Settings' : 'Edit Vendor',
460
- acceptButtonText: 'Save Changes',
461
- acceptButtonIcon: 'save',
462
- declineButtonIcon: 'times',
463
- declineButtonIconPrefix: 'fas',
464
- isIntegratedVendor,
465
- vendor,
466
- showAdvancedOptions: false,
467
- isEditingCredentials: false,
468
- toggleCredentialsReset: () => {
469
- const isEditingCredentials = this.modalsManager.getOption('isEditingCredentials');
470
-
471
- if (isEditingCredentials) {
472
- this.modalsManager.setOption('isEditingCredentials', false);
473
- } else {
474
- this.modalsManager.setOption('isEditingCredentials', true);
475
- }
476
- },
477
- toggleAdvancedOptions: () => {
478
- const showAdvancedOptions = this.modalsManager.getOption('showAdvancedOptions');
479
-
480
- if (showAdvancedOptions) {
481
- this.modalsManager.setOption('showAdvancedOptions', false);
482
- } else {
483
- this.modalsManager.setOption('showAdvancedOptions', true);
484
- }
485
- },
486
- selectAddress: (place) => {
487
- vendor.setProperties({
488
- place_uuid: place.id,
489
- place: place,
490
- country: place.country,
491
- });
492
- },
493
- editAddress: () => {
494
- return this.editVendorPlace(vendor, {
495
- onFinish: () => {
496
- this.editVendor(vendor, editVendorOptions);
497
- },
498
- });
499
- },
500
- newAddress: () => {
501
- return this.createVendorPlace(vendor, {
502
- onConfirm: (place) => {
503
- vendor.set('place_uuid', place.id);
504
- vendor.save();
505
- },
506
- onFinish: () => {
507
- this.modalsManager.done().then(() => {
508
- this.editVendor(vendor, editVendorOptions);
509
- });
510
- },
511
- });
512
- },
513
- confirm: (modal) => {
514
- modal.startLoading();
515
-
516
- const isAddingIntegratedVendor = modal.getOption('action') !== undefined && modal.getOption('integratedVendor')?.isNew;
517
-
518
- if (isAddingIntegratedVendor) {
519
- const integratedVendor = modal.getOption('integratedVendor');
520
-
521
- return integratedVendor
522
- .save()
523
- .then((integratedVendor) => {
524
- this.notifications.success(`Successfully added ${capitalize(integratedVendor.provider)} new integrated vendor`);
525
-
526
- return this.hostRouter.refresh();
527
- })
528
- .catch((error) => {
529
- this.notifications.serverError(error, {
530
- clearDuration: 600 * 6,
531
- });
532
- })
533
- .finally(() => {
534
- modal.stopLoading();
535
- });
536
- }
537
-
538
- return vendor
539
- .save()
540
- .then((vendor) => {
541
- if (typeof options.successNotification === 'function') {
542
- this.notifications.success(options.successNotification(vendor));
543
- } else {
544
- this.notifications.success(options.successNotification || `${vendor.name} details updated.`);
545
- }
546
-
547
- return this.hostRouter.refresh();
548
- })
549
- .catch((error) => {
550
- this.notifications.serverError(error);
551
- })
552
- .finally(() => {
553
- modal.stopLoading();
554
- });
555
- },
556
- ...options,
557
- });
340
+ @action editVendor(vendor) {
341
+ return this.transitionToRoute('management.vendors.index.edit', vendor);
558
342
  }
559
343
 
560
344
  /**
@@ -575,19 +359,20 @@ export default class ManagementVendorsIndexController extends Controller {
575
359
  }
576
360
 
577
361
  /**
578
- * View information about the vendors place
362
+ * Bulk deletes selected `vendor` via confirm prompt
579
363
  *
580
- * @param {VendorModel} vendor
581
- * @param {Object} options
364
+ * @param {Array} selected an array of selected models
582
365
  * @void
583
366
  */
584
- @action async viewVendorPlace(vendor, options = {}) {
585
- this.modalsManager.displayLoader();
586
-
587
- const place = await this.store.findRecord('place', vendor.place_uuid);
367
+ @action bulkDeleteVendors() {
368
+ const selected = this.table.selectedRows;
588
369
 
589
- this.modalsManager.done().then(() => {
590
- return this.places.viewPlace(place, options);
370
+ this.crud.bulkDelete(selected, {
371
+ modelNamePath: `name`,
372
+ acceptButtonText: 'Delete Vendors',
373
+ onSuccess: () => {
374
+ return this.hostRouter.refresh();
375
+ },
591
376
  });
592
377
  }
593
378
 
@@ -595,33 +380,44 @@ export default class ManagementVendorsIndexController extends Controller {
595
380
  * View information about the vendors place
596
381
  *
597
382
  * @param {VendorModel} vendor
598
- * @param {Object} options
599
383
  * @void
600
384
  */
601
- @action async editVendorPlace(vendor, options = {}) {
602
- this.modalsManager.displayLoader();
385
+ @action async viewVendorPlace(vendor) {
386
+ const place = await this.store.findRecord('place', vendor.place_uuid);
603
387
 
604
- const place = await this.store.findRecord('place', vendor.get('place_uuid'));
605
- await this.modalsManager.done({ skipCallbacks: true });
388
+ if (place) {
389
+ this.contextPanel.focus(place);
390
+ }
391
+ }
606
392
 
607
- this.modalsManager.done({ skipCallbacks: true }).then(() => {
608
- return this.places.editPlace(place, options);
609
- });
393
+ /**
394
+ * Edit a vendor's current place
395
+ *
396
+ * @param {VendorModel} vendor
397
+ * @void
398
+ */
399
+ @action async editVendorPlace(vendor) {
400
+ const place = await this.store.findRecord('place', vendor.place_uuid);
401
+
402
+ if (place) {
403
+ this.contextPanel.focus(place, 'editing');
404
+ }
610
405
  }
611
406
 
612
407
  /**
613
- * View information about the vendors place
408
+ * Create a new place for a vendor.
614
409
  *
615
- * @param {DriverModel} driver
616
- * @param {Object} options
410
+ * @param {VendorModel} vendor
617
411
  * @void
618
412
  */
619
- @action async createVendorPlace(vendor, options = {}) {
620
- this.modalsManager.displayLoader();
621
- await this.modalsManager.done();
413
+ @action async createVendorPlace(vendor) {
414
+ const place = this.store.createRecord('place');
622
415
 
623
- this.modalsManager.done().then(() => {
624
- return this.places.createPlace(options);
416
+ this.contextPanel.focus(place, 'editing', {
417
+ onAfterSave: (place) => {
418
+ vendor.set('place_uuid', place.id);
419
+ vendor.save();
420
+ },
625
421
  });
626
422
  }
627
423
  }
@@ -1,4 +1,4 @@
1
- import Controller, { inject as controller } from '@ember/controller';
1
+ import Controller from '@ember/controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
@@ -9,20 +9,6 @@ import { timeout } from 'ember-concurrency';
9
9
  import { task } from 'ember-concurrency-decorators';
10
10
 
11
11
  export default class OperationsOrdersIndexController extends Controller {
12
- /**
13
- * Injection of the `ManagementDriversIndexController` controller
14
- *
15
- * @memberof OperationsOrdersIndexController
16
- */
17
- @controller('management.drivers.index') driversController;
18
-
19
- /**
20
- * Injection of the `ManagementFleetIndexController` controller
21
- *
22
- * @memberof OperationsOrdersIndexController
23
- */
24
- @controller('management.fleets.index') fleetController;
25
-
26
12
  /**
27
13
  * Inject the `currentUser` service
28
14
  *
@@ -266,6 +252,13 @@ export default class OperationsOrdersIndexController extends Controller {
266
252
  */
267
253
  @tracked leafletMap;
268
254
 
255
+ /**
256
+ * Reference to the drawer context API.
257
+ *
258
+ * @type {Object}
259
+ */
260
+ @tracked drawer;
261
+
269
262
  /**
270
263
  * Current layout type (e.g., 'map', 'table', 'kanban', 'analytics')
271
264
  *
@@ -722,6 +715,27 @@ export default class OperationsOrdersIndexController extends Controller {
722
715
  this.liveMap = liveMap;
723
716
  }
724
717
 
718
+ /**
719
+ * Sets the drawer component context api.
720
+ *
721
+ * @param {Object} drawerApi
722
+ * @memberof OperationsOrdersIndexController
723
+ */
724
+ @action setDrawerContext(drawerApi) {
725
+ this.drawer = drawerApi;
726
+ }
727
+
728
+ /**
729
+ * Toggles the LiveMap drawer component.
730
+ *
731
+ * @memberof OperationsOrdersIndexController
732
+ */
733
+ @action onPressLiveMapDrawerToggle() {
734
+ if (this.drawer) {
735
+ this.drawer.toggleMinimize();
736
+ }
737
+ }
738
+
725
739
  /**
726
740
  * Exports all orders.
727
741
  * @action
@@ -1,31 +1,26 @@
1
1
  import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
2
3
  import { inject as service } from '@ember/service';
3
- import { computed, action } from '@ember/object';
4
+ import { action } from '@ember/object';
4
5
  import { format, isValid as isValidDate } from 'date-fns';
6
+ import createFullCalendarEventFromOrder from '../../../utils/create-full-calendar-event-from-order';
5
7
 
6
8
  export default class OperationsSchedulerIndexController extends Controller {
7
9
  @service modalsManager;
8
10
  @service notifications;
9
-
10
- @computed('model.@each.scheduled_at') get scheduledOrders() {
11
- return this.model.filter((order) => isValidDate(order.scheduled_at));
12
- }
13
-
14
- @computed('model.@each.scheduled_at') get unscheduledOrders() {
15
- return this.model.filter((order) => !order.scheduled_at);
16
- }
17
-
18
- @computed('scheduledOrders.@each.scheduled_at') get events() {
19
- return this.scheduledOrders.map((order) => ({
20
- id: order.id,
21
- title: `${order.scheduledAtTime} - ${order.public_id}`,
22
- start: order.scheduled_at,
23
- allDay: true,
24
- }));
11
+ @service store;
12
+ @service hostRouter;
13
+ @tracked scheduledOrders = [];
14
+ @tracked unscheduledOrders = [];
15
+ @tracked events = [];
16
+
17
+ @action setCalendarApi(calendar) {
18
+ this.calendar = calendar;
25
19
  }
26
20
 
27
- @action viewEvent(order, eventClickInfo) {
28
- const { event } = eventClickInfo;
21
+ @action viewEvent(order) {
22
+ // get the event from the calendar
23
+ let event = this.calendar.getEventById(order.id);
29
24
 
30
25
  this.modalsManager.show('modals/order-event', {
31
26
  title: `Scheduling for ${order.public_id}`,
@@ -34,7 +29,7 @@ export default class OperationsSchedulerIndexController extends Controller {
34
29
  hideDeclineButton: true,
35
30
  order,
36
31
  reschedule: (date) => {
37
- if (typeof date?.toDate === 'function') {
32
+ if (date && typeof date.toDate === 'function') {
38
33
  date = date.toDate();
39
34
  }
40
35
 
@@ -51,15 +46,27 @@ export default class OperationsSchedulerIndexController extends Controller {
51
46
  }
52
47
 
53
48
  return order.save().then((order) => {
54
- this.notifications.success(`'${order.public_id}' has been updated.`);
49
+ // remove event from calendar
50
+ if (event) {
51
+ event.remove();
52
+ }
55
53
 
56
- // update event props
57
- event?.setProp('title', order.eventTitle);
54
+ if (order.scheduled_at) {
55
+ // notify order has been scheduled
56
+ this.notifications.success(`Order '${order.public_id}' has been scheduled at ${order.scheduledAt}.`);
57
+ // add event to calendar
58
+ event = this.calendar.addEvent(createFullCalendarEventFromOrder(order));
59
+ } else {
60
+ this.notifications.info(`Order '${order.public_id}' has been unscheduled.`);
61
+ }
58
62
 
59
- // remove event from calendar if unscheduled
60
- if (!order.scheduled_at || !isValidDate(order.scheduled_at)) {
61
- event.remove();
63
+ // update event props
64
+ if (event && typeof event.setProp === 'function') {
65
+ event.setProp('title', order.eventTitle);
62
66
  }
67
+
68
+ // refresh route
69
+ this.hostRouter.refresh();
63
70
  });
64
71
  },
65
72
  });
@@ -80,7 +87,9 @@ export default class OperationsSchedulerIndexController extends Controller {
80
87
  const order = this.store.peekRecord('order', data.id);
81
88
 
82
89
  order.set('scheduled_at', date);
83
- order.save();
90
+ return order.save().then(() => {
91
+ this.hostRouter.refresh();
92
+ });
84
93
  }
85
94
 
86
95
  @action receivedEvent(eventReceivedInfo) {
@@ -88,7 +97,9 @@ export default class OperationsSchedulerIndexController extends Controller {
88
97
  const order = this.store.peekRecord('order', event.id);
89
98
 
90
99
  // update event props
91
- event?.setProp('title', order.eventTitle);
100
+ if (typeof event.setProp === 'function') {
101
+ event.setProp('title', order.eventTitle);
102
+ }
92
103
  }
93
104
 
94
105
  @action rescheduleEventFromDrag(eventDropInfo) {
@@ -102,9 +113,13 @@ export default class OperationsSchedulerIndexController extends Controller {
102
113
 
103
114
  // set and save order props
104
115
  order.set('scheduled_at', isValidDate(newDate) ? newDate : start);
105
- order.save();
116
+ order.save().then(() => {
117
+ this.hostRouter.refresh();
118
+ });
106
119
 
107
120
  // update event props
108
- event?.setProp('title', order.eventTitle);
121
+ if (typeof event.setProp === 'function') {
122
+ event.setProp('title', order.eventTitle);
123
+ }
109
124
  }
110
125
  }
@@ -0,0 +1,14 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ManagementContactsIndexDetailsRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ view: { refreshModel: false },
9
+ };
10
+
11
+ model({ public_id }) {
12
+ return this.store.findRecord('contact', public_id);
13
+ }
14
+ }
@@ -0,0 +1,10 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ManagementContactsIndexEditRoute extends Route {
5
+ @service store;
6
+
7
+ model({ public_id }) {
8
+ return this.store.findRecord('contact', public_id);
9
+ }
10
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ManagementContactsIndexNewRoute extends Route {}
@@ -18,6 +18,6 @@ export default class ManagementContactsIndexRoute extends Route {
18
18
  };
19
19
 
20
20
  model(params) {
21
- return this.store.query('contact', { ...params });
21
+ return this.store.query('contact', params);
22
22
  }
23
23
  }
@@ -4,6 +4,6 @@ export default class ManagementFleetsIndexDetailsRoute extends Route {
4
4
  @service store;
5
5
 
6
6
  model({ public_id }) {
7
- return this.store.findRecord('fleet', public_id);
7
+ return this.store.queryRecord('fleet', { public_id, single: true, with: ['parent_fleet', 'service_area', 'zone'] });
8
8
  }
9
9
  }
@@ -4,6 +4,6 @@ export default class ManagementFleetsIndexEditRoute extends Route {
4
4
  @service store;
5
5
 
6
6
  model({ public_id }) {
7
- return this.store.findRecord('fleet', public_id);
7
+ return this.store.queryRecord('fleet', { public_id, single: true, with: ['parent_fleet', 'service_area', 'zone'] });
8
8
  }
9
9
  }
@@ -23,6 +23,6 @@ export default class ManagementFleetsIndexRoute extends Route {
23
23
  };
24
24
 
25
25
  model(params) {
26
- return this.store.query('fleet', { ...params });
26
+ return this.store.query('fleet', { ...params, with: ['parent_fleet', 'service_area', 'zone'] });
27
27
  }
28
28
  }
@@ -0,0 +1,14 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ManagementFuelReportsIndexDetailsRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ view: { refreshModel: false },
9
+ };
10
+
11
+ model({ public_id }) {
12
+ return this.store.queryRecord('fuel-report', { public_id, single: true, with: ['driver', 'vehicle', 'reporter'] });
13
+ }
14
+ }
@@ -0,0 +1,10 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ManagementFuelReportsIndexEditRoute extends Route {
5
+ @service store;
6
+
7
+ model({ public_id }) {
8
+ return this.store.queryRecord('fuel-report', { public_id, single: true, with: ['driver', 'vehicle', 'reporter'] });
9
+ }
10
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ManagementFuelReportsIndexNewRoute extends Route {}
@@ -14,10 +14,12 @@ export default class ManagementFuelReportsIndexRoute extends Route {
14
14
  limit: { refreshModel: true },
15
15
  sort: { refreshModel: true },
16
16
  query: { refreshModel: true },
17
+ vehicle: { refreshModel: true },
18
+ driver: { refreshModel: true },
17
19
  status: { refreshModel: true },
18
20
  };
19
21
 
20
22
  model(params) {
21
- return this.store.query('fuel-report', { ...params });
23
+ return this.store.query('fuel-report', { ...params, with: ['driver', 'vehicle', 'reporter'] });
22
24
  }
23
25
  }