@fleetbase/fleetops-engine 0.6.50 → 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 +183 -67
- 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/contact/panel-header.hbs +11 -48
- package/addon/components/customer/details.hbs +1 -2
- package/addon/components/customer/form.hbs +63 -51
- package/addon/components/customer/form.js +27 -1
- package/addon/components/customer/orders.hbs +48 -0
- package/addon/components/customer/orders.js +67 -5
- 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/driver/form.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/home/getting-started-guidance.hbs +113 -0
- package/addon/components/home/getting-started-guidance.js +107 -0
- package/addon/components/issue/details/comments.hbs +3 -0
- package/addon/components/issue/details/comments.js +3 -0
- package/addon/components/issue/details/correspondence.hbs +9 -0
- package/addon/components/issue/details/correspondence.js +83 -0
- package/addon/components/issue/details/documents.hbs +69 -0
- package/addon/components/issue/details/documents.js +85 -0
- package/addon/components/issue/details.hbs +166 -59
- package/addon/components/issue/details.js +149 -0
- package/addon/components/issue/form.hbs +19 -1
- package/addon/components/issue/panel-header.hbs +43 -0
- package/addon/components/issue/panel-header.js +22 -0
- package/addon/components/issue/timeline.hbs +40 -0
- package/addon/components/issue/timeline.js +45 -0
- package/addon/components/layout/fleet-ops-sidebar.js +20 -2
- package/addon/components/leaflet-tracking-marker.js +3 -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/position-listing.js +3 -0
- package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
- package/addon/components/map/leaflet-live-map.hbs +2 -2
- package/addon/components/map/leaflet-live-map.js +17 -0
- package/addon/components/map/order-list-overlay.hbs +4 -4
- 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/convert-customer-to-vendor.hbs +30 -0
- package/addon/components/modals/convert-customer-to-vendor.js +55 -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/issue-assign.hbs +20 -0
- package/addon/components/modals/issue-assign.js +49 -0
- package/addon/components/modals/issue-close.hbs +30 -0
- package/addon/components/modals/issue-close.js +73 -0
- package/addon/components/modals/issue-status.hbs +20 -0
- package/addon/components/modals/issue-status.js +43 -0
- package/addon/components/modals/reset-customer-credentials.js +12 -6
- package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
- package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
- package/addon/components/modals/update-order-activity.hbs +51 -17
- package/addon/components/modals/update-order-activity.js +59 -5
- 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/details/activity.js +2 -2
- package/addon/components/order/details/proof.hbs +40 -38
- package/addon/components/order/details/proof.js +31 -4
- package/addon/components/order/details.hbs +5 -5
- package/addon/components/order/details.js +19 -1
- package/addon/components/order/form/service-rate.hbs +2 -0
- package/addon/components/order/header.hbs +1 -1
- package/addon/components/route-list.hbs +0 -12
- package/addon/components/service-rate/details.hbs +1 -1
- package/addon/components/service-rate/form.hbs +4 -3
- package/addon/components/service-rate/form.js +4 -0
- 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/vendor/personnel-manager.hbs +166 -0
- package/addon/components/vendor/personnel-manager.js +143 -0
- package/addon/components/widget/fuel-providers.hbs +43 -0
- package/addon/components/widget/fuel-providers.js +27 -0
- package/addon/components/widget/live-fleet.hbs +1 -0
- package/addon/components/widget/live-fleet.js +2 -7
- package/addon/components/widget/revenue-trend.hbs +1 -1
- package/addon/components/widget/revenue-trend.js +75 -2
- 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/contacts/customers/details.js +31 -13
- package/addon/controllers/management/contacts/customers.js +16 -5
- package/addon/controllers/management/contacts/index/details.js +31 -13
- package/addon/controllers/management/contacts/index.js +7 -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/issues/index/details.js +52 -6
- package/addon/controllers/management/vehicles/index/details.js +32 -0
- package/addon/controllers/management/vehicles/index.js +26 -0
- package/addon/controllers/management/vendors/index/details.js +4 -0
- package/addon/controllers/operations/orders/index/details.js +11 -3
- package/addon/controllers/operations/orders/index.js +5 -1
- package/addon/controllers/settings/payments/index.js +5 -0
- package/addon/extension.js +29 -12
- package/addon/helpers/format-duration.js +1 -38
- package/addon/initializers/load-leaflet-assets.js +5 -6
- package/addon/initializers/patch-ember-leaflet-tooltip-layer.js +51 -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/management/issues/index/details.js +1 -1
- package/addon/routes.js +29 -9
- package/addon/services/contact-actions.js +231 -1
- 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/getting-started.js +44 -0
- package/addon/services/issue-actions.js +72 -1
- package/addon/services/leaflet-map-manager.js +2 -0
- package/addon/services/map-adapter/leaflet.js +19 -0
- package/addon/services/service-areas.js +3 -0
- package/addon/services/telematic-actions.js +9 -3
- package/addon/services/vehicle-actions.js +125 -0
- package/addon/styles/fleetops-engine.css +1313 -1
- 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/details.hbs +1 -1
- package/addon/templates/management/contacts/customers.hbs +15 -1
- package/addon/templates/management/contacts/index/details.hbs +1 -1
- package/addon/templates/management/contacts/index.hbs +19 -1
- package/addon/templates/management/contacts.hbs +2 -2
- 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/details/index.hbs +3 -1
- package/addon/templates/management/issues/index/details.hbs +3 -2
- 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/details/personnel.hbs +1 -2
- package/addon/templates/management/vendors/index.hbs +19 -1
- package/addon/templates/management/vendors/integrated.hbs +13 -1
- package/addon/templates/operations/orders/index/details/index.hbs +2 -2
- package/addon/templates/operations/orders/index.hbs +20 -2
- package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
- package/addon/templates/operations/service-rates/index/new.hbs +1 -0
- package/addon/templates/operations/service-rates/index.hbs +19 -1
- package/addon/templates/settings/payments/index.hbs +15 -1
- package/addon/templates/settings/payments/onboard.hbs +8 -8
- package/addon/utils/fleet-ops-options.js +3 -0
- package/addon/utils/leaflet-draw-namespace-guard.js +22 -0
- package/addon/utils/leaflet-plugin-loader.js +219 -0
- package/addon/utils/setup-customer-portal.js +4 -64
- 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/home/getting-started-guidance.js +1 -0
- package/app/components/issue/details/comments.js +1 -0
- package/app/components/issue/details/correspondence.js +1 -0
- package/app/components/issue/details/documents.js +1 -0
- package/app/components/issue/panel-header.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/convert-customer-to-vendor.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/issue-assign.js +1 -0
- package/app/components/modals/issue-close.js +1 -0
- package/app/components/modals/issue-status.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/vendor/personnel-manager.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/helpers/format-duration.js +1 -1
- 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/services/getting-started.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/app/utils/leaflet-draw-namespace-guard.js +1 -0
- package/app/utils/leaflet-plugin-loader.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 +5 -5
- package/server/config/fuel-providers.php +42 -0
- package/server/config/telematics.php +139 -130
- package/server/migrations/2026_05_31_000001_add_portal_fields_to_vendor_personnels_table.php +30 -0
- package/server/migrations/2026_06_03_000000_ensure_tags_column_on_issues_table.php +31 -0
- package/server/migrations/2026_06_03_000001_add_order_uuid_to_issues_table.php +25 -0
- package/server/migrations/2026_06_04_000001_backfill_order_transaction_subjects.php +39 -0
- package/server/migrations/2026_06_04_000002_backfill_order_transaction_directions.php +24 -0
- 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/resources/views/mail/customer-credentials.blade.php +16 -13
- 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/Expansions/UserFilterExpansion.php +28 -0
- package/server/src/Http/Controllers/Api/v1/IssueController.php +2 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +26 -25
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +10 -58
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +135 -0
- package/server/src/Http/Controllers/Internal/v1/CustomerController.php +116 -6
- 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/GettingStartedController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/IssueController.php +251 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +172 -97
- package/server/src/Http/Controllers/Internal/v1/PlaceController.php +10 -68
- 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/Internal/v1/VendorController.php +89 -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/Requests/CreateIssueRequest.php +4 -0
- package/server/src/Http/Requests/UpdateIssueRequest.php +4 -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/Order.php +12 -9
- package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
- package/server/src/Http/Resources/v1/Issue.php +25 -0
- package/server/src/Http/Resources/v1/Order.php +20 -18
- 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/Mail/CustomerCredentialsMail.php +5 -6
- package/server/src/Models/Asset.php +2 -1
- package/server/src/Models/Contact.php +32 -52
- 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/Issue.php +47 -6
- package/server/src/Models/Order.php +33 -6
- package/server/src/Models/Part.php +2 -1
- package/server/src/Models/Sensor.php +21 -4
- package/server/src/Models/ServiceArea.php +1 -1
- 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/Models/VendorPersonnel.php +10 -1
- package/server/src/Models/Zone.php +1 -1
- package/server/src/Observers/PurchaseRateObserver.php +20 -0
- package/server/src/Observers/ZoneObserver.php +56 -0
- package/server/src/Providers/FleetOpsServiceProvider.php +11 -0
- package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
- package/server/src/Support/Analytics/TopDrivers.php +9 -1
- 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/GettingStarted.php +144 -0
- package/server/src/Support/PlaceSearch.php +282 -0
- package/server/src/Support/ResolvesOrderServiceStops.php +22 -12
- 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 +74 -5
- package/server/tests/AnalyticsRoutesTest.php +8 -0
- package/server/tests/CustomerContactIdentitySafetyTest.php +41 -0
- package/server/tests/DriverVehicleStatusDefaultTest.php +2 -2
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/GettingStartedStatusTest.php +21 -0
- package/server/tests/OrderActivityFlowRegressionTest.php +116 -0
- package/server/tests/ServiceAreaZoneApiShapeTest.php +44 -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 +31 -0
- package/translations/bg-bg.yaml +81 -0
- package/translations/en-us.yaml +94 -0
- package/translations/es-pa.yaml +81 -0
- package/translations/fr-fr.yaml +81 -0
- package/translations/mn-mn.yaml +81 -0
- package/translations/pt-br.yaml +81 -0
- package/translations/ru-ru.yaml +81 -0
- package/translations/vi-vn.yaml +106 -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
|
@@ -1,122 +1,238 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/fleetbase-logo-svg.svg" width="380" height="100"
|
|
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
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
Open-source fleet, dispatch, transport management, and real-time logistics operations for Fleetbase.
|
|
7
|
+
</p>
|
|
8
|
+
|
|
4
9
|
<p align="center">
|
|
5
|
-
|
|
10
|
+
<a href="https://github.com/fleetbase/fleetops">
|
|
11
|
+
<img src="https://img.shields.io/badge/repo-fleetbase%2Ffleetops-111827?style=flat-square" alt="Repository">
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://github.com/fleetbase/fleetops/blob/master/LICENSE.md">
|
|
14
|
+
<img src="https://img.shields.io/badge/license-AGPL--3.0--or--later-blue?style=flat-square" alt="License: AGPL-3.0-or-later">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/@fleetbase/fleetops-engine">
|
|
17
|
+
<img src="https://img.shields.io/badge/npm-%40fleetbase%2Ffleetops--engine-CB3837?style=flat-square" alt="NPM package">
|
|
18
|
+
</a>
|
|
19
|
+
<a href="https://packagist.org/packages/fleetbase/fleetops-api">
|
|
20
|
+
<img src="https://img.shields.io/badge/packagist-fleetbase%2Ffleetops--api-F28D1A?style=flat-square" alt="Packagist package">
|
|
21
|
+
</a>
|
|
22
|
+
<a href="https://www.fleetbase.io/docs/fleet-ops">
|
|
23
|
+
<img src="https://img.shields.io/badge/docs-fleet--ops-0EA5E9?style=flat-square" alt="Fleet-Ops documentation">
|
|
24
|
+
</a>
|
|
25
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18-339933?style=flat-square" alt="Node >= 18">
|
|
26
|
+
<img src="https://img.shields.io/badge/php-%5E8.0-777BB4?style=flat-square" alt="PHP ^8.0">
|
|
6
27
|
</p>
|
|
7
28
|
|
|
8
|
-
|
|
29
|
+
<p align="center">
|
|
30
|
+
<img src="https://www.fleetbase.io/images/screenshots/fleet-ops/fleet-ops-multi-waypoint-order.webp" alt="Fleet-Ops multi-waypoint order with live map, route, driver assignment, and order details" width="900">
|
|
31
|
+
</p>
|
|
9
32
|
|
|
10
|
-
##
|
|
33
|
+
## What is Fleet-Ops?
|
|
11
34
|
|
|
12
|
-
|
|
35
|
+
Fleet-Ops is the core logistics and fleet management extension for the [Fleetbase](https://www.fleetbase.io) platform. It gives operations teams a dispatch console for managing orders, drivers, vehicles, fleets, service areas, live maps, route execution, analytics, maintenance, and connected telematics.
|
|
13
36
|
|
|
14
|
-
|
|
37
|
+
Fleet-Ops ships as two packages:
|
|
15
38
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
39
|
+
| Package | Purpose |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `@fleetbase/fleetops-engine` | Ember Engine/Add-on that powers the Fleet-Ops console UI. |
|
|
42
|
+
| `fleetbase/fleetops-api` | Laravel/PHP package that provides the Fleet-Ops API, models, jobs, events, and integrations. |
|
|
20
43
|
|
|
21
|
-
|
|
44
|
+
Fleet-Ops is included with Fleetbase Cloud and self-hosted Fleetbase installations. For product concepts, workflows, and setup guides, start with the [Fleet-Ops documentation](https://www.fleetbase.io/docs/fleet-ops).
|
|
22
45
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
### Operations
|
|
49
|
+
|
|
50
|
+
- Create, import, schedule, dispatch, start, cancel, and complete delivery orders.
|
|
51
|
+
- Manage multi-waypoint routes, payloads, entities, labels, order metadata, notes, comments, files, and proofs.
|
|
52
|
+
- Track live order progress with ETAs, route overlays, driver pings, activity timelines, and configurable status flows.
|
|
53
|
+
- Configure custom order types, activity flows, entity fields, proof requirements, and service-rate rules.
|
|
54
|
+
- Run orchestration workflows for order allocation, driver assignment, vehicle capacity, and route sequencing.
|
|
55
|
+
- Plan work with the scheduler, fleet schedule, service quotes, routes, manifests, and manifest stops.
|
|
56
|
+
|
|
57
|
+
### Live Map
|
|
58
|
+
|
|
59
|
+
- View live drivers, vehicles, active orders, routes, places, service areas, zones, and geofences.
|
|
60
|
+
- Filter and inspect operational layers with Fleet-Ops map controls and drawer panels.
|
|
61
|
+
- Support Leaflet-based and Google-based map experiences through Fleetbase map settings.
|
|
62
|
+
- Capture positions, replay movement, track vehicles and drivers, and surface geofence events.
|
|
63
|
+
|
|
64
|
+
### Fleet Management
|
|
65
|
+
|
|
66
|
+
- Manage drivers, vehicles, fleets, places, contacts, customers, vendors, and integrated vendors.
|
|
67
|
+
- Assign drivers and vehicles to fleets, vendors, and orders.
|
|
68
|
+
- Track driver schedules, availability, positions, active shifts, and hours-of-service status.
|
|
69
|
+
- Track vehicle status, devices, positions, equipment, schedules, work orders, and maintenance history.
|
|
70
|
+
- Manage issues, fuel reports, imports, exports, bulk actions, and custom resource fields.
|
|
71
|
+
|
|
72
|
+
### Maintenance
|
|
73
|
+
|
|
74
|
+
- Define preventive maintenance schedules and calendar feeds.
|
|
75
|
+
- Manage work orders, maintenance records, line items, equipment, parts, and warranties.
|
|
76
|
+
- Send work orders, trigger schedule runs, pause and resume schedules, and review maintenance history.
|
|
77
|
+
|
|
78
|
+
### Connectivity
|
|
79
|
+
|
|
80
|
+
- Connect telematics providers, devices, sensors, events, and tracking data.
|
|
81
|
+
- Discover and link telematics devices, test provider credentials, and receive telematics webhooks.
|
|
82
|
+
- Use Fleet-Ops tracking providers for calculated, OSRM, and Google Routes-backed route intelligence.
|
|
83
|
+
|
|
84
|
+
### Analytics and Dashboards
|
|
85
|
+
|
|
86
|
+
- Use Fleet-Ops KPI widgets for earnings, average order value, distance, active orders, online drivers, and open issues.
|
|
87
|
+
- Review analytics for operations pulse, live fleet, revenue trends, order status volume, on-time delivery, top drivers, fuel efficiency, issues, maintenance, and geofence violations.
|
|
88
|
+
- Create and view reports from the Fleet-Ops analytics workspace.
|
|
89
|
+
|
|
90
|
+
### Settings and Extensions
|
|
91
|
+
|
|
92
|
+
- Configure Navigator app onboarding, routing, tracking, map providers, notifications, scheduling, payments, orchestrator settings, custom fields, and avatars.
|
|
93
|
+
- Expose Fleet-Ops order tracking on the Fleetbase login surface.
|
|
94
|
+
- Integrate Fleet-Ops entities into other Fleetbase extensions through registered components and virtual detail tabs.
|
|
95
|
+
|
|
96
|
+
## Architecture
|
|
97
|
+
|
|
98
|
+
Fleet-Ops follows the Fleetbase extension architecture: an Ember Engine for the console interface and a Laravel package for API and backend capabilities.
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
fleetops/
|
|
102
|
+
+-- addon/ # Ember Engine source: routes, controllers, components, services, templates
|
|
103
|
+
+-- app/ # Ember app re-exports and integration points
|
|
104
|
+
+-- assets/ # Frontend assets bundled with the engine
|
|
105
|
+
+-- translations/ # Fleet-Ops locale files
|
|
106
|
+
+-- server/
|
|
107
|
+
| +-- config/ # Fleet-Ops API configuration
|
|
108
|
+
| +-- migrations/ # Database migrations
|
|
109
|
+
| +-- resources/ # Backend views and resources
|
|
110
|
+
| +-- seeders/ # Seed data
|
|
111
|
+
| +-- src/ # Controllers, models, jobs, events, support services, providers
|
|
112
|
+
| +-- tests/ # Backend test suite
|
|
113
|
+
+-- tests/ # Ember test suite
|
|
114
|
+
+-- package.json # Frontend package metadata and scripts
|
|
115
|
+
+-- composer.json # Backend package metadata and scripts
|
|
50
116
|
```
|
|
51
117
|
|
|
52
|
-
|
|
118
|
+
Core frontend dependencies include Ember Octane, Ember Engines, Fleetbase Ember Core, Fleetbase UI, Fleet-Ops Data, Leaflet, Leaflet Draw, Turf, JointJS, and Stripe Connect. Core backend capabilities are provided by Laravel, Fleetbase Core API, Fleet-Ops models/controllers, orchestration engines, tracking providers, analytics, notifications, jobs, and telematics integrations.
|
|
53
119
|
|
|
54
|
-
|
|
120
|
+
## Getting Started
|
|
55
121
|
|
|
56
|
-
|
|
122
|
+
Fleet-Ops comes pre-installed with Fleetbase Cloud and standard self-hosted Fleetbase installations. If you are setting up the Fleetbase platform itself, use the Fleetbase documentation:
|
|
123
|
+
|
|
124
|
+
- [Fleet-Ops documentation](https://www.fleetbase.io/docs/fleet-ops)
|
|
125
|
+
- [Fleetbase documentation](https://www.fleetbase.io/docs)
|
|
126
|
+
- [Fleetbase console](https://console.fleetbase.io)
|
|
127
|
+
|
|
128
|
+
When developing Fleet-Ops from source, install both frontend and backend dependencies:
|
|
57
129
|
|
|
58
130
|
```bash
|
|
59
|
-
|
|
60
|
-
composer
|
|
131
|
+
pnpm install
|
|
132
|
+
composer install
|
|
61
133
|
```
|
|
62
|
-
### Frontend
|
|
63
134
|
|
|
64
|
-
|
|
135
|
+
### Link Fleet-Ops into Fleetbase
|
|
136
|
+
|
|
137
|
+
When working from the Fleetbase monorepo, use the Fleetbase package linker to connect this local package to the running Console and API applications. From the Fleetbase repository root:
|
|
65
138
|
|
|
66
139
|
```bash
|
|
67
|
-
|
|
140
|
+
flb-package-linker enable fleetops
|
|
141
|
+
flb-package-linker install fleetops
|
|
68
142
|
```
|
|
69
143
|
|
|
70
|
-
|
|
144
|
+
This links the local Fleet-Ops Ember engine and Laravel package so Console and API use your source checkout instead of the published packages. See the [Fleetbase development setup guide](https://www.fleetbase.io/docs/platform/quickstart/development-setup) for the full package-linking workflow, Docker setup, Octane reload notes, and frontend hot-reload options.
|
|
145
|
+
|
|
146
|
+
### Link Fleet-Ops Data
|
|
71
147
|
|
|
72
|
-
|
|
148
|
+
Fleet-Ops also depends on the shared `@fleetbase/fleetops-data` package. That package contains Fleet-Ops Ember Data models, adapters, and serializers, and can be reused by other Fleetbase modules that need to read or write Fleet-Ops resources without duplicating data-layer definitions.
|
|
149
|
+
|
|
150
|
+
If you are changing shared Fleet-Ops data models or consuming them from another extension, link `fleetops-data` through the root Console workspace:
|
|
73
151
|
|
|
74
|
-
🧹 Keep a modern codebase with **PHP CS Fixer**:
|
|
75
152
|
```bash
|
|
76
|
-
|
|
153
|
+
flb-package-linker enable-shared fleetops-data
|
|
154
|
+
flb-package-linker install
|
|
77
155
|
```
|
|
78
156
|
|
|
79
|
-
|
|
157
|
+
For broader Fleet-Ops frontend work, you may also link the common shared Ember packages used by Fleetbase:
|
|
158
|
+
|
|
80
159
|
```bash
|
|
81
|
-
|
|
160
|
+
flb-package-linker enable fleetops --shared ember-core ember-ui fleetops-data
|
|
161
|
+
flb-package-linker install fleetops
|
|
82
162
|
```
|
|
83
163
|
|
|
84
|
-
|
|
164
|
+
## Development
|
|
165
|
+
|
|
166
|
+
Start the Ember Engine in development mode:
|
|
167
|
+
|
|
85
168
|
```bash
|
|
86
|
-
|
|
169
|
+
pnpm start
|
|
87
170
|
```
|
|
88
171
|
|
|
89
|
-
|
|
172
|
+
Build the production frontend bundle:
|
|
173
|
+
|
|
90
174
|
```bash
|
|
91
|
-
|
|
175
|
+
pnpm build
|
|
92
176
|
```
|
|
93
177
|
|
|
94
|
-
|
|
178
|
+
Run frontend linting:
|
|
95
179
|
|
|
96
|
-
🧹 Keep a modern codebase with **ESLint**:
|
|
97
180
|
```bash
|
|
98
181
|
pnpm lint
|
|
99
182
|
```
|
|
100
183
|
|
|
101
|
-
|
|
184
|
+
Run backend linting:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
composer test:lint
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Testing
|
|
191
|
+
|
|
192
|
+
Run the Ember/QUnit test suite:
|
|
193
|
+
|
|
102
194
|
```bash
|
|
103
|
-
pnpm test
|
|
104
195
|
pnpm test:ember
|
|
105
|
-
pnpm test:ember-compatibility
|
|
106
196
|
```
|
|
107
197
|
|
|
108
|
-
|
|
198
|
+
Run the full frontend check suite:
|
|
199
|
+
|
|
109
200
|
```bash
|
|
110
|
-
pnpm
|
|
201
|
+
pnpm test
|
|
111
202
|
```
|
|
112
203
|
|
|
113
|
-
|
|
204
|
+
Run the backend test suite:
|
|
205
|
+
|
|
114
206
|
```bash
|
|
115
|
-
|
|
207
|
+
composer test
|
|
116
208
|
```
|
|
117
209
|
|
|
210
|
+
Run backend checks individually:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
composer test:lint
|
|
214
|
+
composer test:types
|
|
215
|
+
composer test:unit
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Documentation
|
|
219
|
+
|
|
220
|
+
- [Fleet-Ops docs](https://www.fleetbase.io/docs/fleet-ops)
|
|
221
|
+
- [Fleet-Ops quickstart](https://www.fleetbase.io/docs/fleet-ops/getting-started/quickstart)
|
|
222
|
+
- [Fleet-Ops core concepts](https://www.fleetbase.io/docs/fleet-ops/getting-started/core-concepts)
|
|
223
|
+
- [Navigator app setup](https://www.fleetbase.io/docs/fleet-ops/getting-started/navigator-app-setup)
|
|
224
|
+
- [Fleetbase docs](https://www.fleetbase.io/docs)
|
|
225
|
+
|
|
118
226
|
## Contributing
|
|
119
|
-
|
|
227
|
+
|
|
228
|
+
Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
|
|
229
|
+
|
|
230
|
+
Useful project files:
|
|
231
|
+
|
|
232
|
+
- [package.json](package.json) for frontend scripts and package metadata.
|
|
233
|
+
- [composer.json](composer.json) for backend scripts and package metadata.
|
|
234
|
+
- [extension.json](extension.json) for Fleetbase extension metadata.
|
|
120
235
|
|
|
121
236
|
## License
|
|
122
|
-
|
|
237
|
+
|
|
238
|
+
Fleet-Ops is open-source software licensed under the [GNU Affero General Public License v3.0 or later](LICENSE.md).
|
|
@@ -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
|
+
}
|
|
@@ -13,55 +13,18 @@
|
|
|
13
13
|
</div>
|
|
14
14
|
</div>
|
|
15
15
|
<div class="next-view-header-right">
|
|
16
|
-
<
|
|
16
|
+
<Layout::Resource::Panel::HeaderActions
|
|
17
|
+
@resource={{@resource}}
|
|
18
|
+
@saveTask={{@saveTask}}
|
|
19
|
+
@saveOptions={{@saveOptions}}
|
|
20
|
+
@saveDisabled={{@saveDisabled}}
|
|
21
|
+
@pojoResource={{@pojoResource}}
|
|
22
|
+
@authSchema={{@authSchema}}
|
|
23
|
+
@actionButtons={{@actionButtons}}
|
|
24
|
+
@onPressCancel={{@onPressCancel}}
|
|
25
|
+
>
|
|
17
26
|
{{yield}}
|
|
18
|
-
|
|
19
|
-
<Button
|
|
20
|
-
@type="primary"
|
|
21
|
-
@icon={{if @resource.isNew "check" "save"}}
|
|
22
|
-
@text={{if @resource.isNew (concat "Create " this.modelName) "Save Changes"}}
|
|
23
|
-
@onClick={{perform @saveTask @resource}}
|
|
24
|
-
@disabled={{cannot-write @resource schema=@authSchema}}
|
|
25
|
-
@isLoading={{@saveTask.isRunning}}
|
|
26
|
-
/>
|
|
27
|
-
{{/if}}
|
|
28
|
-
{{#each @actionButtons as |actionButton|}}
|
|
29
|
-
<Button
|
|
30
|
-
@type={{actionButton.type}}
|
|
31
|
-
@text={{actionButton.text}}
|
|
32
|
-
@onClick={{if actionButton.perform (perform actionButton.perform) (or actionButton.onClick actionButton.fn)}}
|
|
33
|
-
@size={{actionButton.size}}
|
|
34
|
-
@buttonType={{actionButton.buttonType}}
|
|
35
|
-
@disabled={{actionButton.disabled}}
|
|
36
|
-
@exampleText={{actionButton.exampleText}}
|
|
37
|
-
@helpText={{actionButton.helpText}}
|
|
38
|
-
@icon={{actionButton.icon}}
|
|
39
|
-
@iconClass={{actionButton.iconClass}}
|
|
40
|
-
@iconFlip={{actionButton.iconFlip}}
|
|
41
|
-
@iconPrefix={{actionButton.iconPrefix}}
|
|
42
|
-
@iconRotation={{actionButton.iconRotation}}
|
|
43
|
-
@iconSize={{actionButton.iconSize}}
|
|
44
|
-
@isLoading={{actionButton.isLoading}}
|
|
45
|
-
@outline={{actionButton.outline}}
|
|
46
|
-
@permission={{actionButton.permission}}
|
|
47
|
-
@wrapperClass={{actionButton.wrapperClass}}
|
|
48
|
-
@textClass={{actionButton.textClass}}
|
|
49
|
-
@tooltipPlacement={{actionButton.tooltipPlacement}}
|
|
50
|
-
@visible={{actionButton.visible}}
|
|
51
|
-
/>
|
|
52
|
-
{{/each}}
|
|
53
|
-
{{#if @onPressCancel}}
|
|
54
|
-
<button
|
|
55
|
-
type="button"
|
|
56
|
-
class="next-content-overlay-panel-cancel-button {{@cancelButtonClass}}"
|
|
57
|
-
{{set-height @cancelButtonHeight}}
|
|
58
|
-
{{set-width @cancelButtonWidth}}
|
|
59
|
-
{{on "click" @onPressCancel}}
|
|
60
|
-
>
|
|
61
|
-
<FaIcon @icon={{or @cancelIcon "times"}} @size={{@iconSize}} @prefix={{or @iconPrefix "fas"}} class={{@iconClass}} />
|
|
62
|
-
</button>
|
|
63
|
-
{{/if}}
|
|
64
|
-
</div>
|
|
27
|
+
</Layout::Resource::Panel::HeaderActions>
|
|
65
28
|
</div>
|
|
66
29
|
</div>
|
|
67
30
|
</div>
|
|
@@ -1,53 +1,4 @@
|
|
|
1
1
|
<div class="form-wrapper" ...attributes>
|
|
2
|
-
<ContentPanel @title={{t "customer.fields.user-account"}} @open={{true}} @actionButtons={{this.userAccountActionButtons}} @wrapperClass="bordered-top">
|
|
3
|
-
<div class="space-y-2">
|
|
4
|
-
<InputGroup @name={{t "customer.fields.user-account"}} @helpText={{t "customer.fields.user-account-help-text"}}>
|
|
5
|
-
<ModelSelect
|
|
6
|
-
@modelName="user"
|
|
7
|
-
@selectedModel={{@resource.user}}
|
|
8
|
-
@placeholder={{t "customer.fields.select-user"}}
|
|
9
|
-
@query={{hash doesnt_have_contact=true is_customer=true}}
|
|
10
|
-
@triggerClass="form-select form-input"
|
|
11
|
-
@infiniteScroll={{false}}
|
|
12
|
-
@renderInPlace={{true}}
|
|
13
|
-
@onChange={{fn (mut @resource.user)}}
|
|
14
|
-
@permission="fleet-ops update-user-for customer"
|
|
15
|
-
as |model|
|
|
16
|
-
>
|
|
17
|
-
<div class="flex flex-row">
|
|
18
|
-
<div class="mr-2 w-6">
|
|
19
|
-
<Image src={{model.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-6 h-6 rounded-md" />
|
|
20
|
-
</div>
|
|
21
|
-
<div class="flex flex-col">
|
|
22
|
-
<div class="font-semibold">{{model.name}}</div>
|
|
23
|
-
<div class="text-xs flex flex-row items-center leading-4">
|
|
24
|
-
<FaIcon @icon="envelope" @size="sm" class="mr-1 opacity-75" />
|
|
25
|
-
<span>{{n-a model.email}}</span>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="text-xs flex flex-row items-center leading-4">
|
|
28
|
-
<FaIcon @icon="phone" @size="sm" class="mr-1 opacity-75" />
|
|
29
|
-
<span>{{n-a model.phone}}</span>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</ModelSelect>
|
|
34
|
-
</InputGroup>
|
|
35
|
-
{{#if @resource.user}}
|
|
36
|
-
<div class="grid grid-cols-1 lg:grid-cols-2 gap-2 no-input-group-padding">
|
|
37
|
-
<InputGroup @name={{t "common.name"}} @wrapperClass="col-span-2 mb-0i">
|
|
38
|
-
<Input @value={{@resource.user.name}} @type="text" class="w-full form-input" placeholder={{t "common.name"}} disabled={{true}} />
|
|
39
|
-
</InputGroup>
|
|
40
|
-
<InputGroup @name={{t "common.email"}} @wrapperClass="mb-0i">
|
|
41
|
-
<Input @value={{@resource.user.email}} @type="text" class="w-full form-input" placeholder={{t "common.email"}} disabled={{true}} />
|
|
42
|
-
</InputGroup>
|
|
43
|
-
<InputGroup @name={{t "common.phone"}} @wrapperClass="mb-0i">
|
|
44
|
-
<PhoneInput @value={{@resource.user.phone}} @onInput={{fn (mut @resource.phone)}} class="form-input w-full" disabled={{true}} />
|
|
45
|
-
</InputGroup>
|
|
46
|
-
</div>
|
|
47
|
-
{{/if}}
|
|
48
|
-
</div>
|
|
49
|
-
</ContentPanel>
|
|
50
|
-
|
|
51
2
|
<ContentPanel @title={{t "customer.fields.customer-details"}} @open={{true}} @wrapperClass="bordered-top">
|
|
52
3
|
<div class="flex flex-row space-x-3 mb-3">
|
|
53
4
|
<div class="flex items-center justify-start rounded-full">
|
|
@@ -125,20 +76,81 @@
|
|
|
125
76
|
as |model|
|
|
126
77
|
>
|
|
127
78
|
<div class="flex items-center flex-row justify-between">
|
|
128
|
-
<div class="truncate flex-1">{{
|
|
79
|
+
<div class="truncate flex-1">{{place-address-html model}}</div>
|
|
129
80
|
<Badge @hideStatusDot={{true}} @status="info">{{model.public_id}}</Badge>
|
|
130
81
|
</div>
|
|
131
82
|
</ModelSelect>
|
|
132
83
|
</InputGroup>
|
|
84
|
+
{{#if this.showWelcomeEmailOption}}
|
|
85
|
+
<div class="col-span-2 mt-3">
|
|
86
|
+
<Checkbox
|
|
87
|
+
@value={{this.sendWelcomeEmail}}
|
|
88
|
+
@label={{t "customer.fields.send-welcome-email"}}
|
|
89
|
+
@helpText={{t "customer.fields.send-welcome-email-help-text"}}
|
|
90
|
+
@onToggle={{this.toggleWelcomeEmail}}
|
|
91
|
+
@alignItems="center"
|
|
92
|
+
@labelClass="mb-0i"
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
{{/if}}
|
|
133
96
|
<RegistryYield @registry="fleet-ops:component:customer:form:details" as |RegistryComponent|>
|
|
134
97
|
<RegistryComponent @resource={{@resource}} @controller={{@controller}} @permission={{get-write-permission @resource}} />
|
|
135
98
|
</RegistryYield>
|
|
136
99
|
</div>
|
|
137
100
|
</ContentPanel>
|
|
138
101
|
|
|
102
|
+
<ContentPanel @title={{t "customer.fields.user-account"}} @open={{true}} @actionButtons={{this.userAccountActionButtons}} @wrapperClass="bordered-top">
|
|
103
|
+
<div class="space-y-2">
|
|
104
|
+
<InputGroup @name={{t "customer.fields.user-account"}} @helpText={{t "customer.fields.user-account-help-text"}}>
|
|
105
|
+
<ModelSelect
|
|
106
|
+
@modelName="user"
|
|
107
|
+
@selectedModel={{@resource.user}}
|
|
108
|
+
@placeholder={{t "customer.fields.select-user"}}
|
|
109
|
+
@query={{hash doesnt_have_contact=true is_customer=true}}
|
|
110
|
+
@triggerClass="form-select form-input"
|
|
111
|
+
@infiniteScroll={{false}}
|
|
112
|
+
@renderInPlace={{true}}
|
|
113
|
+
@onChange={{fn (mut @resource.user)}}
|
|
114
|
+
@permission="fleet-ops update-user-for customer"
|
|
115
|
+
as |model|
|
|
116
|
+
>
|
|
117
|
+
<div class="flex flex-row">
|
|
118
|
+
<div class="mr-2 w-6">
|
|
119
|
+
<Image src={{model.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-6 h-6 rounded-md" />
|
|
120
|
+
</div>
|
|
121
|
+
<div class="flex flex-col">
|
|
122
|
+
<div class="font-semibold">{{model.name}}</div>
|
|
123
|
+
<div class="text-xs flex flex-row items-center leading-4">
|
|
124
|
+
<FaIcon @icon="envelope" @size="sm" class="mr-1 opacity-75" />
|
|
125
|
+
<span>{{n-a model.email}}</span>
|
|
126
|
+
</div>
|
|
127
|
+
<div class="text-xs flex flex-row items-center leading-4">
|
|
128
|
+
<FaIcon @icon="phone" @size="sm" class="mr-1 opacity-75" />
|
|
129
|
+
<span>{{n-a model.phone}}</span>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</ModelSelect>
|
|
134
|
+
</InputGroup>
|
|
135
|
+
{{#if @resource.user}}
|
|
136
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-2 no-input-group-padding">
|
|
137
|
+
<InputGroup @name={{t "common.name"}} @wrapperClass="col-span-2 mb-0i">
|
|
138
|
+
<Input @value={{@resource.user.name}} @type="text" class="w-full form-input" placeholder={{t "common.name"}} disabled={{true}} />
|
|
139
|
+
</InputGroup>
|
|
140
|
+
<InputGroup @name={{t "common.email"}} @wrapperClass="mb-0i">
|
|
141
|
+
<Input @value={{@resource.user.email}} @type="text" class="w-full form-input" placeholder={{t "common.email"}} disabled={{true}} />
|
|
142
|
+
</InputGroup>
|
|
143
|
+
<InputGroup @name={{t "common.phone"}} @wrapperClass="mb-0i">
|
|
144
|
+
<PhoneInput @value={{@resource.user.phone}} @onInput={{fn (mut @resource.phone)}} class="form-input w-full" disabled={{true}} />
|
|
145
|
+
</InputGroup>
|
|
146
|
+
</div>
|
|
147
|
+
{{/if}}
|
|
148
|
+
</div>
|
|
149
|
+
</ContentPanel>
|
|
150
|
+
|
|
139
151
|
<CustomField::Yield @subject={{@resource}} @wrapperClass="bordered-top" />
|
|
140
152
|
|
|
141
153
|
<RegistryYield @registry="fleet-ops:component:customer:form" as |RegistryComponent|>
|
|
142
154
|
<RegistryComponent @resource={{@resource}} @controller={{@controller}} @permission={{get-write-permission @resource}} />
|
|
143
155
|
</RegistryYield>
|
|
144
|
-
</div>
|
|
156
|
+
</div>
|