@fleetbase/fleetops-engine 0.6.54 → 0.6.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon/components/admin/routing-settings.hbs +2 -1
- package/addon/components/cell/attached-vehicle.hbs +10 -0
- package/addon/components/cell/attached-vehicle.js +58 -0
- package/addon/components/cell/device-identity.hbs +24 -0
- package/addon/components/cell/device-identity.js +129 -0
- package/addon/components/cell/driver-identity.hbs +33 -0
- package/addon/components/cell/driver-identity.js +143 -0
- package/addon/components/cell/equipment-identity.hbs +5 -0
- package/addon/components/cell/equipment-identity.js +48 -0
- package/addon/components/cell/part-identity.hbs +5 -0
- package/addon/components/cell/part-identity.js +63 -0
- package/addon/components/cell/telematic-device.hbs +38 -0
- package/addon/components/cell/telematic-device.js +44 -0
- package/addon/components/cell/telematic-provider.hbs +33 -16
- package/addon/components/cell/telematic-provider.js +50 -8
- package/addon/components/cell/vehicle-identity.hbs +33 -0
- package/addon/components/cell/vehicle-identity.js +138 -0
- package/addon/components/device/form.hbs +2 -2
- package/addon/components/device/form.js +7 -0
- package/addon/components/device/panel-header.hbs +45 -20
- package/addon/components/device/panel-header.js +49 -1
- package/addon/components/device/panel-tabs/events.hbs +30 -0
- package/addon/components/device/panel-tabs/events.js +128 -0
- package/addon/components/device/panel-tabs/sensors.hbs +30 -0
- package/addon/components/device/panel-tabs/sensors.js +93 -0
- package/addon/components/device/panel-tabs/vehicle.hbs +68 -0
- package/addon/components/device/panel-tabs/vehicle.js +90 -0
- package/addon/components/equipment/form.js +8 -1
- package/addon/components/layout/fleet-ops-sidebar.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +8 -0
- package/addon/components/map/drawer/device-event-listing.js +2 -0
- package/addon/components/map/drawer/driver-listing.js +2 -0
- package/addon/components/map/drawer/place-listing.js +2 -0
- package/addon/components/map/drawer/position-listing.hbs +11 -6
- package/addon/components/map/drawer/position-listing.js +17 -4
- package/addon/components/map/drawer/vehicle-listing.js +2 -0
- package/addon/components/sensor/panel-header.hbs +47 -15
- package/addon/components/sensor/panel-header.js +59 -1
- package/addon/components/table/cell/dropdown/action-item.hbs +31 -0
- package/addon/components/table/cell/dropdown/action-item.js +62 -0
- package/addon/components/table/cell/dropdown.hbs +28 -0
- package/addon/components/table/cell/dropdown.js +91 -0
- package/addon/components/vendor/panel-header.hbs +82 -0
- package/addon/components/vendor/panel-header.js +48 -0
- package/addon/controllers/connectivity/devices/index/details/vehicle.js +49 -1
- package/addon/controllers/connectivity/devices/index.js +144 -129
- package/addon/controllers/connectivity/events/details.js +3 -0
- package/addon/controllers/connectivity/events/index.js +187 -11
- package/addon/controllers/connectivity/sensors/index.js +156 -14
- package/addon/controllers/connectivity/telematics/details/devices.js +126 -134
- package/addon/controllers/maintenance/equipment/index.js +1 -2
- package/addon/controllers/maintenance/parts/index.js +1 -2
- package/addon/controllers/management/drivers/index.js +82 -42
- package/addon/controllers/management/fuel-reports/index.js +63 -4
- package/addon/controllers/management/issues/index.js +63 -4
- package/addon/controllers/management/vehicles/index.js +33 -6
- package/addon/routes/connectivity/devices/index/details/vehicle.js +24 -2
- package/addon/routes/connectivity/devices/index.js +7 -0
- package/addon/routes/connectivity/events/details.js +3 -0
- package/addon/routes/connectivity/events/index.js +6 -2
- package/addon/routes/connectivity/sensors/index.js +7 -2
- package/addon/routes/connectivity/telematics/details/devices.js +2 -0
- package/addon/services/device-actions.js +30 -0
- package/addon/services/device-event-actions.js +1 -1
- package/addon/services/equipment-actions.js +1 -0
- package/addon/services/sensor-actions.js +3 -0
- package/addon/services/service-rate-actions.js +39 -1
- package/addon/services/vehicle-actions.js +24 -12
- package/addon/services/vendor-actions.js +3 -0
- package/addon/styles/fleetops-engine.css +8 -0
- package/addon/templates/connectivity/devices/index/details/vehicle.hbs +64 -1
- package/addon/templates/management/vendors/index/details.hbs +2 -2
- package/addon/templates/settings/notifications.hbs +2 -1
- package/addon/templates/settings/routing.hbs +1 -0
- package/addon/utils/device-table-columns.js +288 -0
- package/addon/utils/identity-cell-resource.js +20 -0
- package/addon/utils/map-drawer-dropdown-position.js +47 -0
- package/addon/utils/trackable-option.js +93 -0
- package/app/components/cell/attached-vehicle.js +1 -0
- package/app/components/cell/device-identity.js +1 -0
- package/app/components/cell/driver-identity.js +1 -0
- package/app/components/cell/equipment-identity.js +1 -0
- package/app/components/cell/part-identity.js +1 -0
- package/app/components/cell/telematic-device.js +1 -0
- package/app/components/cell/vehicle-identity.js +1 -0
- package/app/components/device/panel-tabs/events.hbs +30 -0
- package/app/components/device/panel-tabs/events.js +128 -0
- package/app/components/device/panel-tabs/sensors.hbs +30 -0
- package/app/components/device/panel-tabs/sensors.js +93 -0
- package/app/components/device/panel-tabs/vehicle.hbs +68 -0
- package/app/components/device/panel-tabs/vehicle.js +90 -0
- package/app/components/table/cell/dropdown/action-item.js +1 -0
- package/app/components/table/cell/dropdown.js +1 -0
- package/app/components/vendor/panel-header.js +1 -0
- package/app/controllers/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/routes/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/templates/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/utils/map-drawer-dropdown-position.js +1 -0
- package/app/utils/trackable-option.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/src/Console/Commands/SyncTelematics.php +4 -4
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +18 -1
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +82 -13
- package/server/src/Http/Filter/DeviceEventFilter.php +21 -0
- package/server/src/Http/Filter/DeviceFilter.php +24 -1
- package/server/src/Http/Resources/v1/Index/Vehicle.php +19 -0
- package/server/src/Models/Device.php +2 -0
- package/server/src/Models/DeviceEvent.php +81 -0
- package/server/src/Models/Equipment.php +55 -0
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +89 -15
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +123 -35
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +26 -2
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +122 -14
- package/server/src/routes.php +0 -1
- package/server/tests/DeviceFilterTest.php +9 -0
- package/server/tests/DriverVehicleStatusDefaultTest.php +19 -2
- package/server/tests/EquipmentAssignmentMorphTypeTest.php +35 -0
- package/server/tests/ServiceRateRouteValidationTest.php +101 -0
- package/server/tests/TelematicsHardeningTest.php +238 -7
- package/addon/controllers/connectivity/events/index/details.js +0 -3
- package/addon/routes/connectivity/events/index/details.js +0 -3
- /package/addon/templates/connectivity/events/{index/details.hbs → details.hbs} +0 -0
|
@@ -1,15 +1,41 @@
|
|
|
1
1
|
import Controller from '@ember/controller';
|
|
2
|
+
import { action } from '@ember/object';
|
|
2
3
|
import { inject as service } from '@ember/service';
|
|
3
4
|
import { tracked } from '@glimmer/tracking';
|
|
5
|
+
import buildDeviceTableColumns from '../../../utils/device-table-columns';
|
|
4
6
|
import fleetOpsOptions from '../../../utils/fleet-ops-options';
|
|
5
7
|
|
|
6
8
|
export default class ConnectivityDevicesIndexController extends Controller {
|
|
7
9
|
@service deviceActions;
|
|
10
|
+
@service hostRouter;
|
|
8
11
|
@service telematicActions;
|
|
9
12
|
@service intl;
|
|
13
|
+
@service mapManager;
|
|
14
|
+
@service notifications;
|
|
15
|
+
@service store;
|
|
16
|
+
@service vehicleActions;
|
|
10
17
|
|
|
11
18
|
/** query params */
|
|
12
|
-
@tracked queryParams = [
|
|
19
|
+
@tracked queryParams = [
|
|
20
|
+
'name',
|
|
21
|
+
'status',
|
|
22
|
+
'attachment_state',
|
|
23
|
+
'telematic',
|
|
24
|
+
'provider',
|
|
25
|
+
'vehicle',
|
|
26
|
+
'connection_status',
|
|
27
|
+
'device_id',
|
|
28
|
+
'type',
|
|
29
|
+
'serial_number',
|
|
30
|
+
'last_online_at',
|
|
31
|
+
'page',
|
|
32
|
+
'limit',
|
|
33
|
+
'sort',
|
|
34
|
+
'query',
|
|
35
|
+
'public_id',
|
|
36
|
+
'created_at',
|
|
37
|
+
'updated_at',
|
|
38
|
+
];
|
|
13
39
|
@tracked page = 1;
|
|
14
40
|
@tracked limit;
|
|
15
41
|
@tracked sort = '-created_at';
|
|
@@ -18,6 +44,13 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
18
44
|
@tracked status;
|
|
19
45
|
@tracked attachment_state;
|
|
20
46
|
@tracked telematic;
|
|
47
|
+
@tracked provider;
|
|
48
|
+
@tracked vehicle;
|
|
49
|
+
@tracked connection_status;
|
|
50
|
+
@tracked device_id;
|
|
51
|
+
@tracked type;
|
|
52
|
+
@tracked serial_number;
|
|
53
|
+
@tracked last_online_at;
|
|
21
54
|
|
|
22
55
|
/** action buttons */
|
|
23
56
|
@tracked actionButtons = [
|
|
@@ -56,133 +89,115 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
56
89
|
},
|
|
57
90
|
];
|
|
58
91
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
sticky: true,
|
|
63
|
-
label: this.intl.t('column.name'),
|
|
64
|
-
valuePath: 'displayName',
|
|
65
|
-
cellComponent: 'table/cell/anchor',
|
|
66
|
-
action: this.deviceActions.transition.view,
|
|
67
|
-
permission: 'fleet-ops view device',
|
|
68
|
-
resizable: true,
|
|
69
|
-
sortable: true,
|
|
70
|
-
filterable: true,
|
|
71
|
-
filterParam: 'name',
|
|
72
|
-
filterComponent: 'filter/string',
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
label: 'Telematic',
|
|
76
|
-
valuePath: 'telematic.provider',
|
|
77
|
-
cellComponent: 'table/cell/anchor',
|
|
78
|
-
action: this.telematicActions.transition.view,
|
|
79
|
-
permission: 'fleet-ops view telematic',
|
|
80
|
-
resizable: true,
|
|
81
|
-
sortable: true,
|
|
82
|
-
filterable: true,
|
|
83
|
-
filterComponent: 'filter/model',
|
|
84
|
-
filterComponentPlaceholder: 'Select telematic',
|
|
85
|
-
filterParam: 'telematic',
|
|
86
|
-
model: 'telematic',
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
label: 'Type',
|
|
90
|
-
valuePath: 'type',
|
|
91
|
-
resizable: true,
|
|
92
|
-
sortable: true,
|
|
93
|
-
filterable: true,
|
|
94
|
-
filterParam: 'type',
|
|
95
|
-
filterComponent: 'filter/multi-option',
|
|
96
|
-
filterOptions: fleetOpsOptions('deviceTypes'),
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
label: 'Serial Number',
|
|
100
|
-
valuePath: 'serial_number',
|
|
101
|
-
resizable: true,
|
|
102
|
-
sortable: true,
|
|
103
|
-
filterable: true,
|
|
104
|
-
filterParam: 'serial_number',
|
|
105
|
-
filterComponent: 'filter/string',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
label: this.intl.t('column.status'),
|
|
109
|
-
valuePath: 'status',
|
|
110
|
-
cellComponent: 'table/cell/status',
|
|
111
|
-
resizable: true,
|
|
112
|
-
sortable: true,
|
|
113
|
-
filterable: true,
|
|
114
|
-
filterComponent: 'filter/multi-option',
|
|
115
|
-
filterOptions: fleetOpsOptions('deviceStatuses'),
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
label: this.intl.t('column.created-at'),
|
|
119
|
-
valuePath: 'createdAt',
|
|
120
|
-
sortParam: 'created_at',
|
|
121
|
-
resizable: true,
|
|
122
|
-
sortable: true,
|
|
123
|
-
filterable: true,
|
|
124
|
-
filterComponent: 'filter/date',
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
label: this.intl.t('column.updated-at'),
|
|
128
|
-
valuePath: 'updatedAt',
|
|
129
|
-
sortParam: 'updated_at',
|
|
130
|
-
resizable: true,
|
|
131
|
-
sortable: true,
|
|
132
|
-
hidden: true,
|
|
133
|
-
filterable: true,
|
|
134
|
-
filterComponent: 'filter/date',
|
|
135
|
-
},
|
|
92
|
+
get deviceTypeOptions() {
|
|
93
|
+
return fleetOpsOptions('deviceTypes');
|
|
94
|
+
}
|
|
136
95
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
96
|
+
get deviceStatusOptions() {
|
|
97
|
+
return fleetOpsOptions('deviceStatuses');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
get columns() {
|
|
101
|
+
const columns = buildDeviceTableColumns(this, { deviceActionMode: 'route', showDeviceStatus: false });
|
|
102
|
+
const actionsColumn = columns.find((column) => column.cellComponent === 'table/cell/dropdown');
|
|
103
|
+
|
|
104
|
+
actionsColumn?.actions.push(
|
|
105
|
+
{
|
|
106
|
+
separator: true,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.device') }),
|
|
110
|
+
fn: this.deviceActions.delete,
|
|
111
|
+
permission: 'fleet-ops delete device',
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
return columns;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@action openTelematic(telematic) {
|
|
119
|
+
if (telematic?.id) {
|
|
120
|
+
return this.telematicActions.transition.view(telematic);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@action hasAttachedVehicle(device) {
|
|
125
|
+
return Boolean(device?.attachable_uuid && this.isVehicleAttachment(device));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@action async viewAttachedVehicle(device) {
|
|
129
|
+
const vehicle = await this.resolveAttachedVehicle(device);
|
|
130
|
+
|
|
131
|
+
if (!vehicle) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (this.vehicleActions.panel?.view) {
|
|
136
|
+
return this.vehicleActions.panel.view(vehicle);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return this.hostRouter.transitionTo('console.fleet-ops.management.vehicles.index.details', vehicle);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@action async locateAttachedVehicle(device) {
|
|
143
|
+
const vehicle = await this.resolveAttachedVehicle(device);
|
|
144
|
+
|
|
145
|
+
if (!vehicle) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
await this.transitionToLiveMap();
|
|
150
|
+
await this.mapManager.waitForMap({ timeoutMs: 8000 });
|
|
151
|
+
|
|
152
|
+
this.mapManager.focusResource(vehicle, 16, {
|
|
153
|
+
paddingBottomRight: [300, 200],
|
|
154
|
+
moveend: () => {
|
|
155
|
+
this.vehicleActions.panel?.view?.(vehicle, { closeOnTransition: true });
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async transitionToLiveMap() {
|
|
161
|
+
try {
|
|
162
|
+
await this.hostRouter.transitionTo('console.fleet-ops.operations.orders.index', { queryParams: { layout: 'map' } });
|
|
163
|
+
} catch (_) {
|
|
164
|
+
// Keep locate actions usable even if another map transition is already active.
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
isVehicleAttachment(device) {
|
|
169
|
+
const attachableType = `${device?.attachable_type ?? ''}`.toLowerCase();
|
|
170
|
+
|
|
171
|
+
return !attachableType || attachableType.includes('vehicle');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async resolveAttachedVehicle(device) {
|
|
175
|
+
if (!device?.attachable_uuid || !this.isVehicleAttachment(device)) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const attachable = device.attachable;
|
|
180
|
+
|
|
181
|
+
if (attachable && typeof attachable.then !== 'function') {
|
|
182
|
+
return attachable;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (attachable && typeof attachable.then === 'function') {
|
|
186
|
+
return await attachable;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const cachedVehicle = this.store.peekRecord('vehicle', device.attachable_uuid);
|
|
190
|
+
|
|
191
|
+
if (cachedVehicle) {
|
|
192
|
+
return cachedVehicle;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
return await this.store.findRecord('vehicle', device.attachable_uuid);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
this.notifications.serverError(error);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
188
203
|
}
|
|
@@ -1,19 +1,96 @@
|
|
|
1
1
|
import Controller from '@ember/controller';
|
|
2
|
+
import { action, get } from '@ember/object';
|
|
2
3
|
import { inject as service } from '@ember/service';
|
|
3
4
|
import { tracked } from '@glimmer/tracking';
|
|
4
5
|
|
|
6
|
+
const severityOptions = [
|
|
7
|
+
{ label: 'Info', value: 'info' },
|
|
8
|
+
{ label: 'Warning', value: 'warning' },
|
|
9
|
+
{ label: 'Error', value: 'error' },
|
|
10
|
+
{ label: 'Critical', value: 'critical' },
|
|
11
|
+
{ label: 'High', value: 'high' },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
const processedOptions = [
|
|
15
|
+
{ label: 'Processed', value: 'processed' },
|
|
16
|
+
{ label: 'Unprocessed', value: 'unprocessed' },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
function eventDevice(event) {
|
|
20
|
+
const device = get(event, 'device');
|
|
21
|
+
|
|
22
|
+
if (device) {
|
|
23
|
+
return device;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const id = get(event, 'device_uuid');
|
|
27
|
+
const deviceId = get(event, 'device_id') ?? get(event, 'provider_device_id') ?? get(event, 'ident');
|
|
28
|
+
const name = get(event, 'device_name') ?? deviceId;
|
|
29
|
+
const imei = get(event, 'device_imei') ?? get(event, 'imei') ?? get(event, 'ident');
|
|
30
|
+
|
|
31
|
+
if (!id && !name && !imei && !deviceId) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
id,
|
|
37
|
+
displayName: name,
|
|
38
|
+
name,
|
|
39
|
+
imei,
|
|
40
|
+
device_id: deviceId,
|
|
41
|
+
ident: get(event, 'ident'),
|
|
42
|
+
serial_number: get(event, 'device_serial_number'),
|
|
43
|
+
connection_status: get(event, 'device_connection_status'),
|
|
44
|
+
status: get(event, 'device_status'),
|
|
45
|
+
photo_url: get(event, 'device_photo_url') ?? get(event, 'photo_url'),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function eventTelematic(event) {
|
|
50
|
+
const telematic = get(event, 'device.telematic') ?? get(event, 'telematic');
|
|
51
|
+
|
|
52
|
+
if (telematic) {
|
|
53
|
+
return telematic;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const id = get(event, 'telematic_uuid');
|
|
57
|
+
const name = get(event, 'telematic_name');
|
|
58
|
+
const provider = get(event, 'provider');
|
|
59
|
+
|
|
60
|
+
if (!id && !name && !provider) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
name: name ?? provider,
|
|
67
|
+
provider,
|
|
68
|
+
provider_descriptor: get(event, 'provider_descriptor'),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
5
72
|
export default class ConnectivityEventsIndexController extends Controller {
|
|
6
73
|
@service deviceEventActions;
|
|
7
74
|
@service deviceActions;
|
|
75
|
+
@service hostRouter;
|
|
8
76
|
@service intl;
|
|
77
|
+
@service store;
|
|
78
|
+
@service telematicActions;
|
|
9
79
|
|
|
10
80
|
/** query params */
|
|
11
|
-
@tracked queryParams = ['
|
|
81
|
+
@tracked queryParams = ['page', 'limit', 'sort', 'query', 'telematic', 'device', 'event_type', 'severity', 'processed', 'occurred_at', 'created_at', 'updated_at'];
|
|
12
82
|
@tracked page = 1;
|
|
13
83
|
@tracked limit;
|
|
14
84
|
@tracked sort = '-created_at';
|
|
15
|
-
@tracked
|
|
16
|
-
@tracked
|
|
85
|
+
@tracked query;
|
|
86
|
+
@tracked telematic;
|
|
87
|
+
@tracked device;
|
|
88
|
+
@tracked event_type;
|
|
89
|
+
@tracked severity;
|
|
90
|
+
@tracked processed;
|
|
91
|
+
@tracked occurred_at;
|
|
92
|
+
@tracked created_at;
|
|
93
|
+
@tracked updated_at;
|
|
17
94
|
|
|
18
95
|
/** action buttons */
|
|
19
96
|
@tracked actionButtons = [
|
|
@@ -40,13 +117,17 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
40
117
|
resizable: true,
|
|
41
118
|
sortable: true,
|
|
42
119
|
filterable: true,
|
|
120
|
+
filterParam: 'event_type',
|
|
43
121
|
filterComponent: 'filter/string',
|
|
44
122
|
},
|
|
45
123
|
{
|
|
46
124
|
label: 'Device',
|
|
47
125
|
valuePath: 'device.displayName',
|
|
48
|
-
cellComponent: '
|
|
49
|
-
|
|
126
|
+
cellComponent: 'cell/device-identity',
|
|
127
|
+
resourcePath: eventDevice,
|
|
128
|
+
compact: true,
|
|
129
|
+
showStatus: false,
|
|
130
|
+
action: this.openDevice,
|
|
50
131
|
permission: 'fleet-ops view device',
|
|
51
132
|
resizable: true,
|
|
52
133
|
sortable: true,
|
|
@@ -55,23 +136,50 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
55
136
|
filterComponentPlaceholder: 'Select device',
|
|
56
137
|
filterParam: 'device',
|
|
57
138
|
model: 'device',
|
|
139
|
+
modelNamePath: 'displayName',
|
|
58
140
|
},
|
|
59
141
|
{
|
|
60
142
|
label: 'Provider',
|
|
61
143
|
valuePath: 'provider',
|
|
144
|
+
cellComponent: 'cell/telematic-provider',
|
|
145
|
+
resourcePath: eventTelematic,
|
|
146
|
+
compact: true,
|
|
147
|
+
action: this.openTelematic,
|
|
148
|
+
permission: 'fleet-ops view telematic',
|
|
62
149
|
resizable: true,
|
|
63
150
|
sortable: true,
|
|
64
151
|
filterable: true,
|
|
65
|
-
filterParam: '
|
|
66
|
-
filterComponent: 'filter/
|
|
152
|
+
filterParam: 'telematic',
|
|
153
|
+
filterComponent: 'filter/model',
|
|
154
|
+
filterComponentPlaceholder: 'Select telematic',
|
|
155
|
+
model: 'telematic',
|
|
67
156
|
},
|
|
68
157
|
{
|
|
69
158
|
label: 'Severity',
|
|
70
159
|
valuePath: 'severity',
|
|
160
|
+
cellComponent: 'table/cell/status',
|
|
71
161
|
resizable: true,
|
|
72
162
|
sortable: true,
|
|
73
163
|
filterable: true,
|
|
74
164
|
filterParam: 'severity',
|
|
165
|
+
filterComponent: 'filter/multi-option',
|
|
166
|
+
filterOptions: severityOptions,
|
|
167
|
+
filterOptionLabel: 'label',
|
|
168
|
+
filterOptionValue: 'value',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
label: 'Message',
|
|
172
|
+
valuePath: 'message',
|
|
173
|
+
resizable: true,
|
|
174
|
+
sortable: false,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
label: 'Code',
|
|
178
|
+
valuePath: 'code',
|
|
179
|
+
resizable: true,
|
|
180
|
+
sortable: true,
|
|
181
|
+
filterable: true,
|
|
182
|
+
filterParam: 'code',
|
|
75
183
|
filterComponent: 'filter/string',
|
|
76
184
|
},
|
|
77
185
|
{
|
|
@@ -96,13 +204,27 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
96
204
|
sortable: true,
|
|
97
205
|
},
|
|
98
206
|
{
|
|
99
|
-
label: '
|
|
100
|
-
valuePath: '
|
|
207
|
+
label: 'Processed',
|
|
208
|
+
valuePath: 'processedAt',
|
|
209
|
+
sortParam: 'processed_at',
|
|
101
210
|
resizable: true,
|
|
102
211
|
sortable: true,
|
|
103
212
|
filterable: true,
|
|
104
|
-
filterParam: '
|
|
105
|
-
filterComponent: 'filter/
|
|
213
|
+
filterParam: 'processed',
|
|
214
|
+
filterComponent: 'filter/multi-option',
|
|
215
|
+
filterOptions: processedOptions,
|
|
216
|
+
filterOptionLabel: 'label',
|
|
217
|
+
filterOptionValue: 'value',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
label: 'Occurred',
|
|
221
|
+
valuePath: 'occurredAt',
|
|
222
|
+
sortParam: 'occurred_at',
|
|
223
|
+
resizable: true,
|
|
224
|
+
sortable: true,
|
|
225
|
+
filterable: true,
|
|
226
|
+
filterParam: 'occurred_at',
|
|
227
|
+
filterComponent: 'filter/date',
|
|
106
228
|
},
|
|
107
229
|
{
|
|
108
230
|
label: this.intl.t('column.created-at'),
|
|
@@ -111,7 +233,19 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
111
233
|
resizable: true,
|
|
112
234
|
sortable: true,
|
|
113
235
|
filterable: true,
|
|
236
|
+
filterParam: 'created_at',
|
|
237
|
+
filterComponent: 'filter/date',
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
label: this.intl.t('column.updated-at'),
|
|
241
|
+
valuePath: 'updatedAt',
|
|
242
|
+
sortParam: 'updated_at',
|
|
243
|
+
resizable: true,
|
|
244
|
+
sortable: true,
|
|
245
|
+
filterable: true,
|
|
246
|
+
filterParam: 'updated_at',
|
|
114
247
|
filterComponent: 'filter/date',
|
|
248
|
+
hidden: true,
|
|
115
249
|
},
|
|
116
250
|
{
|
|
117
251
|
label: '',
|
|
@@ -130,6 +264,11 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
130
264
|
fn: this.deviceEventActions.transition.view,
|
|
131
265
|
permission: 'fleet-ops view device-event',
|
|
132
266
|
},
|
|
267
|
+
{
|
|
268
|
+
label: 'Mark processed',
|
|
269
|
+
fn: this.markProcessed,
|
|
270
|
+
permission: 'fleet-ops update device-event',
|
|
271
|
+
},
|
|
133
272
|
],
|
|
134
273
|
sortable: false,
|
|
135
274
|
filterable: false,
|
|
@@ -137,4 +276,41 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
137
276
|
searchable: false,
|
|
138
277
|
},
|
|
139
278
|
];
|
|
279
|
+
|
|
280
|
+
async resolveDevice(device) {
|
|
281
|
+
if (!device?.id) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const cachedDevice = this.store.peekRecord('device', device.id);
|
|
286
|
+
|
|
287
|
+
if (cachedDevice) {
|
|
288
|
+
return cachedDevice;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
try {
|
|
292
|
+
return await this.store.findRecord('device', device.id);
|
|
293
|
+
} catch (_) {
|
|
294
|
+
return device;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
@action async openDevice(device) {
|
|
299
|
+
const resolvedDevice = await this.resolveDevice(device);
|
|
300
|
+
|
|
301
|
+
if (resolvedDevice?.id) {
|
|
302
|
+
return this.deviceActions.panel.view(resolvedDevice);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@action openTelematic(telematic) {
|
|
307
|
+
if (telematic?.id) {
|
|
308
|
+
return this.telematicActions.transition.view(telematic);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
@action async markProcessed(deviceEvent) {
|
|
313
|
+
await this.deviceEventActions.markProcessed(deviceEvent);
|
|
314
|
+
await this.hostRouter.refresh();
|
|
315
|
+
}
|
|
140
316
|
}
|