@fleetbase/fleetops-engine 0.4.0 → 0.4.2

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 (207) hide show
  1. package/addon/components/admin/navigator-app.hbs +3 -3
  2. package/addon/components/admin/visibility-controls.hbs +4 -4
  3. package/addon/components/cell/driver-name.hbs +1 -1
  4. package/addon/components/contact-form-panel.hbs +15 -15
  5. package/addon/components/contact-form-panel.js +8 -4
  6. package/addon/components/contact-panel/details.hbs +7 -7
  7. package/addon/components/contact-panel.hbs +2 -2
  8. package/addon/components/display-place.hbs +2 -2
  9. package/addon/components/driver-card.hbs +1 -1
  10. package/addon/components/driver-form-panel.hbs +36 -29
  11. package/addon/components/driver-form-panel.js +6 -2
  12. package/addon/components/driver-panel/details.hbs +10 -10
  13. package/addon/components/driver-panel.hbs +5 -5
  14. package/addon/components/fleet-driver-listing.hbs +5 -5
  15. package/addon/components/fleet-form-panel.hbs +16 -16
  16. package/addon/components/fleet-form-panel.js +5 -1
  17. package/addon/components/fleet-panel/details.hbs +7 -7
  18. package/addon/components/fleet-panel/driver-listing.hbs +5 -5
  19. package/addon/components/fleet-panel/driver-listing.js +6 -0
  20. package/addon/components/fleet-panel/vehicle-listing.hbs +5 -5
  21. package/addon/components/fleet-panel/vehicle-listing.js +6 -0
  22. package/addon/components/fleet-vehicle-listing.hbs +5 -5
  23. package/addon/components/fuel-report-form-panel.hbs +16 -16
  24. package/addon/components/fuel-report-form-panel.js +5 -1
  25. package/addon/components/fuel-report-panel/details.hbs +11 -11
  26. package/addon/components/fuel-report-panel.hbs +3 -3
  27. package/addon/components/global-search.hbs +1 -1
  28. package/addon/components/horizontal-route.hbs +1 -1
  29. package/addon/components/integrated-order-details.hbs +13 -13
  30. package/addon/components/issue-form-panel.hbs +25 -25
  31. package/addon/components/issue-form-panel.js +6 -1
  32. package/addon/components/issue-panel/details.hbs +11 -11
  33. package/addon/components/issue-panel.hbs +3 -3
  34. package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
  35. package/addon/components/layout/fleet-ops-sidebar.js +28 -12
  36. package/addon/components/live-map-drawer/driver-listing.hbs +1 -1
  37. package/addon/components/live-map-drawer/driver-listing.js +16 -10
  38. package/addon/components/live-map-drawer/place-listing.hbs +1 -1
  39. package/addon/components/live-map-drawer/place-listing.js +12 -7
  40. package/addon/components/live-map-drawer/vehicle-listing.hbs +1 -1
  41. package/addon/components/live-map-drawer/vehicle-listing.js +15 -9
  42. package/addon/components/live-map.hbs +10 -92
  43. package/addon/components/live-map.js +29 -24
  44. package/addon/components/map-container/toolbar/visibility-control-panel.hbs +9 -9
  45. package/addon/components/map-container/toolbar/zones-panel.hbs +10 -10
  46. package/addon/components/map-container/toolbar.hbs +6 -6
  47. package/addon/components/modals/assign-driver.hbs +2 -2
  48. package/addon/components/modals/clone-config-form.hbs +2 -2
  49. package/addon/components/modals/contact-details.hbs +6 -6
  50. package/addon/components/modals/contact-form.hbs +11 -11
  51. package/addon/components/modals/driver-assign-order.hbs +2 -2
  52. package/addon/components/modals/driver-assign-vehicle.hbs +2 -2
  53. package/addon/components/modals/driver-assign-vendor.hbs +2 -2
  54. package/addon/components/modals/driver-details.hbs +14 -14
  55. package/addon/components/modals/driver-form.hbs +18 -18
  56. package/addon/components/modals/edit-meta-form.hbs +2 -2
  57. package/addon/components/modals/entity-form.hbs +16 -16
  58. package/addon/components/modals/entity-meta-field-prompt.hbs +1 -1
  59. package/addon/components/modals/fleet-details.hbs +6 -6
  60. package/addon/components/modals/fleet-form.hbs +8 -8
  61. package/addon/components/modals/fuel-report-details.hbs +9 -9
  62. package/addon/components/modals/fuel-report-form.hbs +8 -8
  63. package/addon/components/modals/group-details.hbs +4 -4
  64. package/addon/components/modals/group-form.hbs +6 -6
  65. package/addon/components/modals/install-prompt.hbs +2 -3
  66. package/addon/components/modals/issue-details.hbs +8 -8
  67. package/addon/components/modals/issue-from.hbs +21 -21
  68. package/addon/components/modals/map-field-form.hbs +2 -2
  69. package/addon/components/modals/map-field-group-form.hbs +1 -1
  70. package/addon/components/modals/map-layer-form.hbs +10 -10
  71. package/addon/components/modals/meta-field-form.hbs +2 -2
  72. package/addon/components/modals/meta-field-group-form.hbs +1 -1
  73. package/addon/components/modals/new-order-config.hbs +4 -4
  74. package/addon/components/modals/order-assign-driver.hbs +2 -2
  75. package/addon/components/modals/order-config-new-status.hbs +1 -1
  76. package/addon/components/modals/order-event.hbs +2 -2
  77. package/addon/components/modals/order-form.hbs +8 -8
  78. package/addon/components/modals/order-import.hbs +8 -8
  79. package/addon/components/modals/order-label.hbs +1 -1
  80. package/addon/components/modals/order-new-activity.hbs +10 -10
  81. package/addon/components/modals/order-route-form.hbs +17 -17
  82. package/addon/components/modals/place-assign-vendor.hbs +2 -2
  83. package/addon/components/modals/place-details.hbs +13 -13
  84. package/addon/components/modals/place-form.hbs +15 -15
  85. package/addon/components/modals/policy-form.hbs +5 -5
  86. package/addon/components/modals/role-form.hbs +3 -3
  87. package/addon/components/modals/select-payment-method.hbs +1 -1
  88. package/addon/components/modals/service-area-form.hbs +8 -8
  89. package/addon/components/modals/set-password.hbs +3 -3
  90. package/addon/components/modals/uninstall-prompt.hbs +2 -3
  91. package/addon/components/modals/user-form.hbs +9 -9
  92. package/addon/components/modals/vehicle-details.hbs +41 -41
  93. package/addon/components/modals/vehicle-form.hbs +73 -73
  94. package/addon/components/modals/vendor-details.hbs +10 -10
  95. package/addon/components/modals/vendor-form.hbs +36 -36
  96. package/addon/components/modals/view-service-area.hbs +1 -1
  97. package/addon/components/modals/zone-form.hbs +6 -6
  98. package/addon/components/order/header.hbs +11 -11
  99. package/addon/components/order/place-card.hbs +2 -2
  100. package/addon/components/order/schedule-card.hbs +6 -6
  101. package/addon/components/order/schedule-card.js +11 -7
  102. package/addon/components/order-config/activity-flow-editor.hbs +14 -14
  103. package/addon/components/order-config/activity-flow-editor.js +11 -11
  104. package/addon/components/order-config/details-editor.hbs +9 -9
  105. package/addon/components/order-config/entities-editor.hbs +13 -13
  106. package/addon/components/order-config/entities-editor.js +2 -2
  107. package/addon/components/order-config/fields-editor.hbs +14 -14
  108. package/addon/components/order-config/fields-editor.js +13 -12
  109. package/addon/components/order-config.hbs +9 -9
  110. package/addon/components/order-config.js +12 -11
  111. package/addon/components/order-list-overlay.hbs +14 -14
  112. package/addon/components/place-form-panel.hbs +18 -18
  113. package/addon/components/place-form-panel.js +6 -1
  114. package/addon/components/place-panel/details.hbs +10 -10
  115. package/addon/components/place-panel.hbs +2 -2
  116. package/addon/components/route-list.hbs +2 -2
  117. package/addon/components/settings-window.hbs +5 -5
  118. package/addon/components/settings-window.js +2 -1
  119. package/addon/components/vehicle-form-panel.hbs +27 -27
  120. package/addon/components/vehicle-form-panel.js +8 -3
  121. package/addon/components/vehicle-panel/details.hbs +7 -7
  122. package/addon/components/vehicle-panel.hbs +4 -4
  123. package/addon/components/vendor-form-panel/create-form.hbs +34 -33
  124. package/addon/components/vendor-form-panel/create-form.js +6 -2
  125. package/addon/components/vendor-form-panel/edit-form.hbs +27 -27
  126. package/addon/components/vendor-form-panel/edit-form.js +1 -0
  127. package/addon/components/vendor-form-panel.hbs +6 -6
  128. package/addon/components/vendor-form-panel.js +7 -2
  129. package/addon/components/vendor-panel/details.hbs +10 -10
  130. package/addon/components/vendor-panel.hbs +3 -3
  131. package/addon/components/widget/fleet-ops-quickstart.hbs +2 -2
  132. package/addon/components/widget/fleet-ops-quickstart.js +1 -0
  133. package/addon/components/widget/key-metrics.hbs +12 -12
  134. package/addon/components/widget/live-order-map.hbs +4 -4
  135. package/addon/components/widget/recent-orders.hbs +4 -4
  136. package/addon/components/widget/transactions.hbs +4 -4
  137. package/addon/controllers/management/contacts/index/edit.js +10 -3
  138. package/addon/controllers/management/contacts/index/new.js +7 -0
  139. package/addon/controllers/management/contacts/index.js +23 -16
  140. package/addon/controllers/management/drivers/index/edit.js +10 -3
  141. package/addon/controllers/management/drivers/index/new.js +7 -0
  142. package/addon/controllers/management/drivers/index.js +33 -19
  143. package/addon/controllers/management/fleets/index/edit.js +10 -3
  144. package/addon/controllers/management/fleets/index/new.js +7 -0
  145. package/addon/controllers/management/fleets/index.js +24 -17
  146. package/addon/controllers/management/fuel-reports/index/edit.js +10 -3
  147. package/addon/controllers/management/fuel-reports/index/new.js +7 -0
  148. package/addon/controllers/management/fuel-reports/index.js +20 -13
  149. package/addon/controllers/management/issues/index/edit.js +10 -3
  150. package/addon/controllers/management/issues/index/new.js +8 -0
  151. package/addon/controllers/management/issues/index.js +22 -15
  152. package/addon/controllers/management/places/index/edit.js +10 -3
  153. package/addon/controllers/management/places/index/new.js +7 -0
  154. package/addon/controllers/management/places/index.js +27 -20
  155. package/addon/controllers/management/vehicles/index/edit.js +10 -3
  156. package/addon/controllers/management/vehicles/index/new.js +7 -0
  157. package/addon/controllers/management/vehicles/index.js +22 -15
  158. package/addon/controllers/management/vendors/index/edit.js +10 -3
  159. package/addon/controllers/management/vendors/index/new.js +7 -0
  160. package/addon/controllers/management/vendors/index.js +23 -16
  161. package/addon/controllers/operations/orders/index/new.js +127 -30
  162. package/addon/controllers/operations/orders/index/view.js +57 -20
  163. package/addon/controllers/operations/orders/index.js +34 -27
  164. package/addon/controllers/operations/scheduler/index.js +3 -2
  165. package/addon/controllers/operations/service-rates/index/edit.js +1 -12
  166. package/addon/controllers/operations/service-rates/index/new.js +9 -1
  167. package/addon/controllers/operations/service-rates/index.js +16 -9
  168. package/addon/routes/application.js +5 -2
  169. package/addon/routes/management/places/index.js +1 -1
  170. package/addon/routes/operations/orders/index/view.js +2 -14
  171. package/addon/services/driver-actions.js +9 -8
  172. package/addon/services/vehicle-actions.js +2 -1
  173. package/addon/styles/fleetops-engine.css +6 -0
  174. package/addon/templates/management/contacts/index.hbs +6 -6
  175. package/addon/templates/management/drivers/index.hbs +6 -6
  176. package/addon/templates/management/fleets/index.hbs +6 -6
  177. package/addon/templates/management/fuel-reports/index.hbs +7 -7
  178. package/addon/templates/management/index.hbs +17 -17
  179. package/addon/templates/management/issues/index.hbs +6 -6
  180. package/addon/templates/management/places/index.hbs +6 -6
  181. package/addon/templates/management/vehicles/index.hbs +6 -6
  182. package/addon/templates/management/vendors/index.hbs +6 -6
  183. package/addon/templates/operations/orders/index/config/types.hbs +3 -3
  184. package/addon/templates/operations/orders/index/config.hbs +3 -4
  185. package/addon/templates/operations/orders/index/new.hbs +73 -73
  186. package/addon/templates/operations/orders/index/view.hbs +147 -53
  187. package/addon/templates/operations/orders/index.hbs +13 -13
  188. package/addon/templates/operations/scheduler/index.hbs +3 -3
  189. package/addon/templates/operations/service-rates/index/new.hbs +79 -81
  190. package/addon/templates/operations/service-rates/index.hbs +6 -6
  191. package/composer.json +2 -2
  192. package/extension.json +1 -1
  193. package/package.json +4 -2
  194. package/server/resources/views/labels/default.php +40 -18
  195. package/server/resources/views/labels/waypoint-label.php +126 -0
  196. package/server/src/Http/Controllers/Api/v1/DriverController.php +4 -1
  197. package/server/src/Http/Controllers/Api/v1/OrderController.php +1 -1
  198. package/server/src/Http/Resources/v1/Entity.php +2 -2
  199. package/server/src/Http/Resources/v1/Payload.php +11 -30
  200. package/server/src/Http/Resources/v1/Place.php +3 -3
  201. package/server/src/Http/Resources/v1/Waypoint.php +101 -0
  202. package/server/src/Models/Entity.php +1 -1
  203. package/server/src/Models/Payload.php +39 -0
  204. package/server/src/Models/Place.php +5 -2
  205. package/server/src/Models/Proof.php +1 -1
  206. package/server/src/Models/Waypoint.php +15 -3
  207. package/translations/en-us.yaml +1343 -3
@@ -14,6 +14,7 @@ import isNotEmpty from '@fleetbase/ember-core/utils/is-not-empty';
14
14
  import getRoutingHost from '@fleetbase/ember-core/utils/get-routing-host';
15
15
  import groupBy from '@fleetbase/ember-core/utils/macros/group-by';
16
16
  import getWithDefault from '@fleetbase/ember-core/utils/get-with-default';
17
+ import isModel from '@fleetbase/ember-core/utils/is-model';
17
18
 
18
19
  L.Bounds.prototype.intersects = function (bounds) {
19
20
  var min = this.min,
@@ -71,6 +72,13 @@ export default class OperationsOrdersIndexNewController extends BaseController {
71
72
  */
72
73
  @service fileQueue;
73
74
 
75
+ /**
76
+ * Inject the `intl` service
77
+ *
78
+ * @var {Service}
79
+ */
80
+ @service intl;
81
+
74
82
  /**
75
83
  * Inject the `fetch` service
76
84
  *
@@ -116,6 +124,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
116
124
  @tracked meta = [];
117
125
  @tracked entities = [];
118
126
  @tracked waypoints = [];
127
+ @tracked payloadCoordinates = [];
119
128
  @tracked types = [];
120
129
  @tracked serviceRates = [];
121
130
  @tracked selectedServiceRate;
@@ -184,8 +193,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
184
193
  return isOrderTypeSet && isPickupSet && isDropoffSet;
185
194
  }
186
195
 
187
- @computed('payload.{dropoff,pickup,waypoints}', 'waypoints.[]')
188
- get payloadCoordinates() {
196
+ updatePayloadCoordinates() {
189
197
  let waypoints = [];
190
198
  let coordinates = [];
191
199
 
@@ -200,9 +208,30 @@ export default class OperationsOrdersIndexNewController extends BaseController {
200
208
  }
201
209
  });
202
210
 
203
- return coordinates;
211
+ this.payloadCoordinates = coordinates;
204
212
  }
205
213
 
214
+ // @computed('payload.{dropoff,pickup,waypoints}', 'waypoints.[]')
215
+ // get payloadCoordinates() {
216
+ // let waypoints = [];
217
+ // let coordinates = [];
218
+
219
+ // console.log('[this.waypoints]', this.waypoints);
220
+
221
+ // waypoints.pushObjects([this.payload.pickup, ...this.waypoints.map((waypoint) => waypoint.place), this.payload.dropoff]);
222
+ // waypoints.forEach((place) => {
223
+ // if (place && place.get('longitude') && place.get('latitude')) {
224
+ // if (place.hasInvalidCoordinates) {
225
+ // return;
226
+ // }
227
+
228
+ // coordinates.pushObject([place.get('longitude'), place.get('latitude')]);
229
+ // }
230
+ // });
231
+
232
+ // return coordinates;
233
+ // }
234
+
206
235
  @computed('payloadCoordinates.length', 'waypoints.[]') get isServicable() {
207
236
  return this.payloadCoordinates.length >= 2;
208
237
  }
@@ -297,7 +326,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
297
326
 
298
327
  // transition to order view
299
328
  return this.hostRouter.transitionTo(`${engineMountPoint}operations.orders.index.view`, order).then(() => {
300
- this.notifications.success(`New Order ${order.public_id} Created`);
329
+ this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.new.success-message', { orderId: order.public_id }));
301
330
  this.loader.removeLoader();
302
331
  this.resetForm();
303
332
  later(
@@ -382,7 +411,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
382
411
  };
383
412
 
384
413
  if (!uploadQueue.length) {
385
- return this.notifications.warning('No files in queue to upload!');
414
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.warning-message'));
386
415
  }
387
416
 
388
417
  modal.startLoading();
@@ -423,7 +452,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
423
452
  });
424
453
  }
425
454
 
426
- this.notifications.success('Import completed.');
455
+ this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.new.import-success'));
427
456
  this.isCsvImportedOrder = true;
428
457
  this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
429
458
  modal.done();
@@ -499,8 +528,8 @@ export default class OperationsOrdersIndexNewController extends BaseController {
499
528
 
500
529
  let payload = this.payload.serialize();
501
530
  let route = this.getRoute();
502
- let distance = get(route, 'payload.summary.totalDistance');
503
- let time = get(route, 'payload.summary.totalTime');
531
+ let distance = get(route, 'details.summary.totalDistance');
532
+ let time = get(route, 'details.summary.totalTime');
504
533
  let service_type = this.order.type;
505
534
  let scheduled_at = this.order.scheduled_at;
506
535
  let facilitator = this.order.facilitator?.get('public_id');
@@ -532,7 +561,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
532
561
 
533
562
  this.fetch
534
563
  .post('service-quotes/preliminary', {
535
- payload,
564
+ payload: this._getSerializedPayload(payload),
536
565
  distance,
537
566
  time,
538
567
  service,
@@ -542,6 +571,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
542
571
  is_route_optimized,
543
572
  })
544
573
  .then((serviceQuotes) => {
574
+ console.log('[serviceQuotes]', serviceQuotes);
545
575
  set(this, 'serviceQuotes', isArray(serviceQuotes) ? serviceQuotes : []);
546
576
 
547
577
  if (this.serviceQuotes.length && this.isUsingIntegratedVendor) {
@@ -549,13 +579,38 @@ export default class OperationsOrdersIndexNewController extends BaseController {
549
579
  }
550
580
  })
551
581
  .catch(() => {
552
- this.notifications.warning('Failed to fetch service quotes for this order.');
582
+ this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.service-warning'));
553
583
  })
554
584
  .finally(() => {
555
585
  this.isFetchingQuotes = false;
556
586
  });
557
587
  }
558
588
 
589
+ _getSerializedPayload(payload) {
590
+ const serialized = {
591
+ pickup: payload.pickup,
592
+ dropoff: payload.dropoff,
593
+ };
594
+
595
+ if (isModel(payload.pickup)) {
596
+ serialized.pickup = payload.pickup.toJSON();
597
+ }
598
+
599
+ if (isModel(payload.dropoff)) {
600
+ serialized.dropoff = payload.dropoff.toJSON();
601
+ }
602
+
603
+ if (isArray(payload.entities)) {
604
+ serialized.entities = payload.entities.toArray();
605
+ }
606
+
607
+ if (isArray(payload.waypoints)) {
608
+ serialized.waypoints = payload.waypoints.toArray();
609
+ }
610
+
611
+ return serialized;
612
+ }
613
+
559
614
  @action scheduleOrder(dateInstance) {
560
615
  this.order.scheduled_at = dateInstance;
561
616
  }
@@ -818,7 +873,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
818
873
  });
819
874
  }
820
875
  } else {
821
- this.notifications.warning('No route to preview.');
876
+ this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.no-route-warning'));
822
877
  }
823
878
  }
824
879
 
@@ -846,7 +901,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
846
901
  const routingHost = getRoutingHost(this.payload, this.waypoints);
847
902
 
848
903
  const response = await this.fetch.routing(coordinates, { source: 'any', destination: 'any', annotations: true }, { host: routingHost }).catch(() => {
849
- this.notifications.error('Route optimization failed, check route entry and try again.');
904
+ this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.new.route-error'));
850
905
  this.isOptimizingRoute = false;
851
906
  });
852
907
 
@@ -902,7 +957,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
902
957
  maxZoom: 13,
903
958
  });
904
959
  } else {
905
- this.notifications.error('Route optimization failed, check route entry and try again.');
960
+ this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.new.route-error'));
906
961
  this.isOptimizingRoute = false;
907
962
  }
908
963
  }
@@ -936,9 +991,33 @@ export default class OperationsOrdersIndexNewController extends BaseController {
936
991
  @action toggleMultiDropOrder(isMultipleDropoffOrder) {
937
992
  this.isMultipleDropoffOrder = isMultipleDropoffOrder;
938
993
 
994
+ const { pickup, dropoff } = this.payload;
995
+
939
996
  if (isMultipleDropoffOrder) {
940
- this.addWaypoint();
997
+ if (pickup) {
998
+ this.addWaypoint({ place: pickup });
999
+
1000
+ if (dropoff) {
1001
+ this.addWaypoint({ place: dropoff });
1002
+ }
1003
+
1004
+ // clear pickup and dropoff
1005
+ this.payload.setProperties({ pickup: null, dropoff: null });
1006
+ } else {
1007
+ this.addWaypoint();
1008
+ }
941
1009
  } else {
1010
+ const pickup = get(this.waypoints, '0.place');
1011
+ const dropoff = get(this.waypoints, '1.place');
1012
+
1013
+ if (pickup) {
1014
+ this.setPayloadPlace('pickup', pickup);
1015
+ }
1016
+
1017
+ if (dropoff) {
1018
+ this.setPayloadPlace('dropoff', dropoff);
1019
+ }
1020
+
942
1021
  this.clearWaypoints();
943
1022
  }
944
1023
  }
@@ -1028,7 +1107,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1028
1107
  let label, value;
1029
1108
 
1030
1109
  this.modalsManager.show('modals/meta-field-form', {
1031
- title: 'Add custom field to order',
1110
+ title: this.intl.t('fleet-ops.operations.orders.index.new.custom-field-title'),
1032
1111
  acceptButtonIcon: 'check',
1033
1112
  acceptButtonIconPrefix: 'fas',
1034
1113
  acceptButtonText: 'Done',
@@ -1041,11 +1120,11 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1041
1120
  const value = modal.getOption('value');
1042
1121
 
1043
1122
  if (!label) {
1044
- return this.notifications.warning('Custom field must have a label');
1123
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.label-warning'));
1045
1124
  }
1046
1125
 
1047
1126
  if (!value) {
1048
- return this.notifications.warning('Custom field must have a value');
1127
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.value-warning'));
1049
1128
  }
1050
1129
 
1051
1130
  modal.startLoading();
@@ -1066,7 +1145,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1066
1145
  const { label, value } = metaField;
1067
1146
 
1068
1147
  this.modalsManager.show('modals/meta-field-form', {
1069
- title: 'Edit custom field',
1148
+ title: this.intl.t('fleet-ops.operations.orders.index.new.edit-field-title'),
1070
1149
  acceptButtonIcon: 'save',
1071
1150
  acceptButtonText: 'Save Changes',
1072
1151
  label,
@@ -1076,11 +1155,11 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1076
1155
  const value = modal.getOption('value');
1077
1156
 
1078
1157
  if (!label) {
1079
- return this.notifications.warning('Custom field must have a label');
1158
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.label-warning'));
1080
1159
  }
1081
1160
 
1082
1161
  if (!value) {
1083
- return this.notifications.warning('Custom field must have a value');
1162
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.new.value-warning'));
1084
1163
  }
1085
1164
 
1086
1165
  modal.startLoading();
@@ -1106,7 +1185,7 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1106
1185
  }
1107
1186
 
1108
1187
  this.modalsManager.show('modals/edit-meta-form', {
1109
- title: 'Edit Metadata',
1188
+ title: this.intl.t('fleet-ops.operations.orders.index.new.edit-metadata'),
1110
1189
  hideDeclineButton: true,
1111
1190
  acceptButtonIcon: 'check',
1112
1191
  acceptButtonIconPrefix: 'fas',
@@ -1146,6 +1225,8 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1146
1225
  if (this.isUsingIntegratedVendor) {
1147
1226
  this.getQuotes();
1148
1227
  }
1228
+
1229
+ this.updatePayloadCoordinates();
1149
1230
  }
1150
1231
 
1151
1232
  @action sortWaypoints({ sourceList, sourceIndex, targetList, targetIndex }) {
@@ -1163,10 +1244,10 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1163
1244
  }
1164
1245
  }
1165
1246
 
1166
- @action addWaypoint() {
1167
- const waypoint = this.store.createRecord('waypoint');
1168
-
1247
+ @action addWaypoint(properties = {}) {
1248
+ const waypoint = this.store.createRecord('waypoint', properties);
1169
1249
  this.waypoints.pushObject(waypoint);
1250
+ this.updatePayloadCoordinates();
1170
1251
  }
1171
1252
 
1172
1253
  @action setWaypointPlace(index, place) {
@@ -1183,6 +1264,8 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1183
1264
  if (this.isUsingIntegratedVendor) {
1184
1265
  this.getQuotes();
1185
1266
  }
1267
+
1268
+ this.updatePayloadCoordinates();
1186
1269
  }
1187
1270
 
1188
1271
  @action removeWaypoint(waypoint) {
@@ -1197,6 +1280,8 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1197
1280
  } else {
1198
1281
  this.previewDraftOrderRoute(this.payload, this.waypoints, this.isMultipleDropoffOrder);
1199
1282
  }
1283
+
1284
+ this.updatePayloadCoordinates();
1200
1285
  }
1201
1286
 
1202
1287
  @action clearWaypoints() {
@@ -1235,28 +1320,34 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1235
1320
 
1236
1321
  @action editEntity(entity) {
1237
1322
  this.modalsManager.show('modals/entity-form', {
1238
- title: 'Edit Item',
1323
+ title: this.intl.t('fleet-ops.operations.orders.index.new.edit-item'),
1239
1324
  acceptButtonText: 'Save Changes',
1240
1325
  entity,
1241
1326
  uploadNewPhoto: (file) => {
1327
+ const fileUrl = URL.createObjectURL(file.file);
1328
+
1242
1329
  if (entity.get('isNew')) {
1243
1330
  const { queue } = file;
1244
- const fileUrl = URL.createObjectURL(file.blob);
1245
1331
 
1246
1332
  this.modalsManager.setOption('pendingFileUpload', file);
1247
1333
  entity.set('photo_url', fileUrl);
1248
- // entity.set('photo_upload', fileUrl);
1249
1334
  queue.remove(file);
1250
1335
  return;
1336
+ } else {
1337
+ entity.set('photo_url', fileUrl);
1251
1338
  }
1252
1339
 
1340
+ // Indicate loading
1341
+ this.modalsManager.startLoading();
1342
+
1343
+ // Perform upload
1253
1344
  return this.fetch.uploadFile.perform(
1254
1345
  file,
1255
1346
  {
1256
1347
  path: `uploads/${this.currentUser.companyId}/entities/${entity.id}`,
1257
1348
  subject_uuid: entity.id,
1258
- subject_type: `entity`,
1259
- type: `entity_photo`,
1349
+ subject_type: 'fleet-ops:entity',
1350
+ type: 'entity_photo',
1260
1351
  },
1261
1352
  (uploadedFile) => {
1262
1353
  entity.setProperties({
@@ -1264,6 +1355,13 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1264
1355
  photo_url: uploadedFile.url,
1265
1356
  photo: uploadedFile,
1266
1357
  });
1358
+
1359
+ // Stop loading
1360
+ this.modalsManager.stopLoading();
1361
+ },
1362
+ () => {
1363
+ // Stop loading
1364
+ this.modalsManager.stopLoading();
1267
1365
  }
1268
1366
  );
1269
1367
  },
@@ -1271,7 +1369,6 @@ export default class OperationsOrdersIndexNewController extends BaseController {
1271
1369
  modal.startLoading();
1272
1370
 
1273
1371
  const pendingFileUpload = modal.getOption('pendingFileUpload');
1274
-
1275
1372
  return entity.save().then(() => {
1276
1373
  if (pendingFileUpload) {
1277
1374
  return modal.invoke('uploadNewPhoto', pendingFileUpload);
@@ -6,6 +6,7 @@ import { action, computed } from '@ember/object';
6
6
  import { isArray } from '@ember/array';
7
7
  import { later } from '@ember/runloop';
8
8
  import { not, notEmpty, alias } from '@ember/object/computed';
9
+ import { task } from 'ember-concurrency-decorators';
9
10
  import { OSRMv1, Control as RoutingControl } from '@fleetbase/leaflet-routing-machine';
10
11
  import groupBy from '@fleetbase/ember-core/utils/macros/group-by';
11
12
  import findClosestWaypoint from '@fleetbase/ember-core/utils/find-closest-waypoint';
@@ -41,7 +42,14 @@ export default class OperationsOrdersIndexViewController extends BaseController
41
42
  @controller('management.drivers.index') driversController;
42
43
 
43
44
  /**
44
- * Inject the `modals-manager` service
45
+ * Inject the `store` service
46
+ *
47
+ * @var {Service}
48
+ */
49
+ @service store;
50
+
51
+ /**
52
+ * Inject the `modalsManager` service
45
53
  *
46
54
  * @var {Service}
47
55
  */
@@ -54,6 +62,13 @@ export default class OperationsOrdersIndexViewController extends BaseController
54
62
  */
55
63
  @service notifications;
56
64
 
65
+ /**
66
+ * Inject the `intl` service
67
+ *
68
+ * @var {Service}
69
+ */
70
+ @service intl;
71
+
57
72
  /**
58
73
  * Inject the `currentUser` service
59
74
  *
@@ -142,7 +157,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
142
157
 
143
158
  // create groups
144
159
  this.model.payload.waypoints.forEach((waypoint) => {
145
- const destinationId = waypoint.id || null;
160
+ const destinationId = waypoint.id;
146
161
 
147
162
  if (destinationId) {
148
163
  const entities = this.model.payload.entities.filter((entity) => entity.destination_uuid === destinationId);
@@ -164,6 +179,15 @@ export default class OperationsOrdersIndexViewController extends BaseController
164
179
  return groups;
165
180
  }
166
181
 
182
+ @task *loadOrderRelations(order) {
183
+ yield order.loadPayload();
184
+ yield order.loadDriver();
185
+ yield order.loadTrackingNumber();
186
+ yield order.loadCustomer();
187
+ yield order.loadTrackingActivity();
188
+ yield order.loadOrderConfig();
189
+ }
190
+
167
191
  @action resetView() {
168
192
  this.removeRoutingControlPreview();
169
193
  this.resetInterface();
@@ -356,7 +380,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
356
380
  options = options === null ? {} : options;
357
381
 
358
382
  this.modalsManager.show('modals/order-form', {
359
- title: 'Edit Order Details',
383
+ title: this.intl.t('fleet-ops.operations.orders.index.view.edit-order-title'),
360
384
  acceptButtonText: 'Save Changes',
361
385
  acceptButtonIcon: 'save',
362
386
  setOrderFacilitator: (model) => {
@@ -389,7 +413,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
389
413
  confirm: (modal) => {
390
414
  modal.startLoading();
391
415
  return order.save().then(() => {
392
- this.notifications.success(options.successNotification || `'${order.public_id}' details has been updated.`);
416
+ this.notifications.success(options.successNotification || this.intl.t('fleet-ops.operations.orders.index.view.update-success', { orderId: order.public_id }));
393
417
  });
394
418
  },
395
419
  decline: () => {
@@ -408,7 +432,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
408
432
  */
409
433
  @action viewOrderMeta(order) {
410
434
  this.modalsManager.show('modals/order-meta', {
411
- title: 'Order Metadata',
435
+ title: this.intl.t('fleet-ops.operations.orders.index.view.order-metadata'),
412
436
  acceptButtonText: 'Done',
413
437
  acceptButtonIcon: 'check',
414
438
  acceptButtonIconPrefix: 'fas',
@@ -419,8 +443,8 @@ export default class OperationsOrdersIndexViewController extends BaseController
419
443
 
420
444
  @action unassignDriver(order, options = {}) {
421
445
  this.modalsManager.confirm({
422
- title: `Are you sure you wish to unassing the driver (${order.driver_assigned.name}) from this order?`,
423
- body: `Once the driver is unassigned, the driver will no longer have access to this orders details.`,
446
+ title: this.intl.t('fleet-ops.operations.orders.index.view.edit-order-title', { driverName: order.driver_assigned.name }),
447
+ body: this.intl.t('fleet-ops.operations.orders.index.view.unassign-body'),
424
448
  order,
425
449
  confirm: (modal) => {
426
450
  modal.startLoading();
@@ -433,7 +457,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
433
457
  return order
434
458
  .save()
435
459
  .then(() => {
436
- this.notifications.success(`Driver has been unassigned from this order.`);
460
+ this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.view.unassign-success'));
437
461
  })
438
462
  .catch((error) => {
439
463
  this.notifications.serverError(error);
@@ -456,7 +480,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
456
480
  await this.modalsManager.done();
457
481
 
458
482
  this.modalsManager.show('modals/order-route-form', {
459
- title: 'Edit Order Route',
483
+ title: this.intl.t('fleet-ops.operations.orders.index.view.edit-route-title'),
460
484
  acceptButtonText: 'Save Changes',
461
485
  acceptButtonIcon: 'save',
462
486
  order,
@@ -521,7 +545,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
521
545
  const routingHost = getRoutingHost(order.payload, order.payload.waypoints);
522
546
 
523
547
  const response = await this.fetch.routing(coordinates, { source: 'any', destination: 'any', annotations: true }, { host: routingHost }).catch(() => {
524
- this.notifications.error('Route optimization failed, check route entry and try again.');
548
+ this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.view.route-error'));
525
549
  this.modalsManager.setOption('isOptimizingRoute', false);
526
550
  });
527
551
 
@@ -542,7 +566,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
542
566
  order.payload.waypoints = sortedWaypoints;
543
567
  }
544
568
  } else {
545
- this.notifications.error('Route optimization failed, check route entry and try again.');
569
+ this.notifications.error(this.intl.t('fleet-ops.operations.orders.index.view.route-error'));
546
570
  }
547
571
 
548
572
  this.modalsManager.setOption('isOptimizingRoute', false);
@@ -551,7 +575,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
551
575
  modal.startLoading();
552
576
 
553
577
  return order.payload.save().then(() => {
554
- this.notifications.success(options.successNotification ?? `'${order.public_id}' route details updated.`);
578
+ this.notifications.success(options.successNotification ?? this.intl.t('fleet-ops.operations.orders.index.view.route-update-success', { orderId: order.public_id }));
555
579
  });
556
580
  },
557
581
  decline: () => {
@@ -627,7 +651,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
627
651
  await this.modalsManager.done();
628
652
 
629
653
  this.modalsManager.show(`modals/order-new-activity`, {
630
- title: 'Add new activity to order',
654
+ title: this.intl.t('fleet-ops.operations.orders.index.view.add-activity-title'),
631
655
  acceptButton: false,
632
656
  selected: null,
633
657
  custom: {
@@ -647,7 +671,7 @@ export default class OperationsOrdersIndexViewController extends BaseController
647
671
  if (!custom.status || !custom.details || !custom.code) {
648
672
  modal.stopLoading();
649
673
 
650
- return this.notifications.warning('Invalid custom status entry.');
674
+ return this.notifications.warning(this.intl.t('fleet-ops.operations.orders.index.view.invalid-warning'));
651
675
  }
652
676
 
653
677
  activity = custom;
@@ -690,13 +714,13 @@ export default class OperationsOrdersIndexViewController extends BaseController
690
714
  }
691
715
 
692
716
  this.modalsManager.show(`modals/order-assign-driver`, {
693
- title: order.driver_uuid ? 'Change order driver' : 'Assign driver to order',
717
+ title: order.driver_uuid ? this.intl.t('fleet-ops.operations.orders.index.view.change-order') : this.intl.t('fleet-ops.operations.orders.index.view.assign-order'),
694
718
  acceptButtonText: 'Save Changes',
695
719
  order,
696
720
  confirm: (modal) => {
697
721
  modal.startLoading();
698
722
  return order.save().then(() => {
699
- this.notifications.success(`${order.public_id} assigned driver updated.`);
723
+ this.notifications.success(this.intl.t('fleet-ops.operations.orders.index.view.assign-success', { orderId: order.public_id }));
700
724
  });
701
725
  },
702
726
  });
@@ -834,23 +858,30 @@ export default class OperationsOrdersIndexViewController extends BaseController
834
858
  acceptButtonText: 'Save Changes',
835
859
  entity,
836
860
  uploadNewPhoto: (file) => {
861
+ const fileUrl = URL.createObjectURL(file.blob);
862
+
837
863
  if (entity.get('isNew')) {
838
864
  const { queue } = file;
839
- const fileUrl = URL.createObjectURL(file.blob);
840
865
 
841
866
  this.modalsManager.setOption('pendingFileUpload', file);
842
867
  entity.set('photo_url', fileUrl);
843
868
  queue.remove(file);
844
869
  return;
870
+ } else {
871
+ entity.set('photo_url', fileUrl);
845
872
  }
846
873
 
874
+ // Indicate loading
875
+ this.modalsManager.startLoading();
876
+
877
+ // Perform upload
847
878
  return this.fetch.uploadFile.perform(
848
879
  file,
849
880
  {
850
881
  path: `uploads/${this.currentUser.companyId}/entities/${entity.id}`,
851
882
  subject_uuid: entity.id,
852
- subject_type: `entity`,
853
- type: `entity_photo`,
883
+ subject_type: 'fleet-ops:entity',
884
+ type: 'entity_photo',
854
885
  },
855
886
  (uploadedFile) => {
856
887
  entity.setProperties({
@@ -858,6 +889,13 @@ export default class OperationsOrdersIndexViewController extends BaseController
858
889
  photo_url: uploadedFile.url,
859
890
  photo: uploadedFile,
860
891
  });
892
+
893
+ // Stop loading
894
+ this.modalsManager.stopLoading();
895
+ },
896
+ () => {
897
+ // Stop loading
898
+ this.modalsManager.stopLoading();
861
899
  }
862
900
  );
863
901
  },
@@ -865,7 +903,6 @@ export default class OperationsOrdersIndexViewController extends BaseController
865
903
  modal.startLoading();
866
904
 
867
905
  const pendingFileUpload = modal.getOption('pendingFileUpload');
868
-
869
906
  return entity.save().then(() => {
870
907
  if (pendingFileUpload) {
871
908
  return modal.invoke('uploadNewPhoto', pendingFileUpload);