@fleetbase/fleetops-engine 0.2.2 → 0.2.4

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 (101) hide show
  1. package/addon/components/driver-form-panel.hbs +131 -0
  2. package/addon/components/driver-form-panel.js +39 -0
  3. package/addon/components/driver-panel/details.hbs +48 -0
  4. package/addon/components/driver-panel.hbs +60 -0
  5. package/addon/components/driver-panel.js +57 -0
  6. package/addon/components/fleet-form-panel.hbs +46 -0
  7. package/addon/components/fleet-form-panel.js +3 -0
  8. package/addon/components/fleet-panel.hbs +70 -0
  9. package/addon/components/fleet-panel.js +43 -0
  10. package/addon/components/fleet-vehicle-listing.hbs +73 -0
  11. package/addon/components/fleet-vehicle-listing.js +117 -0
  12. package/addon/components/leaflet-drift-marker.js +53 -0
  13. package/addon/components/live-map.hbs +4 -4
  14. package/addon/components/live-map.js +104 -34
  15. package/addon/components/modals/fleet-details.hbs +1 -0
  16. package/addon/components/settings-window.hbs +1 -1
  17. package/addon/components/vehicle-form-panel.hbs +131 -0
  18. package/addon/components/vehicle-form-panel.js +39 -0
  19. package/addon/components/vehicle-panel/details.hbs +34 -0
  20. package/addon/components/vehicle-panel/tracking.hbs +1 -0
  21. package/addon/components/vehicle-panel.hbs +60 -0
  22. package/addon/components/vehicle-panel.js +57 -0
  23. package/addon/controllers/management/drivers/index/details.js +8 -0
  24. package/addon/controllers/management/drivers/index/edit.js +80 -0
  25. package/addon/controllers/management/drivers/index/new.js +128 -0
  26. package/addon/controllers/management/drivers/index.js +212 -202
  27. package/addon/controllers/management/fleets/index/details.js +8 -0
  28. package/addon/controllers/management/fleets/index/edit.js +77 -0
  29. package/addon/controllers/management/fleets/index/new.js +103 -0
  30. package/addon/controllers/management/fleets/index.js +49 -77
  31. package/addon/controllers/management/vehicles/index/details.js +12 -0
  32. package/addon/controllers/management/vehicles/index/edit.js +8 -0
  33. package/addon/controllers/management/vehicles/index/new.js +21 -0
  34. package/addon/controllers/management/vehicles/index.js +6 -129
  35. package/addon/controllers/operations/orders/index/new.js +67 -20
  36. package/addon/controllers/operations/orders/index/view.js +15 -4
  37. package/addon/controllers/operations/orders/index.js +58 -7
  38. package/addon/controllers/operations/service-rates/index/edit.js +1 -1
  39. package/addon/controllers/operations/service-rates/index/new.js +10 -11
  40. package/addon/controllers/operations/service-rates/index.js +7 -0
  41. package/addon/engine.js +6 -0
  42. package/addon/initializers/load-leaflet-assets.js +6 -1
  43. package/addon/instance-initializers/register-leaflet-drift-marker.js +17 -0
  44. package/addon/routes/management/drivers/index/details.js +9 -0
  45. package/addon/routes/management/drivers/index/edit.js +13 -0
  46. package/addon/routes/management/drivers/index/new.js +3 -0
  47. package/addon/routes/management/fleets/index/details.js +9 -0
  48. package/addon/routes/management/fleets/index/edit.js +9 -0
  49. package/addon/routes/management/fleets/index/new.js +3 -0
  50. package/addon/routes/management/fleets/index.js +1 -0
  51. package/addon/routes/management/vehicles/index/details.js +18 -0
  52. package/addon/routes/management/vehicles/index/edit.js +14 -0
  53. package/addon/routes/management/vehicles/index/new.js +3 -0
  54. package/addon/routes/operations/orders/index/new.js +3 -1
  55. package/addon/routes/operations/orders/index/view.js +50 -0
  56. package/addon/routes/operations/service-rates/index/edit.js +7 -0
  57. package/addon/routes.js +15 -3
  58. package/addon/templates/management/drivers/index/details.hbs +1 -0
  59. package/addon/templates/management/drivers/index/edit.hbs +1 -0
  60. package/addon/templates/management/drivers/index/new.hbs +1 -0
  61. package/addon/templates/management/drivers/index.hbs +3 -1
  62. package/addon/templates/management/fleets/index/details.hbs +1 -0
  63. package/addon/templates/management/fleets/index/edit.hbs +1 -0
  64. package/addon/templates/management/fleets/index/new.hbs +1 -0
  65. package/addon/templates/management/vehicles/index/details.hbs +1 -0
  66. package/addon/templates/management/vehicles/index/edit.hbs +1 -0
  67. package/addon/templates/management/vehicles/index/new.hbs +1 -0
  68. package/addon/templates/operations/orders/index/new.hbs +1 -1
  69. package/addon/templates/operations/service-rates/index/new.hbs +4 -4
  70. package/app/components/driver-form-panel.js +1 -0
  71. package/app/components/driver-panel/details.js +1 -0
  72. package/app/components/driver-panel.js +1 -0
  73. package/app/components/fleet-form-panel.js +1 -0
  74. package/app/components/fleet-panel.js +1 -0
  75. package/app/components/fleet-vehicle-listing.js +1 -0
  76. package/app/components/leaflet-drift-marker.js +1 -0
  77. package/app/components/vehicle-form-panel.js +1 -0
  78. package/app/components/vehicle-panel/details.js +1 -0
  79. package/app/components/vehicle-panel/tracking.js +1 -0
  80. package/app/components/vehicle-panel.js +1 -0
  81. package/app/controllers/management/drivers/index/new.js +1 -0
  82. package/app/controllers/management/vehicles/index/details.js +1 -0
  83. package/app/controllers/management/vehicles/index/new.js +1 -0
  84. package/app/routes/management/drivers/index/details.js +1 -0
  85. package/app/routes/management/drivers/index/edit.js +1 -0
  86. package/app/routes/management/drivers/index/new.js +1 -0
  87. package/app/routes/management/vehicles/index/details.js +1 -0
  88. package/app/routes/management/vehicles/index/edit.js +1 -0
  89. package/app/routes/management/vehicles/index/new.js +1 -0
  90. package/app/templates/management/drivers/index/details.js +1 -0
  91. package/app/templates/management/drivers/index/edit.js +1 -0
  92. package/app/templates/management/drivers/index/new.js +1 -0
  93. package/app/templates/management/vehicles/index/details.js +1 -0
  94. package/app/templates/management/vehicles/index/edit.js +1 -0
  95. package/app/templates/management/vehicles/index/new.js +1 -0
  96. package/assets/images/boxes/large.png +0 -0
  97. package/assets/images/boxes/medium.png +0 -0
  98. package/assets/images/boxes/small.png +0 -0
  99. package/assets/images/boxes/x-large.png +0 -0
  100. package/index.js +16 -0
  101. package/package.json +6 -5
@@ -75,7 +75,7 @@ export default class ManagementFleetsIndexController extends Controller {
75
75
  *
76
76
  * @var {Array}
77
77
  */
78
- queryParams = ['page', 'limit', 'sort', 'query', 'public_id', 'internal_id', 'zone', 'service_area', 'created_by', 'updated_by', 'status'];
78
+ queryParams = ['page', 'limit', 'sort', 'query', 'public_id', 'internal_id', 'zone', 'service_area', 'parent_fleet', 'vendor', 'created_by', 'updated_by', 'status'];
79
79
 
80
80
  /**
81
81
  * The current page of data being viewed
@@ -118,6 +118,18 @@ export default class ManagementFleetsIndexController extends Controller {
118
118
  * @var {String}
119
119
  */
120
120
  @tracked service_area;
121
+ /**
122
+ * The filterable param `parent_fleet`
123
+ *
124
+ * @var {String}
125
+ */
126
+ @tracked parent_fleet;
127
+ /**
128
+ * The filterable param `vendor`
129
+ *
130
+ * @var {String}
131
+ */
132
+ @tracked vendor;
121
133
 
122
134
  /**
123
135
  * The filterable param `zone`
@@ -184,6 +196,32 @@ export default class ManagementFleetsIndexController extends Controller {
184
196
  filterParam: 'service_area',
185
197
  model: 'service-area',
186
198
  },
199
+ {
200
+ label: 'Parent Fleet',
201
+ cellComponent: 'table/cell/anchor',
202
+ // action: this.viewServiceArea.bind(this),
203
+ valuePath: 'parent_fleet.name',
204
+ resizable: true,
205
+ width: '130px',
206
+ filterable: true,
207
+ filterComponent: 'filter/model',
208
+ filterComponentPlaceholder: 'Select fleet',
209
+ filterParam: 'parent_fleet',
210
+ model: 'fleet',
211
+ },
212
+ {
213
+ label: 'Vendor',
214
+ cellComponent: 'table/cell/anchor',
215
+ action: this.viewServiceArea.bind(this),
216
+ valuePath: 'vendor.name',
217
+ resizable: true,
218
+ width: '130px',
219
+ filterable: true,
220
+ filterComponent: 'filter/model',
221
+ filterComponentPlaceholder: 'Select vendor',
222
+ filterParam: 'vendor',
223
+ model: 'vendor',
224
+ },
187
225
  {
188
226
  label: 'Zone',
189
227
  cellComponent: 'table/cell/anchor',
@@ -293,6 +331,10 @@ export default class ManagementFleetsIndexController extends Controller {
293
331
  label: 'View fleet details...',
294
332
  fn: this.viewFleet,
295
333
  },
334
+ {
335
+ label: 'Edit fleet details...',
336
+ fn: this.editFleet,
337
+ },
296
338
  {
297
339
  label: 'Assign driver to fleet...',
298
340
  fn: () => {},
@@ -370,47 +412,8 @@ export default class ManagementFleetsIndexController extends Controller {
370
412
  * @param {Object} options
371
413
  * @void
372
414
  */
373
- @action viewFleet(fleet, options = {}) {
374
- this.modalsManager.show('modals/fleet-details', {
375
- title: fleet.name,
376
- titleComponent: 'modal/title-with-buttons',
377
- headerStatus: fleet.status,
378
- headerButtons: [
379
- {
380
- icon: 'cog',
381
- iconPrefix: 'fas',
382
- type: 'link',
383
- size: 'xs',
384
- ddMenuLabel: 'Fleet Actions',
385
- options: [
386
- {
387
- title: 'Edit fleet details...',
388
- action: () => {
389
- this.modalsManager.done().then(() => {
390
- return this.editFleet(fleet, {
391
- onFinish: () => {
392
- this.viewFleet(fleet);
393
- },
394
- });
395
- });
396
- },
397
- },
398
- ],
399
- },
400
- ],
401
- acceptButtonText: 'Done',
402
- acceptButtonIcon: 'check',
403
- acceptButtonIconPrefix: 'fas',
404
- hideDeclineButton: true,
405
- fleet,
406
- addDriver: (driver) => {
407
- this.fetch.post('fleets/add', { driver: driver.id, fleet: fleet.id });
408
- },
409
- removeDriver: (driver) => {
410
- this.fetch.post('fleets/remove', { driver: driver.id, fleet: fleet.id });
411
- },
412
- ...options,
413
- });
415
+ @action viewFleet(fleet) {
416
+ return this.transitionToRoute('management.fleets.index.details', fleet);
414
417
  }
415
418
 
416
419
  /**
@@ -420,15 +423,7 @@ export default class ManagementFleetsIndexController extends Controller {
420
423
  * @void
421
424
  */
422
425
  @action createFleet() {
423
- const fleet = this.store.createRecord('fleet', { status: 'active' });
424
-
425
- return this.editFleet(fleet, {
426
- title: 'New Fleet',
427
- acceptButtonText: 'Confirm & Create',
428
- acceptButtonIcon: 'check',
429
- acceptButtonIconPrefix: 'fas',
430
- successNotification: (fleet) => `New fleet (${fleet.name}) created.`,
431
- });
426
+ return this.transitionToRoute('management.fleets.index.new');
432
427
  }
433
428
 
434
429
  /**
@@ -438,32 +433,9 @@ export default class ManagementFleetsIndexController extends Controller {
438
433
  * @param {Object} options
439
434
  * @void
440
435
  */
441
- @action editFleet(fleet, options = {}) {
442
- this.modalsManager.show('modals/fleet-form', {
443
- title: 'Edit Fleet',
444
- acceptButtonText: 'Save Changes',
445
- acceptButtonIcon: 'save',
446
- declineButtonIcon: 'times',
447
- declineButtonIconPrefix: 'fas',
448
- statusOptions: this.statusOptions,
449
- fleet,
450
- confirm: (modal) => {
451
- modal.startLoading();
452
-
453
- return fleet
454
- .save()
455
- .then((fleet) => {
456
- this.notifications.invoke('success', options.successNotification ?? `${fleet.name} details updated.`, fleet);
457
-
458
- return this.hostRouter.refresh();
459
- })
460
- .catch((error) => {
461
- modal.stopLoading();
462
- this.notifications.serverError(error);
463
- });
464
- },
465
- ...options,
466
- });
436
+ @action editFleet(fleet) {
437
+ console.log('xxx', fleet);
438
+ return this.transitionToRoute('management.fleets.index.edit', fleet);
467
439
  }
468
440
 
469
441
  /**
@@ -0,0 +1,12 @@
1
+ import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class ManagementVehiclesIndexDetailsController extends Controller {
6
+ @tracked view = 'details';
7
+ @tracked queryParams = ['view'];
8
+
9
+ @action transitionBack() {
10
+ return this.transitionToRoute('management.vehicles.index');
11
+ }
12
+ }
@@ -0,0 +1,8 @@
1
+ import Controller from '@ember/controller';
2
+ import { action } from '@ember/object';
3
+
4
+ export default class ManagementVehiclesIndexEditController extends Controller {
5
+ @action transitionBack() {
6
+ return this.transitionToRoute('management.vehicles.index');
7
+ }
8
+ }
@@ -0,0 +1,21 @@
1
+ import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+
6
+ export default class ManagementVehiclesIndexNewController extends Controller {
7
+ @service store;
8
+
9
+ /**
10
+ * The vehicle being created.
11
+ *
12
+ * @var {VehicleModel}
13
+ */
14
+ @tracked vehicle = this.store.createRecord('vehicle', {
15
+ status: `active`,
16
+ });
17
+
18
+ @action transitionBack() {
19
+ return this.transitionToRoute('management.vehicles.index');
20
+ }
21
+ }
@@ -6,8 +6,6 @@ import { action } from '@ember/object';
6
6
  import { isBlank } from '@ember/utils';
7
7
  import { timeout } from 'ember-concurrency';
8
8
  import { task } from 'ember-concurrency-decorators';
9
- import withDefaultValue from '@fleetbase/ember-core/utils/with-default-value';
10
- import generateSlug from '@fleetbase/ember-core/utils/generate-slug';
11
9
 
12
10
  export default class ManagementVehiclesIndexController extends ManagementController {
13
11
  /**
@@ -217,6 +215,7 @@ export default class ManagementVehiclesIndexController extends ManagementControl
217
215
  filterable: true,
218
216
  filterComponent: 'filter/string',
219
217
  filterParam: 'name',
218
+ showOnlineIndicator: true,
220
219
  },
221
220
  {
222
221
  label: 'Plate Number',
@@ -441,73 +440,8 @@ export default class ManagementVehiclesIndexController extends ManagementControl
441
440
  * @param {Object} options
442
441
  * @void
443
442
  */
444
- @action async viewVehicle(vehicle, options) {
445
- await vehicle?.loadDriver();
446
-
447
- this.modalsManager.show('modals/vehicle-details', {
448
- title: withDefaultValue(vehicle.display_name),
449
- titleComponent: 'modal/title-with-buttons',
450
- modalClass: 'modal-lg',
451
- acceptButtonText: 'Done',
452
- headerButtons: [
453
- {
454
- icon: 'cog',
455
- iconPrefix: 'fas',
456
- type: 'link',
457
- size: 'xs',
458
- ddMenuLabel: 'Vehicle Actions',
459
- options: [
460
- {
461
- title: 'Edit vehicle details...',
462
- action: () => {
463
- this.modalsManager.done().then(() => {
464
- return this.editVehicle(vehicle, {
465
- onFinish: () => {
466
- this.viewVehicle(vehicle);
467
- },
468
- });
469
- });
470
- },
471
- },
472
- {
473
- title: 'Assign driver to vehicle...',
474
- action: () => {
475
- this.modalsManager.done().then(() => {
476
- return this.assignDriver(vehicle, {
477
- onFinish: () => {
478
- this.viewVehicle(vehicle);
479
- },
480
- });
481
- });
482
- },
483
- },
484
- {
485
- title: 'Delete vehicle...',
486
- action: () => {
487
- this.modalsManager.done().then(() => {
488
- return this.deleteVehicle(vehicle, {
489
- onDecline: () => {
490
- this.viewVehicle(vehicle);
491
- },
492
- });
493
- });
494
- },
495
- },
496
- ],
497
- },
498
- ],
499
- viewDriver: (driver) => {
500
- this.modalsManager.done().then(() => {
501
- return this.drivers.viewDriver(driver, {
502
- onFinish: () => {
503
- this.viewVehicle(vehicle);
504
- },
505
- });
506
- });
507
- },
508
- vehicle,
509
- ...options,
510
- });
443
+ @action viewVehicle(vehicle) {
444
+ return this.transitionToRoute('management.vehicles.index.details', vehicle);
511
445
  }
512
446
 
513
447
  /**
@@ -517,21 +451,7 @@ export default class ManagementVehiclesIndexController extends ManagementControl
517
451
  * @void
518
452
  */
519
453
  @action createVehicle() {
520
- const vehicle = this.store.createRecord('vehicle', {
521
- status: 'active',
522
- slug: generateSlug(),
523
- });
524
-
525
- return this.editVehicle(vehicle, {
526
- title: 'New Vehicle',
527
- acceptButtonText: 'Confirm & Create',
528
- acceptButtonIcon: 'check',
529
- acceptButtonIconPrefix: 'fas',
530
- // successNotification: `New vehicle (${vehicle.name}) created.`,
531
- onConfirm: () => {
532
- return this.hostRouter.refresh();
533
- },
534
- });
454
+ return this.transitionToRoute('management.vehicles.index.new');
535
455
  }
536
456
 
537
457
  /**
@@ -541,51 +461,8 @@ export default class ManagementVehiclesIndexController extends ManagementControl
541
461
  * @param {Object} options
542
462
  * @void
543
463
  */
544
- @action async editVehicle(vehicle, options = {}) {
545
- await vehicle?.loadDriver();
546
-
547
- this.modalsManager.show('modals/vehicle-form', {
548
- title: 'Edit Vehicle',
549
- acceptButtonText: 'Save Changes',
550
- acceptButtonIcon: 'save',
551
- modalClass: 'modal-lg',
552
- vehicle,
553
- uploadNewPhoto: (file) => {
554
- this.fetch.uploadFile.perform(
555
- file,
556
- {
557
- path: `uploads/${this.currentUser.companyId}/vehicles/${vehicle.slug}`,
558
- subject_uuid: vehicle.id,
559
- subject_type: `vehicle`,
560
- type: `vehicle_photo`,
561
- },
562
- (uploadedFile) => {
563
- vehicle.setProperties({
564
- photo_uuid: uploadedFile.id,
565
- photo_url: uploadedFile.url,
566
- photo: uploadedFile,
567
- });
568
- }
569
- );
570
- },
571
- confirm: (modal, done) => {
572
- modal.startLoading();
573
-
574
- vehicle
575
- .save()
576
- .then((vehicle) => {
577
- this.notifications.success(options.successNotification ?? `${vehicle.name} details updated.`);
578
- })
579
- .catch((error) => {
580
- modal.stopLoading();
581
- this.notifications.serverError(error);
582
- })
583
- .finally(() => {
584
- done();
585
- });
586
- },
587
- ...options,
588
- });
464
+ @action editVehicle(vehicle) {
465
+ return this.transitionToRoute('management.vehicles.index.edit', vehicle);
589
466
  }
590
467
 
591
468
  /**
@@ -5,7 +5,7 @@ import { action, computed, setProperties, set, get } from '@ember/object';
5
5
  import { not, equal, alias } from '@ember/object/computed';
6
6
  import { isArray } from '@ember/array';
7
7
  import { dasherize } from '@ember/string';
8
- import { later } from '@ember/runloop';
8
+ import { later, next } from '@ember/runloop';
9
9
  import { OSRMv1, Control as RoutingControl } from '@fleetbase/leaflet-routing-machine';
10
10
  import polyline from '@fleetbase/ember-core/utils/polyline';
11
11
  import findClosestWaypoint from '@fleetbase/ember-core/utils/find-closest-waypoint';
@@ -494,7 +494,9 @@ export default class OperationsOrdersIndexNewController extends Controller {
494
494
  }
495
495
 
496
496
  @action newPlace() {
497
- this.placesController?.createPlace();
497
+ if (this.placesController) {
498
+ return this.placesController.createPlace();
499
+ }
498
500
  }
499
501
 
500
502
  @action async getQuotes(service) {
@@ -564,26 +566,39 @@ export default class OperationsOrdersIndexNewController extends Controller {
564
566
  }
565
567
 
566
568
  @action setupInterface() {
567
- this.leafletMap?.liveMap?.hideDrivers();
568
- this.leafletMap?.liveMap?.hideRoutes();
569
-
570
- // track all layers added from this view
571
- this.leafletMap?.on('layeradd', ({ layer }) => {
572
- // disable dragging of layer
573
- layer.dragging?.disable();
569
+ if (this.leafletMap && this.leafletMap.liveMap) {
570
+ this.leafletMap.liveMap.hideDrivers();
571
+ this.leafletMap.liveMap.hideRoutes();
572
+
573
+ // track all layers added from this view
574
+ this.leafletMap.on('layeradd', ({ layer }) => {
575
+ // disable dragging of layer
576
+ if (layer.dragging && typeof layer.dragging.disable === 'function') {
577
+ layer.dragging.disable();
578
+ }
574
579
 
575
- if (!this.leafletLayers?.includes(layer)) {
576
- this.leafletLayers.pushObject(layer);
577
- }
578
- });
580
+ next(this, function () {
581
+ if (isArray(this.leafletLayers) && !this.leafletLayers.includes(layer)) {
582
+ this.leafletLayers.pushObject(layer);
583
+ }
584
+ });
585
+ });
586
+ } else {
587
+ // setup interface when livemap is ready
588
+ this.universe.on('livemap.ready', () => {
589
+ this.setupInterface();
590
+ });
591
+ }
579
592
 
580
593
  // switch to map mode
581
594
  this.ordersController.setLayoutMode('map');
582
595
  }
583
596
 
584
597
  @action resetInterface() {
585
- this.leafletMap?.liveMap?.showDrivers();
586
- this.leafletMap?.liveMap?.showRoutes();
598
+ if (this.leafletMap && this.leafletMap.liveMap) {
599
+ this.leafletMap.liveMap.showDrivers();
600
+ this.leafletMap.liveMap.showRoutes();
601
+ }
587
602
  }
588
603
 
589
604
  @action getRoute() {
@@ -674,15 +689,47 @@ export default class OperationsOrdersIndexNewController extends Controller {
674
689
  }
675
690
 
676
691
  @action clearLayers() {
677
- const { leafletLayers, leafletMap } = this;
692
+ if (this.leafletMap) {
693
+ try {
694
+ this.leafletMap.eachLayer((layer) => {
695
+ if (isArray(this.leafletLayers) && this.leafletLayers.includes(layer)) {
696
+ this.leafletMap.removeLayer(layer);
697
+ }
698
+ });
699
+ } catch (error) {
700
+ // fallback method with tracked layers
701
+ if (isArray(this.leafletLayers)) {
702
+ this.leafletLayers.forEach((layer) => {
703
+ try {
704
+ this.leafletMap.removeLayer(layer);
705
+ } catch (error) {
706
+ // silent error just continue with order processing if any
707
+ }
708
+ });
709
+ }
710
+ }
711
+ }
712
+ }
678
713
 
679
- leafletLayers?.forEach((layer) => {
714
+ @action clearAllLayers() {
715
+ if (this.leafletMap) {
680
716
  try {
681
- leafletMap.removeLayer(layer);
717
+ this.leafletMap.eachLayer((layer) => {
718
+ this.leafletMap.removeLayer(layer);
719
+ });
682
720
  } catch (error) {
683
- // silent error just continue with order processing if any
721
+ // fallback method with tracked layers
722
+ if (isArray(this.leafletLayers)) {
723
+ this.leafletLayers.forEach((layer) => {
724
+ try {
725
+ this.leafletMap.removeLayer(layer);
726
+ } catch (error) {
727
+ // silent error just continue with order processing if any
728
+ }
729
+ });
730
+ }
684
731
  }
685
- });
732
+ }
686
733
  }
687
734
 
688
735
  @action createPlaceArrayFromPayload(payload, waypoints, isMultipleDropoffOrder = false) {
@@ -81,6 +81,13 @@ export default class OperationsOrdersIndexViewController extends Controller {
81
81
  */
82
82
  @service hostRouter;
83
83
 
84
+ /**
85
+ * Inject the `socket` service
86
+ *
87
+ * @var {Service}
88
+ */
89
+ @service socket;
90
+
84
91
  /**
85
92
  * Inject the `universe` service
86
93
  *
@@ -162,8 +169,10 @@ export default class OperationsOrdersIndexViewController extends Controller {
162
169
  }
163
170
 
164
171
  @action resetInterface() {
165
- this.leafletMap?.liveMap?.showDrivers();
166
- this.leafletMap?.liveMap?.showRoutes();
172
+ if (this.leafletMap && this.leafletMap.liveMap) {
173
+ this.leafletMap.liveMap.showDrivers();
174
+ this.leafletMap.liveMap.showRoutes();
175
+ }
167
176
  }
168
177
 
169
178
  @action removeRoutingControlPreview() {
@@ -209,8 +218,10 @@ export default class OperationsOrdersIndexViewController extends Controller {
209
218
  return later(
210
219
  this,
211
220
  () => {
212
- this.leafletMap?.liveMap?.hideDrivers();
213
- this.leafletMap?.liveMap?.hideRoutes();
221
+ if (this.leafletMap && this.leafletMap.liveMap) {
222
+ this.leafletMap.liveMap.hideDrivers();
223
+ this.leafletMap.liveMap.hideRoutes();
224
+ }
214
225
 
215
226
  // display order route on map
216
227
  this.displayOrderRoute();
@@ -80,6 +80,13 @@ export default class OperationsOrdersIndexController extends Controller {
80
80
  */
81
81
  @service universe;
82
82
 
83
+ /**
84
+ * Inject the `socket` service
85
+ *
86
+ * @var {Service}
87
+ */
88
+ @service socket;
89
+
83
90
  /**
84
91
  * Queryable parameters for this controller's model
85
92
  *
@@ -537,6 +544,54 @@ export default class OperationsOrdersIndexController extends Controller {
537
544
  },
538
545
  ];
539
546
 
547
+ /**
548
+ * Creates an instance of OperationsOrdersIndexController.
549
+ * @memberof OperationsOrdersIndexController
550
+ */
551
+ constructor() {
552
+ super(...arguments);
553
+ this.listenForOrderEvents();
554
+ }
555
+
556
+ /**
557
+ * Listen for incoming order events to refresh listing.
558
+ *
559
+ * @memberof OperationsOrdersIndexController
560
+ */
561
+ @action async listenForOrderEvents() {
562
+ // wait for user to be loaded into service
563
+ this.currentUser.on('user.loaded', () => {
564
+ // Get socket instance
565
+ const socket = this.socket.instance();
566
+
567
+ // The channel ID to listen on
568
+ const channelId = `company.${this.currentUser.companyId}`;
569
+
570
+ // Listed on company channel
571
+ const channel = socket.subscribe(channelId);
572
+
573
+ // Events which should trigger refresh
574
+ const listening = ['order.ready', 'order.driver_assigned'];
575
+
576
+ // Listen for channel subscription
577
+ (async () => {
578
+ for await (let output of channel) {
579
+ const { event } = output;
580
+
581
+ // if an order event refresh orders
582
+ if (typeof event === 'string' && listening.includes(event)) {
583
+ this.hostRouter.refresh();
584
+ }
585
+ }
586
+ })();
587
+
588
+ // disconnect when transitioning
589
+ this.hostRouter.on('routeWillChange', () => {
590
+ channel.close();
591
+ });
592
+ });
593
+ }
594
+
540
595
  /**
541
596
  * The search task.
542
597
  *
@@ -572,13 +627,9 @@ export default class OperationsOrdersIndexController extends Controller {
572
627
  }
573
628
 
574
629
  @action resetView() {
575
- const {
576
- leafletMap: { liveMap },
577
- } = this;
578
-
579
- if (liveMap) {
580
- liveMap.hideDrivers();
581
- liveMap.hideRoutes();
630
+ if (this.leafletMap && this.leafletMap.liveMap) {
631
+ this.leafletMap.liveMap.hideDrivers();
632
+ this.leafletMap.liveMap.hideRoutes();
582
633
  }
583
634
  }
584
635
 
@@ -1,7 +1,6 @@
1
1
  import OperationsServiceRatesIndexNewController from './new';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { action } from '@ember/object';
4
- // import { alias } from '@ember/object/computed';
5
4
 
6
5
  export default class OperationsServiceRatesIndexEditController extends OperationsServiceRatesIndexNewController {
7
6
  /**
@@ -44,6 +43,7 @@ export default class OperationsServiceRatesIndexEditController extends Operation
44
43
  return this.transitionToRoute('operations.service-rates.index').then(() => {
45
44
  this.notifications.success(`Service rate '${serviceRate.service_name}' updated`);
46
45
  this.resetForm();
46
+ this.hostRouter.refresh();
47
47
  });
48
48
  })
49
49
  .catch(this.notifications.serverError)