@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.
- package/addon/components/context-panel.hbs +5 -0
- package/addon/components/context-panel.js +6 -0
- package/addon/components/driver-card-mini.js +34 -13
- package/addon/components/driver-form-panel.hbs +23 -23
- package/addon/components/driver-form-panel.js +96 -13
- package/addon/components/driver-panel.hbs +12 -12
- package/addon/components/driver-panel.js +125 -21
- package/addon/components/fleet-vehicle-listing.hbs +1 -1
- package/addon/components/live-map.hbs +20 -9
- package/addon/components/live-map.js +1255 -353
- package/addon/components/map-container/toolbar/visibility-control-panel.hbs +66 -0
- package/addon/components/map-container/toolbar/visibility-control-panel.js +74 -0
- package/addon/components/map-container/toolbar/zones-panel.hbs +10 -10
- package/addon/components/map-container/toolbar/zones-panel.js +90 -61
- package/addon/components/map-container/toolbar.hbs +12 -7
- package/addon/components/modals/vehicle-form.hbs +35 -35
- package/addon/components/settings-window.hbs +1 -1
- package/addon/components/vehicle-form-panel.hbs +25 -26
- package/addon/components/vehicle-form-panel.js +95 -12
- package/addon/components/vehicle-panel.hbs +12 -13
- package/addon/components/vehicle-panel.js +130 -20
- package/addon/controllers/management/drivers/index/details.js +53 -0
- package/addon/controllers/management/drivers/index/edit.js +77 -46
- package/addon/controllers/management/drivers/index/new.js +39 -79
- package/addon/controllers/management/drivers/index.js +17 -221
- package/addon/controllers/management/fleets/index/edit.js +1 -1
- package/addon/controllers/management/fleets/index/new.js +1 -1
- package/addon/controllers/management/fuel-reports/index.js +2 -2
- package/addon/controllers/management/vehicles/index/details.js +49 -0
- package/addon/controllers/management/vehicles/index/edit.js +104 -1
- package/addon/controllers/management/vehicles/index/new.js +71 -0
- package/addon/controllers/operations/orders/index/new.js +4 -6
- package/addon/controllers/operations/orders/index/view.js +22 -14
- package/addon/controllers/operations/orders/index.js +124 -50
- package/addon/controllers/operations/service-rates/index/edit.js +1 -1
- package/addon/controllers/operations/service-rates/index/new.js +1 -1
- package/addon/engine.js +6 -0
- package/addon/helpers/is-visibility-control-visible.js +18 -0
- package/addon/routes/application.js +1 -1
- package/addon/routes/home.js +1 -1
- package/addon/routes/management/drivers/index/details.js +5 -0
- package/addon/routes/operations/orders/index/view.js +4 -2
- package/addon/routes/operations/orders/index.js +5 -1
- package/addon/routes/operations/service-rates/index.js +1 -1
- package/addon/routes/operations/zones/index.js +1 -1
- package/addon/services/context-panel.js +173 -0
- package/addon/services/leaflet-contextmenu-manager.js +311 -0
- package/addon/services/leaflet-map-manager.js +61 -0
- package/addon/services/service-areas.js +242 -32
- package/addon/templates/application.hbs +2 -1
- package/addon/templates/management/drivers/index/details.hbs +1 -1
- package/addon/templates/management/drivers/index/edit.hbs +1 -1
- package/addon/templates/management/drivers/index/new.hbs +1 -1
- package/addon/templates/management/vehicles/index/details.hbs +1 -1
- package/addon/templates/management/vehicles/index/edit.hbs +1 -1
- package/addon/templates/management/vehicles/index/new.hbs +1 -1
- package/addon/templates/operations/orders/index/view.hbs +2 -2
- package/addon/templates/operations/orders/index.hbs +1 -1
- package/addon/utils/apply-context-component-arguments.js +31 -0
- package/addon/utils/context-component-callback.js +16 -0
- package/addon/utils/find-leaflet-layer.js +13 -0
- package/addon/utils/fly-to-leaflet-layer.js +25 -0
- package/addon/utils/get-leaflet-layer-by-id.js +12 -0
- package/addon/utils/layer-can-bind-contextmenu.js +3 -0
- package/app/components/context-panel.js +1 -0
- package/app/components/map-container/toolbar/visibility-control-panel.js +1 -0
- package/app/helpers/is-visibility-control-visible.js +1 -0
- package/app/services/context-panel.js +1 -0
- package/app/services/leaflet-contextmenu-manager.js +1 -0
- package/app/services/leaflet-map-manager.js +1 -0
- package/app/utils/apply-context-component-arguments.js +1 -0
- package/app/utils/context-component-callback.js +1 -0
- package/app/utils/find-leaflet-layer.js +1 -0
- package/app/utils/fly-to-leaflet-layer.js +1 -0
- package/app/utils/get-leaflet-layer-by-id.js +1 -0
- package/app/utils/layer-can-bind-contextmenu.js +1 -0
- package/composer.json +11 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/server/migrations/2023_09_14_074512_update_vehicles_table.php +89 -88
- package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +56 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +7 -4
- package/server/src/Http/Filter/VehicleFilter.php +7 -0
- package/server/src/Http/Resources/v1/Vehicle.php +52 -39
- package/server/src/Models/VehicleDevice.php +17 -3
- package/server/src/Models/VehicleDeviceEvent.php +90 -0
- package/addon/services/map-manager.js +0 -3
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
788
|
-
if
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
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
|
|
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 }) {
|