@fleetbase/fleetops-engine 0.6.69 → 0.6.70
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 +41 -8
- package/addon/components/admin/telematics-settings.hbs +143 -0
- package/addon/components/admin/telematics-settings.js +145 -0
- package/addon/components/fuel-integration/hub.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +37 -17
- package/addon/components/map/leaflet-live-map.hbs +4 -242
- package/addon/components/map/leaflet-live-map.js +2 -1
- package/addon/components/map/marker-card/driver.hbs +57 -0
- package/addon/components/map/marker-card/driver.js +3 -0
- package/addon/components/map/marker-card/vehicle.hbs +78 -0
- package/addon/components/map/marker-card/vehicle.js +3 -0
- package/addon/components/telematic/hub.hbs +1 -1
- package/addon/components/widget/live-fleet.hbs +8 -40
- package/addon/controllers/analytics/reports/index.js +5 -0
- package/addon/controllers/connectivity/devices/index.js +4 -0
- package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
- package/addon/controllers/connectivity/sensors/index.js +4 -0
- package/addon/controllers/connectivity/telematics/index.js +4 -0
- package/addon/controllers/maintenance/equipment/index.js +11 -4
- package/addon/controllers/maintenance/inspection-forms/index.js +2 -2
- package/addon/controllers/maintenance/inspection-submissions/index.js +8 -2
- package/addon/controllers/maintenance/maintenances/index.js +4 -0
- package/addon/controllers/maintenance/parts/index.js +11 -4
- package/addon/controllers/maintenance/schedules/index.js +17 -4
- package/addon/controllers/maintenance/work-orders/index.js +11 -4
- package/addon/controllers/management/contacts/index.js +4 -0
- package/addon/controllers/management/drivers/index.js +4 -0
- package/addon/controllers/management/fleets/index.js +4 -0
- package/addon/controllers/management/fuel-reports/index.js +4 -0
- package/addon/controllers/management/fuel-transactions/index.js +9 -7
- package/addon/controllers/management/issues/index.js +4 -0
- package/addon/controllers/management/places/index.js +4 -0
- package/addon/controllers/management/vehicles/index.js +4 -0
- package/addon/controllers/management/vendors/index.js +4 -0
- package/addon/controllers/operations/orders/index/details.js +30 -1
- package/addon/controllers/operations/orders/index.js +7 -0
- package/addon/controllers/operations/service-rates/index.js +3 -0
- package/addon/controllers/settings/index.js +13 -0
- package/addon/controllers/settings/telematics.js +113 -0
- package/addon/extension.js +38 -6
- package/addon/routes/analytics/index.js +14 -1
- package/addon/routes/analytics/reports/index/details.js +1 -1
- package/addon/routes/analytics/reports/index/edit.js +1 -1
- package/addon/routes/analytics/reports/index/new.js +14 -1
- package/addon/routes/analytics/reports.js +14 -1
- package/addon/routes/connectivity/devices/index/new.js +14 -1
- package/addon/routes/connectivity/devices.js +14 -1
- package/addon/routes/connectivity/events.js +14 -1
- package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
- package/addon/routes/connectivity/fuel-providers/details.js +9 -0
- package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
- package/addon/routes/connectivity/fuel-providers/new.js +14 -1
- package/addon/routes/connectivity/fuel-providers.js +14 -1
- package/addon/routes/connectivity/sensors/index/new.js +14 -1
- package/addon/routes/connectivity/sensors.js +14 -1
- package/addon/routes/connectivity/telematics/new.js +14 -1
- package/addon/routes/connectivity/telematics.js +14 -1
- package/addon/routes/connectivity/tracking.js +14 -1
- package/addon/routes/maintenance/equipment/index/details.js +2 -2
- package/addon/routes/maintenance/equipment/index/edit.js +2 -2
- package/addon/routes/maintenance/equipment/index/new.js +14 -1
- package/addon/routes/maintenance/equipment.js +14 -1
- package/addon/routes/maintenance/index.js +14 -1
- package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
- package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
- package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
- package/addon/routes/maintenance/inspection-forms.js +14 -1
- package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
- package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
- package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
- package/addon/routes/maintenance/inspection-submissions.js +14 -1
- package/addon/routes/maintenance/maintenances/index/details.js +2 -2
- package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
- package/addon/routes/maintenance/maintenances/index/new.js +14 -1
- package/addon/routes/maintenance/maintenances.js +14 -1
- package/addon/routes/maintenance/parts/index/details.js +2 -2
- package/addon/routes/maintenance/parts/index/edit.js +2 -2
- package/addon/routes/maintenance/parts/index/new.js +14 -1
- package/addon/routes/maintenance/parts.js +14 -1
- package/addon/routes/maintenance/schedules/index/details.js +2 -2
- package/addon/routes/maintenance/schedules/index/edit.js +2 -2
- package/addon/routes/maintenance/schedules/index/new.js +15 -1
- package/addon/routes/maintenance/schedules.js +15 -1
- package/addon/routes/maintenance/work-orders/index/details.js +2 -2
- package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
- package/addon/routes/maintenance/work-orders/index/new.js +14 -1
- package/addon/routes/maintenance/work-orders.js +14 -1
- package/addon/routes/management/fuel-transactions/index/details.js +9 -0
- package/addon/routes/management/fuel-transactions.js +14 -1
- package/addon/routes/management/index.js +13 -0
- package/addon/routes/management/trailers.js +16 -0
- package/addon/routes/management/vendors/integrated/details.js +14 -1
- package/addon/routes/management/vendors/integrated/edit.js +14 -1
- package/addon/routes/management/vendors/integrated/new.js +14 -1
- package/addon/routes/management/vendors/integrated.js +14 -1
- package/addon/routes/operations/orders.js +40 -1
- package/addon/routes/operations/routes/index/details.js +14 -1
- package/addon/routes/operations/routes/index/new.js +13 -0
- package/addon/routes/operations/routes.js +14 -1
- package/addon/routes/operations/service-rates/index/new.js +11 -0
- package/addon/routes/operations/service-rates.js +14 -1
- package/addon/routes/settings/avatars.js +14 -1
- package/addon/routes/settings/custom-fields.js +14 -1
- package/addon/routes/settings/map.js +14 -1
- package/addon/routes/settings/notifications.js +11 -0
- package/addon/routes/settings/orchestrator.js +1 -1
- package/addon/routes/settings/payments/index.js +1 -1
- package/addon/routes/settings/routing.js +14 -1
- package/addon/routes/settings/scheduling.js +14 -1
- package/addon/routes/settings/telematics.js +21 -0
- package/addon/routes/virtual.js +11 -0
- package/addon/routes.js +1 -0
- package/addon/templates/settings/telematics.hbs +70 -0
- package/app/components/admin/telematics-settings.js +1 -0
- package/app/components/map/marker-card/driver.js +1 -0
- package/app/components/map/marker-card/vehicle.js +1 -0
- package/app/controllers/settings/telematics.js +1 -0
- package/app/routes/settings/telematics.js +1 -0
- package/app/templates/settings/telematics.js +1 -0
- package/composer.json +2 -2
- package/docs/AFAQY.md +1 -1
- package/docs/TELEMATICS_QUEUES.md +1 -1
- package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
- package/extension.json +1 -1
- package/package.json +1 -1
- package/server/config/telemetry.php +12 -0
- package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
- package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
- package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
- package/server/src/Auth/Schemas/FleetOps.php +104 -5
- package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
- package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
- package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
- package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
- package/server/src/Http/Controllers/FleetOpsController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/CustomerController.php +14 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +22 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
- package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +22 -0
- package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
- package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
- package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
- package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
- package/server/src/Mail/CustomerCredentialsMail.php +1 -1
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +3 -0
- package/server/src/Support/Analytics/LiveFleet.php +18 -2
- package/server/src/Support/Authorization.php +103 -0
- package/server/src/Support/Database/TableIndexes.php +66 -0
- package/server/src/Support/OrderTracker.php +2 -2
- package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
- package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
- package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
- package/server/src/Support/Telematics/TelematicService.php +12 -2
- package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
- package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
- package/server/src/Tracking/TrackingOptions.php +2 -2
- package/server/src/Traits/AuthorizesMethods.php +37 -0
- package/server/src/routes.php +9 -1
- package/server/tests/AnalyticsRoutesTest.php +29 -2
- package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +16 -1
- package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
- package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
- package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
- package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
- package/server/tests/NavigatorControllerContractsTest.php +36 -4
- package/server/tests/NotificationAndMailContractsTest.php +31 -0
- package/server/tests/ObserverContractsTest.php +1 -1
- package/server/tests/OrchestratorConsumableApiTest.php +42 -0
- package/server/tests/ProviderContractsTest.php +10 -0
- package/server/tests/ReportSchemaContractsTest.php +120 -6
- package/server/tests/SettingControllerContractsTest.php +429 -18
- package/server/tests/SmallControllerContractsTest.php +8 -5
- package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
- package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
- package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
- package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
- package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
- package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
- package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
- package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
- package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
- package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
- package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
- package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
- package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
- package/translations/en-us.yaml +48 -0
|
@@ -86,6 +86,7 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
86
86
|
type: 'primary',
|
|
87
87
|
icon: 'plus',
|
|
88
88
|
onClick: this.orderActions.transition.create,
|
|
89
|
+
permission: 'fleet-ops create order',
|
|
89
90
|
},
|
|
90
91
|
{
|
|
91
92
|
text: this.intl.t('common.export'),
|
|
@@ -93,12 +94,14 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
93
94
|
iconClass: 'rotate-icon-45',
|
|
94
95
|
wrapperClass: 'hidden md:flex',
|
|
95
96
|
onClick: this.orderActions.export,
|
|
97
|
+
permission: 'fleet-ops export order',
|
|
96
98
|
},
|
|
97
99
|
{
|
|
98
100
|
text: this.intl.t('common.import'),
|
|
99
101
|
icon: 'file-import',
|
|
100
102
|
wrapperClass: 'hidden md:flex',
|
|
101
103
|
onClick: () => this.orderActions.importOrders({ onImportComplete: this.orderActions.refresh }),
|
|
104
|
+
permission: 'fleet-ops import order',
|
|
102
105
|
},
|
|
103
106
|
];
|
|
104
107
|
}
|
|
@@ -110,23 +113,27 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
110
113
|
label: this.intl.t('common.cancel-resource', { resource: this.intl.t('resource.orders') }),
|
|
111
114
|
icon: 'ban',
|
|
112
115
|
fn: this.orderActions.bulkCancel,
|
|
116
|
+
permission: 'fleet-ops cancel order',
|
|
113
117
|
},
|
|
114
118
|
{
|
|
115
119
|
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.orders') }),
|
|
116
120
|
icon: 'trash',
|
|
117
121
|
class: 'text-red-500',
|
|
118
122
|
fn: this.orderActions.bulkDelete,
|
|
123
|
+
permission: 'fleet-ops delete order',
|
|
119
124
|
},
|
|
120
125
|
{ separator: true },
|
|
121
126
|
{
|
|
122
127
|
label: this.intl.t('common.dispatch-orders'),
|
|
123
128
|
icon: 'rocket',
|
|
124
129
|
fn: this.orderActions.bulkDispatch,
|
|
130
|
+
permission: 'fleet-ops dispatch order',
|
|
125
131
|
},
|
|
126
132
|
{
|
|
127
133
|
label: this.intl.t('common.assign-drivers'),
|
|
128
134
|
icon: 'user-plus',
|
|
129
135
|
fn: this.orderActions.bulkAssignDriver,
|
|
136
|
+
permission: 'fleet-ops assign-driver-for order',
|
|
130
137
|
},
|
|
131
138
|
];
|
|
132
139
|
}
|
|
@@ -29,6 +29,7 @@ export default class OperationsServiceRatesIndexController extends Controller {
|
|
|
29
29
|
type: 'primary',
|
|
30
30
|
icon: 'plus',
|
|
31
31
|
onClick: this.serviceRateActions.transition.create,
|
|
32
|
+
permission: 'fleet-ops create service-rate',
|
|
32
33
|
},
|
|
33
34
|
{
|
|
34
35
|
text: this.intl.t('common.export'),
|
|
@@ -36,6 +37,7 @@ export default class OperationsServiceRatesIndexController extends Controller {
|
|
|
36
37
|
iconClass: 'rotate-icon-45',
|
|
37
38
|
wrapperClass: 'hidden md:flex',
|
|
38
39
|
onClick: this.serviceRateActions.export,
|
|
40
|
+
permission: 'fleet-ops export service-rate',
|
|
39
41
|
},
|
|
40
42
|
];
|
|
41
43
|
}
|
|
@@ -47,6 +49,7 @@ export default class OperationsServiceRatesIndexController extends Controller {
|
|
|
47
49
|
label: 'Delete selected...',
|
|
48
50
|
class: 'text-red-500',
|
|
49
51
|
fn: this.serviceRateActions.bulkDelete,
|
|
52
|
+
permission: 'fleet-ops delete service-rate',
|
|
50
53
|
},
|
|
51
54
|
];
|
|
52
55
|
}
|
|
@@ -28,6 +28,12 @@ export default class SettingsIndexController extends Controller {
|
|
|
28
28
|
description: 'Keep commerce, metadata, and visual conventions aligned.',
|
|
29
29
|
links: [
|
|
30
30
|
{ label: 'Payments', route: 'settings.payments', icon: 'cash-register', description: 'Payment setup for operational commerce workflows.' },
|
|
31
|
+
{
|
|
32
|
+
label: 'Telematics',
|
|
33
|
+
route: 'settings.telematics',
|
|
34
|
+
icon: 'satellite-dish',
|
|
35
|
+
description: 'Device event and position history preferences within the system retention policy.',
|
|
36
|
+
},
|
|
31
37
|
{ label: 'Custom Fields', route: 'settings.custom-fields', icon: 'pen-to-square', description: 'Operational metadata fields for Fleet-Ops records.' },
|
|
32
38
|
{ label: 'Avatars', route: 'settings.avatars', icon: 'icons', description: 'Visual assets for driver, vehicle, and map displays.' },
|
|
33
39
|
],
|
|
@@ -113,6 +119,13 @@ export default class SettingsIndexController extends Controller {
|
|
|
113
119
|
title: 'Scheduling settings',
|
|
114
120
|
description: 'Manage schedule templates and timing rules for planned work.',
|
|
115
121
|
},
|
|
122
|
+
{
|
|
123
|
+
label: 'Telematics',
|
|
124
|
+
icon: 'satellite-dish',
|
|
125
|
+
slug: 'fleet-ops/settings/telematics',
|
|
126
|
+
title: 'Telematics Settings',
|
|
127
|
+
description: 'Choose how long your organization keeps device events and position history.',
|
|
128
|
+
},
|
|
116
129
|
{
|
|
117
130
|
label: 'Custom Fields',
|
|
118
131
|
icon: 'pen-to-square',
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { inject as service } from '@ember/service';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
/** Organization history preferences, subject to the system retention policy. */
|
|
8
|
+
export default class SettingsTelematicsController extends Controller {
|
|
9
|
+
@service fetch;
|
|
10
|
+
@service notifications;
|
|
11
|
+
@service intl;
|
|
12
|
+
|
|
13
|
+
@tracked eventRetentionDays = 30;
|
|
14
|
+
@tracked positionRetentionDays = 90;
|
|
15
|
+
@tracked useDefaultEventRetention = true;
|
|
16
|
+
@tracked useDefaultPositionRetention = true;
|
|
17
|
+
@tracked defaults = {};
|
|
18
|
+
@tracked policy = {};
|
|
19
|
+
@tracked settingsLoaded = false;
|
|
20
|
+
|
|
21
|
+
get eventRetentionMinimum() {
|
|
22
|
+
return this.policy.max_event_retention_days > 0 ? 1 : 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get eventRetentionMaximum() {
|
|
26
|
+
return this.policy.max_event_retention_days > 0 ? this.policy.max_event_retention_days : 3650;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get positionRetentionMinimum() {
|
|
30
|
+
return this.policy.max_position_retention_days > 0 ? 1 : 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get positionRetentionMaximum() {
|
|
34
|
+
return this.policy.max_position_retention_days > 0 ? this.policy.max_position_retention_days : 3650;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
get eventRetentionPolicyHelp() {
|
|
38
|
+
return this.retentionPolicyHelp(this.policy.max_event_retention_days);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get positionRetentionPolicyHelp() {
|
|
42
|
+
return this.retentionPolicyHelp(this.policy.max_position_retention_days);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get settingsPayload() {
|
|
46
|
+
return {
|
|
47
|
+
event_retention_days: this.useDefaultEventRetention ? null : this.eventRetentionDays,
|
|
48
|
+
position_retention_days: this.useDefaultPositionRetention ? null : this.positionRetentionDays,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@task({ restartable: true }) *getSettings() {
|
|
53
|
+
this.settingsLoaded = false;
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const settings = yield this.fetch.get('fleet-ops/settings/telematics-settings');
|
|
57
|
+
this.applySettings(settings);
|
|
58
|
+
this.settingsLoaded = true;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
this.notifications.serverError(error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@task({ drop: true }) *saveSettings() {
|
|
65
|
+
if (!this.settingsLoaded) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const settings = yield this.fetch.post('fleet-ops/settings/telematics-settings', this.settingsPayload);
|
|
71
|
+
this.applySettings(settings);
|
|
72
|
+
this.notifications.success(this.intl.t('settings.telematics.settings-saved'));
|
|
73
|
+
} catch (error) {
|
|
74
|
+
this.notifications.serverError(error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@action setUseDefaultEventRetention(enabled) {
|
|
79
|
+
this.useDefaultEventRetention = enabled;
|
|
80
|
+
if (enabled) {
|
|
81
|
+
this.eventRetentionDays = this.defaults.event_retention_days ?? this.eventRetentionDays;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@action setUseDefaultPositionRetention(enabled) {
|
|
86
|
+
this.useDefaultPositionRetention = enabled;
|
|
87
|
+
if (enabled) {
|
|
88
|
+
this.positionRetentionDays = this.defaults.position_retention_days ?? this.positionRetentionDays;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
applySettings(settings = {}) {
|
|
93
|
+
const has = (object, key) => Object.prototype.hasOwnProperty.call(object ?? {}, key);
|
|
94
|
+
const hasHistoryMetadata = ['event_retention_days', 'position_retention_days'].every(
|
|
95
|
+
(key) => has(settings?.preferences, key) && has(settings?.defaults, key) && has(settings?.policy, `max_${key}`)
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
if (!hasHistoryMetadata) {
|
|
99
|
+
throw new Error(this.intl.t('settings.telematics.settings-unavailable'));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
this.eventRetentionDays = settings.event_retention_days ?? this.eventRetentionDays;
|
|
103
|
+
this.positionRetentionDays = settings.position_retention_days ?? this.positionRetentionDays;
|
|
104
|
+
this.useDefaultEventRetention = (settings.preferences?.event_retention_days ?? null) === null;
|
|
105
|
+
this.useDefaultPositionRetention = (settings.preferences?.position_retention_days ?? null) === null;
|
|
106
|
+
this.defaults = settings.defaults ?? this.defaults;
|
|
107
|
+
this.policy = settings.policy ?? this.policy;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
retentionPolicyHelp(maximum) {
|
|
111
|
+
return maximum > 0 ? this.intl.t('settings.telematics.history-policy-maximum', { days: maximum }) : this.intl.t('settings.telematics.history-policy-unlimited');
|
|
112
|
+
}
|
|
113
|
+
}
|
package/addon/extension.js
CHANGED
|
@@ -18,66 +18,77 @@ export default {
|
|
|
18
18
|
description: 'Everything across resources, maintenance and staffing that needs a decision today.',
|
|
19
19
|
icon: 'satellite-dish',
|
|
20
20
|
route: 'console.fleet-ops.management.index',
|
|
21
|
+
permission: 'fleet-ops list driver',
|
|
21
22
|
},
|
|
22
23
|
{
|
|
23
24
|
title: 'Orders',
|
|
24
25
|
description: 'Create, dispatch, and track delivery orders in real time.',
|
|
25
26
|
icon: 'boxes-stacked',
|
|
26
27
|
route: 'console.fleet-ops.operations.orders',
|
|
28
|
+
permission: 'fleet-ops list order',
|
|
27
29
|
},
|
|
28
30
|
{
|
|
29
31
|
title: 'Places',
|
|
30
32
|
description: 'Manage saved locations, addresses, and points of interest.',
|
|
31
33
|
icon: 'location-dot',
|
|
32
34
|
route: 'console.fleet-ops.management.places',
|
|
35
|
+
permission: 'fleet-ops list place',
|
|
33
36
|
},
|
|
34
37
|
{
|
|
35
38
|
title: 'Drivers',
|
|
36
39
|
description: 'Manage driver profiles, assignments, and live locations.',
|
|
37
40
|
icon: 'id-card',
|
|
38
41
|
route: 'console.fleet-ops.management.drivers',
|
|
42
|
+
permission: 'fleet-ops list driver',
|
|
39
43
|
},
|
|
40
44
|
{
|
|
41
45
|
title: 'Vehicles',
|
|
42
46
|
description: 'View and manage your vehicle fleet and telematics.',
|
|
43
47
|
icon: 'truck',
|
|
44
48
|
route: 'console.fleet-ops.management.vehicles',
|
|
49
|
+
permission: 'fleet-ops list vehicle',
|
|
45
50
|
},
|
|
46
51
|
{
|
|
47
52
|
title: intlService.t('menu.trailers'),
|
|
48
53
|
description: intlService.t('trailer.navigation-description'),
|
|
49
54
|
icon: 'trailer',
|
|
50
55
|
route: 'console.fleet-ops.management.trailers',
|
|
56
|
+
permission: 'fleet-ops list trailer',
|
|
51
57
|
},
|
|
52
58
|
{
|
|
53
59
|
title: 'Fleets',
|
|
54
60
|
description: 'Organise drivers and vehicles into operational fleets.',
|
|
55
61
|
icon: 'layer-group',
|
|
56
62
|
route: 'console.fleet-ops.management.fleets',
|
|
63
|
+
permission: 'fleet-ops list fleet',
|
|
57
64
|
},
|
|
58
65
|
{
|
|
59
66
|
title: 'Service Rates',
|
|
60
67
|
description: 'Configure pricing rules and service rate cards.',
|
|
61
68
|
icon: 'tags',
|
|
62
69
|
route: 'console.fleet-ops.operations.service-rates',
|
|
70
|
+
permission: 'fleet-ops list service-rate',
|
|
63
71
|
},
|
|
64
72
|
{
|
|
65
73
|
title: 'Devices',
|
|
66
74
|
description: 'Manage connected telematics devices and their sensor data.',
|
|
67
75
|
icon: 'microchip',
|
|
68
76
|
route: 'console.fleet-ops.connectivity.devices',
|
|
77
|
+
permission: 'fleet-ops list device',
|
|
69
78
|
},
|
|
70
79
|
{
|
|
71
80
|
title: 'Reports',
|
|
72
81
|
description: 'Generate and review operational analytics reports.',
|
|
73
82
|
icon: 'chart-bar',
|
|
74
83
|
route: 'console.fleet-ops.analytics.reports',
|
|
84
|
+
permission: 'iam list report',
|
|
75
85
|
},
|
|
76
86
|
{
|
|
77
87
|
title: 'Orchestrator',
|
|
78
88
|
description: 'Intelligently allocate and dispatch orders to available drivers.',
|
|
79
89
|
icon: 'diagram-project',
|
|
80
90
|
route: 'console.fleet-ops.operations.orchestrator',
|
|
91
|
+
permission: 'fleet-ops list order',
|
|
81
92
|
},
|
|
82
93
|
],
|
|
83
94
|
});
|
|
@@ -101,6 +112,11 @@ export default {
|
|
|
101
112
|
icon: 'location-arrow',
|
|
102
113
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/navigator-app'),
|
|
103
114
|
}),
|
|
115
|
+
new MenuItem({
|
|
116
|
+
title: 'Telematics',
|
|
117
|
+
icon: 'satellite-dish',
|
|
118
|
+
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/telematics-settings'),
|
|
119
|
+
}),
|
|
104
120
|
],
|
|
105
121
|
{
|
|
106
122
|
slug: 'fleet-ops',
|
|
@@ -161,6 +177,14 @@ export default {
|
|
|
161
177
|
},
|
|
162
178
|
|
|
163
179
|
registerWidgets(widgetService) {
|
|
180
|
+
// `order` places a default widget on the default dashboard, which mixes widgets from
|
|
181
|
+
// every extension; the grid fills rows first-fit, lowest order first (widgets without
|
|
182
|
+
// one follow). The default layout is:
|
|
183
|
+
// 10-40 KPI row: Radar, Revenue (ledger, 20), Active Orders, Drivers Online
|
|
184
|
+
// 41-44 Ledger KPI row: Expenses, Net Income, Outstanding AR, Overdue AR
|
|
185
|
+
// 50 Live Fleet Map, full width
|
|
186
|
+
// 60-80 Revenue Trend, Top Drivers, Maintenance Overview, a third of the width each
|
|
187
|
+
// 150-170 Ledger Recent Financial Activity + Cash Flow Summary | console Blog + GitHub
|
|
164
188
|
const widgets = [
|
|
165
189
|
// Legacy monolithic 13-tile widget — kept registered for one release as
|
|
166
190
|
// users have it pinned to existing dashboards. The new KPI tile widgets
|
|
@@ -186,7 +210,7 @@ export default {
|
|
|
186
210
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-earnings'),
|
|
187
211
|
grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
|
|
188
212
|
category: 'KPI Tiles',
|
|
189
|
-
default:
|
|
213
|
+
default: false,
|
|
190
214
|
}),
|
|
191
215
|
new Widget({
|
|
192
216
|
id: 'fleet-ops-kpi-aov-widget',
|
|
@@ -196,7 +220,7 @@ export default {
|
|
|
196
220
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-aov'),
|
|
197
221
|
grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
|
|
198
222
|
category: 'KPI Tiles',
|
|
199
|
-
default:
|
|
223
|
+
default: false,
|
|
200
224
|
}),
|
|
201
225
|
new Widget({
|
|
202
226
|
id: 'fleet-ops-kpi-distance-widget',
|
|
@@ -216,6 +240,7 @@ export default {
|
|
|
216
240
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-active-orders'),
|
|
217
241
|
grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
|
|
218
242
|
category: 'KPI Tiles',
|
|
243
|
+
order: 30,
|
|
219
244
|
default: true,
|
|
220
245
|
}),
|
|
221
246
|
new Widget({
|
|
@@ -226,6 +251,7 @@ export default {
|
|
|
226
251
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-drivers-online'),
|
|
227
252
|
grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
|
|
228
253
|
category: 'KPI Tiles',
|
|
254
|
+
order: 40,
|
|
229
255
|
default: true,
|
|
230
256
|
}),
|
|
231
257
|
new Widget({
|
|
@@ -236,6 +262,7 @@ export default {
|
|
|
236
262
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/radar'),
|
|
237
263
|
grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
|
|
238
264
|
category: 'KPI Tiles',
|
|
265
|
+
order: 10,
|
|
239
266
|
default: true,
|
|
240
267
|
}),
|
|
241
268
|
new Widget({
|
|
@@ -266,8 +293,9 @@ export default {
|
|
|
266
293
|
description: 'Real-time driver positions and active routes.',
|
|
267
294
|
icon: 'map-location-dot',
|
|
268
295
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/live-fleet'),
|
|
269
|
-
grid_options: { w:
|
|
296
|
+
grid_options: { w: 12, h: 12, minW: 8, minH: 8 },
|
|
270
297
|
category: 'Maps',
|
|
298
|
+
order: 50,
|
|
271
299
|
default: true,
|
|
272
300
|
}),
|
|
273
301
|
new Widget({
|
|
@@ -276,8 +304,9 @@ export default {
|
|
|
276
304
|
description: 'Revenue over time with period comparison.',
|
|
277
305
|
icon: 'chart-line',
|
|
278
306
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/revenue-trend'),
|
|
279
|
-
grid_options: { w: 4, h:
|
|
307
|
+
grid_options: { w: 4, h: 9, minW: 4, minH: 7 },
|
|
280
308
|
category: 'Analytics',
|
|
309
|
+
order: 60,
|
|
281
310
|
default: true,
|
|
282
311
|
}),
|
|
283
312
|
new Widget({
|
|
@@ -306,8 +335,9 @@ export default {
|
|
|
306
335
|
description: 'Driver leaderboard sortable by orders, on-time %, or distance.',
|
|
307
336
|
icon: 'medal',
|
|
308
337
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/top-drivers'),
|
|
309
|
-
grid_options: { w:
|
|
338
|
+
grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
|
|
310
339
|
category: 'Analytics',
|
|
340
|
+
order: 70,
|
|
311
341
|
default: true,
|
|
312
342
|
}),
|
|
313
343
|
new Widget({
|
|
@@ -346,8 +376,9 @@ export default {
|
|
|
346
376
|
description: 'Overdue, scheduled, and YTD maintenance spend.',
|
|
347
377
|
icon: 'wrench',
|
|
348
378
|
component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/maintenance-overview'),
|
|
349
|
-
grid_options: { w:
|
|
379
|
+
grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
|
|
350
380
|
category: 'Analytics',
|
|
381
|
+
order: 80,
|
|
351
382
|
default: true,
|
|
352
383
|
}),
|
|
353
384
|
new Widget({
|
|
@@ -456,6 +487,7 @@ export default {
|
|
|
456
487
|
'fleet-ops:template:settings:routing',
|
|
457
488
|
'fleet-ops:template:settings:orchestrator',
|
|
458
489
|
'fleet-ops:component:admin:routing-settings',
|
|
490
|
+
'fleet-ops:component:admin:telematics-settings',
|
|
459
491
|
]);
|
|
460
492
|
},
|
|
461
493
|
};
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class AnalyticsIndexRoute extends Route {
|
|
4
|
+
export default class AnalyticsIndexRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops view analytics')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -17,7 +17,7 @@ export default class AnalyticsReportsIndexDetailsRoute extends Route {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
beforeModel() {
|
|
20
|
-
if (this.abilities.cannot('
|
|
20
|
+
if (this.abilities.cannot('iam view report')) {
|
|
21
21
|
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
22
|
return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@ export default class AnalyticsReportsIndexEditRoute extends Route {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
beforeModel() {
|
|
20
|
-
if (this.abilities.cannot('
|
|
20
|
+
if (this.abilities.cannot('iam update report')) {
|
|
21
21
|
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
22
|
return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
|
|
23
23
|
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class AnalyticsReportsIndexNewRoute extends Route {
|
|
4
|
+
export default class AnalyticsReportsIndexNewRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('iam create report')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class AnalyticsReportsRoute extends Route {
|
|
4
|
+
export default class AnalyticsReportsRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('iam list report')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivityDevicesIndexNewRoute extends Route {
|
|
4
|
+
export default class ConnectivityDevicesIndexNewRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops create device')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.devices.index');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivityDevicesRoute extends Route {
|
|
4
|
+
export default class ConnectivityDevicesRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops list device')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivityEventsRoute extends Route {
|
|
4
|
+
export default class ConnectivityEventsRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops list device-event')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -4,6 +4,18 @@ import { action } from '@ember/object';
|
|
|
4
4
|
|
|
5
5
|
export default class FuelIntegrationTransactionsRoute extends Route {
|
|
6
6
|
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
beforeModel() {
|
|
13
|
+
if (this.abilities.cannot('fleet-ops list fuel-provider-transaction')) {
|
|
14
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
15
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
7
19
|
queryParams = Object.fromEntries(['page', 'limit', 'sort', 'query', 'sync_status', 'vehicle', 'transaction_at'].map((key) => [key, { refreshModel: true }]));
|
|
8
20
|
model(params) {
|
|
9
21
|
const connection = this.modelFor('connectivity.fuel-providers.details');
|
|
@@ -6,6 +6,15 @@ export default class ConnectivityFuelProvidersIndexDetailsRoute extends Route {
|
|
|
6
6
|
@service store;
|
|
7
7
|
@service notifications;
|
|
8
8
|
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
beforeModel() {
|
|
13
|
+
if (this.abilities.cannot('fleet-ops view fuel-provider-connection')) {
|
|
14
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
15
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
9
18
|
|
|
10
19
|
setupController(controller, model) {
|
|
11
20
|
super.setupController(controller, model);
|
|
@@ -6,6 +6,15 @@ export default class ConnectivityFuelProvidersIndexEditRoute extends Route {
|
|
|
6
6
|
@service store;
|
|
7
7
|
@service notifications;
|
|
8
8
|
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
beforeModel() {
|
|
13
|
+
if (this.abilities.cannot('fleet-ops update fuel-provider-connection')) {
|
|
14
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
15
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
9
18
|
|
|
10
19
|
@action error(error) {
|
|
11
20
|
this.notifications.serverError(error);
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivityFuelProvidersIndexNewRoute extends Route {
|
|
4
|
+
export default class ConnectivityFuelProvidersIndexNewRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops create fuel-provider-connection')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivityFuelProvidersRoute extends Route {
|
|
4
|
+
export default class ConnectivityFuelProvidersRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops list fuel-provider-connection')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
2
3
|
|
|
3
|
-
export default class ConnectivitySensorsIndexNewRoute extends Route {
|
|
4
|
+
export default class ConnectivitySensorsIndexNewRoute extends Route {
|
|
5
|
+
@service notifications;
|
|
6
|
+
@service hostRouter;
|
|
7
|
+
@service abilities;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
beforeModel() {
|
|
11
|
+
if (this.abilities.cannot('fleet-ops create sensor')) {
|
|
12
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
13
|
+
return this.hostRouter.transitionTo('console.fleet-ops.connectivity.sensors.index');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|