@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,14 @@
|
|
|
1
|
+
<Layout::Section::Body class="overflow-y-scroll h-full" data-test-fleet-ops-analytics-hub>
|
|
2
|
+
<Dashboard
|
|
3
|
+
@defaultDashboardId="fleet-ops"
|
|
4
|
+
@defaultDashboardName="Fleet-Ops Dashboard"
|
|
5
|
+
@extension="fleet-ops"
|
|
6
|
+
@leftHeaderWrapperClass="fleet-ops-dashboard-title"
|
|
7
|
+
@rightHeaderWrapperClass="fleet-ops-dashboard-actions"
|
|
8
|
+
@createWrapperClass="fleet-ops-dashboard-create-wrapper"
|
|
9
|
+
@stickyHeader={{true}}
|
|
10
|
+
class="fleet-ops-dashboard-page"
|
|
11
|
+
/>
|
|
12
|
+
<Spacer @height="300px" />
|
|
13
|
+
{{outlet}}
|
|
14
|
+
</Layout::Section::Body>
|
|
@@ -11,5 +11,23 @@
|
|
|
11
11
|
@actionButtons={{this.actionButtons}}
|
|
12
12
|
@bulkActions={{this.bulkActions}}
|
|
13
13
|
@controller={{this}}
|
|
14
|
+
@emptyStateComponent={{component
|
|
15
|
+
"table/empty-state"
|
|
16
|
+
icon="chart-line"
|
|
17
|
+
title="No reports yet"
|
|
18
|
+
description="Create a Fleet-Ops report to start tracking operational trends, utilization, and performance over time."
|
|
19
|
+
filteredTitle="No reports match your search"
|
|
20
|
+
filteredDescription="Adjust the search or filters to find an existing report."
|
|
21
|
+
primaryText="New report"
|
|
22
|
+
primaryIcon="plus"
|
|
23
|
+
primaryAction=this.reportActions.transition.create
|
|
24
|
+
secondaryText="Refresh"
|
|
25
|
+
secondaryIcon="refresh"
|
|
26
|
+
secondaryAction=this.reportActions.refresh
|
|
27
|
+
docsSlug="fleet-ops/analytics/reports/overview"
|
|
28
|
+
docsTitle="Reports guide"
|
|
29
|
+
docsText="Reports guide"
|
|
30
|
+
docsSource="fleet-ops-empty-reports"
|
|
31
|
+
}}
|
|
14
32
|
/>
|
|
15
|
-
{{outlet}}
|
|
33
|
+
{{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="tablet-screen-button"
|
|
16
|
+
title="Add your first device"
|
|
17
|
+
description="Devices connect vehicles and assets to telemetry, events, tracking, and provider syncs."
|
|
18
|
+
filteredTitle="No devices match your filters"
|
|
19
|
+
filteredDescription="Adjust the search or filters to find another device."
|
|
20
|
+
primaryText="New device"
|
|
21
|
+
primaryIcon="plus"
|
|
22
|
+
primaryAction=this.deviceActions.transition.create
|
|
23
|
+
secondaryText="Import"
|
|
24
|
+
secondaryIcon="upload"
|
|
25
|
+
secondaryAction=this.deviceActions.import
|
|
26
|
+
docsSlug="fleet-ops/connectivity/devices/overview"
|
|
27
|
+
docsTitle="Devices guide"
|
|
28
|
+
docsText="Device guide"
|
|
29
|
+
docsSource="fleet-ops-empty-devices"
|
|
30
|
+
}}
|
|
13
31
|
/>
|
|
14
|
-
{{outlet}}
|
|
32
|
+
{{outlet}}
|
|
@@ -10,5 +10,20 @@
|
|
|
10
10
|
@actionButtons={{this.actionButtons}}
|
|
11
11
|
@bulkActions={{this.bulkActions}}
|
|
12
12
|
@controller={{this}}
|
|
13
|
+
@emptyStateComponent={{component
|
|
14
|
+
"table/empty-state"
|
|
15
|
+
icon="bolt"
|
|
16
|
+
title="No connectivity events yet"
|
|
17
|
+
description="Events appear here after connected devices or providers begin sending telemetry signals."
|
|
18
|
+
filteredTitle="No events match your filters"
|
|
19
|
+
filteredDescription="Adjust the search, provider, device, or date filters to review other events."
|
|
20
|
+
primaryText="Refresh"
|
|
21
|
+
primaryIcon="refresh"
|
|
22
|
+
primaryAction=this.deviceEventActions.refresh
|
|
23
|
+
docsSlug="fleet-ops/connectivity/events/overview"
|
|
24
|
+
docsTitle="Events guide"
|
|
25
|
+
docsText="Events guide"
|
|
26
|
+
docsSource="fleet-ops-empty-events"
|
|
27
|
+
}}
|
|
13
28
|
/>
|
|
14
|
-
{{outlet}}
|
|
29
|
+
{{outlet}}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<div class="mx-auto grid w-full max-w-7xl grid-cols-1 gap-4 px-4 py-4 lg:grid-cols-3 md:px-6">
|
|
2
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800 lg:col-span-2">
|
|
3
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">How This Integration Works</h2>
|
|
4
|
+
<p class="mt-2 text-sm leading-6 text-gray-600 dark:text-gray-300">
|
|
5
|
+
{{or @model.name @model.provider}} imports provider bills as Fuel Transactions, matches each transaction to vehicles and trips, then creates linked Fuel Reports for operational reporting after a vehicle match.
|
|
6
|
+
</p>
|
|
7
|
+
<div class="mt-4 grid grid-cols-1 gap-3 md:grid-cols-3">
|
|
8
|
+
<div class="rounded-md border border-gray-200 p-3 dark:border-gray-700">
|
|
9
|
+
<div class="text-xs font-bold uppercase text-gray-400">1. Import</div>
|
|
10
|
+
<div class="mt-1 text-sm font-semibold text-gray-900 dark:text-gray-100">Provider bills</div>
|
|
11
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Sync pulls fuel purchase data from the provider API.</p>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="rounded-md border border-gray-200 p-3 dark:border-gray-700">
|
|
14
|
+
<div class="text-xs font-bold uppercase text-gray-400">2. Match</div>
|
|
15
|
+
<div class="mt-1 text-sm font-semibold text-gray-900 dark:text-gray-100">Vehicles and trips</div>
|
|
16
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Identifiers are matched against vehicles, orders, and trip numbers.</p>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="rounded-md border border-gray-200 p-3 dark:border-gray-700">
|
|
19
|
+
<div class="text-xs font-bold uppercase text-gray-400">3. Report</div>
|
|
20
|
+
<div class="mt-1 text-sm font-semibold text-gray-900 dark:text-gray-100">Fuel Reports</div>
|
|
21
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Matched transactions create visible fuel reports for operations and analytics.</p>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</section>
|
|
25
|
+
|
|
26
|
+
<aside class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
27
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Latest Sync Summary</h2>
|
|
28
|
+
<div class="mt-3 space-y-2 text-sm">
|
|
29
|
+
<div class="flex justify-between gap-3"><span class="text-gray-500 dark:text-gray-300">Imported</span><span class="font-semibold text-gray-900 dark:text-gray-100">{{n-a @model.last_sync_state.summary.imported}}</span></div>
|
|
30
|
+
<div class="flex justify-between gap-3"><span class="text-gray-500 dark:text-gray-300">Matched</span><span class="font-semibold text-gray-900 dark:text-gray-100">{{n-a @model.last_sync_state.summary.matched}}</span></div>
|
|
31
|
+
<div class="flex justify-between gap-3"><span class="text-gray-500 dark:text-gray-300">Unmatched</span><span class="font-semibold text-gray-900 dark:text-gray-100">{{n-a @model.last_sync_state.summary.unmatched}}</span></div>
|
|
32
|
+
<div class="flex justify-between gap-3"><span class="text-gray-500 dark:text-gray-300">Fuel Reports</span><span class="font-semibold text-gray-900 dark:text-gray-100">{{n-a @model.last_sync_state.summary.fuel_reports_created}}</span></div>
|
|
33
|
+
</div>
|
|
34
|
+
{{#if @model.last_error}}
|
|
35
|
+
<div class="mt-4 rounded-md border border-red-200 bg-red-50 p-3 text-xs leading-5 text-red-700 dark:border-red-800 dark:bg-red-900/10 dark:text-red-300">{{@model.last_error}}</div>
|
|
36
|
+
{{/if}}
|
|
37
|
+
</aside>
|
|
38
|
+
</div>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<div class="mx-auto w-full max-w-7xl px-4 py-4 md:px-6">
|
|
2
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
3
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Transaction Matching</h2>
|
|
4
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">This is the order used when imported fuel transactions are matched to vehicles or orders.</p>
|
|
5
|
+
<div class="mt-4">
|
|
6
|
+
<FuelIntegration::MatchingPriority @order={{@model.sync_settings.matching_order}} />
|
|
7
|
+
</div>
|
|
8
|
+
<div class="mt-4 flex flex-wrap items-center gap-2">
|
|
9
|
+
<Button @icon="receipt" @text="Review Unmatched Transactions" @size="sm" @onClick={{transition-to "management.fuel-transactions.index" (query-params sync_status="unmatched" connection=@model.uuid)}} />
|
|
10
|
+
<Button @icon="cog" @text="Edit Matching Rules" @size="sm" @onClick={{transition-to "connectivity.fuel-providers.edit" @model}} />
|
|
11
|
+
</div>
|
|
12
|
+
</section>
|
|
13
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<div class="mx-auto w-full max-w-7xl px-4 py-4 md:px-6">
|
|
2
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
3
|
+
<div class="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
4
|
+
<div>
|
|
5
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Connection Settings</h2>
|
|
6
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Update credentials, sync behavior, matching rules, and status for this fuel integration.</p>
|
|
7
|
+
</div>
|
|
8
|
+
<Button @icon="cog" @text="Edit Settings" @type="primary" @size="sm" @onClick={{transition-to "connectivity.fuel-providers.edit" @model}} />
|
|
9
|
+
</div>
|
|
10
|
+
</section>
|
|
11
|
+
</div>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<div class="mx-auto grid w-full max-w-7xl grid-cols-1 gap-4 px-4 py-4 lg:grid-cols-3 md:px-6">
|
|
2
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800 lg:col-span-2">
|
|
3
|
+
<div class="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
4
|
+
<div>
|
|
5
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Manual Sync</h2>
|
|
6
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Queue a provider import for the configured sync window. Imported records appear in Management > Fuel Transactions.</p>
|
|
7
|
+
</div>
|
|
8
|
+
<Button @icon="rotate" @text="Sync Transactions" @type="primary" @size="sm" @isLoading={{this.syncTransactions.isRunning}} @onClick={{perform this.syncTransactions}} />
|
|
9
|
+
</div>
|
|
10
|
+
<div class="mt-4 rounded-md border border-gray-200 p-3 text-xs leading-5 dark:border-gray-700">
|
|
11
|
+
<div class="font-semibold text-gray-900 dark:text-gray-100">Configured window</div>
|
|
12
|
+
<div class="mt-1 text-gray-500 dark:text-gray-300">{{n-a @model.connection.sync_settings.window_days}} days</div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="mt-4 overflow-hidden rounded-md border border-gray-200 dark:border-gray-700">
|
|
15
|
+
<table class="min-w-full divide-y divide-gray-200 text-xs dark:divide-gray-700">
|
|
16
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
17
|
+
<tr>
|
|
18
|
+
<th class="px-3 py-2 text-left font-semibold text-gray-500">Status</th>
|
|
19
|
+
<th class="px-3 py-2 text-left font-semibold text-gray-500">Window</th>
|
|
20
|
+
<th class="px-3 py-2 text-left font-semibold text-gray-500">Imported</th>
|
|
21
|
+
<th class="px-3 py-2 text-left font-semibold text-gray-500">Matched</th>
|
|
22
|
+
<th class="px-3 py-2 text-left font-semibold text-gray-500">Finished</th>
|
|
23
|
+
</tr>
|
|
24
|
+
</thead>
|
|
25
|
+
<tbody class="divide-y divide-gray-100 dark:divide-gray-800">
|
|
26
|
+
{{#each this.syncRuns as |run|}}
|
|
27
|
+
<tr>
|
|
28
|
+
<td class="px-3 py-2"><Badge @status={{run.status}}>{{run.status}}</Badge></td>
|
|
29
|
+
<td class="px-3 py-2 text-gray-600 dark:text-gray-300">{{n-a (format-date-fns run.from "dd MMM")}} - {{n-a (format-date-fns run.to "dd MMM")}}</td>
|
|
30
|
+
<td class="px-3 py-2 text-gray-600 dark:text-gray-300">{{run.imported}}</td>
|
|
31
|
+
<td class="px-3 py-2 text-gray-600 dark:text-gray-300">{{run.matched}}</td>
|
|
32
|
+
<td class="px-3 py-2 text-gray-600 dark:text-gray-300">{{n-a (format-date-fns run.finished_at "dd MMM HH:mm")}}</td>
|
|
33
|
+
</tr>
|
|
34
|
+
{{else}}
|
|
35
|
+
<tr>
|
|
36
|
+
<td colspan="5" class="px-3 py-6 text-center text-gray-500 dark:text-gray-300">No sync runs have been recorded yet.</td>
|
|
37
|
+
</tr>
|
|
38
|
+
{{/each}}
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
</div>
|
|
42
|
+
</section>
|
|
43
|
+
|
|
44
|
+
<aside class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
45
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Last Sync State</h2>
|
|
46
|
+
<pre class="mt-3 max-h-80 overflow-auto rounded-md bg-gray-900 p-3 text-[11px] leading-5 text-gray-100">{{this.lastSyncStateJson}}</pre>
|
|
47
|
+
</aside>
|
|
48
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<div class="mx-auto w-full max-w-7xl px-4 py-4 md:px-6">
|
|
2
|
+
<Layout::Resource::Tabular
|
|
3
|
+
@resource="fuel-provider-transaction"
|
|
4
|
+
@title="Imported Transactions"
|
|
5
|
+
@data={{@model}}
|
|
6
|
+
@columns={{this.columns}}
|
|
7
|
+
@page={{1}}
|
|
8
|
+
@controller={{this}}
|
|
9
|
+
@emptyStateComponent={{component
|
|
10
|
+
"table/empty-state"
|
|
11
|
+
icon="receipt"
|
|
12
|
+
title="No imported transactions"
|
|
13
|
+
description="Fuel transactions will appear here after this provider syncs bills or purchase records."
|
|
14
|
+
filteredTitle="No transactions match your filters"
|
|
15
|
+
filteredDescription="Adjust filters or sync the provider again to review imported transactions."
|
|
16
|
+
primaryText="Refresh"
|
|
17
|
+
primaryIcon="refresh"
|
|
18
|
+
primaryAction=this.refresh
|
|
19
|
+
}}
|
|
20
|
+
/>
|
|
21
|
+
</div>
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
<div class="mt-1 flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-300">
|
|
7
|
+
<FaIcon @icon="gas-pump" />
|
|
8
|
+
</div>
|
|
9
|
+
<div class="min-w-0">
|
|
10
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
11
|
+
<h1 class="truncate text-lg font-bold text-gray-900 dark:text-gray-100">{{or @model.name @model.provider}}</h1>
|
|
12
|
+
<Badge @status={{this.healthStatus}} @hideStatusDot={{true}}>{{this.statusLabel}}</Badge>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="mt-1 text-sm text-gray-500 dark:text-gray-300">
|
|
15
|
+
{{@model.provider}}
|
|
16
|
+
{{#if @model.public_id}}
|
|
17
|
+
<span class="mx-1 text-gray-300 dark:text-gray-600">/</span>
|
|
18
|
+
<span class="font-mono text-xs">{{@model.public_id}}</span>
|
|
19
|
+
{{/if}}
|
|
20
|
+
</div>
|
|
21
|
+
<div class="mt-2 flex flex-wrap gap-2 text-xs text-gray-500 dark:text-gray-300">
|
|
22
|
+
<span>Last test: {{n-a (format-date-fns @model.last_tested_at "dd MMM HH:mm")}}</span>
|
|
23
|
+
<span>Last sync: {{n-a (format-date-fns @model.last_synced_at "dd MMM HH:mm")}}</span>
|
|
24
|
+
<span>Imported: {{n-a this.lastSummary.imported}}</span>
|
|
25
|
+
<span>Unmatched: {{n-a this.lastSummary.unmatched}}</span>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
31
|
+
<Button @icon="arrow-left" @text="Back" @size="xs" @onClick={{transition-to "connectivity.fuel-providers.index"}} />
|
|
32
|
+
<Button @icon="plug" @text="Test" @size="xs" @isLoading={{this.testConnection.isRunning}} @onClick={{perform this.testConnection}} />
|
|
33
|
+
<Button @icon="rotate" @text="Sync Transactions" @type="primary" @size="xs" @isLoading={{this.syncTransactions.isRunning}} @onClick={{perform this.syncTransactions}} />
|
|
34
|
+
<Button @icon="cog" @text="Settings" @size="xs" @onClick={{transition-to "connectivity.fuel-providers.edit" @model}} />
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<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="Fuel integration sections">
|
|
39
|
+
{{#each this.tabs as |tab|}}
|
|
40
|
+
<LinkTo @route={{tab.route}} class="inline-flex flex-shrink-0 items-center border-b-2 px-3 py-3 font-medium {{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'}}">
|
|
41
|
+
{{tab.label}}
|
|
42
|
+
</LinkTo>
|
|
43
|
+
{{/each}}
|
|
44
|
+
</nav>
|
|
45
|
+
</section>
|
|
46
|
+
|
|
47
|
+
<section class="min-w-0">
|
|
48
|
+
{{outlet}}
|
|
49
|
+
</section>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
@@ -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 class="min-w-0">
|
|
5
|
+
<div class="text-xs font-semibold uppercase text-gray-400 dark:text-gray-500">Fuel integration 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, sync behavior, and matching rules for this fuel integration.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="flex items-center gap-2">
|
|
10
|
+
<Button @icon="eye" @text="View" @size="sm" @onClick={{transition-to "connectivity.fuel-providers.details" @model}} />
|
|
11
|
+
<Button @icon="times" @text="Cancel" @size="sm" @onClick={{this.cancel}} />
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</section>
|
|
15
|
+
|
|
16
|
+
<FuelIntegration::Form
|
|
17
|
+
@resource={{@model}}
|
|
18
|
+
@saveLabel="Save Changes"
|
|
19
|
+
@footerHelp="Changes affect credential tests, transaction sync, matching, and Fuel Report creation."
|
|
20
|
+
@isSaving={{this.save.isRunning}}
|
|
21
|
+
@onCancel={{this.cancel}}
|
|
22
|
+
@onSave={{perform this.save @model}}
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<FuelIntegration::Hub
|
|
2
|
+
@connections={{@model}}
|
|
3
|
+
@providers={{this.providers}}
|
|
4
|
+
@providersLoading={{this.loadProviders.isRunning}}
|
|
5
|
+
@columns={{this.columns}}
|
|
6
|
+
@page={{this.page}}
|
|
7
|
+
@onPageChange={{fn (mut this.page)}}
|
|
8
|
+
@bulkActions={{this.bulkActions}}
|
|
9
|
+
@controller={{this}}
|
|
10
|
+
@searchQuery={{this.query}}
|
|
11
|
+
@onRefresh={{this.refresh}}
|
|
12
|
+
/>
|
|
@@ -0,0 +1,22 @@
|
|
|
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">Fuel integration setup</div>
|
|
6
|
+
<h1 class="text-lg font-bold text-gray-900 dark:text-gray-100">Connect Fuel Integration</h1>
|
|
7
|
+
<p class="mt-1 text-sm text-gray-500 dark:text-gray-300">Connect PetroApp or another fuel card/fuel management system, test credentials, and configure transaction imports.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<Button @icon="times" @text="Cancel" @size="sm" @onClick={{this.cancel}} />
|
|
10
|
+
</div>
|
|
11
|
+
</section>
|
|
12
|
+
|
|
13
|
+
<FuelIntegration::Form
|
|
14
|
+
@resource={{this.connection}}
|
|
15
|
+
@initialProviderKey={{this.setupProvider}}
|
|
16
|
+
@saveLabel="Create Integration"
|
|
17
|
+
@footerHelp="After saving, run a sync to import provider bills into Fuel Transactions."
|
|
18
|
+
@isSaving={{this.save.isRunning}}
|
|
19
|
+
@onCancel={{this.cancel}}
|
|
20
|
+
@onSave={{perform this.save this.connection}}
|
|
21
|
+
/>
|
|
22
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{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="satellite-dish"
|
|
16
|
+
title="Add your first sensor"
|
|
17
|
+
description="Sensors capture telemetry signals that can power events, conditions, and operational visibility."
|
|
18
|
+
filteredTitle="No sensors match your filters"
|
|
19
|
+
filteredDescription="Adjust the search or filters to find another sensor."
|
|
20
|
+
primaryText="New sensor"
|
|
21
|
+
primaryIcon="plus"
|
|
22
|
+
primaryAction=this.sensorActions.transition.create
|
|
23
|
+
secondaryText="Import"
|
|
24
|
+
secondaryIcon="upload"
|
|
25
|
+
secondaryAction=this.sensorActions.import
|
|
26
|
+
docsSlug="fleet-ops/connectivity/sensors/overview"
|
|
27
|
+
docsTitle="Sensors guide"
|
|
28
|
+
docsText="Sensors guide"
|
|
29
|
+
docsSource="fleet-ops-empty-sensors"
|
|
30
|
+
}}
|
|
13
31
|
/>
|
|
14
|
-
{{outlet}}
|
|
32
|
+
{{outlet}}
|
|
@@ -0,0 +1,163 @@
|
|
|
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">Vehicle Attachment Mapping</h2>
|
|
4
|
+
<p class="text-sm text-gray-500 dark:text-gray-300">Map synced provider devices to vehicles so telemetry can power vehicle state, maintenance, and operations workflows.</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="flex flex-col gap-3 border-b border-gray-200 px-4 py-3 dark:border-gray-700 lg:flex-row lg:items-start lg:justify-between">
|
|
25
|
+
<div class="max-w-xl">
|
|
26
|
+
<h3 class="text-sm font-bold text-gray-900 dark:text-gray-100">Vehicle Groups</h3>
|
|
27
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Find a vehicle to review its attached devices, or resolve the unattached queue first.</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="flex w-full min-w-0 flex-nowrap items-center justify-end gap-2 overflow-x-auto lg:w-auto lg:flex-shrink-0">
|
|
30
|
+
<Input
|
|
31
|
+
@value={{this.query}}
|
|
32
|
+
@type="text"
|
|
33
|
+
class="form-input h-9 min-w-[16rem] flex-shrink-0"
|
|
34
|
+
placeholder="Search vehicles or devices"
|
|
35
|
+
{{on "input" this.updateQuery}}
|
|
36
|
+
/>
|
|
37
|
+
<select class="form-select h-9 flex-shrink-0" {{on "change" this.updateAttachmentState}}>
|
|
38
|
+
<option value="" selected={{not this.attachment_state}}>All mappings</option>
|
|
39
|
+
<option value="unattached" selected={{eq this.attachment_state "unattached"}}>Unattached</option>
|
|
40
|
+
<option value="attached" selected={{eq this.attachment_state "attached"}}>Attached</option>
|
|
41
|
+
</select>
|
|
42
|
+
<select class="form-select h-9 flex-shrink-0" {{on "change" this.updateStatus}}>
|
|
43
|
+
<option value="" selected={{not this.status}}>Any status</option>
|
|
44
|
+
<option value="active" selected={{eq this.status "active"}}>Active</option>
|
|
45
|
+
<option value="online" selected={{eq this.status "online"}}>Online</option>
|
|
46
|
+
<option value="offline" selected={{eq this.status "offline"}}>Offline</option>
|
|
47
|
+
<option value="inactive" selected={{eq this.status "inactive"}}>Inactive</option>
|
|
48
|
+
</select>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
{{#if (or (eq this.emptyStateVariant "not_synced") (eq this.emptyStateVariant "filtered_empty"))}}
|
|
53
|
+
<div class="p-4">
|
|
54
|
+
<Telematic::TabEmptyState
|
|
55
|
+
@tone={{this.emptyStateContent.tone}}
|
|
56
|
+
@icon={{this.emptyStateContent.icon}}
|
|
57
|
+
@title={{this.emptyStateContent.title}}
|
|
58
|
+
@message={{this.emptyStateContent.message}}
|
|
59
|
+
@note={{this.emptyStateContent.note}}
|
|
60
|
+
@primaryText={{this.emptyStateContent.primaryText}}
|
|
61
|
+
@primaryIcon={{this.emptyStateContent.primaryIcon}}
|
|
62
|
+
@primaryAction={{this.emptyStateContent.primaryAction}}
|
|
63
|
+
@secondaryText={{this.emptyStateContent.secondaryText}}
|
|
64
|
+
@secondaryIcon={{this.emptyStateContent.secondaryIcon}}
|
|
65
|
+
@secondaryAction={{this.emptyStateContent.secondaryAction}}
|
|
66
|
+
/>
|
|
67
|
+
</div>
|
|
68
|
+
{{else}}
|
|
69
|
+
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
70
|
+
{{#if (eq this.emptyStateVariant "empty")}}
|
|
71
|
+
<div class="p-4">
|
|
72
|
+
<Telematic::TabEmptyState
|
|
73
|
+
@tone={{this.emptyStateContent.tone}}
|
|
74
|
+
@icon={{this.emptyStateContent.icon}}
|
|
75
|
+
@title={{this.emptyStateContent.title}}
|
|
76
|
+
@message={{this.emptyStateContent.message}}
|
|
77
|
+
@note={{this.emptyStateContent.note}}
|
|
78
|
+
/>
|
|
79
|
+
</div>
|
|
80
|
+
{{/if}}
|
|
81
|
+
|
|
82
|
+
{{#if (eq this.emptyStateVariant "unattached_only")}}
|
|
83
|
+
<div class="p-4">
|
|
84
|
+
<Telematic::TabEmptyState
|
|
85
|
+
@tone={{this.emptyStateContent.tone}}
|
|
86
|
+
@icon={{this.emptyStateContent.icon}}
|
|
87
|
+
@title={{this.emptyStateContent.title}}
|
|
88
|
+
@message={{this.emptyStateContent.message}}
|
|
89
|
+
@note={{this.emptyStateContent.note}}
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
{{/if}}
|
|
93
|
+
|
|
94
|
+
<div class="bg-yellow-50/70 px-4 py-3 dark:bg-yellow-900/10">
|
|
95
|
+
<div class="mb-3 flex flex-col gap-2 md:flex-row md:items-center md:justify-between">
|
|
96
|
+
<div>
|
|
97
|
+
<h4 class="text-sm font-bold text-gray-900 dark:text-gray-100">Unattached Devices</h4>
|
|
98
|
+
<p class="text-xs text-yellow-800 dark:text-yellow-300">These devices are synced, but not yet mapped to a vehicle. Attach devices deliberately one at a time.</p>
|
|
99
|
+
</div>
|
|
100
|
+
<Badge @status={{if this.unattachedDevices.length "warning" "success"}} @hideStatusDot={{true}}>
|
|
101
|
+
{{this.unattachedDevices.length}} devices
|
|
102
|
+
</Badge>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
{{#if this.unattachedDevices.length}}
|
|
106
|
+
<div class="grid grid-cols-1 gap-2 xl:grid-cols-2">
|
|
107
|
+
{{#each this.unattachedDevices as |device|}}
|
|
108
|
+
<div class="flex flex-col gap-3 rounded-md border border-yellow-200 bg-white p-3 dark:border-yellow-700 dark:bg-gray-800 md:flex-row md:items-center md:justify-between">
|
|
109
|
+
<div class="min-w-0">
|
|
110
|
+
<Device::Pill @device={{device}} />
|
|
111
|
+
</div>
|
|
112
|
+
<div class="flex flex-shrink-0 items-center gap-2">
|
|
113
|
+
<Button @icon="eye" @text="Open" @size="xs" @onClick={{fn this.deviceActions.transition.view device}} />
|
|
114
|
+
<Button @icon="link" @text="Attach" @size="xs" @type="primary" @onClick={{fn this.openAttachDeviceModal device}} />
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
{{/each}}
|
|
118
|
+
</div>
|
|
119
|
+
{{else}}
|
|
120
|
+
<div class="rounded-md border border-green-200 bg-green-50 p-3 text-sm text-green-800 dark:border-green-700 dark:bg-green-900/20 dark:text-green-300">
|
|
121
|
+
All synced devices in this view are mapped to vehicles.
|
|
122
|
+
</div>
|
|
123
|
+
{{/if}}
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
{{#each this.vehicleGroups as |group|}}
|
|
127
|
+
<div class="px-4 py-3">
|
|
128
|
+
<div class="mb-3 flex flex-col gap-2 md:flex-row md:items-center md:justify-between">
|
|
129
|
+
<div class="min-w-0">
|
|
130
|
+
<h4 class="truncate text-sm font-bold text-gray-900 dark:text-gray-100">{{group.name}}</h4>
|
|
131
|
+
<p class="text-xs text-gray-500 dark:text-gray-300">{{group.devices.length}} attached provider devices</p>
|
|
132
|
+
</div>
|
|
133
|
+
<Badge @status="info" @hideStatusDot={{true}}>Vehicle mapped</Badge>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<div class="overflow-hidden rounded-md border border-gray-200 dark:border-gray-700">
|
|
137
|
+
{{#each group.devices as |device|}}
|
|
138
|
+
<div class="grid grid-cols-1 gap-3 border-b border-gray-200 p-3 last:border-b-0 dark:border-gray-700 lg:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)_auto] lg:items-center">
|
|
139
|
+
<Device::Pill @device={{device}} />
|
|
140
|
+
<div class="grid grid-cols-2 gap-2 text-xs">
|
|
141
|
+
<div>
|
|
142
|
+
<div class="text-gray-400 dark:text-gray-500">Provider ID</div>
|
|
143
|
+
<div class="truncate font-semibold text-gray-900 dark:text-gray-100">{{n-a device.device_id}}</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div>
|
|
146
|
+
<div class="text-gray-400 dark:text-gray-500">Last seen</div>
|
|
147
|
+
<div class="truncate font-semibold text-gray-900 dark:text-gray-100">{{n-a (format-date-fns device.last_online_at "dd MMM HH:mm")}}</div>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="flex items-center gap-2 lg:justify-end">
|
|
151
|
+
<Button @icon="eye" @text="Open" @size="xs" @onClick={{fn this.deviceActions.transition.view device}} />
|
|
152
|
+
<Button @icon="shuffle" @text="Change" @size="xs" @onClick={{fn this.openAttachDeviceModal device}} />
|
|
153
|
+
<Button @icon="unlink" @text="Detach" @size="xs" @type="danger" @onClick={{fn this.detachDevice device}} />
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
{{/each}}
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
{{/each}}
|
|
160
|
+
</div>
|
|
161
|
+
{{/if}}
|
|
162
|
+
</section>
|
|
163
|
+
</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">Device Inventory</h2>
|
|
4
|
+
<p class="text-sm text-gray-500 dark:text-gray-300">Review synced provider devices, connection state, and vehicle mapping from 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">Synced Devices</h3>
|
|
27
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Search provider identifiers, filter attachment state, and open devices for troubleshooting.</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="Synced Devices"
|
|
32
|
+
@searchQuery={{this.query}}
|
|
33
|
+
@onSearch={{perform this.deviceActions.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="device"
|
|
66
|
+
@title="Synced Devices"
|
|
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="tablet-screen-button"
|
|
77
|
+
title="No synced devices"
|
|
78
|
+
description="Run a provider sync or adjust filters to review devices from this connection."
|
|
79
|
+
filteredTitle="No devices match your filters"
|
|
80
|
+
filteredDescription="Adjust the search or filters to find another synced device."
|
|
81
|
+
primaryText="Refresh"
|
|
82
|
+
primaryIcon="refresh"
|
|
83
|
+
primaryAction=this.refresh
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
{{/if}}
|
|
87
|
+
</section>
|
|
88
|
+
</div>
|