@fleetbase/fleetops-engine 0.6.70 → 0.6.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASE.md +21 -47
- package/addon/components/order/details/activity.hbs +8 -6
- package/addon/components/order/details/activity.js +9 -0
- package/addon/components/order/details.hbs +29 -0
- package/addon/components/order/details.js +26 -0
- package/addon/components/order/form/details.hbs +30 -4
- package/addon/components/order/form/details.js +46 -0
- package/addon/components/order/form/route.hbs +4 -2
- package/addon/components/order/form/route.js +11 -0
- package/addon/components/order/form.hbs +12 -0
- package/addon/components/order/form.js +21 -1
- package/addon/components/order/kanban.js +72 -0
- package/addon/components/order-config-manager/activity-flow.js +45 -10
- package/addon/components/order-config-manager/lifecycle.hbs +250 -0
- package/addon/components/order-config-manager/lifecycle.js +358 -0
- package/addon/components/order-config-manager.js +5 -1
- package/addon/controllers/analytics/reports/index.js +10 -1
- package/addon/controllers/connectivity/devices/index/details.js +1 -0
- package/addon/controllers/connectivity/devices/index.js +8 -2
- package/addon/controllers/connectivity/events/index.js +31 -1
- package/addon/controllers/connectivity/sensors/index/details.js +1 -1
- package/addon/controllers/connectivity/sensors/index.js +37 -1
- package/addon/controllers/maintenance/equipment/index/details.js +2 -2
- package/addon/controllers/maintenance/equipment/index.js +28 -9
- package/addon/controllers/maintenance/inspection-forms/index.js +32 -12
- package/addon/controllers/maintenance/inspection-submissions/index/details.js +2 -1
- package/addon/controllers/maintenance/inspection-submissions/index.js +49 -9
- package/addon/controllers/maintenance/maintenances/index/details.js +2 -0
- package/addon/controllers/maintenance/maintenances/index.js +20 -1
- package/addon/controllers/maintenance/parts/index/details.js +2 -2
- package/addon/controllers/maintenance/parts/index.js +28 -8
- package/addon/controllers/maintenance/schedules/index.js +33 -4
- package/addon/controllers/maintenance/work-orders/index/details.js +3 -3
- package/addon/controllers/maintenance/work-orders/index.js +39 -8
- package/addon/controllers/management/contacts/customers.js +13 -0
- package/addon/controllers/management/contacts/index.js +43 -1
- package/addon/controllers/management/drivers/index/details.js +1 -0
- package/addon/controllers/management/drivers/index.js +32 -2
- package/addon/controllers/management/fleets/index/details.js +1 -0
- package/addon/controllers/management/fleets/index.js +39 -1
- package/addon/controllers/management/fuel-reports/index.js +22 -2
- package/addon/controllers/management/fuel-transactions/index.js +43 -7
- package/addon/controllers/management/issues/index/details.js +1 -0
- package/addon/controllers/management/issues/index.js +22 -2
- package/addon/controllers/management/places/index.js +36 -1
- package/addon/controllers/management/trailers/index/details.js +1 -0
- package/addon/controllers/management/trailers/index.js +50 -2
- package/addon/controllers/management/vehicles/index/details.js +1 -0
- package/addon/controllers/management/vehicles/index.js +33 -2
- package/addon/controllers/management/vendors/index.js +26 -2
- package/addon/controllers/operations/orders/index/details.js +31 -4
- package/addon/controllers/operations/orders/index.js +59 -4
- package/addon/controllers/operations/service-rates/index.js +15 -1
- package/addon/extension.js +32 -0
- package/addon/routes/operations/orders/index/details.js +1 -0
- package/addon/services/contact-actions.js +1 -0
- package/addon/services/customer-actions.js +2 -1
- package/addon/services/device-actions.js +1 -0
- package/addon/services/device-event-actions.js +1 -0
- package/addon/services/driver-actions.js +4 -13
- package/addon/services/equipment-actions.js +1 -0
- package/addon/services/fleet-actions.js +1 -0
- package/addon/services/fuel-report-actions.js +1 -0
- package/addon/services/inspection-form-actions.js +1 -0
- package/addon/services/inspection-submission-actions.js +1 -0
- package/addon/services/integrated-vendor-actions.js +1 -0
- package/addon/services/issue-actions.js +1 -0
- package/addon/services/maintenance-actions.js +1 -0
- package/addon/services/maintenance-schedule-actions.js +2 -1
- package/addon/services/order-actions.js +7 -0
- package/addon/services/order-presentation.js +129 -0
- package/addon/services/part-actions.js +1 -0
- package/addon/services/place-actions.js +1 -0
- package/addon/services/sensor-actions.js +1 -0
- package/addon/services/service-area-actions.js +1 -0
- package/addon/services/service-rate-actions.js +1 -0
- package/addon/services/telematic-actions.js +1 -0
- package/addon/services/trailer-actions.js +4 -14
- package/addon/services/vehicle-actions.js +4 -13
- package/addon/services/vendor-actions.js +1 -0
- package/addon/services/work-order-actions.js +1 -0
- package/addon/services/zone-actions.js +1 -0
- package/addon/templates/analytics/reports/index/details.hbs +1 -0
- package/addon/templates/analytics/reports/index.hbs +1 -0
- package/addon/templates/connectivity/devices/index/details.hbs +1 -0
- package/addon/templates/connectivity/devices/index.hbs +1 -0
- package/addon/templates/connectivity/events/index.hbs +1 -0
- package/addon/templates/connectivity/sensors/index/details.hbs +1 -0
- package/addon/templates/connectivity/sensors/index.hbs +1 -0
- package/addon/templates/maintenance/equipment/index/details.hbs +1 -0
- package/addon/templates/maintenance/equipment/index.hbs +2 -0
- package/addon/templates/maintenance/inspection-forms/index/details.hbs +1 -0
- package/addon/templates/maintenance/inspection-forms/index.hbs +1 -0
- package/addon/templates/maintenance/inspection-submissions/index/details.hbs +1 -0
- package/addon/templates/maintenance/inspection-submissions/index.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index/details.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index.hbs +1 -0
- package/addon/templates/maintenance/parts/index/details.hbs +1 -0
- package/addon/templates/maintenance/parts/index.hbs +2 -0
- package/addon/templates/maintenance/schedules/index/details.hbs +1 -0
- package/addon/templates/maintenance/schedules/index.hbs +2 -0
- package/addon/templates/maintenance/work-orders/index/details.hbs +1 -0
- package/addon/templates/maintenance/work-orders/index.hbs +1 -0
- package/addon/templates/management/contacts/customers/details.hbs +1 -0
- package/addon/templates/management/contacts/customers.hbs +1 -0
- package/addon/templates/management/contacts/index/details.hbs +1 -0
- package/addon/templates/management/contacts/index.hbs +1 -0
- package/addon/templates/management/contacts.hbs +1 -0
- package/addon/templates/management/drivers/index/details.hbs +1 -0
- package/addon/templates/management/drivers/index.hbs +2 -0
- package/addon/templates/management/fleets/index/details.hbs +1 -0
- package/addon/templates/management/fleets/index.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
- package/addon/templates/management/fuel-reports/index.hbs +1 -0
- package/addon/templates/management/fuel-transactions/index.hbs +1 -0
- package/addon/templates/management/issues/index/details.hbs +1 -0
- package/addon/templates/management/issues/index.hbs +1 -0
- package/addon/templates/management/places/index/details.hbs +1 -0
- package/addon/templates/management/places/index.hbs +1 -0
- package/addon/templates/management/trailers/index/details.hbs +1 -0
- package/addon/templates/management/trailers/index.hbs +2 -0
- package/addon/templates/management/vehicles/index/details.hbs +1 -0
- package/addon/templates/management/vehicles/index.hbs +2 -0
- package/addon/templates/management/vendors/index/details.hbs +1 -0
- package/addon/templates/management/vendors/index.hbs +2 -0
- package/addon/templates/management/vendors/integrated.hbs +1 -0
- package/addon/templates/operations/orders/index/details.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +1 -0
- package/addon/templates/operations/service-rates/index/details.hbs +1 -0
- package/addon/templates/operations/service-rates/index.hbs +1 -0
- package/addon/utils/normalize-order-config-flow.js +6 -1
- package/app/services/order-presentation.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +34 -4
- package/server/src/Models/Order.php +35 -3
- package/server/src/Models/OrderConfig.php +129 -0
- package/server/src/Models/TrackingNumber.php +8 -4
- package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +72 -0
- package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +26 -0
- package/server/tests/OrderConfigLifecycleTest.php +120 -0
- package/server/tests/Unit/Events/OrderDispatchFailedTest.php +2 -1
- package/translations/en-us.yaml +60 -0
|
@@ -13,7 +13,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
13
13
|
@service appCache;
|
|
14
14
|
|
|
15
15
|
/** query params */
|
|
16
|
-
@tracked queryParams = [
|
|
16
|
+
@tracked queryParams = this.vendorActions.queryParamsFor([
|
|
17
17
|
'page',
|
|
18
18
|
'limit',
|
|
19
19
|
'sort',
|
|
@@ -30,7 +30,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
30
30
|
'country',
|
|
31
31
|
'address',
|
|
32
32
|
'website_url',
|
|
33
|
-
];
|
|
33
|
+
]);
|
|
34
34
|
@tracked page = 1;
|
|
35
35
|
@tracked limit;
|
|
36
36
|
@tracked sort = '-created_at';
|
|
@@ -55,16 +55,19 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
55
55
|
get actionButtons() {
|
|
56
56
|
return [
|
|
57
57
|
{
|
|
58
|
+
id: 'more',
|
|
58
59
|
component: 'dropdown-button',
|
|
59
60
|
icon: 'display',
|
|
60
61
|
size: 'xs',
|
|
61
62
|
items: [
|
|
62
63
|
{
|
|
64
|
+
id: 'table-view',
|
|
63
65
|
label: this.intl.t('common.table-view'),
|
|
64
66
|
icon: 'table-list',
|
|
65
67
|
onClick: () => this.setLayout('table'),
|
|
66
68
|
},
|
|
67
69
|
{
|
|
70
|
+
id: 'grid-view',
|
|
68
71
|
label: this.intl.t('common.grid-view'),
|
|
69
72
|
icon: 'grip',
|
|
70
73
|
onClick: () => this.setLayout('grid'),
|
|
@@ -74,11 +77,13 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
74
77
|
helpText: this.intl.t('common.change-layout'),
|
|
75
78
|
},
|
|
76
79
|
{
|
|
80
|
+
id: 'refresh',
|
|
77
81
|
icon: 'refresh',
|
|
78
82
|
onClick: this.vendorActions.refresh,
|
|
79
83
|
helpText: this.intl.t('common.refresh'),
|
|
80
84
|
},
|
|
81
85
|
{
|
|
86
|
+
id: 'create',
|
|
82
87
|
text: this.intl.t('common.new'),
|
|
83
88
|
type: 'primary',
|
|
84
89
|
icon: 'plus',
|
|
@@ -86,6 +91,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
86
91
|
permission: 'fleet-ops create vendor',
|
|
87
92
|
},
|
|
88
93
|
{
|
|
94
|
+
id: 'import',
|
|
89
95
|
text: this.intl.t('common.import'),
|
|
90
96
|
type: 'magic',
|
|
91
97
|
icon: 'upload',
|
|
@@ -93,6 +99,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
93
99
|
permission: 'fleet-ops import vendor',
|
|
94
100
|
},
|
|
95
101
|
{
|
|
102
|
+
id: 'export',
|
|
96
103
|
text: this.intl.t('common.export'),
|
|
97
104
|
icon: 'long-arrow-up',
|
|
98
105
|
iconClass: 'rotate-icon-45',
|
|
@@ -109,6 +116,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
109
116
|
|
|
110
117
|
return [
|
|
111
118
|
{
|
|
119
|
+
id: 'bulk-delete',
|
|
112
120
|
label: this.intl.t('common.delete-selected-count', { count: selected.length }),
|
|
113
121
|
class: 'text-red-500',
|
|
114
122
|
fn: this.vendorActions.bulkDelete,
|
|
@@ -121,6 +129,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
121
129
|
get columns() {
|
|
122
130
|
return [
|
|
123
131
|
{
|
|
132
|
+
id: 'name',
|
|
124
133
|
sticky: true,
|
|
125
134
|
label: this.intl.t('column.name'),
|
|
126
135
|
valuePath: 'name',
|
|
@@ -134,6 +143,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
134
143
|
filterComponent: 'filter/string',
|
|
135
144
|
},
|
|
136
145
|
{
|
|
146
|
+
id: 'public-id',
|
|
137
147
|
label: this.intl.t('column.id'),
|
|
138
148
|
valuePath: 'public_id',
|
|
139
149
|
cellComponent: 'click-to-copy',
|
|
@@ -143,6 +153,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
143
153
|
filterComponent: 'filter/string',
|
|
144
154
|
},
|
|
145
155
|
{
|
|
156
|
+
id: 'internal-id',
|
|
146
157
|
label: this.intl.t('column.internal-id'),
|
|
147
158
|
valuePath: 'internal_id',
|
|
148
159
|
cellComponent: 'click-to-copy',
|
|
@@ -152,6 +163,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
152
163
|
filterComponent: 'filter/string',
|
|
153
164
|
},
|
|
154
165
|
{
|
|
166
|
+
id: 'email',
|
|
155
167
|
label: this.intl.t('column.email'),
|
|
156
168
|
valuePath: 'email',
|
|
157
169
|
cellComponent: 'click-to-copy',
|
|
@@ -162,6 +174,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
162
174
|
filterComponent: 'filter/string',
|
|
163
175
|
},
|
|
164
176
|
{
|
|
177
|
+
id: 'website-url',
|
|
165
178
|
label: this.intl.t('column.website-url'),
|
|
166
179
|
valuePath: 'website_url',
|
|
167
180
|
cellComponent: 'click-to-copy',
|
|
@@ -172,6 +185,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
172
185
|
filterComponent: 'filter/string',
|
|
173
186
|
},
|
|
174
187
|
{
|
|
188
|
+
id: 'phone',
|
|
175
189
|
label: this.intl.t('column.phone'),
|
|
176
190
|
valuePath: 'phone',
|
|
177
191
|
cellComponent: 'click-to-copy',
|
|
@@ -182,6 +196,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
182
196
|
filterComponent: 'filter/string',
|
|
183
197
|
},
|
|
184
198
|
{
|
|
199
|
+
id: 'address',
|
|
185
200
|
label: this.intl.t('column.address'),
|
|
186
201
|
valuePath: 'address',
|
|
187
202
|
cellComponent: 'cell/place-identity',
|
|
@@ -194,6 +209,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
194
209
|
filterComponent: 'filter/string',
|
|
195
210
|
},
|
|
196
211
|
{
|
|
212
|
+
id: 'pretty-type',
|
|
197
213
|
label: this.intl.t('column.type'),
|
|
198
214
|
valuePath: 'prettyType',
|
|
199
215
|
humanize: true,
|
|
@@ -204,6 +220,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
204
220
|
filterComponent: 'filter/string',
|
|
205
221
|
},
|
|
206
222
|
{
|
|
223
|
+
id: 'country',
|
|
207
224
|
label: this.intl.t('column.country'),
|
|
208
225
|
valuePath: 'country',
|
|
209
226
|
cellComponent: 'table/cell/base',
|
|
@@ -216,6 +233,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
216
233
|
filterParam: 'country',
|
|
217
234
|
},
|
|
218
235
|
{
|
|
236
|
+
id: 'created-at',
|
|
219
237
|
label: this.intl.t('column.created-at'),
|
|
220
238
|
valuePath: 'createdAt',
|
|
221
239
|
sortParam: 'created_at',
|
|
@@ -225,6 +243,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
225
243
|
filterComponent: 'filter/date',
|
|
226
244
|
},
|
|
227
245
|
{
|
|
246
|
+
id: 'updated-at',
|
|
228
247
|
label: this.intl.t('column.updated-at'),
|
|
229
248
|
valuePath: 'updatedAt',
|
|
230
249
|
sortParam: 'updated_at',
|
|
@@ -235,6 +254,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
235
254
|
filterComponent: 'filter/date',
|
|
236
255
|
},
|
|
237
256
|
{
|
|
257
|
+
id: 'status',
|
|
238
258
|
label: this.intl.t('column.status'),
|
|
239
259
|
valuePath: 'status',
|
|
240
260
|
cellComponent: 'table/cell/status',
|
|
@@ -247,6 +267,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
247
267
|
filterOptions: fleetOpsOptions('vendorStatuses'),
|
|
248
268
|
},
|
|
249
269
|
{
|
|
270
|
+
id: 'row-actions',
|
|
250
271
|
label: '',
|
|
251
272
|
cellComponent: 'table/cell/dropdown',
|
|
252
273
|
ddButtonText: false,
|
|
@@ -259,11 +280,13 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
259
280
|
width: 60,
|
|
260
281
|
actions: [
|
|
261
282
|
{
|
|
283
|
+
id: 'view',
|
|
262
284
|
label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.vendor') }),
|
|
263
285
|
fn: this.vendorActions.transition.view,
|
|
264
286
|
permission: 'fleet-ops view vendor',
|
|
265
287
|
},
|
|
266
288
|
{
|
|
289
|
+
id: 'edit',
|
|
267
290
|
label: this.intl.t('common.edit-resource', { resource: this.intl.t('resource.vendor') }),
|
|
268
291
|
fn: this.vendorActions.transition.edit,
|
|
269
292
|
permission: 'fleet-ops update vendor',
|
|
@@ -272,6 +295,7 @@ export default class ManagementVendorsIndexController extends Controller {
|
|
|
272
295
|
separator: true,
|
|
273
296
|
},
|
|
274
297
|
{
|
|
298
|
+
id: 'delete',
|
|
275
299
|
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.vendor') }),
|
|
276
300
|
fn: this.vendorActions.delete,
|
|
277
301
|
permission: 'fleet-ops delete vendor',
|
|
@@ -17,6 +17,7 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
17
17
|
@service hostRouter;
|
|
18
18
|
@service universe;
|
|
19
19
|
@service sidebar;
|
|
20
|
+
@service orderPresentation;
|
|
20
21
|
@service abilities;
|
|
21
22
|
@tracked routingControl;
|
|
22
23
|
@tracked routingCompleted = false;
|
|
@@ -84,28 +85,46 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
84
85
|
];
|
|
85
86
|
}
|
|
86
87
|
|
|
88
|
+
/** True when the order reached a terminal activity (default or configured lifecycle). */
|
|
89
|
+
get isClosed() {
|
|
90
|
+
const status = this.model.status;
|
|
91
|
+
const lifecycle = this.model.order_config?.meta?.lifecycle;
|
|
92
|
+
if (!lifecycle) {
|
|
93
|
+
return status === 'canceled';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Matches OrderConfig::getTerminalActivityCodes(): `terminal` plus the configured completed and canceled codes.
|
|
97
|
+
const terminal = [...(Array.isArray(lifecycle.terminal) ? lifecycle.terminal : []), lifecycle.completed, lifecycle.canceled].filter(Boolean);
|
|
98
|
+
return status === 'canceled' || terminal.includes(status);
|
|
99
|
+
}
|
|
100
|
+
|
|
87
101
|
get actionButtons() {
|
|
102
|
+
const isHidden = (id) => this.orderPresentation.isHidden(this.model, 'actions', id);
|
|
103
|
+
|
|
88
104
|
return [
|
|
89
105
|
{
|
|
90
106
|
items: [
|
|
91
107
|
{
|
|
108
|
+
id: 'edit-order-details',
|
|
92
109
|
text: 'Edit details',
|
|
93
110
|
icon: 'pencil',
|
|
111
|
+
disabled: this.isClosed,
|
|
94
112
|
permission: 'fleet-ops update order',
|
|
95
|
-
disabled: this.model.status === 'canceled',
|
|
96
113
|
fn: () => this.orderActions.editOrderDetails(this.model),
|
|
97
114
|
},
|
|
98
115
|
{
|
|
116
|
+
id: 'update-activity',
|
|
99
117
|
text: 'Update activity',
|
|
100
118
|
icon: 'signal',
|
|
119
|
+
disabled: this.isClosed,
|
|
101
120
|
permission: 'fleet-ops update order',
|
|
102
|
-
disabled: this.model.status === 'canceled',
|
|
103
121
|
fn: () =>
|
|
104
122
|
this.orderActions.updateActivity(this.model, {
|
|
105
123
|
onFinish: this.handleActivityModalFinish,
|
|
106
124
|
}),
|
|
107
125
|
},
|
|
108
126
|
{
|
|
127
|
+
id: this.model.has_driver_assigned ? 'unassign-driver' : 'assign-driver',
|
|
109
128
|
text: this.model.has_driver_assigned ? 'Unassign driver' : 'Assign driver',
|
|
110
129
|
icon: this.model.has_driver_assigned ? 'user-xmark' : 'edit',
|
|
111
130
|
permission: 'fleet-ops assign-driver-for order',
|
|
@@ -113,6 +132,7 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
113
132
|
fn: () => (this.model.has_driver_assigned ? this.orderActions.unassignDriver(this.model) : this.orderActions.assignDriver(this.model)),
|
|
114
133
|
},
|
|
115
134
|
{
|
|
135
|
+
id: 'view-label',
|
|
116
136
|
text: 'View order label',
|
|
117
137
|
icon: 'file-invoice',
|
|
118
138
|
permission: 'fleet-ops view order',
|
|
@@ -122,11 +142,13 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
122
142
|
separator: true,
|
|
123
143
|
},
|
|
124
144
|
{
|
|
145
|
+
id: 'listen-to-socket-channel',
|
|
125
146
|
text: 'Listen to socket channel',
|
|
126
147
|
icon: 'headphones',
|
|
127
148
|
fn: () => this.hostRouter.transitionTo('console.developers.sockets.view', `order.${this.model.public_id}`),
|
|
128
149
|
},
|
|
129
150
|
{
|
|
151
|
+
id: 'view-metadata',
|
|
130
152
|
text: 'View metadata',
|
|
131
153
|
icon: 'table',
|
|
132
154
|
fn: () => this.orderActions.viewMetadata(this.model),
|
|
@@ -135,14 +157,16 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
135
157
|
separator: true,
|
|
136
158
|
},
|
|
137
159
|
{
|
|
160
|
+
id: 'cancel',
|
|
138
161
|
text: 'Cancel order',
|
|
139
162
|
icon: 'ban',
|
|
140
163
|
class: 'text-danger',
|
|
164
|
+
disabled: this.isClosed,
|
|
141
165
|
permission: 'fleet-ops cancel order',
|
|
142
|
-
disabled: this.model.status === 'canceled',
|
|
143
166
|
fn: () => this.orderActions.cancel(this.model),
|
|
144
167
|
},
|
|
145
168
|
{
|
|
169
|
+
id: 'delete',
|
|
146
170
|
text: 'Delete order',
|
|
147
171
|
icon: 'trash',
|
|
148
172
|
class: 'text-danger',
|
|
@@ -156,7 +180,10 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
|
|
|
156
180
|
},
|
|
157
181
|
}),
|
|
158
182
|
},
|
|
159
|
-
]
|
|
183
|
+
]
|
|
184
|
+
.filter(Boolean)
|
|
185
|
+
.filter((item) => !item.id || !isHidden(item.id))
|
|
186
|
+
.filter((item, index, items) => !(item.separator && (index === 0 || items[index - 1]?.separator))),
|
|
160
187
|
},
|
|
161
188
|
].map((actionButton) => ({ ...actionButton, items: this.permittedMenuItems(actionButton.items) }));
|
|
162
189
|
}
|
|
@@ -7,6 +7,7 @@ import relationValue from '../../../utils/relation-value';
|
|
|
7
7
|
|
|
8
8
|
export default class OperationsOrdersIndexController extends Controller {
|
|
9
9
|
@service orderActions;
|
|
10
|
+
@service orderPresentation;
|
|
10
11
|
@service driverActions;
|
|
11
12
|
@service vehicleActions;
|
|
12
13
|
@service store;
|
|
@@ -18,7 +19,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
18
19
|
@service intl;
|
|
19
20
|
|
|
20
21
|
/** query params */
|
|
21
|
-
@tracked queryParams = [
|
|
22
|
+
@tracked queryParams = this.orderActions.queryParamsFor([
|
|
22
23
|
'page',
|
|
23
24
|
'limit',
|
|
24
25
|
'sort',
|
|
@@ -46,7 +47,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
46
47
|
'drawerOpen',
|
|
47
48
|
'drawerTab',
|
|
48
49
|
'orderPanelOpen',
|
|
49
|
-
];
|
|
50
|
+
]);
|
|
50
51
|
@tracked page = 1;
|
|
51
52
|
@tracked limit;
|
|
52
53
|
@tracked sort = '-created_at';
|
|
@@ -77,11 +78,13 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
77
78
|
get actionButtons() {
|
|
78
79
|
return [
|
|
79
80
|
{
|
|
81
|
+
id: 'refresh',
|
|
80
82
|
icon: 'refresh',
|
|
81
83
|
onClick: this.orderActions.refresh,
|
|
82
84
|
helpText: this.intl.t('common.refresh'),
|
|
83
85
|
},
|
|
84
86
|
{
|
|
87
|
+
id: 'create',
|
|
85
88
|
text: this.intl.t('common.new'),
|
|
86
89
|
type: 'primary',
|
|
87
90
|
icon: 'plus',
|
|
@@ -89,6 +92,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
89
92
|
permission: 'fleet-ops create order',
|
|
90
93
|
},
|
|
91
94
|
{
|
|
95
|
+
id: 'export',
|
|
92
96
|
text: this.intl.t('common.export'),
|
|
93
97
|
icon: 'long-arrow-up',
|
|
94
98
|
iconClass: 'rotate-icon-45',
|
|
@@ -97,6 +101,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
97
101
|
permission: 'fleet-ops export order',
|
|
98
102
|
},
|
|
99
103
|
{
|
|
104
|
+
id: 'import-orders',
|
|
100
105
|
text: this.intl.t('common.import'),
|
|
101
106
|
icon: 'file-import',
|
|
102
107
|
wrapperClass: 'hidden md:flex',
|
|
@@ -110,12 +115,14 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
110
115
|
get bulkActions() {
|
|
111
116
|
return [
|
|
112
117
|
{
|
|
118
|
+
id: 'bulk-cancel',
|
|
113
119
|
label: this.intl.t('common.cancel-resource', { resource: this.intl.t('resource.orders') }),
|
|
114
120
|
icon: 'ban',
|
|
115
121
|
fn: this.orderActions.bulkCancel,
|
|
116
122
|
permission: 'fleet-ops cancel order',
|
|
117
123
|
},
|
|
118
124
|
{
|
|
125
|
+
id: 'bulk-delete',
|
|
119
126
|
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.orders') }),
|
|
120
127
|
icon: 'trash',
|
|
121
128
|
class: 'text-red-500',
|
|
@@ -124,12 +131,14 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
124
131
|
},
|
|
125
132
|
{ separator: true },
|
|
126
133
|
{
|
|
134
|
+
id: 'bulk-dispatch',
|
|
127
135
|
label: this.intl.t('common.dispatch-orders'),
|
|
128
136
|
icon: 'rocket',
|
|
129
137
|
fn: this.orderActions.bulkDispatch,
|
|
130
138
|
permission: 'fleet-ops dispatch order',
|
|
131
139
|
},
|
|
132
140
|
{
|
|
141
|
+
id: 'bulk-assign-driver',
|
|
133
142
|
label: this.intl.t('common.assign-drivers'),
|
|
134
143
|
icon: 'user-plus',
|
|
135
144
|
fn: this.orderActions.bulkAssignDriver,
|
|
@@ -142,6 +151,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
142
151
|
get columns() {
|
|
143
152
|
return [
|
|
144
153
|
{
|
|
154
|
+
id: 'public-id',
|
|
145
155
|
sticky: true,
|
|
146
156
|
label: this.intl.t('column.id'),
|
|
147
157
|
valuePath: 'public_id',
|
|
@@ -155,6 +165,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
155
165
|
filterComponent: 'filter/string',
|
|
156
166
|
},
|
|
157
167
|
{
|
|
168
|
+
id: 'payload-waypoints-length',
|
|
158
169
|
label: this.intl.t('column.route-type'),
|
|
159
170
|
valuePath: 'payload.waypoints.length',
|
|
160
171
|
cellComponent: 'cell/order-route-type',
|
|
@@ -162,6 +173,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
162
173
|
resizable: true,
|
|
163
174
|
},
|
|
164
175
|
{
|
|
176
|
+
id: 'internal-id',
|
|
165
177
|
label: this.intl.t('column.internal-id'),
|
|
166
178
|
valuePath: 'internal_id',
|
|
167
179
|
cellComponent: 'click-to-copy',
|
|
@@ -174,6 +186,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
174
186
|
filterComponentPlaceholder: this.intl.t('order.placeholders.filter-internal-id'),
|
|
175
187
|
},
|
|
176
188
|
{
|
|
189
|
+
id: 'payload-public-id',
|
|
177
190
|
label: this.intl.t('column.payload'),
|
|
178
191
|
valuePath: 'payload.public_id',
|
|
179
192
|
cellComponent: 'cell/payload-identity',
|
|
@@ -186,6 +199,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
186
199
|
filterComponent: 'filter/string',
|
|
187
200
|
},
|
|
188
201
|
{
|
|
202
|
+
id: 'driver-assigned',
|
|
189
203
|
label: this.intl.t('column.driver-assigned'),
|
|
190
204
|
cellComponent: 'cell/driver-identity',
|
|
191
205
|
valuePath: 'driver_assigned',
|
|
@@ -203,6 +217,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
203
217
|
model: 'driver',
|
|
204
218
|
},
|
|
205
219
|
{
|
|
220
|
+
id: 'pickup-name',
|
|
206
221
|
label: this.intl.t('column.pickup'),
|
|
207
222
|
valuePath: 'pickupName',
|
|
208
223
|
cellComponent: 'cell/place-identity',
|
|
@@ -219,6 +234,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
219
234
|
model: 'place',
|
|
220
235
|
},
|
|
221
236
|
{
|
|
237
|
+
id: 'dropoff-name',
|
|
222
238
|
label: this.intl.t('column.dropoff'),
|
|
223
239
|
valuePath: 'dropoffName',
|
|
224
240
|
cellComponent: 'cell/place-identity',
|
|
@@ -234,6 +250,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
234
250
|
model: 'place',
|
|
235
251
|
},
|
|
236
252
|
{
|
|
253
|
+
id: 'customer-name',
|
|
237
254
|
label: this.intl.t('column.customer'),
|
|
238
255
|
valuePath: 'customer.name',
|
|
239
256
|
cellComponent: 'cell/customer-identity',
|
|
@@ -248,6 +265,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
248
265
|
model: 'customer',
|
|
249
266
|
},
|
|
250
267
|
{
|
|
268
|
+
id: 'vehicle-assigned-display-name',
|
|
251
269
|
label: this.intl.t('column.vehicle-assigned'),
|
|
252
270
|
cellComponent: 'cell/vehicle-identity',
|
|
253
271
|
valuePath: 'vehicle_assigned.display_name',
|
|
@@ -271,6 +289,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
271
289
|
model: 'vehicle',
|
|
272
290
|
},
|
|
273
291
|
{
|
|
292
|
+
id: 'facilitator-name',
|
|
274
293
|
label: this.intl.t('column.facilitator'),
|
|
275
294
|
valuePath: 'facilitator.name',
|
|
276
295
|
cellComponent: 'cell/facilitator-identity',
|
|
@@ -285,6 +304,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
285
304
|
model: 'vendor',
|
|
286
305
|
},
|
|
287
306
|
{
|
|
307
|
+
id: 'scheduled-at',
|
|
288
308
|
label: this.intl.t('column.scheduled-at'),
|
|
289
309
|
valuePath: 'scheduledAt',
|
|
290
310
|
sortParam: 'scheduled_at',
|
|
@@ -295,6 +315,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
295
315
|
filterComponent: 'filter/date',
|
|
296
316
|
},
|
|
297
317
|
{
|
|
318
|
+
id: 'item-count',
|
|
298
319
|
label: this.intl.t('column.items'),
|
|
299
320
|
cellComponent: 'table/cell/base',
|
|
300
321
|
valuePath: 'item_count',
|
|
@@ -302,6 +323,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
302
323
|
hidden: true,
|
|
303
324
|
},
|
|
304
325
|
{
|
|
326
|
+
id: 'transaction-amount',
|
|
305
327
|
label: this.intl.t('column.transaction'),
|
|
306
328
|
cellComponent: 'table/cell/currency',
|
|
307
329
|
valuePath: 'transaction_amount',
|
|
@@ -310,6 +332,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
310
332
|
sortable: true,
|
|
311
333
|
},
|
|
312
334
|
{
|
|
335
|
+
id: 'tracking-number-tracking-number',
|
|
313
336
|
label: this.intl.t('column.tracking'),
|
|
314
337
|
valuePath: 'tracking_number.tracking_number',
|
|
315
338
|
cellComponent: 'click-to-copy',
|
|
@@ -319,6 +342,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
319
342
|
filterComponent: 'filter/string',
|
|
320
343
|
},
|
|
321
344
|
{
|
|
345
|
+
id: 'type',
|
|
322
346
|
label: this.intl.t('column.type'),
|
|
323
347
|
valuePath: 'type',
|
|
324
348
|
resizable: true,
|
|
@@ -330,6 +354,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
330
354
|
filterComponentPlaceholder: 'Filter by order config',
|
|
331
355
|
},
|
|
332
356
|
{
|
|
357
|
+
id: 'status',
|
|
333
358
|
label: this.intl.t('column.status'),
|
|
334
359
|
valuePath: 'status',
|
|
335
360
|
cellComponent: 'table/cell/status',
|
|
@@ -340,6 +365,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
340
365
|
fetchUri: 'orders/statuses',
|
|
341
366
|
},
|
|
342
367
|
{
|
|
368
|
+
id: 'created-at',
|
|
343
369
|
label: this.intl.t('column.created-at'),
|
|
344
370
|
valuePath: 'createdAt',
|
|
345
371
|
sortParam: 'created_at',
|
|
@@ -350,6 +376,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
350
376
|
filterComponent: 'filter/date',
|
|
351
377
|
},
|
|
352
378
|
{
|
|
379
|
+
id: 'updated-at',
|
|
353
380
|
label: this.intl.t('column.updated-at'),
|
|
354
381
|
valuePath: 'updatedAt',
|
|
355
382
|
sortParam: 'updated_at',
|
|
@@ -361,6 +388,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
361
388
|
filterComponent: 'filter/date',
|
|
362
389
|
},
|
|
363
390
|
{
|
|
391
|
+
id: 'created-by-name',
|
|
364
392
|
label: this.intl.t('column.created-by'),
|
|
365
393
|
valuePath: 'created_by_name',
|
|
366
394
|
cellComponent: 'table/cell/user-identity',
|
|
@@ -374,6 +402,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
374
402
|
model: 'user',
|
|
375
403
|
},
|
|
376
404
|
{
|
|
405
|
+
id: 'updated-by-name',
|
|
377
406
|
label: this.intl.t('column.updated-by'),
|
|
378
407
|
valuePath: 'updated_by_name',
|
|
379
408
|
cellComponent: 'table/cell/user-identity',
|
|
@@ -397,6 +426,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
397
426
|
hidden: true,
|
|
398
427
|
},
|
|
399
428
|
{
|
|
429
|
+
id: 'row-actions',
|
|
400
430
|
label: '',
|
|
401
431
|
cellComponent: 'table/cell/dropdown',
|
|
402
432
|
ddButtonText: false,
|
|
@@ -407,14 +437,16 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
407
437
|
wrapperClass: 'flex items-center justify-end mx-2',
|
|
408
438
|
sticky: 'right',
|
|
409
439
|
width: 60,
|
|
410
|
-
actions: [
|
|
440
|
+
actions: this.withPresentationProfile([
|
|
411
441
|
{
|
|
442
|
+
id: 'view',
|
|
412
443
|
label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.order') }),
|
|
413
444
|
icon: 'eye',
|
|
414
445
|
fn: this.orderActions.transition.view,
|
|
415
446
|
permission: 'fleet-ops view order',
|
|
416
447
|
},
|
|
417
448
|
{
|
|
449
|
+
id: 'dispatch',
|
|
418
450
|
label: this.intl.t('common.dispatch-order'),
|
|
419
451
|
icon: 'paper-plane',
|
|
420
452
|
fn: this.orderActions.dispatch,
|
|
@@ -422,6 +454,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
422
454
|
isVisible: (order) => order.canBeDispatched,
|
|
423
455
|
},
|
|
424
456
|
{
|
|
457
|
+
id: 'assign-driver',
|
|
425
458
|
label: this.intl.t('common.assign-driver'),
|
|
426
459
|
icon: 'edit',
|
|
427
460
|
fn: this.orderActions.assignDriver,
|
|
@@ -429,6 +462,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
429
462
|
isVisible: (order) => !order.has_driver_assigned,
|
|
430
463
|
},
|
|
431
464
|
{
|
|
465
|
+
id: 'unassign-driver',
|
|
432
466
|
label: this.intl.t('common.unassign-driver'),
|
|
433
467
|
icon: 'edit',
|
|
434
468
|
fn: this.orderActions.unassignDriver,
|
|
@@ -436,6 +470,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
436
470
|
isVisible: (order) => order.has_driver_assigned,
|
|
437
471
|
},
|
|
438
472
|
{
|
|
473
|
+
id: 'cancel',
|
|
439
474
|
label: this.intl.t('common.cancel-resource', { resource: this.intl.t('resource.order') }),
|
|
440
475
|
icon: 'ban',
|
|
441
476
|
fn: this.orderActions.cancel,
|
|
@@ -445,12 +480,13 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
445
480
|
separator: true,
|
|
446
481
|
},
|
|
447
482
|
{
|
|
483
|
+
id: 'delete',
|
|
448
484
|
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.order') }),
|
|
449
485
|
icon: 'trash',
|
|
450
486
|
fn: this.orderActions.delete,
|
|
451
487
|
permission: 'fleet-ops delete order',
|
|
452
488
|
},
|
|
453
|
-
],
|
|
489
|
+
]),
|
|
454
490
|
sortable: false,
|
|
455
491
|
filterable: false,
|
|
456
492
|
resizable: false,
|
|
@@ -459,6 +495,25 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
459
495
|
];
|
|
460
496
|
}
|
|
461
497
|
|
|
498
|
+
/**
|
|
499
|
+
* Hides the row actions an order's presentation profile lists in `hidden.actions`, by id,
|
|
500
|
+
* the same way the details panel does.
|
|
501
|
+
*/
|
|
502
|
+
withPresentationProfile(actions) {
|
|
503
|
+
return actions.map((item) => {
|
|
504
|
+
if (!item.id) {
|
|
505
|
+
return item;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const isVisible = item.isVisible;
|
|
509
|
+
const builtInVisible = (order, ...rest) => (typeof isVisible === 'function' ? isVisible(order, ...rest) : isVisible !== false);
|
|
510
|
+
return {
|
|
511
|
+
...item,
|
|
512
|
+
isVisible: (order, ...rest) => !this.orderPresentation.isHidden(order, 'actions', item.id) && builtInVisible(order, ...rest),
|
|
513
|
+
};
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
|
|
462
517
|
constructor() {
|
|
463
518
|
super(...arguments);
|
|
464
519
|
this.orderSocketEvents.startCompany();
|