@fleetbase/fleetops-engine 0.3.9 → 0.4.1

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 (209) 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 +5 -1
  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 +5 -1
  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 +7 -2
  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 +6 -1
  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 +110 -25
  162. package/addon/controllers/operations/orders/index/view.js +40 -16
  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 +9 -1
  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/management/places/index.js +1 -1
  169. package/addon/routes/operations/orders/index/view.js +2 -14
  170. package/addon/services/driver-actions.js +9 -8
  171. package/addon/services/vehicle-actions.js +2 -1
  172. package/addon/templates/management/contacts/index.hbs +6 -6
  173. package/addon/templates/management/drivers/index.hbs +6 -6
  174. package/addon/templates/management/fleets/index.hbs +6 -6
  175. package/addon/templates/management/fuel-reports/index.hbs +7 -7
  176. package/addon/templates/management/index.hbs +17 -17
  177. package/addon/templates/management/issues/index.hbs +6 -6
  178. package/addon/templates/management/places/index.hbs +6 -6
  179. package/addon/templates/management/vehicles/index.hbs +6 -6
  180. package/addon/templates/management/vendors/index.hbs +6 -6
  181. package/addon/templates/operations/orders/index/config/types.hbs +3 -3
  182. package/addon/templates/operations/orders/index/config.hbs +3 -4
  183. package/addon/templates/operations/orders/index/new.hbs +72 -72
  184. package/addon/templates/operations/orders/index/view.hbs +147 -53
  185. package/addon/templates/operations/orders/index.hbs +13 -13
  186. package/addon/templates/operations/scheduler/index.hbs +3 -3
  187. package/addon/templates/operations/service-rates/index/new.hbs +79 -81
  188. package/addon/templates/operations/service-rates/index.hbs +6 -6
  189. package/composer.json +2 -2
  190. package/extension.json +1 -1
  191. package/package.json +3 -1
  192. package/server/resources/views/labels/default.php +40 -18
  193. package/server/resources/views/labels/waypoint-label.php +126 -0
  194. package/server/src/Console/Commands/FixDriverCompanies.php +65 -0
  195. package/server/src/Exceptions/IntegratedVendorException.php +11 -12
  196. package/server/src/Http/Controllers/Api/v1/DriverController.php +41 -32
  197. package/server/src/Http/Controllers/Api/v1/OrderController.php +1 -1
  198. package/server/src/Http/Controllers/Internal/v1/DriverController.php +17 -1
  199. package/server/src/Http/Resources/v1/Driver.php +1 -1
  200. package/server/src/Http/Resources/v1/Entity.php +2 -2
  201. package/server/src/Http/Resources/v1/Payload.php +11 -30
  202. package/server/src/Http/Resources/v1/Place.php +3 -3
  203. package/server/src/Http/Resources/v1/Waypoint.php +101 -0
  204. package/server/src/Models/Payload.php +39 -0
  205. package/server/src/Models/Place.php +5 -2
  206. package/server/src/Models/Waypoint.php +15 -3
  207. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  208. package/server/src/Support/Flow.php +19 -2
  209. package/translations/en-us.yaml +1341 -3
@@ -22,6 +22,13 @@ export default class ManagementVendorsIndexController extends BaseController {
22
22
  */
23
23
  @service modalsManager;
24
24
 
25
+ /**
26
+ * Inject the `intl` service
27
+ *
28
+ * @var {Service}
29
+ */
30
+ @service intl;
31
+
25
32
  /**
26
33
  * Inject the `crud` service
27
34
  *
@@ -162,7 +169,7 @@ export default class ManagementVendorsIndexController extends BaseController {
162
169
  */
163
170
  @tracked columns = [
164
171
  {
165
- label: 'Name',
172
+ label: this.intl.t('fleet-ops.common.name'),
166
173
  valuePath: 'name',
167
174
  width: '180px',
168
175
  cellComponent: 'table/cell/media-name',
@@ -174,7 +181,7 @@ export default class ManagementVendorsIndexController extends BaseController {
174
181
  filterComponent: 'filter/string',
175
182
  },
176
183
  {
177
- label: 'ID',
184
+ label: this.intl.t('fleet-ops.common.id'),
178
185
  valuePath: 'public_id',
179
186
  cellComponent: 'click-to-copy',
180
187
  width: '110px',
@@ -184,7 +191,7 @@ export default class ManagementVendorsIndexController extends BaseController {
184
191
  filterComponent: 'filter/string',
185
192
  },
186
193
  {
187
- label: 'Internal ID',
194
+ label: this.intl.t('fleet-ops.common.internal-id'),
188
195
  valuePath: 'internal_id',
189
196
  cellComponent: 'click-to-copy',
190
197
  width: '100px',
@@ -194,7 +201,7 @@ export default class ManagementVendorsIndexController extends BaseController {
194
201
  filterComponent: 'filter/string',
195
202
  },
196
203
  {
197
- label: 'Email',
204
+ label: this.intl.t('fleet-ops.common.email'),
198
205
  valuePath: 'email',
199
206
  cellComponent: 'click-to-copy',
200
207
  width: '80px',
@@ -205,7 +212,7 @@ export default class ManagementVendorsIndexController extends BaseController {
205
212
  filterComponent: 'filter/string',
206
213
  },
207
214
  {
208
- label: 'Website URL',
215
+ label: this.intl.t('fleet-ops.common.website-url'),
209
216
  valuePath: 'website_url',
210
217
  cellComponent: 'click-to-copy',
211
218
  width: '80px',
@@ -216,7 +223,7 @@ export default class ManagementVendorsIndexController extends BaseController {
216
223
  filterComponent: 'filter/string',
217
224
  },
218
225
  {
219
- label: 'Phone',
226
+ label: this.intl.t('fleet-ops.common.phone'),
220
227
  valuePath: 'phone',
221
228
  cellComponent: 'click-to-copy',
222
229
  width: '80px',
@@ -227,7 +234,7 @@ export default class ManagementVendorsIndexController extends BaseController {
227
234
  filterComponent: 'filter/string',
228
235
  },
229
236
  {
230
- label: 'Address',
237
+ label: this.intl.t('fleet-ops.common.address'),
231
238
  valuePath: 'address',
232
239
  cellComponent: 'table/cell/anchor',
233
240
  action: this.viewVendorPlace,
@@ -239,7 +246,7 @@ export default class ManagementVendorsIndexController extends BaseController {
239
246
  filterComponent: 'filter/string',
240
247
  },
241
248
  {
242
- label: 'Type',
249
+ label: this.intl.t('fleet-ops.common.type'),
243
250
  valuePath: 'type',
244
251
  cellComponent: 'table/cell/anchor',
245
252
  action: this.viewVendorPlace,
@@ -251,7 +258,7 @@ export default class ManagementVendorsIndexController extends BaseController {
251
258
  filterComponent: 'filter/string',
252
259
  },
253
260
  {
254
- label: 'Country',
261
+ label: this.intl.t('fleet-ops.common.country'),
255
262
  valuePath: 'country',
256
263
  cellComponent: 'table/cell/base',
257
264
  cellClassNames: 'uppercase',
@@ -263,7 +270,7 @@ export default class ManagementVendorsIndexController extends BaseController {
263
270
  filterParam: 'country',
264
271
  },
265
272
  {
266
- label: 'Created At',
273
+ label: this.intl.t('fleet-ops.common.created-at'),
267
274
  valuePath: 'createdAt',
268
275
  sortParam: 'created_at',
269
276
  width: '150px',
@@ -273,7 +280,7 @@ export default class ManagementVendorsIndexController extends BaseController {
273
280
  filterComponent: 'filter/date',
274
281
  },
275
282
  {
276
- label: 'Updated At',
283
+ label: this.intl.t('fleet-ops.common.updated-at'),
277
284
  valuePath: 'updatedAt',
278
285
  sortParam: 'updated_at',
279
286
  width: '130px',
@@ -284,7 +291,7 @@ export default class ManagementVendorsIndexController extends BaseController {
284
291
  filterComponent: 'filter/date',
285
292
  },
286
293
  {
287
- label: 'Status',
294
+ label: this.intl.t('fleet-ops.common.status'),
288
295
  valuePath: 'status',
289
296
  cellComponent: 'table/cell/status',
290
297
  width: '130px',
@@ -306,18 +313,18 @@ export default class ManagementVendorsIndexController extends BaseController {
306
313
  width: '7%',
307
314
  actions: [
308
315
  {
309
- label: 'View Vendor Details',
316
+ label: this.intl.t('fleet-ops.management.vendors.index.view-vendor'),
310
317
  fn: this.viewVendor,
311
318
  },
312
319
  {
313
- label: 'Edit Vendor',
320
+ label: this.intl.t('fleet-ops.management.vendors.index.edit-vendor'),
314
321
  fn: this.editVendor,
315
322
  },
316
323
  {
317
324
  separator: true,
318
325
  },
319
326
  {
320
- label: 'Delete Vendor',
327
+ label: this.intl.t('fleet-ops.management.vendors.index.delete-vendor'),
321
328
  fn: this.deleteVendor,
322
329
  },
323
330
  ],
@@ -425,7 +432,7 @@ export default class ManagementVendorsIndexController extends BaseController {
425
432
 
426
433
  this.crud.bulkDelete(selected, {
427
434
  modelNamePath: `name`,
428
- acceptButtonText: 'Delete Vendors',
435
+ acceptButtonText: this.intl.t('fleet-ops.management.vendors.index.delete-button'),
429
436
  onSuccess: () => {
430
437
  return this.hostRouter.refresh();
431
438
  },
@@ -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,7 +1320,7 @@ 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) => {
@@ -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
  });