@fleetbase/fleetops-engine 0.2.8 → 0.3.0

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 (88) hide show
  1. package/addon/components/context-panel.hbs +5 -0
  2. package/addon/components/context-panel.js +6 -0
  3. package/addon/components/driver-card-mini.js +34 -13
  4. package/addon/components/driver-form-panel.hbs +23 -23
  5. package/addon/components/driver-form-panel.js +96 -13
  6. package/addon/components/driver-panel.hbs +12 -12
  7. package/addon/components/driver-panel.js +125 -21
  8. package/addon/components/fleet-vehicle-listing.hbs +1 -1
  9. package/addon/components/live-map.hbs +20 -9
  10. package/addon/components/live-map.js +1255 -353
  11. package/addon/components/map-container/toolbar/visibility-control-panel.hbs +66 -0
  12. package/addon/components/map-container/toolbar/visibility-control-panel.js +74 -0
  13. package/addon/components/map-container/toolbar/zones-panel.hbs +10 -10
  14. package/addon/components/map-container/toolbar/zones-panel.js +90 -61
  15. package/addon/components/map-container/toolbar.hbs +12 -7
  16. package/addon/components/modals/vehicle-form.hbs +35 -35
  17. package/addon/components/settings-window.hbs +1 -1
  18. package/addon/components/vehicle-form-panel.hbs +25 -26
  19. package/addon/components/vehicle-form-panel.js +95 -12
  20. package/addon/components/vehicle-panel.hbs +12 -13
  21. package/addon/components/vehicle-panel.js +130 -20
  22. package/addon/controllers/management/drivers/index/details.js +53 -0
  23. package/addon/controllers/management/drivers/index/edit.js +77 -46
  24. package/addon/controllers/management/drivers/index/new.js +39 -79
  25. package/addon/controllers/management/drivers/index.js +17 -221
  26. package/addon/controllers/management/fleets/index/edit.js +1 -1
  27. package/addon/controllers/management/fleets/index/new.js +1 -1
  28. package/addon/controllers/management/fuel-reports/index.js +2 -2
  29. package/addon/controllers/management/vehicles/index/details.js +49 -0
  30. package/addon/controllers/management/vehicles/index/edit.js +104 -1
  31. package/addon/controllers/management/vehicles/index/new.js +71 -0
  32. package/addon/controllers/operations/orders/index/new.js +4 -6
  33. package/addon/controllers/operations/orders/index/view.js +22 -14
  34. package/addon/controllers/operations/orders/index.js +124 -50
  35. package/addon/controllers/operations/service-rates/index/edit.js +1 -1
  36. package/addon/controllers/operations/service-rates/index/new.js +1 -1
  37. package/addon/engine.js +6 -0
  38. package/addon/helpers/is-visibility-control-visible.js +18 -0
  39. package/addon/routes/application.js +1 -1
  40. package/addon/routes/home.js +1 -1
  41. package/addon/routes/management/drivers/index/details.js +5 -0
  42. package/addon/routes/operations/orders/index/view.js +4 -2
  43. package/addon/routes/operations/orders/index.js +5 -1
  44. package/addon/routes/operations/service-rates/index.js +1 -1
  45. package/addon/routes/operations/zones/index.js +1 -1
  46. package/addon/services/context-panel.js +173 -0
  47. package/addon/services/leaflet-contextmenu-manager.js +311 -0
  48. package/addon/services/leaflet-map-manager.js +61 -0
  49. package/addon/services/service-areas.js +242 -32
  50. package/addon/templates/application.hbs +2 -1
  51. package/addon/templates/management/drivers/index/details.hbs +1 -1
  52. package/addon/templates/management/drivers/index/edit.hbs +1 -1
  53. package/addon/templates/management/drivers/index/new.hbs +1 -1
  54. package/addon/templates/management/vehicles/index/details.hbs +1 -1
  55. package/addon/templates/management/vehicles/index/edit.hbs +1 -1
  56. package/addon/templates/management/vehicles/index/new.hbs +1 -1
  57. package/addon/templates/operations/orders/index/view.hbs +2 -2
  58. package/addon/templates/operations/orders/index.hbs +1 -1
  59. package/addon/utils/apply-context-component-arguments.js +31 -0
  60. package/addon/utils/context-component-callback.js +16 -0
  61. package/addon/utils/find-leaflet-layer.js +13 -0
  62. package/addon/utils/fly-to-leaflet-layer.js +25 -0
  63. package/addon/utils/get-leaflet-layer-by-id.js +12 -0
  64. package/addon/utils/layer-can-bind-contextmenu.js +3 -0
  65. package/app/components/context-panel.js +1 -0
  66. package/app/components/map-container/toolbar/visibility-control-panel.js +1 -0
  67. package/app/helpers/is-visibility-control-visible.js +1 -0
  68. package/app/services/context-panel.js +1 -0
  69. package/app/services/leaflet-contextmenu-manager.js +1 -0
  70. package/app/services/leaflet-map-manager.js +1 -0
  71. package/app/utils/apply-context-component-arguments.js +1 -0
  72. package/app/utils/context-component-callback.js +1 -0
  73. package/app/utils/find-leaflet-layer.js +1 -0
  74. package/app/utils/fly-to-leaflet-layer.js +1 -0
  75. package/app/utils/get-leaflet-layer-by-id.js +1 -0
  76. package/app/utils/layer-can-bind-contextmenu.js +1 -0
  77. package/composer.json +11 -1
  78. package/extension.json +1 -1
  79. package/package.json +3 -3
  80. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +89 -88
  81. package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +56 -0
  82. package/server/src/Http/Controllers/Internal/v1/LiveController.php +7 -4
  83. package/server/src/Http/Filter/VehicleFilter.php +7 -0
  84. package/server/src/Http/Resources/v1/Vehicle.php +52 -39
  85. package/server/src/Models/VehicleDevice.php +17 -3
  86. package/server/src/Models/VehicleDeviceEvent.php +90 -0
  87. package/addon/services/map-manager.js +0 -3
  88. package/app/services/map-manager.js +0 -1
@@ -88,6 +88,13 @@ export default class ManagementDriversIndexController extends Controller {
88
88
  */
89
89
  @service currentUser;
90
90
 
91
+ /**
92
+ * Inject the `contextPanel` service
93
+ *
94
+ * @var {Service}
95
+ */
96
+ @service contextPanel;
97
+
91
98
  /**
92
99
  * Queryable parameters for this controller's model
93
100
  *
@@ -275,7 +282,16 @@ export default class ManagementDriversIndexController extends Controller {
275
282
  {
276
283
  label: 'Vehicle',
277
284
  cellComponent: 'table/cell/anchor',
278
- action: this.viewDriverVehicle,
285
+ onClick: (driver) => {
286
+ return driver
287
+ .loadVehicle()
288
+ .then((vehicle) => {
289
+ return this.contextPanel.focus(vehicle);
290
+ })
291
+ .catch((error) => {
292
+ this.notifications.serverError(error);
293
+ });
294
+ },
279
295
  valuePath: 'vehicle.display_name',
280
296
  modelNamePath: 'display_name',
281
297
  resizable: true,
@@ -498,132 +514,6 @@ export default class ManagementDriversIndexController extends Controller {
498
514
  @action viewDriver(driver) {
499
515
  return this.transitionToRoute('management.drivers.index.details', driver);
500
516
  }
501
-
502
- // @action viewDriver(driver, options = {}) {
503
- // const viewDriverOnMap = () => {
504
- // this.modalsManager.done().then(() => {
505
- // return this.viewOnMap(driver, {
506
- // onFinish: () => {
507
- // this.viewDriver(driver);
508
- // },
509
- // });
510
- // });
511
- // };
512
-
513
- // this.modalsManager.show('modals/driver-details', {
514
- // title: driver.name,
515
- // titleComponent: 'modal/title-with-buttons',
516
- // acceptButtonText: 'Done',
517
- // acceptButtonIcon: 'check',
518
- // acceptButtonIconPrefix: 'fas',
519
- // hideDeclineButton: true,
520
- // declineButtonIcon: 'times',
521
- // declineButtonIconPrefix: 'fas',
522
- // headerStatus: driver.status,
523
- // headerButtons: [
524
- // {
525
- // icon: 'cog',
526
- // iconPrefix: 'fas',
527
- // type: 'link',
528
- // size: 'xs',
529
- // ddMenuLabel: 'Driver Actions',
530
- // options: [
531
- // {
532
- // title: 'Edit Driver',
533
- // icon: 'edit',
534
- // action: () => {
535
- // this.modalsManager.done().then(() => {
536
- // return this.editDriver(driver, {
537
- // onFinish: () => {
538
- // this.viewDriver(driver);
539
- // },
540
- // });
541
- // });
542
- // },
543
- // },
544
- // {
545
- // separator: true,
546
- // },
547
- // {
548
- // title: 'Assign Order to Driver',
549
- // icon: 'user-check',
550
- // action: () => {
551
- // this.modalsManager.done().then(() => {
552
- // return this.assignOrder(driver, {
553
- // onFinish: () => {
554
- // this.viewDriver(driver);
555
- // },
556
- // });
557
- // });
558
- // },
559
- // },
560
- // {
561
- // title: 'Assign Vehicle to Driver',
562
- // icon: 'car',
563
- // action: () => {
564
- // this.modalsManager.done().then(() => {
565
- // return this.assignVehicle(driver, {
566
- // onFinish: () => {
567
- // this.viewDriver(driver);
568
- // },
569
- // });
570
- // });
571
- // },
572
- // },
573
- // {
574
- // title: 'Locate Driver',
575
- // icon: 'map-pin',
576
- // action: viewDriverOnMap,
577
- // },
578
- // {
579
- // separator: true,
580
- // },
581
- // {
582
- // title: 'Listen to socket channel',
583
- // icon: 'headphones',
584
- // action: () => {
585
- // this.modalsManager.done().then(() => {
586
- // this.hostRouter.transitionTo('console.developers.sockets.view', `driver.${driver.public_id}`);
587
- // });
588
- // },
589
- // },
590
- // {
591
- // separator: true,
592
- // },
593
- // {
594
- // title: 'Delete Driver',
595
- // icon: 'trash',
596
- // action: () => {
597
- // this.modalsManager.done().then(() => {
598
- // return this.deleteDriver(driver, {
599
- // onDecline: () => {
600
- // this.viewDriver(driver);
601
- // },
602
- // });
603
- // });
604
- // },
605
- // },
606
- // ],
607
- // },
608
- // ],
609
- // viewVendor: () =>
610
- // this.viewDriverVendor(driver, {
611
- // onFinish: () => {
612
- // this.viewDriver(driver);
613
- // },
614
- // }),
615
- // viewVehicle: () =>
616
- // this.viewDriverVehicle(driver, {
617
- // onFinish: () => {
618
- // this.viewDriver(driver);
619
- // },
620
- // }),
621
- // viewDriverOnMap,
622
- // driver,
623
- // ...options,
624
- // });
625
- // }
626
-
627
517
  /**
628
518
  * Create a new `driver` in modal
629
519
  *
@@ -632,85 +522,8 @@ export default class ManagementDriversIndexController extends Controller {
632
522
  */
633
523
  @action createDriver() {
634
524
  return this.transitionToRoute('management.drivers.index.new');
635
-
636
- // return this.editDriver(driver, {
637
- // title: 'New Driver',
638
- // acceptButtonText: 'Create',
639
- // acceptButtonIcon: 'check',
640
- // acceptButtonIconPrefix: 'fas',
641
- // successNotification: (driver) => `New driver (${driver.name}) created.`,
642
- // onConfirm: () => {
643
- // return this.hostRouter.refresh();
644
- // },
645
- // });
646
525
  }
647
526
 
648
- // /**
649
- // * Edit a `driver` details
650
- // *
651
- // * @param {DriverModel} driver
652
- // * @param {Object} options
653
- // * @void
654
- // */
655
- // @action editDriver(driver, options = {}) {
656
- // // make sure vehicle is loaded
657
- // driver.loadVehicle();
658
-
659
- // this.modalsManager.show('modals/driver-form', {
660
- // title: 'Edit Driver',
661
- // acceptButtonText: 'Save Changes',
662
- // acceptButtonIcon: 'save',
663
- // declineButtonIcon: 'times',
664
- // declineButtonIconPrefix: 'fas',
665
- // driver,
666
- // uploadNewPhoto: (file) => {
667
- // this.fetch.uploadFile.perform(
668
- // file,
669
- // {
670
- // path: `uploads/${this.currentUser.companyId}/drivers/${driver.slug}`,
671
- // subject_uuid: driver.id,
672
- // subject_type: `driver`,
673
- // type: `driver_photo`,
674
- // },
675
- // (uploadedFile) => {
676
- // driver.setProperties({
677
- // photo_uuid: uploadedFile.id,
678
- // photo_url: uploadedFile.url,
679
- // photo: uploadedFile,
680
- // });
681
- // }
682
- // );
683
- // },
684
- // confirm: (modal, done) => {
685
- // modal.startLoading();
686
-
687
- // if (isBlank(driver.location)) {
688
- // // set default location from currentUser service
689
- // const { latitude, longitude } = this.currentUser;
690
- // driver.set('location', new Point(latitude, longitude));
691
- // }
692
-
693
- // driver
694
- // .save()
695
- // .then((driver) => {
696
- // if (typeof options.successNotification === 'function') {
697
- // this.notifications.success(options.successNotification(driver));
698
- // } else {
699
- // this.notifications.success(options.successNotification || `${driver.name} details updated.`);
700
- // }
701
-
702
- // done();
703
- // })
704
- // .catch((error) => {
705
- // // driver.rollbackAttributes();
706
- // modal.stopLoading();
707
- // this.notifications.serverError(error);
708
- // });
709
- // },
710
- // ...options,
711
- // });
712
- // }
713
-
714
527
  /**
715
528
  * View a `driver` details in modal
716
529
  *
@@ -847,23 +660,6 @@ export default class ManagementDriversIndexController extends Controller {
847
660
  });
848
661
  }
849
662
 
850
- /**
851
- * View information about the drivers assigned vehicle
852
- *
853
- * @param {DriverModel} driver
854
- * @param {Object} options
855
- * @void
856
- */
857
- @action async viewDriverVehicle(driver, options = {}) {
858
- this.modalsManager.displayLoader();
859
-
860
- const vehicle = await this.store.queryRecord('vehicle', driver.vehicle_uuid);
861
-
862
- this.modalsManager.done().then(() => {
863
- return this.vehicles.viewVehicle(vehicle, options);
864
- });
865
- }
866
-
867
663
  /**
868
664
  * View information about the driver vendor
869
665
  *
@@ -49,7 +49,7 @@ export default class ManagementFleetsIndexEditController extends Controller {
49
49
 
50
50
  console.log(model, model);
51
51
  this.isUpdatingFleet = true;
52
- this.loader.showLoader('.overlay-inner-content', 'Updating fleet...');
52
+ this.loader.showLoader('.overlay-inner-content', { loadingMessage: 'Updating fleet...' });
53
53
 
54
54
  try {
55
55
  return model
@@ -62,7 +62,7 @@ export default class ManagementFleetsIndexNewController extends Controller {
62
62
  const { fleet } = this;
63
63
 
64
64
  this.isCreatingFleet = true;
65
- this.loader.showLoader('.overlay-inner-content', 'Creating fleet...');
65
+ this.loader.showLoader('.overlay-inner-content', { loadingMessage: 'Creating fleet...' });
66
66
 
67
67
  try {
68
68
  return fleet
@@ -319,7 +319,7 @@ export default class ManagementFuelReportsIndexController extends Controller {
319
319
  return this.notifications.warning('No driver attributed to fuel report.');
320
320
  }
321
321
 
322
- this.loader.show('Loading...');
322
+ this.loader.show({ loadingMessage: 'Loading...' });
323
323
  const driver = await this.store.findRecord('driver', fuelReport.driver_uuid);
324
324
  this.loader.removeLoader();
325
325
 
@@ -332,7 +332,7 @@ export default class ManagementFuelReportsIndexController extends Controller {
332
332
  return this.notifications.warning('No vehicle attributed to fuel report.');
333
333
  }
334
334
 
335
- this.loader.show('Loading...');
335
+ this.loader.show({ loadingMessage: 'Loading...' });
336
336
  const vehicle = await this.store.findRecord('vehicle', fuelReport.vehicle_uuid);
337
337
  this.loader.remove();
338
338
 
@@ -2,11 +2,60 @@ import Controller from '@ember/controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { action } from '@ember/object';
4
4
 
5
+ /**
6
+ * Controller for managing the details view within the "Management -> Vehicles -> Index" route.
7
+ *
8
+ * @class ManagementVehiclesIndexDetailsController
9
+ * @extends Controller
10
+ */
5
11
  export default class ManagementVehiclesIndexDetailsController extends Controller {
12
+ /**
13
+ * The currently active view tab ('details' by default).
14
+ *
15
+ * @type {String}
16
+ * @tracked
17
+ */
6
18
  @tracked view = 'details';
19
+
20
+ /**
21
+ * An array of query parameters to be serialized in the URL.
22
+ *
23
+ * @type {String[]}
24
+ * @tracked
25
+ */
7
26
  @tracked queryParams = ['view'];
8
27
 
28
+ /**
29
+ * Transitions back to the "management.vehicles.index" route.
30
+ *
31
+ * @method
32
+ * @action
33
+ * @returns {Transition} The transition object representing the route change.
34
+ */
9
35
  @action transitionBack() {
10
36
  return this.transitionToRoute('management.vehicles.index');
11
37
  }
38
+
39
+ /**
40
+ * Transitions to the edit view for a specific vehicle.
41
+ *
42
+ * @method
43
+ * @param {VehicleModel} vehicle - The vehicle to be edited.
44
+ * @action
45
+ * @returns {Transition} The transition object representing the route change.
46
+ */
47
+ @action onEdit(vehicle) {
48
+ return this.transitionToRoute('management.vehicles.index.edit', vehicle);
49
+ }
50
+
51
+ /**
52
+ * Updates the active view tab.
53
+ *
54
+ * @method
55
+ * @param {String} tab - The name of the tab to activate.
56
+ * @action
57
+ */
58
+ @action onTabChanged(tab) {
59
+ this.view = tab;
60
+ }
12
61
  }
@@ -1,8 +1,111 @@
1
1
  import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
2
4
  import { action } from '@ember/object';
3
5
 
4
6
  export default class ManagementVehiclesIndexEditController extends Controller {
5
- @action transitionBack() {
7
+ /**
8
+ * Inject the `hostRouter` service
9
+ *
10
+ * @memberof ManagementVehiclesIndexEditController
11
+ */
12
+ @service hostRouter;
13
+
14
+ /**
15
+ * Inject the `hostRouter` service
16
+ *
17
+ * @memberof ManagementVehiclesIndexEditController
18
+ */
19
+ @service modalsManager;
20
+
21
+ /**
22
+ * The overlay component context.
23
+ *
24
+ * @memberof ManagementVehiclesIndexEditController
25
+ */
26
+ @tracked overlay;
27
+
28
+ /**
29
+ * When exiting the overlay.
30
+ *
31
+ * @return {Transition}
32
+ * @memberof ManagementVehiclesIndexEditController
33
+ */
34
+ @action transitionBack(vehicle) {
35
+ // check if vehicle record has been edited and prompt for confirmation
36
+ if (vehicle.hasDirtyAttributes) {
37
+ return this.confirmContinueWithUnsavedChanges(vehicle, {
38
+ confirm: () => {
39
+ vehicle.rollbackAttributes();
40
+ return this.transitionToRoute('management.vehicles.index');
41
+ },
42
+ });
43
+ }
44
+
6
45
  return this.transitionToRoute('management.vehicles.index');
7
46
  }
47
+
48
+ /**
49
+ * Set the overlay component context object.
50
+ *
51
+ * @param {OverlayContext} overlay
52
+ * @memberof ManagementVehiclesIndexEditController
53
+ */
54
+ @action setOverlayContext(overlay) {
55
+ this.overlay = overlay;
56
+ }
57
+
58
+ /**
59
+ * When vehicle details button is clicked in overlay.
60
+ *
61
+ * @param {VehicleModel} vehicle
62
+ * @return {Promise}
63
+ * @memberof ManagementVehiclesIndexEditController
64
+ */
65
+ @action onViewDetails(vehicle) {
66
+ // check if vehicle record has been edited and prompt for confirmation
67
+ if (vehicle.hasDirtyAttributes) {
68
+ return this.confirmContinueWithUnsavedChanges(vehicle);
69
+ }
70
+
71
+ return this.transitionToRoute('management.vehicles.index.details', vehicle);
72
+ }
73
+
74
+ /**
75
+ * Trigger a route refresh and focus the new vehicle created.
76
+ *
77
+ * @param {VehicleModel} vehicle
78
+ * @return {Promise}
79
+ * @memberof ManagementVehiclesIndexEditController
80
+ */
81
+ @action onAfterSave(vehicle) {
82
+ if (this.overlay) {
83
+ this.overlay.close();
84
+ }
85
+
86
+ this.hostRouter.refresh();
87
+ return this.transitionToRoute('management.vehicles.index.details', vehicle);
88
+ }
89
+
90
+ /**
91
+ * Prompts the user to confirm if they wish to continue with unsaved changes.
92
+ *
93
+ * @method
94
+ * @param {VehicleModel} vehicle - The vehicle object with unsaved changes.
95
+ * @param {Object} [options={}] - Additional options for configuring the modal.
96
+ * @returns {Promise} A promise that resolves when the user confirms, and transitions to a new route.
97
+ * @memberof ManagementVehiclesIndexEditController
98
+ */
99
+ confirmContinueWithUnsavedChanges(vehicle, options = {}) {
100
+ return this.modalsManager.confirm({
101
+ title: 'Continue Without Saving?',
102
+ body: 'Unsaved changes to this vehicle will be lost. Click continue to proceed.',
103
+ acceptButtonText: 'Continue without saving',
104
+ confirm: () => {
105
+ vehicle.rollbackAttributes();
106
+ return this.transitionToRoute('management.vehicles.index.details', vehicle);
107
+ },
108
+ ...options,
109
+ });
110
+ }
8
111
  }
@@ -4,8 +4,34 @@ import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
5
 
6
6
  export default class ManagementVehiclesIndexNewController extends Controller {
7
+ /**
8
+ * Inject the `store` service
9
+ *
10
+ * @memberof ManagementVehiclesIndexNewController
11
+ */
7
12
  @service store;
8
13
 
14
+ /**
15
+ * Inject the `hostRouter` service
16
+ *
17
+ * @memberof ManagementVehiclesIndexNewController
18
+ */
19
+ @service hostRouter;
20
+
21
+ /**
22
+ * Inject the `hostRouter` service
23
+ *
24
+ * @memberof ManagementVehiclesIndexNewController
25
+ */
26
+ @service modalsManager;
27
+
28
+ /**
29
+ * The overlay component context.
30
+ *
31
+ * @memberof ManagementVehiclesIndexNewController
32
+ */
33
+ @tracked overlay;
34
+
9
35
  /**
10
36
  * The vehicle being created.
11
37
  *
@@ -15,7 +41,52 @@ export default class ManagementVehiclesIndexNewController extends Controller {
15
41
  status: `active`,
16
42
  });
17
43
 
44
+ /**
45
+ * Set the overlay component context object.
46
+ *
47
+ * @param {OverlayContext} overlay
48
+ * @memberof ManagementVehiclesIndexNewController
49
+ */
50
+ @action setOverlayContext(overlay) {
51
+ this.overlay = overlay;
52
+ }
53
+
54
+ /**
55
+ * When exiting the overlay.
56
+ *
57
+ * @return {Transition}
58
+ * @memberof ManagementVehiclesIndexNewController
59
+ */
18
60
  @action transitionBack() {
19
61
  return this.transitionToRoute('management.vehicles.index');
20
62
  }
63
+
64
+ /**
65
+ * Trigger a route refresh and focus the new vehicle created.
66
+ *
67
+ * @param {VehicleModel} vehicle
68
+ * @return {Promise}
69
+ * @memberof ManagementVehiclesIndexNewController
70
+ */
71
+ @action onAfterSave(vehicle) {
72
+ if (this.overlay) {
73
+ this.overlay.close();
74
+ }
75
+
76
+ this.hostRouter.refresh();
77
+ return this.transitionToRoute('management.vehicles.index.details', vehicle).then(() => {
78
+ this.resetForm();
79
+ });
80
+ }
81
+
82
+ /**
83
+ * Resets the form with a new vehicle record
84
+ *
85
+ * @memberof ManagementVehiclesIndexNewController
86
+ */
87
+ resetForm() {
88
+ this.vehicle = this.store.createRecord('vehicle', {
89
+ status: `active`,
90
+ });
91
+ }
21
92
  }
@@ -253,7 +253,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
253
253
  }
254
254
 
255
255
  this.previewRoute(false);
256
- this.loader.showLoader('body', 'Creating Order...');
256
+ this.loader.showLoader('body', { loadingMessage: 'Creating Order...' });
257
257
 
258
258
  const { order, groupedMetaFields, payload, entities, waypoints, isMultipleDropoffOrder } = this;
259
259
  const route = this.leafletOptimizedRoute ? this.getOptimizedRoute() : this.getRoute();
@@ -567,8 +567,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
567
567
 
568
568
  @action setupInterface() {
569
569
  if (this.leafletMap && this.leafletMap.liveMap) {
570
- this.leafletMap.liveMap.hideDrivers();
571
- this.leafletMap.liveMap.hideRoutes();
570
+ this.leafletMap.liveMap.hideAll();
572
571
 
573
572
  // track all layers added from this view
574
573
  this.leafletMap.on('layeradd', ({ layer }) => {
@@ -585,7 +584,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
585
584
  });
586
585
  } else {
587
586
  // setup interface when livemap is ready
588
- this.universe.on('livemap.ready', () => {
587
+ this.universe.on('fleetops.livemap.ready', () => {
589
588
  this.setupInterface();
590
589
  });
591
590
  }
@@ -596,8 +595,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
596
595
 
597
596
  @action resetInterface() {
598
597
  if (this.leafletMap && this.leafletMap.liveMap) {
599
- this.leafletMap.liveMap.showDrivers();
600
- this.leafletMap.liveMap.showRoutes();
598
+ this.leafletMap.liveMap.show(['drivers', 'vehicles', 'routes']);
601
599
  }
602
600
  }
603
601
 
@@ -95,6 +95,13 @@ export default class OperationsOrdersIndexViewController extends Controller {
95
95
  */
96
96
  @service universe;
97
97
 
98
+ /**
99
+ * Inject the `contextPanel` service
100
+ *
101
+ * @var {Service}
102
+ */
103
+ @service contextPanel;
104
+
98
105
  @tracked isLoadingAdditionalData = false;
99
106
  @tracked isWaypointsCollapsed;
100
107
  @tracked leafletRoute;
@@ -170,8 +177,7 @@ export default class OperationsOrdersIndexViewController extends Controller {
170
177
 
171
178
  @action resetInterface() {
172
179
  if (this.leafletMap && this.leafletMap.liveMap) {
173
- this.leafletMap.liveMap.showDrivers();
174
- this.leafletMap.liveMap.showRoutes();
180
+ this.leafletMap.liveMap.show(['drivers', 'routes']);
175
181
  }
176
182
  }
177
183
 
@@ -219,8 +225,7 @@ export default class OperationsOrdersIndexViewController extends Controller {
219
225
  this,
220
226
  () => {
221
227
  if (this.leafletMap && this.leafletMap.liveMap) {
222
- this.leafletMap.liveMap.hideDrivers();
223
- this.leafletMap.liveMap.hideRoutes();
228
+ this.leafletMap.liveMap.hideAll();
224
229
  }
225
230
 
226
231
  // display order route on map
@@ -236,14 +241,14 @@ export default class OperationsOrdersIndexViewController extends Controller {
236
241
  };
237
242
 
238
243
  // re-display order routes when livemap has coordinates
239
- this.universe.on('livemap.has_coordinates', this, displayOrderRoute);
244
+ this.universe.on('fleetops.livemap.has_coordinates', this, displayOrderRoute);
240
245
 
241
246
  // when transitioning away kill event listener
242
247
  this.hostRouter.on('routeWillChange', () => {
243
- const isListening = this.universe.has('livemap.has_coordinates');
248
+ const isListening = this.universe.has('fleetops.livemap.has_coordinates');
244
249
 
245
250
  if (isListening) {
246
- this.universe.off('livemap.has_coordinates', this, displayOrderRoute);
251
+ this.universe.off('fleetops.livemap.has_coordinates', this, displayOrderRoute);
247
252
  }
248
253
  });
249
254
 
@@ -784,15 +789,18 @@ export default class OperationsOrdersIndexViewController extends Controller {
784
789
  this.vendorsController.viewVendor(customer);
785
790
  }
786
791
 
787
- @action async viewDriver(order) {
788
- if (order.canLoadDriver) {
789
- this.modalsManager.displayLoader();
790
-
791
- order.driver = await this.store.findRecord('driver', order.driver_uuid);
792
- await this.modalsManager.done();
792
+ @action focusOrderAssignedDriver({ driver_assigned, driver_assigned_uuid, canLoadDriver }) {
793
+ // if can load the driver then load and display via context
794
+ if (canLoadDriver) {
795
+ return this.store.findRecord('driver', driver_assigned_uuid).then((driver) => {
796
+ this.contextPanel.focus(driver);
797
+ });
793
798
  }
794
799
 
795
- this.driversController.viewDriver(order.driver_assigned);
800
+ // if driver already loaded use this
801
+ if (driver_assigned) {
802
+ this.contextPanel.focus(driver_assigned);
803
+ }
796
804
  }
797
805
 
798
806
  @action async viewFacilitator({ facilitator, facilitator_is_contact }) {