@fleetbase/fleetops-engine 0.6.53 → 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/details.hbs +106 -135
- package/addon/components/device/details.js +174 -1
- package/addon/components/device/form.hbs +2 -2
- package/addon/components/device/form.js +7 -0
- package/addon/components/device/panel-header.hbs +46 -21
- 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/operations-monitor.js +76 -11
- package/addon/components/layout/fleet-ops-sidebar.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +101 -17
- 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/order/form/details.hbs +1 -43
- package/addon/components/order/form/details.js +18 -53
- package/addon/components/order/form/orchestrator-constraints.hbs +40 -0
- package/addon/components/order/form/orchestrator-constraints.js +61 -0
- package/addon/components/order/form/payload.js +48 -2
- package/addon/components/order/form/route.js +15 -0
- package/addon/components/order/form/service-rate.hbs +62 -11
- package/addon/components/order/form/service-rate.js +124 -2
- package/addon/components/order/form.hbs +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/telematic/details.hbs +7 -1
- package/addon/components/telematic/form.js +16 -8
- package/addon/components/vendor/panel-header.hbs +82 -0
- package/addon/components/vendor/panel-header.js +48 -0
- package/addon/components/work-order/details.hbs +5 -1
- package/addon/components/work-order/form.hbs +26 -4
- package/addon/components/work-order/form.js +5 -1
- package/addon/controllers/connectivity/devices/index/details/events.js +244 -1
- package/addon/controllers/connectivity/devices/index/details/sensors.js +199 -0
- package/addon/controllers/connectivity/devices/index/details/vehicle.js +122 -0
- package/addon/controllers/connectivity/devices/index/details.js +12 -0
- 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/attachments.js +220 -54
- package/addon/controllers/connectivity/telematics/details/devices.js +170 -129
- package/addon/controllers/connectivity/telematics/details/events.js +39 -11
- package/addon/controllers/connectivity/telematics/details/sensors.js +39 -19
- package/addon/controllers/maintenance/equipment/index.js +1 -2
- package/addon/controllers/maintenance/parts/index.js +1 -2
- package/addon/controllers/maintenance/work-orders/index.js +18 -1
- 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/events.js +37 -1
- package/addon/routes/connectivity/devices/index/details/sensors.js +35 -0
- package/addon/routes/connectivity/devices/index/details/vehicle.js +29 -0
- 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/attachments.js +72 -9
- package/addon/routes/connectivity/telematics/details/devices.js +6 -0
- package/addon/routes/connectivity/telematics/details/sensors.js +1 -0
- package/addon/routes/connectivity/telematics/details.js +1 -1
- package/addon/routes/connectivity/telematics/edit.js +1 -1
- package/addon/routes/maintenance/work-orders/index.js +1 -0
- package/addon/routes.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/order-creation.js +54 -1
- package/addon/services/order-validation.js +3 -2
- package/addon/services/sensor-actions.js +3 -0
- package/addon/services/service-rate-actions.js +40 -1
- package/addon/services/vehicle-actions.js +24 -12
- package/addon/services/vendor-actions.js +3 -0
- package/addon/styles/fleetops-engine.css +28 -4
- package/addon/templates/connectivity/devices/index/details/events.hbs +85 -1
- package/addon/templates/connectivity/devices/index/details/sensors.hbs +73 -0
- package/addon/templates/connectivity/devices/index/details/vehicle.hbs +147 -0
- package/addon/templates/connectivity/telematics/details/attachments.hbs +198 -121
- package/addon/templates/connectivity/telematics/details/devices.hbs +4 -1
- package/addon/templates/connectivity/telematics/details/events.hbs +4 -1
- package/addon/templates/connectivity/telematics/details/sensors.hbs +3 -0
- package/addon/templates/management/vehicles/index/edit.hbs +1 -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/fleet-ops-options.js +38 -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/order/form/orchestrator-constraints.js +1 -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/devices/index/details/sensors.js +1 -0
- package/app/controllers/connectivity/devices/index/details/vehicle.js +1 -0
- package/app/controllers/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/routes/connectivity/devices/index/details/sensors.js +1 -0
- package/app/routes/connectivity/devices/index/details/vehicle.js +1 -0
- package/app/routes/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/templates/connectivity/devices/index/details/sensors.js +1 -0
- package/app/templates/connectivity/devices/index/details/vehicle.js +1 -0
- 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/migrations/2025_08_28_054930_create_work_orders_table.php +1 -0
- package/server/migrations/2026_06_18_000001_add_category_to_work_orders_table.php +32 -0
- package/server/seeders/Testing/MaintenanceSeeder.php +5 -4
- package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +1 -0
- package/server/src/Console/Commands/SyncTelematics.php +89 -0
- package/server/src/Exceptions/TelematicProviderException.php +13 -2
- package/server/src/Http/Controllers/Api/v1/OrderController.php +6 -21
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +55 -1
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +17 -6
- package/server/src/Http/Controllers/Internal/v1/FleetController.php +9 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +178 -1
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +1 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +4 -32
- package/server/src/Http/Controllers/Internal/v1/SearchController.php +2 -2
- package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +4 -4
- package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +82 -13
- package/server/src/Http/Filter/DeviceEventFilter.php +65 -0
- package/server/src/Http/Filter/DeviceFilter.php +80 -0
- package/server/src/Http/Filter/SensorFilter.php +125 -0
- package/server/src/Http/Filter/VehicleFilter.php +13 -0
- package/server/src/Http/Requests/CreateDriverRequest.php +14 -13
- package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -0
- package/server/src/Http/Resources/v1/Driver.php +11 -2
- package/server/src/Http/Resources/v1/Index/Vehicle.php +19 -0
- package/server/src/Http/Resources/v1/WorkOrder.php +1 -0
- package/server/src/Jobs/FinalizeApiOrderCreation.php +47 -0
- package/server/src/Jobs/FinalizeInternalOrderCreation.php +35 -0
- package/server/src/Jobs/NotifyBulkAssignedDriver.php +47 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +180 -123
- package/server/src/Models/Device.php +17 -1
- package/server/src/Models/DeviceEvent.php +82 -1
- package/server/src/Models/Driver.php +16 -0
- package/server/src/Models/Equipment.php +55 -0
- package/server/src/Models/Sensor.php +15 -2
- package/server/src/Models/Telematic.php +1 -1
- package/server/src/Models/Vehicle.php +5 -1
- package/server/src/Models/WorkOrder.php +5 -2
- package/server/src/Observers/DriverObserver.php +3 -3
- package/server/src/Observers/FleetObserver.php +23 -0
- package/server/src/Observers/VehicleObserver.php +3 -3
- package/server/src/Providers/FleetOpsServiceProvider.php +2 -0
- package/server/src/Support/LiveCacheService.php +1 -1
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +143 -20
- 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 +70 -5
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +122 -14
- package/server/src/Support/Telematics/TelematicService.php +330 -30
- package/server/src/routes.php +1 -1
- package/server/tests/DeviceFilterTest.php +45 -0
- package/server/tests/DriverVehicleStatusDefaultTest.php +19 -2
- package/server/tests/EquipmentAssignmentMorphTypeTest.php +35 -0
- package/server/tests/OperationsMonitorEndpointTest.php +38 -0
- package/server/tests/OrderQueuedClosureRegressionTest.php +36 -0
- package/server/tests/ServiceRateRouteValidationTest.php +101 -0
- package/server/tests/TelematicsHardeningTest.php +598 -6
- package/server/tests/VehicleDriverAssignmentTest.php +27 -0
- package/translations/en-us.yaml +1 -0
- 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,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
|
}
|
|
@@ -1,21 +1,84 @@
|
|
|
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
|
import fleetOpsOptions from '../../../utils/fleet-ops-options';
|
|
5
6
|
|
|
7
|
+
function sensorTelematic(sensor) {
|
|
8
|
+
const telematic = get(sensor, 'telematic');
|
|
9
|
+
|
|
10
|
+
if (telematic) {
|
|
11
|
+
return telematic;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const id = get(sensor, 'telematic_uuid');
|
|
15
|
+
const name = get(sensor, 'telematic_name');
|
|
16
|
+
const provider = get(sensor, 'provider');
|
|
17
|
+
|
|
18
|
+
if (!id && !name && !provider) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
id,
|
|
24
|
+
name: name ?? provider,
|
|
25
|
+
provider,
|
|
26
|
+
provider_descriptor: get(sensor, 'provider_descriptor'),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function sensorDevice(sensor) {
|
|
31
|
+
const device = get(sensor, 'device');
|
|
32
|
+
|
|
33
|
+
if (device) {
|
|
34
|
+
return device;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const id = get(sensor, 'device_uuid');
|
|
38
|
+
const deviceId = get(sensor, 'device_id') ?? get(sensor, 'provider_device_id') ?? get(sensor, 'ident');
|
|
39
|
+
const name = get(sensor, 'device_name') ?? deviceId;
|
|
40
|
+
const imei = get(sensor, 'device_imei') ?? get(sensor, 'imei') ?? get(sensor, 'ident');
|
|
41
|
+
|
|
42
|
+
if (!id && !name && !imei && !deviceId) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id,
|
|
48
|
+
displayName: name,
|
|
49
|
+
name,
|
|
50
|
+
imei,
|
|
51
|
+
device_id: deviceId,
|
|
52
|
+
ident: get(sensor, 'ident'),
|
|
53
|
+
serial_number: get(sensor, 'device_serial_number'),
|
|
54
|
+
connection_status: get(sensor, 'device_connection_status'),
|
|
55
|
+
status: get(sensor, 'device_status'),
|
|
56
|
+
photo_url: get(sensor, 'device_photo_url') ?? get(sensor, 'photo_url'),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
6
60
|
export default class ConnectivitySensorsIndexController extends Controller {
|
|
7
61
|
@service sensorActions;
|
|
8
62
|
@service deviceActions;
|
|
9
63
|
@service telematicActions;
|
|
10
64
|
@service intl;
|
|
65
|
+
@service store;
|
|
11
66
|
|
|
12
67
|
/** query params */
|
|
13
|
-
@tracked queryParams = ['
|
|
68
|
+
@tracked queryParams = ['page', 'limit', 'sort', 'query', 'telematic', 'device', 'type', 'status', 'serial_number', 'imei', 'last_reading_at', 'created_at', 'updated_at'];
|
|
14
69
|
@tracked page = 1;
|
|
15
70
|
@tracked limit;
|
|
16
71
|
@tracked sort = '-created_at';
|
|
17
|
-
@tracked
|
|
18
|
-
@tracked
|
|
72
|
+
@tracked query;
|
|
73
|
+
@tracked telematic;
|
|
74
|
+
@tracked device;
|
|
75
|
+
@tracked type;
|
|
76
|
+
@tracked status;
|
|
77
|
+
@tracked serial_number;
|
|
78
|
+
@tracked imei;
|
|
79
|
+
@tracked last_reading_at;
|
|
80
|
+
@tracked created_at;
|
|
81
|
+
@tracked updated_at;
|
|
19
82
|
|
|
20
83
|
/** action buttons */
|
|
21
84
|
@tracked actionButtons = [
|
|
@@ -67,14 +130,16 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
67
130
|
resizable: true,
|
|
68
131
|
sortable: true,
|
|
69
132
|
filterable: true,
|
|
70
|
-
filterParam: '
|
|
133
|
+
filterParam: 'query',
|
|
71
134
|
filterComponent: 'filter/string',
|
|
72
135
|
},
|
|
73
136
|
{
|
|
74
137
|
label: 'Telematic',
|
|
75
138
|
valuePath: 'telematic.provider',
|
|
76
|
-
cellComponent: '
|
|
77
|
-
|
|
139
|
+
cellComponent: 'cell/telematic-provider',
|
|
140
|
+
resourcePath: sensorTelematic,
|
|
141
|
+
compact: true,
|
|
142
|
+
action: this.openTelematic,
|
|
78
143
|
permission: 'fleet-ops view telematic',
|
|
79
144
|
resizable: true,
|
|
80
145
|
sortable: true,
|
|
@@ -87,8 +152,10 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
87
152
|
{
|
|
88
153
|
label: 'Device',
|
|
89
154
|
valuePath: 'device.displayName',
|
|
90
|
-
cellComponent: '
|
|
91
|
-
|
|
155
|
+
cellComponent: 'cell/device-identity',
|
|
156
|
+
resourcePath: sensorDevice,
|
|
157
|
+
showStatus: false,
|
|
158
|
+
action: this.openDevice,
|
|
92
159
|
permission: 'fleet-ops view device',
|
|
93
160
|
resizable: true,
|
|
94
161
|
sortable: true,
|
|
@@ -97,10 +164,14 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
97
164
|
filterComponentPlaceholder: 'Select device',
|
|
98
165
|
filterParam: 'device',
|
|
99
166
|
model: 'device',
|
|
167
|
+
modelNamePath: 'displayName',
|
|
168
|
+
query: this.telematic ? { telematic_uuid: this.telematic } : undefined,
|
|
100
169
|
},
|
|
101
170
|
{
|
|
102
171
|
label: 'Type',
|
|
103
172
|
valuePath: 'type',
|
|
173
|
+
cellComponent: 'table/cell/base',
|
|
174
|
+
humanize: true,
|
|
104
175
|
resizable: true,
|
|
105
176
|
sortable: true,
|
|
106
177
|
filterable: true,
|
|
@@ -109,13 +180,16 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
109
180
|
filterOptions: fleetOpsOptions('sensorTypes'),
|
|
110
181
|
},
|
|
111
182
|
{
|
|
112
|
-
label: '
|
|
113
|
-
valuePath: '
|
|
183
|
+
label: 'Last Value',
|
|
184
|
+
valuePath: 'last_value',
|
|
185
|
+
resizable: true,
|
|
186
|
+
sortable: true,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
label: 'Unit',
|
|
190
|
+
valuePath: 'unit',
|
|
114
191
|
resizable: true,
|
|
115
192
|
sortable: true,
|
|
116
|
-
filterable: true,
|
|
117
|
-
filterParam: 'serial_number',
|
|
118
|
-
filterComponent: 'filter/string',
|
|
119
193
|
},
|
|
120
194
|
{
|
|
121
195
|
label: this.intl.t('column.status'),
|
|
@@ -127,6 +201,41 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
127
201
|
filterComponent: 'filter/multi-option',
|
|
128
202
|
filterOptions: fleetOpsOptions('sensorStatuses'),
|
|
129
203
|
},
|
|
204
|
+
{
|
|
205
|
+
label: 'Threshold',
|
|
206
|
+
valuePath: 'threshold_status',
|
|
207
|
+
cellComponent: 'table/cell/status',
|
|
208
|
+
resizable: true,
|
|
209
|
+
sortable: true,
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
label: 'Serial Number',
|
|
213
|
+
valuePath: 'serial_number',
|
|
214
|
+
resizable: true,
|
|
215
|
+
sortable: true,
|
|
216
|
+
filterable: true,
|
|
217
|
+
filterParam: 'serial_number',
|
|
218
|
+
filterComponent: 'filter/string',
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
label: 'IMEI',
|
|
222
|
+
valuePath: 'imei',
|
|
223
|
+
resizable: true,
|
|
224
|
+
sortable: true,
|
|
225
|
+
filterable: true,
|
|
226
|
+
filterParam: 'imei',
|
|
227
|
+
filterComponent: 'filter/string',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
label: 'Last Reading',
|
|
231
|
+
valuePath: 'lastReadingAt',
|
|
232
|
+
sortParam: 'last_reading_at',
|
|
233
|
+
resizable: true,
|
|
234
|
+
sortable: true,
|
|
235
|
+
filterable: true,
|
|
236
|
+
filterParam: 'last_reading_at',
|
|
237
|
+
filterComponent: 'filter/date',
|
|
238
|
+
},
|
|
130
239
|
{
|
|
131
240
|
label: this.intl.t('column.created-at'),
|
|
132
241
|
valuePath: 'createdAt',
|
|
@@ -134,6 +243,7 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
134
243
|
resizable: true,
|
|
135
244
|
sortable: true,
|
|
136
245
|
filterable: true,
|
|
246
|
+
filterParam: 'created_at',
|
|
137
247
|
filterComponent: 'filter/date',
|
|
138
248
|
},
|
|
139
249
|
{
|
|
@@ -144,9 +254,9 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
144
254
|
sortable: true,
|
|
145
255
|
hidden: true,
|
|
146
256
|
filterable: true,
|
|
257
|
+
filterParam: 'updated_at',
|
|
147
258
|
filterComponent: 'filter/date',
|
|
148
259
|
},
|
|
149
|
-
|
|
150
260
|
{
|
|
151
261
|
label: '',
|
|
152
262
|
cellComponent: 'table/cell/dropdown',
|
|
@@ -184,4 +294,36 @@ export default class ConnectivitySensorsIndexController extends Controller {
|
|
|
184
294
|
searchable: false,
|
|
185
295
|
},
|
|
186
296
|
];
|
|
297
|
+
|
|
298
|
+
async resolveDevice(device) {
|
|
299
|
+
if (!device?.id) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const cachedDevice = this.store.peekRecord('device', device.id);
|
|
304
|
+
|
|
305
|
+
if (cachedDevice) {
|
|
306
|
+
return cachedDevice;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
try {
|
|
310
|
+
return await this.store.findRecord('device', device.id);
|
|
311
|
+
} catch (_) {
|
|
312
|
+
return device;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
@action async openDevice(device) {
|
|
317
|
+
const resolvedDevice = await this.resolveDevice(device);
|
|
318
|
+
|
|
319
|
+
if (resolvedDevice?.id) {
|
|
320
|
+
return this.deviceActions.panel.view(resolvedDevice);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
@action openTelematic(telematic) {
|
|
325
|
+
if (telematic?.id) {
|
|
326
|
+
return this.telematicActions.transition.view(telematic);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
187
329
|
}
|