@fleetbase/fleetops-engine 0.6.51 → 0.6.53
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/README.md +0 -2
- package/addon/components/cell/telematic-provider.hbs +16 -0
- package/addon/components/cell/telematic-provider.js +36 -0
- package/addon/components/cell/telematic-status.hbs +1 -0
- package/addon/components/cell/telematic-status.js +39 -0
- package/addon/components/device/manager.hbs +5 -6
- package/addon/components/device/manager.js +12 -15
- package/addon/components/driver/details.hbs +1 -1
- package/addon/components/fleet/vehicle-listing.js +1 -0
- package/addon/components/fuel-integration/form.hbs +200 -0
- package/addon/components/fuel-integration/form.js +242 -0
- package/addon/components/fuel-integration/hub.hbs +154 -0
- package/addon/components/fuel-integration/hub.js +165 -0
- package/addon/components/fuel-integration/matching-priority.hbs +76 -0
- package/addon/components/fuel-integration/matching-priority.js +145 -0
- package/addon/components/fuel-report/details.hbs +13 -1
- package/addon/components/issue/details.hbs +3 -57
- package/addon/components/issue/details.js +0 -96
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.hbs +201 -0
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.js +589 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +19 -233
- package/addon/components/layout/fleet-ops-sidebar.js +287 -376
- package/addon/components/maintenance-schedule/form.js +1 -0
- package/addon/components/map/drawer/device-event-listing.hbs +12 -2
- package/addon/components/map/drawer/driver-listing.hbs +14 -1
- package/addon/components/map/drawer/place-listing.hbs +14 -1
- package/addon/components/map/drawer/position-listing.hbs +12 -2
- package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
- package/addon/components/modals/assigned-orders.hbs +40 -0
- package/addon/components/modals/attach-device.hbs +4 -3
- package/addon/components/modals/attach-telematic-device.hbs +25 -0
- package/addon/components/modals/attach-telematic-device.js +3 -0
- package/addon/components/modals/driver-assign-order.hbs +7 -58
- package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
- package/addon/components/modals/fleet-assign-driver.hbs +18 -0
- package/addon/components/modals/fleet-assign-driver.js +3 -0
- package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
- package/addon/components/modals/fleet-assign-vehicle.js +3 -0
- package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
- package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
- package/addon/components/modals/vehicle-details.hbs +6 -1
- package/addon/components/modals/vehicle-form.hbs +8 -1
- package/addon/components/order/card.hbs +106 -0
- package/addon/components/order/card.js +257 -0
- package/addon/components/order/form/payload.js +3 -1
- package/addon/components/order/form/service-rate.hbs +2 -0
- package/addon/components/service-rate/form.hbs +3 -2
- package/addon/components/telematic/details.hbs +98 -87
- package/addon/components/telematic/details.js +230 -1
- package/addon/components/telematic/form.hbs +303 -72
- package/addon/components/telematic/form.js +519 -3
- package/addon/components/telematic/hub.hbs +149 -0
- package/addon/components/telematic/hub.js +142 -0
- package/addon/components/telematic/settings.hbs +152 -0
- package/addon/components/telematic/settings.js +45 -0
- package/addon/components/telematic/tab-empty-state.hbs +29 -0
- package/addon/components/telematic/tab-empty-state.js +33 -0
- package/addon/components/vehicle/details.hbs +6 -1
- package/addon/components/vehicle/form.hbs +2 -1
- package/addon/components/widget/fuel-providers.hbs +43 -0
- package/addon/components/widget/fuel-providers.js +27 -0
- package/addon/controllers/connectivity/devices/index/details.js +27 -1
- package/addon/controllers/connectivity/devices/index.js +18 -1
- package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
- package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
- package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
- package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
- package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
- package/addon/controllers/connectivity/telematics/details/events.js +244 -0
- package/addon/controllers/connectivity/telematics/details/index.js +3 -0
- package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
- package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
- package/addon/controllers/connectivity/telematics/details.js +149 -0
- package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
- package/addon/controllers/connectivity/telematics/index.js +25 -5
- package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
- package/addon/controllers/maintenance/index.js +100 -0
- package/addon/controllers/management/drivers/index/details.js +78 -1
- package/addon/controllers/management/drivers/index.js +39 -0
- package/addon/controllers/management/fleets/index/details.js +23 -1
- package/addon/controllers/management/fleets/index.js +6 -1
- package/addon/controllers/management/fuel-reports/index.js +37 -1
- package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
- package/addon/controllers/management/fuel-transactions/index.js +240 -0
- package/addon/controllers/management/index.js +88 -0
- package/addon/controllers/management/vehicles/index/details.js +32 -0
- package/addon/controllers/management/vehicles/index.js +26 -0
- package/addon/controllers/operations/orders/index.js +4 -0
- package/addon/controllers/settings/index.js +142 -0
- package/addon/controllers/settings/payments/index.js +5 -0
- package/addon/extension.js +31 -0
- package/addon/routes/analytics/index.js +3 -0
- package/addon/routes/connectivity/devices/index.js +3 -0
- package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
- package/addon/routes/connectivity/fuel-providers/details.js +18 -0
- package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
- package/addon/routes/connectivity/fuel-providers/index.js +20 -0
- package/addon/routes/connectivity/fuel-providers/new.js +3 -0
- package/addon/routes/connectivity/fuel-providers.js +3 -0
- package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
- package/addon/routes/connectivity/telematics/details/devices.js +30 -0
- package/addon/routes/connectivity/telematics/details/events.js +33 -0
- package/addon/routes/connectivity/telematics/details/index.js +3 -0
- package/addon/routes/connectivity/telematics/details/logs.js +17 -0
- package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
- package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
- package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
- package/addon/routes/connectivity/telematics/new.js +3 -0
- package/addon/routes/maintenance/index.js +3 -0
- package/addon/routes/maintenance/work-orders/index.js +2 -0
- package/addon/routes/management/drivers/index/details/activity.js +3 -0
- package/addon/routes/management/fuel-reports/index.js +2 -0
- package/addon/routes/management/fuel-transactions/index/details.js +18 -0
- package/addon/routes/management/fuel-transactions/index.js +21 -0
- package/addon/routes/management/fuel-transactions.js +3 -0
- package/addon/routes/settings/index.js +3 -0
- package/addon/routes.js +28 -9
- package/addon/services/device-actions.js +64 -1
- package/addon/services/device-event-actions.js +12 -1
- package/addon/services/driver-actions.js +147 -11
- package/addon/services/fleet-actions.js +66 -1
- package/addon/services/fuel-integration-actions.js +31 -0
- package/addon/services/issue-actions.js +1 -1
- package/addon/services/telematic-actions.js +9 -3
- package/addon/services/vehicle-actions.js +125 -0
- package/addon/styles/fleetops-engine.css +2237 -162
- package/addon/templates/analytics/index.hbs +14 -0
- package/addon/templates/analytics/reports/index.hbs +19 -1
- package/addon/templates/connectivity/devices/index.hbs +19 -1
- package/addon/templates/connectivity/events/index.hbs +16 -1
- package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
- package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
- package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
- package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
- package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
- package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
- package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
- package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
- package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
- package/addon/templates/connectivity/fuel-providers.hbs +1 -0
- package/addon/templates/connectivity/sensors/index.hbs +19 -1
- package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
- package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
- package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
- package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
- package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
- package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
- package/addon/templates/connectivity/telematics/details.hbs +53 -0
- package/addon/templates/connectivity/telematics/edit.hbs +27 -0
- package/addon/templates/connectivity/telematics/index.hbs +6 -8
- package/addon/templates/connectivity/telematics/new.hbs +24 -0
- package/addon/templates/maintenance/equipment/index.hbs +19 -1
- package/addon/templates/maintenance/index.hbs +113 -0
- package/addon/templates/maintenance/maintenances/index.hbs +15 -1
- package/addon/templates/maintenance/parts/index.hbs +19 -1
- package/addon/templates/maintenance/schedules/index.hbs +19 -1
- package/addon/templates/maintenance/work-orders/index.hbs +19 -1
- package/addon/templates/management/contacts/customers.hbs +15 -1
- package/addon/templates/management/contacts/index.hbs +19 -1
- package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
- package/addon/templates/management/drivers/index.hbs +19 -1
- package/addon/templates/management/fleets/index.hbs +19 -1
- package/addon/templates/management/fuel-reports/index.hbs +19 -1
- package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
- package/addon/templates/management/fuel-transactions/index.hbs +58 -0
- package/addon/templates/management/fuel-transactions.hbs +1 -0
- package/addon/templates/management/index.hbs +109 -73
- package/addon/templates/management/issues/index.hbs +19 -1
- package/addon/templates/management/places/index.hbs +19 -1
- package/addon/templates/management/vehicles/index.hbs +19 -1
- package/addon/templates/management/vendors/index.hbs +19 -1
- package/addon/templates/management/vendors/integrated.hbs +13 -1
- package/addon/templates/operations/orders/index.hbs +19 -1
- package/addon/templates/operations/service-rates/index.hbs +19 -1
- package/addon/templates/settings/index.hbs +83 -0
- package/addon/templates/settings/payments/index.hbs +15 -1
- package/addon/templates/settings/routing.hbs +2 -2
- package/addon/utils/fleet-ops-options.js +3 -0
- package/app/components/cell/telematic-provider.js +1 -0
- package/app/components/cell/telematic-status.js +1 -0
- package/app/components/fuel-integration/form.js +1 -0
- package/app/components/fuel-integration/hub.js +1 -0
- package/app/components/fuel-integration/matching-priority.js +1 -0
- package/app/components/modals/assigned-orders.js +1 -0
- package/app/components/modals/attach-telematic-device.js +1 -0
- package/app/components/modals/fleet-assign-driver.js +1 -0
- package/app/components/modals/fleet-assign-vehicle.js +1 -0
- package/app/components/modals/telematic-connection-diagnostics.js +1 -0
- package/app/components/order/card.js +1 -0
- package/app/components/telematic/hub.js +1 -0
- package/app/components/telematic/settings.js +1 -0
- package/app/components/telematic/tab-empty-state.js +1 -0
- package/app/components/widget/fuel-providers.js +1 -0
- package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
- package/app/controllers/connectivity/telematics/details/devices.js +1 -0
- package/app/controllers/connectivity/telematics/details/events.js +1 -0
- package/app/controllers/connectivity/telematics/details/index.js +1 -0
- package/app/controllers/connectivity/telematics/details/logs.js +1 -0
- package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
- package/app/controllers/connectivity/telematics/details.js +1 -0
- package/app/controllers/connectivity/telematics/edit.js +1 -0
- package/app/controllers/connectivity/telematics/new.js +1 -0
- package/app/controllers/maintenance/index.js +1 -0
- package/app/controllers/management/fuel-transactions/index/details.js +1 -0
- package/app/controllers/management/fuel-transactions/index.js +1 -0
- package/app/controllers/management/index.js +1 -0
- package/app/controllers/settings/index.js +1 -0
- package/app/routes/analytics/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/routes/connectivity/fuel-providers/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/routes/connectivity/fuel-providers.js +1 -0
- package/app/routes/connectivity/telematics/details/attachments.js +1 -0
- package/app/routes/connectivity/telematics/details/devices.js +1 -0
- package/app/routes/connectivity/telematics/details/events.js +1 -0
- package/app/routes/connectivity/telematics/details/index.js +1 -0
- package/app/routes/connectivity/telematics/details/logs.js +1 -0
- package/app/routes/connectivity/telematics/details/sensors.js +1 -0
- package/app/routes/connectivity/telematics/details.js +1 -0
- package/app/routes/connectivity/telematics/edit.js +1 -0
- package/app/routes/connectivity/telematics/new.js +1 -0
- package/app/routes/maintenance/index.js +1 -0
- package/app/routes/management/drivers/index/details/activity.js +1 -0
- package/app/routes/management/fuel-transactions/index/details.js +1 -0
- package/app/routes/management/fuel-transactions/index.js +1 -0
- package/app/routes/management/fuel-transactions.js +1 -0
- package/app/routes/settings/index.js +1 -0
- package/app/services/fuel-integration-actions.js +1 -0
- package/app/templates/analytics/index.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/templates/connectivity/fuel-providers/index.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/templates/connectivity/fuel-providers.js +1 -0
- package/app/templates/connectivity/telematics/details/attachments.js +1 -0
- package/app/templates/connectivity/telematics/details/devices.js +1 -0
- package/app/templates/connectivity/telematics/details/events.js +1 -0
- package/app/templates/connectivity/telematics/details/index.js +1 -0
- package/app/templates/connectivity/telematics/details/logs.js +1 -0
- package/app/templates/connectivity/telematics/details/sensors.js +1 -0
- package/app/templates/connectivity/telematics/details.js +1 -0
- package/app/templates/connectivity/telematics/edit.js +1 -0
- package/app/templates/connectivity/telematics/new.js +1 -0
- package/app/templates/maintenance/index.js +1 -0
- package/app/templates/management/drivers/index/details/activity.js +1 -0
- package/app/templates/management/fuel-transactions/index/details.js +1 -0
- package/app/templates/management/fuel-transactions/index.js +1 -0
- package/app/templates/management/fuel-transactions.js +1 -0
- package/app/templates/management/index.js +1 -0
- package/app/templates/settings/index.js +1 -0
- package/assets/images/telematics/providers/afaqy.webp +0 -0
- package/assets/images/telematics/providers/default.webp +0 -0
- package/assets/images/telematics/providers/flespi.webp +0 -0
- package/assets/images/telematics/providers/geotab.webp +0 -0
- package/assets/images/telematics/providers/safee.webp +0 -0
- package/assets/images/telematics/providers/samsara.webp +0 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/config/fuel-providers.php +42 -0
- package/server/config/telematics.php +139 -130
- package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
- package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
- package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
- package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
- package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
- package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
- package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php +30 -0
- package/server/src/Console/Commands/FixInvalidPolymorphicRelationTypeNamespaces.php +1 -0
- package/server/src/Contracts/FuelProvider.php +30 -0
- package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
- package/server/src/Events/FuelProviderTransactionImported.php +17 -0
- package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
- package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
- package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +140 -2
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
- package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
- package/server/src/Http/Controllers/Internal/v1/HubController.php +300 -0
- package/server/src/Http/Controllers/Internal/v1/SearchController.php +506 -0
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +179 -16
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +249 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
- package/server/src/Http/Filter/DeviceFilter.php +74 -0
- package/server/src/Http/Filter/DriverFilter.php +6 -0
- package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
- package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
- package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
- package/server/src/Http/Filter/FuelReportFilter.php +10 -0
- package/server/src/Http/Filter/VehicleFilter.php +6 -0
- package/server/src/Http/Resources/v1/Driver.php +15 -0
- package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
- package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
- package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
- package/server/src/Http/Resources/v1/FuelReport.php +28 -22
- package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
- package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
- package/server/src/Http/Resources/v1/Vehicle.php +17 -0
- package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
- package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +105 -17
- package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
- package/server/src/Models/Asset.php +2 -1
- package/server/src/Models/Contact.php +2 -1
- package/server/src/Models/Device.php +27 -4
- package/server/src/Models/DeviceEvent.php +40 -3
- package/server/src/Models/Driver.php +3 -2
- package/server/src/Models/Equipment.php +2 -1
- package/server/src/Models/Fleet.php +2 -1
- package/server/src/Models/FuelProviderConnection.php +60 -0
- package/server/src/Models/FuelProviderSyncRun.php +58 -0
- package/server/src/Models/FuelProviderTransaction.php +119 -0
- package/server/src/Models/FuelReport.php +16 -1
- package/server/src/Models/Part.php +2 -1
- package/server/src/Models/Sensor.php +21 -4
- package/server/src/Models/ServiceRate.php +39 -2
- package/server/src/Models/Vehicle.php +14 -2
- package/server/src/Models/Vendor.php +2 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +20 -0
- package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
- package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
- package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
- package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
- package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
- package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
- package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +105 -38
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
- package/server/src/Support/Telematics/TelematicService.php +340 -21
- package/server/src/routes.php +50 -4
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/HubRoutesTest.php +62 -0
- package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
- package/server/tests/TelematicsHardeningTest.php +359 -0
- package/server/tests/VehicleDriverAssignmentTest.php +51 -0
- package/translations/ar-ae.yml +23 -1
- package/translations/bg-bg.yaml +72 -0
- package/translations/en-us.yaml +83 -0
- package/translations/es-pa.yaml +72 -0
- package/translations/fr-fr.yaml +72 -0
- package/translations/mn-mn.yaml +72 -0
- package/translations/pt-br.yaml +72 -0
- package/translations/ru-ru.yaml +72 -0
- package/translations/vi-vn.yaml +98 -1
- package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details.js +0 -24
- package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/routes/connectivity/telematics/index/new.js +0 -3
- package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
- package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
- package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
- package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
- package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<div class="flex flex-col gap-4 p-4 md:p-6">
|
|
2
|
+
<div class="flex flex-col gap-1">
|
|
3
|
+
<h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Event Review + Triage</h2>
|
|
4
|
+
<p class="text-sm text-gray-500 dark:text-gray-300">Review provider events, warning signals, and unprocessed telemetry for this connection.</p>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
|
8
|
+
{{#each this.metrics as |metric|}}
|
|
9
|
+
<div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
|
|
10
|
+
<div class="flex h-full items-start justify-between gap-3 p-3">
|
|
11
|
+
<div class="min-w-0">
|
|
12
|
+
<div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
|
|
13
|
+
<div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
|
|
16
|
+
<FaIcon @icon={{metric.icon}} />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
{{/each}}
|
|
21
|
+
</section>
|
|
22
|
+
|
|
23
|
+
<section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
24
|
+
<div class="fleetops-provider-connections-header border-b border-gray-200 px-4 py-3 dark:border-gray-700">
|
|
25
|
+
<div>
|
|
26
|
+
<h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Telemetry Events</h3>
|
|
27
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Filter events by severity, device, type, and processed state before opening details.</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="fleetops-provider-connections-actions flex min-w-0 flex-wrap items-center gap-2 lg:ml-auto lg:flex-nowrap lg:justify-end">
|
|
30
|
+
<Layout::Resource::TabularActions
|
|
31
|
+
@title="Telemetry Events"
|
|
32
|
+
@searchQuery={{this.query}}
|
|
33
|
+
@onSearch={{perform this.deviceEventActions.controllerSearchTask this}}
|
|
34
|
+
@columns={{this.columns}}
|
|
35
|
+
@page={{this.page}}
|
|
36
|
+
@onPageChange={{fn (mut this.page)}}
|
|
37
|
+
@actionButtons={{this.actionButtons}}
|
|
38
|
+
@bulkActions={{this.bulkActions}}
|
|
39
|
+
@controller={{this}}
|
|
40
|
+
@searchInputClass="fleetops-provider-connections-search"
|
|
41
|
+
@filterPickerButtonClass="fleetops-provider-connections-action-button"
|
|
42
|
+
@columnPickerButtonClass="fleetops-provider-connections-action-button"
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
{{#if this.emptyStateContent}}
|
|
48
|
+
<div class="p-4">
|
|
49
|
+
<Telematic::TabEmptyState
|
|
50
|
+
@tone={{this.emptyStateContent.tone}}
|
|
51
|
+
@icon={{this.emptyStateContent.icon}}
|
|
52
|
+
@title={{this.emptyStateContent.title}}
|
|
53
|
+
@message={{this.emptyStateContent.message}}
|
|
54
|
+
@note={{this.emptyStateContent.note}}
|
|
55
|
+
@primaryText={{this.emptyStateContent.primaryText}}
|
|
56
|
+
@primaryIcon={{this.emptyStateContent.primaryIcon}}
|
|
57
|
+
@primaryAction={{this.emptyStateContent.primaryAction}}
|
|
58
|
+
@secondaryText={{this.emptyStateContent.secondaryText}}
|
|
59
|
+
@secondaryIcon={{this.emptyStateContent.secondaryIcon}}
|
|
60
|
+
@secondaryAction={{this.emptyStateContent.secondaryAction}}
|
|
61
|
+
/>
|
|
62
|
+
</div>
|
|
63
|
+
{{else}}
|
|
64
|
+
{{#if this.hasHealthyEventState}}
|
|
65
|
+
<div class="p-4 pb-0">
|
|
66
|
+
<Telematic::TabEmptyState
|
|
67
|
+
@tone="success"
|
|
68
|
+
@icon="check"
|
|
69
|
+
@title="No warning or unprocessed events"
|
|
70
|
+
@message="Recent telemetry is reviewed and no warning-level events are currently visible in this connection."
|
|
71
|
+
@primaryText="Refresh"
|
|
72
|
+
@primaryIcon="refresh"
|
|
73
|
+
@primaryAction={{this.refresh}}
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
{{/if}}
|
|
77
|
+
<Layout::Resource::Tabular
|
|
78
|
+
@resource="device-event"
|
|
79
|
+
@title="Telemetry Events"
|
|
80
|
+
@data={{@model}}
|
|
81
|
+
@columns={{this.columns}}
|
|
82
|
+
@page={{this.page}}
|
|
83
|
+
@onPageChange={{fn (mut this.page)}}
|
|
84
|
+
@controller={{this}}
|
|
85
|
+
@withoutHeader={{true}}
|
|
86
|
+
@emptyStateComponent={{component
|
|
87
|
+
"table/empty-state"
|
|
88
|
+
variant="compact"
|
|
89
|
+
icon="bolt"
|
|
90
|
+
title="No telemetry events"
|
|
91
|
+
description="Events appear after synced devices report provider activity."
|
|
92
|
+
filteredTitle="No events match your filters"
|
|
93
|
+
filteredDescription="Adjust the search, severity, or date filters to review other events."
|
|
94
|
+
primaryText="Refresh"
|
|
95
|
+
primaryIcon="refresh"
|
|
96
|
+
primaryAction=this.refresh
|
|
97
|
+
}}
|
|
98
|
+
/>
|
|
99
|
+
{{/if}}
|
|
100
|
+
</section>
|
|
101
|
+
</div>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<div class="flex flex-col gap-4 p-4 md:p-6">
|
|
2
|
+
<div class="flex flex-col gap-1 md:flex-row md:items-start md:justify-between">
|
|
3
|
+
<div>
|
|
4
|
+
<h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Connection Logs</h2>
|
|
5
|
+
<p class="text-sm text-gray-500 dark:text-gray-300">Review connection tests, device sync outcomes, and saved audit activity for this provider connection.</p>
|
|
6
|
+
</div>
|
|
7
|
+
<Button @icon="refresh" @text="Refresh" @size="xs" @onClick={{this.refresh}} />
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
|
11
|
+
{{#each this.metrics as |metric|}}
|
|
12
|
+
<div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
|
|
13
|
+
<div class="flex h-full items-start justify-between gap-3 p-3">
|
|
14
|
+
<div class="min-w-0">
|
|
15
|
+
<div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
|
|
16
|
+
<div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
|
|
19
|
+
<FaIcon @icon={{metric.icon}} />
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{{/each}}
|
|
24
|
+
</section>
|
|
25
|
+
|
|
26
|
+
<section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
27
|
+
<div class="border-b border-gray-200 px-4 py-3 dark:border-gray-700">
|
|
28
|
+
<h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Saved Activity</h3>
|
|
29
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Operational server logs are not shown here; this view only includes persisted audit and sync/test summary data.</p>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
{{#if this.hasLogs}}
|
|
33
|
+
<div class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
34
|
+
{{#each this.logs as |log|}}
|
|
35
|
+
<article class="flex flex-col gap-3 px-4 py-3 md:flex-row md:items-start md:justify-between">
|
|
36
|
+
<div class="flex min-w-0 items-start gap-3">
|
|
37
|
+
<div class="mt-0.5 flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-gray-100 text-gray-600 dark:bg-gray-900 dark:text-gray-300">
|
|
38
|
+
<FaIcon @icon={{or log.icon "circle-info"}} />
|
|
39
|
+
</div>
|
|
40
|
+
<div class="min-w-0">
|
|
41
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
42
|
+
<h4 class="text-sm font-bold text-gray-900 dark:text-gray-100">{{log.label}}</h4>
|
|
43
|
+
<Badge @status={{or log.status "default"}} @hideStatusDot={{true}}>{{or log.status "log"}}</Badge>
|
|
44
|
+
</div>
|
|
45
|
+
<p class="mt-1 text-sm leading-5 text-gray-500 dark:text-gray-300">{{log.description}}</p>
|
|
46
|
+
{{#if log.metadata.job_id}}
|
|
47
|
+
<div class="mt-2 font-mono text-[11px] text-gray-400 dark:text-gray-500">Job {{log.metadata.job_id}}</div>
|
|
48
|
+
{{/if}}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<time class="flex-shrink-0 text-xs text-gray-400 dark:text-gray-500">{{n-a (format-date-fns log.created_at "dd MMM yyyy, HH:mm")}}</time>
|
|
52
|
+
</article>
|
|
53
|
+
{{/each}}
|
|
54
|
+
</div>
|
|
55
|
+
{{else}}
|
|
56
|
+
<div class="p-4">
|
|
57
|
+
<Telematic::TabEmptyState
|
|
58
|
+
@tone="info"
|
|
59
|
+
@icon="list"
|
|
60
|
+
@title="No saved logs yet"
|
|
61
|
+
@message="Run a connection test or sync devices to create persisted log entries for this provider connection."
|
|
62
|
+
@primaryText="Refresh"
|
|
63
|
+
@primaryIcon="refresh"
|
|
64
|
+
@primaryAction={{this.refresh}}
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
{{/if}}
|
|
68
|
+
</section>
|
|
69
|
+
</div>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<div class="flex flex-col gap-4 p-4 md:p-6">
|
|
2
|
+
<div class="flex flex-col gap-1">
|
|
3
|
+
<h2 class="text-base font-bold text-gray-900 dark:text-gray-100">Sensor Inventory + Health</h2>
|
|
4
|
+
<p class="text-sm text-gray-500 dark:text-gray-300">Review sensor readings discovered from synced devices and identify sensors that are not reporting.</p>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<section class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
|
8
|
+
{{#each this.metrics as |metric|}}
|
|
9
|
+
<div class="fleet-ops-widget fleet-ops-kpi-tile fleetops-connectivity-kpi-tile {{metric.accentClass}} relative min-h-[102px] overflow-hidden rounded-md border bg-white shadow-sm dark:bg-gray-800">
|
|
10
|
+
<div class="flex h-full items-start justify-between gap-3 p-3">
|
|
11
|
+
<div class="min-w-0">
|
|
12
|
+
<div class="truncate text-[10px] font-bold uppercase text-gray-500 dark:text-gray-400">{{metric.label}}</div>
|
|
13
|
+
<div class="mt-2 text-2xl font-extrabold leading-none text-gray-900 dark:text-gray-50">{{metric.value}}</div>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="fleetops-connectivity-kpi-icon flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-[13px]">
|
|
16
|
+
<FaIcon @icon={{metric.icon}} />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
{{/each}}
|
|
21
|
+
</section>
|
|
22
|
+
|
|
23
|
+
<section class="overflow-hidden rounded-md border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
24
|
+
<div class="fleetops-provider-connections-header border-b border-gray-200 px-4 py-3 dark:border-gray-700">
|
|
25
|
+
<div>
|
|
26
|
+
<h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Sensor Readings</h3>
|
|
27
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Filter by type, device, and reporting status to understand what telemetry this connection is producing.</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="fleetops-provider-connections-actions flex min-w-0 flex-wrap items-center gap-2 lg:ml-auto lg:flex-nowrap lg:justify-end">
|
|
30
|
+
<Layout::Resource::TabularActions
|
|
31
|
+
@title="Sensor Readings"
|
|
32
|
+
@searchQuery={{this.query}}
|
|
33
|
+
@onSearch={{perform this.sensorActions.controllerSearchTask this}}
|
|
34
|
+
@columns={{this.columns}}
|
|
35
|
+
@page={{this.page}}
|
|
36
|
+
@onPageChange={{fn (mut this.page)}}
|
|
37
|
+
@actionButtons={{this.actionButtons}}
|
|
38
|
+
@bulkActions={{this.bulkActions}}
|
|
39
|
+
@controller={{this}}
|
|
40
|
+
@searchInputClass="fleetops-provider-connections-search"
|
|
41
|
+
@filterPickerButtonClass="fleetops-provider-connections-action-button"
|
|
42
|
+
@columnPickerButtonClass="fleetops-provider-connections-action-button"
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
{{#if this.emptyStateContent}}
|
|
48
|
+
<div class="p-4">
|
|
49
|
+
<Telematic::TabEmptyState
|
|
50
|
+
@tone={{this.emptyStateContent.tone}}
|
|
51
|
+
@icon={{this.emptyStateContent.icon}}
|
|
52
|
+
@title={{this.emptyStateContent.title}}
|
|
53
|
+
@message={{this.emptyStateContent.message}}
|
|
54
|
+
@note={{this.emptyStateContent.note}}
|
|
55
|
+
@primaryText={{this.emptyStateContent.primaryText}}
|
|
56
|
+
@primaryIcon={{this.emptyStateContent.primaryIcon}}
|
|
57
|
+
@primaryAction={{this.emptyStateContent.primaryAction}}
|
|
58
|
+
@secondaryText={{this.emptyStateContent.secondaryText}}
|
|
59
|
+
@secondaryIcon={{this.emptyStateContent.secondaryIcon}}
|
|
60
|
+
@secondaryAction={{this.emptyStateContent.secondaryAction}}
|
|
61
|
+
/>
|
|
62
|
+
</div>
|
|
63
|
+
{{else}}
|
|
64
|
+
<Layout::Resource::Tabular
|
|
65
|
+
@resource="sensor"
|
|
66
|
+
@title="Sensor Readings"
|
|
67
|
+
@data={{@model}}
|
|
68
|
+
@columns={{this.columns}}
|
|
69
|
+
@page={{this.page}}
|
|
70
|
+
@onPageChange={{fn (mut this.page)}}
|
|
71
|
+
@controller={{this}}
|
|
72
|
+
@withoutHeader={{true}}
|
|
73
|
+
@emptyStateComponent={{component
|
|
74
|
+
"table/empty-state"
|
|
75
|
+
variant="compact"
|
|
76
|
+
icon="satellite-dish"
|
|
77
|
+
title="No sensor readings"
|
|
78
|
+
description="Sensor readings appear after devices sync telemetry from this provider."
|
|
79
|
+
filteredTitle="No readings match your filters"
|
|
80
|
+
filteredDescription="Adjust the search or filters to find other sensor readings."
|
|
81
|
+
primaryText="Refresh"
|
|
82
|
+
primaryIcon="refresh"
|
|
83
|
+
primaryAction=this.refresh
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
{{/if}}
|
|
87
|
+
</section>
|
|
88
|
+
</div>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<div class="h-full overflow-y-auto bg-gray-50 dark:bg-gray-900">
|
|
2
|
+
<div class="flex w-full flex-col">
|
|
3
|
+
<section class="sticky top-0 z-50 bg-white pt-4 shadow-sm dark:bg-gray-900">
|
|
4
|
+
<div class="mx-auto flex w-full max-w-7xl flex-col gap-4 px-4 lg:flex-row lg:items-start lg:justify-between md:px-6">
|
|
5
|
+
<div class="flex min-w-0 items-start gap-3">
|
|
6
|
+
<Image src={{@model.provider_descriptor.icon}} class="mt-1 h-10 w-10 rounded" />
|
|
7
|
+
<div class="min-w-0">
|
|
8
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
9
|
+
<h1 class="truncate text-lg font-bold text-gray-900 dark:text-gray-100">{{or @model.name @model.provider_descriptor.label @model.provider}}</h1>
|
|
10
|
+
<Badge @status={{this.healthStatus}} @hideStatusDot={{true}}>{{this.statusLabel}}</Badge>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="mt-1 text-sm text-gray-500 dark:text-gray-300">
|
|
13
|
+
{{@model.provider_descriptor.label}}
|
|
14
|
+
{{#if @model.public_id}}
|
|
15
|
+
<span class="mx-1 text-gray-300 dark:text-gray-600">/</span>
|
|
16
|
+
<span class="font-mono text-xs">{{@model.public_id}}</span>
|
|
17
|
+
{{/if}}
|
|
18
|
+
</div>
|
|
19
|
+
<div class="mt-2 flex flex-wrap gap-2 text-xs text-gray-500 dark:text-gray-300">
|
|
20
|
+
<span>Connection test: {{this.connectionTestLabel}}</span>
|
|
21
|
+
<span>Last test: {{n-a (format-date-fns @model.meta.last_connection_test "dd MMM HH:mm")}}</span>
|
|
22
|
+
<span>Last sync: {{n-a (format-date-fns this.lastSyncAt "dd MMM HH:mm")}}</span>
|
|
23
|
+
<span>Devices: {{n-a @model.meta.last_sync_total}}</span>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="flex flex-shrink-0 flex-nowrap items-center gap-2 whitespace-nowrap">
|
|
29
|
+
<Button @icon="arrow-left" @text="Back" @size="xs" @onClick={{transition-to "connectivity.telematics.index"}} />
|
|
30
|
+
<Button @icon="plug" @text="Test" @size="xs" @onClick={{this.openConnectionTestDialog}} />
|
|
31
|
+
<Button @icon="satellite-dish" @text="Sync Devices" @type="primary" @size="xs" @isLoading={{this.discoverDevices.isRunning}} @onClick={{perform this.discoverDevices}} />
|
|
32
|
+
<Button @icon="cog" @text="Settings" @size="xs" @onClick={{transition-to "connectivity.telematics.edit" @model}} />
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<nav class="mt-4 flex w-full gap-1 overflow-x-auto border-b border-gray-200 text-sm dark:border-gray-700" aria-label="Telematic connection sections">
|
|
37
|
+
{{#each this.tabs as |tab|}}
|
|
38
|
+
<LinkTo
|
|
39
|
+
@route={{tab.route}}
|
|
40
|
+
class="inline-flex flex-shrink-0 items-center border-b-2 px-3 py-3 font-medium
|
|
41
|
+
{{if tab.active 'border-blue-500 text-gray-900 dark:text-white' 'border-transparent text-gray-500 hover:border-blue-400 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white'}}"
|
|
42
|
+
>
|
|
43
|
+
{{tab.label}}
|
|
44
|
+
</LinkTo>
|
|
45
|
+
{{/each}}
|
|
46
|
+
</nav>
|
|
47
|
+
</section>
|
|
48
|
+
|
|
49
|
+
<section class="min-w-0">
|
|
50
|
+
{{outlet}}
|
|
51
|
+
</section>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<div class="flex h-full flex-col bg-gray-50 dark:bg-gray-900">
|
|
2
|
+
<section class="flex-shrink-0 border-b border-gray-200 bg-white px-4 py-4 shadow-sm dark:border-gray-700 dark:bg-gray-900 dark:shadow-sm dark:shadow-black/30 md:px-6">
|
|
3
|
+
<div class="mx-auto flex w-full max-w-6xl flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
4
|
+
<div class="min-w-0">
|
|
5
|
+
<div class="text-xs font-semibold uppercase text-gray-400 dark:text-gray-500">Connection settings</div>
|
|
6
|
+
<h1 class="truncate text-lg font-bold text-gray-900 dark:text-gray-100">Edit {{or @model.name @model.provider}}</h1>
|
|
7
|
+
<p class="mt-1 text-sm text-gray-500 dark:text-gray-300">Update credentials, webhook configuration, and hardware identity for this provider connection.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="flex items-center gap-2">
|
|
10
|
+
<Button @icon="plug" @text="Test" @size="sm" @onClick={{this.openConnectionTestDialog}} />
|
|
11
|
+
<Button @icon="eye" @text="View" @size="sm" @onClick={{this.view}} />
|
|
12
|
+
<Button @icon="times" @text="Cancel" @size="sm" @onClick={{this.cancel}} />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|
|
16
|
+
|
|
17
|
+
<Telematic::Settings
|
|
18
|
+
@resource={{@model}}
|
|
19
|
+
@controller={{this}}
|
|
20
|
+
@saveLabel="Save Changes"
|
|
21
|
+
@savingLabel="Saving changes"
|
|
22
|
+
@footerHelp="Changes affect provider sync, webhook ingestion, and device discovery."
|
|
23
|
+
@isSaving={{this.save.isRunning}}
|
|
24
|
+
@onCancel={{this.cancel}}
|
|
25
|
+
@onSave={{perform this.save @model}}
|
|
26
|
+
/>
|
|
27
|
+
</div>
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
<
|
|
2
|
-
@
|
|
3
|
-
@
|
|
4
|
-
@
|
|
5
|
-
@onSearch={{perform this.telematicActions.controllerSearchTask this}}
|
|
6
|
-
@data={{@model}}
|
|
1
|
+
<Telematic::Hub
|
|
2
|
+
@integrations={{@model}}
|
|
3
|
+
@providers={{this.providers}}
|
|
4
|
+
@providersLoading={{this.loadProviders.isRunning}}
|
|
7
5
|
@columns={{this.columns}}
|
|
8
6
|
@page={{this.page}}
|
|
9
7
|
@onPageChange={{fn (mut this.page)}}
|
|
10
|
-
@actionButtons={{this.actionButtons}}
|
|
11
8
|
@bulkActions={{this.bulkActions}}
|
|
12
9
|
@controller={{this}}
|
|
10
|
+
@searchQuery={{this.query}}
|
|
11
|
+
@onSearch={{perform this.telematicActions.controllerSearchTask this}}
|
|
13
12
|
/>
|
|
14
|
-
{{outlet}}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<div class="flex h-full flex-col bg-gray-50 dark:bg-gray-900">
|
|
2
|
+
<section class="flex-shrink-0 border-b border-gray-200 bg-white px-4 py-4 shadow-sm dark:border-gray-700 dark:bg-gray-900 dark:shadow-sm dark:shadow-black/30 md:px-6">
|
|
3
|
+
<div class="mx-auto flex w-full max-w-6xl flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
4
|
+
<div>
|
|
5
|
+
<div class="text-xs font-semibold uppercase text-gray-400 dark:text-gray-500">Connectivity setup</div>
|
|
6
|
+
<h1 class="text-lg font-bold text-gray-900 dark:text-gray-100">Connect Provider</h1>
|
|
7
|
+
<p class="mt-1 text-sm text-gray-500 dark:text-gray-300">Create a provider connection, test credentials, and prepare device sync.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<Button @icon="times" @text="Cancel" @size="sm" @onClick={{transition-to "connectivity.telematics.index"}} />
|
|
10
|
+
</div>
|
|
11
|
+
</section>
|
|
12
|
+
|
|
13
|
+
<Telematic::Form
|
|
14
|
+
@resource={{this.telematic}}
|
|
15
|
+
@controller={{this}}
|
|
16
|
+
@initialProviderKey={{this.setupProvider}}
|
|
17
|
+
@saveLabel="Create Connection"
|
|
18
|
+
@savingLabel="Creating connection"
|
|
19
|
+
@footerHelp="Save the connection, then open it to sync devices and attach them to vehicles."
|
|
20
|
+
@isSaving={{this.save.isRunning}}
|
|
21
|
+
@onCancel={{this.cancel}}
|
|
22
|
+
@onSave={{perform this.save this.telematic}}
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
@@ -12,6 +12,24 @@
|
|
|
12
12
|
@actionButtons={{this.actionButtons}}
|
|
13
13
|
@bulkActions={{this.bulkActions}}
|
|
14
14
|
@controller={{this}}
|
|
15
|
+
@emptyStateComponent={{component
|
|
16
|
+
"table/empty-state"
|
|
17
|
+
icon="toolbox"
|
|
18
|
+
title="Add your first equipment item"
|
|
19
|
+
description="Equipment records help track assigned assets, condition, service history, and operational readiness."
|
|
20
|
+
filteredTitle="No equipment matches your filters"
|
|
21
|
+
filteredDescription="Adjust the search or filters to find another equipment item."
|
|
22
|
+
primaryText="New equipment"
|
|
23
|
+
primaryIcon="plus"
|
|
24
|
+
primaryAction=this.equipmentActions.transition.create
|
|
25
|
+
secondaryText="Import"
|
|
26
|
+
secondaryIcon="upload"
|
|
27
|
+
secondaryAction=this.equipmentActions.import
|
|
28
|
+
docsSlug="fleet-ops/maintenance/equipment/overview"
|
|
29
|
+
docsTitle="Equipment guide"
|
|
30
|
+
docsText="Equipment guide"
|
|
31
|
+
docsSource="fleet-ops-empty-equipment"
|
|
32
|
+
}}
|
|
15
33
|
/>
|
|
16
34
|
{{else}}
|
|
17
35
|
<Layout::Section::Header @title={{t "resource.equipment"}} @actionsWrapperClass="space-x-1">
|
|
@@ -46,4 +64,4 @@
|
|
|
46
64
|
</Layout::Resource::CardsGrid>
|
|
47
65
|
</Layout::Section::Body>
|
|
48
66
|
{{/if}}
|
|
49
|
-
{{outlet}}
|
|
67
|
+
{{outlet}}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<div class="fleet-ops-control-hub" data-test-fleet-ops-maintenance-hub>
|
|
2
|
+
<section class="fleet-ops-control-hub-header">
|
|
3
|
+
<div class="fleet-ops-control-hub-header-copy">
|
|
4
|
+
<div class="fleet-ops-control-hub-eyebrow">Maintenance</div>
|
|
5
|
+
<h1 class="fleet-ops-control-hub-title">Maintenance Hub</h1>
|
|
6
|
+
<p class="fleet-ops-control-hub-subtitle">Plan recurring service, coordinate work orders, and keep assets ready for daily operations.</p>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="fleet-ops-control-hub-header-actions">
|
|
9
|
+
<Button @icon="refresh" @size="sm" @helpText={{t "common.reload"}} @onClick={{perform this.loadHub}} />
|
|
10
|
+
</div>
|
|
11
|
+
</section>
|
|
12
|
+
|
|
13
|
+
<div class="fleet-ops-control-hub-body">
|
|
14
|
+
<section class="fleet-ops-control-hub-kpis">
|
|
15
|
+
{{#each this.kpis as |kpi|}}
|
|
16
|
+
<LinkTo @route={{kpi.route}} class="fleet-ops-control-hub-kpi fleet-ops-control-hub-tone-{{kpi.tone}}" data-test-fleet-ops-maintenance-kpi={{kpi.key}}>
|
|
17
|
+
<div class="fleet-ops-control-hub-kpi-copy">
|
|
18
|
+
<div class="fleet-ops-control-hub-kpi-label">{{kpi.label}}</div>
|
|
19
|
+
<div class="fleet-ops-control-hub-kpi-value">{{kpi.value}}</div>
|
|
20
|
+
<div class="fleet-ops-control-hub-kpi-caption">{{kpi.caption}}</div>
|
|
21
|
+
<div class="fleet-ops-control-hub-kpi-action">
|
|
22
|
+
<span>Open {{kpi.label}}</span>
|
|
23
|
+
<FaIcon @icon="arrow-right" />
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="fleet-ops-control-hub-kpi-icon"><FaIcon @icon={{kpi.icon}} /></div>
|
|
27
|
+
</LinkTo>
|
|
28
|
+
{{/each}}
|
|
29
|
+
</section>
|
|
30
|
+
|
|
31
|
+
<section class="fleet-ops-control-hub-grid">
|
|
32
|
+
<div class="fleet-ops-control-hub-main">
|
|
33
|
+
{{#each this.sections as |section|}}
|
|
34
|
+
<div class="fleet-ops-control-hub-panel" data-test-fleet-ops-maintenance-section={{section.key}}>
|
|
35
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
36
|
+
<div>
|
|
37
|
+
<h2>{{section.title}}</h2>
|
|
38
|
+
<p>{{section.description}}</p>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="fleet-ops-control-hub-link-grid">
|
|
43
|
+
{{#each section.links as |link|}}
|
|
44
|
+
<LinkTo @route={{link.route}} class="fleet-ops-control-hub-link" data-test-fleet-ops-hub-card={{link.label}}>
|
|
45
|
+
<span class="fleet-ops-control-hub-link-icon"><FaIcon @icon={{link.icon}} /></span>
|
|
46
|
+
<span class="fleet-ops-control-hub-link-copy">
|
|
47
|
+
<span class="fleet-ops-control-hub-link-title">{{link.label}}</span>
|
|
48
|
+
<span class="fleet-ops-control-hub-link-description">{{link.description}}</span>
|
|
49
|
+
</span>
|
|
50
|
+
<span class="fleet-ops-control-hub-link-count">{{link.count}}</span>
|
|
51
|
+
</LinkTo>
|
|
52
|
+
{{/each}}
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
{{/each}}
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<aside class="fleet-ops-control-hub-side">
|
|
59
|
+
<div class="fleet-ops-control-hub-panel">
|
|
60
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
61
|
+
<div>
|
|
62
|
+
<h2>Action Queue</h2>
|
|
63
|
+
<p>Signals from schedules, work orders, parts, and equipment.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="fleet-ops-control-hub-action-list">
|
|
68
|
+
{{#each this.actions as |action|}}
|
|
69
|
+
{{#if action.route}}
|
|
70
|
+
<LinkTo @route={{action.route}} @query={{action.query}} class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
71
|
+
<FaIcon @icon={{action.icon}} />
|
|
72
|
+
<span>
|
|
73
|
+
<strong>{{action.label}}</strong>
|
|
74
|
+
<small>{{action.description}}</small>
|
|
75
|
+
</span>
|
|
76
|
+
</LinkTo>
|
|
77
|
+
{{else}}
|
|
78
|
+
<div class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
79
|
+
<FaIcon @icon={{action.icon}} />
|
|
80
|
+
<span>
|
|
81
|
+
<strong>{{action.label}}</strong>
|
|
82
|
+
<small>{{action.description}}</small>
|
|
83
|
+
</span>
|
|
84
|
+
</div>
|
|
85
|
+
{{/if}}
|
|
86
|
+
{{/each}}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div class="fleet-ops-control-hub-doc-note">
|
|
91
|
+
<div class="fleet-ops-control-hub-doc-note-heading">
|
|
92
|
+
<FaIcon @icon="lightbulb" />
|
|
93
|
+
<span>Guides</span>
|
|
94
|
+
</div>
|
|
95
|
+
<p class="fleet-ops-control-hub-doc-note-copy">Read the guide before changing maintenance workflows.</p>
|
|
96
|
+
<div class="fleet-ops-control-hub-doc-grid">
|
|
97
|
+
{{#each this.docs as |doc|}}
|
|
98
|
+
<button type="button" class="fleet-ops-control-hub-doc-link" {{on "click" (fn this.openDocs doc)}}>
|
|
99
|
+
<FaIcon @icon={{doc.icon}} />
|
|
100
|
+
<span class="fleet-ops-control-hub-doc-copy">
|
|
101
|
+
<strong>Read the guide on {{doc.label}}</strong>
|
|
102
|
+
<small>{{doc.description}}</small>
|
|
103
|
+
</span>
|
|
104
|
+
</button>
|
|
105
|
+
{{/each}}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</aside>
|
|
109
|
+
</section>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
{{outlet}}
|
|
@@ -10,5 +10,19 @@
|
|
|
10
10
|
@actionButtons={{this.actionButtons}}
|
|
11
11
|
@bulkActions={{this.bulkActions}}
|
|
12
12
|
@controller={{this}}
|
|
13
|
+
@emptyStateComponent={{component
|
|
14
|
+
"table/empty-state"
|
|
15
|
+
icon="screwdriver-wrench"
|
|
16
|
+
title="No maintenance records yet"
|
|
17
|
+
description="Log maintenance events to keep service history, costs, and asset readiness visible."
|
|
18
|
+
filteredTitle="No maintenance records match your filters"
|
|
19
|
+
filteredDescription="Adjust the search or filters to find another maintenance record."
|
|
20
|
+
primaryText="New maintenance"
|
|
21
|
+
primaryIcon="plus"
|
|
22
|
+
primaryAction=this.maintenanceActions.transition.create
|
|
23
|
+
secondaryText="Import"
|
|
24
|
+
secondaryIcon="upload"
|
|
25
|
+
secondaryAction=this.maintenanceActions.import
|
|
26
|
+
}}
|
|
13
27
|
/>
|
|
14
|
-
{{outlet}}
|
|
28
|
+
{{outlet}}
|
|
@@ -12,6 +12,24 @@
|
|
|
12
12
|
@actionButtons={{this.actionButtons}}
|
|
13
13
|
@bulkActions={{this.bulkActions}}
|
|
14
14
|
@controller={{this}}
|
|
15
|
+
@emptyStateComponent={{component
|
|
16
|
+
"table/empty-state"
|
|
17
|
+
icon="gears"
|
|
18
|
+
title="Add your first part"
|
|
19
|
+
description="Parts keep replacement inventory and compatibility details ready for maintenance work."
|
|
20
|
+
filteredTitle="No parts match your filters"
|
|
21
|
+
filteredDescription="Adjust the search or filters to find another part."
|
|
22
|
+
primaryText="New part"
|
|
23
|
+
primaryIcon="plus"
|
|
24
|
+
primaryAction=this.partActions.transition.create
|
|
25
|
+
secondaryText="Import"
|
|
26
|
+
secondaryIcon="upload"
|
|
27
|
+
secondaryAction=this.partActions.import
|
|
28
|
+
docsSlug="fleet-ops/maintenance/parts/overview"
|
|
29
|
+
docsTitle="Parts guide"
|
|
30
|
+
docsText="Parts guide"
|
|
31
|
+
docsSource="fleet-ops-empty-parts"
|
|
32
|
+
}}
|
|
15
33
|
/>
|
|
16
34
|
{{else}}
|
|
17
35
|
<Layout::Section::Header @title={{t "resource.parts"}} @actionsWrapperClass="space-x-1">
|
|
@@ -46,4 +64,4 @@
|
|
|
46
64
|
</Layout::Resource::CardsGrid>
|
|
47
65
|
</Layout::Section::Body>
|
|
48
66
|
{{/if}}
|
|
49
|
-
{{outlet}}
|
|
67
|
+
{{outlet}}
|
|
@@ -35,6 +35,24 @@
|
|
|
35
35
|
@actionButtons={{this.actionButtons}}
|
|
36
36
|
@bulkActions={{this.bulkActions}}
|
|
37
37
|
@controller={{this}}
|
|
38
|
+
@emptyStateComponent={{component
|
|
39
|
+
"table/empty-state"
|
|
40
|
+
icon="calendar-check"
|
|
41
|
+
title="Create your first maintenance schedule"
|
|
42
|
+
description="Schedules help automate preventive work and keep service intervals visible before assets fall behind."
|
|
43
|
+
filteredTitle="No maintenance schedules match your filters"
|
|
44
|
+
filteredDescription="Adjust the search or filters to find another schedule."
|
|
45
|
+
primaryText="New schedule"
|
|
46
|
+
primaryIcon="plus"
|
|
47
|
+
primaryAction=this.maintenanceScheduleActions.transition.create
|
|
48
|
+
secondaryText="Import"
|
|
49
|
+
secondaryIcon="upload"
|
|
50
|
+
secondaryAction=this.maintenanceScheduleActions.import
|
|
51
|
+
docsSlug="fleet-ops/maintenance/schedules/overview"
|
|
52
|
+
docsTitle="Schedules guide"
|
|
53
|
+
docsText="Schedules guide"
|
|
54
|
+
docsSource="fleet-ops-empty-maintenance-schedules"
|
|
55
|
+
}}
|
|
38
56
|
/>
|
|
39
57
|
{{/if}}
|
|
40
|
-
{{outlet}}
|
|
58
|
+
{{outlet}}
|
|
@@ -10,5 +10,23 @@
|
|
|
10
10
|
@actionButtons={{this.actionButtons}}
|
|
11
11
|
@bulkActions={{this.bulkActions}}
|
|
12
12
|
@controller={{this}}
|
|
13
|
+
@emptyStateComponent={{component
|
|
14
|
+
"table/empty-state"
|
|
15
|
+
icon="clipboard-list"
|
|
16
|
+
title="No work orders yet"
|
|
17
|
+
description="Create work orders to assign maintenance tasks, track progress, and close out repairs."
|
|
18
|
+
filteredTitle="No work orders match your filters"
|
|
19
|
+
filteredDescription="Adjust the search or filters to find another work order."
|
|
20
|
+
primaryText="New work order"
|
|
21
|
+
primaryIcon="plus"
|
|
22
|
+
primaryAction=this.workOrderActions.transition.create
|
|
23
|
+
secondaryText="Import"
|
|
24
|
+
secondaryIcon="upload"
|
|
25
|
+
secondaryAction=this.workOrderActions.import
|
|
26
|
+
docsSlug="fleet-ops/maintenance/work-orders/overview"
|
|
27
|
+
docsTitle="Work orders guide"
|
|
28
|
+
docsText="Work orders guide"
|
|
29
|
+
docsSource="fleet-ops-empty-work-orders"
|
|
30
|
+
}}
|
|
13
31
|
/>
|
|
14
|
-
{{outlet}}
|
|
32
|
+
{{outlet}}
|