@fleetbase/fleetops-engine 0.6.51 → 0.6.52
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.js +20 -2
- 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/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 +14 -0
- 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/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/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/payments/index.js +5 -0
- package/addon/extension.js +10 -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/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.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 +310 -34
- 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/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/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/payments/index.hbs +15 -1
- 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/management/fuel-transactions/index/details.js +1 -0
- package/app/controllers/management/fuel-transactions/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/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/services/fuel-integration-actions.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/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/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/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 +76 -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/SensorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
- 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/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 +36 -6
- 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 +2 -1
- 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 +10 -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 +55 -26
- 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 +41 -4
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
- package/server/tests/TelematicsHardeningTest.php +268 -0
- package/server/tests/VehicleDriverAssignmentTest.php +51 -0
- package/translations/ar-ae.yml +22 -0
- 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 +97 -0
- 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
package/README.md
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
<img src="https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/fleetbase-logo-svg.svg" alt="Fleetbase" width="380" height="100">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<h1 align="center">Fleet-Ops</h1>
|
|
6
|
-
|
|
7
5
|
<p align="center">
|
|
8
6
|
Open-source fleet, dispatch, transport management, and real-time logistics operations for Fleetbase.
|
|
9
7
|
</p>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<div ...attributes>
|
|
2
|
+
<button
|
|
3
|
+
type="button"
|
|
4
|
+
disabled={{and @column.permission (cannot @column.permission)}}
|
|
5
|
+
{{on "click" this.onClick}}
|
|
6
|
+
class="flex min-w-0 max-w-md items-start gap-2 py-1 text-left"
|
|
7
|
+
>
|
|
8
|
+
<div class="pt-0.5">
|
|
9
|
+
<Image src={{this.icon}} class="mr-3 h-8 w-8 flex-shrink-0 rounded-md" />
|
|
10
|
+
</div>
|
|
11
|
+
<div class="min-w-0 text-left">
|
|
12
|
+
<div class="truncate text-sm font-semibold text-gray-900 hover:text-blue-600 dark:text-gray-100 dark:hover:text-blue-300">{{n-a this.name}}</div>
|
|
13
|
+
<div class="mt-0.5 line-clamp-2 whitespace-normal text-left text-xs leading-4 text-gray-500 dark:text-gray-400">{{n-a this.description}}</div>
|
|
14
|
+
</div>
|
|
15
|
+
</button>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { action } from '@ember/object';
|
|
3
|
+
|
|
4
|
+
export default class CellTelematicProviderComponent extends Component {
|
|
5
|
+
get descriptor() {
|
|
6
|
+
return this.args.row?.provider_descriptor ?? {};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
get name() {
|
|
10
|
+
return this.args.row?.name ?? this.descriptor.label ?? this.args.row?.provider;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
get description() {
|
|
14
|
+
return this.descriptor.description ?? this.args.row?.provider;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get icon() {
|
|
18
|
+
return this.descriptor.icon;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@action onClick(event) {
|
|
22
|
+
const { row, column, onClick } = this.args;
|
|
23
|
+
|
|
24
|
+
if (typeof onClick === 'function') {
|
|
25
|
+
onClick(row, event);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof column?.action === 'function') {
|
|
29
|
+
column.action(row, event);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (typeof column?.onClick === 'function') {
|
|
33
|
+
column.onClick(row, event);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<Badge @status={{this.badgeStatus}} @hideStatusDot={{true}}>{{this.label}}</Badge>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
|
|
3
|
+
export default class CellTelematicStatusComponent extends Component {
|
|
4
|
+
get status() {
|
|
5
|
+
return this.args.row?.status;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
get badgeStatus() {
|
|
9
|
+
switch (this.status) {
|
|
10
|
+
case 'active':
|
|
11
|
+
case 'connected':
|
|
12
|
+
return 'success';
|
|
13
|
+
case 'synchronizing':
|
|
14
|
+
return 'info';
|
|
15
|
+
case 'error':
|
|
16
|
+
case 'degraded':
|
|
17
|
+
case 'disconnected':
|
|
18
|
+
return 'warning';
|
|
19
|
+
default:
|
|
20
|
+
return this.status ?? 'default';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get label() {
|
|
25
|
+
switch (this.status) {
|
|
26
|
+
case 'active':
|
|
27
|
+
case 'connected':
|
|
28
|
+
return 'Connected';
|
|
29
|
+
case 'synchronizing':
|
|
30
|
+
return 'Syncing';
|
|
31
|
+
case 'initialized':
|
|
32
|
+
return 'Not tested';
|
|
33
|
+
case 'error':
|
|
34
|
+
return 'Needs attention';
|
|
35
|
+
default:
|
|
36
|
+
return this.status ?? 'Unknown';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="flex flex-row items-center justify-between mb-4 px-3 pt-2">
|
|
3
3
|
<div></div>
|
|
4
4
|
<div>
|
|
5
|
-
<Button @icon="plus" @text="
|
|
5
|
+
<Button @icon="plus" @text={{t "device.actions.attach-device"}} @onClick={{this.addDevice}} @disabled={{not @resource}} />
|
|
6
6
|
</div>
|
|
7
7
|
</div>
|
|
8
8
|
<div>
|
|
@@ -10,20 +10,19 @@
|
|
|
10
10
|
<div class="flex flex-row justify-between px-3 py-4 border-t border-gray-200 dark:border-gray-700">
|
|
11
11
|
<Device::Pill @device={{device}} />
|
|
12
12
|
<div>
|
|
13
|
-
<Button @type="danger" @icon="times" @text="
|
|
13
|
+
<Button @type="danger" @icon="times" @text={{t "device.actions.detach-from-vehicle"}} @size="xs" @onClick={{fn this.removeDevice device}} />
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
16
|
{{else}}
|
|
17
17
|
<div class="empty-state bg-white dark:bg-gray-800 rounded-lg shadow-sm p-12 text-center">
|
|
18
18
|
<FaIcon @icon="hard-drive" @size="2x" class="text-gray-400 mb-2" />
|
|
19
19
|
<h3 class="text-base font-semibold text-gray-700 dark:text-gray-300">
|
|
20
|
-
|
|
20
|
+
{{t "device.prompts.no-devices-attached-title"}}
|
|
21
21
|
</h3>
|
|
22
22
|
<p class="text-sm text-gray-500 dark:text-gray-400">
|
|
23
|
-
|
|
24
|
-
{{get-model-name @resource}}
|
|
23
|
+
{{t "device.prompts.no-devices-attached-body" resourceType=(get-model-name @resource)}}
|
|
25
24
|
</p>
|
|
26
25
|
</div>
|
|
27
26
|
{{/each}}
|
|
28
27
|
</div>
|
|
29
|
-
</div>
|
|
28
|
+
</div>
|
|
@@ -8,8 +8,10 @@ import getModelName from '@fleetbase/ember-core/utils/get-model-name';
|
|
|
8
8
|
|
|
9
9
|
export default class DeviceManagerComponent extends Component {
|
|
10
10
|
@service store;
|
|
11
|
+
@service fetch;
|
|
11
12
|
@service modalsManager;
|
|
12
13
|
@service notifications;
|
|
14
|
+
@service intl;
|
|
13
15
|
@tracked devices = [];
|
|
14
16
|
|
|
15
17
|
get resourceName() {
|
|
@@ -33,24 +35,19 @@ export default class DeviceManagerComponent extends Component {
|
|
|
33
35
|
|
|
34
36
|
@action addDevice() {
|
|
35
37
|
this.modalsManager.show('modals/attach-device', {
|
|
36
|
-
title: '
|
|
37
|
-
acceptButtonText: '
|
|
38
|
+
title: this.intl.t('device.prompts.select-device-to-attach-title', { resourceName: this.resourceName }),
|
|
39
|
+
acceptButtonText: this.intl.t('device.prompts.confirm-attach-device'),
|
|
38
40
|
selectedDevice: null,
|
|
39
41
|
confirm: async (modal) => {
|
|
40
42
|
const selectedDevice = modal.getOption('selectedDevice');
|
|
41
43
|
if (!selectedDevice) return;
|
|
42
44
|
|
|
43
|
-
selectedDevice.setProperties({
|
|
44
|
-
attachable_uuid: this.args.resource.id,
|
|
45
|
-
attachable_type: `fleet-ops:${getModelName(this.args.resource)}`,
|
|
46
|
-
});
|
|
47
|
-
|
|
48
45
|
modal.startLoading();
|
|
49
46
|
|
|
50
47
|
try {
|
|
51
|
-
await selectedDevice.
|
|
48
|
+
await this.fetch.post(`vehicles/${this.args.resource.id}/attach-device`, { device: selectedDevice.id });
|
|
52
49
|
await this.loadDevices.perform();
|
|
53
|
-
this.notifications.success('
|
|
50
|
+
this.notifications.success(this.intl.t('device.prompts.attach-device-success'));
|
|
54
51
|
modal.done();
|
|
55
52
|
} catch (err) {
|
|
56
53
|
this.notifications.serverError(err);
|
|
@@ -61,18 +58,18 @@ export default class DeviceManagerComponent extends Component {
|
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
@action removeDevice(device) {
|
|
61
|
+
const deviceName = device.displayName ?? device.name ?? device.device_id ?? this.intl.t('resource.device');
|
|
62
|
+
|
|
64
63
|
this.modalsManager.confirm({
|
|
65
|
-
title:
|
|
66
|
-
body:
|
|
64
|
+
title: this.intl.t('device.prompts.detach-from-resource-title', { deviceName, resourceName: this.resourceName }),
|
|
65
|
+
body: this.intl.t('device.prompts.detach-from-resource-body', { deviceName, resourceName: this.resourceName, resourceType: getModelName(this.args.resource) }),
|
|
67
66
|
confirm: async (modal) => {
|
|
68
67
|
modal.startLoading();
|
|
69
68
|
|
|
70
|
-
device.setProperties({ attachable_uuid: null, attachable_type: null });
|
|
71
|
-
|
|
72
69
|
try {
|
|
73
|
-
await device.
|
|
70
|
+
await this.fetch.post(`vehicles/${this.args.resource.id}/detach-device`, { device: device.id });
|
|
74
71
|
await this.loadDevices.perform();
|
|
75
|
-
this.notifications.success('
|
|
72
|
+
this.notifications.success(this.intl.t('device.prompts.detach-from-resource-success', { deviceName, resourceName: this.resourceName }));
|
|
76
73
|
modal.done();
|
|
77
74
|
} catch (error) {
|
|
78
75
|
this.notifications.serverError(error);
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
</div>
|
|
33
33
|
<div class="field-info-container">
|
|
34
34
|
<div class="field-name">{{t "driver.fields.license-expiry"}}</div>
|
|
35
|
-
<div class="field-value">{{n-a @resource.license_expiry}}</div>
|
|
35
|
+
<div class="field-value">{{n-a (format-date-fns @resource.license_expiry)}}</div>
|
|
36
36
|
</div>
|
|
37
37
|
<div class="field-info-container">
|
|
38
38
|
<div class="field-name">{{t "resource.vendor"}}</div>
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
<div class="flex min-h-0 flex-1 flex-col" ...attributes>
|
|
2
|
+
<div class="min-h-0 flex-1 overflow-y-auto px-4 py-4 md:px-6">
|
|
3
|
+
<div class="mx-auto flex w-full max-w-6xl flex-col gap-4">
|
|
4
|
+
<section class="rounded-md border border-gray-200 bg-white p-3 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
5
|
+
<div class="grid grid-cols-1 gap-2 md:grid-cols-5">
|
|
6
|
+
{{#each this.setupSteps as |step index|}}
|
|
7
|
+
<button type="button" class="rounded-md border p-2 text-left transition {{if step.active 'border-blue-500 bg-blue-50 dark:border-blue-400 dark:bg-blue-500/10' 'border-gray-200 bg-white hover:border-gray-300 dark:border-gray-700 dark:bg-gray-800 dark:hover:border-gray-600'}}" {{on "click" (fn this.goToStep index)}}>
|
|
8
|
+
<div class="flex items-center gap-2">
|
|
9
|
+
<div class="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md text-xs {{if step.active 'bg-blue-600 text-white dark:bg-blue-500' (if step.complete 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300' 'bg-gray-100 text-gray-500 dark:bg-gray-700 dark:text-gray-300')}}">
|
|
10
|
+
<FaIcon @icon={{if step.complete "check" step.icon}} />
|
|
11
|
+
</div>
|
|
12
|
+
<div class="min-w-0">
|
|
13
|
+
<div class="text-[10px] font-semibold uppercase text-gray-400 dark:text-gray-500">{{add index 1}}</div>
|
|
14
|
+
<div class="truncate text-xs font-bold text-gray-900 dark:text-gray-100">{{step.label}}</div>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</button>
|
|
18
|
+
{{/each}}
|
|
19
|
+
</div>
|
|
20
|
+
</section>
|
|
21
|
+
|
|
22
|
+
{{#if (eq this.activeStep 0)}}
|
|
23
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
24
|
+
<div class="mb-3">
|
|
25
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Choose Fuel Integration</h2>
|
|
26
|
+
<p class="text-xs text-gray-500 dark:text-gray-300">Select the system to connect for fuel card bills, purchase transactions, station locations, or vehicle fuel identifiers.</p>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
{{#if this.loadProviders.isRunning}}
|
|
30
|
+
<div class="flex min-h-[140px] items-center justify-center"><Spinner /></div>
|
|
31
|
+
{{else}}
|
|
32
|
+
<div class="grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-4">
|
|
33
|
+
{{#each this.providerCards as |provider|}}
|
|
34
|
+
<button type="button" class="flex min-h-[148px] flex-col rounded-md border p-3 text-left transition {{if provider.selected 'border-blue-500 bg-blue-50 dark:border-blue-400 dark:bg-gray-800' 'border-gray-200 bg-white hover:border-blue-300 dark:border-gray-700 dark:bg-gray-800 dark:hover:border-blue-400'}}" {{on "click" (fn this.selectProvider provider)}}>
|
|
35
|
+
<div class="flex items-start justify-between gap-3">
|
|
36
|
+
<div class="flex min-w-0 items-center gap-2">
|
|
37
|
+
<div class="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-300">
|
|
38
|
+
<FaIcon @icon={{or provider.icon "gas-pump"}} />
|
|
39
|
+
</div>
|
|
40
|
+
<div class="min-w-0">
|
|
41
|
+
<div class="truncate text-sm font-bold text-gray-900 dark:text-gray-100">{{provider.label}}</div>
|
|
42
|
+
<div class="truncate text-[11px] uppercase text-gray-400 dark:text-gray-500">{{provider.categoryLabel}}</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
{{#if provider.selected}}
|
|
46
|
+
<Badge @status="success" @hideStatusDot={{true}}>Selected</Badge>
|
|
47
|
+
{{/if}}
|
|
48
|
+
</div>
|
|
49
|
+
<p class="mt-3 line-clamp-2 flex-1 text-xs leading-5 text-gray-500 dark:text-gray-300">{{provider.description}}</p>
|
|
50
|
+
<div class="mt-3 flex flex-wrap gap-1">
|
|
51
|
+
{{#each provider.capabilities as |capability|}}
|
|
52
|
+
<span class="rounded bg-gray-100 px-2 py-0.5 text-[11px] text-gray-600 dark:bg-gray-700 dark:text-gray-300">{{capability}}</span>
|
|
53
|
+
{{/each}}
|
|
54
|
+
</div>
|
|
55
|
+
</button>
|
|
56
|
+
{{/each}}
|
|
57
|
+
</div>
|
|
58
|
+
{{/if}}
|
|
59
|
+
</section>
|
|
60
|
+
{{else if (eq this.activeStep 1)}}
|
|
61
|
+
<section class="grid grid-cols-1 gap-4 lg:grid-cols-3">
|
|
62
|
+
<div 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">
|
|
63
|
+
<div class="mb-3">
|
|
64
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Credentials</h2>
|
|
65
|
+
<p class="text-xs text-gray-500 dark:text-gray-300">These credentials are stored on the connection and used to test and import provider transactions.</p>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
{{#if this.selectedProvider}}
|
|
69
|
+
<div class="grid grid-cols-1 gap-2 lg:grid-cols-2 no-input-group-padding text-xs">
|
|
70
|
+
{{#each this.selectedProvider.required_fields as |field|}}
|
|
71
|
+
<InputGroup @name={{field.label}} @value={{get @resource.credentials field.name}} @required={{field.required}} @type={{field.type}} @helpText={{field.help_text}} {{on "input" (fn this.setCredential field)}} />
|
|
72
|
+
{{/each}}
|
|
73
|
+
</div>
|
|
74
|
+
{{else}}
|
|
75
|
+
<div class="rounded-md border border-dashed border-gray-300 p-6 text-center text-xs text-gray-500 dark:border-gray-700 dark:text-gray-300">
|
|
76
|
+
Choose a fuel integration before entering credentials.
|
|
77
|
+
</div>
|
|
78
|
+
{{/if}}
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
{{#if this.selectedProvider}}
|
|
82
|
+
<aside class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
83
|
+
<div class="flex items-start gap-3">
|
|
84
|
+
<div class="flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-300">
|
|
85
|
+
<FaIcon @icon={{or this.selectedProvider.icon "gas-pump"}} />
|
|
86
|
+
</div>
|
|
87
|
+
<div class="min-w-0">
|
|
88
|
+
<div class="truncate text-sm font-bold text-gray-900 dark:text-gray-100">{{this.selectedProvider.label}}</div>
|
|
89
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">{{this.selectedProvider.description}}</p>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="mt-3 flex flex-wrap gap-2">
|
|
93
|
+
{{#each this.selectedProvider.capabilities as |capability|}}
|
|
94
|
+
<Badge @status="info" @hideStatusDot={{true}}>{{capability}}</Badge>
|
|
95
|
+
{{/each}}
|
|
96
|
+
</div>
|
|
97
|
+
</aside>
|
|
98
|
+
{{/if}}
|
|
99
|
+
</section>
|
|
100
|
+
{{else if (eq this.activeStep 2)}}
|
|
101
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
102
|
+
<div class="mb-3">
|
|
103
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Test Connection</h2>
|
|
104
|
+
<p class="text-xs text-gray-500 dark:text-gray-300">Confirm the provider accepts the credentials before saving this fuel integration.</p>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div class="rounded-md border p-4 text-xs transition {{if (eq this.connectionState 'success') 'border-green-200 bg-green-50 dark:border-green-800 dark:bg-green-900/10'}} {{if (eq this.connectionState 'failed') 'border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-900/10'}} {{if (eq this.connectionState 'testing') 'border-blue-200 bg-blue-50 dark:border-blue-800 dark:bg-blue-900/10'}} {{if (eq this.connectionState 'idle') 'border-dashed border-gray-300 bg-white dark:border-gray-700 dark:bg-gray-800'}}">
|
|
108
|
+
<div class="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
109
|
+
<div class="flex min-w-0 items-start gap-3">
|
|
110
|
+
<div class="flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md {{if (eq this.connectionState 'success') 'bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300'}} {{if (eq this.connectionState 'failed') 'bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300'}} {{if (eq this.connectionState 'testing') 'bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300 animate-pulse'}} {{if (eq this.connectionState 'idle') 'bg-gray-100 text-gray-500 dark:bg-gray-700 dark:text-gray-300'}}">
|
|
111
|
+
{{#if (eq this.connectionState "testing")}}<Spinner />{{else if (eq this.connectionState "success")}}<FaIcon @icon="check" />{{else if (eq this.connectionState "failed")}}<FaIcon @icon="triangle-exclamation" />{{else}}<FaIcon @icon="plug" />{{/if}}
|
|
112
|
+
</div>
|
|
113
|
+
<div class="min-w-0">
|
|
114
|
+
<div class="text-sm font-bold text-gray-900 dark:text-gray-100">{{this.connectionStateTitle}}</div>
|
|
115
|
+
<p class="mt-1 max-w-3xl text-xs leading-5 text-gray-600 dark:text-gray-300">{{this.connectionStateMessage}}</p>
|
|
116
|
+
{{#if this.connectionMetadataEntries.length}}
|
|
117
|
+
<div class="mt-3 flex flex-wrap gap-2">
|
|
118
|
+
{{#each this.connectionMetadataEntries as |item|}}
|
|
119
|
+
<span class="inline-flex items-center rounded-md border border-gray-200 bg-white px-2 py-1 text-[11px] text-gray-600 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300">
|
|
120
|
+
<span class="mr-1 font-semibold text-gray-900 dark:text-gray-100">{{item.label}}</span>
|
|
121
|
+
{{item.value}}
|
|
122
|
+
</span>
|
|
123
|
+
{{/each}}
|
|
124
|
+
</div>
|
|
125
|
+
{{/if}}
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<Button @icon="plug" @text={{if (eq this.connectionState "success") "Test Again" "Test Connection"}} @size="xs" @isLoading={{this.testConnection.isRunning}} @disabled={{this.testConnection.isRunning}} @onClick={{perform this.testConnection}} />
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="mt-4 border-t border-gray-200 pt-3 dark:border-gray-700">
|
|
133
|
+
<div class="flex flex-col gap-2 md:flex-row md:items-center md:justify-between">
|
|
134
|
+
<button type="button" class="inline-flex items-center gap-2 text-xs font-semibold text-blue-600 hover:text-blue-700 dark:text-blue-300 dark:hover:text-blue-200" {{on "click" (fn (mut this.showDiagnostics) (not this.showDiagnostics))}}>
|
|
135
|
+
<FaIcon @icon={{if this.showDiagnostics "chevron-up" "chevron-down"}} class="text-[10px]" />
|
|
136
|
+
<span>{{if this.showDiagnostics "Hide diagnostics" "Show diagnostics"}}</span>
|
|
137
|
+
</button>
|
|
138
|
+
|
|
139
|
+
{{#if this.showDiagnostics}}
|
|
140
|
+
<Button @icon="copy" @text="Copy diagnostics" @size="xs" @onClick={{this.copyDiagnostics}} />
|
|
141
|
+
{{/if}}
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
{{#if this.showDiagnostics}}
|
|
145
|
+
<div class="mt-3 max-h-56 overflow-y-auto rounded-md border border-gray-800 bg-gray-900 p-3 font-mono text-[11px] leading-5 shadow-inner dark:border-gray-700 dark:bg-gray-900">
|
|
146
|
+
{{#each this.diagnosticEntries as |entry|}}
|
|
147
|
+
<div class="flex gap-3 {{if (eq entry.tone 'success') 'text-green-300'}} {{if (eq entry.tone 'danger') 'text-red-300'}} {{if (eq entry.tone 'info') 'text-blue-300'}}">
|
|
148
|
+
<span class="flex-shrink-0 text-gray-500">[{{entry.time}}]</span>
|
|
149
|
+
<span class="min-w-0 break-words">{{entry.text}}</span>
|
|
150
|
+
</div>
|
|
151
|
+
{{/each}}
|
|
152
|
+
</div>
|
|
153
|
+
{{/if}}
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</section>
|
|
157
|
+
{{else if (eq this.activeStep 3)}}
|
|
158
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
159
|
+
<div class="mb-3">
|
|
160
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Sync Settings</h2>
|
|
161
|
+
<p class="text-xs text-gray-500 dark:text-gray-300">Choose how fuel transactions are imported from this system.</p>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<div class="grid grid-cols-1 gap-3 lg:grid-cols-2 no-input-group-padding text-xs">
|
|
165
|
+
<InputGroup @name="Integration name" @value={{@resource.name}} {{on "input" this.setName}} />
|
|
166
|
+
<InputGroup @name="Default sync window" @helpText="Number of days to import when no explicit date range is provided.">
|
|
167
|
+
<Input @type="number" min="1" max="90" class="form-input w-full" @value={{this.syncSettings.window_days}} {{on "input" (fn this.setSyncSetting "window_days")}} />
|
|
168
|
+
</InputGroup>
|
|
169
|
+
<div class="rounded-md border border-gray-200 p-3 dark:border-gray-700 lg:col-span-2">
|
|
170
|
+
<Checkbox @value={{this.syncSettings.auto_create_fuel_reports}} @label="Create Fuel Reports after vehicle match" @onToggle={{fn this.setSyncSetting "auto_create_fuel_reports"}} @alignItems="center" @labelClass="mb-0i" />
|
|
171
|
+
<p class="mt-2 text-xs leading-5 text-gray-500 dark:text-gray-300">Provider bills remain in Fuel Transactions. Fuel Reports are created only when a transaction is matched to a vehicle.</p>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</section>
|
|
175
|
+
{{else}}
|
|
176
|
+
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
177
|
+
<div class="mb-3">
|
|
178
|
+
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Vehicle Matching Priority</h2>
|
|
179
|
+
<p class="text-xs leading-5 text-gray-500 dark:text-gray-300">Choose which provider identifiers should be used for automatic matching and put the most reliable identifier first.</p>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<FuelIntegration::MatchingPriority @order={{this.matchingOrder}} @onChange={{this.setMatchingOrder}} @editable={{true}} />
|
|
183
|
+
</section>
|
|
184
|
+
{{/if}}
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div class="flex flex-shrink-0 items-center justify-between border-t border-gray-200 bg-white px-4 py-3 dark:border-gray-700 dark:bg-gray-900 md:px-6">
|
|
189
|
+
<div class="text-xs text-gray-500 dark:text-gray-300">{{@footerHelp}}</div>
|
|
190
|
+
<div class="flex items-center gap-2">
|
|
191
|
+
<Button @icon="arrow-left" @text="Back" @size="sm" @disabled={{eq this.activeStep 0}} @onClick={{this.previousStep}} />
|
|
192
|
+
{{#if (eq this.activeStep 4)}}
|
|
193
|
+
<Button @icon="save" @text={{@saveLabel}} @type="primary" @size="sm" @isLoading={{@isSaving}} @disabled={{@isSaving}} @onClick={{@onSave}} />
|
|
194
|
+
{{else}}
|
|
195
|
+
<Button @icon="arrow-right" @text="Next" @type="primary" @size="sm" @onClick={{this.nextStep}} />
|
|
196
|
+
{{/if}}
|
|
197
|
+
<Button @icon="times" @text="Cancel" @size="sm" @onClick={{@onCancel}} />
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|